EdgeStream
Multi-Server Patterns
Register multiple servers in one EdgeStream instance when different message domains need separate transports, distinct pipelines, or isolated subscription namespaces.
When to Use Multiple Servers
- Different backends — BizFirstGO main server + a dedicated Octopus chat server
- Different transports — SignalR for workflow events, raw WebSocket for agent streaming
- Different security policies — different auth tokens or signing keys per server
- Performance isolation — high-volume agent streaming should not block workflow events
Registering Multiple Servers
const stream = createEdgeStream({ logLevel: 'info' });
// Server 1: BAS — workflow events, notifications, forms
stream.registerServer({
id: 'bas',
type: 'bas',
url: '/hubs/edge-stream',
transportConfig: { type: 'signalr', url: '/hubs/edge-stream', accessToken: basToken }
});
// Server 2: Chat — Octopus agent streaming
stream.registerServer({
id: 'chat',
type: 'chat',
url: 'wss://chat.bizfirst.com/ws',
transportConfig: { type: 'websocket', url: 'wss://chat.bizfirst.com/ws', headers: { 'Authorization': chatToken } }
});
// Configure each server independently
const basServer = stream.server('bas')!;
basServer.incomingPipeline.addHook(new NormalizationHook());
const chatServer = stream.server('chat')!;
chatServer.incomingPipeline.addHook(new TokenStreamDecoderHook());
// Subscribe to specific servers
stream.subscribe('bas', 'workflow.*', workflowHandler);
stream.subscribe('chat', 'agent.chat.*', chatHandler);
// Start all at once
await stream.start();
// Both servers connect concurrently (Promise.all)
Cross-Server Message Bridging
Bridge messages from one server to another by subscribing on the source and sending on the target:
// Bridge: forward agent events from 'chat' to 'bas' for logging
stream.subscribe('chat', 'agent.*', async (envelope) => {
// Forward relevant agent events to BAS for audit
if (envelope.body.eventType !== 'token') { // skip high-volume token events
await stream.send('bas', 'agent.audit.event', {
originalTopic: envelope.meta.topic,
agentId: envelope.body.agentId,
timestamp: envelope.meta.receivedAt,
});
}
});
Independent Pipeline Configuration
| Server | Transport | Key Hooks | Topics |
|---|---|---|---|
'bas' | SignalR | Normalize, Tenant filter, Audit | workflow.*, hil.*, notifications.* |
'chat' | WebSocket | Token decoder, Rate limit | agent.chat.* |