worker-factory
Version:
A little factory function to create a JSON-RPC based Web Worker implementation.
35 lines • 1.53 kB
JavaScript
import { renderMethodNotFoundError, renderMissingResponseError, renderUnexpectedResultError } from './error-renderers';
export const createMessageHandler = (receiver, workerImplementation) => {
return async ({ data: { id, method, params } }) => {
const messageHandler = workerImplementation[method];
try {
if (messageHandler === undefined) {
throw renderMethodNotFoundError(method);
}
const response = params === undefined
? messageHandler()
: messageHandler(params);
if (response === undefined) {
throw renderMissingResponseError(method);
}
const synchronousResponse = response instanceof Promise ? await response : response;
if (id === null) {
if (synchronousResponse.result !== undefined) {
throw renderUnexpectedResultError(method);
}
}
else {
if (synchronousResponse.result === undefined) {
throw renderUnexpectedResultError(method);
}
const { result, transferables = [] } = synchronousResponse;
receiver.postMessage({ id, result }, transferables);
}
}
catch (err) {
const { message, status = -32603 } = err;
receiver.postMessage({ error: { code: status, message }, id });
}
};
};
//# sourceMappingURL=create-message-handler.js.map