UNPKG

web-worker-helper

Version:

Utilities for running tasks on worker threads

69 lines (68 loc) 2.65 kB
import { getTransferList } from '../utils/worker-utils/get-transfer-list'; var onMessageWrapperMap = new Map(); /** * Type safe wrapper for worker code */ var WorkerBody = /** @class */ (function () { function WorkerBody() { } Object.defineProperty(WorkerBody, "onmessage", { /* * (type: WorkerMessageType, payload: WorkerMessagePayload) => any */ set: function (onMessage) { self.onmessage = function (message) { if (!isKnownMessage(message)) { return; } // Confusingly the message itself also has a 'type' field which is always set to 'message' var _a = message.data, type = _a.type, payload = _a.payload; onMessage(type, payload); }; }, enumerable: false, configurable: true }); WorkerBody.addEventListener = function (onMessage) { var onMessageWrapper = onMessageWrapperMap.get(onMessage); if (!onMessageWrapper) { onMessageWrapper = function (message) { if (!isKnownMessage(message)) { return; } // Confusingly the message itself also has a 'type' field which is always set to 'message' var _a = message.data, type = _a.type, payload = _a.payload; onMessage(type, payload); }; } self.addEventListener('message', onMessageWrapper); }; WorkerBody.removeEventListener = function (onMessage) { var onMessageWrapper = onMessageWrapperMap.get(onMessage); onMessageWrapperMap.delete(onMessage); self.removeEventListener('message', onMessageWrapper); }; /** * Send a message from a worker to creating thread (main thread) * 从 worker 线程发送消息到主线程 * @param type * @param payload */ WorkerBody.postMessage = function (type, payload) { if (self) { var data = { source: 'Worker thread', type: type, payload: payload }; var transferList = getTransferList(payload); // TODO: targetOrigin, transferList // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore self.postMessage(data, transferList); } }; return WorkerBody; }()); export default WorkerBody; // Filter out noise messages sent to workers function isKnownMessage(message) { var type = message.type, data = message.data; return type === 'message' && data && typeof data.source === 'string' && data.source === 'Main thread'; }