Portal Community

When to Use Multiple Servers

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

ServerTransportKey HooksTopics
'bas'SignalRNormalize, Tenant filter, Auditworkflow.*, hil.*, notifications.*
'chat'WebSocketToken decoder, Rate limitagent.chat.*