livekit-client 1.10.0 → 1.11.0
Sign up to get free protection for your applications and to get access to all the features.
- package/dist/livekit-client.esm.mjs +457 -478
- 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/connectionHelper/ConnectionCheck.d.ts +2 -3
- package/dist/src/connectionHelper/ConnectionCheck.d.ts.map +1 -1
- package/dist/src/connectionHelper/checks/Checker.d.ts +2 -3
- package/dist/src/connectionHelper/checks/Checker.d.ts.map +1 -1
- package/dist/src/room/PCTransport.d.ts +1 -1
- package/dist/src/room/PCTransport.d.ts.map +1 -1
- package/dist/src/room/RTCEngine.d.ts +2 -4
- package/dist/src/room/RTCEngine.d.ts.map +1 -1
- package/dist/src/room/Room.d.ts +3 -4
- package/dist/src/room/Room.d.ts.map +1 -1
- package/dist/src/room/participant/LocalParticipant.d.ts.map +1 -1
- package/dist/src/room/participant/Participant.d.ts +2 -4
- package/dist/src/room/participant/Participant.d.ts.map +1 -1
- package/dist/src/room/participant/RemoteParticipant.d.ts +2 -1
- package/dist/src/room/participant/RemoteParticipant.d.ts.map +1 -1
- package/dist/src/room/participant/publishUtils.d.ts.map +1 -1
- package/dist/src/room/track/LocalTrack.d.ts +1 -0
- package/dist/src/room/track/LocalTrack.d.ts.map +1 -1
- package/dist/src/room/track/LocalVideoTrack.d.ts +1 -1
- package/dist/src/room/track/LocalVideoTrack.d.ts.map +1 -1
- package/dist/src/room/track/RemoteVideoTrack.d.ts +1 -0
- package/dist/src/room/track/RemoteVideoTrack.d.ts.map +1 -1
- package/dist/src/room/track/Track.d.ts +2 -4
- package/dist/src/room/track/Track.d.ts.map +1 -1
- package/dist/src/room/track/TrackPublication.d.ts +2 -4
- package/dist/src/room/track/TrackPublication.d.ts.map +1 -1
- package/dist/src/room/track/options.d.ts +13 -4
- package/dist/src/room/track/options.d.ts.map +1 -1
- package/dist/src/room/track/types.d.ts +2 -1
- package/dist/src/room/track/types.d.ts.map +1 -1
- package/dist/src/room/utils.d.ts.map +1 -1
- package/dist/ts4.2/src/connectionHelper/ConnectionCheck.d.ts +2 -3
- package/dist/ts4.2/src/connectionHelper/checks/Checker.d.ts +2 -3
- package/dist/ts4.2/src/room/PCTransport.d.ts +1 -1
- package/dist/ts4.2/src/room/RTCEngine.d.ts +2 -4
- package/dist/ts4.2/src/room/Room.d.ts +3 -4
- package/dist/ts4.2/src/room/participant/Participant.d.ts +2 -4
- package/dist/ts4.2/src/room/participant/RemoteParticipant.d.ts +2 -1
- package/dist/ts4.2/src/room/track/LocalTrack.d.ts +1 -0
- package/dist/ts4.2/src/room/track/LocalVideoTrack.d.ts +1 -1
- package/dist/ts4.2/src/room/track/RemoteVideoTrack.d.ts +1 -0
- package/dist/ts4.2/src/room/track/Track.d.ts +2 -4
- package/dist/ts4.2/src/room/track/TrackPublication.d.ts +2 -4
- package/dist/ts4.2/src/room/track/options.d.ts +13 -4
- package/dist/ts4.2/src/room/track/types.d.ts +2 -1
- package/package.json +2 -3
- package/src/connectionHelper/ConnectionCheck.ts +2 -3
- package/src/connectionHelper/checks/Checker.ts +2 -3
- package/src/logger.ts +4 -4
- package/src/room/PCTransport.ts +1 -1
- package/src/room/RTCEngine.ts +4 -4
- package/src/room/Room.ts +41 -11
- package/src/room/participant/LocalParticipant.ts +11 -3
- package/src/room/participant/Participant.ts +2 -4
- package/src/room/participant/RemoteParticipant.ts +4 -3
- package/src/room/participant/publishUtils.ts +16 -18
- package/src/room/track/LocalTrack.ts +61 -42
- package/src/room/track/LocalVideoTrack.ts +9 -7
- package/src/room/track/RemoteVideoTrack.ts +23 -6
- package/src/room/track/Track.ts +2 -4
- package/src/room/track/TrackPublication.ts +2 -4
- package/src/room/track/options.ts +13 -4
- package/src/room/track/types.ts +2 -1
- package/src/room/utils.ts +6 -3
@@ -296,7 +296,7 @@ var LogLevel;
|
|
296
296
|
LogLevel[LogLevel["silent"] = 5] = "silent";
|
297
297
|
})(LogLevel || (LogLevel = {}));
|
298
298
|
const livekitLogger = loglevelExports.getLogger('livekit');
|
299
|
-
livekitLogger.
|
299
|
+
livekitLogger.setDefaultLevel(LogLevel.info);
|
300
300
|
function setLogLevel(level) {
|
301
301
|
livekitLogger.setLevel(level);
|
302
302
|
}
|
@@ -306,9 +306,9 @@ function setLogLevel(level) {
|
|
306
306
|
*/
|
307
307
|
function setLogExtension(extension) {
|
308
308
|
const originalFactory = livekitLogger.methodFactory;
|
309
|
-
livekitLogger.methodFactory = (methodName,
|
310
|
-
const rawMethod = originalFactory(methodName,
|
311
|
-
const
|
309
|
+
livekitLogger.methodFactory = (methodName, configLevel, loggerName) => {
|
310
|
+
const rawMethod = originalFactory(methodName, configLevel, loggerName);
|
311
|
+
const logLevel = LogLevel[methodName];
|
312
312
|
const needLog = logLevel >= configLevel && logLevel < LogLevel.silent;
|
313
313
|
return (msg, context) => {
|
314
314
|
if (context) rawMethod(msg, context);else rawMethod(msg);
|
@@ -6654,386 +6654,322 @@ function __asyncValues(o) {
|
|
6654
6654
|
function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
|
6655
6655
|
}
|
6656
6656
|
|
6657
|
-
var
|
6657
|
+
var eventemitter3 = {exports: {}};
|
6658
6658
|
|
6659
|
-
|
6660
|
-
var ReflectApply = R && typeof R.apply === 'function' ? R.apply : function ReflectApply(target, receiver, args) {
|
6661
|
-
return Function.prototype.apply.call(target, receiver, args);
|
6662
|
-
};
|
6663
|
-
var ReflectOwnKeys;
|
6664
|
-
if (R && typeof R.ownKeys === 'function') {
|
6665
|
-
ReflectOwnKeys = R.ownKeys;
|
6666
|
-
} else if (Object.getOwnPropertySymbols) {
|
6667
|
-
ReflectOwnKeys = function ReflectOwnKeys(target) {
|
6668
|
-
return Object.getOwnPropertyNames(target).concat(Object.getOwnPropertySymbols(target));
|
6669
|
-
};
|
6670
|
-
} else {
|
6671
|
-
ReflectOwnKeys = function ReflectOwnKeys(target) {
|
6672
|
-
return Object.getOwnPropertyNames(target);
|
6673
|
-
};
|
6674
|
-
}
|
6675
|
-
function ProcessEmitWarning(warning) {
|
6676
|
-
if (console && console.warn) console.warn(warning);
|
6677
|
-
}
|
6678
|
-
var NumberIsNaN = Number.isNaN || function NumberIsNaN(value) {
|
6679
|
-
return value !== value;
|
6680
|
-
};
|
6681
|
-
function EventEmitter() {
|
6682
|
-
EventEmitter.init.call(this);
|
6683
|
-
}
|
6684
|
-
events.exports = EventEmitter;
|
6685
|
-
events.exports.once = once;
|
6659
|
+
(function (module) {
|
6686
6660
|
|
6687
|
-
|
6688
|
-
|
6689
|
-
EventEmitter.prototype._events = undefined;
|
6690
|
-
EventEmitter.prototype._eventsCount = 0;
|
6691
|
-
EventEmitter.prototype._maxListeners = undefined;
|
6661
|
+
var has = Object.prototype.hasOwnProperty,
|
6662
|
+
prefix = '~';
|
6692
6663
|
|
6693
|
-
|
6694
|
-
|
6695
|
-
|
6696
|
-
|
6697
|
-
|
6698
|
-
|
6699
|
-
|
6700
|
-
}
|
6701
|
-
Object.defineProperty(EventEmitter, 'defaultMaxListeners', {
|
6702
|
-
enumerable: true,
|
6703
|
-
get: function () {
|
6704
|
-
return defaultMaxListeners;
|
6705
|
-
},
|
6706
|
-
set: function (arg) {
|
6707
|
-
if (typeof arg !== 'number' || arg < 0 || NumberIsNaN(arg)) {
|
6708
|
-
throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received ' + arg + '.');
|
6709
|
-
}
|
6710
|
-
defaultMaxListeners = arg;
|
6711
|
-
}
|
6712
|
-
});
|
6713
|
-
EventEmitter.init = function () {
|
6714
|
-
if (this._events === undefined || this._events === Object.getPrototypeOf(this)._events) {
|
6715
|
-
this._events = Object.create(null);
|
6716
|
-
this._eventsCount = 0;
|
6717
|
-
}
|
6718
|
-
this._maxListeners = this._maxListeners || undefined;
|
6719
|
-
};
|
6664
|
+
/**
|
6665
|
+
* Constructor to create a storage for our `EE` objects.
|
6666
|
+
* An `Events` instance is a plain object whose properties are event names.
|
6667
|
+
*
|
6668
|
+
* @constructor
|
6669
|
+
* @private
|
6670
|
+
*/
|
6671
|
+
function Events() {}
|
6720
6672
|
|
6721
|
-
//
|
6722
|
-
//
|
6723
|
-
|
6724
|
-
|
6725
|
-
|
6673
|
+
//
|
6674
|
+
// We try to not inherit from `Object.prototype`. In some engines creating an
|
6675
|
+
// instance in this way is faster than calling `Object.create(null)` directly.
|
6676
|
+
// If `Object.create(null)` is not supported we prefix the event names with a
|
6677
|
+
// character to make sure that the built-in object properties are not
|
6678
|
+
// overridden or used as an attack vector.
|
6679
|
+
//
|
6680
|
+
if (Object.create) {
|
6681
|
+
Events.prototype = Object.create(null);
|
6682
|
+
|
6683
|
+
//
|
6684
|
+
// This hack is needed because the `__proto__` property is still inherited in
|
6685
|
+
// some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5.
|
6686
|
+
//
|
6687
|
+
if (!new Events().__proto__) prefix = false;
|
6726
6688
|
}
|
6727
|
-
|
6728
|
-
|
6729
|
-
|
6730
|
-
|
6731
|
-
|
6732
|
-
|
6733
|
-
}
|
6734
|
-
|
6735
|
-
|
6736
|
-
|
6737
|
-
|
6738
|
-
|
6739
|
-
|
6740
|
-
|
6741
|
-
var events = this._events;
|
6742
|
-
if (events !== undefined) doError = doError && events.error === undefined;else if (!doError) return false;
|
6743
|
-
|
6744
|
-
// If there is no 'error' event listener then throw.
|
6745
|
-
if (doError) {
|
6746
|
-
var er;
|
6747
|
-
if (args.length > 0) er = args[0];
|
6748
|
-
if (er instanceof Error) {
|
6749
|
-
// Note: The comments on the `throw` lines are intentional, they show
|
6750
|
-
// up in Node's output if this results in an unhandled exception.
|
6751
|
-
throw er; // Unhandled 'error' event
|
6752
|
-
}
|
6753
|
-
// At least give some kind of context to the user
|
6754
|
-
var err = new Error('Unhandled error.' + (er ? ' (' + er.message + ')' : ''));
|
6755
|
-
err.context = er;
|
6756
|
-
throw err; // Unhandled 'error' event
|
6757
|
-
}
|
6758
|
-
|
6759
|
-
var handler = events[type];
|
6760
|
-
if (handler === undefined) return false;
|
6761
|
-
if (typeof handler === 'function') {
|
6762
|
-
ReflectApply(handler, this, args);
|
6763
|
-
} else {
|
6764
|
-
var len = handler.length;
|
6765
|
-
var listeners = arrayClone(handler, len);
|
6766
|
-
for (var i = 0; i < len; ++i) ReflectApply(listeners[i], this, args);
|
6689
|
+
|
6690
|
+
/**
|
6691
|
+
* Representation of a single event listener.
|
6692
|
+
*
|
6693
|
+
* @param {Function} fn The listener function.
|
6694
|
+
* @param {*} context The context to invoke the listener with.
|
6695
|
+
* @param {Boolean} [once=false] Specify if the listener is a one-time listener.
|
6696
|
+
* @constructor
|
6697
|
+
* @private
|
6698
|
+
*/
|
6699
|
+
function EE(fn, context, once) {
|
6700
|
+
this.fn = fn;
|
6701
|
+
this.context = context;
|
6702
|
+
this.once = once || false;
|
6767
6703
|
}
|
6768
|
-
return true;
|
6769
|
-
};
|
6770
|
-
function _addListener(target, type, listener, prepend) {
|
6771
|
-
var m;
|
6772
|
-
var events;
|
6773
|
-
var existing;
|
6774
|
-
checkListener(listener);
|
6775
|
-
events = target._events;
|
6776
|
-
if (events === undefined) {
|
6777
|
-
events = target._events = Object.create(null);
|
6778
|
-
target._eventsCount = 0;
|
6779
|
-
} else {
|
6780
|
-
// To avoid recursion in the case that type === "newListener"! Before
|
6781
|
-
// adding it to the listeners, first emit "newListener".
|
6782
|
-
if (events.newListener !== undefined) {
|
6783
|
-
target.emit('newListener', type, listener.listener ? listener.listener : listener);
|
6784
6704
|
|
6785
|
-
|
6786
|
-
|
6787
|
-
|
6705
|
+
/**
|
6706
|
+
* Add a listener for a given event.
|
6707
|
+
*
|
6708
|
+
* @param {EventEmitter} emitter Reference to the `EventEmitter` instance.
|
6709
|
+
* @param {(String|Symbol)} event The event name.
|
6710
|
+
* @param {Function} fn The listener function.
|
6711
|
+
* @param {*} context The context to invoke the listener with.
|
6712
|
+
* @param {Boolean} once Specify if the listener is a one-time listener.
|
6713
|
+
* @returns {EventEmitter}
|
6714
|
+
* @private
|
6715
|
+
*/
|
6716
|
+
function addListener(emitter, event, fn, context, once) {
|
6717
|
+
if (typeof fn !== 'function') {
|
6718
|
+
throw new TypeError('The listener must be a function');
|
6788
6719
|
}
|
6789
|
-
|
6720
|
+
var listener = new EE(fn, context || emitter, once),
|
6721
|
+
evt = prefix ? prefix + event : event;
|
6722
|
+
if (!emitter._events[evt]) emitter._events[evt] = listener, emitter._eventsCount++;else if (!emitter._events[evt].fn) emitter._events[evt].push(listener);else emitter._events[evt] = [emitter._events[evt], listener];
|
6723
|
+
return emitter;
|
6790
6724
|
}
|
6791
|
-
if (existing === undefined) {
|
6792
|
-
// Optimize the case of one listener. Don't need the extra array object.
|
6793
|
-
existing = events[type] = listener;
|
6794
|
-
++target._eventsCount;
|
6795
|
-
} else {
|
6796
|
-
if (typeof existing === 'function') {
|
6797
|
-
// Adding the second element, need to change to array.
|
6798
|
-
existing = events[type] = prepend ? [listener, existing] : [existing, listener];
|
6799
|
-
// If we've already got an array, just append.
|
6800
|
-
} else if (prepend) {
|
6801
|
-
existing.unshift(listener);
|
6802
|
-
} else {
|
6803
|
-
existing.push(listener);
|
6804
|
-
}
|
6805
6725
|
|
6806
|
-
|
6807
|
-
|
6808
|
-
|
6809
|
-
|
6810
|
-
|
6811
|
-
|
6812
|
-
|
6813
|
-
|
6814
|
-
|
6815
|
-
w.type = type;
|
6816
|
-
w.count = existing.length;
|
6817
|
-
ProcessEmitWarning(w);
|
6818
|
-
}
|
6726
|
+
/**
|
6727
|
+
* Clear event by name.
|
6728
|
+
*
|
6729
|
+
* @param {EventEmitter} emitter Reference to the `EventEmitter` instance.
|
6730
|
+
* @param {(String|Symbol)} evt The Event name.
|
6731
|
+
* @private
|
6732
|
+
*/
|
6733
|
+
function clearEvent(emitter, evt) {
|
6734
|
+
if (--emitter._eventsCount === 0) emitter._events = new Events();else delete emitter._events[evt];
|
6819
6735
|
}
|
6820
|
-
|
6821
|
-
|
6822
|
-
EventEmitter
|
6823
|
-
|
6824
|
-
|
6825
|
-
|
6826
|
-
|
6827
|
-
|
6828
|
-
|
6829
|
-
|
6830
|
-
|
6831
|
-
|
6832
|
-
|
6833
|
-
|
6834
|
-
|
6835
|
-
|
6836
|
-
|
6837
|
-
|
6838
|
-
|
6839
|
-
|
6840
|
-
|
6841
|
-
|
6842
|
-
|
6843
|
-
|
6736
|
+
|
6737
|
+
/**
|
6738
|
+
* Minimal `EventEmitter` interface that is molded against the Node.js
|
6739
|
+
* `EventEmitter` interface.
|
6740
|
+
*
|
6741
|
+
* @constructor
|
6742
|
+
* @public
|
6743
|
+
*/
|
6744
|
+
function EventEmitter() {
|
6745
|
+
this._events = new Events();
|
6746
|
+
this._eventsCount = 0;
|
6747
|
+
}
|
6748
|
+
|
6749
|
+
/**
|
6750
|
+
* Return an array listing the events for which the emitter has registered
|
6751
|
+
* listeners.
|
6752
|
+
*
|
6753
|
+
* @returns {Array}
|
6754
|
+
* @public
|
6755
|
+
*/
|
6756
|
+
EventEmitter.prototype.eventNames = function eventNames() {
|
6757
|
+
var names = [],
|
6758
|
+
events,
|
6759
|
+
name;
|
6760
|
+
if (this._eventsCount === 0) return names;
|
6761
|
+
for (name in events = this._events) {
|
6762
|
+
if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);
|
6763
|
+
}
|
6764
|
+
if (Object.getOwnPropertySymbols) {
|
6765
|
+
return names.concat(Object.getOwnPropertySymbols(events));
|
6766
|
+
}
|
6767
|
+
return names;
|
6844
6768
|
};
|
6845
|
-
var wrapped = onceWrapper.bind(state);
|
6846
|
-
wrapped.listener = listener;
|
6847
|
-
state.wrapFn = wrapped;
|
6848
|
-
return wrapped;
|
6849
|
-
}
|
6850
|
-
EventEmitter.prototype.once = function once(type, listener) {
|
6851
|
-
checkListener(listener);
|
6852
|
-
this.on(type, _onceWrap(this, type, listener));
|
6853
|
-
return this;
|
6854
|
-
};
|
6855
|
-
EventEmitter.prototype.prependOnceListener = function prependOnceListener(type, listener) {
|
6856
|
-
checkListener(listener);
|
6857
|
-
this.prependListener(type, _onceWrap(this, type, listener));
|
6858
|
-
return this;
|
6859
|
-
};
|
6860
6769
|
|
6861
|
-
|
6862
|
-
|
6863
|
-
|
6864
|
-
|
6865
|
-
|
6866
|
-
|
6867
|
-
|
6868
|
-
|
6869
|
-
|
6870
|
-
|
6871
|
-
|
6872
|
-
|
6873
|
-
|
6874
|
-
|
6875
|
-
|
6876
|
-
|
6877
|
-
|
6878
|
-
|
6879
|
-
|
6880
|
-
|
6770
|
+
/**
|
6771
|
+
* Return the listeners registered for a given event.
|
6772
|
+
*
|
6773
|
+
* @param {(String|Symbol)} event The event name.
|
6774
|
+
* @returns {Array} The registered listeners.
|
6775
|
+
* @public
|
6776
|
+
*/
|
6777
|
+
EventEmitter.prototype.listeners = function listeners(event) {
|
6778
|
+
var evt = prefix ? prefix + event : event,
|
6779
|
+
handlers = this._events[evt];
|
6780
|
+
if (!handlers) return [];
|
6781
|
+
if (handlers.fn) return [handlers.fn];
|
6782
|
+
for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) {
|
6783
|
+
ee[i] = handlers[i].fn;
|
6784
|
+
}
|
6785
|
+
return ee;
|
6786
|
+
};
|
6787
|
+
|
6788
|
+
/**
|
6789
|
+
* Return the number of listeners listening to a given event.
|
6790
|
+
*
|
6791
|
+
* @param {(String|Symbol)} event The event name.
|
6792
|
+
* @returns {Number} The number of listeners.
|
6793
|
+
* @public
|
6794
|
+
*/
|
6795
|
+
EventEmitter.prototype.listenerCount = function listenerCount(event) {
|
6796
|
+
var evt = prefix ? prefix + event : event,
|
6797
|
+
listeners = this._events[evt];
|
6798
|
+
if (!listeners) return 0;
|
6799
|
+
if (listeners.fn) return 1;
|
6800
|
+
return listeners.length;
|
6801
|
+
};
|
6802
|
+
|
6803
|
+
/**
|
6804
|
+
* Calls each of the listeners registered for a given event.
|
6805
|
+
*
|
6806
|
+
* @param {(String|Symbol)} event The event name.
|
6807
|
+
* @returns {Boolean} `true` if the event had listeners, else `false`.
|
6808
|
+
* @public
|
6809
|
+
*/
|
6810
|
+
EventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {
|
6811
|
+
var evt = prefix ? prefix + event : event;
|
6812
|
+
if (!this._events[evt]) return false;
|
6813
|
+
var listeners = this._events[evt],
|
6814
|
+
len = arguments.length,
|
6815
|
+
args,
|
6816
|
+
i;
|
6817
|
+
if (listeners.fn) {
|
6818
|
+
if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);
|
6819
|
+
switch (len) {
|
6820
|
+
case 1:
|
6821
|
+
return listeners.fn.call(listeners.context), true;
|
6822
|
+
case 2:
|
6823
|
+
return listeners.fn.call(listeners.context, a1), true;
|
6824
|
+
case 3:
|
6825
|
+
return listeners.fn.call(listeners.context, a1, a2), true;
|
6826
|
+
case 4:
|
6827
|
+
return listeners.fn.call(listeners.context, a1, a2, a3), true;
|
6828
|
+
case 5:
|
6829
|
+
return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;
|
6830
|
+
case 6:
|
6831
|
+
return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;
|
6832
|
+
}
|
6833
|
+
for (i = 1, args = new Array(len - 1); i < len; i++) {
|
6834
|
+
args[i - 1] = arguments[i];
|
6835
|
+
}
|
6836
|
+
listeners.fn.apply(listeners.context, args);
|
6837
|
+
} else {
|
6838
|
+
var length = listeners.length,
|
6839
|
+
j;
|
6840
|
+
for (i = 0; i < length; i++) {
|
6841
|
+
if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);
|
6842
|
+
switch (len) {
|
6843
|
+
case 1:
|
6844
|
+
listeners[i].fn.call(listeners[i].context);
|
6845
|
+
break;
|
6846
|
+
case 2:
|
6847
|
+
listeners[i].fn.call(listeners[i].context, a1);
|
6848
|
+
break;
|
6849
|
+
case 3:
|
6850
|
+
listeners[i].fn.call(listeners[i].context, a1, a2);
|
6851
|
+
break;
|
6852
|
+
case 4:
|
6853
|
+
listeners[i].fn.call(listeners[i].context, a1, a2, a3);
|
6854
|
+
break;
|
6855
|
+
default:
|
6856
|
+
if (!args) for (j = 1, args = new Array(len - 1); j < len; j++) {
|
6857
|
+
args[j - 1] = arguments[j];
|
6858
|
+
}
|
6859
|
+
listeners[i].fn.apply(listeners[i].context, args);
|
6860
|
+
}
|
6881
6861
|
}
|
6882
6862
|
}
|
6883
|
-
|
6884
|
-
|
6885
|
-
|
6863
|
+
return true;
|
6864
|
+
};
|
6865
|
+
|
6866
|
+
/**
|
6867
|
+
* Add a listener for a given event.
|
6868
|
+
*
|
6869
|
+
* @param {(String|Symbol)} event The event name.
|
6870
|
+
* @param {Function} fn The listener function.
|
6871
|
+
* @param {*} [context=this] The context to invoke the listener with.
|
6872
|
+
* @returns {EventEmitter} `this`.
|
6873
|
+
* @public
|
6874
|
+
*/
|
6875
|
+
EventEmitter.prototype.on = function on(event, fn, context) {
|
6876
|
+
return addListener(this, event, fn, context, false);
|
6877
|
+
};
|
6878
|
+
|
6879
|
+
/**
|
6880
|
+
* Add a one-time listener for a given event.
|
6881
|
+
*
|
6882
|
+
* @param {(String|Symbol)} event The event name.
|
6883
|
+
* @param {Function} fn The listener function.
|
6884
|
+
* @param {*} [context=this] The context to invoke the listener with.
|
6885
|
+
* @returns {EventEmitter} `this`.
|
6886
|
+
* @public
|
6887
|
+
*/
|
6888
|
+
EventEmitter.prototype.once = function once(event, fn, context) {
|
6889
|
+
return addListener(this, event, fn, context, true);
|
6890
|
+
};
|
6891
|
+
|
6892
|
+
/**
|
6893
|
+
* Remove the listeners of a given event.
|
6894
|
+
*
|
6895
|
+
* @param {(String|Symbol)} event The event name.
|
6896
|
+
* @param {Function} fn Only remove the listeners that match this function.
|
6897
|
+
* @param {*} context Only remove the listeners that have this context.
|
6898
|
+
* @param {Boolean} once Only remove one-time listeners.
|
6899
|
+
* @returns {EventEmitter} `this`.
|
6900
|
+
* @public
|
6901
|
+
*/
|
6902
|
+
EventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {
|
6903
|
+
var evt = prefix ? prefix + event : event;
|
6904
|
+
if (!this._events[evt]) return this;
|
6905
|
+
if (!fn) {
|
6906
|
+
clearEvent(this, evt);
|
6907
|
+
return this;
|
6886
6908
|
}
|
6887
|
-
|
6888
|
-
if (
|
6889
|
-
|
6890
|
-
|
6891
|
-
}
|
6892
|
-
|
6893
|
-
|
6894
|
-
|
6895
|
-
|
6896
|
-
|
6897
|
-
|
6898
|
-
|
6899
|
-
|
6900
|
-
|
6901
|
-
|
6902
|
-
this.
|
6903
|
-
} else if (events[type] !== undefined) {
|
6904
|
-
if (--this._eventsCount === 0) this._events = Object.create(null);else delete events[type];
|
6909
|
+
var listeners = this._events[evt];
|
6910
|
+
if (listeners.fn) {
|
6911
|
+
if (listeners.fn === fn && (!once || listeners.once) && (!context || listeners.context === context)) {
|
6912
|
+
clearEvent(this, evt);
|
6913
|
+
}
|
6914
|
+
} else {
|
6915
|
+
for (var i = 0, events = [], length = listeners.length; i < length; i++) {
|
6916
|
+
if (listeners[i].fn !== fn || once && !listeners[i].once || context && listeners[i].context !== context) {
|
6917
|
+
events.push(listeners[i]);
|
6918
|
+
}
|
6919
|
+
}
|
6920
|
+
|
6921
|
+
//
|
6922
|
+
// Reset the array, or remove it completely if we have no more listeners.
|
6923
|
+
//
|
6924
|
+
if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;else clearEvent(this, evt);
|
6905
6925
|
}
|
6906
6926
|
return this;
|
6907
|
-
}
|
6927
|
+
};
|
6908
6928
|
|
6909
|
-
|
6910
|
-
|
6911
|
-
|
6912
|
-
|
6913
|
-
|
6914
|
-
|
6915
|
-
|
6916
|
-
|
6929
|
+
/**
|
6930
|
+
* Remove all listeners, or those of the specified event.
|
6931
|
+
*
|
6932
|
+
* @param {(String|Symbol)} [event] The event name.
|
6933
|
+
* @returns {EventEmitter} `this`.
|
6934
|
+
* @public
|
6935
|
+
*/
|
6936
|
+
EventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {
|
6937
|
+
var evt;
|
6938
|
+
if (event) {
|
6939
|
+
evt = prefix ? prefix + event : event;
|
6940
|
+
if (this._events[evt]) clearEvent(this, evt);
|
6941
|
+
} else {
|
6942
|
+
this._events = new Events();
|
6943
|
+
this._eventsCount = 0;
|
6917
6944
|
}
|
6918
|
-
this.removeAllListeners('removeListener');
|
6919
|
-
this._events = Object.create(null);
|
6920
|
-
this._eventsCount = 0;
|
6921
6945
|
return this;
|
6946
|
+
};
|
6947
|
+
|
6948
|
+
//
|
6949
|
+
// Alias methods names because people roll like that.
|
6950
|
+
//
|
6951
|
+
EventEmitter.prototype.off = EventEmitter.prototype.removeListener;
|
6952
|
+
EventEmitter.prototype.addListener = EventEmitter.prototype.on;
|
6953
|
+
|
6954
|
+
//
|
6955
|
+
// Expose the prefix.
|
6956
|
+
//
|
6957
|
+
EventEmitter.prefixed = prefix;
|
6958
|
+
|
6959
|
+
//
|
6960
|
+
// Allow `EventEmitter` to be imported as module namespace.
|
6961
|
+
//
|
6962
|
+
EventEmitter.EventEmitter = EventEmitter;
|
6963
|
+
|
6964
|
+
//
|
6965
|
+
// Expose the module.
|
6966
|
+
//
|
6967
|
+
{
|
6968
|
+
module.exports = EventEmitter;
|
6922
6969
|
}
|
6923
|
-
|
6924
|
-
|
6925
|
-
|
6926
|
-
} else if (listeners !== undefined) {
|
6927
|
-
// LIFO order
|
6928
|
-
for (i = listeners.length - 1; i >= 0; i--) {
|
6929
|
-
this.removeListener(type, listeners[i]);
|
6930
|
-
}
|
6931
|
-
}
|
6932
|
-
return this;
|
6933
|
-
};
|
6934
|
-
function _listeners(target, type, unwrap) {
|
6935
|
-
var events = target._events;
|
6936
|
-
if (events === undefined) return [];
|
6937
|
-
var evlistener = events[type];
|
6938
|
-
if (evlistener === undefined) return [];
|
6939
|
-
if (typeof evlistener === 'function') return unwrap ? [evlistener.listener || evlistener] : [evlistener];
|
6940
|
-
return unwrap ? unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length);
|
6941
|
-
}
|
6942
|
-
EventEmitter.prototype.listeners = function listeners(type) {
|
6943
|
-
return _listeners(this, type, true);
|
6944
|
-
};
|
6945
|
-
EventEmitter.prototype.rawListeners = function rawListeners(type) {
|
6946
|
-
return _listeners(this, type, false);
|
6947
|
-
};
|
6948
|
-
EventEmitter.listenerCount = function (emitter, type) {
|
6949
|
-
if (typeof emitter.listenerCount === 'function') {
|
6950
|
-
return emitter.listenerCount(type);
|
6951
|
-
} else {
|
6952
|
-
return listenerCount.call(emitter, type);
|
6953
|
-
}
|
6954
|
-
};
|
6955
|
-
EventEmitter.prototype.listenerCount = listenerCount;
|
6956
|
-
function listenerCount(type) {
|
6957
|
-
var events = this._events;
|
6958
|
-
if (events !== undefined) {
|
6959
|
-
var evlistener = events[type];
|
6960
|
-
if (typeof evlistener === 'function') {
|
6961
|
-
return 1;
|
6962
|
-
} else if (evlistener !== undefined) {
|
6963
|
-
return evlistener.length;
|
6964
|
-
}
|
6965
|
-
}
|
6966
|
-
return 0;
|
6967
|
-
}
|
6968
|
-
EventEmitter.prototype.eventNames = function eventNames() {
|
6969
|
-
return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : [];
|
6970
|
-
};
|
6971
|
-
function arrayClone(arr, n) {
|
6972
|
-
var copy = new Array(n);
|
6973
|
-
for (var i = 0; i < n; ++i) copy[i] = arr[i];
|
6974
|
-
return copy;
|
6975
|
-
}
|
6976
|
-
function spliceOne(list, index) {
|
6977
|
-
for (; index + 1 < list.length; index++) list[index] = list[index + 1];
|
6978
|
-
list.pop();
|
6979
|
-
}
|
6980
|
-
function unwrapListeners(arr) {
|
6981
|
-
var ret = new Array(arr.length);
|
6982
|
-
for (var i = 0; i < ret.length; ++i) {
|
6983
|
-
ret[i] = arr[i].listener || arr[i];
|
6984
|
-
}
|
6985
|
-
return ret;
|
6986
|
-
}
|
6987
|
-
function once(emitter, name) {
|
6988
|
-
return new Promise(function (resolve, reject) {
|
6989
|
-
function errorListener(err) {
|
6990
|
-
emitter.removeListener(name, resolver);
|
6991
|
-
reject(err);
|
6992
|
-
}
|
6993
|
-
function resolver() {
|
6994
|
-
if (typeof emitter.removeListener === 'function') {
|
6995
|
-
emitter.removeListener('error', errorListener);
|
6996
|
-
}
|
6997
|
-
resolve([].slice.call(arguments));
|
6998
|
-
}
|
6999
|
-
eventTargetAgnosticAddListener(emitter, name, resolver, {
|
7000
|
-
once: true
|
7001
|
-
});
|
7002
|
-
if (name !== 'error') {
|
7003
|
-
addErrorHandlerIfEventEmitter(emitter, errorListener, {
|
7004
|
-
once: true
|
7005
|
-
});
|
7006
|
-
}
|
7007
|
-
});
|
7008
|
-
}
|
7009
|
-
function addErrorHandlerIfEventEmitter(emitter, handler, flags) {
|
7010
|
-
if (typeof emitter.on === 'function') {
|
7011
|
-
eventTargetAgnosticAddListener(emitter, 'error', handler, flags);
|
7012
|
-
}
|
7013
|
-
}
|
7014
|
-
function eventTargetAgnosticAddListener(emitter, name, listener, flags) {
|
7015
|
-
if (typeof emitter.on === 'function') {
|
7016
|
-
if (flags.once) {
|
7017
|
-
emitter.once(name, listener);
|
7018
|
-
} else {
|
7019
|
-
emitter.on(name, listener);
|
7020
|
-
}
|
7021
|
-
} else if (typeof emitter.addEventListener === 'function') {
|
7022
|
-
// EventTarget does not have `error` event semantics like Node
|
7023
|
-
// EventEmitters, we do not listen for `error` events here.
|
7024
|
-
emitter.addEventListener(name, function wrapListener(arg) {
|
7025
|
-
// IE does not have builtin `{ once: true }` support so we
|
7026
|
-
// have to do it manually.
|
7027
|
-
if (flags.once) {
|
7028
|
-
emitter.removeEventListener(name, wrapListener);
|
7029
|
-
}
|
7030
|
-
listener(arg);
|
7031
|
-
});
|
7032
|
-
} else {
|
7033
|
-
throw new TypeError('The "emitter" argument must be of type EventEmitter. Received type ' + typeof emitter);
|
7034
|
-
}
|
7035
|
-
}
|
7036
|
-
var eventsExports = events.exports;
|
6970
|
+
})(eventemitter3);
|
6971
|
+
var eventemitter3Exports = eventemitter3.exports;
|
6972
|
+
var EventEmitter = /*@__PURE__*/getDefaultExportFromCjs(eventemitter3Exports);
|
7037
6973
|
|
7038
6974
|
/*
|
7039
6975
|
* Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.
|
@@ -14251,7 +14187,7 @@ function getMatch(exp, ua) {
|
|
14251
14187
|
return match && match.length >= id && match[id] || '';
|
14252
14188
|
}
|
14253
14189
|
|
14254
|
-
var version$1 = "1.
|
14190
|
+
var version$1 = "1.11.0";
|
14255
14191
|
|
14256
14192
|
const version = version$1;
|
14257
14193
|
const protocolVersion = 9;
|
@@ -14566,7 +14502,7 @@ function getEmptyVideoStreamTrack() {
|
|
14566
14502
|
if (!emptyVideoStreamTrack) {
|
14567
14503
|
emptyVideoStreamTrack = createDummyVideoStreamTrack();
|
14568
14504
|
}
|
14569
|
-
return emptyVideoStreamTrack;
|
14505
|
+
return emptyVideoStreamTrack.clone();
|
14570
14506
|
}
|
14571
14507
|
function createDummyVideoStreamTrack() {
|
14572
14508
|
let width = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 16;
|
@@ -14601,8 +14537,11 @@ function getEmptyAudioStreamTrack() {
|
|
14601
14537
|
// implementation adapted from https://blog.mozilla.org/webrtc/warm-up-with-replacetrack/
|
14602
14538
|
const ctx = new AudioContext();
|
14603
14539
|
const oscillator = ctx.createOscillator();
|
14540
|
+
const gain = ctx.createGain();
|
14541
|
+
gain.gain.setValueAtTime(0, 0);
|
14604
14542
|
const dst = ctx.createMediaStreamDestination();
|
14605
|
-
oscillator.connect(
|
14543
|
+
oscillator.connect(gain);
|
14544
|
+
gain.connect(dst);
|
14606
14545
|
oscillator.start();
|
14607
14546
|
[emptyAudioStreamTrack] = dst.stream.getAudioTracks();
|
14608
14547
|
if (!emptyAudioStreamTrack) {
|
@@ -14610,7 +14549,7 @@ function getEmptyAudioStreamTrack() {
|
|
14610
14549
|
}
|
14611
14550
|
emptyAudioStreamTrack.enabled = false;
|
14612
14551
|
}
|
14613
|
-
return emptyAudioStreamTrack;
|
14552
|
+
return emptyAudioStreamTrack.clone();
|
14614
14553
|
}
|
14615
14554
|
class Future {
|
14616
14555
|
constructor(futureBase, onFinally) {
|
@@ -16082,7 +16021,7 @@ const PCEvents = {
|
|
16082
16021
|
NegotiationComplete: 'negotiationComplete'
|
16083
16022
|
};
|
16084
16023
|
/** @internal */
|
16085
|
-
class PCTransport extends
|
16024
|
+
class PCTransport extends EventEmitter {
|
16086
16025
|
constructor(config) {
|
16087
16026
|
let mediaConstraints = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
16088
16027
|
super();
|
@@ -17017,7 +16956,7 @@ const BACKGROUND_REACTION_DELAY = 5000;
|
|
17017
16956
|
// keep old audio elements when detached, we would re-use them since on iOS
|
17018
16957
|
// Safari tracks which audio elements have been "blessed" by the user.
|
17019
16958
|
const recycledElements = [];
|
17020
|
-
class Track extends
|
16959
|
+
class Track extends EventEmitter {
|
17021
16960
|
constructor(mediaTrack, kind) {
|
17022
16961
|
super();
|
17023
16962
|
this.attachedElements = [];
|
@@ -17041,7 +16980,6 @@ class Track extends eventsExports.EventEmitter {
|
|
17041
16980
|
this.handleAppVisibilityChanged();
|
17042
16981
|
}
|
17043
16982
|
};
|
17044
|
-
this.setMaxListeners(100);
|
17045
16983
|
this.kind = kind;
|
17046
16984
|
this._mediaStreamTrack = mediaTrack;
|
17047
16985
|
this._mediaStreamID = mediaTrack.id;
|
@@ -17361,7 +17299,7 @@ var PCState;
|
|
17361
17299
|
PCState[PCState["Closed"] = 4] = "Closed";
|
17362
17300
|
})(PCState || (PCState = {}));
|
17363
17301
|
/** @internal */
|
17364
|
-
class RTCEngine extends
|
17302
|
+
class RTCEngine extends EventEmitter {
|
17365
17303
|
get isClosed() {
|
17366
17304
|
return this._isClosed;
|
17367
17305
|
}
|
@@ -17499,6 +17437,7 @@ class RTCEngine extends eventsExports.EventEmitter {
|
|
17499
17437
|
};
|
17500
17438
|
this.once(EngineEvent.Restarted, onRestarted);
|
17501
17439
|
this.once(EngineEvent.Disconnected, onDisconnected);
|
17440
|
+
this.once(EngineEvent.Closing, onDisconnected);
|
17502
17441
|
});
|
17503
17442
|
};
|
17504
17443
|
this.updateAndEmitDCBufferStatus = kind => {
|
@@ -18291,7 +18230,7 @@ class RTCEngine extends eventsExports.EventEmitter {
|
|
18291
18230
|
}
|
18292
18231
|
this.hasPublished = true;
|
18293
18232
|
const handleClosed = () => {
|
18294
|
-
livekitLogger.
|
18233
|
+
livekitLogger.warn('engine disconnected while negotiation was ongoing');
|
18295
18234
|
cleanup();
|
18296
18235
|
resolve();
|
18297
18236
|
return;
|
@@ -18440,12 +18379,16 @@ class LocalTrack extends Track {
|
|
18440
18379
|
}
|
18441
18380
|
this.emit(TrackEvent.Ended, this);
|
18442
18381
|
};
|
18443
|
-
this._mediaStreamTrack.addEventListener('ended', this.handleEnded);
|
18444
|
-
this.constraints = constraints !== null && constraints !== void 0 ? constraints : mediaTrack.getConstraints();
|
18445
18382
|
this.reacquireTrack = false;
|
18446
18383
|
this.providedByUser = userProvidedTrack;
|
18447
18384
|
this.muteLock = new Mutex();
|
18448
18385
|
this.pauseUpstreamLock = new Mutex();
|
18386
|
+
// added to satisfy TS compiler, constraints are synced with MediaStreamTrack
|
18387
|
+
this.constraints = mediaTrack.getConstraints();
|
18388
|
+
this.setMediaStreamTrack(mediaTrack);
|
18389
|
+
if (constraints) {
|
18390
|
+
this.constraints = constraints;
|
18391
|
+
}
|
18449
18392
|
}
|
18450
18393
|
get id() {
|
18451
18394
|
return this._mediaStreamTrack.id;
|
@@ -18476,6 +18419,53 @@ class LocalTrack extends Track {
|
|
18476
18419
|
var _a, _b;
|
18477
18420
|
return (_b = (_a = this.processor) === null || _a === void 0 ? void 0 : _a.processedTrack) !== null && _b !== void 0 ? _b : this._mediaStreamTrack;
|
18478
18421
|
}
|
18422
|
+
setMediaStreamTrack(newTrack) {
|
18423
|
+
return __awaiter(this, void 0, void 0, function* () {
|
18424
|
+
if (newTrack === this._mediaStreamTrack) {
|
18425
|
+
return;
|
18426
|
+
}
|
18427
|
+
if (this._mediaStreamTrack) {
|
18428
|
+
// detach
|
18429
|
+
this.attachedElements.forEach(el => {
|
18430
|
+
detachTrack(this._mediaStreamTrack, el);
|
18431
|
+
});
|
18432
|
+
this._mediaStreamTrack.removeEventListener('ended', this.handleEnded);
|
18433
|
+
this._mediaStreamTrack.removeEventListener('mute', this.pauseUpstream);
|
18434
|
+
this._mediaStreamTrack.removeEventListener('unmute', this.resumeUpstream);
|
18435
|
+
if (!this.providedByUser) {
|
18436
|
+
this._mediaStreamTrack.stop();
|
18437
|
+
}
|
18438
|
+
}
|
18439
|
+
this.mediaStream = new MediaStream([newTrack]);
|
18440
|
+
if (newTrack) {
|
18441
|
+
newTrack.addEventListener('ended', this.handleEnded);
|
18442
|
+
// when underlying track emits mute, it indicates that the device is unable
|
18443
|
+
// to produce media. In this case we'll need to signal with remote that
|
18444
|
+
// the track is "muted"
|
18445
|
+
// note this is different from LocalTrack.mute because we do not want to
|
18446
|
+
// touch MediaStreamTrack.enabled
|
18447
|
+
newTrack.addEventListener('mute', () => {
|
18448
|
+
livekitLogger.info('pausing upstream due to device mute');
|
18449
|
+
this.pauseUpstream();
|
18450
|
+
});
|
18451
|
+
newTrack.addEventListener('unmute', this.resumeUpstream);
|
18452
|
+
this.constraints = newTrack.getConstraints();
|
18453
|
+
}
|
18454
|
+
if (this.sender) {
|
18455
|
+
yield this.sender.replaceTrack(newTrack);
|
18456
|
+
}
|
18457
|
+
this._mediaStreamTrack = newTrack;
|
18458
|
+
if (newTrack) {
|
18459
|
+
// sync muted state with the enabled state of the newly provided track
|
18460
|
+
this._mediaStreamTrack.enabled = !this.isMuted;
|
18461
|
+
// when a valid track is replace, we'd want to start producing
|
18462
|
+
yield this.resumeUpstream();
|
18463
|
+
this.attachedElements.forEach(el => {
|
18464
|
+
attachToElement(newTrack, el);
|
18465
|
+
});
|
18466
|
+
}
|
18467
|
+
});
|
18468
|
+
}
|
18479
18469
|
waitForDimensions() {
|
18480
18470
|
let timeout = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : defaultDimensionsTimeout;
|
18481
18471
|
return __awaiter(this, void 0, void 0, function* () {
|
@@ -18528,30 +18518,10 @@ class LocalTrack extends Track {
|
|
18528
18518
|
if (!this.sender) {
|
18529
18519
|
throw new TrackInvalidError('unable to replace an unpublished track');
|
18530
18520
|
}
|
18531
|
-
// detach
|
18532
|
-
this.attachedElements.forEach(el => {
|
18533
|
-
detachTrack(this._mediaStreamTrack, el);
|
18534
|
-
});
|
18535
|
-
this._mediaStreamTrack.removeEventListener('ended', this.handleEnded);
|
18536
|
-
// on Safari, the old audio track must be stopped before attempting to acquire
|
18537
|
-
// the new track, otherwise the new track will stop with
|
18538
|
-
// 'A MediaStreamTrack ended due to a capture failure`
|
18539
|
-
if (!this.providedByUser) {
|
18540
|
-
this._mediaStreamTrack.stop();
|
18541
|
-
}
|
18542
|
-
track.addEventListener('ended', this.handleEnded);
|
18543
18521
|
livekitLogger.debug('replace MediaStreamTrack');
|
18544
|
-
|
18545
|
-
|
18546
|
-
|
18547
|
-
this._mediaStreamTrack = track;
|
18548
|
-
// sync muted state with the enabled state of the newly provided track
|
18549
|
-
this._mediaStreamTrack.enabled = !this.isMuted;
|
18550
|
-
yield this.resumeUpstream();
|
18551
|
-
this.attachedElements.forEach(el => {
|
18552
|
-
attachToElement(track, el);
|
18553
|
-
});
|
18554
|
-
this.mediaStream = new MediaStream([track]);
|
18522
|
+
this.setMediaStreamTrack(track);
|
18523
|
+
// this must be synced *after* setting mediaStreamTrack above, since it relies
|
18524
|
+
// on the previous state in order to cleanup
|
18555
18525
|
this.providedByUser = userProvidedTrack;
|
18556
18526
|
if (this.processor) {
|
18557
18527
|
yield this.stopProcessor();
|
@@ -18574,7 +18544,8 @@ class LocalTrack extends Track {
|
|
18574
18544
|
} else {
|
18575
18545
|
streamConstraints.audio = constraints;
|
18576
18546
|
}
|
18577
|
-
//
|
18547
|
+
// these steps are duplicated from setMediaStreamTrack because we must stop
|
18548
|
+
// the previous tracks before new tracks can be acquired
|
18578
18549
|
this.attachedElements.forEach(el => {
|
18579
18550
|
detachTrack(this.mediaStreamTrack, el);
|
18580
18551
|
});
|
@@ -18588,13 +18559,7 @@ class LocalTrack extends Track {
|
|
18588
18559
|
const newTrack = mediaStream.getTracks()[0];
|
18589
18560
|
newTrack.addEventListener('ended', this.handleEnded);
|
18590
18561
|
livekitLogger.debug('re-acquired MediaStreamTrack');
|
18591
|
-
|
18592
|
-
// Track can be restarted after it's unpublished
|
18593
|
-
yield this.sender.replaceTrack(newTrack);
|
18594
|
-
}
|
18595
|
-
this._mediaStreamTrack = newTrack;
|
18596
|
-
yield this.resumeUpstream();
|
18597
|
-
this.mediaStream = mediaStream;
|
18562
|
+
this.setMediaStreamTrack(newTrack);
|
18598
18563
|
this.constraints = constraints;
|
18599
18564
|
if (this.processor) {
|
18600
18565
|
const processor = this.processor;
|
@@ -18686,6 +18651,7 @@ class LocalTrack extends Track {
|
|
18686
18651
|
}
|
18687
18652
|
this._isUpstreamPaused = false;
|
18688
18653
|
this.emit(TrackEvent.UpstreamResumed, this);
|
18654
|
+
// this operation is noop if mediastreamtrack is already being sent
|
18689
18655
|
yield this.sender.replaceTrack(this._mediaStreamTrack);
|
18690
18656
|
} finally {
|
18691
18657
|
unlock();
|
@@ -19003,25 +18969,23 @@ function computeVideoEncodings(isScreenShare, width, height, options) {
|
|
19003
18969
|
const original = new VideoPreset(width, height, videoEncoding.maxBitrate, videoEncoding.maxFramerate);
|
19004
18970
|
if (scalabilityMode && isSVCCodec(videoCodec)) {
|
19005
18971
|
livekitLogger.debug("using svc with scalabilityMode ".concat(scalabilityMode));
|
18972
|
+
const sm = new ScalabilityMode(scalabilityMode);
|
19006
18973
|
const encodings = [];
|
19007
|
-
|
19008
|
-
|
19009
|
-
|
19010
|
-
|
19011
|
-
|
19012
|
-
|
19013
|
-
|
19014
|
-
|
19015
|
-
|
19016
|
-
|
19017
|
-
scalabilityMode: scalabilityMode
|
19018
|
-
});
|
19019
|
-
livekitLogger.debug('encodings', encodings);
|
19020
|
-
return encodings;
|
19021
|
-
default:
|
19022
|
-
// TODO : support other scalability modes
|
19023
|
-
throw new Error("unsupported scalabilityMode: ".concat(scalabilityMode));
|
18974
|
+
if (sm.spatial > 3) {
|
18975
|
+
throw new Error("unsupported scalabilityMode: ".concat(scalabilityMode));
|
18976
|
+
}
|
18977
|
+
for (let i = 0; i < sm.spatial; i += 1) {
|
18978
|
+
encodings.push({
|
18979
|
+
rid: videoRids[2 - i],
|
18980
|
+
maxBitrate: videoEncoding.maxBitrate / Math.pow(3, i),
|
18981
|
+
/* @ts-ignore */
|
18982
|
+
maxFramerate: original.encoding.maxFramerate
|
18983
|
+
});
|
19024
18984
|
}
|
18985
|
+
/* @ts-ignore */
|
18986
|
+
encodings[0].scalabilityMode = scalabilityMode;
|
18987
|
+
livekitLogger.debug('encodings', encodings);
|
18988
|
+
return encodings;
|
19025
18989
|
}
|
19026
18990
|
if (!useSimulcast) {
|
19027
18991
|
return [videoEncoding];
|
@@ -19554,44 +19518,13 @@ function setPublishingLayersForSender(sender, senderEncodings, qualities, sender
|
|
19554
19518
|
return;
|
19555
19519
|
}
|
19556
19520
|
let hasChanged = false;
|
19557
|
-
/*
|
19558
|
-
|
19559
|
-
// svc dynacast encodings
|
19560
|
-
const encoding = encodings[0];
|
19561
|
-
/* @ts-ignore */
|
19562
|
-
// const mode = new ScalabilityMode(encoding.scalabilityMode);
|
19563
|
-
let maxQuality = VideoQuality.OFF;
|
19564
|
-
qualities.forEach(q => {
|
19565
|
-
if (q.enabled && (maxQuality === VideoQuality.OFF || q.quality > maxQuality)) {
|
19566
|
-
maxQuality = q.quality;
|
19567
|
-
}
|
19568
|
-
});
|
19569
|
-
if (maxQuality === VideoQuality.OFF) {
|
19570
|
-
if (encoding.active) {
|
19571
|
-
encoding.active = false;
|
19572
|
-
hasChanged = true;
|
19573
|
-
}
|
19574
|
-
} else if (!encoding.active /* || mode.spatial !== maxQuality + 1*/) {
|
19575
|
-
hasChanged = true;
|
19576
|
-
encoding.active = true;
|
19577
|
-
/* disable closable spatial layer as it has video blur/frozen issue with current server/client
|
19578
|
-
1. chrome 113: when switching to up layer with scalability Mode change, it will generate a
|
19521
|
+
/* disable closable spatial layer as it has video blur / frozen issue with current server / client
|
19522
|
+
1. chrome 113: when switching to up layer with scalability Mode change, it will generate a
|
19579
19523
|
low resolution frame and recover very quickly, but noticable
|
19580
|
-
|
19581
|
-
|
19582
|
-
|
19583
|
-
|
19584
|
-
mode.suffix = originalMode.suffix;
|
19585
|
-
if (mode.spatial === 1) {
|
19586
|
-
// no suffix for L1Tx
|
19587
|
-
mode.suffix = undefined;
|
19588
|
-
}
|
19589
|
-
@ts-ignore
|
19590
|
-
encoding.scalabilityMode = mode.toString();
|
19591
|
-
encoding.scaleResolutionDownBy = 2 ** (2 - maxQuality);
|
19592
|
-
*/
|
19593
|
-
}
|
19594
|
-
} else {
|
19524
|
+
2. livekit sfu: additional pli request cause video frozen for a few frames, also noticable */
|
19525
|
+
const closableSpatial = false;
|
19526
|
+
/* @ts-ignore */
|
19527
|
+
if (closableSpatial && encodings[0].scalabilityMode) ; else {
|
19595
19528
|
// simulcast dynacast encodings
|
19596
19529
|
encodings.forEach((encoding, idx) => {
|
19597
19530
|
var _a;
|
@@ -19648,7 +19581,7 @@ function videoQualityForRid(rid) {
|
|
19648
19581
|
return VideoQuality.UNRECOGNIZED;
|
19649
19582
|
}
|
19650
19583
|
}
|
19651
|
-
function videoLayersFromEncodings(width, height, encodings) {
|
19584
|
+
function videoLayersFromEncodings(width, height, encodings, svc) {
|
19652
19585
|
// default to a single layer, HQ
|
19653
19586
|
if (!encodings) {
|
19654
19587
|
return [{
|
@@ -19659,8 +19592,7 @@ function videoLayersFromEncodings(width, height, encodings) {
|
|
19659
19592
|
ssrc: 0
|
19660
19593
|
}];
|
19661
19594
|
}
|
19662
|
-
|
19663
|
-
if (encodings.length === 1 && encodings[0].scalabilityMode) {
|
19595
|
+
if (svc) {
|
19664
19596
|
// svc layers
|
19665
19597
|
/* @ts-ignore */
|
19666
19598
|
const sm = new ScalabilityMode(encodings[0].scalabilityMode);
|
@@ -20114,20 +20046,19 @@ class RemoteVideoTrack extends RemoteTrack {
|
|
20114
20046
|
this.emit(TrackEvent.VisibilityChanged, isVisible, this);
|
20115
20047
|
}
|
20116
20048
|
updateDimensions() {
|
20117
|
-
var _a, _b
|
20049
|
+
var _a, _b;
|
20118
20050
|
let maxWidth = 0;
|
20119
20051
|
let maxHeight = 0;
|
20052
|
+
const pixelDensity = this.getPixelDensity();
|
20120
20053
|
for (const info of this.elementInfos) {
|
20121
|
-
const
|
20122
|
-
const
|
20123
|
-
const currentElementWidth = info.width() * pixelDensityValue;
|
20124
|
-
const currentElementHeight = info.height() * pixelDensityValue;
|
20054
|
+
const currentElementWidth = info.width() * pixelDensity;
|
20055
|
+
const currentElementHeight = info.height() * pixelDensity;
|
20125
20056
|
if (currentElementWidth + currentElementHeight > maxWidth + maxHeight) {
|
20126
20057
|
maxWidth = currentElementWidth;
|
20127
20058
|
maxHeight = currentElementHeight;
|
20128
20059
|
}
|
20129
20060
|
}
|
20130
|
-
if (((
|
20061
|
+
if (((_a = this.lastDimensions) === null || _a === void 0 ? void 0 : _a.width) === maxWidth && ((_b = this.lastDimensions) === null || _b === void 0 ? void 0 : _b.height) === maxHeight) {
|
20131
20062
|
return;
|
20132
20063
|
}
|
20133
20064
|
this.lastDimensions = {
|
@@ -20136,6 +20067,24 @@ class RemoteVideoTrack extends RemoteTrack {
|
|
20136
20067
|
};
|
20137
20068
|
this.emit(TrackEvent.VideoDimensionsChanged, this.lastDimensions, this);
|
20138
20069
|
}
|
20070
|
+
getPixelDensity() {
|
20071
|
+
var _a;
|
20072
|
+
const pixelDensity = (_a = this.adaptiveStreamSettings) === null || _a === void 0 ? void 0 : _a.pixelDensity;
|
20073
|
+
if (pixelDensity === 'screen') {
|
20074
|
+
return getDevicePixelRatio();
|
20075
|
+
} else if (!pixelDensity) {
|
20076
|
+
// when unset, we'll pick a sane default here.
|
20077
|
+
// for higher pixel density devices (mobile phones, etc), we'll use 2
|
20078
|
+
// otherwise it defaults to 1
|
20079
|
+
const devicePixelRatio = getDevicePixelRatio();
|
20080
|
+
if (devicePixelRatio > 2) {
|
20081
|
+
return 2;
|
20082
|
+
} else {
|
20083
|
+
return 1;
|
20084
|
+
}
|
20085
|
+
}
|
20086
|
+
return pixelDensity;
|
20087
|
+
}
|
20139
20088
|
}
|
20140
20089
|
class HTMLElementInfo {
|
20141
20090
|
get visible() {
|
@@ -20221,7 +20170,7 @@ function isElementInViewport(el) {
|
|
20221
20170
|
return top < window.pageYOffset + window.innerHeight && left < window.pageXOffset + window.innerWidth && top + height > window.pageYOffset && left + width > window.pageXOffset && !hidden && (opacity !== '' ? parseFloat(opacity) > 0 : true) && display !== 'none';
|
20222
20171
|
}
|
20223
20172
|
|
20224
|
-
class TrackPublication extends
|
20173
|
+
class TrackPublication extends EventEmitter {
|
20225
20174
|
constructor(kind, id, name) {
|
20226
20175
|
super();
|
20227
20176
|
this.metadataMuted = false;
|
@@ -20231,7 +20180,6 @@ class TrackPublication extends eventsExports.EventEmitter {
|
|
20231
20180
|
this.handleUnmuted = () => {
|
20232
20181
|
this.emit(TrackEvent.Unmuted);
|
20233
20182
|
};
|
20234
|
-
this.setMaxListeners(100);
|
20235
20183
|
this.kind = kind;
|
20236
20184
|
this.trackSid = id;
|
20237
20185
|
this.trackName = name;
|
@@ -20401,7 +20349,7 @@ function qualityFromProto(q) {
|
|
20401
20349
|
return ConnectionQuality.Unknown;
|
20402
20350
|
}
|
20403
20351
|
}
|
20404
|
-
class Participant extends
|
20352
|
+
class Participant extends EventEmitter {
|
20405
20353
|
/** @internal */
|
20406
20354
|
constructor(sid, identity, name, metadata) {
|
20407
20355
|
super();
|
@@ -20410,7 +20358,6 @@ class Participant extends eventsExports.EventEmitter {
|
|
20410
20358
|
/** if participant is currently speaking */
|
20411
20359
|
this.isSpeaking = false;
|
20412
20360
|
this._connectionQuality = ConnectionQuality.Unknown;
|
20413
|
-
this.setMaxListeners(100);
|
20414
20361
|
this.sid = sid;
|
20415
20362
|
this.identity = identity;
|
20416
20363
|
this.name = name;
|
@@ -21114,8 +21061,11 @@ class LocalParticipant extends Participant {
|
|
21114
21061
|
};
|
21115
21062
|
this.handleDisconnected = () => {
|
21116
21063
|
var _a, _b;
|
21117
|
-
|
21118
|
-
|
21064
|
+
if (this.reconnectFuture) {
|
21065
|
+
this.reconnectFuture.promise.catch(e => livekitLogger.warn(e));
|
21066
|
+
(_b = (_a = this.reconnectFuture) === null || _a === void 0 ? void 0 : _a.reject) === null || _b === void 0 ? void 0 : _b.call(_a, 'Got disconnected during reconnection attempt');
|
21067
|
+
this.reconnectFuture = undefined;
|
21068
|
+
}
|
21119
21069
|
};
|
21120
21070
|
this.updateTrackSubscriptionPermissions = () => {
|
21121
21071
|
livekitLogger.debug('updating track subscription permissions', {
|
@@ -21727,7 +21677,7 @@ class LocalParticipant extends Participant {
|
|
21727
21677
|
}
|
21728
21678
|
}
|
21729
21679
|
encodings = computeVideoEncodings(track.source === Track.Source.ScreenShare, dims.width, dims.height, opts);
|
21730
|
-
req.layers = videoLayersFromEncodings(req.width, req.height, encodings);
|
21680
|
+
req.layers = videoLayersFromEncodings(req.width, req.height, encodings, isSVCCodec(opts.videoCodec));
|
21731
21681
|
} else if (track.kind === Track.Kind.Audio) {
|
21732
21682
|
encodings = [{
|
21733
21683
|
maxBitrate: (_h = (_g = opts.audioPreset) === null || _g === void 0 ? void 0 : _g.maxBitrate) !== null && _h !== void 0 ? _h : opts.audioBitrate,
|
@@ -22107,7 +22057,7 @@ const RoomState = ConnectionState;
|
|
22107
22057
|
*
|
22108
22058
|
* @noInheritDoc
|
22109
22059
|
*/
|
22110
|
-
class Room extends
|
22060
|
+
class Room extends EventEmitter {
|
22111
22061
|
/**
|
22112
22062
|
* Creates a new Room, the primary construct for a LiveKit session.
|
22113
22063
|
* @param options
|
@@ -22272,6 +22222,9 @@ class Room extends eventsExports.EventEmitter {
|
|
22272
22222
|
// capturing both 'pagehide' and 'beforeunload' to capture broadest set of browser behaviors
|
22273
22223
|
window.addEventListener('pagehide', this.onPageLeave);
|
22274
22224
|
window.addEventListener('beforeunload', this.onPageLeave);
|
22225
|
+
}
|
22226
|
+
if (isWeb()) {
|
22227
|
+
document.addEventListener('freeze', this.onPageLeave);
|
22275
22228
|
(_b = navigator.mediaDevices) === null || _b === void 0 ? void 0 : _b.addEventListener('devicechange', this.handleDeviceChange);
|
22276
22229
|
}
|
22277
22230
|
this.setAndEmitConnectionState(ConnectionState.Connected);
|
@@ -22589,7 +22542,6 @@ class Room extends eventsExports.EventEmitter {
|
|
22589
22542
|
this.onLocalParticipantPermissionsChanged = prevPermissions => {
|
22590
22543
|
this.emit(RoomEvent.ParticipantPermissionsChanged, prevPermissions, this.localParticipant);
|
22591
22544
|
};
|
22592
|
-
this.setMaxListeners(100);
|
22593
22545
|
this.participants = new Map();
|
22594
22546
|
this.cachedParticipantSids = [];
|
22595
22547
|
this.identityToSid = new Map();
|
@@ -22813,6 +22765,28 @@ class Room extends eventsExports.EventEmitter {
|
|
22813
22765
|
return __awaiter(this, void 0, void 0, function* () {
|
22814
22766
|
yield this.acquireAudioContext();
|
22815
22767
|
const elements = [];
|
22768
|
+
if (isSafari()) {
|
22769
|
+
/**
|
22770
|
+
* iOS Safari blocks audio element playback if
|
22771
|
+
* - user is not publishing audio themselves and
|
22772
|
+
* - no other audio source is playing
|
22773
|
+
*
|
22774
|
+
* as a workaround, we create an audio element with an empty track, so that
|
22775
|
+
* silent audio is always playing
|
22776
|
+
*/
|
22777
|
+
const audioId = 'livekit-dummy-audio-el';
|
22778
|
+
let dummyAudioEl = document.getElementById(audioId);
|
22779
|
+
if (!dummyAudioEl) {
|
22780
|
+
dummyAudioEl = document.createElement('audio');
|
22781
|
+
dummyAudioEl.autoplay = true;
|
22782
|
+
dummyAudioEl.hidden = true;
|
22783
|
+
const track = getEmptyAudioStreamTrack();
|
22784
|
+
track.enabled = true;
|
22785
|
+
dummyAudioEl.srcObject = new MediaStream([track]);
|
22786
|
+
document.body.append(dummyAudioEl);
|
22787
|
+
}
|
22788
|
+
elements.push(dummyAudioEl);
|
22789
|
+
}
|
22816
22790
|
this.participants.forEach(p => {
|
22817
22791
|
p.audioTracks.forEach(t => {
|
22818
22792
|
if (t.track) {
|
@@ -23008,6 +22982,7 @@ class Room extends eventsExports.EventEmitter {
|
|
23008
22982
|
if (isWeb()) {
|
23009
22983
|
window.removeEventListener('beforeunload', this.onPageLeave);
|
23010
22984
|
window.removeEventListener('pagehide', this.onPageLeave);
|
22985
|
+
window.removeEventListener('freeze', this.onPageLeave);
|
23011
22986
|
(_a = navigator.mediaDevices) === null || _a === void 0 ? void 0 : _a.removeEventListener('devicechange', this.handleDeviceChange);
|
23012
22987
|
}
|
23013
22988
|
} finally {
|
@@ -23321,6 +23296,10 @@ class Room extends eventsExports.EventEmitter {
|
|
23321
23296
|
for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
|
23322
23297
|
args[_key2 - 1] = arguments[_key2];
|
23323
23298
|
}
|
23299
|
+
// emit<E extends keyof RoomEventCallbacks>(
|
23300
|
+
// event: E,
|
23301
|
+
// ...args: Parameters<RoomEventCallbacks[E]>
|
23302
|
+
// ): boolean {
|
23324
23303
|
// active speaker updates are too spammy
|
23325
23304
|
if (event !== RoomEvent.ActiveSpeakersChanged) {
|
23326
23305
|
livekitLogger.debug("room event ".concat(event), {
|
@@ -23340,7 +23319,7 @@ var CheckStatus;
|
|
23340
23319
|
CheckStatus[CheckStatus["SUCCESS"] = 3] = "SUCCESS";
|
23341
23320
|
CheckStatus[CheckStatus["FAILED"] = 4] = "FAILED";
|
23342
23321
|
})(CheckStatus || (CheckStatus = {}));
|
23343
|
-
class Checker extends
|
23322
|
+
class Checker extends EventEmitter {
|
23344
23323
|
constructor(url, token) {
|
23345
23324
|
let options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
|
23346
23325
|
super();
|
@@ -23752,7 +23731,7 @@ class WebSocketCheck extends Checker {
|
|
23752
23731
|
}
|
23753
23732
|
}
|
23754
23733
|
|
23755
|
-
class ConnectionCheck extends
|
23734
|
+
class ConnectionCheck extends EventEmitter {
|
23756
23735
|
constructor(url, token) {
|
23757
23736
|
super();
|
23758
23737
|
this.checkResults = new Map();
|