@5minds/node-red-contrib-processcube 1.2.3-develop-dd0a75-m1ypzayt → 1.2.3-develop-7fff23-m22zeh5n

Sign up to get free protection for your applications and to get access to all the features.
@@ -6,6 +6,7 @@
6
6
  name: { value: '' },
7
7
  engine: { value: '', type: 'processcube-engine-config' },
8
8
  topic: { value: '' },
9
+ workerConfig: { value: '', type: 'json' },
9
10
  },
10
11
  inputs: 0,
11
12
  outputs: 1,
@@ -13,6 +14,15 @@
13
14
  label: function () {
14
15
  return this.name || 'externaltask-input';
15
16
  },
17
+ oneditprepare: function () {
18
+ $('#node-input-workerConfig').typedInput({
19
+ default: 'json',
20
+ types: ['json'],
21
+ });
22
+ },
23
+ oneditsave: function () {
24
+ this.workerConfig = $('#node-input-workerConfig').typedInput('value');
25
+ },
16
26
  });
17
27
  </script>
18
28
 
@@ -29,6 +39,10 @@
29
39
  <label for="node-input-topic"><i class="fa fa-tag"></i> Topic</label>
30
40
  <input type="text" id="node-input-topic" placeholder="Topic of ExternalTask" />
31
41
  </div>
42
+ <div class="form-row"></div>
43
+ <label for="node-input-workerConfig"><i class="fa fa-tag"></i> Worker Config</label>
44
+ <input type="text" id="node-input-workerConfig" />
45
+ </div>
32
46
  </script>
33
47
 
34
48
  <script type="text/markdown" data-help-name="externaltask-input">
