split
This commit is contained in:
parent
88b5669961
commit
7fd7ba2e76
8 changed files with 512 additions and 147 deletions
53
js/worker-client.js
Normal file
53
js/worker-client.js
Normal file
|
|
@ -0,0 +1,53 @@
|
|||
(function () {
|
||||
'use strict';
|
||||
|
||||
const root = window.PixelIslandModules ||= {};
|
||||
let worker = null;
|
||||
let nextId = 1;
|
||||
const pending = new Map();
|
||||
|
||||
function canUseWorkers() {
|
||||
return typeof Worker === 'function';
|
||||
}
|
||||
|
||||
function getWorker() {
|
||||
if (!canUseWorkers()) return null;
|
||||
if (worker) return worker;
|
||||
worker = new Worker('./js/pixel-worker.js');
|
||||
worker.onmessage = (event) => {
|
||||
const { id, ok, result, error } = event.data || {};
|
||||
const entry = pending.get(id);
|
||||
if (!entry) return;
|
||||
pending.delete(id);
|
||||
if (ok) entry.resolve(result);
|
||||
else entry.reject(new Error(error || 'worker_error'));
|
||||
};
|
||||
worker.onerror = (event) => {
|
||||
const error = new Error(event.message || 'worker_error');
|
||||
for (const entry of pending.values()) entry.reject(error);
|
||||
pending.clear();
|
||||
worker?.terminate();
|
||||
worker = null;
|
||||
};
|
||||
return worker;
|
||||
}
|
||||
|
||||
function request(type, payload) {
|
||||
const target = getWorker();
|
||||
if (!target) return Promise.reject(new Error('workers_unavailable'));
|
||||
const id = nextId++;
|
||||
const promise = new Promise((resolve, reject) => pending.set(id, { resolve, reject }));
|
||||
target.postMessage({ id, type, payload });
|
||||
return promise;
|
||||
}
|
||||
|
||||
function buildPixelBlobs(assets) {
|
||||
return request('buildPixelBlobs', {
|
||||
assets,
|
||||
palette: root.Palette?.PALETTE || [],
|
||||
defaultColorCode: root.Palette?.DEFAULT_SELECTED_COLOR_CODE || 'a'
|
||||
});
|
||||
}
|
||||
|
||||
root.WorkerClient = { canUseWorkers, buildPixelBlobs };
|
||||
})();
|
||||
Loading…
Add table
Add a link
Reference in a new issue