opcjs-client 0.1.16-alpha → 0.1.18-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 CHANGED
@@ -636,6 +636,45 @@ var CallMethodResult = class {
636
636
  this.status = status;
637
637
  }
638
638
  };
639
+ var BrowseService = class extends ServiceBase {
640
+ async browse(nodesToBrowse) {
641
+ const view = new opcjsBase.ViewDescription();
642
+ view.viewId = opcjsBase.NodeId.newNumeric(0, 0);
643
+ view.timestamp = /* @__PURE__ */ new Date(-116444736e5);
644
+ view.viewVersion = 0;
645
+ const request = new opcjsBase.BrowseRequest();
646
+ request.requestHeader = this.createRequestHeader();
647
+ request.view = view;
648
+ request.requestedMaxReferencesPerNode = 0;
649
+ request.nodesToBrowse = nodesToBrowse;
650
+ const response = await this.secureChannel.issueServiceRequest(request);
651
+ return response.results ?? [];
652
+ }
653
+ async browseNext(continuationPoints, releaseContinuationPoints) {
654
+ const request = new opcjsBase.BrowseNextRequest();
655
+ request.requestHeader = this.createRequestHeader();
656
+ request.releaseContinuationPoints = releaseContinuationPoints;
657
+ request.continuationPoints = continuationPoints;
658
+ const response = await this.secureChannel.issueServiceRequest(request);
659
+ return response.results ?? [];
660
+ }
661
+ constructor(authToken, secureChannel) {
662
+ super(authToken, secureChannel);
663
+ }
664
+ };
665
+
666
+ // src/browseNodeResult.ts
667
+ var BrowseNodeResult = class {
668
+ constructor(referenceTypeId, isForward, nodeId, browseName, displayName, nodeClass, typeDefinition) {
669
+ this.referenceTypeId = referenceTypeId;
670
+ this.isForward = isForward;
671
+ this.nodeId = nodeId;
672
+ this.browseName = browseName;
673
+ this.displayName = displayName;
674
+ this.nodeClass = nodeClass;
675
+ this.typeDefinition = typeDefinition;
676
+ }
677
+ };
639
678
 
640
679
  // src/client.ts
