livekit-client 2.19.2 → 2.20.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.
Files changed (185) hide show
  1. package/dist/livekit-client.e2ee.worker.js +1 -1
  2. package/dist/livekit-client.e2ee.worker.js.map +1 -1
  3. package/dist/livekit-client.e2ee.worker.mjs +31 -27
  4. package/dist/livekit-client.e2ee.worker.mjs.map +1 -1
  5. package/dist/livekit-client.esm.mjs +334 -126
  6. package/dist/livekit-client.esm.mjs.map +1 -1
  7. package/dist/livekit-client.fm.worker.js +2 -0
  8. package/dist/{livekit-client.pt.worker.js.map → livekit-client.fm.worker.js.map} +1 -1
  9. package/dist/{livekit-client.pt.worker.mjs → livekit-client.fm.worker.mjs} +12 -4
  10. package/dist/livekit-client.fm.worker.mjs.map +1 -0
  11. package/dist/livekit-client.umd.js +1 -1
  12. package/dist/livekit-client.umd.js.map +1 -1
  13. package/dist/src/api/SignalClient.d.ts.map +1 -1
  14. package/dist/src/e2ee/E2eeManager.d.ts +2 -1
  15. package/dist/src/e2ee/E2eeManager.d.ts.map +1 -1
  16. package/dist/src/e2ee/types.d.ts +6 -5
  17. package/dist/src/e2ee/types.d.ts.map +1 -1
  18. package/dist/src/e2ee/utils.d.ts +1 -0
  19. package/dist/src/e2ee/utils.d.ts.map +1 -1
  20. package/dist/src/e2ee/worker/DataCryptor.d.ts +1 -0
  21. package/dist/src/e2ee/worker/DataCryptor.d.ts.map +1 -1
  22. package/dist/src/e2ee/worker/FrameCryptor.d.ts +9 -8
  23. package/dist/src/e2ee/worker/FrameCryptor.d.ts.map +1 -1
  24. package/dist/src/e2ee/worker/naluUtils.d.ts +1 -0
  25. package/dist/src/e2ee/worker/naluUtils.d.ts.map +1 -1
  26. package/dist/src/e2ee/worker/sifPayload.d.ts +1 -0
  27. package/dist/src/e2ee/worker/sifPayload.d.ts.map +1 -1
  28. package/dist/src/{packetTrailer/PacketTrailerManager.d.ts → frameMetadata/FrameMetadataManager.d.ts} +8 -4
  29. package/dist/src/{packetTrailer/PacketTrailerManager.d.ts.map → frameMetadata/FrameMetadataManager.d.ts.map} +1 -1
  30. package/dist/src/{packetTrailer/packetTrailer.d.ts → frameMetadata/frameMetadata.d.ts} +8 -7
  31. package/dist/src/frameMetadata/frameMetadata.d.ts.map +1 -0
  32. package/dist/src/{packetTrailer → frameMetadata}/types.d.ts +11 -6
  33. package/dist/src/frameMetadata/types.d.ts.map +1 -0
  34. package/dist/src/frameMetadata/utils.d.ts +9 -0
  35. package/dist/src/{packetTrailer → frameMetadata}/utils.d.ts.map +1 -1
  36. package/dist/src/frameMetadata/worker/frameMetadata.worker.d.ts +2 -0
  37. package/dist/src/frameMetadata/worker/frameMetadata.worker.d.ts.map +1 -0
  38. package/dist/src/index.d.ts +10 -2
  39. package/dist/src/index.d.ts.map +1 -1
  40. package/dist/src/options.d.ts +8 -4
  41. package/dist/src/options.d.ts.map +1 -1
  42. package/dist/src/room/PCTransport.d.ts +41 -1
  43. package/dist/src/room/PCTransport.d.ts.map +1 -1
  44. package/dist/src/room/PCTransportManager.d.ts +1 -0
  45. package/dist/src/room/PCTransportManager.d.ts.map +1 -1
  46. package/dist/src/room/RTCEngine.d.ts +4 -1
  47. package/dist/src/room/RTCEngine.d.ts.map +1 -1
  48. package/dist/src/room/Room.d.ts +3 -2
  49. package/dist/src/room/Room.d.ts.map +1 -1
  50. package/dist/src/room/data-track/depacketizer.d.ts.map +1 -1
  51. package/dist/src/room/data-track/frame.d.ts +1 -0
  52. package/dist/src/room/data-track/frame.d.ts.map +1 -1
  53. package/dist/src/room/data-track/outgoing/types.d.ts +1 -0
  54. package/dist/src/room/data-track/outgoing/types.d.ts.map +1 -1
  55. package/dist/src/room/data-track/packet/extensions.d.ts +1 -0
  56. package/dist/src/room/data-track/packet/extensions.d.ts.map +1 -1
  57. package/dist/src/room/data-track/packet/index.d.ts +1 -0
  58. package/dist/src/room/data-track/packet/index.d.ts.map +1 -1
  59. package/dist/src/room/data-track/packet/serializable.d.ts +1 -0
  60. package/dist/src/room/data-track/packet/serializable.d.ts.map +1 -1
  61. package/dist/src/room/participant/LocalParticipant.d.ts +3 -2
  62. package/dist/src/room/participant/LocalParticipant.d.ts.map +1 -1
  63. package/dist/src/room/participant/Participant.d.ts +1 -0
  64. package/dist/src/room/participant/Participant.d.ts.map +1 -1
  65. package/dist/src/room/participant/publishUtils.d.ts.map +1 -1
  66. package/dist/src/room/token-source/TokenSource.d.ts.map +1 -1
  67. package/dist/src/room/token-source/types.d.ts +1 -0
  68. package/dist/src/room/token-source/types.d.ts.map +1 -1
  69. package/dist/src/room/token-source/utils.d.ts.map +1 -1
  70. package/dist/src/room/track/FrameMetadataExtractor.d.ts +19 -0
  71. package/dist/src/room/track/FrameMetadataExtractor.d.ts.map +1 -0
  72. package/dist/src/room/track/RemoteVideoTrack.d.ts +7 -7
  73. package/dist/src/room/track/RemoteVideoTrack.d.ts.map +1 -1
  74. package/dist/src/room/track/Track.d.ts +1 -0
  75. package/dist/src/room/track/Track.d.ts.map +1 -1
  76. package/dist/src/room/track/options.d.ts +17 -5
  77. package/dist/src/room/track/options.d.ts.map +1 -1
  78. package/dist/src/room/track/record.d.ts.map +1 -1
  79. package/dist/src/room/utils.d.ts +1 -0
  80. package/dist/src/room/utils.d.ts.map +1 -1
  81. package/dist/src/type-polyfills/non-shared-typed-arrays.d.ts +2 -0
  82. package/dist/src/type-polyfills/non-shared-typed-arrays.d.ts.map +1 -0
  83. package/dist/src/utils/dataPacketBuffer.d.ts +1 -0
  84. package/dist/src/utils/dataPacketBuffer.d.ts.map +1 -1
  85. package/dist/ts4.2/e2ee/E2eeManager.d.ts +2 -1
  86. package/dist/ts4.2/e2ee/types.d.ts +6 -5
  87. package/dist/ts4.2/e2ee/utils.d.ts +1 -0
  88. package/dist/ts4.2/e2ee/worker/DataCryptor.d.ts +1 -0
  89. package/dist/ts4.2/e2ee/worker/FrameCryptor.d.ts +9 -8
  90. package/dist/ts4.2/e2ee/worker/naluUtils.d.ts +1 -0
  91. package/dist/ts4.2/e2ee/worker/sifPayload.d.ts +1 -0
  92. package/dist/ts4.2/{packetTrailer/PacketTrailerManager.d.ts → frameMetadata/FrameMetadataManager.d.ts} +8 -4
  93. package/dist/ts4.2/{packetTrailer/packetTrailer.d.ts → frameMetadata/frameMetadata.d.ts} +8 -7
  94. package/dist/ts4.2/{packetTrailer → frameMetadata}/types.d.ts +11 -6
  95. package/dist/ts4.2/frameMetadata/utils.d.ts +9 -0
  96. package/dist/ts4.2/frameMetadata/worker/frameMetadata.worker.d.ts +2 -0
  97. package/dist/ts4.2/index.d.ts +9 -3
  98. package/dist/ts4.2/options.d.ts +8 -4
  99. package/dist/ts4.2/room/PCTransport.d.ts +41 -1
  100. package/dist/ts4.2/room/PCTransportManager.d.ts +1 -0
  101. package/dist/ts4.2/room/RTCEngine.d.ts +4 -1
  102. package/dist/ts4.2/room/Room.d.ts +3 -2
  103. package/dist/ts4.2/room/data-track/frame.d.ts +1 -0
  104. package/dist/ts4.2/room/data-track/outgoing/types.d.ts +1 -0
  105. package/dist/ts4.2/room/data-track/packet/extensions.d.ts +1 -0
  106. package/dist/ts4.2/room/data-track/packet/index.d.ts +1 -0
  107. package/dist/ts4.2/room/data-track/packet/serializable.d.ts +1 -0
  108. package/dist/ts4.2/room/participant/LocalParticipant.d.ts +3 -2
  109. package/dist/ts4.2/room/participant/Participant.d.ts +1 -0
  110. package/dist/ts4.2/room/token-source/types.d.ts +1 -0
  111. package/dist/ts4.2/room/track/FrameMetadataExtractor.d.ts +19 -0
  112. package/dist/ts4.2/room/track/RemoteVideoTrack.d.ts +7 -7
  113. package/dist/ts4.2/room/track/Track.d.ts +1 -0
  114. package/dist/ts4.2/room/track/options.d.ts +17 -5
  115. package/dist/ts4.2/room/utils.d.ts +1 -0
  116. package/dist/ts4.2/type-polyfills/non-shared-typed-arrays.d.ts +2 -0
  117. package/dist/ts4.2/utils/dataPacketBuffer.d.ts +1 -0
  118. package/package.json +24 -19
  119. package/src/api/SignalClient.test.ts +4 -4
  120. package/src/api/SignalClient.ts +8 -3
  121. package/src/api/WebSocketStream.test.ts +7 -7
  122. package/src/e2ee/E2eeManager.ts +16 -12
  123. package/src/e2ee/types.ts +6 -5
  124. package/src/e2ee/utils.ts +1 -0
  125. package/src/e2ee/worker/DataCryptor.ts +1 -0
  126. package/src/e2ee/worker/FrameCryptor.test.ts +6 -5
  127. package/src/e2ee/worker/FrameCryptor.ts +28 -23
  128. package/src/e2ee/worker/ParticipantKeyHandler.test.ts +1 -0
  129. package/src/e2ee/worker/e2ee.worker.ts +6 -5
  130. package/src/e2ee/worker/naluUtils.ts +1 -0
  131. package/src/e2ee/worker/sifPayload.ts +1 -0
  132. package/src/e2ee/worker/tsconfig.json +4 -1
  133. package/src/{packetTrailer/PacketTrailerManager.test.ts → frameMetadata/FrameMetadataManager.test.ts} +10 -8
  134. package/src/{packetTrailer/PacketTrailerManager.ts → frameMetadata/FrameMetadataManager.ts} +21 -15
  135. package/src/{packetTrailer/packetTrailer.test.ts → frameMetadata/frameMetadata.test.ts} +84 -1
  136. package/src/{packetTrailer/packetTrailer.ts → frameMetadata/frameMetadata.ts} +17 -9
  137. package/src/{packetTrailer → frameMetadata}/types.ts +13 -6
  138. package/src/{packetTrailer → frameMetadata}/utils.test.ts +19 -19
  139. package/src/{packetTrailer → frameMetadata}/utils.ts +11 -11
  140. package/src/{packetTrailer/worker/packetTrailer.worker.ts → frameMetadata/worker/frameMetadata.worker.ts} +5 -5
  141. package/src/{packetTrailer → frameMetadata}/worker/tsconfig.json +4 -1
  142. package/src/index.ts +13 -2
  143. package/src/options.ts +9 -4
  144. package/src/room/PCTransport.test.ts +150 -0
  145. package/src/room/PCTransport.ts +117 -0
  146. package/src/room/PCTransportManager.ts +4 -0
  147. package/src/room/RTCEngine.test.ts +143 -9
  148. package/src/room/RTCEngine.ts +112 -31
  149. package/src/room/Room.ts +11 -10
  150. package/src/room/data-track/depacketizer.ts +1 -0
  151. package/src/room/data-track/frame.ts +1 -0
  152. package/src/room/data-track/outgoing/types.ts +1 -0
  153. package/src/room/data-track/packet/extensions.ts +1 -0
  154. package/src/room/data-track/packet/index.ts +1 -0
  155. package/src/room/data-track/packet/serializable.ts +1 -0
  156. package/src/room/participant/LocalParticipant.test.ts +19 -19
  157. package/src/room/participant/LocalParticipant.ts +22 -16
  158. package/src/room/participant/Participant.ts +1 -0
  159. package/src/room/participant/publishUtils.test.ts +6 -0
  160. package/src/room/participant/publishUtils.ts +4 -1
  161. package/src/room/rpc/client/RpcClientManager.ts +1 -1
  162. package/src/room/rpc/server/RpcServerManager.ts +1 -1
  163. package/src/room/token-source/TokenSource.ts +9 -23
  164. package/src/room/token-source/types.ts +1 -0
  165. package/src/room/token-source/utils.ts +1 -0
  166. package/src/room/track/{PacketTrailerExtractor.ts → FrameMetadataExtractor.ts} +8 -8
  167. package/src/room/track/RemoteVideoTrack.ts +7 -11
  168. package/src/room/track/Track.ts +1 -0
  169. package/src/room/track/options.ts +19 -5
  170. package/src/room/track/record.ts +1 -0
  171. package/src/room/utils.ts +1 -0
  172. package/src/type-polyfills/{non-shared-typed-arrays.d.ts → non-shared-typed-arrays.ts} +6 -1
  173. package/src/utils/dataPacketBuffer.ts +2 -0
  174. package/dist/livekit-client.pt.worker.js +0 -2
  175. package/dist/livekit-client.pt.worker.mjs.map +0 -1
  176. package/dist/src/packetTrailer/packetTrailer.d.ts.map +0 -1
  177. package/dist/src/packetTrailer/types.d.ts.map +0 -1
  178. package/dist/src/packetTrailer/utils.d.ts +0 -9
  179. package/dist/src/packetTrailer/worker/packetTrailer.worker.d.ts +0 -2
  180. package/dist/src/packetTrailer/worker/packetTrailer.worker.d.ts.map +0 -1
  181. package/dist/src/room/track/PacketTrailerExtractor.d.ts +0 -19
  182. package/dist/src/room/track/PacketTrailerExtractor.d.ts.map +0 -1
  183. package/dist/ts4.2/packetTrailer/utils.d.ts +0 -9
  184. package/dist/ts4.2/packetTrailer/worker/packetTrailer.worker.d.ts +0 -2
  185. package/dist/ts4.2/room/track/PacketTrailerExtractor.d.ts +0 -19
