@zero-server/sdk 0.9.10 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -12,8 +12,8 @@
12
12
 
13
13
  <p align="center">
14
14
  <a href="https://github.com/tonywied17/zero-server/actions"><img src="https://img.shields.io/github/actions/workflow/status/tonywied17/zero-server/ci.yml?branch=main&style=flat-square&logo=githubactions&logoColor=white&label=CI" alt="CI"></a>
15
- <a href="https://github.com/tonywied17/zero-server/actions"><img src="https://img.shields.io/badge/tests-7781%20passing-brightgreen?style=flat-square&logo=vitest&logoColor=white" alt="tests"></a>
16
- <a href="https://github.com/tonywied17/zero-server"><img src="https://img.shields.io/badge/coverage-95.85%25-brightgreen?style=flat-square&logo=vitest&logoColor=white" alt="coverage"></a>
15
+ <a href="https://github.com/tonywied17/zero-server/actions"><img src="https://img.shields.io/badge/tests-7891%20passing-brightgreen?style=flat-square&logo=vitest&logoColor=white" alt="tests"></a>
16
+ <a href="https://github.com/tonywied17/zero-server"><img src="https://img.shields.io/badge/coverage-94.97%25-brightgreen?style=flat-square&logo=vitest&logoColor=white" alt="coverage"></a>
17
17
  <a href="https://z-server.dev"><img src="https://img.shields.io/badge/docs-z--server.dev-00d8e0?style=flat-square&logo=readthedocs&logoColor=white" alt="docs"></a>
18
18
  <a href="https://opensource.org/licenses/MIT"><img src="https://img.shields.io/badge/license-MIT-00d8e0?style=flat-square&logo=opensourceinitiative&logoColor=white" alt="MIT"></a>
19
19
  <a href="https://nodejs.org"><img src="https://img.shields.io/badge/node-%3E%3D18-brightgreen?style=flat-square&logo=nodedotjs&logoColor=white" alt="node >=18"></a>
@@ -55,7 +55,7 @@ npm install @zero-server/core @zero-server/body @zero-server/middleware
55
55
  | `@zero-server/auth` | `jwt`, `session`, `oauth`, `authorize`, `twoFactor`, `webauthn`, `trustedDevice`, `enrollment` |
56
56
  | `@zero-server/orm` | `Database`, `Model`, `Query`, `TYPES`, migrations, seeders, replicas, search, geo, tenancy, audit |
57
57
  | `@zero-server/realtime` | `WebSocketConnection`, `WebSocketPool`, `SSEStream` |
58
- | `@zero-server/webrtc` | signaling hub, rooms/peers, STUN/TURN, SFU adapters (memory, mediasoup, LiveKit), join tokens, E2EE, `spawnBotPeer` |
58
+ | `@zero-server/webrtc` | `createWebRTC`, `SignalingHub`, `Room`/`Peer`, SDP/ICE parsers, STUN client, `TurnServer` + `issueTurnCredentials`, SFU adapters (memory, mediasoup, LiveKit), `signJoinToken`/`verifyJoinToken`, E2EE, cluster + cascade coordinators, MCU adapters, `RecordingManager`/`IngressManager`, `spawnBotPeer` |
59
59
  | `@zero-server/grpc` | gRPC server, client, codec, status, metadata, framing, health, reflection, balancer |
60
60
  | `@zero-server/observe` | `MetricsRegistry`, `Tracer`, structured `Logger`, health checks |
61
61
  | `@zero-server/lifecycle` | `LifecycleManager`, `ClusterManager`, `clusterize` |
@@ -167,6 +167,46 @@ const users = await User.find({ name: 'Alice' })
167
167
  - **WebSocket** - `app.ws(path, handler)` with RFC 6455, `WebSocketPool` for rooms, broadcasting, and sub-protocols
168
168
  - **Server-Sent Events** - `res.sse()` with auto-IDs, named events, and keep-alive
