tmux-amq/src/tamq/broker.py
tegwick 4d915a2617
Some checks failed
tamq-ci / test (push) Failing after 36s
Bootstrap tamq local tmux agent message queue
Assistant: codex
Assistant-Model: gpt-5.6-sol
Assistant-Session: 01a02f34-ead4-7a60-85cd-d7f08e22fa0e
2026-08-24 01:18:40 +02:00

55 lines
1.7 KiB
Python

from __future__ import annotations
from dataclasses import dataclass
from .routing import RoutedMessage, parse_address_line
from .store import Store
from .registry import RegistryError, validate_targets
@dataclass(frozen=True)
class BrokerIdentity:
endpoint_id: str
source_repo: str
class InputBroker:
"""Convert tap input into durable, identity-bearing outbound messages."""
def __init__(self, store: Store, identity: BrokerIdentity):
self.store = store
self.identity = identity
def inspect_line(self, line: str) -> RoutedMessage | None:
routed = parse_address_line(line)
if routed is None:
return None
try:
validate_targets([routed.target_repo])
except RegistryError:
return None
self.store.add(
self.identity.source_repo,
routed.target_repo,
routed.body,
endpoint=self.identity.endpoint_id,
)
return routed
def deliver_pending(self, control, *, window_for_repo):
"""Inject pending messages through the authoritative control client."""
delivered = 0
for row in self.store.list(state="pending"):
if row["endpoint_id"] not in (None, self.identity.endpoint_id):
continue
target = window_for_repo(row["target_repo"])
lease_id = self.store.claim(row["message_id"], self.identity.endpoint_id)
if lease_id is None:
continue
try:
control.inject(target, f"#{row['sender_repo']}: {row['body']}")
except Exception:
continue
self.store.release(row["message_id"], lease_id, "injected")
delivered += 1
return delivered