livekit-client 1.11.4 → 1.12.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.
Files changed (124) hide show
  1. package/README.md +1 -3
  2. package/dist/livekit-client.e2ee.worker.js +2 -0
  3. package/dist/livekit-client.e2ee.worker.js.map +1 -0
  4. package/dist/livekit-client.e2ee.worker.mjs +1525 -0
  5. package/dist/livekit-client.e2ee.worker.mjs.map +1 -0
  6. package/dist/livekit-client.esm.mjs +4749 -4055
  7. package/dist/livekit-client.esm.mjs.map +1 -1
  8. package/dist/livekit-client.umd.js +1 -1
  9. package/dist/livekit-client.umd.js.map +1 -1
  10. package/dist/src/api/SignalClient.d.ts +4 -1
  11. package/dist/src/api/SignalClient.d.ts.map +1 -1
  12. package/dist/src/connectionHelper/checks/turn.d.ts.map +1 -1
  13. package/dist/src/connectionHelper/checks/websocket.d.ts.map +1 -1
  14. package/dist/src/e2ee/E2eeManager.d.ts +45 -0
  15. package/dist/src/e2ee/E2eeManager.d.ts.map +1 -0
  16. package/dist/src/e2ee/KeyProvider.d.ts +42 -0
  17. package/dist/src/e2ee/KeyProvider.d.ts.map +1 -0
  18. package/dist/src/e2ee/constants.d.ts +14 -0
  19. package/dist/src/e2ee/constants.d.ts.map +1 -0
  20. package/dist/src/e2ee/errors.d.ts +11 -0
  21. package/dist/src/e2ee/errors.d.ts.map +1 -0
  22. package/dist/src/e2ee/index.d.ts +4 -0
  23. package/dist/src/e2ee/index.d.ts.map +1 -0
  24. package/dist/src/e2ee/types.d.ts +129 -0
  25. package/dist/src/e2ee/types.d.ts.map +1 -0
  26. package/dist/src/e2ee/utils.d.ts +24 -0
  27. package/dist/src/e2ee/utils.d.ts.map +1 -0
  28. package/dist/src/e2ee/worker/FrameCryptor.d.ts +175 -0
  29. package/dist/src/e2ee/worker/FrameCryptor.d.ts.map +1 -0
  30. package/dist/src/e2ee/worker/ParticipantKeyHandler.d.ts +46 -0
  31. package/dist/src/e2ee/worker/ParticipantKeyHandler.d.ts.map +1 -0
  32. package/dist/src/e2ee/worker/e2ee.worker.d.ts +2 -0
  33. package/dist/src/e2ee/worker/e2ee.worker.d.ts.map +1 -0
  34. package/dist/src/index.d.ts +1 -0
  35. package/dist/src/index.d.ts.map +1 -1
  36. package/dist/src/logger.d.ts +4 -1
  37. package/dist/src/logger.d.ts.map +1 -1
  38. package/dist/src/options.d.ts +5 -0
  39. package/dist/src/options.d.ts.map +1 -1
  40. package/dist/src/proto/livekit_models.d.ts +2 -2
  41. package/dist/src/proto/livekit_models.d.ts.map +1 -1
  42. package/dist/src/room/PCTransport.d.ts +3 -1
  43. package/dist/src/room/PCTransport.d.ts.map +1 -1
  44. package/dist/src/room/RTCEngine.d.ts +17 -3
  45. package/dist/src/room/RTCEngine.d.ts.map +1 -1
  46. package/dist/src/room/Room.d.ts +10 -0
  47. package/dist/src/room/Room.d.ts.map +1 -1
  48. package/dist/src/room/events.d.ts +14 -2
  49. package/dist/src/room/events.d.ts.map +1 -1
  50. package/dist/src/room/participant/LocalParticipant.d.ts +7 -2
  51. package/dist/src/room/participant/LocalParticipant.d.ts.map +1 -1
  52. package/dist/src/room/participant/Participant.d.ts +1 -0
  53. package/dist/src/room/participant/Participant.d.ts.map +1 -1
  54. package/dist/src/room/track/LocalTrack.d.ts.map +1 -1
  55. package/dist/src/room/track/RemoteVideoTrack.d.ts.map +1 -1
  56. package/dist/src/room/track/TrackPublication.d.ts +3 -0
  57. package/dist/src/room/track/TrackPublication.d.ts.map +1 -1
  58. package/dist/src/room/track/options.d.ts +2 -2
  59. package/dist/src/room/track/options.d.ts.map +1 -1
  60. package/dist/src/room/track/utils.d.ts +9 -0
  61. package/dist/src/room/track/utils.d.ts.map +1 -1
  62. package/dist/src/room/utils.d.ts +2 -0
  63. package/dist/src/room/utils.d.ts.map +1 -1
  64. package/dist/src/test/MockMediaStreamTrack.d.ts.map +1 -1
  65. package/dist/ts4.2/src/api/SignalClient.d.ts +4 -1
  66. package/dist/ts4.2/src/e2ee/E2eeManager.d.ts +45 -0
  67. package/dist/ts4.2/src/e2ee/KeyProvider.d.ts +42 -0
  68. package/dist/ts4.2/src/e2ee/constants.d.ts +14 -0
  69. package/dist/ts4.2/src/e2ee/errors.d.ts +11 -0
  70. package/dist/ts4.2/src/e2ee/index.d.ts +4 -0
  71. package/dist/ts4.2/src/e2ee/types.d.ts +129 -0
  72. package/dist/ts4.2/src/e2ee/utils.d.ts +24 -0
  73. package/dist/ts4.2/src/e2ee/worker/FrameCryptor.d.ts +175 -0
  74. package/dist/ts4.2/src/e2ee/worker/ParticipantKeyHandler.d.ts +46 -0
  75. package/dist/ts4.2/src/e2ee/worker/e2ee.worker.d.ts +2 -0
  76. package/dist/ts4.2/src/index.d.ts +1 -0
  77. package/dist/ts4.2/src/logger.d.ts +4 -1
  78. package/dist/ts4.2/src/options.d.ts +5 -0
  79. package/dist/ts4.2/src/proto/livekit_models.d.ts +2 -2
  80. package/dist/ts4.2/src/room/PCTransport.d.ts +3 -1
  81. package/dist/ts4.2/src/room/RTCEngine.d.ts +17 -3
  82. package/dist/ts4.2/src/room/Room.d.ts +10 -0
  83. package/dist/ts4.2/src/room/events.d.ts +14 -2
  84. package/dist/ts4.2/src/room/participant/LocalParticipant.d.ts +7 -2
  85. package/dist/ts4.2/src/room/participant/Participant.d.ts +1 -0
  86. package/dist/ts4.2/src/room/track/TrackPublication.d.ts +3 -0
  87. package/dist/ts4.2/src/room/track/options.d.ts +6 -6
  88. package/dist/ts4.2/src/room/track/utils.d.ts +9 -0
  89. package/dist/ts4.2/src/room/utils.d.ts +2 -0
  90. package/package.json +17 -7
  91. package/src/api/SignalClient.ts +28 -9
  92. package/src/connectionHelper/checks/turn.ts +1 -0
  93. package/src/connectionHelper/checks/websocket.ts +1 -0
  94. package/src/e2ee/E2eeManager.ts +374 -0
  95. package/src/e2ee/KeyProvider.ts +77 -0
  96. package/src/e2ee/constants.ts +40 -0
  97. package/src/e2ee/errors.ts +16 -0
  98. package/src/e2ee/index.ts +3 -0
  99. package/src/e2ee/types.ts +160 -0
  100. package/src/e2ee/utils.ts +127 -0
  101. package/src/e2ee/worker/FrameCryptor.test.ts +21 -0
  102. package/src/e2ee/worker/FrameCryptor.ts +614 -0
  103. package/src/e2ee/worker/ParticipantKeyHandler.ts +129 -0
  104. package/src/e2ee/worker/e2ee.worker.ts +217 -0
  105. package/src/e2ee/worker/tsconfig.json +6 -0
  106. package/src/index.ts +1 -0
  107. package/src/logger.ts +10 -2
  108. package/src/options.ts +6 -0
  109. package/src/proto/livekit_models.ts +12 -12
  110. package/src/room/PCTransport.ts +39 -9
  111. package/src/room/RTCEngine.ts +127 -34
  112. package/src/room/Room.ts +77 -22
  113. package/src/room/defaults.ts +1 -1
  114. package/src/room/events.ts +14 -0
  115. package/src/room/participant/LocalParticipant.ts +52 -8
  116. package/src/room/participant/Participant.ts +4 -0
  117. package/src/room/track/LocalTrack.ts +5 -4
  118. package/src/room/track/RemoteVideoTrack.ts +2 -2
  119. package/src/room/track/TrackPublication.ts +9 -1
  120. package/src/room/track/options.ts +3 -2
  121. package/src/room/track/utils.ts +27 -0
  122. package/src/room/utils.ts +5 -0
  123. package/src/room/worker.d.ts +4 -0
  124. package/src/test/MockMediaStreamTrack.ts +1 -0
