@voltkit-rtc/client 0.4.0 → 0.5.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/CHANGELOG.md CHANGED
@@ -1,5 +1,20 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.5.0
4
+
5
+ - All video tiers included by default: 1080p, 720p and 480p. Per-project restrictions still apply.
6
+ - Authoritative 30 fps ladder: 6/3/1.2 Mbps top layers, 1080p lower layers 0.4/2 Mbps, 720p lower layers 0.2/0.8 Mbps. Phone/tablet defaults remain two layers.
7
+ - `PublishOptions.frameRate` and `setVideoFrameRate(30 | 60)`. At 60 fps only the top layer rises to 9/4.5/1.8 Mbps; smaller layers stay at 30. Low capture fps or sustained device/upload limitation falls back to 30 with `frame-rate-fallback` on `error`.
8
+ - Camera start bitrate is 2000 kbps.
9
+ - The 60 fps monitor allows encoder/bitrate warm-up before counting sustained limitation, so the intentional 30 fps lower layers during startup do not immediately trigger fallback.
10
+ - `publishScreen` / `unpublishScreen`, `ScreenPublishOptions`, `screenShareStarted` / `screenShareEnded`, separate `screen-audio`, native-size detail/motion ladders and reconnect restoration. Screen, camera, mic and music controls remain independent. Browser stop-sharing and interrupted capture clean up both screen producers.
11
+ - `setReceiveQuality(producerId, 'auto' | '1080p' | '720p' | '480p')`, `ReceiveQuality` and producer `videoLayers` metadata. Presets follow actual dimensions; Auto clears both layer ceilings; reconnect restores the choice. Older publishers without metadata report `quality-unavailable` for explicit presets.
12
+ - Same-size `replaceVideoTrack` stays smooth. A change in dimensions republishes camera video so advertised layer dimensions remain accurate.
13
+ - `raiseHand(metadata?)`, `lowerHand(identity?)`, hand-event metadata/reason and roster `handMetadata` support role requests and moderated responses.
14
+ - `participantMuted` normalizes moderation locks to `{ identity, kind, paused }`; `ParticipantInfo.videoBlocked` seeds camera locks on reconnect. Demotion while disconnected releases retained capture, and rejected unmute calls keep the device paused.
15
+ - A screen-share republish that fails halfway cleans up that share while the camera continues.
16
+ - No package publishing is part of this source update.
17
+
3
18
  ## 0.4.0
4
19
 
5
20
  Sharper video, above all from phones. Nothing to change to upgrade: every 0.3.0
package/README.md CHANGED
@@ -75,6 +75,7 @@ phones and computers alike; they are kept for a reconnect's republish.
75
75
  | Option | Default | What it does |
76
76
  | --- | --- | --- |
