Class: Aikido::Zen::RPC::Server

Inherits:
Object
  • Object
show all
Includes:
IPC::FramedIO
Defined in:
lib/aikido/zen/ipc/rpc.rb

Constant Summary

Constants included from IPC::FramedIO

IPC::FramedIO::READ_CHUNK_SIZE

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(secret, host = "127.0.0.1", port = 0, handshake_timeout: IPC::HANDSHAKE_TIMEOUT, read_timeout: IPC::READ_TIMEOUT, write_timeout: IPC::WRITE_TIMEOUT, max_read_size: nil, max_write_size: nil, logger: Aikido::Zen.config.logger) ⇒ Server

Returns a new instance of Server.



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
# File 'lib/aikido/zen/ipc/rpc.rb', line 45

def initialize(
  secret,
  host = "127.0.0.1",
  port = 0,
  handshake_timeout: IPC::HANDSHAKE_TIMEOUT,
  read_timeout: IPC::READ_TIMEOUT,
  write_timeout: IPC::WRITE_TIMEOUT,
  max_read_size: nil,
  max_write_size: nil,
  logger: Aikido::Zen.config.logger
)
  @read_timeout = read_timeout
  @write_timeout = write_timeout
  @max_read_size = max_read_size
  @max_write_size = max_write_size
  @logger = logger

  @handlers = {}

  @server = IPC::Server.new(
    secret,
    host,
    port,
    handshake_timeout: handshake_timeout
  )
end

Class Method Details

.start(secret, host = "127.0.0.1", port = 0, handshake_timeout: IPC::HANDSHAKE_TIMEOUT, read_timeout: IPC::READ_TIMEOUT, write_timeout: IPC::WRITE_TIMEOUT, max_read_size: nil, max_write_size: nil, logger: Aikido::Zen.config.logger, &block) ⇒ Object



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
# File 'lib/aikido/zen/ipc/rpc.rb', line 15

def self.start(
  secret,
  host = "127.0.0.1",
  port = 0,
  handshake_timeout: IPC::HANDSHAKE_TIMEOUT,
  read_timeout: IPC::READ_TIMEOUT,
  write_timeout: IPC::WRITE_TIMEOUT,
  max_read_size: nil,
  max_write_size: nil,
  logger: Aikido::Zen.config.logger,
  &block
)
  server = new(
    secret,
    host,
    port,
    handshake_timeout: handshake_timeout,
    read_timeout: read_timeout,
    write_timeout: write_timeout,
    max_read_size: max_read_size,
    max_write_size: max_write_size,
    logger: logger
  )

  block&.call(server)

  server.start
  server
end

Instance Method Details

#closeObject



104
105
106
# File 'lib/aikido/zen/ipc/rpc.rb', line 104

def close
  @server.close
end

#handle(name, &block) ⇒ Object



108
109
110
# File 'lib/aikido/zen/ipc/rpc.rb', line 108

def handle(name, &block)
  @handlers[name] = block
end

#hostObject



72
73
74
# File 'lib/aikido/zen/ipc/rpc.rb', line 72

def host
  @server.host
end

#portObject



76
77
78
# File 'lib/aikido/zen/ipc/rpc.rb', line 76

def port
  @server.port
end

#startObject



80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
# File 'lib/aikido/zen/ipc/rpc.rb', line 80

def start
  @server.start do |socket|
    # Disable Nagle/delayed-ACK to optimize request/response latency
    socket.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1)

    @logger.info("RPC server: client connected")

    handle_messages(socket)
  rescue EOFError, Errno::ECONNRESET, Errno::EPIPE
    # disconnected
  rescue IOError
    # client stopped
  rescue => err
    @logger.error("RPC server error: #{err.class}: #{err.message}")
    @logger.debug(err.backtrace.join("\n"))
  ensure
    @logger.info("RPC server: client disconnected")
  end
end

#stopObject



100
101
102
# File 'lib/aikido/zen/ipc/rpc.rb', line 100

def stop
  @server.stop
end