@vitormnm/node-red-simple-opcua 1.4.3 → 1.5.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.
Files changed (32) hide show
  1. package/client/icons/opcua.svg +132 -132
  2. package/client/lib/opcua-client-browser.js +368 -330
  3. package/client/lib/opcua-client-method-service.js +88 -88
  4. package/client/lib/opcua-client-read-service.js +15 -15
  5. package/client/lib/opcua-client-subscription-id-service.js +24 -24
  6. package/client/lib/opcua-client-subscription-service.js +170 -170
  7. package/client/lib/opcua-client-write-service.js +146 -146
  8. package/client/opcua-client-config.html +80 -80
  9. package/client/opcua-client-utils.js +12 -11
  10. package/client/opcua-client.html +140 -140
  11. package/client/view/opcua-client.js +1144 -1140
  12. package/icons/opcua.svg +132 -132
  13. package/icons/opcua2.svg +132 -132
  14. package/package.json +3 -3
  15. package/server/icons/opcua.svg +132 -132
  16. package/server/lib/opcua-address-space-alarm.js +341 -341
  17. package/server/lib/opcua-address-space-builder.js +1603 -1485
  18. package/server/lib/opcua-config.js +677 -546
  19. package/server/lib/opcua-constants.js +119 -109
  20. package/server/lib/opcua-server-events-child.js +139 -139
  21. package/server/lib/opcua-server-runtime-child.js +873 -819
  22. package/server/lib/opcua-server-runtime.js +376 -311
  23. package/server/lib/opcua-server-status-child.js +187 -187
  24. package/server/lib/server-node-utils.js +16 -16
  25. package/server/opcua-server-io.html +346 -346
  26. package/server/opcua-server-io.js +497 -496
  27. package/server/opcua-server-registry.js +270 -270
  28. package/server/opcua-server.css +265 -265
  29. package/server/opcua-server.html +155 -1643
  30. package/server/opcua-server.js +24 -13
  31. package/server/view/opcua-server.css +492 -0
  32. package/server/view/opcua-server.js +1435 -0
@@ -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
+ };