@vitormnm/node-red-simple-opcua 1.4.1 → 1.4.3

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.
Files changed (32) hide show
  1. package/README.md +5 -0
  2. package/client/icons/opcua.svg +132 -132
  3. package/client/lib/opcua-client-browser.js +330 -330
  4. package/client/lib/opcua-client-method-service.js +88 -88
  5. package/client/lib/opcua-client-read-service.js +15 -15
  6. package/client/lib/opcua-client-subscription-id-service.js +24 -24
  7. package/client/lib/opcua-client-subscription-service.js +170 -170
  8. package/client/lib/opcua-client-write-service.js +146 -146
  9. package/client/opcua-client-config.html +80 -80
  10. package/client/opcua-client.html +140 -140
  11. package/client/opcua-client.js +1 -7
  12. package/client/view/opcua-client.js +1140 -1140
  13. package/icons/opcua.svg +132 -132
  14. package/icons/opcua2.svg +132 -132
  15. package/package.json +42 -42
  16. package/resources/bmc-button.svg +22 -0
  17. package/server/icons/opcua.svg +132 -132
  18. package/server/lib/opcua-address-space-alarm.js +341 -341
  19. package/server/lib/opcua-address-space-builder.js +1484 -1484
  20. package/server/lib/opcua-config.js +546 -546
  21. package/server/lib/opcua-constants.js +109 -109
  22. package/server/lib/opcua-server-events-child.js +139 -139
  23. package/server/lib/opcua-server-runtime-child.js +819 -819
  24. package/server/lib/opcua-server-runtime.js +311 -311
  25. package/server/lib/opcua-server-status-child.js +187 -187
  26. package/server/lib/server-node-utils.js +16 -16
  27. package/server/opcua-server-io.html +346 -346
  28. package/server/opcua-server-io.js +496 -496
  29. package/server/opcua-server-registry.js +270 -270
  30. package/server/opcua-server.css +265 -265
  31. package/server/opcua-server.html +1643 -1643
  32. package/client/testClient.json +0 -18
