@onify/flow-extensions 7.0.0 → 7.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.
@@ -1,141 +1,153 @@
1
- import {getExtensions} from './getExtensions.js';
2
-
3
- export class OnifyElementExtensions {
4
- constructor(activity, context) {
5
- this.activity = activity;
6
- this.context = context;
7
- this.formatQ = activity.broker.getQueue('format-run-q');
8
- this._asyncFormatOnEnter = this._asyncFormatOnEnter.bind(this);
9
-
10
- const { Service } = this.extensions = getExtensions(activity, context);
11
- if (Service) {
12
- activity.behaviour.Service = Service;
13
- }
14
- }
15
- activate(message) {
16
- const activity = this.activity;
17
- const executionListeners = this.extensions.listeners;
18
-
19
- if (message.fields.redelivered && message.fields.routingKey === 'run.start') {
20
- activity.on('start', this._asyncFormatOnEnter, {consumerTag: '_onify-extension-on-enter'});
21
- } else {
22
- activity.on('enter', this._asyncFormatOnEnter, {consumerTag: '_onify-extension-on-enter'});
23
- }
24
-
25
- activity.on('activity.execution.completed', (elementApi) => {
26
- return this._onExecutionCompleted(elementApi);
27
- }, {consumerTag: '_onify-extension-on-executed'});
28
-
29
- if (executionListeners?.onStart) {
30
- activity.on('start', (elementApi) => {
31
- this._executeExecutionListener('start', elementApi);
32
- }, {consumerTag: '_onify-extension-on-listenerstart'});
33
- }
34
-
35
- if (executionListeners?.onEnd) {
36
- activity.on('end', (elementApi) => {
37
- this._executeExecutionListener('end', elementApi);
38
- }, {consumerTag: '_onify-extension-on-listenerend'});
39
- }
40
- }
41
- deactivate() {
42
- const broker = this.activity.broker;
43
- broker.cancel('_onify-extension-on-enter');
44
- broker.cancel('_onify-extension-on-executed');
45
- broker.cancel('_onify-extension-on-listenerstart');
46
- broker.cancel('_onify-extension-on-listenerend');
47
- }
48
- async _asyncFormatOnEnter(elementApi) {
49
- this.formatQ.queueMessage({routingKey: 'run.enter.format'}, {endRoutingKey: 'run.enter.complete'}, {persistent: false});
50
-
51
- try {
52
- var format = await this._onEnterAsync(elementApi);
53
- } catch (err) {
54
- return elementApi.broker.publish('format', 'run.enter.error', {error: err}, {persistent: false});
55
- }
56
-
57
- elementApi.broker.publish('format', 'run.enter.complete', format, {persistent: false});
58
- }
59
- async _onExecutionCompleted(elementApi) {
60
- this.formatQ.queueMessage({routingKey: 'run.end.format'}, { endRoutingKey: 'run.end.complete' }, { persistent: false });
61
-
62
- try {
63
- var format = await this._onExecuted(elementApi);
64
- } catch (err) {
65
- return elementApi.broker.publish('format', 'run.end.error', { error: err }, {persistent: false});
66
- }
67
-
68
- elementApi.broker.publish('format', 'run.end.complete', { ...format }, {persistent: false});
69
- }
70
- async _onEnterAsync(elementApi) {
71
- const {format, properties, io, form} = this.extensions;
72
-
73
- const result = {};
74
- Object.assign(result, format.resolve(elementApi));
75
- Object.assign(elementApi.content, result);
76
-
77
- if (properties) {
78
- Object.assign(result, {properties: properties.resolve(elementApi)});
79
- Object.assign(elementApi.content, result);
80
- }
81
-
82
- if (io) {
83
- if (io.input?.length) {
84
- const input = await io.getInput(this.activity, elementApi);
85
- Object.assign(result, {input});
86
- Object.assign(elementApi.content, result);
87
- }
88
- if (io.output?.length) {
89
- result.assignToOutput = true;
90
- }
91
- }
92
-
93
- if (form) {
94
- Object.assign(result, {form: form.resolve(elementApi)});
95
- }
96
-
97
- return result;
98
- }
99
- async _onExecuted(elementApi) {
100
- const {properties, io} = this.extensions;
101
-
102
- const result = {};
103
- if (io?.output.length) {
104
- const output = await io.getOutput(this.activity, elementApi);
105
- Object.assign(result, {output});
106
- Object.assign(elementApi.content, {output});
107
- }
108
-
109
- if (properties) {
110
- const props = properties.resolve(elementApi);
111
- Object.assign(result, {properties: props});
112
- Object.assign(elementApi.content, {properties: props});
113
- }
114
-
115
- const {output, assignToOutput, resultVariable} = elementApi.content;
116
-
117
- if (output !== undefined && output !== null) {
118
- if (assignToOutput && typeof output === 'object') {
119
- Object.assign(this.activity.environment.output, output);
120
- } else if (resultVariable) {
121
- elementApi.environment.output[resultVariable] = output;
122
- }
123
- }
124
-
125
- return result;
126
- }
127
- async _executeExecutionListener(eventName, elementApi) {
128
- const routingKey = 'run.listener.' + eventName;
129
- const endRoutingKey = routingKey + '.complete';
130
-
131
- this.formatQ.queueMessage({ routingKey }, { endRoutingKey }, { persistent: false });
132
-
133
- try {
134
- var format = await this.extensions.listeners.execute(eventName, elementApi);
135
- } catch (err) {
136
- return elementApi.broker.publish('format', routingKey + '.error', { error: err }, { persistent: false });
137
- }
138
-
139
- elementApi.broker.publish('format', endRoutingKey, { ...format }, { persistent: false });
140
- }
141
- }
1
+ import { getExtensions } from './getExtensions.js';
2
+
3
+ export class OnifyElementExtensions {
4
+ constructor(activity, context) {
5
+ this.activity = activity;
6
+ this.context = context;
7
+ this.formatQ = activity.broker.getQueue('format-run-q');
8
+ this._asyncFormatOnEnter = this._asyncFormatOnEnter.bind(this);
9
+
10
+ const { Service } = (this.extensions = getExtensions(activity, context));
11
+ if (Service) {
12
+ activity.behaviour.Service = Service;
13
+ }
14
+ }
15
+ activate(message) {
16
+ const activity = this.activity;
17
+ const executionListeners = this.extensions.listeners;
18
+
19
+ if (message.fields.redelivered && message.fields.routingKey === 'run.start') {
20
+ activity.on('start', this._asyncFormatOnEnter, { consumerTag: '_onify-extension-on-enter' });
21
+ } else {
22
+ activity.on('enter', this._asyncFormatOnEnter, { consumerTag: '_onify-extension-on-enter' });
23
+ }
24
+
25
+ activity.on(
26
+ 'activity.execution.completed',
27
+ (elementApi) => {
28
+ return this._onExecutionCompleted(elementApi);
29
+ },
30
+ { consumerTag: '_onify-extension-on-executed' },
31
+ );
32
+
33
+ if (executionListeners?.onStart) {
34
+ activity.on(
35
+ 'start',
36
+ (elementApi) => {
37
+ this._executeExecutionListener('start', elementApi);
38
+ },
39
+ { consumerTag: '_onify-extension-on-listenerstart' },
40
+ );
41
+ }
42
+
43
+ if (executionListeners?.onEnd) {
44
+ activity.on(
45
+ 'end',
46
+ (elementApi) => {
47
+ this._executeExecutionListener('end', elementApi);
48
+ },
49
+ { consumerTag: '_onify-extension-on-listenerend' },
50
+ );
51
+ }
52
+ }
53
+ deactivate() {
54
+ const broker = this.activity.broker;
55
+ broker.cancel('_onify-extension-on-enter');
56
+ broker.cancel('_onify-extension-on-executed');
57
+ broker.cancel('_onify-extension-on-listenerstart');
58
+ broker.cancel('_onify-extension-on-listenerend');
59
+ }
60
+ async _asyncFormatOnEnter(elementApi) {
61
+ this.formatQ.queueMessage({ routingKey: 'run.enter.format' }, { endRoutingKey: 'run.enter.complete' }, { persistent: false });
62
+
63
+ try {
64
+ var format = await this._onEnterAsync(elementApi);
65
+ } catch (err) {
66
+ return elementApi.broker.publish('format', 'run.enter.error', { error: err }, { persistent: false });
67
+ }
68
+
69
+ elementApi.broker.publish('format', 'run.enter.complete', format, { persistent: false });
70
+ }
71
+ async _onExecutionCompleted(elementApi) {
72
+ this.formatQ.queueMessage({ routingKey: 'run.end.format' }, { endRoutingKey: 'run.end.complete' }, { persistent: false });
73
+
74
+ try {
75
+ var format = await this._onExecuted(elementApi);
76
+ } catch (err) {
77
+ return elementApi.broker.publish('format', 'run.end.error', { error: err }, { persistent: false });
78
+ }
79
+
80
+ elementApi.broker.publish('format', 'run.end.complete', { ...format }, { persistent: false });
81
+ }
82
+ async _onEnterAsync(elementApi) {
83
+ const { format, properties, io, form } = this.extensions;
84
+
85
+ const result = {};
86
+ Object.assign(result, format.resolve(elementApi));
87
+ Object.assign(elementApi.content, result);
88
+
89
+ if (properties) {
90
+ Object.assign(result, { properties: properties.resolve(elementApi) });
91
+ Object.assign(elementApi.content, result);
92
+ }
93
+
94
+ if (io) {
95
+ if (io.input?.length) {
96
+ const input = await io.getInput(this.activity, elementApi);
97
+ Object.assign(result, { input });
98
+ Object.assign(elementApi.content, result);
99
+ }
100
+ if (io.output?.length) {
101
+ result.assignToOutput = true;
102
+ }
103
+ }
104
+
105
+ if (form) {
106
+ Object.assign(result, { form: form.resolve(elementApi) });
107
+ }
108
+
109
+ return result;
110
+ }
111
+ async _onExecuted(elementApi) {
112
+ const { properties, io } = this.extensions;
113
+
114
+ const result = {};
115
+ if (io?.output.length) {
116
+ const output = await io.getOutput(this.activity, elementApi);
117
+ Object.assign(result, { output });
118
+ Object.assign(elementApi.content, { output });
119
+ }
120
+
121
+ if (properties) {
122
+ const props = properties.resolve(elementApi);
123
+ Object.assign(result, { properties: props });
124
+ Object.assign(elementApi.content, { properties: props });
125
+ }
126
+
127
+ const { output, assignToOutput, resultVariable } = elementApi.content;
128
+
129
+ if (output !== undefined && output !== null) {
130
+ if (assignToOutput && typeof output === 'object') {
131
+ Object.assign(this.activity.environment.output, output);
132
+ } else if (resultVariable) {
133
+ elementApi.environment.output[resultVariable] = output;
134
+ }
135
+ }
136
+
137
+ return result;
138
+ }
139
+ async _executeExecutionListener(eventName, elementApi) {
140
+ const routingKey = 'run.listener.' + eventName;
141
+ const endRoutingKey = routingKey + '.complete';
142
+
143
+ this.formatQ.queueMessage({ routingKey }, { endRoutingKey }, { persistent: false });
144
+
145
+ try {
146
+ var format = await this.extensions.listeners.execute(eventName, elementApi);
147
+ } catch (err) {
148
+ return elementApi.broker.publish('format', routingKey + '.error', { error: err }, { persistent: false });
149
+ }
150
+
151
+ elementApi.broker.publish('format', endRoutingKey, { ...format }, { persistent: false });
152
+ }
153
+ }
@@ -1,40 +1,49 @@
1
- import {FormatError} from './Errors.js';
2
- import {getExtensions} from './getExtensions.js';
3
-
4
- export class OnifyProcessExtensions {
5
- constructor(bp, context) {
6
- this.process = bp;
7
- this.context = context;
8
- this.extensions = getExtensions(bp, context);
9
- this._activate();
10
- }
11
- _activate() {
12
- const bp = this.process;
13
- bp.on('process.enter', (elementApi) => {
14
- try {
15
- const result = this._onEnter(elementApi);
16
- const environment = elementApi.environment;
17
- environment.assignVariables(result);
18
- } catch (err) {
19
- elementApi.broker.publish('event', 'process.error', {
20
- ...elementApi.content,
21
- error: new FormatError(bp.id, err),
22
- }, {mandatory: true, type: 'error'});
23
- }
24
- }, {consumerTag: '_onify-extension-on-enter'});
25
- }
26
- _onEnter(elementApi) {
27
- const {format, properties} = this.extensions;
28
- const result = {};
29
-
30
- Object.assign(result, format.resolve(elementApi));
31
- Object.assign(elementApi.content, result);
32
-
33
- if (properties) {
34
- Object.assign(result, properties.resolve(elementApi));
35
- Object.assign(elementApi.content, result);
36
- }
37
-
38
- return result;
39
- }
40
- }
1
+ import { FormatError } from './Errors.js';
2
+ import { getExtensions } from './getExtensions.js';
3
+
4
+ export class OnifyProcessExtensions {
5
+ constructor(bp, context) {
6
+ this.process = bp;
7
+ this.context = context;
8
+ this.extensions = getExtensions(bp, context);
9
+ this._activate();
10
+ }
11
+ _activate() {
12
+ const bp = this.process;
13
+ bp.on(
14
+ 'process.enter',
15
+ (elementApi) => {
16
+ try {
17
+ const result = this._onEnter(elementApi);
18
+ const environment = elementApi.environment;
19
+ environment.assignVariables(result);
20
+ } catch (err) {
21
+ elementApi.broker.publish(
22
+ 'event',
23
+ 'process.error',
24
+ {
25
+ ...elementApi.content,
26
+ error: new FormatError(bp.id, err),
27
+ },
28
+ { mandatory: true, type: 'error' },
29
+ );
30
+ }
31
+ },
32
+ { consumerTag: '_onify-extension-on-enter' },
33
+ );
34
+ }
35
+ _onEnter(elementApi) {
36
+ const { format, properties } = this.extensions;
37
+ const result = {};
38
+
39
+ Object.assign(result, format.resolve(elementApi));
40
+ Object.assign(elementApi.content, result);
41
+
42
+ if (properties) {
43
+ Object.assign(result, properties.resolve(elementApi));
44
+ Object.assign(elementApi.content, result);
45
+ }
46
+
47
+ return result;
48
+ }
49
+ }
@@ -1,5 +1,5 @@
1
- import {SequenceFlow} from 'bpmn-elements';
2
- import {getExtensions} from './getExtensions.js';
1
+ import { SequenceFlow } from 'bpmn-elements';
2
+ import { getExtensions } from './getExtensions.js';
3
3
 
