{"version":3,"sources":["jsdelivr-header.js","/npm/fpmk-capacitor-voice-recorder@6.5.6/dist/esm/definitions.js","/npm/fpmk-capacitor-voice-recorder@6.5.6/dist/esm/index.js","/npm/fpmk-capacitor-voice-recorder@6.5.6/dist/esm/predefined-web-responses.js","/npm/fpmk-capacitor-voice-recorder@6.5.6/dist/esm/VoiceRecorderImpl.js","/npm/fpmk-capacitor-voice-recorder@6.5.6/dist/esm/web.js"],"names":[],"mappings":"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","file":"/npm/fpmk-capacitor-voice-recorder@6.5.6/dist/plugin.cjs.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/fpmk-capacitor-voice-recorder@6.5.6/dist/plugin.cjs.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","export const RecordingStatus = {\r\n    RECORDING: 'RECORDING',\r\n    PAUSED: 'PAUSED',\r\n    NONE: 'NONE',\r\n};\r\n//# sourceMappingURL=definitions.js.map","import { registerPlugin } from '@capacitor/core';\r\nconst VoiceRecorder = registerPlugin('VoiceRecorder', {\r\n    web: () => import('./web').then((m) => new m.VoiceRecorderWeb()),\r\n});\r\nexport * from './definitions';\r\nexport { VoiceRecorder };\r\n//# sourceMappingURL=index.js.map","export const successResponse = () => ({ value: true });\r\nexport const failureResponse = () => ({ value: false });\r\nexport const missingPermissionError = () => new Error('MISSING_PERMISSION');\r\nexport const alreadyRecordingError = () => new Error('ALREADY_RECORDING');\r\nexport const microphoneBeingUsedError = () => new Error('MICROPHONE_BEING_USED');\r\nexport const deviceCannotVoiceRecordError = () => new Error('DEVICE_CANNOT_VOICE_RECORD');\r\nexport const failedToRecordError = () => new Error('FAILED_TO_RECORD');\r\nexport const emptyRecordingError = () => new Error('EMPTY_RECORDING');\r\nexport const recordingHasNotStartedError = () => new Error('RECORDING_HAS_NOT_STARTED');\r\nexport const failedToFetchRecordingError = () => new Error('FAILED_TO_FETCH_RECORDING');\r\nexport const couldNotQueryPermissionStatusError = () => new Error('COULD_NOT_QUERY_PERMISSION_STATUS');\r\n//# sourceMappingURL=predefined-web-responses.js.map","import { RecordingStatus } from './definitions';\r\nimport { alreadyRecordingError, couldNotQueryPermissionStatusError, deviceCannotVoiceRecordError, failedToFetchRecordingError, failedToRecordError, failureResponse, missingPermissionError, recordingHasNotStartedError, successResponse, } from './predefined-web-responses';\r\n// these mime types will be checked one by one in order until one of them is found to be supported by the current browser\r\nconst possibleMimeTypes = ['audio/aac', 'audio/webm;codecs=opus', 'audio/mp4', 'audio/webm', 'audio/ogg;codecs=opus'];\r\nconst neverResolvingPromise = () => new Promise(() => undefined);\r\nexport class VoiceRecorderImpl {\r\n    constructor(_recorder, _this) {\r\n        this.pendingResult = neverResolvingPromise();\r\n        this.buffer = new ArrayBuffer(0);\r\n        this.firstChunk = false;\r\n        this.bufferSize = 0;\r\n        this.chunkSize = 4096; // 4KB in bytes\r\n        this.firstChunkSize = 44; // 44 bytes\r\n        this._recorder = _recorder;\r\n        this._recorder.onstart = () => {\r\n            console.log('Starting recording *********************');\r\n        };\r\n        this._recorder.onerror = (err) => {\r\n            console.log(err);\r\n            this.prepareInstanceForNextOperation();\r\n            return failedToRecordError();\r\n        };\r\n        this._recorder.onstop = async () => {\r\n            this.sendAudioData(this.int8ArrayToBase64(this.buffer), 'audio/mp3', _this);\r\n            // Reset buffer\r\n            this.buffer = new ArrayBuffer(0);\r\n            this.bufferSize = 0;\r\n            this.prepareInstanceForNextOperation();\r\n            return Promise.resolve();\r\n        };\r\n        this._recorder.ondataavailable = (event) => {\r\n            this.handleDataAvailable(event, _this);\r\n        };\r\n    }\r\n    static async canDeviceVoiceRecord() {\r\n        var _a;\r\n        if (((_a = navigator === null || navigator === void 0 ? void 0 : navigator.mediaDevices) === null || _a === void 0 ? void 0 : _a.getUserMedia) == null || VoiceRecorderImpl.getSupportedMimeType() == null) {\r\n            return failureResponse();\r\n        }\r\n        else {\r\n            return successResponse();\r\n        }\r\n    }\r\n    async startRecording() {\r\n        if (this._recorder.state === 1) {\r\n            throw alreadyRecordingError();\r\n        }\r\n        const deviceCanRecord = await VoiceRecorderImpl.canDeviceVoiceRecord();\r\n        if (!deviceCanRecord.value) {\r\n            throw deviceCannotVoiceRecordError();\r\n        }\r\n        const havingPermission = await VoiceRecorderImpl.hasAudioRecordingPermission().catch(() => successResponse());\r\n        if (!havingPermission.value) {\r\n            throw missingPermissionError();\r\n        }\r\n        this.firstChunk = false;\r\n        this._recorder.start();\r\n        return successResponse();\r\n    }\r\n    async stopRecording() {\r\n        if (this._recorder == null) {\r\n            throw recordingHasNotStartedError();\r\n        }\r\n        try {\r\n            this._recorder.stop();\r\n            return this.pendingResult;\r\n        }\r\n        catch (ignore) {\r\n            this.prepareInstanceForNextOperation();\r\n            throw failedToFetchRecordingError();\r\n        }\r\n        finally {\r\n            // this.prepareInstanceForNextOperation();\r\n        }\r\n    }\r\n    static async hasAudioRecordingPermission() {\r\n        if (navigator.permissions.query == null) {\r\n            if (navigator.mediaDevices == null) {\r\n                return Promise.reject(couldNotQueryPermissionStatusError());\r\n            }\r\n            return navigator.mediaDevices\r\n                .getUserMedia({ audio: true })\r\n                .then(() => successResponse())\r\n                .catch(() => {\r\n                throw couldNotQueryPermissionStatusError();\r\n            });\r\n        }\r\n        return navigator.permissions\r\n            .query({ name: 'microphone' })\r\n            .then((result) => ({ value: result.state === 'granted' }))\r\n            .catch(() => {\r\n            throw couldNotQueryPermissionStatusError();\r\n        });\r\n    }\r\n    static async requestAudioRecordingPermission() {\r\n        const havingPermission = await VoiceRecorderImpl.hasAudioRecordingPermission().catch(() => failureResponse());\r\n        if (havingPermission.value) {\r\n            return successResponse();\r\n        }\r\n        return navigator.mediaDevices\r\n            .getUserMedia({ audio: true })\r\n            .then(() => successResponse())\r\n            .catch(() => failureResponse());\r\n    }\r\n    pauseRecording() {\r\n        if (this._recorder == null) {\r\n            throw recordingHasNotStartedError();\r\n        }\r\n        else if (this._recorder.state === 1) {\r\n            this._recorder.pause();\r\n            return Promise.resolve(successResponse());\r\n        }\r\n        else {\r\n            return Promise.resolve(failureResponse());\r\n        }\r\n    }\r\n    resumeRecording() {\r\n        if (this._recorder == null) {\r\n            throw recordingHasNotStartedError();\r\n        }\r\n        else if (this._recorder.state === 2) {\r\n            this._recorder.resume();\r\n            return Promise.resolve(successResponse());\r\n        }\r\n        else {\r\n            return Promise.resolve(failureResponse());\r\n        }\r\n    }\r\n    getCurrentStatus() {\r\n        if (this._recorder == null) {\r\n            return Promise.resolve({ status: RecordingStatus.NONE });\r\n        }\r\n        else if (this._recorder.state === 1) {\r\n            return Promise.resolve({ status: RecordingStatus.RECORDING });\r\n        }\r\n        else if (this._recorder.state === 2) {\r\n            return Promise.resolve({ status: RecordingStatus.PAUSED });\r\n        }\r\n        else {\r\n            return Promise.resolve({ status: RecordingStatus.NONE });\r\n        }\r\n    }\r\n    static getSupportedMimeType() {\r\n        if ((MediaRecorder === null || MediaRecorder === void 0 ? void 0 : MediaRecorder.isTypeSupported) == null)\r\n            return null;\r\n        const foundSupportedType = possibleMimeTypes.find((type) => MediaRecorder.isTypeSupported(type));\r\n        return foundSupportedType !== null && foundSupportedType !== void 0 ? foundSupportedType : null;\r\n    }\r\n    concatenateArrayBuffers(buffer1, buffer2) {\r\n        // Create a new ArrayBuffer with a combined size\r\n        const totalLength = buffer1.byteLength + buffer2.byteLength;\r\n        const result = new Uint8Array(totalLength);\r\n        // Copy the first buffer into the result\r\n        result.set(new Uint8Array(buffer1), 0);\r\n        // Copy the second buffer into the result\r\n        result.set(new Uint8Array(buffer2), buffer1.byteLength);\r\n        // Return the concatenated ArrayBuffer\r\n        return result.buffer;\r\n    }\r\n    handleDataAvailable(blob, _this) {\r\n        this.buffer = this.concatenateArrayBuffers(this.buffer, blob);\r\n        this.bufferSize += blob.byteLength;\r\n        if (this.bufferSize >= this.chunkSize || (!this.firstChunk && this.bufferSize >= this.firstChunkSize)) {\r\n            this.firstChunk = true;\r\n            this.sendAudioData(this.int8ArrayToBase64(this.buffer), 'audio/mp3', _this);\r\n            // Reset buffer\r\n            this.buffer = new ArrayBuffer(0);\r\n            this.bufferSize = 0;\r\n        }\r\n    }\r\n    int8ArrayToBase64(int8Array) {\r\n        const uint8Array = new Uint8Array(int8Array);\r\n        const binaryString = Array.from(uint8Array)\r\n            .map((byte) => String.fromCharCode(byte))\r\n            .join('');\r\n        return btoa(binaryString);\r\n    }\r\n    sendAudioData(base64, type, _this) {\r\n        const audioChunkEvent = { data: base64, mimeType: type }; // Base64-encoded audio\r\n        _this.notifyListeners('onAudioChunk', audioChunkEvent); // Emit audio chunk event\r\n    }\r\n    prepareInstanceForNextOperation() {\r\n        if (this._recorder != null && this._recorder.state === 1) {\r\n            try {\r\n                this._recorder.stop();\r\n            }\r\n            catch (error) {\r\n                console.warn('While trying to stop a media recorder, an error was thrown', error);\r\n            }\r\n        }\r\n        this.pendingResult = neverResolvingPromise();\r\n    }\r\n}\r\n//# sourceMappingURL=VoiceRecorderImpl.js.map","import { WebPlugin } from '@capacitor/core';\r\nimport { VoiceRecorderImpl } from './VoiceRecorderImpl';\r\nimport AudioRecorder from 'fpmk-simple-audio-recorder';\r\nAudioRecorder.initWorker();\r\nexport class VoiceRecorderWeb extends WebPlugin {\r\n    constructor() {\r\n        super(...arguments);\r\n        this.recorder = new AudioRecorder({\r\n            recordingGain: 1,\r\n            encoderBitRate: 96,\r\n            streaming: true,\r\n            streamBufferSize: 128,\r\n            // rather than at the end as one large blob\r\n            constraints: {\r\n                // Optional audio constraints, see https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia\r\n                channelCount: 1,\r\n                autoGainControl: false,\r\n                echoCancellation: false,\r\n                noiseSuppression: false,\r\n            },\r\n        });\r\n        this.voiceRecorderInstance = new VoiceRecorderImpl(this.recorder, this);\r\n    }\r\n    canDeviceVoiceRecord() {\r\n        return VoiceRecorderImpl.canDeviceVoiceRecord();\r\n    }\r\n    hasAudioRecordingPermission() {\r\n        return VoiceRecorderImpl.hasAudioRecordingPermission();\r\n    }\r\n    requestAudioRecordingPermission() {\r\n        return VoiceRecorderImpl.requestAudioRecordingPermission();\r\n    }\r\n    startRecording() {\r\n        return this.voiceRecorderInstance.startRecording();\r\n    }\r\n    stopRecording() {\r\n        return this.voiceRecorderInstance.stopRecording();\r\n    }\r\n    pauseRecording() {\r\n        return this.voiceRecorderInstance.pauseRecording();\r\n    }\r\n    resumeRecording() {\r\n        return this.voiceRecorderInstance.resumeRecording();\r\n    }\r\n    getCurrentStatus() {\r\n        return this.voiceRecorderInstance.getCurrentStatus();\r\n    }\r\n    addListener(eventName, listenerFunc) {\r\n        return super.addListener(eventName, listenerFunc);\r\n    }\r\n}\r\n//# sourceMappingURL=web.js.map"]}