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