import {b64DataURL} from "./base64.ts";import {u8Encode} from "./text.ts";
interface TaskMessage<T extends unknown>{ message: T; transfers?: Transferable[];}
export type TaskAction<T extends unknown, K extends unknown> = (message:T) => TaskMessage<K> | Promise<TaskMessage<K>>;
export type TaskContext<T extends unknown, K extends unknown> = (message:T, transfers?:Transferable[]) => Promise<K>;
export function createTask<T extends unknown, K extends unknown>(task:TaskAction<T, K>):TaskContext<T, K>{ const script = ` globalThis.onmessage = async({data})=>{ const {message, transfers} = await(${task.toString()})(data); globalThis.postMessage(message, { transfer: transfers }); }; `;
return (message, transfers)=>{ return new Promise<K>((res, rej)=>{ const worker = new Worker(b64DataURL(u8Encode(script), "text/javascript"), { type: "module" });
worker.onmessage = ({data})=>{ res(data); worker.terminate(); };
worker.onerror = (e)=>{ rej(e); worker.terminate(); };
worker.onmessageerror = (e)=>{ rej(e); worker.terminate(); };
worker.postMessage(message, { transfer: transfers }); }); };}