@@ -16,7 +16,7 @@ module.exports = function (RED) {
16
16
  var node = this;
17
17
  var flowContext = node.context().flow;
18
18
 
19
- const engine = RED.nodes.getNode(config.engine);
19
+ const engine = RED.nodes.getNode(config.engine);
20
20
 
21
21
  const client = engine.engineClient;
22
22
 
@@ -32,83 +32,85 @@ module.exports = function (RED) {
32
32
  eventEmitter = flowContext.get('emitter');
33
33
  }
34
34
 
35
- client.externalTasks
36
- .subscribeToExternalTaskTopic(config.topic, async (payload, externalTask) => {
37
- const saveHandleCallback = (data, callback) => {
38
- try {
39
- callback(data);
40
- } catch (error) {
41
- node.error(`Error in callback 'saveHandleCallback': ${error.message}`);
42
- }
43
- };
35
+ const etwCallback = async (payload, externalTask) => {
36
+ const saveHandleCallback = (data, callback) => {
37
+ try {
38
+ callback(data);
39
+ } catch (error) {
40
+ node.error(`Error in callback 'saveHandleCallback': ${error.message}`);
41
+ }
42
+ };
44
43
 
45
- return await new Promise((resolve, reject) => {
46
- const handleFinishTask = (msg) => {
47
- let result = RED.util.encodeObject(msg.payload);
44
+ return await new Promise((resolve, reject) => {
45
+ const handleFinishTask = (msg) => {
46
+ let result = RED.util.encodeObject(msg.payload);
48
47
 
49
- node.log(
50
- `handle finish task *flowNodeInstanceId* '${externalTask.flowNodeInstanceId}' and *processInstanceId* ${externalTask.processInstanceId} with result ${result} on msg._msgid ${msg._msgid}.`,
51
- );
48
+ node.log(
49
+ `handle event for *external task flowNodeInstanceId* '${externalTask.flowNodeInstanceId}' and *processInstanceId* ${externalTask.processInstanceId} with result ${result} on msg._msgid ${msg._msgid}.`
50
+ );
52
51
 
53
- if (externalTask.flowNodeInstanceId) {
54
- delete started_external_tasks[externalTask.flowNodeInstanceId];
55
- }
52
+ if (externalTask.flowNodeInstanceId) {
53
+ delete started_external_tasks[externalTask.flowNodeInstanceId];
54
+ }
56
55
 
57
- showStatus(node, Object.keys(started_external_tasks).length);
56
+ showStatus(node, Object.keys(started_external_tasks).length);
58
57
 
59
- //resolve(result);
60
- saveHandleCallback(result, resolve);
61
- };
58
+ //resolve(result);
59
+ saveHandleCallback(result, resolve);
60
+ };
61
+
62
+ const handleErrorTask = (msg) => {
63
+ node.log(
64
+ `handle error event for *external task flowNodeInstanceId* '${externalTask.flowNodeInstanceId}' and *processInstanceId* '${externalTask.processInstanceId}' on *msg._msgid* '${msg._msgid}'.`
65
+ );
62
66
 
63
- const handleErrorTask = (msg) => {
64
- node.log(
65
- `handle error task *flowNodeInstanceId* '${externalTask.flowNodeInstanceId}' and *processInstanceId* '${externalTask.processInstanceId}' on *msg._msgid* '${msg._msgid}'.`,
66
- );
67
+ if (externalTask.flowNodeInstanceId) {
68
+ delete started_external_tasks[externalTask.flowNodeInstanceId];
69
+ }
67
70
 
68
- if (externalTask.flowNodeInstanceId) {
69
- delete started_external_tasks[externalTask.flowNodeInstanceId];
70
- }
71
+ showStatus(node, Object.keys(started_external_tasks).length);
71
72
 
72
- showStatus(node, Object.keys(started_external_tasks).length);
73
+ // TODO: with reject, the default error handling is proceed
74
+ // SEE: https://github.com/5minds/ProcessCube.Engine.Client.ts/blob/develop/src/ExternalTaskWorker.ts#L180
75
+ // reject(result);
76
+ //resolve(msg);
77
+ saveHandleCallback(msg, resolve);
78
+ };
73
79
 
74
- // TODO: with reject, the default error handling is proceed
75
- // SEE: https://github.com/5minds/ProcessCube.Engine.Client.ts/blob/develop/src/ExternalTaskWorker.ts#L180
76
- // reject(result);
77
- //resolve(msg);
78
- saveHandleCallback(msg, resolve);
79
- };
80
+ eventEmitter.once(`handle-${externalTask.flowNodeInstanceId}`, (msg, isError = false) => {
81
+ node.log(
82
+ `handle event for *external task flowNodeInstanceId* '${externalTask.flowNodeInstanceId}' and *processInstanceId* '${externalTask.processInstanceId}' with *msg._msgid* '${msg._msgid}' and *isError* '${isError}'`
83
+ );
80
84
 
81
- eventEmitter.once(`handle-${externalTask.flowNodeInstanceId}`, (msg, isError = false) => {
82
- node.log(
83
- `handle-${externalTask.flowNodeInstanceId}: *flowNodeInstanceId* '${externalTask.flowNodeInstanceId}' and *processInstanceId* '${externalTask.processInstanceId}' with *msg._msgid* '${msg._msgid}' and *isError* '${isError}'`,
84
- );
85
+ if (isError) {
86
+ handleErrorTask(msg);
87
+ } else {
88
+ handleFinishTask(msg);
89
+ }
90
+ });
85
91
 
86
- if (isError) {
87
- handleErrorTask(msg);
88
- } else {
89
- handleFinishTask(msg);
90
- }
91
- });
92
+ started_external_tasks[externalTask.flowNodeInstanceId] = externalTask;
92
93
 
93
- started_external_tasks[externalTask.flowNodeInstanceId] = externalTask;
94
+ showStatus(node, Object.keys(started_external_tasks).length);
94
95
 
95
- showStatus(node, Object.keys(started_external_tasks).length);
96
+ let msg = {
97
+ _msgid: RED.util.generateId(),
98
+ task: RED.util.encodeObject(externalTask),
99
+ payload: payload,
100
+ flowNodeInstanceId: externalTask.flowNodeInstanceId,
101
+ processInstanceId: externalTask.processInstanceId
102
+ };
96
103
 
97
- let msg = {
98
- _msgid: RED.util.generateId(),
99
- task: RED.util.encodeObject(externalTask),
100
- payload: payload,
101
- flowNodeInstanceId: externalTask.flowNodeInstanceId,
102
- processInstanceId: externalTask.processInstanceId
103
- };
104
+ node.log(
105
+ `Received *external task flowNodeInstanceId* '${externalTask.flowNodeInstanceId}' and *processInstanceId* '${externalTask.processInstanceId}' with *msg._msgid* '${msg._msgid}'`
106
+ );
104
107
 
105
- node.log(
106
- `new task *flowNodeInstanceId* '${externalTask.flowNodeInstanceId}' and *processInstanceId* '${externalTask.processInstanceId}' with *msg._msgid* '${msg._msgid}'`,
107
- );
108
+ node.send(msg);
109
+ });
110
+ };
108
111
 
109
- node.send(msg);
110
- });
111
- })
112
+ client.externalTasks
113
+ .subscribeToExternalTaskTopic(config.topic, etwCallback, config.workerConfig)
112
114
  .then(async (externalTaskWorker) => {
113
115
  node.status({ fill: 'blue', shape: 'ring', text: 'subcribed' });
114
116
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@5minds/node-red-contrib-processcube",
3
- "version": "1.2.3-develop-dd0a75-m1ypzayt",
3
+ "version": "1.2.3-develop-7fff23-m22zeh5n",
4
4
  "license": "MIT",
5
5
  "description": "Node-RED nodes for ProcessCube",
6
6
  "scripts": {
@@ -2,16 +2,40 @@
2
2
  RED.nodes.registerType('processcube-engine-config', {
3
3
  category: 'config',
4
4
  defaults: {
5
- name : { value: '' },
5
+ name: { value: '' },
6
6
  url: { value: 'http://engine:8000', required: true },
7
+ clientId: { value: '' },
8
+ clientIdType: { type: 'str' },
9
+ clientSecret: { value: '' },
10
+ clientSecretType: { type: 'str' },
7
11
  },
8
12
  label: function () {
9
13
  return this.name || this.url;
10
14
  },
11
- credentials: {
12
- clientId: { type: 'text' },
13
- clientSecret: { type: 'password' },
14
- }
15
+ oneditprepare: function () {
16
+ $('#node-config-input-clientId').typedInput({
17
+ default: 'str',
18
+ types: ['str', 'global', 'flow', 'env', 'msg', 'cred'],
19
+ });
20
+
21
+ $('#node-config-input-clientSecret').typedInput({
22
+ default: 'str',
23
+ types: ['str', 'global', 'flow', 'env', 'msg', 'cred'],
24
+ });
25
+
26
+ $('#node-config-input-clientId').typedInput('value', this.clientId);
27
+ $('#node-config-input-clientId').typedInput('type', this.clientIdType);
28
+
29
+ $('#node-config-input-clientSecret').typedInput('value', this.clientSecret);
30
+ $('#node-config-input-clientSecret').typedInput('type', this.clientSecretType);
31
+ },
32
+ oneditsave: function () {
33
+ this.clientId = $('#node-config-input-clientId').typedInput('value');
34
+ this.clientIdType = $('#node-config-input-clientId').typedInput('type');
35
+
36
+ this.clientSecret = $('#node-config-input-clientSecret').typedInput('value');
37
+ this.clientSecretType = $('#node-config-input-clientSecret').typedInput('type');
38
+ },
15
39
  });
16
40
  </script>
17
41
 
@@ -11,18 +11,21 @@ module.exports = function (RED) {
11
11
  const identityChangedCallbacks = [];
12
12
  this.url = n.url;
13
13
  this.identity = null;
14
-
14
+
15
+ this.credentials.clientId = RED.util.evaluateNodeProperty(n.clientId, n.clientIdType, node);
16
+ this.credentials.clientSecret = RED.util.evaluateNodeProperty(n.clientSecret, n.clientSecretType, node);
17
+
15
18
  this.registerOnIdentityChanged = function (callback) {
16
19
  identityChangedCallbacks.push(callback);
17
20
  };
18
21
 
19
- this.isIdentityReady = function() {
22
+ this.isIdentityReady = function () {
20
23
  if (this.credentials.clientId && this.credentials.clientSecret) {
21
24
  return this.identity != null;
22
25
  } else {
23
26
  return true;
24
27
  }
25
- }
28
+ };
26
29
 
27
30
  this.setIdentity = (identity) => {
28
31
  node.log(`setIdentity: ${JSON.stringify(identity)}`);
@@ -50,7 +53,7 @@ module.exports = function (RED) {
50
53
  this.credentials.clientId,
51
54
  this.credentials.clientSecret,
52
55
  authorityUrl,
53
- node,
56
+ node
54
57
  ).catch((reason) => {
55
58
  console.error(reason);
56
59
  node.error(reason);
@@ -136,7 +139,7 @@ async function startRefreshingIdentityCycle(clientId, clientSecret, authorityUrl
136
139
  if (retries === 0) {
137
140
  console.error(
138
141
  'Could not refresh identity for external task worker processes. Stopping all external task workers.',
139
- { error },
142
+ { error }
140
143
  );
141
144
  return;
142
145
  }
@@ -16,23 +16,26 @@
16
16
  <bpmn:userTask id="user_task" name="User Task">
17
17
  <bpmn:extensionElements>
18
18
  <camunda:formData>
19
- <camunda:formField id="checkbox" label="Checkox" type="checkbox" defaultValue="true" customForm="{&#34;hint&#34;:&#34;hintttt&#34;,&#34;entries&#34;:[{&#34;key&#34;:&#34;value&#34;,&#34;value&#34;:&#34;Label&#34;}]}" />
20
- <camunda:formField id="color" label="Color" type="color" defaultValue="#cd2323" />
21
- <camunda:formField id="date-time-local" label="Datetime Local" type="datetime-local" customForm="{&#34;hint&#34;:&#34;jljkkljlk&#34;}" />
22
- <camunda:formField id="email" label="Email" type="email" customForm="{&#34;hint&#34;:&#34;hklojh&#34;,&#34;placeholder&#34;:&#34;luis@luis.de&#34;}" />
23
- <camunda:formField id="header" type="header" defaultValue="This is a Heading" customForm="{&#34;style&#34;:&#34;heading_2&#34;}" />
24
- <camunda:formField id="hidden" type="hidden" defaultValue="jkljlkj" />
25
- <camunda:formField id="month" label="Month" type="month" customForm="{&#34;hint&#34;:&#34;this is a hint for month&#34;}" />
26
- <camunda:formField id="paragraph" type="paragraph" defaultValue="This is a paragraph." />
27
- <camunda:formField id="password" label="Password" type="password" customForm="{&#34;hint&#34;:&#34;Dont use smt i can guess&#34;}" />
28
- <camunda:formField id="radio" label="Radio" type="radio" customForm="{&#34;entries&#34;:[{&#34;key&#34;:&#34;value&#34;,&#34;value&#34;:&#34;Label&#34;},{&#34;key&#34;:&#34;value2&#34;,&#34;value&#34;:&#34;Label2&#34;}]}" />
29
- <camunda:formField id="range" label="Range" type="range" customForm="{&#34;step&#34;:1,&#34;min&#34;:100,&#34;max&#34;:1000}" />
30
- <camunda:formField id="select" label="Select" type="select" customForm="{&#34;entries&#34;:[{&#34;key&#34;:&#34;value&#34;,&#34;value&#34;:&#34;Label&#34;},{&#34;key&#34;:&#34;value&#34;,&#34;value&#34;:&#34;Label&#34;}],&#34;placeholder&#34;:&#34;Select Something&#34;}" />
31
- <camunda:formField id="tele" label="Tel." type="tel" customForm="{&#34;hint&#34;:&#34;jkl&#34;,&#34;placeholder&#34;:&#34;110&#34;}" />
32
- <camunda:formField id="textarea" label="Textarea" type="textarea" defaultValue="jkl" customForm="{&#34;placeholder&#34;:&#34;placeholder&#34;}" />
33
- <camunda:formField id="time" label="Time" type="time" customForm="{&#34;hint&#34;:&#34;jkl&#34;,&#34;placeholder&#34;:&#34;12:0000&#34;}" />
34
- <camunda:formField id="url" label="URL" type="url" customForm="{&#34;placeholder&#34;:&#34;http://&#34;,&#34;hint&#34;:&#34;no youtube&#34;}" />
35
- <camunda:formField id="week" label="Week" type="week" customForm="{&#34;hint&#34;:&#34;What week?&#34;}" />
19
+ <camunda:formField id="checkbox" label="Checkbox" type="checkbox" customForm="{&#34;entries&#34;:[{&#34;key&#34;:&#34;key&#34;,&#34;value&#34;:&#34;value&#34;}],&#34;hint&#34;:&#34;hint&#34;}" />
20
+ <camunda:formField id="colorpicker" label="Colorpicker" type="color" defaultValue="#e32626" customForm="{&#34;hint&#34;:&#34;hint&#34;}" />
21
+ <camunda:formField id="date" label="Date" type="date" defaultValue="2024-10-18" customForm="{&#34;hint&#34;:&#34;hint&#34;}" />
22
+ <camunda:formField id="datetime" label="Datetime" type="datetime-local" defaultValue="2024-10-19T12:41" customForm="{&#34;hint&#34;:&#34;hint&#34;}" />
23
+ <camunda:formField id="email" label="Email" type="email" customForm="{&#34;hint&#34;:&#34;hint&#34;}" />
24
+ <camunda:formField id="header" type="header" defaultValue="Header" />
25
+ <camunda:formField id="hidden" type="hidden" defaultValue="hidden" />
26
+ <camunda:formField id="number" label="Number" type="number" customForm="{&#34;step&#34;:1.5,&#34;hint&#34;:&#34;hint&#34;}" />
27
+ <camunda:formField id="month" label="Month" type="month" defaultValue="2024-07" customForm="{&#34;hint&#34;:&#34;hint&#34;}" />
28
+ <camunda:formField id="paragraph" type="paragraph" defaultValue="A lot of words..." />
29
+ <camunda:formField id="password" label="Pasword" type="password" customForm="{&#34;hint&#34;:&#34;hint&#34;}" />
30
+ <camunda:formField id="radio" label="Radio" type="radio" customForm="{&#34;entries&#34;:[{&#34;key&#34;:&#34;key&#34;,&#34;value&#34;:&#34;value&#34;}],&#34;hint&#34;:&#34;hint&#34;}" />
31
+ <camunda:formField id="range" label="Range" type="range" defaultValue="30" customForm="{&#34;step&#34;:0.4,&#34;min&#34;:3,&#34;hint&#34;:&#34;hint&#34;}" />
32
+ <camunda:formField id="select" label="Select" type="select" customForm="{&#34;entries&#34;:[{&#34;key&#34;:&#34;key&#34;,&#34;value&#34;:&#34;value&#34;}],&#34;hint&#34;:&#34;hint&#34;}" />
33
+ <camunda:formField id="tel" label="Tel." type="tel" customForm="{&#34;hint&#34;:&#34;hint&#34;}" />
34
+ <camunda:formField id="text" label="Text" type="string" customForm="{&#34;hint&#34;:&#34;hint&#34;}" />
35
+ <camunda:formField id="textarea" label="Textarea" type="textarea" defaultValue="more words..." customForm="{&#34;rows&#34;:14,&#34;hint&#34;:&#34;hint&#34;}" />
36
+ <camunda:formField id="time" label="Time" type="time" defaultValue="11:54" customForm="{&#34;hint&#34;:&#34;hint&#34;}" />
37
+ <camunda:formField id="url" label="URL" type="url" customForm="{&#34;hint&#34;:&#34;hint&#34;}" />
38
+ <camunda:formField id="week" label="Week" type="week" defaultValue="2024-W37" customForm="{&#34;hint&#34;:&#34;hint&#34;}" />
36
39
  </camunda:formData>
37
40
  </bpmn:extensionElements>
38
41
  <bpmn:incoming>Flow_142awo6</bpmn:incoming>