opcjs-client 0.1.17-alpha → 0.1.20-alpha
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.
- package/dist/index.cjs +221 -292
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +26 -114
- package/dist/index.d.ts +26 -114
- package/dist/index.js +222 -294
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -28,6 +28,10 @@ var SessionService = class _SessionService extends ServiceBase {
|
|
|
28
28
|
this.configuration = configuration;
|
|
29
29
|
}
|
|
30
30
|
logger = opcjsBase.getLogger("services.SessionService");
|
|
31
|
+
/**
|
|
32
|
+
* Creates a new session on the server (OPC UA Part 4, Section 5.7.2).
|
|
33
|
+
* @returns The session ID, authentication token, and selected server endpoint.
|
|
34
|
+
*/
|
|
31
35
|
async createSession() {
|
|
32
36
|
this.logger.debug("Creating session...");
|
|
33
37
|
const clientDescription = new opcjsBase.ApplicationDescription();
|
|
@@ -57,6 +61,10 @@ var SessionService = class _SessionService extends ServiceBase {
|
|
|
57
61
|
if (!castedResponse || !castedResponse.sessionId || !castedResponse.authenticationToken) {
|
|
58
62
|
throw new Error("CreateSessionResponse missing SessionId or AuthenticationToken");
|
|
59
63
|
}
|
|
64
|
+
const serviceResult = castedResponse.responseHeader?.serviceResult;
|
|
65
|
+
if (serviceResult !== void 0 && serviceResult !== opcjsBase.StatusCode.Good) {
|
|
66
|
+
throw new Error(`CreateSessionRequest failed: ${opcjsBase.StatusCodeToString(serviceResult)}`);
|
|
67
|
+
}
|
|
60
68
|
const endpoint = "opc." + this.secureChannel.getEndpointUrl();
|
|
61
69
|
const endpointUrl = new URL(endpoint);
|
|
62
70
|
const securityMode = this.secureChannel.getSecurityMode();
|
|
@@ -75,6 +83,10 @@ var SessionService = class _SessionService extends ServiceBase {
|
|
|
75
83
|
endpoint: serverEndpoint
|
|
76
84
|
};
|
|
77
85
|
}
|
|
86
|
+
/**
|
|
87
|
+
* Activates an existing session using the supplied identity token (OPC UA Part 4, Section 5.7.3).
|
|
88
|
+
* @param identityToken - User identity token (anonymous, username/password, certificate, or issued token).
|
|
89
|
+
*/
|
|
78
90
|
async activateSession(identityToken) {
|
|
79
91
|
const signatureData = new opcjsBase.SignatureData();
|
|
80
92
|
signatureData.algorithm = this.secureChannel.getSecurityPolicy();
|
|
@@ -87,7 +99,11 @@ var SessionService = class _SessionService extends ServiceBase {
|
|
|
87
99
|
request.userIdentityToken = opcjsBase.ExtensionObject.newBinary(identityToken);
|
|
88
100
|
request.userTokenSignature = signatureData;
|
|
89
101
|
this.logger.debug("Sending ActivateSessionRequest...");
|
|
90
|
-
await this.secureChannel.issueServiceRequest(request);
|
|
102
|
+
const activateResponse = await this.secureChannel.issueServiceRequest(request);
|
|
103
|
+
const activateResult = activateResponse?.responseHeader?.serviceResult;
|
|
104
|
+
if (activateResult !== void 0 && activateResult !== opcjsBase.StatusCode.Good) {
|
|
105
|
+
throw new Error(`ActivateSessionRequest failed: ${opcjsBase.StatusCodeToString(activateResult)}`);
|
|
106
|
+
}
|
|
91
107
|
this.logger.debug("Session activated.");
|
|
92
108
|
}
|
|
93
109
|
recreate(authToken) {
|
|
@@ -171,268 +187,17 @@ var SessionHandler = class {
|
|
|
171
187
|
// src/services/attributeServiceAttributes.ts
|
|
172
188
|
var AttrIdValue = 13;
|
|
173
189
|
|
|
174
|
-
// ../base/src/types/statusCode.ts
|
|
175
|
-
function StatusCodeToString(statusCode) {
|
|
176
|
-
if (statusCode === void 0) {
|
|
177
|
-
return "Unknown";
|
|
178
|
-
}
|
|
179
|
-
const name = Object.entries(StatusCode).find(([, v]) => v === statusCode)?.[0];
|
|
180
|
-
return name ?? `0x${statusCode.toString(16).toUpperCase().padStart(8, "0")}`;
|
|
181
|
-
}
|
|
182
|
-
var StatusCode = /* @__PURE__ */ ((StatusCode2) => {
|
|
183
|
-
StatusCode2[StatusCode2["Good"] = 0] = "Good";
|
|
184
|
-
StatusCode2[StatusCode2["Uncertain"] = 1073741824] = "Uncertain";
|
|
185
|
-
StatusCode2[StatusCode2["Bad"] = 2147483648] = "Bad";
|
|
186
|
-
StatusCode2[StatusCode2["BadUnexpectedError"] = 2147549184] = "BadUnexpectedError";
|
|
187
|
-
StatusCode2[StatusCode2["BadInternalError"] = 2147614720] = "BadInternalError";
|
|
188
|
-
StatusCode2[StatusCode2["BadOutOfMemory"] = 2147680256] = "BadOutOfMemory";
|
|
189
|
-
StatusCode2[StatusCode2["BadResourceUnavailable"] = 2147745792] = "BadResourceUnavailable";
|
|
190
|
-
StatusCode2[StatusCode2["BadCommunicationError"] = 2147811328] = "BadCommunicationError";
|
|
191
|
-
StatusCode2[StatusCode2["BadEncodingError"] = 2147876864] = "BadEncodingError";
|
|
192
|
-
StatusCode2[StatusCode2["BadDecodingError"] = 2147942400] = "BadDecodingError";
|
|
193
|
-
StatusCode2[StatusCode2["BadEncodingLimitsExceeded"] = 2148007936] = "BadEncodingLimitsExceeded";
|
|
194
|
-
StatusCode2[StatusCode2["BadRequestTooLarge"] = 2159542272] = "BadRequestTooLarge";
|
|
195
|
-
StatusCode2[StatusCode2["BadResponseTooLarge"] = 2159607808] = "BadResponseTooLarge";
|
|
196
|
-
StatusCode2[StatusCode2["BadUnknownResponse"] = 2148073472] = "BadUnknownResponse";
|
|
197
|
-
StatusCode2[StatusCode2["BadTimeout"] = 2148139008] = "BadTimeout";
|
|
198
|
-
StatusCode2[StatusCode2["BadServiceUnsupported"] = 2148204544] = "BadServiceUnsupported";
|
|
199
|
-
StatusCode2[StatusCode2["BadShutdown"] = 2148270080] = "BadShutdown";
|
|
200
|
-
StatusCode2[StatusCode2["BadServerNotConnected"] = 2148335616] = "BadServerNotConnected";
|
|
201
|
-
StatusCode2[StatusCode2["BadServerHalted"] = 2148401152] = "BadServerHalted";
|
|
202
|
-
StatusCode2[StatusCode2["BadNothingToDo"] = 2148466688] = "BadNothingToDo";
|
|
203
|
-
StatusCode2[StatusCode2["BadTooManyOperations"] = 2148532224] = "BadTooManyOperations";
|
|
204
|
-
StatusCode2[StatusCode2["BadTooManyMonitoredItems"] = 2161836032] = "BadTooManyMonitoredItems";
|
|
205
|
-
StatusCode2[StatusCode2["BadDataTypeIdUnknown"] = 2148597760] = "BadDataTypeIdUnknown";
|
|
206
|
-
StatusCode2[StatusCode2["BadCertificateInvalid"] = 2148663296] = "BadCertificateInvalid";
|
|
207
|
-
StatusCode2[StatusCode2["BadSecurityChecksFailed"] = 2148728832] = "BadSecurityChecksFailed";
|
|
208
|
-
StatusCode2[StatusCode2["BadCertificatePolicyCheckFailed"] = 2165571584] = "BadCertificatePolicyCheckFailed";
|
|
209
|
-
StatusCode2[StatusCode2["BadCertificateTimeInvalid"] = 2148794368] = "BadCertificateTimeInvalid";
|
|
210
|
-
StatusCode2[StatusCode2["BadCertificateIssuerTimeInvalid"] = 2148859904] = "BadCertificateIssuerTimeInvalid";
|
|
211
|
-
StatusCode2[StatusCode2["BadCertificateHostNameInvalid"] = 2148925440] = "BadCertificateHostNameInvalid";
|
|
212
|
-
StatusCode2[StatusCode2["BadCertificateUriInvalid"] = 2148990976] = "BadCertificateUriInvalid";
|
|
213
|
-
StatusCode2[StatusCode2["BadCertificateUseNotAllowed"] = 2149056512] = "BadCertificateUseNotAllowed";
|
|
214
|
-
StatusCode2[StatusCode2["BadCertificateIssuerUseNotAllowed"] = 2149122048] = "BadCertificateIssuerUseNotAllowed";
|
|
215
|
-
StatusCode2[StatusCode2["BadCertificateUntrusted"] = 2149187584] = "BadCertificateUntrusted";
|
|
216
|
-
StatusCode2[StatusCode2["BadCertificateRevocationUnknown"] = 2149253120] = "BadCertificateRevocationUnknown";
|
|
217
|
-
StatusCode2[StatusCode2["BadCertificateIssuerRevocationUnknown"] = 2149318656] = "BadCertificateIssuerRevocationUnknown";
|
|
218
|
-
StatusCode2[StatusCode2["BadCertificateRevoked"] = 2149384192] = "BadCertificateRevoked";
|
|
219
|
-
StatusCode2[StatusCode2["BadCertificateIssuerRevoked"] = 2149449728] = "BadCertificateIssuerRevoked";
|
|
220
|
-
StatusCode2[StatusCode2["BadCertificateChainIncomplete"] = 2165112832] = "BadCertificateChainIncomplete";
|
|
221
|
-
StatusCode2[StatusCode2["BadUserAccessDenied"] = 2149515264] = "BadUserAccessDenied";
|
|
222
|
-
StatusCode2[StatusCode2["BadIdentityTokenInvalid"] = 2149580800] = "BadIdentityTokenInvalid";
|
|
223
|
-
StatusCode2[StatusCode2["BadIdentityTokenRejected"] = 2149646336] = "BadIdentityTokenRejected";
|
|
224
|
-
StatusCode2[StatusCode2["BadSecureChannelIdInvalid"] = 2149711872] = "BadSecureChannelIdInvalid";
|
|
225
|
-
StatusCode2[StatusCode2["BadInvalidTimestamp"] = 2149777408] = "BadInvalidTimestamp";
|
|
226
|
-
StatusCode2[StatusCode2["BadNonceInvalid"] = 2149842944] = "BadNonceInvalid";
|
|
227
|
-
StatusCode2[StatusCode2["BadSessionIdInvalid"] = 2149908480] = "BadSessionIdInvalid";
|
|
228
|
-
StatusCode2[StatusCode2["BadSessionClosed"] = 2149974016] = "BadSessionClosed";
|
|
229
|
-
StatusCode2[StatusCode2["BadSessionNotActivated"] = 2150039552] = "BadSessionNotActivated";
|
|
230
|
-
StatusCode2[StatusCode2["BadSubscriptionIdInvalid"] = 2150105088] = "BadSubscriptionIdInvalid";
|
|
231
|
-
StatusCode2[StatusCode2["BadRequestHeaderInvalid"] = 2150236160] = "BadRequestHeaderInvalid";
|
|
232
|
-
StatusCode2[StatusCode2["BadTimestampsToReturnInvalid"] = 2150301696] = "BadTimestampsToReturnInvalid";
|
|
233
|
-
StatusCode2[StatusCode2["BadRequestCancelledByClient"] = 2150367232] = "BadRequestCancelledByClient";
|
|
234
|
-
StatusCode2[StatusCode2["BadTooManyArguments"] = 2162491392] = "BadTooManyArguments";
|
|
235
|
-
StatusCode2[StatusCode2["BadLicenseExpired"] = 2165178368] = "BadLicenseExpired";
|
|
236
|
-
StatusCode2[StatusCode2["BadLicenseLimitsExceeded"] = 2165243904] = "BadLicenseLimitsExceeded";
|
|
237
|
-
StatusCode2[StatusCode2["BadLicenseNotAvailable"] = 2165309440] = "BadLicenseNotAvailable";
|
|
238
|
-
StatusCode2[StatusCode2["GoodSubscriptionTransferred"] = 2949120] = "GoodSubscriptionTransferred";
|
|
239
|
-
StatusCode2[StatusCode2["GoodCompletesAsynchronously"] = 3014656] = "GoodCompletesAsynchronously";
|
|
240
|
-
StatusCode2[StatusCode2["GoodOverload"] = 3080192] = "GoodOverload";
|
|
241
|
-
StatusCode2[StatusCode2["GoodClamped"] = 3145728] = "GoodClamped";
|
|
242
|
-
StatusCode2[StatusCode2["BadNoCommunication"] = 2150694912] = "BadNoCommunication";
|
|
243
|
-
StatusCode2[StatusCode2["BadWaitingForInitialData"] = 2150760448] = "BadWaitingForInitialData";
|
|
244
|
-
StatusCode2[StatusCode2["BadNodeIdInvalid"] = 2150825984] = "BadNodeIdInvalid";
|
|
245
|
-
StatusCode2[StatusCode2["BadNodeIdUnknown"] = 2150891520] = "BadNodeIdUnknown";
|
|
246
|
-
StatusCode2[StatusCode2["BadAttributeIdInvalid"] = 2150957056] = "BadAttributeIdInvalid";
|
|
247
|
-
StatusCode2[StatusCode2["BadIndexRangeInvalid"] = 2151022592] = "BadIndexRangeInvalid";
|
|
248
|
-
StatusCode2[StatusCode2["BadIndexRangeNoData"] = 2151088128] = "BadIndexRangeNoData";
|
|
249
|
-
StatusCode2[StatusCode2["BadDataEncodingInvalid"] = 2151153664] = "BadDataEncodingInvalid";
|
|
250
|
-
StatusCode2[StatusCode2["BadDataEncodingUnsupported"] = 2151219200] = "BadDataEncodingUnsupported";
|
|
251
|
-
StatusCode2[StatusCode2["BadNotReadable"] = 2151284736] = "BadNotReadable";
|
|
252
|
-
StatusCode2[StatusCode2["BadNotWritable"] = 2151350272] = "BadNotWritable";
|
|
253
|
-
StatusCode2[StatusCode2["BadOutOfRange"] = 2151415808] = "BadOutOfRange";
|
|
254
|
-
StatusCode2[StatusCode2["BadNotSupported"] = 2151481344] = "BadNotSupported";
|
|
255
|
-
StatusCode2[StatusCode2["BadNotFound"] = 2151546880] = "BadNotFound";
|
|
256
|
-
StatusCode2[StatusCode2["BadObjectDeleted"] = 2151612416] = "BadObjectDeleted";
|
|
257
|
-
StatusCode2[StatusCode2["BadNotImplemented"] = 2151677952] = "BadNotImplemented";
|
|
258
|
-
StatusCode2[StatusCode2["BadMonitoringModeInvalid"] = 2151743488] = "BadMonitoringModeInvalid";
|
|
259
|
-
StatusCode2[StatusCode2["BadMonitoredItemIdInvalid"] = 2151809024] = "BadMonitoredItemIdInvalid";
|
|
260
|
-
StatusCode2[StatusCode2["BadMonitoredItemFilterInvalid"] = 2151874560] = "BadMonitoredItemFilterInvalid";
|
|
261
|
-
StatusCode2[StatusCode2["BadMonitoredItemFilterUnsupported"] = 2151940096] = "BadMonitoredItemFilterUnsupported";
|
|
262
|
-
StatusCode2[StatusCode2["BadFilterNotAllowed"] = 2152005632] = "BadFilterNotAllowed";
|
|
263
|
-
StatusCode2[StatusCode2["BadStructureMissing"] = 2152071168] = "BadStructureMissing";
|
|
264
|
-
StatusCode2[StatusCode2["BadEventFilterInvalid"] = 2152136704] = "BadEventFilterInvalid";
|
|
265
|
-
StatusCode2[StatusCode2["BadContentFilterInvalid"] = 2152202240] = "BadContentFilterInvalid";
|
|
266
|
-
StatusCode2[StatusCode2["BadFilterOperatorInvalid"] = 2160132096] = "BadFilterOperatorInvalid";
|
|
267
|
-
StatusCode2[StatusCode2["BadFilterOperatorUnsupported"] = 2160197632] = "BadFilterOperatorUnsupported";
|
|
268
|
-
StatusCode2[StatusCode2["BadFilterOperandCountMismatch"] = 2160263168] = "BadFilterOperandCountMismatch";
|
|
269
|
-
StatusCode2[StatusCode2["BadFilterOperandInvalid"] = 2152267776] = "BadFilterOperandInvalid";
|
|
270
|
-
StatusCode2[StatusCode2["BadFilterElementInvalid"] = 2160328704] = "BadFilterElementInvalid";
|
|
271
|
-
StatusCode2[StatusCode2["BadFilterLiteralInvalid"] = 2160394240] = "BadFilterLiteralInvalid";
|
|
272
|
-
StatusCode2[StatusCode2["BadContinuationPointInvalid"] = 2152333312] = "BadContinuationPointInvalid";
|
|
273
|
-
StatusCode2[StatusCode2["BadNoContinuationPoints"] = 2152398848] = "BadNoContinuationPoints";
|
|
274
|
-
StatusCode2[StatusCode2["BadReferenceTypeIdInvalid"] = 2152464384] = "BadReferenceTypeIdInvalid";
|
|
275
|
-
StatusCode2[StatusCode2["BadBrowseDirectionInvalid"] = 2152529920] = "BadBrowseDirectionInvalid";
|
|
276
|
-
StatusCode2[StatusCode2["BadNodeNotInView"] = 2152595456] = "BadNodeNotInView";
|
|
277
|
-
StatusCode2[StatusCode2["BadNumericOverflow"] = 2165440512] = "BadNumericOverflow";
|
|
278
|
-
StatusCode2[StatusCode2["BadServerUriInvalid"] = 2152660992] = "BadServerUriInvalid";
|
|
279
|
-
StatusCode2[StatusCode2["BadServerNameMissing"] = 2152726528] = "BadServerNameMissing";
|
|
280
|
-
StatusCode2[StatusCode2["BadDiscoveryUrlMissing"] = 2152792064] = "BadDiscoveryUrlMissing";
|
|
281
|
-
StatusCode2[StatusCode2["BadSempahoreFileMissing"] = 2152857600] = "BadSempahoreFileMissing";
|
|
282
|
-
StatusCode2[StatusCode2["BadRequestTypeInvalid"] = 2152923136] = "BadRequestTypeInvalid";
|
|
283
|
-
StatusCode2[StatusCode2["BadSecurityModeRejected"] = 2152988672] = "BadSecurityModeRejected";
|
|
284
|
-
StatusCode2[StatusCode2["BadSecurityPolicyRejected"] = 2153054208] = "BadSecurityPolicyRejected";
|
|
285
|
-
StatusCode2[StatusCode2["BadTooManySessions"] = 2153119744] = "BadTooManySessions";
|
|
286
|
-
StatusCode2[StatusCode2["BadUserSignatureInvalid"] = 2153185280] = "BadUserSignatureInvalid";
|
|
287
|
-
StatusCode2[StatusCode2["BadApplicationSignatureInvalid"] = 2153250816] = "BadApplicationSignatureInvalid";
|
|
288
|
-
StatusCode2[StatusCode2["BadNoValidCertificates"] = 2153316352] = "BadNoValidCertificates";
|
|
289
|
-
StatusCode2[StatusCode2["BadIdentityChangeNotSupported"] = 2160459776] = "BadIdentityChangeNotSupported";
|
|
290
|
-
StatusCode2[StatusCode2["BadRequestCancelledByRequest"] = 2153381888] = "BadRequestCancelledByRequest";
|
|
291
|
-
StatusCode2[StatusCode2["BadParentNodeIdInvalid"] = 2153447424] = "BadParentNodeIdInvalid";
|
|
292
|
-
StatusCode2[StatusCode2["BadReferenceNotAllowed"] = 2153512960] = "BadReferenceNotAllowed";
|
|
293
|
-
StatusCode2[StatusCode2["BadNodeIdRejected"] = 2153578496] = "BadNodeIdRejected";
|
|
294
|
-
StatusCode2[StatusCode2["BadNodeIdExists"] = 2153644032] = "BadNodeIdExists";
|
|
295
|
-
StatusCode2[StatusCode2["BadNodeClassInvalid"] = 2153709568] = "BadNodeClassInvalid";
|
|
296
|
-
StatusCode2[StatusCode2["BadBrowseNameInvalid"] = 2153775104] = "BadBrowseNameInvalid";
|
|
297
|
-
StatusCode2[StatusCode2["BadBrowseNameDuplicated"] = 2153840640] = "BadBrowseNameDuplicated";
|
|
298
|
-
StatusCode2[StatusCode2["BadNodeAttributesInvalid"] = 2153906176] = "BadNodeAttributesInvalid";
|
|
299
|
-
StatusCode2[StatusCode2["BadTypeDefinitionInvalid"] = 2153971712] = "BadTypeDefinitionInvalid";
|
|
300
|
-
StatusCode2[StatusCode2["BadSourceNodeIdInvalid"] = 2154037248] = "BadSourceNodeIdInvalid";
|
|
301
|
-
StatusCode2[StatusCode2["BadTargetNodeIdInvalid"] = 2154102784] = "BadTargetNodeIdInvalid";
|
|
302
|
-
StatusCode2[StatusCode2["BadDuplicateReferenceNotAllowed"] = 2154168320] = "BadDuplicateReferenceNotAllowed";
|
|
303
|
-
StatusCode2[StatusCode2["BadInvalidSelfReference"] = 2154233856] = "BadInvalidSelfReference";
|
|
304
|
-
StatusCode2[StatusCode2["BadReferenceLocalOnly"] = 2154299392] = "BadReferenceLocalOnly";
|
|
305
|
-
StatusCode2[StatusCode2["BadNoDeleteRights"] = 2154364928] = "BadNoDeleteRights";
|
|
306
|
-
StatusCode2[StatusCode2["UncertainReferenceNotDeleted"] = 1086062592] = "UncertainReferenceNotDeleted";
|
|
307
|
-
StatusCode2[StatusCode2["BadServerIndexInvalid"] = 2154430464] = "BadServerIndexInvalid";
|
|
308
|
-
StatusCode2[StatusCode2["BadViewIdUnknown"] = 2154496e3] = "BadViewIdUnknown";
|
|
309
|
-
StatusCode2[StatusCode2["BadViewTimestampInvalid"] = 2160656384] = "BadViewTimestampInvalid";
|
|
310
|
-
StatusCode2[StatusCode2["BadViewParameterMismatch"] = 2160721920] = "BadViewParameterMismatch";
|
|
311
|
-
StatusCode2[StatusCode2["BadViewVersionInvalid"] = 2160787456] = "BadViewVersionInvalid";
|
|
312
|
-
StatusCode2[StatusCode2["UncertainNotAllNodesAvailable"] = 1086324736] = "UncertainNotAllNodesAvailable";
|
|
313
|
-
StatusCode2[StatusCode2["GoodResultsMayBeIncomplete"] = 12189696] = "GoodResultsMayBeIncomplete";
|
|
314
|
-
StatusCode2[StatusCode2["BadNotTypeDefinition"] = 2160590848] = "BadNotTypeDefinition";
|
|
315
|
-
StatusCode2[StatusCode2["UncertainReferenceOutOfServer"] = 1080819712] = "UncertainReferenceOutOfServer";
|
|
316
|
-
StatusCode2[StatusCode2["BadTooManyMatches"] = 2154627072] = "BadTooManyMatches";
|
|
317
|
-
StatusCode2[StatusCode2["BadQueryTooComplex"] = 2154692608] = "BadQueryTooComplex";
|
|
318
|
-
StatusCode2[StatusCode2["BadNoMatch"] = 2154758144] = "BadNoMatch";
|
|
319
|
-
StatusCode2[StatusCode2["BadMaxAgeInvalid"] = 2154823680] = "BadMaxAgeInvalid";
|
|
320
|
-
StatusCode2[StatusCode2["BadSecurityModeInsufficient"] = 2162556928] = "BadSecurityModeInsufficient";
|
|
321
|
-
StatusCode2[StatusCode2["BadHistoryOperationInvalid"] = 2154889216] = "BadHistoryOperationInvalid";
|
|
322
|
-
StatusCode2[StatusCode2["BadHistoryOperationUnsupported"] = 2154954752] = "BadHistoryOperationUnsupported";
|
|
323
|
-
StatusCode2[StatusCode2["BadInvalidTimestampArgument"] = 2159869952] = "BadInvalidTimestampArgument";
|
|
324
|
-
StatusCode2[StatusCode2["BadWriteNotSupported"] = 2155020288] = "BadWriteNotSupported";
|
|
325
|
-
StatusCode2[StatusCode2["BadTypeMismatch"] = 2155085824] = "BadTypeMismatch";
|
|
326
|
-
StatusCode2[StatusCode2["BadMethodInvalid"] = 2155151360] = "BadMethodInvalid";
|
|
327
|
-
StatusCode2[StatusCode2["BadArgumentsMissing"] = 2155216896] = "BadArgumentsMissing";
|
|
328
|
-
StatusCode2[StatusCode2["BadNotExecutable"] = 2165374976] = "BadNotExecutable";
|
|
329
|
-
StatusCode2[StatusCode2["BadTooManySubscriptions"] = 2155282432] = "BadTooManySubscriptions";
|
|
330
|
-
StatusCode2[StatusCode2["BadTooManyPublishRequests"] = 2155347968] = "BadTooManyPublishRequests";
|
|
331
|
-
StatusCode2[StatusCode2["BadNoSubscription"] = 2155413504] = "BadNoSubscription";
|
|
332
|
-
StatusCode2[StatusCode2["BadSequenceNumberUnknown"] = 2155479040] = "BadSequenceNumberUnknown";
|
|
333
|
-
StatusCode2[StatusCode2["BadMessageNotAvailable"] = 2155544576] = "BadMessageNotAvailable";
|
|
334
|
-
StatusCode2[StatusCode2["BadInsufficientClientProfile"] = 2155610112] = "BadInsufficientClientProfile";
|
|
335
|
-
StatusCode2[StatusCode2["BadStateNotActive"] = 2160001024] = "BadStateNotActive";
|
|
336
|
-
StatusCode2[StatusCode2["BadAlreadyExists"] = 2165637120] = "BadAlreadyExists";
|
|
337
|
-
StatusCode2[StatusCode2["BadTcpServerTooBusy"] = 2155675648] = "BadTcpServerTooBusy";
|
|
338
|
-
StatusCode2[StatusCode2["BadTcpMessageTypeInvalid"] = 2155741184] = "BadTcpMessageTypeInvalid";
|
|
339
|
-
StatusCode2[StatusCode2["BadTcpSecureChannelUnknown"] = 2155806720] = "BadTcpSecureChannelUnknown";
|
|
340
|
-
StatusCode2[StatusCode2["BadTcpMessageTooLarge"] = 2155872256] = "BadTcpMessageTooLarge";
|
|
341
|
-
StatusCode2[StatusCode2["BadTcpNotEnoughResources"] = 2155937792] = "BadTcpNotEnoughResources";
|
|
342
|
-
StatusCode2[StatusCode2["BadTcpInternalError"] = 2156003328] = "BadTcpInternalError";
|
|
343
|
-
StatusCode2[StatusCode2["BadTcpEndpointUrlInvalid"] = 2156068864] = "BadTcpEndpointUrlInvalid";
|
|
344
|
-
StatusCode2[StatusCode2["BadRequestInterrupted"] = 2156134400] = "BadRequestInterrupted";
|
|
345
|
-
StatusCode2[StatusCode2["BadRequestTimeout"] = 2156199936] = "BadRequestTimeout";
|
|
346
|
-
StatusCode2[StatusCode2["BadSecureChannelClosed"] = 2156265472] = "BadSecureChannelClosed";
|
|
347
|
-
StatusCode2[StatusCode2["BadSecureChannelTokenUnknown"] = 2156331008] = "BadSecureChannelTokenUnknown";
|
|
348
|
-
StatusCode2[StatusCode2["BadSequenceNumberInvalid"] = 2156396544] = "BadSequenceNumberInvalid";
|
|
349
|
-
StatusCode2[StatusCode2["BadProtocolVersionUnsupported"] = 2159935488] = "BadProtocolVersionUnsupported";
|
|
350
|
-
StatusCode2[StatusCode2["BadConfigurationError"] = 2156462080] = "BadConfigurationError";
|
|
351
|
-
StatusCode2[StatusCode2["BadNotConnected"] = 2156527616] = "BadNotConnected";
|
|
352
|
-
StatusCode2[StatusCode2["BadDeviceFailure"] = 2156593152] = "BadDeviceFailure";
|
|
353
|
-
StatusCode2[StatusCode2["BadSensorFailure"] = 2156658688] = "BadSensorFailure";
|
|
354
|
-
StatusCode2[StatusCode2["BadOutOfService"] = 2156724224] = "BadOutOfService";
|
|
355
|
-
StatusCode2[StatusCode2["BadDeadbandFilterInvalid"] = 2156789760] = "BadDeadbandFilterInvalid";
|
|
356
|
-
StatusCode2[StatusCode2["UncertainNoCommunicationLastUsableValue"] = 1083113472] = "UncertainNoCommunicationLastUsableValue";
|
|
357
|
-
StatusCode2[StatusCode2["UncertainLastUsableValue"] = 1083179008] = "UncertainLastUsableValue";
|
|
358
|
-
StatusCode2[StatusCode2["UncertainSubstituteValue"] = 1083244544] = "UncertainSubstituteValue";
|
|
359
|
-
StatusCode2[StatusCode2["UncertainInitialValue"] = 1083310080] = "UncertainInitialValue";
|
|
360
|
-
StatusCode2[StatusCode2["UncertainSensorNotAccurate"] = 1083375616] = "UncertainSensorNotAccurate";
|
|
361
|
-
StatusCode2[StatusCode2["UncertainEngineeringUnitsExceeded"] = 1083441152] = "UncertainEngineeringUnitsExceeded";
|
|
362
|
-
StatusCode2[StatusCode2["UncertainSubNormal"] = 1083506688] = "UncertainSubNormal";
|
|
363
|
-
StatusCode2[StatusCode2["GoodLocalOverride"] = 9830400] = "GoodLocalOverride";
|
|
364
|
-
StatusCode2[StatusCode2["BadRefreshInProgress"] = 2157379584] = "BadRefreshInProgress";
|
|
365
|
-
StatusCode2[StatusCode2["BadConditionAlreadyDisabled"] = 2157445120] = "BadConditionAlreadyDisabled";
|
|
366
|
-
StatusCode2[StatusCode2["BadConditionAlreadyEnabled"] = 2160852992] = "BadConditionAlreadyEnabled";
|
|
367
|
-
StatusCode2[StatusCode2["BadConditionDisabled"] = 2157510656] = "BadConditionDisabled";
|
|
368
|
-
StatusCode2[StatusCode2["BadEventIdUnknown"] = 2157576192] = "BadEventIdUnknown";
|
|
369
|
-
StatusCode2[StatusCode2["BadEventNotAcknowledgeable"] = 2159738880] = "BadEventNotAcknowledgeable";
|
|
370
|
-
StatusCode2[StatusCode2["BadDialogNotActive"] = 2160918528] = "BadDialogNotActive";
|
|
371
|
-
StatusCode2[StatusCode2["BadDialogResponseInvalid"] = 2160984064] = "BadDialogResponseInvalid";
|
|
372
|
-
StatusCode2[StatusCode2["BadConditionBranchAlreadyAcked"] = 2161049600] = "BadConditionBranchAlreadyAcked";
|
|
373
|
-
StatusCode2[StatusCode2["BadConditionBranchAlreadyConfirmed"] = 2161115136] = "BadConditionBranchAlreadyConfirmed";
|
|
374
|
-
StatusCode2[StatusCode2["BadConditionAlreadyShelved"] = 2161180672] = "BadConditionAlreadyShelved";
|
|
375
|
-
StatusCode2[StatusCode2["BadConditionNotShelved"] = 2161246208] = "BadConditionNotShelved";
|
|
376
|
-
StatusCode2[StatusCode2["BadShelvingTimeOutOfRange"] = 2161311744] = "BadShelvingTimeOutOfRange";
|
|
377
|
-
StatusCode2[StatusCode2["BadNoData"] = 2157641728] = "BadNoData";
|
|
378
|
-
StatusCode2[StatusCode2["BadBoundNotFound"] = 2161573888] = "BadBoundNotFound";
|
|
379
|
-
StatusCode2[StatusCode2["BadBoundNotSupported"] = 2161639424] = "BadBoundNotSupported";
|
|
380
|
-
StatusCode2[StatusCode2["BadDataLost"] = 2157772800] = "BadDataLost";
|
|
381
|
-
StatusCode2[StatusCode2["BadDataUnavailable"] = 2157838336] = "BadDataUnavailable";
|
|
382
|
-
StatusCode2[StatusCode2["BadEntryExists"] = 2157903872] = "BadEntryExists";
|
|
383
|
-
StatusCode2[StatusCode2["BadNoEntryExists"] = 2157969408] = "BadNoEntryExists";
|
|
384
|
-
StatusCode2[StatusCode2["BadTimestampNotSupported"] = 2158034944] = "BadTimestampNotSupported";
|
|
385
|
-
StatusCode2[StatusCode2["GoodEntryInserted"] = 10616832] = "GoodEntryInserted";
|
|
386
|
-
StatusCode2[StatusCode2["GoodEntryReplaced"] = 10682368] = "GoodEntryReplaced";
|
|
387
|
-
StatusCode2[StatusCode2["UncertainDataSubNormal"] = 1084489728] = "UncertainDataSubNormal";
|
|
388
|
-
StatusCode2[StatusCode2["GoodNoData"] = 10813440] = "GoodNoData";
|
|
389
|
-
StatusCode2[StatusCode2["GoodMoreData"] = 10878976] = "GoodMoreData";
|
|
390
|
-
StatusCode2[StatusCode2["BadAggregateListMismatch"] = 2161377280] = "BadAggregateListMismatch";
|
|
391
|
-
StatusCode2[StatusCode2["BadAggregateNotSupported"] = 2161442816] = "BadAggregateNotSupported";
|
|
392
|
-
StatusCode2[StatusCode2["BadAggregateInvalidInputs"] = 2161508352] = "BadAggregateInvalidInputs";
|
|
393
|
-
StatusCode2[StatusCode2["BadAggregateConfigurationRejected"] = 2161770496] = "BadAggregateConfigurationRejected";
|
|
394
|
-
StatusCode2[StatusCode2["GoodDataIgnored"] = 14221312] = "GoodDataIgnored";
|
|
395
|
-
StatusCode2[StatusCode2["BadRequestNotAllowed"] = 2162425856] = "BadRequestNotAllowed";
|
|
396
|
-
StatusCode2[StatusCode2["BadRequestNotComplete"] = 2165506048] = "BadRequestNotComplete";
|
|
397
|
-
StatusCode2[StatusCode2["GoodEdited"] = 14417920] = "GoodEdited";
|
|
398
|
-
StatusCode2[StatusCode2["GoodPostActionFailed"] = 14483456] = "GoodPostActionFailed";
|
|
399
|
-
StatusCode2[StatusCode2["UncertainDominantValueChanged"] = 1088290816] = "UncertainDominantValueChanged";
|
|
400
|
-
StatusCode2[StatusCode2["GoodDependentValueChanged"] = 14680064] = "GoodDependentValueChanged";
|
|
401
|
-
StatusCode2[StatusCode2["BadDominantValueChanged"] = 2162229248] = "BadDominantValueChanged";
|
|
402
|
-
StatusCode2[StatusCode2["UncertainDependentValueChanged"] = 1088552960] = "UncertainDependentValueChanged";
|
|
403
|
-
StatusCode2[StatusCode2["BadDependentValueChanged"] = 2162360320] = "BadDependentValueChanged";
|
|
404
|
-
StatusCode2[StatusCode2["GoodEditedDependentValueChanged"] = 18219008] = "GoodEditedDependentValueChanged";
|
|
405
|
-
StatusCode2[StatusCode2["GoodEditedDominantValueChanged"] = 18284544] = "GoodEditedDominantValueChanged";
|
|
406
|
-
StatusCode2[StatusCode2["GoodEditedDominantValueChangedDependentValueChanged"] = 18350080] = "GoodEditedDominantValueChangedDependentValueChanged";
|
|
407
|
-
StatusCode2[StatusCode2["BadEditedOutOfRange"] = 2165899264] = "BadEditedOutOfRange";
|
|
408
|
-
StatusCode2[StatusCode2["BadInitialValueOutOfRange"] = 2165964800] = "BadInitialValueOutOfRange";
|
|
409
|
-
StatusCode2[StatusCode2["BadOutOfRangeDominantValueChanged"] = 2166030336] = "BadOutOfRangeDominantValueChanged";
|
|
410
|
-
StatusCode2[StatusCode2["BadEditedOutOfRangeDominantValueChanged"] = 2166095872] = "BadEditedOutOfRangeDominantValueChanged";
|
|
411
|
-
StatusCode2[StatusCode2["BadOutOfRangeDominantValueChangedDependentValueChanged"] = 2166161408] = "BadOutOfRangeDominantValueChangedDependentValueChanged";
|
|
412
|
-
StatusCode2[StatusCode2["BadEditedOutOfRangeDominantValueChangedDependentValueChanged"] = 2166226944] = "BadEditedOutOfRangeDominantValueChangedDependentValueChanged";
|
|
413
|
-
StatusCode2[StatusCode2["GoodCommunicationEvent"] = 10944512] = "GoodCommunicationEvent";
|
|
414
|
-
StatusCode2[StatusCode2["GoodShutdownEvent"] = 11010048] = "GoodShutdownEvent";
|
|
415
|
-
StatusCode2[StatusCode2["GoodCallAgain"] = 11075584] = "GoodCallAgain";
|
|
416
|
-
StatusCode2[StatusCode2["GoodNonCriticalTimeout"] = 11141120] = "GoodNonCriticalTimeout";
|
|
417
|
-
StatusCode2[StatusCode2["BadInvalidArgument"] = 2158690304] = "BadInvalidArgument";
|
|
418
|
-
StatusCode2[StatusCode2["BadConnectionRejected"] = 2158755840] = "BadConnectionRejected";
|
|
419
|
-
StatusCode2[StatusCode2["BadDisconnect"] = 2158821376] = "BadDisconnect";
|
|
420
|
-
StatusCode2[StatusCode2["BadConnectionClosed"] = 2158886912] = "BadConnectionClosed";
|
|
421
|
-
StatusCode2[StatusCode2["BadInvalidState"] = 2158952448] = "BadInvalidState";
|
|
422
|
-
StatusCode2[StatusCode2["BadEndOfStream"] = 2159017984] = "BadEndOfStream";
|
|
423
|
-
StatusCode2[StatusCode2["BadNoDataAvailable"] = 2159083520] = "BadNoDataAvailable";
|
|
424
|
-
StatusCode2[StatusCode2["BadWaitingForResponse"] = 2159149056] = "BadWaitingForResponse";
|
|
425
|
-
StatusCode2[StatusCode2["BadOperationAbandoned"] = 2159214592] = "BadOperationAbandoned";
|
|
426
|
-
StatusCode2[StatusCode2["BadExpectedStreamToBlock"] = 2159280128] = "BadExpectedStreamToBlock";
|
|
427
|
-
StatusCode2[StatusCode2["BadWouldBlock"] = 2159345664] = "BadWouldBlock";
|
|
428
|
-
StatusCode2[StatusCode2["BadSyntaxError"] = 2159411200] = "BadSyntaxError";
|
|
429
|
-
StatusCode2[StatusCode2["BadMaxConnectionsReached"] = 2159476736] = "BadMaxConnectionsReached";
|
|
430
|
-
return StatusCode2;
|
|
431
|
-
})(StatusCode || {});
|
|
432
|
-
|
|
433
190
|
// src/services/attributeService.ts
|
|
434
191
|
var AttributeService = class extends ServiceBase {
|
|
435
|
-
|
|
192
|
+
logger = opcjsBase.getLogger("services.AttributeService");
|
|
193
|
+
/**
|
|
194
|
+
* Reads the Value attribute of one or more Nodes (OPC UA Part 4, Section 5.10.2).
|
|
195
|
+
* @param nodeIds - NodeIds of the Nodes to read.
|
|
196
|
+
* @param maxAge - Maximum age of the cached value in milliseconds the server may return. 0 = always current value.
|
|
197
|
+
* @param timestampsToReturn - Which timestamps to include in results. Default: Source.
|
|
198
|
+
* @returns Array of results containing value and raw status code number, one per requested NodeId.
|
|
199
|
+
*/
|
|
200
|
+
async ReadValue(nodeIds, maxAge = 0, timestampsToReturn = opcjsBase.TimestampsToReturnEnum.Source) {
|
|
436
201
|
const readValueIds = nodeIds.map((ni) => {
|
|
437
202
|
const readValueId = new opcjsBase.ReadValueId();
|
|
438
203
|
readValueId.nodeId = ni;
|
|
@@ -443,18 +208,21 @@ var AttributeService = class extends ServiceBase {
|
|
|
443
208
|
});
|
|
444
209
|
const request = new opcjsBase.ReadRequest();
|
|
445
210
|
request.requestHeader = this.createRequestHeader();
|
|
446
|
-
request.maxAge =
|
|
447
|
-
request.timestampsToReturn =
|
|
211
|
+
request.maxAge = maxAge;
|
|
212
|
+
request.timestampsToReturn = timestampsToReturn;
|
|
448
213
|
request.nodesToRead = readValueIds;
|
|
449
|
-
|
|
214
|
+
this.logger.debug("Sending ReadRequest...");
|
|
450
215
|
const response = await this.secureChannel.issueServiceRequest(request);
|
|
216
|
+
const serviceResult = response.responseHeader?.serviceResult;
|
|
217
|
+
if (serviceResult !== void 0 && serviceResult !== opcjsBase.StatusCode.Good) {
|
|
218
|
+
throw new Error(`ReadRequest failed: ${opcjsBase.StatusCodeToString(serviceResult)} (${opcjsBase.StatusCodeToStringNumber(serviceResult)})`);
|
|
219
|
+
}
|
|
451
220
|
const results = new Array();
|
|
452
221
|
for (const dataValue of response.results ?? []) {
|
|
453
|
-
|
|
454
|
-
|
|
222
|
+
results.push({
|
|
223
|
+
statusCode: dataValue.statusCode ?? opcjsBase.StatusCode.Good,
|
|
455
224
|
value: dataValue.value
|
|
456
|
-
};
|
|
457
|
-
results.push(result);
|
|
225
|
+
});
|
|
458
226
|
}
|
|
459
227
|
return results;
|
|
460
228
|
}
|
|
@@ -465,9 +233,9 @@ var AttributeService = class extends ServiceBase {
|
|
|
465
233
|
|
|
466
234
|
// src/readValueResult.ts
|
|
467
235
|
var ReadValueResult = class {
|
|
468
|
-
constructor(value,
|
|
236
|
+
constructor(value, statusCode) {
|
|
469
237
|
this.value = value;
|
|
470
|
-
this.
|
|
238
|
+
this.statusCode = statusCode;
|
|
471
239
|
}
|
|
472
240
|
};
|
|
473
241
|
|
|
@@ -487,6 +255,7 @@ var SubscriptionHandler = class {
|
|
|
487
255
|
this.subscriptionService = subscriptionService;
|
|
488
256
|
this.monitoredItemService = monitoredItemService;
|
|
489
257
|
}
|
|
258
|
+
logger = opcjsBase.getLogger("SubscriptionHandler");
|
|
490
259
|
entries = new Array();
|
|
491
260
|
nextHandle = 0;
|
|
492
261
|
async subscribe(ids, callback) {
|
|
@@ -538,7 +307,7 @@ var SubscriptionHandler = class {
|
|
|
538
307
|
}]);
|
|
539
308
|
}
|
|
540
309
|
} else {
|
|
541
|
-
|
|
310
|
+
this.logger.warn(`Notification data type ${typeNodeId.namespace}:${typeNodeId.identifier} is not supported.`);
|
|
542
311
|
}
|
|
543
312
|
}
|
|
544
313
|
setTimeout(() => {
|
|
@@ -547,29 +316,48 @@ var SubscriptionHandler = class {
|
|
|
547
316
|
}
|
|
548
317
|
};
|
|
549
318
|
var SubscriptionService = class extends ServiceBase {
|
|
319
|
+
logger = opcjsBase.getLogger("services.SubscriptionService");
|
|
320
|
+
/**
|
|
321
|
+
* Creates a new subscription on the server (OPC UA Part 4, Section 5.14.2).
|
|
322
|
+
* @param options - Optional subscription parameters; server revises all values.
|
|
323
|
+
* @returns The server-assigned subscription ID.
|
|
324
|
+
*/
|
|
550
325
|
// https://reference.opcfoundation.org/Core/Part4/v105/docs/5.14.2
|
|
551
|
-
async createSubscription() {
|
|
326
|
+
async createSubscription(options) {
|
|
552
327
|
const request = new opcjsBase.CreateSubscriptionRequest();
|
|
553
328
|
request.requestHeader = this.createRequestHeader();
|
|
554
|
-
request.requestedPublishingInterval = 2e3;
|
|
555
|
-
request.requestedLifetimeCount = 36e4;
|
|
556
|
-
request.requestedMaxKeepAliveCount = 6e4;
|
|
557
|
-
request.maxNotificationsPerPublish = 200;
|
|
329
|
+
request.requestedPublishingInterval = options?.requestedPublishingInterval ?? 2e3;
|
|
330
|
+
request.requestedLifetimeCount = options?.requestedLifetimeCount ?? 36e4;
|
|
331
|
+
request.requestedMaxKeepAliveCount = options?.requestedMaxKeepAliveCount ?? 6e4;
|
|
332
|
+
request.maxNotificationsPerPublish = options?.maxNotificationsPerPublish ?? 200;
|
|
558
333
|
request.publishingEnabled = true;
|
|
559
|
-
request.priority = 1;
|
|
560
|
-
|
|
334
|
+
request.priority = options?.priority ?? 1;
|
|
335
|
+
this.logger.debug("Sending CreateSubscriptionRequest...");
|
|
561
336
|
const response = await this.secureChannel.issueServiceRequest(request);
|
|
562
|
-
|
|
337
|
+
const serviceResult = response.responseHeader?.serviceResult;
|
|
338
|
+
if (serviceResult !== void 0 && serviceResult !== opcjsBase.StatusCode.Good) {
|
|
339
|
+
throw new Error(`CreateSubscriptionRequest failed: ${opcjsBase.StatusCodeToString(serviceResult)}`);
|
|
340
|
+
}
|
|
341
|
+
this.logger.debug(`Subscription created with id: ${response.subscriptionId}`);
|
|
563
342
|
return response.subscriptionId;
|
|
564
343
|
}
|
|
344
|
+
/**
|
|
345
|
+
* Sends a publish request to receive notifications from active subscriptions (OPC UA Part 4, Section 5.14.5).
|
|
346
|
+
* @param acknowledgements - Sequence numbers to acknowledge from previous publish responses.
|
|
347
|
+
* @returns The publish response containing notification data.
|
|
348
|
+
*/
|
|
565
349
|
// https://reference.opcfoundation.org/Core/Part4/v105/docs/5.14.5
|
|
566
350
|
async publish(acknowledgements) {
|
|
567
351
|
const request = new opcjsBase.PublishRequest();
|
|
568
352
|
request.requestHeader = this.createRequestHeader();
|
|
569
353
|
request.subscriptionAcknowledgements = acknowledgements;
|
|
570
|
-
|
|
354
|
+
this.logger.debug("Sending PublishRequest...");
|
|
571
355
|
const response = await this.secureChannel.issueServiceRequest(request);
|
|
572
|
-
|
|
356
|
+
const serviceResult = response.responseHeader?.serviceResult;
|
|
357
|
+
if (serviceResult !== void 0 && serviceResult !== opcjsBase.StatusCode.Good) {
|
|
358
|
+
throw new Error(`PublishRequest failed: ${opcjsBase.StatusCodeToString(serviceResult)}`);
|
|
359
|
+
}
|
|
360
|
+
this.logger.debug("Received PublishResponse.");
|
|
573
361
|
return response;
|
|
574
362
|
}
|
|
575
363
|
constructor(authToken, secureChannel) {
|
|
@@ -577,7 +365,15 @@ var SubscriptionService = class extends ServiceBase {
|
|
|
577
365
|
}
|
|
578
366
|
};
|
|
579
367
|
var MonitoredItemService = class extends ServiceBase {
|
|
580
|
-
|
|
368
|
+
logger = opcjsBase.getLogger("services.MonitoredItemService");
|
|
369
|
+
/**
|
|
370
|
+
* Creates monitored items within a subscription (OPC UA Part 4, Section 5.13.2).
|
|
371
|
+
* @param subscriptionId - ID of the subscription to add monitored items to.
|
|
372
|
+
* @param ids - Array of NodeIds and client handles identifying the items to monitor.
|
|
373
|
+
* @param samplingInterval - Requested sampling interval in milliseconds. -1 = use subscription publishing interval.
|
|
374
|
+
* @param queueSize - Requested queue size for each monitored item.
|
|
375
|
+
*/
|
|
376
|
+
async createMonitoredItems(subscriptionId, ids, samplingInterval = 1e3, queueSize = 100) {
|
|
581
377
|
const items = ids.map((ni) => {
|
|
582
378
|
const readValueId = new opcjsBase.ReadValueId();
|
|
583
379
|
readValueId.nodeId = ni.id;
|
|
@@ -586,9 +382,9 @@ var MonitoredItemService = class extends ServiceBase {
|
|
|
586
382
|
readValueId.dataEncoding = new opcjsBase.QualifiedName(0, "");
|
|
587
383
|
const monitoringParameters = new opcjsBase.MonitoringParameters();
|
|
588
384
|
monitoringParameters.clientHandle = ni.handle;
|
|
589
|
-
monitoringParameters.samplingInterval =
|
|
385
|
+
monitoringParameters.samplingInterval = samplingInterval;
|
|
590
386
|
monitoringParameters.filter = opcjsBase.ExtensionObject.newEmpty();
|
|
591
|
-
monitoringParameters.queueSize =
|
|
387
|
+
monitoringParameters.queueSize = queueSize;
|
|
592
388
|
monitoringParameters.discardOldest = true;
|
|
593
389
|
const monitoredItemCreateRequest = new opcjsBase.MonitoredItemCreateRequest();
|
|
594
390
|
monitoredItemCreateRequest.itemToMonitor = readValueId;
|
|
@@ -601,26 +397,41 @@ var MonitoredItemService = class extends ServiceBase {
|
|
|
601
397
|
request.subscriptionId = subscriptionId;
|
|
602
398
|
request.timestampsToReturn = opcjsBase.TimestampsToReturnEnum.Source;
|
|
603
399
|
request.itemsToCreate = items;
|
|
604
|
-
|
|
605
|
-
await this.secureChannel.issueServiceRequest(request);
|
|
400
|
+
this.logger.debug("Sending CreateMonitoredItemsRequest...");
|
|
401
|
+
const response = await this.secureChannel.issueServiceRequest(request);
|
|
402
|
+
const serviceResult = response.responseHeader?.serviceResult;
|
|
403
|
+
if (serviceResult !== void 0 && serviceResult !== opcjsBase.StatusCode.Good) {
|
|
404
|
+
throw new Error(`CreateMonitoredItemsRequest failed: ${opcjsBase.StatusCodeToString(serviceResult)}`);
|
|
405
|
+
}
|
|
406
|
+
for (const result of response.results ?? []) {
|
|
407
|
+
if (result.statusCode !== void 0 && result.statusCode !== opcjsBase.StatusCode.Good) {
|
|
408
|
+
this.logger.warn(`Failed to create monitored item: ${opcjsBase.StatusCodeToString(result.statusCode)}`);
|
|
409
|
+
}
|
|
410
|
+
}
|
|
606
411
|
}
|
|
607
412
|
constructor(authToken, secureChannel) {
|
|
608
413
|
super(authToken, secureChannel);
|
|
609
414
|
}
|
|
610
415
|
};
|
|
611
416
|
var MethodService = class extends ServiceBase {
|
|
417
|
+
logger = opcjsBase.getLogger("services.MethodService");
|
|
612
418
|
/**
|
|
613
419
|
* Calls one or more methods on the server (OPC UA Part 4, Section 5.11.2).
|
|
614
420
|
* @param methodsToCall - Array of CallMethodRequest describing each method to invoke.
|
|
615
|
-
* @returns Array of
|
|
421
|
+
* @returns Array of results containing output argument values and raw status code number, one per requested method.
|
|
616
422
|
*/
|
|
617
423
|
async call(methodsToCall) {
|
|
618
424
|
const request = new opcjsBase.CallRequest();
|
|
619
425
|
request.requestHeader = this.createRequestHeader();
|
|
620
426
|
request.methodsToCall = methodsToCall;
|
|
427
|
+
this.logger.debug("Sending CallRequest...");
|
|
621
428
|
const response = await this.secureChannel.issueServiceRequest(request);
|
|
429
|
+
const serviceResult = response.responseHeader?.serviceResult;
|
|
430
|
+
if (serviceResult !== void 0 && serviceResult !== opcjsBase.StatusCode.Good) {
|
|
431
|
+
throw new Error(`CallRequest failed: ${opcjsBase.StatusCodeToString(serviceResult)} (${opcjsBase.StatusCodeToStringNumber(serviceResult)})`);
|
|
432
|
+
}
|
|
622
433
|
return response.results.map((result) => ({
|
|
623
|
-
|
|
434
|
+
statusCode: result.statusCode ?? opcjsBase.StatusCode.Good,
|
|
624
435
|
value: result.outputArguments.map((arg) => arg.value)
|
|
625
436
|
}));
|
|
626
437
|
}
|
|
@@ -631,9 +442,70 @@ var MethodService = class extends ServiceBase {
|
|
|
631
442
|
|
|
632
443
|
// src/callMethodResult.ts
|
|
633
444
|
var CallMethodResult = class {
|
|
634
|
-
constructor(values,
|
|
445
|
+
constructor(values, statusCode) {
|
|
635
446
|
this.values = values;
|
|
636
|
-
this.
|
|
447
|
+
this.statusCode = statusCode;
|
|
448
|
+
}
|
|
449
|
+
};
|
|
450
|
+
var BrowseService = class extends ServiceBase {
|
|
451
|
+
logger = opcjsBase.getLogger("services.BrowseService");
|
|
452
|
+
/**
|
|
453
|
+
* Browses one or more Nodes and returns their References (OPC UA Part 4, Section 5.9.2).
|
|
454
|
+
* @param nodesToBrowse - Array of BrowseDescriptions specifying nodes and filter criteria.
|
|
455
|
+
* @returns Array of BrowseResult, one per requested node.
|
|
456
|
+
*/
|
|
457
|
+
async browse(nodesToBrowse) {
|
|
458
|
+
const view = new opcjsBase.ViewDescription();
|
|
459
|
+
view.viewId = opcjsBase.NodeId.newNumeric(0, 0);
|
|
460
|
+
view.timestamp = /* @__PURE__ */ new Date(-116444736e5);
|
|
461
|
+
view.viewVersion = 0;
|
|
462
|
+
const request = new opcjsBase.BrowseRequest();
|
|
463
|
+
request.requestHeader = this.createRequestHeader();
|
|
464
|
+
request.view = view;
|
|
465
|
+
request.requestedMaxReferencesPerNode = 0;
|
|
466
|
+
request.nodesToBrowse = nodesToBrowse;
|
|
467
|
+
this.logger.debug("Sending BrowseRequest...");
|
|
468
|
+
const response = await this.secureChannel.issueServiceRequest(request);
|
|
469
|
+
const serviceResult = response.responseHeader?.serviceResult;
|
|
470
|
+
if (serviceResult !== void 0 && serviceResult !== opcjsBase.StatusCode.Good) {
|
|
471
|
+
throw new Error(`BrowseRequest failed: ${opcjsBase.StatusCodeToString(serviceResult)}`);
|
|
472
|
+
}
|
|
473
|
+
return response.results ?? [];
|
|
474
|
+
}
|
|
475
|
+
/**
|
|
476
|
+
* Continues a Browse operation using continuation points (OPC UA Part 4, Section 5.9.3).
|
|
477
|
+
* @param continuationPoints - Continuation points returned by a prior Browse or BrowseNext call.
|
|
478
|
+
* @param releaseContinuationPoints - If true, releases the continuation points without returning results.
|
|
479
|
+
* @returns Array of BrowseResult, one per continuation point.
|
|
480
|
+
*/
|
|
481
|
+
async browseNext(continuationPoints, releaseContinuationPoints) {
|
|
482
|
+
const request = new opcjsBase.BrowseNextRequest();
|
|
483
|
+
request.requestHeader = this.createRequestHeader();
|
|
484
|
+
request.releaseContinuationPoints = releaseContinuationPoints;
|
|
485
|
+
request.continuationPoints = continuationPoints;
|
|
486
|
+
this.logger.debug("Sending BrowseNextRequest...");
|
|
487
|
+
const response = await this.secureChannel.issueServiceRequest(request);
|
|
488
|
+
const serviceResult = response.responseHeader?.serviceResult;
|
|
489
|
+
if (serviceResult !== void 0 && serviceResult !== opcjsBase.StatusCode.Good) {
|
|
490
|
+
throw new Error(`BrowseNextRequest failed: ${opcjsBase.StatusCodeToString(serviceResult)}`);
|
|
491
|
+
}
|
|
492
|
+
return response.results ?? [];
|
|
493
|
+
}
|
|
494
|
+
constructor(authToken, secureChannel) {
|
|
495
|
+
super(authToken, secureChannel);
|
|
496
|
+
}
|
|
497
|
+
};
|
|
498
|
+
|
|
499
|
+
// src/browseNodeResult.ts
|
|
500
|
+
var BrowseNodeResult = class {
|
|
501
|
+
constructor(referenceTypeId, isForward, nodeId, browseName, displayName, nodeClass, typeDefinition) {
|
|
502
|
+
this.referenceTypeId = referenceTypeId;
|
|
503
|
+
this.isForward = isForward;
|
|
504
|
+
this.nodeId = nodeId;
|
|
505
|
+
this.browseName = browseName;
|
|
506
|
+
this.displayName = displayName;
|
|
507
|
+
this.nodeClass = nodeClass;
|
|
508
|
+
this.typeDefinition = typeDefinition;
|
|
637
509
|
}
|
|
638
510
|
};
|
|
639
511
|
|
|
@@ -649,6 +521,7 @@ var Client = class {
|
|
|
649
521
|
endpointUrl;
|
|
650
522
|
attributeService;
|
|
651
523
|
methodService;
|
|
524
|
+
browseService;
|
|
652
525
|
session;
|
|
653
526
|
subscriptionHandler;
|
|
654
527
|
logger;
|
|
@@ -708,6 +581,7 @@ var Client = class {
|
|
|
708
581
|
this.logger.debug("Initializing services...");
|
|
709
582
|
this.attributeService = new AttributeService(this.session.getAuthToken(), sc);
|
|
710
583
|
this.methodService = new MethodService(this.session.getAuthToken(), sc);
|
|
584
|
+
this.browseService = new BrowseService(this.session.getAuthToken(), sc);
|
|
711
585
|
this.subscriptionHandler = new SubscriptionHandler(
|
|
712
586
|
new SubscriptionService(this.session.getAuthToken(), sc),
|
|
713
587
|
new MonitoredItemService(this.session.getAuthToken(), sc)
|
|
@@ -718,7 +592,7 @@ var Client = class {
|
|
|
718
592
|
}
|
|
719
593
|
async read(ids) {
|
|
720
594
|
const result = await this.attributeService?.ReadValue(ids);
|
|
721
|
-
return result?.map((r) => new ReadValueResult(r.value, r.
|
|
595
|
+
return result?.map((r) => new ReadValueResult(r.value, r.statusCode)) || [];
|
|
722
596
|
}
|
|
723
597
|
/**
|
|
724
598
|
* Method for calling a single method on the server.
|
|
@@ -734,7 +608,61 @@ var Client = class {
|
|
|
734
608
|
request.inputArguments = inputArguments.map((arg) => opcjsBase.Variant.newFrom(arg));
|
|
735
609
|
const responses = await this.methodService.call([request]);
|
|
736
610
|
const response = responses[0];
|
|
737
|
-
return new CallMethodResult(response.value, response.
|
|
611
|
+
return new CallMethodResult(response.value, response.statusCode);
|
|
612
|
+
}
|
|
613
|
+
async browse(nodeId, recursive = false) {
|
|
614
|
+
const visited = /* @__PURE__ */ new Set();
|
|
615
|
+
return this.browseRecursive(nodeId, recursive, visited);
|
|
616
|
+
}
|
|
617
|
+
async browseRecursive(nodeId, recursive, visited) {
|
|
618
|
+
const nodeKey = `${nodeId.namespace}:${nodeId.identifier}`;
|
|
619
|
+
if (visited.has(nodeKey)) {
|
|
620
|
+
return [];
|
|
621
|
+
}
|
|
622
|
+
visited.add(nodeKey);
|
|
623
|
+
const description = new opcjsBase.BrowseDescription();
|
|
624
|
+
description.nodeId = nodeId;
|
|
625
|
+
description.browseDirection = opcjsBase.BrowseDirectionEnum.Forward;
|
|
626
|
+
description.referenceTypeId = opcjsBase.NodeId.newNumeric(0, 33);
|
|
627
|
+
description.includeSubtypes = true;
|
|
628
|
+
description.nodeClassMask = 0;
|
|
629
|
+
description.resultMask = opcjsBase.BrowseResultMaskEnum.All;
|
|
630
|
+
const browseResults = await this.browseService.browse([description]);
|
|
631
|
+
const browseResult = browseResults[0];
|
|
632
|
+
const allReferences = [...browseResult.references ?? []];
|
|
633
|
+
let continuationPoint = browseResult.continuationPoint;
|
|
634
|
+
while (continuationPoint && continuationPoint.byteLength > 0) {
|
|
635
|
+
const nextResults = await this.browseService.browseNext([continuationPoint], false);
|
|
636
|
+
const nextResult = nextResults[0];
|
|
637
|
+
allReferences.push(...nextResult.references ?? []);
|
|
638
|
+
continuationPoint = nextResult.continuationPoint;
|
|
639
|
+
}
|
|
640
|
+
const results = allReferences.map(
|
|
641
|
+
(ref) => new BrowseNodeResult(
|
|
642
|
+
ref.referenceTypeId,
|
|
643
|
+
ref.isForward,
|
|
644
|
+
ref.nodeId,
|
|
645
|
+
ref.browseName,
|
|
646
|
+
ref.displayName,
|
|
647
|
+
ref.nodeClass,
|
|
648
|
+
ref.typeDefinition
|
|
649
|
+
)
|
|
650
|
+
);
|
|
651
|
+
if (recursive) {
|
|
652
|
+
for (const ref of allReferences) {
|
|
653
|
+
const childNodeId = opcjsBase.NodeId.newNumeric(
|
|
654
|
+
ref.nodeId.namespace,
|
|
655
|
+
ref.nodeId.identifier
|
|
656
|
+
);
|
|
657
|
+
const childResults = await this.browseRecursive(
|
|
658
|
+
childNodeId,
|
|
659
|
+
true,
|
|
660
|
+
visited
|
|
661
|
+
);
|
|
662
|
+
results.push(...childResults);
|
|
663
|
+
}
|
|
664
|
+
}
|
|
665
|
+
return results;
|
|
738
666
|
}
|
|
739
667
|
async subscribe(ids, callback) {
|
|
740
668
|
this.subscriptionHandler?.subscribe(ids, callback);
|
|
@@ -830,6 +758,7 @@ var UserIdentity = class _UserIdentity {
|
|
|
830
758
|
}
|
|
831
759
|
};
|
|
832
760
|
|
|
761
|
+
exports.BrowseNodeResult = BrowseNodeResult;
|
|
833
762
|
exports.Client = Client;
|
|
834
763
|
exports.ConfigurationClient = ConfigurationClient;
|
|
835
764
|
exports.UserIdentity = UserIdentity;
|