livekit-client 2.19.2 → 2.20.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.
- 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 +23 -23
- package/dist/livekit-client.e2ee.worker.mjs.map +1 -1
- package/dist/livekit-client.esm.mjs +179 -111
- 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} +4 -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 +1 -1
- package/dist/src/e2ee/E2eeManager.d.ts.map +1 -1
- package/dist/src/e2ee/types.d.ts +5 -5
- package/dist/src/e2ee/types.d.ts.map +1 -1
- package/dist/src/e2ee/worker/FrameCryptor.d.ts +8 -8
- package/dist/src/e2ee/worker/FrameCryptor.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} +7 -7
- package/dist/src/frameMetadata/frameMetadata.d.ts.map +1 -0
- package/dist/src/{packetTrailer → frameMetadata}/types.d.ts +10 -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 +1 -0
- 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 +3 -1
- package/dist/src/room/RTCEngine.d.ts.map +1 -1
- package/dist/src/room/Room.d.ts +2 -2
- package/dist/src/room/Room.d.ts.map +1 -1
- package/dist/src/room/participant/LocalParticipant.d.ts +2 -2
- package/dist/src/room/participant/LocalParticipant.d.ts.map +1 -1
- package/dist/src/room/participant/publishUtils.d.ts.map +1 -1
- package/dist/src/room/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/options.d.ts +17 -5
- package/dist/src/room/track/options.d.ts.map +1 -1
- package/dist/ts4.2/e2ee/E2eeManager.d.ts +1 -1
- package/dist/ts4.2/e2ee/types.d.ts +5 -5
- package/dist/ts4.2/e2ee/worker/FrameCryptor.d.ts +8 -8
- 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} +7 -7
- package/dist/ts4.2/{packetTrailer → frameMetadata}/types.d.ts +10 -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 +1 -0
- package/dist/ts4.2/room/PCTransportManager.d.ts +1 -0
- package/dist/ts4.2/room/RTCEngine.d.ts +3 -1
- package/dist/ts4.2/room/Room.d.ts +2 -2
- package/dist/ts4.2/room/participant/LocalParticipant.d.ts +2 -2
- 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/options.d.ts +17 -5
- package/package.json +23 -18
- package/src/api/SignalClient.test.ts +4 -4
- package/src/api/SignalClient.ts +7 -3
- package/src/api/WebSocketStream.test.ts +7 -7
- package/src/e2ee/E2eeManager.ts +13 -11
- package/src/e2ee/types.ts +5 -5
- package/src/e2ee/worker/FrameCryptor.test.ts +5 -5
- package/src/e2ee/worker/FrameCryptor.ts +27 -23
- package/src/e2ee/worker/e2ee.worker.ts +5 -5
- 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} +1 -1
- package/src/{packetTrailer/packetTrailer.ts → frameMetadata/frameMetadata.ts} +9 -9
- package/src/{packetTrailer → frameMetadata}/types.ts +12 -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.ts +4 -0
- package/src/room/PCTransportManager.ts +4 -0
- package/src/room/RTCEngine.test.ts +143 -9
- package/src/room/RTCEngine.ts +111 -31
- package/src/room/Room.ts +10 -10
- package/src/room/participant/LocalParticipant.test.ts +19 -19
- package/src/room/participant/LocalParticipant.ts +21 -16
- 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/options.ts +19 -5
- 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
|
@@ -2,13 +2,13 @@ import type { TrackInfo } from '@livekit/protocol';
|
|
|
2
2
|
import log from '../logger';
|
|
3
3
|
import type Room from '../room/Room';
|
|
4
4
|
import { RoomEvent } from '../room/events';
|
|
5
|
-
import {
|
|
5
|
+
import { FrameMetadataExtractor } from '../room/track/FrameMetadataExtractor';
|
|
6
6
|
import type RemoteTrack from '../room/track/RemoteTrack';
|
|
7
7
|
import RemoteVideoTrack from '../room/track/RemoteVideoTrack';
|
|
8
8
|
import type { PTDecodeMessage, PTUpdateTrackIdMessage, PTWorkerMessage } from './types';
|
|
9
|
-
import {
|
|
9
|
+
import { isFrameMetadataSupported, shouldUseFrameMetadataScriptTransform } from './utils';
|
|
10
10
|
|
|
11
|
-
export interface
|
|
11
|
+
export interface FrameMetadataOptions {
|
|
12
12
|
/**
|
|
13
13
|
* Dedicated worker for extracting packet trailers off the main thread.
|
|
14
14
|
*
|
|
@@ -34,12 +34,12 @@ export interface PacketTrailerOptions {
|
|
|
34
34
|
*
|
|
35
35
|
* @experimental
|
|
36
36
|
*/
|
|
37
|
-
export class
|
|
37
|
+
export class FrameMetadataManager {
|
|
38
38
|
private worker?: Worker;
|
|
39
39
|
|
|
40
40
|
private room?: Room;
|
|
41
41
|
|
|
42
|
-
private extractors = new Map<string,
|
|
42
|
+
private extractors = new Map<string, FrameMetadataExtractor>();
|
|
43
43
|
|
|
44
44
|
/**
|
|
45
45
|
* Tracks the trackId associated with each receiver that has had its
|
|
@@ -49,7 +49,7 @@ export class PacketTrailerManager {
|
|
|
49
49
|
*/
|
|
50
50
|
private workerPipelines = new Map<RTCRtpReceiver, string>();
|
|
51
51
|
|
|
52
|
-
constructor(options?:
|
|
52
|
+
constructor(options?: FrameMetadataOptions) {
|
|
53
53
|
this.worker = options?.worker;
|
|
54
54
|
}
|
|
55
55
|
|
|
@@ -100,18 +100,18 @@ export class PacketTrailerManager {
|
|
|
100
100
|
}
|
|
101
101
|
|
|
102
102
|
if (
|
|
103
|
-
!
|
|
103
|
+
!isFrameMetadataSupported(this.worker ? { worker: this.worker } : undefined) &&
|
|
104
104
|
!this.room?.hasE2EESetup
|
|
105
105
|
) {
|
|
106
|
-
log.warn('
|
|
106
|
+
log.warn('frame metadata transform not supported; skipping extraction');
|
|
107
107
|
return;
|
|
108
108
|
}
|
|
109
109
|
|
|
110
|
-
const extractor = new
|
|
110
|
+
const extractor = new FrameMetadataExtractor();
|
|
111
111
|
const trackId = track.mediaStreamID;
|
|
112
112
|
|
|
113
113
|
this.extractors.set(trackId, extractor);
|
|
114
|
-
track.
|
|
114
|
+
track.frameMetadataExtractor = extractor;
|
|
115
115
|
|
|
116
116
|
if (this.room?.hasE2EESetup) {
|
|
117
117
|
// E2EE worker strips the trailer and injects metadata directly into
|
|
@@ -123,7 +123,7 @@ export class PacketTrailerManager {
|
|
|
123
123
|
}
|
|
124
124
|
|
|
125
125
|
private setupPassthroughReceiver(receiver: RTCRtpReceiver, trackId: string) {
|
|
126
|
-
if (
|
|
126
|
+
if (shouldUseFrameMetadataScriptTransform()) {
|
|
127
127
|
if ('transform' in receiver) {
|
|
128
128
|
// @ts-ignore
|
|
129
129
|
receiver.transform = null;
|
|
@@ -133,7 +133,7 @@ export class PacketTrailerManager {
|
|
|
133
133
|
|
|
134
134
|
if (
|
|
135
135
|
this.worker &&
|
|
136
|
-
|
|
136
|
+
isFrameMetadataSupported({ worker: this.worker }) &&
|
|
137
137
|
!this.workerPipelines.has(receiver)
|
|
138
138
|
) {
|
|
139
139
|
this.setupWorkerReceiver(receiver, trackId, false);
|
|
@@ -155,7 +155,7 @@ export class PacketTrailerManager {
|
|
|
155
155
|
return;
|
|
156
156
|
}
|
|
157
157
|
|
|
158
|
-
if (
|
|
158
|
+
if (shouldUseFrameMetadataScriptTransform()) {
|
|
159
159
|
// @ts-ignore
|
|
160
160
|
receiver.transform = new RTCRtpScriptTransform(worker, {
|
|
161
161
|
kind: 'decode',
|
|
@@ -215,7 +215,7 @@ export class PacketTrailerManager {
|
|
|
215
215
|
}
|
|
216
216
|
|
|
217
217
|
if (track instanceof RemoteVideoTrack) {
|
|
218
|
-
track.
|
|
218
|
+
track.frameMetadataExtractor = undefined;
|
|
219
219
|
}
|
|
220
220
|
|
|
221
221
|
// The receiver pipeline is intentionally left running. If the receiver is
|
|
@@ -245,6 +245,12 @@ export class PacketTrailerManager {
|
|
|
245
245
|
};
|
|
246
246
|
|
|
247
247
|
private onWorkerError = (ev: ErrorEvent) => {
|
|
248
|
-
log.error('
|
|
248
|
+
log.error('frame metadata worker encountered an error:', { error: ev.error });
|
|
249
249
|
};
|
|
250
250
|
}
|
|
251
|
+
|
|
252
|
+
/** @deprecated Use {@link FrameMetadataManager} instead. */
|
|
253
|
+
export const PacketTrailerManager = FrameMetadataManager;
|
|
254
|
+
|
|
255
|
+
/** @deprecated Use {@link FrameMetadataOptions} instead. */
|
|
256
|
+
export type PacketTrailerOptions = FrameMetadataOptions;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import {
|
|
1
|
+
import type { FrameMetadata, FrameMetadataPublishOptions } from './types';
|
|
2
|
+
import { hasFrameMetadataPublishOptions } from './utils';
|
|
3
3
|
|
|
4
4
|
export const PACKET_TRAILER_MAGIC = Uint8Array.from([
|
|
5
5
|
'L'.charCodeAt(0),
|
|
@@ -17,7 +17,7 @@ const FRAME_ID_TLV_SIZE = 6;
|
|
|
17
17
|
|
|
18
18
|
export interface ExtractPacketTrailerResult {
|
|
19
19
|
data: Uint8Array;
|
|
20
|
-
metadata?:
|
|
20
|
+
metadata?: FrameMetadata;
|
|
21
21
|
}
|
|
22
22
|
|
|
23
23
|
export function appendPacketTrailer(
|
|
@@ -64,10 +64,10 @@ export function appendPacketTrailer(
|
|
|
64
64
|
|
|
65
65
|
export function appendPacketTrailerToEncodedFrame(
|
|
66
66
|
frame: RTCEncodedVideoFrame,
|
|
67
|
-
options:
|
|
67
|
+
options: FrameMetadataPublishOptions | undefined,
|
|
68
68
|
frameId: number,
|
|
69
69
|
): boolean {
|
|
70
|
-
if (!
|
|
70
|
+
if (!hasFrameMetadataPublishOptions(options) || frame.data.byteLength === 0) {
|
|
71
71
|
return false;
|
|
72
72
|
}
|
|
73
73
|
|
|
@@ -108,7 +108,7 @@ export function extractPacketTrailer(data: ArrayBuffer | Uint8Array): ExtractPac
|
|
|
108
108
|
const strippedData = bytes.subarray(0, trailerStart);
|
|
109
109
|
let offset = trailerStart;
|
|
110
110
|
let foundAny = false;
|
|
111
|
-
const metadata:
|
|
111
|
+
const metadata: FrameMetadata = {
|
|
112
112
|
userTimestamp: BigInt(0),
|
|
113
113
|
frameId: 0,
|
|
114
114
|
};
|
|
@@ -223,16 +223,16 @@ export function getFrameSsrc(frame: RTCEncodedVideoFrame | RTCEncodedAudioFrame)
|
|
|
223
223
|
return 0;
|
|
224
224
|
}
|
|
225
225
|
|
|
226
|
-
export interface
|
|
226
|
+
export interface FrameMetadataPayload {
|
|
227
227
|
trackId: string;
|
|
228
228
|
rtpTimestamp: number;
|
|
229
229
|
ssrc: number;
|
|
230
|
-
metadata:
|
|
230
|
+
metadata: FrameMetadata;
|
|
231
231
|
}
|
|
232
232
|
|
|
233
233
|
export interface ProcessPacketTrailerResult {
|
|
234
234
|
data?: ArrayBuffer;
|
|
235
|
-
payload?:
|
|
235
|
+
payload?: FrameMetadataPayload;
|
|
236
236
|
}
|
|
237
237
|
|
|
238
238
|
/**
|
|
@@ -1,15 +1,21 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { FrameMetadataPayload } from './frameMetadata';
|
|
2
2
|
|
|
3
|
-
export interface
|
|
3
|
+
export interface FrameMetadata {
|
|
4
4
|
userTimestamp: bigint;
|
|
5
5
|
frameId: number;
|
|
6
6
|
}
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
/** @deprecated Use {@link FrameMetadata} instead. */
|
|
9
|
+
export type PacketTrailerMetadata = FrameMetadata;
|
|
10
|
+
|
|
11
|
+
export interface FrameMetadataPublishOptions {
|
|
9
12
|
timestamp?: boolean;
|
|
10
13
|
frameId?: boolean;
|
|
11
14
|
}
|
|
12
15
|
|
|
16
|
+
/** @deprecated Use {@link FrameMetadataPublishOptions} instead. */
|
|
17
|
+
export type PacketTrailerPublishOptions = FrameMetadataPublishOptions;
|
|
18
|
+
|
|
13
19
|
export interface PTBaseMessage {
|
|
14
20
|
kind: string;
|
|
15
21
|
data?: unknown;
|
|
@@ -38,7 +44,7 @@ export interface PTEncodeMessage extends PTBaseMessage {
|
|
|
38
44
|
data: {
|
|
39
45
|
readableStream: ReadableStream;
|
|
40
46
|
writableStream: WritableStream;
|
|
41
|
-
packetTrailer?:
|
|
47
|
+
packetTrailer?: FrameMetadataPublishOptions;
|
|
42
48
|
};
|
|
43
49
|
}
|
|
44
50
|
|
|
@@ -49,12 +55,12 @@ export type PTScriptTransformOptions =
|
|
|
49
55
|
}
|
|
50
56
|
| {
|
|
51
57
|
kind: 'encode';
|
|
52
|
-
packetTrailer?:
|
|
58
|
+
packetTrailer?: FrameMetadataPublishOptions;
|
|
53
59
|
};
|
|
54
60
|
|
|
55
61
|
export interface PTMetadataMessage extends PTBaseMessage {
|
|
56
62
|
kind: 'metadata';
|
|
57
|
-
data:
|
|
63
|
+
data: FrameMetadataPayload;
|
|
58
64
|
}
|
|
59
65
|
|
|
60
66
|
export interface PTUpdateTrackIdMessage extends PTBaseMessage {
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { PacketTrailerFeature } from '@livekit/protocol';
|
|
2
2
|
import { afterEach, describe, expect, it } from 'vitest';
|
|
3
3
|
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
4
|
+
getFrameMetadataFeatures,
|
|
5
|
+
getFrameMetadataPublishOptions,
|
|
6
|
+
isFrameMetadataSupported,
|
|
7
7
|
} from './utils';
|
|
8
8
|
|
|
9
|
-
describe('
|
|
9
|
+
describe('frame metadata support', () => {
|
|
10
10
|
const originalRTCRtpSender = window.RTCRtpSender;
|
|
11
11
|
const originalRTCRtpScriptTransform = (window as unknown as { RTCRtpScriptTransform?: unknown })
|
|
12
12
|
.RTCRtpScriptTransform;
|
|
@@ -46,20 +46,20 @@ describe('packet trailer support', () => {
|
|
|
46
46
|
});
|
|
47
47
|
}
|
|
48
48
|
|
|
49
|
-
it('supports
|
|
49
|
+
it('supports frame metadata with RTCRtpScriptTransform on Safari', () => {
|
|
50
50
|
stubScriptTransformSupport(
|
|
51
51
|
'Mozilla/5.0 (Macintosh; Intel Mac OS X 14_0) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Safari/605.1.15',
|
|
52
52
|
);
|
|
53
53
|
|
|
54
|
-
expect(
|
|
54
|
+
expect(isFrameMetadataSupported({ worker: {} as Worker })).toBe(true);
|
|
55
55
|
});
|
|
56
56
|
|
|
57
|
-
it('supports
|
|
57
|
+
it('supports frame metadata with RTCRtpScriptTransform on Firefox', () => {
|
|
58
58
|
stubScriptTransformSupport(
|
|
59
59
|
'Mozilla/5.0 (Macintosh; Intel Mac OS X 14.0; rv:144.0) Gecko/20100101 Firefox/144.0',
|
|
60
60
|
);
|
|
61
61
|
|
|
62
|
-
expect(
|
|
62
|
+
expect(isFrameMetadataSupported({ worker: {} as Worker })).toBe(true);
|
|
63
63
|
});
|
|
64
64
|
|
|
65
65
|
it('does not use RTCRtpScriptTransform support on Chromium-based browsers', () => {
|
|
@@ -67,39 +67,39 @@ describe('packet trailer support', () => {
|
|
|
67
67
|
'Mozilla/5.0 (Macintosh; Intel Mac OS X 14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36',
|
|
68
68
|
);
|
|
69
69
|
|
|
70
|
-
expect(
|
|
70
|
+
expect(isFrameMetadataSupported({ worker: {} as Worker })).toBe(false);
|
|
71
71
|
});
|
|
72
72
|
});
|
|
73
73
|
|
|
74
|
-
describe('
|
|
74
|
+
describe('frame metadata publish features', () => {
|
|
75
75
|
it('maps publish options to protocol features', () => {
|
|
76
|
-
expect(
|
|
76
|
+
expect(getFrameMetadataFeatures({ timestamp: true, frameId: true })).toEqual([
|
|
77
77
|
PacketTrailerFeature.PTF_USER_TIMESTAMP,
|
|
78
78
|
PacketTrailerFeature.PTF_FRAME_ID,
|
|
79
79
|
]);
|
|
80
|
-
expect(
|
|
80
|
+
expect(getFrameMetadataFeatures({ timestamp: true })).toEqual([
|
|
81
81
|
PacketTrailerFeature.PTF_USER_TIMESTAMP,
|
|
82
82
|
]);
|
|
83
|
-
expect(
|
|
83
|
+
expect(getFrameMetadataFeatures({ frameId: true })).toEqual([
|
|
84
84
|
PacketTrailerFeature.PTF_FRAME_ID,
|
|
85
85
|
]);
|
|
86
|
-
expect(
|
|
86
|
+
expect(getFrameMetadataFeatures()).toEqual([]);
|
|
87
87
|
});
|
|
88
88
|
|
|
89
89
|
it('maps protocol features to publish options', () => {
|
|
90
90
|
expect(
|
|
91
|
-
|
|
91
|
+
getFrameMetadataPublishOptions([
|
|
92
92
|
PacketTrailerFeature.PTF_USER_TIMESTAMP,
|
|
93
93
|
PacketTrailerFeature.PTF_FRAME_ID,
|
|
94
94
|
]),
|
|
95
95
|
).toEqual({ timestamp: true, frameId: true });
|
|
96
|
-
expect(
|
|
96
|
+
expect(getFrameMetadataPublishOptions([PacketTrailerFeature.PTF_USER_TIMESTAMP])).toEqual({
|
|
97
97
|
timestamp: true,
|
|
98
98
|
});
|
|
99
|
-
expect(
|
|
99
|
+
expect(getFrameMetadataPublishOptions([PacketTrailerFeature.PTF_FRAME_ID])).toEqual({
|
|
100
100
|
frameId: true,
|
|
101
101
|
});
|
|
102
|
-
expect(
|
|
103
|
-
expect(
|
|
102
|
+
expect(getFrameMetadataPublishOptions()).toBeUndefined();
|
|
103
|
+
expect(getFrameMetadataPublishOptions([])).toBeUndefined();
|
|
104
104
|
});
|
|
105
105
|
});
|
|
@@ -1,25 +1,25 @@
|
|
|
1
1
|
import { PacketTrailerFeature } from '@livekit/protocol';
|
|
2
2
|
import { isInsertableStreamSupported } from '../e2ee/utils';
|
|
3
3
|
import { isScriptTransformSupportedForWorker } from '../room/utils';
|
|
4
|
-
import type {
|
|
5
|
-
import type {
|
|
4
|
+
import type { FrameMetadataOptions } from './FrameMetadataManager';
|
|
5
|
+
import type { FrameMetadataPublishOptions } from './types';
|
|
6
6
|
|
|
7
|
-
export function
|
|
7
|
+
export function shouldUseFrameMetadataScriptTransform() {
|
|
8
8
|
return isScriptTransformSupportedForWorker();
|
|
9
9
|
}
|
|
10
10
|
|
|
11
|
-
export function
|
|
11
|
+
export function isFrameMetadataSupported(options?: FrameMetadataOptions) {
|
|
12
12
|
return (
|
|
13
|
-
!!options?.worker && (isInsertableStreamSupported() ||
|
|
13
|
+
!!options?.worker && (isInsertableStreamSupported() || shouldUseFrameMetadataScriptTransform())
|
|
14
14
|
);
|
|
15
15
|
}
|
|
16
16
|
|
|
17
|
-
export function
|
|
17
|
+
export function hasFrameMetadataPublishOptions(options?: FrameMetadataPublishOptions): boolean {
|
|
18
18
|
return !!(options?.timestamp || options?.frameId);
|
|
19
19
|
}
|
|
20
20
|
|
|
21
|
-
export function
|
|
22
|
-
options?:
|
|
21
|
+
export function getFrameMetadataFeatures(
|
|
22
|
+
options?: FrameMetadataPublishOptions,
|
|
23
23
|
): PacketTrailerFeature[] {
|
|
24
24
|
const features: PacketTrailerFeature[] = [];
|
|
25
25
|
if (options?.timestamp) {
|
|
@@ -31,14 +31,14 @@ export function getPacketTrailerFeatures(
|
|
|
31
31
|
return features;
|
|
32
32
|
}
|
|
33
33
|
|
|
34
|
-
export function
|
|
34
|
+
export function getFrameMetadataPublishOptions(
|
|
35
35
|
features?: PacketTrailerFeature[],
|
|
36
|
-
):
|
|
36
|
+
): FrameMetadataPublishOptions | undefined {
|
|
37
37
|
if (!features || features.length === 0) {
|
|
38
38
|
return undefined;
|
|
39
39
|
}
|
|
40
40
|
|
|
41
|
-
const options:
|
|
41
|
+
const options: FrameMetadataPublishOptions = {};
|
|
42
42
|
if (features.includes(PacketTrailerFeature.PTF_USER_TIMESTAMP)) {
|
|
43
43
|
options.timestamp = true;
|
|
44
44
|
}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { appendPacketTrailerToEncodedFrame, processPacketTrailer } from '../
|
|
1
|
+
import { appendPacketTrailerToEncodedFrame, processPacketTrailer } from '../frameMetadata';
|
|
2
2
|
import type {
|
|
3
|
+
FrameMetadataPublishOptions,
|
|
3
4
|
PTMetadataMessage,
|
|
4
5
|
PTScriptTransformOptions,
|
|
5
6
|
PTWorkerMessage,
|
|
6
|
-
PacketTrailerPublishOptions,
|
|
7
7
|
} from '../types';
|
|
8
|
-
import {
|
|
8
|
+
import { hasFrameMetadataPublishOptions } from '../utils';
|
|
9
9
|
|
|
10
10
|
/**
|
|
11
11
|
* Holds the trackId currently associated with a pipeline. A mutable
|
|
@@ -97,9 +97,9 @@ function setupDecodeTransform(
|
|
|
97
97
|
function setupEncodeTransform(
|
|
98
98
|
readable: ReadableStream,
|
|
99
99
|
writable: WritableStream,
|
|
100
|
-
packetTrailer?:
|
|
100
|
+
packetTrailer?: FrameMetadataPublishOptions,
|
|
101
101
|
) {
|
|
102
|
-
if (!
|
|
102
|
+
if (!hasFrameMetadataPublishOptions(packetTrailer)) {
|
|
103
103
|
readable.pipeTo(writable).catch(() => {});
|
|
104
104
|
return;
|
|
105
105
|
}
|
package/src/index.ts
CHANGED
|
@@ -64,11 +64,22 @@ import {
|
|
|
64
64
|
import { getBrowser } from './utils/browserParser';
|
|
65
65
|
|
|
66
66
|
export { RpcError, type RpcInvocationData, type PerformRpcParams } from './room/rpc';
|
|
67
|
-
export type {
|
|
67
|
+
export type {
|
|
68
|
+
FrameMetadata,
|
|
69
|
+
FrameMetadataPublishOptions,
|
|
70
|
+
/** @deprecated Use {@link FrameMetadata} instead. */
|
|
71
|
+
PacketTrailerMetadata,
|
|
72
|
+
/** @deprecated Use {@link FrameMetadataPublishOptions} instead. */
|
|
73
|
+
PacketTrailerPublishOptions,
|
|
74
|
+
} from './frameMetadata/types';
|
|
68
75
|
export {
|
|
76
|
+
FrameMetadataManager,
|
|
77
|
+
/** @deprecated Use {@link FrameMetadataManager} instead. */
|
|
69
78
|
PacketTrailerManager,
|
|
79
|
+
type FrameMetadataOptions,
|
|
80
|
+
/** @deprecated Use {@link FrameMetadataOptions} instead. */
|
|
70
81
|
type PacketTrailerOptions,
|
|
71
|
-
} from './
|
|
82
|
+
} from './frameMetadata/FrameMetadataManager';
|
|
72
83
|
|
|
73
84
|
export * from './connectionHelper/ConnectionCheck';
|
|
74
85
|
export * from './connectionHelper/checks/Checker';
|
package/src/options.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { E2EEOptions } from './e2ee/types';
|
|
2
|
-
import type {
|
|
2
|
+
import type { FrameMetadataOptions } from './frameMetadata/FrameMetadataManager';
|
|
3
3
|
import type { ReconnectPolicy } from './room/ReconnectPolicy';
|
|
4
4
|
import type {
|
|
5
5
|
AudioCaptureOptions,
|
|
@@ -103,10 +103,15 @@ export interface InternalRoomOptions {
|
|
|
103
103
|
|
|
104
104
|
/**
|
|
105
105
|
* @experimental
|
|
106
|
-
* Options for enabling
|
|
107
|
-
*
|
|
106
|
+
* Options for enabling frame metadata on video tracks.
|
|
107
|
+
* Frame metadata carries frame-level information such as user timestamps and frame IDs.
|
|
108
108
|
*/
|
|
109
|
-
|
|
109
|
+
frameMetadata?: FrameMetadataOptions;
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* @deprecated Use {@link InternalRoomOptions.frameMetadata} instead.
|
|
113
|
+
*/
|
|
114
|
+
packetTrailer?: FrameMetadataOptions;
|
|
110
115
|
|
|
111
116
|
/**
|
|
112
117
|
* will attempt to connect via single peer connection mode.
|
package/src/room/PCTransport.ts
CHANGED
|
@@ -498,6 +498,10 @@ export default class PCTransport extends (EventEmitter as new () => TypedEmitter
|
|
|
498
498
|
return this.pc.getStats();
|
|
499
499
|
}
|
|
500
500
|
|
|
501
|
+
getMaxMessageSize() {
|
|
502
|
+
return this._pc?.sctp?.maxMessageSize;
|
|
503
|
+
}
|
|
504
|
+
|
|
501
505
|
async getConnectedAddress(): Promise<string | undefined> {
|
|
502
506
|
if (!this._pc) {
|
|
503
507
|
return;
|
|
@@ -310,6 +310,10 @@ export class PCTransportManager {
|
|
|
310
310
|
return matchingTransceiver?.mid;
|
|
311
311
|
}
|
|
312
312
|
|
|
313
|
+
getMaxPublisherMessageSize() {
|
|
314
|
+
return this.publisher.getMaxMessageSize();
|
|
315
|
+
}
|
|
316
|
+
|
|
313
317
|
addPublisherTrack(track: MediaStreamTrack) {
|
|
314
318
|
return this.publisher.addTrack(track);
|
|
315
319
|
}
|