Portal Community

Standard Hook Setup

import { createEdgeStream, NormalizationHook } from 'edge-stream-js';
import { HookActivityLogger } from 'observability-hooks-js';

const stream = createEdgeStream({ logLevel: 'debug' });

stream.registerServer({
  id: 'bas', type: 'bas',
  url: '/hubs/edge-stream',
  transportConfig: { type: 'signalr', url: '/hubs/edge-stream', ... }
});

// Get the server reference
const server = stream.server('bas')!;

// ── Incoming hooks (messages from transport → subscribers) ──
server.incomingPipeline.addHook(new HookActivityLogger());    // priority 5
server.incomingPipeline.addHook(new NormalizationHook());     // priority 110
server.incomingPipeline.addHook(new TenantFilterHook());      // priority 130
server.incomingPipeline.addHook(new WorkflowMapper());        // priority 200
server.incomingPipeline.addHook(new AuditLogHook());          // priority 300

// ── Outgoing hooks (app → transport) ──
server.outgoingPipeline.addHook(new HookActivityLogger());    // shared logger
server.outgoingPipeline.addHook(new AuthHeaderHook());        // priority 50
server.outgoingPipeline.addHook(new HmacSignatureHook());     // priority 60

// ── Start after hooks are configured ──
await stream.start();

Hook Priority Sorting

Hooks are sorted by priority when start() is called. You can add hooks in any order — the pipeline guarantees execution order by priority:

// These register in any order — priority determines execution order
server.incomingPipeline.addHook(new AuditLogHook());          // priority 300
server.incomingPipeline.addHook(new NormalizationHook());     // priority 110
server.incomingPipeline.addHook(new HookActivityLogger());    // priority 5
server.incomingPipeline.addHook(new TenantFilterHook());      // priority 130

// Execution order: HookActivityLogger → NormalizationHook → TenantFilterHook → AuditLogHook

Conditional Hook Registration

// Development: add observability and verbose logging
if (import.meta.env.DEV) {
  server.incomingPipeline.addHook(new HookActivityLogger());
  server.incomingPipeline.addHook(new VerboseMessageLogHook());
}

// Production: add auth and security
if (import.meta.env.PROD) {
  server.incomingPipeline.addHook(new JwtVerificationHook());
  server.incomingPipeline.addHook(new RateLimitHook({ maxPerSecond: 100 }));
}

// Always: normalization and tenant filtering
server.incomingPipeline.addHook(new NormalizationHook());
server.incomingPipeline.addHook(new TenantBoundaryHook(tenantId));
Register Hooks Before start() Hook registration should happen between registerServer() and stream.start(). Adding hooks after start may cause messages received during hook setup to bypass the new hook.