Skip to content

Commit d567774

Browse files
committed
wip: adding methods proxy
1 parent acfe4e7 commit d567774

File tree

4 files changed

+45
-6
lines changed

4 files changed

+45
-6
lines changed

src/WorkerManager.ts

+25-5
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
1-
import type { WorkerFactory } from './types.js';
1+
import type { WorkerFactory, WorkerManifest } from './types.js';
22
import Logger from '@matrixai/logger';
33
import { CreateDestroy, ready } from '@matrixai/async-init/CreateDestroy.js';
44
import { type WorkerTaskInput } from './types.js';
55
import * as errors from './errors.js';
66
import WorkerPool from './WorkerPool.js';
77

88
@CreateDestroy()
9-
class WorkerManager {
9+
class WorkerManager<T extends WorkerManifest> {
1010
/**
1111
* Creates the WorkerManager
1212
* The workerFactory needs to be a callback:
@@ -19,18 +19,21 @@ class WorkerManager {
1919
* If `cores` is set to 0, this creates a useless worker pool
2020
* Use `undefined` to mean using all cores
2121
*/
22-
public static async createWorkerManager({
22+
public static async createWorkerManager<T extends WorkerManifest>({
2323
workerFactory,
24+
manifest,
2425
cores = 1,
2526
logger = new Logger(this.name),
2627
}: {
2728
workerFactory: WorkerFactory;
29+
manifest: T;
2830
cores?: number;
2931
logger?: Logger;
30-
}): Promise<WorkerManager> {
32+
}): Promise<WorkerManager<T>> {
3133
logger.info('Creating WorkerManager');
32-
const workerManager = new this({
34+
const workerManager = new this<T>({
3335
workerFactory,
36+
manifest,
3437
cores,
3538
logger,
3639
});
@@ -39,19 +42,36 @@ class WorkerManager {
3942
}
4043

4144
protected pool: WorkerPool;
45+
protected manifest: T;
46+
public proxy: T;
4247
protected logger: Logger;
4348

4449
public constructor({
4550
workerFactory,
51+
manifest,
4652
cores,
4753
logger,
4854
}: {
4955
workerFactory: WorkerFactory;
56+
manifest: T;
5057
cores: number;
5158
logger: Logger;
5259
}) {
5360
this.logger = logger;
61+
this.manifest = manifest;
5462
this.pool = new WorkerPool(cores, workerFactory);
63+
this.proxy = new Proxy(this.manifest, {
64+
apply: () => {
65+
throw Error('TMP IMP NEVER');
66+
},
67+
get: (target: T, prop) => {
68+
if (typeof prop === 'symbol') return;
69+
return (data, transferList) => {
70+
console.log(`${prop} called with `, data, transferList);
71+
return this.call({ type: prop, data, transferList });
72+
};
73+
},
74+
});
5575
}
5676

5777
public async destroy({

src/types.ts

+1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ type WorkerTaskInput = WorkerTaskInformation & {
1313

1414
type WorkerFunction<I = unknown, O = unknown> = (
1515
data: I,
16+
transferList?: Array<TransferListItem>,
1617
) => Promise<WorkerResult<O>>;
1718
type WorkerResult<O = unknown> = { data: O };
1819
type WorkerResultInternal<O = unknown> = WorkerResult<O> & {

src/worker.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ const worker = {
2828
});
2929
return { data: undefined };
3030
},
31-
transferBuffer: async (data: ArrayBuffer) => {
31+
transferBuffer: async (data: ArrayBuffer, _transferList?: [ArrayBuffer]) => {
3232
const buffer = Buffer.from(data, 0, data.byteLength);
3333
buffer.fill(0xf);
3434
return { data, transferList: [data] };

tests/WorkerManager.test.ts

+18
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import Logger, { LogLevel, StreamHandler } from '@matrixai/logger';
66
import { destroyed } from '@matrixai/async-init';
77
import WorkerManager from '#WorkerManager.js';
88
import * as errors from '#errors.js';
9+
import workerManifest from '#worker.js';
910

1011
const dirname = url.fileURLToPath(new URL('.', import.meta.url));
1112

@@ -133,4 +134,21 @@ describe('WorkerManager', () => {
133134

134135
await workerManager.destroy();
135136
});
137+
138+
test('proxy', async () => {
139+
const workerManager = await WorkerManager.createWorkerManager<
140+
typeof workerManifest
141+
>({
142+
workerFactory,
143+
cores: 1,
144+
manifest: workerManifest,
145+
logger,
146+
});
147+
const arrayBuffer = new ArrayBuffer(100);
148+
const result = await workerManager.proxy.transferBuffer(arrayBuffer, [
149+
arrayBuffer,
150+
]);
151+
console.log(result);
152+
await workerManager.destroy();
153+
});
136154
});

0 commit comments

Comments
 (0)