Module: Terminalwire::V2::Negotiator
- Defined in:
- lib/terminalwire/v2/negotiator.rb
Overview
Pure handshake negotiation: given what the client speaks and what the server supports, decide the agreed protocol version and capability set. This is a function, not a state machine, so it is trivially testable and identical across languages (see conformance/vectors/negotiate).
Class Method Summary collapse
-
.negotiate(client_protocol:, client_capabilities:, server_min:, server_max:, server_capabilities:) ⇒ Hash
Either { decision: "welcome", protocol: Integer, capabilities: Array
} or { decision: "incompatible", supported: { min:, max: } }.
Class Method Details
.negotiate(client_protocol:, client_capabilities:, server_min:, server_max:, server_capabilities:) ⇒ Hash
Returns either
{ decision: "welcome", protocol: Integer, capabilities: Array
15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
# File 'lib/terminalwire/v2/negotiator.rb', line 15 def negotiate(client_protocol:, client_capabilities:, server_min:, server_max:, server_capabilities:) if client_protocol < server_min return { decision: "incompatible", supported: { min: server_min, max: server_max } } end agreed = [client_protocol, server_max].min # Intersection, preserving the client's advertised order. capabilities = client_capabilities & server_capabilities { decision: "welcome", protocol: agreed, capabilities: capabilities } end |