Files
blitzkit/src/core/blitzkrieg/svgToPngThreaded.ts
T

46 lines
1.1 KiB
TypeScript
Raw Normal View History

2023-10-16 20:08:08 -05:00
import { Worker } from 'worker_threads';
2023-10-17 21:01:26 -05:00
const MAX_WORKERS = 2;
2023-10-16 20:08:08 -05:00
const workers = [...Array(MAX_WORKERS)].map(() => {
const worker = new Worker(`${__dirname}/workers/render.cjs`);
console.log(`🟡 Launching render worker ${worker.threadId}`);
return worker;
});
const queue: {
svg: string;
resolve: (png: Buffer) => void;
}[] = [];
function manageQueue() {
if (queue.length > 0 && workers.length > 0) {
const { svg, resolve } = queue.shift()!;
const worker = workers.shift()!;
function cleanup() {
workers.push(worker);
2023-10-17 20:45:45 -05:00
worker.off('message', handleMessage);
worker.off('error', handleError);
2023-10-16 20:08:08 -05:00
manageQueue();
}
2023-10-17 20:45:45 -05:00
function handleMessage(png: Uint8Array) {
cleanup();
resolve(Buffer.from(png));
}
function handleError(error: Error) {
cleanup();
throw error;
}
2023-10-16 20:08:08 -05:00
worker.postMessage(svg);
2023-10-17 20:45:45 -05:00
worker.on('message', handleMessage);
worker.on('error', handleError);
2023-10-16 20:08:08 -05:00
}
}
export function svgToPngThreaded(svg: string) {
return new Promise<Buffer>((resolve) => {
queue.push({ svg, resolve });
manageQueue();
});
}