@tribe-nest/media-client 0.2.1 → 0.4.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/build/core/index.d.ts +1 -1
- package/build/core/index.d.ts.map +1 -1
- package/build/core/index.js.map +1 -1
- package/build/core/reconnect.d.ts +29 -0
- package/build/core/reconnect.d.ts.map +1 -1
- package/build/core/reconnect.js +49 -9
- package/build/core/reconnect.js.map +1 -1
- package/build/core/signal.d.ts +9 -0
- package/build/core/signal.d.ts.map +1 -1
- package/build/core/signal.js +18 -2
- package/build/core/signal.js.map +1 -1
- package/build/core/state.d.ts +28 -0
- package/build/core/state.d.ts.map +1 -1
- package/build/core/state.js +106 -7
- package/build/core/state.js.map +1 -1
- package/build/index.d.ts +1 -1
- package/build/index.d.ts.map +1 -1
- package/build/index.js.map +1 -1
- package/build/react/index.d.ts +63 -11
- package/build/react/index.d.ts.map +1 -1
- package/build/react/index.js +229 -5
- package/build/react/index.js.map +1 -1
- package/build/room/device.d.ts +6 -0
- package/build/room/device.d.ts.map +1 -1
- package/build/room/room.d.ts +235 -1
- package/build/room/room.d.ts.map +1 -1
- package/build/room/room.js +627 -24
- package/build/room/room.js.map +1 -1
- package/package.json +2 -2
- package/src/core/_tests/reconnect.spec.ts +92 -0
- package/src/core/_tests/state.spec.ts +92 -0
- package/src/core/index.ts +2 -0
- package/src/core/reconnect.ts +76 -9
- package/src/core/signal.ts +16 -2
- package/src/core/state.ts +153 -10
- package/src/index.ts +2 -0
- package/src/react/index.tsx +261 -7
- package/src/room/_tests/room.spec.ts +720 -3
- package/src/room/device.ts +6 -0
- package/src/room/room.ts +733 -25
package/build/room/room.d.ts
CHANGED
|
@@ -108,12 +108,107 @@ export type PublishOptions = {
|
|
|
108
108
|
*/
|
|
109
109
|
simulcast?: boolean;
|
|
110
110
|
};
|
|
111
|
+
/**
|
|
112
|
+
* Which simulcast layer a tile of `widthPx` deserves: 0 = q, 1 = h, 2 = f.
|
|
113
|
+
*
|
|
114
|
+
* The policy lives HERE, not on the node, because the tile width is a fact
|
|
115
|
+
* only the renderer has; the node obeys. Buckets, not a formula, so a resize
|
|
116
|
+
* only crosses a boundary occasionally and a boundary crossing is the only
|
|
117
|
+
* thing that costs a request. Screen shares always get the full layer:
|
|
118
|
+
* downscaled text is unreadable, and shares are rarely simulcast anyway.
|
|
119
|
+
*/
|
|
120
|
+
export declare function spatialLayerForWidth(widthPx: number, source?: string): 0 | 1 | 2;
|
|
121
|
+
/** One tile the UI is currently rendering, reported through `setViewport`. */
|
|
122
|
+
export type ViewportEntry = {
|
|
123
|
+
producerId: string;
|
|
124
|
+
/** Rendered width, used to pick a simulcast layer. 0 is a valid "tiny". */
|
|
125
|
+
widthPx: number;
|
|
126
|
+
};
|
|
127
|
+
/** One rendered tile's health, local view merged with the node's answer. */
|
|
128
|
+
export type TileDiagnostics = {
|
|
129
|
+
producerId: string;
|
|
130
|
+
identity: string;
|
|
131
|
+
kind: "audio" | "video";
|
|
132
|
+
source?: string;
|
|
133
|
+
/** The simulcast layer this client last ASKED for: 0 q, 1 h, 2 f. */
|
|
134
|
+
requestedLayer?: number;
|
|
135
|
+
/** What the node is actually GIVING, from its consumer's currentLayers. */
|
|
136
|
+
currentLayer?: number;
|
|
137
|
+
viewportWidthPx?: number;
|
|
138
|
+
pausedByViewport: boolean;
|
|
139
|
+
/** Decoded picture, from the browser's inbound-rtp stats. */
|
|
140
|
+
frameWidth?: number;
|
|
141
|
+
frameHeight?: number;
|
|
142
|
+
framesPerSecond?: number;
|
|
143
|
+
/** Delta-computed between successive `getDiagnostics` calls; absent on the first. */
|
|
144
|
+
bitrateKbps?: number;
|
|
145
|
+
};
|
|
146
|
+
/** The node's half of `getDiagnostics`, absent against an older node. */
|
|
147
|
+
export type NodeDiagnostics = {
|
|
148
|
+
transports: {
|
|
149
|
+
transportId: string;
|
|
150
|
+
availableOutgoingBitrate?: number;
|
|
151
|
+
iceState?: string;
|
|
152
|
+
dtlsState?: string;
|
|
153
|
+
}[];
|
|
154
|
+
producers: {
|
|
155
|
+
producerId: string;
|
|
156
|
+
kind: string;
|
|
157
|
+
paused: boolean;
|
|
158
|
+
source?: string;
|
|
159
|
+
layers: {
|
|
160
|
+
rid?: string;
|
|
161
|
+
score: number;
|
|
162
|
+
}[];
|
|
163
|
+
}[];
|
|
164
|
+
consumers: {
|
|
165
|
+
consumerId: string;
|
|
166
|
+
producerId: string;
|
|
167
|
+
kind: string;
|
|
168
|
+
paused: boolean;
|
|
169
|
+
preferredLayers?: {
|
|
170
|
+
spatialLayer: number;
|
|
171
|
+
temporalLayer?: number;
|
|
172
|
+
};
|
|
173
|
+
currentLayers?: {
|
|
174
|
+
spatialLayer: number;
|
|
175
|
+
temporalLayer?: number;
|
|
176
|
+
};
|
|
177
|
+
score?: unknown;
|
|
178
|
+
}[];
|
|
179
|
+
};
|
|
180
|
+
export type CallDiagnostics = {
|
|
181
|
+
tiles: TileDiagnostics[];
|
|
182
|
+
/**
|
|
183
|
+
* The recv transport's congestion estimate in bits per second, from the
|
|
184
|
+
* node. THE number to look at first: every video consumer shares it, and
|
|
185
|
+
* an estimate sitting at the low hundreds of kbps in a group call is the
|
|
186
|
+
* estimator pinning everyone to the quarter layer, whatever anyone asked.
|
|
187
|
+
*/
|
|
188
|
+
availableOutgoingBitrate?: number;
|
|
189
|
+
/** This participant's own publishers, per-encoding arrival scores included:
|
|
190
|
+
* a layer scored 0 is a layer the node is not receiving. */
|
|
191
|
+
localProducers?: NodeDiagnostics["producers"];
|
|
192
|
+
/** The raw node answer, for anything the shaped fields above leave out. */
|
|
193
|
+
node?: NodeDiagnostics;
|
|
194
|
+
};
|
|
195
|
+
/** How an incoming ephemeral broadcast reaches the application. */
|
|
196
|
+
export type BroadcastEvent = {
|
|
197
|
+
type: string;
|
|
198
|
+
identity: string;
|
|
199
|
+
data: Record<string, unknown>;
|
|
200
|
+
/** Origin node clock. Animation ordering only. */
|
|
201
|
+
at: number;
|
|
202
|
+
};
|
|
111
203
|
export type LocalPublication = {
|
|
112
204
|
producerId: string;
|
|
113
205
|
kind: "audio" | "video";
|
|
114
206
|
source: PublishSourceLabel;
|
|
115
207
|
track: MediaStreamTrack;
|
|
116
208
|
handle: MediaProducerHandle;
|
|
209
|
+
/** As given to `publish`, kept so a planned server move can republish the
|
|
210
|
+
* same encoding (codec, simulcast, bitrate) without asking anyone. */
|
|
211
|
+
options: PublishOptions;
|
|
117
212
|
/**
|
|
118
213
|
* Paused at the source by `setPaused`. The capture is still open and the
|
|
119
214
|
* producer still exists; nothing is being sent. This is what a mute is.
|
|
@@ -142,11 +237,25 @@ export type MediaRoomOptions = {
|
|
|
142
237
|
webSocket?: MediaWebSocketFactory;
|
|
143
238
|
/**
|
|
144
239
|
* How hard to try to get back in after a drop. Defaults to
|
|
145
|
-
* `DEFAULT_RECONNECT_OPTIONS`; `{ maxAttempts: 0 }` turns
|
|
240
|
+
* `DEFAULT_RECONNECT_OPTIONS`; `{ maxAttempts: 0 }` turns FAILURE recovery
|
|
146
241
|
* off, which leaves `isRecovering` false and is what tells a UI to offer a
|
|
147
242
|
* control instead of a spinner.
|
|
243
|
+
*
|
|
244
|
+
* A server-ordered drain MOVE is deliberately not a failure and happens
|
|
245
|
+
* even at `maxAttempts: 0`: the node asked to be left and named where to
|
|
246
|
+
* go, and honoring that is what keeps the call alive through a deploy.
|
|
247
|
+
* If the move's rejoin then FAILS, the off switch applies to every retry
|
|
248
|
+
* after it.
|
|
148
249
|
*/
|
|
149
250
|
reconnect?: Partial<ReconnectOptions>;
|
|
251
|
+
/**
|
|
252
|
+
* How long a video consumer that fell out of the viewport stays PAUSED
|
|
253
|
+
* before it is closed. Pause is cheap and reversible (a page flip back
|
|
254
|
+
* costs a resume, not a consume plus a keyframe); close frees the node's
|
|
255
|
+
* consumer slot and eventually the mirror and pipe. Mirrors the
|
|
256
|
+
* `mirrorGraceMs` reasoning on the node.
|
|
257
|
+
*/
|
|
258
|
+
viewportCloseGraceMs?: number;
|
|
150
259
|
onLog?: (level: SignalLogLevel, message: string, detail?: unknown) => void;
|
|
151
260
|
};
|
|
152
261
|
type Listener = () => void;
|
|
@@ -164,14 +273,45 @@ export declare class MediaRoom {
|
|
|
164
273
|
/** Per publication: stop listening for the track ending on its own. */
|
|
165
274
|
private readonly trackEndWatchers;
|
|
166
275
|
private readonly listeners;
|
|
276
|
+
private readonly broadcastListeners;
|
|
167
277
|
/** One in-flight subscribe per producer, so a burst of activeSpeakers frames
|
|
168
278
|
* does not race itself into two consumers for one producer. */
|
|
169
279
|
private readonly subscribing;
|
|
280
|
+
/**
|
|
281
|
+
* What the UI says it is rendering. `null` (never set, or cleared) is the
|
|
282
|
+
* legacy behavior: subscribe the whole active set, which is what every
|
|
283
|
+
* headless consumer (egress, harness, agents) keeps. `[]` is a hidden tab:
|
|
284
|
+
* zero video, audio untouched.
|
|
285
|
+
*/
|
|
286
|
+
private viewport;
|
|
287
|
+
private viewportTimer;
|
|
288
|
+
private pendingViewport;
|
|
289
|
+
/** Video consumers paused because their tile is off-viewport, each holding
|
|
290
|
+
* its close timer. Single owner of the pause/close decision. */
|
|
291
|
+
private readonly pausedByViewport;
|
|
292
|
+
/** The last spatial layer requested per producer, so a resize storm only
|
|
293
|
+
* speaks up when a bucket boundary is crossed. */
|
|
294
|
+
private readonly sentLayer;
|
|
295
|
+
/** Old-node degradation: each new verb is disabled on its first
|
|
296
|
+
* `bad_request`, never retried into the frame budget. */
|
|
297
|
+
private readonly unsupported;
|
|
170
298
|
private stateValue;
|
|
171
299
|
private connection;
|
|
172
300
|
private lastError;
|
|
173
301
|
/** Consecutive failed attempts since the last successful join. */
|
|
174
302
|
private reconnectAttempt;
|
|
303
|
+
/** When the current OUTAGE began, for the reconnect time budget. Null while
|
|
304
|
+
* connected. The budget, not the attempt count, is what decides when a
|
|
305
|
+
* room with a person in front of it stops trying. */
|
|
306
|
+
private outageStartedAt;
|
|
307
|
+
/**
|
|
308
|
+
* The planned-move machine. `scheduled` is the jittered wait after a
|
|
309
|
+
* `draining` frame, during which the call continues untouched; `moving`
|
|
310
|
+
* holds the STASH: the live capture tracks that survive the reconnect and
|
|
311
|
+
* are republished on the far side, which is what makes a drain smooth
|
|
312
|
+
* instead of a mute-everything drop.
|
|
313
|
+
*/
|
|
314
|
+
private migration;
|
|
175
315
|
private reconnectTimer;
|
|
176
316
|
private recovering;
|
|
177
317
|
/** `close()` has been called. Nothing may open a socket after that. */
|
|
@@ -182,6 +322,23 @@ export declare class MediaRoom {
|
|
|
182
322
|
* it ended after an hour or before a socket was ever opened.
|
|
183
323
|
*/
|
|
184
324
|
private onDisconnect;
|
|
325
|
+
/**
|
|
326
|
+
* The active set was an instruction about consumers on the connection that
|
|
327
|
+
* just ended. Left standing, it would be mistaken by the next `joined` for
|
|
328
|
+
* a set the new node had sent ahead of the snapshot. The split, the levels
|
|
329
|
+
* and the enforcement flag go with it.
|
|
330
|
+
*/
|
|
331
|
+
private clearActiveSetState;
|
|
332
|
+
/** The captures a move was carrying, for the republish on the far side.
|
|
333
|
+
* Program feeds are excluded exactly as they are from `lostSources`. */
|
|
334
|
+
private buildStash;
|
|
335
|
+
/**
|
|
336
|
+
* A move that is over, one way or the other. On failure the stashed
|
|
337
|
+
* captures are STOPPED and surfaced as lost sources: the camera light must
|
|
338
|
+
* never outlive both its session and its migration, and from here the UX
|
|
339
|
+
* is exactly the ordinary-drop one, a person and a button.
|
|
340
|
+
*/
|
|
341
|
+
private stopStash;
|
|
185
342
|
get state(): RoomState;
|
|
186
343
|
get connectionState(): ConnectionState;
|
|
187
344
|
get error(): DisconnectCause | undefined;
|
|
@@ -229,9 +386,24 @@ export declare class MediaRoom {
|
|
|
229
386
|
* here, because `useSyncExternalStore` reads it.
|
|
230
387
|
*/
|
|
231
388
|
get lostPublicationSources(): readonly LocalPublicationSource[];
|
|
389
|
+
/**
|
|
390
|
+
* Why does the call look the way it looks, answered without
|
|
391
|
+
* webrtc-internals: per tile, the layer this client ASKED for, the layer
|
|
392
|
+
* the node is GIVING, and the picture the browser is decoding; plus the
|
|
393
|
+
* node's congestion estimate and this side's own publish health. Built for
|
|
394
|
+
* polling (a diagnostics HUD calls it once a second); bitrate is computed
|
|
395
|
+
* from the byte delta between calls. Degrades gracefully everywhere: an
|
|
396
|
+
* old node contributes nothing, a fake device without stats contributes
|
|
397
|
+
* nothing, and the local half always answers.
|
|
398
|
+
*/
|
|
399
|
+
getDiagnostics(): Promise<CallDiagnostics>;
|
|
400
|
+
/** Byte counters from the previous `getDiagnostics`, for the bitrate delta. */
|
|
401
|
+
private readonly statsBaseline;
|
|
402
|
+
private inboundStats;
|
|
232
403
|
/** Subscribe to changes. Returns an unsubscribe. */
|
|
233
404
|
onChange(listener: Listener): () => void;
|
|
234
405
|
connect(): Promise<void>;
|
|
406
|
+
private restoreStash;
|
|
235
407
|
close(): Promise<void>;
|
|
236
408
|
/**
|
|
237
409
|
* Decide whether to come back, and book the attempt. Returns whether one was.
|
|
@@ -292,8 +464,70 @@ export declare class MediaRoom {
|
|
|
292
464
|
* are the same thing and this needs no special case.
|
|
293
465
|
*/
|
|
294
466
|
syncSubscriptions(): Promise<void>;
|
|
467
|
+
/**
|
|
468
|
+
* Tell the room what the UI is rendering: which producers, at what width.
|
|
469
|
+
*
|
|
470
|
+
* Debounced inside the room (a scroll fires many times), trailing 150ms.
|
|
471
|
+
* Never call this from a headless consumer; not calling it IS the legacy
|
|
472
|
+
* subscribe-the-whole-set behavior.
|
|
473
|
+
*/
|
|
474
|
+
setViewport(entries: readonly ViewportEntry[]): void;
|
|
475
|
+
/** Back to the legacy behavior: subscribe the whole active set. */
|
|
476
|
+
clearViewport(): void;
|
|
477
|
+
/** The width the UI reported for a producer's tile, if it reported one. */
|
|
478
|
+
private viewportWidth;
|
|
479
|
+
private dropConsumer;
|
|
480
|
+
private beginViewportPause;
|
|
481
|
+
private cancelViewportPause;
|
|
482
|
+
/**
|
|
483
|
+
* Bring every live video consumer onto the layer its reported width implies.
|
|
484
|
+
* Bucket-change only: the last sent layer is remembered, so a resize storm
|
|
485
|
+
* costs nothing until a boundary is crossed. A layer change keeps the
|
|
486
|
+
* consumer, the pipe and the SSRC, which is what makes page flips instant.
|
|
487
|
+
*/
|
|
488
|
+
private applyPreferredLayers;
|
|
489
|
+
/**
|
|
490
|
+
* A request an OLD node may not understand. Disabled for the session on the
|
|
491
|
+
* first `bad_request` rather than retried: a retry loop meets the node's
|
|
492
|
+
* frame budget, and the frame budget closes sockets.
|
|
493
|
+
*/
|
|
494
|
+
private requestOptional;
|
|
295
495
|
subscribe(producerId: string): Promise<void>;
|
|
296
496
|
private doSubscribe;
|
|
497
|
+
/**
|
|
498
|
+
* Send an ephemeral, unstored fan-out to the room: a flying reaction, a
|
|
499
|
+
* courtesy lower-hand. Grant-gated on the node (`canPublishData`) and
|
|
500
|
+
* rate-limited there; NOT a chat transport, and nothing durable may be
|
|
501
|
+
* derived from one.
|
|
502
|
+
*/
|
|
503
|
+
sendReaction(data: Record<string, unknown>): Promise<void>;
|
|
504
|
+
/**
|
|
505
|
+
* Ask another participant to lower their hand. Honorific by design: the
|
|
506
|
+
* TARGET's client obeys by calling `setHandRaised(false)` itself; the
|
|
507
|
+
* server-held hand state only ever moves on its owner's verb.
|
|
508
|
+
*/
|
|
509
|
+
sendLowerHand(target: string): Promise<void>;
|
|
510
|
+
/**
|
|
511
|
+
* Raise or lower this participant's own hand. Server-materialized room
|
|
512
|
+
* state: it survives reconnects and appears in late joiners' snapshots, so
|
|
513
|
+
* `state.raisedHands` is the truth to render, not the reply.
|
|
514
|
+
*/
|
|
515
|
+
setHandRaised(raised: boolean): Promise<void>;
|
|
516
|
+
/**
|
|
517
|
+
* Incoming broadcasts, as EVENTS rather than state: a reaction is an
|
|
518
|
+
* animation, and holding a list of them in `RoomState` would make every
|
|
519
|
+
* emoji a whole-room re-render. Unknown types included; ignore what you
|
|
520
|
+
* do not recognize.
|
|
521
|
+
*/
|
|
522
|
+
onBroadcast(listener: (event: BroadcastEvent) => void): () => void;
|
|
523
|
+
/**
|
|
524
|
+
* The node asked to be left, with a jittered window. THE fix for the drain
|
|
525
|
+
* experience: this frame used to be recorded and ignored, so the "told,
|
|
526
|
+
* not cut" design never executed and everyone was cut at the deadline.
|
|
527
|
+
* The call continues untouched during the wait; the UI is not told.
|
|
528
|
+
*/
|
|
529
|
+
private onDrainingFrame;
|
|
530
|
+
private beginPlannedMove;
|
|
297
531
|
/**
|
|
298
532
|
* RULE 2: lazily, and once.
|
|
299
533
|
*
|
package/build/room/room.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"room.d.ts","sourceRoot":"","sources":["../../src/room/room.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAc,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAE1E,OAAO,EAML,KAAK,eAAe,EACpB,KAAK,oBAAoB,EACzB,KAAK,qBAAqB,EAC1B,KAAK,gBAAgB,EACrB,KAAK,SAAS,EACd,KAAK,cAAc,EACpB,MAAM,SAAS,CAAC;AACjB,OAAO,KAAK,EAIV,kBAAkB,EAClB,mBAAmB,EAIpB,MAAM,UAAU,CAAC;AAElB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AAEH,MAAM,MAAM,oBAAoB,GAAG,oBAAoB,CAAC;AAExD,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,YAAY,GAAG,WAAW,GAAG,cAAc,GAAG,QAAQ,CAAC;AAE9F,MAAM,MAAM,UAAU,GAAG;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC;IACxB,KAAK,EAAE,gBAAgB,CAAC;IACxB,sDAAsD;IACtD,MAAM,EAAE,OAAO,CAAC;IAChB,iFAAiF;IACjF,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,uFAAuF;AACvF,MAAM,MAAM,sBAAsB,GAAG,QAAQ,GAAG,YAAY,GAAG,QAAQ,CAAC;AAExE;;;;;;;;;GASG;AACH,MAAM,MAAM,kBAAkB,GAAG,sBAAsB,GAAG,SAAS,CAAC;AAEpE;;;;;;;GAOG;AACH,MAAM,MAAM,cAAc,GAAG;IAC3B,gFAAgF;IAChF,KAAK,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IACvB,6EAA6E;IAC7E,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC;
|
|
1
|
+
{"version":3,"file":"room.d.ts","sourceRoot":"","sources":["../../src/room/room.ts"],"names":[],"mappings":"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"}
|