EdgeStream
Registering Hooks
Hooks are added to a server's pipelines before start() is called. Add incoming hooks to server.incomingPipeline and outgoing hooks to server.outgoingPipeline. The pipeline automatically sorts by priority.
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.