169
169
 
170
+ ### WebRTC
171
+
172
+ Full WebRTC stack - signaling, SDP/ICE parsing, STUN client, TURN credential issuer, SFU adapters, end-to-end encryption, multi-node clustering, and a headless bot peer:
173
+
174
+ ```js
175
+ const { createApp, createWebRTC } = require('@zero-server/sdk')
176
+ const app = createApp()
177
+
178
+ const rtc = createWebRTC(app, {
179
+ path: '/rtc',
180
+ iceServers: [{ urls: 'stun:stun.l.google.com:19302' }],
181
+ })
182
+
183
+ rtc.on('peer:joined', ({ room, peer }) => {
184
+ console.log(`peer ${peer.id} joined ${room.id}`)
185
+ })
186
+
187
+ app.listen(3000)
188
+ ```
189
+
190
+ | Feature | Description |
191
+ |---|---|
192
+ | Signaling | `SignalingHub` over WebSocket, `Room` / `Peer` model with join/leave/offer/answer/ICE relay |
193
+ | SDP & ICE | `parseSdp` / `stringifySdp`, `parseCandidate` / `stringifyCandidate` / `filterCandidates`, private/loopback/link-local/mDNS detection |
194
+ | STUN | RFC 5389 client - `stunBinding`, `encodeBindingRequest`, `decodeMessage`, XOR-MAPPED-ADDRESS helpers |
195
+ | TURN | Built-in `TurnServer` (UDP allocations, channels, permissions) plus time-limited `issueTurnCredentials` (REST API spec) |
196
+ | SFU adapters | `SfuAdapter` interface with `MemorySfuAdapter`, `MediasoupSfuAdapter`, `LiveKitSfuAdapter`, and `loadSfuAdapter()` for dynamic selection |
197
+ | Join tokens | `signJoinToken` / `verifyJoinToken` for short-lived signed room admission |
198
+ | End-to-end encryption | `E2eeChannel`, `attachE2ee`, `generateE2eeKeyPair`, `sealKey`, `openSealedKey` (sealed-sender key exchange) |
199
+ | Clustering | `useCluster`, `ClusterCoordinator`, `MemoryClusterAdapter` for multi-node room state + region-aware bridge selection |
200
+ | Cascade | `useCascade`, `CascadeCoordinator` to fan producers across SFU nodes via `pipeToRouter` (mediasoup-style) |
201
+ | MCU | `McuAdapter`, `MemoryMcuAdapter`, `FfmpegMcuAdapter` for audio/video mixing on top of any SFU |
202
+ | Recording & ingress | `RecordingManager` (LiveKit egress / ffmpeg / bookkeeping) and `IngressManager` (WHIP, RTMP, SIP, URL pull) |
203
+ | Bot peer | `spawnBotPeer()` headless server-side peer for testing, recording, and automated agents |
204
+ | Observability | `bindObservability(rtc, { metrics, logger })` for Prometheus metrics and structured logs |
205
+ | Errors | `WebRTCError`, `SignalingError`, `IceError`, `TurnError`, `SdpError` |
206
+ | CLI | `runWebRTCCommand` - `npx zs webrtc turn:cred`, `webrtc sdp:parse`, etc. |
207
+
208
+ > **Scaling beyond a single node?** See [docs/scopes/webrtc-scaling.md](docs/scopes/webrtc-scaling.md) for the topology decision tree (mesh → SFU → cascade → MCU), capacity rules of thumb, and end-to-end multi-region examples.
209
+
170
210
  ### Observability
171
211
 
172
212
  Built-in Prometheus metrics, health checks, distributed tracing, and structured logging - zero dependencies.
