js-async-init
Asynchronous initialization and deinitialization decorators for JavaScript/TypeScript applications.
Because decorators are experimental, you must enable: "experimentalDecorators": true
in your tsconfig.json
to use this library.
Example Usage:
import { CreateDestroyStartStop, ready } from '@matrixai/async-init/dist/CreateDestroyStartStop';
interface X extends CreateDestroyStartStop {};
@CreateDestroyStartStop(new Error('Running'), new Error('Destroyed'))
class X {
protected y: Y;
public static async createX(
{
y
}: {
y?: Y
} = {}
) {
y = y ?? await Y.createY();
const x = new X({ y });
await x.start();
return x;
}
public constructor ({ y }: { y: Y }) {
this.y = y;
}
public async start(): Promise<void> {
await this.y.start();
console.log('X started');
}
public async stop(): Promise<void> {
await this.y.stop();
console.log('X stopped');
}
public async destroy(): Promise<void> {
await this.y.destroy();
console.log('X destroyed');
}
@ready(new Error('Not Running'))
public async doSomething() {
await this.y.doSomething();
console.log('X did something');
}
}
interface Y extends CreateDestroyStartStop {};
@CreateDestroyStartStop(new Error('Running'), new Error('Destroyed'))
class Y {
public static async createY() {
return new Y;
}
public constructor () {
}
public async destroy(): Promise<void> {
console.log('Y destroyed');
}
@ready(new Error('Not Running'))
public async doSomething(): Promise<void> {
console.log('Y did something');
}
}
async function main () {
const x = await X.createX();
await x.doSomething();
await x.stop();
await x.destroy();
console.log(x);
}
main();
Note that it is unsafe to call the create, destroy, start and stop methods concurrently with other method calls. There is no concurrency control. Instead a simple method of making the methods idempotent is used.
Note that start
, stop
and destroy
are idempotent. This means repeated calls are noops.
Refer to https://gist.github.com/CMCDragonkai/1dbf5069d9efc11585c27cc774271584 for further the motivation of this library.
Installation
npm install --save @matrixai/async-init
Development
Run nix-shell
, and once you're inside, you can use:
npm install
npm run build
npm run ts-node
npm run test
npm run lint
npm run lintfix
Docs Generation
npm run docs
See the docs at: https://matrixai.github.io/js-async-init/
Publishing
npm version patch
npm run build
npm publish --access public
git push
git push --tags