job.data = job.data.slice(chunk)
if (job.data.length === 0) this.#queue.shift()
if (next?.length > 0) {
+ if (this.#isTransferable(next)) {
+ thread.worker.postMessage({ name: job.name, next }, [next])
+ }
+ } else if (this.#isTransferable(next[0])) {
+ thread.worker.postMessage({ name: job.name, next }, next)
+ } else {
const buffer = new TextEncoder().encode(JSON.stringify(next)).buffer
thread.job = job
thread.worker.postMessage({ name: job.name, buffer }, [buffer])
return true
}
+ static #isTransferable (obj: any): boolean {
+ return obj instanceof ArrayBuffer
+ //@ts-expect-error
+ || obj instanceof AudioData
+ || obj instanceof ImageBitmap
+ || obj instanceof MediaSourceHandle
+ || obj instanceof MIDIAccess
+ || obj instanceof OffscreenCanvas
+ || obj instanceof ReadableStream
+ || obj instanceof RTCDataChannel
+ || obj instanceof TransformStream
+ || obj instanceof VideoFrame
+ //@ts-expect-error
+ || obj instanceof WebTransportReceiveStream
+ //@ts-expect-error
+ || obj instanceof WebTransportSendStream
+ || obj instanceof WritableStream
+ }
+
static #report (thread: Thread, results: any[]): void {
if (thread.job == null) {
throw new Error('Thread returned results but had nowhere to report it.')