opcjs-client 0.1.18-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 +125 -292
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +13 -115
- package/dist/index.d.ts +13 -115
- package/dist/index.js +126 -293
- 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,12 +442,18 @@ 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;
|
|
637
448
|
}
|
|
638
449
|
};
|
|
639
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
|
+
*/
|
|
640
457
|
async browse(nodesToBrowse) {
|
|
641
458
|
const view = new opcjsBase.ViewDescription();
|
|
642
459
|
view.viewId = opcjsBase.NodeId.newNumeric(0, 0);
|
|
@@ -647,15 +464,31 @@ var BrowseService = class extends ServiceBase {
|
|
|
647
464
|
request.view = view;
|
|
648
465
|
request.requestedMaxReferencesPerNode = 0;
|
|
649
466
|
request.nodesToBrowse = nodesToBrowse;
|
|
467
|
+
this.logger.debug("Sending BrowseRequest...");
|
|
650
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
|
+
}
|
|
651
473
|
return response.results ?? [];
|
|
652
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
|
+
*/
|
|
653
481
|
async browseNext(continuationPoints, releaseContinuationPoints) {
|
|
654
482
|
const request = new opcjsBase.BrowseNextRequest();
|
|
655
483
|
request.requestHeader = this.createRequestHeader();
|
|
656
484
|
request.releaseContinuationPoints = releaseContinuationPoints;
|
|
657
485
|
request.continuationPoints = continuationPoints;
|
|
486
|
+
this.logger.debug("Sending BrowseNextRequest...");
|
|
658
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
|
+
}
|
|
659
492
|
return response.results ?? [];
|
|
660
493
|
}
|
|
661
494
|
constructor(authToken, secureChannel) {
|
|
@@ -759,7 +592,7 @@ var Client = class {
|
|
|
759
592
|
}
|
|
760
593
|
async read(ids) {
|
|
761
594
|
const result = await this.attributeService?.ReadValue(ids);
|
|
762
|
-
return result?.map((r) => new ReadValueResult(r.value, r.
|
|
595
|
+
return result?.map((r) => new ReadValueResult(r.value, r.statusCode)) || [];
|
|
763
596
|
}
|
|
764
597
|
/**
|
|
765
598
|
* Method for calling a single method on the server.
|
|
@@ -775,7 +608,7 @@ var Client = class {
|
|
|
775
608
|
request.inputArguments = inputArguments.map((arg) => opcjsBase.Variant.newFrom(arg));
|
|
776
609
|
const responses = await this.methodService.call([request]);
|
|
777
610
|
const response = responses[0];
|
|
778
|
-
return new CallMethodResult(response.value, response.
|
|
611
|
+
return new CallMethodResult(response.value, response.statusCode);
|
|
779
612
|
}
|
|
780
613
|
async browse(nodeId, recursive = false) {
|
|
781
614
|
const visited = /* @__PURE__ */ new Set();
|