bpmn-elements
Version:
Executable workflow elements based on BPMN 2.0
90 lines (73 loc) • 2.74 kB
JavaScript
import { cloneMessage } from './messageHelper.js';
import { getUniqueId } from './shared.js';
export function ActivityApi(broker, apiMessage, environment) {
return new Api('activity', broker, apiMessage, environment);
}
export function DefinitionApi(broker, apiMessage, environment) {
return new Api('definition', broker, apiMessage, environment);
}
export function ProcessApi(broker, apiMessage, environment) {
return new Api('process', broker, apiMessage, environment);
}
export function FlowApi(broker, apiMessage, environment) {
return new Api('flow', broker, apiMessage, environment);
}
export function Api(pfx, broker, sourceMessage, environment) {
if (!sourceMessage) throw new Error('Api requires message');
const apiMessage = cloneMessage(sourceMessage);
const { id, type, name, executionId } = apiMessage.content;
this.id = id;
this.type = type;
this.name = name;
this.executionId = executionId;
this.environment = environment || broker.owner.environment;
this.content = apiMessage.content;
this.fields = apiMessage.fields;
this.messageProperties = apiMessage.properties;
this.broker = broker;
this.owner = broker.owner;
this.messagePrefix = pfx;
}
Api.prototype.cancel = function cancel(message, options) {
this.sendApiMessage('cancel', { message }, options);
};
Api.prototype.discard = function discard() {
this.sendApiMessage('discard');
};
Api.prototype.fail = function fail(error) {
this.sendApiMessage('error', { error });
};
Api.prototype.signal = function signal(message, options) {
this.sendApiMessage('signal', { message }, options);
};
Api.prototype.stop = function stop() {
this.sendApiMessage('stop');
};
Api.prototype.resolveExpression = function resolveExpression(expression) {
return this.environment.resolveExpression(
expression,
{
fields: this.fields,
content: this.content,
properties: this.messageProperties,
},
this.owner
);
};
Api.prototype.sendApiMessage = function sendApiMessage(action, content, options) {
const correlationId = options?.correlationId || getUniqueId(`${this.id || this.messagePrefix}_signal`);
let key = `${this.messagePrefix}.${action}`;
if (this.executionId) key += `.${this.executionId}`;
this.broker.publish('api', key, this.createMessage(content), { ...options, correlationId, type: action });
};
Api.prototype.getPostponed = function getPostponed(...args) {
if (this.owner.getPostponed) return this.owner.getPostponed(...args);
if (this.owner.isSubProcess && this.owner.execution) return this.owner.execution.getPostponed(...args);
return [];
};
Api.prototype.createMessage = function createMessage(content) {
return {
...this.content,
...content,
};
};