Class: Igniter::Store::Protocol::WireEnvelope

Inherits:
Object
  • Object
show all
Defined in:
lib/igniter/store/protocol/wire_envelope.rb

Overview

OP3 — Wire Envelope: process boundary routing for StoreServer.

Every request is wrapped in:

{ protocol: :igniter_store, schema_version: 1,
  request_id: "req_...", op: :write_fact,
  packet: { kind: :fact, store: :tasks, key: "t1", value: {} } }

Every response is:

{ protocol: :igniter_store, schema_version: 1,
  request_id: "req_...",
  status: :ok | :error,
  result: { ... } | error: "message" }

This layer sits above the CRC32-framed WireProtocol transport and below application-level handlers. It is pure Ruby — no I/O, no sockets. The StoreServer feeds deserialized hashes in and ships serialized responses out.

Constant Summary collapse

PROTOCOL =
:igniter_store
SCHEMA_VERSION =
1
OPERATIONS =
%i[
  register_descriptor
  write
  append
  write_fact
  read
  query
  resolve
  causation_chain
  lineage
  fact_ref
  metadata_snapshot
  descriptor_snapshot
  observability_snapshot
  sync_hub_profile
  replay
  storage_stats
  segment_manifest
  compaction_activity
].freeze

Instance Method Summary collapse

Constructor Details

#initialize(interpreter) ⇒ WireEnvelope

Returns a new instance of WireEnvelope.



49
50
51
# File 'lib/igniter/store/protocol/wire_envelope.rb', line 49

def initialize(interpreter)
  @interpreter = interpreter
end

Instance Method Details

#dispatch(envelope) ⇒ Object

Dispatch a single envelope hash. Returns a response envelope hash (never raises).



55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
# File 'lib/igniter/store/protocol/wire_envelope.rb', line 55

def dispatch(envelope)
  envelope  = envelope.transform_keys(&:to_sym)
  req_id    = envelope[:request_id]

  proto = envelope[:protocol]&.to_sym
  unless proto == PROTOCOL
    return error_response(req_id, "Unknown protocol: #{proto.inspect}")
  end

  op = envelope[:op]&.to_sym
  unless op && OPERATIONS.include?(op)
    return error_response(req_id, "Unknown or missing op: #{op.inspect}")
  end

  packet = (envelope[:packet] || {})
  packet = packet.transform_keys(&:to_sym) if packet.is_a?(Hash)

  result = route(op, packet)
  ok_response(req_id, result)
rescue => e
  error_response(req_id, "Internal error: #{e.message}")
end