@twilio/voice-sdk
Version:
Twilio's JavaScript Voice SDK
114 lines • 9.11 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
/**
* @packageDocumentation
* @module Voice
*/
var constants_1 = require("./constants");
var errors_1 = require("./errors");
var DEFAULT_TEST_SOUND_URL = constants_1.SOUNDS_BASE_URL + "/outgoing.mp3";
/**
* A smart collection containing a Set of active output devices.
* @publicapi
*/
var OutputDeviceCollection = /** @class */ (function () {
/**
* @private
*/
function OutputDeviceCollection(_name, _availableDevices, _beforeChange, _isSupported) {
this._name = _name;
this._availableDevices = _availableDevices;
this._beforeChange = _beforeChange;
this._isSupported = _isSupported;
/**
* The currently active output devices.
*/
this._activeDevices = new Set();
}
/**
* Delete a device from the collection. If no devices remain, the 'default'
* device will be added as the sole device. If no `default` device exists,
* the first available device will be used.
* @param device - The device to delete from the collection
* @returns whether the device was present before it was deleted
*/
OutputDeviceCollection.prototype.delete = function (device) {
var wasDeleted = !!(this._activeDevices.delete(device));
var defaultDevice = this._availableDevices.get('default')
|| Array.from(this._availableDevices.values())[0];
if (!this._activeDevices.size && defaultDevice) {
this._activeDevices.add(defaultDevice);
}
// Call _beforeChange so that the implementation can react when a device is
// removed or lost.
var deviceIds = Array.from(this._activeDevices.values()).map(function (deviceInfo) { return deviceInfo.deviceId; });
this._beforeChange(this._name, deviceIds);
return !!wasDeleted;
};
/**
* Get the current set of devices.
*/
OutputDeviceCollection.prototype.get = function () {
return this._activeDevices;
};
/**
* Replace the current set of devices with a new set of devices.
* @param deviceIdOrIds - An ID or array of IDs of devices to replace the existing devices with.
* @returns Rejects if this feature is not supported, any of the supplied IDs are not found,
* or no IDs are passed.
*/
OutputDeviceCollection.prototype.set = function (deviceIdOrIds) {
var _this = this;
if (!this._isSupported) {
return Promise.reject(new errors_1.NotSupportedError('This browser does not support audio output selection'));
}
var deviceIds = Array.isArray(deviceIdOrIds) ? deviceIdOrIds : [deviceIdOrIds];
if (!deviceIds.length) {
return Promise.reject(new errors_1.InvalidArgumentError('Must specify at least one device to set'));
}
var missingIds = [];
var devices = deviceIds.map(function (id) {
var device = _this._availableDevices.get(id);
if (!device) {
missingIds.push(id);
}
return device;
});
if (missingIds.length) {
return Promise.reject(new errors_1.InvalidArgumentError("Devices not found: " + missingIds.join(', ')));
}
return new Promise(function (resolve) {
resolve(_this._beforeChange(_this._name, deviceIds));
}).then(function () {
_this._activeDevices.clear();
devices.forEach(_this._activeDevices.add, _this._activeDevices);
});
};
/**
* Test the devices by playing audio through them.
* @param [soundUrl] - An optional URL. If none is specified, we will
* play a default test tone.
* @returns Resolves with the result of the underlying HTMLAudioElements' play() calls.
*/
OutputDeviceCollection.prototype.test = function (soundUrl) {
if (soundUrl === void 0) { soundUrl = DEFAULT_TEST_SOUND_URL; }
if (!this._isSupported) {
return Promise.reject(new errors_1.NotSupportedError('This browser does not support audio output selection'));
}
if (!this._activeDevices.size) {
return Promise.reject(new errors_1.InvalidStateError('No active output devices to test'));
}
return Promise.all(Array.from(this._activeDevices).map(function (device) {
var el;
// (rrowland) We need to wait for the oncanplay event because of a regression introduced
// in Chrome M72: https://bugs.chromium.org/p/chromium/issues/detail?id=930876
return new Promise(function (resolve) {
el = new Audio(soundUrl);
el.oncanplay = resolve;
}).then(function () { return el.setSinkId(device.deviceId).then(function () { return el.play(); }); });
}));
};
return OutputDeviceCollection;
}());
exports.default = OutputDeviceCollection;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3V0cHV0ZGV2aWNlY29sbGVjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi90d2lsaW8vb3V0cHV0ZGV2aWNlY29sbGVjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBOzs7R0FHRztBQUNILHlDQUE4QztBQUM5QyxtQ0FBc0Y7QUFDdEYsSUFBTSxzQkFBc0IsR0FBTSwyQkFBZSxrQkFBZSxDQUFDO0FBRWpFOzs7R0FHRztBQUNIO0lBTUU7O09BRUc7SUFDSCxnQ0FBb0IsS0FBYSxFQUNiLGlCQUErQyxFQUMvQyxhQUFpRSxFQUNqRSxZQUFxQjtRQUhyQixVQUFLLEdBQUwsS0FBSyxDQUFRO1FBQ2Isc0JBQWlCLEdBQWpCLGlCQUFpQixDQUE4QjtRQUMvQyxrQkFBYSxHQUFiLGFBQWEsQ0FBb0Q7UUFDakUsaUJBQVksR0FBWixZQUFZLENBQVM7UUFYekM7O1dBRUc7UUFDSyxtQkFBYyxHQUF5QixJQUFJLEdBQUcsRUFBRSxDQUFDO0lBUVosQ0FBQztJQUU5Qzs7Ozs7O09BTUc7SUFDSCx1Q0FBTSxHQUFOLFVBQU8sTUFBdUI7UUFDNUIsSUFBTSxVQUFVLEdBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUVuRSxJQUFNLGFBQWEsR0FBb0IsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUM7ZUFDdkUsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVwRCxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLElBQUksYUFBYSxFQUFFO1lBQzlDLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1NBQ3hDO1FBRUQsMkVBQTJFO1FBQzNFLG1CQUFtQjtRQUNuQixJQUFN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