This is a TypeScript library inspired by the Clojure(script) components lib by Stuart Sierra. Its job is to manage dependencies and lifecycle of statefull components in your application.
npm i ts-system-components
or
yarn add ts-system-components
Each component of your system should implement the Component
protocol. The Component
protocol requires two methods, start
and stop
. These methods should be responsible for starting and stopping the component. They should return a Promise, and are usually used with async.
class Database implements Component {
// Make this component require the Config component.
private readonly config: Config
constructor(config: Config) {
this.config = config
}
async start() {
this.connection = await createConnection()
}
async stop() {
this.connection?.close()
}
}
After defining your components, you can group them in a System, to describe the dependencies between them.
Your system should extend the System
class, and each component should be a property annotated with the
<YourSystemName>.Using()
Decorator. This Decorator receives two arguments. The first is the dependencies of this
component, this should be a list of other components declared in your system. The second is a builder function which will receive a map
with the dependencies you requested, and should return a new instance of you component.
class MySystem extends System {
@MySystem.Using([], () => new Config())
config!: Config
@MySystem.Using(['config'], ({config}) => new Database(config))
database!: Database
}
To start the system you can just create a new instance and call .start()
The library will ensure that each component is instantiated and started before being provided to the downstream
components.
const system = new MySystem()
await system.start()
To stop the system, just call stop()
await system.stop()