641
680
  var Client = class {
@@ -649,6 +688,7 @@ var Client = class {
649
688
  endpointUrl;
650
689
  attributeService;
651
690
  methodService;
691
+ browseService;
652
692
  session;
653
693
  subscriptionHandler;
654
694
  logger;
@@ -708,6 +748,7 @@ var Client = class {
708
748
  this.logger.debug("Initializing services...");
709
749
  this.attributeService = new AttributeService(this.session.getAuthToken(), sc);
710
750
  this.methodService = new MethodService(this.session.getAuthToken(), sc);
751
+ this.browseService = new BrowseService(this.session.getAuthToken(), sc);
711
752
  this.subscriptionHandler = new SubscriptionHandler(
712
753
  new SubscriptionService(this.session.getAuthToken(), sc),
713
754
  new MonitoredItemService(this.session.getAuthToken(), sc)
@@ -736,6 +777,60 @@ var Client = class {
736
777
  const response = responses[0];
737
778
  return new CallMethodResult(response.value, response.status);
738
779
  }
780
+ async browse(nodeId, recursive = false) {
781
+ const visited = /* @__PURE__ */ new Set();
782
+ return this.browseRecursive(nodeId, recursive, visited);
783
+ }
784
+ async browseRecursive(nodeId, recursive, visited) {
785
+ const nodeKey = `${nodeId.namespace}:${nodeId.identifier}`;
786
+ if (visited.has(nodeKey)) {
787
+ return [];
788
+ }
789
+ visited.add(nodeKey);
790
+ const description = new opcjsBase.BrowseDescription();
791
+ description.nodeId = nodeId;
792
+ description.browseDirection = opcjsBase.BrowseDirectionEnum.Forward;
793
+ description.referenceTypeId = opcjsBase.NodeId.newNumeric(0, 33);
794
+ description.includeSubtypes = true;
795
+ description.nodeClassMask = 0;
796
+ description.resultMask = opcjsBase.BrowseResultMaskEnum.All;
797
+ const browseResults = await this.browseService.browse([description]);
798
+ const browseResult = browseResults[0];
799
+ const allReferences = [...browseResult.references ?? []];
800
+ let continuationPoint = browseResult.continuationPoint;
801
+ while (continuationPoint && continuationPoint.byteLength > 0) {
802
+ const nextResults = await this.browseService.browseNext([continuationPoint], false);
803
+ const nextResult = nextResults[0];
804
+ allReferences.push(...nextResult.references ?? []);
805
+ continuationPoint = nextResult.continuationPoint;
806
+ }
807
+ const results = allReferences.map(
808
+ (ref) => new BrowseNodeResult(
809
+ ref.referenceTypeId,
810
+ ref.isForward,
811
+ ref.nodeId,
812
+ ref.browseName,
813
+ ref.displayName,
814
+ ref.nodeClass,
815
+ ref.typeDefinition
816
+ )
817
+ );
818
+ if (recursive) {
819
+ for (const ref of allReferences) {
820
+ const childNodeId = opcjsBase.NodeId.newNumeric(
821
+ ref.nodeId.namespace,
822
+ ref.nodeId.identifier
823
+ );
824
+ const childResults = await this.browseRecursive(
825
+ childNodeId,
826
+ true,
827
+ visited
828
+ );
829
+ results.push(...childResults);
830
+ }
831
+ }
832
+ return results;
833
+ }
739
834
  async subscribe(ids, callback) {
740
835
  this.subscriptionHandler?.subscribe(ids, callback);
741
836
  }
@@ -830,6 +925,7 @@ var UserIdentity = class _UserIdentity {
830
925
  }
831
926
  };
832
927
 
928
+ exports.BrowseNodeResult = BrowseNodeResult;
833
929
  exports.Client = Client;
834
930
  exports.ConfigurationClient = ConfigurationClient;
835
931
  exports.UserIdentity = UserIdentity;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/services/serviceBase.ts","../src/services/sessionService.ts","../src/issuerConfiguration.ts","../src/sessions/session.ts","../src/sessions/sessionHandler.ts","../src/services/attributeServiceAttributes.ts","../../base/src/types/statusCode.ts","../src/services/attributeService.ts","../src/readValueResult.ts","../src/subscriptionHandlerEntry.ts","../src/subscriptionHandler.ts","../src/services/subscriptionService.ts","../src/services/monitoredItemService.ts","../src/services/methodService.ts","../src/callMethodResult.ts","../src/client.ts","../src/configurationClient.ts","../src/userIdentity.ts"],"names":["RequestHeader","ExtensionObject","getLogger","ApplicationDescription","LocalizedText","ApplicationTypeEnum","CreateSessionRequest","CreateSessionResponse","SignatureData","ActivateSessionRequest","UserTokenTypeEnum","NodeId","StatusCode","ReadValueId","QualifiedName","ReadRequest","TimestampsToReturnEnum","SubscriptionAcknowledgement","CreateSubscriptionRequest","PublishRequest","MonitoringParameters","MonitoredItemCreateRequest","MonitoringModeEnum","CreateMonitoredItemsRequest","CallRequest","initLoggerProvider","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","AnonymousIdentityToken","UserNameIdentityToken","IssuedIdentityToken"],"mappings":"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","file":"index.cjs","sourcesContent":["import { ExtensionObject, ISecureChannel, NodeId, RequestHeader } from \"opcjs-base\";\n\nexport abstract class ServiceBase{\n\n\n protected createRequestHeader(): RequestHeader {\n const requestHeader = new RequestHeader();\n requestHeader.authenticationToken = this.authToken;\n requestHeader.timestamp = new Date();\n requestHeader.requestHandle = 0; // will be set by secure channel\n requestHeader.returnDiagnostics = 0;\n requestHeader.auditEntryId = '';\n requestHeader.timeoutHint = 60000;\n requestHeader.additionalHeader = ExtensionObject.newEmpty();\n\n return requestHeader;\n }\n \n constructor(private authToken: NodeId, protected secureChannel: ISecureChannel){}\n}","import {\n ActivateSessionRequest, ApplicationDescription, ApplicationTypeEnum,\n Configuration, CreateSessionRequest, CreateSessionResponse, EndpointDescription, ExtensionObject,\n getLogger,\n ISecureChannel, LocalizedText, NodeId, SignatureData, SignedSoftwareCertificate, UserIdentityToken\n} from \"opcjs-base\";\nimport { ServiceBase } from \"./serviceBase\";\n\nexport class SessionService extends ServiceBase {\n private logger = getLogger(\"services.SessionService\");\n async createSession(): Promise<{ sessionId: number, authToken: NodeId, endpoint: EndpointDescription }> {\n this.logger.debug(\"Creating session...\");\n\n const clientDescription = new ApplicationDescription();\n clientDescription.applicationUri = this.configuration.applicationUri;\n clientDescription.productUri = this.configuration.productUri;\n clientDescription.applicationName = new LocalizedText(undefined, this.configuration.productName);\n clientDescription.applicationType = ApplicationTypeEnum.Client;\n clientDescription.gatewayServerUri = '';\n clientDescription.discoveryProfileUri = '';\n clientDescription.discoveryUrls = new Array<string>();\n\n const request = new CreateSessionRequest();\n request.requestHeader = this.createRequestHeader();\n request.clientDescription = clientDescription;\n request.serverUri = '';\n request.endpointUrl = this.secureChannel.getEndpointUrl();\n request.sessionName = '';\n request.clientNonce = null;\n request.clientCertificate = null;\n request.requestedSessionTimeout = 60000;\n request.maxResponseMessageSize = 0;\n\n\n // todo: verify endpoints\n // todo: check application uri in server certificate\n\n this.logger.debug(\"Sending CreateSessionRequest...\");\n const response = await this.secureChannel.issueServiceRequest(request);\n if (!response || !(response instanceof CreateSessionResponse)) {\n throw new Error(\"Invalid response type for CreateSessionRequest\");\n }\n\n const castedResponse = response as CreateSessionResponse;\n if (!castedResponse || !castedResponse.sessionId || !castedResponse.authenticationToken) {\n throw new Error(\"CreateSessionResponse missing SessionId or AuthenticationToken\");\n }\n\n const endpoint = 'opc.' + this.secureChannel.getEndpointUrl();\n const endpointUrl = new URL(endpoint);\n const securityMode = this.secureChannel.getSecurityMode();\n const securityPolicyUri = this.secureChannel.getSecurityPolicy(); // todo: does not work with localhost. Not sure why.\n\n const serverEndpoint = castedResponse\n ?.serverEndpoints\n ?.find(currentEndpoint => {\n const currentEndpointUrl = new URL(currentEndpoint.endpointUrl as string);\n\n return currentEndpointUrl.protocol === endpointUrl.protocol\n && currentEndpointUrl.pathname === endpointUrl.pathname\n && currentEndpointUrl.port === endpointUrl.port\n && currentEndpoint.securityMode === securityMode\n && currentEndpoint.securityPolicyUri === securityPolicyUri});\n\n if (!serverEndpoint) {\n throw new Error(`Server endpoint ${endpoint} not found in CreateSessionResponse`);\n }\n\n this.logger.debug(\"Session created with id:\", castedResponse.sessionId.identifier);\n return {\n sessionId: castedResponse.sessionId.identifier as number,\n authToken: castedResponse.authenticationToken,\n endpoint: serverEndpoint\n };\n }\n\n async activateSession(identityToken: UserIdentityToken): Promise<void> {\n const signatureData = new SignatureData();\n signatureData.algorithm = this.secureChannel.getSecurityPolicy();\n signatureData.signature = new Uint8Array(0);\n\n const request = new ActivateSessionRequest();\n request.requestHeader = this.createRequestHeader();\n request.clientSignature = signatureData;\n request.clientSoftwareCertificates = new Array<SignedSoftwareCertificate>();\n request.localeIds = ['en-US'];\n request.userIdentityToken = ExtensionObject.newBinary(identityToken);\n request.userTokenSignature = signatureData;\n\n this.logger.debug(\"Sending ActivateSessionRequest...\");\n await this.secureChannel.issueServiceRequest(request);\n this.logger.debug(\"Session activated.\");\n }\n\n recreate(authToken: NodeId): SessionService {\n return new SessionService(authToken, this.secureChannel, this.configuration)\n }\n\n constructor(authToken: NodeId, secureChannel: ISecureChannel, private configuration: Configuration) {\n super(authToken, secureChannel)\n }\n}","interface IssuerEndpointUrl {\n 'ua.resourceId': string;\n 'ua.authorityUrl': string;\n 'ua.authorityProfileUri': string;\n 'ua.tokenEndpoint': string;\n 'ua.authorizationEndpoint': string;\n 'ua.requestTypes': string[];\n 'ua.scopes': string[];\n}\n\nexport class IssuerConfiguration{\n public static newFrom(issuerEndpointUrl: IssuerEndpointUrl): IssuerConfiguration {\n return new IssuerConfiguration(\n issuerEndpointUrl['ua.resourceId'],\n issuerEndpointUrl['ua.authorityUrl'],\n issuerEndpointUrl['ua.authorityProfileUri'],\n issuerEndpointUrl['ua.tokenEndpoint'],\n issuerEndpointUrl['ua.authorizationEndpoint'],\n issuerEndpointUrl['ua.requestTypes'],\n issuerEndpointUrl['ua.scopes']\n );\n }\n \n constructor(\n public resourceId: string,\n public authorityUrl: string,\n public authorityProfileUri: string,\n public tokenEndpoint: string,\n public authorizationEndpoint: string,\n public requestTypes: string[],\n public scopes: string[]\n ){\n \n }\n}","import { EndpointDescription, IssuedIdentityToken, NodeId, UserTokenTypeEnum } from \"opcjs-base\";\nimport { IssuerConfiguration } from \"../issuerConfiguration\";\nimport { SessionService } from \"../services/sessionService\";\nimport { UserIdentity } from \"../userIdentity\";\n\nexport class Session {\n async activateSession(identity: UserIdentity): Promise<void> {\n const token = identity.getUserIdentityToken();\n const tokenType = identity.getTokenType();\n const tokenPolicy = this.endpoint.userIdentityTokens?.find(t => t.tokenType === tokenType);\n if (!tokenPolicy) {\n throw new Error(`UserIdentityToken of type ${tokenType} not supported by server`);\n }\n token.policyId = tokenPolicy.policyId;\n\n if (tokenType === UserTokenTypeEnum.IssuedToken) {\n if (!tokenPolicy.issuerEndpointUrl) {\n throw new Error(\"IssuerEndpointUrl not defined for IssuedToken\");\n }\n const issuerEndpointUrl = JSON.parse(tokenPolicy.issuerEndpointUrl)\n const issuerConfig = IssuerConfiguration.newFrom(issuerEndpointUrl);\n\n const issuerLoginCallback = identity.getIssuerLoginCallback();\n const tokenData = await issuerLoginCallback(issuerConfig);\n\n const issuerToken = token as IssuedIdentityToken;\n issuerToken.tokenData = new TextEncoder().encode(tokenData.json);\n }\n\n await this.sessionServices.activateSession(token);\n }\n\n getAuthToken(): NodeId {\n return this.authToken;\n }\n\n constructor(\n public sessionId: number,\n private authToken: NodeId,\n private endpoint: EndpointDescription,\n private sessionServices: SessionService) { }\n}","import { ConfigurationClient } from \"../configurationClient\";\nimport { ISecureChannel, NodeId } from \"opcjs-base\";\nimport { SessionService } from \"../services/sessionService\";\nimport { UserIdentity } from \"../userIdentity\";\nimport { Session } from \"./session\";\n\nexport class SessionHandler {\n private sessionServices: SessionService;\n async createNewSession(identity:UserIdentity) : Promise<Session>{\n const ret = await this.sessionServices.createSession();\n this.sessionServices = this.sessionServices.recreate(ret.authToken)\n\n const session = new Session(ret.sessionId, ret.authToken, ret.endpoint, this.sessionServices);\n await session.activateSession(identity);\n return session;\n }\n\n constructor(secureChannel:ISecureChannel, configuration: ConfigurationClient) {\n this.sessionServices = new SessionService(NodeId.newTwoByte(0), secureChannel, configuration);\n }\n}","// according to https://reference.opcfoundation.org/Core/Part6/v105/docs/A.1\n// see also: https://reference.opcfoundation.org/Core/Part4/v105/docs/7.24.1#Table154\n\nexport const AttrIdNodeId = 1\nexport const AttrIdNodeClass = 2\nexport const AttrIdBrowseName = 3\nexport const AttrIdDisplayName = 4\nexport const AttrIdDescription = 5\nexport const AttrIdWriteMask = 6\nexport const AttrIdUserWriteMask = 7\nexport const AttrIdIsAbstract = 8\nexport const AttrIdSymmetric = 9\nexport const AttrIdInverseName = 10\nexport const AttrIdContainsNoLoops = 11\nexport const AttrIdEventNotifier = 12\nexport const AttrIdValue = 13\nexport const AttrIdDataType = 14\nexport const AttrIdValueRank = 15\nexport const AttrIdArrayDimensions = 16\nexport const AttrIdAccessLevel = 17\nexport const AttrIdUserAccessLevel = 18\nexport const AttrIdMinimumSamplingInterval = 19\nexport const AttrIdHistorizing = 20\nexport const AttrIdExecutable = 21\nexport const AttrIdUserExecutable = 22\nexport const AttrIdDataTypeDefinition = 23\nexport const AttrIdRolePermissions = 24\nexport const AttrIdUserRolePermissions = 25\nexport const AttrIdAccessRestrictions = 26\nexport const AttrIdAccessLevelEx = 27\n","/**\n * OPC UA StatusCode Type (i=19)\n * \n * StatusCode is a 32-bit unsigned integer that indicates the quality of a result.\n * The format is: [Severity:2][SubCode:14][Code:16]\n * \n * @see OPC UA Part 4, Section 7.34\n * @see OPC UA Part 6, Section 5.1.1\n */\n\nimport { BuiltInType } from \"./builtinType\";\n\nexport function StatusCodeToString(statusCode?: number): string {\n if (statusCode === undefined) {\n return 'Unknown';\n }\n const name = (Object.entries(StatusCode) as [string, number][])\n .find(([, v]) => v === statusCode)?.[0];\n return name ?? `0x${statusCode.toString(16).toUpperCase().padStart(8, '0')}`;\n}\n\nexport type UaStatusCode = {value: StatusCode; readonly type: BuiltInType.StatusCode };\nexport const uaStatusCode = (value: StatusCode): UaStatusCode => ({ value, type: BuiltInType.StatusCode });\n\nexport enum StatusCode {\n Good = 0x0 as number,\n Uncertain = 0x40000000 as number,\n Bad = 0x80000000 as number,\n BadUnexpectedError = 0x80010000 as number,\n BadInternalError = 0x80020000 as number,\n BadOutOfMemory = 0x80030000 as number,\n BadResourceUnavailable = 0x80040000 as number,\n BadCommunicationError = 0x80050000 as number,\n BadEncodingError = 0x80060000 as number,\n BadDecodingError = 0x80070000 as number,\n BadEncodingLimitsExceeded = 0x80080000 as number,\n BadRequestTooLarge = 0x80b80000 as number,\n BadResponseTooLarge = 0x80b90000 as number,\n BadUnknownResponse = 0x80090000 as number,\n BadTimeout = 0x800a0000 as number,\n BadServiceUnsupported = 0x800b0000 as number,\n BadShutdown = 0x800c0000 as number,\n BadServerNotConnected = 0x800d0000 as number,\n BadServerHalted = 0x800e0000 as number,\n BadNothingToDo = 0x800f0000 as number,\n BadTooManyOperations = 0x80100000 as number,\n BadTooManyMonitoredItems = 0x80db0000 as number,\n BadDataTypeIdUnknown = 0x80110000 as number,\n BadCertificateInvalid = 0x80120000 as number,\n BadSecurityChecksFailed = 0x80130000 as number,\n BadCertificatePolicyCheckFailed = 0x81140000 as number,\n BadCertificateTimeInvalid = 0x80140000 as number,\n BadCertificateIssuerTimeInvalid = 0x80150000 as number,\n BadCertificateHostNameInvalid = 0x80160000 as number,\n BadCertificateUriInvalid = 0x80170000 as number,\n BadCertificateUseNotAllowed = 0x80180000 as number,\n BadCertificateIssuerUseNotAllowed = 0x80190000 as number,\n BadCertificateUntrusted = 0x801a0000 as number,\n BadCertificateRevocationUnknown = 0x801b0000 as number,\n BadCertificateIssuerRevocationUnknown = 0x801c0000 as number,\n BadCertificateRevoked = 0x801d0000 as number,\n BadCertificateIssuerRevoked = 0x801e0000 as number,\n BadCertificateChainIncomplete = 0x810d0000 as number,\n BadUserAccessDenied = 0x801f0000 as number,\n BadIdentityTokenInvalid = 0x80200000 as number,\n BadIdentityTokenRejected = 0x80210000 as number,\n BadSecureChannelIdInvalid = 0x80220000 as number,\n BadInvalidTimestamp = 0x80230000 as number,\n BadNonceInvalid = 0x80240000 as number,\n BadSessionIdInvalid = 0x80250000 as number,\n BadSessionClosed = 0x80260000 as number,\n BadSessionNotActivated = 0x80270000 as number,\n BadSubscriptionIdInvalid = 0x80280000 as number,\n BadRequestHeaderInvalid = 0x802a0000 as number,\n BadTimestampsToReturnInvalid = 0x802b0000 as number,\n BadRequestCancelledByClient = 0x802c0000 as number,\n BadTooManyArguments = 0x80e50000 as number,\n BadLicenseExpired = 0x810e0000 as number,\n BadLicenseLimitsExceeded = 0x810f0000 as number,\n BadLicenseNotAvailable = 0x81100000 as number,\n GoodSubscriptionTransferred = 0x002d0000 as number,\n GoodCompletesAsynchronously = 0x002e0000 as number,\n GoodOverload = 0x002f0000 as number,\n GoodClamped = 0x00300000 as number,\n BadNoCommunication = 0x80310000 as number,\n BadWaitingForInitialData = 0x80320000 as number,\n BadNodeIdInvalid = 0x80330000 as number,\n BadNodeIdUnknown = 0x80340000 as number,\n BadAttributeIdInvalid = 0x80350000 as number,\n BadIndexRangeInvalid = 0x80360000 as number,\n BadIndexRangeNoData = 0x80370000 as number,\n BadDataEncodingInvalid = 0x80380000 as number,\n BadDataEncodingUnsupported = 0x80390000 as number,\n BadNotReadable = 0x803a0000 as number,\n BadNotWritable = 0x803b0000 as number,\n BadOutOfRange = 0x803c0000 as number,\n BadNotSupported = 0x803d0000 as number,\n BadNotFound = 0x803e0000 as number,\n BadObjectDeleted = 0x803f0000 as number,\n BadNotImplemented = 0x80400000 as number,\n BadMonitoringModeInvalid = 0x80410000 as number,\n BadMonitoredItemIdInvalid = 0x80420000 as number,\n BadMonitoredItemFilterInvalid = 0x80430000 as number,\n BadMonitoredItemFilterUnsupported = 0x80440000 as number,\n BadFilterNotAllowed = 0x80450000 as number,\n BadStructureMissing = 0x80460000 as number,\n BadEventFilterInvalid = 0x80470000 as number,\n BadContentFilterInvalid = 0x80480000 as number,\n BadFilterOperatorInvalid = 0x80c10000 as number,\n BadFilterOperatorUnsupported = 0x80c20000 as number,\n BadFilterOperandCountMismatch = 0x80c30000 as number,\n BadFilterOperandInvalid = 0x80490000 as number,\n BadFilterElementInvalid = 0x80c40000 as number,\n BadFilterLiteralInvalid = 0x80c50000 as number,\n BadContinuationPointInvalid = 0x804a0000 as number,\n BadNoContinuationPoints = 0x804b0000 as number,\n BadReferenceTypeIdInvalid = 0x804c0000 as number,\n BadBrowseDirectionInvalid = 0x804d0000 as number,\n BadNodeNotInView = 0x804e0000 as number,\n BadNumericOverflow = 0x81120000 as number,\n BadServerUriInvalid = 0x804f0000 as number,\n BadServerNameMissing = 0x80500000 as number,\n BadDiscoveryUrlMissing = 0x80510000 as number,\n BadSempahoreFileMissing = 0x80520000 as number,\n BadRequestTypeInvalid = 0x80530000 as number,\n BadSecurityModeRejected = 0x80540000 as number,\n BadSecurityPolicyRejected = 0x80550000 as number,\n BadTooManySessions = 0x80560000 as number,\n BadUserSignatureInvalid = 0x80570000 as number,\n BadApplicationSignatureInvalid = 0x80580000 as number,\n BadNoValidCertificates = 0x80590000 as number,\n BadIdentityChangeNotSupported = 0x80c60000 as number,\n BadRequestCancelledByRequest = 0x805a0000 as number,\n BadParentNodeIdInvalid = 0x805b0000 as number,\n BadReferenceNotAllowed = 0x805c0000 as number,\n BadNodeIdRejected = 0x805d0000 as number,\n BadNodeIdExists = 0x805e0000 as number,\n BadNodeClassInvalid = 0x805f0000 as number,\n BadBrowseNameInvalid = 0x80600000 as number,\n BadBrowseNameDuplicated = 0x80610000 as number,\n BadNodeAttributesInvalid = 0x80620000 as number,\n BadTypeDefinitionInvalid = 0x80630000 as number,\n BadSourceNodeIdInvalid = 0x80640000 as number,\n BadTargetNodeIdInvalid = 0x80650000 as number,\n BadDuplicateReferenceNotAllowed = 0x80660000 as number,\n BadInvalidSelfReference = 0x80670000 as number,\n BadReferenceLocalOnly = 0x80680000 as number,\n BadNoDeleteRights = 0x80690000 as number,\n UncertainReferenceNotDeleted = 0x40bc0000 as number,\n BadServerIndexInvalid = 0x806a0000 as number,\n BadViewIdUnknown = 0x806b0000 as number,\n BadViewTimestampInvalid = 0x80c90000 as number,\n BadViewParameterMismatch = 0x80ca0000 as number,\n BadViewVersionInvalid = 0x80cb0000 as number,\n UncertainNotAllNodesAvailable = 0x40c00000 as number,\n GoodResultsMayBeIncomplete = 0x00ba0000 as number,\n BadNotTypeDefinition = 0x80c80000 as number,\n UncertainReferenceOutOfServer = 0x406c0000 as number,\n BadTooManyMatches = 0x806d0000 as number,\n BadQueryTooComplex = 0x806e0000 as number,\n BadNoMatch = 0x806f0000 as number,\n BadMaxAgeInvalid = 0x80700000 as number,\n BadSecurityModeInsufficient = 0x80e60000 as number,\n BadHistoryOperationInvalid = 0x80710000 as number,\n BadHistoryOperationUnsupported = 0x80720000 as number,\n BadInvalidTimestampArgument = 0x80bd0000 as number,\n BadWriteNotSupported = 0x80730000 as number,\n BadTypeMismatch = 0x80740000 as number,\n BadMethodInvalid = 0x80750000 as number,\n BadArgumentsMissing = 0x80760000 as number,\n BadNotExecutable = 0x81110000 as number,\n BadTooManySubscriptions = 0x80770000 as number,\n BadTooManyPublishRequests = 0x80780000 as number,\n BadNoSubscription = 0x80790000 as number,\n BadSequenceNumberUnknown = 0x807a0000 as number,\n BadMessageNotAvailable = 0x807b0000 as number,\n BadInsufficientClientProfile = 0x807c0000 as number,\n BadStateNotActive = 0x80bf0000 as number,\n BadAlreadyExists = 0x81150000 as number,\n BadTcpServerTooBusy = 0x807d0000 as number,\n BadTcpMessageTypeInvalid = 0x807e0000 as number,\n BadTcpSecureChannelUnknown = 0x807f0000 as number,\n BadTcpMessageTooLarge = 0x80800000 as number,\n BadTcpNotEnoughResources = 0x80810000 as number,\n BadTcpInternalError = 0x80820000 as number,\n BadTcpEndpointUrlInvalid = 0x80830000 as number,\n BadRequestInterrupted = 0x80840000 as number,\n BadRequestTimeout = 0x80850000 as number,\n BadSecureChannelClosed = 0x80860000 as number,\n BadSecureChannelTokenUnknown = 0x80870000 as number,\n BadSequenceNumberInvalid = 0x80880000 as number,\n BadProtocolVersionUnsupported = 0x80be0000 as number,\n BadConfigurationError = 0x80890000 as number,\n BadNotConnected = 0x808a0000 as number,\n BadDeviceFailure = 0x808b0000 as number,\n BadSensorFailure = 0x808c0000 as number,\n BadOutOfService = 0x808d0000 as number,\n BadDeadbandFilterInvalid = 0x808e0000 as number,\n UncertainNoCommunicationLastUsableValue = 0x408f0000 as number,\n UncertainLastUsableValue = 0x40900000 as number,\n UncertainSubstituteValue = 0x40910000 as number,\n UncertainInitialValue = 0x40920000 as number,\n UncertainSensorNotAccurate = 0x40930000 as number,\n UncertainEngineeringUnitsExceeded = 0x40940000 as number,\n UncertainSubNormal = 0x40950000 as number,\n GoodLocalOverride = 0x00960000 as number,\n BadRefreshInProgress = 0x80970000 as number,\n BadConditionAlreadyDisabled = 0x80980000 as number,\n BadConditionAlreadyEnabled = 0x80cc0000 as number,\n BadConditionDisabled = 0x80990000 as number,\n BadEventIdUnknown = 0x809a0000 as number,\n BadEventNotAcknowledgeable = 0x80bb0000 as number,\n BadDialogNotActive = 0x80cd0000 as number,\n BadDialogResponseInvalid = 0x80ce0000 as number,\n BadConditionBranchAlreadyAcked = 0x80cf0000 as number,\n BadConditionBranchAlreadyConfirmed = 0x80d00000 as number,\n BadConditionAlreadyShelved = 0x80d10000 as number,\n BadConditionNotShelved = 0x80d20000 as number,\n BadShelvingTimeOutOfRange = 0x80d30000 as number,\n BadNoData = 0x809b0000 as number,\n BadBoundNotFound = 0x80d70000 as number,\n BadBoundNotSupported = 0x80d80000 as number,\n BadDataLost = 0x809d0000 as number,\n BadDataUnavailable = 0x809e0000 as number,\n BadEntryExists = 0x809f0000 as number,\n BadNoEntryExists = 0x80a00000 as number,\n BadTimestampNotSupported = 0x80a10000 as number,\n GoodEntryInserted = 0x00a20000 as number,\n GoodEntryReplaced = 0x00a30000 as number,\n UncertainDataSubNormal = 0x40a40000 as number,\n GoodNoData = 0x00a50000 as number,\n GoodMoreData = 0x00a60000 as number,\n BadAggregateListMismatch = 0x80d40000 as number,\n BadAggregateNotSupported = 0x80d50000 as number,\n BadAggregateInvalidInputs = 0x80d60000 as number,\n BadAggregateConfigurationRejected = 0x80da0000 as number,\n GoodDataIgnored = 0x00d90000 as number,\n BadRequestNotAllowed = 0x80e40000 as number,\n BadRequestNotComplete = 0x81130000 as number,\n GoodEdited = 0x00dc0000 as number,\n GoodPostActionFailed = 0x00dd0000 as number,\n UncertainDominantValueChanged = 0x40de0000 as number,\n GoodDependentValueChanged = 0x00e00000 as number,\n BadDominantValueChanged = 0x80e10000 as number,\n UncertainDependentValueChanged = 0x40e20000 as number,\n BadDependentValueChanged = 0x80e30000 as number,\n GoodEditedDependentValueChanged = 0x01160000 as number,\n GoodEditedDominantValueChanged = 0x01170000 as number,\n GoodEditedDominantValueChangedDependentValueChanged = 0x01180000 as number,\n BadEditedOutOfRange = 0x81190000 as number,\n BadInitialValueOutOfRange = 0x811a0000 as number,\n BadOutOfRangeDominantValueChanged = 0x811b0000 as number,\n BadEditedOutOfRangeDominantValueChanged = 0x811c0000 as number,\n BadOutOfRangeDominantValueChangedDependentValueChanged = 0x811d0000 as number,\n BadEditedOutOfRangeDominantValueChangedDependentValueChanged = 0x811e0000 as number,\n GoodCommunicationEvent = 0x00a70000 as number,\n GoodShutdownEvent = 0x00a80000 as number,\n GoodCallAgain = 0x00a90000 as number,\n GoodNonCriticalTimeout = 0x00aa0000 as number,\n BadInvalidArgument = 0x80ab0000 as number,\n BadConnectionRejected = 0x80ac0000 as number,\n BadDisconnect = 0x80ad0000 as number,\n BadConnectionClosed = 0x80ae0000 as number,\n BadInvalidState = 0x80af0000 as number,\n BadEndOfStream = 0x80b00000 as number,\n BadNoDataAvailable = 0x80b10000 as number,\n BadWaitingForResponse = 0x80b20000 as number,\n BadOperationAbandoned = 0x80b30000 as number,\n BadExpectedStreamToBlock = 0x80b40000 as number,\n BadWouldBlock = 0x80b50000 as number,\n BadSyntaxError = 0x80b60000 as number,\n BadMaxConnectionsReached = 0x80b70000 as number,\n}","import { ISecureChannel, NodeId, QualifiedName, ReadRequest, ReadResponse, ReadValueId, TimestampsToReturnEnum } from \"opcjs-base\";\nimport { AttrIdValue } from \"./attributeServiceAttributes\";\nimport { ServiceBase } from \"./serviceBase\";\nimport { StatusCodeToString } from \"../../../base/src/types/statusCode\";\n\n// https://reference.opcfoundation.org/Core/Part4/v105/docs/5.11\nexport class AttributeService extends ServiceBase {\n async ReadValue(nodeIds: NodeId[]): Promise<{ status: string, value: unknown }[]> {\n const readValueIds = nodeIds.map(ni => {\n const readValueId = new ReadValueId();\n readValueId.nodeId = ni;\n readValueId.attributeId = AttrIdValue;\n readValueId.indexRange = '';\n readValueId.dataEncoding = new QualifiedName(0, '');\n return readValueId;\n });\n\n const request = new ReadRequest();\n request.requestHeader = this.createRequestHeader();\n request.maxAge = 60000; // one minute\n request.timestampsToReturn = TimestampsToReturnEnum.Source;\n request.nodesToRead = readValueIds;\n\n console.log(\"Sending ReadRequest...\");\n const response = await this.secureChannel.issueServiceRequest(request) as ReadResponse;\n\n const results = new Array<{ status: string, value: unknown }>()\n for (const dataValue of response.results ?? []) {\n const result = {\n status: StatusCodeToString(dataValue.statusCode),\n value: dataValue.value as unknown\n }\n results.push(result)\n }\n return results;\n }\n\n constructor(authToken: NodeId, secureChannel: ISecureChannel) {\n super(authToken, secureChannel);\n }\n}","export class ReadValueResult{\n constructor(public value:unknown, public status:string){}\n}","import { NodeId } from \"opcjs-base\";\n\nexport class SubscriptionHandlerEntry{\n constructor(\n public subscriptionId:number,\n public handle: number, \n public id:NodeId, \n public callback: (data: { id: NodeId, value: unknown }[]) => void\n ){}\n}","import { DataChangeNotification, NodeId, SubscriptionAcknowledgement } from \"opcjs-base\";\nimport { MonitoredItemService } from \"./services/monitoredItemService\";\nimport { SubscriptionService } from \"./services/subscriptionService\";\nimport { SubscriptionHandlerEntry } from \"./subscriptionHandlerEntry\";\n\nexport class SubscriptionHandler {\n private entries = new Array<SubscriptionHandlerEntry>()\n private nextHandle = 0\n\n async subscribe(ids: NodeId[], callback: (data: { id: NodeId, value: unknown }[]) => void) {\n if (this.entries.length > 0) {\n throw new Error('Subscribing more than once is not implemented');\n }\n\n const subscriptionId = await this.subscriptionService.createSubscription()\n const items = []\n for (const id of ids) {\n const entry = new SubscriptionHandlerEntry(\n subscriptionId,\n this.nextHandle++,\n id,\n callback\n );\n this.entries.push(entry)\n const item = {\n id: id,\n handle: entry.handle\n }\n items.push(item)\n }\n await this.monitoredItemService.createMonitoredItems(subscriptionId, items)\n this.publish([])\n }\n\n private async publish(acknowledgeSequenceNumbers: number[]) {\n const acknowledgements = []\n for (let i = 0; i < acknowledgeSequenceNumbers.length; i++) {\n const acknowledgement = new SubscriptionAcknowledgement();\n acknowledgement.subscriptionId = this.entries[i].subscriptionId;\n acknowledgement.sequenceNumber = acknowledgeSequenceNumbers[i];\n acknowledgements.push(acknowledgement);\n }\n const response = await this.subscriptionService.publish(acknowledgements);\n\n const messagesToAcknowledge = response.notificationMessage.sequenceNumber\n // todo: evaluatin status codes\n const notificationDatas = response.notificationMessage.notificationData\n\n for (const notificationData of notificationDatas) {\n const decodedData = notificationData.data;\n const typeNodeId = notificationData.typeId;\n if (typeNodeId.namespace === 0 && typeNodeId.identifier === 811) {\n const dataChangeNotification = decodedData as DataChangeNotification;\n for (const item of dataChangeNotification.monitoredItems) {\n const clientHandle = item.clientHandle;\n const value = item.value;\n const entry = this.entries.find(e => e.handle == clientHandle);\n entry?.callback([{\n id: entry.id,\n value: value.value?.value\n }]);\n }\n } else {\n console.log(`The change notification data type ${typeNodeId.namespace}:${typeNodeId.identifier} is not supported.`)\n }\n }\n\n setTimeout(() => {\n this.publish([messagesToAcknowledge]);\n }, 500);\n }\n\n constructor(\n private subscriptionService: SubscriptionService,\n private monitoredItemService: MonitoredItemService\n ) {\n }\n}","import {\n CreateSubscriptionRequest, CreateSubscriptionResponse, ISecureChannel, NodeId, PublishRequest,\n PublishResponse, SubscriptionAcknowledgement\n} from \"opcjs-base\";\nimport { ServiceBase } from \"./serviceBase\";\n\n// https://reference.opcfoundation.org/Core/Part4/v105/docs/5.14\nexport class SubscriptionService extends ServiceBase {\n // https://reference.opcfoundation.org/Core/Part4/v105/docs/5.14.2\n async createSubscription(): Promise<number> {\n const request = new CreateSubscriptionRequest();\n request.requestHeader = this.createRequestHeader();\n request.requestedPublishingInterval = 2000; // 2 sec\n request.requestedLifetimeCount = 360000; // 5 min\n request.requestedMaxKeepAliveCount = 60000; // 1 min\n request.maxNotificationsPerPublish = 200;\n request.publishingEnabled = true;\n request.priority = 1;\n\n\n console.log(\"Sending createSubscription...\");\n const response = await this.secureChannel.issueServiceRequest(request) as CreateSubscriptionResponse;\n console.log(\"Subscription created with id:\", response.subscriptionId);\n return response.subscriptionId;\n }\n\n // https://reference.opcfoundation.org/Core/Part4/v105/docs/5.14.5\n async publish(acknowledgements: SubscriptionAcknowledgement[]): Promise<PublishResponse> {\n const request = new PublishRequest();\n request.requestHeader = this.createRequestHeader();\n request.subscriptionAcknowledgements = acknowledgements;\n\n console.log('Sending publish...');\n const response = await this.secureChannel.issueServiceRequest(request) as PublishResponse;\n console.log('Received publish response.')\n return response;\n }\n\n constructor(authToken: NodeId, secureChannel: ISecureChannel) {\n super(authToken, secureChannel);\n }\n}","import { \n CreateMonitoredItemsRequest, CreateMonitoredItemsResponse, \n ExtensionObject, ISecureChannel, MonitoredItemCreateRequest, MonitoringModeEnum, MonitoringParameters, \n NodeId, QualifiedName, ReadValueId, TimestampsToReturnEnum } from \"opcjs-base\";\nimport { AttrIdValue } from \"./attributeServiceAttributes\";\nimport { ServiceBase } from \"./serviceBase\";\n\nexport class MonitoredItemService extends ServiceBase {\n\n async createMonitoredItems(subscriptionId: number, ids: { id: NodeId, handle: number }[]): Promise<void> {\n const items = ids.map(ni => {\n const readValueId = new ReadValueId();\n readValueId.nodeId = ni.id;\n readValueId.attributeId = AttrIdValue;\n readValueId.indexRange = '';\n readValueId.dataEncoding = new QualifiedName(0, '');\n\n const monitoringParameters = new MonitoringParameters();\n monitoringParameters.clientHandle = ni.handle;\n monitoringParameters.samplingInterval = 1000; // 1 sec\n monitoringParameters.filter = ExtensionObject.newEmpty();\n monitoringParameters.queueSize = 100;\n monitoringParameters.discardOldest = true;\n\n const monitoredItemCreateRequest = new MonitoredItemCreateRequest();\n monitoredItemCreateRequest.itemToMonitor = readValueId;\n monitoredItemCreateRequest.monitoringMode = MonitoringModeEnum.Reporting;\n monitoredItemCreateRequest.requestedParameters = monitoringParameters;\n return monitoredItemCreateRequest; \n });\n\n const request = new CreateMonitoredItemsRequest();\n request.requestHeader = this.createRequestHeader();\n request.subscriptionId = subscriptionId;\n request.timestampsToReturn = TimestampsToReturnEnum.Source;\n request.itemsToCreate = items;\n\n console.log(\"Sending createMonitoredItems...\");\n await this.secureChannel.issueServiceRequest(request) as CreateMonitoredItemsResponse;\n // todo: handle Statuscodes\n }\n\n constructor(authToken: NodeId, secureChannel: ISecureChannel) {\n super(authToken, secureChannel)\n }\n}","import { CallMethodRequest, CallRequest, CallResponse, ISecureChannel, NodeId } from \"opcjs-base\";\nimport { ServiceBase } from \"./serviceBase\";\nimport { StatusCodeToString } from \"../../../base/src/types/statusCode\";\n\n// https://reference.opcfoundation.org/Core/Part4/v105/docs/5.11\nexport class MethodService extends ServiceBase {\n\n /**\n * Calls one or more methods on the server (OPC UA Part 4, Section 5.11.2).\n * @param methodsToCall - Array of CallMethodRequest describing each method to invoke.\n * @returns Array of CallMethodResult, one per requested method.\n */\n async call(methodsToCall: CallMethodRequest[]): Promise<{ status: string, value: unknown[] }[]> {\n const request = new CallRequest();\n request.requestHeader = this.createRequestHeader();\n request.methodsToCall = methodsToCall;\n\n const response = await this.secureChannel.issueServiceRequest(request) as CallResponse;\n return response.results.map(result => ({\n status: StatusCodeToString(result.statusCode),\n value: result.outputArguments.map(arg => arg.value)\n }));\n }\n\n constructor(authToken: NodeId, secureChannel: ISecureChannel) {\n super(authToken, secureChannel);\n }\n}\n","export class CallMethodResult {\n constructor(public values:unknown[], public status:string){}\n}","import {\n NodeId,\n TcpConnectionHandler,\n SecureChannelFacade,\n SecureChannelContext,\n SecureChannelMesssageEncoder,\n SecureChannelTypeDecoder,\n SecureChannelMessageDecoder,\n SecureChannelTypeEncoder,\n initLoggerProvider,\n TcpMessageInjector,\n TcpMessageDecoupler,\n getLogger,\n WebSocketFascade,\n WebSocketReadableStream,\n WebSocketWritableStream,\n SecureChannelChunkReader,\n SecureChannelChunkWriter,\n CallMethodRequest,\n Variant\n} from \"opcjs-base\";\nimport { SessionHandler } from \"./sessions/sessionHandler\";\nimport { Session } from \"./sessions/session\";\nimport { AttributeService } from \"./services/attributeService\";\nimport { ReadValueResult } from \"./readValueResult\";\nimport { SubscriptionHandler } from \"./subscriptionHandler\";\nimport { SubscriptionService } from \"./services/subscriptionService\";\nimport { MonitoredItemService } from \"./services/monitoredItemService\";\nimport { UserIdentity } from \"./userIdentity\";\nimport { ConfigurationClient } from \"./configurationClient\";\nimport { ILogger } from \"opcjs-base\";\nimport { MethodService } from \"./services/methodService\";\nimport { CallMethodResult } from \"./callMethodResult\";\nimport { UaPrimitive } from \"../../base/src/types/primitives\";\n\nexport class Client {\n private endpointUrl: string;\n private attributeService?: AttributeService;\n private methodService?: MethodService;\n private session?: Session;\n private subscriptionHandler?: SubscriptionHandler;\n private logger: ILogger;\n\n getSession(): Session {\n if (!this.session) {\n throw new Error(\"No session available\");\n }\n return this.session;\n }\n\n async connect(): Promise<void> {\n\n const wsOptions = { endpoint: this.endpointUrl }\n const ws = new WebSocketFascade(wsOptions);\n const webSocketReadableStream = new WebSocketReadableStream(ws, 1000);\n const webSocketWritableStream = new WebSocketWritableStream(ws);\n\n\n const scContext = new SecureChannelContext(this.endpointUrl);\n const tcpMessageInjector = new TcpMessageInjector();\n const tcpConnectionHandler = new TcpConnectionHandler(tcpMessageInjector, scContext);\n const tcpMessageDecoupler = new TcpMessageDecoupler(tcpConnectionHandler.onTcpMessage.bind(tcpConnectionHandler));\n const scMessageEncoder = new SecureChannelMesssageEncoder(scContext);\n const scTypeDecoder = new SecureChannelTypeDecoder(\n this.configuration.decoder,\n );\n const scMessageDecoder = new SecureChannelMessageDecoder(scContext);\n const scTypeEncoder = new SecureChannelTypeEncoder(\n this.configuration.encoder,\n );\n const scChunkWriter = new SecureChannelChunkWriter(scContext);\n const scChunkReader = new SecureChannelChunkReader(scContext);\n\n webSocketReadableStream.pipeTo(tcpMessageDecoupler.writable);\n tcpMessageDecoupler.readable.pipeTo(scMessageDecoder.writable);\n scMessageDecoder.readable.pipeTo(scChunkReader.writable);\n scChunkReader.readable.pipeTo(scTypeDecoder.writable);\n\n scTypeEncoder.readable.pipeTo(scChunkWriter.writable);\n scChunkWriter.readable.pipeTo(scMessageEncoder.writable);\n scMessageEncoder.readable.pipeTo(tcpMessageInjector.writable);\n tcpMessageInjector.readable.pipeTo(webSocketWritableStream);\n\n const sc = new SecureChannelFacade(scContext, scTypeDecoder, scTypeEncoder);\n\n // const response = await sc.send(request, wsWritable);\n\n //const channel = ChannelFactory.createChannel(this.endpointUrl);\n let connected = false;\n while (!connected) {\n this.logger.debug(`Connecting to OPC UA server at ${this.endpointUrl}...`);\n await ws.connect();\n this.logger.debug(\"WebSocket connection established, now establishing TCP connection...\");\n connected = await tcpConnectionHandler.connect(this.endpointUrl);\n\n if (!connected) {\n this.logger.info(\"Connection failed, retrying in 2 seconds...\");\n await new Promise((resolve) => setTimeout(resolve, 2000));\n }\n }\n this.logger.info(\"Connected to OPC UA server.\");\n\n //this.channel = new SecureChannel(channel, this.configuration);\n this.logger.debug(\"Opening secure channel...\");\n await sc.openSecureChannel();\n this.logger.debug(\"Secure channel established.\");\n\n this.logger.debug(\"Creating session...\");\n const sessionHandler = new SessionHandler(sc, this.configuration);\n this.session = await sessionHandler.createNewSession(this.identity);\n this.logger.debug(\"Session created.\");\n\n this.logger.debug(\"Initializing services...\");\n this.attributeService = new AttributeService(this.session.getAuthToken(), sc);\n this.methodService = new MethodService(this.session.getAuthToken(), sc);\n this.subscriptionHandler = new SubscriptionHandler(\n new SubscriptionService(this.session.getAuthToken(), sc),\n new MonitoredItemService(this.session.getAuthToken(), sc),\n );\n }\n\n async disconnect(): Promise<void> {\n this.logger.info(\"Disconnecting from OPC UA server...\");\n // Implementation of disconnection logic goes here\n // if (this.channel) {\n // await this.channel.disconnect();\n // }\n }\n\n async read(ids: NodeId[]): Promise<ReadValueResult[]> {\n const result = await this.attributeService?.ReadValue(ids);\n return result?.map((r) => new ReadValueResult(r.value, r.status)) || [];\n }\n\n /**\n * Method for calling a single method on the server.\n * @param objectId - NodeId of the Object that owns the method.\n * @param methodId - NodeId of the Method to invoke.\n * @param inputArguments - Input argument Variants (default: empty).\n * @returns The CallMethodResult for the invoked method.\n */\n async callMethod(\n objectId: NodeId,\n methodId: NodeId,\n inputArguments: UaPrimitive[] = []\n ): Promise<CallMethodResult> {\n const request = new CallMethodRequest();\n request.objectId = objectId;\n request.methodId = methodId;\n request.inputArguments = inputArguments.map(arg => Variant.newFrom(arg));\n\n const responses = await this.methodService!.call([request]);\n const response = responses[0];\n\n return new CallMethodResult(response.value, response.status);\n }\n\n async subscribe(\n ids: NodeId[],\n callback: (data: { id: NodeId; value: unknown }[]) => void,\n ) {\n this.subscriptionHandler?.subscribe(ids, callback);\n }\n\n constructor(\n endpointUrl: string,\n private configuration: ConfigurationClient,\n private identity: UserIdentity,\n ) {\n this.endpointUrl = endpointUrl;\n initLoggerProvider(configuration.loggerFactory);\n this.logger = getLogger(\"Client\");\n }\n}\n","import {\n BinaryReader,\n BinaryWriter,\n Configuration,\n Decoder,\n Encoder,\n ILoggerFactory,\n LoggerFactory,\n registerBinaryDecoders,\n registerEncoders,\n registerTypeDecoders\n} from \"opcjs-base\";\n\nexport class ConfigurationClient extends Configuration {\n public static getSimple(\n name: string,\n company: string,\n loggerFactory?: ILoggerFactory,\n ): ConfigurationClient {\n\n if (!loggerFactory) {\n loggerFactory = new LoggerFactory({\n defaultLevel: 'DEBUG', //todo: use enum\n categoryLevels: {\n \"transport.*\": \"TRACE\",\n \"secureChannel.*\": \"TRACE\",\n },\n });\n }\n const applicationUri = `urn:${company}:${name}`;\n const productUri = `urn:${company}:${name}:product`;\n\n const encoder = new Encoder();\n encoder.registerWriterFactory(\"binary\", () => {\n return new BinaryWriter();\n });\n registerEncoders(encoder);\n\n const decoder = new Decoder();\n decoder.registerReaderFactory(\"binary\", (data: unknown) => {\n return new BinaryReader(data as Uint8Array);\n });\n registerTypeDecoders(decoder);\n registerBinaryDecoders(decoder);\n\n return new ConfigurationClient(\n name,\n applicationUri,\n name,\n productUri,\n encoder,\n decoder,\n loggerFactory,\n );\n }\n\n constructor(\n applicationName: string,\n applicationUri: string,\n productName: string,\n productUri: string,\n encoder: Encoder,\n decoder: Decoder,\n loggerFactory: ILoggerFactory,\n ) {\n super(\n applicationName,\n applicationUri,\n productName,\n productUri,\n encoder,\n decoder,\n loggerFactory,\n );\n }\n}\n","import { IssuedIdentityToken, UserIdentityToken, UserNameIdentityToken, UserTokenTypeEnum } from \"opcjs-base\";\nimport { IssuerConfiguration } from \"./issuerConfiguration\";\nimport { IssuerToken } from \"./issuerToken\";\nimport { AnonymousIdentityToken } from \"opcjs-base\";\n\nexport class UserIdentity {\n private userIdentityToken?: UserIdentityToken;\n private tokenType = UserTokenTypeEnum.Anonymous;\n private issuerLoginCallback: ((config:IssuerConfiguration)=>Promise<IssuerToken>) | undefined = undefined;\n\n public static newAnonymous(): UserIdentity {\n const userIdentity = new UserIdentity();\n userIdentity.userIdentityToken = new AnonymousIdentityToken();\n userIdentity.userIdentityToken.policyId = \"anonymous\";\n userIdentity.tokenType = UserTokenTypeEnum.Anonymous;\n return userIdentity;\n }\n \n public static newWithUserName(userName: string, password: string): UserIdentity {\n const userIdentity = new UserIdentity();\n const nameToken = new UserNameIdentityToken();\n nameToken.userName = userName;\n nameToken.password = new TextEncoder().encode(password);\n\n userIdentity.userIdentityToken = nameToken;\n userIdentity.tokenType = UserTokenTypeEnum.UserName;\n return userIdentity;\n }\n\n public static newWithIssuerToken(loginCallback: (config:IssuerConfiguration)=>Promise<IssuerToken>): UserIdentity {\n const userIdentity = new UserIdentity();\n const issuedToken = new IssuedIdentityToken();\n issuedToken.tokenData = new TextEncoder().encode(\"\"); // token data will be filled by the login callback \n userIdentity.userIdentityToken = issuedToken;\n userIdentity.tokenType = UserTokenTypeEnum.IssuedToken;\n userIdentity.issuerLoginCallback = loginCallback;\n return userIdentity;\n }\n\n public getUserIdentityToken(): UserIdentityToken {\n return this.userIdentityToken as UserIdentityToken;\n }\n\n public getTokenType(): UserTokenTypeEnum {\n return this.tokenType;\n }\n\n public getIssuerLoginCallback(): ((config:IssuerConfiguration)=>Promise<IssuerToken>) {\n if(!this.issuerLoginCallback){\n throw new Error(\"No issuer login callback defined\");\n }\n \n return this.issuerLoginCallback;\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/services/serviceBase.ts","../src/services/sessionService.ts","../src/issuerConfiguration.ts","../src/sessions/session.ts","../src/sessions/sessionHandler.ts","../src/services/attributeServiceAttributes.ts","../../base/src/types/statusCode.ts","../src/services/attributeService.ts","../src/readValueResult.ts","../src/subscriptionHandlerEntry.ts","../src/subscriptionHandler.ts","../src/services/subscriptionService.ts","../src/services/monitoredItemService.ts","../src/services/methodService.ts","../src/callMethodResult.ts","../src/services/browseService.ts","../src/browseNodeResult.ts","../src/client.ts","../src/configurationClient.ts","../src/userIdentity.ts"],"names":["RequestHeader","ExtensionObject","getLogger","ApplicationDescription","LocalizedText","ApplicationTypeEnum","CreateSessionRequest","CreateSessionResponse","SignatureData","ActivateSessionRequest","UserTokenTypeEnum","NodeId","StatusCode","ReadValueId","QualifiedName","ReadRequest","TimestampsToReturnEnum","SubscriptionAcknowledgement","CreateSubscriptionRequest","PublishRequest","MonitoringParameters","MonitoredItemCreateRequest","MonitoringModeEnum","CreateMonitoredItemsRequest","CallRequest","ViewDescription","BrowseRequest","BrowseNextRequest","initLoggerProvider","WebSocketFascade","WebSocketReadableStream","WebSocketWritableStream","SecureChannelContext","TcpMessageInjector","TcpConnectionHandler","TcpMessageDecoupler","SecureChannelMesssageEncoder","SecureChannelTypeDecoder","SecureChannelMessageDecoder","SecureChannelTypeEncoder","SecureChannelChunkWriter","SecureChannelChunkReader","SecureChannelFacade","CallMethodRequest","Variant","BrowseDescription","BrowseDirectionEnum","BrowseResultMaskEnum","Configuration","LoggerFactory","Encoder","BinaryWriter","registerEncoders","Decoder","BinaryReader","registerTypeDecoders","registerBinaryDecoders","AnonymousIdentityToken","UserNameIdentityToken","IssuedIdentityToken"],"mappings":"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","file":"index.cjs","sourcesContent":["import { ExtensionObject, ISecureChannel, NodeId, RequestHeader } from \"opcjs-base\";\n\nexport abstract class ServiceBase{\n\n\n protected createRequestHeader(): RequestHeader {\n const requestHeader = new RequestHeader();\n requestHeader.authenticationToken = this.authToken;\n requestHeader.timestamp = new Date();\n requestHeader.requestHandle = 0; // will be set by secure channel\n requestHeader.returnDiagnostics = 0;\n requestHeader.auditEntryId = '';\n requestHeader.timeoutHint = 60000;\n requestHeader.additionalHeader = ExtensionObject.newEmpty();\n\n return requestHeader;\n }\n \n constructor(private authToken: NodeId, protected secureChannel: ISecureChannel){}\n}","import {\n ActivateSessionRequest, ApplicationDescription, ApplicationTypeEnum,\n Configuration, CreateSessionRequest, CreateSessionResponse, EndpointDescription, ExtensionObject,\n getLogger,\n ISecureChannel, LocalizedText, NodeId, SignatureData, SignedSoftwareCertificate, UserIdentityToken\n} from \"opcjs-base\";\nimport { ServiceBase } from \"./serviceBase\";\n\nexport class SessionService extends ServiceBase {\n private logger = getLogger(\"services.SessionService\");\n async createSession(): Promise<{ sessionId: number, authToken: NodeId, endpoint: EndpointDescription }> {\n this.logger.debug(\"Creating session...\");\n\n const clientDescription = new ApplicationDescription();\n clientDescription.applicationUri = this.configuration.applicationUri;\n clientDescription.productUri = this.configuration.productUri;\n clientDescription.applicationName = new LocalizedText(undefined, this.configuration.productName);\n clientDescription.applicationType = ApplicationTypeEnum.Client;\n clientDescription.gatewayServerUri = '';\n clientDescription.discoveryProfileUri = '';\n clientDescription.discoveryUrls = new Array<string>();\n\n const request = new CreateSessionRequest();\n request.requestHeader = this.createRequestHeader();\n request.clientDescription = clientDescription;\n request.serverUri = '';\n request.endpointUrl = this.secureChannel.getEndpointUrl();\n request.sessionName = '';\n request.clientNonce = null;\n request.clientCertificate = null;\n request.requestedSessionTimeout = 60000;\n request.maxResponseMessageSize = 0;\n\n\n // todo: verify endpoints\n // todo: check application uri in server certificate\n\n this.logger.debug(\"Sending CreateSessionRequest...\");\n const response = await this.secureChannel.issueServiceRequest(request);\n if (!response || !(response instanceof CreateSessionResponse)) {\n throw new Error(\"Invalid response type for CreateSessionRequest\");\n }\n\n const castedResponse = response as CreateSessionResponse;\n if (!castedResponse || !castedResponse.sessionId || !castedResponse.authenticationToken) {\n throw new Error(\"CreateSessionResponse missing SessionId or AuthenticationToken\");\n }\n\n const endpoint = 'opc.' + this.secureChannel.getEndpointUrl();\n const endpointUrl = new URL(endpoint);\n const securityMode = this.secureChannel.getSecurityMode();\n const securityPolicyUri = this.secureChannel.getSecurityPolicy(); // todo: does not work with localhost. Not sure why.\n\n const serverEndpoint = castedResponse\n ?.serverEndpoints\n ?.find(currentEndpoint => {\n const currentEndpointUrl = new URL(currentEndpoint.endpointUrl as string);\n\n return currentEndpointUrl.protocol === endpointUrl.protocol\n && currentEndpointUrl.pathname === endpointUrl.pathname\n && currentEndpointUrl.port === endpointUrl.port\n && currentEndpoint.securityMode === securityMode\n && currentEndpoint.securityPolicyUri === securityPolicyUri});\n\n if (!serverEndpoint) {\n throw new Error(`Server endpoint ${endpoint} not found in CreateSessionResponse`);\n }\n\n this.logger.debug(\"Session created with id:\", castedResponse.sessionId.identifier);\n return {\n sessionId: castedResponse.sessionId.identifier as number,\n authToken: castedResponse.authenticationToken,\n endpoint: serverEndpoint\n };\n }\n\n async activateSession(identityToken: UserIdentityToken): Promise<void> {\n const signatureData = new SignatureData();\n signatureData.algorithm = this.secureChannel.getSecurityPolicy();\n signatureData.signature = new Uint8Array(0);\n\n const request = new ActivateSessionRequest();\n request.requestHeader = this.createRequestHeader();\n request.clientSignature = signatureData;\n request.clientSoftwareCertificates = new Array<SignedSoftwareCertificate>();\n request.localeIds = ['en-US'];\n request.userIdentityToken = ExtensionObject.newBinary(identityToken);\n request.userTokenSignature = signatureData;\n\n this.logger.debug(\"Sending ActivateSessionRequest...\");\n await this.secureChannel.issueServiceRequest(request);\n this.logger.debug(\"Session activated.\");\n }\n\n recreate(authToken: NodeId): SessionService {\n return new SessionService(authToken, this.secureChannel, this.configuration)\n }\n\n constructor(authToken: NodeId, secureChannel: ISecureChannel, private configuration: Configuration) {\n super(authToken, secureChannel)\n }\n}","interface IssuerEndpointUrl {\n 'ua.resourceId': string;\n 'ua.authorityUrl': string;\n 'ua.authorityProfileUri': string;\n 'ua.tokenEndpoint': string;\n 'ua.authorizationEndpoint': string;\n 'ua.requestTypes': string[];\n 'ua.scopes': string[];\n}\n\nexport class IssuerConfiguration{\n public static newFrom(issuerEndpointUrl: IssuerEndpointUrl): IssuerConfiguration {\n return new IssuerConfiguration(\n issuerEndpointUrl['ua.resourceId'],\n issuerEndpointUrl['ua.authorityUrl'],\n issuerEndpointUrl['ua.authorityProfileUri'],\n issuerEndpointUrl['ua.tokenEndpoint'],\n issuerEndpointUrl['ua.authorizationEndpoint'],\n issuerEndpointUrl['ua.requestTypes'],\n issuerEndpointUrl['ua.scopes']\n );\n }\n \n constructor(\n public resourceId: string,\n public authorityUrl: string,\n public authorityProfileUri: string,\n public tokenEndpoint: string,\n public authorizationEndpoint: string,\n public requestTypes: string[],\n public scopes: string[]\n ){\n \n }\n}","import { EndpointDescription, IssuedIdentityToken, NodeId, UserTokenTypeEnum } from \"opcjs-base\";\nimport { IssuerConfiguration } from \"../issuerConfiguration\";\nimport { SessionService } from \"../services/sessionService\";\nimport { UserIdentity } from \"../userIdentity\";\n\nexport class Session {\n async activateSession(identity: UserIdentity): Promise<void> {\n const token = identity.getUserIdentityToken();\n const tokenType = identity.getTokenType();\n const tokenPolicy = this.endpoint.userIdentityTokens?.find(t => t.tokenType === tokenType);\n if (!tokenPolicy) {\n throw new Error(`UserIdentityToken of type ${tokenType} not supported by server`);\n }\n token.policyId = tokenPolicy.policyId;\n\n if (tokenType === UserTokenTypeEnum.IssuedToken) {\n if (!tokenPolicy.issuerEndpointUrl) {\n throw new Error(\"IssuerEndpointUrl not defined for IssuedToken\");\n }\n const issuerEndpointUrl = JSON.parse(tokenPolicy.issuerEndpointUrl)\n const issuerConfig = IssuerConfiguration.newFrom(issuerEndpointUrl);\n\n const issuerLoginCallback = identity.getIssuerLoginCallback();\n const tokenData = await issuerLoginCallback(issuerConfig);\n\n const issuerToken = token as IssuedIdentityToken;\n issuerToken.tokenData = new TextEncoder().encode(tokenData.json);\n }\n\n await this.sessionServices.activateSession(token);\n }\n\n getAuthToken(): NodeId {\n return this.authToken;\n }\n\n constructor(\n public sessionId: number,\n private authToken: NodeId,\n private endpoint: EndpointDescription,\n private sessionServices: SessionService) { }\n}","import { ConfigurationClient } from \"../configurationClient\";\nimport { ISecureChannel, NodeId } from \"opcjs-base\";\nimport { SessionService } from \"../services/sessionService\";\nimport { UserIdentity } from \"../userIdentity\";\nimport { Session } from \"./session\";\n\nexport class SessionHandler {\n private sessionServices: SessionService;\n async createNewSession(identity:UserIdentity) : Promise<Session>{\n const ret = await this.sessionServices.createSession();\n this.sessionServices = this.sessionServices.recreate(ret.authToken)\n\n const session = new Session(ret.sessionId, ret.authToken, ret.endpoint, this.sessionServices);\n await session.activateSession(identity);\n return session;\n }\n\n constructor(secureChannel:ISecureChannel, configuration: ConfigurationClient) {\n this.sessionServices = new SessionService(NodeId.newTwoByte(0), secureChannel, configuration);\n }\n}","// according to https://reference.opcfoundation.org/Core/Part6/v105/docs/A.1\n// see also: https://reference.opcfoundation.org/Core/Part4/v105/docs/7.24.1#Table154\n\nexport const AttrIdNodeId = 1\nexport const AttrIdNodeClass = 2\nexport const AttrIdBrowseName = 3\nexport const AttrIdDisplayName = 4\nexport const AttrIdDescription = 5\nexport const AttrIdWriteMask = 6\nexport const AttrIdUserWriteMask = 7\nexport const AttrIdIsAbstract = 8\nexport const AttrIdSymmetric = 9\nexport const AttrIdInverseName = 10\nexport const AttrIdContainsNoLoops = 11\nexport const AttrIdEventNotifier = 12\nexport const AttrIdValue = 13\nexport const AttrIdDataType = 14\nexport const AttrIdValueRank = 15\nexport const AttrIdArrayDimensions = 16\nexport const AttrIdAccessLevel = 17\nexport const AttrIdUserAccessLevel = 18\nexport const AttrIdMinimumSamplingInterval = 19\nexport const AttrIdHistorizing = 20\nexport const AttrIdExecutable = 21\nexport const AttrIdUserExecutable = 22\nexport const AttrIdDataTypeDefinition = 23\nexport const AttrIdRolePermissions = 24\nexport const AttrIdUserRolePermissions = 25\nexport const AttrIdAccessRestrictions = 26\nexport const AttrIdAccessLevelEx = 27\n","/**\n * OPC UA StatusCode Type (i=19)\n * \n * StatusCode is a 32-bit unsigned integer that indicates the quality of a result.\n * The format is: [Severity:2][SubCode:14][Code:16]\n * \n * @see OPC UA Part 4, Section 7.34\n * @see OPC UA Part 6, Section 5.1.1\n */\n\nimport { BuiltInType } from \"./builtinType\";\n\nexport function StatusCodeToString(statusCode?: number): string {\n if (statusCode === undefined) {\n return 'Unknown';\n }\n const name = (Object.entries(StatusCode) as [string, number][])\n .find(([, v]) => v === statusCode)?.[0];\n return name ?? `0x${statusCode.toString(16).toUpperCase().padStart(8, '0')}`;\n}\n\nexport type UaStatusCode = {value: StatusCode; readonly type: BuiltInType.StatusCode };\nexport const uaStatusCode = (value: StatusCode): UaStatusCode => ({ value, type: BuiltInType.StatusCode });\n\nexport enum StatusCode {\n Good = 0x0 as number,\n Uncertain = 0x40000000 as number,\n Bad = 0x80000000 as number,\n BadUnexpectedError = 0x80010000 as number,\n BadInternalError = 0x80020000 as number,\n BadOutOfMemory = 0x80030000 as number,\n BadResourceUnavailable = 0x80040000 as number,\n BadCommunicationError = 0x80050000 as number,\n BadEncodingError = 0x80060000 as number,\n BadDecodingError = 0x80070000 as number,\n BadEncodingLimitsExceeded = 0x80080000 as number,\n BadRequestTooLarge = 0x80b80000 as number,\n BadResponseTooLarge = 0x80b90000 as number,\n BadUnknownResponse = 0x80090000 as number,\n BadTimeout = 0x800a0000 as number,\n BadServiceUnsupported = 0x800b0000 as number,\n BadShutdown = 0x800c0000 as number,\n BadServerNotConnected = 0x800d0000 as number,\n BadServerHalted = 0x800e0000 as number,\n BadNothingToDo = 0x800f0000 as number,\n BadTooManyOperations = 0x80100000 as number,\n BadTooManyMonitoredItems = 0x80db0000 as number,\n BadDataTypeIdUnknown = 0x80110000 as number,\n BadCertificateInvalid = 0x80120000 as number,\n BadSecurityChecksFailed = 0x80130000 as number,\n BadCertificatePolicyCheckFailed = 0x81140000 as number,\n BadCertificateTimeInvalid = 0x80140000 as number,\n BadCertificateIssuerTimeInvalid = 0x80150000 as number,\n BadCertificateHostNameInvalid = 0x80160000 as number,\n BadCertificateUriInvalid = 0x80170000 as number,\n BadCertificateUseNotAllowed = 0x80180000 as number,\n BadCertificateIssuerUseNotAllowed = 0x80190000 as number,\n BadCertificateUntrusted = 0x801a0000 as number,\n BadCertificateRevocationUnknown = 0x801b0000 as number,\n BadCertificateIssuerRevocationUnknown = 0x801c0000 as number,\n BadCertificateRevoked = 0x801d0000 as number,\n BadCertificateIssuerRevoked = 0x801e0000 as number,\n BadCertificateChainIncomplete = 0x810d0000 as number,\n BadUserAccessDenied = 0x801f0000 as number,\n BadIdentityTokenInvalid = 0x80200000 as number,\n BadIdentityTokenRejected = 0x80210000 as number,\n BadSecureChannelIdInvalid = 0x80220000 as number,\n BadInvalidTimestamp = 0x80230000 as number,\n BadNonceInvalid = 0x80240000 as number,\n BadSessionIdInvalid = 0x80250000 as number,\n BadSessionClosed = 0x80260000 as number,\n BadSessionNotActivated = 0x80270000 as number,\n BadSubscriptionIdInvalid = 0x80280000 as number,\n BadRequestHeaderInvalid = 0x802a0000 as number,\n BadTimestampsToReturnInvalid = 0x802b0000 as number,\n BadRequestCancelledByClient = 0x802c0000 as number,\n BadTooManyArguments = 0x80e50000 as number,\n BadLicenseExpired = 0x810e0000 as number,\n BadLicenseLimitsExceeded = 0x810f0000 as number,\n BadLicenseNotAvailable = 0x81100000 as number,\n GoodSubscriptionTransferred = 0x002d0000 as number,\n GoodCompletesAsynchronously = 0x002e0000 as number,\n GoodOverload = 0x002f0000 as number,\n GoodClamped = 0x00300000 as number,\n BadNoCommunication = 0x80310000 as number,\n BadWaitingForInitialData = 0x80320000 as number,\n BadNodeIdInvalid = 0x80330000 as number,\n BadNodeIdUnknown = 0x80340000 as number,\n BadAttributeIdInvalid = 0x80350000 as number,\n BadIndexRangeInvalid = 0x80360000 as number,\n BadIndexRangeNoData = 0x80370000 as number,\n BadDataEncodingInvalid = 0x80380000 as number,\n BadDataEncodingUnsupported = 0x80390000 as number,\n BadNotReadable = 0x803a0000 as number,\n BadNotWritable = 0x803b0000 as number,\n BadOutOfRange = 0x803c0000 as number,\n BadNotSupported = 0x803d0000 as number,\n BadNotFound = 0x803e0000 as number,\n BadObjectDeleted = 0x803f0000 as number,\n BadNotImplemented = 0x80400000 as number,\n BadMonitoringModeInvalid = 0x80410000 as number,\n BadMonitoredItemIdInvalid = 0x80420000 as number,\n BadMonitoredItemFilterInvalid = 0x80430000 as number,\n BadMonitoredItemFilterUnsupported = 0x80440000 as number,\n BadFilterNotAllowed = 0x80450000 as number,\n BadStructureMissing = 0x80460000 as number,\n BadEventFilterInvalid = 0x80470000 as number,\n BadContentFilterInvalid = 0x80480000 as number,\n BadFilterOperatorInvalid = 0x80c10000 as number,\n BadFilterOperatorUnsupported = 0x80c20000 as number,\n BadFilterOperandCountMismatch = 0x80c30000 as number,\n BadFilterOperandInvalid = 0x80490000 as number,\n BadFilterElementInvalid = 0x80c40000 as number,\n BadFilterLiteralInvalid = 0x80c50000 as number,\n BadContinuationPointInvalid = 0x804a0000 as number,\n BadNoContinuationPoints = 0x804b0000 as number,\n BadReferenceTypeIdInvalid = 0x804c0000 as number,\n BadBrowseDirectionInvalid = 0x804d0000 as number,\n BadNodeNotInView = 0x804e0000 as number,\n BadNumericOverflow = 0x81120000 as number,\n BadServerUriInvalid = 0x804f0000 as number,\n BadServerNameMissing = 0x80500000 as number,\n BadDiscoveryUrlMissing = 0x80510000 as number,\n BadSempahoreFileMissing = 0x80520000 as number,\n BadRequestTypeInvalid = 0x80530000 as number,\n BadSecurityModeRejected = 0x80540000 as number,\n BadSecurityPolicyRejected = 0x80550000 as number,\n BadTooManySessions = 0x80560000 as number,\n BadUserSignatureInvalid = 0x80570000 as number,\n BadApplicationSignatureInvalid = 0x80580000 as number,\n BadNoValidCertificates = 0x80590000 as number,\n BadIdentityChangeNotSupported = 0x80c60000 as number,\n BadRequestCancelledByRequest = 0x805a0000 as number,\n BadParentNodeIdInvalid = 0x805b0000 as number,\n BadReferenceNotAllowed = 0x805c0000 as number,\n BadNodeIdRejected = 0x805d0000 as number,\n BadNodeIdExists = 0x805e0000 as number,\n BadNodeClassInvalid = 0x805f0000 as number,\n BadBrowseNameInvalid = 0x80600000 as number,\n BadBrowseNameDuplicated = 0x80610000 as number,\n BadNodeAttributesInvalid = 0x80620000 as number,\n BadTypeDefinitionInvalid = 0x80630000 as number,\n BadSourceNodeIdInvalid = 0x80640000 as number,\n BadTargetNodeIdInvalid = 0x80650000 as number,\n BadDuplicateReferenceNotAllowed = 0x80660000 as number,\n BadInvalidSelfReference = 0x80670000 as number,\n BadReferenceLocalOnly = 0x80680000 as number,\n BadNoDeleteRights = 0x80690000 as number,\n UncertainReferenceNotDeleted = 0x40bc0000 as number,\n BadServerIndexInvalid = 0x806a0000 as number,\n BadViewIdUnknown = 0x806b0000 as number,\n BadViewTimestampInvalid = 0x80c90000 as number,\n BadViewParameterMismatch = 0x80ca0000 as number,\n BadViewVersionInvalid = 0x80cb0000 as number,\n UncertainNotAllNodesAvailable = 0x40c00000 as number,\n GoodResultsMayBeIncomplete = 0x00ba0000 as number,\n BadNotTypeDefinition = 0x80c80000 as number,\n UncertainReferenceOutOfServer = 0x406c0000 as number,\n BadTooManyMatches = 0x806d0000 as number,\n BadQueryTooComplex = 0x806e0000 as number,\n BadNoMatch = 0x806f0000 as number,\n BadMaxAgeInvalid = 0x80700000 as number,\n BadSecurityModeInsufficient = 0x80e60000 as number,\n BadHistoryOperationInvalid = 0x80710000 as number,\n BadHistoryOperationUnsupported = 0x80720000 as number,\n BadInvalidTimestampArgument = 0x80bd0000 as number,\n BadWriteNotSupported = 0x80730000 as number,\n BadTypeMismatch = 0x80740000 as number,\n BadMethodInvalid = 0x80750000 as number,\n BadArgumentsMissing = 0x80760000 as number,\n BadNotExecutable = 0x81110000 as number,\n BadTooManySubscriptions = 0x80770000 as number,\n BadTooManyPublishRequests = 0x80780000 as number,\n BadNoSubscription = 0x80790000 as number,\n BadSequenceNumberUnknown = 0x807a0000 as number,\n BadMessageNotAvailable = 0x807b0000 as number,\n BadInsufficientClientProfile = 0x807c0000 as number,\n BadStateNotActive = 0x80bf0000 as number,\n BadAlreadyExists = 0x81150000 as number,\n BadTcpServerTooBusy = 0x807d0000 as number,\n BadTcpMessageTypeInvalid = 0x807e0000 as number,\n BadTcpSecureChannelUnknown = 0x807f0000 as number,\n BadTcpMessageTooLarge = 0x80800000 as number,\n BadTcpNotEnoughResources = 0x80810000 as number,\n BadTcpInternalError = 0x80820000 as number,\n BadTcpEndpointUrlInvalid = 0x80830000 as number,\n BadRequestInterrupted = 0x80840000 as number,\n BadRequestTimeout = 0x80850000 as number,\n BadSecureChannelClosed = 0x80860000 as number,\n BadSecureChannelTokenUnknown = 0x80870000 as number,\n BadSequenceNumberInvalid = 0x80880000 as number,\n BadProtocolVersionUnsupported = 0x80be0000 as number,\n BadConfigurationError = 0x80890000 as number,\n BadNotConnected = 0x808a0000 as number,\n BadDeviceFailure = 0x808b0000 as number,\n BadSensorFailure = 0x808c0000 as number,\n BadOutOfService = 0x808d0000 as number,\n BadDeadbandFilterInvalid = 0x808e0000 as number,\n UncertainNoCommunicationLastUsableValue = 0x408f0000 as number,\n UncertainLastUsableValue = 0x40900000 as number,\n UncertainSubstituteValue = 0x40910000 as number,\n UncertainInitialValue = 0x40920000 as number,\n UncertainSensorNotAccurate = 0x40930000 as number,\n UncertainEngineeringUnitsExceeded = 0x40940000 as number,\n UncertainSubNormal = 0x40950000 as number,\n GoodLocalOverride = 0x00960000 as number,\n BadRefreshInProgress = 0x80970000 as number,\n BadConditionAlreadyDisabled = 0x80980000 as number,\n BadConditionAlreadyEnabled = 0x80cc0000 as number,\n BadConditionDisabled = 0x80990000 as number,\n BadEventIdUnknown = 0x809a0000 as number,\n BadEventNotAcknowledgeable = 0x80bb0000 as number,\n BadDialogNotActive = 0x80cd0000 as number,\n BadDialogResponseInvalid = 0x80ce0000 as number,\n BadConditionBranchAlreadyAcked = 0x80cf0000 as number,\n BadConditionBranchAlreadyConfirmed = 0x80d00000 as number,\n BadConditionAlreadyShelved = 0x80d10000 as number,\n BadConditionNotShelved = 0x80d20000 as number,\n BadShelvingTimeOutOfRange = 0x80d30000 as number,\n BadNoData = 0x809b0000 as number,\n BadBoundNotFound = 0x80d70000 as number,\n BadBoundNotSupported = 0x80d80000 as number,\n BadDataLost = 0x809d0000 as number,\n BadDataUnavailable = 0x809e0000 as number,\n BadEntryExists = 0x809f0000 as number,\n BadNoEntryExists = 0x80a00000 as number,\n BadTimestampNotSupported = 0x80a10000 as number,\n GoodEntryInserted = 0x00a20000 as number,\n GoodEntryReplaced = 0x00a30000 as number,\n UncertainDataSubNormal = 0x40a40000 as number,\n GoodNoData = 0x00a50000 as number,\n GoodMoreData = 0x00a60000 as number,\n BadAggregateListMismatch = 0x80d40000 as number,\n BadAggregateNotSupported = 0x80d50000 as number,\n BadAggregateInvalidInputs = 0x80d60000 as number,\n BadAggregateConfigurationRejected = 0x80da0000 as number,\n GoodDataIgnored = 0x00d90000 as number,\n BadRequestNotAllowed = 0x80e40000 as number,\n BadRequestNotComplete = 0x81130000 as number,\n GoodEdited = 0x00dc0000 as number,\n GoodPostActionFailed = 0x00dd0000 as number,\n UncertainDominantValueChanged = 0x40de0000 as number,\n GoodDependentValueChanged = 0x00e00000 as number,\n BadDominantValueChanged = 0x80e10000 as number,\n UncertainDependentValueChanged = 0x40e20000 as number,\n BadDependentValueChanged = 0x80e30000 as number,\n GoodEditedDependentValueChanged = 0x01160000 as number,\n GoodEditedDominantValueChanged = 0x01170000 as number,\n GoodEditedDominantValueChangedDependentValueChanged = 0x01180000 as number,\n BadEditedOutOfRange = 0x81190000 as number,\n BadInitialValueOutOfRange = 0x811a0000 as number,\n BadOutOfRangeDominantValueChanged = 0x811b0000 as number,\n BadEditedOutOfRangeDominantValueChanged = 0x811c0000 as number,\n BadOutOfRangeDominantValueChangedDependentValueChanged = 0x811d0000 as number,\n BadEditedOutOfRangeDominantValueChangedDependentValueChanged = 0x811e0000 as number,\n GoodCommunicationEvent = 0x00a70000 as number,\n GoodShutdownEvent = 0x00a80000 as number,\n GoodCallAgain = 0x00a90000 as number,\n GoodNonCriticalTimeout = 0x00aa0000 as number,\n BadInvalidArgument = 0x80ab0000 as number,\n BadConnectionRejected = 0x80ac0000 as number,\n BadDisconnect = 0x80ad0000 as number,\n BadConnectionClosed = 0x80ae0000 as number,\n BadInvalidState = 0x80af0000 as number,\n BadEndOfStream = 0x80b00000 as number,\n BadNoDataAvailable = 0x80b10000 as number,\n BadWaitingForResponse = 0x80b20000 as number,\n BadOperationAbandoned = 0x80b30000 as number,\n BadExpectedStreamToBlock = 0x80b40000 as number,\n BadWouldBlock = 0x80b50000 as number,\n BadSyntaxError = 0x80b60000 as number,\n BadMaxConnectionsReached = 0x80b70000 as number,\n}","import { ISecureChannel, NodeId, QualifiedName, ReadRequest, ReadResponse, ReadValueId, TimestampsToReturnEnum } from \"opcjs-base\";\nimport { AttrIdValue } from \"./attributeServiceAttributes\";\nimport { ServiceBase } from \"./serviceBase\";\nimport { StatusCodeToString } from \"../../../base/src/types/statusCode\";\n\n// https://reference.opcfoundation.org/Core/Part4/v105/docs/5.11\nexport class AttributeService extends ServiceBase {\n async ReadValue(nodeIds: NodeId[]): Promise<{ status: string, value: unknown }[]> {\n const readValueIds = nodeIds.map(ni => {\n const readValueId = new ReadValueId();\n readValueId.nodeId = ni;\n readValueId.attributeId = AttrIdValue;\n readValueId.indexRange = '';\n readValueId.dataEncoding = new QualifiedName(0, '');\n return readValueId;\n });\n\n const request = new ReadRequest();\n request.requestHeader = this.createRequestHeader();\n request.maxAge = 60000; // one minute\n request.timestampsToReturn = TimestampsToReturnEnum.Source;\n request.nodesToRead = readValueIds;\n\n console.log(\"Sending ReadRequest...\");\n const response = await this.secureChannel.issueServiceRequest(request) as ReadResponse;\n\n const results = new Array<{ status: string, value: unknown }>()\n for (const dataValue of response.results ?? []) {\n const result = {\n status: StatusCodeToString(dataValue.statusCode),\n value: dataValue.value as unknown\n }\n results.push(result)\n }\n return results;\n }\n\n constructor(authToken: NodeId, secureChannel: ISecureChannel) {\n super(authToken, secureChannel);\n }\n}","export class ReadValueResult{\n constructor(public value:unknown, public status:string){}\n}","import { NodeId } from \"opcjs-base\";\n\nexport class SubscriptionHandlerEntry{\n constructor(\n public subscriptionId:number,\n public handle: number, \n public id:NodeId, \n public callback: (data: { id: NodeId, value: unknown }[]) => void\n ){}\n}","import { DataChangeNotification, NodeId, SubscriptionAcknowledgement } from \"opcjs-base\";\nimport { MonitoredItemService } from \"./services/monitoredItemService\";\nimport { SubscriptionService } from \"./services/subscriptionService\";\nimport { SubscriptionHandlerEntry } from \"./subscriptionHandlerEntry\";\n\nexport class SubscriptionHandler {\n private entries = new Array<SubscriptionHandlerEntry>()\n private nextHandle = 0\n\n async subscribe(ids: NodeId[], callback: (data: { id: NodeId, value: unknown }[]) => void) {\n if (this.entries.length > 0) {\n throw new Error('Subscribing more than once is not implemented');\n }\n\n const subscriptionId = await this.subscriptionService.createSubscription()\n const items = []\n for (const id of ids) {\n const entry = new SubscriptionHandlerEntry(\n subscriptionId,\n this.nextHandle++,\n id,\n callback\n );\n this.entries.push(entry)\n const item = {\n id: id,\n handle: entry.handle\n }\n items.push(item)\n }\n await this.monitoredItemService.createMonitoredItems(subscriptionId, items)\n this.publish([])\n }\n\n private async publish(acknowledgeSequenceNumbers: number[]) {\n const acknowledgements = []\n for (let i = 0; i < acknowledgeSequenceNumbers.length; i++) {\n const acknowledgement = new SubscriptionAcknowledgement();\n acknowledgement.subscriptionId = this.entries[i].subscriptionId;\n acknowledgement.sequenceNumber = acknowledgeSequenceNumbers[i];\n acknowledgements.push(acknowledgement);\n }\n const response = await this.subscriptionService.publish(acknowledgements);\n\n const messagesToAcknowledge = response.notificationMessage.sequenceNumber\n // todo: evaluatin status codes\n const notificationDatas = response.notificationMessage.notificationData\n\n for (const notificationData of notificationDatas) {\n const decodedData = notificationData.data;\n const typeNodeId = notificationData.typeId;\n if (typeNodeId.namespace === 0 && typeNodeId.identifier === 811) {\n const dataChangeNotification = decodedData as DataChangeNotification;\n for (const item of dataChangeNotification.monitoredItems) {\n const clientHandle = item.clientHandle;\n const value = item.value;\n const entry = this.entries.find(e => e.handle == clientHandle);\n entry?.callback([{\n id: entry.id,\n value: value.value?.value\n }]);\n }\n } else {\n console.log(`The change notification data type ${typeNodeId.namespace}:${typeNodeId.identifier} is not supported.`)\n }\n }\n\n setTimeout(() => {\n this.publish([messagesToAcknowledge]);\n }, 500);\n }\n\n constructor(\n private subscriptionService: SubscriptionService,\n private monitoredItemService: MonitoredItemService\n ) {\n }\n}","import {\n CreateSubscriptionRequest, CreateSubscriptionResponse, ISecureChannel, NodeId, PublishRequest,\n PublishResponse, SubscriptionAcknowledgement\n} from \"opcjs-base\";\nimport { ServiceBase } from \"./serviceBase\";\n\n// https://reference.opcfoundation.org/Core/Part4/v105/docs/5.14\nexport class SubscriptionService extends ServiceBase {\n // https://reference.opcfoundation.org/Core/Part4/v105/docs/5.14.2\n async createSubscription(): Promise<number> {\n const request = new CreateSubscriptionRequest();\n request.requestHeader = this.createRequestHeader();\n request.requestedPublishingInterval = 2000; // 2 sec\n request.requestedLifetimeCount = 360000; // 5 min\n request.requestedMaxKeepAliveCount = 60000; // 1 min\n request.maxNotificationsPerPublish = 200;\n request.publishingEnabled = true;\n request.priority = 1;\n\n\n console.log(\"Sending createSubscription...\");\n const response = await this.secureChannel.issueServiceRequest(request) as CreateSubscriptionResponse;\n console.log(\"Subscription created with id:\", response.subscriptionId);\n return response.subscriptionId;\n }\n\n // https://reference.opcfoundation.org/Core/Part4/v105/docs/5.14.5\n async publish(acknowledgements: SubscriptionAcknowledgement[]): Promise<PublishResponse> {\n const request = new PublishRequest();\n request.requestHeader = this.createRequestHeader();\n request.subscriptionAcknowledgements = acknowledgements;\n\n console.log('Sending publish...');\n const response = await this.secureChannel.issueServiceRequest(request) as PublishResponse;\n console.log('Received publish response.')\n return response;\n }\n\n constructor(authToken: NodeId, secureChannel: ISecureChannel) {\n super(authToken, secureChannel);\n }\n}","import { \n CreateMonitoredItemsRequest, CreateMonitoredItemsResponse, \n ExtensionObject, ISecureChannel, MonitoredItemCreateRequest, MonitoringModeEnum, MonitoringParameters, \n NodeId, QualifiedName, ReadValueId, TimestampsToReturnEnum } from \"opcjs-base\";\nimport { AttrIdValue } from \"./attributeServiceAttributes\";\nimport { ServiceBase } from \"./serviceBase\";\n\nexport class MonitoredItemService extends ServiceBase {\n\n async createMonitoredItems(subscriptionId: number, ids: { id: NodeId, handle: number }[]): Promise<void> {\n const items = ids.map(ni => {\n const readValueId = new ReadValueId();\n readValueId.nodeId = ni.id;\n readValueId.attributeId = AttrIdValue;\n readValueId.indexRange = '';\n readValueId.dataEncoding = new QualifiedName(0, '');\n\n const monitoringParameters = new MonitoringParameters();\n monitoringParameters.clientHandle = ni.handle;\n monitoringParameters.samplingInterval = 1000; // 1 sec\n monitoringParameters.filter = ExtensionObject.newEmpty();\n monitoringParameters.queueSize = 100;\n monitoringParameters.discardOldest = true;\n\n const monitoredItemCreateRequest = new MonitoredItemCreateRequest();\n monitoredItemCreateRequest.itemToMonitor = readValueId;\n monitoredItemCreateRequest.monitoringMode = MonitoringModeEnum.Reporting;\n monitoredItemCreateRequest.requestedParameters = monitoringParameters;\n return monitoredItemCreateRequest; \n });\n\n const request = new CreateMonitoredItemsRequest();\n request.requestHeader = this.createRequestHeader();\n request.subscriptionId = subscriptionId;\n request.timestampsToReturn = TimestampsToReturnEnum.Source;\n request.itemsToCreate = items;\n\n console.log(\"Sending createMonitoredItems...\");\n await this.secureChannel.issueServiceRequest(request) as CreateMonitoredItemsResponse;\n // todo: handle Statuscodes\n }\n\n constructor(authToken: NodeId, secureChannel: ISecureChannel) {\n super(authToken, secureChannel)\n }\n}","import { CallMethodRequest, CallRequest, CallResponse, ISecureChannel, NodeId } from \"opcjs-base\";\nimport { ServiceBase } from \"./serviceBase\";\nimport { StatusCodeToString } from \"../../../base/src/types/statusCode\";\n\n// https://reference.opcfoundation.org/Core/Part4/v105/docs/5.11\nexport class MethodService extends ServiceBase {\n\n /**\n * Calls one or more methods on the server (OPC UA Part 4, Section 5.11.2).\n * @param methodsToCall - Array of CallMethodRequest describing each method to invoke.\n * @returns Array of CallMethodResult, one per requested method.\n */\n async call(methodsToCall: CallMethodRequest[]): Promise<{ status: string, value: unknown[] }[]> {\n const request = new CallRequest();\n request.requestHeader = this.createRequestHeader();\n request.methodsToCall = methodsToCall;\n\n const response = await this.secureChannel.issueServiceRequest(request) as CallResponse;\n return response.results.map(result => ({\n status: StatusCodeToString(result.statusCode),\n value: result.outputArguments.map(arg => arg.value)\n }));\n }\n\n constructor(authToken: NodeId, secureChannel: ISecureChannel) {\n super(authToken, secureChannel);\n }\n}\n","export class CallMethodResult {\n constructor(public values:unknown[], public status:string){}\n}","import {\n BrowseDescription, BrowseNextRequest, BrowseNextResponse,\n BrowseRequest, BrowseResponse, BrowseResult,\n ISecureChannel, NodeId, UaByteString, ViewDescription\n} from \"opcjs-base\";\nimport { ServiceBase } from \"./serviceBase\";\n\n// https://reference.opcfoundation.org/Core/Part4/v105/docs/5.9\nexport class BrowseService extends ServiceBase {\n\n async browse(nodesToBrowse: BrowseDescription[]): Promise<BrowseResult[]> {\n const view = new ViewDescription();\n view.viewId = NodeId.newNumeric(0, 0);\n view.timestamp = new Date(-11644473600000); // OPC UA MinDateTime (ticks=0)\n view.viewVersion = 0;\n\n const request = new BrowseRequest();\n request.requestHeader = this.createRequestHeader();\n request.view = view;\n request.requestedMaxReferencesPerNode = 0;\n request.nodesToBrowse = nodesToBrowse;\n\n const response = await this.secureChannel\n .issueServiceRequest(request) as BrowseResponse;\n return response.results ?? [];\n }\n\n async browseNext(\n continuationPoints: UaByteString[],\n releaseContinuationPoints: boolean,\n ): Promise<BrowseResult[]> {\n const request = new BrowseNextRequest();\n request.requestHeader = this.createRequestHeader();\n request.releaseContinuationPoints = releaseContinuationPoints;\n request.continuationPoints = continuationPoints;\n\n const response = await this.secureChannel\n .issueServiceRequest(request) as BrowseNextResponse;\n return response.results ?? [];\n }\n\n constructor(authToken: NodeId, secureChannel: ISecureChannel) {\n super(authToken, secureChannel);\n }\n}\n","import {\n ExpandedNodeId, LocalizedText, NodeClassEnum,\n NodeId, QualifiedName\n} from \"opcjs-base\";\n\nexport class BrowseNodeResult {\n constructor(\n public referenceTypeId: NodeId,\n public isForward: boolean,\n public nodeId: ExpandedNodeId,\n public browseName: QualifiedName,\n public displayName: LocalizedText,\n public nodeClass: NodeClassEnum,\n public typeDefinition: ExpandedNodeId,\n ) {}\n}\n","import {\n NodeId,\n TcpConnectionHandler,\n SecureChannelFacade,\n SecureChannelContext,\n SecureChannelMesssageEncoder,\n SecureChannelTypeDecoder,\n SecureChannelMessageDecoder,\n SecureChannelTypeEncoder,\n initLoggerProvider,\n TcpMessageInjector,\n TcpMessageDecoupler,\n getLogger,\n WebSocketFascade,\n WebSocketReadableStream,\n WebSocketWritableStream,\n SecureChannelChunkReader,\n SecureChannelChunkWriter,\n CallMethodRequest,\n Variant,\n BrowseDescription,\n BrowseDirectionEnum,\n BrowseResultMaskEnum,\n ReferenceDescription,\n} from \"opcjs-base\";\nimport { SessionHandler } from \"./sessions/sessionHandler\";\nimport { Session } from \"./sessions/session\";\nimport { AttributeService } from \"./services/attributeService\";\nimport { ReadValueResult } from \"./readValueResult\";\nimport { SubscriptionHandler } from \"./subscriptionHandler\";\nimport { SubscriptionService } from \"./services/subscriptionService\";\nimport { MonitoredItemService } from \"./services/monitoredItemService\";\nimport { UserIdentity } from \"./userIdentity\";\nimport { ConfigurationClient } from \"./configurationClient\";\nimport { ILogger } from \"opcjs-base\";\nimport { MethodService } from \"./services/methodService\";\nimport { CallMethodResult } from \"./callMethodResult\";\nimport { BrowseService } from \"./services/browseService\";\nimport { BrowseNodeResult } from \"./browseNodeResult\";\nimport { UaPrimitive } from \"../../base/src/types/primitives\";\n\nexport class Client {\n private endpointUrl: string;\n private attributeService?: AttributeService;\n private methodService?: MethodService;\n private browseService?: BrowseService;\n private session?: Session;\n private subscriptionHandler?: SubscriptionHandler;\n private logger: ILogger;\n\n getSession(): Session {\n if (!this.session) {\n throw new Error(\"No session available\");\n }\n return this.session;\n }\n\n async connect(): Promise<void> {\n\n const wsOptions = { endpoint: this.endpointUrl }\n const ws = new WebSocketFascade(wsOptions);\n const webSocketReadableStream = new WebSocketReadableStream(ws, 1000);\n const webSocketWritableStream = new WebSocketWritableStream(ws);\n\n const scContext = new SecureChannelContext(this.endpointUrl);\n const tcpMessageInjector = new TcpMessageInjector();\n const tcpConnectionHandler = new TcpConnectionHandler(tcpMessageInjector, scContext);\n const tcpMessageDecoupler = new TcpMessageDecoupler(tcpConnectionHandler.onTcpMessage.bind(tcpConnectionHandler));\n const scMessageEncoder = new SecureChannelMesssageEncoder(scContext);\n const scTypeDecoder = new SecureChannelTypeDecoder(\n this.configuration.decoder,\n );\n const scMessageDecoder = new SecureChannelMessageDecoder(scContext);\n const scTypeEncoder = new SecureChannelTypeEncoder(\n this.configuration.encoder,\n );\n const scChunkWriter = new SecureChannelChunkWriter(scContext);\n const scChunkReader = new SecureChannelChunkReader(scContext);\n\n webSocketReadableStream.pipeTo(tcpMessageDecoupler.writable);\n tcpMessageDecoupler.readable.pipeTo(scMessageDecoder.writable);\n scMessageDecoder.readable.pipeTo(scChunkReader.writable);\n scChunkReader.readable.pipeTo(scTypeDecoder.writable);\n\n scTypeEncoder.readable.pipeTo(scChunkWriter.writable);\n scChunkWriter.readable.pipeTo(scMessageEncoder.writable);\n scMessageEncoder.readable.pipeTo(tcpMessageInjector.writable);\n tcpMessageInjector.readable.pipeTo(webSocketWritableStream);\n\n const sc = new SecureChannelFacade(scContext, scTypeDecoder, scTypeEncoder);\n\n // const response = await sc.send(request, wsWritable);\n\n //const channel = ChannelFactory.createChannel(this.endpointUrl);\n let connected = false;\n while (!connected) {\n this.logger.debug(`Connecting to OPC UA server at ${this.endpointUrl}...`);\n await ws.connect();\n this.logger.debug(\"WebSocket connection established, now establishing TCP connection...\");\n connected = await tcpConnectionHandler.connect(this.endpointUrl);\n\n if (!connected) {\n this.logger.info(\"Connection failed, retrying in 2 seconds...\");\n await new Promise((resolve) => setTimeout(resolve, 2000));\n }\n }\n this.logger.info(\"Connected to OPC UA server.\");\n\n //this.channel = new SecureChannel(channel, this.configuration);\n this.logger.debug(\"Opening secure channel...\");\n await sc.openSecureChannel();\n this.logger.debug(\"Secure channel established.\");\n\n this.logger.debug(\"Creating session...\");\n const sessionHandler = new SessionHandler(sc, this.configuration);\n this.session = await sessionHandler.createNewSession(this.identity);\n this.logger.debug(\"Session created.\");\n\n this.logger.debug(\"Initializing services...\");\n this.attributeService = new AttributeService(this.session.getAuthToken(), sc);\n this.methodService = new MethodService(this.session.getAuthToken(), sc);\n this.browseService = new BrowseService(this.session.getAuthToken(), sc);\n this.subscriptionHandler = new SubscriptionHandler(\n new SubscriptionService(this.session.getAuthToken(), sc),\n new MonitoredItemService(this.session.getAuthToken(), sc),\n );\n }\n\n async disconnect(): Promise<void> {\n this.logger.info(\"Disconnecting from OPC UA server...\");\n // Implementation of disconnection logic goes here\n // if (this.channel) {\n // await this.channel.disconnect();\n // }\n }\n\n async read(ids: NodeId[]): Promise<ReadValueResult[]> {\n const result = await this.attributeService?.ReadValue(ids);\n return result?.map((r) => new ReadValueResult(r.value, r.status)) || [];\n }\n\n /**\n * Method for calling a single method on the server.\n * @param objectId - NodeId of the Object that owns the method.\n * @param methodId - NodeId of the Method to invoke.\n * @param inputArguments - Input argument Variants (default: empty).\n * @returns The CallMethodResult for the invoked method.\n */\n async callMethod(\n objectId: NodeId,\n methodId: NodeId,\n inputArguments: UaPrimitive[] = []\n ): Promise<CallMethodResult> {\n const request = new CallMethodRequest();\n request.objectId = objectId;\n request.methodId = methodId;\n request.inputArguments = inputArguments.map(arg => Variant.newFrom(arg));\n\n const responses = await this.methodService!.call([request]);\n const response = responses[0];\n\n return new CallMethodResult(response.value, response.status);\n }\n\n async browse(\n nodeId: NodeId,\n recursive: boolean = false,\n ): Promise<BrowseNodeResult[]> {\n const visited = new Set<string>();\n return this.browseRecursive(nodeId, recursive, visited);\n }\n\n private async browseRecursive(\n nodeId: NodeId,\n recursive: boolean,\n visited: Set<string>,\n ): Promise<BrowseNodeResult[]> {\n const nodeKey = `${nodeId.namespace}:${nodeId.identifier}`;\n if (visited.has(nodeKey)) {\n return [];\n }\n visited.add(nodeKey);\n\n const description = new BrowseDescription();\n description.nodeId = nodeId;\n description.browseDirection = BrowseDirectionEnum.Forward;\n description.referenceTypeId = NodeId.newNumeric(0, 33); // HierarchicalReferences\n description.includeSubtypes = true;\n description.nodeClassMask = 0; // all node classes\n description.resultMask = BrowseResultMaskEnum.All;\n\n const browseResults = await this.browseService!.browse([description]);\n const browseResult = browseResults[0];\n const allReferences = [...(browseResult.references ?? [])];\n\n let continuationPoint = browseResult.continuationPoint;\n while (continuationPoint && continuationPoint.byteLength > 0) {\n const nextResults = await this.browseService!\n .browseNext([continuationPoint], false);\n const nextResult = nextResults[0];\n allReferences.push(...(nextResult.references ?? []));\n continuationPoint = nextResult.continuationPoint;\n }\n\n const results = allReferences.map((ref: ReferenceDescription) =>\n new BrowseNodeResult(\n ref.referenceTypeId,\n ref.isForward,\n ref.nodeId,\n ref.browseName,\n ref.displayName,\n ref.nodeClass,\n ref.typeDefinition,\n )\n );\n\n if (recursive) {\n for (const ref of allReferences) {\n const childNodeId = NodeId.newNumeric(\n ref.nodeId.namespace,\n ref.nodeId.identifier as number,\n );\n const childResults = await this.browseRecursive(\n childNodeId, true, visited,\n );\n results.push(...childResults);\n }\n }\n\n return results;\n }\n\n async subscribe(\n ids: NodeId[],\n callback: (data: { id: NodeId; value: unknown }[]) => void,\n ) {\n this.subscriptionHandler?.subscribe(ids, callback);\n }\n\n constructor(\n endpointUrl: string,\n private configuration: ConfigurationClient,\n private identity: UserIdentity,\n ) {\n this.endpointUrl = endpointUrl;\n initLoggerProvider(configuration.loggerFactory);\n this.logger = getLogger(\"Client\");\n }\n}\n","import {\n BinaryReader,\n BinaryWriter,\n Configuration,\n Decoder,\n Encoder,\n ILoggerFactory,\n LoggerFactory,\n registerBinaryDecoders,\n registerEncoders,\n registerTypeDecoders\n} from \"opcjs-base\";\n\nexport class ConfigurationClient extends Configuration {\n public static getSimple(\n name: string,\n company: string,\n loggerFactory?: ILoggerFactory,\n ): ConfigurationClient {\n\n if (!loggerFactory) {\n loggerFactory = new LoggerFactory({\n defaultLevel: 'DEBUG', //todo: use enum\n categoryLevels: {\n \"transport.*\": \"TRACE\",\n \"secureChannel.*\": \"TRACE\",\n },\n });\n }\n const applicationUri = `urn:${company}:${name}`;\n const productUri = `urn:${company}:${name}:product`;\n\n const encoder = new Encoder();\n encoder.registerWriterFactory(\"binary\", () => {\n return new BinaryWriter();\n });\n registerEncoders(encoder);\n\n const decoder = new Decoder();\n decoder.registerReaderFactory(\"binary\", (data: unknown) => {\n return new BinaryReader(data as Uint8Array);\n });\n registerTypeDecoders(decoder);\n registerBinaryDecoders(decoder);\n\n return new ConfigurationClient(\n name,\n applicationUri,\n name,\n productUri,\n encoder,\n decoder,\n loggerFactory,\n );\n }\n\n constructor(\n applicationName: string,\n applicationUri: string,\n productName: string,\n productUri: string,\n encoder: Encoder,\n decoder: Decoder,\n loggerFactory: ILoggerFactory,\n ) {\n super(\n applicationName,\n applicationUri,\n productName,\n productUri,\n encoder,\n decoder,\n loggerFactory,\n );\n }\n}\n","import { IssuedIdentityToken, UserIdentityToken, UserNameIdentityToken, UserTokenTypeEnum } from \"opcjs-base\";\nimport { IssuerConfiguration } from \"./issuerConfiguration\";\nimport { IssuerToken } from \"./issuerToken\";\nimport { AnonymousIdentityToken } from \"opcjs-base\";\n\nexport class UserIdentity {\n private userIdentityToken?: UserIdentityToken;\n private tokenType = UserTokenTypeEnum.Anonymous;\n private issuerLoginCallback: ((config:IssuerConfiguration)=>Promise<IssuerToken>) | undefined = undefined;\n\n public static newAnonymous(): UserIdentity {\n const userIdentity = new UserIdentity();\n userIdentity.userIdentityToken = new AnonymousIdentityToken();\n userIdentity.userIdentityToken.policyId = \"anonymous\";\n userIdentity.tokenType = UserTokenTypeEnum.Anonymous;\n return userIdentity;\n }\n \n public static newWithUserName(userName: string, password: string): UserIdentity {\n const userIdentity = new UserIdentity();\n const nameToken = new UserNameIdentityToken();\n nameToken.userName = userName;\n nameToken.password = new TextEncoder().encode(password);\n\n userIdentity.userIdentityToken = nameToken;\n userIdentity.tokenType = UserTokenTypeEnum.UserName;\n return userIdentity;\n }\n\n public static newWithIssuerToken(loginCallback: (config:IssuerConfiguration)=>Promise<IssuerToken>): UserIdentity {\n const userIdentity = new UserIdentity();\n const issuedToken = new IssuedIdentityToken();\n issuedToken.tokenData = new TextEncoder().encode(\"\"); // token data will be filled by the login callback \n userIdentity.userIdentityToken = issuedToken;\n userIdentity.tokenType = UserTokenTypeEnum.IssuedToken;\n userIdentity.issuerLoginCallback = loginCallback;\n return userIdentity;\n }\n\n public getUserIdentityToken(): UserIdentityToken {\n return this.userIdentityToken as UserIdentityToken;\n }\n\n public getTokenType(): UserTokenTypeEnum {\n return this.tokenType;\n }\n\n public getIssuerLoginCallback(): ((config:IssuerConfiguration)=>Promise<IssuerToken>) {\n if(!this.issuerLoginCallback){\n throw new Error(\"No issuer login callback defined\");\n }\n \n return this.issuerLoginCallback;\n }\n}\n"]}
package/dist/index.d.cts CHANGED
@@ -1,4 +1,4 @@
1
- import { ISecureChannel, RequestHeader, NodeId, EndpointDescription, UserIdentityToken, Configuration, UserTokenTypeEnum, ILoggerFactory, Encoder, Decoder } from 'opcjs-base';
1
+ import { ISecureChannel, RequestHeader, NodeId, EndpointDescription, UserIdentityToken, Configuration, UserTokenTypeEnum, ILoggerFactory, Encoder, Decoder, ExpandedNodeId, QualifiedName, LocalizedText, NodeClassEnum } from 'opcjs-base';
2
2
 
3
3
  declare abstract class ServiceBase {
4
4
  private authToken;
@@ -85,6 +85,17 @@ declare class CallMethodResult {
85
85
  constructor(values: unknown[], status: string);
86
86
  }
87
87
 
88
+ declare class BrowseNodeResult {
89
+ referenceTypeId: NodeId;
90
+ isForward: boolean;
91
+ nodeId: ExpandedNodeId;
92
+ browseName: QualifiedName;
93
+ displayName: LocalizedText;
94
+ nodeClass: NodeClassEnum;
95
+ typeDefinition: ExpandedNodeId;
96
+ constructor(referenceTypeId: NodeId, isForward: boolean, nodeId: ExpandedNodeId, browseName: QualifiedName, displayName: LocalizedText, nodeClass: NodeClassEnum, typeDefinition: ExpandedNodeId);
97
+ }
98
+
88
99
  /**
89
100
  * Enumeration of variant types based on BuiltinType NodeIds.
90
101
  */
@@ -201,6 +212,7 @@ declare class Client {
201
212
  private endpointUrl;
202
213
  private attributeService?;
203
214
  private methodService?;
215
+ private browseService?;
204
216
  private session?;
205
217
  private subscriptionHandler?;
206
218
  private logger;
@@ -216,6 +228,8 @@ declare class Client {
216
228
  * @returns The CallMethodResult for the invoked method.
217
229
  */
218
230
  callMethod(objectId: NodeId, methodId: NodeId, inputArguments?: UaPrimitive[]): Promise<CallMethodResult>;
231
+ browse(nodeId: NodeId, recursive?: boolean): Promise<BrowseNodeResult[]>;
232
+ private browseRecursive;
219
233
  subscribe(ids: NodeId[], callback: (data: {
220
234
  id: NodeId;
221
235
  value: unknown;
@@ -223,4 +237,4 @@ declare class Client {
223
237
  constructor(endpointUrl: string, configuration: ConfigurationClient, identity: UserIdentity);
224
238
  }
225
239
 
226
- export { Client, ConfigurationClient, UserIdentity };
240
+ export { BrowseNodeResult, Client, ConfigurationClient, UserIdentity };
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { ISecureChannel, RequestHeader, NodeId, EndpointDescription, UserIdentityToken, Configuration, UserTokenTypeEnum, ILoggerFactory, Encoder, Decoder } from 'opcjs-base';
1
+ import { ISecureChannel, RequestHeader, NodeId, EndpointDescription, UserIdentityToken, Configuration, UserTokenTypeEnum, ILoggerFactory, Encoder, Decoder, ExpandedNodeId, QualifiedName, LocalizedText, NodeClassEnum } from 'opcjs-base';
2
2
 
3
3
  declare abstract class ServiceBase {
4
4
  private authToken;
@@ -85,6 +85,17 @@ declare class CallMethodResult {
85
85
  constructor(values: unknown[], status: string);
86
86
  }
87
87
 
88
+ declare class BrowseNodeResult {
89
+ referenceTypeId: NodeId;
90
+ isForward: boolean;
91
+ nodeId: ExpandedNodeId;
92
+ browseName: QualifiedName;
93
+ displayName: LocalizedText;
94
+ nodeClass: NodeClassEnum;
95
+ typeDefinition: ExpandedNodeId;
96
+ constructor(referenceTypeId: NodeId, isForward: boolean, nodeId: ExpandedNodeId, browseName: QualifiedName, displayName: LocalizedText, nodeClass: NodeClassEnum, typeDefinition: ExpandedNodeId);
97
+ }
98
+
88
99
  /**
89
100
  * Enumeration of variant types based on BuiltinType NodeIds.
90
101
  */
@@ -201,6 +212,7 @@ declare class Client {
201
212
  private endpointUrl;
202
213
  private attributeService?;
203
214
  private methodService?;
215
+ private browseService?;
204
216
  private session?;
205
217
  private subscriptionHandler?;
206
218
  private logger;
@@ -216,6 +228,8 @@ declare class Client {
216
228
  * @returns The CallMethodResult for the invoked method.
217
229
  */
218
230
  callMethod(objectId: NodeId, methodId: NodeId, inputArguments?: UaPrimitive[]): Promise<CallMethodResult>;
231
+ browse(nodeId: NodeId, recursive?: boolean): Promise<BrowseNodeResult[]>;
232
+ private browseRecursive;
219
233
  subscribe(ids: NodeId[], callback: (data: {
220
234
  id: NodeId;
221
235
  value: unknown;
@@ -223,4 +237,4 @@ declare class Client {
223
237
  constructor(endpointUrl: string, configuration: ConfigurationClient, identity: UserIdentity);
224
238
  }
225
239
 
226
- export { Client, ConfigurationClient, UserIdentity };
240
+ export { BrowseNodeResult, Client, ConfigurationClient, UserIdentity };
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, NodeId, ReadValueId, QualifiedName, ReadRequest, TimestampsToReturnEnum, CallRequest, SubscriptionAcknowledgement, CreateSubscriptionRequest, PublishRequest, MonitoringParameters, ExtensionObject, MonitoredItemCreateRequest, MonitoringModeEnum, CreateMonitoredItemsRequest, ApplicationDescription, LocalizedText, ApplicationTypeEnum, CreateSessionRequest, CreateSessionResponse, SignatureData, ActivateSessionRequest, RequestHeader } from 'opcjs-base';
1
+ import { initLoggerProvider, getLogger, WebSocketFascade, WebSocketReadableStream, WebSocketWritableStream, SecureChannelContext, TcpMessageInjector, TcpConnectionHandler, TcpMessageDecoupler, SecureChannelMesssageEncoder, SecureChannelTypeDecoder, SecureChannelMessageDecoder, SecureChannelTypeEncoder, SecureChannelChunkWriter, SecureChannelChunkReader, SecureChannelFacade, CallMethodRequest, Variant, BrowseDescription, BrowseDirectionEnum, NodeId, BrowseResultMaskEnum, Configuration, LoggerFactory, Encoder, BinaryWriter, registerEncoders, Decoder, BinaryReader, registerTypeDecoders, registerBinaryDecoders, UserTokenTypeEnum, AnonymousIdentityToken, UserNameIdentityToken, IssuedIdentityToken, ReadValueId, QualifiedName, ReadRequest, TimestampsToReturnEnum, CallRequest, ViewDescription, BrowseRequest, BrowseNextRequest, SubscriptionAcknowledgement, CreateSubscriptionRequest, PublishRequest, MonitoringParameters, ExtensionObject, MonitoredItemCreateRequest, MonitoringModeEnum, CreateMonitoredItemsRequest, ApplicationDescription, LocalizedText, ApplicationTypeEnum, CreateSessionRequest, CreateSessionResponse, SignatureData, ActivateSessionRequest, RequestHeader } from 'opcjs-base';
2
2
 
3
3
  // src/client.ts
4
4
  var ServiceBase = class {
@@ -634,6 +634,45 @@ var CallMethodResult = class {
634
634
  this.status = status;
635
635
  }
636
636
  };
637
+ var BrowseService = class extends ServiceBase {
638
+ async browse(nodesToBrowse) {
639
+ const view = new ViewDescription();
640
+ view.viewId = NodeId.newNumeric(0, 0);
641
+ view.timestamp = /* @__PURE__ */ new Date(-116444736e5);
642
+ view.viewVersion = 0;
643
+ const request = new BrowseRequest();
644
+ request.requestHeader = this.createRequestHeader();
645
+ request.view = view;
646
+ request.requestedMaxReferencesPerNode = 0;
647
+ request.nodesToBrowse = nodesToBrowse;
648
+ const response = await this.secureChannel.issueServiceRequest(request);
649
+ return response.results ?? [];
650
+ }
651
+ async browseNext(continuationPoints, releaseContinuationPoints) {
652
+ const request = new BrowseNextRequest();
653
+ request.requestHeader = this.createRequestHeader();
654
+ request.releaseContinuationPoints = releaseContinuationPoints;
655
+ request.continuationPoints = continuationPoints;
656
+ const response = await this.secureChannel.issueServiceRequest(request);
657
+ return response.results ?? [];
658
+ }
659
+ constructor(authToken, secureChannel) {
660
+ super(authToken, secureChannel);
661
+ }
662
+ };
663
+
664
+ // src/browseNodeResult.ts
665
+ var BrowseNodeResult = class {
666
+ constructor(referenceTypeId, isForward, nodeId, browseName, displayName, nodeClass, typeDefinition) {
667
+ this.referenceTypeId = referenceTypeId;
668
+ this.isForward = isForward;
669
+ this.nodeId = nodeId;
670
+ this.browseName = browseName;
671
+ this.displayName = displayName;
672
+ this.nodeClass = nodeClass;
673
+ this.typeDefinition = typeDefinition;
674
+ }
675
+ };
637
676
 
638
677
  // src/client.ts
639
678
  var Client = class {
@@ -647,6 +686,7 @@ var Client = class {
647
686
  endpointUrl;
648
687
  attributeService;
649
688
  methodService;
689
+ browseService;
650
690
  session;
651
691
  subscriptionHandler;
652
692
  logger;
@@ -706,6 +746,7 @@ var Client = class {
706
746
  this.logger.debug("Initializing services...");
707
747
  this.attributeService = new AttributeService(this.session.getAuthToken(), sc);
708
748
  this.methodService = new MethodService(this.session.getAuthToken(), sc);
749
+ this.browseService = new BrowseService(this.session.getAuthToken(), sc);
709
750
  this.subscriptionHandler = new SubscriptionHandler(
710
751
  new SubscriptionService(this.session.getAuthToken(), sc),
711
752
  new MonitoredItemService(this.session.getAuthToken(), sc)
@@ -734,6 +775,60 @@ var Client = class {
734
775
  const response = responses[0];
735
776
  return new CallMethodResult(response.value, response.status);
736
777
  }
778
+ async browse(nodeId, recursive = false) {
779
+ const visited = /* @__PURE__ */ new Set();
780
+ return this.browseRecursive(nodeId, recursive, visited);
781
+ }
782
+ async browseRecursive(nodeId, recursive, visited) {
783
+ const nodeKey = `${nodeId.namespace}:${nodeId.identifier}`;
784
+ if (visited.has(nodeKey)) {
785
+ return [];
786
+ }
787
+ visited.add(nodeKey);
788
+ const description = new BrowseDescription();
789
+ description.nodeId = nodeId;
790
+ description.browseDirection = BrowseDirectionEnum.Forward;
791
+ description.referenceTypeId = NodeId.newNumeric(0, 33);
792
+ description.includeSubtypes = true;
793
+ description.nodeClassMask = 0;
794
+ description.resultMask = BrowseResultMaskEnum.All;
795
+ const browseResults = await this.browseService.browse([description]);
796
+ const browseResult = browseResults[0];
797
+ const allReferences = [...browseResult.references ?? []];
798
+ let continuationPoint = browseResult.continuationPoint;
799
+ while (continuationPoint && continuationPoint.byteLength > 0) {
800
+ const nextResults = await this.browseService.browseNext([continuationPoint], false);
801
+ const nextResult = nextResults[0];
802
+ allReferences.push(...nextResult.references ?? []);
803
+ continuationPoint = nextResult.continuationPoint;
804
+ }
805
+ const results = allReferences.map(
806
+ (ref) => new BrowseNodeResult(
807
+ ref.referenceTypeId,
808
+ ref.isForward,
809
+ ref.nodeId,
810
+ ref.browseName,
811
+ ref.displayName,
812
+ ref.nodeClass,
813
+ ref.typeDefinition
814
+ )
815
+ );
816
+ if (recursive) {
817
+ for (const ref of allReferences) {
818
+ const childNodeId = NodeId.newNumeric(
819
+ ref.nodeId.namespace,
820
+ ref.nodeId.identifier
821
+ );
822
+ const childResults = await this.browseRecursive(
823
+ childNodeId,
824
+ true,
825
+ visited
826
+ );
827
+ results.push(...childResults);
828
+ }
829
+ }
830
+ return results;
831
+ }
737
832
  async subscribe(ids, callback) {
738
833
  this.subscriptionHandler?.subscribe(ids, callback);
739
834
  }
@@ -828,6 +923,6 @@ var UserIdentity = class _UserIdentity {
828
923
  }
829
924
  };
830
925
 
831
- export { Client, ConfigurationClient, UserIdentity };
926
+ export { BrowseNodeResult, Client, ConfigurationClient, UserIdentity };
832
927
  //# sourceMappingURL=index.js.map
833
928
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/services/serviceBase.ts","../src/services/sessionService.ts","../src/issuerConfiguration.ts","../src/sessions/session.ts","../src/sessions/sessionHandler.ts","../src/services/attributeServiceAttributes.ts","../../base/src/types/statusCode.ts","../src/services/attributeService.ts","../src/readValueResult.ts","../src/subscriptionHandlerEntry.ts","../src/subscriptionHandler.ts","../src/services/subscriptionService.ts","../src/services/monitoredItemService.ts","../src/services/methodService.ts","../src/callMethodResult.ts","../src/client.ts","../src/configurationClient.ts","../src/userIdentity.ts"],"names":["ExtensionObject","NodeId","StatusCode","ReadValueId","QualifiedName","TimestampsToReturnEnum","getLogger","CallMethodRequest","Configuration","UserTokenTypeEnum","IssuedIdentityToken"],"mappings":"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","file":"index.js","sourcesContent":["import { ExtensionObject, ISecureChannel, NodeId, RequestHeader } from \"opcjs-base\";\n\nexport abstract class ServiceBase{\n\n\n protected createRequestHeader(): RequestHeader {\n const requestHeader = new RequestHeader();\n requestHeader.authenticationToken = this.authToken;\n requestHeader.timestamp = new Date();\n requestHeader.requestHandle = 0; // will be set by secure channel\n requestHeader.returnDiagnostics = 0;\n requestHeader.auditEntryId = '';\n requestHeader.timeoutHint = 60000;\n requestHeader.additionalHeader = ExtensionObject.newEmpty();\n\n return requestHeader;\n }\n \n constructor(private authToken: NodeId, protected secureChannel: ISecureChannel){}\n}","import {\n ActivateSessionRequest, ApplicationDescription, ApplicationTypeEnum,\n Configuration, CreateSessionRequest, CreateSessionResponse, EndpointDescription, ExtensionObject,\n getLogger,\n ISecureChannel, LocalizedText, NodeId, SignatureData, SignedSoftwareCertificate, UserIdentityToken\n} from \"opcjs-base\";\nimport { ServiceBase } from \"./serviceBase\";\n\nexport class SessionService extends ServiceBase {\n private logger = getLogger(\"services.SessionService\");\n async createSession(): Promise<{ sessionId: number, authToken: NodeId, endpoint: EndpointDescription }> {\n this.logger.debug(\"Creating session...\");\n\n const clientDescription = new ApplicationDescription();\n clientDescription.applicationUri = this.configuration.applicationUri;\n clientDescription.productUri = this.configuration.productUri;\n clientDescription.applicationName = new LocalizedText(undefined, this.configuration.productName);\n clientDescription.applicationType = ApplicationTypeEnum.Client;\n clientDescription.gatewayServerUri = '';\n clientDescription.discoveryProfileUri = '';\n clientDescription.discoveryUrls = new Array<string>();\n\n const request = new CreateSessionRequest();\n request.requestHeader = this.createRequestHeader();\n request.clientDescription = clientDescription;\n request.serverUri = '';\n request.endpointUrl = this.secureChannel.getEndpointUrl();\n request.sessionName = '';\n request.clientNonce = null;\n request.clientCertificate = null;\n request.requestedSessionTimeout = 60000;\n request.maxResponseMessageSize = 0;\n\n\n // todo: verify endpoints\n // todo: check application uri in server certificate\n\n this.logger.debug(\"Sending CreateSessionRequest...\");\n const response = await this.secureChannel.issueServiceRequest(request);\n if (!response || !(response instanceof CreateSessionResponse)) {\n throw new Error(\"Invalid response type for CreateSessionRequest\");\n }\n\n const castedResponse = response as CreateSessionResponse;\n if (!castedResponse || !castedResponse.sessionId || !castedResponse.authenticationToken) {\n throw new Error(\"CreateSessionResponse missing SessionId or AuthenticationToken\");\n }\n\n const endpoint = 'opc.' + this.secureChannel.getEndpointUrl();\n const endpointUrl = new URL(endpoint);\n const securityMode = this.secureChannel.getSecurityMode();\n const securityPolicyUri = this.secureChannel.getSecurityPolicy(); // todo: does not work with localhost. Not sure why.\n\n const serverEndpoint = castedResponse\n ?.serverEndpoints\n ?.find(currentEndpoint => {\n const currentEndpointUrl = new URL(currentEndpoint.endpointUrl as string);\n\n return currentEndpointUrl.protocol === endpointUrl.protocol\n && currentEndpointUrl.pathname === endpointUrl.pathname\n && currentEndpointUrl.port === endpointUrl.port\n && currentEndpoint.securityMode === securityMode\n && currentEndpoint.securityPolicyUri === securityPolicyUri});\n\n if (!serverEndpoint) {\n throw new Error(`Server endpoint ${endpoint} not found in CreateSessionResponse`);\n }\n\n this.logger.debug(\"Session created with id:\", castedResponse.sessionId.identifier);\n return {\n sessionId: castedResponse.sessionId.identifier as number,\n authToken: castedResponse.authenticationToken,\n endpoint: serverEndpoint\n };\n }\n\n async activateSession(identityToken: UserIdentityToken): Promise<void> {\n const signatureData = new SignatureData();\n signatureData.algorithm = this.secureChannel.getSecurityPolicy();\n signatureData.signature = new Uint8Array(0);\n\n const request = new ActivateSessionRequest();\n request.requestHeader = this.createRequestHeader();\n request.clientSignature = signatureData;\n request.clientSoftwareCertificates = new Array<SignedSoftwareCertificate>();\n request.localeIds = ['en-US'];\n request.userIdentityToken = ExtensionObject.newBinary(identityToken);\n request.userTokenSignature = signatureData;\n\n this.logger.debug(\"Sending ActivateSessionRequest...\");\n await this.secureChannel.issueServiceRequest(request);\n this.logger.debug(\"Session activated.\");\n }\n\n recreate(authToken: NodeId): SessionService {\n return new SessionService(authToken, this.secureChannel, this.configuration)\n }\n\n constructor(authToken: NodeId, secureChannel: ISecureChannel, private configuration: Configuration) {\n super(authToken, secureChannel)\n }\n}","interface IssuerEndpointUrl {\n 'ua.resourceId': string;\n 'ua.authorityUrl': string;\n 'ua.authorityProfileUri': string;\n 'ua.tokenEndpoint': string;\n 'ua.authorizationEndpoint': string;\n 'ua.requestTypes': string[];\n 'ua.scopes': string[];\n}\n\nexport class IssuerConfiguration{\n public static newFrom(issuerEndpointUrl: IssuerEndpointUrl): IssuerConfiguration {\n return new IssuerConfiguration(\n issuerEndpointUrl['ua.resourceId'],\n issuerEndpointUrl['ua.authorityUrl'],\n issuerEndpointUrl['ua.authorityProfileUri'],\n issuerEndpointUrl['ua.tokenEndpoint'],\n issuerEndpointUrl['ua.authorizationEndpoint'],\n issuerEndpointUrl['ua.requestTypes'],\n issuerEndpointUrl['ua.scopes']\n );\n }\n \n constructor(\n public resourceId: string,\n public authorityUrl: string,\n public authorityProfileUri: string,\n public tokenEndpoint: string,\n public authorizationEndpoint: string,\n public requestTypes: string[],\n public scopes: string[]\n ){\n \n }\n}","import { EndpointDescription, IssuedIdentityToken, NodeId, UserTokenTypeEnum } from \"opcjs-base\";\nimport { IssuerConfiguration } from \"../issuerConfiguration\";\nimport { SessionService } from \"../services/sessionService\";\nimport { UserIdentity } from \"../userIdentity\";\n\nexport class Session {\n async activateSession(identity: UserIdentity): Promise<void> {\n const token = identity.getUserIdentityToken();\n const tokenType = identity.getTokenType();\n const tokenPolicy = this.endpoint.userIdentityTokens?.find(t => t.tokenType === tokenType);\n if (!tokenPolicy) {\n throw new Error(`UserIdentityToken of type ${tokenType} not supported by server`);\n }\n token.policyId = tokenPolicy.policyId;\n\n if (tokenType === UserTokenTypeEnum.IssuedToken) {\n if (!tokenPolicy.issuerEndpointUrl) {\n throw new Error(\"IssuerEndpointUrl not defined for IssuedToken\");\n }\n const issuerEndpointUrl = JSON.parse(tokenPolicy.issuerEndpointUrl)\n const issuerConfig = IssuerConfiguration.newFrom(issuerEndpointUrl);\n\n const issuerLoginCallback = identity.getIssuerLoginCallback();\n const tokenData = await issuerLoginCallback(issuerConfig);\n\n const issuerToken = token as IssuedIdentityToken;\n issuerToken.tokenData = new TextEncoder().encode(tokenData.json);\n }\n\n await this.sessionServices.activateSession(token);\n }\n\n getAuthToken(): NodeId {\n return this.authToken;\n }\n\n constructor(\n public sessionId: number,\n private authToken: NodeId,\n private endpoint: EndpointDescription,\n private sessionServices: SessionService) { }\n}","import { ConfigurationClient } from \"../configurationClient\";\nimport { ISecureChannel, NodeId } from \"opcjs-base\";\nimport { SessionService } from \"../services/sessionService\";\nimport { UserIdentity } from \"../userIdentity\";\nimport { Session } from \"./session\";\n\nexport class SessionHandler {\n private sessionServices: SessionService;\n async createNewSession(identity:UserIdentity) : Promise<Session>{\n const ret = await this.sessionServices.createSession();\n this.sessionServices = this.sessionServices.recreate(ret.authToken)\n\n const session = new Session(ret.sessionId, ret.authToken, ret.endpoint, this.sessionServices);\n await session.activateSession(identity);\n return session;\n }\n\n constructor(secureChannel:ISecureChannel, configuration: ConfigurationClient) {\n this.sessionServices = new SessionService(NodeId.newTwoByte(0), secureChannel, configuration);\n }\n}","// according to https://reference.opcfoundation.org/Core/Part6/v105/docs/A.1\n// see also: https://reference.opcfoundation.org/Core/Part4/v105/docs/7.24.1#Table154\n\nexport const AttrIdNodeId = 1\nexport const AttrIdNodeClass = 2\nexport const AttrIdBrowseName = 3\nexport const AttrIdDisplayName = 4\nexport const AttrIdDescription = 5\nexport const AttrIdWriteMask = 6\nexport const AttrIdUserWriteMask = 7\nexport const AttrIdIsAbstract = 8\nexport const AttrIdSymmetric = 9\nexport const AttrIdInverseName = 10\nexport const AttrIdContainsNoLoops = 11\nexport const AttrIdEventNotifier = 12\nexport const AttrIdValue = 13\nexport const AttrIdDataType = 14\nexport const AttrIdValueRank = 15\nexport const AttrIdArrayDimensions = 16\nexport const AttrIdAccessLevel = 17\nexport const AttrIdUserAccessLevel = 18\nexport const AttrIdMinimumSamplingInterval = 19\nexport const AttrIdHistorizing = 20\nexport const AttrIdExecutable = 21\nexport const AttrIdUserExecutable = 22\nexport const AttrIdDataTypeDefinition = 23\nexport const AttrIdRolePermissions = 24\nexport const AttrIdUserRolePermissions = 25\nexport const AttrIdAccessRestrictions = 26\nexport const AttrIdAccessLevelEx = 27\n","/**\n * OPC UA StatusCode Type (i=19)\n * \n * StatusCode is a 32-bit unsigned integer that indicates the quality of a result.\n * The format is: [Severity:2][SubCode:14][Code:16]\n * \n * @see OPC UA Part 4, Section 7.34\n * @see OPC UA Part 6, Section 5.1.1\n */\n\nimport { BuiltInType } from \"./builtinType\";\n\nexport function StatusCodeToString(statusCode?: number): string {\n if (statusCode === undefined) {\n return 'Unknown';\n }\n const name = (Object.entries(StatusCode) as [string, number][])\n .find(([, v]) => v === statusCode)?.[0];\n return name ?? `0x${statusCode.toString(16).toUpperCase().padStart(8, '0')}`;\n}\n\nexport type UaStatusCode = {value: StatusCode; readonly type: BuiltInType.StatusCode };\nexport const uaStatusCode = (value: StatusCode): UaStatusCode => ({ value, type: BuiltInType.StatusCode });\n\nexport enum StatusCode {\n Good = 0x0 as number,\n Uncertain = 0x40000000 as number,\n Bad = 0x80000000 as number,\n BadUnexpectedError = 0x80010000 as number,\n BadInternalError = 0x80020000 as number,\n BadOutOfMemory = 0x80030000 as number,\n BadResourceUnavailable = 0x80040000 as number,\n BadCommunicationError = 0x80050000 as number,\n BadEncodingError = 0x80060000 as number,\n BadDecodingError = 0x80070000 as number,\n BadEncodingLimitsExceeded = 0x80080000 as number,\n BadRequestTooLarge = 0x80b80000 as number,\n BadResponseTooLarge = 0x80b90000 as number,\n BadUnknownResponse = 0x80090000 as number,\n BadTimeout = 0x800a0000 as number,\n BadServiceUnsupported = 0x800b0000 as number,\n BadShutdown = 0x800c0000 as number,\n BadServerNotConnected = 0x800d0000 as number,\n BadServerHalted = 0x800e0000 as number,\n BadNothingToDo = 0x800f0000 as number,\n BadTooManyOperations = 0x80100000 as number,\n BadTooManyMonitoredItems = 0x80db0000 as number,\n BadDataTypeIdUnknown = 0x80110000 as number,\n BadCertificateInvalid = 0x80120000 as number,\n BadSecurityChecksFailed = 0x80130000 as number,\n BadCertificatePolicyCheckFailed = 0x81140000 as number,\n BadCertificateTimeInvalid = 0x80140000 as number,\n BadCertificateIssuerTimeInvalid = 0x80150000 as number,\n BadCertificateHostNameInvalid = 0x80160000 as number,\n BadCertificateUriInvalid = 0x80170000 as number,\n BadCertificateUseNotAllowed = 0x80180000 as number,\n BadCertificateIssuerUseNotAllowed = 0x80190000 as number,\n BadCertificateUntrusted = 0x801a0000 as number,\n BadCertificateRevocationUnknown = 0x801b0000 as number,\n BadCertificateIssuerRevocationUnknown = 0x801c0000 as number,\n BadCertificateRevoked = 0x801d0000 as number,\n BadCertificateIssuerRevoked = 0x801e0000 as number,\n BadCertificateChainIncomplete = 0x810d0000 as number,\n BadUserAccessDenied = 0x801f0000 as number,\n BadIdentityTokenInvalid = 0x80200000 as number,\n BadIdentityTokenRejected = 0x80210000 as number,\n BadSecureChannelIdInvalid = 0x80220000 as number,\n BadInvalidTimestamp = 0x80230000 as number,\n BadNonceInvalid = 0x80240000 as number,\n BadSessionIdInvalid = 0x80250000 as number,\n BadSessionClosed = 0x80260000 as number,\n BadSessionNotActivated = 0x80270000 as number,\n BadSubscriptionIdInvalid = 0x80280000 as number,\n BadRequestHeaderInvalid = 0x802a0000 as number,\n BadTimestampsToReturnInvalid = 0x802b0000 as number,\n BadRequestCancelledByClient = 0x802c0000 as number,\n BadTooManyArguments = 0x80e50000 as number,\n BadLicenseExpired = 0x810e0000 as number,\n BadLicenseLimitsExceeded = 0x810f0000 as number,\n BadLicenseNotAvailable = 0x81100000 as number,\n GoodSubscriptionTransferred = 0x002d0000 as number,\n GoodCompletesAsynchronously = 0x002e0000 as number,\n GoodOverload = 0x002f0000 as number,\n GoodClamped = 0x00300000 as number,\n BadNoCommunication = 0x80310000 as number,\n BadWaitingForInitialData = 0x80320000 as number,\n BadNodeIdInvalid = 0x80330000 as number,\n BadNodeIdUnknown = 0x80340000 as number,\n BadAttributeIdInvalid = 0x80350000 as number,\n BadIndexRangeInvalid = 0x80360000 as number,\n BadIndexRangeNoData = 0x80370000 as number,\n BadDataEncodingInvalid = 0x80380000 as number,\n BadDataEncodingUnsupported = 0x80390000 as number,\n BadNotReadable = 0x803a0000 as number,\n BadNotWritable = 0x803b0000 as number,\n BadOutOfRange = 0x803c0000 as number,\n BadNotSupported = 0x803d0000 as number,\n BadNotFound = 0x803e0000 as number,\n BadObjectDeleted = 0x803f0000 as number,\n BadNotImplemented = 0x80400000 as number,\n BadMonitoringModeInvalid = 0x80410000 as number,\n BadMonitoredItemIdInvalid = 0x80420000 as number,\n BadMonitoredItemFilterInvalid = 0x80430000 as number,\n BadMonitoredItemFilterUnsupported = 0x80440000 as number,\n BadFilterNotAllowed = 0x80450000 as number,\n BadStructureMissing = 0x80460000 as number,\n BadEventFilterInvalid = 0x80470000 as number,\n BadContentFilterInvalid = 0x80480000 as number,\n BadFilterOperatorInvalid = 0x80c10000 as number,\n BadFilterOperatorUnsupported = 0x80c20000 as number,\n BadFilterOperandCountMismatch = 0x80c30000 as number,\n BadFilterOperandInvalid = 0x80490000 as number,\n BadFilterElementInvalid = 0x80c40000 as number,\n BadFilterLiteralInvalid = 0x80c50000 as number,\n BadContinuationPointInvalid = 0x804a0000 as number,\n BadNoContinuationPoints = 0x804b0000 as number,\n BadReferenceTypeIdInvalid = 0x804c0000 as number,\n BadBrowseDirectionInvalid = 0x804d0000 as number,\n BadNodeNotInView = 0x804e0000 as number,\n BadNumericOverflow = 0x81120000 as number,\n BadServerUriInvalid = 0x804f0000 as number,\n BadServerNameMissing = 0x80500000 as number,\n BadDiscoveryUrlMissing = 0x80510000 as number,\n BadSempahoreFileMissing = 0x80520000 as number,\n BadRequestTypeInvalid = 0x80530000 as number,\n BadSecurityModeRejected = 0x80540000 as number,\n BadSecurityPolicyRejected = 0x80550000 as number,\n BadTooManySessions = 0x80560000 as number,\n BadUserSignatureInvalid = 0x80570000 as number,\n BadApplicationSignatureInvalid = 0x80580000 as number,\n BadNoValidCertificates = 0x80590000 as number,\n BadIdentityChangeNotSupported = 0x80c60000 as number,\n BadRequestCancelledByRequest = 0x805a0000 as number,\n BadParentNodeIdInvalid = 0x805b0000 as number,\n BadReferenceNotAllowed = 0x805c0000 as number,\n BadNodeIdRejected = 0x805d0000 as number,\n BadNodeIdExists = 0x805e0000 as number,\n BadNodeClassInvalid = 0x805f0000 as number,\n BadBrowseNameInvalid = 0x80600000 as number,\n BadBrowseNameDuplicated = 0x80610000 as number,\n BadNodeAttributesInvalid = 0x80620000 as number,\n BadTypeDefinitionInvalid = 0x80630000 as number,\n BadSourceNodeIdInvalid = 0x80640000 as number,\n BadTargetNodeIdInvalid = 0x80650000 as number,\n BadDuplicateReferenceNotAllowed = 0x80660000 as number,\n BadInvalidSelfReference = 0x80670000 as number,\n BadReferenceLocalOnly = 0x80680000 as number,\n BadNoDeleteRights = 0x80690000 as number,\n UncertainReferenceNotDeleted = 0x40bc0000 as number,\n BadServerIndexInvalid = 0x806a0000 as number,\n BadViewIdUnknown = 0x806b0000 as number,\n BadViewTimestampInvalid = 0x80c90000 as number,\n BadViewParameterMismatch = 0x80ca0000 as number,\n BadViewVersionInvalid = 0x80cb0000 as number,\n UncertainNotAllNodesAvailable = 0x40c00000 as number,\n GoodResultsMayBeIncomplete = 0x00ba0000 as number,\n BadNotTypeDefinition = 0x80c80000 as number,\n UncertainReferenceOutOfServer = 0x406c0000 as number,\n BadTooManyMatches = 0x806d0000 as number,\n BadQueryTooComplex = 0x806e0000 as number,\n BadNoMatch = 0x806f0000 as number,\n BadMaxAgeInvalid = 0x80700000 as number,\n BadSecurityModeInsufficient = 0x80e60000 as number,\n BadHistoryOperationInvalid = 0x80710000 as number,\n BadHistoryOperationUnsupported = 0x80720000 as number,\n BadInvalidTimestampArgument = 0x80bd0000 as number,\n BadWriteNotSupported = 0x80730000 as number,\n BadTypeMismatch = 0x80740000 as number,\n BadMethodInvalid = 0x80750000 as number,\n BadArgumentsMissing = 0x80760000 as number,\n BadNotExecutable = 0x81110000 as number,\n BadTooManySubscriptions = 0x80770000 as number,\n BadTooManyPublishRequests = 0x80780000 as number,\n BadNoSubscription = 0x80790000 as number,\n BadSequenceNumberUnknown = 0x807a0000 as number,\n BadMessageNotAvailable = 0x807b0000 as number,\n BadInsufficientClientProfile = 0x807c0000 as number,\n BadStateNotActive = 0x80bf0000 as number,\n BadAlreadyExists = 0x81150000 as number,\n BadTcpServerTooBusy = 0x807d0000 as number,\n BadTcpMessageTypeInvalid = 0x807e0000 as number,\n BadTcpSecureChannelUnknown = 0x807f0000 as number,\n BadTcpMessageTooLarge = 0x80800000 as number,\n BadTcpNotEnoughResources = 0x80810000 as number,\n BadTcpInternalError = 0x80820000 as number,\n BadTcpEndpointUrlInvalid = 0x80830000 as number,\n BadRequestInterrupted = 0x80840000 as number,\n BadRequestTimeout = 0x80850000 as number,\n BadSecureChannelClosed = 0x80860000 as number,\n BadSecureChannelTokenUnknown = 0x80870000 as number,\n BadSequenceNumberInvalid = 0x80880000 as number,\n BadProtocolVersionUnsupported = 0x80be0000 as number,\n BadConfigurationError = 0x80890000 as number,\n BadNotConnected = 0x808a0000 as number,\n BadDeviceFailure = 0x808b0000 as number,\n BadSensorFailure = 0x808c0000 as number,\n BadOutOfService = 0x808d0000 as number,\n BadDeadbandFilterInvalid = 0x808e0000 as number,\n UncertainNoCommunicationLastUsableValue = 0x408f0000 as number,\n UncertainLastUsableValue = 0x40900000 as number,\n UncertainSubstituteValue = 0x40910000 as number,\n UncertainInitialValue = 0x40920000 as number,\n UncertainSensorNotAccurate = 0x40930000 as number,\n UncertainEngineeringUnitsExceeded = 0x40940000 as number,\n UncertainSubNormal = 0x40950000 as number,\n GoodLocalOverride = 0x00960000 as number,\n BadRefreshInProgress = 0x80970000 as number,\n BadConditionAlreadyDisabled = 0x80980000 as number,\n BadConditionAlreadyEnabled = 0x80cc0000 as number,\n BadConditionDisabled = 0x80990000 as number,\n BadEventIdUnknown = 0x809a0000 as number,\n BadEventNotAcknowledgeable = 0x80bb0000 as number,\n BadDialogNotActive = 0x80cd0000 as number,\n BadDialogResponseInvalid = 0x80ce0000 as number,\n BadConditionBranchAlreadyAcked = 0x80cf0000 as number,\n BadConditionBranchAlreadyConfirmed = 0x80d00000 as number,\n BadConditionAlreadyShelved = 0x80d10000 as number,\n BadConditionNotShelved = 0x80d20000 as number,\n BadShelvingTimeOutOfRange = 0x80d30000 as number,\n BadNoData = 0x809b0000 as number,\n BadBoundNotFound = 0x80d70000 as number,\n BadBoundNotSupported = 0x80d80000 as number,\n BadDataLost = 0x809d0000 as number,\n BadDataUnavailable = 0x809e0000 as number,\n BadEntryExists = 0x809f0000 as number,\n BadNoEntryExists = 0x80a00000 as number,\n BadTimestampNotSupported = 0x80a10000 as number,\n GoodEntryInserted = 0x00a20000 as number,\n GoodEntryReplaced = 0x00a30000 as number,\n UncertainDataSubNormal = 0x40a40000 as number,\n GoodNoData = 0x00a50000 as number,\n GoodMoreData = 0x00a60000 as number,\n BadAggregateListMismatch = 0x80d40000 as number,\n BadAggregateNotSupported = 0x80d50000 as number,\n BadAggregateInvalidInputs = 0x80d60000 as number,\n BadAggregateConfigurationRejected = 0x80da0000 as number,\n GoodDataIgnored = 0x00d90000 as number,\n BadRequestNotAllowed = 0x80e40000 as number,\n BadRequestNotComplete = 0x81130000 as number,\n GoodEdited = 0x00dc0000 as number,\n GoodPostActionFailed = 0x00dd0000 as number,\n UncertainDominantValueChanged = 0x40de0000 as number,\n GoodDependentValueChanged = 0x00e00000 as number,\n BadDominantValueChanged = 0x80e10000 as number,\n UncertainDependentValueChanged = 0x40e20000 as number,\n BadDependentValueChanged = 0x80e30000 as number,\n GoodEditedDependentValueChanged = 0x01160000 as number,\n GoodEditedDominantValueChanged = 0x01170000 as number,\n GoodEditedDominantValueChangedDependentValueChanged = 0x01180000 as number,\n BadEditedOutOfRange = 0x81190000 as number,\n BadInitialValueOutOfRange = 0x811a0000 as number,\n BadOutOfRangeDominantValueChanged = 0x811b0000 as number,\n BadEditedOutOfRangeDominantValueChanged = 0x811c0000 as number,\n BadOutOfRangeDominantValueChangedDependentValueChanged = 0x811d0000 as number,\n BadEditedOutOfRangeDominantValueChangedDependentValueChanged = 0x811e0000 as number,\n GoodCommunicationEvent = 0x00a70000 as number,\n GoodShutdownEvent = 0x00a80000 as number,\n GoodCallAgain = 0x00a90000 as number,\n GoodNonCriticalTimeout = 0x00aa0000 as number,\n BadInvalidArgument = 0x80ab0000 as number,\n BadConnectionRejected = 0x80ac0000 as number,\n BadDisconnect = 0x80ad0000 as number,\n BadConnectionClosed = 0x80ae0000 as number,\n BadInvalidState = 0x80af0000 as number,\n BadEndOfStream = 0x80b00000 as number,\n BadNoDataAvailable = 0x80b10000 as number,\n BadWaitingForResponse = 0x80b20000 as number,\n BadOperationAbandoned = 0x80b30000 as number,\n BadExpectedStreamToBlock = 0x80b40000 as number,\n BadWouldBlock = 0x80b50000 as number,\n BadSyntaxError = 0x80b60000 as number,\n BadMaxConnectionsReached = 0x80b70000 as number,\n}","import { ISecureChannel, NodeId, QualifiedName, ReadRequest, ReadResponse, ReadValueId, TimestampsToReturnEnum } from \"opcjs-base\";\nimport { AttrIdValue } from \"./attributeServiceAttributes\";\nimport { ServiceBase } from \"./serviceBase\";\nimport { StatusCodeToString } from \"../../../base/src/types/statusCode\";\n\n// https://reference.opcfoundation.org/Core/Part4/v105/docs/5.11\nexport class AttributeService extends ServiceBase {\n async ReadValue(nodeIds: NodeId[]): Promise<{ status: string, value: unknown }[]> {\n const readValueIds = nodeIds.map(ni => {\n const readValueId = new ReadValueId();\n readValueId.nodeId = ni;\n readValueId.attributeId = AttrIdValue;\n readValueId.indexRange = '';\n readValueId.dataEncoding = new QualifiedName(0, '');\n return readValueId;\n });\n\n const request = new ReadRequest();\n request.requestHeader = this.createRequestHeader();\n request.maxAge = 60000; // one minute\n request.timestampsToReturn = TimestampsToReturnEnum.Source;\n request.nodesToRead = readValueIds;\n\n console.log(\"Sending ReadRequest...\");\n const response = await this.secureChannel.issueServiceRequest(request) as ReadResponse;\n\n const results = new Array<{ status: string, value: unknown }>()\n for (const dataValue of response.results ?? []) {\n const result = {\n status: StatusCodeToString(dataValue.statusCode),\n value: dataValue.value as unknown\n }\n results.push(result)\n }\n return results;\n }\n\n constructor(authToken: NodeId, secureChannel: ISecureChannel) {\n super(authToken, secureChannel);\n }\n}","export class ReadValueResult{\n constructor(public value:unknown, public status:string){}\n}","import { NodeId } from \"opcjs-base\";\n\nexport class SubscriptionHandlerEntry{\n constructor(\n public subscriptionId:number,\n public handle: number, \n public id:NodeId, \n public callback: (data: { id: NodeId, value: unknown }[]) => void\n ){}\n}","import { DataChangeNotification, NodeId, SubscriptionAcknowledgement } from \"opcjs-base\";\nimport { MonitoredItemService } from \"./services/monitoredItemService\";\nimport { SubscriptionService } from \"./services/subscriptionService\";\nimport { SubscriptionHandlerEntry } from \"./subscriptionHandlerEntry\";\n\nexport class SubscriptionHandler {\n private entries = new Array<SubscriptionHandlerEntry>()\n private nextHandle = 0\n\n async subscribe(ids: NodeId[], callback: (data: { id: NodeId, value: unknown }[]) => void) {\n if (this.entries.length > 0) {\n throw new Error('Subscribing more than once is not implemented');\n }\n\n const subscriptionId = await this.subscriptionService.createSubscription()\n const items = []\n for (const id of ids) {\n const entry = new SubscriptionHandlerEntry(\n subscriptionId,\n this.nextHandle++,\n id,\n callback\n );\n this.entries.push(entry)\n const item = {\n id: id,\n handle: entry.handle\n }\n items.push(item)\n }\n await this.monitoredItemService.createMonitoredItems(subscriptionId, items)\n this.publish([])\n }\n\n private async publish(acknowledgeSequenceNumbers: number[]) {\n const acknowledgements = []\n for (let i = 0; i < acknowledgeSequenceNumbers.length; i++) {\n const acknowledgement = new SubscriptionAcknowledgement();\n acknowledgement.subscriptionId = this.entries[i].subscriptionId;\n acknowledgement.sequenceNumber = acknowledgeSequenceNumbers[i];\n acknowledgements.push(acknowledgement);\n }\n const response = await this.subscriptionService.publish(acknowledgements);\n\n const messagesToAcknowledge = response.notificationMessage.sequenceNumber\n // todo: evaluatin status codes\n const notificationDatas = response.notificationMessage.notificationData\n\n for (const notificationData of notificationDatas) {\n const decodedData = notificationData.data;\n const typeNodeId = notificationData.typeId;\n if (typeNodeId.namespace === 0 && typeNodeId.identifier === 811) {\n const dataChangeNotification = decodedData as DataChangeNotification;\n for (const item of dataChangeNotification.monitoredItems) {\n const clientHandle = item.clientHandle;\n const value = item.value;\n const entry = this.entries.find(e => e.handle == clientHandle);\n entry?.callback([{\n id: entry.id,\n value: value.value?.value\n }]);\n }\n } else {\n console.log(`The change notification data type ${typeNodeId.namespace}:${typeNodeId.identifier} is not supported.`)\n }\n }\n\n setTimeout(() => {\n this.publish([messagesToAcknowledge]);\n }, 500);\n }\n\n constructor(\n private subscriptionService: SubscriptionService,\n private monitoredItemService: MonitoredItemService\n ) {\n }\n}","import {\n CreateSubscriptionRequest, CreateSubscriptionResponse, ISecureChannel, NodeId, PublishRequest,\n PublishResponse, SubscriptionAcknowledgement\n} from \"opcjs-base\";\nimport { ServiceBase } from \"./serviceBase\";\n\n// https://reference.opcfoundation.org/Core/Part4/v105/docs/5.14\nexport class SubscriptionService extends ServiceBase {\n // https://reference.opcfoundation.org/Core/Part4/v105/docs/5.14.2\n async createSubscription(): Promise<number> {\n const request = new CreateSubscriptionRequest();\n request.requestHeader = this.createRequestHeader();\n request.requestedPublishingInterval = 2000; // 2 sec\n request.requestedLifetimeCount = 360000; // 5 min\n request.requestedMaxKeepAliveCount = 60000; // 1 min\n request.maxNotificationsPerPublish = 200;\n request.publishingEnabled = true;\n request.priority = 1;\n\n\n console.log(\"Sending createSubscription...\");\n const response = await this.secureChannel.issueServiceRequest(request) as CreateSubscriptionResponse;\n console.log(\"Subscription created with id:\", response.subscriptionId);\n return response.subscriptionId;\n }\n\n // https://reference.opcfoundation.org/Core/Part4/v105/docs/5.14.5\n async publish(acknowledgements: SubscriptionAcknowledgement[]): Promise<PublishResponse> {\n const request = new PublishRequest();\n request.requestHeader = this.createRequestHeader();\n request.subscriptionAcknowledgements = acknowledgements;\n\n console.log('Sending publish...');\n const response = await this.secureChannel.issueServiceRequest(request) as PublishResponse;\n console.log('Received publish response.')\n return response;\n }\n\n constructor(authToken: NodeId, secureChannel: ISecureChannel) {\n super(authToken, secureChannel);\n }\n}","import { \n CreateMonitoredItemsRequest, CreateMonitoredItemsResponse, \n ExtensionObject, ISecureChannel, MonitoredItemCreateRequest, MonitoringModeEnum, MonitoringParameters, \n NodeId, QualifiedName, ReadValueId, TimestampsToReturnEnum } from \"opcjs-base\";\nimport { AttrIdValue } from \"./attributeServiceAttributes\";\nimport { ServiceBase } from \"./serviceBase\";\n\nexport class MonitoredItemService extends ServiceBase {\n\n async createMonitoredItems(subscriptionId: number, ids: { id: NodeId, handle: number }[]): Promise<void> {\n const items = ids.map(ni => {\n const readValueId = new ReadValueId();\n readValueId.nodeId = ni.id;\n readValueId.attributeId = AttrIdValue;\n readValueId.indexRange = '';\n readValueId.dataEncoding = new QualifiedName(0, '');\n\n const monitoringParameters = new MonitoringParameters();\n monitoringParameters.clientHandle = ni.handle;\n monitoringParameters.samplingInterval = 1000; // 1 sec\n monitoringParameters.filter = ExtensionObject.newEmpty();\n monitoringParameters.queueSize = 100;\n monitoringParameters.discardOldest = true;\n\n const monitoredItemCreateRequest = new MonitoredItemCreateRequest();\n monitoredItemCreateRequest.itemToMonitor = readValueId;\n monitoredItemCreateRequest.monitoringMode = MonitoringModeEnum.Reporting;\n monitoredItemCreateRequest.requestedParameters = monitoringParameters;\n return monitoredItemCreateRequest; \n });\n\n const request = new CreateMonitoredItemsRequest();\n request.requestHeader = this.createRequestHeader();\n request.subscriptionId = subscriptionId;\n request.timestampsToReturn = TimestampsToReturnEnum.Source;\n request.itemsToCreate = items;\n\n console.log(\"Sending createMonitoredItems...\");\n await this.secureChannel.issueServiceRequest(request) as CreateMonitoredItemsResponse;\n // todo: handle Statuscodes\n }\n\n constructor(authToken: NodeId, secureChannel: ISecureChannel) {\n super(authToken, secureChannel)\n }\n}","import { CallMethodRequest, CallRequest, CallResponse, ISecureChannel, NodeId } from \"opcjs-base\";\nimport { ServiceBase } from \"./serviceBase\";\nimport { StatusCodeToString } from \"../../../base/src/types/statusCode\";\n\n// https://reference.opcfoundation.org/Core/Part4/v105/docs/5.11\nexport class MethodService extends ServiceBase {\n\n /**\n * Calls one or more methods on the server (OPC UA Part 4, Section 5.11.2).\n * @param methodsToCall - Array of CallMethodRequest describing each method to invoke.\n * @returns Array of CallMethodResult, one per requested method.\n */\n async call(methodsToCall: CallMethodRequest[]): Promise<{ status: string, value: unknown[] }[]> {\n const request = new CallRequest();\n request.requestHeader = this.createRequestHeader();\n request.methodsToCall = methodsToCall;\n\n const response = await this.secureChannel.issueServiceRequest(request) as CallResponse;\n return response.results.map(result => ({\n status: StatusCodeToString(result.statusCode),\n value: result.outputArguments.map(arg => arg.value)\n }));\n }\n\n constructor(authToken: NodeId, secureChannel: ISecureChannel) {\n super(authToken, secureChannel);\n }\n}\n","export class CallMethodResult {\n constructor(public values:unknown[], public status:string){}\n}","import {\n NodeId,\n TcpConnectionHandler,\n SecureChannelFacade,\n SecureChannelContext,\n SecureChannelMesssageEncoder,\n SecureChannelTypeDecoder,\n SecureChannelMessageDecoder,\n SecureChannelTypeEncoder,\n initLoggerProvider,\n TcpMessageInjector,\n TcpMessageDecoupler,\n getLogger,\n WebSocketFascade,\n WebSocketReadableStream,\n WebSocketWritableStream,\n SecureChannelChunkReader,\n SecureChannelChunkWriter,\n CallMethodRequest,\n Variant\n} from \"opcjs-base\";\nimport { SessionHandler } from \"./sessions/sessionHandler\";\nimport { Session } from \"./sessions/session\";\nimport { AttributeService } from \"./services/attributeService\";\nimport { ReadValueResult } from \"./readValueResult\";\nimport { SubscriptionHandler } from \"./subscriptionHandler\";\nimport { SubscriptionService } from \"./services/subscriptionService\";\nimport { MonitoredItemService } from \"./services/monitoredItemService\";\nimport { UserIdentity } from \"./userIdentity\";\nimport { ConfigurationClient } from \"./configurationClient\";\nimport { ILogger } from \"opcjs-base\";\nimport { MethodService } from \"./services/methodService\";\nimport { CallMethodResult } from \"./callMethodResult\";\nimport { UaPrimitive } from \"../../base/src/types/primitives\";\n\nexport class Client {\n private endpointUrl: string;\n private attributeService?: AttributeService;\n private methodService?: MethodService;\n private session?: Session;\n private subscriptionHandler?: SubscriptionHandler;\n private logger: ILogger;\n\n getSession(): Session {\n if (!this.session) {\n throw new Error(\"No session available\");\n }\n return this.session;\n }\n\n async connect(): Promise<void> {\n\n const wsOptions = { endpoint: this.endpointUrl }\n const ws = new WebSocketFascade(wsOptions);\n const webSocketReadableStream = new WebSocketReadableStream(ws, 1000);\n const webSocketWritableStream = new WebSocketWritableStream(ws);\n\n\n const scContext = new SecureChannelContext(this.endpointUrl);\n const tcpMessageInjector = new TcpMessageInjector();\n const tcpConnectionHandler = new TcpConnectionHandler(tcpMessageInjector, scContext);\n const tcpMessageDecoupler = new TcpMessageDecoupler(tcpConnectionHandler.onTcpMessage.bind(tcpConnectionHandler));\n const scMessageEncoder = new SecureChannelMesssageEncoder(scContext);\n const scTypeDecoder = new SecureChannelTypeDecoder(\n this.configuration.decoder,\n );\n const scMessageDecoder = new SecureChannelMessageDecoder(scContext);\n const scTypeEncoder = new SecureChannelTypeEncoder(\n this.configuration.encoder,\n );\n const scChunkWriter = new SecureChannelChunkWriter(scContext);\n const scChunkReader = new SecureChannelChunkReader(scContext);\n\n webSocketReadableStream.pipeTo(tcpMessageDecoupler.writable);\n tcpMessageDecoupler.readable.pipeTo(scMessageDecoder.writable);\n scMessageDecoder.readable.pipeTo(scChunkReader.writable);\n scChunkReader.readable.pipeTo(scTypeDecoder.writable);\n\n scTypeEncoder.readable.pipeTo(scChunkWriter.writable);\n scChunkWriter.readable.pipeTo(scMessageEncoder.writable);\n scMessageEncoder.readable.pipeTo(tcpMessageInjector.writable);\n tcpMessageInjector.readable.pipeTo(webSocketWritableStream);\n\n const sc = new SecureChannelFacade(scContext, scTypeDecoder, scTypeEncoder);\n\n // const response = await sc.send(request, wsWritable);\n\n //const channel = ChannelFactory.createChannel(this.endpointUrl);\n let connected = false;\n while (!connected) {\n this.logger.debug(`Connecting to OPC UA server at ${this.endpointUrl}...`);\n await ws.connect();\n this.logger.debug(\"WebSocket connection established, now establishing TCP connection...\");\n connected = await tcpConnectionHandler.connect(this.endpointUrl);\n\n if (!connected) {\n this.logger.info(\"Connection failed, retrying in 2 seconds...\");\n await new Promise((resolve) => setTimeout(resolve, 2000));\n }\n }\n this.logger.info(\"Connected to OPC UA server.\");\n\n //this.channel = new SecureChannel(channel, this.configuration);\n this.logger.debug(\"Opening secure channel...\");\n await sc.openSecureChannel();\n this.logger.debug(\"Secure channel established.\");\n\n this.logger.debug(\"Creating session...\");\n const sessionHandler = new SessionHandler(sc, this.configuration);\n this.session = await sessionHandler.createNewSession(this.identity);\n this.logger.debug(\"Session created.\");\n\n this.logger.debug(\"Initializing services...\");\n this.attributeService = new AttributeService(this.session.getAuthToken(), sc);\n this.methodService = new MethodService(this.session.getAuthToken(), sc);\n this.subscriptionHandler = new SubscriptionHandler(\n new SubscriptionService(this.session.getAuthToken(), sc),\n new MonitoredItemService(this.session.getAuthToken(), sc),\n );\n }\n\n async disconnect(): Promise<void> {\n this.logger.info(\"Disconnecting from OPC UA server...\");\n // Implementation of disconnection logic goes here\n // if (this.channel) {\n // await this.channel.disconnect();\n // }\n }\n\n async read(ids: NodeId[]): Promise<ReadValueResult[]> {\n const result = await this.attributeService?.ReadValue(ids);\n return result?.map((r) => new ReadValueResult(r.value, r.status)) || [];\n }\n\n /**\n * Method for calling a single method on the server.\n * @param objectId - NodeId of the Object that owns the method.\n * @param methodId - NodeId of the Method to invoke.\n * @param inputArguments - Input argument Variants (default: empty).\n * @returns The CallMethodResult for the invoked method.\n */\n async callMethod(\n objectId: NodeId,\n methodId: NodeId,\n inputArguments: UaPrimitive[] = []\n ): Promise<CallMethodResult> {\n const request = new CallMethodRequest();\n request.objectId = objectId;\n request.methodId = methodId;\n request.inputArguments = inputArguments.map(arg => Variant.newFrom(arg));\n\n const responses = await this.methodService!.call([request]);\n const response = responses[0];\n\n return new CallMethodResult(response.value, response.status);\n }\n\n async subscribe(\n ids: NodeId[],\n callback: (data: { id: NodeId; value: unknown }[]) => void,\n ) {\n this.subscriptionHandler?.subscribe(ids, callback);\n }\n\n constructor(\n endpointUrl: string,\n private configuration: ConfigurationClient,\n private identity: UserIdentity,\n ) {\n this.endpointUrl = endpointUrl;\n initLoggerProvider(configuration.loggerFactory);\n this.logger = getLogger(\"Client\");\n }\n}\n","import {\n BinaryReader,\n BinaryWriter,\n Configuration,\n Decoder,\n Encoder,\n ILoggerFactory,\n LoggerFactory,\n registerBinaryDecoders,\n registerEncoders,\n registerTypeDecoders\n} from \"opcjs-base\";\n\nexport class ConfigurationClient extends Configuration {\n public static getSimple(\n name: string,\n company: string,\n loggerFactory?: ILoggerFactory,\n ): ConfigurationClient {\n\n if (!loggerFactory) {\n loggerFactory = new LoggerFactory({\n defaultLevel: 'DEBUG', //todo: use enum\n categoryLevels: {\n \"transport.*\": \"TRACE\",\n \"secureChannel.*\": \"TRACE\",\n },\n });\n }\n const applicationUri = `urn:${company}:${name}`;\n const productUri = `urn:${company}:${name}:product`;\n\n const encoder = new Encoder();\n encoder.registerWriterFactory(\"binary\", () => {\n return new BinaryWriter();\n });\n registerEncoders(encoder);\n\n const decoder = new Decoder();\n decoder.registerReaderFactory(\"binary\", (data: unknown) => {\n return new BinaryReader(data as Uint8Array);\n });\n registerTypeDecoders(decoder);\n registerBinaryDecoders(decoder);\n\n return new ConfigurationClient(\n name,\n applicationUri,\n name,\n productUri,\n encoder,\n decoder,\n loggerFactory,\n );\n }\n\n constructor(\n applicationName: string,\n applicationUri: string,\n productName: string,\n productUri: string,\n encoder: Encoder,\n decoder: Decoder,\n loggerFactory: ILoggerFactory,\n ) {\n super(\n applicationName,\n applicationUri,\n productName,\n productUri,\n encoder,\n decoder,\n loggerFactory,\n );\n }\n}\n","import { IssuedIdentityToken, UserIdentityToken, UserNameIdentityToken, UserTokenTypeEnum } from \"opcjs-base\";\nimport { IssuerConfiguration } from \"./issuerConfiguration\";\nimport { IssuerToken } from \"./issuerToken\";\nimport { AnonymousIdentityToken } from \"opcjs-base\";\n\nexport class UserIdentity {\n private userIdentityToken?: UserIdentityToken;\n private tokenType = UserTokenTypeEnum.Anonymous;\n private issuerLoginCallback: ((config:IssuerConfiguration)=>Promise<IssuerToken>) | undefined = undefined;\n\n public static newAnonymous(): UserIdentity {\n const userIdentity = new UserIdentity();\n userIdentity.userIdentityToken = new AnonymousIdentityToken();\n userIdentity.userIdentityToken.policyId = \"anonymous\";\n userIdentity.tokenType = UserTokenTypeEnum.Anonymous;\n return userIdentity;\n }\n \n public static newWithUserName(userName: string, password: string): UserIdentity {\n const userIdentity = new UserIdentity();\n const nameToken = new UserNameIdentityToken();\n nameToken.userName = userName;\n nameToken.password = new TextEncoder().encode(password);\n\n userIdentity.userIdentityToken = nameToken;\n userIdentity.tokenType = UserTokenTypeEnum.UserName;\n return userIdentity;\n }\n\n public static newWithIssuerToken(loginCallback: (config:IssuerConfiguration)=>Promise<IssuerToken>): UserIdentity {\n const userIdentity = new UserIdentity();\n const issuedToken = new IssuedIdentityToken();\n issuedToken.tokenData = new TextEncoder().encode(\"\"); // token data will be filled by the login callback \n userIdentity.userIdentityToken = issuedToken;\n userIdentity.tokenType = UserTokenTypeEnum.IssuedToken;\n userIdentity.issuerLoginCallback = loginCallback;\n return userIdentity;\n }\n\n public getUserIdentityToken(): UserIdentityToken {\n return this.userIdentityToken as UserIdentityToken;\n }\n\n public getTokenType(): UserTokenTypeEnum {\n return this.tokenType;\n }\n\n public getIssuerLoginCallback(): ((config:IssuerConfiguration)=>Promise<IssuerToken>) {\n if(!this.issuerLoginCallback){\n throw new Error(\"No issuer login callback defined\");\n }\n \n return this.issuerLoginCallback;\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/services/serviceBase.ts","../src/services/sessionService.ts","../src/issuerConfiguration.ts","../src/sessions/session.ts","../src/sessions/sessionHandler.ts","../src/services/attributeServiceAttributes.ts","../../base/src/types/statusCode.ts","../src/services/attributeService.ts","../src/readValueResult.ts","../src/subscriptionHandlerEntry.ts","../src/subscriptionHandler.ts","../src/services/subscriptionService.ts","../src/services/monitoredItemService.ts","../src/services/methodService.ts","../src/callMethodResult.ts","../src/services/browseService.ts","../src/browseNodeResult.ts","../src/client.ts","../src/configurationClient.ts","../src/userIdentity.ts"],"names":["ExtensionObject","NodeId","StatusCode","ReadValueId","QualifiedName","TimestampsToReturnEnum","getLogger","CallMethodRequest","BrowseDescription","Configuration","UserTokenTypeEnum","IssuedIdentityToken"],"mappings":"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","file":"index.js","sourcesContent":["import { ExtensionObject, ISecureChannel, NodeId, RequestHeader } from \"opcjs-base\";\n\nexport abstract class ServiceBase{\n\n\n protected createRequestHeader(): RequestHeader {\n const requestHeader = new RequestHeader();\n requestHeader.authenticationToken = this.authToken;\n requestHeader.timestamp = new Date();\n requestHeader.requestHandle = 0; // will be set by secure channel\n requestHeader.returnDiagnostics = 0;\n requestHeader.auditEntryId = '';\n requestHeader.timeoutHint = 60000;\n requestHeader.additionalHeader = ExtensionObject.newEmpty();\n\n return requestHeader;\n }\n \n constructor(private authToken: NodeId, protected secureChannel: ISecureChannel){}\n}","import {\n ActivateSessionRequest, ApplicationDescription, ApplicationTypeEnum,\n Configuration, CreateSessionRequest, CreateSessionResponse, EndpointDescription, ExtensionObject,\n getLogger,\n ISecureChannel, LocalizedText, NodeId, SignatureData, SignedSoftwareCertificate, UserIdentityToken\n} from \"opcjs-base\";\nimport { ServiceBase } from \"./serviceBase\";\n\nexport class SessionService extends ServiceBase {\n private logger = getLogger(\"services.SessionService\");\n async createSession(): Promise<{ sessionId: number, authToken: NodeId, endpoint: EndpointDescription }> {\n this.logger.debug(\"Creating session...\");\n\n const clientDescription = new ApplicationDescription();\n clientDescription.applicationUri = this.configuration.applicationUri;\n clientDescription.productUri = this.configuration.productUri;\n clientDescription.applicationName = new LocalizedText(undefined, this.configuration.productName);\n clientDescription.applicationType = ApplicationTypeEnum.Client;\n clientDescription.gatewayServerUri = '';\n clientDescription.discoveryProfileUri = '';\n clientDescription.discoveryUrls = new Array<string>();\n\n const request = new CreateSessionRequest();\n request.requestHeader = this.createRequestHeader();\n request.clientDescription = clientDescription;\n request.serverUri = '';\n request.endpointUrl = this.secureChannel.getEndpointUrl();\n request.sessionName = '';\n request.clientNonce = null;\n request.clientCertificate = null;\n request.requestedSessionTimeout = 60000;\n request.maxResponseMessageSize = 0;\n\n\n // todo: verify endpoints\n // todo: check application uri in server certificate\n\n this.logger.debug(\"Sending CreateSessionRequest...\");\n const response = await this.secureChannel.issueServiceRequest(request);\n if (!response || !(response instanceof CreateSessionResponse)) {\n throw new Error(\"Invalid response type for CreateSessionRequest\");\n }\n\n const castedResponse = response as CreateSessionResponse;\n if (!castedResponse || !castedResponse.sessionId || !castedResponse.authenticationToken) {\n throw new Error(\"CreateSessionResponse missing SessionId or AuthenticationToken\");\n }\n\n const endpoint = 'opc.' + this.secureChannel.getEndpointUrl();\n const endpointUrl = new URL(endpoint);\n const securityMode = this.secureChannel.getSecurityMode();\n const securityPolicyUri = this.secureChannel.getSecurityPolicy(); // todo: does not work with localhost. Not sure why.\n\n const serverEndpoint = castedResponse\n ?.serverEndpoints\n ?.find(currentEndpoint => {\n const currentEndpointUrl = new URL(currentEndpoint.endpointUrl as string);\n\n return currentEndpointUrl.protocol === endpointUrl.protocol\n && currentEndpointUrl.pathname === endpointUrl.pathname\n && currentEndpointUrl.port === endpointUrl.port\n && currentEndpoint.securityMode === securityMode\n && currentEndpoint.securityPolicyUri === securityPolicyUri});\n\n if (!serverEndpoint) {\n throw new Error(`Server endpoint ${endpoint} not found in CreateSessionResponse`);\n }\n\n this.logger.debug(\"Session created with id:\", castedResponse.sessionId.identifier);\n return {\n sessionId: castedResponse.sessionId.identifier as number,\n authToken: castedResponse.authenticationToken,\n endpoint: serverEndpoint\n };\n }\n\n async activateSession(identityToken: UserIdentityToken): Promise<void> {\n const signatureData = new SignatureData();\n signatureData.algorithm = this.secureChannel.getSecurityPolicy();\n signatureData.signature = new Uint8Array(0);\n\n const request = new ActivateSessionRequest();\n request.requestHeader = this.createRequestHeader();\n request.clientSignature = signatureData;\n request.clientSoftwareCertificates = new Array<SignedSoftwareCertificate>();\n request.localeIds = ['en-US'];\n request.userIdentityToken = ExtensionObject.newBinary(identityToken);\n request.userTokenSignature = signatureData;\n\n this.logger.debug(\"Sending ActivateSessionRequest...\");\n await this.secureChannel.issueServiceRequest(request);\n this.logger.debug(\"Session activated.\");\n }\n\n recreate(authToken: NodeId): SessionService {\n return new SessionService(authToken, this.secureChannel, this.configuration)\n }\n\n constructor(authToken: NodeId, secureChannel: ISecureChannel, private configuration: Configuration) {\n super(authToken, secureChannel)\n }\n}","interface IssuerEndpointUrl {\n 'ua.resourceId': string;\n 'ua.authorityUrl': string;\n 'ua.authorityProfileUri': string;\n 'ua.tokenEndpoint': string;\n 'ua.authorizationEndpoint': string;\n 'ua.requestTypes': string[];\n 'ua.scopes': string[];\n}\n\nexport class IssuerConfiguration{\n public static newFrom(issuerEndpointUrl: IssuerEndpointUrl): IssuerConfiguration {\n return new IssuerConfiguration(\n issuerEndpointUrl['ua.resourceId'],\n issuerEndpointUrl['ua.authorityUrl'],\n issuerEndpointUrl['ua.authorityProfileUri'],\n issuerEndpointUrl['ua.tokenEndpoint'],\n issuerEndpointUrl['ua.authorizationEndpoint'],\n issuerEndpointUrl['ua.requestTypes'],\n issuerEndpointUrl['ua.scopes']\n );\n }\n \n constructor(\n public resourceId: string,\n public authorityUrl: string,\n public authorityProfileUri: string,\n public tokenEndpoint: string,\n public authorizationEndpoint: string,\n public requestTypes: string[],\n public scopes: string[]\n ){\n \n }\n}","import { EndpointDescription, IssuedIdentityToken, NodeId, UserTokenTypeEnum } from \"opcjs-base\";\nimport { IssuerConfiguration } from \"../issuerConfiguration\";\nimport { SessionService } from \"../services/sessionService\";\nimport { UserIdentity } from \"../userIdentity\";\n\nexport class Session {\n async activateSession(identity: UserIdentity): Promise<void> {\n const token = identity.getUserIdentityToken();\n const tokenType = identity.getTokenType();\n const tokenPolicy = this.endpoint.userIdentityTokens?.find(t => t.tokenType === tokenType);\n if (!tokenPolicy) {\n throw new Error(`UserIdentityToken of type ${tokenType} not supported by server`);\n }\n token.policyId = tokenPolicy.policyId;\n\n if (tokenType === UserTokenTypeEnum.IssuedToken) {\n if (!tokenPolicy.issuerEndpointUrl) {\n throw new Error(\"IssuerEndpointUrl not defined for IssuedToken\");\n }\n const issuerEndpointUrl = JSON.parse(tokenPolicy.issuerEndpointUrl)\n const issuerConfig = IssuerConfiguration.newFrom(issuerEndpointUrl);\n\n const issuerLoginCallback = identity.getIssuerLoginCallback();\n const tokenData = await issuerLoginCallback(issuerConfig);\n\n const issuerToken = token as IssuedIdentityToken;\n issuerToken.tokenData = new TextEncoder().encode(tokenData.json);\n }\n\n await this.sessionServices.activateSession(token);\n }\n\n getAuthToken(): NodeId {\n return this.authToken;\n }\n\n constructor(\n public sessionId: number,\n private authToken: NodeId,\n private endpoint: EndpointDescription,\n private sessionServices: SessionService) { }\n}","import { ConfigurationClient } from \"../configurationClient\";\nimport { ISecureChannel, NodeId } from \"opcjs-base\";\nimport { SessionService } from \"../services/sessionService\";\nimport { UserIdentity } from \"../userIdentity\";\nimport { Session } from \"./session\";\n\nexport class SessionHandler {\n private sessionServices: SessionService;\n async createNewSession(identity:UserIdentity) : Promise<Session>{\n const ret = await this.sessionServices.createSession();\n this.sessionServices = this.sessionServices.recreate(ret.authToken)\n\n const session = new Session(ret.sessionId, ret.authToken, ret.endpoint, this.sessionServices);\n await session.activateSession(identity);\n return session;\n }\n\n constructor(secureChannel:ISecureChannel, configuration: ConfigurationClient) {\n this.sessionServices = new SessionService(NodeId.newTwoByte(0), secureChannel, configuration);\n }\n}","// according to https://reference.opcfoundation.org/Core/Part6/v105/docs/A.1\n// see also: https://reference.opcfoundation.org/Core/Part4/v105/docs/7.24.1#Table154\n\nexport const AttrIdNodeId = 1\nexport const AttrIdNodeClass = 2\nexport const AttrIdBrowseName = 3\nexport const AttrIdDisplayName = 4\nexport const AttrIdDescription = 5\nexport const AttrIdWriteMask = 6\nexport const AttrIdUserWriteMask = 7\nexport const AttrIdIsAbstract = 8\nexport const AttrIdSymmetric = 9\nexport const AttrIdInverseName = 10\nexport const AttrIdContainsNoLoops = 11\nexport const AttrIdEventNotifier = 12\nexport const AttrIdValue = 13\nexport const AttrIdDataType = 14\nexport const AttrIdValueRank = 15\nexport const AttrIdArrayDimensions = 16\nexport const AttrIdAccessLevel = 17\nexport const AttrIdUserAccessLevel = 18\nexport const AttrIdMinimumSamplingInterval = 19\nexport const AttrIdHistorizing = 20\nexport const AttrIdExecutable = 21\nexport const AttrIdUserExecutable = 22\nexport const AttrIdDataTypeDefinition = 23\nexport const AttrIdRolePermissions = 24\nexport const AttrIdUserRolePermissions = 25\nexport const AttrIdAccessRestrictions = 26\nexport const AttrIdAccessLevelEx = 27\n","/**\n * OPC UA StatusCode Type (i=19)\n * \n * StatusCode is a 32-bit unsigned integer that indicates the quality of a result.\n * The format is: [Severity:2][SubCode:14][Code:16]\n * \n * @see OPC UA Part 4, Section 7.34\n * @see OPC UA Part 6, Section 5.1.1\n */\n\nimport { BuiltInType } from \"./builtinType\";\n\nexport function StatusCodeToString(statusCode?: number): string {\n if (statusCode === undefined) {\n return 'Unknown';\n }\n const name = (Object.entries(StatusCode) as [string, number][])\n .find(([, v]) => v === statusCode)?.[0];\n return name ?? `0x${statusCode.toString(16).toUpperCase().padStart(8, '0')}`;\n}\n\nexport type UaStatusCode = {value: StatusCode; readonly type: BuiltInType.StatusCode };\nexport const uaStatusCode = (value: StatusCode): UaStatusCode => ({ value, type: BuiltInType.StatusCode });\n\nexport enum StatusCode {\n Good = 0x0 as number,\n Uncertain = 0x40000000 as number,\n Bad = 0x80000000 as number,\n BadUnexpectedError = 0x80010000 as number,\n BadInternalError = 0x80020000 as number,\n BadOutOfMemory = 0x80030000 as number,\n BadResourceUnavailable = 0x80040000 as number,\n BadCommunicationError = 0x80050000 as number,\n BadEncodingError = 0x80060000 as number,\n BadDecodingError = 0x80070000 as number,\n BadEncodingLimitsExceeded = 0x80080000 as number,\n BadRequestTooLarge = 0x80b80000 as number,\n BadResponseTooLarge = 0x80b90000 as number,\n BadUnknownResponse = 0x80090000 as number,\n BadTimeout = 0x800a0000 as number,\n BadServiceUnsupported = 0x800b0000 as number,\n BadShutdown = 0x800c0000 as number,\n BadServerNotConnected = 0x800d0000 as number,\n BadServerHalted = 0x800e0000 as number,\n BadNothingToDo = 0x800f0000 as number,\n BadTooManyOperations = 0x80100000 as number,\n BadTooManyMonitoredItems = 0x80db0000 as number,\n BadDataTypeIdUnknown = 0x80110000 as number,\n BadCertificateInvalid = 0x80120000 as number,\n BadSecurityChecksFailed = 0x80130000 as number,\n BadCertificatePolicyCheckFailed = 0x81140000 as number,\n BadCertificateTimeInvalid = 0x80140000 as number,\n BadCertificateIssuerTimeInvalid = 0x80150000 as number,\n BadCertificateHostNameInvalid = 0x80160000 as number,\n BadCertificateUriInvalid = 0x80170000 as number,\n BadCertificateUseNotAllowed = 0x80180000 as number,\n BadCertificateIssuerUseNotAllowed = 0x80190000 as number,\n BadCertificateUntrusted = 0x801a0000 as number,\n BadCertificateRevocationUnknown = 0x801b0000 as number,\n BadCertificateIssuerRevocationUnknown = 0x801c0000 as number,\n BadCertificateRevoked = 0x801d0000 as number,\n BadCertificateIssuerRevoked = 0x801e0000 as number,\n BadCertificateChainIncomplete = 0x810d0000 as number,\n BadUserAccessDenied = 0x801f0000 as number,\n BadIdentityTokenInvalid = 0x80200000 as number,\n BadIdentityTokenRejected = 0x80210000 as number,\n BadSecureChannelIdInvalid = 0x80220000 as number,\n BadInvalidTimestamp = 0x80230000 as number,\n BadNonceInvalid = 0x80240000 as number,\n BadSessionIdInvalid = 0x80250000 as number,\n BadSessionClosed = 0x80260000 as number,\n BadSessionNotActivated = 0x80270000 as number,\n BadSubscriptionIdInvalid = 0x80280000 as number,\n BadRequestHeaderInvalid = 0x802a0000 as number,\n BadTimestampsToReturnInvalid = 0x802b0000 as number,\n BadRequestCancelledByClient = 0x802c0000 as number,\n BadTooManyArguments = 0x80e50000 as number,\n BadLicenseExpired = 0x810e0000 as number,\n BadLicenseLimitsExceeded = 0x810f0000 as number,\n BadLicenseNotAvailable = 0x81100000 as number,\n GoodSubscriptionTransferred = 0x002d0000 as number,\n GoodCompletesAsynchronously = 0x002e0000 as number,\n GoodOverload = 0x002f0000 as number,\n GoodClamped = 0x00300000 as number,\n BadNoCommunication = 0x80310000 as number,\n BadWaitingForInitialData = 0x80320000 as number,\n BadNodeIdInvalid = 0x80330000 as number,\n BadNodeIdUnknown = 0x80340000 as number,\n BadAttributeIdInvalid = 0x80350000 as number,\n BadIndexRangeInvalid = 0x80360000 as number,\n BadIndexRangeNoData = 0x80370000 as number,\n BadDataEncodingInvalid = 0x80380000 as number,\n BadDataEncodingUnsupported = 0x80390000 as number,\n BadNotReadable = 0x803a0000 as number,\n BadNotWritable = 0x803b0000 as number,\n BadOutOfRange = 0x803c0000 as number,\n BadNotSupported = 0x803d0000 as number,\n BadNotFound = 0x803e0000 as number,\n BadObjectDeleted = 0x803f0000 as number,\n BadNotImplemented = 0x80400000 as number,\n BadMonitoringModeInvalid = 0x80410000 as number,\n BadMonitoredItemIdInvalid = 0x80420000 as number,\n BadMonitoredItemFilterInvalid = 0x80430000 as number,\n BadMonitoredItemFilterUnsupported = 0x80440000 as number,\n BadFilterNotAllowed = 0x80450000 as number,\n BadStructureMissing = 0x80460000 as number,\n BadEventFilterInvalid = 0x80470000 as number,\n BadContentFilterInvalid = 0x80480000 as number,\n BadFilterOperatorInvalid = 0x80c10000 as number,\n BadFilterOperatorUnsupported = 0x80c20000 as number,\n BadFilterOperandCountMismatch = 0x80c30000 as number,\n BadFilterOperandInvalid = 0x80490000 as number,\n BadFilterElementInvalid = 0x80c40000 as number,\n BadFilterLiteralInvalid = 0x80c50000 as number,\n BadContinuationPointInvalid = 0x804a0000 as number,\n BadNoContinuationPoints = 0x804b0000 as number,\n BadReferenceTypeIdInvalid = 0x804c0000 as number,\n BadBrowseDirectionInvalid = 0x804d0000 as number,\n BadNodeNotInView = 0x804e0000 as number,\n BadNumericOverflow = 0x81120000 as number,\n BadServerUriInvalid = 0x804f0000 as number,\n BadServerNameMissing = 0x80500000 as number,\n BadDiscoveryUrlMissing = 0x80510000 as number,\n BadSempahoreFileMissing = 0x80520000 as number,\n BadRequestTypeInvalid = 0x80530000 as number,\n BadSecurityModeRejected = 0x80540000 as number,\n BadSecurityPolicyRejected = 0x80550000 as number,\n BadTooManySessions = 0x80560000 as number,\n BadUserSignatureInvalid = 0x80570000 as number,\n BadApplicationSignatureInvalid = 0x80580000 as number,\n BadNoValidCertificates = 0x80590000 as number,\n BadIdentityChangeNotSupported = 0x80c60000 as number,\n BadRequestCancelledByRequest = 0x805a0000 as number,\n BadParentNodeIdInvalid = 0x805b0000 as number,\n BadReferenceNotAllowed = 0x805c0000 as number,\n BadNodeIdRejected = 0x805d0000 as number,\n BadNodeIdExists = 0x805e0000 as number,\n BadNodeClassInvalid = 0x805f0000 as number,\n BadBrowseNameInvalid = 0x80600000 as number,\n BadBrowseNameDuplicated = 0x80610000 as number,\n BadNodeAttributesInvalid = 0x80620000 as number,\n BadTypeDefinitionInvalid = 0x80630000 as number,\n BadSourceNodeIdInvalid = 0x80640000 as number,\n BadTargetNodeIdInvalid = 0x80650000 as number,\n BadDuplicateReferenceNotAllowed = 0x80660000 as number,\n BadInvalidSelfReference = 0x80670000 as number,\n BadReferenceLocalOnly = 0x80680000 as number,\n BadNoDeleteRights = 0x80690000 as number,\n UncertainReferenceNotDeleted = 0x40bc0000 as number,\n BadServerIndexInvalid = 0x806a0000 as number,\n BadViewIdUnknown = 0x806b0000 as number,\n BadViewTimestampInvalid = 0x80c90000 as number,\n BadViewParameterMismatch = 0x80ca0000 as number,\n BadViewVersionInvalid = 0x80cb0000 as number,\n UncertainNotAllNodesAvailable = 0x40c00000 as number,\n GoodResultsMayBeIncomplete = 0x00ba0000 as number,\n BadNotTypeDefinition = 0x80c80000 as number,\n UncertainReferenceOutOfServer = 0x406c0000 as number,\n BadTooManyMatches = 0x806d0000 as number,\n BadQueryTooComplex = 0x806e0000 as number,\n BadNoMatch = 0x806f0000 as number,\n BadMaxAgeInvalid = 0x80700000 as number,\n BadSecurityModeInsufficient = 0x80e60000 as number,\n BadHistoryOperationInvalid = 0x80710000 as number,\n BadHistoryOperationUnsupported = 0x80720000 as number,\n BadInvalidTimestampArgument = 0x80bd0000 as number,\n BadWriteNotSupported = 0x80730000 as number,\n BadTypeMismatch = 0x80740000 as number,\n BadMethodInvalid = 0x80750000 as number,\n BadArgumentsMissing = 0x80760000 as number,\n BadNotExecutable = 0x81110000 as number,\n BadTooManySubscriptions = 0x80770000 as number,\n BadTooManyPublishRequests = 0x80780000 as number,\n BadNoSubscription = 0x80790000 as number,\n BadSequenceNumberUnknown = 0x807a0000 as number,\n BadMessageNotAvailable = 0x807b0000 as number,\n BadInsufficientClientProfile = 0x807c0000 as number,\n BadStateNotActive = 0x80bf0000 as number,\n BadAlreadyExists = 0x81150000 as number,\n BadTcpServerTooBusy = 0x807d0000 as number,\n BadTcpMessageTypeInvalid = 0x807e0000 as number,\n BadTcpSecureChannelUnknown = 0x807f0000 as number,\n BadTcpMessageTooLarge = 0x80800000 as number,\n BadTcpNotEnoughResources = 0x80810000 as number,\n BadTcpInternalError = 0x80820000 as number,\n BadTcpEndpointUrlInvalid = 0x80830000 as number,\n BadRequestInterrupted = 0x80840000 as number,\n BadRequestTimeout = 0x80850000 as number,\n BadSecureChannelClosed = 0x80860000 as number,\n BadSecureChannelTokenUnknown = 0x80870000 as number,\n BadSequenceNumberInvalid = 0x80880000 as number,\n BadProtocolVersionUnsupported = 0x80be0000 as number,\n BadConfigurationError = 0x80890000 as number,\n BadNotConnected = 0x808a0000 as number,\n BadDeviceFailure = 0x808b0000 as number,\n BadSensorFailure = 0x808c0000 as number,\n BadOutOfService = 0x808d0000 as number,\n BadDeadbandFilterInvalid = 0x808e0000 as number,\n UncertainNoCommunicationLastUsableValue = 0x408f0000 as number,\n UncertainLastUsableValue = 0x40900000 as number,\n UncertainSubstituteValue = 0x40910000 as number,\n UncertainInitialValue = 0x40920000 as number,\n UncertainSensorNotAccurate = 0x40930000 as number,\n UncertainEngineeringUnitsExceeded = 0x40940000 as number,\n UncertainSubNormal = 0x40950000 as number,\n GoodLocalOverride = 0x00960000 as number,\n BadRefreshInProgress = 0x80970000 as number,\n BadConditionAlreadyDisabled = 0x80980000 as number,\n BadConditionAlreadyEnabled = 0x80cc0000 as number,\n BadConditionDisabled = 0x80990000 as number,\n BadEventIdUnknown = 0x809a0000 as number,\n BadEventNotAcknowledgeable = 0x80bb0000 as number,\n BadDialogNotActive = 0x80cd0000 as number,\n BadDialogResponseInvalid = 0x80ce0000 as number,\n BadConditionBranchAlreadyAcked = 0x80cf0000 as number,\n BadConditionBranchAlreadyConfirmed = 0x80d00000 as number,\n BadConditionAlreadyShelved = 0x80d10000 as number,\n BadConditionNotShelved = 0x80d20000 as number,\n BadShelvingTimeOutOfRange = 0x80d30000 as number,\n BadNoData = 0x809b0000 as number,\n BadBoundNotFound = 0x80d70000 as number,\n BadBoundNotSupported = 0x80d80000 as number,\n BadDataLost = 0x809d0000 as number,\n BadDataUnavailable = 0x809e0000 as number,\n BadEntryExists = 0x809f0000 as number,\n BadNoEntryExists = 0x80a00000 as number,\n BadTimestampNotSupported = 0x80a10000 as number,\n GoodEntryInserted = 0x00a20000 as number,\n GoodEntryReplaced = 0x00a30000 as number,\n UncertainDataSubNormal = 0x40a40000 as number,\n GoodNoData = 0x00a50000 as number,\n GoodMoreData = 0x00a60000 as number,\n BadAggregateListMismatch = 0x80d40000 as number,\n BadAggregateNotSupported = 0x80d50000 as number,\n BadAggregateInvalidInputs = 0x80d60000 as number,\n BadAggregateConfigurationRejected = 0x80da0000 as number,\n GoodDataIgnored = 0x00d90000 as number,\n BadRequestNotAllowed = 0x80e40000 as number,\n BadRequestNotComplete = 0x81130000 as number,\n GoodEdited = 0x00dc0000 as number,\n GoodPostActionFailed = 0x00dd0000 as number,\n UncertainDominantValueChanged = 0x40de0000 as number,\n GoodDependentValueChanged = 0x00e00000 as number,\n BadDominantValueChanged = 0x80e10000 as number,\n UncertainDependentValueChanged = 0x40e20000 as number,\n BadDependentValueChanged = 0x80e30000 as number,\n GoodEditedDependentValueChanged = 0x01160000 as number,\n GoodEditedDominantValueChanged = 0x01170000 as number,\n GoodEditedDominantValueChangedDependentValueChanged = 0x01180000 as number,\n BadEditedOutOfRange = 0x81190000 as number,\n BadInitialValueOutOfRange = 0x811a0000 as number,\n BadOutOfRangeDominantValueChanged = 0x811b0000 as number,\n BadEditedOutOfRangeDominantValueChanged = 0x811c0000 as number,\n BadOutOfRangeDominantValueChangedDependentValueChanged = 0x811d0000 as number,\n BadEditedOutOfRangeDominantValueChangedDependentValueChanged = 0x811e0000 as number,\n GoodCommunicationEvent = 0x00a70000 as number,\n GoodShutdownEvent = 0x00a80000 as number,\n GoodCallAgain = 0x00a90000 as number,\n GoodNonCriticalTimeout = 0x00aa0000 as number,\n BadInvalidArgument = 0x80ab0000 as number,\n BadConnectionRejected = 0x80ac0000 as number,\n BadDisconnect = 0x80ad0000 as number,\n BadConnectionClosed = 0x80ae0000 as number,\n BadInvalidState = 0x80af0000 as number,\n BadEndOfStream = 0x80b00000 as number,\n BadNoDataAvailable = 0x80b10000 as number,\n BadWaitingForResponse = 0x80b20000 as number,\n BadOperationAbandoned = 0x80b30000 as number,\n BadExpectedStreamToBlock = 0x80b40000 as number,\n BadWouldBlock = 0x80b50000 as number,\n BadSyntaxError = 0x80b60000 as number,\n BadMaxConnectionsReached = 0x80b70000 as number,\n}","import { ISecureChannel, NodeId, QualifiedName, ReadRequest, ReadResponse, ReadValueId, TimestampsToReturnEnum } from \"opcjs-base\";\nimport { AttrIdValue } from \"./attributeServiceAttributes\";\nimport { ServiceBase } from \"./serviceBase\";\nimport { StatusCodeToString } from \"../../../base/src/types/statusCode\";\n\n// https://reference.opcfoundation.org/Core/Part4/v105/docs/5.11\nexport class AttributeService extends ServiceBase {\n async ReadValue(nodeIds: NodeId[]): Promise<{ status: string, value: unknown }[]> {\n const readValueIds = nodeIds.map(ni => {\n const readValueId = new ReadValueId();\n readValueId.nodeId = ni;\n readValueId.attributeId = AttrIdValue;\n readValueId.indexRange = '';\n readValueId.dataEncoding = new QualifiedName(0, '');\n return readValueId;\n });\n\n const request = new ReadRequest();\n request.requestHeader = this.createRequestHeader();\n request.maxAge = 60000; // one minute\n request.timestampsToReturn = TimestampsToReturnEnum.Source;\n request.nodesToRead = readValueIds;\n\n console.log(\"Sending ReadRequest...\");\n const response = await this.secureChannel.issueServiceRequest(request) as ReadResponse;\n\n const results = new Array<{ status: string, value: unknown }>()\n for (const dataValue of response.results ?? []) {\n const result = {\n status: StatusCodeToString(dataValue.statusCode),\n value: dataValue.value as unknown\n }\n results.push(result)\n }\n return results;\n }\n\n constructor(authToken: NodeId, secureChannel: ISecureChannel) {\n super(authToken, secureChannel);\n }\n}","export class ReadValueResult{\n constructor(public value:unknown, public status:string){}\n}","import { NodeId } from \"opcjs-base\";\n\nexport class SubscriptionHandlerEntry{\n constructor(\n public subscriptionId:number,\n public handle: number, \n public id:NodeId, \n public callback: (data: { id: NodeId, value: unknown }[]) => void\n ){}\n}","import { DataChangeNotification, NodeId, SubscriptionAcknowledgement } from \"opcjs-base\";\nimport { MonitoredItemService } from \"./services/monitoredItemService\";\nimport { SubscriptionService } from \"./services/subscriptionService\";\nimport { SubscriptionHandlerEntry } from \"./subscriptionHandlerEntry\";\n\nexport class SubscriptionHandler {\n private entries = new Array<SubscriptionHandlerEntry>()\n private nextHandle = 0\n\n async subscribe(ids: NodeId[], callback: (data: { id: NodeId, value: unknown }[]) => void) {\n if (this.entries.length > 0) {\n throw new Error('Subscribing more than once is not implemented');\n }\n\n const subscriptionId = await this.subscriptionService.createSubscription()\n const items = []\n for (const id of ids) {\n const entry = new SubscriptionHandlerEntry(\n subscriptionId,\n this.nextHandle++,\n id,\n callback\n );\n this.entries.push(entry)\n const item = {\n id: id,\n handle: entry.handle\n }\n items.push(item)\n }\n await this.monitoredItemService.createMonitoredItems(subscriptionId, items)\n this.publish([])\n }\n\n private async publish(acknowledgeSequenceNumbers: number[]) {\n const acknowledgements = []\n for (let i = 0; i < acknowledgeSequenceNumbers.length; i++) {\n const acknowledgement = new SubscriptionAcknowledgement();\n acknowledgement.subscriptionId = this.entries[i].subscriptionId;\n acknowledgement.sequenceNumber = acknowledgeSequenceNumbers[i];\n acknowledgements.push(acknowledgement);\n }\n const response = await this.subscriptionService.publish(acknowledgements);\n\n const messagesToAcknowledge = response.notificationMessage.sequenceNumber\n // todo: evaluatin status codes\n const notificationDatas = response.notificationMessage.notificationData\n\n for (const notificationData of notificationDatas) {\n const decodedData = notificationData.data;\n const typeNodeId = notificationData.typeId;\n if (typeNodeId.namespace === 0 && typeNodeId.identifier === 811) {\n const dataChangeNotification = decodedData as DataChangeNotification;\n for (const item of dataChangeNotification.monitoredItems) {\n const clientHandle = item.clientHandle;\n const value = item.value;\n const entry = this.entries.find(e => e.handle == clientHandle);\n entry?.callback([{\n id: entry.id,\n value: value.value?.value\n }]);\n }\n } else {\n console.log(`The change notification data type ${typeNodeId.namespace}:${typeNodeId.identifier} is not supported.`)\n }\n }\n\n setTimeout(() => {\n this.publish([messagesToAcknowledge]);\n }, 500);\n }\n\n constructor(\n private subscriptionService: SubscriptionService,\n private monitoredItemService: MonitoredItemService\n ) {\n }\n}","import {\n CreateSubscriptionRequest, CreateSubscriptionResponse, ISecureChannel, NodeId, PublishRequest,\n PublishResponse, SubscriptionAcknowledgement\n} from \"opcjs-base\";\nimport { ServiceBase } from \"./serviceBase\";\n\n// https://reference.opcfoundation.org/Core/Part4/v105/docs/5.14\nexport class SubscriptionService extends ServiceBase {\n // https://reference.opcfoundation.org/Core/Part4/v105/docs/5.14.2\n async createSubscription(): Promise<number> {\n const request = new CreateSubscriptionRequest();\n request.requestHeader = this.createRequestHeader();\n request.requestedPublishingInterval = 2000; // 2 sec\n request.requestedLifetimeCount = 360000; // 5 min\n request.requestedMaxKeepAliveCount = 60000; // 1 min\n request.maxNotificationsPerPublish = 200;\n request.publishingEnabled = true;\n request.priority = 1;\n\n\n console.log(\"Sending createSubscription...\");\n const response = await this.secureChannel.issueServiceRequest(request) as CreateSubscriptionResponse;\n console.log(\"Subscription created with id:\", response.subscriptionId);\n return response.subscriptionId;\n }\n\n // https://reference.opcfoundation.org/Core/Part4/v105/docs/5.14.5\n async publish(acknowledgements: SubscriptionAcknowledgement[]): Promise<PublishResponse> {\n const request = new PublishRequest();\n request.requestHeader = this.createRequestHeader();\n request.subscriptionAcknowledgements = acknowledgements;\n\n console.log('Sending publish...');\n const response = await this.secureChannel.issueServiceRequest(request) as PublishResponse;\n console.log('Received publish response.')\n return response;\n }\n\n constructor(authToken: NodeId, secureChannel: ISecureChannel) {\n super(authToken, secureChannel);\n }\n}","import { \n CreateMonitoredItemsRequest, CreateMonitoredItemsResponse, \n ExtensionObject, ISecureChannel, MonitoredItemCreateRequest, MonitoringModeEnum, MonitoringParameters, \n NodeId, QualifiedName, ReadValueId, TimestampsToReturnEnum } from \"opcjs-base\";\nimport { AttrIdValue } from \"./attributeServiceAttributes\";\nimport { ServiceBase } from \"./serviceBase\";\n\nexport class MonitoredItemService extends ServiceBase {\n\n async createMonitoredItems(subscriptionId: number, ids: { id: NodeId, handle: number }[]): Promise<void> {\n const items = ids.map(ni => {\n const readValueId = new ReadValueId();\n readValueId.nodeId = ni.id;\n readValueId.attributeId = AttrIdValue;\n readValueId.indexRange = '';\n readValueId.dataEncoding = new QualifiedName(0, '');\n\n const monitoringParameters = new MonitoringParameters();\n monitoringParameters.clientHandle = ni.handle;\n monitoringParameters.samplingInterval = 1000; // 1 sec\n monitoringParameters.filter = ExtensionObject.newEmpty();\n monitoringParameters.queueSize = 100;\n monitoringParameters.discardOldest = true;\n\n const monitoredItemCreateRequest = new MonitoredItemCreateRequest();\n monitoredItemCreateRequest.itemToMonitor = readValueId;\n monitoredItemCreateRequest.monitoringMode = MonitoringModeEnum.Reporting;\n monitoredItemCreateRequest.requestedParameters = monitoringParameters;\n return monitoredItemCreateRequest; \n });\n\n const request = new CreateMonitoredItemsRequest();\n request.requestHeader = this.createRequestHeader();\n request.subscriptionId = subscriptionId;\n request.timestampsToReturn = TimestampsToReturnEnum.Source;\n request.itemsToCreate = items;\n\n console.log(\"Sending createMonitoredItems...\");\n await this.secureChannel.issueServiceRequest(request) as CreateMonitoredItemsResponse;\n // todo: handle Statuscodes\n }\n\n constructor(authToken: NodeId, secureChannel: ISecureChannel) {\n super(authToken, secureChannel)\n }\n}","import { CallMethodRequest, CallRequest, CallResponse, ISecureChannel, NodeId } from \"opcjs-base\";\nimport { ServiceBase } from \"./serviceBase\";\nimport { StatusCodeToString } from \"../../../base/src/types/statusCode\";\n\n// https://reference.opcfoundation.org/Core/Part4/v105/docs/5.11\nexport class MethodService extends ServiceBase {\n\n /**\n * Calls one or more methods on the server (OPC UA Part 4, Section 5.11.2).\n * @param methodsToCall - Array of CallMethodRequest describing each method to invoke.\n * @returns Array of CallMethodResult, one per requested method.\n */\n async call(methodsToCall: CallMethodRequest[]): Promise<{ status: string, value: unknown[] }[]> {\n const request = new CallRequest();\n request.requestHeader = this.createRequestHeader();\n request.methodsToCall = methodsToCall;\n\n const response = await this.secureChannel.issueServiceRequest(request) as CallResponse;\n return response.results.map(result => ({\n status: StatusCodeToString(result.statusCode),\n value: result.outputArguments.map(arg => arg.value)\n }));\n }\n\n constructor(authToken: NodeId, secureChannel: ISecureChannel) {\n super(authToken, secureChannel);\n }\n}\n","export class CallMethodResult {\n constructor(public values:unknown[], public status:string){}\n}","import {\n BrowseDescription, BrowseNextRequest, BrowseNextResponse,\n BrowseRequest, BrowseResponse, BrowseResult,\n ISecureChannel, NodeId, UaByteString, ViewDescription\n} from \"opcjs-base\";\nimport { ServiceBase } from \"./serviceBase\";\n\n// https://reference.opcfoundation.org/Core/Part4/v105/docs/5.9\nexport class BrowseService extends ServiceBase {\n\n async browse(nodesToBrowse: BrowseDescription[]): Promise<BrowseResult[]> {\n const view = new ViewDescription();\n view.viewId = NodeId.newNumeric(0, 0);\n view.timestamp = new Date(-11644473600000); // OPC UA MinDateTime (ticks=0)\n view.viewVersion = 0;\n\n const request = new BrowseRequest();\n request.requestHeader = this.createRequestHeader();\n request.view = view;\n request.requestedMaxReferencesPerNode = 0;\n request.nodesToBrowse = nodesToBrowse;\n\n const response = await this.secureChannel\n .issueServiceRequest(request) as BrowseResponse;\n return response.results ?? [];\n }\n\n async browseNext(\n continuationPoints: UaByteString[],\n releaseContinuationPoints: boolean,\n ): Promise<BrowseResult[]> {\n const request = new BrowseNextRequest();\n request.requestHeader = this.createRequestHeader();\n request.releaseContinuationPoints = releaseContinuationPoints;\n request.continuationPoints = continuationPoints;\n\n const response = await this.secureChannel\n .issueServiceRequest(request) as BrowseNextResponse;\n return response.results ?? [];\n }\n\n constructor(authToken: NodeId, secureChannel: ISecureChannel) {\n super(authToken, secureChannel);\n }\n}\n","import {\n ExpandedNodeId, LocalizedText, NodeClassEnum,\n NodeId, QualifiedName\n} from \"opcjs-base\";\n\nexport class BrowseNodeResult {\n constructor(\n public referenceTypeId: NodeId,\n public isForward: boolean,\n public nodeId: ExpandedNodeId,\n public browseName: QualifiedName,\n public displayName: LocalizedText,\n public nodeClass: NodeClassEnum,\n public typeDefinition: ExpandedNodeId,\n ) {}\n}\n","import {\n NodeId,\n TcpConnectionHandler,\n SecureChannelFacade,\n SecureChannelContext,\n SecureChannelMesssageEncoder,\n SecureChannelTypeDecoder,\n SecureChannelMessageDecoder,\n SecureChannelTypeEncoder,\n initLoggerProvider,\n TcpMessageInjector,\n TcpMessageDecoupler,\n getLogger,\n WebSocketFascade,\n WebSocketReadableStream,\n WebSocketWritableStream,\n SecureChannelChunkReader,\n SecureChannelChunkWriter,\n CallMethodRequest,\n Variant,\n BrowseDescription,\n BrowseDirectionEnum,\n BrowseResultMaskEnum,\n ReferenceDescription,\n} from \"opcjs-base\";\nimport { SessionHandler } from \"./sessions/sessionHandler\";\nimport { Session } from \"./sessions/session\";\nimport { AttributeService } from \"./services/attributeService\";\nimport { ReadValueResult } from \"./readValueResult\";\nimport { SubscriptionHandler } from \"./subscriptionHandler\";\nimport { SubscriptionService } from \"./services/subscriptionService\";\nimport { MonitoredItemService } from \"./services/monitoredItemService\";\nimport { UserIdentity } from \"./userIdentity\";\nimport { ConfigurationClient } from \"./configurationClient\";\nimport { ILogger } from \"opcjs-base\";\nimport { MethodService } from \"./services/methodService\";\nimport { CallMethodResult } from \"./callMethodResult\";\nimport { BrowseService } from \"./services/browseService\";\nimport { BrowseNodeResult } from \"./browseNodeResult\";\nimport { UaPrimitive } from \"../../base/src/types/primitives\";\n\nexport class Client {\n private endpointUrl: string;\n private attributeService?: AttributeService;\n private methodService?: MethodService;\n private browseService?: BrowseService;\n private session?: Session;\n private subscriptionHandler?: SubscriptionHandler;\n private logger: ILogger;\n\n getSession(): Session {\n if (!this.session) {\n throw new Error(\"No session available\");\n }\n return this.session;\n }\n\n async connect(): Promise<void> {\n\n const wsOptions = { endpoint: this.endpointUrl }\n const ws = new WebSocketFascade(wsOptions);\n const webSocketReadableStream = new WebSocketReadableStream(ws, 1000);\n const webSocketWritableStream = new WebSocketWritableStream(ws);\n\n const scContext = new SecureChannelContext(this.endpointUrl);\n const tcpMessageInjector = new TcpMessageInjector();\n const tcpConnectionHandler = new TcpConnectionHandler(tcpMessageInjector, scContext);\n const tcpMessageDecoupler = new TcpMessageDecoupler(tcpConnectionHandler.onTcpMessage.bind(tcpConnectionHandler));\n const scMessageEncoder = new SecureChannelMesssageEncoder(scContext);\n const scTypeDecoder = new SecureChannelTypeDecoder(\n this.configuration.decoder,\n );\n const scMessageDecoder = new SecureChannelMessageDecoder(scContext);\n const scTypeEncoder = new SecureChannelTypeEncoder(\n this.configuration.encoder,\n );\n const scChunkWriter = new SecureChannelChunkWriter(scContext);\n const scChunkReader = new SecureChannelChunkReader(scContext);\n\n webSocketReadableStream.pipeTo(tcpMessageDecoupler.writable);\n tcpMessageDecoupler.readable.pipeTo(scMessageDecoder.writable);\n scMessageDecoder.readable.pipeTo(scChunkReader.writable);\n scChunkReader.readable.pipeTo(scTypeDecoder.writable);\n\n scTypeEncoder.readable.pipeTo(scChunkWriter.writable);\n scChunkWriter.readable.pipeTo(scMessageEncoder.writable);\n scMessageEncoder.readable.pipeTo(tcpMessageInjector.writable);\n tcpMessageInjector.readable.pipeTo(webSocketWritableStream);\n\n const sc = new SecureChannelFacade(scContext, scTypeDecoder, scTypeEncoder);\n\n // const response = await sc.send(request, wsWritable);\n\n //const channel = ChannelFactory.createChannel(this.endpointUrl);\n let connected = false;\n while (!connected) {\n this.logger.debug(`Connecting to OPC UA server at ${this.endpointUrl}...`);\n await ws.connect();\n this.logger.debug(\"WebSocket connection established, now establishing TCP connection...\");\n connected = await tcpConnectionHandler.connect(this.endpointUrl);\n\n if (!connected) {\n this.logger.info(\"Connection failed, retrying in 2 seconds...\");\n await new Promise((resolve) => setTimeout(resolve, 2000));\n }\n }\n this.logger.info(\"Connected to OPC UA server.\");\n\n //this.channel = new SecureChannel(channel, this.configuration);\n this.logger.debug(\"Opening secure channel...\");\n await sc.openSecureChannel();\n this.logger.debug(\"Secure channel established.\");\n\n this.logger.debug(\"Creating session...\");\n const sessionHandler = new SessionHandler(sc, this.configuration);\n this.session = await sessionHandler.createNewSession(this.identity);\n this.logger.debug(\"Session created.\");\n\n this.logger.debug(\"Initializing services...\");\n this.attributeService = new AttributeService(this.session.getAuthToken(), sc);\n this.methodService = new MethodService(this.session.getAuthToken(), sc);\n this.browseService = new BrowseService(this.session.getAuthToken(), sc);\n this.subscriptionHandler = new SubscriptionHandler(\n new SubscriptionService(this.session.getAuthToken(), sc),\n new MonitoredItemService(this.session.getAuthToken(), sc),\n );\n }\n\n async disconnect(): Promise<void> {\n this.logger.info(\"Disconnecting from OPC UA server...\");\n // Implementation of disconnection logic goes here\n // if (this.channel) {\n // await this.channel.disconnect();\n // }\n }\n\n async read(ids: NodeId[]): Promise<ReadValueResult[]> {\n const result = await this.attributeService?.ReadValue(ids);\n return result?.map((r) => new ReadValueResult(r.value, r.status)) || [];\n }\n\n /**\n * Method for calling a single method on the server.\n * @param objectId - NodeId of the Object that owns the method.\n * @param methodId - NodeId of the Method to invoke.\n * @param inputArguments - Input argument Variants (default: empty).\n * @returns The CallMethodResult for the invoked method.\n */\n async callMethod(\n objectId: NodeId,\n methodId: NodeId,\n inputArguments: UaPrimitive[] = []\n ): Promise<CallMethodResult> {\n const request = new CallMethodRequest();\n request.objectId = objectId;\n request.methodId = methodId;\n request.inputArguments = inputArguments.map(arg => Variant.newFrom(arg));\n\n const responses = await this.methodService!.call([request]);\n const response = responses[0];\n\n return new CallMethodResult(response.value, response.status);\n }\n\n async browse(\n nodeId: NodeId,\n recursive: boolean = false,\n ): Promise<BrowseNodeResult[]> {\n const visited = new Set<string>();\n return this.browseRecursive(nodeId, recursive, visited);\n }\n\n private async browseRecursive(\n nodeId: NodeId,\n recursive: boolean,\n visited: Set<string>,\n ): Promise<BrowseNodeResult[]> {\n const nodeKey = `${nodeId.namespace}:${nodeId.identifier}`;\n if (visited.has(nodeKey)) {\n return [];\n }\n visited.add(nodeKey);\n\n const description = new BrowseDescription();\n description.nodeId = nodeId;\n description.browseDirection = BrowseDirectionEnum.Forward;\n description.referenceTypeId = NodeId.newNumeric(0, 33); // HierarchicalReferences\n description.includeSubtypes = true;\n description.nodeClassMask = 0; // all node classes\n description.resultMask = BrowseResultMaskEnum.All;\n\n const browseResults = await this.browseService!.browse([description]);\n const browseResult = browseResults[0];\n const allReferences = [...(browseResult.references ?? [])];\n\n let continuationPoint = browseResult.continuationPoint;\n while (continuationPoint && continuationPoint.byteLength > 0) {\n const nextResults = await this.browseService!\n .browseNext([continuationPoint], false);\n const nextResult = nextResults[0];\n allReferences.push(...(nextResult.references ?? []));\n continuationPoint = nextResult.continuationPoint;\n }\n\n const results = allReferences.map((ref: ReferenceDescription) =>\n new BrowseNodeResult(\n ref.referenceTypeId,\n ref.isForward,\n ref.nodeId,\n ref.browseName,\n ref.displayName,\n ref.nodeClass,\n ref.typeDefinition,\n )\n );\n\n if (recursive) {\n for (const ref of allReferences) {\n const childNodeId = NodeId.newNumeric(\n ref.nodeId.namespace,\n ref.nodeId.identifier as number,\n );\n const childResults = await this.browseRecursive(\n childNodeId, true, visited,\n );\n results.push(...childResults);\n }\n }\n\n return results;\n }\n\n async subscribe(\n ids: NodeId[],\n callback: (data: { id: NodeId; value: unknown }[]) => void,\n ) {\n this.subscriptionHandler?.subscribe(ids, callback);\n }\n\n constructor(\n endpointUrl: string,\n private configuration: ConfigurationClient,\n private identity: UserIdentity,\n ) {\n this.endpointUrl = endpointUrl;\n initLoggerProvider(configuration.loggerFactory);\n this.logger = getLogger(\"Client\");\n }\n}\n","import {\n BinaryReader,\n BinaryWriter,\n Configuration,\n Decoder,\n Encoder,\n ILoggerFactory,\n LoggerFactory,\n registerBinaryDecoders,\n registerEncoders,\n registerTypeDecoders\n} from \"opcjs-base\";\n\nexport class ConfigurationClient extends Configuration {\n public static getSimple(\n name: string,\n company: string,\n loggerFactory?: ILoggerFactory,\n ): ConfigurationClient {\n\n if (!loggerFactory) {\n loggerFactory = new LoggerFactory({\n defaultLevel: 'DEBUG', //todo: use enum\n categoryLevels: {\n \"transport.*\": \"TRACE\",\n \"secureChannel.*\": \"TRACE\",\n },\n });\n }\n const applicationUri = `urn:${company}:${name}`;\n const productUri = `urn:${company}:${name}:product`;\n\n const encoder = new Encoder();\n encoder.registerWriterFactory(\"binary\", () => {\n return new BinaryWriter();\n });\n registerEncoders(encoder);\n\n const decoder = new Decoder();\n decoder.registerReaderFactory(\"binary\", (data: unknown) => {\n return new BinaryReader(data as Uint8Array);\n });\n registerTypeDecoders(decoder);\n registerBinaryDecoders(decoder);\n\n return new ConfigurationClient(\n name,\n applicationUri,\n name,\n productUri,\n encoder,\n decoder,\n loggerFactory,\n );\n }\n\n constructor(\n applicationName: string,\n applicationUri: string,\n productName: string,\n productUri: string,\n encoder: Encoder,\n decoder: Decoder,\n loggerFactory: ILoggerFactory,\n ) {\n super(\n applicationName,\n applicationUri,\n productName,\n productUri,\n encoder,\n decoder,\n loggerFactory,\n );\n }\n}\n","import { IssuedIdentityToken, UserIdentityToken, UserNameIdentityToken, UserTokenTypeEnum } from \"opcjs-base\";\nimport { IssuerConfiguration } from \"./issuerConfiguration\";\nimport { IssuerToken } from \"./issuerToken\";\nimport { AnonymousIdentityToken } from \"opcjs-base\";\n\nexport class UserIdentity {\n private userIdentityToken?: UserIdentityToken;\n private tokenType = UserTokenTypeEnum.Anonymous;\n private issuerLoginCallback: ((config:IssuerConfiguration)=>Promise<IssuerToken>) | undefined = undefined;\n\n public static newAnonymous(): UserIdentity {\n const userIdentity = new UserIdentity();\n userIdentity.userIdentityToken = new AnonymousIdentityToken();\n userIdentity.userIdentityToken.policyId = \"anonymous\";\n userIdentity.tokenType = UserTokenTypeEnum.Anonymous;\n return userIdentity;\n }\n \n public static newWithUserName(userName: string, password: string): UserIdentity {\n const userIdentity = new UserIdentity();\n const nameToken = new UserNameIdentityToken();\n nameToken.userName = userName;\n nameToken.password = new TextEncoder().encode(password);\n\n userIdentity.userIdentityToken = nameToken;\n userIdentity.tokenType = UserTokenTypeEnum.UserName;\n return userIdentity;\n }\n\n public static newWithIssuerToken(loginCallback: (config:IssuerConfiguration)=>Promise<IssuerToken>): UserIdentity {\n const userIdentity = new UserIdentity();\n const issuedToken = new IssuedIdentityToken();\n issuedToken.tokenData = new TextEncoder().encode(\"\"); // token data will be filled by the login callback \n userIdentity.userIdentityToken = issuedToken;\n userIdentity.tokenType = UserTokenTypeEnum.IssuedToken;\n userIdentity.issuerLoginCallback = loginCallback;\n return userIdentity;\n }\n\n public getUserIdentityToken(): UserIdentityToken {\n return this.userIdentityToken as UserIdentityToken;\n }\n\n public getTokenType(): UserTokenTypeEnum {\n return this.tokenType;\n }\n\n public getIssuerLoginCallback(): ((config:IssuerConfiguration)=>Promise<IssuerToken>) {\n if(!this.issuerLoginCallback){\n throw new Error(\"No issuer login callback defined\");\n }\n \n return this.issuerLoginCallback;\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "opcjs-client",
3
- "version": "0.1.16-alpha",
3
+ "version": "0.1.18-alpha",
4
4
  "description": "A client for OPC UA communication.",
5
5
  "repository": {
6
6
  "type": "git",