UNPKG

@soapbox.pub/wasmboy

Version:

Soapbox fork of Wasmboy.

125 lines (107 loc) 3.46 kB
// Web worker for wasmboy lib // Will be used for running wasm, and controlling child workers. import { postMessage, onMessage } from '../../worker/workerapi'; import { getEventData } from '../../worker/util'; import { getSmartWorkerMessage } from '../../worker/smartworker'; import { WORKER_MESSAGE_TYPE } from '../../worker/constants'; // Worker port for the lib let libWorkerPort; // Function to pass memory to parent thread as transferable const passMemoryToConnectedThread = (isForLib, eventData) => { const transferableMemory = []; Object.keys(eventData.message).forEach(key => { if (key !== 'type') { transferableMemory.push(eventData.message[key]); } }); // Forward to our lib worker const workerMessage = getSmartWorkerMessage(eventData.message, eventData.messageId); if (isForLib) { libWorkerPort.postMessage(workerMessage, transferableMemory); } else { postMessage(workerMessage, transferableMemory); } }; const libMessageHandler = event => { // Handle our messages from the lib thread const eventData = getEventData(event); // Handle update method transfrables if (!eventData.message) { return; } // Handle our messages from the lib thread switch (eventData.message.type) { case WORKER_MESSAGE_TYPE.CLEAR_MEMORY_DONE: { postMessage(getSmartWorkerMessage(eventData.message, eventData.messageId), [eventData.message.wasmByteMemory]); return; } case WORKER_MESSAGE_TYPE.GET_CONSTANTS_DONE: { postMessage(getSmartWorkerMessage(eventData.message, eventData.messageId)); return; } case WORKER_MESSAGE_TYPE.SET_MEMORY_DONE: { postMessage(getSmartWorkerMessage(eventData.message, eventData.messageId)); return; } case WORKER_MESSAGE_TYPE.GET_MEMORY: { passMemoryToConnectedThread(false, eventData); return; } case WORKER_MESSAGE_TYPE.UPDATED: { passMemoryToConnectedThread(false, eventData); return; } } }; const messageHandler = event => { // Handle our messages from the main thread const eventData = getEventData(event); switch (eventData.message.type) { case WORKER_MESSAGE_TYPE.CONNECT: { // Set our lib port libWorkerPort = eventData.message.ports[0]; onMessage(libMessageHandler, libWorkerPort); // Simply post back that we are ready postMessage(getSmartWorkerMessage(undefined, eventData.messageId)); return; } case WORKER_MESSAGE_TYPE.CLEAR_MEMORY: { // Forward to our lib worker libWorkerPort.postMessage( getSmartWorkerMessage( { type: WORKER_MESSAGE_TYPE.CLEAR_MEMORY }, eventData.messageId ) ); return; } case WORKER_MESSAGE_TYPE.GET_CONSTANTS: { // Forward to our lib worker libWorkerPort.postMessage( getSmartWorkerMessage( { type: WORKER_MESSAGE_TYPE.GET_CONSTANTS }, eventData.messageId ) ); return; } case WORKER_MESSAGE_TYPE.GET_MEMORY: { // Forward to our lib worker libWorkerPort.postMessage(getSmartWorkerMessage(eventData.message, eventData.messageId)); return; } case WORKER_MESSAGE_TYPE.SET_MEMORY: { passMemoryToConnectedThread(true, eventData); return; } default: { //handle other messages from main console.log(eventData); } } }; onMessage(messageHandler);