@@ -1,4 +1,4 @@
1
- import type { PacketTrailerPublishOptions } from '../../packetTrailer/types';
1
+ import type { FrameMetadataPublishOptions } from '../../frameMetadata/types';
2
2
  import type { Track } from './Track';
3
3
  import type { AudioProcessorOptions, TrackProcessor, VideoProcessorOptions } from './processor/types';
4
4
  export interface TrackPublishDefaults {
@@ -113,14 +113,18 @@ export interface TrackPublishDefaults {
113
113
  */
114
114
  preConnectBuffer?: boolean;
115
115
  /**
116
- * Packet trailer metadata to append to published video frames.
116
+ * Frame metadata to append to published video frames.
117
117
  *
118
- * Requires either room-level packet trailer worker configuration or E2EE,
119
- * because encoded frame transforms are used to write the trailer.
118
+ * Requires either room-level frame metadata worker configuration or E2EE,
119
+ * because encoded frame transforms are used to write the metadata.
120
120
  *
121
121
  * @experimental
122
122
  */
123
- packetTrailer?: PacketTrailerPublishOptions;
123
+ frameMetadata?: FrameMetadataPublishOptions;
124
+ /**
125
+ * @deprecated Use {@link TrackPublishDefaults.frameMetadata} instead.
126
+ */
127
+ packetTrailer?: FrameMetadataPublishOptions;
124
128
  }
125
129
  /**
126
130
  * Options when publishing tracks
@@ -248,6 +252,14 @@ export interface AudioCaptureOptions {
248
252
  * @see https://w3c.github.io/mediacapture-extensions/#voiceisolation-constraint
249
253
  */
250
254
  voiceIsolation?: ConstrainBoolean;
255
+ /**
256
+ * @experimental
257
+ * when capturing system/screen-share audio, excludes the local participant's own audio
258
+ * from the captured stream to prevent echo. Browser support is not widespread yet
259
+ * (as of mid 2026, Chromium-based browsers only).
260
+ * @see https://developer.mozilla.org/en-US/docs/Web/API/MediaTrackConstraints/restrictOwnAudio
261
+ */
262
+ restrictOwnAudio?: ConstrainBoolean;
251
263
  /**
252
264
  * the sample rate or range of sample rates which are acceptable and/or required.
253
265
  */
@@ -1,5 +1,6 @@
1
1
  import { ChatMessage as ChatMessageModel, ClientInfo, ClientInfo_Capability, DisconnectReason, Transcription as TranscriptionModel } from '@livekit/protocol';
2
2
  import type { Throws } from '@livekit/throws-transformer/throws';
3
+ import type { NonSharedUint8Array } from '../type-polyfills/non-shared-typed-arrays';
3
4
  import TypedPromise from '../utils/TypedPromise';
4
5
  import type { BrowserDetails } from '../utils/browserParser';
5
6
  import type { ConnectionError } from './errors';
@@ -0,0 +1,2 @@
1
+ export type NonSharedUint8Array = ReturnType<typeof Uint8Array.from>;
2
+ //# sourceMappingURL=non-shared-typed-arrays.d.ts.map
@@ -1,3 +1,4 @@
1
+ import type { NonSharedUint8Array } from '../type-polyfills/non-shared-typed-arrays';
1
2
  export interface DataPacketItem {
2
3
  data: NonSharedUint8Array;
3
4
  sequence: number;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "livekit-client",
3
- "version": "2.19.2",
3
+ "version": "2.20.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",
@@ -17,9 +17,14 @@
17
17
  "require": "./dist/livekit-client.e2ee.worker.js"
18
18
  },
19
19
  "./packet-trailer-worker": {
20
- "types": "./dist/src/packetTrailer/worker/packetTrailer.worker.d.ts",
21
- "import": "./dist/livekit-client.pt.worker.mjs",
22
- "require": "./dist/livekit-client.pt.worker.js"
20
+ "types": "./dist/src/frameMetadata/worker/frameMetadata.worker.d.ts",
21
+ "import": "./dist/livekit-client.fm.worker.mjs",
22
+ "require": "./dist/livekit-client.fm.worker.js"
23
+ },
24
+ "./frame-metadata-worker": {
25
+ "types": "./dist/src/frameMetadata/worker/frameMetadata.worker.d.ts",
26
+ "import": "./dist/livekit-client.fm.worker.mjs",
27
+ "require": "./dist/livekit-client.fm.worker.js"
23
28
  }
24
29
  },
