UNPKG

pixi.js

Version:

<p align="center"> <a href="https://pixijs.com" target="_blank" rel="noopener noreferrer"> <img height="150" src="https://files.pixijs.download/branding/pixijs-logo-transparent-dark.svg?v=1" alt="PixiJS logo"> </a> </p> <br/> <p align="center">

94 lines (90 loc) 2.62 kB
'use strict'; var checkImageBitmap_worker = require('../../../_virtual/checkImageBitmap.worker.js'); var loadImageBitmap_worker = require('../../../_virtual/loadImageBitmap.worker.js'); "use strict"; let UUID = 0; let MAX_WORKERS; class WorkerManagerClass { constructor() { this._initialized = false; this._createdWorkers = 0; this._workerPool = []; this._queue = []; this._resolveHash = {}; } isImageBitmapSupported() { if (this._isImageBitmapSupported !== void 0) return this._isImageBitmapSupported; this._isImageBitmapSupported = new Promise((resolve) => { const { worker } = new checkImageBitmap_worker.default(); worker.addEventListener("message", (event) => { worker.terminate(); checkImageBitmap_worker.default.revokeObjectURL(); resolve(event.data); }); }); return this._isImageBitmapSupported; } loadImageBitmap(src, asset) { return this._run("loadImageBitmap", [src, asset?.data?.alphaMode]); } async _initWorkers() { if (this._initialized) return; this._initialized = true; } _getWorker() { if (MAX_WORKERS === void 0) { MAX_WORKERS = navigator.hardwareConcurrency || 4; } let worker = this._workerPool.pop(); if (!worker && this._createdWorkers < MAX_WORKERS) { this._createdWorkers++; worker = new loadImageBitmap_worker.default().worker; worker.addEventListener("message", (event) => { this._complete(event.data); this._returnWorker(event.target); this._next(); }); } return worker; } _returnWorker(worker) { this._workerPool.push(worker); } _complete(data) { if (data.error !== void 0) { this._resolveHash[data.uuid].reject(data.error); } else { this._resolveHash[data.uuid].resolve(data.data); } this._resolveHash[data.uuid] = null; } async _run(id, args) { await this._initWorkers(); const promise = new Promise((resolve, reject) => { this._queue.push({ id, arguments: args, resolve, reject }); }); this._next(); return promise; } _next() { if (!this._queue.length) return; const worker = this._getWorker(); if (!worker) { return; } const toDo = this._queue.pop(); const id = toDo.id; this._resolveHash[UUID] = { resolve: toDo.resolve, reject: toDo.reject }; worker.postMessage({ data: toDo.arguments, uuid: UUID++, id }); } } const WorkerManager = new WorkerManagerClass(); exports.WorkerManager = WorkerManager; //# sourceMappingURL=WorkerManager.js.map