web-worker-helper
Version:
Utilities for running tasks on worker threads
69 lines (68 loc) • 2.65 kB
JavaScript
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';
}