livekit-client 2.18.0 → 2.18.2
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 +8 -7
- package/dist/livekit-client.e2ee.worker.mjs.map +1 -1
- package/dist/livekit-client.esm.mjs +8026 -5883
- package/dist/livekit-client.esm.mjs.map +1 -1
- package/dist/livekit-client.umd.js +1 -1
- package/dist/livekit-client.umd.js.map +1 -1
- package/dist/src/api/SignalClient.d.ts +12 -4
- package/dist/src/api/SignalClient.d.ts.map +1 -1
- package/dist/src/connectionHelper/ConnectionCheck.d.ts +1 -1
- package/dist/src/connectionHelper/ConnectionCheck.d.ts.map +1 -1
- package/dist/src/e2ee/constants.d.ts.map +1 -1
- package/dist/src/e2ee/types.d.ts +6 -0
- package/dist/src/e2ee/types.d.ts.map +1 -1
- package/dist/src/e2ee/utils.d.ts +2 -1
- package/dist/src/e2ee/utils.d.ts.map +1 -1
- package/dist/src/e2ee/worker/DataCryptor.d.ts.map +1 -1
- package/dist/src/e2ee/worker/FrameCryptor.d.ts.map +1 -1
- package/dist/src/index.d.ts +6 -4
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/room/PCTransport.d.ts +5 -0
- package/dist/src/room/PCTransport.d.ts.map +1 -1
- package/dist/src/room/PCTransportManager.d.ts +1 -1
- package/dist/src/room/PCTransportManager.d.ts.map +1 -1
- package/dist/src/room/RTCEngine.d.ts +28 -11
- package/dist/src/room/RTCEngine.d.ts.map +1 -1
- package/dist/src/room/Room.d.ts +14 -3
- package/dist/src/room/Room.d.ts.map +1 -1
- package/dist/src/room/data-stream/incoming/IncomingDataStreamManager.d.ts +5 -1
- package/dist/src/room/data-stream/incoming/IncomingDataStreamManager.d.ts.map +1 -1
- package/dist/src/room/data-stream/outgoing/OutgoingDataStreamManager.d.ts.map +1 -1
- package/dist/src/room/data-track/LocalDataTrack.d.ts +28 -5
- package/dist/src/room/data-track/LocalDataTrack.d.ts.map +1 -1
- package/dist/src/room/data-track/RemoteDataTrack.d.ts +5 -5
- package/dist/src/room/data-track/RemoteDataTrack.d.ts.map +1 -1
- package/dist/src/room/data-track/depacketizer.d.ts +4 -4
- package/dist/src/room/data-track/depacketizer.d.ts.map +1 -1
- package/dist/src/room/data-track/frame.d.ts +14 -0
- package/dist/src/room/data-track/frame.d.ts.map +1 -1
- package/dist/src/room/data-track/incoming/IncomingDataTrackManager.d.ts +19 -11
- package/dist/src/room/data-track/incoming/IncomingDataTrackManager.d.ts.map +1 -1
- package/dist/src/room/data-track/incoming/pipeline.d.ts +6 -5
- package/dist/src/room/data-track/incoming/pipeline.d.ts.map +1 -1
- package/dist/src/room/data-track/outgoing/OutgoingDataTrackManager.d.ts +57 -23
- package/dist/src/room/data-track/outgoing/OutgoingDataTrackManager.d.ts.map +1 -1
- package/dist/src/room/data-track/outgoing/errors.d.ts +16 -6
- package/dist/src/room/data-track/outgoing/errors.d.ts.map +1 -1
- package/dist/src/room/data-track/outgoing/pipeline.d.ts +7 -6
- package/dist/src/room/data-track/outgoing/pipeline.d.ts.map +1 -1
- package/dist/src/room/data-track/outgoing/types.d.ts +14 -4
- package/dist/src/room/data-track/outgoing/types.d.ts.map +1 -1
- package/dist/src/room/data-track/packet/extensions.d.ts.map +1 -1
- package/dist/src/room/data-track/packetizer.d.ts +4 -4
- package/dist/src/room/data-track/packetizer.d.ts.map +1 -1
- package/dist/src/room/data-track/track-interfaces.d.ts +1 -1
- package/dist/src/room/data-track/track-interfaces.d.ts.map +1 -1
- package/dist/src/room/data-track/types.d.ts +6 -1
- package/dist/src/room/data-track/types.d.ts.map +1 -1
- package/dist/src/room/events.d.ts +24 -3
- package/dist/src/room/events.d.ts.map +1 -1
- package/dist/src/room/participant/LocalParticipant.d.ts +12 -1
- package/dist/src/room/participant/LocalParticipant.d.ts.map +1 -1
- package/dist/src/room/participant/RemoteParticipant.d.ts +13 -0
- package/dist/src/room/participant/RemoteParticipant.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/utils/deferrable-map.d.ts +32 -0
- package/dist/src/utils/deferrable-map.d.ts.map +1 -0
- package/dist/src/utils/serializer.d.ts +48 -0
- package/dist/src/utils/serializer.d.ts.map +1 -0
- package/dist/ts4.2/api/SignalClient.d.ts +12 -4
- package/dist/ts4.2/connectionHelper/ConnectionCheck.d.ts +2 -1
- package/dist/ts4.2/e2ee/types.d.ts +6 -0
- package/dist/ts4.2/e2ee/utils.d.ts +2 -1
- package/dist/ts4.2/index.d.ts +7 -4
- package/dist/ts4.2/room/PCTransport.d.ts +5 -0
- package/dist/ts4.2/room/PCTransportManager.d.ts +1 -1
- package/dist/ts4.2/room/RTCEngine.d.ts +28 -11
- package/dist/ts4.2/room/Room.d.ts +14 -3
- package/dist/ts4.2/room/data-stream/incoming/IncomingDataStreamManager.d.ts +5 -1
- package/dist/ts4.2/room/data-track/LocalDataTrack.d.ts +27 -4
- package/dist/ts4.2/room/data-track/RemoteDataTrack.d.ts +4 -4
- package/dist/ts4.2/room/data-track/depacketizer.d.ts +4 -4
- package/dist/ts4.2/room/data-track/frame.d.ts +14 -0
- package/dist/ts4.2/room/data-track/incoming/IncomingDataTrackManager.d.ts +21 -10
- package/dist/ts4.2/room/data-track/incoming/pipeline.d.ts +6 -5
- package/dist/ts4.2/room/data-track/outgoing/OutgoingDataTrackManager.d.ts +57 -23
- package/dist/ts4.2/room/data-track/outgoing/errors.d.ts +16 -6
- package/dist/ts4.2/room/data-track/outgoing/pipeline.d.ts +7 -6
- package/dist/ts4.2/room/data-track/outgoing/types.d.ts +14 -4
- package/dist/ts4.2/room/data-track/packetizer.d.ts +4 -4
- package/dist/ts4.2/room/data-track/track-interfaces.d.ts +1 -1
- package/dist/ts4.2/room/data-track/types.d.ts +6 -1
- package/dist/ts4.2/room/events.d.ts +24 -3
- package/dist/ts4.2/room/participant/LocalParticipant.d.ts +12 -1
- package/dist/ts4.2/room/participant/RemoteParticipant.d.ts +13 -0
- package/dist/ts4.2/room/utils.d.ts +1 -0
- package/dist/ts4.2/utils/deferrable-map.d.ts +32 -0
- package/dist/ts4.2/utils/serializer.d.ts +48 -0
- package/package.json +1 -1
- package/src/api/SignalClient.test.ts +9 -4
- package/src/api/SignalClient.ts +116 -9
- package/src/connectionHelper/ConnectionCheck.ts +1 -1
- package/src/e2ee/constants.ts +1 -0
- package/src/e2ee/types.ts +6 -0
- package/src/e2ee/utils.ts +4 -3
- package/src/e2ee/worker/DataCryptor.ts +1 -4
- package/src/e2ee/worker/FrameCryptor.ts +1 -4
- package/src/e2ee/worker/ParticipantKeyHandler.ts +1 -1
- package/src/index.ts +13 -4
- package/src/room/PCTransport.ts +41 -1
- package/src/room/PCTransportManager.ts +1 -1
- package/src/room/RTCEngine.ts +312 -125
- package/src/room/Room.ts +168 -35
- package/src/room/data-stream/incoming/IncomingDataStreamManager.ts +26 -2
- package/src/room/data-stream/outgoing/OutgoingDataStreamManager.ts +7 -7
- package/src/room/data-track/LocalDataTrack.ts +83 -10
- package/src/room/data-track/RemoteDataTrack.ts +7 -9
- package/src/room/data-track/depacketizer.ts +21 -12
- package/src/room/data-track/frame.ts +28 -2
- package/src/room/data-track/incoming/IncomingDataTrackManager.test.ts +58 -73
- package/src/room/data-track/incoming/IncomingDataTrackManager.ts +139 -80
- package/src/room/data-track/incoming/pipeline.ts +29 -24
- package/src/room/data-track/outgoing/OutgoingDataTrackManager.test.ts +225 -32
- package/src/room/data-track/outgoing/OutgoingDataTrackManager.ts +150 -75
- package/src/room/data-track/outgoing/errors.ts +36 -7
- package/src/room/data-track/outgoing/pipeline.ts +23 -17
- package/src/room/data-track/outgoing/types.ts +12 -3
- package/src/room/data-track/packet/extensions.ts +17 -22
- package/src/room/data-track/packet/index.test.ts +22 -33
- package/src/room/data-track/packetizer.test.ts +2 -2
- package/src/room/data-track/packetizer.ts +4 -4
- package/src/room/data-track/track-interfaces.ts +1 -1
- package/src/room/data-track/types.ts +21 -1
- package/src/room/events.ts +26 -1
- package/src/room/participant/LocalParticipant.ts +74 -8
- package/src/room/participant/RemoteParticipant.ts +25 -0
- package/src/room/utils.ts +4 -0
- package/src/utils/deferrable-map.ts +109 -0
- package/src/utils/serializer.ts +72 -0
- package/dist/src/room/data-track/e2ee.d.ts +0 -12
- package/dist/src/room/data-track/e2ee.d.ts.map +0 -1
- package/dist/ts4.2/room/data-track/e2ee.d.ts +0 -12
- package/src/room/data-track/e2ee.ts +0 -15
package/src/e2ee/utils.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { type DataPacket, EncryptedPacketPayload } from '@livekit/protocol';
|
|
2
2
|
import { ENCRYPTION_ALGORITHM } from './constants';
|
|
3
|
+
import type { KeyProviderOptions } from './types';
|
|
3
4
|
|
|
4
5
|
export function isE2EESupported() {
|
|
5
6
|
return isInsertableStreamSupported() || isScriptTransformSupported();
|
|
@@ -92,8 +93,8 @@ function getAlgoOptions(algorithmName: string, salt: string) {
|
|
|
92
93
|
* Derives a set of keys from the master key.
|
|
93
94
|
* See https://tools.ietf.org/html/draft-omara-sframe-00#section-4.3.1
|
|
94
95
|
*/
|
|
95
|
-
export async function deriveKeys(material: CryptoKey,
|
|
96
|
-
const algorithmOptions = getAlgoOptions(material.algorithm.name,
|
|
96
|
+
export async function deriveKeys(material: CryptoKey, options: KeyProviderOptions) {
|
|
97
|
+
const algorithmOptions = getAlgoOptions(material.algorithm.name, options.ratchetSalt);
|
|
97
98
|
|
|
98
99
|
// https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/deriveKey#HKDF
|
|
99
100
|
// https://developer.mozilla.org/en-US/docs/Web/API/HkdfParams
|
|
@@ -102,7 +103,7 @@ export async function deriveKeys(material: CryptoKey, salt: string) {
|
|
|
102
103
|
material,
|
|
103
104
|
{
|
|
104
105
|
name: ENCRYPTION_ALGORITHM,
|
|
105
|
-
length:
|
|
106
|
+
length: options.keySize,
|
|
106
107
|
},
|
|
107
108
|
false,
|
|
108
109
|
['encrypt', 'decrypt'],
|
|
@@ -93,10 +93,7 @@ export class DataCryptor {
|
|
|
93
93
|
// if not, it might be that a different frame has already ratcheted and we try with that one first
|
|
94
94
|
ratchetResult = await keys.ratchetKey(keyIndex, false);
|
|
95
95
|
|
|
96
|
-
ratchetedKeySet = await deriveKeys(
|
|
97
|
-
ratchetResult.cryptoKey,
|
|
98
|
-
keys.keyProviderOptions.ratchetSalt,
|
|
99
|
-
);
|
|
96
|
+
ratchetedKeySet = await deriveKeys(ratchetResult.cryptoKey, keys.keyProviderOptions);
|
|
100
97
|
}
|
|
101
98
|
|
|
102
99
|
const decryptedData = await DataCryptor.decrypt(
|
|
@@ -603,10 +603,7 @@ export class FrameCryptor extends BaseFrameCryptor {
|
|
|
603
603
|
// if not, it might be that a different frame has already ratcheted and we try with that one first
|
|
604
604
|
ratchetResult = await this.keys.ratchetKey(keyIndex, false);
|
|
605
605
|
|
|
606
|
-
ratchetedKeySet = await deriveKeys(
|
|
607
|
-
ratchetResult.cryptoKey,
|
|
608
|
-
this.keyProviderOptions.ratchetSalt,
|
|
609
|
-
);
|
|
606
|
+
ratchetedKeySet = await deriveKeys(ratchetResult.cryptoKey, this.keyProviderOptions);
|
|
610
607
|
}
|
|
611
608
|
|
|
612
609
|
const frame = await this.decryptFrame(encodedFrame, keyIndex, initialMaterial || keySet, {
|
|
@@ -173,7 +173,7 @@ export class ParticipantKeyHandler extends (EventEmitter as new () => TypedEvent
|
|
|
173
173
|
ratchetedResult: RatchetResult | null = null,
|
|
174
174
|
updateCurrentKeyIndex = true,
|
|
175
175
|
) {
|
|
176
|
-
const keySet = await deriveKeys(material, this.keyProviderOptions
|
|
176
|
+
const keySet = await deriveKeys(material, this.keyProviderOptions);
|
|
177
177
|
const newIndex = keyIndex >= 0 ? keyIndex % this.cryptoKeyRing.length : this.currentKeyIndex;
|
|
178
178
|
workerLogger.debug(`setting new key with index ${keyIndex}`, {
|
|
179
179
|
usage: material.usages,
|
package/src/index.ts
CHANGED
|
@@ -11,10 +11,8 @@ import DefaultReconnectPolicy from './room/DefaultReconnectPolicy';
|
|
|
11
11
|
import type { ReconnectContext, ReconnectPolicy } from './room/ReconnectPolicy';
|
|
12
12
|
import Room, { ConnectionState, type RoomEventCallbacks } from './room/Room';
|
|
13
13
|
import * as attributes from './room/attribute-typings';
|
|
14
|
-
|
|
15
|
-
import './room/data-track/
|
|
16
|
-
// FIXME: remove this import in a follow up data track pull request.
|
|
17
|
-
import './room/data-track/outgoing/OutgoingDataTrackManager';
|
|
14
|
+
import LocalDataTrack from './room/data-track/LocalDataTrack';
|
|
15
|
+
import RemoteDataTrack, { type DataTrackSubscribeOptions } from './room/data-track/RemoteDataTrack';
|
|
18
16
|
import LocalParticipant from './room/participant/LocalParticipant';
|
|
19
17
|
import Participant, {
|
|
20
18
|
ConnectionQuality,
|
|
@@ -142,6 +140,8 @@ export {
|
|
|
142
140
|
isVideoTrack,
|
|
143
141
|
isLocalParticipant,
|
|
144
142
|
isRemoteParticipant,
|
|
143
|
+
LocalDataTrack,
|
|
144
|
+
RemoteDataTrack,
|
|
145
145
|
};
|
|
146
146
|
export type {
|
|
147
147
|
AudioAnalyserOptions,
|
|
@@ -158,6 +158,7 @@ export type {
|
|
|
158
158
|
RoomEventCallbacks,
|
|
159
159
|
ParticipantEventCallbacks,
|
|
160
160
|
PublicationEventCallbacks,
|
|
161
|
+
DataTrackSubscribeOptions,
|
|
161
162
|
};
|
|
162
163
|
export { DataTrackPacket, type DataTrackPacketHeader } from './room/data-track/packet';
|
|
163
164
|
export {
|
|
@@ -165,5 +166,13 @@ export {
|
|
|
165
166
|
type DataTrackUserTimestampExtension,
|
|
166
167
|
type DataTrackE2eeExtension,
|
|
167
168
|
} from './room/data-track/packet/extensions';
|
|
169
|
+
export { type DataChannelKind } from './room/RTCEngine';
|
|
168
170
|
|
|
169
171
|
export { LocalTrackRecorder } from './room/track/record';
|
|
172
|
+
export {
|
|
173
|
+
type Serializer,
|
|
174
|
+
isSerializer,
|
|
175
|
+
type SerializerInput,
|
|
176
|
+
type SerializerOutput,
|
|
177
|
+
serializers,
|
|
178
|
+
} from './utils/serializer';
|
package/src/room/PCTransport.ts
CHANGED
|
@@ -55,6 +55,8 @@ export default class PCTransport extends EventEmitter {
|
|
|
55
55
|
|
|
56
56
|
private offerLock: Mutex;
|
|
57
57
|
|
|
58
|
+
private pendingInitialOffer?: RTCSessionDescriptionInit;
|
|
59
|
+
|
|
58
60
|
pendingCandidates: RTCIceCandidateInit[] = [];
|
|
59
61
|
|
|
60
62
|
restartingIce: boolean = false;
|
|
@@ -163,6 +165,16 @@ export default class PCTransport extends EventEmitter {
|
|
|
163
165
|
this.remoteStereoMids = stereoMids;
|
|
164
166
|
this.remoteNackMids = nackMids;
|
|
165
167
|
} else if (sd.type === 'answer') {
|
|
168
|
+
if (this.pendingInitialOffer) {
|
|
169
|
+
const initialOffer = this.pendingInitialOffer;
|
|
170
|
+
this.pendingInitialOffer = undefined;
|
|
171
|
+
const sdpParsed = parse(initialOffer.sdp ?? '');
|
|
172
|
+
sdpParsed.media.forEach((media) => {
|
|
173
|
+
ensureIPAddrMatchVersion(media);
|
|
174
|
+
});
|
|
175
|
+
this.log.debug('setting pending initial offer before processing answer', this.logContext);
|
|
176
|
+
await this.setMungedSDP(initialOffer, write(sdpParsed));
|
|
177
|
+
}
|
|
166
178
|
const sdpParsed = parse(sd.sdp ?? '');
|
|
167
179
|
sdpParsed.media.forEach((media) => {
|
|
168
180
|
const mid = getMidString(media.mid!);
|
|
@@ -255,6 +267,31 @@ export default class PCTransport extends EventEmitter {
|
|
|
255
267
|
}
|
|
256
268
|
}, debounceInterval);
|
|
257
269
|
|
|
270
|
+
async createInitialOffer() {
|
|
271
|
+
const unlock = await this.offerLock.lock();
|
|
272
|
+
try {
|
|
273
|
+
if (this.pc.signalingState !== 'stable') {
|
|
274
|
+
this.log.warn(
|
|
275
|
+
'signaling state is not stable, cannot create initial offer',
|
|
276
|
+
this.logContext,
|
|
277
|
+
);
|
|
278
|
+
return;
|
|
279
|
+
}
|
|
280
|
+
const offerId = this.latestOfferId + 1;
|
|
281
|
+
this.latestOfferId = offerId;
|
|
282
|
+
const offer = await this.pc.createOffer();
|
|
283
|
+
this.pendingInitialOffer = { sdp: offer.sdp, type: offer.type };
|
|
284
|
+
const sdpParsed = parse(offer.sdp ?? '');
|
|
285
|
+
sdpParsed.media.forEach((media) => {
|
|
286
|
+
ensureIPAddrMatchVersion(media);
|
|
287
|
+
});
|
|
288
|
+
offer.sdp = write(sdpParsed);
|
|
289
|
+
return { offer, offerId };
|
|
290
|
+
} finally {
|
|
291
|
+
unlock();
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
|
|
258
295
|
async createAndSendOffer(options?: RTCOfferOptions) {
|
|
259
296
|
const unlock = await this.offerLock.lock();
|
|
260
297
|
|
|
@@ -268,7 +305,10 @@ export default class PCTransport extends EventEmitter {
|
|
|
268
305
|
this.restartingIce = true;
|
|
269
306
|
}
|
|
270
307
|
|
|
271
|
-
if (
|
|
308
|
+
if (
|
|
309
|
+
this._pc &&
|
|
310
|
+
(this._pc.signalingState === 'have-local-offer' || this.pendingInitialOffer)
|
|
311
|
+
) {
|
|
272
312
|
// we're waiting for the peer to accept our offer, so we'll just wait
|
|
273
313
|
// the only exception to this is when ICE restart is needed
|
|
274
314
|
const currentSD = this._pc.remoteDescription;
|
|
@@ -72,7 +72,7 @@ export class PCTransportManager {
|
|
|
72
72
|
return this._mode;
|
|
73
73
|
}
|
|
74
74
|
|
|
75
|
-
constructor(
|
|
75
|
+
constructor(mode: PCMode, loggerOptions: LoggerOptions, rtcConfig?: RTCConfiguration) {
|
|
76
76
|
this.log = getLogger(loggerOptions.loggerName ?? LoggerNames.PCManager);
|
|
77
77
|
this.loggerOptions = loggerOptions;
|
|
78
78
|
|