@fakes/media-devices
Version:
A interactive fake implementation of MediaDevices interface in the browser for testing
142 lines (141 loc) • 5.98 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.scenarios = exports.forgeMediaDevices = exports.allAccessDenied = exports.allAccessGranted = exports.stillHaveToAskForDeviceAccess = exports.RequestedMediaInput = exports.anySpeaker = exports.anyDevice = exports.anyCamera = exports.anyMicrophone = void 0;
var DeviceMother_1 = require("./DeviceMother");
Object.defineProperty(exports, "anyMicrophone", { enumerable: true, get: function () { return DeviceMother_1.anyMicrophone; } });
Object.defineProperty(exports, "anyCamera", { enumerable: true, get: function () { return DeviceMother_1.anyCamera; } });
Object.defineProperty(exports, "anyDevice", { enumerable: true, get: function () { return DeviceMother_1.anyDevice; } });
Object.defineProperty(exports, "anySpeaker", { enumerable: true, get: function () { return DeviceMother_1.anySpeaker; } });
var UserConsentTracker_1 = require("./UserConsentTracker");
Object.defineProperty(exports, "RequestedMediaInput", { enumerable: true, get: function () { return UserConsentTracker_1.RequestedMediaInput; } });
const MediaDevicesFake_1 = require("./MediaDevicesFake");
const not_implemented_1 = require("./not-implemented");
const OpenMediaTracks_1 = require("./OpenMediaTracks");
const PermissionsFake_1 = require("./permissions/PermissionsFake");
const reporter_1 = require("./reporter");
const Scenarios_1 = require("./Scenarios");
const UserConsentTracker_2 = require("./UserConsentTracker");
const stillHaveToAskForDeviceAccess = (additional = {}) => {
return {
microphone: 'prompt',
camera: 'prompt',
...additional,
};
};
exports.stillHaveToAskForDeviceAccess = stillHaveToAskForDeviceAccess;
const allAccessGranted = (additional = {}) => {
return {
microphone: 'granted',
camera: 'granted',
...additional,
};
};
exports.allAccessGranted = allAccessGranted;
const allAccessDenied = (additional = {}) => {
return {
microphone: 'denied',
camera: 'denied',
...additional,
};
};
exports.allAccessDenied = allAccessDenied;
const forgeMediaDevices = (initial = {}) => {
const camera = initial.camera ?? 'prompt';
const microphone = initial.microphone ?? 'prompt';
const logLevel = initial.logLevel ?? 'off';
const reporter = logLevel === 'off' ? new reporter_1.NoopReporter() : new reporter_1.DefaultReporter();
const notImplemented = new not_implemented_1.ThrowingNotImplemented(reporter);
const context = {
notImplemented,
reporter,
};
const consentTracker = new UserConsentTracker_2.UserConsentTracker(context, { camera, microphone });
const openMediaTracks = new OpenMediaTracks_1.OpenMediaTracks();
const mediaDevicesFake = new MediaDevicesFake_1.MediaDevicesFake(context, consentTracker, openMediaTracks);
const permissionsFake = new PermissionsFake_1.PermissionsFake(context, consentTracker);
const attachedDevices = initial.attachedDevices ?? [];
attachedDevices.forEach((device) => mediaDevicesFake.attach(device));
const _setPermissionFor = (type, state) => {
consentTracker.setPermissionFor(type, state);
if (state === 'granted') {
return;
}
openMediaTracks.allFor(type).forEach((fake) => {
fake.permissionRevoked();
});
};
return new (class {
constructor() {
this._target = null;
this._mediaDevicesBackup = null;
this._permissionBackup = null;
}
get mediaDevices() {
return mediaDevicesFake;
}
get permissions() {
return permissionsFake;
}
installInto(target) {
this._target = target;
this._mediaDevicesBackup = target.navigator.mediaDevices;
this._permissionBackup = target.navigator.permissions;
Object.assign(this._target.navigator, { mediaDevices: mediaDevicesFake, permissions: permissionsFake });
}
uninstall() {
if (this._target === null) {
// nothing to restore
return;
}
Object.assign(this._target.navigator, {
mediaDevices: this._mediaDevicesBackup,
permissions: this._permissionBackup,
});
this._target = null;
this._mediaDevicesBackup = null;
this._permissionBackup = null;
}
attach(...toAdd) {
let array = toAdd;
if (toAdd.length === 1) {
const singleElement = toAdd[0];
if (Array.isArray(singleElement)) {
array = singleElement;
}
}
array.forEach((it) => mediaDevicesFake.attach(it));
}
remove(toRemove) {
if ('all' === toRemove) {
mediaDevicesFake.noDevicesAttached();
return;
}
mediaDevicesFake.remove(toRemove);
}
deviceAccessPrompt() {
return consentTracker.deviceAccessPrompt();
}
setPermissionFor(...permissionSetup) {
if (permissionSetup.length === 2) {
_setPermissionFor(...permissionSetup);
return;
}
const [{ camera, microphone }] = permissionSetup;
if (camera) {
_setPermissionFor('camera', camera);
}
if (microphone) {
_setPermissionFor('microphone', microphone);
}
}
})();
};
exports.forgeMediaDevices = forgeMediaDevices;
exports.scenarios = {
all: Scenarios_1.scenarios,
passUndefined: Scenarios_1.passUndefined,
existingDevice: Scenarios_1.existingDevice,
allConstraintsFalse: Scenarios_1.allConstraintsFalse,
requestedDeviceTypeNotAttached: Scenarios_1.requestedDeviceTypeNotAttached,
noDeviceWithDeviceId: Scenarios_1.noDeviceWithDeviceId,
};