livekit-client 2.0.10 → 2.1.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/dist/livekit-client.e2ee.worker.js +1 -1
- package/dist/livekit-client.e2ee.worker.js.map +1 -1
- package/dist/livekit-client.e2ee.worker.mjs +203 -140
- package/dist/livekit-client.e2ee.worker.mjs.map +1 -1
- package/dist/livekit-client.esm.mjs +12826 -15828
- 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/api/SignalClient.d.ts +2 -1
- package/dist/src/api/SignalClient.d.ts.map +1 -1
- package/dist/src/connectionHelper/ConnectionCheck.d.ts +3 -2
- package/dist/src/connectionHelper/ConnectionCheck.d.ts.map +1 -1
- package/dist/src/e2ee/worker/FrameCryptor.d.ts.map +1 -1
- package/dist/src/index.d.ts +3 -2
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/room/PCTransport.d.ts.map +1 -1
- package/dist/src/room/RTCEngine.d.ts +3 -3
- package/dist/src/room/RTCEngine.d.ts.map +1 -1
- package/dist/src/room/events.d.ts +5 -1
- package/dist/src/room/events.d.ts.map +1 -1
- package/dist/src/room/participant/LocalParticipant.d.ts +1 -0
- package/dist/src/room/participant/LocalParticipant.d.ts.map +1 -1
- package/dist/src/room/participant/publishUtils.d.ts.map +1 -1
- package/dist/src/room/track/LocalAudioTrack.d.ts +7 -0
- package/dist/src/room/track/LocalAudioTrack.d.ts.map +1 -1
- package/dist/src/room/track/LocalTrackPublication.d.ts +3 -2
- package/dist/src/room/track/LocalTrackPublication.d.ts.map +1 -1
- package/dist/src/room/track/LocalVideoTrack.d.ts.map +1 -1
- package/dist/src/room/track/Track.d.ts +2 -1
- package/dist/src/room/track/Track.d.ts.map +1 -1
- package/dist/src/room/track/options.d.ts +1 -1
- package/dist/src/room/track/options.d.ts.map +1 -1
- package/dist/src/room/utils.d.ts +4 -1
- package/dist/src/room/utils.d.ts.map +1 -1
- package/dist/src/utils/browserParser.d.ts +1 -0
- package/dist/src/utils/browserParser.d.ts.map +1 -1
- package/dist/ts4.2/src/api/SignalClient.d.ts +2 -1
- package/dist/ts4.2/src/connectionHelper/ConnectionCheck.d.ts +3 -2
- package/dist/ts4.2/src/index.d.ts +3 -2
- package/dist/ts4.2/src/room/RTCEngine.d.ts +3 -3
- package/dist/ts4.2/src/room/events.d.ts +5 -1
- package/dist/ts4.2/src/room/participant/LocalParticipant.d.ts +1 -0
- package/dist/ts4.2/src/room/track/LocalAudioTrack.d.ts +7 -0
- package/dist/ts4.2/src/room/track/LocalTrackPublication.d.ts +3 -2
- package/dist/ts4.2/src/room/track/Track.d.ts +2 -1
- package/dist/ts4.2/src/room/track/options.d.ts +1 -1
- package/dist/ts4.2/src/room/utils.d.ts +4 -1
- package/dist/ts4.2/src/utils/browserParser.d.ts +1 -0
- package/package.json +10 -10
- package/src/api/SignalClient.ts +9 -0
- package/src/connectionHelper/ConnectionCheck.ts +6 -3
- package/src/e2ee/worker/FrameCryptor.ts +0 -1
- package/src/e2ee/worker/e2ee.worker.ts +3 -1
- package/src/index.ts +3 -0
- package/src/room/PCTransport.ts +0 -2
- package/src/room/RTCEngine.ts +18 -62
- package/src/room/events.ts +5 -0
- package/src/room/participant/LocalParticipant.ts +17 -5
- package/src/room/participant/publishUtils.ts +2 -1
- package/src/room/track/LocalAudioTrack.ts +40 -0
- package/src/room/track/LocalTrackPublication.ts +28 -2
- package/src/room/track/LocalVideoTrack.ts +7 -3
- package/src/room/track/Track.ts +13 -0
- package/src/room/track/options.ts +22 -1
- package/src/room/utils.ts +32 -27
- package/src/utils/browserParser.test.ts +4 -0
- package/src/utils/browserParser.ts +11 -1
@@ -350,7 +350,28 @@ export function isBackupCodec(codec: string): codec is BackupVideoCodec {
|
|
350
350
|
/**
|
351
351
|
* scalability modes for svc.
|
352
352
|
*/
|
353
|
-
export type ScalabilityMode =
|
353
|
+
export type ScalabilityMode =
|
354
|
+
| 'L1T1'
|
355
|
+
| 'L1T2'
|
356
|
+
| 'L1T3'
|
357
|
+
| 'L2T1'
|
358
|
+
| 'L2T1h'
|
359
|
+
| 'L2T1_KEY'
|
360
|
+
| 'L2T2'
|
361
|
+
| 'L2T2h'
|
362
|
+
| 'L2T2_KEY'
|
363
|
+
| 'L2T3'
|
364
|
+
| 'L2T3h'
|
365
|
+
| 'L2T3_KEY'
|
366
|
+
| 'L3T1'
|
367
|
+
| 'L3T1h'
|
368
|
+
| 'L3T1_KEY'
|
369
|
+
| 'L3T2'
|
370
|
+
| 'L3T2h'
|
371
|
+
| 'L3T2_KEY'
|
372
|
+
| 'L3T3'
|
373
|
+
| 'L3T3h'
|
374
|
+
| 'L3T3_KEY';
|
354
375
|
|
355
376
|
export namespace AudioPresets {
|
356
377
|
export const telephone: AudioPreset = {
|
package/src/room/utils.ts
CHANGED
@@ -1,5 +1,4 @@
|
|
1
1
|
import { ClientInfo, ClientInfo_SDK } from '@livekit/protocol';
|
2
|
-
import type { DetectableBrowser } from '../utils/browserParser';
|
3
2
|
import { getBrowser } from '../utils/browserParser';
|
4
3
|
import { protocolVersion, version } from '../version';
|
5
4
|
import CriticalTimers from './timers';
|
@@ -107,31 +106,6 @@ export function supportsSetSinkId(elm?: HTMLMediaElement): boolean {
|
|
107
106
|
return 'setSinkId' in elm;
|
108
107
|
}
|
109
108
|
|
110
|
-
const setCodecPreferencesVersions: Record<DetectableBrowser, string> = {
|
111
|
-
Chrome: '100',
|
112
|
-
Safari: '15',
|
113
|
-
Firefox: '100',
|
114
|
-
};
|
115
|
-
|
116
|
-
export function supportsSetCodecPreferences(transceiver: RTCRtpTransceiver): boolean {
|
117
|
-
if (!isWeb()) {
|
118
|
-
return false;
|
119
|
-
}
|
120
|
-
if (!('setCodecPreferences' in transceiver)) {
|
121
|
-
return false;
|
122
|
-
}
|
123
|
-
const browser = getBrowser();
|
124
|
-
if (!browser?.name || !browser.version) {
|
125
|
-
// version is required
|
126
|
-
return false;
|
127
|
-
}
|
128
|
-
const v = setCodecPreferencesVersions[browser.name];
|
129
|
-
if (v) {
|
130
|
-
return compareVersions(browser.version, v) >= 0;
|
131
|
-
}
|
132
|
-
return false;
|
133
|
-
}
|
134
|
-
|
135
109
|
export function isBrowserSupported() {
|
136
110
|
if (typeof RTCPeerConnection === 'undefined') {
|
137
111
|
return false;
|
@@ -158,7 +132,35 @@ export function isSafari17(): boolean {
|
|
158
132
|
|
159
133
|
export function isMobile(): boolean {
|
160
134
|
if (!isWeb()) return false;
|
161
|
-
|
135
|
+
|
136
|
+
return (
|
137
|
+
// @ts-expect-error `userAgentData` is not yet part of typescript
|
138
|
+
navigator.userAgentData?.mobile ??
|
139
|
+
/Tablet|iPad|Mobile|Android|BlackBerry/.test(navigator.userAgent)
|
140
|
+
);
|
141
|
+
}
|
142
|
+
|
143
|
+
export function isE2EESimulcastSupported() {
|
144
|
+
const browser = getBrowser();
|
145
|
+
const supportedSafariVersion = '17.2'; // see https://bugs.webkit.org/show_bug.cgi?id=257803
|
146
|
+
if (browser) {
|
147
|
+
if (browser.name !== 'Safari' && browser.os !== 'iOS') {
|
148
|
+
return true;
|
149
|
+
} else if (
|
150
|
+
browser.os === 'iOS' &&
|
151
|
+
browser.osVersion &&
|
152
|
+
compareVersions(supportedSafariVersion, browser.osVersion) >= 0
|
153
|
+
) {
|
154
|
+
return true;
|
155
|
+
} else if (
|
156
|
+
browser.name === 'Safari' &&
|
157
|
+
compareVersions(supportedSafariVersion, browser.version) >= 0
|
158
|
+
) {
|
159
|
+
return true;
|
160
|
+
} else {
|
161
|
+
return false;
|
162
|
+
}
|
163
|
+
}
|
162
164
|
}
|
163
165
|
|
164
166
|
export function isWeb(): boolean {
|
@@ -447,6 +449,9 @@ export function createAudioAnalyser(
|
|
447
449
|
return { calculateVolume, analyser, cleanup };
|
448
450
|
}
|
449
451
|
|
452
|
+
/**
|
453
|
+
* @internal
|
454
|
+
*/
|
450
455
|
export class Mutex {
|
451
456
|
private _locking: Promise<void>;
|
452
457
|
|
@@ -29,12 +29,14 @@ describe('browser parser', () => {
|
|
29
29
|
expect(details?.name).toBe('Safari');
|
30
30
|
expect(details?.version).toBe('16.3');
|
31
31
|
expect(details?.os).toBe('macOS');
|
32
|
+
expect(details?.osVersion).toBe('10.15.7');
|
32
33
|
});
|
33
34
|
it('parses Safari iOS correctly', () => {
|
34
35
|
const details = getBrowser(iOSSafariUA, true);
|
35
36
|
expect(details?.name).toBe('Safari');
|
36
37
|
expect(details?.version).toBe('16.5');
|
37
38
|
expect(details?.os).toBe('iOS');
|
39
|
+
expect(details?.osVersion).toBe('16.5.1');
|
38
40
|
});
|
39
41
|
it('parses Firefox correctly', () => {
|
40
42
|
const details = getBrowser(firefoxUA, true);
|
@@ -46,6 +48,7 @@ describe('browser parser', () => {
|
|
46
48
|
expect(details?.name).toBe('Firefox');
|
47
49
|
expect(details?.version).toBe('115.0');
|
48
50
|
expect(details?.os).toBe('iOS');
|
51
|
+
expect(details?.osVersion).toBe('13.4.1');
|
49
52
|
});
|
50
53
|
it('parses Chrome correctly', () => {
|
51
54
|
const details = getBrowser(chromeUA, true);
|
@@ -57,6 +60,7 @@ describe('browser parser', () => {
|
|
57
60
|
expect(details?.name).toBe('Chrome');
|
58
61
|
expect(details?.version).toBe('115.0.5790.130');
|
59
62
|
expect(details?.os).toBe('iOS');
|
63
|
+
expect(details?.osVersion).toBe('16.5');
|
60
64
|
});
|
61
65
|
it('detects brave as chromium based', () => {
|
62
66
|
const details = getBrowser(braveUA, true);
|
@@ -10,6 +10,7 @@ export type BrowserDetails = {
|
|
10
10
|
name: DetectableBrowser;
|
11
11
|
version: string;
|
12
12
|
os?: DetectableOS;
|
13
|
+
osVersion?: string;
|
13
14
|
};
|
14
15
|
|
15
16
|
let browserDetails: BrowserDetails | undefined;
|
@@ -17,7 +18,7 @@ let browserDetails: BrowserDetails | undefined;
|
|
17
18
|
/**
|
18
19
|
* @internal
|
19
20
|
*/
|
20
|
-
export function getBrowser(userAgent?: string, force = true) {
|
21
|
+
export function getBrowser(userAgent?: string, force = true): BrowserDetails | undefined {
|
21
22
|
if (typeof userAgent === 'undefined' && typeof navigator === 'undefined') {
|
22
23
|
return;
|
23
24
|
}
|
@@ -37,6 +38,7 @@ const browsersList = [
|
|
37
38
|
name: 'Firefox',
|
38
39
|
version: getMatch(/(?:firefox|iceweasel|fxios)[\s/](\d+(\.?_?\d+)+)/i, ua),
|
39
40
|
os: ua.toLowerCase().includes('fxios') ? 'iOS' : undefined,
|
41
|
+
osVersion: getOSVersion(ua),
|
40
42
|
};
|
41
43
|
return browser;
|
42
44
|
},
|
@@ -48,6 +50,7 @@ const browsersList = [
|
|
48
50
|
name: 'Chrome',
|
49
51
|
version: getMatch(/(?:chrome|chromium|crios|crmo)\/(\d+(\.?_?\d+)+)/i, ua),
|
50
52
|
os: ua.toLowerCase().includes('crios') ? 'iOS' : undefined,
|
53
|
+
osVersion: getOSVersion(ua),
|
51
54
|
};
|
52
55
|
|
53
56
|
return browser;
|
@@ -61,6 +64,7 @@ const browsersList = [
|
|
61
64
|
name: 'Safari',
|
62
65
|
version: getMatch(commonVersionIdentifier, ua),
|
63
66
|
os: ua.includes('mobile/') ? 'iOS' : 'macOS',
|
67
|
+
osVersion: getOSVersion(ua),
|
64
68
|
};
|
65
69
|
|
66
70
|
return browser;
|
@@ -72,3 +76,9 @@ function getMatch(exp: RegExp, ua: string, id = 1) {
|
|
72
76
|
const match = ua.match(exp);
|
73
77
|
return (match && match.length >= id && match[id]) || '';
|
74
78
|
}
|
79
|
+
|
80
|
+
function getOSVersion(ua: string) {
|
81
|
+
return ua.includes('mac os')
|
82
|
+
? getMatch(/\(.+?(\d+_\d+(:?_\d+)?)/, ua, 1).replace(/_/g, '.')
|
83
|
+
: undefined;
|
84
|
+
}
|