UNPKG

web-worker-helper

Version:

Utilities for running tasks on worker threads

64 lines (63 loc) 2.35 kB
"use strict"; // NOTE - there is a copy of this function is both in core and loader-utils // core does not need all the utils in loader-utils, just this one. Object.defineProperty(exports, "__esModule", { value: true }); exports.getTransferList = void 0; /** * Returns an array of Transferrable objects that can be used with postMessage * https://developer.mozilla.org/en-US/docs/Web/API/Worker/postMessage * @param object data to be sent via postMessage * @param recursive - not for application use * @param transfers - not for application use * @returns a transfer list that can be passed to postMessage */ function getTransferList(object, recursive, transfers) { if (recursive === void 0) { recursive = true; } // Make sure that items in the transfer list is unique var transfersSet = transfers || new Set(); if (!object) { // ignore } else if (isTransferable(object)) { transfersSet.add(object); } else if (isTransferable(object.buffer)) { // Typed array transfersSet.add(object.buffer); } else if (ArrayBuffer.isView(object)) { // object is a TypeArray viewing into a SharedArrayBuffer (not transferable) // Do not iterate through the content in this case } else if (recursive && typeof object === 'object') { for (var key in object) { // Avoid perf hit - only go one level deep getTransferList(object[key], recursive, transfersSet); } } // If transfers is defined, is internal recursive call // Otherwise it's called by the user return transfers === undefined ? Array.from(transfersSet) : []; } exports.getTransferList = getTransferList; // https://developer.mozilla.org/en-US/docs/Web/API/Transferable function isTransferable(object) { if (!object) { return false; } if (object instanceof ArrayBuffer) { return true; } if (typeof MessagePort !== 'undefined' && object instanceof MessagePort) { return true; } if (typeof ImageBitmap !== 'undefined' && object instanceof ImageBitmap) { return true; } // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore if (typeof OffscreenCanvas !== 'undefined' && object instanceof OffscreenCanvas) { return true; } return false; }