@tsplc/opcua 0.1.0 → 0.2.1

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 CHANGED
@@ -307,7 +307,8 @@ var buildSchemas = (variables) => {
307
307
  for (const variable of variables) {
308
308
  if (!variable.field)
309
309
  continue;
310
- const name = variable.path.slice(0, -(variable.field.length + 1));
310
+ const separator = variable.field.startsWith("[") ? 0 : 1;
311
+ const name = variable.path.slice(0, -(variable.field.length + separator));
311
312
  const schema = schemas.get(name) ?? { fields: [], root: newBranch() };
312
313
  schemas.set(name, schema);
313
314
  schema.fields.push(variable);
@@ -677,5 +678,5 @@ export {
677
678
  writeVariables
678
679
  };
679
680
 
680
- //# debugId=5B6F261ED0979A6864756E2164756E21
681
+ //# debugId=A788F7E04D2B24ED64756E2164756E21
681
682
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -5,14 +5,14 @@
5
5
  "import \"reflect-metadata\";\n\n// Bun executable bundles can initialize ESM dependencies before CommonJS side effects.\n// Load the provider only after its required metadata polyfill has run.\nconst [client, certificates] = await Promise.all([\n import(\"node-opcua-client\"),\n import(\"node-opcua-certificate-manager\"),\n]);\nexport const {\n AttributeIds,\n DataType,\n VariantArrayType,\n MessageSecurityMode,\n OPCUAClient,\n SecurityPolicy,\n UserTokenType,\n TimestampsToReturn,\n BrowseDirection,\n makeResultMask,\n NodeClass,\n ObjectIds,\n resolveNodeId,\n} = client;\nexport const { OPCUACertificateManager } = certificates;\nexport type DataType = import(\"node-opcua-client\").DataType;\nexport type {\n ClientSession,\n BrowseDescriptionOptions,\n BrowseResult,\n NodeIdLike,\n DataValue,\n ReadValueIdOptions,\n StatusCode,\n WriteValueOptions,\n} from \"node-opcua-client\";\n",
6
6
  "import {\n type BrowseDescriptionOptions,\n BrowseDirection,\n type BrowseResult,\n makeResultMask,\n NodeClass,\n type NodeIdLike,\n ObjectIds,\n resolveNodeId,\n} from \"./native\";\n\ninterface BrowseSession {\n browse: (description: BrowseDescriptionOptions) => Promise<BrowseResult>;\n browseNext: (continuationPoint: Buffer, release: boolean) => Promise<BrowseResult>;\n}\n\nconst MAX_DISCOVERY_DEPTH = 15;\nconst MAX_DISCOVERY_NODES = 10_000;\nasync function* browseReferences(session: BrowseSession, nodeId: string) {\n let result = await session.browse({\n browseDirection: BrowseDirection.Forward,\n includeSubtypes: true,\n nodeId,\n referenceTypeId: \"HierarchicalReferences\",\n resultMask: makeResultMask(\"NodeClass | BrowseName\"),\n });\n\n try {\n while (true) {\n if (!result.statusCode.isGood()) {\n throw new Error(`Browse failed for ${nodeId}: ${result.statusCode.toString()}`);\n }\n yield* result.references ?? [];\n if (!result.continuationPoint?.length) {\n return;\n }\n result = await session.browseNext(result.continuationPoint, false);\n }\n } finally {\n if (result.continuationPoint?.length) {\n await session.browseNext(result.continuationPoint, true);\n }\n }\n}\n\n/**\n * Maps each contract variable path to its OPC UA node id by browsing the\n * address space. CODESYS node ids and namespace indexes can change between PLC\n * downloads, so they are discovered on every connect rather than hardcoded.\n */\nexport const discoverVariables = async (session: BrowseSession, paths: readonly string[]) => {\n const expectedPaths = new Set(paths);\n const roots = [...new Set(paths.map((path) => path.split(\".\")[0]!))];\n const escape = (value: string) => value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const globalListMarker = new RegExp(`\\\\.(?:${roots.map(escape).join(\"|\")})\\\\.`);\n const nodes = new Map<string, string>();\n const visited = new Set<string>();\n\n const queue: { nodeId: NodeIdLike; path: string; depth: number }[] = [\n { nodeId: ObjectIds.ObjectsFolder, path: \"\", depth: 0 },\n ];\n for (let cursor = 0; cursor < queue.length; cursor++) {\n const { nodeId, path, depth } = queue[cursor]!;\n const id = resolveNodeId(nodeId).toString();\n if (visited.has(id)) {\n continue;\n }\n if (depth > MAX_DISCOVERY_DEPTH || visited.size >= MAX_DISCOVERY_NODES) {\n throw new Error(\"OPC UA address space exceeds the discovery limit\");\n }\n visited.add(id);\n\n const references = [];\n for await (const reference of browseReferences(session, id)) references.push(reference);\n const rootScope = references.some((reference) =>\n roots.includes(reference.browseName.name ?? \"\"),\n );\n for (const reference of references) {\n const { name } = reference.browseName;\n if (\n !name ||\n [\"Server\", \"Types\", \"Aliases\"].includes(name) ||\n (rootScope && !roots.includes(name))\n ) {\n continue;\n }\n // Array children can repeat their container name: Cards -> Cards[1].\n const parentName = path.slice(path.lastIndexOf(\".\") + 1);\n const childName = name.startsWith(`${parentName}[`) ? name.slice(parentName.length) : name;\n const childPath = /^\\[\\d+\\]$/.test(childName) ? `${path}${childName}` : `${path}.${name}`;\n const marker = childPath.search(globalListMarker);\n const variablePath = marker < 0 ? \"\" : childPath.slice(marker + 1);\n const childId = reference.nodeId.toString();\n\n if (reference.nodeClass === NodeClass.Variable && expectedPaths.has(variablePath)) {\n const existing = nodes.get(variablePath);\n if (existing && existing !== childId) {\n throw new Error(`Ambiguous OPC UA binding: ${variablePath}`);\n }\n nodes.set(variablePath, childId);\n continue;\n }\n if (reference.nodeClass === NodeClass.Object || reference.nodeClass === NodeClass.Variable) {\n if (\n variablePath &&\n !paths.some(\n (path) => path.startsWith(variablePath + \".\") || path.startsWith(variablePath + \"[\"),\n )\n )\n continue;\n queue.push({ nodeId: childId, path: childPath, depth: depth + 1 });\n }\n }\n }\n return nodes;\n};\n",
7
7
  "/**\n * Reads and writes PLC symbols over an OPC UA session.\n *\n * Every symbol's IEC type comes from the generated contract. Reads turn OPC UA\n * values into `Reading`s and mark anything unexpected as bad quality; writes\n * validate the whole patch before sending, so a bad value never reaches the PLC.\n */\nimport type { Reading, Variable } from \"./types\";\nimport {\n AttributeIds,\n DataType,\n type DataValue,\n type ReadValueIdOptions,\n type StatusCode,\n VariantArrayType,\n type WriteValueOptions,\n} from \"./native\";\n\ninterface ReadSession {\n read: (nodes: Array<ReadValueIdOptions>, maxAge: number) => Promise<Array<DataValue>>;\n}\n\nexport interface VariableSession extends ReadSession {\n write: (nodes: Array<WriteValueOptions>) => Promise<Array<StatusCode>>;\n}\n\n/** Nodes per OPC UA read or write request. */\nconst BATCH_SIZE = 50;\n\n// --- IEC type mapping -------------------------------------------------------\n\nconst isInteger =\n (min: number, max: number) =>\n (value: unknown): value is number =>\n typeof value === \"number\" && Number.isInteger(value) && value >= min && value <= max;\n\n/** The OPC UA type each published scalar arrives as, and the values it accepts. */\nconst scalarTypes: Record<string, { dataType: DataType; accepts: (value: unknown) => boolean }> = {\n BOOL: {\n accepts: (value) => typeof value === \"boolean\",\n dataType: DataType.Boolean,\n },\n BYTE: { accepts: isInteger(0, 255), dataType: DataType.Byte },\n DINT: {\n accepts: isInteger(-2_147_483_648, 2_147_483_647),\n dataType: DataType.Int32,\n },\n DWORD: { accepts: isInteger(0, 4_294_967_295), dataType: DataType.UInt32 },\n INT: { accepts: isInteger(-32_768, 32_767), dataType: DataType.Int16 },\n LREAL: {\n accepts: (value) => typeof value === \"number\" && Number.isFinite(value),\n dataType: DataType.Double,\n },\n REAL: {\n accepts: (value) => typeof value === \"number\" && Number.isFinite(value),\n dataType: DataType.Float,\n },\n SINT: { accepts: isInteger(-128, 127), dataType: DataType.SByte },\n UDINT: { accepts: isInteger(0, 4_294_967_295), dataType: DataType.UInt32 },\n UINT: { accepts: isInteger(0, 65_535), dataType: DataType.UInt16 },\n USINT: { accepts: isInteger(0, 255), dataType: DataType.Byte },\n WORD: { accepts: isInteger(0, 65_535), dataType: DataType.UInt16 },\n};\n\nconst scalarTypeFor = (type: string) => {\n const capacity = /^STRING\\((\\d+)\\)$/.exec(type)?.[1];\n if (capacity === undefined) {\n return scalarTypes[type];\n }\n\n return {\n accepts: (value: unknown) =>\n typeof value === \"string\" &&\n !value.includes(\"\\0\") &&\n Buffer.byteLength(value, \"utf8\") <= Number(capacity),\n dataType: DataType.String,\n };\n};\n\n/** Length of an `ARRAY[0..n] OF BYTE` scanner buffer, or null for any other type. */\nconst byteBufferLength = (type: string) => {\n const match = /^ARRAY\\[0\\.\\.(\\d+)\\] OF BYTE$/.exec(type);\n return match ? Number(match[1]) + 1 : null;\n};\n\nconst byteArrayValue = (value: unknown, length: number): Array<number> | null => {\n const bytes: unknown = value instanceof Uint8Array ? Array.from(value) : value;\n if (!Array.isArray(bytes) || bytes.length !== length) {\n return null;\n }\n return bytes.every(isInteger(0, 255)) ? bytes : null;\n};\n\n// --- Reads ------------------------------------------------------------------\n\nconst badReading = (status: string): Reading => ({\n quality: \"bad\",\n status,\n value: null,\n});\n\nconst toReading = (variable: Variable, data: DataValue): Reading => {\n if (!data.statusCode.isGood()) {\n return badReading(data.statusCode.toString());\n }\n\n const value: unknown = data.value.value;\n const bufferLength = byteBufferLength(variable.type);\n if (bufferLength !== null) {\n const bytes = byteArrayValue(value, bufferLength);\n // CODESYS may publish a byte buffer as Byte[] or as a scalar ByteString.\n const typeMatches =\n (data.value.dataType === DataType.Byte && data.value.arrayType === VariantArrayType.Array) ||\n (data.value.dataType === DataType.ByteString &&\n data.value.arrayType === VariantArrayType.Scalar);\n if (!typeMatches || !bytes) {\n return badReading(\"Unexpected OPC UA byte buffer type or length\");\n }\n return {\n quality: \"good\",\n status: data.statusCode.toString(),\n value: bytes,\n };\n }\n\n const scalar =\n typeof value === \"boolean\" ||\n typeof value === \"string\" ||\n (typeof value === \"number\" && Number.isFinite(value));\n if (\n !scalar ||\n data.value.dataType !== scalarTypeFor(variable.type)?.dataType ||\n data.value.arrayType !== VariantArrayType.Scalar\n ) {\n return badReading(\"Unexpected OPC UA data type\");\n }\n return { quality: \"good\", status: data.statusCode.toString(), value };\n};\n\n/** Reads `selected` in batches; symbols without a published node are reported unavailable. */\nexport const readVariables = async (\n session: ReadSession,\n nodes: ReadonlyMap<string, string>,\n selected: ReadonlyArray<Variable>,\n): Promise<Record<string, Reading>> => {\n const readings: Record<string, Reading> = Object.fromEntries(\n selected.map(({ path }) => [\n path,\n { quality: \"unavailable\", status: \"Symbol not published\", value: null },\n ]),\n );\n const bound = selected.flatMap((variable) => {\n const nodeId = nodes.get(variable.path);\n return nodeId ? [{ nodeId, variable }] : [];\n });\n\n const batches = Array.from({ length: Math.ceil(bound.length / BATCH_SIZE) }, (_, index) =>\n bound.slice(index * BATCH_SIZE, (index + 1) * BATCH_SIZE),\n );\n // Batches go out together so a large read costs about one round trip.\n await Promise.all(\n batches.map(async (batch) => {\n const values = await session.read(\n batch.map(({ nodeId }) => ({ attributeId: AttributeIds.Value, nodeId })),\n 0,\n );\n if (values.length !== batch.length) {\n throw new Error(\"Incomplete OPC UA read response\");\n }\n for (const [index, { variable }] of batch.entries()) {\n const data = values[index];\n if (!data) {\n throw new Error(\"Missing OPC UA value in read response\");\n }\n readings[variable.path] = toReading(variable, data);\n }\n }),\n );\n return readings;\n};\n\n// --- Writes -----------------------------------------------------------------\n\nexport interface WriteResult {\n path: string;\n status: string;\n /** null means the request outcome is unknown after a transport failure. */\n written: boolean | null;\n}\n\n/** Carries every field's outcome so the caller can see what reached the PLC before retrying. */\nexport class VariableWriteError extends Error {\n readonly results: ReadonlyArray<WriteResult>;\n constructor(results: ReadonlyArray<WriteResult>, cause?: unknown) {\n super(\"PLC write did not succeed for every field; inspect results before retrying\", { cause });\n this.name = \"VariableWriteError\";\n this.results = results;\n }\n}\n\nconst notAttempted = (updates: ReadonlyArray<{ variable: Variable }>) =>\n updates.map(({ variable }) => ({\n path: variable.path,\n status: \"Not attempted\",\n written: false,\n }));\n\n/** Validates the value and builds its write request; byte buffers need the node's current representation. */\nconst prepareWrite = (\n session: ReadSession,\n nodes: ReadonlyMap<string, string>,\n { variable, value }: { variable: Variable; value: unknown },\n) => {\n const nodeId = nodes.get(variable.path);\n if (!nodeId) {\n throw new Error(`Symbol not published: ${variable.path}`);\n }\n const invalid = new Error(`Invalid ${variable.type} value for ${variable.path}`);\n\n const bufferLength = byteBufferLength(variable.type);\n if (bufferLength === null) {\n const scalarType = scalarTypeFor(variable.type);\n if (!scalarType?.accepts(value)) {\n throw invalid;\n }\n const request: WriteValueOptions = {\n attributeId: AttributeIds.Value,\n nodeId,\n value: {\n value: {\n arrayType: VariantArrayType.Scalar,\n dataType: scalarType.dataType,\n value,\n },\n },\n };\n return () => Promise.resolve(request);\n }\n\n const bytes = byteArrayValue(value, bufferLength);\n if (!bytes) {\n throw invalid;\n }\n return async (): Promise<WriteValueOptions> => {\n // Write back in whichever representation (Byte[] or ByteString) the node publishes.\n const [current] = await session.read([{ attributeId: AttributeIds.Value, nodeId }], 0);\n if (!current || toReading(variable, current).quality !== \"good\") {\n throw new Error(`Cannot determine byte-buffer representation: ${variable.path}`);\n }\n return {\n attributeId: AttributeIds.Value,\n nodeId,\n value: {\n value: {\n arrayType: current.value.arrayType,\n dataType: current.value.dataType,\n value: Buffer.from(bytes),\n },\n },\n };\n };\n};\n\n/**\n * Writes `updates` in order, stopping at the first batch that does not fully\n * succeed. Throws `VariableWriteError` with each field's outcome.\n */\nexport const writeVariables = async (\n session: VariableSession,\n nodes: ReadonlyMap<string, string>,\n updates: ReadonlyArray<{ variable: Variable; value: unknown }>,\n): Promise<ReadonlyArray<WriteResult>> => {\n // Validate the whole patch and all bindings before sending any writes.\n const prepared = updates.map((update) => prepareWrite(session, nodes, update));\n const requests = await Promise.all(prepared.map((build) => build()));\n\n const results: Array<WriteResult> = [];\n for (let offset = 0; offset < requests.length; offset += BATCH_SIZE) {\n const batch = requests.slice(offset, offset + BATCH_SIZE);\n const batchUpdates = updates.slice(offset, offset + batch.length);\n const remaining = updates.slice(offset + batch.length);\n const statuses = await session.write(batch).catch((cause: unknown) => {\n throw new VariableWriteError(\n [\n ...results,\n ...batchUpdates.map(({ variable }) => ({\n path: variable.path,\n status: \"Unknown write outcome\",\n written: null,\n })),\n ...notAttempted(remaining),\n ],\n cause,\n );\n });\n for (const [index, { variable }] of batchUpdates.entries()) {\n const status = statuses[index];\n results.push({\n path: variable.path,\n status: status?.toString() ?? \"Missing write result\",\n written: status ? status.isGood() : null,\n });\n }\n if (statuses.length !== batch.length || results.some(({ written }) => written !== true)) {\n throw new VariableWriteError([...results, ...notAttempted(remaining)]);\n }\n }\n return results;\n};\n",
8
- "/**\n * Typed access to whole PLC symbols (e.g. `LineIO.Conveyor_Inbound`).\n *\n * `get` reads every field of a symbol and assembles the generated ST shape.\n * `set` takes a partial patch of that shape and writes only the given fields.\n * Each symbol's fields are indexed once, at load, as a tree of structs/arrays.\n */\nimport type { Reading, Variable } from \"./types\";\nimport { readVariables, type VariableSession, writeVariables } from \"./variables\";\n\nexport type VariableName<PlcGlobals> = {\n [G in keyof PlcGlobals & string]: `${G}.${Extract<keyof PlcGlobals[G], string>}`;\n}[keyof PlcGlobals & string];\n\nexport type VariableValue<\n PlcGlobals,\n N extends VariableName<PlcGlobals>,\n> = N extends `${infer G extends keyof PlcGlobals & string}.${infer V}`\n ? V extends keyof PlcGlobals[G]\n ? PlcGlobals[G][V]\n : never\n : never;\n\n/** Struct arrays use zero-based index patches; primitive arrays are replaced whole. */\nexport type VariablePatch<T> =\n T extends Array<infer Item>\n ? Item extends object\n ? { readonly [index: number]: VariablePatch<Item> }\n : ReadonlyArray<Item>\n : T extends object\n ? { [K in keyof T]?: VariablePatch<T[K]> }\n : T;\n\nexport interface VariableBinding {\n nodes: ReadonlyMap<string, string>;\n session: VariableSession;\n}\n\nexport interface VariableConnection {\n getVariableSession: () => VariableBinding;\n}\n\ninterface Branch {\n children: Map<string | number, Node>;\n kind: \"branch\";\n}\ntype Node = Branch | { kind: \"leaf\"; variable: Variable };\n\nconst newBranch = (): Branch => ({ children: new Map(), kind: \"branch\" });\n\n/** Splits `Cards[1].Output.MotionAsserted` into `[\"Cards\", 1, \"Output\", \"MotionAsserted\"]`. */\nconst fieldKeys = (field: string) =>\n (field.match(/[^.[\\]]+|\\[\\d+\\]/g) ?? []).map((part) =>\n part.startsWith(\"[\") ? Number(part.slice(1, -1)) : part,\n );\n\n/**\n * Indexes every contract variable under its symbol (e.g. `LineIO.Conveyor_Inbound`)\n * as a tree of struct fields and array indexes, ending in leaf variables.\n */\nconst buildSchemas = (variables: readonly Variable[]) => {\n const schemas = new Map<string, { root: Branch; fields: Array<Variable> }>();\n for (const variable of variables) {\n // Whole-array globals, such as service channels, are read by path rather than by symbol.\n if (!variable.field) continue;\n const name = variable.path.slice(0, -(variable.field.length + 1));\n const schema = schemas.get(name) ?? { fields: [], root: newBranch() };\n schemas.set(name, schema);\n schema.fields.push(variable);\n\n const keys = fieldKeys(variable.field);\n const leafKey = keys.pop();\n if (leafKey === undefined) {\n throw new Error(`Empty PLC field: ${variable.path}`);\n }\n const parent = keys.reduce<Branch>((branch, key) => {\n const child = branch.children.get(key) ?? newBranch();\n if (child.kind !== \"branch\") {\n throw new Error(`Conflicting PLC field: ${variable.path}`);\n }\n branch.children.set(key, child);\n return child;\n }, schema.root);\n parent.children.set(leafKey, { kind: \"leaf\", variable });\n }\n return schemas;\n};\n\nconst arrayKeys = (branch: Branch) =>\n [...branch.children.keys()]\n .filter((key): key is number => typeof key === \"number\")\n .sort((a, b) => a - b);\n\nconst assemble = (node: Node, readings: Record<string, Reading>): unknown => {\n if (node.kind === \"leaf\") {\n const reading = readings[node.variable.path];\n if (reading?.quality !== \"good\" || reading.value === null) {\n throw new Error(`Cannot read ${node.variable.path}: ${reading?.status ?? \"Missing value\"}`);\n }\n return reading.value;\n }\n const keys = arrayKeys(node);\n if (keys.length) {\n return keys.map((key) => {\n const child = node.children.get(key);\n if (!child) {\n throw new Error(`Missing PLC array element: ${key}`);\n }\n return assemble(child, readings);\n });\n }\n return Object.fromEntries(\n [...node.children].map(([key, child]) => [key, assemble(child, readings)]),\n );\n};\n\nconst collectUpdates = (\n node: Node,\n patch: unknown,\n path: string,\n): Array<{ variable: Variable; value: unknown }> => {\n if (node.kind === \"leaf\") {\n return [{ value: patch, variable: node.variable }];\n }\n if (\n !patch ||\n typeof patch !== \"object\" ||\n (!Array.isArray(patch) &&\n Object.getPrototypeOf(patch) !== Object.prototype &&\n Object.getPrototypeOf(patch) !== null)\n ) {\n throw new Error(`Expected an object patch for ${path}`);\n }\n const keys = arrayKeys(node);\n if (!keys.length && Array.isArray(patch)) {\n throw new Error(`Expected a struct patch for ${path}`);\n }\n return Object.keys(patch).flatMap((key: string) => {\n const value: unknown = Reflect.get(patch, key);\n const index = Number(key);\n const arrayKey =\n keys.length && Number.isInteger(index) && index >= 0 && String(index) === key\n ? keys[index]\n : undefined;\n const child = keys.length ? node.children.get(arrayKey ?? -1) : node.children.get(key);\n if (!child) {\n throw new Error(`Unknown PLC field or array index: ${path}.${key}`);\n }\n return collectUpdates(child, value, `${path}.${key}`);\n });\n};\n\n/** Server-side API using the connection's current session and discovered node IDs. */\nexport const createVariableManager = <PlcGlobals>(\n connection: VariableConnection,\n variables: readonly Variable[],\n) => {\n const schemas = buildSchemas(variables);\n const schemaFor = (name: string) => {\n const schema = schemas.get(name);\n if (!schema) {\n throw new Error(`Unknown PLC variable: ${name}`);\n }\n return schema;\n };\n\n return {\n async get<N extends VariableName<PlcGlobals>>(name: N): Promise<VariableValue<PlcGlobals, N>> {\n const schema = schemaFor(name);\n const binding = connection.getVariableSession();\n const readings = await readVariables(binding.session, binding.nodes, schema.fields);\n if (connection.getVariableSession() !== binding) {\n throw new Error(\"PLC session changed during read\");\n }\n // Every declared leaf is checked before returning the generated ST shape.\n return assemble(schema.root, readings) as VariableValue<PlcGlobals, N>;\n },\n async set<N extends VariableName<PlcGlobals>>(\n name: N,\n patch: VariablePatch<VariableValue<PlcGlobals, NoInfer<N>>>,\n ) {\n const schema = schemaFor(name);\n const updates = collectUpdates(schema.root, patch, name);\n if (!updates.length) {\n throw new Error(`Empty PLC patch: ${name}`);\n }\n const { session, nodes } = connection.getVariableSession();\n return await writeVariables(session, nodes, updates);\n },\n };\n};\n",
8
+ "/**\n * Typed access to whole PLC symbols (e.g. `LineIO.Conveyor_Inbound`).\n *\n * `get` reads every field of a symbol and assembles the generated ST shape.\n * `set` takes a partial patch of that shape and writes only the given fields.\n * Each symbol's fields are indexed once, at load, as a tree of structs/arrays.\n */\nimport type { Reading, Variable } from \"./types\";\nimport { readVariables, type VariableSession, writeVariables } from \"./variables\";\n\nexport type VariableName<PlcGlobals> = {\n [G in keyof PlcGlobals & string]: `${G}.${Extract<keyof PlcGlobals[G], string>}`;\n}[keyof PlcGlobals & string];\n\nexport type VariableValue<\n PlcGlobals,\n N extends VariableName<PlcGlobals>,\n> = N extends `${infer G extends keyof PlcGlobals & string}.${infer V}`\n ? V extends keyof PlcGlobals[G]\n ? PlcGlobals[G][V]\n : never\n : never;\n\n/** Struct arrays use zero-based index patches; primitive arrays are replaced whole. */\nexport type VariablePatch<T> =\n T extends Array<infer Item>\n ? Item extends object\n ? { readonly [index: number]: VariablePatch<Item> }\n : ReadonlyArray<Item>\n : T extends object\n ? { [K in keyof T]?: VariablePatch<T[K]> }\n : T;\n\nexport interface VariableBinding {\n nodes: ReadonlyMap<string, string>;\n session: VariableSession;\n}\n\nexport interface VariableConnection {\n getVariableSession: () => VariableBinding;\n}\n\ninterface Branch {\n children: Map<string | number, Node>;\n kind: \"branch\";\n}\ntype Node = Branch | { kind: \"leaf\"; variable: Variable };\n\nconst newBranch = (): Branch => ({ children: new Map(), kind: \"branch\" });\n\n/** Splits `Cards[1].Output.MotionAsserted` into `[\"Cards\", 1, \"Output\", \"MotionAsserted\"]`. */\nconst fieldKeys = (field: string) =>\n (field.match(/[^.[\\]]+|\\[\\d+\\]/g) ?? []).map((part) =>\n part.startsWith(\"[\") ? Number(part.slice(1, -1)) : part,\n );\n\n/**\n * Indexes every contract variable under its symbol (e.g. `LineIO.Conveyor_Inbound`)\n * as a tree of struct fields and array indexes, ending in leaf variables.\n */\nconst buildSchemas = (variables: readonly Variable[]) => {\n const schemas = new Map<string, { root: Branch; fields: Array<Variable> }>();\n for (const variable of variables) {\n // Whole-array globals, such as service channels, are read by path rather than by symbol.\n if (!variable.field) continue;\n // An array global's fields start at an element, such as `[3].Enabled`, with no separator.\n const separator = variable.field.startsWith(\"[\") ? 0 : 1;\n const name = variable.path.slice(0, -(variable.field.length + separator));\n const schema = schemas.get(name) ?? { fields: [], root: newBranch() };\n schemas.set(name, schema);\n schema.fields.push(variable);\n\n const keys = fieldKeys(variable.field);\n const leafKey = keys.pop();\n if (leafKey === undefined) {\n throw new Error(`Empty PLC field: ${variable.path}`);\n }\n const parent = keys.reduce<Branch>((branch, key) => {\n const child = branch.children.get(key) ?? newBranch();\n if (child.kind !== \"branch\") {\n throw new Error(`Conflicting PLC field: ${variable.path}`);\n }\n branch.children.set(key, child);\n return child;\n }, schema.root);\n parent.children.set(leafKey, { kind: \"leaf\", variable });\n }\n return schemas;\n};\n\nconst arrayKeys = (branch: Branch) =>\n [...branch.children.keys()]\n .filter((key): key is number => typeof key === \"number\")\n .sort((a, b) => a - b);\n\nconst assemble = (node: Node, readings: Record<string, Reading>): unknown => {\n if (node.kind === \"leaf\") {\n const reading = readings[node.variable.path];\n if (reading?.quality !== \"good\" || reading.value === null) {\n throw new Error(`Cannot read ${node.variable.path}: ${reading?.status ?? \"Missing value\"}`);\n }\n return reading.value;\n }\n const keys = arrayKeys(node);\n if (keys.length) {\n return keys.map((key) => {\n const child = node.children.get(key);\n if (!child) {\n throw new Error(`Missing PLC array element: ${key}`);\n }\n return assemble(child, readings);\n });\n }\n return Object.fromEntries(\n [...node.children].map(([key, child]) => [key, assemble(child, readings)]),\n );\n};\n\nconst collectUpdates = (\n node: Node,\n patch: unknown,\n path: string,\n): Array<{ variable: Variable; value: unknown }> => {\n if (node.kind === \"leaf\") {\n return [{ value: patch, variable: node.variable }];\n }\n if (\n !patch ||\n typeof patch !== \"object\" ||\n (!Array.isArray(patch) &&\n Object.getPrototypeOf(patch) !== Object.prototype &&\n Object.getPrototypeOf(patch) !== null)\n ) {\n throw new Error(`Expected an object patch for ${path}`);\n }\n const keys = arrayKeys(node);\n if (!keys.length && Array.isArray(patch)) {\n throw new Error(`Expected a struct patch for ${path}`);\n }\n return Object.keys(patch).flatMap((key: string) => {\n const value: unknown = Reflect.get(patch, key);\n const index = Number(key);\n const arrayKey =\n keys.length && Number.isInteger(index) && index >= 0 && String(index) === key\n ? keys[index]\n : undefined;\n const child = keys.length ? node.children.get(arrayKey ?? -1) : node.children.get(key);\n if (!child) {\n throw new Error(`Unknown PLC field or array index: ${path}.${key}`);\n }\n return collectUpdates(child, value, `${path}.${key}`);\n });\n};\n\n/** Server-side API using the connection's current session and discovered node IDs. */\nexport const createVariableManager = <PlcGlobals>(\n connection: VariableConnection,\n variables: readonly Variable[],\n) => {\n const schemas = buildSchemas(variables);\n const schemaFor = (name: string) => {\n const schema = schemas.get(name);\n if (!schema) {\n throw new Error(`Unknown PLC variable: ${name}`);\n }\n return schema;\n };\n\n return {\n async get<N extends VariableName<PlcGlobals>>(name: N): Promise<VariableValue<PlcGlobals, N>> {\n const schema = schemaFor(name);\n const binding = connection.getVariableSession();\n const readings = await readVariables(binding.session, binding.nodes, schema.fields);\n if (connection.getVariableSession() !== binding) {\n throw new Error(\"PLC session changed during read\");\n }\n // Every declared leaf is checked before returning the generated ST shape.\n return assemble(schema.root, readings) as VariableValue<PlcGlobals, N>;\n },\n async set<N extends VariableName<PlcGlobals>>(\n name: N,\n patch: VariablePatch<VariableValue<PlcGlobals, NoInfer<N>>>,\n ) {\n const schema = schemaFor(name);\n const updates = collectUpdates(schema.root, patch, name);\n if (!updates.length) {\n throw new Error(`Empty PLC patch: ${name}`);\n }\n const { session, nodes } = connection.getVariableSession();\n return await writeVariables(session, nodes, updates);\n },\n };\n};\n",
9
9
  "import { z } from \"zod\";\nexport interface MachineDefinition {\n version: string;\n versionPath: string;\n telemetry: Record<string, { path: string; kind: \"boolean\" | \"number\" | \"string\" }>;\n}\ntype TelemetryValue<Kind> = Kind extends \"boolean\"\n ? boolean\n : Kind extends \"number\"\n ? number\n : string;\nexport type MachineTelemetry<Definition extends MachineDefinition> = {\n [Key in keyof Definition[\"telemetry\"]]: TelemetryValue<Definition[\"telemetry\"][Key][\"kind\"]>;\n};\n\n/** The host supplies its authenticated OPC UA session/read model, once per machine. */\nexport const createMachineClient = <const Definition extends MachineDefinition>(\n definition: Definition,\n options: { read: (paths: readonly string[]) => readonly unknown[] | Promise<readonly unknown[]> },\n) => ({\n telemetry: {\n read: async (): Promise<MachineTelemetry<Definition>> => {\n const fields = Object.entries(definition.telemetry);\n const values = await options.read([\n definition.versionPath,\n ...fields.map(([, field]) => field.path),\n ]);\n if (values.length !== fields.length + 1 || values[0] !== definition.version)\n throw new Error(\"Machine interface version differs from the generated contract.\");\n const snapshot = Object.fromEntries(fields.map(([name], index) => [name, values[index + 1]]));\n return z\n .custom<MachineTelemetry<Definition>>(\n (value) =>\n typeof value === \"object\" &&\n value !== null &&\n fields.every(([name, field]) => {\n const item: unknown = Reflect.get(value, name);\n return (\n typeof item === field.kind &&\n (field.kind !== \"number\" || (typeof item === \"number\" && Number.isFinite(item)))\n );\n }),\n )\n .parse(snapshot);\n },\n },\n});\n",
10
10
  "import { OPCUACertificateManager } from \"./native\";\nimport {\n AttributeIds,\n MessageSecurityMode,\n OPCUAClient,\n SecurityPolicy,\n UserTokenType,\n TimestampsToReturn,\n type ClientSession,\n} from \"./native\";\nimport { discoverVariables } from \"./discovery\";\nimport { createMachineClient, type MachineDefinition, type MachineTelemetry } from \"./machines\";\n\nexport interface ConnectionOptions {\n endpoint: string;\n applicationName?: string;\n certificateDirectory: string;\n credentials?: { username: string; password: string };\n security?: \"Basic256Sha256\" | \"None\";\n}\n\n/** Credentials and the mutable trust store stay in the host environment. */\nexport const connectPlc = async (options: ConnectionOptions) => {\n const secure = options.security !== \"None\";\n const client = OPCUAClient.create({\n applicationName: options.applicationName ?? \"tsPLC\",\n clientCertificateManager: new OPCUACertificateManager({\n rootFolder: options.certificateDirectory,\n automaticallyAcceptUnknownCertificate: false,\n }),\n connectionStrategy: { maxRetry: 0 },\n defaultTransactionTimeout: 5000,\n transportTimeout: 5000,\n keepSessionAlive: true,\n endpointMustExist: false,\n securityMode: secure ? MessageSecurityMode.SignAndEncrypt : MessageSecurityMode.None,\n securityPolicy: secure ? SecurityPolicy.Basic256Sha256 : SecurityPolicy.None,\n });\n try {\n await client.connect(options.endpoint);\n const session = await client.createSession(\n options.credentials\n ? {\n type: UserTokenType.UserName,\n userName: options.credentials.username,\n password: options.credentials.password,\n }\n : { type: UserTokenType.Anonymous },\n );\n return { session, disconnect: () => client.disconnect() };\n } catch (error) {\n await client.disconnect();\n throw error;\n }\n};\n\nexport const connectMachine = async <const Definition extends MachineDefinition>(\n definition: Definition,\n options: ConnectionOptions,\n) => {\n const connection = await connectPlc(options);\n try {\n const paths = [\n definition.versionPath,\n ...Object.values(definition.telemetry).map((field) => field.path),\n ];\n const nodes = await discoverVariables(connection.session, paths);\n const readNodes = paths.map((path) => {\n const nodeId = nodes.get(path);\n if (!nodeId) throw new Error(`Machine symbol is not published: ${path}`);\n return { nodeId, attributeId: AttributeIds.Value };\n });\n const read = async (selected: readonly string[]) => {\n const requests = selected.map((path) => {\n const nodeId = nodes.get(path);\n if (!nodeId) throw new Error(`Unknown machine symbol: ${path}`);\n return { nodeId, attributeId: AttributeIds.Value };\n });\n const values = await connection.session.read(requests, 0);\n if (values.length !== requests.length || values.some((value) => !value.statusCode.isGood()))\n throw new Error(\"Machine telemetry read failed\");\n return values.map((value): unknown => value.value.value);\n };\n const machine = createMachineClient(definition, { read });\n await machine.telemetry.read();\n return {\n telemetry: {\n ...machine.telemetry,\n subscribe: async (\n listener: (value: MachineTelemetry<Definition>) => void,\n onError: (error: unknown) => void,\n ) => {\n const subscription = await connection.session.createSubscription2({\n requestedPublishingInterval: 100,\n requestedLifetimeCount: 100,\n requestedMaxKeepAliveCount: 10,\n maxNotificationsPerPublish: 100,\n publishingEnabled: true,\n priority: 0,\n });\n let disposed = false,\n reading = false;\n const refresh = () => {\n if (disposed || reading) return;\n reading = true;\n void machine.telemetry\n .read()\n .then((value) => {\n if (!disposed) listener(value);\n })\n .catch(onError)\n .finally(() => {\n reading = false;\n });\n };\n try {\n const monitored = await subscription.monitorItems(\n readNodes,\n { samplingInterval: 100, discardOldest: true, queueSize: 1 },\n TimestampsToReturn.Both,\n );\n monitored.on(\"changed\", refresh);\n subscription.on(\"error\", onError);\n refresh();\n return {\n unsubscribe: async () => {\n disposed = true;\n await subscription.terminate();\n },\n };\n } catch (error) {\n await subscription.terminate();\n throw error;\n }\n },\n },\n disconnect: connection.disconnect,\n };\n } catch (error) {\n await connection.disconnect();\n throw error;\n }\n};\nexport type { ClientSession };\n",
11
11
  "import { setTimeout as delay } from \"node:timers/promises\";\nimport { type ClientSession, type ConnectionOptions, connectPlc } from \"./client\";\nimport { contractVariables, type PlcContract } from \"./contract\";\nimport { discoverVariables } from \"./discovery\";\nimport { createMachineClient, type MachineDefinition } from \"./machines\";\nimport { type Snapshot, unavailableSnapshot } from \"./snapshot\";\nimport { createVariableManager, type VariableBinding } from \"./variable-manager\";\nimport { readVariables, writeVariables } from \"./variables\";\n\nexport interface PlcLog {\n info: (message: string) => void;\n warn: (message: string, error: unknown) => void;\n}\n\nexport interface PlcOptions extends ConnectionOptions {\n contract: PlcContract;\n /** Published symbols to poll, such as the generated `publication.production`. */\n publication: readonly string[];\n log?: PlcLog;\n}\n\nconst pollIntervalMs = 1000;\nconst reconnectDelayMs = 2000;\nconst staleAfterMs = 5000;\n\nconst sleep = (ms: number, signal: AbortSignal) =>\n delay(ms, undefined, { signal }).catch(() => undefined);\n\n/**\n * One reconnecting OPC UA session to a tsPLC application. `run` connects,\n * discovers the published symbols and polls them into `snapshot()` until aborted;\n * `get`/`set` read and write whole symbols through the current session.\n */\nexport const createPlc = <Globals>(options: PlcOptions) => {\n const variables = contractVariables(options.contract, options.publication);\n let state = unavailableSnapshot(\"Waiting for the PLC\");\n let binding: (VariableBinding & { session: ClientSession }) | null = null;\n\n const currentBinding = () => {\n if (!binding) throw new Error(\"PLC is not connected\");\n return binding;\n };\n\n /** The latest poll, or unavailable when disconnected or the last read is stale. */\n const snapshot = (): Snapshot =>\n state.updatedAt && Date.now() - Date.parse(state.updatedAt) > staleAfterMs\n ? unavailableSnapshot(\"PLC data is stale; waiting for a fresh read\")\n : state;\n\n const poll = async (signal: AbortSignal) => {\n const client = await connectPlc(options);\n const clear = () => {\n binding = null;\n };\n signal.addEventListener(\"abort\", clear, { once: true });\n try {\n client.session.on(\"session_closed\", clear);\n signal.throwIfAborted();\n const nodes = await discoverVariables(\n client.session,\n variables.map(({ path }) => path),\n );\n if (!nodes.size)\n throw new Error(\n \"No declared PLC symbols are published. Check the downloaded program and OPC UA symbol configuration.\",\n );\n options.log?.info(`Connected to the PLC (${nodes.size} symbols)`);\n signal.throwIfAborted();\n binding = { nodes, session: client.session };\n while (!signal.aborted) {\n const values = await readVariables(client.session, nodes, variables);\n signal.throwIfAborted();\n state = { connected: true, error: null, updatedAt: new Date().toISOString(), values };\n await sleep(pollIntervalMs, signal);\n }\n } finally {\n clear();\n signal.removeEventListener(\"abort\", clear);\n // disconnect also closes active sessions and disposes the certificate manager.\n await client.disconnect();\n }\n };\n\n const run = async (signal: AbortSignal) => {\n while (!signal.aborted) {\n try {\n await poll(signal);\n } catch (error) {\n if (signal.aborted) return;\n const message = error instanceof Error ? error.message : \"OPC UA connection failed\";\n if (state.error !== message)\n options.log?.warn(\"PLC connection unavailable; retrying\", error);\n state = unavailableSnapshot(message);\n }\n await sleep(reconnectDelayMs, signal);\n }\n };\n\n return {\n run,\n snapshot,\n ...createVariableManager<Globals>({ getVariableSession: currentBinding }, variables),\n /** Reads these published paths now instead of from the last poll; fails if the session changes meanwhile. */\n read: async (paths: Iterable<string>) => {\n const selected = new Set(paths);\n const current = currentBinding();\n const readings = await readVariables(\n current.session,\n current.nodes,\n variables.filter(({ path }) => selected.has(path)),\n );\n if (binding !== current) throw new Error(\"PLC session changed during read\");\n return readings;\n },\n /** Writes published variables by path; fails with `VariableWriteError` if any write fails. */\n write: async (values: ReadonlyMap<string, unknown>) => {\n const current = currentBinding();\n const byPath = new Map(variables.map((variable) => [variable.path, variable]));\n return writeVariables(\n current.session,\n current.nodes,\n [...values].map(([path, value]) => {\n const variable = byPath.get(path);\n if (!variable) throw new Error(`Unknown or unpublished PLC variable ${path}`);\n return { variable, value };\n }),\n );\n },\n /** The current session; it changes on every reconnect. */\n session: () => currentBinding().session,\n /** Reads exposed read-only telemetry from the latest poll. */\n machine: <const Definition extends MachineDefinition>(definition: Definition) =>\n createMachineClient(definition, {\n read: (paths) => {\n const { values } = snapshot();\n return paths.map((path) => {\n const reading = values[path];\n if (reading?.quality !== \"good\") throw new Error(`PLC telemetry unavailable: ${path}`);\n return reading.value;\n });\n },\n }),\n };\n};\n\nexport type Plc<Globals> = ReturnType<typeof createPlc<Globals>>;\n",
12
12
  "/** The generated symbol tables from `tsplc typegen` (`symbols` and `typeFields`). */\nexport interface PlcContract {\n symbols: ReadonlyArray<{ name: string; gvl: string; type: string }>;\n typeFields: Readonly<\n Record<string, ReadonlyArray<{ field: string; type: string; description: string }>>\n >;\n}\n\n/** Dotted leaf paths of a record, with `[${number}]` for record arrays. */\nexport type FieldPath<T> = {\n [K in keyof T & string]: T[K] extends ReadonlyArray<infer Item>\n ? Item extends object\n ? `${K}[${number}].${FieldPath<Item>}`\n : K\n : T[K] extends object\n ? `${K}.${FieldPath<T[K]>}`\n : K;\n}[keyof T & string];\n\n/** Every leaf variable of the contract's symbols, optionally only the published symbols. */\nexport const contractVariables = (contract: PlcContract, published?: readonly string[]) => {\n const selected = published && new Set(published);\n return contract.symbols\n .filter((symbol) => !selected || selected.has(`${symbol.gvl}.${symbol.name}`))\n .flatMap((symbol) => {\n const fields = contract.typeFields[symbol.type];\n // An array global, such as a service channel's slots, is read and written whole.\n if (!fields && symbol.type.startsWith(\"ARRAY[\"))\n return [\n {\n description: \"\",\n device: symbol.name,\n field: \"\",\n path: `${symbol.gvl}.${symbol.name}`,\n type: symbol.type,\n },\n ];\n if (!fields) throw new Error(`Missing generated fields for ${symbol.type}.`);\n return fields.map(({ field, type, description }) => ({\n description,\n device: symbol.name,\n field,\n // An array type's fields start at an element, such as `[3].Enabled`.\n path: `${symbol.gvl}.${symbol.name}${field.startsWith(\"[\") ? \"\" : \".\"}${field}`,\n type,\n }));\n });\n};\n",
13
13
  "import type { Reading } from \"./types\";\n\n/** The latest poll of a PLC's published variables, keyed by symbol path. */\nexport interface Snapshot {\n connected: boolean;\n error: string | null;\n updatedAt: string | null;\n values: Record<string, Reading>;\n}\n\nexport const unavailableSnapshot = (error: string): Snapshot => ({\n connected: false,\n error,\n updatedAt: null,\n values: {},\n});\nexport type { Reading };\n"
14
14
  ],
15
- "mappings": "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",
16
- "debugId": "5B6F261ED0979A6864756E2164756E21",
15
+ "mappings": "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",
16
+ "debugId": "A788F7E04D2B24ED64756E2164756E21",
17
17
  "names": []
18
18
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tsplc/opcua",
3
- "version": "0.1.0",
3
+ "version": "0.2.1",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "description": "Typed OPC UA access to a running tsPLC program: published globals by path, machine telemetry and the build contract.",
@@ -63,7 +63,9 @@ const buildSchemas = (variables: readonly Variable[]) => {
63
63
  for (const variable of variables) {
64
64
  // Whole-array globals, such as service channels, are read by path rather than by symbol.
65
65
  if (!variable.field) continue;
66
- const name = variable.path.slice(0, -(variable.field.length + 1));
66
+ // An array global's fields start at an element, such as `[3].Enabled`, with no separator.
67
+ const separator = variable.field.startsWith("[") ? 0 : 1;
68
+ const name = variable.path.slice(0, -(variable.field.length + separator));
67
69
  const schema = schemas.get(name) ?? { fields: [], root: newBranch() };
68
70
  schemas.set(name, schema);
69
71
  schema.fields.push(variable);