Skip to content

Commit

Permalink
transfer typedarray.
Browse files Browse the repository at this point in the history
  • Loading branch information
dojyorin committed Jan 20, 2024
1 parent d1b45e1 commit 0511c3c
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 13 deletions.
27 changes: 16 additions & 11 deletions src/worker.ts
Original file line number Diff line number Diff line change
@@ -1,20 +1,25 @@
/**
* Communication content between main thread and worker thread.
* TypedArray also automatically unwrap to `ArrayBuffer`.
*/
export interface WorkerMessage<T extends unknown>{
message: T;
transfer?: Transferable[];
}
export type TaskTransfer = Transferable | ArrayBufferView;

/**
* Content of processing run by worker thread.
*/
export type TaskAction<T extends unknown, K extends unknown> = (message:T) => WorkerMessage<K> | Promise<WorkerMessage<K>>;
export type TaskAction<T extends unknown, K extends unknown> = (message:T) => TaskMessage<K> | Promise<TaskMessage<K>>;

/**
* Run registered `TaskAction` in worker thread.
*/
export type TaskContext<T extends unknown, K extends unknown> = (message:T, transfer?:Transferable[]) => Promise<K>;
export type TaskContext<T extends unknown, K extends unknown> = (message:T, transfers?:TaskTransfer[]) => Promise<K>;

/**
* Communication content between main thread and worker thread.
*/
export interface TaskMessage<T extends unknown>{
message: T;
transfers?: TaskTransfer[];
}

/**
* Register `TaskAction` and return reusable task execution context.
Expand All @@ -37,15 +42,15 @@ export function createTask<T extends unknown, K extends unknown>(task:TaskAction
const script = task.toString();
const regist = /*js*/`
globalThis.onmessage = async({data})=>{
const {message, transfer} = await(${script})(data);
const {message, transfers} = await(${script})(data);
globalThis.postMessage(message, {
transfer: transfer
transfer: transfers?.map(v => "buffer" in v ? v.buffer : v)
});
};
`;
const url = URL.createObjectURL(new Blob([regist]));

return (message:T, transfer?:Transferable[])=>{
return (message, transfers)=>{
return new Promise<K>((res, rej)=>{
const worker = new Worker(url, {
type: "module"
Expand All @@ -67,7 +72,7 @@ export function createTask<T extends unknown, K extends unknown>(task:TaskAction
};

worker.postMessage(message, {
transfer: transfer
transfer: transfers?.map(v => "buffer" in v ? v.buffer : v)
});
});
};
Expand Down
4 changes: 2 additions & 2 deletions test/worker.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,11 @@ Deno.test({

return {
message: result,
transfer: [result.buffer]
transfers: [result]
};
});

const result = await task(sample1, [sample1.buffer]);
const result = await task(sample1, [sample1]);

assertEquals(result, sample2);
}
Expand Down

0 comments on commit 0511c3c

Please sign in to comment.