2020-08-22 23:48:00 +03:00
|
|
|
import { webp2png } from './webp';
|
|
|
|
import type { WebpConvertTask } from './webpWorkerController';
|
|
|
|
|
|
|
|
const ctx = self as any as DedicatedWorkerGlobalScope;
|
|
|
|
const tasks: WebpConvertTask[] = [];
|
2020-08-28 14:25:43 +03:00
|
|
|
//let isProcessing = false;
|
2020-08-22 23:48:00 +03:00
|
|
|
|
|
|
|
function finishTask() {
|
2020-08-28 14:25:43 +03:00
|
|
|
//isProcessing = false;
|
2020-08-22 23:48:00 +03:00
|
|
|
processTasks();
|
|
|
|
}
|
|
|
|
|
|
|
|
function processTasks() {
|
2020-08-28 14:25:43 +03:00
|
|
|
//if(isProcessing) return;
|
2020-08-22 23:48:00 +03:00
|
|
|
|
|
|
|
const task = tasks.shift();
|
|
|
|
if(!task) return;
|
|
|
|
|
2020-08-28 14:25:43 +03:00
|
|
|
//isProcessing = true;
|
2020-08-22 23:48:00 +03:00
|
|
|
|
|
|
|
switch(task.type) {
|
|
|
|
case 'convertWebp': {
|
|
|
|
const {fileName, bytes} = task.payload;
|
|
|
|
|
2020-08-28 14:25:43 +03:00
|
|
|
let convertedBytes: Uint8Array;
|
|
|
|
try {
|
|
|
|
convertedBytes = webp2png(bytes).bytes;
|
|
|
|
} catch(err) {
|
|
|
|
console.error('Convert webp2png error:', err, 'payload:', task.payload);
|
|
|
|
}
|
|
|
|
|
2020-08-22 23:48:00 +03:00
|
|
|
ctx.postMessage({
|
|
|
|
type: 'convertWebp',
|
|
|
|
payload: {
|
|
|
|
fileName,
|
2020-08-28 14:25:43 +03:00
|
|
|
bytes: convertedBytes
|
2020-08-22 23:48:00 +03:00
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
finishTask();
|
|
|
|
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
default:
|
|
|
|
finishTask();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function scheduleTask(task: WebpConvertTask) {
|
|
|
|
tasks.push(task);
|
2020-08-28 14:25:43 +03:00
|
|
|
/* if(task.payload.fileName.indexOf('main-') === 0) {
|
|
|
|
tasks.push(task);
|
|
|
|
} else {
|
|
|
|
tasks.unshift(task);
|
|
|
|
} */
|
|
|
|
|
2020-08-22 23:48:00 +03:00
|
|
|
processTasks();
|
|
|
|
}
|
|
|
|
|
|
|
|
ctx.addEventListener('message', (event) => {
|
|
|
|
scheduleTask(event.data);
|
|
|
|
});
|