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.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, Configuration, LoggerFactory, Encoder, BinaryWriter, registerEncoders, Decoder, BinaryReader, registerTypeDecoders, registerBinaryDecoders, UserTokenTypeEnum, AnonymousIdentityToken, UserNameIdentityToken, IssuedIdentityToken,
|
|
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
|
-
|
|
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 =
|
|
445
|
-
request.timestampsToReturn =
|
|
209
|
+
request.maxAge = maxAge;
|
|
210
|
+
request.timestampsToReturn = timestampsToReturn;
|
|
446
211
|
request.nodesToRead = readValueIds;
|
|
447
|
-
|
|
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
|
-
|
|
452
|
-
|
|
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,
|
|
234
|
+
constructor(value, statusCode) {
|
|
467
235
|
this.value = value;
|
|
468
|
-
this.
|
|
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
|
-
|
|
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
|
-
|
|
332
|
+
request.priority = options?.priority ?? 1;
|
|
333
|
+
this.logger.debug("Sending CreateSubscriptionRequest...");
|
|
559
334
|
const response = await this.secureChannel.issueServiceRequest(request);
|
|
560
|
-
|
|
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
|
-
|
|
352
|
+
this.logger.debug("Sending PublishRequest...");
|
|
569
353
|
const response = await this.secureChannel.issueServiceRequest(request);
|
|
570
|
-
|
|
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
|
-
|
|
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 =
|
|
383
|
+
monitoringParameters.samplingInterval = samplingInterval;
|
|
588
384
|
monitoringParameters.filter = ExtensionObject.newEmpty();
|
|
589
|
-
monitoringParameters.queueSize =
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
432
|
+
statusCode: result.statusCode ?? StatusCode.Good,
|
|
622
433
|
value: result.outputArguments.map((arg) => arg.value)
|
|
623
434
|
}));
|
|
624
435
|
}
|
|
@@ -629,9 +440,70 @@ var MethodService = class extends ServiceBase {
|
|
|
629
440
|
|
|
630
441
|
// src/callMethodResult.ts
|
|
631
442
|
var CallMethodResult = class {
|
|
632
|
-
constructor(values,
|
|
443
|
+
constructor(values, statusCode) {
|
|
633
444
|
this.values = values;
|
|
634
|
-
this.
|
|
445
|
+
this.statusCode = statusCode;
|
|
446
|
+
}
|
|
447
|
+
};
|
|
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
|
+
*/
|
|
455
|
+
async browse(nodesToBrowse) {
|
|
456
|
+
const view = new ViewDescription();
|
|
457
|
+
view.viewId = NodeId.newNumeric(0, 0);
|
|
458
|
+
view.timestamp = /* @__PURE__ */ new Date(-116444736e5);
|
|
459
|
+
view.viewVersion = 0;
|
|
460
|
+
const request = new BrowseRequest();
|
|
461
|
+
request.requestHeader = this.createRequestHeader();
|
|
462
|
+
request.view = view;
|
|
463
|
+
request.requestedMaxReferencesPerNode = 0;
|
|
464
|
+
request.nodesToBrowse = nodesToBrowse;
|
|
465
|
+
this.logger.debug("Sending BrowseRequest...");
|
|
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
|
+
}
|
|
471
|
+
return response.results ?? [];
|
|
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
|
+
*/
|
|
479
|
+
async browseNext(continuationPoints, releaseContinuationPoints) {
|
|
480
|
+
const request = new BrowseNextRequest();
|
|
481
|
+
request.requestHeader = this.createRequestHeader();
|
|
482
|
+
request.releaseContinuationPoints = releaseContinuationPoints;
|
|
483
|
+
request.continuationPoints = continuationPoints;
|
|
484
|
+
this.logger.debug("Sending BrowseNextRequest...");
|
|
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
|
+
}
|
|
490
|
+
return response.results ?? [];
|
|
491
|
+
}
|
|
492
|
+
constructor(authToken, secureChannel) {
|
|
493
|
+
super(authToken, secureChannel);
|
|
494
|
+
}
|
|
495
|
+
};
|
|
496
|
+
|
|
497
|
+
// src/browseNodeResult.ts
|
|
498
|
+
var BrowseNodeResult = class {
|
|
499
|
+
constructor(referenceTypeId, isForward, nodeId, browseName, displayName, nodeClass, typeDefinition) {
|
|
500
|
+
this.referenceTypeId = referenceTypeId;
|
|
501
|
+
this.isForward = isForward;
|
|
502
|
+
this.nodeId = nodeId;
|
|
503
|
+
this.browseName = browseName;
|
|
504
|
+
this.displayName = displayName;
|
|
505
|
+
this.nodeClass = nodeClass;
|
|
506
|
+
this.typeDefinition = typeDefinition;
|
|
635
507
|
}
|
|
636
508
|
};
|
|
637
509
|
|
|
@@ -647,6 +519,7 @@ var Client = class {
|
|
|
647
519
|
endpointUrl;
|
|
648
520
|
attributeService;
|
|
649
521
|
methodService;
|
|
522
|
+
browseService;
|
|
650
523
|
session;
|
|
651
524
|
subscriptionHandler;
|
|
652
525
|
logger;
|
|
@@ -706,6 +579,7 @@ var Client = class {
|
|
|
706
579
|
this.logger.debug("Initializing services...");
|
|
707
580
|
this.attributeService = new AttributeService(this.session.getAuthToken(), sc);
|
|
708
581
|
this.methodService = new MethodService(this.session.getAuthToken(), sc);
|
|
582
|
+
this.browseService = new BrowseService(this.session.getAuthToken(), sc);
|
|
709
583
|
this.subscriptionHandler = new SubscriptionHandler(
|
|
710
584
|
new SubscriptionService(this.session.getAuthToken(), sc),
|
|
711
585
|
new MonitoredItemService(this.session.getAuthToken(), sc)
|
|
@@ -716,7 +590,7 @@ var Client = class {
|
|
|
716
590
|
}
|
|
717
591
|
async read(ids) {
|
|
718
592
|
const result = await this.attributeService?.ReadValue(ids);
|
|
719
|
-
return result?.map((r) => new ReadValueResult(r.value, r.
|
|
593
|
+
return result?.map((r) => new ReadValueResult(r.value, r.statusCode)) || [];
|
|
720
594
|
}
|
|
721
595
|
/**
|
|
722
596
|
* Method for calling a single method on the server.
|
|
@@ -732,7 +606,61 @@ var Client = class {
|
|
|
732
606
|
request.inputArguments = inputArguments.map((arg) => Variant.newFrom(arg));
|
|
733
607
|
const responses = await this.methodService.call([request]);
|
|
734
608
|
const response = responses[0];
|
|
735
|
-
return new CallMethodResult(response.value, response.
|
|
609
|
+
return new CallMethodResult(response.value, response.statusCode);
|
|
610
|
+
}
|
|
611
|
+
async browse(nodeId, recursive = false) {
|
|
612
|
+
const visited = /* @__PURE__ */ new Set();
|
|
613
|
+
return this.browseRecursive(nodeId, recursive, visited);
|
|
614
|
+
}
|
|
615
|
+
async browseRecursive(nodeId, recursive, visited) {
|
|
616
|
+
const nodeKey = `${nodeId.namespace}:${nodeId.identifier}`;
|
|
617
|
+
if (visited.has(nodeKey)) {
|
|
618
|
+
return [];
|
|
619
|
+
}
|
|
620
|
+
visited.add(nodeKey);
|
|
621
|
+
const description = new BrowseDescription();
|
|
622
|
+
description.nodeId = nodeId;
|
|
623
|
+
description.browseDirection = BrowseDirectionEnum.Forward;
|
|
624
|
+
description.referenceTypeId = NodeId.newNumeric(0, 33);
|
|
625
|
+
description.includeSubtypes = true;
|
|
626
|
+
description.nodeClassMask = 0;
|
|
627
|
+
description.resultMask = BrowseResultMaskEnum.All;
|
|
628
|
+
const browseResults = await this.browseService.browse([description]);
|
|
629
|
+
const browseResult = browseResults[0];
|
|
630
|
+
const allReferences = [...browseResult.references ?? []];
|
|
631
|
+
let continuationPoint = browseResult.continuationPoint;
|
|
632
|
+
while (continuationPoint && continuationPoint.byteLength > 0) {
|
|
633
|
+
const nextResults = await this.browseService.browseNext([continuationPoint], false);
|
|
634
|
+
const nextResult = nextResults[0];
|
|
635
|
+
allReferences.push(...nextResult.references ?? []);
|
|
636
|
+
continuationPoint = nextResult.continuationPoint;
|
|
637
|
+
}
|
|
638
|
+
const results = allReferences.map(
|
|
639
|
+
(ref) => new BrowseNodeResult(
|
|
640
|
+
ref.referenceTypeId,
|
|
641
|
+
ref.isForward,
|
|
642
|
+
ref.nodeId,
|
|
643
|
+
ref.browseName,
|
|
644
|
+
ref.displayName,
|
|
645
|
+
ref.nodeClass,
|
|
646
|
+
ref.typeDefinition
|
|
647
|
+
)
|
|
648
|
+
);
|
|
649
|
+
if (recursive) {
|
|
650
|
+
for (const ref of allReferences) {
|
|
651
|
+
const childNodeId = NodeId.newNumeric(
|
|
652
|
+
ref.nodeId.namespace,
|
|
653
|
+
ref.nodeId.identifier
|
|
654
|
+
);
|
|
655
|
+
const childResults = await this.browseRecursive(
|
|
656
|
+
childNodeId,
|
|
657
|
+
true,
|
|
658
|
+
visited
|
|
659
|
+
);
|
|
660
|
+
results.push(...childResults);
|
|
661
|
+
}
|
|
662
|
+
}
|
|
663
|
+
return results;
|
|
736
664
|
}
|
|
737
665
|
async subscribe(ids, callback) {
|
|
738
666
|
this.subscriptionHandler?.subscribe(ids, callback);
|
|
@@ -828,6 +756,6 @@ var UserIdentity = class _UserIdentity {
|
|
|
828
756
|
}
|
|
829
757
|
};
|
|
830
758
|
|
|
831
|
-
export { Client, ConfigurationClient, UserIdentity };
|
|
759
|
+
export { BrowseNodeResult, Client, ConfigurationClient, UserIdentity };
|
|
832
760
|
//# sourceMappingURL=index.js.map
|
|
833
761
|
//# sourceMappingURL=index.js.map
|