Class: LspRouter::ServerSide

Inherits:
Object
  • Object
show all
Defined in:
lib/lsp_router/server_side.rb

Overview

server side

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(server, logger:) ⇒ ServerSide

Returns a new instance of ServerSide.

Parameters:



11
12
13
14
15
16
17
18
19
20
# File 'lib/lsp_router/server_side.rb', line 11

def initialize(server, logger:)
  @logger = logger
  @name = server.attr[:name]
  @command = server.attr[:command]
  r, @stdin = IO.pipe
  @stdout, w = IO.pipe
  spawn(@command, in: r, out: w, err: $stderr)
  @requests = {}
  @terminated = false
end

Instance Attribute Details

#nameString (readonly)

Returns:

  • (String)


5
6
7
# File 'lib/lsp_router/server_side.rb', line 5

def name
  @name
end

#requestsHash (readonly)

Returns:

  • (Hash)


7
8
9
# File 'lib/lsp_router/server_side.rb', line 7

def requests
  @requests
end

Instance Method Details

#capa_to_req(capa, req) ⇒ Array

Parameters:

  • capa (Hash)
  • req (Hash, Array)

Returns:

  • (Array)


39
40
41
42
43
44
45
46
47
48
49
# File 'lib/lsp_router/server_side.rb', line 39

def capa_to_req(capa, req)
  ret = []
  capa.each_key do |key|
    if req[key.intern].is_a? Array
      ret.concat req[key.intern]
    elsif req[key.intern].is_a? Hash
      ret.concat capa_to_req(capa[key], req[key.intern])
    end
  end
  ret
end

#init(req) ⇒ Hash

Parameters:

  • req (Hash)

Returns:

  • (Hash)


24
25
26
27
28
29
30
31
32
33
34
# File 'lib/lsp_router/server_side.rb', line 24

def init(req)
  write(req)
  while (data = read)
    capa = data.dig('result', 'capabilities')
    next unless capa
    @requests = capa_to_req(capa, CAPABILITY_REQUEST)
    break
  end
  @logger.debug "requests: #{name}: #{@requests.inspect}"
  data
end

#log(prefix, data) ⇒ Object

Parameters:

  • prefix (String)
  • data (Hash)


80
81
82
83
84
85
86
87
88
89
# File 'lib/lsp_router/server_side.rb', line 80

def log(prefix, data)
  if data['id'] && data['method']
    @logger.debug "#{prefix}[REQUEST] id:#{data['id']} method:#{data['method']}"
  elsif data['id']
    @logger.debug "#{prefix}[RESPONSE] id:#{data['id']}"
  else
    @logger.debug "#{prefix}[NOTIFICATION] method:#{data['method']}"
  end
  @logger.debug data.inspect
end

#readHash

Returns:

  • (Hash)


62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
# File 'lib/lsp_router/server_side.rb', line 62

def read
  return nil if @terminated
  header = @stdout.gets("\r\n\r\n")
  unless header
    @terminated = true
    return nil
  end
  fields = header.lines.map do |line|
    n, v = line.chomp.split(/: */, 2)
    [n.downcase, v] if n
  end.compact.to_h
  data = JSON.parse(@stdout.read(fields['content-length'].to_i))
  log("#{name}>", data)
  data
end

#write(data) ⇒ Object

Parameters:

  • data (Hash)


52
53
54
55
56
57
58
59
# File 'lib/lsp_router/server_side.rb', line 52

def write(data)
  return if @terminated
  log("#{name}<", data)
  json = data.to_json
  @stdin.puts "Content-Length: #{json.bytesize}\r\n\r\n"
  @stdin.write(json)
  @stdin.flush
end