77
77
  | `quality` | the highest the project allows | `'1080p'`, `'720p'` or `'480p'`; see [Video quality](#video-quality) |
78
+ | `frameRate` | `30` | `30` or `60`; only the top layer runs at 60 fps; capture at 60 too |
78
79
  | `layers` | `2` on phones and tablets, `3` elsewhere | the most simulcast layers to send. When a phone is too busy, the browser shrinks the picture and may then send fewer layers, dropping the top one: asked for two, it keeps the full picture; asked for three, viewers were left with a quarter of it |
79
80
  | `codec` | `'auto'` | `'auto'` sends H.264 on phones and tablets that encode it in hardware, VP8 elsewhere. `'vp8'` or `'h264'` forces one; a forced H.264 the browser cannot send is VP8, and fires `error` |
80
81
  | `degradationPreference` | the browser's | what the encoder gives up first on a busy device: `'maintain-resolution'` (frame rate goes first), `'maintain-framerate'` or `'balanced'` |
@@ -95,8 +96,7 @@ it or the raw camera again:
95
96
  await client.replaceVideoTrack(canvas.captureStream(30).getVideoTracks()[0]);
96
97
  ```
97
98
 
98
- When the new track takes the same layers as the old one (the same size is the
99
- safe choice), viewers see no pause; otherwise the camera's producer is replaced
99
+ When the new track has the same dimensions and layers as the old one, viewers see no pause; otherwise the camera's producer is replaced
100
100
  and they see a brief one. A paused camera stays paused. Your own stream is not
101
101
  modified: the client keeps one of its own (`client.local`, announced by
102
102
  `localStreamChanged`) with the new track, and a reconnect republishes that. The
@@ -112,32 +112,38 @@ const media = await navigator.mediaDevices.getUserMedia({ audio: true, video: {
112
112
  await client.publish(media, undefined, { quality: '1080p' });
113
113
  await client.setVideoQuality('480p'); // resolves to the quality actually used
114
114
 
115
- client.videoPolicy; // { maxQuality: '720p' | '1080p', maxBitrate } for this project
115
+ client.videoPolicy; // { maxQuality: '480p' | '720p' | '1080p', maxFrameRate, maxBitrate } for this project
116
116
  client.videoQuality; // what is being sent now
117
117
  ```
118
118
 
119
- | Quality | Layers from a computer | From a phone or tablet | Upload needed |
119
+ | Quality | Layers from a computer at 30 fps | From a phone or tablet | Video upload |
120
120
  |---|---|---|---|
121
- | 1080p | 480×270 @ 400 kbps · 960×540 @ 1.5 Mbps · 1920×1080 @ **4 Mbps** | the top two | about 6 Mbps (phone 5.5); 8 Mbps or more to be safe |
122
- | 720p | 320×180 @ 200 kbps · 640×360 @ 700 kbps · 1280×720 @ **2.5 Mbps** | the top two | about 3.4 Mbps (phone 3.2); 4 Mbps or more to be safe |
123
- | 480p | 427×240 @ 400 kbps · 854×480 @ **1 Mbps** | the same two | about 1.4 Mbps; 2 Mbps or more to be safe |
124
-
125
- - 720p and 480p are available to every project. 1080p is available to projects
126
- that have it enabled (request it from your project's Settings in the VoltKit
127
- dashboard), and to your first project during the free trial. Asking for more
128
- than the project allows sends the highest it does allow.
129
- - The default is the highest the project allows. The picture is scaled down to
130
- the quality, never up: capture at least that size for the full picture.
131
- - The layers follow the picture's real size (a portrait phone, a 4:3 webcam),
132
- so the browser sends every layer requested. A portrait 720p phone sends
133
- 360×640 and 720×1280.
134
- - At 720p and 480p each viewer starts on the top layer and gets a lower one
135
- only while their connection cannot carry it. 1080p's top layer can need more
136
- than a viewer's starting estimate (3 Mbps), so a 1080p viewer may start one
137
- layer down and move up as their connection allows.
138
- - The server caps each publisher's incoming bitrate for the project's tier
139
- (4 Mbps up to 720p, 7 Mbps with 1080p, audio included), whatever client is
140
- used.
121
+ | 1080p | 480×270 @ 0.4 Mbps · 960×540 @ 2 Mbps · 1920×1080 @ **6 Mbps** | the top two | about 8.4 Mbps (phone 8) |
122
+ | 720p | 320×180 @ 0.2 Mbps · 640×360 @ 0.8 Mbps · 1280×720 @ **3 Mbps** | the top two | about 4 Mbps (phone 3.8) |
123
+ | 480p | 427×240 @ 0.4 Mbps · 854×480 @ **1.2 Mbps** | the same two | about 1.6 Mbps |
124
+
125
+ All qualities are included on every plan. The default policy allows 1080p and
126
+ 60 fps, with a 25 Mbps incoming safety cap per publisher. A project can have
127
+ an explicit administrative restriction; `videoPolicy` describes it.
128
+ The picture is scaled down to the chosen quality, never up. Portrait phones
129
+ keep their shape, for example 360×640 and 720×1280. Adaptive reception is the
130
+ default: viewers receive the best layer their connection can carry. Viewers
131
+ start with a 4 Mbps estimate, enough for 720p; 1080p ramps up as bandwidth allows.
132
+
133
+ 30 fps is the default. For 60 fps, capture at 60 and opt in:
134
+
135
+ ```ts
136
+ await client.publish(media, undefined, { quality: '1080p', frameRate: 60 });
137
+ const effectiveFps = await client.setVideoFrameRate(30); // camera only, other tracks continue
138
+ ```
139
+
140
+ Only the top layer uses 60 fps: 1080p is **9 Mbps**, 720p **4.5 Mbps**, and
141
+ 480p **1.8 Mbps**; smaller layers stay at 30. This means roughly 1.5× the top
142
+ layer's data and twice the encoding work. Phones can heat up and use more
143
+ battery, and many front cameras capture only 30. If capture is below 50 fps,
144
+ a project restricts it, or sustained device/upload limitation prevents 60,
145
+ the SDK uses 30 and emits `error` with `code: 'frame-rate-fallback'` as a warning.
146
+ `setVideoFrameRate(60)` retries the preference while preserving a paused camera.
141
147
 
142
148
  The full guide, with data use:
143
149
  [voltkit.in/docs/video-quality](https://voltkit.in/docs/video-quality).
@@ -173,7 +179,7 @@ client.on('videoLimited', ({ reason }) => {
173
179
 
174
180
  It fires once a new reason has held for about 4 seconds, so brief spikes stay
175
181
  quiet, and never fires `none` first. The client checks every 2 seconds, and
176
- only while a camera is published and something listens. `unpublish()` fires
182
+ while a camera is published and something listens, or while 60 fps needs fallback monitoring. `unpublish()` fires
177
183
  `none` if a limitation was showing.
178
184
 
179
185
  On a viewer, `getReceiveStats(producerId)` (the `producerId` from the `track`
@@ -205,13 +211,64 @@ await client.setPreferredLayers(producerId, 2); // the tile grew: the biggest
205
211
  Layer 0 is the smallest copy the publisher sends. At 720p a computer sends
206
212
  three (320×180, 640×360 and 1280×720) and a phone two (640×360 and 1280×720);
207
213
  a layer above the biggest means the biggest. The 640×360 copy needs about
208
- 0.76 Mbps, the full picture about 2.6. An optional third argument, the
214
+ 0.9 Mbps including audio, the full picture about 3.1. An optional third argument, the
209
215
  temporal layer, lowers the frame rate as well; without it the full frame rate
210
216
  is kept. It is the most this viewer is sent: a connection that cannot carry it
211
217
  still gets less. The choice is kept across reconnects and forgotten when the
212
218
  track ends, and `setPreferredLayers` rejects for a video this client is not
213
219
  receiving.
214
220
 
221
+ ### Receive quality
222
+
223
+ ```ts
224
+ await client.setReceiveQuality(producerId, '480p');
225
+ await client.setReceiveQuality(producerId, 'auto'); // recommended; clears spatial AND temporal ceilings
226
+ ```
227
+
228
+ Offer **Auto (recommended) / 1080p / 720p / 480p**. The `ReceiveQuality` helper
229
+ maps the request to the producer's actual `videoLayers` dimensions, including
230
+ portrait phones, two-layer cameras and screen tracks. It chooses the largest
231
+ available copy within the ceiling, or the smallest available if none fits.
232
+ It never creates a missing resolution: a 1080p screen with 540p and 1080p copies
233
+ uses 540p for the 480p choice. Connection adaptation still applies below the
234
+ ceiling. The preference is remembered across reconnects and ends with that
235
+ producer. Without layer metadata, explicit choices reject `quality-unavailable`;
236
+ Auto and the numeric `setPreferredLayers` API still work.
237
+
238
+ ### Screen sharing
239
+
240
+ Hosts and cohosts can share a screen beside their camera in SDK 0.5.0:
241
+
242
+ ```ts
243
+ client.on('screenShareStarted', ({ stream, mode }) => showScreenPreview(stream, mode));
244
+ client.on('screenShareEnded', ({ reason }) => hideScreenPreview(reason));
245
+ await client.publishScreen({ mode: 'detail', audio: true }); // from a button click
246
+ await client.unpublishScreen(); // camera, mic and music continue
247
+ ```
248
+
249
+ `ScreenPublishOptions` accepts `mode: 'detail' | 'motion'` (default `detail`),
250
+ `audio?: boolean` and `stream?: MediaStream`. Without `stream`, the SDK opens
251
+ `getDisplayMedia` and returns its `MediaStream`; capture audio defaults to
252
+ false. An existing stream's audio is used unless `audio: false` is supplied.
253
+ The SDK stops the supplied screen tracks when sharing ends.
254
+
255
+ Detail sends up to native 1920×1080 at 15 fps and 2.5 Mbps plus a half-size
256
+ 0.6 Mbps copy. Motion uses 30 fps, 6 Mbps plus 0.6 Mbps. Capture is never
257
+ upscaled. Optional tab/system audio is separate, `source: 'screen-audio'`,
258
+ 128 kbps stereo. Viewers play it like `music`; screen video arrives with
259
+ `source: 'screen'`. A browser may grant video without granting audio.
260
+
261
+ The browser's **Stop sharing** automatically unpublishes and emits
262
+ `screenShareEnded({ reason: 'track-ended' })`. Calling `unpublishScreen` emits
263
+ `reason: 'stopped'`. A reconnect republishes a still-live screen without another
264
+ picker. `unpublish()` and `close()` stop all local media. Unsupported capture
265
+ (most mobile browsers) rejects `screen-share-unsupported`; overlapping shares
266
+ reject `screen-share-active`; missing live video rejects `screen-share-no-video`.
267
+ Browser cancellation retains its `NotAllowedError`. Capture requires HTTPS,
268
+ a user gesture and permission; in iframes, also allow `display-capture`.
269
+
270
+ [Setup, modes, native platforms and troubleshooting](https://voltkit.in/docs/screen-sharing).
271
+
215
272
  ### Music
216
273
 
217
274
  A host can play music to the room from inside the page. It does not go through
@@ -256,6 +313,8 @@ musicAudio.muted = true; // "mute the music" for this viewer only
256
313
  ```ts
257
314
  await client.raiseHand();
258
315
  await client.lowerHand();
316
+ await client.raiseHand({ requestRole: 'cohost' }); // metadata also supports 'moderator'
317
+ await client.lowerHand(identity); // host/moderator: decline that raised hand
259
318
  await client.muteParticipant(identity); // moderating roles: asks them to mute
260
319
  await client.forceMute(identity, 'video'); // moderating roles: camera off, locked until released
261
320
  await client.forceMute(identity, 'video', false); // release
@@ -269,17 +328,19 @@ await client.getRoomState();
269
328
 
270
329
  | Event | Fires when |
271
330
  | --- | --- |
272
- | `track` / `trackEnded` | someone's audio or video is ready to render, or went away; `source` is `mic`, `music`, `camera` or `screen` |
331
+ | `track` / `trackEnded` | someone's audio or video is ready to render, or went away; `source` is `mic`, `music`, `camera`, `screen` or `screen-audio` |
273
332
  | `trackMuted` | someone paused or resumed a track — muted their mic, switched their music off |
274
333
  | `participantJoined` / `participantLeft` | roster changes |
334
+ | `participantMuted` | moderation lock changed: `{ identity, kind, paused }`; reconnect roster `muted` / `videoBlocked` seed the locks |
275
335
  | `roleChanged` | someone was promoted or demoted |
276
- | `handRaised` | a hand went up or down |
336
+ | `handRaised` | a hand went up or down, with optional `metadata` and `reason`; reconnect rosters include `handMetadata` |
337
+ | `screenShareStarted` / `screenShareEnded` | local screen capture began (`stream`, `mode`) or stopped (`reason`) |
277
338
  | `forceMuted` | a moderator switched **your** mic or camera off |
278
339
  | `streamInterrupted` | media stopped but the connection is fine — the publisher is reconnecting |
279
340
  | `localMediaChanged` / `localStreamChanged` | your own mic, camera or stream changed |
280
341
  | `connected` / `disconnected` | the socket came up or dropped; reconnection is automatic |
281
342
  | `kicked` / `roomClosed` | you were removed, or the host ended the room |
282
- | `error` | something failed that the SDK could not recover from by itself |
343
+ | `error` | a failure or recoverable warning such as `frame-rate-fallback`; inspect its code |
283
344
  | `usageLimit` | your project ran out of minutes or hit a usage limit; the session ends at `endsAt` unless it is topped up |
284
345
  | `videoLimited` | your camera video is held back by this device (`cpu`) or the upload (`bandwidth`), or that cleared (`none`) |
285
346
  | `closed` | terminal — `replaced`, `kicked`, `room-closed` or `gave-up`, or `left` when your own `close()` ends the session |
@@ -10,7 +10,7 @@ type RtpCapabilities = ms.RtpCapabilities;
10
10
  import type { ChatEvents, ChatMessage, ChatState, SendMessageOptions } from './chat.js';
11
11
  import { type CodecPreference } from './device.js';
12
12
  import { type MusicInput, type MusicOptions, type TrackSource } from './music.js';
13
- import { type LayerCount, type VideoPolicy, type VideoQuality } from './quality.js';
13
+ import { type ScreenMode, type ReceiveQuality, type VideoLayer, type LayerCount, type VideoPolicy, type VideoQuality } from './quality.js';
14
14
  import { type VideoLimitedEvent, type VideoReceiveStats, type VideoSendStats } from './stats.js';
15
15
  export { BroadcastPublisher, WhipError, whipEnd, whipOffer } from './broadcast.js';
16
16
  export { AudioMixer, MusicSource } from './music.js';
@@ -18,7 +18,7 @@ export type { MusicInput, MusicOptions, TrackSource } from './music.js';
18
18
  export type { BroadcastEvents, BroadcastStartOptions, BroadcastState } from './broadcast.js';
19
19
  export { ChatClient, ChatRpcError } from './chat.js';
20
20
  export { allowedQuality, layerBitrate, videoEncodings, VIDEO_QUALITIES } from './quality.js';
21
- export type { LayerCount, VideoEncoding, VideoPolicy, VideoQuality } from './quality.js';
21
+ export type { LayerCount, VideoEncoding, VideoPolicy, VideoQuality, VideoLayer, ReceiveQuality, ScreenMode } from './quality.js';
22
22
  export type { CodecPreference } from './device.js';
23
23
  export type { VideoLayerStats, VideoLimitedEvent, VideoLimitReason, VideoReceiveStats, VideoSendStats } from './stats.js';
24
24
  export type { ChatClientEvents, ChatEvents, ChatJoinResult, ChatMessage, ChatState, SendMessageOptions, } from './chat.js';
@@ -48,11 +48,13 @@ export interface JoinResult {
48
48
  blockedSlots?: string[];
49
49
  /**
50
50
  * The highest video quality this project may publish, and the server's cap
51
- * on a publisher's incoming bitrate. Absent from older servers: 720p.
51
+ * on a publisher's incoming bitrate. Absent from older servers: 1080p.
52
52
  */
53
53
  video?: VideoPolicy;
54
54
  }
55
55
  export interface PublishOptions {
56
+ /** 30 by default. Only the top layer uses 60; capture at 60 too. */
57
+ frameRate?: 30 | 60;
56
58
  /**
57
59
  * The video quality to send: 1080p, 720p or 480p. Defaults to the highest
58
60
  * the project allows (`videoPolicy.maxQuality`), and is lowered to it if
@@ -88,6 +90,12 @@ export interface PublishOptions {
88
90
  */
89
91
  degradationPreference?: 'maintain-resolution' | 'maintain-framerate' | 'balanced';
90
92
  }
93
+ export interface ScreenPublishOptions {
94
+ mode?: ScreenMode;
95
+ audio?: boolean;
96
+ /** An existing screen stream; otherwise capture is requested from this user gesture. */
97
+ stream?: MediaStream;
98
+ }
91
99
  export interface SlotClaim {
92
100
  key: string;
93
101
  identity: string;
@@ -100,7 +108,9 @@ export interface ParticipantInfo {
100
108
  identity: string;
101
109
  role: Role;
102
110
  handRaised: boolean;
111
+ handMetadata?: Record<string, unknown>;
103
112
  muted: boolean;
113
+ videoBlocked?: boolean;
104
114
  metadata?: unknown;
105
115
  }
106
116
  export interface RemoteProducer {
@@ -110,6 +120,10 @@ export interface RemoteProducer {
110
120
  paused: boolean;
111
121
  /** What the track carries. A host playing music publishes two audio tracks: `mic` and `music`. */
112
122
  source?: TrackSource;
123
+ videoLayers?: VideoLayer[];
124
+ appData?: {
125
+ videoLayers?: VideoLayer[];
126
+ };
113
127
  }
114
128
  export interface ClientEvents extends ChatEvents {
115
129
  connected: () => void;
@@ -140,6 +154,11 @@ export interface ClientEvents extends ChatEvents {
140
154
  identity: string;
141
155
  reason?: string;
142
156
  }) => void;
157
+ participantMuted: (e: {
158
+ identity: string;
159
+ kind?: 'audio' | 'video' | '';
160
+ paused: boolean;
161
+ }) => void;
143
162
  roleChanged: (e: {
144
163
  identity: string;
145
164
  role: Role;
@@ -147,6 +166,8 @@ export interface ClientEvents extends ChatEvents {
147
166
  handRaised: (e: {
148
167
  identity: string;
149
168
  handRaised: boolean;
169
+ metadata?: Record<string, unknown>;
170
+ reason?: string;
150
171
  }) => void;
151
172
  /**
152
173
  * A moderator switched your microphone (`audio`), camera (`video`) or both
@@ -170,6 +191,13 @@ export interface ClientEvents extends ChatEvents {
170
191
  by: string;
171
192
  reason?: string;
172
193
  }) => void;
194
+ screenShareStarted: (e: {
195
+ stream: MediaStream;
196
+ mode: ScreenMode;
197
+ }) => void;
198
+ screenShareEnded: (e: {
199
+ reason: 'stopped' | 'track-ended';
200
+ }) => void;
173
201
  error: (err: Error) => void;
174
202
  localMediaChanged: (state: {
175
203
  micEnabled: boolean;
@@ -227,6 +255,20 @@ export declare class StreamClient {
227
255
  /** In-app music being published, kept across reconnects so it can be published again. */
228
256
  private music;
229
257
  private musicProducerId;
258
+ private screenStream;
259
+ private screenMode;
260
+ private screenAudioEnabled;
261
+ private screenGeneration;
262
+ private screenPending;
263
+ private screenStarted;
264
+ private screenEndedListener;
265
+ private readonly screenProducerIds;
266
+ private readonly remoteVideoLayers;
267
+ private readonly receiveQualities;
268
+ private cameraFrameRate;
269
+ private frameRateFallback;
270
+ private frameRateLowSamples;
271
+ private frameRateWarmupSamples;
230
272
  /** What each remote producer carries, so a pause can say "music" rather than just "audio". */
231
273
  private readonly remoteSources;
232
274
  /**
@@ -288,7 +330,7 @@ export declare class StreamClient {
288
330
  * kept for a reconnect's republish.
289
331
  */
290
332
  publish(stream: MediaStream, constraints?: MediaStreamConstraints, options?: PublishOptions): Promise<void>;
291
- /** What this project may publish. Known once joined; 720p before that. */
333
+ /** What this project may publish. Known once joined; 1080p before that. */
292
334
  get videoPolicy(): VideoPolicy;
293
335
  /** The quality video is being sent at, after the project's limit. */
294
336
  get videoQuality(): VideoQuality;
@@ -299,11 +341,12 @@ export declare class StreamClient {
299
341
  * that size (for example with `track.applyConstraints`) first.
300
342
  */
301
343
  setVideoQuality(quality: VideoQuality): Promise<VideoQuality>;
344
+ /** Change the camera frame rate without stopping screen, microphone or music. */
345
+ setVideoFrameRate(frameRate: 30 | 60): Promise<30 | 60>;
302
346
  /**
303
347
  * Send a different video track from now on: a canvas with effects drawn on
304
348
  * it, the raw camera again, another camera. When the new track needs the
305
- * same layers as the current one (the same size, or another size the
306
- * project's quality scales alike), viewers see no pause, and the layers
349
+ * same dimensions and layers as the current one, viewers see no pause, and the layers
307
350
  * take the new picture's bitrates. Otherwise the camera producer is
308
351
  * replaced, as `setVideoQuality` does. Either way a paused camera stays
309
352
  * paused.
@@ -351,6 +394,8 @@ export declare class StreamClient {
351
394
  */
352
395
  setPreferredLayers(producerId: string, spatialLayer: number, temporalLayer?: number): Promise<void>;
353
396
  private collectVideoStats;
397
+ /** Friendly receive ceiling using this producer's real layer sizes; auto restores adaptation. */
398
+ setReceiveQuality(producerId: string, quality: ReceiveQuality): Promise<void>;
354
399
  private cameraProducer;
355
400
  private cameraTask;
356
401
  /** Swap the video in the client's own stream, never the app's. */
@@ -396,6 +441,15 @@ export declare class StreamClient {
396
441
  * when the tracks have genuinely ended.
397
442
  */
398
443
  private republish;
444
+ /** Publish a screen beside the camera. Call from a click so capture permission can open. */
445
+ publishScreen(options?: ScreenPublishOptions): Promise<MediaStream>;
446
+ /** Stop only the screen and its tab/system audio; keep camera, microphone and music. */
447
+ unpublishScreen(): Promise<void>;
448
+ private releaseScreen;
449
+ private stopScreen;
450
+ private restoreScreen;
451
+ private frameRateFor;
452
+ private sampleCamera;
399
453
  /**
400
454
  * Publish music playing inside the page, as its own track.
401
455
  *
@@ -431,12 +485,13 @@ export declare class StreamClient {
431
485
  */
432
486
  setMicEnabled(enabled: boolean): Promise<void>;
433
487
  setCamEnabled(enabled: boolean): Promise<void>;
488
+ private applyLocalModeration;
434
489
  private setKindEnabled;
435
490
  /** Stop publishing entirely and release the local devices. */
436
491
  unpublish(): Promise<void>;
437
492
  get local(): MediaStream | null;
438
- raiseHand(): Promise<unknown>;
439
- lowerHand(): Promise<unknown>;
493
+ raiseHand(metadata?: Record<string, unknown>): Promise<unknown>;
494
+ lowerHand(identity?: string): Promise<unknown>;
440
495
  muteParticipant(identity: string): Promise<unknown>;
441
496
  /**
442
497
  * Moderating roles: switch someone's microphone (`audio`), camera (`video`)
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAU,KAAK,KAAK,IAAI,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAO5D,KAAK,eAAe,GAAG,EAAE,CAAC,eAAe,CAAC;AAK1C,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AACxF,OAAO,EASL,KAAK,eAAe,EACrB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAe,KAAK,UAAU,EAAE,KAAK,YAAY,EAAE,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC;AAC/F,OAAO,EAML,KAAK,UAAU,EAEf,KAAK,WAAW,EAChB,KAAK,YAAY,EAClB,MAAM,cAAc,CAAC;AACtB,OAAO,EAML,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACpB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AACnF,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACrD,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACxE,YAAY,EAAE,eAAe,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAC7F,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC7F,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACzF,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,YAAY,EAAE,eAAe,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC1H,YAAY,EACV,gBAAgB,EAChB,UAAU,EACV,cAAc,EACd,WAAW,EACX,SAAS,EACT,kBAAkB,GACnB,MAAM,WAAW,CAAC;AAEnB,MAAM,MAAM,IAAI,GAAG,MAAM,GAAG,QAAQ,GAAG,WAAW,GAAG,QAAQ,CAAC;AAE9D,oEAAoE;AACpE,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,iBAAiB,GAAG,qBAAqB,GAAG,uBAAuB,GAAG,WAAW,GAAG,MAAM,CAAC;IACnG,YAAY,EAAE,MAAM,CAAC;IACrB,6DAA6D;IAC7D,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,IAAI,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,OAAO,CAAC;IAClB,qBAAqB,EAAE,eAAe,CAAC;IACvC,YAAY,EAAE,eAAe,EAAE,CAAC;IAChC,SAAS,EAAE,cAAc,EAAE,CAAC;IAC5B,UAAU,EAAE,YAAY,EAAE,CAAC;IAC3B,0EAA0E;IAC1E,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,wEAAwE;IACxE,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC;IACrB,oCAAoC;IACpC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB;;;OAGG;IACH,KAAK,CAAC,EAAE,WAAW,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B;;;;OAIG;IACH,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB;;;;;;;;;OASG;IACH,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB;;;;;;OAMG;IACH,KAAK,CAAC,EAAE,eAAe,CAAC;IACxB;;;;;;;OAOG;IACH,qBAAqB,CAAC,EAAE,qBAAqB,GAAG,oBAAoB,GAAG,UAAU,CAAC;CACnF;AAED,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,6EAA6E;IAC7E,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,0DAA0D;IAC1D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,IAAI,CAAC;IACX,UAAU,EAAE,OAAO,CAAC;IACpB,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC;IACxB,MAAM,EAAE,OAAO,CAAC;IAChB,kGAAkG;IAClG,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAID,MAAM,WAAW,YAAa,SAAQ,UAAU;IAC9C,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,MAAM,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,CAAC;IACrC,KAAK,EAAE,CAAC,IAAI,EAAE;QACZ,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC;QACxB,KAAK,EAAE,gBAAgB,CAAC;QACxB,UAAU,EAAE,MAAM,CAAC;QACnB,wGAAwG;QACxG,MAAM,EAAE,WAAW,CAAC;KACrB,KAAK,IAAI,CAAC;IACX,UAAU,EAAE,CAAC,IAAI,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IACrE,8FAA8F;IAC9F,UAAU,EAAE,CAAC,IAAI,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC;QAAC,MAAM,EAAE,WAAW,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI,CAAC;IACpI,iBAAiB,EAAE,CAAC,CAAC,EAAE,eAAe,KAAK,IAAI,CAAC;IAChD,eAAe,EAAE,CAAC,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IACpE,WAAW,EAAE,CAAC,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,IAAI,CAAA;KAAE,KAAK,IAAI,CAAC;IAC3D,UAAU,EAAE,CAAC,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI,CAAC;IACnE;;;;OAIG;IACH,UAAU,EAAE,CAAC,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,GAAG,EAAE,CAAC;QAAC,MAAM,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI,CAAC;IACxF,aAAa,EAAE,CAAC,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI,CAAC;IAC/E,UAAU,EAAE,CAAC,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IAC5C,MAAM,EAAE,CAAC,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IACrD,KAAK,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,CAAC;IAC5B,iBAAiB,EAAE,CAAC,KAAK,EAAE;QAAE,UAAU,EAAE,OAAO,CAAC;QAAC,UAAU,EAAE,OAAO,CAAC;QAAC,YAAY,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI,CAAC;IACxG,yFAAyF;IACzF,kBAAkB,EAAE,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,KAAK,IAAI,CAAC;IACzD,4FAA4F;IAC5F,iBAAiB,EAAE,CAAC,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IACnD,+EAA+E;IAC/E,MAAM,EAAE,CAAC,MAAM,EAAE,UAAU,GAAG,QAAQ,GAAG,aAAa,GAAG,SAAS,GAAG,MAAM,KAAK,IAAI,CAAC;IACrF;;;;OAIG;IACH,UAAU,EAAE,CAAC,CAAC,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAC1C;;;;;;;OAOG;IACH,YAAY,EAAE,CAAC,CAAC,EAAE,iBAAiB,KAAK,IAAI,CAAC;CAC9C;AAID,2EAA2E;AAC3E,qBAAa,QAAS,SAAQ,KAAK;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM;gBAAZ,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAInD;AAsDD,qBAAa,YAAY;IA4DX,OAAO,CAAC,QAAQ,CAAC,KAAK;IA3DlC,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,aAAa,CAA0B;IAC/C,OAAO,CAAC,aAAa,CAA0B;IAK/C,OAAO,CAAC,oBAAoB,CAAmC;IAC/D,OAAO,CAAC,oBAAoB,CAAmC;IAC/D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA8B;IACtD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAmC;IAC7D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA+B;IACzD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA+B;IACzD,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,UAAU,CAA2B;IAC7C,OAAO,CAAC,WAAW,CAA4B;IAK/C,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,kBAAkB,CAAuC;IACjE,OAAO,CAAC,cAAc,CAAsB;IAC5C,yFAAyF;IACzF,OAAO,CAAC,KAAK,CAA4B;IACzC,OAAO,CAAC,eAAe,CAAuB;IAC9C,8FAA8F;IAC9F,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAkC;IAChE;;;;OAIG;IACH,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAsC;IACtE,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,gBAAgB,CAAK;IAC7B,sFAAsF;IACtF,OAAO,CAAC,UAAU,CAAS;IAC3B,2EAA2E;IAC3E,OAAO,CAAC,eAAe,CAAgC;IAIvD,OAAO,CAAC,WAAW,CAAuC;IAI1D,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,mBAAmB,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAA4B;IAC9D,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAA4B;IAC9D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAGzB;gBAE2B,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IAIzD,EAAE,CAAC,CAAC,SAAS,MAAM,YAAY,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI;IAe3E,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,IAAI;IAYN,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC;IA8CpC,6GAA6G;IAC7G,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,UAAU;IA2DlB,OAAO,CAAC,YAAY;IAYpB;;;;OAIG;YACW,iBAAiB;IA2C/B,KAAK,IAAI,IAAI;IAoBb,OAAO,CAAC,aAAa;IAmBrB,gEAAgE;IAChE,IAAI,IAAI,IAAI,UAAU,GAAG,IAAI,CAE5B;IAID,OAAO,CAAC,GAAG;IAgBX,OAAO,CAAC,cAAc;IAQtB,OAAO,CAAC,SAAS;YAwBH,OAAO;IAyHrB,OAAO,CAAC,mBAAmB;YASb,mBAAmB;IAwBjC,OAAO,CAAC,mBAAmB;YASb,mBAAmB;IAkBjC;;;;;;;;;;;OAWG;IACG,OAAO,CAAC,MAAM,EAAE,WAAW,EAAE,WAAW,CAAC,EAAE,sBAAsB,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAkCjH,0EAA0E;IAC1E,IAAI,WAAW,IAAI,WAAW,CAE7B;IAED,qEAAqE;IACrE,IAAI,YAAY,IAAI,YAAY,CAE/B;IAED;;;;;OAKG;IACG,eAAe,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;IAWnE;;;;;;;;;;;;;;OAcG;IACG,iBAAiB,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IA2C/D;;;;;;OAMG;YACW,kBAAkB;IAuBhC;;;;;;;OAOG;IACG,aAAa,IAAI,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAIrD;;;;OAIG;IACG,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;IAe5E;;;;;;;;;;OAUG;IACG,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAc3F,iBAAiB;IAe/B,OAAO,CAAC,cAAc;IAOtB,OAAO,CAAC,UAAU;IAMlB,kEAAkE;IAClE,OAAO,CAAC,eAAe;IAQvB,iGAAiG;YACnF,eAAe;IAW7B,iFAAiF;IACjF,OAAO,CAAC,UAAU;IAKlB;;;;OAIG;YACW,aAAa;IAuD3B;;;;OAIG;YACW,YAAY;IAS1B;;;;OAIG;YACW,aAAa;IAI3B;;;OAGG;YACW,WAAW;IAuBzB,oGAAoG;IACpG,OAAO,CAAC,mBAAmB;IAS3B,+EAA+E;YACjE,0BAA0B;IAcxC,kFAAkF;IAClF,OAAO,CAAC,cAAc;IAItB;;;;;;OAMG;YACW,SAAS;IAwCvB;;;;;;;;;OASG;IACG,YAAY,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;YAmB9D,YAAY;IAiB1B,uEAAuE;IACvE,IAAI,eAAe,IAAI,OAAO,CAE7B;IAED,IAAI,YAAY,IAAI,OAAO,CAG1B;IAED,iFAAiF;IACjF,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAIpC,gFAAgF;IAC1E,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAStD,mFAAmF;IAC7E,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAahC,OAAO,CAAC,cAAc;YAQR,OAAO;IA6CrB,4DAA4D;IAC5D,IAAI,UAAU,IAAI,OAAO,CAExB;IAED,IAAI,UAAU,IAAI,OAAO,CAExB;IAED,IAAI,UAAU,IAAI,OAAO,CAExB;IAED,OAAO,CAAC,YAAY;IAOpB;;;;OAIG;IACG,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAI9C,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;YAItC,cAAc;IAW5B,8DAA8D;IACxD,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IA8BhC,IAAI,KAAK,IAAI,WAAW,GAAG,IAAI,CAE9B;IAID,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC;IAC7B,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC;IAC7B,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IACnD;;;;OAIG;IACH,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,EAAE,MAAM,UAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAGtF,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC;IACvD,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IACzD,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;IAC3B,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC;IAOhC,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,kBAAuB,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IAI7F,6EAA6E;IACvE,WAAW,CAAC,IAAI,GAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAO,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAKzF,4DAA4D;IAC5D,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAClD,sEAAsE;IACtE,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,UAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAC1D,8EAA8E;IAC9E,SAAS,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAC5C,YAAY,IAAI,OAAO,CAAC,SAAS,CAAC;CACnC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}