opcjs-client 0.1.8 → 0.1.10

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
@@ -57,9 +57,13 @@ var SessionService = class _SessionService extends ServiceBase {
57
57
  throw new Error("CreateSessionResponse missing SessionId or AuthenticationToken");
58
58
  }
59
59
  const endpoint = "opc." + this.secureChannel.getEndpointUrl();
60
+ const endpointUrl = new URL(endpoint);
60
61
  const securityMode = this.secureChannel.getSecurityMode();
61
62
  const securityPolicyUri = this.secureChannel.getSecurityPolicy();
62
- const serverEndpoint = castedResponse?.serverEndpoints?.find((ep) => ep.endpointUrl === endpoint && ep.securityMode === securityMode && ep.securityPolicyUri === securityPolicyUri);
63
+ const serverEndpoint = castedResponse?.serverEndpoints?.find((currentEndpoint) => {
64
+ const currentEndpointUrl = new URL(currentEndpoint.endpointUrl);
65
+ return currentEndpointUrl.protocol === endpointUrl.protocol && currentEndpointUrl.pathname === endpointUrl.pathname && currentEndpointUrl.port === endpointUrl.port && currentEndpoint.securityMode === securityMode && currentEndpoint.securityPolicyUri === securityPolicyUri;
66
+ });
63
67
  if (!serverEndpoint) {
64
68
  throw new Error(`Server endpoint ${endpoint} not found in CreateSessionResponse`);
65
69
  }
@@ -328,6 +332,7 @@ var MonitoredItemService = class extends ServiceBase {
328
332
  monitoringParameters.discardOldest = true;
329
333
  const monitoredItemCreateRequest = new opcjsBase.MonitoredItemCreateRequest();
330
334
  monitoredItemCreateRequest.itemToMonitor = readValueId;
335
+ monitoredItemCreateRequest.monitoringMode = opcjsBase.MonitoringModeEnum.Reporting;
331
336
  monitoredItemCreateRequest.requestedParameters = monitoringParameters;
332
337
  return monitoredItemCreateRequest;
333
338
  });
