EdgeStream
EdgeStreamProvider
EdgeStreamProvider wraps your application, calls edgeStreamClient.start() on mount, subscribes to lifecycle events, and provides the client plus connection status to all child components via React context.
Basic Setup
import React from 'react';
import { createEdgeStream, NormalizationHook } from 'edge-stream-js';
import { EdgeStreamProvider } from 'edge-stream-js-react';
// Create and configure EdgeStream outside React (module scope)
const stream = createEdgeStream({ logLevel: 'info' });
stream.registerServer({
id: 'bas',
type: 'bas',
url: '/hubs/edge-stream',
transportConfig: {
type: 'signalr',
url: '/hubs/edge-stream',
accessToken: () => authStore.getToken(),
}
});
const server = stream.server('bas')!;
server.incomingPipeline.addHook(new NormalizationHook());
// Provide to React tree
function App() {
return (
<EdgeStreamProvider
edgeStreamClient={stream}
onError={(error) => console.error('EdgeStream error:', error)}
onConnectionStatusChange={(status) => console.log('Status:', status)}
>
<Router />
</EdgeStreamProvider>
);
}
Props
| Prop | Type | Required | Description |
|---|---|---|---|
edgeStreamClient | IEdgeStream | Yes | The EdgeStream instance to manage |
children | ReactNode | Yes | Child components to receive context |
onError | (error: Error) => void | No | Called when stream:error fires or start() throws |
onConnectionStatusChange | (status: ConnectionStatus) => void | No | Called on every connection status transition |
What the Provider Does
// On mount (simplified internal logic):
// 1. Sets connectionStatus = 'connecting'
// 2. Calls edgeStreamClient.start() if status === 'idle'
// 3. On success: sets connectionStatus = 'connected', isInitialized = true
// 4. Subscribes to: stream:started, stream:stopped, stream:error
// 5. Provides { client, connectionStatus, health } via EdgeStreamContext
// On unmount:
// 1. Sets isMounted = false (prevents state updates after unmount)
// 2. Unsubscribes from stream:started, stream:stopped, stream:error
// Note: does NOT call stop() — transport manages itself
Context Value
interface EdgeStreamContextValue {
client: IEdgeStream; // the EdgeStream instance
connectionStatus: ConnectionStatus; // 'connecting' | 'connected' | 'disconnected' | 'error' | 'checking'
health: HealthStatus | null; // health metrics
}
interface HealthStatus {
connectionStatus: ConnectionStatus;
lastHeartbeat: Date | null;
messageCount: number;
errorCount: number;
reconnectAttempts: number;
uptime: number; // milliseconds
}
Connection Status Transitions
| Status | Trigger |
|---|---|
'connecting' | Provider mounts, start() begins |
'connected' | start() resolves, or stream:started event fires |
'disconnected' | stream:stopped event fires |
'error' | start() throws, or stream:error fires |
Create EdgeStream Outside React
Create and configure the EdgeStream instance at module scope (outside any React component), then pass it to
EdgeStreamProvider. Creating it inside a component or in useMemo risks re-creating it on re-renders.