Skip to content

Commit 32f7419

Browse files
committed
Integrated @matrixai/errors and setup error chaining and using @matrixai/async-init
1 parent fc9073d commit 32f7419

7 files changed

Lines changed: 71 additions & 42 deletions

File tree

package-lock.json

Lines changed: 47 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,10 @@
2020
"bench": "ts-node -r tsconfig-paths/register ./benches"
2121
},
2222
"dependencies": {
23+
"@matrixai/async-init": "^1.7.0",
2324
"@matrixai/logger": "^2.1.0",
24-
"threads": "^1.6.5",
25-
"ts-custom-error": "^3.2.0"
25+
"@matrixai/errors": "^1.0.1",
26+
"threads": "^1.6.5"
2627
},
2728
"devDependencies": {
2829
"@types/jest": "^26.0.20",

src/WorkerManager.ts

Lines changed: 7 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
import type { ModuleThread } from 'threads';
22
import type { ModuleMethods } from 'threads/dist/types/master';
33
import type { QueuedTask } from 'threads/dist/master/pool-types';
4-
54
import { Pool } from 'threads';
65
import Logger from '@matrixai/logger';
6+
import { CreateDestroy, ready } from '@matrixai/async-init/dist/CreateDestroy';
77
import WorkerManagerInterface from './WorkerManagerInterface';
88
import * as errors from './errors';
99

10+
@CreateDestroy()
1011
class WorkerManager<W extends ModuleMethods>
1112
implements WorkerManagerInterface<W>
1213
{
@@ -43,10 +44,8 @@ class WorkerManager<W extends ModuleMethods>
4344

4445
protected pool: Pool<ModuleThread<W>>;
4546
protected logger: Logger;
46-
protected _running: boolean = false;
47-
protected _destroyed: boolean = false;
4847

49-
protected constructor({
48+
public constructor({
5049
workerFactory,
5150
cores,
5251
logger,
@@ -57,57 +56,35 @@ class WorkerManager<W extends ModuleMethods>
5756
}) {
5857
this.logger = logger;
5958
this.pool = Pool(workerFactory, cores);
60-
this._running = true;
61-
}
62-
63-
get running(): boolean {
64-
return this._running;
65-
}
66-
67-
get destroyed(): boolean {
68-
return this._destroyed;
6959
}
7060

7161
public async destroy({
7262
force = false,
7363
}: { force?: boolean } = {}): Promise<void> {
74-
if (this._destroyed) {
75-
return;
76-
}
7764
this.logger.info('Destroying WorkerManager');
7865
await this.pool.terminate(force);
79-
this._running = false;
80-
this._destroyed = true;
8166
this.logger.info('Destroyed WorkerManager');
8267
}
8368

69+
@ready(new errors.ErrorWorkerManagerDestroyed())
8470
public async call<T>(f: (worker: ModuleThread<W>) => Promise<T>): Promise<T> {
85-
if (!this._running) {
86-
throw new errors.ErrorWorkerManagerNotRunning();
87-
}
8871
return await this.pool.queue(f);
8972
}
9073

74+
@ready(new errors.ErrorWorkerManagerDestroyed())
9175
public queue<T>(
9276
f: (worker: ModuleThread<W>) => Promise<T>,
9377
): QueuedTask<ModuleThread<W>, T> {
94-
if (!this._running) {
95-
throw new errors.ErrorWorkerManagerNotRunning();
96-
}
9778
return this.pool.queue(f);
9879
}
9980

81+
@ready(new errors.ErrorWorkerManagerDestroyed())
10082
public async completed(): Promise<void> {
101-
if (!this._running) {
102-
throw new errors.ErrorWorkerManagerNotRunning();
103-
}
10483
return await this.pool.completed();
10584
}
10685

86+
@ready(new errors.ErrorWorkerManagerDestroyed())
10787
public async settled() {
108-
if (!this._running) {
109-
throw new errors.ErrorWorkerManagerNotRunning();
110-
}
11188
return await this.pool.settled();
11289
}
11390
}

src/WorkerManagerInterface.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import type { ModuleMethods } from 'threads/dist/types/master';
33
import type { QueuedTask } from 'threads/dist/master/pool-types';
44

55
interface WorkerManagerInterface<W extends ModuleMethods> {
6-
destroy(): Promise<void>;
6+
destroy(options: { force?: boolean }): Promise<void>;
77
call<T>(f: (worker: ModuleThread<W>) => Promise<T>): Promise<T>;
88
queue<T>(
99
f: (worker: ModuleThread<W>) => Promise<T>,

src/errors.ts

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
1-
import { CustomError } from 'ts-custom-error';
1+
import { AbstractError } from '@matrixai/errors';
22

3-
class ErrorWorkerManager extends CustomError {}
3+
class ErrorWorkerManager<T> extends AbstractError<T> {
4+
static description = 'WorkerManager error';
5+
}
46

5-
class ErrorWorkerManagerNotRunning extends ErrorWorkerManager {}
7+
class ErrorWorkerManagerDestroyed<T> extends ErrorWorkerManager<T> {
8+
static description = 'WorkerManager is destroyed';
9+
}
610

7-
export { ErrorWorkerManager, ErrorWorkerManagerNotRunning };
11+
export { ErrorWorkerManager, ErrorWorkerManagerDestroyed };

tests/WorkerManager.test.ts

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import type { WorkerModule } from '@/worker';
22
import { spawn, Worker, Transfer } from 'threads';
33
import Logger, { LogLevel, StreamHandler } from '@matrixai/logger';
4+
import { destroyed } from '@matrixai/async-init';
45
import WorkerManager from '@/WorkerManager';
56
import * as errors from '@/errors';
67
import * as testUtils from './utils';
@@ -16,14 +17,12 @@ describe('WorkerManager', () => {
1617
logger,
1718
},
1819
);
19-
expect(workerManager.running).toBe(true);
20-
expect(workerManager.destroyed).toBe(false);
20+
expect(workerManager[destroyed]).toBe(false);
2121
expect(await workerManager.call(async () => 1)).toBe(1);
2222
await workerManager.destroy();
23-
expect(workerManager.running).toBe(false);
24-
expect(workerManager.destroyed).toBe(true);
23+
expect(workerManager[destroyed]).toBe(true);
2524
expect(workerManager.call(async () => 1)).rejects.toThrow(
26-
errors.ErrorWorkerManagerNotRunning,
25+
errors.ErrorWorkerManagerDestroyed,
2726
);
2827
});
2928
test('starting with 0 worker cores is useless', async () => {

tsconfig.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
"allowJs": true,
77
"strictNullChecks": true,
88
"noImplicitAny": false,
9+
"experimentalDecorators": true,
910
"esModuleInterop": true,
1011
"allowSyntheticDefaultImports": true,
1112
"resolveJsonModule": true,

0 commit comments

Comments
 (0)