@@ -0,0 +1,127 @@
1
+ import { videoCodecs } from '../room/track/options';
2
+ import type { VideoCodec } from '../room/track/options';
3
+ import { ENCRYPTION_ALGORITHM } from './constants';
4
+
5
+ export function isE2EESupported() {
6
+ return isInsertableStreamSupported() || isScriptTransformSupported();
7
+ }
8
+
9
+ export function isScriptTransformSupported() {
10
+ // @ts-ignore
11
+ return typeof window.RTCRtpScriptTransform !== 'undefined';
12
+ }
13
+
14
+ export function isInsertableStreamSupported() {
15
+ return (
16
+ typeof window.RTCRtpSender !== 'undefined' &&
17
+ // @ts-ignore
18
+ typeof window.RTCRtpSender.prototype.createEncodedStreams !== 'undefined'
19
+ );
20
+ }
21
+
22
+ export function isVideoFrame(
23
+ frame: RTCEncodedAudioFrame | RTCEncodedVideoFrame,
24
+ ): frame is RTCEncodedVideoFrame {
25
+ return 'type' in frame;
26
+ }
27
+
28
+ export async function importKey(
29
+ keyBytes: Uint8Array | ArrayBuffer,
30
+ algorithm: string | { name: string } = { name: ENCRYPTION_ALGORITHM },
31
+ usage: 'derive' | 'encrypt' = 'encrypt',
32
+ ) {
33
+ // https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/importKey
34
+ return crypto.subtle.importKey(
35
+ 'raw',
36
+ keyBytes,
37
+ algorithm,
38
+ false,
39
+ usage === 'derive' ? ['deriveBits', 'deriveKey'] : ['encrypt', 'decrypt'],
40
+ );
41
+ }
42
+
43
+ export async function createKeyMaterialFromString(password: string) {
44
+ let enc = new TextEncoder();
45
+
46
+ const keyMaterial = await crypto.subtle.importKey(
47
+ 'raw',
48
+ enc.encode(password),
49
+ {
50
+ name: 'PBKDF2',
51
+ },
52
+ false,
53
+ ['deriveBits', 'deriveKey'],
54
+ );
55
+
56
+ return keyMaterial;
57
+ }
58
+
59
+ function getAlgoOptions(algorithmName: string, salt: string) {
60
+ const textEncoder = new TextEncoder();
61
+ const encodedSalt = textEncoder.encode(salt);
62
+ switch (algorithmName) {
63
+ case 'HKDF':
64
+ return {
65
+ name: 'HKDF',
66
+ salt: encodedSalt,
67
+ hash: 'SHA-256',
68
+ info: new ArrayBuffer(128),
69
+ };
70
+ case 'PBKDF2': {
71
+ return {
72
+ name: 'PBKDF2',
73
+ salt: encodedSalt,
74
+ hash: 'SHA-256',
75
+ iterations: 100000,
76
+ };
77
+ }
78
+ default:
79
+ throw new Error(`algorithm ${algorithmName} is currently unsupported`);
80
+ }
81
+ }
82
+
83
+ /**
84
+ * Derives a set of keys from the master key.
85
+ * See https://tools.ietf.org/html/draft-omara-sframe-00#section-4.3.1
86
+ */
87
+ export async function deriveKeys(material: CryptoKey, salt: string) {
88
+ const algorithmOptions = getAlgoOptions(material.algorithm.name, salt);
89
+
90
+ // https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/deriveKey#HKDF
91
+ // https://developer.mozilla.org/en-US/docs/Web/API/HkdfParams
92
+ const encryptionKey = await crypto.subtle.deriveKey(
93
+ algorithmOptions,
94
+ material,
95
+ {
96
+ name: ENCRYPTION_ALGORITHM,
97
+ length: 128,
98
+ },
99
+ false,
100
+ ['encrypt', 'decrypt'],
101
+ );
102
+
103
+ return { material, encryptionKey };
104
+ }
105
+
106
+ export function createE2EEKey(): Uint8Array {
107
+ return window.crypto.getRandomValues(new Uint8Array(32));
108
+ }
109
+
110
+ export function mimeTypeToVideoCodecString(mimeType: string) {
111
+ const codec = mimeType.split('/')[1].toLowerCase() as VideoCodec;
112
+ if (!videoCodecs.includes(codec)) {
113
+ throw Error(`Video codec not supported: ${codec}`);
114
+ }
115
+ return codec;
116
+ }
117
+
118
+ /**
119
+ * Ratchets a key. See
120
+ * https://tools.ietf.org/html/draft-omara-sframe-00#section-4.3.5.1
121
+ */
122
+ export async function ratchet(material: CryptoKey, salt: string): Promise<ArrayBuffer> {
123
+ const algorithmOptions = getAlgoOptions(material.algorithm.name, salt);
124
+
125
+ // https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/deriveBits
126
+ return crypto.subtle.deriveBits(algorithmOptions, material, 256);
127
+ }
@@ -0,0 +1,21 @@
1
+ /**
2
+ * @jest-environment node
3
+ */
4
+ import { isFrameServerInjected } from './FrameCryptor';
5
+
6
+ describe('FrameCryptor', () => {
7
+ it('identifies server injected frame correctly', () => {
8
+ const frameTrailer = new TextEncoder().encode('LKROCKS');
9
+ const frameData = new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8, ...frameTrailer]).buffer;
10
+
11
+ expect(isFrameServerInjected(frameData, frameTrailer)).toBe(true);
12
+ });
13
+ it('identifies server non server injected frame correctly', () => {
14
+ const frameTrailer = new TextEncoder().encode('LKROCKS');
15
+ const frameData = new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8, ...frameTrailer, 10]);
16
+
17
+ expect(isFrameServerInjected(frameData.buffer, frameTrailer)).toBe(false);
18
+ frameData.fill(0);
19
+ expect(isFrameServerInjected(frameData.buffer, frameTrailer)).toBe(false);
20
+ });
21
+ });