Skip to content

Commit

Permalink
Merge pull request #2 from MatrixAI/errorsandasyncinit
Browse files Browse the repository at this point in the history
Integrated @matrixai/errors and setup error chaining and async init
  • Loading branch information
CMCDragonkai authored Apr 5, 2022
2 parents fc9073d + 83da2d0 commit 17e7ece
Show file tree
Hide file tree
Showing 20 changed files with 455 additions and 235 deletions.
2 changes: 1 addition & 1 deletion docs/assets/js/search.js

Large diffs are not rendered by default.

123 changes: 22 additions & 101 deletions docs/classes/WorkerManager.default.html

Large diffs are not rendered by default.

186 changes: 160 additions & 26 deletions docs/classes/errors.ErrorWorkerManager.html

Large diffs are not rendered by default.

Large diffs are not rendered by default.

5 changes: 2 additions & 3 deletions docs/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -180,11 +180,10 @@ <h2>Legend</h2>
<li class="tsd-kind-type-alias"><span class="tsd-kind-icon">Type alias</span></li>
</ul>
<ul class="tsd-legend">
<li class="tsd-kind-class"><span class="tsd-kind-icon">Class</span></li>
<li class="tsd-kind-class tsd-has-type-parameter"><span class="tsd-kind-icon">Class with type parameter</span></li>
<li class="tsd-kind-interface tsd-has-type-parameter"><span class="tsd-kind-icon">Interface with type parameter</span></li>
</ul>
<ul class="tsd-legend">
<li class="tsd-kind-interface tsd-has-type-parameter"><span class="tsd-kind-icon">Interface with type parameter</span></li>
<li class="tsd-kind-class tsd-has-type-parameter"><span class="tsd-kind-icon">Class with type parameter</span></li>
</ul>
</div>
</div>
Expand Down
14 changes: 12 additions & 2 deletions docs/interfaces/WorkerManagerInterface.default.html
Original file line number Diff line number Diff line change
Expand Up @@ -177,7 +177,7 @@ <h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">Promise</
<a name="destroy" class="tsd-anchor"></a>
<h3>destroy</h3>
<ul class="tsd-signatures tsd-kind-method tsd-parent-kind-interface">
<li class="tsd-signature tsd-kind-icon">destroy<span class="tsd-signature-symbol">(</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Promise</span><span class="tsd-signature-symbol">&lt;</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">&gt;</span></li>
<li class="tsd-signature tsd-kind-icon">destroy<span class="tsd-signature-symbol">(</span>options<span class="tsd-signature-symbol">: </span><span class="tsd-signature-symbol">{ </span>force<span class="tsd-signature-symbol">?: </span><span class="tsd-signature-type">boolean</span><span class="tsd-signature-symbol"> }</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Promise</span><span class="tsd-signature-symbol">&lt;</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">&gt;</span></li>
</ul>
<ul class="tsd-descriptions">
<li class="tsd-description">
Expand All @@ -186,6 +186,17 @@ <h3>destroy</h3>
<li>Defined in <a href="https://github.com/MatrixAI/js-workers/blob/master/src/WorkerManagerInterface.ts#L6">src/WorkerManagerInterface.ts:6</a></li>
</ul>
</aside>
<h4 class="tsd-parameters-title">Parameters</h4>
<ul class="tsd-parameters">
<li>
<h5>options: <span class="tsd-signature-symbol">{ </span>force<span class="tsd-signature-symbol">?: </span><span class="tsd-signature-type">boolean</span><span class="tsd-signature-symbol"> }</span></h5>
<ul class="tsd-parameters">
<li class="tsd-parameter">
<h5><span class="tsd-flag ts-flagOptional">Optional</span> force<span class="tsd-signature-symbol">?: </span><span class="tsd-signature-type">boolean</span></h5>
</li>
</ul>
</li>
</ul>
<h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">Promise</span><span class="tsd-signature-symbol">&lt;</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">&gt;</span></h4>
</li>
</ul>
Expand Down Expand Up @@ -326,7 +337,6 @@ <h2>Legend</h2>
<li class="tsd-kind-method tsd-parent-kind-interface"><span class="tsd-kind-icon">Method</span></li>
</ul>
<ul class="tsd-legend">
<li class="tsd-kind-class"><span class="tsd-kind-icon">Class</span></li>
<li class="tsd-kind-class tsd-has-type-parameter"><span class="tsd-kind-icon">Class with type parameter</span></li>
</ul>
</div>
Expand Down
5 changes: 2 additions & 3 deletions docs/modules.html
Original file line number Diff line number Diff line change
Expand Up @@ -118,11 +118,10 @@ <h2>Legend</h2>
<li class="tsd-kind-type-alias"><span class="tsd-kind-icon">Type alias</span></li>
</ul>
<ul class="tsd-legend">
<li class="tsd-kind-class"><span class="tsd-kind-icon">Class</span></li>
<li class="tsd-kind-class tsd-has-type-parameter"><span class="tsd-kind-icon">Class with type parameter</span></li>
<li class="tsd-kind-interface tsd-has-type-parameter"><span class="tsd-kind-icon">Interface with type parameter</span></li>
</ul>
<ul class="tsd-legend">
<li class="tsd-kind-interface tsd-has-type-parameter"><span class="tsd-kind-icon">Interface with type parameter</span></li>
<li class="tsd-kind-class tsd-has-type-parameter"><span class="tsd-kind-icon">Class with type parameter</span></li>
</ul>
</div>
</div>
Expand Down
5 changes: 2 additions & 3 deletions docs/modules/WorkerManager.html
Original file line number Diff line number Diff line change
Expand Up @@ -124,11 +124,10 @@ <h2>Legend</h2>
<li class="tsd-kind-type-alias"><span class="tsd-kind-icon">Type alias</span></li>
</ul>
<ul class="tsd-legend">
<li class="tsd-kind-class"><span class="tsd-kind-icon">Class</span></li>
<li class="tsd-kind-class tsd-has-type-parameter"><span class="tsd-kind-icon">Class with type parameter</span></li>
<li class="tsd-kind-interface tsd-has-type-parameter"><span class="tsd-kind-icon">Interface with type parameter</span></li>
</ul>
<ul class="tsd-legend">
<li class="tsd-kind-interface tsd-has-type-parameter"><span class="tsd-kind-icon">Interface with type parameter</span></li>
<li class="tsd-kind-class tsd-has-type-parameter"><span class="tsd-kind-icon">Class with type parameter</span></li>
</ul>
</div>
</div>
Expand Down
5 changes: 2 additions & 3 deletions docs/modules/WorkerManagerInterface.html
Original file line number Diff line number Diff line change
Expand Up @@ -124,11 +124,10 @@ <h2>Legend</h2>
<li class="tsd-kind-type-alias"><span class="tsd-kind-icon">Type alias</span></li>
</ul>
<ul class="tsd-legend">
<li class="tsd-kind-class"><span class="tsd-kind-icon">Class</span></li>
<li class="tsd-kind-class tsd-has-type-parameter"><span class="tsd-kind-icon">Class with type parameter</span></li>
<li class="tsd-kind-interface tsd-has-type-parameter"><span class="tsd-kind-icon">Interface with type parameter</span></li>
</ul>
<ul class="tsd-legend">
<li class="tsd-kind-interface tsd-has-type-parameter"><span class="tsd-kind-icon">Interface with type parameter</span></li>
<li class="tsd-kind-class tsd-has-type-parameter"><span class="tsd-kind-icon">Class with type parameter</span></li>
</ul>
</div>
</div>
Expand Down
15 changes: 7 additions & 8 deletions docs/modules/errors.html
Original file line number Diff line number Diff line change
Expand Up @@ -72,8 +72,8 @@ <h2>Index</h2>
<section class="tsd-index-section ">
<h3>Classes</h3>
<ul class="tsd-index-list">
<li class="tsd-kind-class tsd-parent-kind-module"><a href="../classes/errors.ErrorWorkerManager.html" class="tsd-kind-icon">Error<wbr>Worker<wbr>Manager</a></li>
<li class="tsd-kind-class tsd-parent-kind-module"><a href="../classes/errors.ErrorWorkerManagerNotRunning.html" class="tsd-kind-icon">Error<wbr>Worker<wbr>Manager<wbr>Not<wbr>Running</a></li>
<li class="tsd-kind-class tsd-parent-kind-module tsd-has-type-parameter"><a href="../classes/errors.ErrorWorkerManager.html" class="tsd-kind-icon">Error<wbr>Worker<wbr>Manager</a></li>
<li class="tsd-kind-class tsd-parent-kind-module tsd-has-type-parameter"><a href="../classes/errors.ErrorWorkerManagerDestroyed.html" class="tsd-kind-icon">Error<wbr>Worker<wbr>Manager<wbr>Destroyed</a></li>
</ul>
</section>
</div>
Expand Down Expand Up @@ -108,11 +108,11 @@ <h3>Classes</h3>
</nav>
<nav class="tsd-navigation secondary menu-sticky">
<ul class="before-current">
<li class=" tsd-kind-class tsd-parent-kind-module">
<li class=" tsd-kind-class tsd-parent-kind-module tsd-has-type-parameter">
<a href="../classes/errors.ErrorWorkerManager.html" class="tsd-kind-icon">Error<wbr>Worker<wbr>Manager</a>
</li>
<li class=" tsd-kind-class tsd-parent-kind-module">
<a href="../classes/errors.ErrorWorkerManagerNotRunning.html" class="tsd-kind-icon">Error<wbr>Worker<wbr>Manager<wbr>Not<wbr>Running</a>
<li class=" tsd-kind-class tsd-parent-kind-module tsd-has-type-parameter">
<a href="../classes/errors.ErrorWorkerManagerDestroyed.html" class="tsd-kind-icon">Error<wbr>Worker<wbr>Manager<wbr>Destroyed</a>
</li>
</ul>
</nav>
Expand All @@ -128,11 +128,10 @@ <h2>Legend</h2>
<li class="tsd-kind-type-alias"><span class="tsd-kind-icon">Type alias</span></li>
</ul>
<ul class="tsd-legend">
<li class="tsd-kind-class"><span class="tsd-kind-icon">Class</span></li>
<li class="tsd-kind-class tsd-has-type-parameter"><span class="tsd-kind-icon">Class with type parameter</span></li>
<li class="tsd-kind-interface tsd-has-type-parameter"><span class="tsd-kind-icon">Interface with type parameter</span></li>
</ul>
<ul class="tsd-legend">
<li class="tsd-kind-interface tsd-has-type-parameter"><span class="tsd-kind-icon">Interface with type parameter</span></li>
<li class="tsd-kind-class tsd-has-type-parameter"><span class="tsd-kind-icon">Class with type parameter</span></li>
</ul>
</div>
</div>
Expand Down
5 changes: 2 additions & 3 deletions docs/modules/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -168,11 +168,10 @@ <h2>Legend</h2>
<li class="tsd-kind-type-alias"><span class="tsd-kind-icon">Type alias</span></li>
</ul>
<ul class="tsd-legend">
<li class="tsd-kind-class"><span class="tsd-kind-icon">Class</span></li>
<li class="tsd-kind-class tsd-has-type-parameter"><span class="tsd-kind-icon">Class with type parameter</span></li>
<li class="tsd-kind-interface tsd-has-type-parameter"><span class="tsd-kind-icon">Interface with type parameter</span></li>
</ul>
<ul class="tsd-legend">
<li class="tsd-kind-interface tsd-has-type-parameter"><span class="tsd-kind-icon">Interface with type parameter</span></li>
<li class="tsd-kind-class tsd-has-type-parameter"><span class="tsd-kind-icon">Class with type parameter</span></li>
</ul>
</div>
</div>
Expand Down
5 changes: 2 additions & 3 deletions docs/modules/worker.html
Original file line number Diff line number Diff line change
Expand Up @@ -132,11 +132,10 @@ <h2>Legend</h2>
<li class="tsd-kind-type-alias"><span class="tsd-kind-icon">Type alias</span></li>
</ul>
<ul class="tsd-legend">
<li class="tsd-kind-class"><span class="tsd-kind-icon">Class</span></li>
<li class="tsd-kind-class tsd-has-type-parameter"><span class="tsd-kind-icon">Class with type parameter</span></li>
<li class="tsd-kind-interface tsd-has-type-parameter"><span class="tsd-kind-icon">Interface with type parameter</span></li>
</ul>
<ul class="tsd-legend">
<li class="tsd-kind-interface tsd-has-type-parameter"><span class="tsd-kind-icon">Interface with type parameter</span></li>
<li class="tsd-kind-class tsd-has-type-parameter"><span class="tsd-kind-icon">Class with type parameter</span></li>
</ul>
</div>
</div>
Expand Down
5 changes: 2 additions & 3 deletions docs/modules/workerModule.html
Original file line number Diff line number Diff line change
Expand Up @@ -251,11 +251,10 @@ <h2>Legend</h2>
<li class="tsd-kind-type-alias"><span class="tsd-kind-icon">Type alias</span></li>
</ul>
<ul class="tsd-legend">
<li class="tsd-kind-class"><span class="tsd-kind-icon">Class</span></li>
<li class="tsd-kind-class tsd-has-type-parameter"><span class="tsd-kind-icon">Class with type parameter</span></li>
<li class="tsd-kind-interface tsd-has-type-parameter"><span class="tsd-kind-icon">Interface with type parameter</span></li>
</ul>
<ul class="tsd-legend">
<li class="tsd-kind-interface tsd-has-type-parameter"><span class="tsd-kind-icon">Interface with type parameter</span></li>
<li class="tsd-kind-class tsd-has-type-parameter"><span class="tsd-kind-icon">Class with type parameter</span></li>
</ul>
</div>
</div>
Expand Down
47 changes: 47 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 3 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,10 @@
"bench": "ts-node -r tsconfig-paths/register ./benches"
},
"dependencies": {
"@matrixai/async-init": "^1.7.0",
"@matrixai/logger": "^2.1.0",
"threads": "^1.6.5",
"ts-custom-error": "^3.2.0"
"@matrixai/errors": "^1.0.1",
"threads": "^1.6.5"
},
"devDependencies": {
"@types/jest": "^26.0.20",
Expand Down
37 changes: 7 additions & 30 deletions src/WorkerManager.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
import type { ModuleThread } from 'threads';
import type { ModuleMethods } from 'threads/dist/types/master';
import type { QueuedTask } from 'threads/dist/master/pool-types';

import { Pool } from 'threads';
import Logger from '@matrixai/logger';
import { CreateDestroy, ready } from '@matrixai/async-init/dist/CreateDestroy';
import WorkerManagerInterface from './WorkerManagerInterface';
import * as errors from './errors';

@CreateDestroy()
class WorkerManager<W extends ModuleMethods>
implements WorkerManagerInterface<W>
{
Expand Down Expand Up @@ -43,10 +44,8 @@ class WorkerManager<W extends ModuleMethods>

protected pool: Pool<ModuleThread<W>>;
protected logger: Logger;
protected _running: boolean = false;
protected _destroyed: boolean = false;

protected constructor({
public constructor({
workerFactory,
cores,
logger,
Expand All @@ -57,57 +56,35 @@ class WorkerManager<W extends ModuleMethods>
}) {
this.logger = logger;
this.pool = Pool(workerFactory, cores);
this._running = true;
}

get running(): boolean {
return this._running;
}

get destroyed(): boolean {
return this._destroyed;
}

public async destroy({
force = false,
}: { force?: boolean } = {}): Promise<void> {
if (this._destroyed) {
return;
}
this.logger.info('Destroying WorkerManager');
await this.pool.terminate(force);
this._running = false;
this._destroyed = true;
this.logger.info('Destroyed WorkerManager');
}

@ready(new errors.ErrorWorkerManagerDestroyed())
public async call<T>(f: (worker: ModuleThread<W>) => Promise<T>): Promise<T> {
if (!this._running) {
throw new errors.ErrorWorkerManagerNotRunning();
}
return await this.pool.queue(f);
}

@ready(new errors.ErrorWorkerManagerDestroyed())
public queue<T>(
f: (worker: ModuleThread<W>) => Promise<T>,
): QueuedTask<ModuleThread<W>, T> {
if (!this._running) {
throw new errors.ErrorWorkerManagerNotRunning();
}
return this.pool.queue(f);
}

@ready(new errors.ErrorWorkerManagerDestroyed())
public async completed(): Promise<void> {
if (!this._running) {
throw new errors.ErrorWorkerManagerNotRunning();
}
return await this.pool.completed();
}

@ready(new errors.ErrorWorkerManagerDestroyed())
public async settled() {
if (!this._running) {
throw new errors.ErrorWorkerManagerNotRunning();
}
return await this.pool.settled();
}
}
Expand Down
2 changes: 1 addition & 1 deletion src/WorkerManagerInterface.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import type { ModuleMethods } from 'threads/dist/types/master';
import type { QueuedTask } from 'threads/dist/master/pool-types';

interface WorkerManagerInterface<W extends ModuleMethods> {
destroy(): Promise<void>;
destroy(options: { force?: boolean }): Promise<void>;
call<T>(f: (worker: ModuleThread<W>) => Promise<T>): Promise<T>;
queue<T>(
f: (worker: ModuleThread<W>) => Promise<T>,
Expand Down
12 changes: 8 additions & 4 deletions src/errors.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
import { CustomError } from 'ts-custom-error';
import { AbstractError } from '@matrixai/errors';

class ErrorWorkerManager extends CustomError {}
class ErrorWorkerManager<T> extends AbstractError<T> {
static description = 'WorkerManager error';
}

class ErrorWorkerManagerNotRunning extends ErrorWorkerManager {}
class ErrorWorkerManagerDestroyed<T> extends ErrorWorkerManager<T> {
static description = 'WorkerManager is destroyed';
}

export { ErrorWorkerManager, ErrorWorkerManagerNotRunning };
export { ErrorWorkerManager, ErrorWorkerManagerDestroyed };
9 changes: 4 additions & 5 deletions tests/WorkerManager.test.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import type { WorkerModule } from '@/worker';
import { spawn, Worker, Transfer } from 'threads';
import Logger, { LogLevel, StreamHandler } from '@matrixai/logger';
import { destroyed } from '@matrixai/async-init';
import WorkerManager from '@/WorkerManager';
import * as errors from '@/errors';
import * as testUtils from './utils';
Expand All @@ -16,14 +17,12 @@ describe('WorkerManager', () => {
logger,
},
);
expect(workerManager.running).toBe(true);
expect(workerManager.destroyed).toBe(false);
expect(workerManager[destroyed]).toBe(false);
expect(await workerManager.call(async () => 1)).toBe(1);
await workerManager.destroy();
expect(workerManager.running).toBe(false);
expect(workerManager.destroyed).toBe(true);
expect(workerManager[destroyed]).toBe(true);
expect(workerManager.call(async () => 1)).rejects.toThrow(
errors.ErrorWorkerManagerNotRunning,
errors.ErrorWorkerManagerDestroyed,
);
});
test('starting with 0 worker cores is useless', async () => {
Expand Down
1 change: 1 addition & 0 deletions tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
"allowJs": true,
"strictNullChecks": true,
"noImplicitAny": false,
"experimentalDecorators": true,
"esModuleInterop": true,
"allowSyntheticDefaultImports": true,
"resolveJsonModule": true,
Expand Down

0 comments on commit 17e7ece

Please sign in to comment.