Module: Julewire::Ractor::Bridge::BridgeThread

Defined in:
lib/julewire/ractor/bridge/bridge_thread.rb

Constant Summary collapse

THREAD_NAME =
"julewire-ractor-bridge"
MONITOR_MESSAGES =
%i[aborted exited].freeze

Class Method Summary collapse

Class Method Details

.close_message?(message) ⇒ Boolean

Returns:

  • (Boolean)


37
38
39
# File 'lib/julewire/ractor/bridge/bridge_thread.rb', line 37

def close_message?(message)
  message.is_a?(Hash) && message[:command] == :close
end

.monitor_message?(message) ⇒ Boolean

Returns:

  • (Boolean)


41
42
43
# File 'lib/julewire/ractor/bridge/bridge_thread.rb', line 41

def monitor_message?(message)
  MONITOR_MESSAGES.include?(message)
end

.receive_message(port, monitor_port) ⇒ Object



45
46
47
48
49
50
# File 'lib/julewire/ractor/bridge/bridge_thread.rb', line 45

def receive_message(port, monitor_port)
  return port.receive unless monitor_port

  _selected_port, message = ::Ractor.select(port, monitor_port)
  message
end

.run(port:, handler:, monitor_port: nil) ⇒ Object



18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# File 'lib/julewire/ractor/bridge/bridge_thread.rb', line 18

def run(port:, handler:, monitor_port: nil)
  bridge_error = nil
  Stats.bridge_started
  loop do
    message = receive_message(port, monitor_port)
    Stats.message_received
    break if close_message?(message) || monitor_message?(message)

    handler.call(message)
  rescue StandardError => e
    bridge_error = e
    warn_bridge_stopped(e)
    Julewire::Ractor::PortLifecycle.close(port)
    break
  end
ensure
  Stats.bridge_stopped(bridge_error)
end

.start(port:, monitor_port: nil, &handler) ⇒ Object



11
12
13
14
15
16
# File 'lib/julewire/ractor/bridge/bridge_thread.rb', line 11

def start(port:, monitor_port: nil, &handler)
  Thread.new { run(port: port, monitor_port: monitor_port, handler: handler) }.tap do |thread|
    thread.name = THREAD_NAME
    thread.report_on_exception = true
  end
end

.warn_bridge_stopped(error) ⇒ Object



52
53
54
55
56
# File 'lib/julewire/ractor/bridge/bridge_thread.rb', line 52

def warn_bridge_stopped(error)
  Warning.warn("julewire ractor bridge stopped: #{error.class}\n")
rescue StandardError
  nil
end