opcjs-client 0.1.18-alpha → 0.1.20-alpha
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +125 -292
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +13 -115
- package/dist/index.d.ts +13 -115
- package/dist/index.js +126 -293
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.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,
|
|
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,12 +440,18 @@ 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;
|
|
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.
|
|
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.
|
|
609
|
+
return new CallMethodResult(response.value, response.statusCode);
|
|
777
610
|
}
|
|
778
611
|
async browse(nodeId, recursive = false) {
|
|
779
612
|
const visited = /* @__PURE__ */ new Set();
|