@5minds/processcube_engine
Version:
The ProcessCube Engine. Stores and executes BPMNs.
70 lines • 2.62 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.Bootstrapper = void 0;
const Constants_1 = require("../Contracts/InternalDataModels/Constants");
class Bootstrapper {
container;
extensionInstances = [];
constructor(container) {
if (!container) {
throw new Error('IoC container is required.');
}
this.container = container;
}
async start() {
await this.startExtensionsAndInitialize();
}
async stop() {
await this.stopExtensions();
await this.disposeServices();
}
async startExtensionsAndInitialize() {
const initializableComponents = this.container.getAll(Constants_1.initializableComponentTag);
for (const initializableComponent of initializableComponents) {
await initializableComponent.initialize();
}
const extensions = await this.discoverExtensions();
await Promise.all(extensions.map((extension) => this.startExtension(extension)));
}
async startExtension(instance) {
await this.invoke(instance.start, instance);
this.extensionInstances.push(instance);
}
async stopExtensions() {
for (const extensionInstance of this.extensionInstances) {
await this.stopExtension(extensionInstance);
}
}
async stopExtension(instance) {
await this.invoke(instance.stop, instance);
}
async disposeServices() {
try {
const discoveredDisposableBinding = this.container.getAll(Constants_1.disposableDiscoveryTag);
for (const disposableBinding of discoveredDisposableBinding) {
await this.invoke(disposableBinding.dispose, disposableBinding);
}
}
catch (error) {
// Occurs, if nothing disposable is stored in the container, in which case there's nothing to do here.
}
}
async discoverExtensions() {
try {
return await this.container.getAllAsync(Constants_1.extensionDiscoveryTag);
}
catch {
// Occurs, if no extensions are stored in the container, in which case there's nothing to do here.
return [];
}
}
async invoke(functionToInvoke, invocationContext, invocationParameter) {
const isValidFunction = typeof functionToInvoke === 'function';
if (!isValidFunction) {
return Promise.resolve();
}
return functionToInvoke.call(invocationContext, invocationParameter);
}
}
exports.Bootstrapper = Bootstrapper;
//# sourceMappingURL=Bootstrapper.js.map