opcjs-client 0.1.10 → 0.1.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.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 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"]}
1
+ {"version":3,"sources":["../src/sessions/sessionInvalidError.ts","../src/services/serviceBase.ts","../src/sessions/certificateRequiredError.ts","../src/services/sessionService.ts","../src/configuration/issuerConfiguration.ts","../src/sessions/session.ts","../src/sessions/sessionHandler.ts","../src/securityConfiguration.ts","../src/services/attributeServiceAttributes.ts","../src/services/attributeService.ts","../src/readValueResult.ts","../src/subscription/subscriptionHandlerEntry.ts","../src/subscription/subscriptionHandler.ts","../src/services/subscriptionService.ts","../src/services/monitoredItemService.ts","../src/services/methodService.ts","../src/method/callMethodResult.ts","../src/services/browseService.ts","../src/browseNodeResult.ts","../src/namespaceTable.ts","../src/client.ts","../src/configuration/configurationClient.ts","../src/userIdentity.ts","../src/requestOptions.ts"],"names":["StatusCodeToString","StatusCode","ExtensionObject","NodeId","getLogger","UserTokenTypeEnum","ReadValueId","QualifiedName","TimestampsToReturnEnum","CallMethodRequest","BrowseDescription","Configuration","IssuedIdentityToken"],"mappings":"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","file":"index.js","sourcesContent":["import { StatusCodeToString } from 'opcjs-base'\n\n/**\n * Thrown when the server signals that the current Session is no longer valid.\n *\n * Callers that want to react to a dropped session (e.g. by creating a new one\n * and retrying the operation) should catch this specific error type instead of\n * the generic `Error` class.\n *\n * Relevant OPC UA status codes:\n * - `BadSessionIdInvalid` (0x80250000) – session no longer exists on the server\n * - `BadSessionClosed` (0x80260000) – session was closed explicitly\n */\nexport class SessionInvalidError extends Error {\n readonly statusCode: number\n\n constructor(statusCode: number) {\n super(`Session is no longer valid: ${StatusCodeToString(statusCode)} (0x${statusCode.toString(16).toUpperCase()})`)\n this.name = 'SessionInvalidError'\n this.statusCode = statusCode\n }\n}\n","import { ExtensionObject, ISecureChannel, NodeId, RequestHeader, StatusCode, StatusCodeToString, StatusCodeToStringNumber } from 'opcjs-base'\n\nimport { SessionInvalidError } from '../sessions/sessionInvalidError.js'\n\n/**\n * Monotonically-increasing counter used to generate unique `requestHandle` values.\n *\n * OPC UA Part 4, Section 7.28: requestHandle is a client-assigned value that\n * identifies a request within a session. It must be unique for outstanding requests\n * so that `CancelRequest` can target a specific pending operation.\n *\n * The counter is module-level so it stays unique even when multiple `ServiceBase`\n * instances (AttributeService, BrowseService, …) share the same session.\n */\nlet requestHandleCounter = 0\n\n/** Returns the next unique requestHandle value, wrapping safely at 2^31 - 1. */\nexport function nextRequestHandle(): number {\n // OPC UA requestHandle is a UInt32, but we cap at Int32 max to avoid sign issues\n // in servers that treat it as signed. Wrapping back to 1 (not 0) reserves 0 as\n // a sentinel \"no handle / unknown\" value.\n if (requestHandleCounter >= 0x7fffffff) {\n requestHandleCounter = 1\n } else {\n requestHandleCounter++\n }\n return requestHandleCounter\n}\n\n/**\n * Returns the most recently assigned `requestHandle` value.\n *\n * Useful for capturing the handle of an in-flight request immediately after\n * the service call was issued — e.g. to pass to `Client.cancel()`.\n *\n * Returns `0` before any request has been sent.\n */\nexport function lastAssignedHandle(): number {\n return requestHandleCounter\n}\n\nexport abstract class ServiceBase {\n\n /**\n * Validates the `serviceResult` value from a response header.\n *\n * Throws `SessionInvalidError` for session-related status codes so callers\n * can detect a dropped session and act accordingly (e.g. reconnect).\n * Throws a generic `Error` for all other non-Good codes.\n *\n * @param result - The `serviceResult` value from the response header.\n * @param context - Short description used in the error message (e.g. \"ReadRequest\").\n */\n protected checkServiceResult(result: number | undefined, context: string): void {\n if (result === undefined || result === StatusCode.Good) return\n\n if (result === StatusCode.BadSessionIdInvalid || result === StatusCode.BadSessionClosed) {\n throw new SessionInvalidError(result)\n }\n\n throw new Error(`${context} failed: ${StatusCodeToString(result)} (${StatusCodeToStringNumber(result)})`)\n }\n\n /**\n * Builds a RequestHeader for an outgoing service request.\n *\n * @param returnDiagnostics - Bitmask of diagnostic fields to request from the\n * server (OPC UA Part 4, §7.15). Use {@link ReturnDiagnosticsMask} constants\n * to compose the value. Default `0` = no diagnostics.\n */\n protected createRequestHeader(returnDiagnostics = 0, preAllocatedHandle?: number): RequestHeader {\n const requestHeader = new RequestHeader();\n requestHeader.authenticationToken = this.authToken;\n requestHeader.timestamp = new Date();\n requestHeader.requestHandle = preAllocatedHandle ?? nextRequestHandle();\n requestHeader.returnDiagnostics = returnDiagnostics;\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 { StatusCodeToString } from 'opcjs-base'\n\n/**\n * Thrown when the server rejects `CreateSession` because no (or an invalid)\n * client certificate was supplied.\n *\n * This signals that the OPC UA 1.0 fallback path should be attempted: retry\n * `CreateSession` with the `applicationInstanceCertificate` from the\n * `SecurityConfiguration`.\n *\n * Relevant OPC UA status codes that trigger this error:\n * - `BadCertificateInvalid` (0x80120000) – null/empty cert was rejected\n * - `BadSecurityChecksFailed` (0x80130000) – security validation failed\n * - `BadNoValidCertificates` (0x80590000) – server found no valid certificate\n */\nexport class CertificateRequiredError extends Error {\n readonly statusCode: number\n\n constructor(statusCode: number) {\n super(\n `Server requires a client certificate: ${StatusCodeToString(statusCode)}` +\n ` (0x${statusCode.toString(16).toUpperCase().padStart(8, '0')})`,\n )\n this.name = 'CertificateRequiredError'\n this.statusCode = statusCode\n }\n}\n\n/**\n * Status codes that indicate the server requires a client certificate even\n * when SecurityPolicy is None (OPC UA 1.0 servers).\n */\nexport const CERTIFICATE_REQUIRED_STATUS_CODES = new Set<number>([\n 0x80120000, // BadCertificateInvalid\n 0x80130000, // BadSecurityChecksFailed\n 0x80590000, // BadNoValidCertificates\n])\n","import {\n ActivateSessionRequest, ActivateSessionResponse, ApplicationDescription, ApplicationTypeEnum,\n CancelRequest, CancelResponse,\n CloseSessionRequest, CloseSessionResponse,\n Configuration, CreateSessionRequest, CreateSessionResponse, EndpointDescription, ExtensionObject,\n getLogger,\n ISecureChannel, LocalizedText, NodeId, SignatureData, SignedSoftwareCertificate, StatusCode,\n StatusCodeToString, UserIdentityToken,\n} from \"opcjs-base\";\nimport { ServiceBase } from \"./serviceBase\";\nimport { CERTIFICATE_REQUIRED_STATUS_CODES, CertificateRequiredError } from \"../sessions/certificateRequiredError.js\";\n\nexport class SessionService extends ServiceBase {\n private logger = getLogger(\"services.SessionService\");\n\n /**\n * Creates a new session on the server (OPC UA Part 4, Section 5.7.2).\n *\n * @param clientCertificate - Optional DER-encoded client certificate to include in\n * the request. Pass `null` (default) for SecurityPolicy None without a cert.\n * When the server rejects a `null`-cert request with a certificate-related status\n * code, the caller should retry with a `Uint8Array` certificate (OPC UA 1.0\n * fallback — see `CertificateRequiredError`).\n * @returns The session ID, authentication token, and selected server endpoint.\n * @throws {CertificateRequiredError} when the server demands a client certificate.\n */\n async createSession(clientCertificate: Uint8Array | null = null): Promise<{ sessionId: number, authToken: NodeId, endpoint: EndpointDescription }> {\n this.logger.debug(\"Creating session...\");\n\n const clientDescription = new ApplicationDescription();\n clientDescription.applicationUri = this.configuration.applicationUri;\n clientDescription.productUri = this.configuration.productUri;\n clientDescription.applicationName = new LocalizedText(undefined, this.configuration.productName);\n clientDescription.applicationType = ApplicationTypeEnum.Client;\n clientDescription.gatewayServerUri = '';\n clientDescription.discoveryProfileUri = '';\n clientDescription.discoveryUrls = new Array<string>();\n\n const request = new CreateSessionRequest();\n request.requestHeader = this.createRequestHeader();\n request.clientDescription = clientDescription;\n request.serverUri = '';\n request.endpointUrl = this.secureChannel.getEndpointUrl();\n request.sessionName = '';\n request.clientNonce = null;\n request.clientCertificate = clientCertificate ?? null;\n request.requestedSessionTimeout = 60000;\n request.maxResponseMessageSize = 0;\n\n\n // todo: verify endpoints\n // todo: check application uri in server certificate\n\n this.logger.debug(\"Sending CreateSessionRequest...\");\n const response = await this.secureChannel.issueServiceRequest(request);\n if (!response || !(response instanceof CreateSessionResponse)) {\n throw new Error(\"Invalid response type for CreateSessionRequest\");\n }\n\n const castedResponse = response as CreateSessionResponse;\n if (!castedResponse || !castedResponse.sessionId || !castedResponse.authenticationToken) {\n throw new Error(\"CreateSessionResponse missing SessionId or AuthenticationToken\");\n }\n\n const serviceResult = castedResponse.responseHeader?.serviceResult;\n if (serviceResult !== undefined && serviceResult !== StatusCode.Good) {\n if (CERTIFICATE_REQUIRED_STATUS_CODES.has(serviceResult)) {\n throw new CertificateRequiredError(serviceResult);\n }\n throw new Error(`CreateSessionRequest failed: ${StatusCodeToString(serviceResult)}`);\n }\n\n // The URL the client actually used to connect. Prepend the OPC UA scheme\n // prefix so it is parseable by the standard URL constructor.\n const clientConnectionUrl = new URL('opc.' + this.secureChannel.getEndpointUrl())\n const securityMode = this.secureChannel.getSecurityMode()\n const securityPolicyUri = this.secureChannel.getSecurityPolicy()\n\n // OPC UA Part 4, Section 5.4.4.2: Clients should be prepared to replace\n // the HostName and port returned in the EndpointDescription with the\n // HostName or IP address and port they used to call GetEndpoints. This\n // handles NAT/load-balancer scenarios where the server advertises internal\n // addresses that are unreachable by the client.\n const normalizeEndpointUrl = (serverEndpointUrl: string): URL => {\n const url = new URL(serverEndpointUrl)\n url.hostname = clientConnectionUrl.hostname\n url.port = clientConnectionUrl.port\n return url\n }\n\n // Match on protocol and path only; host and port are normalized away so\n // that internally-addressed endpoints are still found.\n const serverEndpoint = castedResponse?.serverEndpoints?.find(currentEndpoint => {\n const normalized = normalizeEndpointUrl(currentEndpoint.endpointUrl as string)\n return normalized.protocol === clientConnectionUrl.protocol\n && normalized.pathname === clientConnectionUrl.pathname\n && currentEndpoint.securityMode === securityMode\n && currentEndpoint.securityPolicyUri === securityPolicyUri\n })\n\n if (!serverEndpoint) {\n throw new Error(`Server endpoint ${clientConnectionUrl.toString()} not found in CreateSessionResponse`)\n }\n\n // Replace the server-reported host and port with the client's actual\n // connection address so downstream code uses the correct URL.\n serverEndpoint.endpointUrl = normalizeEndpointUrl(serverEndpoint.endpointUrl as string).toString()\n\n // NOTE: per OPC UA Part 4, Section 5.4.4.2 the client shall still verify\n // the HostName it used to open the SecureChannel against the HostName list\n // in the Server Certificate. This is deferred until certificate-based\n // security (non-None SecurityPolicy) is implemented.\n\n this.logger.debug(\"Session created with id:\", castedResponse.sessionId.identifier);\n return {\n sessionId: castedResponse.sessionId.identifier as number,\n authToken: castedResponse.authenticationToken,\n endpoint: serverEndpoint\n };\n }\n\n /**\n * Activates an existing session using the supplied identity token (OPC UA Part 4, Section 5.7.3).\n * @param identityToken - User identity token (anonymous, username/password, certificate, or issued token).\n */\n async activateSession(identityToken: UserIdentityToken): Promise<void> {\n const signatureData = new SignatureData();\n signatureData.algorithm = this.secureChannel.getSecurityPolicy();\n signatureData.signature = new Uint8Array(0);\n\n const request = new ActivateSessionRequest();\n request.requestHeader = this.createRequestHeader();\n request.clientSignature = signatureData;\n request.clientSoftwareCertificates = new Array<SignedSoftwareCertificate>();\n request.localeIds = ['en-US'];\n request.userIdentityToken = ExtensionObject.newBinary(identityToken);\n request.userTokenSignature = signatureData;\n\n this.logger.debug(\"Sending ActivateSessionRequest...\");\n const activateResponse = await this.secureChannel.issueServiceRequest(request) as ActivateSessionResponse;\n\n const activateResult = activateResponse?.responseHeader?.serviceResult;\n if (activateResult !== undefined && activateResult !== StatusCode.Good) {\n throw new Error(`ActivateSessionRequest failed: ${StatusCodeToString(activateResult)}`);\n }\n\n this.logger.debug(\"Session activated.\");\n }\n\n /**\n * Sends a CancelRequest to the server asking it to abandon the pending\n * service request identified by `requestHandle` (OPC UA Part 4, Section 5.7.5).\n *\n * The server makes a best-effort attempt to cancel matching requests.\n * Cancelled requests complete with a status of `BadRequestCancelledByClient`.\n *\n * @param requestHandle - The `requestHeader.requestHandle` value of the pending\n * request to cancel. Pass `0` to attempt to cancel all outstanding requests\n * (server behaviour for handle 0 is implementation-specific).\n * @returns The number of pending requests that were actually cancelled\n * (`CancelResponse.cancelCount`).\n */\n async cancel(requestHandle: number): Promise<number> {\n this.logger.debug(`Sending CancelRequest for requestHandle ${requestHandle}...`);\n\n const request = new CancelRequest();\n request.requestHeader = this.createRequestHeader();\n request.requestHandle = requestHandle;\n\n const response = await this.secureChannel.issueServiceRequest(request) as CancelResponse;\n\n const result = response?.responseHeader?.serviceResult;\n if (result !== undefined && result !== StatusCode.Good) {\n throw new Error(`CancelRequest failed: ${StatusCodeToString(result)}`);\n }\n\n const cancelCount = response?.cancelCount ?? 0;\n this.logger.debug(`CancelRequest completed; cancelCount = ${cancelCount}.`);\n return cancelCount;\n }\n\n /**\n * Closes the current session on the server (OPC UA Part 4, Section 5.7.4).\n * @param deleteSubscriptions - When true the server deletes all Subscriptions\n * associated with this Session, freeing their resources immediately.\n * Pass false to keep Subscriptions alive for transfer to another Session.\n */\n async closeSession(deleteSubscriptions: boolean): Promise<void> {\n this.logger.debug('Sending CloseSessionRequest...')\n\n const request = new CloseSessionRequest()\n request.requestHeader = this.createRequestHeader()\n request.deleteSubscriptions = deleteSubscriptions\n\n const response = await this.secureChannel.issueServiceRequest(request) as CloseSessionResponse\n\n const result = response?.responseHeader?.serviceResult\n if (result !== undefined && result !== StatusCode.Good) {\n throw new Error(`CloseSession failed: ${StatusCodeToString(result)}`)\n }\n\n this.logger.debug('Session closed.')\n }\n\n recreate(authToken: NodeId): SessionService {\n return new SessionService(authToken, this.secureChannel, this.configuration)\n }\n\n constructor(authToken: NodeId, secureChannel: ISecureChannel, private configuration: Configuration) {\n super(authToken, secureChannel)\n }\n}","interface IssuerEndpointUrl {\n 'ua.resourceId': string;\n 'ua.authorityUrl': string;\n 'ua.authorityProfileUri': string;\n 'ua.tokenEndpoint': string;\n 'ua.authorizationEndpoint': string;\n 'ua.requestTypes': string[];\n 'ua.scopes': string[];\n}\n\nexport class IssuerConfiguration{\n public static newFrom(issuerEndpointUrl: IssuerEndpointUrl): IssuerConfiguration {\n return new IssuerConfiguration(\n issuerEndpointUrl['ua.resourceId'],\n issuerEndpointUrl['ua.authorityUrl'],\n issuerEndpointUrl['ua.authorityProfileUri'],\n issuerEndpointUrl['ua.tokenEndpoint'],\n issuerEndpointUrl['ua.authorizationEndpoint'],\n issuerEndpointUrl['ua.requestTypes'],\n issuerEndpointUrl['ua.scopes']\n );\n }\n \n constructor(\n public resourceId: string,\n public authorityUrl: string,\n public authorityProfileUri: string,\n public tokenEndpoint: string,\n public authorizationEndpoint: string,\n public requestTypes: string[],\n public scopes: string[]\n ){\n \n }\n}","import { EndpointDescription, IssuedIdentityToken, NodeId, UserTokenTypeEnum } from \"opcjs-base\";\nimport { IssuerConfiguration } from \"../configuration/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 getSessionId(): number {\n return this.sessionId;\n }\n\n getEndpoint(): EndpointDescription {\n return this.endpoint;\n }\n\n /**\n * Switches the active user identity for this session by calling ActivateSession with\n * a new identity token (OPC UA Part 4, Section 5.7.3 — Session Client Impersonate\n * conformance unit).\n *\n * The server re-evaluates authorisation for the session under the new identity.\n * All existing Subscriptions and MonitoredItems are preserved; only the security\n * context changes.\n *\n * @param identity - The new user identity to apply to the session.\n * @throws When the server returns a non-Good ServiceResult (e.g. `BadIdentityTokenRejected`\n * or `BadUserAccessDenied`).\n */\n async impersonate(identity: UserIdentity): Promise<void> {\n await this.activateSession(identity)\n }\n\n /**\n * Closes the session on the server (OPC UA Part 4, Section 5.7.4).\n * @param deleteSubscriptions - When true the server deletes all Subscriptions\n * tied to this Session. Defaults to true.\n */\n async close(deleteSubscriptions = true): Promise<void> {\n await this.sessionServices.closeSession(deleteSubscriptions)\n }\n\n constructor(\n public sessionId: number,\n private authToken: NodeId,\n private endpoint: EndpointDescription,\n private sessionServices: SessionService) { }\n}","import { ConfigurationClient } from \"../configuration/configurationClient\";\nimport { EndpointDescription, ISecureChannel, NodeId, UserTokenTypeEnum, getLogger } from \"opcjs-base\";\nimport { SessionService } from \"../services/sessionService\";\nimport { UserIdentity } from \"../userIdentity\";\nimport { Session } from \"./session\";\nimport { CertificateRequiredError } from \"./certificateRequiredError.js\";\n\nexport class SessionHandler {\n private sessionServices: SessionService;\n private logger = getLogger(\"sessions.SessionHandler\");\n\n async createNewSession(identity:UserIdentity) : Promise<Session>{\n // OPC UA 1.0 fallback: first attempt without a client certificate (SecurityPolicy None\n // default). If the server signals that a certificate is required, retry once with the\n // applicationInstanceCertificate from the security configuration (if present).\n let sessionResult: Awaited<ReturnType<SessionService['createSession']>>\n try {\n sessionResult = await this.sessionServices.createSession(null)\n } catch (err) {\n if (err instanceof CertificateRequiredError) {\n const fallbackCert = this.configuration.securityConfiguration?.applicationInstanceCertificate\n if (fallbackCert) {\n this.logger.info(\n 'Server requires a client certificate (OPC UA 1.0 fallback); ' +\n 'retrying CreateSession with applicationInstanceCertificate.',\n )\n sessionResult = await this.sessionServices.createSession(fallbackCert)\n } else {\n this.logger.warn(\n 'Server requires a client certificate but no applicationInstanceCertificate ' +\n 'is configured in securityConfiguration. Cannot complete the 1.0 fallback.',\n )\n throw err\n }\n } else {\n throw err\n }\n }\n\n this.sessionServices = this.sessionServices.recreate(sessionResult.authToken)\n\n const session = new Session(sessionResult.sessionId, sessionResult.authToken, sessionResult.endpoint, this.sessionServices);\n\n // Enforce user-token type restrictions from the client security configuration\n // before activating; the endpoint is now known from CreateSession.\n this.validateUserTokenPolicy(identity, sessionResult.endpoint)\n\n await session.activateSession(identity);\n return session;\n }\n\n /**\n * Attempts to reactivate an existing OPC UA session on the current (new) SecureChannel\n * without calling CreateSession first (OPC UA Part 4, Section 5.7.3).\n *\n * This is the preferred recovery path when the SecureChannel drops but the server-side\n * session has not yet timed out: only a new channel is needed, not a new session.\n *\n * @returns The reactivated Session if ActivateSession succeeded, or `null` if the server\n * rejected the request (e.g. the session had already expired).\n */\n async tryActivateExistingSession(\n existingAuthToken: NodeId,\n existingSessionId: number,\n existingEndpoint: EndpointDescription,\n identity: UserIdentity,\n ): Promise<Session | null> {\n // Build a SessionService bound to the existing auth token so the RequestHeader\n // carries it and the server can correlate the ActivateSession to the right session.\n const serviceForExistingSession = this.sessionServices.recreate(existingAuthToken)\n try {\n const session = new Session(existingSessionId, existingAuthToken, existingEndpoint, serviceForExistingSession)\n await session.activateSession(identity)\n return session\n } catch (err) {\n this.logger.debug('ActivateSession for existing session failed:', err)\n return null\n }\n }\n\n /**\n * Closes the active session on the server (OPC UA Part 4, Section 5.7.4).\n * @param deleteSubscriptions - Forwarded to CloseSessionRequest. Defaults to true.\n */\n async closeSession(deleteSubscriptions = true): Promise<void> {\n await this.sessionServices.closeSession(deleteSubscriptions)\n }\n\n /**\n * Sends a CancelRequest to the server to abandon a pending service call\n * (OPC UA Part 4, Section 5.7.5).\n *\n * @param requestHandle - The `requestHandle` from the `RequestHeader` of the\n * pending request to cancel.\n * @returns The number of requests the server actually cancelled.\n */\n async cancel(requestHandle: number): Promise<number> {\n return this.sessionServices.cancel(requestHandle)\n }\n\n /**\n * Validates the requested user-identity token type against:\n * 1. The `allowedUserTokenTypes` from the client security configuration — the\n * client has explicitly restricted which token types it will use.\n * 2. The token policies advertised by the server endpoint — verifies that the\n * server actually supports at least one of the allowed types.\n *\n * Throws with a descriptive message if either check fails.\n */\n private validateUserTokenPolicy(identity: UserIdentity, endpoint: EndpointDescription): void {\n const allowedTypes = this.configuration.securityConfiguration?.allowedUserTokenTypes\n if (!allowedTypes) return // no restriction configured\n\n const requestedType = identity.getTokenType()\n\n // 1. Client-side restriction: the chosen identity must be an allowed type.\n if (!allowedTypes.includes(requestedType)) {\n throw new Error(\n `User token type '${UserTokenTypeEnum[requestedType]}' is not permitted by the ` +\n `client security configuration. Allowed types: ` +\n `${allowedTypes.map(t => UserTokenTypeEnum[t]).join(', ')}.`,\n )\n }\n\n // 2. Server-side availability: at least one allowed type must be offered.\n const serverTypes = endpoint.userIdentityTokens?.map(p => p.tokenType) ?? []\n const intersection = allowedTypes.filter(t => serverTypes.includes(t))\n if (intersection.length === 0) {\n throw new Error(\n `Server endpoint does not offer any user token type from the allowed list: ` +\n `${allowedTypes.map(t => UserTokenTypeEnum[t]).join(', ')}. ` +\n `Server offers: ${serverTypes.map(t => UserTokenTypeEnum[t]).join(', ')}.`,\n )\n }\n }\n\n constructor(secureChannel:ISecureChannel, private configuration: ConfigurationClient) {\n this.sessionServices = new SessionService(NodeId.newTwoByte(0), secureChannel, configuration);\n }\n}","import type { MessageSecurityModeEnum, UserTokenTypeEnum } from 'opcjs-base'\n\n/** URI for the SecurityPolicy None profile. */\nexport const SECURITY_POLICY_NONE_URI = 'http://opcfoundation.org/UA/SecurityPolicy#None'\n\n/**\n * How the client should handle a server certificate it cannot verify.\n *\n * - `'reject'` — abort the connection (secure default when `trustedCAs` is configured).\n * - `'trust'` — accept any certificate without verification (development convenience;\n * **insecure in production**).\n *\n * @note Enforcement is deferred until certificate-based security policies are\n * implemented. The value is stored and will be honoured when that support lands.\n */\nexport type UnknownCertificatePolicy = 'reject' | 'trust'\n\n/**\n * OPC UA client security configuration (OPC UA Part 2, Security Administration CU).\n *\n * Restricts which security options the client will accept when connecting to or\n * negotiating with a server. All fields are optional; omitting a field applies\n * the permissive default so that existing callers need no changes.\n *\n * @example\n * ```ts\n * const config = ConfigurationClient.getSimple('MyApp', 'MyCompany')\n * config.securityConfiguration = {\n * allowedUserTokenTypes: [UserTokenTypeEnum.UserName],\n * allowSecurityPolicyNone: false, // require an encrypted channel\n * }\n * ```\n */\nexport type SecurityConfiguration = {\n /**\n * User-identity-token types the client is willing to accept.\n *\n * When set, `connect()` will throw if:\n * - The supplied `UserIdentity`'s token type is not in this list, OR\n * - The server endpoint does not offer any type from this list.\n *\n * Default: all token types are accepted (no restriction).\n */\n allowedUserTokenTypes?: UserTokenTypeEnum[]\n\n /**\n * Allow connecting when the negotiated SecurityPolicy is `None` (unencrypted,\n * unsigned channel).\n *\n * Set to `false` to require a secure channel — `connect()` will throw rather\n * than establish a cleartext connection.\n *\n * Currently the only supported security policy is `None`. Setting this to `false`\n * will therefore cause `connect()` to always throw until non-None policies are\n * added to this client implementation.\n *\n * Default: `true` (SecurityPolicy None is permitted).\n */\n allowSecurityPolicyNone?: boolean\n\n /**\n * Required `MessageSecurityMode` for the secure channel.\n *\n * When set, `connect()` verifies that the channel's negotiated mode matches\n * this value and throws otherwise.\n *\n * Currently only `MessageSecurityModeEnum.None` is supported.\n *\n * Default: no requirement (any mode is accepted).\n */\n messageSecurityMode?: MessageSecurityModeEnum\n\n /**\n * DER-encoded X.509 trusted CA certificates used to verify the server's\n * application instance certificate.\n *\n * @note Reserved for future use. Certificate verification is not yet implemented.\n * Providing this field has no effect until non-None security policies land.\n */\n trustedCAs?: Uint8Array[]\n\n /**\n * How to handle a server certificate that cannot be verified against `trustedCAs`.\n *\n * - `'reject'` — refuse the connection (default when `trustedCAs` is provided).\n * - `'trust'` — accept any certificate (development only; insecure in production).\n *\n * @note Reserved for future use. Has no effect until certificate verification is\n * implemented alongside non-None security policies.\n */\n unknownCertificatePolicy?: UnknownCertificatePolicy\n\n /**\n * DER-encoded X.509 ApplicationInstanceCertificate for this client.\n *\n * When set, this certificate is used in a OPC UA 1.0 compatibility fallback:\n * if `CreateSession` with no client certificate is rejected by the server with\n * a certificate-related status code (`BadCertificateInvalid`,\n * `BadSecurityChecksFailed`, or `BadNoValidCertificates`), the `CreateSession`\n * is automatically retried with this certificate in the `clientCertificate`\n * field (OPC UA Part 4, SecurityPolicy None – CreateSession/ActivateSession 1.0\n * optional conformance unit).\n *\n * Without this field the fallback is disabled and the error propagates as-is.\n */\n applicationInstanceCertificate?: Uint8Array\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 {\n DiagnosticInfo, getLogger, ISecureChannel, NodeId, QualifiedName, ReadRequest, ReadResponse,\n ReadValueId, StatusCode, TimestampsToReturnEnum,\n} from 'opcjs-base'\n\nimport { AttrIdValue } from './attributeServiceAttributes.js'\nimport { ServiceBase } from './serviceBase.js'\n\n// https://reference.opcfoundation.org/Core/Part4/v105/docs/5.10.2\nexport class AttributeService extends ServiceBase {\n private logger = getLogger(\"services.AttributeService\");\n\n /**\n * Reads the Value attribute of one or more Nodes (OPC UA Part 4, Section 5.10.2).\n * @param nodeIds - NodeIds of the Nodes to read.\n * @param maxAge - Maximum age of the cached value in milliseconds the server may return. 0 = always current value.\n * @param timestampsToReturn - Which timestamps to include in results. Default: Source.\n * @param returnDiagnostics - Bitmask of diagnostic fields to request (OPC UA Part 4, §7.15). Default: 0.\n * @returns Array of results containing value, raw status code, and optional diagnostic info, one per requested NodeId.\n */\n async ReadValue(\n nodeIds: NodeId[],\n maxAge: number = 0,\n timestampsToReturn: TimestampsToReturnEnum = TimestampsToReturnEnum.Source,\n returnDiagnostics = 0,\n requestHandle?: number,\n ): Promise<{ statusCode: number, value: unknown, diagnosticInfo?: DiagnosticInfo }[]> {\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, ''); // empty per OPC UA Part 4 §7.28 — no longer used\n return readValueId;\n });\n\n const request = new ReadRequest();\n request.requestHeader = this.createRequestHeader(returnDiagnostics, requestHandle);\n request.maxAge = maxAge;\n request.timestampsToReturn = timestampsToReturn;\n request.nodesToRead = readValueIds;\n\n this.logger.debug(\"Sending ReadRequest...\");\n const response = await this.secureChannel.issueServiceRequest(request) as ReadResponse;\n\n this.checkServiceResult(response.responseHeader?.serviceResult, 'ReadRequest')\n\n const results = new Array<{ statusCode: number, value: unknown, diagnosticInfo?: DiagnosticInfo }>();\n const diagInfos = response.diagnosticInfos ?? []\n for (let i = 0; i < (response.results ?? []).length; i++) {\n const dataValue = response.results[i]\n results.push({\n statusCode: dataValue.statusCode ?? StatusCode.Good,\n value: dataValue.value as unknown,\n diagnosticInfo: diagInfos[i],\n });\n }\n return results;\n }\n\n constructor(authToken: NodeId, secureChannel: ISecureChannel) {\n super(authToken, secureChannel);\n }\n}","import type { DiagnosticInfo } from 'opcjs-base'\n\nexport class ReadValueResult {\n constructor(\n public value: unknown,\n public statusCode: number,\n /** Diagnostic info returned by the server when `returnDiagnostics` was set in the request options. */\n public diagnosticInfo?: DiagnosticInfo,\n ) {}\n}","import { NodeId } from \"opcjs-base\";\n\nexport class SubscriptionHandlerEntry{\n constructor(\n public subscriptionId:number,\n public handle: number, \n public id:NodeId, \n public callback: (data: { id: NodeId, value: unknown }[]) => void\n ){}\n}","import {\n DataChangeNotification,\n ExpandedNodeId,\n getLogger,\n NodeId,\n StatusChangeNotification,\n StatusCode,\n SubscriptionAcknowledgement,\n} from 'opcjs-base'\n\nimport { MonitoredItemService } from '../services/monitoredItemService'\nimport { SubscriptionService } from '../services/subscriptionService'\nimport { SubscriptionOptions } from \"./subscriptionOptions\"\nimport { SubscriptionHandlerEntry } from './subscriptionHandlerEntry'\n\n// OPC UA Part 4, §5.14 — Subscriptions and Monitored Items\n\n/** Node type IDs for notification payloads (OPC UA Part 4, §7.21) */\nconst NODE_ID_DATA_CHANGE_NOTIFICATION = 811\nconst NODE_ID_STATUS_CHANGE_NOTIFICATION = 818\n\nexport class SubscriptionHandler {\n private logger = getLogger('SubscriptionHandler')\n private entries = new Array<SubscriptionHandlerEntry>()\n private nextHandle = 0\n private isRunning = false\n /** Guards against multiple concurrent publish loops. */\n private publishInFlight = false\n\n /**\n * Optional callback invoked when the server announces a shutdown via a\n * `StatusChangeNotification` with status `BadShutdown` or `BadServerHalted`\n * (OPC UA Part 4, §5.13.6.2 — Session Client Detect Shutdown).\n *\n * Assign this before calling `subscribe()`. The client sets it automatically\n * in `initServices()` to trigger a reconnect.\n */\n onShutdown?: () => void\n\n /** Returns true when at least one subscription is active and the publish loop is running. */\n hasActiveSubscription(): boolean {\n return this.isRunning && this.entries.length > 0\n }\n\n async subscribe(\n ids: NodeId[], \n callback: (data: { id: NodeId; value: unknown }[]) => void, \n options?: SubscriptionOptions\n ) {\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(options)\n const items = []\n for (const id of ids) {\n const entry = new SubscriptionHandlerEntry(subscriptionId, this.nextHandle++, id, callback)\n this.entries.push(entry)\n items.push({ id, handle: entry.handle })\n }\n await this.monitoredItemService.createMonitoredItems(subscriptionId, items, options)\n\n // Start the publish loop with no pending acknowledgements.\n this.isRunning = true\n void this.publishLoop([])\n }\n\n // https://reference.opcfoundation.org/Core/Part4/v105/docs/5.14.5\n private async publishLoop(pendingAcknowledgements: SubscriptionAcknowledgement[]): Promise<void> {\n if (!this.isRunning) return\n\n // Prevent a second publish loop from running concurrently. This can\n // happen when routeFrames settles two responses back-to-back and each\n // continuation attempts to start a new iteration.\n if (this.publishInFlight) return\n this.publishInFlight = true\n\n let response\n try {\n response = await this.subscriptionService.publish(pendingAcknowledgements)\n } catch (err) {\n this.logger.error(`Publish failed, stopping publish loop: ${err}`)\n this.isRunning = false\n this.publishInFlight = false\n return\n }\n this.publishInFlight = false\n\n const { subscriptionId, availableSequenceNumbers, moreNotifications, notificationMessage } = response\n const notificationDatas = notificationMessage?.notificationData ?? []\n const seqNumber = notificationMessage?.sequenceNumber\n\n // Build acknowledgements for the next publish request.\n // Per spec: only acknowledge sequence numbers that are in availableSequenceNumbers\n // and only for real notification messages (not keep-alive, which have empty notificationData).\n const nextAcknowledgements: SubscriptionAcknowledgement[] = []\n const isKeepAlive = notificationDatas.length === 0\n\n if (!isKeepAlive && seqNumber !== undefined) {\n // Acknowledge only if the server still lists this sequence number as available.\n const isAvailable = !availableSequenceNumbers || availableSequenceNumbers.includes(seqNumber)\n if (isAvailable) {\n const ack = new SubscriptionAcknowledgement()\n ack.subscriptionId = subscriptionId\n ack.sequenceNumber = seqNumber\n nextAcknowledgements.push(ack)\n }\n }\n\n // Dispatch notifications to registered callbacks.\n for (const notificationData of notificationDatas) {\n const decodedData = notificationData.data\n const rawTypeId = notificationData.typeId\n const typeNodeId = rawTypeId instanceof ExpandedNodeId ? rawTypeId.nodeId : rawTypeId\n\n if (typeNodeId.namespace === 0 && typeNodeId.identifier === NODE_ID_DATA_CHANGE_NOTIFICATION) {\n const dataChangeNotification = decodedData as DataChangeNotification\n for (const item of dataChangeNotification.monitoredItems) {\n const entry = this.entries.find(e => e.handle === item.clientHandle)\n entry?.callback([{ id: entry.id, value: item.value.value?.value }])\n }\n } else if (typeNodeId.namespace === 0 && typeNodeId.identifier === NODE_ID_STATUS_CHANGE_NOTIFICATION) {\n // The server notifies us the subscription state has changed (e.g. expired, closed, shutdown).\n const statusChange = decodedData as StatusChangeNotification\n this.logger.warn(\n `Subscription ${subscriptionId} status changed: 0x${statusChange.status?.toString(16).toUpperCase()}`,\n )\n this.isRunning = false\n // OPC UA Part 4, §5.13.6.2: BadShutdown / BadServerHalted indicates the server is\n // shutting down. Notify the client so it can schedule a reconnect.\n const status = statusChange.status\n if (\n status === StatusCode.BadShutdown ||\n status === StatusCode.BadServerHalted\n ) {\n this.logger.warn('Server shutdown announced via StatusChangeNotification — triggering reconnect.')\n this.onShutdown?.()\n }\n return\n } else {\n this.logger.warn(\n `Notification data type ${typeNodeId.namespace}:${typeNodeId.identifier} is not supported.`,\n )\n }\n }\n\n // Per spec: if moreNotifications is true the server has more queued data — re-publish immediately\n // without delay so the server's queue drains before its lifetime counter expires.\n // Otherwise, schedule the next publish after a short yield to avoid a tight synchronous loop.\n if (moreNotifications) {\n void this.publishLoop(nextAcknowledgements)\n } else {\n setTimeout(() => void this.publishLoop(nextAcknowledgements), 0)\n }\n }\n\n constructor(\n private subscriptionService: SubscriptionService,\n private monitoredItemService: MonitoredItemService,\n ) {}\n}","import {\n CreateSubscriptionRequest, CreateSubscriptionResponse, getLogger, ISecureChannel, NodeId,\n PublishRequest, PublishResponse, StatusCode, StatusCodeToString, SubscriptionAcknowledgement,\n} from \"opcjs-base\";\nimport { ServiceBase } from \"./serviceBase\";\nimport { SubscriptionOptions } from \"./subscriptionOptions\";\n\n// https://reference.opcfoundation.org/Core/Part4/v105/docs/5.14\nexport class SubscriptionService extends ServiceBase {\n private logger = getLogger(\"services.SubscriptionService\");\n\n /**\n * Creates a new subscription on the server (OPC UA Part 4, Section 5.14.2).\n * @param options - Optional subscription parameters; server revises all values.\n * @returns The server-assigned subscription ID.\n */\n // https://reference.opcfoundation.org/Core/Part4/v105/docs/5.14.2\n async createSubscription(options?: SubscriptionOptions): Promise<number> {\n const request = new CreateSubscriptionRequest();\n request.requestHeader = this.createRequestHeader();\n request.requestedPublishingInterval = options?.requestedPublishingInterval ?? 2000;\n request.requestedLifetimeCount = options?.requestedLifetimeCount ?? 360000;\n request.requestedMaxKeepAliveCount = options?.requestedMaxKeepAliveCount ?? 60000;\n request.maxNotificationsPerPublish = options?.maxNotificationsPerPublish ?? 200;\n request.publishingEnabled = true;\n request.priority = options?.priority ?? 1;\n\n this.logger.debug(\"Sending CreateSubscriptionRequest...\");\n const response = await this.secureChannel.issueServiceRequest(request) as CreateSubscriptionResponse;\n\n const serviceResult = response.responseHeader?.serviceResult;\n if (serviceResult !== undefined && serviceResult !== StatusCode.Good) {\n throw new Error(`CreateSubscriptionRequest failed: ${StatusCodeToString(serviceResult)}`);\n }\n\n this.logger.debug(`Subscription created with id: ${response.subscriptionId}`);\n return response.subscriptionId;\n }\n\n /**\n * Sends a publish request to receive notifications from active subscriptions (OPC UA Part 4, Section 5.14.5).\n * @param acknowledgements - Sequence numbers to acknowledge from previous publish responses.\n * @returns The publish response containing notification data.\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 this.logger.debug(\"Sending PublishRequest...\");\n const response = await this.secureChannel.issueServiceRequest(request) as PublishResponse;\n\n const serviceResult = response.responseHeader?.serviceResult;\n if (serviceResult !== undefined && serviceResult !== StatusCode.Good) {\n throw new Error(`PublishRequest failed: ${StatusCodeToString(serviceResult)}`);\n }\n\n this.logger.debug(\"Received PublishResponse.\");\n return response;\n }\n\n constructor(authToken: NodeId, secureChannel: ISecureChannel) {\n super(authToken, secureChannel);\n }\n}","import {\n CreateMonitoredItemsRequest, CreateMonitoredItemsResponse,\n ExtensionObject, getLogger, ISecureChannel, MonitoredItemCreateRequest, MonitoringModeEnum,\n MonitoringParameters, NodeId, QualifiedName, ReadValueId, StatusCode, StatusCodeToString,\n TimestampsToReturnEnum,\n} from \"opcjs-base\";\nimport { AttrIdValue } from \"./attributeServiceAttributes\";\nimport { ServiceBase } from \"./serviceBase\";\nimport { MonitoringOptions } from \"./MonitoringOptions\";\n\n// https://reference.opcfoundation.org/Core/Part4/v105/docs/5.13.2\nexport class MonitoredItemService extends ServiceBase {\n private logger = getLogger(\"services.MonitoredItemService\");\n\n /**\n * Creates monitored items within a subscription (OPC UA Part 4, Section 5.13.2).\n * @param subscriptionId - ID of the subscription to add monitored items to.\n * @param ids - Array of NodeIds and client handles identifying the items to monitor.\n * @param options - Monitoring options (samplingInterval, queueSize).\n */\n async createMonitoredItems(\n subscriptionId: number,\n ids: { id: NodeId, handle: number }[],\n options: MonitoringOptions = {},\n ): Promise<void> {\n const { samplingInterval = 1000, queueSize = 100 } = options\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, ''); // empty per OPC UA Part 4 §7.28 — no longer used\n\n const monitoringParameters = new MonitoringParameters();\n monitoringParameters.clientHandle = ni.handle;\n monitoringParameters.samplingInterval = samplingInterval;\n monitoringParameters.filter = ExtensionObject.newEmpty();\n monitoringParameters.queueSize = queueSize;\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 this.logger.debug(\"Sending CreateMonitoredItemsRequest...\");\n const response = await this.secureChannel.issueServiceRequest(request) as CreateMonitoredItemsResponse;\n\n const serviceResult = response.responseHeader?.serviceResult;\n if (serviceResult !== undefined && serviceResult !== StatusCode.Good) {\n throw new Error(`CreateMonitoredItemsRequest failed: ${StatusCodeToString(serviceResult)}`);\n }\n\n for (const result of response.results ?? []) {\n if (result.statusCode !== undefined && result.statusCode !== StatusCode.Good) {\n this.logger.warn(`Failed to create monitored item: ${StatusCodeToString(result.statusCode)}`);\n }\n }\n }\n\n constructor(authToken: NodeId, secureChannel: ISecureChannel) {\n super(authToken, secureChannel);\n }\n}","import { CallMethodRequest, CallRequest, CallResponse, DiagnosticInfo, getLogger, ISecureChannel, NodeId, StatusCode } from 'opcjs-base'\n\nimport { ServiceBase } from './serviceBase.js'\n\n// https://reference.opcfoundation.org/Core/Part4/v105/docs/5.11.2\nexport class MethodService extends ServiceBase {\n private logger = getLogger(\"services.MethodService\");\n\n /**\n * Calls one or more methods on the server (OPC UA Part 4, Section 5.11.2).\n * @param methodsToCall - Array of CallMethodRequest describing each method to invoke.\n * @param returnDiagnostics - Bitmask of diagnostic fields to request (OPC UA Part 4, §7.15). Default: 0.\n * @returns Array of results containing output argument values, raw status code, and optional diagnostic info,\n * one per requested method.\n */\n async call(\n methodsToCall: CallMethodRequest[],\n returnDiagnostics = 0,\n requestHandle?: number,\n ): Promise<{ statusCode: number, value: unknown[], diagnosticInfo?: DiagnosticInfo }[]> {\n const request = new CallRequest();\n request.requestHeader = this.createRequestHeader(returnDiagnostics, requestHandle);\n request.methodsToCall = methodsToCall;\n\n this.logger.debug(\"Sending CallRequest...\");\n const response = await this.secureChannel.issueServiceRequest(request) as CallResponse;\n\n this.checkServiceResult(response.responseHeader?.serviceResult, 'CallRequest')\n\n const diagInfos = response.diagnosticInfos ?? []\n return response.results.map((result, i) => ({\n statusCode: result.statusCode ?? StatusCode.Good,\n value: result.outputArguments.map(arg => arg.value),\n diagnosticInfo: diagInfos[i],\n }));\n }\n\n constructor(authToken: NodeId, secureChannel: ISecureChannel) {\n super(authToken, secureChannel);\n }\n}\n","import type { DiagnosticInfo } from 'opcjs-base'\n\nexport class CallMethodResult {\n constructor(\n public values: unknown[],\n public statusCode: number,\n /** Diagnostic info returned by the server when `returnDiagnostics` was set in the request options. */\n public diagnosticInfo?: DiagnosticInfo,\n ) {}\n}","import {\n BrowseDescription, BrowseNextRequest, BrowseNextResponse,\n BrowseRequest, BrowseResponse, BrowseResult,\n getLogger, ISecureChannel, NodeId, UaByteString, ViewDescription,\n} from 'opcjs-base'\n\nimport { ServiceBase } from './serviceBase.js'\n\n// https://reference.opcfoundation.org/Core/Part4/v105/docs/5.9\nexport class BrowseService extends ServiceBase {\n private logger = getLogger(\"services.BrowseService\");\n\n /**\n * Browses one or more Nodes and returns their References (OPC UA Part 4, Section 5.9.2).\n * @param nodesToBrowse - Array of BrowseDescriptions specifying nodes and filter criteria.\n * @param returnDiagnostics - Bitmask of diagnostic fields to request (OPC UA Part 4, §7.15). Default: 0.\n * @returns Array of BrowseResult, one per requested node.\n */\n async browse(nodesToBrowse: BrowseDescription[], returnDiagnostics = 0, requestHandle?: number): Promise<BrowseResult[]> {\n const view = new ViewDescription();\n view.viewId = NodeId.newNumeric(0, 0);\n view.timestamp = new Date(-11644473600000); // OPC UA MinDateTime (ticks=0)\n view.viewVersion = 0;\n\n const request = new BrowseRequest();\n request.requestHeader = this.createRequestHeader(returnDiagnostics, requestHandle);\n request.view = view;\n request.requestedMaxReferencesPerNode = 0;\n request.nodesToBrowse = nodesToBrowse;\n\n this.logger.debug(\"Sending BrowseRequest...\");\n const response = await this.secureChannel\n .issueServiceRequest(request) as BrowseResponse;\n\n this.checkServiceResult(response.responseHeader?.serviceResult, 'BrowseRequest')\n\n return response.results ?? []\n }\n\n /**\n * Continues a Browse operation using continuation points (OPC UA Part 4, Section 5.9.3).\n * @param continuationPoints - Continuation points returned by a prior Browse or BrowseNext call.\n * @param releaseContinuationPoints - If true, releases the continuation points without returning results.\n * @param returnDiagnostics - Bitmask of diagnostic fields to request (OPC UA Part 4, §7.15). Default: 0.\n * @returns Array of BrowseResult, one per continuation point.\n */\n async browseNext(\n continuationPoints: UaByteString[],\n releaseContinuationPoints: boolean,\n returnDiagnostics = 0,\n ): Promise<BrowseResult[]> {\n const request = new BrowseNextRequest();\n request.requestHeader = this.createRequestHeader(returnDiagnostics);\n request.releaseContinuationPoints = releaseContinuationPoints;\n request.continuationPoints = continuationPoints;\n\n this.logger.debug(\"Sending BrowseNextRequest...\");\n const response = await this.secureChannel\n .issueServiceRequest(request) as BrowseNextResponse;\n\n this.checkServiceResult(response.responseHeader?.serviceResult, 'BrowseNextRequest')\n\n return response.results ?? []\n }\n\n constructor(authToken: NodeId, secureChannel: ISecureChannel) {\n super(authToken, secureChannel);\n }\n}\n","import {\n ExpandedNodeId, LocalizedText, NodeClassEnum,\n NodeId, QualifiedName\n} from \"opcjs-base\";\n\nexport class BrowseNodeResult {\n constructor(\n public referenceTypeId: NodeId,\n public isForward: boolean,\n public nodeId: ExpandedNodeId,\n public browseName: QualifiedName,\n public displayName: LocalizedText,\n public nodeClass: NodeClassEnum,\n public typeDefinition: ExpandedNodeId,\n ) {}\n}\n","import { NodeId } from 'opcjs-base'\n\n/**\n * Tracks the OPC UA NamespaceArray for a session (OPC UA Part 4, Section 5.7.1 —\n * Session Client Renew NodeIds conformance unit).\n *\n * The NamespaceArray maps namespace indices (used inside NodeIds) to stable namespace\n * URIs. Because the server may assign different indices to the same URI across\n * sessions (e.g. after a server restart), clients that cache NodeIds must remap\n * the namespace index whenever the table changes.\n *\n * Namespace index `0` is always the OPC UA base namespace\n * (`http://opcfoundation.org/UA/`) and is guaranteed never to change by the spec.\n *\n * @example\n * ```ts\n * const oldTable = new NamespaceTable(['http://opcfoundation.org/UA/', 'urn:my-server:model'])\n * // After reconnect the server puts the model namespace at index 2:\n * const newTable = new NamespaceTable(['http://opcfoundation.org/UA/', 'urn:unrelated', 'urn:my-server:model'])\n * const remapped = oldTable.remapNodeId(NodeId.newNumeric(1, 1001), newTable)\n * // remapped === NodeId(2, 1001)\n * ```\n */\nexport class NamespaceTable {\n private readonly uris: readonly string[]\n\n constructor(uris: string[] = []) {\n // Freeze a copy so the stored array is immutable.\n this.uris = Object.freeze([...uris])\n }\n\n /** Returns the namespace URI at the given index, or `undefined` if out of range. */\n getUri(index: number): string | undefined {\n return this.uris[index]\n }\n\n /** Returns the namespace index for the given URI, or `undefined` if not found. */\n getIndex(uri: string): number | undefined {\n const idx = this.uris.indexOf(uri)\n return idx >= 0 ? idx : undefined\n }\n\n /** Returns the full ordered array of namespace URIs. */\n getUris(): readonly string[] {\n return this.uris\n }\n\n /** Returns `true` when both tables contain the same URIs in the same order. */\n equals(other: NamespaceTable): boolean {\n if (this.uris.length !== other.uris.length) return false\n return this.uris.every((uri, i) => uri === other.uris[i])\n }\n\n /**\n * Remaps the namespace index of `nodeId` from this table to the equivalent\n * index in `newTable` by matching namespace URIs.\n *\n * - Namespace index `0` (OPC UA base namespace) is always returned unchanged.\n * - Returns the **same** `NodeId` instance when the index has not changed.\n * - Returns a **new** `NodeId` instance with the updated index when remapping\n * is required.\n *\n * @throws {Error} When the namespace URI at `nodeId.namespace` is not present\n * in this (old) table or when the URI is not present in `newTable`.\n */\n remapNodeId(nodeId: NodeId, newTable: NamespaceTable): NodeId {\n // Namespace 0 is invariant per the OPC UA spec.\n if (nodeId.namespace === 0) return nodeId\n\n const uri = this.getUri(nodeId.namespace)\n if (uri === undefined) {\n throw new Error(\n `Cannot remap ${nodeId.toString()}: namespace index ${nodeId.namespace} ` +\n `is not present in the old NamespaceTable (length ${this.uris.length}).`,\n )\n }\n\n const newIndex = newTable.getIndex(uri)\n if (newIndex === undefined) {\n throw new Error(\n `Cannot remap ${nodeId.toString()}: namespace URI '${uri}' ` +\n `is not present in the new NamespaceTable.`,\n )\n }\n\n if (newIndex === nodeId.namespace) return nodeId\n\n return new NodeId(newIndex, nodeId.identifier)\n }\n}\n","import {\n NodeId,\n ISecureChannel,\n TcpConnectionHandler,\n SecureChannelFacade,\n SecureChannelContext,\n SecureChannelMessageEncoder,\n SecureChannelTypeDecoder,\n SecureChannelMessageDecoder,\n SecureChannelTypeEncoder,\n initLoggerProvider,\n TcpMessageInjector,\n TcpMessageDecoupler,\n getLogger,\n WebSocketFascade,\n WebSocketReadableStream,\n WebSocketWritableStream,\n SecureChannelChunkReader,\n SecureChannelChunkWriter,\n CallMethodRequest,\n Variant,\n BrowseDescription,\n BrowseDirectionEnum,\n BrowseResultMaskEnum,\n ReferenceDescription,\n LocalizedText,\n ILogger,\n ServerStateEnum,\n type ServerStatusDataType,\n} from 'opcjs-base'\n\nimport { SessionHandler } from './sessions/sessionHandler.js'\nimport { Session } from './sessions/session.js'\nimport { SessionInvalidError } from './sessions/sessionInvalidError.js'\nimport { SECURITY_POLICY_NONE_URI } from './securityConfiguration.js'\nimport { AttributeService } from './services/attributeService.js'\nimport { ReadValueResult } from './readValueResult.js'\nimport { SubscriptionHandler } from './subscription/subscriptionHandler.js'\nimport { SubscriptionService } from './services/subscriptionService.js'\nimport { SubscriptionOptions } from \"./subscription/subscriptionOptions.js\"\nimport { MonitoredItemService } from './services/monitoredItemService.js'\nimport { UserIdentity } from './userIdentity.js'\nimport { ConfigurationClient } from './configuration/configurationClient.js'\nimport { MethodService } from './services/methodService.js'\nimport { CallMethodResult } from './method/callMethodResult.js'\nimport { BrowseService } from './services/browseService.js'\nimport { BrowseNodeResult } from './browseNodeResult.js'\nimport { CallMethodArgument } from './method/callMethodArgument.js'\nimport type { RequestOptions } from './requestOptions.js'\nimport { lastAssignedHandle, nextRequestHandle } from './services/serviceBase.js'\nimport { NamespaceTable } from './namespaceTable.js'\nimport type { SelectionList } from './selectionList.js'\n\n/** NodeId of Server_ServerStatus (ns=0, i=2256) — a cheap server-side read used for session keep-alive. */\nconst SERVER_STATUS_NODE_ID = NodeId.newNumeric(0, 2256)\n/** NodeId of Server.NamespaceArray (ns=0, i=2255) — tracked to implement Session Client Renew NodeIds. */\nconst NAMESPACE_ARRAY_NODE_ID = NodeId.newNumeric(0, 2255)\n/** NodeId of Server/ServerStatus/EstimatedReturnTime (ns=0, i=2992). */\nconst ESTIMATED_RETURN_TIME_NODE_ID = NodeId.newNumeric(0, 2992)\n/** OPC UA HasProperty reference type (ns=0, i=46). Used to find property nodes. */\nconst HAS_PROPERTY_REF_TYPE_ID = NodeId.newNumeric(0, 46)\n/**\n * How often to read the server when no subscription is active (ms).\n * Must be shorter than the server's revisedSessionTimeout (default: 60 000 ms).\n */\nconst KEEP_ALIVE_INTERVAL_MS = 25_000\n/**\n * OPC UA MinDateTime decoded as a JS Date timestamp (ms since Unix epoch).\n * A server that sends MinDateTime for EstimatedReturnTime does not expect to restart.\n */\nconst OPC_UA_MIN_DATE_TIME_MS = -11_644_473_600_000\n\n\nexport class Client {\n private endpointUrl: string\n private attributeService?: AttributeService\n private methodService?: MethodService\n private browseService?: BrowseService\n private session?: Session\n private subscriptionHandler?: SubscriptionHandler\n private logger: ILogger\n // Stored after connect() so that refreshSession() and disconnect() can use them.\n private secureChannel?: ISecureChannel\n private secureChannelFacade?: SecureChannelFacade\n private ws?: WebSocketFascade\n private sessionHandler?: SessionHandler\n private keepAliveTimer?: ReturnType<typeof setInterval>\n /** Set to true while a shutdown-triggered reconnect is pending to avoid duplicate attempts. */\n private shutdownReconnectPending = false\n /** Most recently read NamespaceArray from the server (Session Client Renew NodeIds). */\n private namespaceTable?: NamespaceTable\n\n /**\n * Called whenever the server's NamespaceArray changes after a session (re-)establishment\n * (OPC UA Part 4, Section 5.7.1 — Session Client Renew NodeIds conformance unit).\n *\n * Use `oldTable.remapNodeId(nodeId, newTable)` to recalculate cached NodeIds.\n *\n * @example\n * ```ts\n * client.onNamespaceTableChanged = (oldTable, newTable) => {\n * cachedNodeId = oldTable.remapNodeId(cachedNodeId, newTable)\n * }\n * ```\n */\n onNamespaceTableChanged?: (oldTable: NamespaceTable, newTable: NamespaceTable) => void\n\n /**\n * Called when the server sends `EstimatedReturnTime = MinDateTime`, indicating it does not\n * expect to restart (OPC UA Part 5, Section 12.6 — Base Info Client Estimated Return Time\n * conformance unit).\n *\n * When this fires the automatic reconnect is suppressed. The application is responsible for\n * deciding whether to keep the `Client` instance or dispose it.\n *\n * @example\n * ```ts\n * client.onPermanentShutdown = () => {\n * console.warn('Server will not restart — closing client.')\n * }\n * ```\n */\n onPermanentShutdown?: () => void\n\n getSession(): Session {\n if (!this.session) {\n throw new Error('No session available')\n }\n return this.session\n }\n\n /**\n * (Re-)initialises all session-scoped services from the current `this.session`.\n * Called both after the initial `connect()` and after a session refresh.\n */\n private initServices(): void {\n const authToken = this.session!.getAuthToken()\n const sc = this.secureChannel!\n this.attributeService = new AttributeService(authToken, sc)\n this.methodService = new MethodService(authToken, sc)\n this.browseService = new BrowseService(authToken, sc)\n this.subscriptionHandler = new SubscriptionHandler(\n new SubscriptionService(authToken, sc),\n new MonitoredItemService(authToken, sc),\n )\n // Wire the subscription-level shutdown notification into the same reconnect path.\n this.subscriptionHandler.onShutdown = () => this.handleServerShutdownDetected()\n // Refresh the NamespaceArray after every session (re-)establishment; fire-and-forget.\n void this.refreshNamespaceTable()\n }\n\n /**\n * Reads `Server.NamespaceArray` (ns=0, i=2255) and updates the stored\n * `NamespaceTable`. When the table changes compared to the previous read the\n * `onNamespaceTableChanged` callback is fired so the application can remap\n * any cached NodeIds (OPC UA Part 4, Section 5.7.1 — Session Client Renew\n * NodeIds conformance unit).\n *\n * Errors are logged as warnings and do not propagate to the caller.\n */\n private async refreshNamespaceTable(): Promise<void> {\n if (!this.attributeService) return\n try {\n const results = await this.attributeService.ReadValue([NAMESPACE_ARRAY_NODE_ID])\n // AttributeService returns DataValue.value which is a Variant; the actual\n // namespace URI array lives one level deeper inside Variant.value.\n const variant = results[0]?.value as { value?: unknown } | undefined\n const uris = variant?.value\n if (!Array.isArray(uris)) {\n this.logger.warn('NamespaceArray read returned an unexpected value; skipping table update.')\n return\n }\n const newTable = new NamespaceTable(uris as string[])\n const oldTable = this.namespaceTable\n this.namespaceTable = newTable\n if (oldTable !== undefined && !oldTable.equals(newTable)) {\n this.logger.info('NamespaceArray changed; notifying application to renew NodeIds.')\n this.onNamespaceTableChanged?.(oldTable, newTable)\n }\n } catch (err) {\n this.logger.warn('NamespaceArray read failed; namespace table not updated:', err)\n }\n }\n\n /**\n * Returns the most recently read `NamespaceTable` for this session.\n *\n * Available after `connect()` completes (the table is read as part of session\n * establishment). Returns `undefined` before the first successful read.\n */\n getNamespaceTable(): NamespaceTable | undefined {\n return this.namespaceTable\n }\n\n /**\n * Executes `fn` and, if it throws a `SessionInvalidError`, creates a fresh\n * session and retries the operation exactly once.\n *\n * This covers the reactive case: a service call reveals that the server has\n * already dropped the session (e.g. due to timeout). The new session is\n * established transparently before re-running the original operation.\n *\n * For any other error (e.g. transport-level failures when the SecureChannel\n * drops), this method attempts to reconnect the channel and reactivate the\n * existing session first — falling back to a brand-new session only when\n * reactivation fails — before retrying the operation once.\n */\n private async withSessionRefresh<T>(fn: () => Promise<T>): Promise<T> {\n try {\n return await fn()\n } catch (err) {\n if (err instanceof SessionInvalidError) {\n this.logger.info(`Session invalid (${err.statusCode.toString(16)}), refreshing session...`)\n this.session = await this.sessionHandler!.createNewSession(this.identity)\n this.initServices()\n this.logger.info('Session refreshed, retrying operation.')\n\n // Retry once with the new session. If it fails again the error propagates.\n return await fn()\n }\n\n // Possibly a channel drop: attempt reconnect + ActivateSession on existing session\n // before giving up and creating a brand-new session (OPC UA Part 4 Session Auto Reconnect).\n this.logger.info('Service call failed, attempting channel reconnect and session reactivation...')\n try {\n await this.reconnectAndReactivate()\n this.initServices()\n this.logger.info('Reconnected successfully, retrying operation.')\n } catch (reconnectErr) {\n // Reconnect itself failed; surface the original error so the caller\n // gets a meaningful diagnostic (the reconnect error is logged separately).\n this.logger.warn('Channel reconnect failed:', reconnectErr)\n throw err\n }\n\n // Retry once after a successful reconnect. If it fails again the error propagates.\n return await fn()\n }\n }\n\n /**\n * Starts a periodic keep-alive timer that reads Server_ServerStatus when no subscription is\n * active. OPC UA Part 4, Section 5.7.1 requires clients to keep the session alive; when no\n * subscription Publish loop is running this is the only mechanism that does so.\n *\n * The keep-alive read also serves as the **Detect Shutdown** mechanism (Session Client Detect\n * Shutdown conformance unit): when the returned `ServerStatusDataType.state` equals\n * `ServerStateEnum.Shutdown` the client schedules a reconnect after\n * `SHUTDOWN_RECONNECT_DELAY_MS` to let the server finish its shutdown sequence.\n */\n private startKeepAlive(): void {\n this.keepAliveTimer = setInterval(() => {\n if (this.subscriptionHandler?.hasActiveSubscription()) {\n // The subscription publish loop is already keeping the session alive.\n return\n }\n if (this.attributeService) {\n void this.attributeService.ReadValue([SERVER_STATUS_NODE_ID]).then((results) => {\n const statusData = results[0]?.value as ServerStatusDataType | undefined\n if (statusData?.state === ServerStateEnum.Shutdown) {\n this.handleServerShutdownDetected()\n }\n }).catch((err) => {\n this.logger.warn('Keep-alive read failed:', err)\n })\n }\n }, KEEP_ALIVE_INTERVAL_MS)\n }\n\n private stopKeepAlive(): void {\n clearInterval(this.keepAliveTimer)\n this.keepAliveTimer = undefined\n }\n\n /**\n * Called when a server-shutdown announcement is detected — either via the keep-alive read\n * returning `ServerStateEnum.Shutdown` or via a subscription `StatusChangeNotification`\n * with status `BadShutdown` / `BadServerHalted`.\n *\n * Reads `Server/ServerStatus/EstimatedReturnTime` (ns=0, i=2992) to decide how long to\n * wait before reconnecting (Base Info Client Estimated Return Time conformance unit).\n * Falls back to `configuration.shutdownReconnectDelayMs` when the read fails or the\n * attributed service is not yet available. Fires `onPermanentShutdown` and suppresses the\n * reconnect when the server sends `MinDateTime`.\n *\n * Only one reconnect attempt is scheduled at a time; a second detection while one is already\n * pending is silently ignored.\n */\n private handleServerShutdownDetected(): void {\n if (this.shutdownReconnectPending) {\n return\n }\n this.shutdownReconnectPending = true\n this.stopKeepAlive()\n this.logger.warn('Server shutdown detected; reading EstimatedReturnTime...')\n void this.computeReconnectDelayMs().then((delayMs) => {\n if (delayMs === null) {\n this.logger.warn(\n 'Server indicated it will not restart (MinDateTime). Firing onPermanentShutdown.',\n )\n this.onPermanentShutdown?.()\n this.shutdownReconnectPending = false\n return\n }\n this.logger.warn(`Scheduling reconnect in ${delayMs} ms...`)\n setTimeout(() => {\n void this.reconnectAndReactivate()\n .then(() => {\n this.initServices()\n this.startKeepAlive()\n this.logger.info('Reconnected after server shutdown.')\n })\n .catch((err) => {\n this.logger.warn('Reconnect after server shutdown failed:', err)\n })\n .finally(() => {\n this.shutdownReconnectPending = false\n })\n }, delayMs)\n })\n }\n\n /**\n * Reads `Server/ServerStatus/EstimatedReturnTime` (ns=0, i=2992) and returns the reconnect\n * delay in milliseconds (Base Info Client Estimated Return Time — OPC UA Part 5, §12.6):\n *\n * - Valid future `DateTime` → delay = `estimatedReturnTime − now`, clamped to at least\n * `MIN_RECONNECT_DELAY_MS`.\n * - Past `DateTime` (server should already be available) → `MIN_RECONNECT_DELAY_MS`.\n * - OPC UA `MinDateTime` (server will not restart) → `null`.\n * - Unreadable / unavailable → falls back to `configuration.shutdownReconnectDelayMs`.\n */\n private async computeReconnectDelayMs(): Promise<number | null> {\n if (!this.attributeService) {\n return this.configuration.shutdownReconnectDelayMs\n }\n try {\n const results = await this.attributeService.ReadValue([ESTIMATED_RETURN_TIME_NODE_ID])\n // Navigate through the Variant wrapper: results[0].value is a Variant whose .value is the Date.\n const variant = results[0]?.value as { value?: unknown } | undefined\n const estimatedReturnTime = variant?.value\n if (estimatedReturnTime instanceof Date && !isNaN(estimatedReturnTime.getTime())) {\n if (estimatedReturnTime.getTime() <= OPC_UA_MIN_DATE_TIME_MS) {\n // MinDateTime: server will not restart.\n return null\n }\n const delayMs = estimatedReturnTime.getTime() - Date.now()\n if (delayMs > 0) {\n this.logger.info(\n `EstimatedReturnTime: ${estimatedReturnTime.toISOString()} (reconnect in ${delayMs} ms).`,\n )\n return delayMs\n }\n // EstimatedReturnTime is already in the past — server should be back, retry quickly.\n this.logger.info('EstimatedReturnTime is in the past; reconnecting immediately.')\n return this.configuration.minReconnectDelayMs\n }\n } catch (err) {\n this.logger.debug('Failed to read EstimatedReturnTime; using configured delay:', err)\n }\n return this.configuration.shutdownReconnectDelayMs\n }\n\n async connect(): Promise<void> {\n const { ws, sc } = await this.openTransportAndChannel()\n\n this.secureChannel = sc\n this.secureChannelFacade = sc\n this.ws = ws\n\n this.logger.debug('Creating session...')\n this.sessionHandler = new SessionHandler(sc, this.configuration)\n this.session = await this.sessionHandler.createNewSession(this.identity)\n this.logger.debug('Session created.')\n\n this.logger.debug('Initializing services...')\n this.initServices()\n this.startKeepAlive()\n }\n\n /**\n * Builds the full WebSocket → TCP → SecureChannel pipeline and returns the\n * two objects needed to drive it: the raw WebSocket facade (for teardown)\n * and the SecureChannelFacade (for service requests/session management).\n *\n * Extracted from `connect()` so it can be reused by `reconnectAndReactivate()`.\n */\n private async openTransportAndChannel(): Promise<{ ws: WebSocketFascade; sc: SecureChannelFacade }> {\n const wsOptions = { endpoint: this.endpointUrl }\n const ws = new WebSocketFascade(wsOptions);\n const webSocketReadableStream = new WebSocketReadableStream(ws, 1000);\n const webSocketWritableStream = new WebSocketWritableStream(ws);\n\n const scContext = new SecureChannelContext(this.endpointUrl);\n const tcpMessageInjector = new TcpMessageInjector();\n const tcpConnectionHandler = new TcpConnectionHandler(tcpMessageInjector, scContext);\n const tcpMessageDecoupler = new TcpMessageDecoupler(tcpConnectionHandler.onTcpMessage.bind(tcpConnectionHandler));\n const scMessageEncoder = new SecureChannelMessageEncoder(scContext);\n const scTypeDecoder = new SecureChannelTypeDecoder(\n this.configuration.decoder,\n );\n const scMessageDecoder = new SecureChannelMessageDecoder(scContext);\n const scTypeEncoder = new SecureChannelTypeEncoder(\n this.configuration.encoder,\n );\n const scChunkWriter = new SecureChannelChunkWriter(scContext);\n const scChunkReader = new SecureChannelChunkReader(scContext);\n\n webSocketReadableStream.pipeTo(tcpMessageDecoupler.writable);\n tcpMessageDecoupler.readable.pipeTo(scMessageDecoder.writable);\n scMessageDecoder.readable.pipeTo(scChunkReader.writable);\n scChunkReader.readable.pipeTo(scTypeDecoder.writable);\n\n scTypeEncoder.readable.pipeTo(scChunkWriter.writable);\n scChunkWriter.readable.pipeTo(scMessageEncoder.writable);\n scMessageEncoder.readable.pipeTo(tcpMessageInjector.writable);\n tcpMessageInjector.readable.pipeTo(webSocketWritableStream);\n\n const sc = new SecureChannelFacade(scContext, scTypeDecoder, scTypeEncoder);\n\n let connected = false;\n while (!connected) {\n this.logger.debug(`Connecting to OPC UA server at ${this.endpointUrl}...`);\n await ws.connect();\n this.logger.debug(\"WebSocket connection established, now establishing TCP connection...\");\n connected = await tcpConnectionHandler.connect(this.endpointUrl);\n\n if (!connected) {\n this.logger.info(\"Connection failed, retrying in 2 seconds...\");\n await new Promise((resolve) => setTimeout(resolve, 2000));\n }\n }\n this.logger.info(\"Connected to OPC UA server.\");\n\n this.logger.debug(\"Opening secure channel...\");\n await sc.openSecureChannel();\n this.logger.debug(\"Secure channel established.\");\n\n // Enforce any channel-level security requirements before proceeding.\n this.enforceChannelSecurityConfig(sc);\n\n return { ws, sc };\n }\n\n /**\n * Validates the negotiated channel's security policy and mode against the\n * client's `SecurityConfiguration` (OPC UA Part 2, Security Administration).\n *\n * Throws if:\n * - `allowSecurityPolicyNone` is `false` and the channel uses SecurityPolicy None.\n * - `messageSecurityMode` is set and does not match the channel's actual mode.\n */\n private enforceChannelSecurityConfig(sc: SecureChannelFacade): void {\n const config = this.configuration.securityConfiguration\n if (!config) return\n\n const negotiatedPolicy = sc.getSecurityPolicy()\n const negotiatedMode = sc.getSecurityMode()\n\n if (config.allowSecurityPolicyNone === false && negotiatedPolicy === SECURITY_POLICY_NONE_URI) {\n throw new Error(\n 'Connection refused: SecurityPolicy None is disabled by the client security configuration. ' +\n 'Only SecurityPolicy None is currently supported by this client implementation.',\n )\n }\n\n if (config.messageSecurityMode !== undefined && config.messageSecurityMode !== negotiatedMode) {\n throw new Error(\n `Connection refused: negotiated MessageSecurityMode ${negotiatedMode} does not match ` +\n `the required mode ${config.messageSecurityMode} from the security configuration.`,\n )\n }\n }\n\n /**\n * Tears down the current (dead) channel and establishes a fresh one, then\n * attempts to recover the existing OPC UA session via ActivateSession before\n * falling back to a full CreateSession + ActivateSession.\n *\n * OPC UA Part 4, Section 5.7.1 / Session Client Auto Reconnect conformance unit:\n * When the SecureChannel drops but the server-side session has not yet timed\n * out, the client SHOULD reuse the existing session by calling ActivateSession\n * on the new channel. Only if that fails should the client create a new session.\n */\n private async reconnectAndReactivate(): Promise<void> {\n this.logger.info('Tearing down dead channel before reconnect...')\n\n // Close the old channel and WebSocket (best effort — they may already be dead).\n try { this.secureChannelFacade?.close() } catch { /* already dead */ }\n try { this.ws?.close() } catch { /* already dead */ }\n this.secureChannelFacade = undefined\n this.secureChannel = undefined\n this.ws = undefined\n\n const { ws, sc } = await this.openTransportAndChannel()\n this.secureChannel = sc\n this.secureChannelFacade = sc\n this.ws = ws\n this.sessionHandler = new SessionHandler(sc, this.configuration)\n\n // Attempt to reactivate the existing session on the new channel.\n if (this.session) {\n const reactivated = await this.sessionHandler.tryActivateExistingSession(\n this.session.getAuthToken(),\n this.session.getSessionId(),\n this.session.getEndpoint(),\n this.identity,\n )\n if (reactivated !== null) {\n this.session = reactivated\n this.logger.info('Existing session successfully reactivated on new channel.')\n return\n }\n this.logger.info('ActivateSession for existing session failed; creating a fresh session...')\n }\n\n // Fall back: full CreateSession + ActivateSession.\n this.session = await this.sessionHandler.createNewSession(this.identity)\n this.logger.info('Fresh session established on new channel.')\n }\n\n /**\n * Gracefully disconnects from the OPC UA server.\n *\n * Sequence per OPC UA Part 4, Section 5.7.4:\n * 1. CloseSession (deleteSubscriptions=true) so the server frees all resources.\n * 2. Close the SecureChannel, which cancels the pending token-renewal timer.\n * 3. Close the WebSocket transport.\n *\n * CloseSession errors are swallowed so transport teardown always completes even\n * when the session has already expired on the server side.\n */\n async disconnect(): Promise<void> {\n this.logger.info('Disconnecting from OPC UA server...')\n this.stopKeepAlive()\n\n if (this.session && this.sessionHandler) {\n try {\n await this.sessionHandler.closeSession(true)\n } catch (err) {\n // Session may already be gone on the server; log and continue teardown.\n this.logger.warn('CloseSession failed (continuing teardown):', err)\n }\n this.session = undefined\n }\n\n this.secureChannelFacade?.close()\n this.secureChannelFacade = undefined\n this.secureChannel = undefined\n\n this.ws?.close()\n this.ws = undefined\n\n this.logger.info('Disconnected.')\n }\n\n /**\n * Reads the Value attribute of one or more Nodes.\n *\n * The returned object is a `Promise` that also exposes `requestHandle` — the\n * OPC UA `requestHandle` assigned to the underlying `ReadRequest`. The handle\n * is available synchronously (before `await`) so it can be passed to\n * `cancel()` to abort the in-flight request.\n *\n * @example\n * ```ts\n * const req = client.read([nodeId])\n * await client.cancel(req.requestHandle) // abort before response\n * const results = await req // ReadValueResult[]\n * ```\n */\n read(ids: NodeId[], options?: RequestOptions): Promise<ReadValueResult[]> & { requestHandle: number } {\n const requestHandle = nextRequestHandle()\n const promise = this.withSessionRefresh(async () => {\n const result = await this.attributeService?.ReadValue(ids, 0, undefined, options?.returnDiagnostics, requestHandle)\n return result?.map(r => new ReadValueResult(r.value, r.statusCode, r.diagnosticInfo)) ?? []\n })\n return Object.assign(promise, { requestHandle })\n }\n\n /**\n * Method for calling a single method on the server.\n *\n * The returned object is a `Promise` that also exposes `requestHandle` — the\n * OPC UA `requestHandle` assigned to the underlying `CallRequest`. The handle\n * is available synchronously (before `await`) so it can be passed to\n * `cancel()` to abort the in-flight request.\n *\n * @param objectId - NodeId of the Object that owns the method.\n * @param methodId - NodeId of the Method to invoke.\n * @param inputArguments - Input argument Variants (default: empty).\n * @param options - Request options (e.g. `returnDiagnostics`).\n * @returns A promise resolving to the CallMethodResult, with `requestHandle` available synchronously.\n */\n callMethod(\n objectId: NodeId,\n methodId: NodeId,\n inputArguments: CallMethodArgument[] = [],\n options?: RequestOptions,\n ): Promise<CallMethodResult> & { requestHandle: number } {\n const requestHandle = nextRequestHandle()\n const promise = this.withSessionRefresh(async () => {\n const request = new CallMethodRequest()\n request.objectId = objectId\n request.methodId = methodId\n request.inputArguments = inputArguments.map(arg => Variant.newFrom(arg as Parameters<typeof Variant.newFrom>[0]))\n\n const responses = await this.methodService!.call([request], options?.returnDiagnostics, requestHandle)\n const response = responses[0]\n return new CallMethodResult(response.value, response.statusCode, response.diagnosticInfo)\n })\n return Object.assign(promise, { requestHandle })\n }\n\n /**\n * Browses the Address Space starting from `nodeId`.\n *\n * The returned object is a `Promise` that also exposes `requestHandle` — the\n * OPC UA `requestHandle` assigned to the initial `BrowseRequest`. The handle\n * is available synchronously (before `await`) so it can be passed to\n * `cancel()` to abort the in-flight request.\n *\n * @param nodeId - Starting node.\n * @param recursive - When true, recursively follows HierarchicalReferences.\n * @param options - Request options (e.g. `returnDiagnostics`).\n * @returns A promise resolving to the list of referenced nodes, with `requestHandle` available synchronously.\n */\n browse(\n nodeId: NodeId,\n recursive: boolean = false,\n options?: RequestOptions,\n ): Promise<BrowseNodeResult[]> & { requestHandle: number } {\n const requestHandle = nextRequestHandle()\n const promise = this.withSessionRefresh(() => {\n const visited = new Set<string>()\n return this.browseRecursive(nodeId, recursive, visited, options?.returnDiagnostics ?? 0, requestHandle)\n })\n return Object.assign(promise, { requestHandle })\n }\n\n private async browseRecursive(\n nodeId: NodeId,\n recursive: boolean,\n visited: Set<string>,\n returnDiagnostics: number,\n requestHandle?: number,\n ): Promise<BrowseNodeResult[]> {\n const nodeKey = `${nodeId.namespace}:${nodeId.identifier}`;\n if (visited.has(nodeKey)) {\n return [];\n }\n visited.add(nodeKey);\n\n const description = new BrowseDescription();\n description.nodeId = nodeId;\n description.browseDirection = BrowseDirectionEnum.Forward;\n description.referenceTypeId = NodeId.newNumeric(0, 33); // HierarchicalReferences\n description.includeSubtypes = true;\n description.nodeClassMask = 0; // all node classes\n description.resultMask = BrowseResultMaskEnum.All;\n\n const browseResults = await this.browseService!.browse([description], returnDiagnostics, requestHandle);\n const browseResult = browseResults[0];\n const allReferences = [...(browseResult.references ?? [])];\n\n let continuationPoint = browseResult.continuationPoint;\n while (continuationPoint && continuationPoint.byteLength > 0) {\n const nextResults = await this.browseService!\n .browseNext([continuationPoint], false, returnDiagnostics);\n const nextResult = nextResults[0];\n allReferences.push(...(nextResult.references ?? []));\n continuationPoint = nextResult.continuationPoint;\n }\n\n const results = allReferences.map((ref: ReferenceDescription) =>\n new BrowseNodeResult(\n ref.referenceTypeId,\n ref.isForward,\n ref.nodeId,\n ref.browseName,\n ref.displayName,\n ref.nodeClass,\n ref.typeDefinition,\n )\n );\n\n if (recursive) {\n for (const ref of allReferences) {\n const childNodeId = NodeId.newNumeric(\n ref.nodeId.nodeId.namespace,\n ref.nodeId.nodeId.identifier as number,\n );\n const childResults = await this.browseRecursive(\n childNodeId, true, visited, returnDiagnostics,\n );\n results.push(...childResults);\n }\n }\n\n return results;\n }\n\n async subscribe(\n ids: NodeId[],\n callback: (data: { id: NodeId; value: unknown }[]) => void,\n options?: SubscriptionOptions\n ) {\n this.subscriptionHandler?.subscribe(ids, callback, options);\n }\n\n /**\n * Asks the server to cancel a pending service request\n * (OPC UA Part 4, Section 5.7.5 — Session Client Cancel conformance unit).\n *\n * The `requestHandle` uniquely identifies the pending request. It is the value\n * assigned to `RequestHeader.requestHandle` when the request was initially sent.\n * Service calls made through this client automatically assign monotonically\n * increasing handles, so the caller can capture the handle before or after issuing\n * Each method (`read`, `browse`, `callMethod`) returns a `Promise` with a\n * `requestHandle` property that is available synchronously. Pass that handle\n * here to abort the corresponding in-flight request.\n *\n * The server makes a best-effort attempt to cancel the matching request. Cancelled\n * requests complete with status `BadRequestCancelledByClient`. Not all servers\n * guarantee that a request in flight can be cancelled.\n *\n * @param requestHandle - Handle of the pending request to cancel.\n * @returns The number of pending requests the server actually cancelled.\n * @throws If no session is active or the server returns a non-Good status.\n *\n * @example\n * ```ts\n * // Issue a potentially slow operation and immediately cancel it.\n * const req = client.read([nodeId])\n * const cancelled = await client.cancel(req.requestHandle)\n * console.log(`Cancelled ${cancelled} request(s)`)\n * const results = await req // resolves with BadRequestCancelledByClient\n * ```\n */\n async cancel(requestHandle: number): Promise<number> {\n if (!this.sessionHandler) {\n throw new Error('Not connected: call connect() before cancel()')\n }\n return this.sessionHandler.cancel(requestHandle)\n }\n\n /**\n * Switches the active user identity for the current session by calling ActivateSession\n * with a new identity token (OPC UA Part 4, Section 5.7.3 — Session Client Impersonate\n * conformance unit).\n *\n * The server re-evaluates authorisation under the new identity while keeping all existing\n * Subscriptions and MonitoredItems intact. The new identity is also stored so that any\n * subsequent auto-reconnect or session refresh uses it instead of the original identity.\n *\n * @param identity - The new user identity to apply to the session.\n * @throws {Error} When not connected (call `connect()` first).\n * @throws {Error} When the server rejects the identity (e.g. `BadIdentityTokenRejected`\n * or `BadUserAccessDenied`).\n *\n * @example\n * ```ts\n * await client.connect()\n * // ... work as the original user ...\n * await client.impersonate(UserIdentity.newWithUserName('admin', 'secret'))\n * // ... subsequent calls run under the admin identity ...\n * ```\n */\n async impersonate(identity: UserIdentity): Promise<void> {\n if (!this.session) {\n throw new Error('Not connected: call connect() before impersonate()')\n }\n await this.session.impersonate(identity)\n // Store the new identity so that reconnect / session refresh uses it.\n this.identity = identity\n }\n\n /**\n * Reads the `SelectionListType` metadata for a Variable\n * (OPC UA Part 5, §7.18 — Base Info Client Selection List conformance unit).\n *\n * The client browses the node's `HasProperty` references for `Selections`,\n * `SelectionDescriptions`, and `RestrictToList`, then reads their values in a\n * single batch Read request.\n *\n * Works transparently for instances of `SelectionListType` (ns=0; i=19726) and\n * any of its subtypes, because all subtypes inherit the `Selections` mandatory\n * property.\n *\n * @param nodeId - NodeId of the Variable to inspect.\n * @returns `SelectionList` when the node has a `Selections` property, `null` otherwise.\n * @throws When not connected or if the server returns a non-Good service status.\n *\n * @example\n * ```ts\n * const list = await client.getSelectionList(nodeId)\n * if (list) {\n * list.selectionDescriptions.forEach((desc, i) =>\n * console.log(`[${i}] ${desc.text}:`, list.selections[i])\n * )\n * }\n * ```\n */\n getSelectionList(nodeId: NodeId): Promise<SelectionList | null> {\n return this.withSessionRefresh(() => this.fetchSelectionList(nodeId))\n }\n\n /**\n * Internal implementation of `getSelectionList`. Browses the node's\n * HasProperty references to locate Selections/SelectionDescriptions/RestrictToList,\n * then batch-reads their values.\n */\n private async fetchSelectionList(nodeId: NodeId): Promise<SelectionList | null> {\n if (!this.browseService || !this.attributeService) {\n throw new Error('Not connected: call connect() before getSelectionList()')\n }\n\n // Browse forward HasProperty (i=46) references to find the property nodes.\n // SelectionListType mandates a Selections property; subtypes inherit it.\n const description = new BrowseDescription()\n description.nodeId = nodeId\n description.browseDirection = BrowseDirectionEnum.Forward\n description.referenceTypeId = HAS_PROPERTY_REF_TYPE_ID\n description.includeSubtypes = false\n description.nodeClassMask = 0\n description.resultMask = BrowseResultMaskEnum.All\n\n const browseResults = await this.browseService.browse([description])\n const refs = browseResults[0]?.references ?? []\n\n let selectionsNodeId: NodeId | undefined\n let selectionsDescNodeId: NodeId | undefined\n let restrictToListNodeId: NodeId | undefined\n\n for (const ref of refs) {\n const name = ref.browseName?.name\n if (name === 'Selections') {\n selectionsNodeId = ref.nodeId.nodeId\n } else if (name === 'SelectionDescriptions') {\n selectionsDescNodeId = ref.nodeId.nodeId\n } else if (name === 'RestrictToList') {\n restrictToListNodeId = ref.nodeId.nodeId\n }\n }\n\n // Selections is mandatory on SelectionListType; if absent, this is not a SelectionListType variable.\n if (!selectionsNodeId) {\n return null\n }\n\n // Batch-read all found property nodes in a single request.\n const nodeIdsToRead: NodeId[] = [selectionsNodeId]\n if (selectionsDescNodeId) nodeIdsToRead.push(selectionsDescNodeId)\n if (restrictToListNodeId) nodeIdsToRead.push(restrictToListNodeId)\n\n const readResults = await this.attributeService.ReadValue(nodeIdsToRead)\n\n // Navigate the Variant wrapper: ReadValue returns DataValue.value which is a Variant;\n // the actual property value lives one level deeper in Variant.value.\n const selectionsVariant = readResults[0]?.value as { value?: unknown } | undefined\n const selections: unknown[] = Array.isArray(selectionsVariant?.value)\n ? (selectionsVariant.value as unknown[])\n : []\n\n let selectionDescriptions: LocalizedText[] = []\n let descReadIdx = 1\n if (selectionsDescNodeId) {\n const descVariant = readResults[descReadIdx]?.value as { value?: unknown } | undefined\n if (Array.isArray(descVariant?.value)) {\n selectionDescriptions = descVariant.value as LocalizedText[]\n }\n descReadIdx++\n }\n\n let restrictToList = false\n if (restrictToListNodeId) {\n const rtlVariant = readResults[descReadIdx]?.value as { value?: unknown } | undefined\n if (typeof rtlVariant?.value === 'boolean') {\n restrictToList = rtlVariant.value\n }\n }\n\n return { nodeId, selections, selectionDescriptions, restrictToList }\n }\n\n /**\n * The `requestHandle` value that was assigned to the most recently issued\n * service request in this session.\n *\n * @deprecated Prefer accessing `requestHandle` directly on the promise returned\n * by `read()`, `browse()`, or `callMethod()`, which is available synchronously\n * before `await` and avoids relying on shared module state.\n *\n * Returns `0` before any request has been sent.\n */\n get lastRequestHandle(): number {\n return lastAssignedHandle()\n }\n\n constructor(\n endpointUrl: string,\n private configuration: ConfigurationClient,\n private identity: UserIdentity,\n ) {\n this.endpointUrl = endpointUrl;\n initLoggerProvider(configuration.loggerFactory);\n this.logger = getLogger(\"Client\");\n }\n}\n","import {\n BinaryReader,\n BinaryWriter,\n Configuration,\n Decoder,\n Encoder,\n ILoggerFactory,\n LoggerFactory,\n registerBinaryDecoders,\n registerEncoders,\n registerTypeDecoders\n} from \"opcjs-base\";\n\nimport type { SecurityConfiguration } from '../securityConfiguration.js'\n\nexport class ConfigurationClient extends Configuration {\n /**\n * Optional security restrictions applied during `Client.connect()`.\n * When not set, permissive defaults are used (SecurityPolicy None allowed,\n * all user-token types accepted).\n *\n * @see SecurityConfiguration\n */\n public securityConfiguration?: SecurityConfiguration\n\n /**\n * How long to wait (ms) before attempting a reconnect after a server-shutdown\n * is detected via `ServerStatus/State = Shutdown` or a subscription\n * `StatusChangeNotification` with `BadShutdown` / `BadServerHalted`.\n *\n * Gives the server process time to exit fully before the client tries to\n * re-connect. Defaults to 5 000 ms.\n */\n public shutdownReconnectDelayMs = 5_000\n\n /**\n * Minimum reconnect delay in milliseconds used when\n * `Server/ServerStatus/EstimatedReturnTime` is already in the past (the server\n * should already be available again).\n *\n * Also acts as the lower bound for the ERT-derived delay, ensuring the client\n * always waits at least this long before retrying.\n *\n * Defaults to 1 000 ms.\n */\n public minReconnectDelayMs = 1_000\n public static getSimple(\n name: string,\n company: string,\n loggerFactory?: ILoggerFactory,\n ): ConfigurationClient {\n\n if (!loggerFactory) {\n loggerFactory = new LoggerFactory({\n defaultLevel: 'DEBUG', //todo: use enum\n categoryLevels: {\n \"transport.*\": \"TRACE\",\n \"secureChannel.*\": \"TRACE\",\n },\n });\n }\n const applicationUri = `urn:${company}:${name}`;\n const productUri = `urn:${company}:${name}:product`;\n\n const encoder = new Encoder();\n encoder.registerWriterFactory(\"binary\", () => {\n return new BinaryWriter();\n });\n registerEncoders(encoder);\n\n const decoder = new Decoder();\n decoder.registerReaderFactory(\"binary\", (data: unknown) => {\n return new BinaryReader(data as Uint8Array);\n });\n registerTypeDecoders(decoder);\n registerBinaryDecoders(decoder);\n\n return new ConfigurationClient(\n name,\n applicationUri,\n name,\n productUri,\n encoder,\n decoder,\n loggerFactory,\n );\n }\n\n constructor(\n applicationName: string,\n applicationUri: string,\n productName: string,\n productUri: string,\n encoder: Encoder,\n decoder: Decoder,\n loggerFactory: ILoggerFactory,\n ) {\n super(\n applicationName,\n applicationUri,\n productName,\n productUri,\n encoder,\n decoder,\n loggerFactory,\n );\n }\n}\n","import { IssuedIdentityToken, UserIdentityToken, UserNameIdentityToken, UserTokenTypeEnum } from \"opcjs-base\";\nimport { IssuerConfiguration } from \"./configuration/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","/**\n * Bitmask constants for the `returnDiagnostics` field in the OPC UA RequestHeader\n * (OPC UA Part 4, §7.15 — DiagnosticsMask).\n *\n * Combine values with bitwise OR to request multiple diagnostic fields.\n *\n * @example\n * ```ts\n * import { ReturnDiagnosticsMask, RequestOptions } from 'opcjs-client'\n *\n * const options: RequestOptions = {\n * returnDiagnostics: ReturnDiagnosticsMask.ServiceLevel | ReturnDiagnosticsMask.OperationLevel,\n * }\n * ```\n */\nexport const ReturnDiagnosticsMask = {\n /** All service-level diagnostic fields. */\n ServiceLevel: 0x001f,\n /** All operation-level diagnostic fields. */\n OperationLevel: 0x03e0,\n /** All diagnostic fields (service level + operation level). */\n All: 0x03ff,\n /** Service-level: index to SymbolicId in the server string table. */\n ServiceSymbolicId: 0x0001,\n /** Service-level: index to LocalizedText in the server string table. */\n ServiceLocalizedText: 0x0002,\n /** Service-level: additional info string. */\n ServiceAdditionalInfo: 0x0004,\n /** Service-level: inner status code. */\n ServiceInnerStatusCode: 0x0008,\n /** Service-level: inner diagnostic info. */\n ServiceInnerDiagnostics: 0x0010,\n /** Operation-level: index to SymbolicId in the server string table. */\n OperationSymbolicId: 0x0020,\n /** Operation-level: index to LocalizedText in the server string table. */\n OperationLocalizedText: 0x0040,\n /** Operation-level: additional info string. */\n OperationAdditionalInfo: 0x0080,\n /** Operation-level: inner status code. */\n OperationInnerStatusCode: 0x0100,\n /** Operation-level: inner diagnostic info. */\n OperationInnerDiagnostics: 0x0200,\n} as const\n\n/**\n * Options accepted by all `Client` service calls.\n *\n * Each field is optional; omitting it keeps the existing default behaviour.\n */\nexport type RequestOptions = {\n /**\n * Bitmask specifying which diagnostic fields the server should populate in\n * the `diagnosticInfo` fields of the response (OPC UA Part 4, §7.15).\n *\n * Use {@link ReturnDiagnosticsMask} constants to compose the value:\n * ```ts\n * returnDiagnostics: ReturnDiagnosticsMask.All\n * ```\n *\n * Default: `0` — no diagnostics returned.\n */\n returnDiagnostics?: number\n}\n"]}
package/package.json CHANGED
@@ -1,12 +1,13 @@
1
1
  {
2
2
  "name": "opcjs-client",
3
- "version": "0.1.10",
3
+ "version": "0.1.14",
4
4
  "description": "A client for OPC UA communication.",
5
5
  "repository": {
6
6
  "type": "git",
7
- "url": "https://github.com/slompf18/opcjs.git"
7
+ "url": "git+https://github.com/iarbre/opcjs.git"
8
8
  },
9
9
  "type": "module",
10
+ "sideEffects": false,
10
11
  "main": "./dist/index.js",
11
12
  "module": "./dist/index.js",
12
13
  "types": "./dist/index.d.ts",
@@ -22,11 +23,14 @@
22
23
  "README.md"
23
24
  ],
24
25
  "scripts": {
25
- "lint": "npx eslint .",
26
+ "lint": "eslint .",
26
27
  "verify": "npx tsc --noEmit",
28
+ "verify:test": "npx tsc -p tsconfig.test.json --noEmit",
27
29
  "build": "tsup",
28
30
  "dev": "tsup --watch",
29
- "test": "vitest"
31
+ "unittest": "OPCUA_EXTERNAL_SERVER=1 vitest run --reporter=verbose tests/unit",
32
+ "test": "vitest",
33
+ "prepublish": "npm run lint && npm run verify && npm run verify:test && npm run build && npm run unittest"
30
34
  },
31
35
  "keywords": [
32
36
  "opcua",
@@ -42,8 +46,8 @@
42
46
  "@eslint/js": "^10.0.1",
43
47
  "@types/node": "^22.0.0",
44
48
  "tsup": "^8.3.5",
45
- "typescript": "^5.7.3",
46
- "typescript-eslint": "^8.56.1",
49
+ "typescript": "^6.0.2",
50
+ "typescript-eslint": "^8.58.0",
47
51
  "vitest": "^4.0.18"
48
52
  }
49
53
  }