UNPKG

@fakes/media-devices

Version:

A interactive fake implementation of MediaDevices interface in the browser for testing

142 lines (141 loc) 5.98 kB
"use strict"; 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, };