1 """Msgpack handling in the event loop pipeline."""
4 from msgpack import Packer, Unpacker
6 from pynvim.compat import unicode_errors_default
8 logger = logging.getLogger(__name__)
9 debug, info, warn = (logger.debug, logger.info, logger.warning,)
12 class MsgpackStream(object):
14 """Two-way msgpack stream that wraps a event loop byte stream.
16 This wraps the event loop interface for reading/writing bytes and
17 exposes an interface for reading/writing msgpack documents.
20 def __init__(self, event_loop):
21 """Wrap `event_loop` on a msgpack-aware interface."""
22 self.loop = event_loop
23 self._packer = Packer(unicode_errors=unicode_errors_default)
24 self._unpacker = Unpacker(unicode_errors=unicode_errors_default)
25 self._message_cb = None
27 def threadsafe_call(self, fn):
28 """Wrapper around `BaseEventLoop.threadsafe_call`."""
29 self.loop.threadsafe_call(fn)
32 """Queue `msg` for sending to Nvim."""
33 pass # replaces next logging statement
34 #debug('sent %s', msg)
35 self.loop.send(self._packer.pack(msg))
37 def run(self, message_cb):
38 """Run the event loop to receive messages from Nvim.
40 While the event loop is running, `message_cb` will be called whenever
41 a message has been successfully parsed from the input stream.
43 self._message_cb = message_cb
44 self.loop.run(self._on_data)
45 self._message_cb = None
48 """Stop the event loop."""
52 """Close the event loop."""
55 def _on_data(self, data):
56 self._unpacker.feed(data)
59 pass # replaces next logging statement
60 #debug('waiting for message...')
61 msg = next(self._unpacker)
62 pass # replaces next logging statement
63 #debug('received message: %s', msg)
66 pass # replaces next logging statement
67 #debug('unpacker needs more data...')