{"version":3,"file":"index.cjs","sources":["../src/MockBaseAudioContext.ts","../src/utils/math/clamp.ts","../src/MockAudioContext.ts","../src/MockAudioNode.ts","../src/MockAudioParam.ts","../src/MockDelayNode.ts","../src/MockGainNode.ts","../src/MockOfflineAudioContext.ts","../src/MWAA.ts"],"sourcesContent":["export class MockBaseAudioContext extends EventTarget implements Omit<BaseAudioContext,\n// BaseAudioContext\n| 'audioWorklet'\n| 'destination'\n| 'listener'\n| 'onstatechange'\n| 'createAnalyser'\n| 'createBiquadFilter'\n| 'createBuffer'\n| 'createBufferSource'\n| 'createChannelMerger'\n| 'createChannelSplitter'\n| 'createConstantSource'\n| 'createConvolver'\n| 'createDelay'\n| 'createDynamicsCompressor'\n| 'createGain'\n| 'createIIRFilter'\n| 'createOscillator'\n| 'createPanner'\n| 'createPeriodicWave'\n| 'createScriptProcessor'\n| 'createStereoPanner'\n| 'createWaveShaper'\n| 'decodeAudioData'\n> {\n\tprotected static _isValidSampleRateValue(sampleRate: unknown): boolean {\n\t\tif (!Number.isFinite(sampleRate) || typeof sampleRate !== 'number') {\n\t\t\treturn false\n\t\t}\n\n\t\treturn sampleRate >= MockBaseAudioContext._sampleRateMin && sampleRate <= MockBaseAudioContext._sampleRateMax\n\t}\n\n\tprivate static _currentTimeDefault: number = 0\n\tprivate static _sampleRateDefault: number = 44100\n\tprivate static _sampleRateMin: number = 8000 // Min sample rate guaranteed by all user-agents https://developer.mozilla.org/en-US/docs/Web/API/AudioContext/AudioContext\n\tprivate static _sampleRateMax: number = 96000 // Max sample rate guaranteed by all user-agents https://developer.mozilla.org/en-US/docs/Web/API/AudioContext/AudioContext\n\n\tpublic get currentTime(): number {\n\t\treturn MockBaseAudioContext._currentTimeDefault\n\t}\n\n\tprivate set currentTime(currentTime: number) {} // Prevents direct modifications\n\n\tpublic get state(): AudioContextState {\n\t\treturn this._state\n\t}\n\n\tprivate set state(state: AudioContextState) {} // Prevents direct modifications\n\n\tpublic get sampleRate(): number {\n\t\treturn this._sampleRate\n\t}\n\n\tprivate set sampleRate(sampleRate: number) {} // Prevents direct modifications\n\n\tprotected _state: AudioContextState\n\tprivate _sampleRate: number\n\n\tprotected constructor(\n\t\tstate: AudioContextState,\n\t\tsampleRate: number = MockBaseAudioContext._sampleRateDefault,\n\t) {\n\t\tsuper()\n\n\t\tif (new.target === MockBaseAudioContext) {\n\t\t\tthrow new TypeError('Illegal constructor')\n\t\t}\n\n\t\tif (!MockBaseAudioContext._isValidSampleRateValue(sampleRate)) {\n\t\t\tconst targetName: string = new.target.name.replace('Mock', '')\n\t\t\t// DOMException\n\t\t\tthrow new Error(`Failed to construct '${targetName}': The sample rate provided (${sampleRate}) is outside the range [${MockBaseAudioContext._sampleRateMin}, ${MockBaseAudioContext._sampleRateMax}]`)\n\t\t}\n\n\t\tthis._state = state\n\t\tthis._sampleRate = sampleRate\n\t}\n\n\t// eslint-disable-next-line no-warning-comments\n\t// TODO: try this approach\n\t// protected _setState(state: AudioContextState): void {\n\t// \tthis._state = state\n\t// \tthis.dispatchEvent(new Event('statechange'))\n\t// }\n\n\t// eslint-disable-next-line no-warning-comments\n\t// TODO: test\n\t// public addEventListener<K extends keyof BaseAudioContextEventMap>(type: K, listener: (this: BaseAudioContext, ev: BaseAudioContextEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void {\n\t// \tsuper.addEventListener(type, listener, options)\n\t// }\n\n\t// eslint-disable-next-line no-warning-comments\n\t// TODO: test\n\t// public removeEventListener<K extends keyof BaseAudioContextEventMap>(type: K, listener: (this: BaseAudioContext, ev: BaseAudioContextEventMap[K]) => any, options?: boolean | EventListenerOptions): void {\n\t// \tsuper.removeEventListener(type, listener, options)\n\t// }\n}\n","export const clamp = (value: number, min: number, max: number): number => {\n\tif (min > max) {\n\t\tthrow new TypeError(`min cannot be more than max, but received min: ${min}, max: ${max}`)\n\t}\n\n\treturn Math.max(min, Math.min(value, max))\n}\n","import {MockBaseAudioContext} from './MockBaseAudioContext'\nimport {clamp} from './utils/math/clamp'\n\ntype LatencyHint = AudioContextLatencyCategory | number\n\nexport class MockAudioContext extends MockBaseAudioContext implements Omit<AudioContext,\n// BaseAudioContext\n| 'audioWorklet'\n| 'destination'\n| 'listener'\n| 'onstatechange'\n| 'createAnalyser'\n| 'createBiquadFilter'\n| 'createBuffer'\n| 'createBufferSource'\n| 'createChannelMerger'\n| 'createChannelSplitter'\n| 'createConstantSource'\n| 'createConvolver'\n| 'createDelay'\n| 'createDynamicsCompressor'\n| 'createGain'\n| 'createIIRFilter'\n| 'createOscillator'\n| 'createPanner'\n| 'createPeriodicWave'\n| 'createScriptProcessor'\n| 'createStereoPanner'\n| 'createWaveShaper'\n| 'decodeAudioData'\n// AudioContext\n| 'close'\n| 'createMediaElementSource'\n| 'createMediaStreamDestination'\n| 'createMediaStreamSource'\n| 'getOutputTimestamp'\n| 'suspend'\n| 'resume'\n> {\n\tprivate static _defaultLatencyHint: AudioContextLatencyCategory | number = 'interactive'\n\tprivate static _baseLatencyMin: number = 0.0001\n\tprivate static _baseLatencyMax: number = 0.5000\n\tprivate static _outputLatencyMin: number = 0.002\n\tprivate static _outputLatencyMax: number = 0.9999\n\tprivate static _baseLatencyForPlaybackHint: number = 0.025\n\tprivate static _baseLatencyForBalancedHint: number = 0.011\n\tprivate static _baseLatencyForInteractiveHint: number = 0.005\n\tprivate static _outputLatencyForPlaybackHint: number = 0.051\n\tprivate static _outputLatencyForBalancedHint: number = 0.022\n\tprivate static _outputLatencyForInteractiveHint: number = 0.009\n\n\tprivate static _validateLatencyHint(latencyHint: LatencyHint): void {\n\t\tif (typeof latencyHint === 'number') {\n\t\t\treturn\n\t\t}\n\n\t\tif (latencyHint === 'balanced' || latencyHint === 'interactive' || latencyHint === 'playback') {\n\t\t\treturn\n\t\t}\n\n\t\t// eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n\t\tthrow new TypeError(`Failed to construct 'AudioContext': Failed to read the 'latencyHint' property from 'AudioContextOptions': The provided value ${latencyHint} is not a valid enum value of type AudioContextLatencyCategory.`)\n\t}\n\n\tprivate static _getBaseLatencyForHint(latencyHint: LatencyHint): number {\n\t\tif (typeof latencyHint === 'number') {\n\t\t\treturn clamp(latencyHint, MockAudioContext._baseLatencyMin, MockAudioContext._baseLatencyMax)\n\t\t}\n\n\t\tif (latencyHint === 'playback') {\n\t\t\treturn MockAudioContext._baseLatencyForPlaybackHint\n\t\t}\n\n\t\tif (latencyHint === 'balanced') {\n\t\t\treturn MockAudioContext._baseLatencyForBalancedHint\n\t\t}\n\n\t\treturn MockAudioContext._baseLatencyForInteractiveHint\n\t}\n\n\tprivate static _getOutputLatencyForHint(latencyHint: LatencyHint): number {\n\t\tif (typeof latencyHint === 'number') {\n\t\t\treturn clamp(latencyHint * 2, MockAudioContext._outputLatencyMin, MockAudioContext._outputLatencyMax)\n\t\t}\n\n\t\tif (latencyHint === 'playback') {\n\t\t\treturn MockAudioContext._outputLatencyForPlaybackHint\n\t\t}\n\n\t\tif (latencyHint === 'balanced') {\n\t\t\treturn MockAudioContext._outputLatencyForBalancedHint\n\t\t}\n\n\t\treturn MockAudioContext._outputLatencyForInteractiveHint\n\t}\n\n\tpublic get baseLatency(): number {\n\t\treturn this._baseLatency\n\t}\n\n\tprivate set baseLatency(baseLatency: number) {} // Prevents direct modifications\n\n\tpublic get outputLatency(): number {\n\t\treturn this._outputLatency\n\t}\n\n\tprivate set outputLatency(outputLatency: number) {} // Prevents direct modifications\n\n\tprivate _baseLatency: number\n\tprivate _outputLatency: number\n\n\tconstructor(options?: AudioContextOptions) {\n\t\t// eslint-disable-next-line no-warning-comments\n\t\t// TODO: in the future Autoplay policy behaviour can also be simulated,\n\t\t// so the context might also equal to `suspended` by default:\n\t\t// https://developer.mozilla.org/en-US/docs/Web/API/Web_Audio_API/Best_practices#autoplay_policy\n\t\tconst state: AudioContextState = 'running'\n\n\t\tsuper(state, options?.sampleRate)\n\n\t\tconst latencyHint: LatencyHint = options?.latencyHint ?? MockAudioContext._defaultLatencyHint\n\t\tMockAudioContext._validateLatencyHint(latencyHint)\n\n\t\tthis._baseLatency = MockAudioContext._getBaseLatencyForHint(latencyHint)\n\t\tthis._outputLatency = MockAudioContext._getOutputLatencyForHint(latencyHint)\n\t}\n}\n","type MockAudioNodeOptions = AudioNodeOptions & {\n\tcontext?: BaseAudioContext;\n\tnumberOfInputs: number;\n\tnumberOfOutputs: number;\n}\n\nexport class MockAudioNode implements Omit<AudioNode,\n| 'connect'\n| 'disconnect'\n| 'addEventListener'\n| 'removeEventListener'\n| 'dispatchEvent'\n> {\n\tpublic get channelCount(): number {\n\t\treturn this._channelCount\n\t}\n\n\tpublic set channelCount(channelCount: number) {\n\t\tif (!MockAudioNode._isValidChannelCount(channelCount)) {\n\t\t\t// DOMException\n\t\t\tthrow new Error(`Failed to set the 'channelCount' property on 'AudioNode': ${MockAudioNode._getChannelCountErrorMessage(channelCount)}`)\n\t\t}\n\n\t\tthis._channelCount = channelCount\n\t}\n\n\tpublic get channelCountMode(): ChannelCountMode {\n\t\treturn this._channelCountMode\n\t}\n\n\tpublic set channelCountMode(channelCountMode: ChannelCountMode) {\n\t\tif (!MockAudioNode._isValidChannelCountMode(channelCountMode)) {\n\t\t\t// No error throw this time, but just a warning\n\t\t\tconsole.warn(MockAudioNode._getChannelCountModeErrorMessage(channelCountMode))\n\t\t\treturn\n\t\t}\n\n\t\tthis._channelCountMode = channelCountMode\n\t}\n\n\tpublic get channelInterpretation(): ChannelInterpretation {\n\t\treturn this._channelInterpretation\n\t}\n\n\tpublic set channelInterpretation(channelInterpretation: ChannelInterpretation) {\n\t\tif (!MockAudioNode._isValidChannelInterpretation(channelInterpretation)) {\n\t\t\t// No error throw this time, but just a warning\n\t\t\tconsole.warn(MockAudioNode._getChannelInterpretationErrorMessage(channelInterpretation))\n\t\t\treturn\n\t\t}\n\n\t\tthis._channelInterpretation = channelInterpretation\n\t}\n\n\tprivate static _channelCountDefault: number = 2\n\tprivate static _channelCountMin: number = 1\n\tprivate static _channelCountMax: number = 32\n\tprivate static _channelCountModeDefault: ChannelCountMode = 'max'\n\tprivate static _channelInterpretationDefault: ChannelInterpretation = 'speakers'\n\n\tprivate static _isValidChannelCount(channelCount: number): boolean {\n\t\treturn !Number.isNaN(Number(channelCount)) && channelCount >= MockAudioNode._channelCountMin && channelCount <= MockAudioNode._channelCountMax\n\t}\n\n\tprivate static _isValidChannelCountMode(channelCountMode: ChannelCountMode): boolean {\n\t\treturn channelCountMode === 'clamped-max' || channelCountMode === 'explicit' || channelCountMode === 'max'\n\t}\n\n\tprivate static _isValidChannelInterpretation(channelInterpretation: ChannelInterpretation): boolean {\n\t\treturn channelInterpretation === 'discrete' || channelInterpretation === 'speakers'\n\t}\n\n\tprivate static _getChannelCountErrorMessage(channelCount: number): string {\n\t\treturn `The channel count provided (${channelCount}) is outside the range [${MockAudioNode._channelCountMin}, ${MockAudioNode._channelCountMax}]`\n\t}\n\n\tprivate static _getChannelCountModeErrorMessage(channelCountMode: ChannelCountMode): string {\n\t\treturn `The provided value '${channelCountMode}' is not a valid enum value of type ChannelCountMode.`\n\t}\n\n\tprivate static _getChannelInterpretationErrorMessage(channelInterpretation: ChannelInterpretation): string {\n\t\treturn `The provided value '${channelInterpretation}' is not a valid enum value of type ChannelInterpretation.`\n\t}\n\n\tpublic get context(): BaseAudioContext {\n\t\treturn this._context\n\t}\n\n\tprivate set context(context: BaseAudioContext) {} // Prevent modifications\n\n\tpublic get numberOfInputs(): number {\n\t\treturn this._numberOfInputs\n\t}\n\n\tprivate set numberOfInputs(numberOfInputs: number) {} // Prevent modifications\n\n\tpublic get numberOfOutputs(): number {\n\t\treturn this._numberOfOutputs\n\t}\n\n\tprivate set numberOfOutputs(numberOfOutputs: number) {} // Prevent modifications\n\n\tprivate _numberOfInputs: number\n\tprivate _numberOfOutputs: number\n\tprivate _context: BaseAudioContext\n\tprivate _channelCount: number\n\tprivate _channelCountMode: ChannelCountMode\n\tprivate _channelInterpretation: ChannelInterpretation\n\n\tprotected constructor(options: MockAudioNodeOptions) {\n\t\tif (new.target === MockAudioNode) {\n\t\t\tthrow new TypeError('Illegal constructor')\n\t\t}\n\n\t\tconst mockTargetName: string = new.target.name\n\t\tconst targetName: string = mockTargetName.replace('Mock', '')\n\n\t\tconst context: BaseAudioContext | undefined = options?.context\n\t\tconst numberOfInputs: number = options?.numberOfInputs\n\t\tconst numberOfOutputs: number = options?.numberOfOutputs\n\t\tconst channelCount: number = options?.channelCount ?? MockAudioNode._channelCountDefault\n\t\tconst channelCountMode: ChannelCountMode = options?.channelCountMode ?? MockAudioNode._channelCountModeDefault\n\t\tconst channelInterpretation: ChannelInterpretation = options?.channelInterpretation ?? MockAudioNode._channelInterpretationDefault\n\n\t\tif (!(context instanceof BaseAudioContext)) {\n\t\t\tthrow new TypeError(`Failed to construct '${targetName}': parameter 1 is not of type 'BaseAudioContext'`)\n\t\t}\n\n\t\tif (!MockAudioNode._isValidChannelCount(channelCount)) {\n\t\t\tthrow new TypeError(`Failed to construct '${targetName}': ${MockAudioNode._getChannelCountErrorMessage(channelCount)}`)\n\t\t}\n\n\t\tif (!MockAudioNode._isValidChannelCountMode(channelCountMode)) {\n\t\t\tthrow new TypeError(`Failed to construct '${targetName}': Failed to read the 'channelCountMode' property from 'AudioNodeOptions': ${MockAudioNode._getChannelCountModeErrorMessage(channelCountMode)}`)\n\t\t}\n\n\t\tif (!MockAudioNode._isValidChannelInterpretation(channelInterpretation)) {\n\t\t\tthrow new TypeError(`Failed to construct '${targetName}': Failed to read the 'channelInterpretation' property from 'AudioNodeOptions': ${MockAudioNode._getChannelInterpretationErrorMessage(channelInterpretation)}`)\n\t\t}\n\n\t\tthis._context = context\n\t\tthis._numberOfInputs = numberOfInputs\n\t\tthis._numberOfOutputs = numberOfOutputs\n\t\tthis._channelCount = channelCount\n\t\tthis._channelCountMode = channelCountMode\n\t\tthis._channelInterpretation = channelInterpretation\n\t}\n}\n","import {clamp} from './utils/math/clamp'\n\ntype MockAudioParamOptions = {\n\tautomationRate: AutomationRate;\n\tdefaultValue: number;\n\tminValue: number;\n\tmaxValue: number;\n\tvalue?: number;\n}\n\nexport class MockAudioParam implements Omit<AudioParam,\n| 'cancelAndHoldAtTime'\n| 'cancelScheduledValues'\n| 'exponentialRampToValueAtTime'\n| 'linearRampToValueAtTime'\n| 'setTargetAtTime'\n| 'setValueAtTime'\n| 'setValueCurveAtTime'\n> {\n\tpublic get automationRate(): AutomationRate {\n\t\treturn this._automationRate\n\t}\n\n\tpublic set automationRate(automationRate: AutomationRate) {\n\t\tif (!MockAudioParam._isValidAutomationRate(automationRate)) {\n\t\t\t// eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n\t\t\tconsole.warn(`The provided value '${automationRate}' is not a valid enum value of type AutomationRate.`)\n\t\t\treturn\n\t\t}\n\n\t\tthis._automationRate = automationRate\n\t}\n\n\tpublic get value(): number {\n\t\treturn this._value\n\t}\n\n\tpublic set value(value: number) {\n\t\tif (!MockAudioParam._isValidValue(value)) {\n\t\t\tthrow new TypeError('Failed to set the \\'value\\' property on \\'AudioParam\\': The provided float value is non-finite.')\n\t\t}\n\n\t\tif (!this._isValueInRange(value)) {\n\t\t\tconsole.warn(`value ${value} outside nominal range [${this.minValue}, ${this.maxValue}]; value will be clamped`)\n\t\t\tthis._value = clamp(value, this.minValue, this.maxValue)\n\t\t\treturn\n\t\t}\n\n\t\tthis._value = value\n\t}\n\n\tpublic get defaultValue(): number {\n\t\treturn this._defaultValue\n\t}\n\n\tprivate set defaultValue(defaultValue: number) {} // Prevent modifications\n\n\tpublic get minValue(): number {\n\t\treturn this._minValue\n\t}\n\n\tprivate set minValue(minValue: number) {} // Prevent modifications\n\n\tpublic get maxValue(): number {\n\t\treturn this._maxValue\n\t}\n\n\tprivate set maxValue(maxValue: number) {} // Prevent modifications\n\n\tprivate static _isValidAutomationRate(automationRate: AutomationRate | undefined): automationRate is AutomationRate {\n\t\treturn automationRate === 'a-rate' || automationRate === 'k-rate'\n\t}\n\n\tprivate static _isValidValue(value: unknown): value is number {\n\t\t// Web Audio API not only checks number type but also makes sure that it's finite, so values like \"Infinity\" are invalid\n\t\treturn Number.isFinite(value)\n\t}\n\n\tprivate _automationRate: AutomationRate\n\tprivate _value: number\n\tprivate _defaultValue: number\n\tprivate _minValue: number\n\tprivate _maxValue: number\n\n\tprotected constructor(options: MockAudioParamOptions) {\n\t\tif (new.target === MockAudioParam) {\n\t\t\tthrow new TypeError('Illegal constructor')\n\t\t}\n\n\t\tconst automationRate: AutomationRate = options?.automationRate\n\t\tconst defaultValue: number = options?.defaultValue\n\t\tconst minValue: number = options?.minValue\n\t\tconst maxValue: number = options?.maxValue\n\t\tconst value: number = options?.value ?? defaultValue\n\n\t\tif (!MockAudioParam._isValidValue(value)) {\n\t\t\tthrow new TypeError('The provided float value is non-finite')\n\t\t}\n\n\t\tthis._automationRate = automationRate\n\t\tthis._defaultValue = defaultValue\n\t\tthis._minValue = minValue\n\t\tthis._maxValue = maxValue\n\t\tthis._value = value\n\t\tthis.value = value // This will clamp the value & log warning (if that's the case)\n\t}\n\n\tprivate _isValueInRange(value: number): boolean {\n\t\treturn this.minValue <= value && value <= this.maxValue\n\t}\n}\n","import {MockAudioNode} from './MockAudioNode'\nimport {MockAudioParam} from './MockAudioParam'\n\nclass MockDelayTimeAudioParam extends MockAudioParam {\n\tconstructor({\n\t\tdelayTime,\n\t\tmaxDelayTime,\n\t}: {\n\t\tdelayTime: number;\n\t\tmaxDelayTime: number;\n\t}) {\n\t\tsuper({\n\t\t\tautomationRate: 'a-rate',\n\t\t\tdefaultValue: 0,\n\t\t\tminValue: 0,\n\t\t\tmaxValue: maxDelayTime,\n\t\t\tvalue: delayTime,\n\t\t})\n\t}\n}\n\nexport class MockDelayNode extends MockAudioNode implements Omit<DelayNode,\n// EventTarget\n| 'addEventListener'\n| 'removeEventListener'\n| 'dispatchEvent'\n// AudioNode\n| 'connect'\n| 'disconnect'\n// DelayNode\n| 'delayTime' // To be deleted once MockAudioParam implements everything from AudioParam\n> {\n\tprivate static _maxDelayTimeMin: number = 0\n\tprivate static _maxDelayTimeMax: number = 180 // https://chromium.googlesource.com/chromium/blink/+/refs/heads/main/Source/modules/webaudio/DelayNode.cpp#38\n\n\tpublic get delayTime(): MockAudioParam {\n\t\treturn this._delayTime\n\t}\n\n\tprivate set delayTime(delayTime: MockAudioParam) {} // Prevents modifications\n\n\tprivate _delayTime: MockAudioParam\n\n\tconstructor(context: BaseAudioContext, options: DelayOptions = {}) {\n\t\tconst {\n\t\t\tchannelCount,\n\t\t\tchannelCountMode,\n\t\t\tchannelInterpretation,\n\t\t\tdelayTime = 0,\n\t\t\tmaxDelayTime = 1,\n\t\t}: DelayOptions = options\n\n\t\tif (!Number.isFinite(maxDelayTime)) {\n\t\t\tthrow new TypeError('Failed to construct \\'DelayNode\\': Failed to read the \\'maxDelayTime\\' property from \\'DelayOptions\\': The provided double value is non-finite.')\n\t\t}\n\n\t\t// The range is not inclusive\n\t\t// https://chromium.googlesource.com/chromium/blink/+/refs/heads/main/Source/modules/webaudio/DelayNode.cpp#49\n\t\tif (maxDelayTime <= MockDelayNode._maxDelayTimeMin || maxDelayTime >= MockDelayNode._maxDelayTimeMax) {\n\t\t\t// DOMException\n\t\t\tthrow new Error(`Failed to construct 'DelayNode': The max delay time provided (${maxDelayTime}) is outside the range (${MockDelayNode._maxDelayTimeMin}, ${MockDelayNode._maxDelayTimeMax})`)\n\t\t}\n\n\t\tsuper({\n\t\t\tnumberOfInputs: 1,\n\t\t\tnumberOfOutputs: 1,\n\t\t\tcontext,\n\t\t\tchannelCount,\n\t\t\tchannelCountMode,\n\t\t\tchannelInterpretation,\n\t\t})\n\n\t\tthis._delayTime = new MockDelayTimeAudioParam({\n\t\t\tdelayTime,\n\t\t\tmaxDelayTime,\n\t\t})\n\t}\n}\n","import {MockAudioNode} from './MockAudioNode'\nimport {MockAudioParam} from './MockAudioParam'\n\nclass MockGainAudioParam extends MockAudioParam {\n\tconstructor(gain?: number) {\n\t\tsuper({\n\t\t\tautomationRate: 'a-rate',\n\t\t\tdefaultValue: 1,\n\t\t\tminValue: -3.4028234663852886e+38,\n\t\t\tmaxValue: +3.4028234663852886e+38,\n\t\t\tvalue: gain,\n\t\t})\n\t}\n}\n\nexport class MockGainNode extends MockAudioNode implements Omit<GainNode,\n// EventTarget\n| 'addEventListener'\n| 'removeEventListener'\n| 'dispatchEvent'\n// AudioNode\n| 'connect'\n| 'disconnect'\n// GainNode\n| 'gain' // To be deleted once MockAudioParam implements everything from AudioParam\n> {\n\tpublic get gain(): MockAudioParam {\n\t\treturn this._gain\n\t}\n\n\tprivate set gain(gain: MockAudioParam) {} // Prevents modifications\n\n\tprivate _gain: MockAudioParam\n\n\tconstructor(context: BaseAudioContext, options: GainOptions = {}) {\n\t\tconst {\n\t\t\tchannelCount,\n\t\t\tchannelCountMode,\n\t\t\tchannelInterpretation,\n\t\t\tgain,\n\t\t}: GainOptions = options\n\n\t\tsuper({\n\t\t\tnumberOfInputs: 1,\n\t\t\tnumberOfOutputs: 1,\n\t\t\tcontext,\n\t\t\tchannelCount,\n\t\t\tchannelCountMode,\n\t\t\tchannelInterpretation,\n\t\t})\n\n\t\tthis._gain = new MockGainAudioParam(gain)\n\t}\n}\n","import {MockBaseAudioContext} from './MockBaseAudioContext'\n\nexport class MockOfflineAudioContext extends MockBaseAudioContext implements Omit<OfflineAudioContext,\n// BaseAudioContext\n| 'audioWorklet'\n| 'destination'\n| 'listener'\n| 'onstatechange'\n| 'createAnalyser'\n| 'createBiquadFilter'\n| 'createBuffer'\n| 'createBufferSource'\n| 'createChannelMerger'\n| 'createChannelSplitter'\n| 'createConstantSource'\n| 'createConvolver'\n| 'createDelay'\n| 'createDynamicsCompressor'\n| 'createGain'\n| 'createIIRFilter'\n| 'createOscillator'\n| 'createPanner'\n| 'createPeriodicWave'\n| 'createScriptProcessor'\n| 'createStereoPanner'\n| 'createWaveShaper'\n| 'decodeAudioData'\n// OfflineAudioContext\n| 'oncomplete'\n| 'resume'\n| 'startRendering'\n| 'suspend'\n> {\n\tpublic get length(): number {\n\t\treturn this._length\n\t}\n\n\tpublic set length(length: number) {} // Prevents modifications\n\n\tprivate static _numberOfChannelsDefault: number = 1\n\tprivate static _numberOfChannelsMin: number = 1\n\tprivate static _numberOfChannelsMax: number = 32\n\tprivate static _lengthMin: number = 1\n\n\tprivate static _validateNumberOfChannels(numberOfChannels: number): void {\n\t\tif (!Number.isFinite(numberOfChannels) || numberOfChannels < MockOfflineAudioContext._numberOfChannelsMin || numberOfChannels > MockOfflineAudioContext._numberOfChannelsMax) {\n\t\t\t// DOMException\n\t\t\tthrow new Error(`Failed to construct 'OfflineAudioContext': The number of channels provided (${numberOfChannels}) is outside the range [${MockOfflineAudioContext._numberOfChannelsMin}, ${MockOfflineAudioContext._numberOfChannelsMax}]`)\n\t\t}\n\t}\n\n\tprivate static _validateLength(length: number): void {\n\t\tif (!Number.isFinite(length) || length < MockOfflineAudioContext._lengthMin) {\n\t\t\t// DOMException\n\t\t\tthrow new Error(`Failed to construct 'OfflineAudioContext': The number of frames provided (${length}) is less than the minimum bound (${MockOfflineAudioContext._lengthMin})`)\n\t\t}\n\t}\n\n\tprivate static _validateSampleRate(sampleRate: number): void {\n\t\tif (!MockBaseAudioContext._isValidSampleRateValue(sampleRate)) {\n\t\t\tthrow new TypeError('Failed to construct \\'OfflineAudioContext\\': The provided float value is non-finite')\n\t\t}\n\t}\n\n\tprivate _length: number\n\n\tconstructor(contextOptions: OfflineAudioContextOptions)\n\tconstructor(numberOfChannels: number, length: number, sampleRate: number)\n\tconstructor(...args: [OfflineAudioContextOptions] | [number, number, number]) {\n\t\tconst state: AudioContextState = 'suspended'\n\n\t\tif (args.length === 1) {\n\t\t\tconst contextOptions: OfflineAudioContextOptions = args[0]\n\t\t\tconst numberOfChannels: number = contextOptions?.numberOfChannels ?? MockOfflineAudioContext._numberOfChannelsDefault\n\t\t\tconst length: number = contextOptions?.length\n\t\t\tconst sampleRate: number = contextOptions?.sampleRate\n\t\t\tMockOfflineAudioContext._validateNumberOfChannels(numberOfChannels)\n\t\t\tMockOfflineAudioContext._validateLength(length)\n\t\t\tMockOfflineAudioContext._validateSampleRate(sampleRate)\n\t\t\tsuper(state, sampleRate)\n\t\t\tthis._length = length\n\t\t\treturn\n\t\t}\n\n\t\tif (args.length >= 3) {\n\t\t\tconst [numberOfChannels, length, sampleRate]: [number, number, number] = args\n\t\t\tMockOfflineAudioContext._validateNumberOfChannels(numberOfChannels)\n\t\t\tMockOfflineAudioContext._validateLength(length)\n\t\t\tMockOfflineAudioContext._validateSampleRate(sampleRate)\n\t\t\tsuper(state, sampleRate)\n\t\t\tthis._length = length\n\t\t\treturn\n\t\t}\n\n\t\tif (!args.length) {\n\t\t\tthrow new TypeError('Failed to construct \\'OfflineAudioContext\\': 1 argument required, but only 0 present')\n\t\t}\n\n\t\t// eslint-disable-next-line no-warning-comments\n\t\t// TODO: figure out why this warns in c8 coverage though it's tested in \"throws if 2 arguments passed\" test\n\t\tthrow new TypeError('Failed to construct \\'OfflineAudioContext\\': Overload resolution failed.')\n\t}\n}\n","import {type ModuleName} from './types'\nimport {MockAudioContext} from './MockAudioContext'\nimport {MockAudioNode} from './MockAudioNode'\nimport {MockAudioParam} from './MockAudioParam'\nimport {MockBaseAudioContext} from './MockBaseAudioContext'\nimport {MockDelayNode} from './MockDelayNode'\nimport {MockGainNode} from './MockGainNode'\nimport {MockOfflineAudioContext} from './MockOfflineAudioContext'\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport class MWAA {\n\tpublic static mock(): void {\n\t\tif (MWAA._isMocked) {\n\t\t\tthrow new Error('[MWAA] already using mocked version of Web Audio API')\n\t\t}\n\n\t\tMWAA._mock('AudioContext', MockAudioContext as unknown as AudioContext, MWAA._originalAudioContext)\n\t\tMWAA._mock('AudioNode', MockAudioNode as unknown as AudioNode, MWAA._originalAudioNode)\n\t\tMWAA._mock('AudioParam', MockAudioParam as unknown as AudioParam, MWAA._originalAudioParam)\n\t\tMWAA._mock('BaseAudioContext', MockBaseAudioContext as unknown as BaseAudioContext, MWAA._originalBaseAudioContext)\n\t\tMWAA._mock('DelayNode', MockDelayNode as unknown as DelayNode, MWAA._originalDelayNode)\n\t\tMWAA._mock('GainNode', MockGainNode as unknown as GainNode, MWAA._originalGainNode)\n\t\tMWAA._mock('OfflineAudioContext', MockOfflineAudioContext as unknown as OfflineAudioContext, MWAA._originalOfflineAudioContext)\n\n\t\tMWAA._isMocked = true\n\t}\n\n\tpublic static unmock(): void {\n\t\tif (!MWAA._isMocked) {\n\t\t\tthrow new Error('[MWAA] already using the original version of Web Audio API')\n\t\t}\n\n\t\tMWAA._unmock('AudioContext', MWAA._originalAudioContext)\n\t\tMWAA._unmock('AudioNode', MWAA._originalAudioNode)\n\t\tMWAA._unmock('AudioParam', MWAA._originalAudioParam)\n\t\tMWAA._unmock('BaseAudioContext', MWAA._originalBaseAudioContext)\n\t\tMWAA._unmock('DelayNode', MWAA._originalDelayNode)\n\t\tMWAA._unmock('GainNode', MWAA._originalGainNode)\n\t\tMWAA._unmock('OfflineAudioContext', MWAA._originalOfflineAudioContext)\n\n\t\tMWAA._isMocked = false\n\t}\n\n\tprivate static _isMocked: boolean = false\n\tprivate static _originalAudioContext: AudioContext\n\tprivate static _originalAudioNode: AudioNode\n\tprivate static _originalAudioParam: AudioParam\n\tprivate static _originalBaseAudioContext: BaseAudioContext\n\tprivate static _originalDelayNode: DelayNode\n\tprivate static _originalGainNode: GainNode\n\tprivate static _originalOfflineAudioContext: OfflineAudioContext\n\n\tprivate static _mock<T>(\n\t\tname: ModuleName,\n\t\tmock: T,\n\t\ttemp: T,\n\t): void {\n\t\ttemp = globalThis[name] as T\n\t\t(globalThis[name] as T) = mock\n\t}\n\n\tprivate static _unmock<T>(\n\t\tname: ModuleName,\n\t\ttemp: T,\n\t): void {\n\t\t(globalThis[name] as T) = temp\n\t}\n}\n"],"names":[],"mappings":"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"}