(function (global, factory) {
|
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@babel/runtime/helpers/asyncToGenerator'), require('@babel/runtime/regenerator'), require('@babel/runtime/helpers/defineProperty'), require('fast-unique-numbers')) :
|
typeof define === 'function' && define.amd ? define(['exports', '@babel/runtime/helpers/asyncToGenerator', '@babel/runtime/regenerator', '@babel/runtime/helpers/defineProperty', 'fast-unique-numbers'], factory) :
|
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.workerFactory = {}, global._asyncToGenerator, global._regeneratorRuntime, global._defineProperty, global.fastUniqueNumbers));
|
})(this, (function (exports, _asyncToGenerator, _regeneratorRuntime, _defineProperty, fastUniqueNumbers) { 'use strict';
|
|
var JSON_RPC_ERROR_CODES = {
|
INTERNAL_ERROR: -32603,
|
INVALID_PARAMS: -32602,
|
METHOD_NOT_FOUND: -32601
|
};
|
var createErrorWithMessageAndStatus = function createErrorWithMessageAndStatus(message, status) {
|
return Object.assign(new Error(message), {
|
status: status
|
});
|
};
|
var renderMethodNotFoundError = function renderMethodNotFoundError(method) {
|
return createErrorWithMessageAndStatus("The requested method called \"".concat(method, "\" is not supported."), JSON_RPC_ERROR_CODES.METHOD_NOT_FOUND);
|
};
|
var renderMissingResponseError = function renderMissingResponseError(method) {
|
return createErrorWithMessageAndStatus("The handler of the method called \"".concat(method, "\" returned no required result."), JSON_RPC_ERROR_CODES.INTERNAL_ERROR);
|
};
|
var renderUnexpectedResultError = function renderUnexpectedResultError(method) {
|
return createErrorWithMessageAndStatus("The handler of the method called \"".concat(method, "\" returned an unexpected result."), JSON_RPC_ERROR_CODES.INTERNAL_ERROR);
|
};
|
var renderUnknownPortIdError = function renderUnknownPortIdError(portId) {
|
return createErrorWithMessageAndStatus("The specified parameter called \"portId\" with the given value \"".concat(portId, "\" does not identify a port connected to this worker."), JSON_RPC_ERROR_CODES.INVALID_PARAMS);
|
};
|
|
var createMessageHandler = function createMessageHandler(receiver, workerImplementation) {
|
return /*#__PURE__*/function () {
|
var _ref2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee(_ref) {
|
var _ref$data, id, method, params, messageHandler, response, synchronousResponse, result, _synchronousResponse$, transferables, message, _err$status, status, _t, _t2;
|
return _regeneratorRuntime.wrap(function (_context) {
|
while (1) switch (_context.prev = _context.next) {
|
case 0:
|
_ref$data = _ref.data, id = _ref$data.id, method = _ref$data.method, params = _ref$data.params;
|
messageHandler = workerImplementation[method];
|
_context.prev = 1;
|
if (!(messageHandler === undefined)) {
|
_context.next = 2;
|
break;
|
}
|
throw renderMethodNotFoundError(method);
|
case 2:
|
response = params === undefined ? messageHandler() : messageHandler(params);
|
if (!(response === undefined)) {
|
_context.next = 3;
|
break;
|
}
|
throw renderMissingResponseError(method);
|
case 3:
|
if (!(response instanceof Promise)) {
|
_context.next = 5;
|
break;
|
}
|
_context.next = 4;
|
return response;
|
case 4:
|
_t = _context.sent;
|
_context.next = 6;
|
break;
|
case 5:
|
_t = response;
|
case 6:
|
synchronousResponse = _t;
|
if (!(id === null)) {
|
_context.next = 8;
|
break;
|
}
|
if (!(synchronousResponse.result !== undefined)) {
|
_context.next = 7;
|
break;
|
}
|
throw renderUnexpectedResultError(method);
|
case 7:
|
_context.next = 10;
|
break;
|
case 8:
|
if (!(synchronousResponse.result === undefined)) {
|
_context.next = 9;
|
break;
|
}
|
throw renderUnexpectedResultError(method);
|
case 9:
|
result = synchronousResponse.result, _synchronousResponse$ = synchronousResponse.transferables, transferables = _synchronousResponse$ === void 0 ? [] : _synchronousResponse$;
|
receiver.postMessage({
|
id: id,
|
result: result
|
}, transferables);
|
case 10:
|
_context.next = 12;
|
break;
|
case 11:
|
_context.prev = 11;
|
_t2 = _context["catch"](1);
|
message = _t2.message, _err$status = _t2.status, status = _err$status === void 0 ? -32603 : _err$status;
|
receiver.postMessage({
|
error: {
|
code: status,
|
message: message
|
},
|
id: id
|
});
|
case 12:
|
case "end":
|
return _context.stop();
|
}
|
}, _callee, null, [[1, 11]]);
|
}));
|
return function (_x) {
|
return _ref2.apply(this, arguments);
|
};
|
}();
|
};
|
|
// Bug #1: Safari does currently not support to use transferables.
|
var isSupportingTransferables = function isSupportingTransferables() {
|
return new Promise(function (resolve) {
|
var arrayBuffer = new ArrayBuffer(0);
|
var _MessageChannel = new MessageChannel(),
|
port1 = _MessageChannel.port1,
|
port2 = _MessageChannel.port2;
|
port1.onmessage = function (_ref) {
|
var data = _ref.data;
|
return resolve(data !== null);
|
};
|
port2.postMessage(arrayBuffer, [arrayBuffer]);
|
});
|
};
|
|
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 DESTROY_WORKER_FUNCTIONS = new Map();
|
var extendWorkerImplementation = function extendWorkerImplementation(createWorker, partialWorkerImplementation, isSupportedFunction) {
|
return _objectSpread(_objectSpread({}, partialWorkerImplementation), {}, {
|
connect: function connect(_ref) {
|
var port = _ref.port;
|
port.start();
|
var destroyWorker = createWorker(port, partialWorkerImplementation);
|
var portId = fastUniqueNumbers.generateUniqueNumber(DESTROY_WORKER_FUNCTIONS);
|
DESTROY_WORKER_FUNCTIONS.set(portId, function () {
|
destroyWorker();
|
port.close();
|
DESTROY_WORKER_FUNCTIONS["delete"](portId);
|
});
|
return {
|
result: portId
|
};
|
},
|
disconnect: function disconnect(_ref2) {
|
var portId = _ref2.portId;
|
var destroyWorker = DESTROY_WORKER_FUNCTIONS.get(portId);
|
if (destroyWorker === undefined) {
|
throw renderUnknownPortIdError(portId);
|
}
|
destroyWorker();
|
return {
|
result: null
|
};
|
},
|
isSupported: function () {
|
var _isSupported = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
|
var isSelfSupported, result, synchronousResult, _t;
|
return _regeneratorRuntime.wrap(function (_context) {
|
while (1) switch (_context.prev = _context.next) {
|
case 0:
|
_context.next = 1;
|
return isSupportingTransferables();
|
case 1:
|
isSelfSupported = _context.sent;
|
if (!isSelfSupported) {
|
_context.next = 5;
|
break;
|
}
|
result = isSupportedFunction();
|
if (!(result instanceof Promise)) {
|
_context.next = 3;
|
break;
|
}
|
_context.next = 2;
|
return result;
|
case 2:
|
_t = _context.sent;
|
_context.next = 4;
|
break;
|
case 3:
|
_t = result;
|
case 4:
|
synchronousResult = _t;
|
return _context.abrupt("return", {
|
result: synchronousResult
|
});
|
case 5:
|
return _context.abrupt("return", {
|
result: false
|
});
|
case 6:
|
case "end":
|
return _context.stop();
|
}
|
}, _callee);
|
}));
|
function isSupported() {
|
return _isSupported.apply(this, arguments);
|
}
|
return isSupported;
|
}()
|
});
|
};
|
|
var _createWorker = function createWorker(receiver, workerImplementation) {
|
var isSupportedFunction = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : function () {
|
return true;
|
};
|
var fullWorkerImplementation = extendWorkerImplementation(_createWorker, workerImplementation, isSupportedFunction);
|
var messageHandler = createMessageHandler(receiver, fullWorkerImplementation);
|
receiver.addEventListener('message', messageHandler);
|
return function () {
|
return receiver.removeEventListener('message', messageHandler);
|
};
|
};
|
|
exports.createWorker = _createWorker;
|
exports.isSupported = isSupportingTransferables;
|
|
}));
|