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

Class Method Details

.negotiate(client_protocol:, client_capabilities:, server_min:, server_max:, server_capabilities:) ⇒ Hash

Returns either { decision: "welcome", protocol: Integer, capabilities: Array } or { decision: "incompatible", supported: { min:, max: } }.

Returns:

  • (Hash)

    either { decision: "welcome", protocol: Integer, capabilities: Array } or { decision: "incompatible", supported: { min:, max: } }



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