4
4
  export class OnifySequenceFlow extends SequenceFlow {
5
5
  constructor(flowDef, context) {
@@ -10,9 +10,14 @@ export class OnifySequenceFlow extends SequenceFlow {
10
10
  _activate() {
11
11
  if (!this.extensions.listeners?.onTake) return;
12
12
 
13
- this.broker.subscribeTmp('event', 'flow.take', (_, msg) => {
14
- this._executeListeners(msg);
15
- }, {noAck: true, consumerTag: '_onify-execution-listener'});
13
+ this.broker.subscribeTmp(
14
+ 'event',
15
+ 'flow.take',
16
+ (_, msg) => {
17
+ this._executeListeners(msg);
18
+ },
19
+ { noAck: true, consumerTag: '_onify-execution-listener' },
20
+ );
16
21
  }
17
22
  async _executeListeners(message) {
18
23
  try {
@@ -1,46 +1,76 @@
1
- import { OnifyElementExtensions } from './OnifyElementExtensions.js';
2
-
3
- export class OnifySubProcessExtensions extends OnifyElementExtensions {
4
- constructor(activity, context) {
5
- super(activity, context);
6
- }
7
- activate(runMessage) {
8
- const activity = this.activity;
9
- const broker = activity.broker;
10
- const executionListeners = this.extensions.listeners;
11
-
12
- if (runMessage.fields.redelivered && runMessage.fields.routingKey === 'run.start') {
13
- this._setupListener(broker, 'activity.start', (elementApi) => {
14
- return this._asyncFormatOnEnter(elementApi);
15
- }, '_onify-extension-on-enter');
16
- } else {
17
- this._setupListener(broker, 'activity.enter', (elementApi) => {
18
- return this._asyncFormatOnEnter(elementApi);
19
- }, '_onify-extension-on-enter');
20
- }
21
-
22
- this._setupListener(broker, 'activity.execution.completed', (elementApi) => {
23
- return this._onExecutionCompleted(elementApi);
24
- }, '_onify-extension-on-executed');
25
-
26
- if (executionListeners?.onStart) {
27
- this._setupListener(broker, 'activity.start', (elementApi) => {
28
- this._executeExecutionListener('start', elementApi);
29
- }, '_onify-extension-on-listenerstart');
30
- }
31
-
32
- if (executionListeners?.onEnd) {
33
- this._setupListener(broker, 'activity.end', (elementApi) => {
34
- this._executeExecutionListener('end', elementApi);
35
- }, '_onify-extension-on-listenerend');
36
- }
37
- }
38
- _setupListener(broker, routingKey, callback, consumerTag) {
39
- const activity = this.activity;
40
- broker.subscribeTmp('event', routingKey, (_, message) => {
41
- if (activity.id !== message.content.id) return;
42
-
43
- return callback(activity.getApi(message));
44
- }, { noAck: true, consumerTag });
45
- }
46
- }
1
+ import { OnifyElementExtensions } from './OnifyElementExtensions.js';
2
+
3
+ export class OnifySubProcessExtensions extends OnifyElementExtensions {
4
+ constructor(activity, context) {
5
+ super(activity, context);
6
+ }
7
+ activate(runMessage) {
8
+ const activity = this.activity;
9
+ const broker = activity.broker;
10
+ const executionListeners = this.extensions.listeners;
11
+
12
+ if (runMessage.fields.redelivered && runMessage.fields.routingKey === 'run.start') {
13
+ this._setupListener(
14
+ broker,
15
+ 'activity.start',
16
+ (elementApi) => {
17
+ return this._asyncFormatOnEnter(elementApi);
18
+ },
19
+ '_onify-extension-on-enter',
20
+ );
21
+ } else {
22
+ this._setupListener(
23
+ broker,
24
+ 'activity.enter',
25
+ (elementApi) => {
26
+ return this._asyncFormatOnEnter(elementApi);
27
+ },
28
+ '_onify-extension-on-enter',
29
+ );
30
+ }
31
+
32
+ this._setupListener(
33
+ broker,
34
+ 'activity.execution.completed',
35
+ (elementApi) => {
36
+ return this._onExecutionCompleted(elementApi);
37
+ },
38
+ '_onify-extension-on-executed',
39
+ );
40
+
41
+ if (executionListeners?.onStart) {
42
+ this._setupListener(
43
+ broker,
44
+ 'activity.start',
45
+ (elementApi) => {
46
+ this._executeExecutionListener('start', elementApi);
47
+ },
48
+ '_onify-extension-on-listenerstart',
49
+ );
50
+ }
51
+
52
+ if (executionListeners?.onEnd) {
53
+ this._setupListener(
54
+ broker,
55
+ 'activity.end',
56
+ (elementApi) => {
57
+ this._executeExecutionListener('end', elementApi);
58
+ },
59
+ '_onify-extension-on-listenerend',
60
+ );
61
+ }
62
+ }
63
+ _setupListener(broker, routingKey, callback, consumerTag) {
64
+ const activity = this.activity;
65
+ broker.subscribeTmp(
66
+ 'event',
67
+ routingKey,
68
+ (_, message) => {
69
+ if (activity.id !== message.content.id) return;
70
+
71
+ return callback(activity.getApi(message));
72
+ },
73
+ { noAck: true, consumerTag },
74
+ );
75
+ }
76
+ }
@@ -1,4 +1,4 @@
1
- import {NotImplemented} from './Errors.js';
1
+ import { NotImplemented } from './Errors.js';
2
2
 
3
3
  export default function ServiceExpression(activity) {
4
4
  if (!(this instanceof ServiceExpression)) return new ServiceExpression(activity);