@bitloops/bl-boilerplate-core
Version:
TypeScript boilerplate code for Bitloops Language generated projects
51 lines (50 loc) • 2.17 kB
JavaScript
import { UUIDv4 } from '../domain/UUIDv4.js';
import { asyncLocalStorage } from '../helpers/asyncLocalStorage.js';
const CONTEXT = 'context';
export class OrchestratorHandler {
get orchestratorNameId() {
return this.constructor.name;
}
isTriggerMessage(message) {
return message.metadata.name === this.triggerMessage.name;
}
async trigger(message) {
const orchestratorName = this.constructor.name;
const orchestratorInstanceId = new UUIDv4().toString() + '-' + orchestratorName;
const store = asyncLocalStorage.getStore();
if (!store) {
throw new Error('No store found, did you forget to attach correlation middleware?');
}
const ctx = store.get(CONTEXT);
const alreadyCreatedOrchestratorInstanceIds = ctx.orchestratorInstanceIds
? JSON.parse(ctx.orchestratorInstanceIds)
: {};
const ctxWithOrchestratorInstanceId = {
...ctx,
orchestratorInstanceIds: JSON.stringify({
...alreadyCreatedOrchestratorInstanceIds,
[orchestratorName]: orchestratorInstanceId,
}),
};
store.set(CONTEXT, ctxWithOrchestratorInstanceId);
if (!message.metadata.context.orchestratorInstanceIds) {
message.metadata.context.orchestratorInstanceIds = JSON.stringify({});
}
const orchestratorInstanceIds = JSON.parse(message.metadata.context.orchestratorInstanceIds);
orchestratorInstanceIds[orchestratorName] = orchestratorInstanceId;
message.metadata.context.orchestratorInstanceIds = JSON.stringify(orchestratorInstanceIds);
}
getOrchestratorNameId() {
return {
orchestratorNameId: this.orchestratorNameId,
};
}
isGeneratedByOrchestrator(message) {
const orchestratorInstanceIdStr = message.metadata.context.orchestratorInstanceIds;
if (!orchestratorInstanceIdStr) {
return true;
}
const orchestratorInstanceIds = JSON.parse(orchestratorInstanceIdStr);
return orchestratorInstanceIds?.[this.constructor.name] !== undefined;
}
}