25
30
  "files": [
@@ -35,8 +40,8 @@
35
40
  "./dist/src/e2ee/worker/e2ee.worker.d.ts": [
36
41
  "./dist/ts4.2/e2ee/worker/e2ee.worker.d.ts"
37
42
  ],
38
- "./dist/src/packetTrailer/worker/packetTrailer.worker.d.ts": [
39
- "./dist/ts4.2/packetTrailer/worker/packetTrailer.worker.d.ts"
43
+ "./dist/src/frameMetadata/worker/frameMetadata.worker.d.ts": [
44
+ "./dist/ts4.2/frameMetadata/worker/frameMetadata.worker.d.ts"
40
45
  ]
41
46
  }
42
47
  },
@@ -45,21 +50,21 @@
45
50
  "license": "Apache-2.0",
46
51
  "dependencies": {
47
52
  "@livekit/mutex": "1.1.1",
48
- "@livekit/protocol": "1.45.8",
53
+ "@livekit/protocol": "1.46.6",
49
54
  "events": "^3.3.0",
50
55
  "jose": "^6.1.0",
51
56
  "loglevel": "^1.9.2",
52
57
  "sdp-transform": "^2.15.0",
53
58
  "tslib": "2.8.1",
54
59
  "typed-emitter": "^2.1.0",
55
- "webrtc-adapter": "9.0.5"
60
+ "webrtc-adapter": "9.0.6"
56
61
  },
