1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
|
require "neovim/logging"
require "socket"
require "msgpack"
module Neovim
# @api private
class Connection
include Logging
def self.tcp(host, port)
socket = Socket.tcp(host, port)
new(socket, socket)
end
def self.unix(path)
socket = Socket.unix(path)
new(socket, socket)
end
def self.child(argv)
argv = argv.include?("--embed") ? argv : argv + ["--embed"]
io = ::IO.popen(argv, "rb+")
Process.detach(io.pid)
new(io, io)
end
def self.stdio
new(STDIN, STDOUT)
end
def initialize(rd, wr)
@rd, @wr = [rd, wr].each { |io| io.binmode.sync = true }
@unpacker = MessagePack::Unpacker.new(@rd)
@packer = MessagePack::Packer.new(@wr)
end
def write(object)
log(:debug) { {object: object} }
@packer.write(object)
self
end
def read
@unpacker.read.tap do |object|
log(:debug) { {object: object} }
end
end
def flush
@packer.flush
self
end
def register_type(id)
@unpacker.register_type(id) do |data|
index = MessagePack.unpack(data)
yield index
end
end
def close
[@rd, @wr].each do |io|
begin
io.close
rescue ::IOError
end
end
end
end
end
|