node-opcua-client 2.98.0 → 2.98.2

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 (106) hide show
  1. package/dist/alarms_and_conditions/client_alarm.d.ts +49 -0
  2. package/dist/alarms_and_conditions/client_alarm.js +110 -0
  3. package/dist/alarms_and_conditions/client_alarm.js.map +1 -0
  4. package/dist/alarms_and_conditions/client_alarm_list.d.ts +25 -0
  5. package/dist/alarms_and_conditions/client_alarm_list.js +98 -0
  6. package/dist/alarms_and_conditions/client_alarm_list.js.map +1 -0
  7. package/dist/alarms_and_conditions/client_alarm_tools.d.ts +4 -0
  8. package/dist/alarms_and_conditions/client_alarm_tools.js +157 -0
  9. package/dist/alarms_and_conditions/client_alarm_tools.js.map +1 -0
  10. package/dist/alarms_and_conditions/client_alarm_tools_acknowledge_all_conditions.d.ts +18 -0
  11. package/dist/alarms_and_conditions/client_alarm_tools_acknowledge_all_conditions.js +193 -0
  12. package/dist/alarms_and_conditions/client_alarm_tools_acknowledge_all_conditions.js.map +1 -0
  13. package/dist/alarms_and_conditions/client_alarm_tools_dump_event.d.ts +9 -0
  14. package/dist/alarms_and_conditions/client_alarm_tools_dump_event.js +73 -0
  15. package/dist/alarms_and_conditions/client_alarm_tools_dump_event.js.map +1 -0
  16. package/dist/alarms_and_conditions/client_alarm_tools_extractConditionFields.d.ts +3 -0
  17. package/dist/alarms_and_conditions/client_alarm_tools_extractConditionFields.js +119 -0
  18. package/dist/alarms_and_conditions/client_alarm_tools_extractConditionFields.js.map +1 -0
  19. package/dist/alarms_and_conditions/client_tools.d.ts +7 -0
  20. package/dist/alarms_and_conditions/client_tools.js +180 -0
  21. package/dist/alarms_and_conditions/client_tools.js.map +1 -0
  22. package/dist/client_base.d.ts +277 -0
  23. package/dist/client_base.js +15 -0
  24. package/dist/client_base.js.map +1 -0
  25. package/dist/client_monitored_item.d.ts +21 -0
  26. package/dist/client_monitored_item.js +12 -0
  27. package/dist/client_monitored_item.js.map +1 -0
  28. package/dist/client_monitored_item_base.d.ts +39 -0
  29. package/dist/client_monitored_item_base.js +3 -0
  30. package/dist/client_monitored_item_base.js.map +1 -0
  31. package/dist/client_monitored_item_group.d.ts +21 -0
  32. package/dist/client_monitored_item_group.js +14 -0
  33. package/dist/client_monitored_item_group.js.map +1 -0
  34. package/dist/client_monitored_item_toolbox.d.ts +15 -0
  35. package/dist/client_monitored_item_toolbox.js +117 -0
  36. package/dist/client_monitored_item_toolbox.js.map +1 -0
  37. package/dist/client_session.d.ts +529 -0
  38. package/dist/client_session.js +11 -0
  39. package/dist/client_session.js.map +1 -0
  40. package/dist/client_session_keepalive_manager.d.ts +34 -0
  41. package/dist/client_session_keepalive_manager.js +150 -0
  42. package/dist/client_session_keepalive_manager.js.map +1 -0
  43. package/dist/client_subscription.d.ts +241 -0
  44. package/dist/client_subscription.js +15 -0
  45. package/dist/client_subscription.js.map +1 -0
  46. package/dist/client_utils.d.ts +22 -0
  47. package/dist/client_utils.js +88 -0
  48. package/dist/client_utils.js.map +1 -0
  49. package/dist/common.d.ts +17 -0
  50. package/dist/common.js +6 -0
  51. package/dist/common.js.map +1 -0
  52. package/dist/index.d.ts +56 -0
  53. package/dist/index.js +95 -0
  54. package/dist/index.js.map +1 -0
  55. package/dist/opcua_client.d.ts +118 -0
  56. package/dist/opcua_client.js +34 -0
  57. package/dist/opcua_client.js.map +1 -0
  58. package/dist/private/client_base_impl.d.ts +160 -0
  59. package/dist/private/client_base_impl.js +1349 -0
  60. package/dist/private/client_base_impl.js.map +1 -0
  61. package/dist/private/client_monitored_item_base_impl.d.ts +3 -0
  62. package/dist/private/client_monitored_item_base_impl.js +5 -0
  63. package/dist/private/client_monitored_item_base_impl.js.map +1 -0
  64. package/dist/private/client_monitored_item_group_impl.d.ts +53 -0
  65. package/dist/private/client_monitored_item_group_impl.js +162 -0
  66. package/dist/private/client_monitored_item_group_impl.js.map +1 -0
  67. package/dist/private/client_monitored_item_impl.d.ts +93 -0
  68. package/dist/private/client_monitored_item_impl.js +305 -0
  69. package/dist/private/client_monitored_item_impl.js.map +1 -0
  70. package/dist/private/client_publish_engine.d.ts +62 -0
  71. package/dist/private/client_publish_engine.js +409 -0
  72. package/dist/private/client_publish_engine.js.map +1 -0
  73. package/dist/private/client_session_impl.d.ts +631 -0
  74. package/dist/private/client_session_impl.js +1349 -0
  75. package/dist/private/client_session_impl.js.map +1 -0
  76. package/dist/private/client_subscription_impl.d.ts +93 -0
  77. package/dist/private/client_subscription_impl.js +780 -0
  78. package/dist/private/client_subscription_impl.js.map +1 -0
  79. package/dist/private/i_private_client.d.ts +21 -0
  80. package/dist/private/i_private_client.js +3 -0
  81. package/dist/private/i_private_client.js.map +1 -0
  82. package/dist/private/opcua_client_impl.d.ts +166 -0
  83. package/dist/private/opcua_client_impl.js +1001 -0
  84. package/dist/private/opcua_client_impl.js.map +1 -0
  85. package/dist/private/performance.d.ts +1 -0
  86. package/dist/private/performance.js +19 -0
  87. package/dist/private/performance.js.map +1 -0
  88. package/dist/reconnection.d.ts +9 -0
  89. package/dist/reconnection.js +382 -0
  90. package/dist/reconnection.js.map +1 -0
  91. package/dist/tools/findservers.d.ts +20 -0
  92. package/dist/tools/findservers.js +62 -0
  93. package/dist/tools/findservers.js.map +1 -0
  94. package/dist/tools/read_history_server_capabilities.d.ts +6 -0
  95. package/dist/tools/read_history_server_capabilities.js +99 -0
  96. package/dist/tools/read_history_server_capabilities.js.map +1 -0
  97. package/dist/user_identity_info.d.ts +1 -0
  98. package/dist/user_identity_info.js +3 -0
  99. package/dist/user_identity_info.js.map +1 -0
  100. package/dist/verify.d.ts +5 -0
  101. package/dist/verify.js +135 -0
  102. package/dist/verify.js.map +1 -0
  103. package/package.json +48 -44
  104. package/.nycrc.json +0 -14
  105. package/test_helpers/create_certificates.js +0 -1
  106. package/typedoc.js +0 -20
