- Closes #79
- PR #161: #161
- Branch:
feature/ws-topic-subscriptions
IntentsGateway.broadcast() sends every event to every connected subscriber unconditionally. A solver bot only interested in stellar intents still receives the full firehose across all seven SupportedChain values. This PR adds topic-based filtering so subscribers can receive only the events they care about.
- Changed
subscribersfromSet<WebSocket>toMap<WebSocket, SubscriberFilter>to track per-subscriber chain filters - Added
handleMessage()private method that processes incoming WebSocket messages - Clients can send
{ type: "subscribe", chains: ["stellar"] }after connecting to filter events broadcast()now checks each subscriber's filter before sending; events whose chain doesn't match the subscriber's filter are skipped- Added
getEventChain()helper that resolves the chain from events:- For
intent_createdevents, readssrcChaindirectly from the intent object - For
intent_filled,intent_accepted,intent_cancelled, andintent_expiredevents, looks up the intent viaIntentsService.get()to resolvesrcChain - Returns
nullfor events without a chain, which are always delivered to all subscribers
- For
- Added
SOLVER_CHAINSenvironment variable (defaults to all supported chains) - Bot subscribes to configured chains after connecting via
{ type: "subscribe", chains: [...] } - Bot handles the
subscribedconfirmation event - Bot skips intents on non-subscribed chains in
tryFillOpenIntent()with a log message
npm run lintpassesnpm run typecheckpassesnpm testpassesnpm run test:e2epasses
- Subscribe/filter message implemented for WebSocket clients
- Per-subscriber chain filters tracked in the subscribers map
-
broadcast()filters events by subscriber's chain filter -
solver-bot.tsupdated to demonstrate topic-based filtering - PR description includes "Closes #79"