recorder-audio-worklet
Version:
This module provides a loader for the RecorderAudioWorkletProcessor and the corresponding RecorderAudioWorkletNode.
215 lines (205 loc) • 19.6 kB
JavaScript
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('fast-unique-numbers'), require('subscribable-things'), require('worker-factory'), require('@babel/runtime/helpers/asyncToGenerator'), require('@babel/runtime/regenerator'), require('@babel/runtime/helpers/defineProperty')) :
typeof define === 'function' && define.amd ? define(['exports', 'fast-unique-numbers', 'subscribable-things', 'worker-factory', '@babel/runtime/helpers/asyncToGenerator', '@babel/runtime/regenerator', '@babel/runtime/helpers/defineProperty'], factory) :
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.recorderAudioWorklet = {}, global.fastUniqueNumbers, global.subscribableThings, global.workerFactory, global._asyncToGenerator, global._regeneratorRuntime, global._defineProperty));
})(this, (function (exports, fastUniqueNumbers, subscribableThings, workerFactory, _asyncToGenerator, _regeneratorRuntime, _defineProperty) { 'use strict';
var createAddRecorderAudioWorkletModule = function createAddRecorderAudioWorkletModule(blobConstructor, urlConstructor, worklet) {
return /*#__PURE__*/function () {
var _ref = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee(addAudioWorkletModule) {
var blob, url;
return _regeneratorRuntime.wrap(function _callee$(_context) {
while (1) switch (_context.prev = _context.next) {
case 0:
blob = new blobConstructor([worklet], {
type: 'application/javascript; charset=utf-8'
});
url = urlConstructor.createObjectURL(blob);
_context.prev = 2;
_context.next = 5;
return addAudioWorkletModule(url);
case 5:
_context.prev = 5;
urlConstructor.revokeObjectURL(url);
return _context.finish(5);
case 8:
case "end":
return _context.stop();
}
}, _callee, null, [[2,, 5, 8]]);
}));
return function (_x) {
return _ref.apply(this, arguments);
};
}();
};
var createListener = function createListener(ongoingRequests) {
return function (_ref) {
var message = _ref.data;
var id = message.id;
if (id !== null) {
var ongoingRequest = ongoingRequests.get(id);
if (ongoingRequest !== undefined) {
var reject = ongoingRequest.reject,
resolve = ongoingRequest.resolve;
ongoingRequests["delete"](id);
if (message.error === undefined) {
resolve(message.result);
} else {
reject(new Error(message.error.message));
}
}
}
};
};
function ownKeys$1(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
function _objectSpread$1(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$1(Object(t), true).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$1(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
var createPostMessageFactory = function createPostMessageFactory(generateUniqueNumber) {
return function (ongoingRequests, port) {
return function (message) {
var transferables = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
return new Promise(function (resolve, reject) {
var id = generateUniqueNumber(ongoingRequests);
ongoingRequests.set(id, {
reject: reject,
resolve: resolve
});
port.postMessage(_objectSpread$1({
id: id
}, message), transferables);
});
};
};
};
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), true).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
var createRecorderAudioWorkletNodeFactory = function createRecorderAudioWorkletNodeFactory(createListener, createPostMessage, on, validateState) {
return function (audioWorkletNodeConstructor, context) {
var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
var audioWorkletNode = new audioWorkletNodeConstructor(context, 'recorder-audio-worklet-processor', _objectSpread(_objectSpread({}, options), {}, {
channelCountMode: 'explicit',
numberOfInputs: 1,
numberOfOutputs: 0
}));
var ongoingRequests = new Map();
var postMessage = createPostMessage(ongoingRequests, audioWorkletNode.port);
var unsubscribe = on(audioWorkletNode.port, 'message')(createListener(ongoingRequests));
audioWorkletNode.port.start();
var state = 'inactive';
Object.defineProperties(audioWorkletNode, {
pause: {
get: function get() {
return /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
return _regeneratorRuntime.wrap(function _callee$(_context) {
while (1) switch (_context.prev = _context.next) {
case 0:
validateState(['recording'], state);
state = 'paused';
return _context.abrupt("return", postMessage({
method: 'pause'
}));
case 3:
case "end":
return _context.stop();
}
}, _callee);
}));
}
},
port: {
get: function get() {
throw new Error("The port of a RecorderAudioWorkletNode can't be accessed.");
}
},
record: {
get: function get() {
return /*#__PURE__*/function () {
var _ref2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee2(encoderPort) {
return _regeneratorRuntime.wrap(function _callee2$(_context2) {
while (1) switch (_context2.prev = _context2.next) {
case 0:
validateState(['inactive'], state);
state = 'recording';
return _context2.abrupt("return", postMessage({
method: 'record',
params: {
encoderPort: encoderPort
}
}, [encoderPort]));
case 3:
case "end":
return _context2.stop();
}
}, _callee2);
}));
return function (_x) {
return _ref2.apply(this, arguments);
};
}();
}
},
resume: {
get: function get() {
return /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee3() {
return _regeneratorRuntime.wrap(function _callee3$(_context3) {
while (1) switch (_context3.prev = _context3.next) {
case 0:
validateState(['paused'], state);
state = 'recording';
return _context3.abrupt("return", postMessage({
method: 'resume'
}));
case 3:
case "end":
return _context3.stop();
}
}, _callee3);
}));
}
},
stop: {
get: function get() {
return /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee4() {
return _regeneratorRuntime.wrap(function _callee4$(_context4) {
while (1) switch (_context4.prev = _context4.next) {
case 0:
validateState(['paused', 'recording'], state);
state = 'stopped';
_context4.prev = 2;
_context4.next = 5;
return postMessage({
method: 'stop'
});
case 5:
_context4.prev = 5;
unsubscribe();
return _context4.finish(5);
case 8:
case "end":
return _context4.stop();
}
}, _callee4, null, [[2,, 5, 8]]);
}));
}
}
});
return audioWorkletNode;
};
};
var validateState = function validateState(expectedStates, currentState) {
if (!expectedStates.includes(currentState)) {
throw new Error("Expected the state to be ".concat(expectedStates.map(function (expectedState) {
return "\"".concat(expectedState, "\"");
}).join(' or '), " but it was \"").concat(currentState, "\"."));
}
};
// This is the minified and stringified code of the recorder-audio-worklet-processor package.
var worklet = "(()=>{var e={45:(e,t,r)=>{var o=r(738).default;e.exports=function(e,t){if(\"object\"!=o(e)||!e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||\"default\");if(\"object\"!=o(n))return n;throw new TypeError(\"@@toPrimitive must return a primitive value.\")}return(\"string\"===t?String:Number)(e)},e.exports.__esModule=!0,e.exports.default=e.exports},72:e=>{function t(r){return e.exports=t=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},e.exports.__esModule=!0,e.exports.default=e.exports,t(r)}e.exports=t,e.exports.__esModule=!0,e.exports.default=e.exports},79:e=>{e.exports=function(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,o=Array(t);r<t;r++)o[r]=e[r];return o},e.exports.__esModule=!0,e.exports.default=e.exports},122:(e,t,r)=>{var o=r(79);e.exports=function(e,t){if(e){if(\"string\"==typeof e)return o(e,t);var r={}.toString.call(e).slice(8,-1);return\"Object\"===r&&e.constructor&&(r=e.constructor.name),\"Map\"===r||\"Set\"===r?Array.from(e):\"Arguments\"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?o(e,t):void 0}},e.exports.__esModule=!0,e.exports.default=e.exports},133:function(e,t,r){!function(e,t,r,o,n,s,u){\"use strict\";function a(e,t,r){return t=n(t),o(e,p()?Reflect.construct(t,[],n(e).constructor):t.apply(e,r))}function p(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){})))}catch(e){}return(p=function(){return!!e})()}var i=function(o){function n(){var e;return t(this,n),(e=a(this,n))._encoderPort=null,e._numberOfChannels=0,e._state=\"inactive\",e.port.onmessage=function(t){var r=t.data;\"pause\"===r.method?\"active\"===e._state||\"recording\"===e._state?(e._state=\"paused\",e._sendAcknowledgement(r.id)):e._sendUnexpectedStateError(r.id):\"record\"===r.method?\"inactive\"===e._state?(e._encoderPort=r.params.encoderPort,e._state=\"active\",e._sendAcknowledgement(r.id)):e._sendUnexpectedStateError(r.id):\"resume\"===r.method?\"paused\"===e._state?(e._state=\"active\",e._sendAcknowledgement(r.id)):e._sendUnexpectedStateError(r.id):\"stop\"===r.method?\"active\"!==e._state&&\"paused\"!==e._state&&\"recording\"!==e._state||null===e._encoderPort?e._sendUnexpectedStateError(r.id):(e._stop(e._encoderPort),e._sendAcknowledgement(r.id)):\"number\"==typeof r.id&&e.port.postMessage({error:{code:-32601,message:\"The requested method is not supported.\"},id:r.id})},e}return s(n,o),r(n,[{key:\"process\",value:function(t){var r=e(t,1)[0];if(\"inactive\"===this._state||\"paused\"===this._state)return!0;if(\"active\"===this._state){if(void 0===r)throw new Error(\"No channelData was received for the first input.\");if(0===r.length)return!0;this._state=\"recording\"}if(\"recording\"===this._state&&null!==this._encoderPort){if(void 0===r)throw new Error(\"No channelData was received for the first input.\");return 0===r.length?this._encoderPort.postMessage(Array.from({length:this._numberOfChannels},(function(){return 128}))):(this._encoderPort.postMessage(r,r.map((function(e){return e.buffer}))),this._numberOfChannels=r.length),!0}return!1}},{key:\"_sendAcknowledgement\",value:function(e){this.port.postMessage({id:e,result:null})}},{key:\"_sendUnexpectedStateError\",value:function(e){this.port.postMessage({error:{code:-32603,message:\"The internal state does not allow to process the given message.\"},id:e})}},{key:\"_stop\",value:function(e){e.postMessage([]),e.close(),this._encoderPort=null,this._state=\"stopped\"}}])}(u(AudioWorkletProcessor));i.parameterDescriptors=[],registerProcessor(\"recorder-audio-worklet-processor\",i)}(r(715),r(383),r(579),r(452),r(72),r(511),r(837))},156:e=>{e.exports=function(e,t){var r=null==e?null:\"undefined\"!=typeof Symbol&&e[Symbol.iterator]||e[\"@@iterator\"];if(null!=r){var o,n,s,u,a=[],p=!0,i=!1;try{if(s=(r=r.call(e)).next,0===t){if(Object(r)!==r)return;p=!1}else for(;!(p=(o=s.call(r)).done)&&(a.push(o.value),a.length!==t);p=!0);}catch(e){i=!0,n=e}finally{try{if(!p&&null!=r.return&&(u=r.return(),Object(u)!==u))return}finally{if(i)throw n}}return a}},e.exports.__esModule=!0,e.exports.default=e.exports},383:e=>{e.exports=function(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")},e.exports.__esModule=!0,e.exports.default=e.exports},452:(e,t,r)=>{var o=r(738).default,n=r(475);e.exports=function(e,t){if(t&&(\"object\"==o(t)||\"function\"==typeof t))return t;if(void 0!==t)throw new TypeError(\"Derived constructors may only return object or undefined\");return n(e)},e.exports.__esModule=!0,e.exports.default=e.exports},475:e=>{e.exports=function(e){if(void 0===e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return e},e.exports.__esModule=!0,e.exports.default=e.exports},511:(e,t,r)=>{var o=r(636);e.exports=function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function\");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,\"prototype\",{writable:!1}),t&&o(e,t)},e.exports.__esModule=!0,e.exports.default=e.exports},550:e=>{function t(){try{var r=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){})))}catch(r){}return(e.exports=t=function(){return!!r},e.exports.__esModule=!0,e.exports.default=e.exports)()}e.exports=t,e.exports.__esModule=!0,e.exports.default=e.exports},579:(e,t,r)=>{var o=r(736);function n(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,\"value\"in n&&(n.writable=!0),Object.defineProperty(e,o(n.key),n)}}e.exports=function(e,t,r){return t&&n(e.prototype,t),r&&n(e,r),Object.defineProperty(e,\"prototype\",{writable:!1}),e},e.exports.__esModule=!0,e.exports.default=e.exports},636:e=>{function t(r,o){return e.exports=t=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},e.exports.__esModule=!0,e.exports.default=e.exports,t(r,o)}e.exports=t,e.exports.__esModule=!0,e.exports.default=e.exports},646:(e,t,r)=>{var o=r(550),n=r(636);e.exports=function(e,t,r){if(o())return Reflect.construct.apply(null,arguments);var s=[null];s.push.apply(s,t);var u=new(e.bind.apply(e,s));return r&&n(u,r.prototype),u},e.exports.__esModule=!0,e.exports.default=e.exports},691:e=>{e.exports=function(e){try{return-1!==Function.toString.call(e).indexOf(\"[native code]\")}catch(t){return\"function\"==typeof e}},e.exports.__esModule=!0,e.exports.default=e.exports},715:(e,t,r)=>{var o=r(987),n=r(156),s=r(122),u=r(752);e.exports=function(e,t){return o(e)||n(e,t)||s(e,t)||u()},e.exports.__esModule=!0,e.exports.default=e.exports},736:(e,t,r)=>{var o=r(738).default,n=r(45);e.exports=function(e){var t=n(e,\"string\");return\"symbol\"==o(t)?t:t+\"\"},e.exports.__esModule=!0,e.exports.default=e.exports},738:e=>{function t(r){return e.exports=t=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e},e.exports.__esModule=!0,e.exports.default=e.exports,t(r)}e.exports=t,e.exports.__esModule=!0,e.exports.default=e.exports},752:e=>{e.exports=function(){throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\")},e.exports.__esModule=!0,e.exports.default=e.exports},837:(e,t,r)=>{var o=r(72),n=r(636),s=r(691),u=r(646);function a(t){var r=\"function\"==typeof Map?new Map:void 0;return e.exports=a=function(e){if(null===e||!s(e))return e;if(\"function\"!=typeof e)throw new TypeError(\"Super expression must either be null or a function\");if(void 0!==r){if(r.has(e))return r.get(e);r.set(e,t)}function t(){return u(e,arguments,o(this).constructor)}return t.prototype=Object.create(e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),n(t,e)},e.exports.__esModule=!0,e.exports.default=e.exports,a(t)}e.exports=a,e.exports.__esModule=!0,e.exports.default=e.exports},987:e=>{e.exports=function(e){if(Array.isArray(e))return e},e.exports.__esModule=!0,e.exports.default=e.exports}},t={};function r(o){var n=t[o];if(void 0!==n)return n.exports;var s=t[o]={exports:{}};return e[o].call(s.exports,s,s.exports,r),s.exports}r.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return r.d(t,{a:t}),t},r.d=(e,t)=>{for(var o in t)r.o(t,o)&&!r.o(e,o)&&Object.defineProperty(e,o,{enumerable:!0,get:t[o]})},r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{\"use strict\";r(133)})()})();"; // tslint:disable-line:max-line-length
var addRecorderAudioWorkletModule = createAddRecorderAudioWorkletModule(Blob, URL, worklet);
var createRecorderAudioWorkletNode = createRecorderAudioWorkletNodeFactory(createListener, createPostMessageFactory(fastUniqueNumbers.generateUniqueNumber), subscribableThings.on, validateState);
Object.defineProperty(exports, "isSupported", {
enumerable: true,
get: function () { return workerFactory.isSupported; }
});
exports.addRecorderAudioWorkletModule = addRecorderAudioWorkletModule;
exports.createRecorderAudioWorkletNode = createRecorderAudioWorkletNode;
}));