@zero-server/sdk 0.9.10 → 1.0.1
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 +65 -3
- package/index.js +19 -0
- package/lib/webrtc/cascade.js +577 -0
- package/lib/webrtc/cluster.js +149 -3
- package/lib/webrtc/index.js +73 -11
- package/lib/webrtc/mcu/ffmpeg.js +172 -0
- package/lib/webrtc/mcu/index.js +211 -0
- package/lib/webrtc/observe.js +38 -0
- package/lib/webrtc/recording.js +410 -0
- package/lib/webrtc/room.js +42 -0
- package/lib/webrtc/sfu/index.js +129 -0
- package/lib/webrtc/sfu/livekit.js +304 -0
- package/lib/webrtc/sfu/mediasoup.js +482 -13
- package/lib/webrtc/sfu/memory.js +316 -3
- package/lib/webrtc/signaling.js +175 -1
- package/package.json +1 -1
- package/types/webrtc.d.ts +348 -0
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-
|
|
16
|
-
<a href="https://github.com/tonywied17/zero-server"><img src="https://img.shields.io/badge/coverage-95.
|
|
15
|
+
<a href="https://github.com/tonywied17/zero-server/actions"><img src="https://img.shields.io/badge/tests-7937%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.39%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` |
|
|
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 */
|