57
62
  "peerDependencies": {
58
63
  "@types/dom-mediacapture-record": "^1"
59
64
  },
60
65
  "devDependencies": {
61
- "@babel/core": "7.29.0",
62
- "@babel/preset-env": "7.29.5",
66
+ "@babel/core": "7.29.7",
67
+ "@babel/preset-env": "7.29.7",
63
68
  "@bufbuild/protoc-gen-es": "^1.10.0",
64
69
  "@changesets/cli": "2.31.0",
65
70
  "@eslint/js": "10.0.1",
@@ -69,16 +74,16 @@
69
74
  "@rollup/plugin-commonjs": "29.0.2",
70
75
  "@rollup/plugin-json": "6.1.0",
71
76
  "@rollup/plugin-node-resolve": "16.0.3",
72
- "@rollup/plugin-terser": "^0.4.4",
73
- "@size-limit/file": "^11.2.0",
74
- "@size-limit/webpack": "^11.2.0",
77
+ "@rollup/plugin-terser": "^1.0.0",
78
+ "@size-limit/file": "^12.1.0",
79
+ "@size-limit/webpack": "^12.1.0",
75
80
  "@stylistic/eslint-plugin": "^5.10.0",
76
- "@trivago/prettier-plugin-sort-imports": "^5.0.0",
81
+ "@trivago/prettier-plugin-sort-imports": "^6.0.2",
77
82
  "@types/events": "^3.0.3",
78
83
  "@types/sdp-transform": "2.15.0",
79
84
  "@types/ua-parser-js": "0.7.39",
80
- "@typescript-eslint/eslint-plugin": "8.59.3",
81
- "@typescript-eslint/parser": "8.59.3",
85
+ "@typescript-eslint/eslint-plugin": "8.59.4",
86
+ "@typescript-eslint/parser": "8.59.4",
82
87
  "downlevel-dts": "^0.11.0",
83
88
  "eslint": "10.4.0",
84
89
  "eslint-config-airbnb-extended": "^2.3.2",
@@ -101,11 +106,11 @@
101
106
  "typedoc-plugin-no-inherit": "1.6.1",
102
107
  "typescript": "5.9.3",
103
108
  "typescript-eslint": "^8.47.0",
104
- "vite": "7.3.3",
105
- "vitest": "^3.0.0"
109
+ "vite": "7.3.5",
110
+ "vitest": "^4.0.0"
106
111
  },