@@ -371,6 +411,26 @@ const {
371
411
  // Real-time
372
412
  WebSocketConnection, WebSocketPool, SSEStream,
373
413
 
414
+ // WebRTC
415
+ createWebRTC, SignalingHub, Room, Peer,
416
+ parseSdp, stringifySdp,
417
+ parseCandidate, stringifyCandidate, filterCandidates,
418
+ isPrivateIp, isLoopbackIp, isLinkLocalIp, isMdnsHostname,
419
+ stunBinding, encodeBindingRequest, decodeMessage,
420
+ encodeXorMappedAddress, decodeXorMappedAddress,
421
+ STUN_MAGIC_COOKIE, STUN_METHOD, STUN_CLASS, STUN_ATTR,
422
+ issueTurnCredentials, TurnServer,
423
+ SfuAdapter, MemorySfuAdapter, MediasoupSfuAdapter, LiveKitSfuAdapter,
424
+ loadSfuAdapter, signJoinToken, verifyJoinToken,
425
+ spawnBotPeer, bindObservability,
426
+ E2eeChannel, attachE2ee, generateE2eeKeyPair, sealKey, openSealedKey,
427
+ useCluster, ClusterCoordinator, MemoryClusterAdapter,
428
+ useCascade, CascadeCoordinator, CH_CASCADE,
429
+ McuAdapter, MemoryMcuAdapter, FfmpegMcuAdapter,
430
+ RecordingManager, IngressManager,
431
+ runWebRTCCommand,
432
+ WebRTCError, SignalingError, IceError, TurnError, SdpError,
433
+
374
434
  // gRPC
375
435
  GrpcStatus, grpcToHttp, grpcStatusName, GRPC_STATUS_NAMES,
376
436
  GrpcMetadata, ProtoWriter, ProtoReader, protoEncode, protoDecode,
@@ -440,6 +500,8 @@ lib/
440
500
  replicas, search, geo, tenancy, audit, views, procedures, plugins
441
501
  router/ - Router with sub-app mounting and pattern matching
442
502
  sse/ - SSE stream controller
503
+ webrtc/ - signaling hub, SDP/ICE, STUN client, TURN server, SFU adapters,
504
+ join tokens, E2EE, clustering, bot peer, CLI
443
505
  ws/ - WebSocket connection, handshake, and room management
444
506
  packages/ - generated scoped @zero-server/* re-exports (one dir per scope)
445
507
  .tools/
package/index.js CHANGED
@@ -73,6 +73,9 @@ const {
73
73
  bindObservability,
74
74
  E2eeChannel, attachE2ee, generateE2eeKeyPair, sealKey, openSealedKey,
75
75
  useCluster, ClusterCoordinator, MemoryClusterAdapter,
76
+ useCascade, CascadeCoordinator, CH_CASCADE,
77
+ McuAdapter, MemoryMcuAdapter, FfmpegMcuAdapter,
78
+ RecordingManager, IngressManager,
76
79
  runWebRTCCommand,
77
80
  WebRTCError, SignalingError, IceError, TurnError, SdpError,
78
81
  } = require('./lib/webrtc');
@@ -509,6 +512,22 @@ module.exports = {
509
512
  ClusterCoordinator,
510
513
  /** @see module:webrtc/cluster */
511
514
  MemoryClusterAdapter,
515
+ /** @see module:webrtc/cascade */
516
+ useCascade,
517
+ /** @see module:webrtc/cascade */
518
+ CascadeCoordinator,
519
+ /** @see module:webrtc/cascade */
520
+ CH_CASCADE,
521
+ /** @see module:webrtc/mcu */
522
+ McuAdapter,
523
+ /** @see module:webrtc/mcu */
524
+ MemoryMcuAdapter,
525
+ /** @see module:webrtc/mcu/ffmpeg */
526
+ FfmpegMcuAdapter,
527
+ /** @see module:webrtc/recording */
528
+ RecordingManager,
529
+ /** @see module:webrtc/recording */
530
+ IngressManager,
512
531
  /** @see module:webrtc/cli */
513
532
  runWebRTCCommand,
514
533
  /** @see module:errors */