livekit-client 2.1.0 → 2.1.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (54) hide show
  1. package/dist/livekit-client.esm.mjs +2212 -2100
  2. package/dist/livekit-client.esm.mjs.map +1 -1
  3. package/dist/livekit-client.umd.js +1 -1
  4. package/dist/livekit-client.umd.js.map +1 -1
  5. package/dist/src/index.d.ts +1 -1
  6. package/dist/src/index.d.ts.map +1 -1
  7. package/dist/src/room/PCTransport.d.ts.map +1 -1
  8. package/dist/src/room/RTCEngine.d.ts +4 -4
  9. package/dist/src/room/RTCEngine.d.ts.map +1 -1
  10. package/dist/src/room/Room.d.ts +5 -2
  11. package/dist/src/room/Room.d.ts.map +1 -1
  12. package/dist/src/room/events.d.ts +20 -1
  13. package/dist/src/room/events.d.ts.map +1 -1
  14. package/dist/src/room/participant/LocalParticipant.d.ts.map +1 -1
  15. package/dist/src/room/participant/Participant.d.ts +2 -1
  16. package/dist/src/room/participant/Participant.d.ts.map +1 -1
  17. package/dist/src/room/track/RemoteTrack.d.ts +1 -0
  18. package/dist/src/room/track/RemoteTrack.d.ts.map +1 -1
  19. package/dist/src/room/track/Track.d.ts +4 -0
  20. package/dist/src/room/track/Track.d.ts.map +1 -1
  21. package/dist/src/room/track/TrackPublication.d.ts +3 -1
  22. package/dist/src/room/track/TrackPublication.d.ts.map +1 -1
  23. package/dist/src/room/types.d.ts +8 -0
  24. package/dist/src/room/types.d.ts.map +1 -1
  25. package/dist/src/room/utils.d.ts +4 -2
  26. package/dist/src/room/utils.d.ts.map +1 -1
  27. package/dist/src/utils/browserParser.d.ts +1 -0
  28. package/dist/src/utils/browserParser.d.ts.map +1 -1
  29. package/dist/ts4.2/src/index.d.ts +1 -1
  30. package/dist/ts4.2/src/room/RTCEngine.d.ts +4 -4
  31. package/dist/ts4.2/src/room/Room.d.ts +5 -2
  32. package/dist/ts4.2/src/room/events.d.ts +20 -1
  33. package/dist/ts4.2/src/room/participant/Participant.d.ts +2 -1
  34. package/dist/ts4.2/src/room/track/RemoteTrack.d.ts +1 -0
  35. package/dist/ts4.2/src/room/track/Track.d.ts +4 -0
  36. package/dist/ts4.2/src/room/track/TrackPublication.d.ts +3 -1
  37. package/dist/ts4.2/src/room/types.d.ts +8 -0
  38. package/dist/ts4.2/src/room/utils.d.ts +4 -2
  39. package/dist/ts4.2/src/utils/browserParser.d.ts +1 -0
  40. package/package.json +8 -8
  41. package/src/index.ts +1 -1
  42. package/src/room/PCTransport.ts +0 -2
  43. package/src/room/RTCEngine.ts +11 -61
  44. package/src/room/Room.ts +27 -1
  45. package/src/room/events.ts +23 -0
  46. package/src/room/participant/LocalParticipant.ts +3 -5
  47. package/src/room/participant/Participant.ts +5 -1
  48. package/src/room/track/RemoteTrack.ts +13 -0
  49. package/src/room/track/Track.ts +9 -0
  50. package/src/room/track/TrackPublication.ts +3 -1
  51. package/src/room/types.ts +9 -0
  52. package/src/room/utils.ts +46 -29
  53. package/src/utils/browserParser.test.ts +4 -0
  54. package/src/utils/browserParser.ts +11 -1
package/src/room/utils.ts CHANGED
@@ -1,5 +1,4 @@
1
- import { ClientInfo, ClientInfo_SDK } from '@livekit/protocol';
2
- import type { DetectableBrowser } from '../utils/browserParser';
1
+ import { ClientInfo, ClientInfo_SDK, Transcription as TranscriptionModel } from '@livekit/protocol';
3
2
  import { getBrowser } from '../utils/browserParser';
4
3
  import { protocolVersion, version } from '../version';
5
4
  import CriticalTimers from './timers';
@@ -7,7 +6,7 @@ import type LocalAudioTrack from './track/LocalAudioTrack';
7
6
  import type RemoteAudioTrack from './track/RemoteAudioTrack';
8
7
  import { VideoCodec, videoCodecs } from './track/options';
9
8
  import { getNewAudioContext } from './track/utils';
10
- import type { LiveKitReactNativeInfo } from './types';
9
+ import type { LiveKitReactNativeInfo, TranscriptionSegment } from './types';
11
10
 
12
11
  const separator = '|';
13
12
  export const ddExtensionURI =
@@ -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
- return /Tablet|iPad|Mobile|Android|BlackBerry/.test(navigator.userAgent);
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 {
@@ -525,3 +527,18 @@ export function toHttpUrl(url: string): string {
525
527
  }
526
528
  return url;
527
529
  }
530
+
531
+ export function extractTranscriptionSegments(
532
+ transcription: TranscriptionModel,
533
+ ): TranscriptionSegment[] {
534
+ return transcription.segments.map(({ id, text, language, startTime, endTime, final }) => {
535
+ return {
536
+ id,
537
+ text,
538
+ startTime: Number.parseInt(startTime.toString()),
539
+ endTime: Number.parseInt(endTime.toString()),
540
+ final,
541
+ language,
542
+ };
543
+ });
544
+ }
@@ -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
+ }