File: connection.rb

package info (click to toggle)
ruby-neovim 0.10.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 548 kB
  • sloc: ruby: 4,178; sh: 23; makefile: 4
file content (73 lines) | stat: -rw-r--r-- 1,322 bytes parent folder | download
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