https://github.com/matrixai/js-async-init
Asynchronous initialization and deinitialization decorators for JavaScript/TypeScript applications
https://github.com/matrixai/js-async-init
Last synced: 10 months ago
JSON representation
Asynchronous initialization and deinitialization decorators for JavaScript/TypeScript applications
- Host: GitHub
- URL: https://github.com/matrixai/js-async-init
- Owner: MatrixAI
- License: apache-2.0
- Created: 2021-09-29T09:59:02.000Z (over 4 years ago)
- Default Branch: staging
- Last Pushed: 2025-02-04T01:27:53.000Z (11 months ago)
- Last Synced: 2025-03-07T06:05:46.831Z (10 months ago)
- Language: TypeScript
- Homepage: https://polykey.com
- Size: 857 KB
- Stars: 2
- Watchers: 5
- Forks: 0
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# 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.
TypeScript does not allow decorator properties that are protected or private.
Example Usage:
```ts
import { CreateDestroyStartStop, ready } from '@matrixai/async-init/dist/CreateDestroyStartStop';
// this hack is necessary to ensure that X's type is decorated
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 this({ y });
await x.start();
return x;
}
public constructor ({ y }: { y: Y }) {
this.y = y;
}
public async start(): Promise {
await this.y.start();
console.log('X started');
}
public async stop(): Promise {
await this.y.stop();
console.log('X stopped');
}
public async destroy(): Promise {
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');
}
}
// this hack is necessary to ensure that Y's type is decorated
interface Y extends CreateDestroyStartStop {};
@CreateDestroyStartStop(new Error('Running'), new Error('Destroyed'))
class Y {
public static async createY() {
return new this();
}
public constructor () {
}
public async destroy(): Promise {
console.log('Y destroyed');
}
@ready(new Error('Not Running'))
public async doSomething(): Promise {
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();
```
The `start`, `stop`, and `destroy` calls are all concurrent-controlled with `RWLockWriter`. They are idempotent and they are mutually exclusive between each other and any blocking `ready` decorated methods. Decorated methods can block `start`, `stop`, and `destroy`, but share a read lock between each other.
Refer to https://gist.github.com/CMCDragonkai/1dbf5069d9efc11585c27cc774271584 for further the motivation of this library.
## Installation
```sh
npm install --save @matrixai/async-init
```
## Development
Run `nix develop`, and once you're inside, you can use:
```sh
# install (or reinstall packages from package.json)
npm install
# build the dist
npm run build
# run the repl (this allows you to import from ./src)
npm run tsx
# run the tests
npm run test
# lint the source code
npm run lint
# automatically fix the source
npm run lintfix
```
### Docs Generation
```sh
npm run docs
```
See the docs at: https://matrixai.github.io/js-async-init/
### Publishing
Publishing is handled automatically by the staging pipeline.
Prerelease:
```sh
# npm login
npm version prepatch --preid alpha # premajor/preminor/prepatch
git push --follow-tags
```
Release:
```sh
# npm login
npm version patch # major/minor/patch
git push --follow-tags
```
Manually:
```sh
# npm login
npm version patch # major/minor/patch
npm run build
npm publish --access public
git push
git push --tags
```