@@ -0,0 +1,193 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.confirmAllConditions = exports.acknwoledgeAllConditions = exports.findActiveConditions = exports.confirmCondition = exports.acknowledgeCondition = void 0;
13
+ const node_opcua_nodeid_1 = require("node-opcua-nodeid");
14
+ const node_opcua_service_filter_1 = require("node-opcua-service-filter");
15
+ const node_opcua_service_read_1 = require("node-opcua-service-read");
16
+ const node_opcua_status_code_1 = require("node-opcua-status-code");
17
+ const node_opcua_variant_1 = require("node-opcua-variant");
18
+ const node_opcua_debug_1 = require("node-opcua-debug");
19
+ const client_alarm_1 = require("./client_alarm");
20
+ const client_alarm_tools_extractConditionFields_1 = require("./client_alarm_tools_extractConditionFields");
21
+ const client_tools_1 = require("./client_tools");
22
+ const doDebug = (0, node_opcua_debug_1.checkDebugFlag)(__filename);
23
+ const debugLog = (0, node_opcua_debug_1.make_debugLog)(__filename);
24
+ const errorLog = (0, node_opcua_debug_1.make_errorLog)(__filename);
25
+ /**
26
+ *
27
+ * @param session
28
+ * @param eventStuff
29
+ * @param comment
30
+ */
31
+ function acknowledgeCondition(session, eventStuff, comment) {
32
+ return __awaiter(this, void 0, void 0, function* () {
33
+ try {
34
+ const conditionId = eventStuff.conditionId.value;
35
+ const eventId = eventStuff.eventId.value;
36
+ return yield session.acknowledgeCondition(conditionId, eventId, comment);
37
+ }
38
+ catch (err) {
39
+ errorLog("Acknowledging alarm has failed !", err);
40
+ return node_opcua_status_code_1.StatusCodes.BadInternalError;
41
+ }
42
+ });
43
+ }
44
+ exports.acknowledgeCondition = acknowledgeCondition;
45
+ function confirmCondition(session, eventStuff, comment) {
46
+ return __awaiter(this, void 0, void 0, function* () {
47
+ try {
48
+ const conditionId = eventStuff.conditionId.value;
49
+ const eventId = eventStuff.eventId.value;
50
+ return yield session.confirmCondition(conditionId, eventId, comment);
51
+ }
52
+ catch (err) {
53
+ errorLog("Acknowledging alarm has failed !", err);
54
+ return node_opcua_status_code_1.StatusCodes.BadInternalError;
55
+ }
56
+ });
57
+ }
58
+ exports.confirmCondition = confirmCondition;
59
+ /**
60
+ * Enumerate all events
61
+ * @param session
62
+ */
63
+ function findActiveConditions(session) {
64
+ return __awaiter(this, void 0, void 0, function* () {
65
+ const request = {
66
+ maxNotificationsPerPublish: 10000,
67
+ priority: 6,
68
+ publishingEnabled: true,
69
+ requestedLifetimeCount: 1000,
70
+ requestedMaxKeepAliveCount: 100,
71
+ requestedPublishingInterval: 100
72
+ };
73
+ const subscription = yield session.createSubscription2(request);
74
+ const itemToMonitor = {
75
+ attributeId: node_opcua_service_read_1.AttributeIds.EventNotifier,
76
+ nodeId: (0, node_opcua_nodeid_1.resolveNodeId)("Server") // i=2253
77
+ };
78
+ const fields = yield (0, client_alarm_tools_extractConditionFields_1.extractConditionFields)(session, "AcknowledgeableConditionType");
79
+ // note: we may want to have this select clause
80
+ // Or(OfType("AcknowledgeableConditionType"), OfType("RefreshStartEventType"), OfType("RefreshEndEventType"))
81
+ const eventFilter = (0, node_opcua_service_filter_1.constructEventFilter)(fields);
82
+ const monitoringParameters = {
83
+ discardOldest: false,
84
+ filter: eventFilter,
85
+ queueSize: 100,
86
+ samplingInterval: 0
87
+ };
88
+ const event_monitoringItem = yield subscription.monitor(itemToMonitor, monitoringParameters, node_opcua_service_read_1.TimestampsToReturn.Both);
89
+ const acknowledgeableConditions = [];
90
+ let refreshStartEventHasBeenReceived = false;
91
+ let RefreshEndEventHasBeenReceived = false;
92
+ const RefreshStartEventType = (0, node_opcua_nodeid_1.resolveNodeId)("RefreshStartEventType").toString();
93
+ const RefreshEndEventType = (0, node_opcua_nodeid_1.resolveNodeId)("RefreshEndEventType").toString();
94
+ const promise = new Promise((resolve, reject) => {
95
+ // now create a event monitored Item
96
+ event_monitoringItem.on("changed", (_eventFields) => {
97
+ const eventFields = _eventFields;
98
+ try {
99
+ if (RefreshEndEventHasBeenReceived) {
100
+ return;
101
+ }
102
+ // dumpEvent(session, fields, eventFields);
103
+ const pojo = (0, client_alarm_1.fieldsToJson)(fields, eventFields);
104
+ // console.log(pojo.eventType.value.toString({ addressSpace}), RefreshEndEventType, RefreshStartEventType);
105
+ // make sure we only start recording event after the RefreshStartEvent has been received
106
+ if (!refreshStartEventHasBeenReceived) {
107
+ if (pojo.eventType.value.toString() === RefreshStartEventType) {
108
+ refreshStartEventHasBeenReceived = true;
109
+ }
110
+ return;
111
+ }
112
+ if (pojo.eventType.value.toString() === RefreshEndEventType) {
113
+ RefreshEndEventHasBeenReceived = true;
114
+ resolve();
115
+ return;
116
+ }
117
+ if (!pojo.conditionId.value) {
118
+ // not a Acknowledgeable condition
119
+ return;
120
+ }
121
+ if (pojo.ackedState.id.dataType === node_opcua_variant_1.DataType.Boolean) {
122
+ acknowledgeableConditions.push(pojo);
123
+ }
124
+ }
125
+ catch (err) {
126
+ errorLog("Error !!", err);
127
+ }
128
+ });
129
+ // async call without waiting !
130
+ try {
131
+ (0, client_tools_1.callConditionRefresh)(subscription);
132
+ }
133
+ catch (err) {
134
+ // it is possible that server do not implement conditionRefresh ...
135
+ debugLog("Server may not implement conditionRefresh", err);
136
+ }
137
+ });
138
+ yield promise;
139
+ // now shut down susbscription
140
+ yield subscription.terminate();
141
+ return acknowledgeableConditions;
142
+ });
143
+ }
144
+ exports.findActiveConditions = findActiveConditions;
145
+ function acknwoledgeAllConditions(session, message) {
146
+ return __awaiter(this, void 0, void 0, function* () {
147
+ try {
148
+ let conditions = yield findActiveConditions(session);
149
+ if (conditions.length === 0) {
150
+ debugLog("Warning: cannot find conditions ");
151
+ }
152
+ // filter acknowledgable conditions (no acked yet)
153
+ conditions = conditions.filter((pojo) => pojo.ackedState.id.value === false);
154
+ const promises = [];
155
+ for (const eventStuff of conditions) {
156
+ promises.push(acknowledgeCondition(session, eventStuff, message));
157
+ }
158
+ const result = yield Promise.all(promises);
159
+ if (doDebug) {
160
+ debugLog("Acked all results: ", result.map((e) => e.toString()).join(" "));
161
+ }
162
+ }
163
+ catch (err) {
164
+ errorLog("Error", err);
165
+ }
166
+ });
167
+ }
168
+ exports.acknwoledgeAllConditions = acknwoledgeAllConditions;
169
+ function confirmAllConditions(session, message) {
170
+ return __awaiter(this, void 0, void 0, function* () {
171
+ try {
172
+ let conditions = yield findActiveConditions(session);
173
+ if (conditions.length === 0) {
174
+ debugLog("Warning: cannot find conditions ");
175
+ }
176
+ // filter acknowledgable conditions (no acked yet)
177
+ conditions = conditions.filter((pojo) => pojo.confirmedState.id.value === false);
178
+ const promises = [];
179
+ for (const eventStuff of conditions) {
180
+ promises.push(confirmCondition(session, eventStuff, message));
181
+ }
182
+ const result = yield Promise.all(promises);
183
+ if (doDebug) {
184
+ debugLog("Confirm all results: ", result.map((e) => e.toString()).join(" "));
185
+ }
186
+ }
187
+ catch (err) {
188
+ errorLog("Error", err);
189
+ }
190
+ });
191
+ }
192
+ exports.confirmAllConditions = confirmAllConditions;
193
+ //# sourceMappingURL=client_alarm_tools_acknowledge_all_conditions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client_alarm_tools_acknowledge_all_conditions.js","sourceRoot":"","sources":["../../source/alarms_and_conditions/client_alarm_tools_acknowledge_all_conditions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { IBasicSession } from "node-opcua-pseudo-session";
2
+ import { Variant } from "node-opcua-variant";
3
+ /**
4
+ *
5
+ * @param session
6
+ * @param fields
7
+ * @param eventFields
8
+ */
9
+ export declare function dumpEvent(session: IBasicSession, fields: string[], eventFields: Variant[]): Promise<void>;
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.dumpEvent = void 0;
13
+ const chalk = require("chalk");
14
+ const node_opcua_data_model_1 = require("node-opcua-data-model");
15
+ const node_opcua_variant_1 = require("node-opcua-variant");
16
+ /**
17
+ *
18
+ * @param session
19
+ * @param fields
20
+ * @param eventFields
21
+ */
22
+ function dumpEvent(session, fields, eventFields) {
23
+ return __awaiter(this, void 0, void 0, function* () {
24
+ function getBrowseName(_session, nodeId) {
25
+ return __awaiter(this, void 0, void 0, function* () {
26
+ const dataValue = yield _session.read({
27
+ attributeId: node_opcua_data_model_1.AttributeIds.BrowseName,
28
+ nodeId
29
+ });
30
+ if (dataValue.statusCode.isGood()) {
31
+ const browseName = dataValue.value.value.name;
32
+ return browseName;
33
+ }
34
+ else {
35
+ return "???";
36
+ }
37
+ });
38
+ }
39
+ function w(str, l) {
40
+ return (str || "").toString().padEnd(l, " ").substring(0, l);
41
+ }
42
+ function __dumpEvent1(_session, _fields, variant, index) {
43
+ return __awaiter(this, void 0, void 0, function* () {
44
+ if (variant.dataType === node_opcua_variant_1.DataType.Null) {
45
+ return;
46
+ }
47
+ if (variant.dataType === node_opcua_variant_1.DataType.NodeId) {
48
+ const name = yield getBrowseName(_session, variant.value);
49
+ // tslint:disable-next-line: no-console
50
+ console.log(chalk.yellow(w(name, 30), w(_fields[index], 25)), chalk.cyan(w(node_opcua_variant_1.DataType[variant.dataType], 10).toString()), chalk.cyan.bold(name), "(", w(variant.value, 20), ")");
51
+ }
52
+ else {
53
+ // tslint:disable-next-line: no-console
54
+ console.log(chalk.yellow(w("", 30), w(_fields[index], 25)), chalk.cyan(w(node_opcua_variant_1.DataType[variant.dataType], 10).toString()), variant.value);
55
+ }
56
+ });
57
+ }
58
+ function __dumpEvent(_session, _fields, _eventFields) {
59
+ return __awaiter(this, void 0, void 0, function* () {
60
+ let index = 0;
61
+ const promises = [];
62
+ for (const variant of _eventFields) {
63
+ promises.push(__dumpEvent1(_session, _fields, variant, index));
64
+ index++;
65
+ }
66
+ yield Promise.all(promises);
67
+ });
68
+ }
69
+ yield __dumpEvent(session, fields, eventFields);
70
+ });
71
+ }
72
+ exports.dumpEvent = dumpEvent;
73
+ //# sourceMappingURL=client_alarm_tools_dump_event.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client_alarm_tools_dump_event.js","sourceRoot":"","sources":["../../source/alarms_and_conditions/client_alarm_tools_dump_event.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,+BAA+B;AAC/B,iEAAqD;AAGrD,2DAAoE;AAEpE;;;;;GAKG;AACH,SAAsB,SAAS,CAAC,OAAsB,EAAE,MAAgB,EAAE,WAAsB;;QAC5F,SAAe,aAAa,CAAC,QAAuB,EAAE,MAAc;;gBAChE,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC;oBAClC,WAAW,EAAE,oCAAY,CAAC,UAAU;oBACpC,MAAM;iBACT,CAAC,CAAC;gBACH,IAAI,SAAS,CAAC,UAAU,CAAC,MAAM,EAAE,EAAE;oBAC/B,MAAM,UAAU,GAAG,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,IAAK,CAAC;oBAC/C,OAAO,UAAU,CAAC;iBACrB;qBAAM;oBACH,OAAO,KAAK,CAAC;iBAChB;YACL,CAAC;SAAA;QACD,SAAS,CAAC,CAAC,GAAW,EAAE,CAAS;YAC7B,OAAO,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACjE,CAAC;QACD,SAAe,YAAY,CAAC,QAAuB,EAAE,OAAY,EAAE,OAAoB,EAAE,KAAa;;gBAClG,IAAI,OAAO,CAAC,QAAQ,KAAK,6BAAQ,CAAC,IAAI,EAAE;oBACpC,OAAO;iBACV;gBACD,IAAI,OAAO,CAAC,QAAQ,KAAK,6BAAQ,CAAC,MAAM,EAAE;oBACtC,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;oBAC1D,uCAAuC;oBACvC,OAAO,CAAC,GAAG,CACP,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,EAChD,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,6BAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,EACxD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EACrB,GAAG,EACH,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,EACpB,GAAG,CACN,CAAC;iBACL;qBAAM;oBACH,uCAAuC;oBACvC,OAAO,CAAC,GAAG,CACP,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,EAC9C,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,6BAAQ,CAAC,OAAO,CAAC,QAAkB,CAAC,EAAE,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,EAClE,OAAO,CAAC,KAAK,CAChB,CAAC;iBACL;YACL,CAAC;SAAA;QAED,SAAe,WAAW,CAAC,QAAuB,EAAE,OAAiB,EAAE,YAAuB;;gBAC1F,IAAI,KAAK,GAAG,CAAC,CAAC;gBACd,MAAM,QAAQ,GAAG,EAAE,CAAC;gBACpB,KAAK,MAAM,OAAO,IAAI,YAAY,EAAE;oBAChC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;oBAC/D,KAAK,EAAE,CAAC;iBACX;gBACD,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAChC,CAAC;SAAA;QACD,MAAM,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;IACpD,CAAC;CAAA;AAnDD,8BAmDC"}
@@ -0,0 +1,3 @@
1
+ import { NodeIdLike } from "node-opcua-nodeid";
2
+ import { IBasicSession } from "node-opcua-pseudo-session";
3
+ export declare function extractConditionFields(session: IBasicSession, conditionNodeId: NodeIdLike): Promise<string[]>;
@@ -0,0 +1,119 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.extractConditionFields = void 0;
13
+ const node_opcua_data_model_1 = require("node-opcua-data-model");
14
+ const node_opcua_nodeid_1 = require("node-opcua-nodeid");
15
+ const node_opcua_types_1 = require("node-opcua-types");
16
+ function extractConditionFields(session, conditionNodeId) {
17
+ return __awaiter(this, void 0, void 0, function* () {
18
+ // conditionNodeId could be a Object of type ConditionType
19
+ // or it could be directly a ObjectType which is a subType of ConditionType
20
+ const _duplicateMap = {};
21
+ const fields1 = [];
22
+ function addField(name) {
23
+ if (!_duplicateMap[name]) {
24
+ fields1.push(name);
25
+ _duplicateMap[name] = name;
26
+ }
27
+ }
28
+ const stack = [];
29
+ function deferObjectOrVariableInvestigation(objectId, browseName) {
30
+ stack.push({
31
+ browseName,
32
+ nodeId: objectId
33
+ });
34
+ }
35
+ function _investigateObjectOrVariable() {
36
+ return __awaiter(this, void 0, void 0, function* () {
37
+ if (stack.length === 0) {
38
+ return;
39
+ }
40
+ const extracted = stack.splice(0);
41
+ const nodesToBrowse = extracted.map((e) => {
42
+ const b = {
43
+ browseDirection: node_opcua_data_model_1.BrowseDirection.Forward,
44
+ includeSubtypes: true,
45
+ // tslint:disable-next-line: no-bitwise
46
+ nodeClassMask: node_opcua_data_model_1.NodeClassMask.Object | node_opcua_data_model_1.NodeClassMask.Variable,
47
+ nodeId: e.nodeId,
48
+ referenceTypeId: "HasChild",
49
+ resultMask: 63
50
+ };
51
+ return b;
52
+ });
53
+ const results = yield session.browse(nodesToBrowse);
54
+ let i = 0;
55
+ for (const result of results) {
56
+ const name = extracted[i].browseName.toString();
57
+ i++;
58
+ if (!result.references) {
59
+ continue;
60
+ }
61
+ for (const ref of result.references) {
62
+ const n = name + "." + ref.browseName.toString();
63
+ if (ref.nodeClass === node_opcua_types_1.NodeClass.Variable) {
64
+ addField(n);
65
+ }
66
+ deferObjectOrVariableInvestigation(ref.nodeId, n);
67
+ }
68
+ }
69
+ yield _investigateObjectOrVariable();
70
+ });
71
+ }
72
+ // tslint:disable-next-line: no-shadowed-variable
73
+ function _investigateLevel(conditionNodeId) {
74
+ return __awaiter(this, void 0, void 0, function* () {
75
+ const nodeToBrowse1 = {
76
+ browseDirection: node_opcua_data_model_1.BrowseDirection.Inverse,
77
+ includeSubtypes: true,
78
+ nodeClassMask: node_opcua_data_model_1.NodeClassMask.ObjectType,
79
+ nodeId: conditionNodeId,
80
+ referenceTypeId: (0, node_opcua_nodeid_1.resolveNodeId)("HasSubtype"),
81
+ resultMask: 63
82
+ };
83
+ const nodeToBrowse2 = {
84
+ browseDirection: node_opcua_data_model_1.BrowseDirection.Forward,
85
+ includeSubtypes: true,
86
+ // tslint:disable-next-line: no-bitwise
87
+ nodeClassMask: node_opcua_data_model_1.NodeClassMask.Object | node_opcua_data_model_1.NodeClassMask.Variable,
88
+ nodeId: conditionNodeId,
89
+ referenceTypeId: (0, node_opcua_nodeid_1.resolveNodeId)("HasChild"),
90
+ resultMask: 63
91
+ };
92
+ const nodesToBrowse = [nodeToBrowse1, nodeToBrowse2];
93
+ const browseResults = yield session.browse(nodesToBrowse);
94
+ if (browseResults[1] && browseResults[1].references) {
95
+ for (const ref of browseResults[1].references) {
96
+ if (ref.nodeClass === node_opcua_types_1.NodeClass.Variable) {
97
+ addField(ref.browseName.toString());
98
+ }
99
+ deferObjectOrVariableInvestigation(ref.nodeId, ref.browseName.toString());
100
+ }
101
+ }
102
+ if (browseResults[0] && browseResults[0].references) {
103
+ const promises = [];
104
+ for (const reference of browseResults[0].references) {
105
+ promises.push(_investigateLevel(reference.nodeId));
106
+ }
107
+ yield Promise.all(promises);
108
+ }
109
+ yield _investigateObjectOrVariable();
110
+ });
111
+ }
112
+ yield _investigateLevel(conditionNodeId);
113
+ // add this field which will always be added
114
+ addField("ConditionId");
115
+ return fields1;
116
+ });
117
+ }
118
+ exports.extractConditionFields = extractConditionFields;
119
+ //# sourceMappingURL=client_alarm_tools_extractConditionFields.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client_alarm_tools_extractConditionFields.js","sourceRoot":"","sources":["../../source/alarms_and_conditions/client_alarm_tools_extractConditionFields.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @module node-opcua-client
3
+ */
4
+ import { ErrorCallback } from "node-opcua-status-code";
5
+ import { ClientSubscription } from "../client_subscription";
6
+ export declare function callConditionRefresh(subscription: ClientSubscription): Promise<void>;
7
+ export declare function callConditionRefresh(subscription: ClientSubscription, callback: ErrorCallback): void;
@@ -0,0 +1,180 @@
1
+ "use strict";
2
+ /**
3
+ * @module node-opcua-client
4
+ */
5
+ // tslint:disable:no-empty
6
+ // tslint:disable: only-arrow-functions
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.callConditionRefresh = void 0;
9
+ const async = require("async");
10
+ const node_opcua_assert_1 = require("node-opcua-assert");
11
+ const node_opcua_data_model_1 = require("node-opcua-data-model");
12
+ const node_opcua_debug_1 = require("node-opcua-debug");
13
+ const node_opcua_nodeid_1 = require("node-opcua-nodeid");
14
+ const node_opcua_service_call_1 = require("node-opcua-service-call");
15
+ const node_opcua_service_translate_browse_path_1 = require("node-opcua-service-translate-browse-path");
16
+ const node_opcua_variant_1 = require("node-opcua-variant");
17
+ const client_session_impl_1 = require("../private/client_session_impl");
18
+ const debugLog = (0, node_opcua_debug_1.make_debugLog)("A&E");
19
+ const doDebug = (0, node_opcua_debug_1.checkDebugFlag)("A&E");
20
+ const warningLog = (0, node_opcua_debug_1.make_warningLog)("A&E");
21
+ function callConditionRefresh(subscription, callback) {
22
+ const subscriptionI = subscription;
23
+ const theSession = subscriptionI.publishEngine.session;
24
+ const subscriptionId = subscription.subscriptionId;
25
+ (0, node_opcua_assert_1.assert)(isFinite(subscriptionId), "May be subscription is not yet initialized");
26
+ (0, node_opcua_assert_1.assert)(typeof callback === "function");
27
+ const conditionTypeNodeId = (0, node_opcua_nodeid_1.resolveNodeId)("ConditionType");
28
+ let conditionRefreshId = (0, node_opcua_nodeid_1.resolveNodeId)("ConditionType_ConditionRefresh");
29
+ async.series([
30
+ // find conditionRefreshId
31
+ (innerCallback) => {
32
+ const browsePath = (0, node_opcua_service_translate_browse_path_1.makeBrowsePath)(conditionTypeNodeId, ".ConditionRefresh");
33
+ theSession.translateBrowsePath(browsePath, (err, result) => {
34
+ if (!err) {
35
+ result = result;
36
+ // istanbul ignore else
37
+ if (result.targets && result.targets.length > 0) {
38
+ conditionRefreshId = result.targets[0].targetId;
39
+ }
40
+ else {
41
+ // cannot find conditionRefreshId
42
+ debugLog("cannot find conditionRefreshId", result.toString());
43
+ err = new Error(" cannot find conditionRefreshId");
44
+ }
45
+ }
46
+ innerCallback(err ? err : undefined);
47
+ });
48
+ },
49
+ (innerCallback) => {
50
+ const methodToCall = {
51
+ inputArguments: [new node_opcua_variant_1.Variant({ dataType: node_opcua_variant_1.DataType.UInt32, value: subscriptionId })],
52
+ methodId: conditionRefreshId,
53
+ objectId: conditionTypeNodeId
54
+ };
55
+ doDebug && debugLog("Calling method ", new node_opcua_service_call_1.CallMethodRequest(methodToCall).toString());
56
+ theSession.call(methodToCall, (err, result) => {
57
+ if (err) {
58
+ return innerCallback(err);
59
+ }
60
+ result = result;
61
+ // istanbul ignore next
62
+ if (result.statusCode.isNotGood()) {
63
+ warningLog(new node_opcua_service_call_1.CallMethodRequest(methodToCall).toString());
64
+ return innerCallback(new Error("Error " + result.statusCode.toString()));
65
+ }
66
+ innerCallback();
67
+ });
68
+ }
69
+ ], (err) => {
70
+ callback(err || undefined);
71
+ });
72
+ }
73
+ exports.callConditionRefresh = callConditionRefresh;
74
+ client_session_impl_1.ClientSessionImpl.prototype.disableCondition = () => {
75
+ /** */
76
+ };
77
+ client_session_impl_1.ClientSessionImpl.prototype.enableCondition = () => {
78
+ /** */
79
+ };
80
+ client_session_impl_1.ClientSessionImpl.prototype.addCommentCondition = function (conditionId, eventId, comment, callback) {
81
+ this._callMethodCondition("AddComment", conditionId, eventId, comment, callback);
82
+ };
83
+ client_session_impl_1.ClientSessionImpl.prototype.findMethodId = function (nodeId, methodName, callback) {
84
+ const browsePath = (0, node_opcua_service_translate_browse_path_1.makeBrowsePath)(nodeId, "/" + methodName);
85
+ let methodId;
86
+ this.translateBrowsePath(browsePath, (err, result) => {
87
+ if (err) {
88
+ return callback(err);
89
+ }
90
+ /* istanbul ignore next */
91
+ if (!result) {
92
+ return callback(new Error("Internal Error"));
93
+ }
94
+ result.targets = result.targets || [];
95
+ // istanbul ignore else
96
+ if (result.targets.length > 0) {
97
+ methodId = result.targets[0].targetId;
98
+ return callback(null, methodId);
99
+ }
100
+ else {
101
+ // cannot find objectWithMethodNodeId
102
+ debugLog("cannot find " + methodName + " Method", result.toString());
103
+ err = new Error(" cannot find " + methodName + " Method");
104
+ }
105
+ callback(err);
106
+ });
107
+ };
108
+ /**
109
+ *
110
+ * @param methodName
111
+ * @param conditionId
112
+ * @param eventId
113
+ * @param comment
114
+ * @param callback
115
+ * @private
116
+ */
117
+ client_session_impl_1.ClientSessionImpl.prototype._callMethodCondition = function (methodName, conditionId, eventId, comment, callback) {
118
+ conditionId = (0, node_opcua_nodeid_1.coerceNodeId)(conditionId);
119
+ (0, node_opcua_assert_1.assert)(conditionId instanceof node_opcua_nodeid_1.NodeId);
120
+ (0, node_opcua_assert_1.assert)(eventId instanceof Buffer);
121
+ (0, node_opcua_assert_1.assert)(typeof comment === "string" || comment instanceof node_opcua_data_model_1.LocalizedText);
122
+ comment = node_opcua_data_model_1.LocalizedText.coerce(comment) || new node_opcua_data_model_1.LocalizedText();
123
+ let methodId;
124
+ let statusCode;
125
+ async.series([
126
+ (innerCallback) => {
127
+ this.findMethodId(conditionId, methodName, (err, _methodId) => {
128
+ if (err) {
129
+ return innerCallback(err);
130
+ }
131
+ if (_methodId) {
132
+ methodId = _methodId;
133
+ }
134
+ innerCallback();
135
+ });
136
+ },
137
+ (innerCallback) => {
138
+ const methodToCalls = [];
139
+ methodToCalls.push(new node_opcua_service_call_1.CallMethodRequest({
140
+ inputArguments: [
141
+ /* eventId */ new node_opcua_variant_1.Variant({ dataType: "ByteString", value: eventId }),
142
+ /* comment */ new node_opcua_variant_1.Variant({ dataType: "LocalizedText", value: comment })
143
+ ],
144
+ methodId,
145
+ objectId: conditionId
146
+ }));
147
+ this.call(methodToCalls, (err, results) => {
148
+ if (err) {
149
+ return innerCallback(err);
150
+ }
151
+ statusCode = results[0].statusCode;
152
+ innerCallback();
153
+ });
154
+ }
155
+ ], (err) => {
156
+ if (err) {
157
+ return callback(err);
158
+ }
159
+ callback(null, statusCode);
160
+ });
161
+ };
162
+ client_session_impl_1.ClientSessionImpl.prototype.confirmCondition = function (conditionId, eventId, comment, callback) {
163
+ // ns=0;i=9113 AcknowledgeableConditionType#Confirm
164
+ // note that confirm method is Optionals on condition
165
+ this._callMethodCondition("Confirm", conditionId, eventId, comment, callback);
166
+ };
167
+ client_session_impl_1.ClientSessionImpl.prototype.acknowledgeCondition = function (conditionId, eventId, comment, callback) {
168
+ // ns=0;i=9111 AcknowledgeableConditionType#Acknowledge
169
+ this._callMethodCondition("Acknowledge", conditionId, eventId, comment, callback);
170
+ };
171
+ // tslint:disable:no-var-requires
172
+ // tslint:disable:max-line-length
173
+ const thenify = require("thenify");
174
+ const opts = { multiArgs: false };
175
+ client_session_impl_1.ClientSessionImpl.prototype.addCommentCondition = thenify.withCallback(client_session_impl_1.ClientSessionImpl.prototype.addCommentCondition, opts);
176
+ client_session_impl_1.ClientSessionImpl.prototype.findMethodId = thenify.withCallback(client_session_impl_1.ClientSessionImpl.prototype.findMethodId, opts);
177
+ client_session_impl_1.ClientSessionImpl.prototype.confirmCondition = thenify.withCallback(client_session_impl_1.ClientSessionImpl.prototype.confirmCondition, opts);
178
+ client_session_impl_1.ClientSessionImpl.prototype.acknowledgeCondition = thenify.withCallback(client_session_impl_1.ClientSessionImpl.prototype.acknowledgeCondition, opts);
179
+ module.exports.callConditionRefresh = thenify.withCallback(module.exports.callConditionRefresh, opts);
180
+ //# sourceMappingURL=client_tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client_tools.js","sourceRoot":"","sources":["../../source/alarms_and_conditions/client_tools.ts"],"names":[],"mappings":"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"}