Skip to content

Commit 5678dc1

Browse files
committed
Strip TransferDescriptor type from args and return values
1 parent 0d32b44 commit 5678dc1

File tree

3 files changed

+22
-6
lines changed

3 files changed

+22
-6
lines changed

src/types/master.ts

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import { Observable } from "observable-fns"
77
import { ObservablePromise } from "../observable-promise"
88
import { $errors, $events, $terminate, $worker } from "../symbols"
9+
import { TransferDescriptor } from "../transferable"
910

1011
interface ObservableLikeSubscription {
1112
unsubscribe(): any
@@ -26,12 +27,21 @@ export type StripAsync<Type> =
2627
? ObservableBaseType
2728
: Type
2829

30+
export type StripTransfer<Type> =
31+
Type extends TransferDescriptor<infer BaseType>
32+
? BaseType
33+
: Type
34+
2935
export type ModuleMethods = { [methodName: string]: (...args: any) => any }
3036

37+
export type ProxyableArgs<Args extends any[]> = Args extends [arg0: infer Arg0, ...rest: infer RestArgs]
38+
? [Arg0 extends Transferable ? Arg0 | TransferDescriptor<Arg0> : Arg0, ...RestArgs]
39+
: Args
40+
3141
export type ProxyableFunction<Args extends any[], ReturnType> =
3242
Args extends []
33-
? () => ObservablePromise<StripAsync<ReturnType>>
34-
: (...args: Args) => ObservablePromise<StripAsync<ReturnType>>
43+
? () => ObservablePromise<StripTransfer<StripAsync<ReturnType>>>
44+
: (...args: ProxyableArgs<Args>) => ObservablePromise<StripTransfer<StripAsync<ReturnType>>>
3545

3646
export type ModuleProxy<Methods extends ModuleMethods> = {
3747
[method in keyof Methods]: ProxyableFunction<Parameters<Methods[method]>, ReturnType<Methods[method]>>

test/transferables.test.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import test from "ava"
22
import { spawn, Thread, Transfer, TransferDescriptor, Worker } from "../src/index"
3+
import { XorBuffer } from "./workers/arraybuffer-xor"
34

45
type SpyInit<Args extends any[], OriginalReturn, NewReturn> =
56
(originalFn: (...args: Args) => OriginalReturn) =>
@@ -43,8 +44,10 @@ test("can pass transferable objects on thread call", async t => {
4344
return postMessage(...args)
4445
})
4546

46-
const xorBuffer = await spawn<(buffer: ArrayBuffer | TransferDescriptor<ArrayBuffer>, value: number) => ArrayBuffer>(worker)
47-
await xorBuffer(Transfer(testData), 15)
47+
const xorBuffer = await spawn<XorBuffer>(worker)
48+
const returnedBuffer = await xorBuffer(Transfer(testData), 15)
49+
50+
t.is(returnedBuffer.byteLength, 64)
4851

4952
t.is(postMessageCalls.length, 1)
5053
t.is(postMessageCalls[0].length, 2)

test/workers/arraybuffer-xor.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
import { expose, Transfer } from "../../src/worker"
22

3-
expose(function xor(buffer: ArrayBuffer, value: number) {
3+
function xor(buffer: ArrayBuffer, value: number) {
44
const view = new Uint8Array(buffer)
55
view.forEach((byte, offset) => view.set([byte ^ value], offset))
66
return Transfer(buffer)
7-
})
7+
}
8+
9+
expose(xor)
10+
export type XorBuffer = typeof xor

0 commit comments

Comments
 (0)