livekit-client 1.10.0 → 1.11.1
Sign up to get free protection for your applications and to get access to all the features.
- package/dist/livekit-client.esm.mjs +504 -527
- package/dist/livekit-client.esm.mjs.map +1 -1
- package/dist/livekit-client.umd.js +1 -1
- package/dist/livekit-client.umd.js.map +1 -1
- package/dist/src/connectionHelper/ConnectionCheck.d.ts +2 -3
- package/dist/src/connectionHelper/ConnectionCheck.d.ts.map +1 -1
- package/dist/src/connectionHelper/checks/Checker.d.ts +2 -3
- package/dist/src/connectionHelper/checks/Checker.d.ts.map +1 -1
- package/dist/src/room/PCTransport.d.ts +1 -1
- package/dist/src/room/PCTransport.d.ts.map +1 -1
- package/dist/src/room/RTCEngine.d.ts +2 -4
- package/dist/src/room/RTCEngine.d.ts.map +1 -1
- package/dist/src/room/Room.d.ts +3 -4
- package/dist/src/room/Room.d.ts.map +1 -1
- package/dist/src/room/participant/LocalParticipant.d.ts.map +1 -1
- package/dist/src/room/participant/Participant.d.ts +2 -4
- package/dist/src/room/participant/Participant.d.ts.map +1 -1
- package/dist/src/room/participant/RemoteParticipant.d.ts +2 -1
- package/dist/src/room/participant/RemoteParticipant.d.ts.map +1 -1
- package/dist/src/room/participant/publishUtils.d.ts.map +1 -1
- package/dist/src/room/track/LocalTrack.d.ts +3 -2
- package/dist/src/room/track/LocalTrack.d.ts.map +1 -1
- package/dist/src/room/track/LocalVideoTrack.d.ts +1 -1
- package/dist/src/room/track/LocalVideoTrack.d.ts.map +1 -1
- package/dist/src/room/track/RemoteVideoTrack.d.ts +1 -0
- package/dist/src/room/track/RemoteVideoTrack.d.ts.map +1 -1
- package/dist/src/room/track/Track.d.ts +2 -4
- package/dist/src/room/track/Track.d.ts.map +1 -1
- package/dist/src/room/track/TrackPublication.d.ts +2 -4
- package/dist/src/room/track/TrackPublication.d.ts.map +1 -1
- package/dist/src/room/track/options.d.ts +13 -4
- package/dist/src/room/track/options.d.ts.map +1 -1
- package/dist/src/room/track/types.d.ts +2 -1
- package/dist/src/room/track/types.d.ts.map +1 -1
- package/dist/src/room/utils.d.ts.map +1 -1
- package/dist/ts4.2/src/connectionHelper/ConnectionCheck.d.ts +2 -3
- package/dist/ts4.2/src/connectionHelper/checks/Checker.d.ts +2 -3
- package/dist/ts4.2/src/room/PCTransport.d.ts +1 -1
- package/dist/ts4.2/src/room/RTCEngine.d.ts +2 -4
- package/dist/ts4.2/src/room/Room.d.ts +3 -4
- package/dist/ts4.2/src/room/participant/Participant.d.ts +2 -4
- package/dist/ts4.2/src/room/participant/RemoteParticipant.d.ts +2 -1
- package/dist/ts4.2/src/room/track/LocalTrack.d.ts +3 -2
- package/dist/ts4.2/src/room/track/LocalVideoTrack.d.ts +1 -1
- package/dist/ts4.2/src/room/track/RemoteVideoTrack.d.ts +1 -0
- package/dist/ts4.2/src/room/track/Track.d.ts +2 -4
- package/dist/ts4.2/src/room/track/TrackPublication.d.ts +2 -4
- package/dist/ts4.2/src/room/track/options.d.ts +13 -4
- package/dist/ts4.2/src/room/track/types.d.ts +2 -1
- package/package.json +2 -3
- package/src/connectionHelper/ConnectionCheck.ts +2 -3
- package/src/connectionHelper/checks/Checker.ts +2 -3
- package/src/logger.ts +4 -4
- package/src/room/PCTransport.ts +1 -1
- package/src/room/RTCEngine.ts +4 -4
- package/src/room/Room.ts +41 -11
- package/src/room/participant/LocalParticipant.ts +11 -3
- package/src/room/participant/Participant.ts +2 -4
- package/src/room/participant/RemoteParticipant.ts +4 -3
- package/src/room/participant/publishUtils.ts +16 -18
- package/src/room/track/LocalTrack.ts +68 -46
- package/src/room/track/LocalVideoTrack.ts +9 -7
- package/src/room/track/RemoteVideoTrack.ts +23 -6
- package/src/room/track/Track.ts +2 -4
- package/src/room/track/TrackPublication.ts +2 -4
- package/src/room/track/options.ts +13 -4
- package/src/room/track/types.ts +2 -1
- package/src/room/utils.ts +6 -3
@@ -1,4 +1,4 @@
|
|
1
|
-
import
|
1
|
+
import EventEmitter from 'eventemitter3';
|
2
2
|
import { DataPacket_Kind, ParticipantInfo, ParticipantPermission, ConnectionQuality as ProtoQuality, SubscriptionError } from '../../proto/livekit_models';
|
3
3
|
import type LocalTrackPublication from '../track/LocalTrackPublication';
|
4
4
|
import type RemoteTrack from '../track/RemoteTrack';
|
@@ -11,8 +11,7 @@ export declare enum ConnectionQuality {
|
|
11
11
|
Poor = "poor",
|
12
12
|
Unknown = "unknown"
|
13
13
|
}
|
14
|
-
|
15
|
-
export default class Participant extends Participant_base {
|
14
|
+
export default class Participant extends EventEmitter<ParticipantEventCallbacks> {
|
16
15
|
protected participantInfo?: ParticipantInfo;
|
17
16
|
audioTracks: Map<string, TrackPublication>;
|
18
17
|
videoTracks: Map<string, TrackPublication>;
|
@@ -90,5 +89,4 @@ export type ParticipantEventCallbacks = {
|
|
90
89
|
participantPermissionsChanged: (prevPermissions?: ParticipantPermission) => void;
|
91
90
|
trackSubscriptionStatusChanged: (publication: RemoteTrackPublication, status: TrackPublication.SubscriptionStatus) => void;
|
92
91
|
};
|
93
|
-
export {};
|
94
92
|
//# sourceMappingURL=Participant.d.ts.map
|
@@ -1,3 +1,4 @@
|
|
1
|
+
import type EventEmitter from 'eventemitter3';
|
1
2
|
import type { SignalClient } from '../../api/SignalClient';
|
2
3
|
import type { ParticipantInfo } from '../../proto/livekit_models';
|
3
4
|
import RemoteTrackPublication from '../track/RemoteTrackPublication';
|
@@ -48,6 +49,6 @@ export default class RemoteParticipant extends Participant {
|
|
48
49
|
*/
|
49
50
|
setAudioOutput(output: AudioOutputOptions): Promise<void>;
|
50
51
|
/** @internal */
|
51
|
-
emit<
|
52
|
+
emit<T extends EventEmitter.EventNames<ParticipantEventCallbacks>>(event: T, ...args: EventEmitter.EventArgs<ParticipantEventCallbacks, T>): boolean;
|
52
53
|
}
|
53
54
|
//# sourceMappingURL=RemoteParticipant.d.ts.map
|
@@ -29,6 +29,7 @@ export default abstract class LocalTrack extends Track {
|
|
29
29
|
get isUpstreamPaused(): boolean;
|
30
30
|
get isUserProvided(): boolean;
|
31
31
|
get mediaStreamTrack(): MediaStreamTrack;
|
32
|
+
private setMediaStreamTrack;
|
32
33
|
waitForDimensions(timeout?: number): Promise<Track.Dimensions>;
|
33
34
|
/**
|
34
35
|
* @returns DeviceID of the device that is currently being used for this track
|
@@ -49,8 +50,8 @@ export default abstract class LocalTrack extends Track {
|
|
49
50
|
* the server.
|
50
51
|
* this API is unsupported on Safari < 12 due to a bug
|
51
52
|
**/
|
52
|
-
pauseUpstream()
|
53
|
-
resumeUpstream()
|
53
|
+
pauseUpstream: () => Promise<void>;
|
54
|
+
resumeUpstream: () => Promise<void>;
|
54
55
|
/**
|
55
56
|
* Sets a processor on this track.
|
56
57
|
* See https://github.com/livekit/track-processors-js for example usage
|
@@ -50,5 +50,5 @@ export default class LocalVideoTrack extends LocalTrack {
|
|
50
50
|
protected handleAppVisibilityChanged(): Promise<void>;
|
51
51
|
}
|
52
52
|
export declare function videoQualityForRid(rid: string): VideoQuality;
|
53
|
-
export declare function videoLayersFromEncodings(width: number, height: number, encodings?: RTCRtpEncodingParameters[]): VideoLayer[];
|
53
|
+
export declare function videoLayersFromEncodings(width: number, height: number, encodings?: RTCRtpEncodingParameters[], svc?: boolean): VideoLayer[];
|
54
54
|
//# sourceMappingURL=LocalVideoTrack.d.ts.map
|
@@ -1,9 +1,8 @@
|
|
1
|
-
import
|
1
|
+
import EventEmitter from 'eventemitter3';
|
2
2
|
import type { SignalClient } from '../../api/SignalClient';
|
3
3
|
import { TrackSource, TrackType } from '../../proto/livekit_models';
|
4
4
|
import { StreamState as ProtoStreamState } from '../../proto/livekit_rtc';
|
5
|
-
declare
|
6
|
-
export declare abstract class Track extends Track_base {
|
5
|
+
export declare abstract class Track extends EventEmitter<TrackEventCallbacks> {
|
7
6
|
kind: Track.Kind;
|
8
7
|
attachedElements: HTMLMediaElement[];
|
9
8
|
isMuted: boolean;
|
@@ -121,5 +120,4 @@ export type TrackEventCallbacks = {
|
|
121
120
|
upstreamPaused: (track: any) => void;
|
122
121
|
upstreamResumed: (track: any) => void;
|
123
122
|
};
|
124
|
-
export {};
|
125
123
|
//# sourceMappingURL=Track.d.ts.map
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import
|
1
|
+
import EventEmitter from 'eventemitter3';
|
2
2
|
import type { SubscriptionError, TrackInfo } from '../../proto/livekit_models';
|
3
3
|
import type { UpdateSubscription, UpdateTrackSettings } from '../../proto/livekit_rtc';
|
4
4
|
import LocalAudioTrack from './LocalAudioTrack';
|
@@ -7,8 +7,7 @@ import RemoteAudioTrack from './RemoteAudioTrack';
|
|
7
7
|
import type RemoteTrack from './RemoteTrack';
|
8
8
|
import RemoteVideoTrack from './RemoteVideoTrack';
|
9
9
|
import { Track } from './Track';
|
10
|
-
declare
|
11
|
-
export declare class TrackPublication extends TrackPublication_base {
|
10
|
+
export declare class TrackPublication extends EventEmitter<PublicationEventCallbacks> {
|
12
11
|
kind: Track.Kind;
|
13
12
|
trackName: string;
|
14
13
|
trackSid: Track.SID;
|
@@ -65,5 +64,4 @@ export type PublicationEventCallbacks = {
|
|
65
64
|
subscriptionStatusChanged: (status: TrackPublication.SubscriptionStatus, prevStatus: TrackPublication.SubscriptionStatus) => void;
|
66
65
|
subscriptionFailed: (error: SubscriptionError) => void;
|
67
66
|
};
|
68
|
-
export {};
|
69
67
|
//# sourceMappingURL=TrackPublication.d.ts.map
|
@@ -54,10 +54,19 @@ export interface TrackPublishDefaults {
|
|
54
54
|
*/
|
55
55
|
scalabilityMode?: ScalabilityMode;
|
56
56
|
/**
|
57
|
-
*
|
58
|
-
*
|
59
|
-
*
|
60
|
-
*
|
57
|
+
* Up to two additional simulcast layers to publish in addition to the original
|
58
|
+
* Track.
|
59
|
+
* When left blank, it defaults to h180, h360.
|
60
|
+
* If a SVC codec is used (VP9 or AV1), this field has no effect.
|
61
|
+
*
|
62
|
+
* To publish three total layers, you would specify:
|
63
|
+
* {
|
64
|
+
* videoEncoding: {...}, // encoding of the primary layer
|
65
|
+
* videoSimulcastLayers: [
|
66
|
+
* VideoPresets.h540,
|
67
|
+
* VideoPresets.h216,
|
68
|
+
* ],
|
69
|
+
* }
|
61
70
|
*/
|
62
71
|
videoSimulcastLayers?: Array<VideoPreset>;
|
63
72
|
/**
|
@@ -6,7 +6,8 @@ export type AudioTrack = RemoteAudioTrack | LocalAudioTrack;
|
|
6
6
|
export type VideoTrack = RemoteVideoTrack | LocalVideoTrack;
|
7
7
|
export type AdaptiveStreamSettings = {
|
8
8
|
/**
|
9
|
-
* Set a custom pixel density
|
9
|
+
* Set a custom pixel density. Defaults to 2 for high density screens (3+) or
|
10
|
+
* 1 otherwise.
|
10
11
|
* When streaming videos on a ultra high definition screen this setting
|
11
12
|
* let's you account for the devicePixelRatio of those screens.
|
12
13
|
* Set it to `screen` to use the actual pixel density of the screen
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "livekit-client",
|
3
|
-
"version": "1.
|
3
|
+
"version": "1.11.1",
|
4
4
|
"description": "JavaScript/TypeScript client SDK for LiveKit",
|
5
5
|
"main": "./dist/livekit-client.umd.js",
|
6
6
|
"unpkg": "./dist/livekit-client.umd.js",
|
@@ -42,12 +42,11 @@
|
|
42
42
|
"size-limit": "size-limit"
|
43
43
|
},
|
44
44
|
"dependencies": {
|
45
|
-
"
|
45
|
+
"eventemitter3": "^5.0.1",
|
46
46
|
"loglevel": "^1.8.0",
|
47
47
|
"protobufjs": "^7.0.0",
|
48
48
|
"sdp-transform": "^2.14.1",
|
49
49
|
"ts-debounce": "^4.0.0",
|
50
|
-
"typed-emitter": "^2.1.0",
|
51
50
|
"webrtc-adapter": "^8.1.1"
|
52
51
|
},
|
53
52
|
"devDependencies": {
|
@@ -1,5 +1,4 @@
|
|
1
|
-
import
|
2
|
-
import type TypedEmitter from 'typed-emitter';
|
1
|
+
import EventEmitter from 'eventemitter3';
|
3
2
|
import { CheckStatus, Checker } from './checks/Checker';
|
4
3
|
import type { CheckInfo, InstantiableCheck } from './checks/Checker';
|
5
4
|
import { PublishAudioCheck } from './checks/publishAudio';
|
@@ -11,7 +10,7 @@ import { WebSocketCheck } from './checks/websocket';
|
|
11
10
|
|
12
11
|
export type { CheckInfo, CheckStatus };
|
13
12
|
|
14
|
-
export class ConnectionCheck extends
|
13
|
+
export class ConnectionCheck extends EventEmitter<ConnectionCheckCallbacks> {
|
15
14
|
token: string;
|
16
15
|
|
17
16
|
url: string;
|
@@ -1,5 +1,4 @@
|
|
1
|
-
import
|
2
|
-
import type TypedEmitter from 'typed-emitter';
|
1
|
+
import EventEmitter from 'eventemitter3';
|
3
2
|
import type { RoomConnectOptions, RoomOptions } from '../../options';
|
4
3
|
import type RTCEngine from '../../room/RTCEngine';
|
5
4
|
import Room, { ConnectionState } from '../../room/Room';
|
@@ -30,7 +29,7 @@ export interface CheckerOptions {
|
|
30
29
|
connectOptions?: RoomConnectOptions;
|
31
30
|
}
|
32
31
|
|
33
|
-
export abstract class Checker extends
|
32
|
+
export abstract class Checker extends EventEmitter<CheckerCallbacks> {
|
34
33
|
protected url: string;
|
35
34
|
|
36
35
|
protected token: string;
|
package/src/logger.ts
CHANGED
@@ -21,7 +21,7 @@ type StructuredLogger = {
|
|
21
21
|
|
22
22
|
const livekitLogger = log.getLogger('livekit');
|
23
23
|
|
24
|
-
livekitLogger.
|
24
|
+
livekitLogger.setDefaultLevel(LogLevel.info);
|
25
25
|
|
26
26
|
export default livekitLogger as StructuredLogger;
|
27
27
|
|
@@ -38,10 +38,10 @@ export type LogExtension = (level: LogLevel, msg: string, context?: object) => v
|
|
38
38
|
export function setLogExtension(extension: LogExtension) {
|
39
39
|
const originalFactory = livekitLogger.methodFactory;
|
40
40
|
|
41
|
-
livekitLogger.methodFactory = (methodName,
|
42
|
-
const rawMethod = originalFactory(methodName,
|
41
|
+
livekitLogger.methodFactory = (methodName, configLevel, loggerName) => {
|
42
|
+
const rawMethod = originalFactory(methodName, configLevel, loggerName);
|
43
43
|
|
44
|
-
const
|
44
|
+
const logLevel = LogLevel[methodName as LogLevelString];
|
45
45
|
const needLog = logLevel >= configLevel && logLevel < LogLevel.silent;
|
46
46
|
|
47
47
|
return (msg, context?: [msg: string, context: object]) => {
|
package/src/room/PCTransport.ts
CHANGED
package/src/room/RTCEngine.ts
CHANGED
@@ -1,5 +1,4 @@
|
|
1
|
-
import
|
2
|
-
import type TypedEventEmitter from 'typed-emitter';
|
1
|
+
import EventEmitter from 'eventemitter3';
|
3
2
|
import { SignalClient } from '../api/SignalClient';
|
4
3
|
import type { SignalOptions } from '../api/SignalClient';
|
5
4
|
import log from '../logger';
|
@@ -65,7 +64,7 @@ enum PCState {
|
|
65
64
|
}
|
66
65
|
|
67
66
|
/** @internal */
|
68
|
-
export default class RTCEngine extends
|
67
|
+
export default class RTCEngine extends EventEmitter<EngineEventCallbacks> {
|
69
68
|
publisher?: PCTransport;
|
70
69
|
|
71
70
|
subscriber?: PCTransport;
|
@@ -1046,6 +1045,7 @@ export default class RTCEngine extends (EventEmitter as new () => TypedEventEmit
|
|
1046
1045
|
};
|
1047
1046
|
this.once(EngineEvent.Restarted, onRestarted);
|
1048
1047
|
this.once(EngineEvent.Disconnected, onDisconnected);
|
1048
|
+
this.once(EngineEvent.Closing, onDisconnected);
|
1049
1049
|
});
|
1050
1050
|
};
|
1051
1051
|
|
@@ -1172,7 +1172,7 @@ export default class RTCEngine extends (EventEmitter as new () => TypedEventEmit
|
|
1172
1172
|
this.hasPublished = true;
|
1173
1173
|
|
1174
1174
|
const handleClosed = () => {
|
1175
|
-
log.
|
1175
|
+
log.warn('engine disconnected while negotiation was ongoing');
|
1176
1176
|
cleanup();
|
1177
1177
|
resolve();
|
1178
1178
|
return;
|
package/src/room/Room.ts
CHANGED
@@ -1,5 +1,4 @@
|
|
1
|
-
import
|
2
|
-
import type TypedEmitter from 'typed-emitter';
|
1
|
+
import EventEmitter from 'eventemitter3';
|
3
2
|
import 'webrtc-adapter';
|
4
3
|
import { toProtoSessionDescription } from '../api/SignalClient';
|
5
4
|
import log from '../logger';
|
@@ -65,6 +64,7 @@ import {
|
|
65
64
|
createDummyVideoStreamTrack,
|
66
65
|
getEmptyAudioStreamTrack,
|
67
66
|
isCloud,
|
67
|
+
isSafari,
|
68
68
|
isWeb,
|
69
69
|
supportsSetSinkId,
|
70
70
|
unpackStreamId,
|
@@ -90,7 +90,7 @@ export const RoomState = ConnectionState;
|
|
90
90
|
*
|
91
91
|
* @noInheritDoc
|
92
92
|
*/
|
93
|
-
class Room extends
|
93
|
+
class Room extends EventEmitter<RoomEventCallbacks> {
|
94
94
|
state: ConnectionState = ConnectionState.Disconnected;
|
95
95
|
|
96
96
|
/** map of sid: [[RemoteParticipant]] */
|
@@ -140,7 +140,6 @@ class Room extends (EventEmitter as new () => TypedEmitter<RoomEventCallbacks>)
|
|
140
140
|
*/
|
141
141
|
constructor(options?: RoomOptions) {
|
142
142
|
super();
|
143
|
-
this.setMaxListeners(100);
|
144
143
|
this.participants = new Map();
|
145
144
|
this.cachedParticipantSids = [];
|
146
145
|
this.identityToSid = new Map();
|
@@ -495,6 +494,9 @@ class Room extends (EventEmitter as new () => TypedEmitter<RoomEventCallbacks>)
|
|
495
494
|
// capturing both 'pagehide' and 'beforeunload' to capture broadest set of browser behaviors
|
496
495
|
window.addEventListener('pagehide', this.onPageLeave);
|
497
496
|
window.addEventListener('beforeunload', this.onPageLeave);
|
497
|
+
}
|
498
|
+
if (isWeb()) {
|
499
|
+
document.addEventListener('freeze', this.onPageLeave);
|
498
500
|
navigator.mediaDevices?.addEventListener('devicechange', this.handleDeviceChange);
|
499
501
|
}
|
500
502
|
this.setAndEmitConnectionState(ConnectionState.Connected);
|
@@ -657,8 +659,31 @@ class Room extends (EventEmitter as new () => TypedEmitter<RoomEventCallbacks>)
|
|
657
659
|
*/
|
658
660
|
async startAudio() {
|
659
661
|
await this.acquireAudioContext();
|
660
|
-
|
661
662
|
const elements: Array<HTMLMediaElement> = [];
|
663
|
+
|
664
|
+
if (isSafari()) {
|
665
|
+
/**
|
666
|
+
* iOS Safari blocks audio element playback if
|
667
|
+
* - user is not publishing audio themselves and
|
668
|
+
* - no other audio source is playing
|
669
|
+
*
|
670
|
+
* as a workaround, we create an audio element with an empty track, so that
|
671
|
+
* silent audio is always playing
|
672
|
+
*/
|
673
|
+
const audioId = 'livekit-dummy-audio-el';
|
674
|
+
let dummyAudioEl = document.getElementById(audioId) as HTMLAudioElement | null;
|
675
|
+
if (!dummyAudioEl) {
|
676
|
+
dummyAudioEl = document.createElement('audio');
|
677
|
+
dummyAudioEl.autoplay = true;
|
678
|
+
dummyAudioEl.hidden = true;
|
679
|
+
const track = getEmptyAudioStreamTrack();
|
680
|
+
track.enabled = true;
|
681
|
+
dummyAudioEl.srcObject = new MediaStream([track]);
|
682
|
+
document.body.append(dummyAudioEl);
|
683
|
+
}
|
684
|
+
elements.push(dummyAudioEl);
|
685
|
+
}
|
686
|
+
|
662
687
|
this.participants.forEach((p) => {
|
663
688
|
p.audioTracks.forEach((t) => {
|
664
689
|
if (t.track) {
|
@@ -965,6 +990,7 @@ class Room extends (EventEmitter as new () => TypedEmitter<RoomEventCallbacks>)
|
|
965
990
|
if (isWeb()) {
|
966
991
|
window.removeEventListener('beforeunload', this.onPageLeave);
|
967
992
|
window.removeEventListener('pagehide', this.onPageLeave);
|
993
|
+
window.removeEventListener('freeze', this.onPageLeave);
|
968
994
|
navigator.mediaDevices?.removeEventListener('devicechange', this.handleDeviceChange);
|
969
995
|
}
|
970
996
|
} finally {
|
@@ -1420,9 +1446,9 @@ class Room extends (EventEmitter as new () => TypedEmitter<RoomEventCallbacks>)
|
|
1420
1446
|
return true;
|
1421
1447
|
}
|
1422
1448
|
|
1423
|
-
private emitWhenConnected<
|
1424
|
-
event:
|
1425
|
-
...args:
|
1449
|
+
private emitWhenConnected<T extends EventEmitter.EventNames<RoomEventCallbacks>>(
|
1450
|
+
event: T,
|
1451
|
+
...args: EventEmitter.EventArgs<RoomEventCallbacks, T>
|
1426
1452
|
): boolean {
|
1427
1453
|
if (this.state === ConnectionState.Connected) {
|
1428
1454
|
return this.emit(event, ...args);
|
@@ -1599,10 +1625,14 @@ class Room extends (EventEmitter as new () => TypedEmitter<RoomEventCallbacks>)
|
|
1599
1625
|
}
|
1600
1626
|
|
1601
1627
|
// /** @internal */
|
1602
|
-
emit<
|
1603
|
-
event:
|
1604
|
-
...args:
|
1628
|
+
emit<T extends EventEmitter.EventNames<RoomEventCallbacks>>(
|
1629
|
+
event: T,
|
1630
|
+
...args: EventEmitter.EventArgs<RoomEventCallbacks, T>
|
1605
1631
|
): boolean {
|
1632
|
+
// emit<E extends keyof RoomEventCallbacks>(
|
1633
|
+
// event: E,
|
1634
|
+
// ...args: Parameters<RoomEventCallbacks[E]>
|
1635
|
+
// ): boolean {
|
1606
1636
|
// active speaker updates are too spammy
|
1607
1637
|
if (event !== RoomEvent.ActiveSpeakersChanged) {
|
1608
1638
|
log.debug(`room event ${event}`, { event, args });
|
@@ -143,8 +143,11 @@ export default class LocalParticipant extends Participant {
|
|
143
143
|
};
|
144
144
|
|
145
145
|
private handleDisconnected = () => {
|
146
|
-
this.reconnectFuture
|
147
|
-
|
146
|
+
if (this.reconnectFuture) {
|
147
|
+
this.reconnectFuture.promise.catch((e) => log.warn(e));
|
148
|
+
this.reconnectFuture?.reject?.('Got disconnected during reconnection attempt');
|
149
|
+
this.reconnectFuture = undefined;
|
150
|
+
}
|
148
151
|
};
|
149
152
|
|
150
153
|
/**
|
@@ -666,7 +669,12 @@ export default class LocalParticipant extends Participant {
|
|
666
669
|
dims.height,
|
667
670
|
opts,
|
668
671
|
);
|
669
|
-
req.layers = videoLayersFromEncodings(
|
672
|
+
req.layers = videoLayersFromEncodings(
|
673
|
+
req.width,
|
674
|
+
req.height,
|
675
|
+
encodings,
|
676
|
+
isSVCCodec(opts.videoCodec),
|
677
|
+
);
|
670
678
|
} else if (track.kind === Track.Kind.Audio) {
|
671
679
|
encodings = [
|
672
680
|
{
|
@@ -1,5 +1,4 @@
|
|
1
|
-
import
|
2
|
-
import type TypedEmitter from 'typed-emitter';
|
1
|
+
import EventEmitter from 'eventemitter3';
|
3
2
|
import log from '../../logger';
|
4
3
|
import {
|
5
4
|
DataPacket_Kind,
|
@@ -35,7 +34,7 @@ function qualityFromProto(q: ProtoQuality): ConnectionQuality {
|
|
35
34
|
}
|
36
35
|
}
|
37
36
|
|
38
|
-
export default class Participant extends
|
37
|
+
export default class Participant extends EventEmitter<ParticipantEventCallbacks> {
|
39
38
|
protected participantInfo?: ParticipantInfo;
|
40
39
|
|
41
40
|
audioTracks: Map<string, TrackPublication>;
|
@@ -72,7 +71,6 @@ export default class Participant extends (EventEmitter as new () => TypedEmitter
|
|
72
71
|
/** @internal */
|
73
72
|
constructor(sid: string, identity: string, name?: string, metadata?: string) {
|
74
73
|
super();
|
75
|
-
this.setMaxListeners(100);
|
76
74
|
this.sid = sid;
|
77
75
|
this.identity = identity;
|
78
76
|
this.name = name;
|
@@ -1,3 +1,4 @@
|
|
1
|
+
import type EventEmitter from 'eventemitter3';
|
1
2
|
import type { SignalClient } from '../../api/SignalClient';
|
2
3
|
import log from '../../logger';
|
3
4
|
import type { ParticipantInfo, SubscriptionError } from '../../proto/livekit_models';
|
@@ -345,9 +346,9 @@ export default class RemoteParticipant extends Participant {
|
|
345
346
|
}
|
346
347
|
|
347
348
|
/** @internal */
|
348
|
-
emit<
|
349
|
-
event:
|
350
|
-
...args:
|
349
|
+
emit<T extends EventEmitter.EventNames<ParticipantEventCallbacks>>(
|
350
|
+
event: T,
|
351
|
+
...args: EventEmitter.EventArgs<ParticipantEventCallbacks, T>
|
351
352
|
): boolean {
|
352
353
|
log.trace('participant event', { participant: this.sid, event, args });
|
353
354
|
return super.emit(event, ...args);
|
@@ -123,27 +123,25 @@ export function computeVideoEncodings(
|
|
123
123
|
if (scalabilityMode && isSVCCodec(videoCodec)) {
|
124
124
|
log.debug(`using svc with scalabilityMode ${scalabilityMode}`);
|
125
125
|
|
126
|
-
const
|
126
|
+
const sm = new ScalabilityMode(scalabilityMode);
|
127
127
|
|
128
|
-
|
129
|
-
switch (scalabilityMode) {
|
130
|
-
case 'L3T3':
|
131
|
-
case 'L3T3_KEY':
|
132
|
-
encodings.push({
|
133
|
-
rid: videoRids[2],
|
134
|
-
maxBitrate: videoEncoding.maxBitrate,
|
135
|
-
/* @ts-ignore */
|
136
|
-
maxFramerate: original.encoding.maxFramerate,
|
137
|
-
/* @ts-ignore */
|
138
|
-
scalabilityMode: scalabilityMode,
|
139
|
-
});
|
140
|
-
log.debug('encodings', encodings);
|
141
|
-
return encodings;
|
128
|
+
const encodings: RTCRtpEncodingParameters[] = [];
|
142
129
|
|
143
|
-
|
144
|
-
|
145
|
-
|
130
|
+
if (sm.spatial > 3) {
|
131
|
+
throw new Error(`unsupported scalabilityMode: ${scalabilityMode}`);
|
132
|
+
}
|
133
|
+
for (let i = 0; i < sm.spatial; i += 1) {
|
134
|
+
encodings.push({
|
135
|
+
rid: videoRids[2 - i],
|
136
|
+
maxBitrate: videoEncoding.maxBitrate / 3 ** i,
|
137
|
+
/* @ts-ignore */
|
138
|
+
maxFramerate: original.encoding.maxFramerate,
|
139
|
+
});
|
146
140
|
}
|
141
|
+
/* @ts-ignore */
|
142
|
+
encodings[0].scalabilityMode = scalabilityMode;
|
143
|
+
log.debug('encodings', encodings);
|
144
|
+
return encodings;
|
147
145
|
}
|
148
146
|
|
149
147
|
if (!useSimulcast) {
|