@@ -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","../src/services/attributeService.ts","../src/readValueResult.ts","../src/subscriptionHandlerEntry.ts","../src/subscriptionHandler.ts","../src/services/subscriptionService.ts","../src/services/monitoredItemService.ts","../src/client.ts","../src/configurationClient.ts","../src/id.ts","../src/userIdentity.ts"],"names":["RequestHeader","ExtensionObject","ApplicationDescription","LocalizedText","ApplicationTypeEnum","CreateSessionRequest","CreateSessionResponse","SignatureData","ActivateSessionRequest","UserTokenTypeEnum","NodeId","ReadValueId","QualifiedName","ReadRequest","TimestampsToReturnEnum","SubscriptionAcknowledgement","CreateSubscriptionRequest","PublishRequest","MonitoringParameters","MonitoredItemCreateRequest","CreateMonitoredItemsRequest","ChannelFactory","SecureChannel","Configuration","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 ISecureChannel, LocalizedText, NodeId, SignatureData, SignedSoftwareCertificate, UserIdentityToken\n} from \"opcjs-base\";\nimport { ServiceBase } from \"./serviceBase\";\n\nexport class SessionService extends ServiceBase {\n async createSession(): Promise<{ sessionId: number, authToken: NodeId, endpoint: EndpointDescription }> {\n console.log(\"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 console.log(\"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 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(ep => ep.endpointUrl === endpoint\n && ep.securityMode === securityMode\n && ep.securityPolicyUri === securityPolicyUri);\n\n if (!serverEndpoint) {\n throw new Error(`Server endpoint ${endpoint} not found in CreateSessionResponse`);\n }\n\n console.log(\"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 console.log(\"Sending ActivateSessionRequest...\");\n await this.secureChannel.issueServiceRequest(request);\n console.log(\"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}","export class IssuerConfiguration{\n public static newFrom(issuerEndpointUrl: any): 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","import { ISecureChannel, NodeId, QualifiedName, ReadRequest, ReadResponse, ReadValueId, TimestampsToReturnEnum } from \"opcjs-base\";\nimport { AttrIdValue } from \"./attributeServiceAttributes\";\nimport { ServiceBase } from \"./serviceBase\";\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 (let dataValue of response.results ?? []) {\n const result = {\n status: dataValue.statusCode?.toString() ?? 'Unknown',\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 { Id } from \"./id\";\n\nexport class SubscriptionHandlerEntry{\n constructor(\n public subscriptionId:number,\n public handle: number, \n public id:Id, \n public callback: (data: { id: Id, value: unknown }[]) => void\n ){}\n}","import { DataChangeNotification, SubscriptionAcknowledgement } from \"opcjs-base\";\nimport { Id } from \"./id\";\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: Id[], callback: (data: { id: Id, 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 (let 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.toNodeId(),\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 (let 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 (let 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, 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.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 { SecureChannel } from \"opcjs-base\";\nimport { ChannelFactory } from \"opcjs-base\";\nimport { SessionHandler } from \"./sessions/sessionHandler\";\nimport { ISecureChannel } from \"opcjs-base\";\nimport { Session } from \"./sessions/session\";\nimport { Id } from \"./id\";\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\";\n\nexport class Client {\n\n private endpointUrl: string;\n private channel?: SecureChannel;\n private session?: Session;\n private subscriptionHandler?:SubscriptionHandler;\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 const channel = ChannelFactory.createChannel(this.endpointUrl);\n let connected = false;\n while (!connected){\n console.log(`Connecting to OPC UA server at ${this.endpointUrl}...`);\n connected = await channel.connect();\n if(!connected){\n console.log(\"Connection failed, retrying in 2 seconds...\");\n await new Promise(resolve => setTimeout(resolve, 2000));\n }\n }\n console.log('Connected to OPC UA server.');\n\n this.channel = new SecureChannel(channel, this.configuration);\n await this.channel.openSecureChannelRequest();\n\n const sessionHandler = new SessionHandler(this.channel, this.configuration);\n this.session = await sessionHandler.createNewSession(this.identity);\n this.subscriptionHandler = new SubscriptionHandler(\n new SubscriptionService(this.session.getAuthToken(), this.channel),\n new MonitoredItemService(this.session.getAuthToken(), this.channel)\n )\n }\n\n async disconnect(): Promise<void> {\n console.log('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: Id[]):Promise<ReadValueResult[]>{\n const service = new AttributeService(this.getSession().getAuthToken(), this.channel as ISecureChannel);\n const result = await service.ReadValue(ids.map(i => i.toNodeId()))\n return result.map(r => new ReadValueResult(r.value, r.status))\n }\n\n async subscribe(ids: Id[], callback: (data: {id:Id, value:unknown}[]) => void){\n this.subscriptionHandler?.subscribe(ids, callback)\n }\n\n constructor(endpointUrl: string, private configuration: ConfigurationClient, private identity: UserIdentity) {\n this.endpointUrl = endpointUrl;\n }\n}","import { BinaryReader, BinaryWriter, Configuration, Decoder, Encoder, registerBinaryDecoders, registerEncoders, registerTypeDecoders } from \"opcjs-base\";\n\nexport class ConfigurationClient extends Configuration {\n public static getSimple(name:string, company:string): \n ConfigurationClient {\n\n const applicationUri = `urn:${company}:${name}`;\n const productUri = `urn:${company}:${name}:product`;\n\n const encoder = new Encoder();\n encoder.registerWriterFactory('binary', () => { return new BinaryWriter();});\n registerEncoders(encoder);\n\n const decoder = new Decoder();\n decoder.registerReaderFactory('binary', (data:unknown) => { return new BinaryReader(data as Uint8Array);});\n registerTypeDecoders(decoder);\n registerBinaryDecoders(decoder);\n \n return new ConfigurationClient(name, applicationUri, name, productUri, encoder, decoder);\n }\n\n constructor(\n applicationName:string,\n applicationUri:string,\n productName:string,\n productUri:string,\n encoder: Encoder,\n decoder: Decoder) {\n super(applicationName, applicationUri, productName, productUri, encoder, decoder);\n }\n}","import { NodeId } from \"opcjs-base\";\n\nexport class Id {\n static newId(namespace: number, identifier: string) {\n return new Id(new NodeId(namespace, identifier));\n }\n\n toNodeId(){\n return this.nodeId\n }\n\n toString(){\n return `${this.nodeId.namespace}:${this.nodeId.identifier}`\n }\n\n constructor(private nodeId: NodeId) { }\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","../src/services/attributeService.ts","../src/readValueResult.ts","../src/subscriptionHandlerEntry.ts","../src/subscriptionHandler.ts","../src/services/subscriptionService.ts","../src/services/monitoredItemService.ts","../src/client.ts","../src/configurationClient.ts","../src/id.ts","../src/userIdentity.ts"],"names":["RequestHeader","ExtensionObject","ApplicationDescription","LocalizedText","ApplicationTypeEnum","CreateSessionRequest","CreateSessionResponse","SignatureData","ActivateSessionRequest","UserTokenTypeEnum","NodeId","ReadValueId","QualifiedName","ReadRequest","TimestampsToReturnEnum","SubscriptionAcknowledgement","CreateSubscriptionRequest","PublishRequest","MonitoringParameters","MonitoredItemCreateRequest","MonitoringModeEnum","CreateMonitoredItemsRequest","ChannelFactory","SecureChannel","Configuration","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 ISecureChannel, LocalizedText, NodeId, SignatureData, SignedSoftwareCertificate, UserIdentityToken\n} from \"opcjs-base\";\nimport { ServiceBase } from \"./serviceBase\";\n\nexport class SessionService extends ServiceBase {\n async createSession(): Promise<{ sessionId: number, authToken: NodeId, endpoint: EndpointDescription }> {\n console.log(\"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 console.log(\"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 console.log(\"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 console.log(\"Sending ActivateSessionRequest...\");\n await this.secureChannel.issueServiceRequest(request);\n console.log(\"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}","export class IssuerConfiguration{\n public static newFrom(issuerEndpointUrl: any): 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","import { ISecureChannel, NodeId, QualifiedName, ReadRequest, ReadResponse, ReadValueId, TimestampsToReturnEnum } from \"opcjs-base\";\nimport { AttrIdValue } from \"./attributeServiceAttributes\";\nimport { ServiceBase } from \"./serviceBase\";\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 (let dataValue of response.results ?? []) {\n const result = {\n status: dataValue.statusCode?.toString() ?? 'Unknown',\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 { Id } from \"./id\";\n\nexport class SubscriptionHandlerEntry{\n constructor(\n public subscriptionId:number,\n public handle: number, \n public id:Id, \n public callback: (data: { id: Id, value: unknown }[]) => void\n ){}\n}","import { DataChangeNotification, SubscriptionAcknowledgement } from \"opcjs-base\";\nimport { Id } from \"./id\";\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: Id[], callback: (data: { id: Id, 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 (let 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.toNodeId(),\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 (let 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 (let 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 { SecureChannel } from \"opcjs-base\";\nimport { ChannelFactory } from \"opcjs-base\";\nimport { SessionHandler } from \"./sessions/sessionHandler\";\nimport { ISecureChannel } from \"opcjs-base\";\nimport { Session } from \"./sessions/session\";\nimport { Id } from \"./id\";\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\";\n\nexport class Client {\n\n private endpointUrl: string;\n private channel?: SecureChannel;\n private session?: Session;\n private subscriptionHandler?:SubscriptionHandler;\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 const channel = ChannelFactory.createChannel(this.endpointUrl);\n let connected = false;\n while (!connected){\n console.log(`Connecting to OPC UA server at ${this.endpointUrl}...`);\n connected = await channel.connect();\n if(!connected){\n console.log(\"Connection failed, retrying in 2 seconds...\");\n await new Promise(resolve => setTimeout(resolve, 2000));\n }\n }\n console.log('Connected to OPC UA server.');\n\n this.channel = new SecureChannel(channel, this.configuration);\n await this.channel.openSecureChannelRequest();\n\n const sessionHandler = new SessionHandler(this.channel, this.configuration);\n this.session = await sessionHandler.createNewSession(this.identity);\n this.subscriptionHandler = new SubscriptionHandler(\n new SubscriptionService(this.session.getAuthToken(), this.channel),\n new MonitoredItemService(this.session.getAuthToken(), this.channel)\n )\n }\n\n async disconnect(): Promise<void> {\n console.log('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: Id[]):Promise<ReadValueResult[]>{\n const service = new AttributeService(this.getSession().getAuthToken(), this.channel as ISecureChannel);\n const result = await service.ReadValue(ids.map(i => i.toNodeId()))\n return result.map(r => new ReadValueResult(r.value, r.status))\n }\n\n async subscribe(ids: Id[], callback: (data: {id:Id, value:unknown}[]) => void){\n this.subscriptionHandler?.subscribe(ids, callback)\n }\n\n constructor(endpointUrl: string, private configuration: ConfigurationClient, private identity: UserIdentity) {\n this.endpointUrl = endpointUrl;\n }\n}","import { BinaryReader, BinaryWriter, Configuration, Decoder, Encoder, registerBinaryDecoders, registerEncoders, registerTypeDecoders } from \"opcjs-base\";\n\nexport class ConfigurationClient extends Configuration {\n public static getSimple(name:string, company:string): \n ConfigurationClient {\n\n const applicationUri = `urn:${company}:${name}`;\n const productUri = `urn:${company}:${name}:product`;\n\n const encoder = new Encoder();\n encoder.registerWriterFactory('binary', () => { return new BinaryWriter();});\n registerEncoders(encoder);\n\n const decoder = new Decoder();\n decoder.registerReaderFactory('binary', (data:unknown) => { return new BinaryReader(data as Uint8Array);});\n registerTypeDecoders(decoder);\n registerBinaryDecoders(decoder);\n \n return new ConfigurationClient(name, applicationUri, name, productUri, encoder, decoder);\n }\n\n constructor(\n applicationName:string,\n applicationUri:string,\n productName:string,\n productUri:string,\n encoder: Encoder,\n decoder: Decoder) {\n super(applicationName, applicationUri, productName, productUri, encoder, decoder);\n }\n}","import { NodeId } from \"opcjs-base\";\n\nexport class Id {\n static newId(namespace: number, identifier: string) {\n return new Id(new NodeId(namespace, identifier));\n }\n\n toNodeId(){\n return this.nodeId\n }\n\n toString(){\n return `${this.nodeId.namespace}:${this.nodeId.identifier}`\n }\n\n constructor(private nodeId: NodeId) { }\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.js CHANGED
@@ -1,4 +1,4 @@
1
- import { ChannelFactory, SecureChannel, Configuration, Encoder, BinaryWriter, registerEncoders, Decoder, BinaryReader, registerTypeDecoders, registerBinaryDecoders, NodeId, UserTokenTypeEnum, AnonymousIdentityToken, UserNameIdentityToken, IssuedIdentityToken, SubscriptionAcknowledgement, CreateSubscriptionRequest, PublishRequest, ReadValueId, QualifiedName, MonitoringParameters, ExtensionObject, MonitoredItemCreateRequest, CreateMonitoredItemsRequest, TimestampsToReturnEnum, ReadRequest, ApplicationDescription, LocalizedText, ApplicationTypeEnum, CreateSessionRequest, CreateSessionResponse, SignatureData, ActivateSessionRequest, RequestHeader } from 'opcjs-base';
1
+ import { ChannelFactory, SecureChannel, Configuration, Encoder, BinaryWriter, registerEncoders, Decoder, BinaryReader, registerTypeDecoders, registerBinaryDecoders, NodeId, UserTokenTypeEnum, AnonymousIdentityToken, UserNameIdentityToken, IssuedIdentityToken, SubscriptionAcknowledgement, CreateSubscriptionRequest, PublishRequest, ReadValueId, QualifiedName, MonitoringParameters, ExtensionObject, MonitoredItemCreateRequest, MonitoringModeEnum, CreateMonitoredItemsRequest, TimestampsToReturnEnum, ReadRequest, ApplicationDescription, LocalizedText, ApplicationTypeEnum, CreateSessionRequest, CreateSessionResponse, SignatureData, ActivateSessionRequest, RequestHeader } from 'opcjs-base';
2
2
 
3
3
  // src/client.ts
4
4
  var ServiceBase = class {
@@ -55,9 +55,13 @@ var SessionService = class _SessionService extends ServiceBase {
55
55
  throw new Error("CreateSessionResponse missing SessionId or AuthenticationToken");
56
56
  }
57
57
  const endpoint = "opc." + this.secureChannel.getEndpointUrl();
58
+ const endpointUrl = new URL(endpoint);
58
59
  const securityMode = this.secureChannel.getSecurityMode();
59
60
  const securityPolicyUri = this.secureChannel.getSecurityPolicy();
60
- const serverEndpoint = castedResponse?.serverEndpoints?.find((ep) => ep.endpointUrl === endpoint && ep.securityMode === securityMode && ep.securityPolicyUri === securityPolicyUri);
61
+ const serverEndpoint = castedResponse?.serverEndpoints?.find((currentEndpoint) => {
62
+ const currentEndpointUrl = new URL(currentEndpoint.endpointUrl);
63
+ return currentEndpointUrl.protocol === endpointUrl.protocol && currentEndpointUrl.pathname === endpointUrl.pathname && currentEndpointUrl.port === endpointUrl.port && currentEndpoint.securityMode === securityMode && currentEndpoint.securityPolicyUri === securityPolicyUri;
64
+ });
61
65
  if (!serverEndpoint) {
62
66
  throw new Error(`Server endpoint ${endpoint} not found in CreateSessionResponse`);
63
67
  }
@@ -326,6 +330,7 @@ var MonitoredItemService = class extends ServiceBase {
326
330
  monitoringParameters.discardOldest = true;
327
331
  const monitoredItemCreateRequest = new MonitoredItemCreateRequest();
328
332
  monitoredItemCreateRequest.itemToMonitor = readValueId;
333
+ monitoredItemCreateRequest.monitoringMode = MonitoringModeEnum.Reporting;
329
334
  monitoredItemCreateRequest.requestedParameters = monitoringParameters;
330
335
  return monitoredItemCreateRequest;
331
336
  });
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","../src/services/attributeService.ts","../src/readValueResult.ts","../src/subscriptionHandlerEntry.ts","../src/subscriptionHandler.ts","../src/services/subscriptionService.ts","../src/services/monitoredItemService.ts","../src/client.ts","../src/configurationClient.ts","../src/id.ts","../src/userIdentity.ts"],"names":["ExtensionObject","NodeId","ReadValueId","QualifiedName","TimestampsToReturnEnum","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 ISecureChannel, LocalizedText, NodeId, SignatureData, SignedSoftwareCertificate, UserIdentityToken\n} from \"opcjs-base\";\nimport { ServiceBase } from \"./serviceBase\";\n\nexport class SessionService extends ServiceBase {\n async createSession(): Promise<{ sessionId: number, authToken: NodeId, endpoint: EndpointDescription }> {\n console.log(\"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 console.log(\"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 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(ep => ep.endpointUrl === endpoint\n && ep.securityMode === securityMode\n && ep.securityPolicyUri === securityPolicyUri);\n\n if (!serverEndpoint) {\n throw new Error(`Server endpoint ${endpoint} not found in CreateSessionResponse`);\n }\n\n console.log(\"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 console.log(\"Sending ActivateSessionRequest...\");\n await this.secureChannel.issueServiceRequest(request);\n console.log(\"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}","export class IssuerConfiguration{\n public static newFrom(issuerEndpointUrl: any): 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","import { ISecureChannel, NodeId, QualifiedName, ReadRequest, ReadResponse, ReadValueId, TimestampsToReturnEnum } from \"opcjs-base\";\nimport { AttrIdValue } from \"./attributeServiceAttributes\";\nimport { ServiceBase } from \"./serviceBase\";\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 (let dataValue of response.results ?? []) {\n const result = {\n status: dataValue.statusCode?.toString() ?? 'Unknown',\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 { Id } from \"./id\";\n\nexport class SubscriptionHandlerEntry{\n constructor(\n public subscriptionId:number,\n public handle: number, \n public id:Id, \n public callback: (data: { id: Id, value: unknown }[]) => void\n ){}\n}","import { DataChangeNotification, SubscriptionAcknowledgement } from \"opcjs-base\";\nimport { Id } from \"./id\";\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: Id[], callback: (data: { id: Id, 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 (let 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.toNodeId(),\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 (let 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 (let 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, 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.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 { SecureChannel } from \"opcjs-base\";\nimport { ChannelFactory } from \"opcjs-base\";\nimport { SessionHandler } from \"./sessions/sessionHandler\";\nimport { ISecureChannel } from \"opcjs-base\";\nimport { Session } from \"./sessions/session\";\nimport { Id } from \"./id\";\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\";\n\nexport class Client {\n\n private endpointUrl: string;\n private channel?: SecureChannel;\n private session?: Session;\n private subscriptionHandler?:SubscriptionHandler;\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 const channel = ChannelFactory.createChannel(this.endpointUrl);\n let connected = false;\n while (!connected){\n console.log(`Connecting to OPC UA server at ${this.endpointUrl}...`);\n connected = await channel.connect();\n if(!connected){\n console.log(\"Connection failed, retrying in 2 seconds...\");\n await new Promise(resolve => setTimeout(resolve, 2000));\n }\n }\n console.log('Connected to OPC UA server.');\n\n this.channel = new SecureChannel(channel, this.configuration);\n await this.channel.openSecureChannelRequest();\n\n const sessionHandler = new SessionHandler(this.channel, this.configuration);\n this.session = await sessionHandler.createNewSession(this.identity);\n this.subscriptionHandler = new SubscriptionHandler(\n new SubscriptionService(this.session.getAuthToken(), this.channel),\n new MonitoredItemService(this.session.getAuthToken(), this.channel)\n )\n }\n\n async disconnect(): Promise<void> {\n console.log('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: Id[]):Promise<ReadValueResult[]>{\n const service = new AttributeService(this.getSession().getAuthToken(), this.channel as ISecureChannel);\n const result = await service.ReadValue(ids.map(i => i.toNodeId()))\n return result.map(r => new ReadValueResult(r.value, r.status))\n }\n\n async subscribe(ids: Id[], callback: (data: {id:Id, value:unknown}[]) => void){\n this.subscriptionHandler?.subscribe(ids, callback)\n }\n\n constructor(endpointUrl: string, private configuration: ConfigurationClient, private identity: UserIdentity) {\n this.endpointUrl = endpointUrl;\n }\n}","import { BinaryReader, BinaryWriter, Configuration, Decoder, Encoder, registerBinaryDecoders, registerEncoders, registerTypeDecoders } from \"opcjs-base\";\n\nexport class ConfigurationClient extends Configuration {\n public static getSimple(name:string, company:string): \n ConfigurationClient {\n\n const applicationUri = `urn:${company}:${name}`;\n const productUri = `urn:${company}:${name}:product`;\n\n const encoder = new Encoder();\n encoder.registerWriterFactory('binary', () => { return new BinaryWriter();});\n registerEncoders(encoder);\n\n const decoder = new Decoder();\n decoder.registerReaderFactory('binary', (data:unknown) => { return new BinaryReader(data as Uint8Array);});\n registerTypeDecoders(decoder);\n registerBinaryDecoders(decoder);\n \n return new ConfigurationClient(name, applicationUri, name, productUri, encoder, decoder);\n }\n\n constructor(\n applicationName:string,\n applicationUri:string,\n productName:string,\n productUri:string,\n encoder: Encoder,\n decoder: Decoder) {\n super(applicationName, applicationUri, productName, productUri, encoder, decoder);\n }\n}","import { NodeId } from \"opcjs-base\";\n\nexport class Id {\n static newId(namespace: number, identifier: string) {\n return new Id(new NodeId(namespace, identifier));\n }\n\n toNodeId(){\n return this.nodeId\n }\n\n toString(){\n return `${this.nodeId.namespace}:${this.nodeId.identifier}`\n }\n\n constructor(private nodeId: NodeId) { }\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","../src/services/attributeService.ts","../src/readValueResult.ts","../src/subscriptionHandlerEntry.ts","../src/subscriptionHandler.ts","../src/services/subscriptionService.ts","../src/services/monitoredItemService.ts","../src/client.ts","../src/configurationClient.ts","../src/id.ts","../src/userIdentity.ts"],"names":["ExtensionObject","NodeId","ReadValueId","QualifiedName","TimestampsToReturnEnum","Configuration","UserTokenTypeEnum","IssuedIdentityToken"],"mappings":";;;AAEO,IAAe,cAAf,MAA0B;AAAA,EAgB7B,WAAA,CAAoB,WAA6B,aAAA,EAA8B;AAA3D,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AAA6B,IAAA,IAAA,CAAA,aAAA,GAAA,aAAA;AAAA,EAA+B;AAAA,EAbtE,mBAAA,GAAqC;AAC3C,IAAA,MAAM,aAAA,GAAgB,IAAI,aAAA,EAAc;AACxC,IAAA,aAAA,CAAc,sBAAsB,IAAA,CAAK,SAAA;AACzC,IAAA,aAAA,CAAc,SAAA,uBAAgB,IAAA,EAAK;AACnC,IAAA,aAAA,CAAc,aAAA,GAAgB,CAAA;AAC9B,IAAA,aAAA,CAAc,iBAAA,GAAoB,CAAA;AAClC,IAAA,aAAA,CAAc,YAAA,GAAe,EAAA;AAC7B,IAAA,aAAA,CAAc,WAAA,GAAc,GAAA;AAC5B,IAAA,aAAA,CAAc,gBAAA,GAAmB,gBAAgB,QAAA,EAAS;AAE1D,IAAA,OAAO,aAAA;AAAA,EACX;AAGJ,CAAA;;;ACZO,IAAM,cAAA,GAAN,MAAM,eAAA,SAAuB,WAAA,CAAY;AAAA,EAyF5C,WAAA,CAAY,SAAA,EAAmB,aAAA,EAAuC,aAAA,EAA8B;AAChG,IAAA,KAAA,CAAM,WAAW,aAAa,CAAA;AADoC,IAAA,IAAA,CAAA,aAAA,GAAA,aAAA;AAAA,EAEtE;AAAA,EA1FA,MAAM,aAAA,GAAkG;AACpG,IAAA,OAAA,CAAQ,IAAI,qBAAqB,CAAA;AAEjC,IAAA,MAAM,iBAAA,GAAoB,IAAI,sBAAA,EAAuB;AACrD,IAAA,iBAAA,CAAkB,cAAA,GAAiB,KAAK,aAAA,CAAc,cAAA;AACtD,IAAA,iBAAA,CAAkB,UAAA,GAAa,KAAK,aAAA,CAAc,UAAA;AAClD,IAAA,iBAAA,CAAkB,kBAAkB,IAAI,aAAA,CAAc,MAAA,EAAW,IAAA,CAAK,cAAc,WAAW,CAAA;AAC/F,IAAA,iBAAA,CAAkB,kBAAkB,mBAAA,CAAoB,MAAA;AACxD,IAAA,iBAAA,CAAkB,gBAAA,GAAmB,EAAA;AACrC,IAAA,iBAAA,CAAkB,mBAAA,GAAsB,EAAA;AACxC,IAAA,iBAAA,CAAkB,aAAA,GAAgB,IAAI,KAAA,EAAc;AAEpD,IAAA,MAAM,OAAA,GAAU,IAAI,oBAAA,EAAqB;AACzC,IAAA,OAAA,CAAQ,aAAA,GAAgB,KAAK,mBAAA,EAAoB;AACjD,IAAA,OAAA,CAAQ,iBAAA,GAAoB,iBAAA;AAC5B,IAAA,OAAA,CAAQ,SAAA,GAAY,EAAA;AACpB,IAAA,OAAA,CAAQ,WAAA,GAAc,IAAA,CAAK,aAAA,CAAc,cAAA,EAAe;AACxD,IAAA,OAAA,CAAQ,WAAA,GAAc,EAAA;AACtB,IAAA,OAAA,CAAQ,WAAA,GAAc,IAAA;AACtB,IAAA,OAAA,CAAQ,iBAAA,GAAoB,IAAA;AAC5B,IAAA,OAAA,CAAQ,uBAAA,GAA0B,GAAA;AAClC,IAAA,OAAA,CAAQ,sBAAA,GAAyB,CAAA;AAMjC,IAAA,OAAA,CAAQ,IAAI,iCAAiC,CAAA;AAC7C,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,aAAA,CAAc,oBAAoB,OAAO,CAAA;AACrE,IAAA,IAAI,CAAC,QAAA,IAAY,EAAE,QAAA,YAAoB,qBAAA,CAAA,EAAwB;AAC3D,MAAA,MAAM,IAAI,MAAM,gDAAgD,CAAA;AAAA,IACpE;AAEA,IAAA,MAAM,cAAA,GAAiB,QAAA;AACvB,IAAA,IAAI,CAAC,cAAA,IAAkB,CAAC,eAAe,SAAA,IAAa,CAAC,eAAe,mBAAA,EAAqB;AACrF,MAAA,MAAM,IAAI,MAAM,gEAAgE,CAAA;AAAA,IACpF;AAEA,IAAA,MAAM,QAAA,GAAW,MAAA,GAAS,IAAA,CAAK,aAAA,CAAc,cAAA,EAAe;AAC5D,IAAA,MAAM,WAAA,GAAc,IAAI,GAAA,CAAI,QAAQ,CAAA;AACpC,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,aAAA,CAAc,eAAA,EAAgB;AACxD,IAAA,MAAM,iBAAA,GAAoB,IAAA,CAAK,aAAA,CAAc,iBAAA,EAAkB;AAE/D,IAAA,MAAM,cAAA,GAAiB,cAAA,EACjB,eAAA,EACA,IAAA,CAAK,CAAA,eAAA,KAAmB;AACtB,MAAA,MAAM,kBAAA,GAAqB,IAAI,GAAA,CAAI,eAAA,CAAgB,WAAqB,CAAA;AAExE,MAAA,OAAO,mBAAmB,QAAA,KAAa,WAAA,CAAY,QAAA,IAChD,kBAAA,CAAmB,aAAa,WAAA,CAAY,QAAA,IAC5C,kBAAA,CAAmB,IAAA,KAAS,YAAY,IAAA,IACxC,eAAA,CAAgB,YAAA,KAAiB,YAAA,IACjC,gBAAgB,iBAAA,KAAsB,iBAAA;AAAA,IAAiB,CAAC,CAAA;AAEnE,IAAA,IAAI,CAAC,cAAA,EAAgB;AACjB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmB,QAAQ,CAAA,mCAAA,CAAqC,CAAA;AAAA,IACpF;AAEA,IAAA,OAAA,CAAQ,GAAA,CAAI,0BAAA,EAA4B,cAAA,CAAe,SAAA,CAAU,UAAU,CAAA;AAC3E,IAAA,OAAO;AAAA,MACH,SAAA,EAAW,eAAe,SAAA,CAAU,UAAA;AAAA,MACpC,WAAW,cAAA,CAAe,mBAAA;AAAA,MAC1B,QAAA,EAAU;AAAA,KACd;AAAA,EACJ;AAAA,EAEA,MAAM,gBAAgB,aAAA,EAAiD;AACnE,IAAA,MAAM,aAAA,GAAgB,IAAI,aAAA,EAAc;AACxC,IAAA,aAAA,CAAc,SAAA,GAAY,IAAA,CAAK,aAAA,CAAc,iBAAA,EAAkB;AAC/D,IAAA,aAAA,CAAc,SAAA,GAAY,IAAI,UAAA,CAAW,CAAC,CAAA;AAE1C,IAAA,MAAM,OAAA,GAAU,IAAI,sBAAA,EAAuB;AAC3C,IAAA,OAAA,CAAQ,aAAA,GAAgB,KAAK,mBAAA,EAAoB;AACjD,IAAA,OAAA,CAAQ,eAAA,GAAkB,aAAA;AAC1B,IAAA,OAAA,CAAQ,0BAAA,GAA6B,IAAI,KAAA,EAAiC;AAC1E,IAAA,OAAA,CAAQ,SAAA,GAAY,CAAC,OAAO,CAAA;AAC5B,IAAA,OAAA,CAAQ,iBAAA,GAAoBA,eAAAA,CAAgB,SAAA,CAAU,aAAa,CAAA;AACnE,IAAA,OAAA,CAAQ,kBAAA,GAAqB,aAAA;AAE7B,IAAA,OAAA,CAAQ,IAAI,mCAAmC,CAAA;AAC/C,IAAA,MAAM,IAAA,CAAK,aAAA,CAAc,mBAAA,CAAoB,OAAO,CAAA;AACpD,IAAA,OAAA,CAAQ,IAAI,oBAAoB,CAAA;AAAA,EACpC;AAAA,EAEA,SAAS,SAAA,EAAmC;AACxC,IAAA,OAAO,IAAI,eAAA,CAAe,SAAA,EAAW,IAAA,CAAK,aAAA,EAAe,KAAK,aAAa,CAAA;AAAA,EAC/E;AAKJ,CAAA;;;ACnGO,IAAM,mBAAA,GAAN,MAAM,oBAAA,CAAmB;AAAA,EAa5B,YACW,UAAA,EACA,YAAA,EACA,qBACA,aAAA,EACA,qBAAA,EACA,cACA,MAAA,EACV;AAPU,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AACA,IAAA,IAAA,CAAA,YAAA,GAAA,YAAA;AACA,IAAA,IAAA,CAAA,mBAAA,GAAA,mBAAA;AACA,IAAA,IAAA,CAAA,aAAA,GAAA,aAAA;AACA,IAAA,IAAA,CAAA,qBAAA,GAAA,qBAAA;AACA,IAAA,IAAA,CAAA,YAAA,GAAA,YAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EAGX;AAAA,EAtBA,OAAc,QAAQ,iBAAA,EAA6C;AAC/D,IAAA,OAAO,IAAI,oBAAA;AAAA,MACP,kBAAkB,eAAe,CAAA;AAAA,MACjC,kBAAkB,iBAAiB,CAAA;AAAA,MACnC,kBAAkB,wBAAwB,CAAA;AAAA,MAC1C,kBAAkB,kBAAkB,CAAA;AAAA,MACpC,kBAAkB,0BAA0B,CAAA;AAAA,MAC5C,kBAAkB,iBAAiB,CAAA;AAAA,MACnC,kBAAkB,WAAW;AAAA,KACjC;AAAA,EACJ;AAaJ,CAAA;;;ACnBO,IAAM,UAAN,MAAc;AAAA,EA+BjB,WAAA,CACW,SAAA,EACC,SAAA,EACA,QAAA,EACA,eAAA,EAAiC;AAHlC,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AACC,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,eAAA,GAAA,eAAA;AAAA,EAAmC;AAAA,EAlC/C,MAAM,gBAAgB,QAAA,EAAuC;AACzD,IAAA,MAAM,KAAA,GAAQ,SAAS,oBAAA,EAAqB;AAC5C,IAAA,MAAM,SAAA,GAAY,SAAS,YAAA,EAAa;AACxC,IAAA,MAAM,WAAA,GAAc,KAAK,QAAA,CAAS,kBAAA,EAAoB,KAAK,CAAA,CAAA,KAAK,CAAA,CAAE,cAAc,SAAS,CAAA;AACzF,IAAA,IAAI,CAAC,WAAA,EAAa;AACd,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,0BAAA,EAA6B,SAAS,CAAA,wBAAA,CAA0B,CAAA;AAAA,IACpF;AACA,IAAA,KAAA,CAAM,WAAW,WAAA,CAAY,QAAA;AAE7B,IAAA,IAAI,SAAA,KAAc,kBAAkB,WAAA,EAAa;AAC7C,MAAA,IAAI,CAAC,YAAY,iBAAA,EAAmB;AAChC,QAAA,MAAM,IAAI,MAAM,+CAA+C,CAAA;AAAA,MACnE;AACA,MAAA,MAAM,iBAAA,GAAoB,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,iBAAiB,CAAA;AAClE,MAAA,MAAM,YAAA,GAAe,mBAAA,CAAoB,OAAA,CAAQ,iBAAiB,CAAA;AAElE,MAAA,MAAM,mBAAA,GAAsB,SAAS,sBAAA,EAAuB;AAC5D,MAAA,MAAM,SAAA,GAAY,MAAM,mBAAA,CAAoB,YAAY,CAAA;AAExD,MAAA,MAAM,WAAA,GAAc,KAAA;AACpB,MAAA,WAAA,CAAY,YAAY,IAAI,WAAA,EAAY,CAAE,MAAA,CAAO,UAAU,IAAI,CAAA;AAAA,IACnE;AAEA,IAAA,MAAM,IAAA,CAAK,eAAA,CAAgB,eAAA,CAAgB,KAAK,CAAA;AAAA,EACpD;AAAA,EAEA,YAAA,GAAuB;AACnB,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,EAChB;AAOJ,CAAA;;;ACnCO,IAAM,iBAAN,MAAqB;AAAA,EAChB,eAAA;AAAA,EACR,MAAM,iBAAiB,QAAA,EAAyC;AAC5D,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,eAAA,CAAgB,aAAA,EAAc;AACrD,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAA,CAAK,eAAA,CAAgB,QAAA,CAAS,IAAI,SAAS,CAAA;AAElE,IAAA,MAAM,OAAA,GAAU,IAAI,OAAA,CAAQ,GAAA,CAAI,SAAA,EAAW,IAAI,SAAA,EAAW,GAAA,CAAI,QAAA,EAAU,IAAA,CAAK,eAAe,CAAA;AAC5F,IAAA,MAAM,OAAA,CAAQ,gBAAgB,QAAQ,CAAA;AACtC,IAAA,OAAO,OAAA;AAAA,EACX;AAAA,EAEA,WAAA,CAAY,eAA8B,aAAA,EAAoC;AAC1E,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAI,cAAA,CAAeC,MAAAA,CAAO,WAAW,CAAC,CAAA,EAAG,eAAe,aAAa,CAAA;AAAA,EAChG;AACJ,CAAA;;;ACLO,IAAM,WAAA,GAAc,EAAA;;;ACVpB,IAAM,gBAAA,GAAN,cAA+B,WAAA,CAAY;AAAA,EAC9C,MAAM,UAAU,OAAA,EAAkE;AAC9E,IAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAA,KAAM;AACnC,MAAA,MAAM,WAAA,GAAc,IAAI,WAAA,EAAY;AACpC,MAAA,WAAA,CAAY,MAAA,GAAS,EAAA;AACrB,MAAA,WAAA,CAAY,WAAA,GAAc,WAAA;AAC1B,MAAA,WAAA,CAAY,UAAA,GAAa,EAAA;AACzB,MAAA,WAAA,CAAY,YAAA,GAAe,IAAI,aAAA,CAAc,CAAA,EAAG,EAAE,CAAA;AAClD,MAAA,OAAO,WAAA;AAAA,IACX,CAAC,CAAA;AAED,IAAA,MAAM,OAAA,GAAU,IAAI,WAAA,EAAY;AAChC,IAAA,OAAA,CAAQ,aAAA,GAAgB,KAAK,mBAAA,EAAoB;AACjD,IAAA,OAAA,CAAQ,MAAA,GAAS,GAAA;AACjB,IAAA,OAAA,CAAQ,qBAAqB,sBAAA,CAAuB,MAAA;AACpD,IAAA,OAAA,CAAQ,WAAA,GAAc,YAAA;AAEtB,IAAA,OAAA,CAAQ,IAAI,wBAAwB,CAAA;AACpC,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,aAAA,CAAc,oBAAoB,OAAO,CAAA;AAErE,IAAA,MAAM,OAAA,GAAU,IAAI,KAAA,EAA0C;AAC9D,IAAA,KAAA,IAAS,SAAA,IAAa,QAAA,CAAS,OAAA,IAAW,EAAC,EAAG;AAC1C,MAAA,MAAM,MAAA,GAAS;AAAA,QACX,MAAA,EAAQ,SAAA,CAAU,UAAA,EAAY,QAAA,EAAS,IAAK,SAAA;AAAA,QAC5C,OAAO,SAAA,CAAU;AAAA,OACrB;AACA,MAAA,OAAA,CAAQ,KAAK,MAAM,CAAA;AAAA,IACvB;AACA,IAAA,OAAO,OAAA;AAAA,EACX;AAAA,EAEA,WAAA,CAAY,WAAmB,aAAA,EAA+B;AAC1D,IAAA,KAAA,CAAM,WAAW,aAAa,CAAA;AAAA,EAClC;AACJ,CAAA;;;ACvCO,IAAM,kBAAN,MAAqB;AAAA,EACxB,WAAA,CAAmB,OAAsB,MAAA,EAAc;AAApC,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAAsB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EAAe;AAC5D,CAAA;;;ACAO,IAAM,2BAAN,MAA8B;AAAA,EACjC,WAAA,CACW,cAAA,EACA,MAAA,EACA,EAAA,EACA,QAAA,EACV;AAJU,IAAA,IAAA,CAAA,cAAA,GAAA,cAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACA,IAAA,IAAA,CAAA,EAAA,GAAA,EAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AAAA,EACT;AACN,CAAA;;;ACHO,IAAM,sBAAN,MAA0B;AAAA,EAmE7B,WAAA,CACY,qBACA,oBAAA,EACV;AAFU,IAAA,IAAA,CAAA,mBAAA,GAAA,mBAAA;AACA,IAAA,IAAA,CAAA,oBAAA,GAAA,oBAAA;AAAA,EAEZ;AAAA,EAtEQ,OAAA,GAAU,IAAI,KAAA,EAAgC;AAAA,EAC9C,UAAA,GAAa,CAAA;AAAA,EAErB,MAAM,SAAA,CAAU,GAAA,EAAW,QAAA,EAAwD;AAC/E,IAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG;AACzB,MAAA,MAAM,IAAI,MAAM,+CAA+C,CAAA;AAAA,IACnE;AAEA,IAAA,MAAM,cAAA,GAAiB,MAAM,IAAA,CAAK,mBAAA,CAAoB,kBAAA,EAAmB;AACzE,IAAA,MAAM,QAAQ,EAAC;AACf,IAAA,KAAA,IAAS,MAAM,GAAA,EAAK;AAChB,MAAA,MAAM,QAAQ,IAAI,wBAAA;AAAA,QACd,cAAA;AAAA,QACA,IAAA,CAAK,UAAA,EAAA;AAAA,QACL,EAAA;AAAA,QACA;AAAA,OACJ;AACA,MAAA,IAAA,CAAK,OAAA,CAAQ,KAAK,KAAK,CAAA;AACvB,MAAA,MAAM,IAAA,GAAO;AAAA,QACT,EAAA,EAAI,GAAG,QAAA,EAAS;AAAA,QAChB,QAAQ,KAAA,CAAM;AAAA,OAClB;AACA,MAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,IACnB;AACA,IAAA,MAAM,IAAA,CAAK,oBAAA,CAAqB,oBAAA,CAAqB,cAAA,EAAgB,KAAK,CAAA;AAC1E,IAAA,IAAA,CAAK,OAAA,CAAQ,EAAE,CAAA;AAAA,EACnB;AAAA,EAEA,MAAc,QAAQ,0BAAA,EAAsC;AACxD,IAAA,MAAM,mBAAmB,EAAC;AAC1B,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,0BAAA,CAA2B,QAAQ,CAAA,EAAA,EAAK;AACxD,MAAA,MAAM,eAAA,GAAkB,IAAI,2BAAA,EAA4B;AACxD,MAAA,eAAA,CAAgB,cAAA,GAAiB,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAA,CAAE,cAAA;AACjD,MAAA,eAAA,CAAgB,cAAA,GAAiB,2BAA2B,CAAC,CAAA;AAC7D,MAAA,gBAAA,CAAiB,KAAK,eAAe,CAAA;AAAA,IACzC;AACA,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,mBAAA,CAAoB,QAAQ,gBAAgB,CAAA;AAExE,IAAA,MAAM,qBAAA,GAAwB,SAAS,mBAAA,CAAoB,cAAA;AAE3D,IAAA,MAAM,iBAAA,GAAoB,SAAS,mBAAA,CAAoB,gBAAA;AAEvD,IAAA,KAAA,IAAS,oBAAoB,iBAAA,EAAmB;AAC5C,MAAA,MAAM,cAAc,gBAAA,CAAiB,IAAA;AACrC,MAAA,MAAM,aAAa,gBAAA,CAAiB,MAAA;AACpC,MAAA,IAAI,UAAA,CAAW,SAAA,KAAc,CAAA,IAAK,UAAA,CAAW,eAAe,GAAA,EAAK;AAC7D,QAAA,MAAM,sBAAA,GAAyB,WAAA;AAC/B,QAAA,KAAA,IAAS,IAAA,IAAQ,uBAAuB,cAAA,EAAgB;AACpD,UAAA,MAAM,eAAe,IAAA,CAAK,YAAA;AAC1B,UAAA,MAAM,QAAQ,IAAA,CAAK,KAAA;AACnB,UAAA,MAAM,QAAQ,IAAA,CAAK,OAAA,CAAQ,KAAK,CAAA,CAAA,KAAK,CAAA,CAAE,UAAU,YAAY,CAAA;AAC7D,UAAA,KAAA,EAAO,SAAS,CAAC;AAAA,YACb,IAAI,KAAA,CAAM,EAAA;AAAA,YACV,KAAA,EAAO,MAAM,KAAA,EAAO;AAAA,WACvB,CAAC,CAAA;AAAA,QACN;AAAA,MACJ,CAAA,MAAO;AACH,QAAA,OAAA,CAAQ,IAAI,CAAA,kCAAA,EAAqC,UAAA,CAAW,SAAS,CAAA,CAAA,EAAI,UAAA,CAAW,UAAU,CAAA,kBAAA,CAAoB,CAAA;AAAA,MACtH;AAAA,IACJ;AAEA,IAAA,UAAA,CAAW,MAAM;AACb,MAAA,IAAA,CAAK,OAAA,CAAQ,CAAC,qBAAqB,CAAC,CAAA;AAAA,IACxC,GAAG,GAAG,CAAA;AAAA,EACV;AAOJ,CAAA;ACvEO,IAAM,mBAAA,GAAN,cAAkC,WAAA,CAAY;AAAA;AAAA,EAEjD,MAAM,kBAAA,GAAsC;AACxC,IAAA,MAAM,OAAA,GAAU,IAAI,yBAAA,EAA0B;AAC9C,IAAA,OAAA,CAAQ,aAAA,GAAgB,KAAK,mBAAA,EAAoB;AACjD,IAAA,OAAA,CAAQ,2BAAA,GAA8B,GAAA;AACtC,IAAA,OAAA,CAAQ,sBAAA,GAAyB,IAAA;AACjC,IAAA,OAAA,CAAQ,0BAAA,GAA6B,GAAA;AACrC,IAAA,OAAA,CAAQ,0BAAA,GAA6B,GAAA;AACrC,IAAA,OAAA,CAAQ,iBAAA,GAAoB,IAAA;AAC5B,IAAA,OAAA,CAAQ,QAAA,GAAW,CAAA;AAGnB,IAAA,OAAA,CAAQ,IAAI,+BAA+B,CAAA;AAC3C,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,aAAA,CAAc,oBAAoB,OAAO,CAAA;AACrE,IAAA,OAAA,CAAQ,GAAA,CAAI,+BAAA,EAAiC,QAAA,CAAS,cAAc,CAAA;AACpE,IAAA,OAAO,QAAA,CAAS,cAAA;AAAA,EACpB;AAAA;AAAA,EAGA,MAAM,QAAQ,gBAAA,EAA2E;AACrF,IAAA,MAAM,OAAA,GAAU,IAAI,cAAA,EAAe;AACnC,IAAA,OAAA,CAAQ,aAAA,GAAgB,KAAK,mBAAA,EAAoB;AACjD,IAAA,OAAA,CAAQ,4BAAA,GAA+B,gBAAA;AAEvC,IAAA,OAAA,CAAQ,IAAI,oBAAoB,CAAA;AAChC,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,aAAA,CAAc,oBAAoB,OAAO,CAAA;AACrE,IAAA,OAAA,CAAQ,IAAI,4BAA4B,CAAA;AACxC,IAAA,OAAO,QAAA;AAAA,EACX;AAAA,EAEA,WAAA,CAAY,WAAmB,aAAA,EAA+B;AAC1D,IAAA,KAAA,CAAM,WAAW,aAAa,CAAA;AAAA,EAClC;AACJ,CAAA;AClCO,IAAM,oBAAA,GAAN,cAAmC,WAAA,CAAY;AAAA,EAElD,MAAM,oBAAA,CAAqB,cAAA,EAAwB,GAAA,EAAsD;AACrG,IAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,GAAA,CAAI,CAAA,EAAA,KAAM;AACxB,MAAA,MAAM,WAAA,GAAc,IAAIC,WAAAA,EAAY;AACpC,MAAA,WAAA,CAAY,SAAwB,EAAA,CAAG,EAAA;AACvC,MAAA,WAAA,CAAY,WAAA,GAA6B,WAAA;AACzC,MAAA,WAAA,CAAY,UAAA,GAA4B,EAAA;AACxC,MAAA,WAAA,CAAY,YAAA,GAA8B,IAAIC,aAAAA,CAAc,CAAA,EAAG,EAAE,CAAA;AAEjE,MAAA,MAAM,oBAAA,GAAuB,IAAI,oBAAA,EAAqB;AACtD,MAAA,oBAAA,CAAqB,eAA8B,EAAA,CAAG,MAAA;AACtD,MAAA,oBAAA,CAAqB,gBAAA,GAAkC,GAAA;AACvD,MAAA,oBAAA,CAAqB,MAAA,GAAwBH,gBAAgB,QAAA,EAAS;AACtE,MAAA,oBAAA,CAAqB,SAAA,GAA2B,GAAA;AAChD,MAAA,oBAAA,CAAqB,aAAA,GAA+B,IAAA;AAEpD,MAAA,MAAM,0BAAA,GAA6B,IAAI,0BAAA,EAA2B;AAClE,MAAA,0BAAA,CAA2B,aAAA,GAAgB,WAAA;AAC3C,MAAA,0BAAA,CAA2B,iBAAiB,kBAAA,CAAmB,SAAA;AAC/D,MAAA,0BAAA,CAA2B,mBAAA,GAAsB,oBAAA;AACjD,MAAA,OAAO,0BAAA;AAAA,IACX,CAAC,CAAA;AAED,IAAA,MAAM,OAAA,GAAU,IAAI,2BAAA,EAA4B;AAChD,IAAA,OAAA,CAAQ,aAAA,GAAgB,KAAK,mBAAA,EAAoB;AACjD,IAAA,OAAA,CAAQ,cAAA,GAAiB,cAAA;AACzB,IAAA,OAAA,CAAQ,qBAAqBI,sBAAAA,CAAuB,MAAA;AACpD,IAAA,OAAA,CAAQ,aAAA,GAAgB,KAAA;AAExB,IAAA,OAAA,CAAQ,IAAI,iCAAiC,CAAA;AAC7C,IAAA,MAAM,IAAA,CAAK,aAAA,CAAc,mBAAA,CAAoB,OAAO,CAAA;AAAA,EAExD;AAAA,EAEA,WAAA,CAAY,WAAmB,aAAA,EAA+B;AAC1D,IAAA,KAAA,CAAM,WAAW,aAAa,CAAA;AAAA,EAClC;AACJ,CAAA;;;AC/BO,IAAM,SAAN,MAAa;AAAA,EAwDhB,WAAA,CAAY,WAAA,EAA6B,aAAA,EAA4C,QAAA,EAAwB;AAApE,IAAA,IAAA,CAAA,aAAA,GAAA,aAAA;AAA4C,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACjF,IAAA,IAAA,CAAK,WAAA,GAAc,WAAA;AAAA,EACvB;AAAA,EAxDQ,WAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,mBAAA;AAAA,EAER,UAAA,GAAqB;AACjB,IAAA,IAAG,CAAC,KAAK,OAAA,EAAQ;AACb,MAAA,MAAM,IAAI,MAAM,sBAAsB,CAAA;AAAA,IAC1C;AACA,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EAChB;AAAA,EAEA,MAAM,OAAA,GAAyB;AAC3B,IAAA,MAAM,OAAA,GAAU,cAAA,CAAe,aAAA,CAAc,IAAA,CAAK,WAAW,CAAA;AAC7D,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,OAAO,CAAC,SAAA,EAAU;AACd,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,+BAAA,EAAkC,IAAA,CAAK,WAAW,CAAA,GAAA,CAAK,CAAA;AACnE,MAAA,SAAA,GAAY,MAAM,QAAQ,OAAA,EAAQ;AAClC,MAAA,IAAG,CAAC,SAAA,EAAU;AACV,QAAA,OAAA,CAAQ,IAAI,6CAA6C,CAAA;AACzD,QAAA,MAAM,IAAI,OAAA,CAAQ,CAAA,OAAA,KAAW,UAAA,CAAW,OAAA,EAAS,GAAI,CAAC,CAAA;AAAA,MAC1D;AAAA,IACJ;AACA,IAAA,OAAA,CAAQ,IAAI,6BAA6B,CAAA;AAEzC,IAAA,IAAA,CAAK,OAAA,GAAU,IAAI,aAAA,CAAc,OAAA,EAAS,KAAK,aAAa,CAAA;AAC5D,IAAA,MAAM,IAAA,CAAK,QAAQ,wBAAA,EAAyB;AAE5C,IAAA,MAAM,iBAAiB,IAAI,cAAA,CAAe,IAAA,CAAK,OAAA,EAAS,KAAK,aAAa,CAAA;AAC1E,IAAA,IAAA,CAAK,OAAA,GAAU,MAAM,cAAA,CAAe,gBAAA,CAAiB,KAAK,QAAQ,CAAA;AAClE,IAAA,IAAA,CAAK,sBAAsB,IAAI,mBAAA;AAAA,MAC3B,IAAI,mBAAA,CAAoB,IAAA,CAAK,QAAQ,YAAA,EAAa,EAAG,KAAK,OAAO,CAAA;AAAA,MACjE,IAAI,oBAAA,CAAqB,IAAA,CAAK,QAAQ,YAAA,EAAa,EAAG,KAAK,OAAO;AAAA,KACtE;AAAA,EACJ;AAAA,EAEA,MAAM,UAAA,GAA4B;AAC9B,IAAA,OAAA,CAAQ,IAAI,qCAAqC,CAAA;AAEjD,IAAA,IAAI,KAAK,OAAA,EAAS;AACd,MAAA,MAAM,IAAA,CAAK,QAAQ,UAAA,EAAW;AAAA,IAClC;AAAA,EACJ;AAAA,EAEA,MAAM,KAAK,GAAA,EAAqC;AAC5C,IAAA,MAAM,OAAA,GAAU,IAAI,gBAAA,CAAiB,IAAA,CAAK,YAAW,CAAE,YAAA,EAAa,EAAG,IAAA,CAAK,OAAyB,CAAA;AACrG,IAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,SAAA,CAAU,GAAA,CAAI,IAAI,CAAA,CAAA,KAAK,CAAA,CAAE,QAAA,EAAU,CAAC,CAAA;AACjE,IAAA,OAAO,MAAA,CAAO,IAAI,CAAA,CAAA,KAAK,IAAI,gBAAgB,CAAA,CAAE,KAAA,EAAO,CAAA,CAAE,MAAM,CAAC,CAAA;AAAA,EACjE;AAAA,EAEA,MAAM,SAAA,CAAU,GAAA,EAAW,QAAA,EAAmD;AAC1E,IAAA,IAAA,CAAK,mBAAA,EAAqB,SAAA,CAAU,GAAA,EAAK,QAAQ,CAAA;AAAA,EACrD;AAKJ;ACvEO,IAAM,mBAAA,GAAN,MAAM,oBAAA,SAA4BC,aAAAA,CAAc;AAAA,EACnD,OAAc,SAAA,CAAU,IAAA,EAAa,OAAA,EACb;AAEpB,IAAA,MAAM,cAAA,GAAiB,CAAA,IAAA,EAAO,OAAO,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA;AAC7C,IAAA,MAAM,UAAA,GAAa,CAAA,IAAA,EAAO,OAAO,CAAA,CAAA,EAAI,IAAI,CAAA,QAAA,CAAA;AAEzC,IAAA,MAAM,OAAA,GAAU,IAAI,OAAA,EAAQ;AAC5B,IAAA,OAAA,CAAQ,qBAAA,CAAsB,UAAU,MAAM;AAAE,MAAA,OAAO,IAAI,YAAA,EAAa;AAAA,IAAE,CAAC,CAAA;AAC3E,IAAA,gBAAA,CAAiB,OAAO,CAAA;AAExB,IAAA,MAAM,OAAA,GAAU,IAAI,OAAA,EAAQ;AAC5B,IAAA,OAAA,CAAQ,qBAAA,CAAsB,QAAA,EAAU,CAAC,IAAA,KAAiB;AAAE,MAAA,OAAO,IAAI,aAAa,IAAkB,CAAA;AAAA,IAAE,CAAC,CAAA;AACzG,IAAA,oBAAA,CAAqB,OAAO,CAAA;AAC5B,IAAA,sBAAA,CAAuB,OAAO,CAAA;AAE9B,IAAA,OAAO,IAAI,oBAAA,CAAoB,IAAA,EAAM,gBAAgB,IAAA,EAAM,UAAA,EAAY,SAAS,OAAO,CAAA;AAAA,EAC3F;AAAA,EAEA,YACI,eAAA,EACA,cAAA,EACA,WAAA,EACA,UAAA,EACA,SACA,OAAA,EAAkB;AAClB,IAAA,KAAA,CAAM,eAAA,EAAiB,cAAA,EAAgB,WAAA,EAAa,UAAA,EAAY,SAAS,OAAO,CAAA;AAAA,EACpF;AACJ;AC5BO,IAAM,EAAA,GAAN,MAAM,GAAA,CAAG;AAAA,EAaZ,YAAoB,MAAA,EAAgB;AAAhB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EAAkB;AAAA,EAZtC,OAAO,KAAA,CAAM,SAAA,EAAmB,UAAA,EAAoB;AAChD,IAAA,OAAO,IAAI,GAAA,CAAG,IAAIJ,MAAAA,CAAO,SAAA,EAAW,UAAU,CAAC,CAAA;AAAA,EACnD;AAAA,EAEA,QAAA,GAAU;AACN,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EAChB;AAAA,EAEA,QAAA,GAAU;AACN,IAAA,OAAO,GAAG,IAAA,CAAK,MAAA,CAAO,SAAS,CAAA,CAAA,EAAI,IAAA,CAAK,OAAO,UAAU,CAAA,CAAA;AAAA,EAC7D;AAGJ;ACXO,IAAM,YAAA,GAAN,MAAM,aAAA,CAAa;AAAA,EACd,iBAAA;AAAA,EACA,YAAYK,iBAAAA,CAAkB,SAAA;AAAA,EAC9B,mBAAA,GAAwF,MAAA;AAAA,EAEhG,OAAc,YAAA,GAA6B;AACvC,IAAA,MAAM,YAAA,GAAe,IAAI,aAAA,EAAa;AACtC,IAAA,YAAA,CAAa,iBAAA,GAAoB,IAAI,sBAAA,EAAuB;AAC5D,IAAA,YAAA,CAAa,kBAAkB,QAAA,GAAW,WAAA;AAC1C,IAAA,YAAA,CAAa,YAAYA,iBAAAA,CAAkB,SAAA;AAC3C,IAAA,OAAO,YAAA;AAAA,EACX;AAAA,EAEA,OAAc,eAAA,CAAgB,QAAA,EAAkB,QAAA,EAAgC;AAC5E,IAAA,MAAM,YAAA,GAAe,IAAI,aAAA,EAAa;AACtC,IAAA,MAAM,SAAA,GAAY,IAAI,qBAAA,EAAsB;AAC5C,IAAA,SAAA,CAAU,QAAA,GAAW,QAAA;AACrB,IAAA,SAAA,CAAU,QAAA,GAAW,IAAI,WAAA,EAAY,CAAE,OAAO,QAAQ,CAAA;AAEtD,IAAA,YAAA,CAAa,iBAAA,GAAoB,SAAA;AACjC,IAAA,YAAA,CAAa,YAAYA,iBAAAA,CAAkB,QAAA;AAC3C,IAAA,OAAO,YAAA;AAAA,EACX;AAAA,EAEA,OAAc,mBAAmB,aAAA,EAAiF;AAC9G,IAAA,MAAM,YAAA,GAAe,IAAI,aAAA,EAAa;AACtC,IAAA,MAAM,WAAA,GAAc,IAAIC,mBAAAA,EAAoB;AAC5C,IAAA,WAAA,CAAY,SAAA,GAAY,IAAI,WAAA,EAAY,CAAE,OAAO,EAAE,CAAA;AACnD,IAAA,YAAA,CAAa,iBAAA,GAAoB,WAAA;AACjC,IAAA,YAAA,CAAa,YAAYD,iBAAAA,CAAkB,WAAA;AAC3C,IAAA,YAAA,CAAa,mBAAA,GAAsB,aAAA;AACnC,IAAA,OAAO,YAAA;AAAA,EACX;AAAA,EAEO,oBAAA,GAA0C;AAC7C,IAAA,OAAO,IAAA,CAAK,iBAAA;AAAA,EAChB;AAAA,EAEO,YAAA,GAAkC;AACrC,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,EAChB;AAAA,EAEO,sBAAA,GAA+E;AAClF,IAAA,IAAG,CAAC,KAAK,mBAAA,EAAoB;AACzB,MAAA,MAAM,IAAI,MAAM,kCAAkC,CAAA;AAAA,IACtD;AAEA,IAAA,OAAO,IAAA,CAAK,mBAAA;AAAA,EAChB;AACJ","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 ISecureChannel, LocalizedText, NodeId, SignatureData, SignedSoftwareCertificate, UserIdentityToken\n} from \"opcjs-base\";\nimport { ServiceBase } from \"./serviceBase\";\n\nexport class SessionService extends ServiceBase {\n async createSession(): Promise<{ sessionId: number, authToken: NodeId, endpoint: EndpointDescription }> {\n console.log(\"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 console.log(\"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 console.log(\"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 console.log(\"Sending ActivateSessionRequest...\");\n await this.secureChannel.issueServiceRequest(request);\n console.log(\"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}","export class IssuerConfiguration{\n public static newFrom(issuerEndpointUrl: any): 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","import { ISecureChannel, NodeId, QualifiedName, ReadRequest, ReadResponse, ReadValueId, TimestampsToReturnEnum } from \"opcjs-base\";\nimport { AttrIdValue } from \"./attributeServiceAttributes\";\nimport { ServiceBase } from \"./serviceBase\";\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 (let dataValue of response.results ?? []) {\n const result = {\n status: dataValue.statusCode?.toString() ?? 'Unknown',\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 { Id } from \"./id\";\n\nexport class SubscriptionHandlerEntry{\n constructor(\n public subscriptionId:number,\n public handle: number, \n public id:Id, \n public callback: (data: { id: Id, value: unknown }[]) => void\n ){}\n}","import { DataChangeNotification, SubscriptionAcknowledgement } from \"opcjs-base\";\nimport { Id } from \"./id\";\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: Id[], callback: (data: { id: Id, 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 (let 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.toNodeId(),\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 (let 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 (let 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 { SecureChannel } from \"opcjs-base\";\nimport { ChannelFactory } from \"opcjs-base\";\nimport { SessionHandler } from \"./sessions/sessionHandler\";\nimport { ISecureChannel } from \"opcjs-base\";\nimport { Session } from \"./sessions/session\";\nimport { Id } from \"./id\";\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\";\n\nexport class Client {\n\n private endpointUrl: string;\n private channel?: SecureChannel;\n private session?: Session;\n private subscriptionHandler?:SubscriptionHandler;\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 const channel = ChannelFactory.createChannel(this.endpointUrl);\n let connected = false;\n while (!connected){\n console.log(`Connecting to OPC UA server at ${this.endpointUrl}...`);\n connected = await channel.connect();\n if(!connected){\n console.log(\"Connection failed, retrying in 2 seconds...\");\n await new Promise(resolve => setTimeout(resolve, 2000));\n }\n }\n console.log('Connected to OPC UA server.');\n\n this.channel = new SecureChannel(channel, this.configuration);\n await this.channel.openSecureChannelRequest();\n\n const sessionHandler = new SessionHandler(this.channel, this.configuration);\n this.session = await sessionHandler.createNewSession(this.identity);\n this.subscriptionHandler = new SubscriptionHandler(\n new SubscriptionService(this.session.getAuthToken(), this.channel),\n new MonitoredItemService(this.session.getAuthToken(), this.channel)\n )\n }\n\n async disconnect(): Promise<void> {\n console.log('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: Id[]):Promise<ReadValueResult[]>{\n const service = new AttributeService(this.getSession().getAuthToken(), this.channel as ISecureChannel);\n const result = await service.ReadValue(ids.map(i => i.toNodeId()))\n return result.map(r => new ReadValueResult(r.value, r.status))\n }\n\n async subscribe(ids: Id[], callback: (data: {id:Id, value:unknown}[]) => void){\n this.subscriptionHandler?.subscribe(ids, callback)\n }\n\n constructor(endpointUrl: string, private configuration: ConfigurationClient, private identity: UserIdentity) {\n this.endpointUrl = endpointUrl;\n }\n}","import { BinaryReader, BinaryWriter, Configuration, Decoder, Encoder, registerBinaryDecoders, registerEncoders, registerTypeDecoders } from \"opcjs-base\";\n\nexport class ConfigurationClient extends Configuration {\n public static getSimple(name:string, company:string): \n ConfigurationClient {\n\n const applicationUri = `urn:${company}:${name}`;\n const productUri = `urn:${company}:${name}:product`;\n\n const encoder = new Encoder();\n encoder.registerWriterFactory('binary', () => { return new BinaryWriter();});\n registerEncoders(encoder);\n\n const decoder = new Decoder();\n decoder.registerReaderFactory('binary', (data:unknown) => { return new BinaryReader(data as Uint8Array);});\n registerTypeDecoders(decoder);\n registerBinaryDecoders(decoder);\n \n return new ConfigurationClient(name, applicationUri, name, productUri, encoder, decoder);\n }\n\n constructor(\n applicationName:string,\n applicationUri:string,\n productName:string,\n productUri:string,\n encoder: Encoder,\n decoder: Decoder) {\n super(applicationName, applicationUri, productName, productUri, encoder, decoder);\n }\n}","import { NodeId } from \"opcjs-base\";\n\nexport class Id {\n static newId(namespace: number, identifier: string) {\n return new Id(new NodeId(namespace, identifier));\n }\n\n toNodeId(){\n return this.nodeId\n }\n\n toString(){\n return `${this.nodeId.namespace}:${this.nodeId.identifier}`\n }\n\n constructor(private nodeId: NodeId) { }\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.8",
3
+ "version": "0.1.10",
4
4
  "description": "A client for OPC UA communication.",
5
5
  "repository": {
6
6
  "type": "git",