@onify/flow-extensions 4.0.0 → 4.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +4 -0
- package/README.md +89 -0
- package/dist/index.js +7 -0
- package/dist/src/ExecutionListeners.js +11 -5
- package/dist/src/FlowScripts.js +1 -1
- package/dist/src/OnifyElementExtensions.js +7 -6
- package/dist/src/OnifySequenceFlow.js +52 -0
- package/dist/src/getExtensions.js +37 -29
- package/index.js +2 -0
- package/package.json +12 -12
- package/src/ExecutionListeners.js +12 -6
- package/src/OnifyElementExtensions.js +7 -7
- package/src/OnifySequenceFlow.js +45 -0
- package/src/getExtensions.js +35 -27
package/CHANGELOG.md
CHANGED
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
Changelog
|
|
2
2
|
=========
|
|
3
3
|
|
|
4
|
+
# 4.1.0
|
|
5
|
+
|
|
6
|
+
- Support sequence flow properties and take execution listener. Requires `bpmn-elements >= 9.2`
|
|
7
|
+
|
|
4
8
|
# 4.0.0
|
|
5
9
|
|
|
6
10
|
- make sure sub-process extensions are only triggered once. Sub process activities unintentionally trigger formatting since events bubble
|
package/README.md
CHANGED
|
@@ -120,3 +120,92 @@ function getModdleContext(source, options) {
|
|
|
120
120
|
return bpmnModdle.fromXML(Buffer.isBuffer(source) ? source.toString() : source.trim());
|
|
121
121
|
}
|
|
122
122
|
```
|
|
123
|
+
|
|
124
|
+
## Extend sequence flow with properties and take listeners
|
|
125
|
+
|
|
126
|
+
```js
|
|
127
|
+
const {OnifySequenceFlow, extensions} = require('@onify/flow-extensions');
|
|
128
|
+
const FlowScripts = require('@onify/flow-extensions/dist/src/FlowScripts');
|
|
129
|
+
const {Engine} = require('bpmn-engine');
|
|
130
|
+
const Elements = require('bpmn-elements');
|
|
131
|
+
|
|
132
|
+
const source = `
|
|
133
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
134
|
+
<definitions
|
|
135
|
+
id="Def_0"
|
|
136
|
+
xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
|
|
137
|
+
xmlns:camunda="http://camunda.org/schema/1.0/bpmn"
|
|
138
|
+
targetNamespace="http://bpmn.io/schema/bpmn">
|
|
139
|
+
<process id="Process_1kk79yr" isExecutable="true">
|
|
140
|
+
<startEvent id="start" />
|
|
141
|
+
<sequenceFlow id="to-script" sourceRef="start" targetRef="script">
|
|
142
|
+
<extensionElements>
|
|
143
|
+
<camunda:properties>
|
|
144
|
+
<camunda:property name="source" value="\${content.id}" />
|
|
145
|
+
</camunda:properties>
|
|
146
|
+
<camunda:executionListener event="take">
|
|
147
|
+
<camunda:script scriptFormat="js">environment.output.fields = listener.fields; next();</camunda:script>
|
|
148
|
+
<camunda:field name="taken">
|
|
149
|
+
<camunda:expression>\${true}</camunda:expression>
|
|
150
|
+
</camunda:field>
|
|
151
|
+
<camunda:field name="bar">
|
|
152
|
+
<camunda:string>baz</camunda:string>
|
|
153
|
+
</camunda:field>
|
|
154
|
+
</camunda:executionListener>
|
|
155
|
+
</extensionElements>
|
|
156
|
+
</sequenceFlow>
|
|
157
|
+
<sequenceFlow id="to-end" sourceRef="script" targetRef="end">
|
|
158
|
+
<extensionElements>
|
|
159
|
+
<camunda:properties>
|
|
160
|
+
<camunda:property name="foo" value="bar" />
|
|
161
|
+
</camunda:properties>
|
|
162
|
+
</extensionElements>
|
|
163
|
+
</sequenceFlow>
|
|
164
|
+
<scriptTask id="script" name="script" scriptFormat="js">
|
|
165
|
+
<script>next(null, { foo: environment.variables.required.input });</script>
|
|
166
|
+
</scriptTask>
|
|
167
|
+
<boundaryEvent id="catch-err" attachedToRef="script">
|
|
168
|
+
<errorEventDefinition />
|
|
169
|
+
</boundaryEvent>
|
|
170
|
+
<endEvent id="end-err">
|
|
171
|
+
<extensionElements>
|
|
172
|
+
<camunda:executionListener event="start">
|
|
173
|
+
<camunda:script scriptFormat="js">
|
|
174
|
+
environment.output.failedBy = content.inbound[0].properties.error;
|
|
175
|
+
if (next) next();
|
|
176
|
+
</camunda:script>
|
|
177
|
+
</camunda:executionListener>
|
|
178
|
+
</extensionElements>
|
|
179
|
+
</endEvent>
|
|
180
|
+
<sequenceFlow id="to-end-err" sourceRef="catch-err" targetRef="end-err">
|
|
181
|
+
<extensionElements>
|
|
182
|
+
<camunda:properties>
|
|
183
|
+
<camunda:property name="error" value="\${content.output}" />
|
|
184
|
+
</camunda:properties>
|
|
185
|
+
</extensionElements>
|
|
186
|
+
</sequenceFlow>
|
|
187
|
+
<endEvent id="end" />
|
|
188
|
+
</process>
|
|
189
|
+
</definitions>`;
|
|
190
|
+
|
|
191
|
+
const engine = new Engine({
|
|
192
|
+
name: 'sequence flow extension',
|
|
193
|
+
source,
|
|
194
|
+
moddleOptions: {
|
|
195
|
+
camunda: require('camunda-bpmn-moddle/resources/camunda.json'),
|
|
196
|
+
},
|
|
197
|
+
extensions: {
|
|
198
|
+
onify: extensions,
|
|
199
|
+
},
|
|
200
|
+
scripts: new FlowScripts('sequence flow extension'),
|
|
201
|
+
elements: {
|
|
202
|
+
...Elements,
|
|
203
|
+
SequenceFlow: OnifySequenceFlow,
|
|
204
|
+
},
|
|
205
|
+
});
|
|
206
|
+
|
|
207
|
+
engine.execute((err, instance) => {
|
|
208
|
+
if (err) throw err;
|
|
209
|
+
console.log(instance.name, instance.environment.output);
|
|
210
|
+
});
|
|
211
|
+
```
|
package/dist/index.js
CHANGED
|
@@ -3,10 +3,17 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
+
Object.defineProperty(exports, "OnifySequenceFlow", {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
get: function () {
|
|
9
|
+
return _OnifySequenceFlow.OnifySequenceFlow;
|
|
10
|
+
}
|
|
11
|
+
});
|
|
6
12
|
exports.extendFn = extendFn;
|
|
7
13
|
exports.extensions = extensions;
|
|
8
14
|
var _OnifyProcessExtensions = require("./src/OnifyProcessExtensions.js");
|
|
9
15
|
var _OnifyElementExtensions = require("./src/OnifyElementExtensions.js");
|
|
16
|
+
var _OnifySequenceFlow = require("./src/OnifySequenceFlow.js");
|
|
10
17
|
function extensions(element, context) {
|
|
11
18
|
if (element.type === 'bpmn:Process') return new _OnifyProcessExtensions.OnifyProcessExtensions(element, context);
|
|
12
19
|
return new _OnifyElementExtensions.OnifyElementExtensions(element, context);
|
|
@@ -62,6 +62,8 @@ class ScriptListener extends Listener {
|
|
|
62
62
|
id: this.id,
|
|
63
63
|
resolveExpression
|
|
64
64
|
});
|
|
65
|
+
const listenerFields = this._getFields(environment, scope);
|
|
66
|
+
if (listenerFields) scope.listener.fields = listenerFields;
|
|
65
67
|
const script = this.environment.scripts.getScript(this.extension.scriptFormat, {
|
|
66
68
|
id: this.id
|
|
67
69
|
});
|
|
@@ -109,23 +111,27 @@ class ExecutionListeners {
|
|
|
109
111
|
this.activity = activity;
|
|
110
112
|
this.context = context;
|
|
111
113
|
this.listeners = [];
|
|
112
|
-
this.onStart = false;
|
|
113
|
-
this.onEnd = false;
|
|
114
114
|
}
|
|
115
115
|
get length() {
|
|
116
116
|
return this.listeners.length;
|
|
117
117
|
}
|
|
118
|
+
get onStart() {
|
|
119
|
+
return this.listeners.some(l => l.event === 'start');
|
|
120
|
+
}
|
|
121
|
+
get onEnd() {
|
|
122
|
+
return this.listeners.some(l => l.event === 'end');
|
|
123
|
+
}
|
|
124
|
+
get onTake() {
|
|
125
|
+
return this.listeners.some(l => l.event === 'take');
|
|
126
|
+
}
|
|
118
127
|
add(extension, pos) {
|
|
119
128
|
const {
|
|
120
|
-
event,
|
|
121
129
|
script,
|
|
122
130
|
expression
|
|
123
131
|
} = extension;
|
|
124
132
|
if (!script && !expression) return;
|
|
125
133
|
const list = this.listeners;
|
|
126
134
|
if (script && (script.value || script.resource)) list.push(new ScriptListener(this.activity, this.context, extension, pos));else if (expression) list.push(new ExpressionListener(this.activity, this.context, extension));
|
|
127
|
-
if (event === 'start') this.onStart = true;
|
|
128
|
-
if (event === 'end') this.onEnd = true;
|
|
129
135
|
}
|
|
130
136
|
async execute(event, message) {
|
|
131
137
|
const found = this.listeners.filter(l => l.event === event);
|
package/dist/src/FlowScripts.js
CHANGED
|
@@ -80,7 +80,7 @@ FlowScripts.prototype.register = function register({
|
|
|
80
80
|
resource = behaviour.resource;
|
|
81
81
|
}
|
|
82
82
|
}
|
|
83
|
-
if (!language)
|
|
83
|
+
if (!language) return;
|
|
84
84
|
if (!['js', 'javascript'].includes(language.toLowerCase().trim())) return;
|
|
85
85
|
language = 'javascript';
|
|
86
86
|
const name = this._name;
|
|
@@ -20,6 +20,7 @@ class OnifyElementExtensions {
|
|
|
20
20
|
const activity = this.activity;
|
|
21
21
|
const broker = activity.broker;
|
|
22
22
|
const formatQ = activity.broker.getQueue('format-run-q');
|
|
23
|
+
const executionListeners = this.extensions.listeners;
|
|
23
24
|
if (message.fields.redelivered && message.fields.routingKey === 'run.start') {
|
|
24
25
|
activity.on('start', elementApi => {
|
|
25
26
|
this._formatOnEnter(broker, formatQ, elementApi);
|
|
@@ -59,7 +60,6 @@ class OnifyElementExtensions {
|
|
|
59
60
|
}, {
|
|
60
61
|
consumerTag: '_onify-extension-on-executed'
|
|
61
62
|
});
|
|
62
|
-
const executionListeners = this.extensions.listeners;
|
|
63
63
|
if (executionListeners !== null && executionListeners !== void 0 && executionListeners.onStart) {
|
|
64
64
|
activity.on('start', async elementApi => {
|
|
65
65
|
if (activity.isSubProcess && activity.id !== elementApi.id) return;
|
|
@@ -211,11 +211,12 @@ class OnifyElementExtensions {
|
|
|
211
211
|
assignToOutput,
|
|
212
212
|
resultVariable
|
|
213
213
|
} = elementApi.content;
|
|
214
|
-
if (output
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
214
|
+
if (output !== undefined && output !== null) {
|
|
215
|
+
if (assignToOutput && typeof output === 'object') {
|
|
216
|
+
Object.assign(this.activity.environment.output, output);
|
|
217
|
+
} else if (resultVariable) {
|
|
218
|
+
elementApi.environment.output[resultVariable] = output;
|
|
219
|
+
}
|
|
219
220
|
}
|
|
220
221
|
return result;
|
|
221
222
|
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.OnifySequenceFlow = void 0;
|
|
7
|
+
var _bpmnElements = require("bpmn-elements");
|
|
8
|
+
var _getExtensions = require("./getExtensions.js");
|
|
9
|
+
class OnifySequenceFlow extends _bpmnElements.SequenceFlow {
|
|
10
|
+
constructor(flowDef, context) {
|
|
11
|
+
super(flowDef, context);
|
|
12
|
+
this.extensions = (0, _getExtensions.getExtensions)(this, context);
|
|
13
|
+
this._activate();
|
|
14
|
+
}
|
|
15
|
+
_activate() {
|
|
16
|
+
var _this$extensions$list;
|
|
17
|
+
if (!((_this$extensions$list = this.extensions.listeners) !== null && _this$extensions$list !== void 0 && _this$extensions$list.onTake)) return;
|
|
18
|
+
this.broker.subscribeTmp('event', 'flow.take', (_, msg) => {
|
|
19
|
+
this._executeListeners(msg);
|
|
20
|
+
}, {
|
|
21
|
+
noAck: true,
|
|
22
|
+
consumerTag: '_onify-execution-listener'
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
async _executeListeners(message) {
|
|
26
|
+
try {
|
|
27
|
+
await this.extensions.listeners.execute('take', message);
|
|
28
|
+
} catch (err) {
|
|
29
|
+
this.logger.error(`<${this.id}> execution listener error: ${err}`);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
evaluate(fromMessage, callback) {
|
|
33
|
+
const properties = this.extensions.properties;
|
|
34
|
+
if (!properties) return super.evaluate(fromMessage, callback);
|
|
35
|
+
super.evaluate(fromMessage, (err, result) => {
|
|
36
|
+
if (err) return callback(err);
|
|
37
|
+
try {
|
|
38
|
+
let overriddenResult = result ? {} : false;
|
|
39
|
+
if (result) {
|
|
40
|
+
overriddenResult = {
|
|
41
|
+
...(typeof result === 'object' && result),
|
|
42
|
+
properties: properties.resolve(this.getApi(fromMessage))
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
return callback(err, overriddenResult);
|
|
46
|
+
} catch (formatErr) {
|
|
47
|
+
return callback(formatErr);
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
exports.OnifySequenceFlow = OnifySequenceFlow;
|
|
@@ -14,39 +14,47 @@ var _ServiceExpression = _interopRequireDefault(require("./ServiceExpression.js"
|
|
|
14
14
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
15
15
|
function getExtensions(element, context) {
|
|
16
16
|
var _element$behaviour$ex, _ext$values, _ext$fields;
|
|
17
|
-
const result = {
|
|
18
|
-
|
|
19
|
-
|
|
17
|
+
const result = {};
|
|
18
|
+
switch (element.type) {
|
|
19
|
+
case 'bpmn:SequenceFlow':
|
|
20
|
+
break;
|
|
21
|
+
case 'bpmn:Process':
|
|
22
|
+
result.format = new _formatters.FormatProcess(element);
|
|
23
|
+
break;
|
|
24
|
+
default:
|
|
25
|
+
result.format = new _formatters.FormatActivity(element);
|
|
26
|
+
}
|
|
27
|
+
let listenerPosition = 0;
|
|
28
|
+
const listeners = new _ExecutionListeners.default(element, context);
|
|
20
29
|
const expression = element.behaviour.expression;
|
|
21
30
|
if (expression) result.Service = _ServiceExpression.default;
|
|
22
31
|
const extensions = (_element$behaviour$ex = element.behaviour.extensionElements) === null || _element$behaviour$ex === void 0 ? void 0 : _element$behaviour$ex.values;
|
|
23
|
-
if (
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
inputOutput
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
32
|
+
if (extensions) {
|
|
33
|
+
for (const ext of extensions) {
|
|
34
|
+
switch (ext.$type) {
|
|
35
|
+
case 'camunda:Properties':
|
|
36
|
+
if ((_ext$values = ext.values) !== null && _ext$values !== void 0 && _ext$values.length) result.properties = new _IOProperties.default(element, ext);
|
|
37
|
+
break;
|
|
38
|
+
case 'camunda:InputOutput':
|
|
39
|
+
result.io = new _IO.InputOutput(element.id, ext, context);
|
|
40
|
+
break;
|
|
41
|
+
case 'camunda:FormData':
|
|
42
|
+
if ((_ext$fields = ext.fields) !== null && _ext$fields !== void 0 && _ext$fields.length) result.form = new _IOForm.default(element, ext);
|
|
43
|
+
break;
|
|
44
|
+
case 'camunda:Connector':
|
|
45
|
+
{
|
|
46
|
+
const {
|
|
47
|
+
connectorId,
|
|
48
|
+
inputOutput
|
|
49
|
+
} = ext;
|
|
50
|
+
const io = inputOutput && new _IO.InputOutput(`${element.id}/${ext.$type.toLowerCase()}`, inputOutput, context);
|
|
51
|
+
result.Service = _Connector.default.bind(_Connector.default, connectorId, io);
|
|
52
|
+
break;
|
|
53
|
+
}
|
|
54
|
+
case 'camunda:ExecutionListener':
|
|
55
|
+
listeners.add(ext, listenerPosition++);
|
|
45
56
|
break;
|
|
46
|
-
|
|
47
|
-
case 'camunda:ExecutionListener':
|
|
48
|
-
listeners.add(ext, listener++);
|
|
49
|
-
break;
|
|
57
|
+
}
|
|
50
58
|
}
|
|
51
59
|
}
|
|
52
60
|
if (listeners.length) result.listeners = listeners;
|
package/index.js
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import {OnifyProcessExtensions} from './src/OnifyProcessExtensions.js';
|
|
2
2
|
import {OnifyElementExtensions} from './src/OnifyElementExtensions.js';
|
|
3
|
+
import {OnifySequenceFlow} from './src/OnifySequenceFlow.js';
|
|
3
4
|
|
|
4
5
|
export {
|
|
5
6
|
extensions,
|
|
6
7
|
extendFn,
|
|
8
|
+
OnifySequenceFlow,
|
|
7
9
|
};
|
|
8
10
|
|
|
9
11
|
function extensions(element, context) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@onify/flow-extensions",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.1.0",
|
|
4
4
|
"description": "Onify Flow extensions",
|
|
5
5
|
"module": "index.js",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -35,26 +35,26 @@
|
|
|
35
35
|
"license": "MIT",
|
|
36
36
|
"devDependencies": {
|
|
37
37
|
"@aircall/expression-parser": "^1.0.4",
|
|
38
|
-
"@babel/cli": "^7.
|
|
39
|
-
"@babel/core": "^7.
|
|
40
|
-
"@babel/preset-env": "^7.
|
|
41
|
-
"@babel/register": "^7.
|
|
38
|
+
"@babel/cli": "^7.21.5",
|
|
39
|
+
"@babel/core": "^7.21.5",
|
|
40
|
+
"@babel/preset-env": "^7.21.5",
|
|
41
|
+
"@babel/register": "^7.21.0",
|
|
42
42
|
"bpmn-elements-8-1": "npm:bpmn-elements@8.1",
|
|
43
|
-
"bpmn-engine": "^
|
|
43
|
+
"bpmn-engine": "^16.0.0",
|
|
44
44
|
"bpmn-engine-14": "npm:bpmn-engine@14",
|
|
45
|
-
"bpmn-moddle": "^
|
|
46
|
-
"c8": "^7.
|
|
45
|
+
"bpmn-moddle": "^8.0.1",
|
|
46
|
+
"c8": "^7.13.0",
|
|
47
47
|
"camunda-bpmn-moddle": "^7.0.1",
|
|
48
48
|
"chai": "^4.3.7",
|
|
49
|
-
"chronokinesis": "^
|
|
49
|
+
"chronokinesis": "^5.0.2",
|
|
50
50
|
"debug": "^4.3.4",
|
|
51
|
-
"eslint": "^8.
|
|
51
|
+
"eslint": "^8.39.0",
|
|
52
52
|
"mocha": "^10.2.0",
|
|
53
53
|
"mocha-cakes-2": "^3.3.0",
|
|
54
|
-
"moddle-context-serializer": "^3.
|
|
54
|
+
"moddle-context-serializer": "^3.2.2"
|
|
55
55
|
},
|
|
56
56
|
"dependencies": {
|
|
57
|
-
"cron-parser": "^4.
|
|
57
|
+
"cron-parser": "^4.8.1"
|
|
58
58
|
},
|
|
59
59
|
"files": [
|
|
60
60
|
"src",
|
|
@@ -49,6 +49,8 @@ class ScriptListener extends Listener {
|
|
|
49
49
|
execute(api) {
|
|
50
50
|
const environment = this.environment;
|
|
51
51
|
const scope = this._getScope(api, {id: this.id, resolveExpression});
|
|
52
|
+
const listenerFields = this._getFields(environment, scope);
|
|
53
|
+
if (listenerFields) scope.listener.fields = listenerFields;
|
|
52
54
|
const script = this.environment.scripts.getScript(this.extension.scriptFormat, {id: this.id});
|
|
53
55
|
|
|
54
56
|
return new Promise((resolve, reject) => {
|
|
@@ -97,22 +99,26 @@ export default class ExecutionListeners {
|
|
|
97
99
|
this.activity = activity;
|
|
98
100
|
this.context = context;
|
|
99
101
|
this.listeners = [];
|
|
100
|
-
this.onStart = false;
|
|
101
|
-
this.onEnd = false;
|
|
102
102
|
}
|
|
103
103
|
get length() {
|
|
104
104
|
return this.listeners.length;
|
|
105
105
|
}
|
|
106
|
+
get onStart() {
|
|
107
|
+
return this.listeners.some((l) => l.event === 'start');
|
|
108
|
+
}
|
|
109
|
+
get onEnd() {
|
|
110
|
+
return this.listeners.some((l) => l.event === 'end');
|
|
111
|
+
}
|
|
112
|
+
get onTake() {
|
|
113
|
+
return this.listeners.some((l) => l.event === 'take');
|
|
114
|
+
}
|
|
106
115
|
add(extension, pos) {
|
|
107
|
-
const {
|
|
116
|
+
const {script, expression} = extension;
|
|
108
117
|
if (!script && !expression) return;
|
|
109
118
|
|
|
110
119
|
const list = this.listeners;
|
|
111
120
|
if (script && (script.value || script.resource)) list.push(new ScriptListener(this.activity, this.context, extension, pos));
|
|
112
121
|
else if (expression) list.push(new ExpressionListener(this.activity, this.context, extension));
|
|
113
|
-
|
|
114
|
-
if (event === 'start') this.onStart = true;
|
|
115
|
-
if (event === 'end') this.onEnd = true;
|
|
116
122
|
}
|
|
117
123
|
async execute(event, message) {
|
|
118
124
|
const found = this.listeners.filter((l) => l.event === event);
|
|
@@ -13,6 +13,7 @@ export class OnifyElementExtensions {
|
|
|
13
13
|
const activity = this.activity;
|
|
14
14
|
const broker = activity.broker;
|
|
15
15
|
const formatQ = activity.broker.getQueue('format-run-q');
|
|
16
|
+
const executionListeners = this.extensions.listeners;
|
|
16
17
|
|
|
17
18
|
if (message.fields.redelivered && message.fields.routingKey === 'run.start') {
|
|
18
19
|
activity.on('start', (elementApi) => {
|
|
@@ -38,7 +39,6 @@ export class OnifyElementExtensions {
|
|
|
38
39
|
broker.publish('format', 'run.end.complete', {...format}, {persistent: false});
|
|
39
40
|
}, {consumerTag: '_onify-extension-on-executed'});
|
|
40
41
|
|
|
41
|
-
const executionListeners = this.extensions.listeners;
|
|
42
42
|
if (executionListeners?.onStart) {
|
|
43
43
|
activity.on('start', async (elementApi) => {
|
|
44
44
|
if (activity.isSubProcess && activity.id !== elementApi.id) return;
|
|
@@ -137,12 +137,12 @@ export class OnifyElementExtensions {
|
|
|
137
137
|
|
|
138
138
|
const {output, assignToOutput, resultVariable} = elementApi.content;
|
|
139
139
|
|
|
140
|
-
if (output
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
140
|
+
if (output !== undefined && output !== null) {
|
|
141
|
+
if (assignToOutput && typeof output === 'object') {
|
|
142
|
+
Object.assign(this.activity.environment.output, output);
|
|
143
|
+
} else if (resultVariable) {
|
|
144
|
+
elementApi.environment.output[resultVariable] = output;
|
|
145
|
+
}
|
|
146
146
|
}
|
|
147
147
|
|
|
148
148
|
return result;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import {SequenceFlow} from 'bpmn-elements';
|
|
2
|
+
import {getExtensions} from './getExtensions.js';
|
|
3
|
+
|
|
4
|
+
export class OnifySequenceFlow extends SequenceFlow {
|
|
5
|
+
constructor(flowDef, context) {
|
|
6
|
+
super(flowDef, context);
|
|
7
|
+
this.extensions = getExtensions(this, context);
|
|
8
|
+
this._activate();
|
|
9
|
+
}
|
|
10
|
+
_activate() {
|
|
11
|
+
if (!this.extensions.listeners?.onTake) return;
|
|
12
|
+
|
|
13
|
+
this.broker.subscribeTmp('event', 'flow.take', (_, msg) => {
|
|
14
|
+
this._executeListeners(msg);
|
|
15
|
+
}, {noAck: true, consumerTag: '_onify-execution-listener'});
|
|
16
|
+
}
|
|
17
|
+
async _executeListeners(message) {
|
|
18
|
+
try {
|
|
19
|
+
await this.extensions.listeners.execute('take', message);
|
|
20
|
+
} catch (err) {
|
|
21
|
+
this.logger.error(`<${this.id}> execution listener error: ${err}`);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
evaluate(fromMessage, callback) {
|
|
25
|
+
const properties = this.extensions.properties;
|
|
26
|
+
if (!properties) return super.evaluate(fromMessage, callback);
|
|
27
|
+
|
|
28
|
+
super.evaluate(fromMessage, (err, result) => {
|
|
29
|
+
if (err) return callback(err);
|
|
30
|
+
|
|
31
|
+
try {
|
|
32
|
+
let overriddenResult = result ? {} : false;
|
|
33
|
+
if (result) {
|
|
34
|
+
overriddenResult = {
|
|
35
|
+
...(typeof result === 'object' && result),
|
|
36
|
+
properties: properties.resolve(this.getApi(fromMessage)),
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
return callback(err, overriddenResult);
|
|
40
|
+
} catch (formatErr) {
|
|
41
|
+
return callback(formatErr);
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
}
|
package/src/getExtensions.js
CHANGED
|
@@ -7,39 +7,47 @@ import IOProperties from './IOProperties.js';
|
|
|
7
7
|
import ServiceExpression from './ServiceExpression.js';
|
|
8
8
|
|
|
9
9
|
export function getExtensions(element, context) {
|
|
10
|
-
const result = {
|
|
11
|
-
|
|
12
|
-
|
|
10
|
+
const result = {};
|
|
11
|
+
|
|
12
|
+
switch (element.type) {
|
|
13
|
+
case 'bpmn:SequenceFlow':
|
|
14
|
+
break;
|
|
15
|
+
case 'bpmn:Process':
|
|
16
|
+
result.format = new FormatProcess(element);
|
|
17
|
+
break;
|
|
18
|
+
default:
|
|
19
|
+
result.format = new FormatActivity(element);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
let listenerPosition = 0;
|
|
23
|
+
const listeners = new ExecutionListeners(element, context);
|
|
13
24
|
|
|
14
25
|
const expression = element.behaviour.expression;
|
|
15
26
|
if (expression) result.Service = ServiceExpression;
|
|
16
27
|
|
|
17
28
|
const extensions = element.behaviour.extensionElements?.values;
|
|
18
|
-
if (
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
29
|
+
if (extensions) {
|
|
30
|
+
for (const ext of extensions) {
|
|
31
|
+
switch (ext.$type) {
|
|
32
|
+
case 'camunda:Properties':
|
|
33
|
+
if (ext.values?.length) result.properties = new IOProperties(element, ext);
|
|
34
|
+
break;
|
|
35
|
+
case 'camunda:InputOutput':
|
|
36
|
+
result.io = new InputOutput(element.id, ext, context);
|
|
37
|
+
break;
|
|
38
|
+
case 'camunda:FormData':
|
|
39
|
+
if (ext.fields?.length) result.form = new IOForm(element, ext);
|
|
40
|
+
break;
|
|
41
|
+
case 'camunda:Connector': {
|
|
42
|
+
const {connectorId, inputOutput} = ext;
|
|
43
|
+
const io = inputOutput && new InputOutput(`${element.id}/${ext.$type.toLowerCase()}`, inputOutput, context);
|
|
44
|
+
result.Service = Connector.bind(Connector, connectorId, io);
|
|
45
|
+
break;
|
|
46
|
+
}
|
|
47
|
+
case 'camunda:ExecutionListener':
|
|
48
|
+
listeners.add(ext, listenerPosition++);
|
|
49
|
+
break;
|
|
39
50
|
}
|
|
40
|
-
case 'camunda:ExecutionListener':
|
|
41
|
-
listeners.add(ext, listener++);
|
|
42
|
-
break;
|
|
43
51
|
}
|
|
44
52
|
}
|
|
45
53
|
|