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.
- 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 +31 -27
- package/dist/livekit-client.e2ee.worker.mjs.map +1 -1
- package/dist/livekit-client.esm.mjs +334 -126
- package/dist/livekit-client.esm.mjs.map +1 -1
- package/dist/livekit-client.fm.worker.js +2 -0
- package/dist/{livekit-client.pt.worker.js.map → livekit-client.fm.worker.js.map} +1 -1
- package/dist/{livekit-client.pt.worker.mjs → livekit-client.fm.worker.mjs} +12 -4
- package/dist/livekit-client.fm.worker.mjs.map +1 -0
- package/dist/livekit-client.umd.js +1 -1
- package/dist/livekit-client.umd.js.map +1 -1
- package/dist/src/api/SignalClient.d.ts.map +1 -1
- package/dist/src/e2ee/E2eeManager.d.ts +2 -1
- package/dist/src/e2ee/E2eeManager.d.ts.map +1 -1
- package/dist/src/e2ee/types.d.ts +6 -5
- package/dist/src/e2ee/types.d.ts.map +1 -1
- package/dist/src/e2ee/utils.d.ts +1 -0
- package/dist/src/e2ee/utils.d.ts.map +1 -1
- package/dist/src/e2ee/worker/DataCryptor.d.ts +1 -0
- package/dist/src/e2ee/worker/DataCryptor.d.ts.map +1 -1
- package/dist/src/e2ee/worker/FrameCryptor.d.ts +9 -8
- package/dist/src/e2ee/worker/FrameCryptor.d.ts.map +1 -1
- package/dist/src/e2ee/worker/naluUtils.d.ts +1 -0
- package/dist/src/e2ee/worker/naluUtils.d.ts.map +1 -1
- package/dist/src/e2ee/worker/sifPayload.d.ts +1 -0
- package/dist/src/e2ee/worker/sifPayload.d.ts.map +1 -1
- package/dist/src/{packetTrailer/PacketTrailerManager.d.ts → frameMetadata/FrameMetadataManager.d.ts} +8 -4
- package/dist/src/{packetTrailer/PacketTrailerManager.d.ts.map → frameMetadata/FrameMetadataManager.d.ts.map} +1 -1
- package/dist/src/{packetTrailer/packetTrailer.d.ts → frameMetadata/frameMetadata.d.ts} +8 -7
- package/dist/src/frameMetadata/frameMetadata.d.ts.map +1 -0
- package/dist/src/{packetTrailer → frameMetadata}/types.d.ts +11 -6
- package/dist/src/frameMetadata/types.d.ts.map +1 -0
- package/dist/src/frameMetadata/utils.d.ts +9 -0
- package/dist/src/{packetTrailer → frameMetadata}/utils.d.ts.map +1 -1
- package/dist/src/frameMetadata/worker/frameMetadata.worker.d.ts +2 -0
- package/dist/src/frameMetadata/worker/frameMetadata.worker.d.ts.map +1 -0
- package/dist/src/index.d.ts +10 -2
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/options.d.ts +8 -4
- package/dist/src/options.d.ts.map +1 -1
- package/dist/src/room/PCTransport.d.ts +41 -1
- package/dist/src/room/PCTransport.d.ts.map +1 -1
- package/dist/src/room/PCTransportManager.d.ts +1 -0
- package/dist/src/room/PCTransportManager.d.ts.map +1 -1
- package/dist/src/room/RTCEngine.d.ts +4 -1
- package/dist/src/room/RTCEngine.d.ts.map +1 -1
- package/dist/src/room/Room.d.ts +3 -2
- package/dist/src/room/Room.d.ts.map +1 -1
- package/dist/src/room/data-track/depacketizer.d.ts.map +1 -1
- package/dist/src/room/data-track/frame.d.ts +1 -0
- package/dist/src/room/data-track/frame.d.ts.map +1 -1
- package/dist/src/room/data-track/outgoing/types.d.ts +1 -0
- package/dist/src/room/data-track/outgoing/types.d.ts.map +1 -1
- package/dist/src/room/data-track/packet/extensions.d.ts +1 -0
- package/dist/src/room/data-track/packet/extensions.d.ts.map +1 -1
- package/dist/src/room/data-track/packet/index.d.ts +1 -0
- package/dist/src/room/data-track/packet/index.d.ts.map +1 -1
- package/dist/src/room/data-track/packet/serializable.d.ts +1 -0
- package/dist/src/room/data-track/packet/serializable.d.ts.map +1 -1
- package/dist/src/room/participant/LocalParticipant.d.ts +3 -2
- package/dist/src/room/participant/LocalParticipant.d.ts.map +1 -1
- package/dist/src/room/participant/Participant.d.ts +1 -0
- package/dist/src/room/participant/Participant.d.ts.map +1 -1
- package/dist/src/room/participant/publishUtils.d.ts.map +1 -1
- package/dist/src/room/token-source/TokenSource.d.ts.map +1 -1
- package/dist/src/room/token-source/types.d.ts +1 -0
- package/dist/src/room/token-source/types.d.ts.map +1 -1
- package/dist/src/room/token-source/utils.d.ts.map +1 -1
- package/dist/src/room/track/FrameMetadataExtractor.d.ts +19 -0
- package/dist/src/room/track/FrameMetadataExtractor.d.ts.map +1 -0
- package/dist/src/room/track/RemoteVideoTrack.d.ts +7 -7
- package/dist/src/room/track/RemoteVideoTrack.d.ts.map +1 -1
- package/dist/src/room/track/Track.d.ts +1 -0
- package/dist/src/room/track/Track.d.ts.map +1 -1
- package/dist/src/room/track/options.d.ts +17 -5
- package/dist/src/room/track/options.d.ts.map +1 -1
- package/dist/src/room/track/record.d.ts.map +1 -1
- package/dist/src/room/utils.d.ts +1 -0
- package/dist/src/room/utils.d.ts.map +1 -1
- package/dist/src/type-polyfills/non-shared-typed-arrays.d.ts +2 -0
- package/dist/src/type-polyfills/non-shared-typed-arrays.d.ts.map +1 -0
- package/dist/src/utils/dataPacketBuffer.d.ts +1 -0
- package/dist/src/utils/dataPacketBuffer.d.ts.map +1 -1
- package/dist/ts4.2/e2ee/E2eeManager.d.ts +2 -1
- package/dist/ts4.2/e2ee/types.d.ts +6 -5
- package/dist/ts4.2/e2ee/utils.d.ts +1 -0
- package/dist/ts4.2/e2ee/worker/DataCryptor.d.ts +1 -0
- package/dist/ts4.2/e2ee/worker/FrameCryptor.d.ts +9 -8
- package/dist/ts4.2/e2ee/worker/naluUtils.d.ts +1 -0
- package/dist/ts4.2/e2ee/worker/sifPayload.d.ts +1 -0
- package/dist/ts4.2/{packetTrailer/PacketTrailerManager.d.ts → frameMetadata/FrameMetadataManager.d.ts} +8 -4
- package/dist/ts4.2/{packetTrailer/packetTrailer.d.ts → frameMetadata/frameMetadata.d.ts} +8 -7
- package/dist/ts4.2/{packetTrailer → frameMetadata}/types.d.ts +11 -6
- package/dist/ts4.2/frameMetadata/utils.d.ts +9 -0
- package/dist/ts4.2/frameMetadata/worker/frameMetadata.worker.d.ts +2 -0
- package/dist/ts4.2/index.d.ts +9 -3
- package/dist/ts4.2/options.d.ts +8 -4
- package/dist/ts4.2/room/PCTransport.d.ts +41 -1
- package/dist/ts4.2/room/PCTransportManager.d.ts +1 -0
- package/dist/ts4.2/room/RTCEngine.d.ts +4 -1
- package/dist/ts4.2/room/Room.d.ts +3 -2
- package/dist/ts4.2/room/data-track/frame.d.ts +1 -0
- package/dist/ts4.2/room/data-track/outgoing/types.d.ts +1 -0
- package/dist/ts4.2/room/data-track/packet/extensions.d.ts +1 -0
- package/dist/ts4.2/room/data-track/packet/index.d.ts +1 -0
- package/dist/ts4.2/room/data-track/packet/serializable.d.ts +1 -0
- package/dist/ts4.2/room/participant/LocalParticipant.d.ts +3 -2
- package/dist/ts4.2/room/participant/Participant.d.ts +1 -0
- package/dist/ts4.2/room/token-source/types.d.ts +1 -0
- package/dist/ts4.2/room/track/FrameMetadataExtractor.d.ts +19 -0
- package/dist/ts4.2/room/track/RemoteVideoTrack.d.ts +7 -7
- package/dist/ts4.2/room/track/Track.d.ts +1 -0
- package/dist/ts4.2/room/track/options.d.ts +17 -5
- package/dist/ts4.2/room/utils.d.ts +1 -0
- package/dist/ts4.2/type-polyfills/non-shared-typed-arrays.d.ts +2 -0
- package/dist/ts4.2/utils/dataPacketBuffer.d.ts +1 -0
- package/package.json +24 -19
- package/src/api/SignalClient.test.ts +4 -4
- package/src/api/SignalClient.ts +8 -3
- package/src/api/WebSocketStream.test.ts +7 -7
- package/src/e2ee/E2eeManager.ts +16 -12
- package/src/e2ee/types.ts +6 -5
- package/src/e2ee/utils.ts +1 -0
- package/src/e2ee/worker/DataCryptor.ts +1 -0
- package/src/e2ee/worker/FrameCryptor.test.ts +6 -5
- package/src/e2ee/worker/FrameCryptor.ts +28 -23
- package/src/e2ee/worker/ParticipantKeyHandler.test.ts +1 -0
- package/src/e2ee/worker/e2ee.worker.ts +6 -5
- package/src/e2ee/worker/naluUtils.ts +1 -0
- package/src/e2ee/worker/sifPayload.ts +1 -0
- package/src/e2ee/worker/tsconfig.json +4 -1
- package/src/{packetTrailer/PacketTrailerManager.test.ts → frameMetadata/FrameMetadataManager.test.ts} +10 -8
- package/src/{packetTrailer/PacketTrailerManager.ts → frameMetadata/FrameMetadataManager.ts} +21 -15
- package/src/{packetTrailer/packetTrailer.test.ts → frameMetadata/frameMetadata.test.ts} +84 -1
- package/src/{packetTrailer/packetTrailer.ts → frameMetadata/frameMetadata.ts} +17 -9
- package/src/{packetTrailer → frameMetadata}/types.ts +13 -6
- package/src/{packetTrailer → frameMetadata}/utils.test.ts +19 -19
- package/src/{packetTrailer → frameMetadata}/utils.ts +11 -11
- package/src/{packetTrailer/worker/packetTrailer.worker.ts → frameMetadata/worker/frameMetadata.worker.ts} +5 -5
- package/src/{packetTrailer → frameMetadata}/worker/tsconfig.json +4 -1
- package/src/index.ts +13 -2
- package/src/options.ts +9 -4
- package/src/room/PCTransport.test.ts +150 -0
- package/src/room/PCTransport.ts +117 -0
- package/src/room/PCTransportManager.ts +4 -0
- package/src/room/RTCEngine.test.ts +143 -9
- package/src/room/RTCEngine.ts +112 -31
- package/src/room/Room.ts +11 -10
- package/src/room/data-track/depacketizer.ts +1 -0
- package/src/room/data-track/frame.ts +1 -0
- package/src/room/data-track/outgoing/types.ts +1 -0
- package/src/room/data-track/packet/extensions.ts +1 -0
- package/src/room/data-track/packet/index.ts +1 -0
- package/src/room/data-track/packet/serializable.ts +1 -0
- package/src/room/participant/LocalParticipant.test.ts +19 -19
- package/src/room/participant/LocalParticipant.ts +22 -16
- package/src/room/participant/Participant.ts +1 -0
- package/src/room/participant/publishUtils.test.ts +6 -0
- package/src/room/participant/publishUtils.ts +4 -1
- package/src/room/rpc/client/RpcClientManager.ts +1 -1
- package/src/room/rpc/server/RpcServerManager.ts +1 -1
- package/src/room/token-source/TokenSource.ts +9 -23
- package/src/room/token-source/types.ts +1 -0
- package/src/room/token-source/utils.ts +1 -0
- package/src/room/track/{PacketTrailerExtractor.ts → FrameMetadataExtractor.ts} +8 -8
- package/src/room/track/RemoteVideoTrack.ts +7 -11
- package/src/room/track/Track.ts +1 -0
- package/src/room/track/options.ts +19 -5
- package/src/room/track/record.ts +1 -0
- package/src/room/utils.ts +1 -0
- package/src/type-polyfills/{non-shared-typed-arrays.d.ts → non-shared-typed-arrays.ts} +6 -1
- package/src/utils/dataPacketBuffer.ts +2 -0
- package/dist/livekit-client.pt.worker.js +0 -2
- package/dist/livekit-client.pt.worker.mjs.map +0 -1
- package/dist/src/packetTrailer/packetTrailer.d.ts.map +0 -1
- package/dist/src/packetTrailer/types.d.ts.map +0 -1
- package/dist/src/packetTrailer/utils.d.ts +0 -9
- package/dist/src/packetTrailer/worker/packetTrailer.worker.d.ts +0 -2
- package/dist/src/packetTrailer/worker/packetTrailer.worker.d.ts.map +0 -1
- package/dist/src/room/track/PacketTrailerExtractor.d.ts +0 -19
- package/dist/src/room/track/PacketTrailerExtractor.d.ts.map +0 -1
- package/dist/ts4.2/packetTrailer/utils.d.ts +0 -9
- package/dist/ts4.2/packetTrailer/worker/packetTrailer.worker.d.ts +0 -2
- package/dist/ts4.2/room/track/PacketTrailerExtractor.d.ts +0 -19
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
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
|
-
*
|
|
116
|
+
* Frame metadata to append to published video frames.
|
|
117
117
|
*
|
|
118
|
-
* Requires either room-level
|
|
119
|
-
* because encoded frame transforms are used to write the
|
|
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
|
-
|
|
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';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "livekit-client",
|
|
3
|
-
"version": "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/
|
|
21
|
-
"import": "./dist/livekit-client.
|
|
22
|
-
"require": "./dist/livekit-client.
|
|
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/
|
|
39
|
-
"./dist/ts4.2/
|
|
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.
|
|
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.
|
|
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.
|
|
62
|
-
"@babel/preset-env": "7.29.
|
|
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.
|
|
73
|
-
"@size-limit/file": "^
|
|
74
|
-
"@size-limit/webpack": "^
|
|
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": "^
|
|
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.
|
|
81
|
-
"@typescript-eslint/parser": "8.59.
|
|
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.
|
|
105
|
-
"vitest": "^
|
|
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.
|
|
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' });
|
package/src/api/SignalClient.ts
CHANGED
|
@@ -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 =
|
|
132
|
+
originalWebSocket = globalThis.WebSocket;
|
|
133
133
|
|
|
134
134
|
// Mock WebSocket globally
|
|
135
|
-
|
|
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
|
-
(
|
|
142
|
-
(
|
|
143
|
-
(
|
|
144
|
-
(
|
|
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
|
-
|
|
149
|
+
globalThis.WebSocket = originalWebSocket;
|
|
150
150
|
});
|
|
151
151
|
|
|
152
152
|
describe('Constructor and Initialization', () => {
|
package/src/e2ee/E2eeManager.ts
CHANGED
|
@@ -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.
|
|
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
|
|
247
|
+
private handleFrameMetadata(
|
|
246
248
|
trackId: string,
|
|
247
249
|
rtpTimestamp: number,
|
|
248
250
|
ssrc: number,
|
|
249
|
-
metadata:
|
|
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.
|
|
265
|
+
pub.track.frameMetadataExtractor
|
|
264
266
|
) {
|
|
265
|
-
pub.track.
|
|
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)
|
|
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
|
-
|
|
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:
|
|
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:
|
|
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?:
|
|
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:
|
|
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?:
|
|
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 '../../
|
|
3
|
-
import type {
|
|
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?:
|
|
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?:
|
|
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.
|
|
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 '../../
|
|
9
|
-
import type {
|
|
10
|
-
import {
|
|
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
|
|
92
|
+
private hasFrameMetadata: boolean = false;
|
|
92
93
|
|
|
93
|
-
private
|
|
94
|
+
private frameMetadataOpts?: FrameMetadataPublishOptions;
|
|
94
95
|
|
|
95
|
-
private
|
|
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
|
-
|
|
216
|
-
this.
|
|
216
|
+
setHasFrameMetadata(hasFrameMetadata: boolean) {
|
|
217
|
+
this.hasFrameMetadata = hasFrameMetadata;
|
|
217
218
|
}
|
|
218
219
|
|
|
219
|
-
|
|
220
|
-
this.
|
|
221
|
-
this.
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
498
|
-
if (!
|
|
498
|
+
private appendFrameMetadata(encodedFrame: RTCEncodedVideoFrame | RTCEncodedAudioFrame) {
|
|
499
|
+
if (!hasFrameMetadataPublishOptions(this.frameMetadataOpts) || !isVideoFrame(encodedFrame)) {
|
|
499
500
|
return;
|
|
500
501
|
}
|
|
501
502
|
|
|
502
|
-
if (this.
|
|
503
|
-
this.
|
|
504
|
-
this.
|
|
503
|
+
if (this.frameMetadataOpts?.frameId) {
|
|
504
|
+
this.frameMetadataFrameId =
|
|
505
|
+
this.frameMetadataFrameId === 0xffffffff ? 1 : this.frameMetadataFrameId + 1;
|
|
505
506
|
}
|
|
506
|
-
appendPacketTrailerToEncodedFrame(
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|