107
112
  "scripts": {
108
- "build": "rollup --config --bundleConfigAsCjs && rollup --config rollup.config.worker.js --bundleConfigAsCjs && rollup --config rollup.config.pt-worker.js --bundleConfigAsCjs && pnpm downlevel-dts",
113
+ "build": "rollup --config --bundleConfigAsCjs && rollup --config rollup.config.worker.js --bundleConfigAsCjs && rollup --config rollup.config.fm-worker.js --bundleConfigAsCjs && pnpm downlevel-dts",
109
114
  "build:clean": "rm -rf ./dist && pnpm build",
110
115
  "build:watch": "rollup --watch --config --bundleConfigAsCjs",
111
116
  "build:worker:watch": "rollup --watch --config rollup.config.worker.js --bundleConfigAsCjs",
@@ -77,7 +77,7 @@ function mockWebSocketStream(options: MockWebSocketStreamOptions = {}) {
77
77
  onUrl,
78
78
  } = options;
79
79
 
80
- return vi.mocked(WebSocketStream).mockImplementationOnce((url) => {
80
+ return vi.mocked(WebSocketStream).mockImplementationOnce(function (url) {
81
81
  onUrl?.(url);
82
82
  return {
83
83
  url: 'wss://test.livekit.io',
@@ -283,7 +283,7 @@ describe('SignalClient.connect', () => {
283
283
  it('should reject when AbortSignal is triggered', async () => {
284
284
  const abortController = new AbortController();
285
285
 
286
- vi.mocked(WebSocketStream).mockImplementation(() => {
286
+ vi.mocked(WebSocketStream).mockImplementation(function () {
287
287
  // Simulate abort
288
288
  setTimeout(() => abortController.abort(new Error('User aborted connection')), 50);
289
289
 
@@ -344,7 +344,7 @@ describe('SignalClient.connect', () => {
344
344
  extensions: '',
345
345
  };
346
346
 
347
- vi.mocked(WebSocketStream).mockImplementation(() => {
347
+ vi.mocked(WebSocketStream).mockImplementation(function () {
348
348
  return {
349
349
  url: 'wss://test.livekit.io',
350
350
  opened: Promise.resolve(mockConnection),
@@ -526,7 +526,7 @@ describe('SignalClient.connect', () => {
526
526
  closedResolve = resolve;
527
527
  });
528
528
 
529
- vi.mocked(WebSocketStream).mockImplementation(() => {
529
+ vi.mocked(WebSocketStream).mockImplementation(function () {
530
530
  // Simulate close during connection
531
531
  queueMicrotask(() => {
532
532
  closedResolve({ closeCode: 1006, reason: 'Connection lost' });
@@ -61,6 +61,7 @@ import { ConnectionError } from '../room/errors';
61
61
  import CriticalTimers from '../room/timers';
62
62
  import type { LoggerOptions } from '../room/types';
63
63
  import { getClientInfo, isCompressionStreamSupported, isReactNative, sleep } from '../room/utils';
64
+ import type { NonSharedUint8Array } from '../type-polyfills/non-shared-typed-arrays';
64
65
  import { AsyncQueue } from '../utils/AsyncQueue';
65
66
  import { type WebSocketConnection, WebSocketStream } from './WebSocketStream';
66
67
  import {
@@ -376,13 +377,17 @@ export class SignalClient {
376
377
  if (redactedUrl.searchParams.has('access_token')) {
377
378
  redactedUrl.searchParams.set('access_token', '<redacted>');
378
379
  }
380
+
381
+ if (this.ws) {
382
+ const startClose = performance.now();
383
+ await this.close(false);
384
+ this.log.debug(`closed previous ws connection in ${performance.now() - startClose}ms`);
385
+ }
386
+
379
387
  this.log.info(`signal connecting to ${redactedUrl}`, {
380
388
  reconnect: opts.reconnect,
381
389
  reconnectReason: opts.reconnectReason,
382
390
  });
383
- if (this.ws) {
384
- await this.close(false);
385
- }
386
391
  this.ws = new WebSocketStream<ArrayBuffer>(rtcUrl);
387
392
 
388
393
  try {
@@ -129,24 +129,24 @@ describe('WebSocketStream', () => {
129
129
  vi.clearAllMocks();
130
130
 
131
131
  // Store original WebSocket
132
- originalWebSocket = global.WebSocket;
132
+ originalWebSocket = globalThis.WebSocket;
133
133
 
134
134
  // Mock WebSocket globally
135
- global.WebSocket = vi.fn((url: string, protocols?: string | string[]) => {
135
+ globalThis.WebSocket = vi.fn(function (url: string, protocols?: string | string[]) {
136
136
  mockWebSocket = new MockWebSocket(url, protocols);
137
137
  return mockWebSocket as any;
138
138
  }) as any;
139
139
 
140
140
  // Add constants to the mocked WebSocket
141
- (global.WebSocket as any).CONNECTING = MockWebSocket.CONNECTING;
142
- (global.WebSocket as any).OPEN = MockWebSocket.OPEN;
143
- (global.WebSocket as any).CLOSING = MockWebSocket.CLOSING;
144
- (global.WebSocket as any).CLOSED = MockWebSocket.CLOSED;
141
+ (globalThis.WebSocket as any).CONNECTING = MockWebSocket.CONNECTING;
142
+ (globalThis.WebSocket as any).OPEN = MockWebSocket.OPEN;
143
+ (globalThis.WebSocket as any).CLOSING = MockWebSocket.CLOSING;
144
+ (globalThis.WebSocket as any).CLOSED = MockWebSocket.CLOSED;
145
145
  });
146
146
 
147
147
  afterEach(() => {
148
148
  // Restore original WebSocket
149
- global.WebSocket = originalWebSocket;
149
+ globalThis.WebSocket = originalWebSocket;
150
150
  });
151
151
 
152
152
  describe('Constructor and Initialization', () => {
@@ -1,8 +1,9 @@
1
1
  import { Encryption_Type, TrackInfo } from '@livekit/protocol';
2
2
  import { EventEmitter } from 'events';
3
3
  import type TypedEventEmitter from 'typed-emitter';
4
+ import type { FrameMetadata } from '../frameMetadata/types';
5
+ import { hasFrameMetadataPublishOptions } from '../frameMetadata/utils';
4
6
  import log, { LogLevel, workerLogger } from '../logger';
5
- import { hasPacketTrailerPublishOptions } from '../packetTrailer/utils';
6
7
  import type RTCEngine from '../room/RTCEngine';
7
8
  import type Room from '../room/Room';
8
9
  import { ConnectionState } from '../room/Room';
@@ -20,6 +21,7 @@ import {
20
21
  isScriptTransformSupportedForWorker,
21
22
  isVideoTrack,
22
23
  } from '../room/utils';
24
+ import type { NonSharedUint8Array } from '../type-polyfills/non-shared-typed-arrays';
23
25
  import type { BaseKeyProvider } from './KeyProvider';
24
26
  import { E2EE_FLAG } from './constants';
25
27
  import { type E2EEManagerCallbacks, EncryptionEvent, KeyProviderEvent } from './events';
@@ -230,7 +232,7 @@ export class E2EEManager
230
232
  }
231
233
  break;
232
234
  case 'packetTrailerMetadata':
233
- this.handlePacketTrailerMetadata(data.trackId, data.rtpTimestamp, data.ssrc, data.metadata);
235
+ this.handleFrameMetadata(data.trackId, data.rtpTimestamp, data.ssrc, data.metadata);
234
236
  break;
235
237
  default:
236
238
  break;
@@ -242,11 +244,11 @@ export class E2EEManager
242
244
  this.emit(EncryptionEvent.EncryptionError, ev.error, undefined);
243
245
  };
244
246
 
245
- private handlePacketTrailerMetadata(
247
+ private handleFrameMetadata(
246
248
  trackId: string,
247
249
  rtpTimestamp: number,
248
250
  ssrc: number,
249
- metadata: { userTimestamp: bigint; frameId: number },
251
+ metadata: FrameMetadata,
250
252
  ) {
251
253
  if (!this.room) {
252
254
  return;
@@ -260,9 +262,9 @@ export class E2EEManager
260
262
  pub.track &&
261
263
  pub.track.mediaStreamID === trackId &&
262
264
  pub.track instanceof RemoteVideoTrack &&
263
- pub.track.packetTrailerExtractor
265
+ pub.track.frameMetadataExtractor
264
266
  ) {
265
- pub.track.packetTrailerExtractor.storeMetadata(rtpTimestamp, ssrc, metadata);
267
+ pub.track.frameMetadataExtractor.storeMetadata(rtpTimestamp, ssrc, metadata);
266
268
  return;
267
269
  }
268
270
  }
@@ -509,7 +511,9 @@ export class E2EEManager
509
511
  sender,
510
512
  track.mediaStreamID,
511
513
  undefined,
512
- isVideoTrack(track) ? track.publishOptions?.packetTrailer : undefined,
514
+ isVideoTrack(track)
515
+ ? (track.publishOptions?.frameMetadata ?? track.publishOptions?.packetTrailer)
516
+ : undefined,
513
517
  );
514
518
  }
515
519
 
@@ -598,7 +602,7 @@ export class E2EEManager
598
602
  sender: RTCRtpSender,
599
603
  trackId: string,
600
604
  codec?: VideoCodec,
601
- packetTrailer?: TrackPublishOptions['packetTrailer'],
605
+ frameMetadata?: TrackPublishOptions['frameMetadata'],
602
606
  ) {
603
607
  if (E2EE_FLAG in sender || !this.worker) {
604
608
  return;
@@ -615,8 +619,8 @@ export class E2EEManager
615
619
  participantIdentity: this.room.localParticipant.identity,
616
620
  trackId,
617
621
  codec,
618
- hasPacketTrailer: hasPacketTrailerPublishOptions(packetTrailer),
619
- packetTrailer,
622
+ hasPacketTrailer: hasFrameMetadataPublishOptions(frameMetadata),
623
+ packetTrailer: frameMetadata,
620
624
  };
621
625
  // @ts-ignore
622
626
  sender.transform = new RTCRtpScriptTransform(this.worker, options);
@@ -633,8 +637,8 @@ export class E2EEManager
633
637
  trackId,
634
638
  participantIdentity: this.room.localParticipant.identity,
635
639
  isReuse: false,
636
- hasPacketTrailer: hasPacketTrailerPublishOptions(packetTrailer),
637
- packetTrailer,
640
+ hasPacketTrailer: hasFrameMetadataPublishOptions(frameMetadata),
641
+ packetTrailer: frameMetadata,
638
642
  },
639
643
  };
640
644
  this.worker.postMessage(msg, [senderStreams.readable, senderStreams.writable]);
package/src/e2ee/types.ts CHANGED
@@ -1,7 +1,8 @@
1
+ import type { FrameMetadataPayload } from '../frameMetadata/frameMetadata';
2
+ import type { FrameMetadataPublishOptions } from '../frameMetadata/types';
1
3
  import type { LogLevel } from '../logger';
2
- import type { PacketTrailerFramePayload } from '../packetTrailer/packetTrailer';
3
- import type { PacketTrailerPublishOptions } from '../packetTrailer/types';
4
4
  import type { VideoCodec } from '../room/track/options';
5
+ import type { NonSharedUint8Array } from '../type-polyfills/non-shared-typed-arrays';
5
6
  import type { BaseE2EEManager } from './E2eeManager';
6
7
  import type { BaseKeyProvider } from './KeyProvider';
7
8
 
@@ -62,7 +63,7 @@ export interface EncodeMessage extends BaseMessage {
62
63
  /**
63
64
  * Packet trailer metadata to append on published video frames.
64
65
  */
65
- packetTrailer?: PacketTrailerPublishOptions;
66
+ packetTrailer?: FrameMetadataPublishOptions;
66
67
  };
67
68
  }
68
69
 
@@ -165,7 +166,7 @@ export interface EncryptDataResponseMessage extends BaseMessage {
165
166
 
166
167
  export interface PTMetadataFromE2EEMessage extends BaseMessage {
167
168
  kind: 'packetTrailerMetadata';
168
- data: PacketTrailerFramePayload;
169
+ data: FrameMetadataPayload;
169
170
  }
170
171
 
171
172
  export type E2EEWorkerMessage =
@@ -249,5 +250,5 @@ export type ScriptTransformOptions = {
249
250
  /**
250
251
  * Packet trailer metadata to append on published video frames.
251
252
  */
252
- packetTrailer?: PacketTrailerPublishOptions;
253
+ packetTrailer?: FrameMetadataPublishOptions;
253
254
  };
package/src/e2ee/utils.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import { type DataPacket, EncryptedPacketPayload } from '@livekit/protocol';
2
+ import type { NonSharedUint8Array } from '../type-polyfills/non-shared-typed-arrays';
2
3
  import { ENCRYPTION_ALGORITHM } from './constants';
3
4
  import type { KeyProviderOptions } from './types';
4
5
 
@@ -1,4 +1,5 @@
1
1
  import { workerLogger } from '../../logger';
2
+ import type { NonSharedUint8Array } from '../../type-polyfills/non-shared-typed-arrays';
2
3
  import { ENCRYPTION_ALGORITHM } from '../constants';
3
4
  import { CryptorError, CryptorErrorReason } from '../errors';
4
5
  import type { DecodeRatchetOptions, KeySet, RatchetResult } from '../types';
@@ -1,6 +1,7 @@
1
1
  import { afterEach, describe, expect, it, vitest } from 'vitest';
2
- import { appendPacketTrailer, extractPacketTrailer } from '../../packetTrailer/packetTrailer';
3
- import type { PacketTrailerPublishOptions } from '../../packetTrailer/types';
2
+ import { appendPacketTrailer, extractPacketTrailer } from '../../frameMetadata/frameMetadata';
3
+ import type { FrameMetadataPublishOptions } from '../../frameMetadata/types';
4
+ import type { NonSharedUint8Array } from '../../type-polyfills/non-shared-typed-arrays';
4
5
  import { IV_LENGTH, KEY_PROVIDER_DEFAULTS } from '../constants';
5
6
  import { CryptorEvent } from '../events';
6
7
  import type { KeyProviderOptions } from '../types';
@@ -69,7 +70,7 @@ function prepareParticipantTestDecoder(
69
70
  function prepareParticipantTestEncoder(
70
71
  participantIdentity: string,
71
72
  partialKeyProviderOptions: Partial<KeyProviderOptions>,
72
- packetTrailer?: PacketTrailerPublishOptions,
73
+ packetTrailer?: FrameMetadataPublishOptions,
73
74
  ) {
74
75
  return prepareParticipantTest(
75
76
  'encode',
@@ -83,7 +84,7 @@ function prepareParticipantTest(
83
84
  mode: 'encode' | 'decode',
84
85
  participantIdentity: string,
85
86
  partialKeyProviderOptions: Partial<KeyProviderOptions>,
86
- packetTrailer?: PacketTrailerPublishOptions,
87
+ packetTrailer?: FrameMetadataPublishOptions,
87
88
  ): {
88
89
  keys: ParticipantKeyHandler;
89
90
  cryptor: FrameCryptor;
@@ -536,7 +537,7 @@ describe('FrameCryptor', () => {
536
537
  const postMessage = vitest.fn();
537
538
  vitest.stubGlobal('postMessage', postMessage);
538
539
  encryptionEnabledMap.set(participantIdentity, false);
539
- cryptor.setHasPacketTrailer(true);
540
+ cryptor.setHasFrameMetadata(true);
540
541
 
541
542
  const payload = Uint8Array.from([1, 2, 3, 4]);
542
543
  const trailer = appendPacketTrailer(payload, 1_744_249_600_123_456n, 0);
@@ -1,15 +1,16 @@
1
1
  // TODO code inspired by https://github.com/webrtc/samples/blob/gh-pages/src/content/insertable-streams/endtoend-encryption/js/worker.js
2
2
  import { EventEmitter } from 'events';
3
3
  import type TypedEventEmitter from 'typed-emitter';
4
- import { workerLogger } from '../../logger';
5
4
  import {
6
5
  appendPacketTrailerToEncodedFrame,
7
6
  processPacketTrailer,
8
- } from '../../packetTrailer/packetTrailer';
9
- import type { PacketTrailerPublishOptions } from '../../packetTrailer/types';
10
- import { hasPacketTrailerPublishOptions } from '../../packetTrailer/utils';
7
+ } from '../../frameMetadata/frameMetadata';
8
+ import type { FrameMetadataPublishOptions } from '../../frameMetadata/types';
9
+ import { hasFrameMetadataPublishOptions } from '../../frameMetadata/utils';
10
+ import { workerLogger } from '../../logger';
11
11
  import { type VideoCodec, videoCodecs } from '../../room/track/options';
12
12
  import { mimeTypeToVideoCodecString } from '../../room/track/utils';
13
+ import type { NonSharedUint8Array } from '../../type-polyfills/non-shared-typed-arrays';
13
14
  import { ENCRYPTION_ALGORITHM, IV_LENGTH, UNENCRYPTED_BYTES } from '../constants';
14
15
  import { CryptorError, CryptorErrorReason } from '../errors';
15
16
  import { type CryptorCallbacks, CryptorEvent } from '../events';
@@ -88,11 +89,11 @@ export class FrameCryptor extends BaseFrameCryptor {
88
89
  * When false, we skip the per-frame trailer extraction path entirely
89
90
  * on decode to avoid unnecessary work on tracks that don't use it.
90
91
  */
91
- private hasPacketTrailer: boolean = false;
92
+ private hasFrameMetadata: boolean = false;
92
93
 
93
- private packetTrailer?: PacketTrailerPublishOptions;
94
+ private frameMetadataOpts?: FrameMetadataPublishOptions;
94
95
 
95
- private packetTrailerFrameId = 0;
96
+ private frameMetadataFrameId = 0;
96
97
 
97
98
  /**
98
99
  * Throttling mechanism for decryption errors to prevent memory leaks
@@ -212,13 +213,13 @@ export class FrameCryptor extends BaseFrameCryptor {
212
213
  * trailer data. When false, {@link decodeFunction} skips the per-frame
213
214
  * trailer extraction branch entirely.
214
215
  */
215
- setHasPacketTrailer(hasPacketTrailer: boolean) {
216
- this.hasPacketTrailer = hasPacketTrailer;
216
+ setHasFrameMetadata(hasFrameMetadata: boolean) {
217
+ this.hasFrameMetadata = hasFrameMetadata;
217
218
  }
218
219
 
219
- setPacketTrailer(packetTrailer?: PacketTrailerPublishOptions) {
220
- this.packetTrailer = packetTrailer;
221
- this.packetTrailerFrameId = 0;
220
+ setFrameMetadataOpts(frameMetadata?: FrameMetadataPublishOptions) {
221
+ this.frameMetadataOpts = frameMetadata;
222
+ this.frameMetadataFrameId = 0;
222
223
  }
223
224
 
224
225
  setupTransform(
@@ -228,14 +229,14 @@ export class FrameCryptor extends BaseFrameCryptor {
228
229
  trackId: string,
229
230
  isReuse: boolean,
230
231
  codec?: VideoCodec,
231
- packetTrailer?: PacketTrailerPublishOptions,
232
+ frameMetadata?: FrameMetadataPublishOptions,
232
233
  ) {
233
234
  if (codec) {
234
235
  workerLogger.info('setting codec on cryptor to', { codec });
235
236
  this.videoCodec = codec;
236
237
  }
237
238
  if (operation === 'encode') {
238
- this.setPacketTrailer(packetTrailer);
239
+ this.setFrameMetadataOpts(frameMetadata);
239
240
  }
240
241
 
241
242
  workerLogger.debug('Setting up frame cryptor transform', {
@@ -406,7 +407,7 @@ export class FrameCryptor extends BaseFrameCryptor {
406
407
  }
407
408
 
408
409
  if (!this.isEnabled()) {
409
- this.appendPacketTrailer(encodedFrame);
410
+ this.appendFrameMetadata(encodedFrame);
410
411
  return controller.enqueue(encodedFrame);
411
412
  }
412
413
  const keySet = this.keys.getKeySet();
@@ -475,7 +476,7 @@ export class FrameCryptor extends BaseFrameCryptor {
475
476
  newData.set(newDataWithoutHeader, frameHeader.byteLength);
476
477
 
477
478
  encodedFrame.data = newData.buffer;
478
- this.appendPacketTrailer(encodedFrame);
479
+ this.appendFrameMetadata(encodedFrame);
479
480
 
480
481
  return controller.enqueue(encodedFrame);
481
482
  } catch (e: any) {
@@ -494,16 +495,20 @@ export class FrameCryptor extends BaseFrameCryptor {
494
495
  }
495
496
  }
496
497
 
497
- private appendPacketTrailer(encodedFrame: RTCEncodedVideoFrame | RTCEncodedAudioFrame) {
498
- if (!hasPacketTrailerPublishOptions(this.packetTrailer) || !isVideoFrame(encodedFrame)) {
498
+ private appendFrameMetadata(encodedFrame: RTCEncodedVideoFrame | RTCEncodedAudioFrame) {
499
+ if (!hasFrameMetadataPublishOptions(this.frameMetadataOpts) || !isVideoFrame(encodedFrame)) {
499
500
  return;
500
501
  }
501
502
 
502
- if (this.packetTrailer?.frameId) {
503
- this.packetTrailerFrameId =
504
- this.packetTrailerFrameId === 0xffffffff ? 1 : this.packetTrailerFrameId + 1;
503
+ if (this.frameMetadataOpts?.frameId) {
504
+ this.frameMetadataFrameId =
505
+ this.frameMetadataFrameId === 0xffffffff ? 1 : this.frameMetadataFrameId + 1;
505
506
  }
506
- appendPacketTrailerToEncodedFrame(encodedFrame, this.packetTrailer, this.packetTrailerFrameId);
507
+ appendPacketTrailerToEncodedFrame(
508
+ encodedFrame,
509
+ this.frameMetadataOpts,
510
+ this.frameMetadataFrameId,
511
+ );
507
512
  }
508
513
 
509
514
  /**
@@ -516,7 +521,7 @@ export class FrameCryptor extends BaseFrameCryptor {
516
521
  encodedFrame: RTCEncodedVideoFrame | RTCEncodedAudioFrame,
517
522
  controller: TransformStreamDefaultController,
518
523
  ) {
519
- if (this.hasPacketTrailer && isVideoFrame(encodedFrame)) {
524
+ if (this.hasFrameMetadata && isVideoFrame(encodedFrame)) {
520
525
  try {
521
526
  const ptResult = processPacketTrailer(encodedFrame, this.trackId);
522
527
  if (ptResult.data) {
@@ -1,4 +1,5 @@
1
1
  import { describe, expect, it, test, vitest } from 'vitest';
2
+ import type { NonSharedUint8Array } from '../../type-polyfills/non-shared-typed-arrays';
2
3
  import { ENCRYPTION_ALGORITHM, KEY_PROVIDER_DEFAULTS } from '../constants';
3
4
  import { KeyHandlerEvent } from '../events';
4
5
  import { createKeyMaterialFromString, importKey } from '../utils';
@@ -1,5 +1,6 @@
1
1
  import { workerLogger } from '../../logger';
2
2
  import type { VideoCodec } from '../../room/track/options';
3
+ import type { NonSharedUint8Array } from '../../type-polyfills/non-shared-typed-arrays';
3
4
  import { AsyncQueue } from '../../utils/AsyncQueue';
4
5
  import { KEY_PROVIDER_DEFAULTS } from '../constants';
5
6
  import { CryptorErrorReason } from '../errors';
@@ -64,7 +65,7 @@ onmessage = (ev) => {
64
65
  break;
65
66
  case 'decode':
66
67
  let cryptor = getTrackCryptor(data.participantIdentity, data.trackId);
67
- cryptor.setHasPacketTrailer(data.hasPacketTrailer);
68
+ cryptor.setHasFrameMetadata(data.hasPacketTrailer);
68
69
  cryptor.setupTransform(
69
70
  kind,
70
71
  data.readableStream,
@@ -76,7 +77,7 @@ onmessage = (ev) => {
76
77
  break;
77
78
  case 'encode':
78
79
  let pubCryptor = getTrackCryptor(data.participantIdentity, data.trackId);
79
- pubCryptor.setHasPacketTrailer(data.hasPacketTrailer);
80
+ pubCryptor.setHasFrameMetadata(data.hasPacketTrailer);
80
81
  pubCryptor.setupTransform(
81
82
  kind,
82
83
  data.readableStream,
@@ -84,7 +85,7 @@ onmessage = (ev) => {
84
85
  data.trackId,
85
86
  data.isReuse,
86
87
  data.codec,
87
- data.packetTrailer,
88
+ data.packetTrailer, // wire format still uses 'packetTrailer' field name
88
89
  );
89
90
  break;
90
91
 
@@ -164,7 +165,7 @@ onmessage = (ev) => {
164
165
  case 'updateCodec':
165
166
  const trackCryptor = getTrackCryptor(data.participantIdentity, data.trackId);
166
167
  trackCryptor.setVideoCodec(data.codec);
167
- trackCryptor.setHasPacketTrailer(data.hasPacketTrailer);
168
+ trackCryptor.setHasFrameMetadata(data.hasPacketTrailer);
168
169
  workerLogger.info('updated codec', {
169
170
  participantIdentity: data.participantIdentity,
170
171
  trackId: data.trackId,
@@ -343,7 +344,7 @@ if (self.RTCTransformEvent) {
343
344
  const { kind, participantIdentity, trackId, codec, hasPacketTrailer } = options;
344
345
  messageQueue.run(async () => {
345
346
  const cryptor = getTrackCryptor(participantIdentity, trackId);
346
- cryptor.setHasPacketTrailer(hasPacketTrailer);
347
+ cryptor.setHasFrameMetadata(hasPacketTrailer);
347
348
  workerLogger.debug('onrtctransform setup', { participantIdentity, trackId, codec });
348
349
  cryptor.setupTransform(
349
350
  kind,
@@ -2,6 +2,7 @@
2
2
  * NALU (Network Abstraction Layer Unit) utilities for H.264 and H.265 video processing
3
3
  * Contains functions for parsing and working with NALUs in video frames
4
4
  */
5
+ import type { NonSharedUint8Array } from '../../type-polyfills/non-shared-typed-arrays';
5
6
 
6
7
  /**
7
8
  * Mask for extracting NALU type from H.264 header byte
@@ -1,4 +1,5 @@
1
1
  import type { VideoCodec } from '../..';
2
+ import type { NonSharedUint8Array } from '../../type-polyfills/non-shared-typed-arrays';
2
3
 
3
4
  // Payload definitions taken from https://github.com/livekit/livekit/blob/master/pkg/sfu/downtrack.go#L104
4
5
 
@@ -8,7 +8,10 @@
8
8
  "ES2018.Promise",
9
9
  "WebWorker",
10
10
  "ES2021.WeakRef",
11
- "DOM.AsyncIterable"
11
+ "DOM.AsyncIterable",
12
+ "ES2020.BigInt",
13
+ "ES2018.AsyncIterable",
14
+ "ES2018.AsyncGenerator"
12
15
  ]
13
16
  }
14
17
  }