@@ -1,270 +1,270 @@
1
- "use strict";
2
-
3
- const servers = new Map();
4
- const methodHandlers = new Map();
5
- const pendingCalls = new Map();
6
- const accessListeners = new Map();
7
- const childs = new Map();
8
- const activeAlarms = new Map();
9
-
10
- const serversNames = new Map(); //get serve name for opcua-server-io
11
-
12
- function registerServer(node) {
13
- servers.set(node.id, node);
14
- }
15
-
16
- function registerServerNames(node) {
17
- serversNames.set(node, node);
18
- }
19
-
20
-
21
- function registerChild(serverName, child) {
22
- if (!serverName || !child) {
23
- return;
24
- }
25
-
26
- childs.set(serverName, child);
27
-
28
- const cleanup = () => {
29
- if (childs.get(serverName) === child) {
30
- childs.delete(serverName);
31
- }
32
- };
33
-
34
- child.once("exit", cleanup);
35
- child.once("close", cleanup);
36
- child.once("disconnect", cleanup);
37
- }
38
-
39
- function unregisterServer(nodeId) {
40
- servers.delete(nodeId);
41
- }
42
-
43
- function unregisterServerNames(name) {
44
- serversNames.delete(name);
45
- }
46
-
47
-
48
- function resolveServer(reference) {
49
- const activeServers = Array.from(servers.values()).filter((node) => node && node.server);
50
-
51
- if (!reference) {
52
- if (activeServers.length === 1) {
53
- return activeServers[0];
54
- }
55
- return null;
56
- }
57
-
58
- const normalizedReference = String(reference).trim();
59
- return activeServers.find((node) =>
60
- node.id === normalizedReference ||
61
- node.name === normalizedReference ||
62
- node.serverName === normalizedReference
63
- ) || null;
64
- }
65
-
66
- function listActiveServers() {
67
- return Array.from(serversNames.values())
68
-
69
- // return Array.from(servers.values())
70
- // .filter((node) => node && node.server)
71
- // .map((node) => ({
72
- // id: node.id,
73
- // name: node.name || "",
74
- // serverName: node.serverName || "",
75
- // label: node.name || node.serverName || node.id,
76
- // value: node.serverName || node.name || node.id
77
- // }));
78
- }
79
-
80
- function resolveChild(serverName) {
81
- const child = childs.get(serverName);
82
-
83
- if (!child) {
84
- return null;
85
- }
86
-
87
- if (child.killed || child.exitCode !== null || child.channel === null || !child.connected) {
88
- childs.delete(serverName);
89
- return null;
90
- }
91
-
92
- return child;
93
- }
94
-
95
- function unregisterChild(serverName, child) {
96
- if (!serverName) {
97
- return;
98
- }
99
-
100
- if (child) {
101
- if (childs.get(serverName) === child) {
102
- childs.delete(serverName);
103
- }
104
- return;
105
- }
106
-
107
- childs.delete(serverName);
108
- }
109
-
110
- function registerMethodHandler(methodName, nodeId) {
111
- methodHandlers.set(methodName, nodeId);
112
- }
113
-
114
- function unregisterMethodHandler(methodName) {
115
- methodHandlers.delete(methodName);
116
- }
117
-
118
- function emitMethodCall(call) {
119
- const nodeId = methodHandlers.get(call.methodName);
120
-
121
- process.send({
122
- type: "sendMethod",
123
- data: call,
124
- nodeId: nodeId
125
- });
126
- //handler.sendMethodCall(call);
127
- }
128
-
129
- function waitForMethodResponse(callId) {
130
- return new Promise((resolve, reject) => {
131
- pendingCalls.set(callId, { resolve, reject });
132
-
133
- setTimeout(() => {
134
- if (pendingCalls.has(callId)) {
135
- pendingCalls.delete(callId);
136
- reject(new Error("Timeout waiting method response"));
137
- }
138
- }, 10000);
139
- });
140
- }
141
-
142
- function resolveMethodCall(callId, payload) {
143
- const pending = pendingCalls.get(callId);
144
-
145
- if (!pending) {
146
- return;
147
- }
148
-
149
- pending.resolve(payload);
150
- pendingCalls.delete(callId);
151
- }
152
-
153
- function registerAccessListener(listenerId, node) {
154
- accessListeners.set(listenerId, node);
155
- }
156
-
157
- // function registerActiveAlarms(alarm, node) {
158
-
159
- // const lista = activeAlarms.get(node.id) ?? [];
160
- // lista.push(alarm);
161
- // activeAlarms.set(node.id, lista);
162
-
163
-
164
- // }
165
-
166
- function registerActiveAlarms(alarm, message, severity, retain, node) {
167
-
168
-
169
- const alarmNodeId = alarm.nodeId.toString();
170
- const lista = activeAlarms.get(node.id) ?? [];
171
-
172
- // remove antigo se já existir
173
- const novaLista = lista.filter(
174
- x => x.alarm.nodeId.toString() !== alarmNodeId
175
- );
176
-
177
- if (retain) {
178
- // adiciona novo
179
- novaLista.push({
180
- alarm,
181
- message,
182
- severity,
183
- retain
184
- });
185
- }
186
-
187
- // atualiza o map (com ou sem o alarme)
188
- activeAlarms.set(node.id, novaLista);
189
- }
190
-
191
- function getActiveAlarms(node) {
192
- try {
193
-
194
-
195
- var lista = activeAlarms.get(node.id) ?? [];
196
- var saida = []
197
-
198
-
199
- lista.forEach(element => {
200
-
201
- const alarmNode = element.alarm
202
- const ConditionName = alarmNode.getPropertyByName("ConditionName").readValue().value.value;
203
- const SourceName = alarmNode.getPropertyByName("SourceName").readValue().value.value;
204
- const isActive = alarmNode.activeState.id.readValue().value.value;
205
- const isAcked = alarmNode.ackedState.id.readValue().value.value;
206
- const ConfirmedState = alarmNode.confirmedState.id.readValue().value.value;
207
-
208
-
209
-
210
- saida.push({
211
- activeState: isActive,
212
- message: element.message,
213
- severity: element.severity,
214
- retain: element.retain,
215
- sourceName: SourceName,
216
- conditionName: ConditionName,
217
- ConfirmedState: ConfirmedState,
218
- ackedState: isAcked,
219
- alarmNode: alarmNode,
220
-
221
- })
222
- });
223
-
224
-
225
- // return activeAlarms.get(node.id) ?? [];
226
- return saida
227
-
228
-
229
- } catch (error) {
230
- console.error("getActiveAlarms")
231
- console.error(error)
232
- }
233
-
234
- }
235
-
236
- function unregisterAccessListener(listenerId) {
237
- accessListeners.delete(listenerId);
238
- }
239
-
240
- function emitTagAccess(event) {
241
- accessListeners.forEach((listener) => {
242
- if (!listener || typeof listener.enqueueAccessEvent !== "function") {
243
- return;
244
- }
245
-
246
- listener.enqueueAccessEvent(event);
247
- });
248
- }
249
-
250
- module.exports = {
251
- registerServer,
252
- registerServerNames,
253
- registerChild,
254
- unregisterChild,
255
- resolveChild,
256
- unregisterServer,
257
- unregisterServerNames,
258
- resolveServer,
259
- listActiveServers,
260
- registerMethodHandler,
261
- unregisterMethodHandler,
262
- emitMethodCall,
263
- waitForMethodResponse,
264
- resolveMethodCall,
265
- registerAccessListener,
266
- unregisterAccessListener,
267
- emitTagAccess,
268
- registerActiveAlarms,
269
- getActiveAlarms,
270
- };
1
+ "use strict";
2
+
3
+ const servers = new Map();
4
+ const methodHandlers = new Map();
5
+ const pendingCalls = new Map();
6
+ const accessListeners = new Map();
7
+ const childs = new Map();
8
+ const activeAlarms = new Map();
9
+
10
+ const serversNames = new Map(); //get serve name for opcua-server-io
11
+
12
+ function registerServer(node) {
13
+ servers.set(node.id, node);
14
+ }
15
+
16
+ function registerServerNames(node) {
17
+ serversNames.set(node, node);
18
+ }
19
+
20
+
21
+ function registerChild(serverName, child) {
22
+ if (!serverName || !child) {
23
+ return;
24
+ }
25
+
26
+ childs.set(serverName, child);
27
+
28
+ const cleanup = () => {
29
+ if (childs.get(serverName) === child) {
30
+ childs.delete(serverName);
31
+ }
32
+ };
33
+
34
+ child.once("exit", cleanup);
35
+ child.once("close", cleanup);
36
+ child.once("disconnect", cleanup);
37
+ }
38
+
39
+ function unregisterServer(nodeId) {
40
+ servers.delete(nodeId);
41
+ }
42
+
43
+ function unregisterServerNames(name) {
44
+ serversNames.delete(name);
45
+ }
46
+
47
+
48
+ function resolveServer(reference) {
49
+ const activeServers = Array.from(servers.values()).filter((node) => node && node.server);
50
+
51
+ if (!reference) {
52
+ if (activeServers.length === 1) {
53
+ return activeServers[0];
54
+ }
55
+ return null;
56
+ }
57
+
58
+ const normalizedReference = String(reference).trim();
59
+ return activeServers.find((node) =>
60
+ node.id === normalizedReference ||
61
+ node.name === normalizedReference ||
62
+ node.serverName === normalizedReference
63
+ ) || null;
64
+ }
65
+
66
+ function listActiveServers() {
67
+ return Array.from(serversNames.values())
68
+
69
+ // return Array.from(servers.values())
70
+ // .filter((node) => node && node.server)
71
+ // .map((node) => ({
72
+ // id: node.id,
73
+ // name: node.name || "",
74
+ // serverName: node.serverName || "",
75
+ // label: node.name || node.serverName || node.id,
76
+ // value: node.serverName || node.name || node.id
77
+ // }));
78
+ }
79
+
80
+ function resolveChild(serverName) {
81
+ const child = childs.get(serverName);
82
+
83
+ if (!child) {
84
+ return null;
85
+ }
86
+
87
+ if (child.killed || child.exitCode !== null || child.channel === null || !child.connected) {
88
+ childs.delete(serverName);
89
+ return null;
90
+ }
91
+
92
+ return child;
93
+ }
94
+
95
+ function unregisterChild(serverName, child) {
96
+ if (!serverName) {
97
+ return;
98
+ }
99
+
100
+ if (child) {
101
+ if (childs.get(serverName) === child) {
102
+ childs.delete(serverName);
103
+ }
104
+ return;
105
+ }
106
+
107
+ childs.delete(serverName);
108
+ }
109
+
110
+ function registerMethodHandler(methodName, nodeId) {
111
+ methodHandlers.set(methodName, nodeId);
112
+ }
113
+
114
+ function unregisterMethodHandler(methodName) {
115
+ methodHandlers.delete(methodName);
116
+ }
117
+
118
+ function emitMethodCall(call) {
119
+ const nodeId = methodHandlers.get(call.methodName);
120
+
121
+ process.send({
122
+ type: "sendMethod",
123
+ data: call,
124
+ nodeId: nodeId
125
+ });
126
+ //handler.sendMethodCall(call);
127
+ }
128
+
129
+ function waitForMethodResponse(callId) {
130
+ return new Promise((resolve, reject) => {
131
+ pendingCalls.set(callId, { resolve, reject });
132
+
133
+ setTimeout(() => {
134
+ if (pendingCalls.has(callId)) {
135
+ pendingCalls.delete(callId);
136
+ reject(new Error("Timeout waiting method response"));
137
+ }
138
+ }, 10000);
139
+ });
140
+ }
141
+
142
+ function resolveMethodCall(callId, payload) {
143
+ const pending = pendingCalls.get(callId);
144
+
145
+ if (!pending) {
146
+ return;
147
+ }
148
+
149
+ pending.resolve(payload);
150
+ pendingCalls.delete(callId);
151
+ }
152
+
153
+ function registerAccessListener(listenerId, node) {
154
+ accessListeners.set(listenerId, node);
155
+ }
156
+
157
+ // function registerActiveAlarms(alarm, node) {
158
+
159
+ // const lista = activeAlarms.get(node.id) ?? [];
160
+ // lista.push(alarm);
161
+ // activeAlarms.set(node.id, lista);
162
+
163
+
164
+ // }
165
+
166
+ function registerActiveAlarms(alarm, message, severity, retain, node) {
167
+
168
+
169
+ const alarmNodeId = alarm.nodeId.toString();
170
+ const lista = activeAlarms.get(node.id) ?? [];
171
+
172
+ // remove antigo se já existir
173
+ const novaLista = lista.filter(
174
+ x => x.alarm.nodeId.toString() !== alarmNodeId
175
+ );
176
+
177
+ if (retain) {
178
+ // adiciona novo
179
+ novaLista.push({
180
+ alarm,
181
+ message,
182
+ severity,
183
+ retain
184
+ });
185
+ }
186
+
187
+ // atualiza o map (com ou sem o alarme)
188
+ activeAlarms.set(node.id, novaLista);
189
+ }
190
+
191
+ function getActiveAlarms(node) {
192
+ try {
193
+
194
+
195
+ var lista = activeAlarms.get(node.id) ?? [];
196
+ var saida = []
197
+
198
+
199
+ lista.forEach(element => {
200
+
201
+ const alarmNode = element.alarm
202
+ const ConditionName = alarmNode.getPropertyByName("ConditionName").readValue().value.value;
203
+ const SourceName = alarmNode.getPropertyByName("SourceName").readValue().value.value;
204
+ const isActive = alarmNode.activeState.id.readValue().value.value;
205
+ const isAcked = alarmNode.ackedState.id.readValue().value.value;
206
+ const ConfirmedState = alarmNode.confirmedState.id.readValue().value.value;
207
+
208
+
209
+
210
+ saida.push({
211
+ activeState: isActive,
212
+ message: element.message,
213
+ severity: element.severity,
214
+ retain: element.retain,
215
+ sourceName: SourceName,
216
+ conditionName: ConditionName,
217
+ ConfirmedState: ConfirmedState,
218
+ ackedState: isAcked,
219
+ alarmNode: alarmNode,
220
+
221
+ })
222
+ });
223
+
224
+
225
+ // return activeAlarms.get(node.id) ?? [];
226
+ return saida
227
+
228
+
229
+ } catch (error) {
230
+ console.error("getActiveAlarms")
231
+ console.error(error)
232
+ }
233
+
234
+ }
235
+
236
+ function unregisterAccessListener(listenerId) {
237
+ accessListeners.delete(listenerId);
238
+ }
239
+
240
+ function emitTagAccess(event) {
241
+ accessListeners.forEach((listener) => {
242
+ if (!listener || typeof listener.enqueueAccessEvent !== "function") {
243
+ return;
244
+ }
245
+
246
+ listener.enqueueAccessEvent(event);
247
+ });
248
+ }
249
+
250
+ module.exports = {
251
+ registerServer,
252
+ registerServerNames,
253
+ registerChild,
254
+ unregisterChild,
255
+ resolveChild,
256
+ unregisterServer,
257
+ unregisterServerNames,
258
+ resolveServer,
259
+ listActiveServers,
260
+ registerMethodHandler,
261
+ unregisterMethodHandler,
262
+ emitMethodCall,
263
+ waitForMethodResponse,
264
+ resolveMethodCall,
265
+ registerAccessListener,
266
+ unregisterAccessListener,
267
+ emitTagAccess,
268
+ registerActiveAlarms,
269
+ getActiveAlarms,
270
+ };