livekit-client 2.0.7 → 2.0.9
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 +33 -9
- package/dist/livekit-client.e2ee.worker.mjs.map +1 -1
- package/dist/livekit-client.esm.mjs +70 -41
- 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/e2ee/constants.d.ts +0 -1
- package/dist/src/e2ee/constants.d.ts.map +1 -1
- package/dist/src/e2ee/types.d.ts +1 -0
- package/dist/src/e2ee/types.d.ts.map +1 -1
- package/dist/src/e2ee/worker/FrameCryptor.d.ts.map +1 -1
- package/dist/src/e2ee/worker/ParticipantKeyHandler.d.ts.map +1 -1
- package/dist/src/index.d.ts +7 -6
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/room/PCTransport.d.ts.map +1 -1
- package/dist/src/room/RTCEngine.d.ts.map +1 -1
- 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/track/LocalTrack.d.ts.map +1 -1
- package/dist/ts4.2/src/e2ee/constants.d.ts +0 -1
- package/dist/ts4.2/src/e2ee/types.d.ts +1 -0
- package/dist/ts4.2/src/index.d.ts +7 -6
- package/package.json +1 -1
- package/src/e2ee/constants.ts +1 -5
- package/src/e2ee/types.ts +1 -0
- package/src/e2ee/worker/FrameCryptor.ts +12 -0
- package/src/e2ee/worker/ParticipantKeyHandler.ts +4 -2
- package/src/e2ee/worker/e2ee.worker.ts +24 -3
- package/src/index.ts +32 -29
- package/src/room/PCTransport.ts +6 -18
- package/src/room/RTCEngine.ts +4 -3
- package/src/room/participant/LocalParticipant.ts +21 -6
- package/src/room/participant/publishUtils.ts +38 -11
- package/src/room/track/LocalTrack.ts +11 -9
@@ -12538,7 +12538,8 @@ const KEY_PROVIDER_DEFAULTS = {
|
|
12538
12538
|
sharedKey: false,
|
12539
12539
|
ratchetSalt: SALT,
|
12540
12540
|
ratchetWindowSize: 8,
|
12541
|
-
failureTolerance: DECRYPTION_FAILURE_TOLERANCE
|
12541
|
+
failureTolerance: DECRYPTION_FAILURE_TOLERANCE,
|
12542
|
+
keyringSize: 16
|
12542
12543
|
};
|
12543
12544
|
|
12544
12545
|
var KeyProviderEvent;
|
@@ -13473,7 +13474,7 @@ function getMatch(exp, ua) {
|
|
13473
13474
|
return match && match.length >= id && match[id] || '';
|
13474
13475
|
}
|
13475
13476
|
|
13476
|
-
var version$1 = "2.0.
|
13477
|
+
var version$1 = "2.0.9";
|
13477
13478
|
|
13478
13479
|
const version = version$1;
|
13479
13480
|
const protocolVersion = 12;
|
@@ -15037,6 +15038,13 @@ class LocalTrack extends Track {
|
|
15037
15038
|
const unlock = yield this.processorLock.lock();
|
15038
15039
|
try {
|
15039
15040
|
this.log.debug('setting up processor', this.logContext);
|
15041
|
+
const processorOptions = {
|
15042
|
+
kind: this.kind,
|
15043
|
+
track: this._mediaStreamTrack,
|
15044
|
+
element: this.processorElement,
|
15045
|
+
audioContext: this.audioContext
|
15046
|
+
};
|
15047
|
+
yield processor.init(processorOptions);
|
15040
15048
|
if (this.processor) {
|
15041
15049
|
yield this.stopProcessor();
|
15042
15050
|
}
|
@@ -15049,13 +15057,6 @@ class LocalTrack extends Track {
|
|
15049
15057
|
this.processorElement.play().catch(error => this.log.error('failed to play processor element', Object.assign(Object.assign({}, this.logContext), {
|
15050
15058
|
error
|
15051
15059
|
})));
|
15052
|
-
const processorOptions = {
|
15053
|
-
kind: this.kind,
|
15054
|
-
track: this._mediaStreamTrack,
|
15055
|
-
element: this.processorElement,
|
15056
|
-
audioContext: this.audioContext
|
15057
|
-
};
|
15058
|
-
yield processor.init(processorOptions);
|
15059
15060
|
this.processor = processor;
|
15060
15061
|
if (this.processor.processedTrack) {
|
15061
15062
|
for (const el of this.attachedElements) {
|
@@ -15092,7 +15093,10 @@ class LocalTrack extends Track {
|
|
15092
15093
|
this.processor = undefined;
|
15093
15094
|
(_b = this.processorElement) === null || _b === void 0 ? void 0 : _b.remove();
|
15094
15095
|
this.processorElement = undefined;
|
15095
|
-
|
15096
|
+
// apply original track constraints in case the processor changed them
|
15097
|
+
yield this._mediaStreamTrack.applyConstraints(this._constraints);
|
15098
|
+
// force re-setting of the mediaStreamTrack on the sender
|
15099
|
+
yield this.setMediaStreamTrack(this._mediaStreamTrack, true);
|
15096
15100
|
this.emit(TrackEvent.TrackProcessorUpdate);
|
15097
15101
|
});
|
15098
15102
|
}
|
@@ -17032,25 +17036,18 @@ class PCTransport extends eventsExports.EventEmitter {
|
|
17032
17036
|
if (codecPayload === 0) {
|
17033
17037
|
return true;
|
17034
17038
|
}
|
17035
|
-
|
17039
|
+
const startBitrate = Math.round(trackbr.maxbr * startBitrateForSVC);
|
17036
17040
|
for (const fmtp of media.fmtp) {
|
17037
17041
|
if (fmtp.payload === codecPayload) {
|
17042
|
+
// if another track's fmtp already is set, we cannot override the bitrate
|
17043
|
+
// this has the unfortunate consequence of being forced to use the
|
17044
|
+
// initial track's bitrate for all tracks
|
17038
17045
|
if (!fmtp.config.includes('x-google-start-bitrate')) {
|
17039
|
-
fmtp.config += ";x-google-start-bitrate=".concat(
|
17046
|
+
fmtp.config += ";x-google-start-bitrate=".concat(startBitrate);
|
17040
17047
|
}
|
17041
|
-
if (!fmtp.config.includes('x-google-max-bitrate')) {
|
17042
|
-
fmtp.config += ";x-google-max-bitrate=".concat(trackbr.maxbr);
|
17043
|
-
}
|
17044
|
-
fmtpFound = true;
|
17045
17048
|
break;
|
17046
17049
|
}
|
17047
17050
|
}
|
17048
|
-
if (!fmtpFound) {
|
17049
|
-
media.fmtp.push({
|
17050
|
-
payload: codecPayload,
|
17051
|
-
config: "x-google-start-bitrate=".concat(Math.round(trackbr.maxbr * startBitrateForSVC), ";x-google-max-bitrate=").concat(trackbr.maxbr)
|
17052
|
-
});
|
17053
|
-
}
|
17054
17051
|
return true;
|
17055
17052
|
});
|
17056
17053
|
}
|
@@ -18179,12 +18176,13 @@ class RTCEngine extends eventsExports.EventEmitter {
|
|
18179
18176
|
this.reliableDC.onbufferedamountlow = this.handleBufferedAmountLow;
|
18180
18177
|
}
|
18181
18178
|
setPreferredCodec(transceiver, kind, videoCodec) {
|
18182
|
-
if (!('getCapabilities' in
|
18179
|
+
if (!('getCapabilities' in RTCRtpReceiver)) {
|
18183
18180
|
return;
|
18184
18181
|
}
|
18185
|
-
|
18182
|
+
// when setting codec preferences, the capabilites need to be read from the RTCRtpReceiver
|
18183
|
+
const cap = RTCRtpReceiver.getCapabilities(kind);
|
18186
18184
|
if (!cap) return;
|
18187
|
-
this.log.debug('get
|
18185
|
+
this.log.debug('get receiver capabilities', Object.assign(Object.assign({}, this.logContext), {
|
18188
18186
|
cap
|
18189
18187
|
}));
|
18190
18188
|
const matched = [];
|
@@ -19086,23 +19084,40 @@ function computeVideoEncodings(isScreenShare, width, height, options) {
|
|
19086
19084
|
}
|
19087
19085
|
const original = new VideoPreset(width, height, videoEncoding.maxBitrate, videoEncoding.maxFramerate, videoEncoding.priority);
|
19088
19086
|
if (scalabilityMode && isSVCCodec(videoCodec)) {
|
19089
|
-
livekitLogger.debug("using svc with scalabilityMode ".concat(scalabilityMode));
|
19090
19087
|
const sm = new ScalabilityMode(scalabilityMode);
|
19091
19088
|
const encodings = [];
|
19092
19089
|
if (sm.spatial > 3) {
|
19093
19090
|
throw new Error("unsupported scalabilityMode: ".concat(scalabilityMode));
|
19094
19091
|
}
|
19095
|
-
|
19092
|
+
// Before M113 in Chrome, defining multiple encodings with an SVC codec indicated
|
19093
|
+
// that SVC mode should be used. Safari still works this way.
|
19094
|
+
// This is a bit confusing but is due to how libwebrtc interpreted the encodings field
|
19095
|
+
// before M113.
|
19096
|
+
// Announced here: https://groups.google.com/g/discuss-webrtc/c/-QQ3pxrl-fw?pli=1
|
19097
|
+
const browser = getBrowser();
|
19098
|
+
if (isSafari() || (browser === null || browser === void 0 ? void 0 : browser.name) === 'Chrome' && compareVersions(browser === null || browser === void 0 ? void 0 : browser.version, '113') < 0) {
|
19099
|
+
for (let i = 0; i < sm.spatial; i += 1) {
|
19100
|
+
// in legacy SVC, scaleResolutionDownBy cannot be set
|
19101
|
+
encodings.push({
|
19102
|
+
rid: videoRids[2 - i],
|
19103
|
+
maxBitrate: videoEncoding.maxBitrate / Math.pow(3, i),
|
19104
|
+
maxFramerate: original.encoding.maxFramerate
|
19105
|
+
});
|
19106
|
+
}
|
19107
|
+
// legacy SVC, scalabilityMode is set only on the first encoding
|
19108
|
+
/* @ts-ignore */
|
19109
|
+
encodings[0].scalabilityMode = scalabilityMode;
|
19110
|
+
} else {
|
19096
19111
|
encodings.push({
|
19097
|
-
|
19098
|
-
|
19112
|
+
maxBitrate: videoEncoding.maxBitrate,
|
19113
|
+
maxFramerate: original.encoding.maxFramerate,
|
19099
19114
|
/* @ts-ignore */
|
19100
|
-
|
19115
|
+
scalabilityMode: scalabilityMode
|
19101
19116
|
});
|
19102
19117
|
}
|
19103
|
-
|
19104
|
-
|
19105
|
-
|
19118
|
+
livekitLogger.debug("using svc encoding", {
|
19119
|
+
encodings
|
19120
|
+
});
|
19106
19121
|
return encodings;
|
19107
19122
|
}
|
19108
19123
|
if (!useSimulcast) {
|
@@ -19126,7 +19141,7 @@ function computeVideoEncodings(isScreenShare, width, height, options) {
|
|
19126
19141
|
// to disable when CPU constrained.
|
19127
19142
|
// So encodings should be ordered in increasing spatial
|
19128
19143
|
// resolution order.
|
19129
|
-
// 2.
|
19144
|
+
// 2. livekit-server translates rids into layers. So, all encodings
|
19130
19145
|
// should have the base layer `q` and then more added
|
19131
19146
|
// based on other conditions.
|
19132
19147
|
const size = Math.max(width, height);
|
@@ -21521,8 +21536,10 @@ class LocalParticipant extends Participant {
|
|
21521
21536
|
// for svc codecs, disable simulcast and use vp8 for backup codec
|
21522
21537
|
if (track instanceof LocalVideoTrack) {
|
21523
21538
|
if (isSVCCodec(videoCodec)) {
|
21524
|
-
|
21525
|
-
|
21539
|
+
if (track.source === Track.Source.ScreenShare) {
|
21540
|
+
// vp9 svc with screenshare cannot encode multiple spatial layers
|
21541
|
+
// doing so reduces publish resolution to minimal resolution
|
21542
|
+
opts.scalabilityMode = 'L1T3';
|
21526
21543
|
// Chrome does not allow more than 5 fps with L1T3, and it has encoding bugs with L3T3
|
21527
21544
|
// It has a different path for screenshare handling and it seems to be untested/buggy
|
21528
21545
|
// As a workaround, we are setting contentHint to force it to go through the same
|
@@ -21530,9 +21547,7 @@ class LocalParticipant extends Participant {
|
|
21530
21547
|
// that we need
|
21531
21548
|
if ('contentHint' in track.mediaStreamTrack) {
|
21532
21549
|
track.mediaStreamTrack.contentHint = 'motion';
|
21533
|
-
this.log.info('forcing contentHint to motion for screenshare with
|
21534
|
-
} else {
|
21535
|
-
opts.scalabilityMode = 'L1T3';
|
21550
|
+
this.log.info('forcing contentHint to motion for screenshare with SVC codecs', Object.assign(Object.assign({}, this.logContext), getLogContextFromTrack(track)));
|
21536
21551
|
}
|
21537
21552
|
}
|
21538
21553
|
// set scalabilityMode to 'L3T3_KEY' by default
|
@@ -21632,7 +21647,8 @@ class LocalParticipant extends Participant {
|
|
21632
21647
|
maxbr: ((_l = encodings[0]) === null || _l === void 0 ? void 0 : _l.maxBitrate) ? encodings[0].maxBitrate / 1000 : 0
|
21633
21648
|
});
|
21634
21649
|
}
|
21635
|
-
} else if (track.codec &&
|
21650
|
+
} else if (track.codec && track.codec == 'av1' && ((_m = encodings[0]) === null || _m === void 0 ? void 0 : _m.maxBitrate)) {
|
21651
|
+
// AV1 requires setting x-start-bitrate in SDP
|
21636
21652
|
this.engine.pcManager.publisher.setTrackCodecBitrate({
|
21637
21653
|
cid: req.cid,
|
21638
21654
|
codec: track.codec,
|
@@ -21640,6 +21656,19 @@ class LocalParticipant extends Participant {
|
|
21640
21656
|
});
|
21641
21657
|
}
|
21642
21658
|
}
|
21659
|
+
if (track.kind === Track.Kind.Video && track.source === Track.Source.ScreenShare) {
|
21660
|
+
// a few of reasons we are forcing this setting without allowing overrides:
|
21661
|
+
// 1. without this, Chrome seems to aggressively resize the SVC video stating `quality-limitation: bandwidth` even when BW isn't an issue
|
21662
|
+
// 2. since we are overriding contentHint to motion (to workaround L1T3 publishing), it overrides the default degradationPreference to `balanced`
|
21663
|
+
try {
|
21664
|
+
this.log.debug("setting degradationPreference to maintain-resolution");
|
21665
|
+
const params = track.sender.getParameters();
|
21666
|
+
params.degradationPreference = 'maintain-resolution';
|
21667
|
+
yield track.sender.setParameters(params);
|
21668
|
+
} catch (e) {
|
21669
|
+
this.log.warn("failed to set degradationPreference: ".concat(e));
|
21670
|
+
}
|
21671
|
+
}
|
21643
21672
|
yield this.engine.negotiate();
|
21644
21673
|
if (track instanceof LocalVideoTrack) {
|
21645
21674
|
track.startMonitor(this.engine.client);
|
@@ -24612,5 +24641,5 @@ function isFacingModeValue(item) {
|
|
24612
24641
|
return item === undefined || allowedValues.includes(item);
|
24613
24642
|
}
|
24614
24643
|
|
24615
|
-
export { AudioPresets, BaseKeyProvider, ConnectionCheck, ConnectionError, ConnectionQuality, ConnectionState, CriticalTimers, CryptorEvent, DataPacket_Kind, DefaultReconnectPolicy, DeviceUnsupportedError, DisconnectReason, EncryptionEvent, EngineEvent, ExternalE2EEKeyProvider, KeyHandlerEvent, KeyProviderEvent, LivekitError, LocalAudioTrack, LocalParticipant, LocalTrack, LocalTrackPublication, LocalVideoTrack, LogLevel, LoggerNames, MediaDeviceFailure, NegotiationError, Participant, ParticipantEvent, PublishDataError, RemoteAudioTrack, RemoteParticipant, RemoteTrack, RemoteTrackPublication, RemoteVideoTrack, Room, RoomEvent, ScreenSharePresets, Track, TrackEvent, TrackInvalidError, TrackPublication, UnexpectedConnectionState, UnsupportedServer, VideoPreset, VideoPresets, VideoPresets43, VideoQuality, attachToElement, createAudioAnalyser, createE2EEKey, createKeyMaterialFromBuffer, createKeyMaterialFromString, createLocalAudioTrack, createLocalScreenTracks, createLocalTracks, createLocalVideoTrack, deriveKeys, detachTrack, facingModeFromDeviceLabel, facingModeFromLocalTrack, getEmptyAudioStreamTrack, getEmptyVideoStreamTrack, getLogger, importKey, isBackupCodec, isBrowserSupported, isE2EESupported, isInsertableStreamSupported, isScriptTransformSupported, isVideoFrame, needsRbspUnescaping, parseRbsp, protocolVersion, ratchet, setLogExtension, setLogLevel, supportsAV1, supportsAdaptiveStream, supportsDynacast, supportsVP9, version, videoCodecs, writeRbsp };
|
24644
|
+
export { AudioPresets, BaseKeyProvider, ConnectionCheck, ConnectionError, ConnectionQuality, ConnectionState, CriticalTimers, CryptorEvent, DataPacket_Kind, DefaultReconnectPolicy, DeviceUnsupportedError, DisconnectReason, EncryptionEvent, EngineEvent, ExternalE2EEKeyProvider, KeyHandlerEvent, KeyProviderEvent, LivekitError, LocalAudioTrack, LocalParticipant, LocalTrack, LocalTrackPublication, LocalVideoTrack, LogLevel, LoggerNames, MediaDeviceFailure, NegotiationError, Participant, ParticipantEvent, PublishDataError, RemoteAudioTrack, RemoteParticipant, RemoteTrack, RemoteTrackPublication, RemoteVideoTrack, Room, RoomEvent, ScreenSharePresets, SubscriptionError, Track, TrackEvent, TrackInvalidError, TrackPublication, UnexpectedConnectionState, UnsupportedServer, VideoPreset, VideoPresets, VideoPresets43, VideoQuality, attachToElement, createAudioAnalyser, createE2EEKey, createKeyMaterialFromBuffer, createKeyMaterialFromString, createLocalAudioTrack, createLocalScreenTracks, createLocalTracks, createLocalVideoTrack, deriveKeys, detachTrack, facingModeFromDeviceLabel, facingModeFromLocalTrack, getBrowser, getEmptyAudioStreamTrack, getEmptyVideoStreamTrack, getLogger, importKey, isBackupCodec, isBrowserSupported, isE2EESupported, isInsertableStreamSupported, isScriptTransformSupported, isVideoFrame, needsRbspUnescaping, parseRbsp, protocolVersion, ratchet, setLogExtension, setLogLevel, supportsAV1, supportsAdaptiveStream, supportsDynacast, supportsVP9, version, videoCodecs, writeRbsp };
|
24616
24645
|
//# sourceMappingURL=livekit-client.esm.mjs.map
|