@effect-opcua/client 0.1.0-alpha.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.
Files changed (171) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +367 -0
  3. package/dist/Opcua.d.mts +13 -0
  4. package/dist/Opcua.d.mts.map +1 -0
  5. package/dist/Opcua.mjs +23 -0
  6. package/dist/Opcua.mjs.map +1 -0
  7. package/dist/OpcuaClient.d.mts +27 -0
  8. package/dist/OpcuaClient.d.mts.map +1 -0
  9. package/dist/OpcuaClient.mjs +20 -0
  10. package/dist/OpcuaClient.mjs.map +1 -0
  11. package/dist/OpcuaError.d.mts +249 -0
  12. package/dist/OpcuaError.d.mts.map +1 -0
  13. package/dist/OpcuaError.mjs +97 -0
  14. package/dist/OpcuaError.mjs.map +1 -0
  15. package/dist/OpcuaMethod.d.mts +158 -0
  16. package/dist/OpcuaMethod.d.mts.map +1 -0
  17. package/dist/OpcuaMethod.mjs +31 -0
  18. package/dist/OpcuaMethod.mjs.map +1 -0
  19. package/dist/OpcuaSession.d.mts +247 -0
  20. package/dist/OpcuaSession.d.mts.map +1 -0
  21. package/dist/OpcuaSession.mjs +50 -0
  22. package/dist/OpcuaSession.mjs.map +1 -0
  23. package/dist/OpcuaSubscription.d.mts +148 -0
  24. package/dist/OpcuaSubscription.d.mts.map +1 -0
  25. package/dist/OpcuaSubscription.mjs +45 -0
  26. package/dist/OpcuaSubscription.mjs.map +1 -0
  27. package/dist/OpcuaVariable.d.mts +179 -0
  28. package/dist/OpcuaVariable.d.mts.map +1 -0
  29. package/dist/OpcuaVariable.mjs +15 -0
  30. package/dist/OpcuaVariable.mjs.map +1 -0
  31. package/dist/_virtual/rolldown_runtime.mjs +18 -0
  32. package/dist/index.d.mts +8 -0
  33. package/dist/index.mjs +7 -0
  34. package/dist/internal/batch/chunk.d.mts +11 -0
  35. package/dist/internal/batch/chunk.d.mts.map +1 -0
  36. package/dist/internal/batch/chunk.mjs +23 -0
  37. package/dist/internal/batch/chunk.mjs.map +1 -0
  38. package/dist/internal/batch/keyed.d.mts +50 -0
  39. package/dist/internal/batch/keyed.d.mts.map +1 -0
  40. package/dist/internal/batch/keyed.mjs +112 -0
  41. package/dist/internal/batch/keyed.mjs.map +1 -0
  42. package/dist/internal/batch/operations.d.mts +25 -0
  43. package/dist/internal/batch/operations.d.mts.map +1 -0
  44. package/dist/internal/batch/operations.mjs +213 -0
  45. package/dist/internal/batch/operations.mjs.map +1 -0
  46. package/dist/internal/browse/operations.d.mts +15 -0
  47. package/dist/internal/browse/operations.d.mts.map +1 -0
  48. package/dist/internal/browse/operations.mjs +72 -0
  49. package/dist/internal/browse/operations.mjs.map +1 -0
  50. package/dist/internal/client/make.d.mts +16 -0
  51. package/dist/internal/client/make.d.mts.map +1 -0
  52. package/dist/internal/client/make.mjs +76 -0
  53. package/dist/internal/client/make.mjs.map +1 -0
  54. package/dist/internal/common/collections.d.mts +5 -0
  55. package/dist/internal/common/collections.d.mts.map +1 -0
  56. package/dist/internal/common/collections.mjs +10 -0
  57. package/dist/internal/common/collections.mjs.map +1 -0
  58. package/dist/internal/common/constants.d.mts +18 -0
  59. package/dist/internal/common/constants.d.mts.map +1 -0
  60. package/dist/internal/common/constants.mjs +19 -0
  61. package/dist/internal/common/constants.mjs.map +1 -0
  62. package/dist/internal/common/node-id.d.mts +2 -0
  63. package/dist/internal/common/node-id.mjs +1 -0
  64. package/dist/internal/common/options.d.mts +15 -0
  65. package/dist/internal/common/options.d.mts.map +1 -0
  66. package/dist/internal/common/options.mjs +22 -0
  67. package/dist/internal/common/options.mjs.map +1 -0
  68. package/dist/internal/common/predicates.d.mts +8 -0
  69. package/dist/internal/common/predicates.d.mts.map +1 -0
  70. package/dist/internal/common/predicates.mjs +13 -0
  71. package/dist/internal/common/predicates.mjs.map +1 -0
  72. package/dist/internal/data-types/enum.d.mts +2 -0
  73. package/dist/internal/data-types/enum.mjs +3 -0
  74. package/dist/internal/data-types/manager.d.mts +2 -0
  75. package/dist/internal/data-types/manager.mjs +3 -0
  76. package/dist/internal/data-types/model.d.mts +2 -0
  77. package/dist/internal/data-types/model.mjs +1 -0
  78. package/dist/internal/data-types/read.d.mts +14 -0
  79. package/dist/internal/data-types/read.d.mts.map +1 -0
  80. package/dist/internal/data-types/read.mjs +291 -0
  81. package/dist/internal/data-types/read.mjs.map +1 -0
  82. package/dist/internal/data-types/structure.d.mts +2 -0
  83. package/dist/internal/data-types/structure.mjs +3 -0
  84. package/dist/internal/events/model.d.mts +72 -0
  85. package/dist/internal/events/model.d.mts.map +1 -0
  86. package/dist/internal/events/model.mjs +1 -0
  87. package/dist/internal/events/wire.d.mts +37 -0
  88. package/dist/internal/events/wire.d.mts.map +1 -0
  89. package/dist/internal/events/wire.mjs +127 -0
  90. package/dist/internal/events/wire.mjs.map +1 -0
  91. package/dist/internal/metadata/arguments.d.mts +2 -0
  92. package/dist/internal/metadata/arguments.mjs +3 -0
  93. package/dist/internal/metadata/methods.d.mts +2 -0
  94. package/dist/internal/metadata/methods.mjs +3 -0
  95. package/dist/internal/metadata/service.d.mts +23 -0
  96. package/dist/internal/metadata/service.d.mts.map +1 -0
  97. package/dist/internal/metadata/service.mjs +416 -0
  98. package/dist/internal/metadata/service.mjs.map +1 -0
  99. package/dist/internal/metadata/variables.d.mts +3 -0
  100. package/dist/internal/metadata/variables.mjs +3 -0
  101. package/dist/internal/method/arguments.d.mts +48 -0
  102. package/dist/internal/method/arguments.d.mts.map +1 -0
  103. package/dist/internal/method/arguments.mjs +216 -0
  104. package/dist/internal/method/arguments.mjs.map +1 -0
  105. package/dist/internal/method/operations.d.mts +19 -0
  106. package/dist/internal/method/operations.d.mts.map +1 -0
  107. package/dist/internal/method/operations.mjs +111 -0
  108. package/dist/internal/method/operations.mjs.map +1 -0
  109. package/dist/internal/monitoring/options.d.mts +30 -0
  110. package/dist/internal/monitoring/options.d.mts.map +1 -0
  111. package/dist/internal/monitoring/options.mjs +260 -0
  112. package/dist/internal/monitoring/options.mjs.map +1 -0
  113. package/dist/internal/monitoring/requests.d.mts +16 -0
  114. package/dist/internal/monitoring/requests.d.mts.map +1 -0
  115. package/dist/internal/monitoring/requests.mjs +53 -0
  116. package/dist/internal/monitoring/requests.mjs.map +1 -0
  117. package/dist/internal/monitoring/runtime.d.mts +14 -0
  118. package/dist/internal/monitoring/runtime.d.mts.map +1 -0
  119. package/dist/internal/monitoring/runtime.mjs +321 -0
  120. package/dist/internal/monitoring/runtime.mjs.map +1 -0
  121. package/dist/internal/monitoring/samples.d.mts +23 -0
  122. package/dist/internal/monitoring/samples.d.mts.map +1 -0
  123. package/dist/internal/monitoring/samples.mjs +45 -0
  124. package/dist/internal/monitoring/samples.mjs.map +1 -0
  125. package/dist/internal/session/make.d.mts +11 -0
  126. package/dist/internal/session/make.d.mts.map +1 -0
  127. package/dist/internal/session/make.mjs +36 -0
  128. package/dist/internal/session/make.mjs.map +1 -0
  129. package/dist/internal/session/service.d.mts +10 -0
  130. package/dist/internal/session/service.d.mts.map +1 -0
  131. package/dist/internal/session/service.mjs +232 -0
  132. package/dist/internal/session/service.mjs.map +1 -0
  133. package/dist/internal/structures/adapter.d.mts +11 -0
  134. package/dist/internal/structures/adapter.d.mts.map +1 -0
  135. package/dist/internal/structures/adapter.mjs +37 -0
  136. package/dist/internal/structures/adapter.mjs.map +1 -0
  137. package/dist/internal/structures/model.d.mts +21 -0
  138. package/dist/internal/structures/model.d.mts.map +1 -0
  139. package/dist/internal/structures/model.mjs +7 -0
  140. package/dist/internal/structures/model.mjs.map +1 -0
  141. package/dist/internal/structures/runtime.d.mts +28 -0
  142. package/dist/internal/structures/runtime.d.mts.map +1 -0
  143. package/dist/internal/structures/runtime.mjs +119 -0
  144. package/dist/internal/structures/runtime.mjs.map +1 -0
  145. package/dist/internal/subscription/options.d.mts +17 -0
  146. package/dist/internal/subscription/options.d.mts.map +1 -0
  147. package/dist/internal/subscription/options.mjs +51 -0
  148. package/dist/internal/subscription/options.mjs.map +1 -0
  149. package/dist/internal/subscription/runtime.d.mts +15 -0
  150. package/dist/internal/subscription/runtime.d.mts.map +1 -0
  151. package/dist/internal/subscription/runtime.mjs +43 -0
  152. package/dist/internal/subscription/runtime.mjs.map +1 -0
  153. package/dist/internal/values/codec.d.mts +53 -0
  154. package/dist/internal/values/codec.d.mts.map +1 -0
  155. package/dist/internal/values/codec.mjs +117 -0
  156. package/dist/internal/values/codec.mjs.map +1 -0
  157. package/dist/internal/values/normalize.d.mts +33 -0
  158. package/dist/internal/values/normalize.d.mts.map +1 -0
  159. package/dist/internal/values/normalize.mjs +177 -0
  160. package/dist/internal/values/normalize.mjs.map +1 -0
  161. package/dist/internal/values/result.d.mts +16 -0
  162. package/dist/internal/values/result.d.mts.map +1 -0
  163. package/dist/internal/values/result.mjs +15 -0
  164. package/dist/internal/values/result.mjs.map +1 -0
  165. package/dist/internal/variable/operations.d.mts +50 -0
  166. package/dist/internal/variable/operations.d.mts.map +1 -0
  167. package/dist/internal/variable/operations.mjs +192 -0
  168. package/dist/internal/variable/operations.mjs.map +1 -0
  169. package/dist/node-opcua.d.mts +2 -0
  170. package/dist/node-opcua.mjs +3 -0
  171. package/package.json +57 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.mjs","names":["namespaceArrayCache: readonly string[] | undefined","nodes: MetadataService[\"nodes\"]","node: MetadataService[\"node\"]","builtInDataType: MetadataService[\"builtInDataType\"]","variable: MetadataService[\"variable\"]","method: MetadataService[\"method\"]","results: OpcuaNodeMetadataResult[]","result: A[][]","browse: BrowseDescriptionOptions"],"sources":["../../../src/internal/metadata/service.ts"],"sourcesContent":["import {\n AccessLevelFlag,\n AttributeIds,\n BrowseDirection,\n DataType,\n DataTypeIds,\n NodeClass,\n NodeId,\n NodeIdType,\n ReferenceTypeIds,\n StatusCodes,\n coerceNodeId,\n type BrowseDescriptionOptions,\n type ClientSession,\n type DataValue,\n type ReadValueIdOptions,\n} from \"node-opcua\";\nimport { Effect } from \"effect\";\n\nimport type { NodeIdString } from \"../common/node-id.js\";\nimport { Codec } from \"../values/codec.js\";\nimport type {\n OpcuaAccessBits,\n OpcuaMetadataAttribute,\n OpcuaMetadataReadFailure,\n OpcuaNodeMetadata,\n OpcuaNodeMetadataResult,\n} from \"../../OpcuaSession.js\";\nimport {\n configurationError,\n isConfigurationError,\n methodNotExecutableError,\n serviceError,\n OpcuaAccessDeniedError,\n OpcuaConfigurationError,\n OpcuaMethodNotExecutableError,\n OpcuaServiceError,\n} from \"../../OpcuaError.js\";\nimport type {\n AnyMethodDef,\n MethodArg,\n MethodMetadata,\n} from \"../../OpcuaMethod.js\";\nimport {\n methodArgumentMetadataFromRaw,\n readBooleanAttribute,\n resolveMethodMapping,\n} from \"../method/arguments.js\";\nimport { isGood } from \"../values/normalize.js\";\nimport {\n normalizeLocalizedText,\n normalizeQualifiedName,\n normalizeStatusCode,\n} from \"../values/normalize.js\";\nimport type { OpcuaStructureRuntime } from \"../structures/runtime.js\";\nimport {\n accessDeniedError,\n codecMetadata,\n variableAccessCapabilities,\n variableMetadataFromRaw,\n} from \"../variable/operations.js\";\nimport type { AnyVariableDef, VariableMetadata } from \"../../OpcuaVariable.js\";\nexport type {\n OpcuaAccessBits,\n OpcuaMetadataAttribute,\n OpcuaMetadataReadFailure,\n OpcuaNodeMetadata,\n OpcuaNodeMetadataResult,\n} from \"../../OpcuaSession.js\";\n\nexport type MetadataService = {\n readonly namespaceArray: () => Effect.Effect<\n readonly string[],\n OpcuaServiceError | OpcuaConfigurationError\n >;\n readonly node: (\n nodeId: NodeIdString,\n ) => Effect.Effect<\n OpcuaNodeMetadata,\n OpcuaServiceError | OpcuaConfigurationError\n >;\n readonly nodes: (\n nodeIds: readonly NodeIdString[],\n ) => Effect.Effect<\n readonly OpcuaNodeMetadataResult[],\n OpcuaServiceError | OpcuaConfigurationError\n >;\n readonly variable: (\n def: AnyVariableDef,\n ) => Effect.Effect<\n VariableMetadata,\n OpcuaServiceError | OpcuaConfigurationError | OpcuaAccessDeniedError\n >;\n readonly method: (\n def: AnyMethodDef,\n ) => Effect.Effect<\n MethodMetadata,\n OpcuaServiceError | OpcuaConfigurationError | OpcuaMethodNotExecutableError\n >;\n readonly builtInDataType: (\n dataTypeNodeId: NodeId,\n ) => Effect.Effect<DataType, OpcuaServiceError | OpcuaConfigurationError>;\n readonly invalidate: Effect.Effect<void>;\n};\n\ntype MethodBaseMetadata = {\n readonly objectId: NodeIdString;\n readonly methodId: NodeIdString;\n readonly executable: boolean;\n readonly userExecutable?: boolean;\n readonly inputArguments: MethodMetadata[\"inputArguments\"];\n readonly outputArguments: MethodMetadata[\"outputArguments\"];\n};\n\nexport const makeMetadataService = (\n session: ClientSession,\n structureRuntime: OpcuaStructureRuntime,\n): MetadataService => {\n let namespaceArrayCache: readonly string[] | undefined;\n const variableCache = new Map<string, VariableMetadata>();\n const methodCache = new Map<string, MethodBaseMetadata>();\n const builtInDataTypeCache = new Map<string, DataType>();\n\n const namespaceArray = () =>\n Effect.suspend(() => {\n if (namespaceArrayCache !== undefined) {\n return Effect.succeed(namespaceArrayCache);\n }\n return readNamespaceArray(session).pipe(\n Effect.tap((value) =>\n Effect.sync(() => {\n namespaceArrayCache = value;\n }),\n ),\n );\n });\n\n const nodes: MetadataService[\"nodes\"] = (nodeIds) =>\n readManyNodeMetadata(session, namespaceArray, nodeIds);\n\n const node: MetadataService[\"node\"] = (nodeId) =>\n Effect.gen(function* () {\n const [result] = yield* nodes([nodeId]);\n if (!result || result._tag === \"Failure\") {\n return yield* Effect.fail(\n configurationError({\n operation: \"metadata.node\",\n nodeId,\n cause:\n result?._tag === \"Failure\"\n ? result.reason\n : \"No metadata result was returned\",\n }),\n );\n }\n return result.metadata;\n });\n\n const builtInDataType: MetadataService[\"builtInDataType\"] = (\n dataTypeNodeId,\n ) =>\n Effect.suspend(() => {\n const key = dataTypeNodeId.toString();\n const cached = builtInDataTypeCache.get(key);\n if (cached !== undefined) return Effect.succeed(cached);\n return resolveBuiltInDataType(session, dataTypeNodeId).pipe(\n Effect.tap((value) =>\n Effect.sync(() => {\n builtInDataTypeCache.set(key, value);\n }),\n ),\n );\n });\n\n const rawVariableMetadata = (nodeId: NodeIdString) =>\n Effect.suspend(() => {\n const cached = variableCache.get(nodeId);\n if (cached) return Effect.succeed(cached);\n return discoverVariableMetadata(session, nodeId, builtInDataType).pipe(\n Effect.tap((metadata) =>\n Effect.sync(() => {\n variableCache.set(nodeId, metadata);\n }),\n ),\n );\n });\n\n const variable: MetadataService[\"variable\"] = (def) =>\n Effect.gen(function* () {\n const metadata = yield* rawVariableMetadata(def.nodeId);\n for (const capability of variableAccessCapabilities(def.access)) {\n const error = accessDeniedError(\n def.nodeId,\n capability,\n metadata.accessLevel,\n metadata.userAccessLevel,\n );\n if (error) return yield* Effect.fail(error);\n }\n if (Codec.requiresStructureRuntime(def.codec)) {\n yield* structureRuntime.ensureInitialized();\n }\n yield* Codec.validateMetadata(def.codec, codecMetadata(metadata));\n return metadata;\n });\n\n const rawMethodMetadata = (def: AnyMethodDef) =>\n Effect.suspend(() => {\n const key = `${def.objectId}\\u0000${def.methodId}`;\n const cached = methodCache.get(key);\n if (cached) return Effect.succeed(cached);\n return discoverMethodBaseMetadata(session, def, builtInDataType).pipe(\n Effect.tap((metadata) =>\n Effect.sync(() => {\n methodCache.set(key, metadata);\n }),\n ),\n );\n });\n\n const method: MetadataService[\"method\"] = (def) =>\n Effect.gen(function* () {\n const base = yield* rawMethodMetadata(def);\n if (!base.executable || base.userExecutable === false) {\n return yield* Effect.fail(\n methodNotExecutableError({\n objectId: def.objectId,\n methodId: def.methodId,\n executable: base.executable,\n userExecutable: base.userExecutable,\n }),\n );\n }\n if (\n (\n Object.values(def.input ?? {}) as ReadonlyArray<MethodArg<unknown>>\n ).some((arg) => Codec.requiresStructureRuntime(arg.codec)) ||\n (\n Object.values(def.output ?? {}) as ReadonlyArray<MethodArg<unknown>>\n ).some((arg) => Codec.requiresStructureRuntime(arg.codec))\n ) {\n yield* structureRuntime.ensureInitialized();\n }\n const inputMapping = yield* resolveMethodMapping(\n \"method.input\",\n def.methodId,\n base.inputArguments,\n def.input,\n );\n const outputMapping = yield* resolveMethodMapping(\n \"method.output\",\n def.methodId,\n base.outputArguments,\n def.output,\n );\n return {\n ...base,\n inputMapping,\n outputMapping,\n };\n });\n\n const invalidate = Effect.sync(() => {\n namespaceArrayCache = undefined;\n variableCache.clear();\n methodCache.clear();\n builtInDataTypeCache.clear();\n });\n\n return {\n namespaceArray,\n node,\n nodes,\n variable,\n method,\n builtInDataType,\n invalidate,\n };\n};\n\nconst readNamespaceArray = (session: ClientSession) =>\n Effect.gen(function* () {\n const dataValue = yield* Effect.tryPromise({\n try: () =>\n session.read(\n { nodeId: coerceNodeId(\"i=2255\"), attributeId: AttributeIds.Value },\n 0,\n ),\n catch: (cause) =>\n serviceError({\n operation: \"metadata.namespaceArray\",\n nodeId: \"i=2255\",\n cause,\n }),\n });\n if (!isGood(dataValue.statusCode)) {\n return yield* Effect.fail(\n configurationError({\n operation: \"metadata.namespaceArray\",\n nodeId: \"i=2255\",\n cause: normalizeStatusCode(dataValue.statusCode),\n }),\n );\n }\n const value = dataValue.value?.value;\n if (\n !Array.isArray(value) ||\n !value.every((item) => typeof item === \"string\")\n ) {\n return yield* Effect.fail(\n configurationError({\n operation: \"metadata.namespaceArray\",\n nodeId: \"i=2255\",\n cause: \"NamespaceArray value is not a string array\",\n }),\n );\n }\n return [...value];\n });\n\nconst metadataAttributes = [\n [\"NodeClass\", AttributeIds.NodeClass],\n [\"BrowseName\", AttributeIds.BrowseName],\n [\"DisplayName\", AttributeIds.DisplayName],\n [\"Description\", AttributeIds.Description],\n [\"DataType\", AttributeIds.DataType],\n [\"ValueRank\", AttributeIds.ValueRank],\n [\"ArrayDimensions\", AttributeIds.ArrayDimensions],\n [\"AccessLevel\", AttributeIds.AccessLevel],\n [\"UserAccessLevel\", AttributeIds.UserAccessLevel],\n] as const satisfies ReadonlyArray<\n readonly [OpcuaMetadataAttribute, AttributeIds]\n>;\n\nconst maxMetadataNodesPerRead = 50;\n\nconst requiredMetadataAttributes = new Set<OpcuaMetadataAttribute>([\n \"NodeClass\",\n \"BrowseName\",\n]);\n\nconst readManyNodeMetadata = (\n session: ClientSession,\n namespaceArray: MetadataService[\"namespaceArray\"],\n nodeIds: readonly NodeIdString[],\n) =>\n Effect.gen(function* () {\n if (nodeIds.length === 0) return [];\n const namespaceUris = yield* namespaceArray();\n const results: OpcuaNodeMetadataResult[] = [];\n for (const batch of chunks(nodeIds, maxMetadataNodesPerRead)) {\n const batchResults = yield* readNodeMetadataBatch(\n session,\n namespaceUris,\n batch,\n );\n results.push(...batchResults);\n }\n return results;\n });\n\nconst readNodeMetadataBatch = (\n session: ClientSession,\n namespaceUris: readonly string[],\n nodeIds: readonly NodeIdString[],\n) =>\n Effect.gen(function* () {\n const readPlan = nodeIds.map((nodeId) => {\n const parsed = coerceNodeId(nodeId);\n const nodesToRead = metadataAttributes.map(\n ([attribute, attributeId]) =>\n ({\n nodeId: parsed,\n attributeId,\n attribute,\n }) as ReadValueIdOptions & {\n readonly attribute: OpcuaMetadataAttribute;\n },\n );\n return { nodeId, parsed, nodesToRead };\n });\n const flatNodes = readPlan.flatMap((entry) => entry.nodesToRead);\n const values = yield* Effect.tryPromise({\n try: () => session.read(flatNodes, 0),\n catch: (cause) =>\n serviceError({\n operation: \"metadata.nodes\",\n cause,\n }),\n });\n if (values.length !== flatNodes.length) {\n return yield* Effect.fail(\n serviceError({\n operation: \"metadata.nodes\",\n cause: `Expected ${flatNodes.length} DataValues, got ${values.length}`,\n }),\n );\n }\n\n let offset = 0;\n return readPlan.map((entry): OpcuaNodeMetadataResult => {\n const valuesByAttribute = new Map<OpcuaMetadataAttribute, DataValue>();\n for (const [attribute] of metadataAttributes) {\n valuesByAttribute.set(attribute, values[offset++]!);\n }\n const failure = metadataFailure(valuesByAttribute);\n if (failure) {\n return {\n _tag: \"Failure\",\n nodeId: entry.nodeId,\n reason: failure,\n };\n }\n return {\n _tag: \"Success\",\n nodeId: entry.nodeId,\n metadata: nodeMetadataFromValues(\n entry.nodeId,\n entry.parsed.namespace,\n namespaceUris[entry.parsed.namespace],\n valuesByAttribute,\n ),\n };\n });\n });\n\nconst chunks = <A>(items: readonly A[], size: number): readonly A[][] => {\n const result: A[][] = [];\n for (let index = 0; index < items.length; index += size) {\n result.push([...items.slice(index, index + size)]);\n }\n return result;\n};\n\nconst metadataFailure = (\n values: ReadonlyMap<OpcuaMetadataAttribute, DataValue>,\n): OpcuaMetadataReadFailure | undefined => {\n for (const attribute of requiredMetadataAttributes) {\n const value = values.get(attribute);\n if (!value || !isGood(value.statusCode)) {\n return {\n _tag: \"NonGoodStatus\",\n attribute,\n status: normalizeStatusCode(\n value?.statusCode ?? StatusCodes.BadInternalError,\n ),\n };\n }\n }\n if (typeof values.get(\"NodeClass\")?.value?.value !== \"number\") {\n return {\n _tag: \"InvalidValue\",\n attribute: \"NodeClass\",\n message: \"NodeClass value is not numeric\",\n };\n }\n if (!values.get(\"BrowseName\")?.value?.value) {\n return {\n _tag: \"InvalidValue\",\n attribute: \"BrowseName\",\n message: \"BrowseName value is missing\",\n };\n }\n return undefined;\n};\n\nconst nodeMetadataFromValues = (\n nodeId: string,\n namespaceIndex: number,\n namespaceUri: string | undefined,\n values: ReadonlyMap<OpcuaMetadataAttribute, DataValue>,\n): OpcuaNodeMetadata => {\n const browseNameValue = values.get(\"BrowseName\")?.value?.value;\n const displayNameValue = values.get(\"DisplayName\");\n const descriptionValue = values.get(\"Description\");\n const nodeClassNumber = values.get(\"NodeClass\")?.value?.value as number;\n const browseName = normalizeQualifiedName(\n browseNameValue as Parameters<typeof normalizeQualifiedName>[0],\n );\n return {\n nodeId,\n nodeClass: NodeClass[nodeClassNumber] ?? String(nodeClassNumber),\n browseName: browseName.name,\n browseNameNamespaceIndex: browseName.namespaceIndex,\n displayName: localizedText(displayNameValue),\n description: localizedText(descriptionValue),\n dataType: nodeIdValue(values.get(\"DataType\")),\n valueRank: numberValue(values.get(\"ValueRank\")),\n arrayDimensions: numberArrayValue(values.get(\"ArrayDimensions\")),\n accessLevel: accessBits(values.get(\"AccessLevel\")),\n userAccessLevel: accessBits(values.get(\"UserAccessLevel\")),\n namespaceIndex,\n namespaceUri,\n };\n};\n\nconst localizedText = (dataValue: DataValue | undefined) => {\n if (!dataValue || !isGood(dataValue.statusCode) || !dataValue.value?.value) {\n return undefined;\n }\n return normalizeLocalizedText(\n dataValue.value.value as Parameters<typeof normalizeLocalizedText>[0],\n ).text;\n};\n\nconst nodeIdValue = (dataValue: DataValue | undefined) => {\n if (!dataValue || !isGood(dataValue.statusCode)) return undefined;\n const value = dataValue.value?.value;\n return value instanceof NodeId ? value.toString() : undefined;\n};\n\nconst numberValue = (dataValue: DataValue | undefined) => {\n if (!dataValue || !isGood(dataValue.statusCode)) return undefined;\n const value = dataValue.value?.value;\n return typeof value === \"number\" ? value : undefined;\n};\n\nconst numberArrayValue = (dataValue: DataValue | undefined) => {\n if (!dataValue || !isGood(dataValue.statusCode)) return undefined;\n const value = dataValue.value?.value;\n if (\n !Array.isArray(value) ||\n !value.every((item) => typeof item === \"number\")\n ) {\n return undefined;\n }\n return [...value];\n};\n\nconst accessBits = (\n dataValue: DataValue | undefined,\n): OpcuaAccessBits | undefined => {\n const value = numberValue(dataValue);\n if (value === undefined) return undefined;\n return {\n readable: (value & AccessLevelFlag.CurrentRead) !== 0,\n writable: (value & AccessLevelFlag.CurrentWrite) !== 0,\n };\n};\n\nconst discoverVariableMetadata = (\n session: ClientSession,\n nodeId: NodeIdString,\n builtInDataType: MetadataService[\"builtInDataType\"],\n) =>\n Effect.gen(function* () {\n const nodes = [\n AttributeIds.DataType,\n AttributeIds.ValueRank,\n AttributeIds.ArrayDimensions,\n AttributeIds.AccessLevel,\n AttributeIds.UserAccessLevel,\n ].map((attributeId) => ({ nodeId: coerceNodeId(nodeId), attributeId }));\n const [\n dataTypeValue,\n valueRankValue,\n arrayDimensionsValue,\n accessLevelValue,\n userAccessLevelValue,\n ] = yield* Effect.tryPromise({\n try: () => session.read(nodes, 0),\n catch: (cause) =>\n serviceError({\n operation: \"metadata.variable\",\n nodeId,\n cause,\n }),\n });\n if (\n !dataTypeValue ||\n !isGood(dataTypeValue.statusCode) ||\n !(dataTypeValue.value?.value instanceof NodeId)\n ) {\n return yield* Effect.fail(\n configurationError({\n operation: \"metadata.variable\",\n nodeId,\n cause: \"DataType is unreadable\",\n }),\n );\n }\n if (\n !valueRankValue ||\n !isGood(valueRankValue.statusCode) ||\n typeof valueRankValue.value?.value !== \"number\"\n ) {\n return yield* Effect.fail(\n configurationError({\n operation: \"metadata.variable\",\n nodeId,\n cause: \"ValueRank is unreadable\",\n }),\n );\n }\n if (\n !accessLevelValue ||\n !isGood(accessLevelValue.statusCode) ||\n typeof accessLevelValue.value?.value !== \"number\"\n ) {\n return yield* Effect.fail(\n configurationError({\n operation: \"metadata.variable\",\n nodeId,\n cause: \"AccessLevel is unreadable\",\n }),\n );\n }\n const dataTypeNodeId = dataTypeValue.value.value as NodeId;\n const builtIn = yield* builtInDataType(dataTypeNodeId);\n const userAccessLevel =\n userAccessLevelValue &&\n isGood(userAccessLevelValue.statusCode) &&\n typeof userAccessLevelValue.value?.value === \"number\"\n ? (userAccessLevelValue.value.value as number)\n : undefined;\n\n return variableMetadataFromRaw({\n nodeId,\n dataTypeNodeId,\n builtInDataType: builtIn,\n valueRank: valueRankValue.value.value as number,\n arrayDimensions:\n arrayDimensionsValue &&\n isGood(arrayDimensionsValue.statusCode) &&\n Array.isArray(arrayDimensionsValue.value?.value)\n ? arrayDimensionsValue.value.value\n : undefined,\n accessLevel: accessLevelValue.value.value as number,\n userAccessLevel,\n });\n });\n\nconst discoverMethodBaseMetadata = (\n session: ClientSession,\n def: AnyMethodDef,\n builtInDataType: MetadataService[\"builtInDataType\"],\n) =>\n Effect.gen(function* () {\n const methodId = yield* coerceNodeIdOrFail(\n \"metadata.method.methodId\",\n def.methodId,\n );\n const argumentDefinition = yield* Effect.tryPromise({\n try: () => session.getArgumentDefinition(methodId),\n catch: (cause) =>\n serviceError({\n operation: \"metadata.method.getArgumentDefinition\",\n nodeId: def.methodId,\n cause,\n }),\n });\n const [executable, userExecutable] = yield* readExecutableAttributes(\n session,\n def,\n methodId,\n );\n const inputArguments = yield* normalizeArguments(\n def.methodId,\n argumentDefinition.inputArguments ?? [],\n builtInDataType,\n );\n const outputArguments = yield* normalizeArguments(\n def.methodId,\n argumentDefinition.outputArguments ?? [],\n builtInDataType,\n );\n return {\n objectId: def.objectId,\n methodId: def.methodId,\n executable,\n userExecutable,\n inputArguments,\n outputArguments,\n };\n });\n\nconst readExecutableAttributes = (\n session: ClientSession,\n def: AnyMethodDef,\n methodId: NodeId,\n) =>\n Effect.gen(function* () {\n const [executableValue, userExecutableValue] = yield* Effect.tryPromise({\n try: () =>\n session.read(\n [\n { nodeId: methodId, attributeId: AttributeIds.Executable },\n { nodeId: methodId, attributeId: AttributeIds.UserExecutable },\n ],\n 0,\n ),\n catch: (cause) =>\n serviceError({\n operation: \"metadata.method.executable\",\n nodeId: def.methodId,\n cause,\n }),\n });\n const executable = readBooleanAttribute(\n executableValue,\n \"metadata.method.executable\",\n def.methodId,\n true,\n );\n const userExecutable = readBooleanAttribute(\n userExecutableValue,\n \"metadata.method.userExecutable\",\n def.methodId,\n false,\n );\n if (isConfigurationError(executable)) {\n return yield* Effect.fail(executable);\n }\n if (isConfigurationError(userExecutable)) {\n return yield* Effect.fail(userExecutable);\n }\n return [executable as boolean, userExecutable] as const;\n });\n\nconst normalizeArguments = (\n methodNodeId: NodeIdString,\n arguments_: ReadonlyArray<import(\"node-opcua\").Argument>,\n builtInDataType: MetadataService[\"builtInDataType\"],\n) =>\n Effect.forEach(arguments_, (argument) =>\n Effect.gen(function* () {\n const dataTypeNodeId =\n argument.dataType instanceof NodeId\n ? argument.dataType\n : yield* coerceNodeIdOrFail(\n \"metadata.method.argument.dataType\",\n String(argument.dataType),\n );\n const builtIn = yield* builtInDataType(dataTypeNodeId);\n return methodArgumentMetadataFromRaw(argument, dataTypeNodeId, builtIn);\n }),\n ).pipe(\n Effect.mapError((error) =>\n isConfigurationError(error)\n ? configurationError({\n operation: \"metadata.method.argument\",\n nodeId: methodNodeId,\n cause: error.reason.cause,\n })\n : error,\n ),\n );\n\nconst resolveBuiltInDataType = (\n session: ClientSession,\n dataTypeNodeId: NodeId,\n): Effect.Effect<DataType, OpcuaConfigurationError | OpcuaServiceError> =>\n Effect.gen(function* () {\n let current = dataTypeNodeId;\n const visited = new Set<string>();\n while (true) {\n const builtIn = builtInDataTypeFromNodeId(current);\n if (builtIn !== undefined) return builtIn;\n\n const key = current.toString();\n if (visited.has(key)) {\n return yield* Effect.fail(\n configurationError({\n operation: \"metadata.builtInDataType\",\n nodeId: dataTypeNodeId.toString(),\n cause: `DataType hierarchy contains a cycle at ${key}`,\n }),\n );\n }\n visited.add(key);\n\n const superType = yield* browseDataTypeSuperType(session, current);\n if (!superType) {\n return yield* Effect.fail(\n configurationError({\n operation: \"metadata.builtInDataType\",\n nodeId: dataTypeNodeId.toString(),\n cause: `Could not resolve built-in DataType for ${dataTypeNodeId.toString()}`,\n }),\n );\n }\n current = superType;\n }\n });\n\nconst builtInDataTypeFromNodeId = (nodeId: NodeId): DataType | undefined => {\n if (\n nodeId.identifierType === NodeIdType.NUMERIC &&\n nodeId.namespace === 0 &&\n nodeId.value === DataTypeIds.Enumeration\n ) {\n return DataType.Int32;\n }\n if (\n nodeId.identifierType === NodeIdType.NUMERIC &&\n nodeId.namespace === 0 &&\n typeof nodeId.value === \"number\" &&\n nodeId.value <= DataType.DiagnosticInfo &&\n DataType[nodeId.value] !== undefined\n ) {\n return nodeId.value as DataType;\n }\n return undefined;\n};\n\nconst browseDataTypeSuperType = (\n session: ClientSession,\n dataTypeNodeId: NodeId,\n) =>\n Effect.tryPromise({\n try: async () => {\n const browse: BrowseDescriptionOptions = {\n browseDirection: BrowseDirection.Inverse,\n includeSubtypes: false,\n nodeId: dataTypeNodeId,\n referenceTypeId: coerceNodeId(ReferenceTypeIds.HasSubtype),\n resultMask: 1,\n };\n const result = await session.browse(browse);\n if (!isGood(result.statusCode)) {\n throw new Error(result.statusCode.toString());\n }\n const nodeId = result.references?.[0]?.nodeId;\n return nodeId ? coerceNodeId(nodeId) : undefined;\n },\n catch: (cause) =>\n serviceError({\n operation: \"metadata.browseDataTypeSuperType\",\n nodeId: dataTypeNodeId.toString(),\n cause,\n }),\n });\n\nconst coerceNodeIdOrFail = (operation: string, nodeId: unknown) =>\n Effect.try({\n try: () => coerceNodeId(nodeId),\n catch: (cause) =>\n configurationError({ operation, nodeId: String(nodeId), cause }),\n });\n"],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { OpcuaAccessBits, OpcuaMetadataAttribute, OpcuaMetadataReadFailure, OpcuaNodeMetadata, OpcuaNodeMetadataResult } from "../../OpcuaSession.mjs";
2
+ import { MetadataService, makeMetadataService } from "./service.mjs";
3
+ export { type MetadataService, type OpcuaAccessBits, type OpcuaMetadataAttribute, type OpcuaMetadataReadFailure, type OpcuaNodeMetadata, type OpcuaNodeMetadataResult, makeMetadataService };
@@ -0,0 +1,3 @@
1
+ import { makeMetadataService } from "./service.mjs";
2
+
3
+ export { makeMetadataService };
@@ -0,0 +1,48 @@
1
+ import { NodeIdString, OpcuaStatusInfo } from "../../OpcuaVariable.mjs";
2
+ import "../common/node-id.mjs";
3
+ import { OpcuaStructureRuntime } from "../structures/runtime.mjs";
4
+ import { OpcuaConfigurationError, OpcuaMethodInputError, OpcuaServiceError } from "../../OpcuaError.mjs";
5
+ import { AnyMethodDef, InputOfMethodDef, MethodArgRecord, MethodArgumentMapping, MethodArgumentMetadata, MethodCallOptions, MethodMetadata, ResolvedMethod } from "../../OpcuaMethod.mjs";
6
+ import "../batch/operations.mjs";
7
+ import { Argument, CallMethodRequestLike, CallMethodResult, DataType, DataValue, NodeId } from "node-opcua";
8
+ import { Effect } from "effect";
9
+
10
+ //#region src/internal/method/arguments.d.ts
11
+ type MethodPreflight = {
12
+ readonly request: CallMethodRequestLike;
13
+ readonly includeRaw: boolean;
14
+ };
15
+ type MethodInfo = {
16
+ readonly objectId: NodeIdString;
17
+ readonly methodId: NodeIdString;
18
+ readonly metadata: MethodMetadata;
19
+ };
20
+ declare const methodCallOptionsError: (operation: string, objectId: NodeIdString, methodId: NodeIdString, options: MethodCallOptions | undefined) => OpcuaConfigurationError | undefined;
21
+ declare const resolveMethodMapping: (operation: string, nodeId: NodeIdString, arguments_: ReadonlyArray<MethodArgumentMetadata>, fields: MethodArgRecord | undefined) => Effect.Effect<ReadonlyArray<MethodArgumentMapping>, OpcuaConfigurationError>;
22
+ declare const methodArgumentMetadataFromRaw: (argument: Argument, dataTypeNodeId: NodeId, builtInDataType: DataType) => MethodArgumentMetadata;
23
+ declare const readBooleanAttribute: (dataValue: DataValue | undefined, operation: string, nodeId: NodeIdString, required: boolean) => boolean | OpcuaConfigurationError | undefined;
24
+ declare const preflightMethodCall: <const Spec extends AnyMethodDef>(method: ResolvedMethod<Spec>, input: InputOfMethodDef<Spec>, structureRuntime: OpcuaStructureRuntime, options?: MethodCallOptions) => Effect.Effect<MethodPreflight, OpcuaConfigurationError | OpcuaMethodInputError | OpcuaServiceError>;
25
+ declare const outputObjectFromResult: (method: MethodInfo, result: CallMethodResult, structureRuntime: OpcuaStructureRuntime) => Effect.Effect<Record<string, unknown>, {
26
+ argumentName: string;
27
+ argumentIndex: number;
28
+ error: unknown;
29
+ }, never>;
30
+ declare const normalizeInputArgumentResults: (method: MethodInfo, result: CallMethodResult) => {
31
+ key: string;
32
+ index: number;
33
+ argumentName: string;
34
+ status: OpcuaStatusInfo;
35
+ diagnosticInfo: unknown;
36
+ }[] | undefined;
37
+ declare const argumentCodecMetadata: (nodeId: NodeIdString, metadata: MethodArgumentMetadata) => {
38
+ nodeId: string;
39
+ valueRank: number;
40
+ arrayDimensions: readonly number[] | undefined;
41
+ raw: {
42
+ declaredDataType: NodeId;
43
+ builtInDataType: DataType;
44
+ };
45
+ };
46
+ //#endregion
47
+ export { MethodInfo, MethodPreflight, argumentCodecMetadata, methodArgumentMetadataFromRaw, methodCallOptionsError, normalizeInputArgumentResults, outputObjectFromResult, preflightMethodCall, readBooleanAttribute, resolveMethodMapping };
48
+ //# sourceMappingURL=arguments.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arguments.d.mts","names":[],"sources":["../../../src/internal/method/arguments.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;KAyCY,eAAA;oBACQ;;AADpB,CAAA;AAKY,KAAA,UAAA,GAAU;EACD,SAAA,QAAA,EAAA,YAAA;EACA,SAAA,QAAA,EAAA,YAAA;EACA,SAAA,QAAA,EAAA,cAAA;CAAc;AAGtB,cAAA,sBAqCZ,EAAA,CAAA,SAAA,EAAA,MAAA,EAAA,QAAA,EAnCW,YAmCX,EAAA,QAAA,EAlCW,YAkCX,EAAA,OAAA,EAjCU,iBAiCV,GAAA,SAAA,EAAA,GAjCuC,uBAiCvC,GAAA,SAAA;AAnCW,cAqCC,oBArCD,EAAA,CAAA,SAAA,EAAA,MAAA,EAAA,MAAA,EAuCF,YAvCE,EAAA,UAAA,EAwCE,aAxCF,CAwCgB,sBAxChB,CAAA,EAAA,MAAA,EAyCF,eAzCE,GAAA,SAAA,EAAA,GA0CT,MAAA,CAAO,MA1CE,CA2CV,aA3CU,CA2CI,qBA3CJ,CAAA,EA4CV,uBA5CU,CAAA;AACA,cA4EC,6BA5ED,EAAA,CAAA,QAAA,EA6EA,QA7EA,EAAA,cAAA,EA8EM,MA9EN,EAAA,eAAA,EA+EO,QA/EP,EAAA,GAgFT,sBAhFS;AACD,cA+FE,oBA/FF,EAAA,CAAA,SAAA,EAgGE,SAhGF,GAAA,SAAA,EAAA,SAAA,EAAA,MAAA,EAAA,MAAA,EAkGD,YAlGC,EAAA,QAAA,EAAA,OAAA,EAAA,GAAA,OAAA,GAmGQ,uBAnGR,GAAA,SAAA;AAA6B,cAoH3B,mBApH2B,EAAA,CAAA,mBAoHe,YApHf,CAAA,CAAA,MAAA,EAqH9B,cArH8B,CAqHf,IArHe,CAAA,EAAA,KAAA,EAsH/B,gBAtH+B,CAsHd,IAtHc,CAAA,EAAA,gBAAA,EAuHpB,qBAvHoB,EAAA,OAAA,CAAA,EAwH5B,iBAxH4B,EAAA,GAyHrC,MAAA,CAAO,MAzH8B,CA0HtC,eA1HsC,EA2HtC,uBA3HsC,GA2HZ,qBA3HY,GA2HY,iBA3HZ,CAAA;AAAA,cAiM3B,sBAjM2B,EAAA,CAAA,MAAA,EAkM9B,UAlM8B,EAAA,MAAA,EAmM9B,gBAnM8B,EAAA,gBAAA,EAoMpB,qBApMoB,EAAA,GAoMC,MAAA,CAAA,MApMD,CAoMC,MApMD,CAAA,MAAA,EAAA,OAAA,CAAA,EAAA;EAmC3B,YAAA,EAAA,MAAA;EAEH,aAAA,EAAA,MAAA;EACkB,KAAA,EAAA,OAAA;CAAd,EAAA,KAAA,CAAA;AACJ,cAqLG,6BArLH,EAAA,CAAA,MAAA,EAsLA,UAtLA,EAAA,MAAA,EAuLA,gBAvLA,EAAA,GAAA;EAEM,GAAA,EAAA,MAAA;EAAd,KAAA,EAAA,MAAA;EACA,YAAA,EAAA,MAAA;EAFC,MAAO,EAsLgB,eAtLhB;EAAM,cAAA,EAAA,OAAA;AAmChB,CAAA,EAAA,GAAa,SAAA;AACD,cA0KC,qBA1KD,EAAA,CAAA,MAAA,EA2KF,YA3KE,EAAA,QAAA,EA4KA,sBA5KA,EAAA,GAAA;EACM,MAAA,EAAA,MAAA;EACC,SAAA,EAAA,MAAA;EAChB,eAAA,EAAA,SAAA,MAAA,EAAA,GAAA,SAAA;EAcD,GAAA,EAAA;IAEW,gBAAA,QAmBZ;IAlBY,eAAA,UAAA;EAEH,CAAA;CACS"}
@@ -0,0 +1,216 @@
1
+ import { isPlainRecord, isRecord } from "../common/predicates.mjs";
2
+ import { isGood, normalizeLocalizedText, normalizeNodeId, normalizeStatusCode } from "../values/normalize.mjs";
3
+ import { configurationError, isConfigurationError, methodInputError } from "../../OpcuaError.mjs";
4
+ import { Codec } from "../values/codec.mjs";
5
+ import { DataType } from "node-opcua";
6
+ import { Effect } from "effect";
7
+
8
+ //#region src/internal/method/arguments.ts
9
+ const methodCallOptionsError = (operation, objectId, methodId, options) => {
10
+ if (options === void 0) return void 0;
11
+ if (!isPlainRecord(options)) return configurationError({
12
+ operation,
13
+ objectId,
14
+ methodId,
15
+ cause: "options must be an object"
16
+ });
17
+ const unknown = Object.keys(options).filter((key) => key !== "includeRaw");
18
+ if (unknown.length > 0) return configurationError({
19
+ operation,
20
+ objectId,
21
+ methodId,
22
+ cause: `unsupported option: ${unknown.join(", ")}`
23
+ });
24
+ if ("includeRaw" in options && options.includeRaw !== void 0 && typeof options.includeRaw !== "boolean") return configurationError({
25
+ operation,
26
+ objectId,
27
+ methodId,
28
+ cause: "includeRaw must be a boolean"
29
+ });
30
+ };
31
+ const resolveMethodMapping = (operation, nodeId, arguments_, fields) => Effect.gen(function* () {
32
+ const mapping = fields ? explicitMapping(operation, nodeId, arguments_, fields) : emptyMapping(operation, nodeId, arguments_);
33
+ if (isConfigurationError(mapping)) return yield* Effect.fail(configurationError({
34
+ operation,
35
+ nodeId,
36
+ cause: mapping.reason.cause
37
+ }));
38
+ for (const entry of mapping) {
39
+ const argument = arguments_[entry.index];
40
+ yield* Codec.validateMetadata(entry.arg.codec, argumentCodecMetadata(nodeId, argument)).pipe(Effect.mapError((cause) => configurationError({
41
+ operation,
42
+ nodeId,
43
+ cause: {
44
+ argumentName: argument.name,
45
+ argumentIndex: entry.index,
46
+ cause
47
+ }
48
+ })));
49
+ }
50
+ return mapping;
51
+ });
52
+ const methodArgumentMetadataFromRaw = (argument, dataTypeNodeId, builtInDataType) => ({
53
+ name: argument.name ?? "",
54
+ description: argument.description ? normalizeLocalizedText(argument.description) : void 0,
55
+ declaredDataType: normalizeNodeId(dataTypeNodeId),
56
+ builtInDataType: DataType[builtInDataType] ?? String(builtInDataType),
57
+ valueRank: argument.valueRank ?? -1,
58
+ arrayDimensions: argument.arrayDimensions ?? void 0,
59
+ unsafeRaw: {
60
+ argument,
61
+ declaredDataType: dataTypeNodeId,
62
+ builtInDataType
63
+ }
64
+ });
65
+ const readBooleanAttribute = (dataValue, operation, nodeId, required) => {
66
+ if (dataValue && isGood(dataValue.statusCode) && typeof dataValue.value?.value === "boolean") return dataValue.value.value;
67
+ if (!required) return void 0;
68
+ return configurationError({
69
+ operation,
70
+ nodeId,
71
+ cause: "method boolean attribute is unreadable"
72
+ });
73
+ };
74
+ const preflightMethodCall = (method, input, structureRuntime, options) => Effect.gen(function* () {
75
+ const optionsError = methodCallOptionsError("method.call.options", method.objectId, method.methodId, options);
76
+ if (optionsError) return yield* Effect.fail(optionsError);
77
+ if (method.metadata.inputMapping.some((mapping) => Codec.requiresStructureRuntime(mapping.arg.codec)) || method.metadata.outputMapping.some((mapping) => Codec.requiresStructureRuntime(mapping.arg.codec))) yield* structureRuntime.ensureInitialized();
78
+ const inputRecord = objectRecord(input);
79
+ if (!inputRecord) return yield* Effect.fail(methodInputError({
80
+ objectId: method.objectId,
81
+ methodId: method.methodId,
82
+ input,
83
+ phase: "ArgumentMapping",
84
+ cause: "input must be an object"
85
+ }));
86
+ const keyError = validateInputKeys(method, inputRecord, input);
87
+ if (keyError) return yield* Effect.fail(keyError);
88
+ const inputArguments = [];
89
+ for (const mapping of method.metadata.inputMapping) {
90
+ const argument = method.metadata.inputArguments[mapping.index];
91
+ const rawValue = inputRecord[mapping.key];
92
+ const variant = yield* Codec.encode(mapping.arg.codec, rawValue, argumentCodecMetadata(method.methodId, argument), structureRuntime).pipe(Effect.mapError((error) => methodInputError({
93
+ objectId: method.objectId,
94
+ methodId: method.methodId,
95
+ input,
96
+ phase: "Encoding",
97
+ argumentKey: mapping.key,
98
+ argumentIndex: mapping.index,
99
+ error
100
+ })));
101
+ inputArguments[mapping.index] = variant;
102
+ }
103
+ return {
104
+ request: {
105
+ objectId: method.unsafeRaw.objectId,
106
+ methodId: method.unsafeRaw.methodId,
107
+ inputArguments
108
+ },
109
+ includeRaw: options?.includeRaw ?? method.def.includeRaw ?? false
110
+ };
111
+ });
112
+ const outputObjectFromResult = (method, result, structureRuntime) => Effect.gen(function* () {
113
+ const output = {};
114
+ const outputArguments = result.outputArguments ?? [];
115
+ for (const mapping of method.metadata.outputMapping) {
116
+ const argument = method.metadata.outputArguments[mapping.index];
117
+ const variant = outputArguments[mapping.index];
118
+ output[mapping.key] = yield* Codec.decode(mapping.arg.codec, variant, void 0, structureRuntime).pipe(Effect.mapError((error) => ({
119
+ argumentName: argument.name,
120
+ argumentIndex: mapping.index,
121
+ error
122
+ })));
123
+ }
124
+ return output;
125
+ });
126
+ const normalizeInputArgumentResults = (method, result) => {
127
+ const statuses = result.inputArgumentResults;
128
+ if (!statuses || statuses.length === 0) return void 0;
129
+ const diagnostics = result.inputArgumentDiagnosticInfos;
130
+ return statuses.map((statusCode, index) => {
131
+ const mapping = method.metadata.inputMapping.find((candidate) => candidate.index === index);
132
+ return {
133
+ key: mapping?.key ?? String(index),
134
+ index,
135
+ argumentName: mapping?.argumentName ?? method.metadata.inputArguments[index]?.name ?? "",
136
+ status: normalizeStatusCode(statusCode),
137
+ diagnosticInfo: diagnostics?.[index]
138
+ };
139
+ });
140
+ };
141
+ const argumentCodecMetadata = (nodeId, metadata) => ({
142
+ nodeId,
143
+ valueRank: metadata.valueRank,
144
+ arrayDimensions: metadata.arrayDimensions,
145
+ raw: {
146
+ declaredDataType: metadata.unsafeRaw.declaredDataType,
147
+ builtInDataType: metadata.unsafeRaw.builtInDataType
148
+ }
149
+ });
150
+ const emptyMapping = (operation, nodeId, arguments_) => arguments_.length === 0 ? [] : configurationError({
151
+ operation,
152
+ nodeId,
153
+ cause: "Method arguments must be declared explicitly in v1"
154
+ });
155
+ const explicitMapping = (_operation, _nodeId, arguments_, fields) => {
156
+ const usedIndexes = /* @__PURE__ */ new Set();
157
+ const mapping = [];
158
+ for (const [key, arg] of Object.entries(fields)) {
159
+ const selector = arg.selector ?? {
160
+ _tag: "Name",
161
+ name: key
162
+ };
163
+ const matches = selector._tag === "Index" ? [selector.index] : arguments_.map((argument, index$1) => argument.name === selector.name ? index$1 : void 0).filter((index$1) => index$1 !== void 0);
164
+ const index = matches[0] ?? -1;
165
+ if (!Number.isInteger(index) || index < 0 || index >= arguments_.length) return configurationError({
166
+ operation: "method.argumentMap",
167
+ cause: `Argument selector for ${key} did not resolve`
168
+ });
169
+ if (matches.length !== 1) return configurationError({
170
+ operation: "method.argumentMap",
171
+ cause: `Argument selector for ${key} did not resolve exactly once`
172
+ });
173
+ if (usedIndexes.has(index)) return configurationError({
174
+ operation: "method.argumentMap",
175
+ cause: "Two public keys target the same argument"
176
+ });
177
+ usedIndexes.add(index);
178
+ mapping.push({
179
+ key,
180
+ index,
181
+ argumentName: arguments_[index].name,
182
+ arg
183
+ });
184
+ }
185
+ if (usedIndexes.size !== arguments_.length) return configurationError({
186
+ operation: "method.argumentMap",
187
+ cause: "Method arguments must cover every OPC UA argument"
188
+ });
189
+ return mapping;
190
+ };
191
+ const validateInputKeys = (method, inputRecord, input) => {
192
+ const expected = new Set(method.metadata.inputMapping.map((mapping) => mapping.key));
193
+ for (const key of expected) if (!(key in inputRecord)) {
194
+ const mapping = method.metadata.inputMapping.find((m) => m.key === key);
195
+ return methodInputError({
196
+ objectId: method.objectId,
197
+ methodId: method.methodId,
198
+ input,
199
+ phase: "MissingInputKey",
200
+ argumentKey: key,
201
+ argumentIndex: mapping?.index
202
+ });
203
+ }
204
+ for (const key of Object.keys(inputRecord)) if (!expected.has(key)) return methodInputError({
205
+ objectId: method.objectId,
206
+ methodId: method.methodId,
207
+ input,
208
+ phase: "UnknownInputKey",
209
+ argumentKey: key
210
+ });
211
+ };
212
+ const objectRecord = (value) => isRecord(value) ? value : void 0;
213
+
214
+ //#endregion
215
+ export { argumentCodecMetadata, methodArgumentMetadataFromRaw, methodCallOptionsError, normalizeInputArgumentResults, outputObjectFromResult, preflightMethodCall, readBooleanAttribute, resolveMethodMapping };
216
+ //# sourceMappingURL=arguments.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arguments.mjs","names":["inputArguments: Array<Variant>","output: Record<string, unknown>","mapping: Array<MethodArgumentMapping>","index"],"sources":["../../../src/internal/method/arguments.ts"],"sourcesContent":["import {\n DataType,\n type Argument,\n type CallMethodRequestLike,\n type CallMethodResult,\n type DataValue,\n type NodeId,\n type StatusCode,\n type Variant,\n} from \"node-opcua\";\nimport { Effect } from \"effect\";\n\nimport {\n configurationError,\n isConfigurationError,\n methodInputError,\n type OpcuaConfigurationError,\n type OpcuaMethodInputError,\n type OpcuaServiceError,\n} from \"../../OpcuaError.js\";\nimport type { NodeIdString } from \"../common/node-id.js\";\nimport { isPlainRecord, isRecord } from \"../common/predicates.js\";\nimport { Codec } from \"../values/codec.js\";\nimport {\n isGood,\n normalizeLocalizedText,\n normalizeNodeId,\n normalizeStatusCode,\n} from \"../values/normalize.js\";\nimport type { OpcuaStructureRuntime } from \"../structures/runtime.js\";\nimport type { MethodCallOptions } from \"../batch/operations.js\";\nimport type {\n AnyMethodDef,\n InputOfMethodDef,\n MethodArgRecord,\n MethodArgumentMapping,\n MethodArgumentMetadata,\n MethodMetadata,\n ResolvedMethod,\n} from \"../../OpcuaMethod.js\";\n\nexport type MethodPreflight = {\n readonly request: CallMethodRequestLike;\n readonly includeRaw: boolean;\n};\n\nexport type MethodInfo = {\n readonly objectId: NodeIdString;\n readonly methodId: NodeIdString;\n readonly metadata: MethodMetadata;\n};\n\nexport const methodCallOptionsError = (\n operation: string,\n objectId: NodeIdString,\n methodId: NodeIdString,\n options: MethodCallOptions | undefined,\n) => {\n if (options === undefined) return undefined;\n if (!isPlainRecord(options)) {\n return configurationError({\n operation,\n objectId,\n methodId,\n cause: \"options must be an object\",\n });\n }\n const unknown = Object.keys(options).filter((key) => key !== \"includeRaw\");\n if (unknown.length > 0) {\n return configurationError({\n operation,\n objectId,\n methodId,\n cause: `unsupported option: ${unknown.join(\", \")}`,\n });\n }\n if (\n \"includeRaw\" in options &&\n options.includeRaw !== undefined &&\n typeof options.includeRaw !== \"boolean\"\n ) {\n return configurationError({\n operation,\n objectId,\n methodId,\n cause: \"includeRaw must be a boolean\",\n });\n }\n return undefined;\n};\n\nexport const resolveMethodMapping = (\n operation: string,\n nodeId: NodeIdString,\n arguments_: ReadonlyArray<MethodArgumentMetadata>,\n fields: MethodArgRecord | undefined,\n): Effect.Effect<\n ReadonlyArray<MethodArgumentMapping>,\n OpcuaConfigurationError\n> =>\n Effect.gen(function* () {\n const mapping = fields\n ? explicitMapping(operation, nodeId, arguments_, fields)\n : emptyMapping(operation, nodeId, arguments_);\n if (isConfigurationError(mapping)) {\n return yield* Effect.fail(\n configurationError({ operation, nodeId, cause: mapping.reason.cause }),\n );\n }\n for (const entry of mapping) {\n const argument = arguments_[entry.index]!;\n yield* Codec.validateMetadata(\n entry.arg.codec,\n argumentCodecMetadata(nodeId, argument),\n ).pipe(\n Effect.mapError((cause) =>\n configurationError({\n operation,\n nodeId,\n cause: {\n argumentName: argument.name,\n argumentIndex: entry.index,\n cause,\n },\n }),\n ),\n );\n }\n return mapping;\n });\n\nexport const methodArgumentMetadataFromRaw = (\n argument: Argument,\n dataTypeNodeId: NodeId,\n builtInDataType: DataType,\n): MethodArgumentMetadata => ({\n name: argument.name ?? \"\",\n description: argument.description\n ? normalizeLocalizedText(argument.description)\n : undefined,\n declaredDataType: normalizeNodeId(dataTypeNodeId),\n builtInDataType: DataType[builtInDataType] ?? String(builtInDataType),\n valueRank: argument.valueRank ?? -1,\n arrayDimensions: argument.arrayDimensions ?? undefined,\n unsafeRaw: {\n argument,\n declaredDataType: dataTypeNodeId,\n builtInDataType,\n },\n});\n\nexport const readBooleanAttribute = (\n dataValue: DataValue | undefined,\n operation: string,\n nodeId: NodeIdString,\n required: boolean,\n) => {\n if (\n dataValue &&\n isGood(dataValue.statusCode) &&\n typeof dataValue.value?.value === \"boolean\"\n ) {\n return dataValue.value.value as boolean;\n }\n if (!required) return undefined;\n return configurationError({\n operation,\n nodeId,\n cause: \"method boolean attribute is unreadable\",\n });\n};\n\nexport const preflightMethodCall = <const Spec extends AnyMethodDef>(\n method: ResolvedMethod<Spec>,\n input: InputOfMethodDef<Spec>,\n structureRuntime: OpcuaStructureRuntime,\n options?: MethodCallOptions,\n): Effect.Effect<\n MethodPreflight,\n OpcuaConfigurationError | OpcuaMethodInputError | OpcuaServiceError\n> =>\n Effect.gen(function* () {\n const optionsError = methodCallOptionsError(\n \"method.call.options\",\n method.objectId,\n method.methodId,\n options,\n );\n if (optionsError) return yield* Effect.fail(optionsError);\n if (\n method.metadata.inputMapping.some((mapping) =>\n Codec.requiresStructureRuntime(mapping.arg.codec),\n ) ||\n method.metadata.outputMapping.some((mapping) =>\n Codec.requiresStructureRuntime(mapping.arg.codec),\n )\n ) {\n yield* structureRuntime.ensureInitialized();\n }\n const inputRecord = objectRecord(input);\n if (!inputRecord) {\n return yield* Effect.fail(\n methodInputError({\n objectId: method.objectId,\n methodId: method.methodId,\n input,\n phase: \"ArgumentMapping\",\n cause: \"input must be an object\",\n }),\n );\n }\n const keyError = validateInputKeys(method, inputRecord, input);\n if (keyError) return yield* Effect.fail(keyError);\n\n const inputArguments: Array<Variant> = [];\n for (const mapping of method.metadata.inputMapping) {\n const argument = method.metadata.inputArguments[mapping.index]!;\n const rawValue = inputRecord[mapping.key];\n const variant = yield* Codec.encode(\n mapping.arg.codec,\n rawValue,\n argumentCodecMetadata(method.methodId, argument),\n structureRuntime,\n ).pipe(\n Effect.mapError((error) =>\n methodInputError({\n objectId: method.objectId,\n methodId: method.methodId,\n input,\n phase: \"Encoding\",\n argumentKey: mapping.key,\n argumentIndex: mapping.index,\n error,\n }),\n ),\n );\n inputArguments[mapping.index] = variant;\n }\n\n return {\n request: {\n objectId: method.unsafeRaw.objectId,\n methodId: method.unsafeRaw.methodId,\n inputArguments,\n },\n includeRaw: options?.includeRaw ?? method.def.includeRaw ?? false,\n };\n });\n\nexport const outputObjectFromResult = (\n method: MethodInfo,\n result: CallMethodResult,\n structureRuntime: OpcuaStructureRuntime,\n) =>\n Effect.gen(function* () {\n const output: Record<string, unknown> = {};\n const outputArguments = result.outputArguments ?? [];\n for (const mapping of method.metadata.outputMapping) {\n const argument = method.metadata.outputArguments[mapping.index]!;\n const variant = outputArguments[mapping.index];\n output[mapping.key] = yield* Codec.decode(\n mapping.arg.codec,\n variant,\n undefined,\n structureRuntime,\n ).pipe(\n Effect.mapError((error) => ({\n argumentName: argument.name,\n argumentIndex: mapping.index,\n error,\n })),\n );\n }\n return output;\n });\n\nexport const normalizeInputArgumentResults = (\n method: MethodInfo,\n result: CallMethodResult,\n) => {\n const statuses = result.inputArgumentResults;\n if (!statuses || statuses.length === 0) return undefined;\n const diagnostics = (\n result as { readonly inputArgumentDiagnosticInfos?: ReadonlyArray<unknown> }\n ).inputArgumentDiagnosticInfos;\n return statuses.map((statusCode: StatusCode, index: number) => {\n const mapping = method.metadata.inputMapping.find(\n (candidate) => candidate.index === index,\n );\n return {\n key: mapping?.key ?? String(index),\n index,\n argumentName:\n mapping?.argumentName ??\n method.metadata.inputArguments[index]?.name ??\n \"\",\n status: normalizeStatusCode(statusCode),\n diagnosticInfo: diagnostics?.[index],\n };\n });\n};\n\nexport const argumentCodecMetadata = (\n nodeId: NodeIdString,\n metadata: MethodArgumentMetadata,\n) => ({\n nodeId,\n valueRank: metadata.valueRank,\n arrayDimensions: metadata.arrayDimensions,\n raw: {\n declaredDataType: metadata.unsafeRaw.declaredDataType,\n builtInDataType: metadata.unsafeRaw.builtInDataType,\n },\n});\n\nconst emptyMapping = (\n operation: string,\n nodeId: NodeIdString,\n arguments_: ReadonlyArray<MethodArgumentMetadata>,\n) =>\n arguments_.length === 0\n ? []\n : configurationError({\n operation,\n nodeId,\n cause: \"Method arguments must be declared explicitly in v1\",\n });\n\nconst explicitMapping = (\n _operation: string,\n _nodeId: NodeIdString,\n arguments_: ReadonlyArray<MethodArgumentMetadata>,\n fields: MethodArgRecord,\n) => {\n const usedIndexes = new Set<number>();\n const mapping: Array<MethodArgumentMapping> = [];\n for (const [key, arg] of Object.entries(fields)) {\n const selector = arg.selector ?? { _tag: \"Name\" as const, name: key };\n const matches =\n selector._tag === \"Index\"\n ? [selector.index]\n : arguments_\n .map((argument, index) =>\n argument.name === selector.name ? index : undefined,\n )\n .filter((index): index is number => index !== undefined);\n const index = matches[0] ?? -1;\n if (!Number.isInteger(index) || index < 0 || index >= arguments_.length) {\n return configurationError({\n operation: \"method.argumentMap\",\n cause: `Argument selector for ${key} did not resolve`,\n });\n }\n if (matches.length !== 1) {\n return configurationError({\n operation: \"method.argumentMap\",\n cause: `Argument selector for ${key} did not resolve exactly once`,\n });\n }\n if (usedIndexes.has(index)) {\n return configurationError({\n operation: \"method.argumentMap\",\n cause: \"Two public keys target the same argument\",\n });\n }\n usedIndexes.add(index);\n mapping.push({\n key,\n index,\n argumentName: arguments_[index]!.name,\n arg,\n });\n }\n if (usedIndexes.size !== arguments_.length) {\n return configurationError({\n operation: \"method.argumentMap\",\n cause: \"Method arguments must cover every OPC UA argument\",\n });\n }\n return mapping;\n};\n\nconst validateInputKeys = (\n method: MethodInfo,\n inputRecord: Record<string, unknown>,\n input: unknown,\n) => {\n const expected = new Set(\n method.metadata.inputMapping.map((mapping) => mapping.key),\n );\n for (const key of expected) {\n if (!(key in inputRecord)) {\n const mapping = method.metadata.inputMapping.find((m) => m.key === key);\n return methodInputError({\n objectId: method.objectId,\n methodId: method.methodId,\n input,\n phase: \"MissingInputKey\",\n argumentKey: key,\n argumentIndex: mapping?.index,\n });\n }\n }\n for (const key of Object.keys(inputRecord)) {\n if (!expected.has(key)) {\n return methodInputError({\n objectId: method.objectId,\n methodId: method.methodId,\n input,\n phase: \"UnknownInputKey\",\n argumentKey: key,\n });\n }\n }\n return undefined;\n};\n\nconst objectRecord = (value: unknown): Record<string, unknown> | undefined =>\n isRecord(value) ? value : undefined;\n"],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { OpcuaStructureRuntime } from "../structures/runtime.mjs";
2
+ import { OpcuaConfigurationError, OpcuaMethodInputError, OpcuaMethodNotExecutableError, OpcuaServiceError } from "../../OpcuaError.mjs";
3
+ import { AnyMethodDef, AnyResolvedMethod, InputOfMethodDef, MethodCallEntry, MethodCallOptions, MethodCallResult, MethodMetadata, OutputOfMethodDef, ResolvedMethod } from "../../OpcuaMethod.mjs";
4
+ import { BatchOptions } from "../batch/chunk.mjs";
5
+ import "../batch/operations.mjs";
6
+ import { MethodPreflight } from "./arguments.mjs";
7
+ import { CallMethodResult, ClientSession } from "node-opcua";
8
+ import { Effect } from "effect";
9
+
10
+ //#region src/internal/method/operations.d.ts
11
+ declare const resolveMethod: <const Spec extends AnyMethodDef>(spec: Spec, metadata: MethodMetadata) => Effect.Effect<ResolvedMethod<Spec>, OpcuaConfigurationError | OpcuaMethodNotExecutableError, never>;
12
+ declare const callResolvedMethod: <const Spec extends AnyMethodDef>(session: ClientSession, method: ResolvedMethod<Spec>, input: InputOfMethodDef<Spec>, structureRuntime: OpcuaStructureRuntime, options?: MethodCallOptions) => Effect.Effect<MethodCallResult<OutputOfMethodDef<Spec>, Spec["objectId"], Spec["methodId"]>, OpcuaServiceError | OpcuaConfigurationError | OpcuaMethodInputError, never>;
13
+ declare const callMethods: (session: ClientSession, entries: ReadonlyArray<MethodCallEntry<AnyResolvedMethod>>, structureRuntime: OpcuaStructureRuntime, options?: BatchOptions) => Effect.Effect<MethodCallResult<{
14
+ readonly [x: string]: unknown;
15
+ }, string, string>[], OpcuaServiceError | OpcuaConfigurationError | OpcuaMethodInputError, never>;
16
+ declare const methodResultFromRaw: <const Spec extends AnyMethodDef>(method: ResolvedMethod<Spec>, preflight: MethodPreflight, result: CallMethodResult, structureRuntime: OpcuaStructureRuntime) => Effect.Effect<MethodCallResult<OutputOfMethodDef<Spec>, Spec["objectId"], Spec["methodId"]>>;
17
+ //#endregion
18
+ export { callMethods, callResolvedMethod, methodResultFromRaw, resolveMethod };
19
+ //# sourceMappingURL=operations.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operations.d.mts","names":[],"sources":["../../../src/internal/method/operations.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;cAkCa,mCAAoC,oBACzC,gBACI,mBAAc,MAAA,CAAA,OAAA,eAAA,OAAA,uBAAA,GAAA;cAwCb,wCAAyC,uBAC3C,uBACD,eAAe,cAChB,iBAAiB,yBACN,iCACR,sBAAiB,MAAA,CAAA,OAAA,iBAAA,kBAAA,OAAA,kBAAA,mBAAA,iBAAA,GAAA,uBAAA,GAAA;cA0BhB,uBACF,wBACA,cAAc,gBAAgB,uCACrB,iCACR,iBAAY,MAAA,CAAA,OAAA;EA7EX,UAAA,CAAA,EAAA,MAwCT,CAAA,EAAA,OAAA;CAxC6C,EAAA,MAAA,EAAA,MAAA,CAAA,EAAA,EA6EzB,iBAAA,kDA7EyB,EAAA,KAAA,CAAA;AACzC,cAsHK,mBAtHL,EAAA,CAAA,mBAsH+C,YAtH/C,CAAA,CAAA,MAAA,EAuHE,cAvHF,CAuHiB,IAvHjB,CAAA,EAAA,SAAA,EAwHK,eAxHL,EAAA,MAAA,EAyHE,gBAzHF,EAAA,gBAAA,EA0HY,qBA1HZ,EAAA,GAwKA,MAAA,CAAO,MAxKP,CAyKJ,gBAzKI,CA0KF,iBA1KE,CA0KgB,IA1KhB,CAAA,EA2KF,IA3KE,CAAA,UAAA,CAAA,EA4KF,IA5KE,CAAA,UAAA,CAAA,CAAA,CAAA"}
@@ -0,0 +1,111 @@
1
+ import { normalizeStatusCode } from "../values/normalize.mjs";
2
+ import { configurationError, methodNotExecutableError, serviceError } from "../../OpcuaError.mjs";
3
+ import { runChunked } from "../batch/chunk.mjs";
4
+ import { resultFromStatusAndDecode } from "../values/result.mjs";
5
+ import { normalizeInputArgumentResults, outputObjectFromResult, preflightMethodCall } from "./arguments.mjs";
6
+ import { coerceNodeId } from "node-opcua";
7
+ import { Effect } from "effect";
8
+
9
+ //#region src/internal/method/operations.ts
10
+ const resolveMethod = (spec, metadata) => Effect.gen(function* () {
11
+ const objectId = yield* coerceNodeIdOrFail("method.objectId", spec.objectId);
12
+ const methodId = yield* coerceNodeIdOrFail("method.methodId", spec.methodId);
13
+ if (!metadata.executable || metadata.userExecutable === false) return yield* Effect.fail(methodNotExecutableError({
14
+ objectId: spec.objectId,
15
+ methodId: spec.methodId,
16
+ executable: metadata.executable,
17
+ userExecutable: metadata.userExecutable
18
+ }));
19
+ return {
20
+ _tag: "ResolvedMethod",
21
+ objectId: spec.objectId,
22
+ methodId: spec.methodId,
23
+ def: spec,
24
+ metadata,
25
+ unsafeRaw: {
26
+ objectId,
27
+ methodId,
28
+ inputArguments: metadata.inputArguments.map((argument) => argument.unsafeRaw.argument),
29
+ outputArguments: metadata.outputArguments.map((argument) => argument.unsafeRaw.argument)
30
+ }
31
+ };
32
+ });
33
+ const callResolvedMethod = (session, method, input, structureRuntime, options) => Effect.gen(function* () {
34
+ const preflight = yield* preflightMethodCall(method, input, structureRuntime, options);
35
+ return yield* methodResultFromRaw(method, preflight, yield* Effect.tryPromise({
36
+ try: () => session.call(preflight.request),
37
+ catch: (cause) => serviceError({
38
+ operation: "call",
39
+ nodeId: method.methodId,
40
+ cause
41
+ })
42
+ }), structureRuntime);
43
+ });
44
+ const callMethods = (session, entries, structureRuntime, options) => Effect.gen(function* () {
45
+ const preflights = yield* Effect.forEach(entries, (entry) => preflightMethodCall(entry.method, entry.input, structureRuntime, entry.options));
46
+ const rawResults = yield* runChunked(preflights, options, (chunk) => Effect.gen(function* () {
47
+ const results = yield* Effect.tryPromise({
48
+ try: () => session.call(chunk.map((preflight) => preflight.request)),
49
+ catch: (cause) => serviceError({
50
+ operation: "call",
51
+ cause
52
+ })
53
+ });
54
+ if (results.length !== chunk.length) return yield* Effect.fail(serviceError({
55
+ operation: "call",
56
+ cause: `Expected ${chunk.length} CallMethodResults, got ${results.length}`
57
+ }));
58
+ return results;
59
+ }));
60
+ return yield* Effect.forEach(entries, (entry, index) => methodResultFromRaw(entry.method, preflights[index], rawResults[index], structureRuntime));
61
+ });
62
+ const methodResultFromRaw = (method, preflight, result, structureRuntime) => Effect.gen(function* () {
63
+ const unsafeRaw = preflight.includeRaw ? {
64
+ request: preflight.request,
65
+ result
66
+ } : void 0;
67
+ const status = normalizeStatusCode(result.statusCode);
68
+ const inputArgumentResults = normalizeInputArgumentResults(method, result);
69
+ return yield* resultFromStatusAndDecode({
70
+ statusCode: result.statusCode,
71
+ status,
72
+ decode: outputObjectFromResult(method, result, structureRuntime),
73
+ nonGoodStatus: (status$1) => ({
74
+ _tag: "NonGoodStatus",
75
+ objectId: method.objectId,
76
+ methodId: method.methodId,
77
+ status: status$1,
78
+ inputArgumentResults,
79
+ unsafeRaw
80
+ }),
81
+ decodeError: (error, status$1) => ({
82
+ _tag: "DecodeError",
83
+ objectId: method.objectId,
84
+ methodId: method.methodId,
85
+ status: status$1,
86
+ error,
87
+ unsafeRaw
88
+ }),
89
+ value: (output) => ({
90
+ _tag: "Called",
91
+ objectId: method.objectId,
92
+ methodId: method.methodId,
93
+ output,
94
+ status,
95
+ inputArgumentResults,
96
+ unsafeRaw
97
+ })
98
+ });
99
+ });
100
+ const coerceNodeIdOrFail = (operation, nodeId) => Effect.try({
101
+ try: () => coerceNodeId(nodeId),
102
+ catch: (cause) => configurationError({
103
+ operation,
104
+ nodeId: String(nodeId),
105
+ cause
106
+ })
107
+ });
108
+
109
+ //#endregion
110
+ export { callMethods, callResolvedMethod, methodResultFromRaw, resolveMethod };
111
+ //# sourceMappingURL=operations.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operations.mjs","names":[],"sources":["../../../src/internal/method/operations.ts"],"sourcesContent":["import {\n coerceNodeId,\n type CallMethodResult,\n type ClientSession,\n} from \"node-opcua\";\nimport { Effect } from \"effect\";\n\nimport {\n configurationError,\n methodNotExecutableError,\n serviceError,\n} from \"../../OpcuaError.js\";\nimport { runChunked, type BatchOptions } from \"../batch/chunk.js\";\nimport { normalizeStatusCode } from \"../values/normalize.js\";\nimport { resultFromStatusAndDecode } from \"../values/result.js\";\nimport type { OpcuaStructureRuntime } from \"../structures/runtime.js\";\nimport type { MethodCallOptions } from \"../batch/operations.js\";\nimport {\n normalizeInputArgumentResults,\n outputObjectFromResult,\n preflightMethodCall,\n type MethodPreflight,\n} from \"./arguments.js\";\nimport type {\n AnyMethodDef,\n AnyResolvedMethod,\n InputOfMethodDef,\n MethodCallEntry,\n MethodCallResult,\n MethodMetadata,\n OutputOfMethodDef,\n ResolvedMethod,\n} from \"../../OpcuaMethod.js\";\n\nexport const resolveMethod = <const Spec extends AnyMethodDef>(\n spec: Spec,\n metadata: MethodMetadata,\n) =>\n Effect.gen(function* () {\n const objectId = yield* coerceNodeIdOrFail(\n \"method.objectId\",\n spec.objectId,\n );\n const methodId = yield* coerceNodeIdOrFail(\n \"method.methodId\",\n spec.methodId,\n );\n if (!metadata.executable || metadata.userExecutable === false) {\n return yield* Effect.fail(\n methodNotExecutableError({\n objectId: spec.objectId,\n methodId: spec.methodId,\n executable: metadata.executable,\n userExecutable: metadata.userExecutable,\n }),\n );\n }\n return {\n _tag: \"ResolvedMethod\" as const,\n objectId: spec.objectId,\n methodId: spec.methodId,\n def: spec,\n metadata,\n unsafeRaw: {\n objectId,\n methodId,\n inputArguments: metadata.inputArguments.map(\n (argument) => argument.unsafeRaw.argument,\n ),\n outputArguments: metadata.outputArguments.map(\n (argument) => argument.unsafeRaw.argument,\n ),\n },\n } as ResolvedMethod<Spec>;\n });\n\nexport const callResolvedMethod = <const Spec extends AnyMethodDef>(\n session: ClientSession,\n method: ResolvedMethod<Spec>,\n input: InputOfMethodDef<Spec>,\n structureRuntime: OpcuaStructureRuntime,\n options?: MethodCallOptions,\n) =>\n Effect.gen(function* () {\n const preflight = yield* preflightMethodCall(\n method,\n input,\n structureRuntime,\n options,\n );\n const result = yield* Effect.tryPromise({\n try: () => session.call(preflight.request),\n catch: (cause) =>\n serviceError({\n operation: \"call\",\n nodeId: method.methodId,\n cause,\n }),\n });\n return yield* methodResultFromRaw(\n method,\n preflight,\n result,\n structureRuntime,\n );\n });\n\nexport const callMethods = (\n session: ClientSession,\n entries: ReadonlyArray<MethodCallEntry<AnyResolvedMethod>>,\n structureRuntime: OpcuaStructureRuntime,\n options?: BatchOptions,\n) =>\n Effect.gen(function* () {\n const preflights = yield* Effect.forEach(entries, (entry) =>\n preflightMethodCall(\n entry.method,\n entry.input,\n structureRuntime,\n entry.options,\n ),\n );\n const rawResults = yield* runChunked(preflights, options, (chunk) =>\n Effect.gen(function* () {\n const results = yield* Effect.tryPromise({\n try: () => session.call(chunk.map((preflight) => preflight.request)),\n catch: (cause) =>\n serviceError({\n operation: \"call\",\n cause,\n }),\n });\n if (results.length !== chunk.length) {\n return yield* Effect.fail(\n serviceError({\n operation: \"call\",\n cause: `Expected ${chunk.length} CallMethodResults, got ${results.length}`,\n }),\n );\n }\n return results;\n }),\n );\n return yield* Effect.forEach(entries, (entry, index) =>\n methodResultFromRaw(\n entry.method,\n preflights[index]!,\n rawResults[index]!,\n structureRuntime,\n ),\n );\n });\n\nexport const methodResultFromRaw = <const Spec extends AnyMethodDef>(\n method: ResolvedMethod<Spec>,\n preflight: MethodPreflight,\n result: CallMethodResult,\n structureRuntime: OpcuaStructureRuntime,\n) =>\n Effect.gen(function* () {\n const unsafeRaw = preflight.includeRaw\n ? { request: preflight.request, result }\n : undefined;\n const status = normalizeStatusCode(result.statusCode);\n const inputArgumentResults = normalizeInputArgumentResults(method, result);\n return yield* resultFromStatusAndDecode<\n Record<string, unknown>,\n typeof status,\n MethodCallResult<\n OutputOfMethodDef<Spec>,\n Spec[\"objectId\"],\n Spec[\"methodId\"]\n >\n >({\n statusCode: result.statusCode,\n status,\n decode: outputObjectFromResult(method, result, structureRuntime),\n nonGoodStatus: (status) => ({\n _tag: \"NonGoodStatus\",\n objectId: method.objectId,\n methodId: method.methodId,\n status,\n inputArgumentResults,\n unsafeRaw,\n }),\n decodeError: (error, status) => ({\n _tag: \"DecodeError\",\n objectId: method.objectId,\n methodId: method.methodId,\n status,\n error,\n unsafeRaw,\n }),\n value: (output) => ({\n _tag: \"Called\",\n objectId: method.objectId,\n methodId: method.methodId,\n output: output as OutputOfMethodDef<Spec>,\n status,\n inputArgumentResults,\n unsafeRaw,\n }),\n });\n }) as Effect.Effect<\n MethodCallResult<\n OutputOfMethodDef<Spec>,\n Spec[\"objectId\"],\n Spec[\"methodId\"]\n >\n >;\n\nconst coerceNodeIdOrFail = (operation: string, nodeId: unknown) =>\n Effect.try({\n try: () => coerceNodeId(nodeId),\n catch: (cause) =>\n configurationError({ operation, nodeId: String(nodeId), cause }),\n });\n"],"mappings":";;;;;;;;;AAkCA,MAAa,iBACX,MACA,aAEA,OAAO,IAAI,aAAa;CACtB,MAAM,WAAW,OAAO,mBACtB,mBACA,KAAK,SACN;CACD,MAAM,WAAW,OAAO,mBACtB,mBACA,KAAK,SACN;AACD,KAAI,CAAC,SAAS,cAAc,SAAS,mBAAmB,MACtD,QAAO,OAAO,OAAO,KACnB,yBAAyB;EACvB,UAAU,KAAK;EACf,UAAU,KAAK;EACf,YAAY,SAAS;EACrB,gBAAgB,SAAS;EAC1B,CAAC,CACH;AAEH,QAAO;EACL,MAAM;EACN,UAAU,KAAK;EACf,UAAU,KAAK;EACf,KAAK;EACL;EACA,WAAW;GACT;GACA;GACA,gBAAgB,SAAS,eAAe,KACrC,aAAa,SAAS,UAAU,SAClC;GACD,iBAAiB,SAAS,gBAAgB,KACvC,aAAa,SAAS,UAAU,SAClC;GACF;EACF;EACD;AAEJ,MAAa,sBACX,SACA,QACA,OACA,kBACA,YAEA,OAAO,IAAI,aAAa;CACtB,MAAM,YAAY,OAAO,oBACvB,QACA,OACA,kBACA,QACD;AAUD,QAAO,OAAO,oBACZ,QACA,WAXa,OAAO,OAAO,WAAW;EACtC,WAAW,QAAQ,KAAK,UAAU,QAAQ;EAC1C,QAAQ,UACN,aAAa;GACX,WAAW;GACX,QAAQ,OAAO;GACf;GACD,CAAC;EACL,CAAC,EAKA,iBACD;EACD;AAEJ,MAAa,eACX,SACA,SACA,kBACA,YAEA,OAAO,IAAI,aAAa;CACtB,MAAM,aAAa,OAAO,OAAO,QAAQ,UAAU,UACjD,oBACE,MAAM,QACN,MAAM,OACN,kBACA,MAAM,QACP,CACF;CACD,MAAM,aAAa,OAAO,WAAW,YAAY,UAAU,UACzD,OAAO,IAAI,aAAa;EACtB,MAAM,UAAU,OAAO,OAAO,WAAW;GACvC,WAAW,QAAQ,KAAK,MAAM,KAAK,cAAc,UAAU,QAAQ,CAAC;GACpE,QAAQ,UACN,aAAa;IACX,WAAW;IACX;IACD,CAAC;GACL,CAAC;AACF,MAAI,QAAQ,WAAW,MAAM,OAC3B,QAAO,OAAO,OAAO,KACnB,aAAa;GACX,WAAW;GACX,OAAO,YAAY,MAAM,OAAO,0BAA0B,QAAQ;GACnE,CAAC,CACH;AAEH,SAAO;GACP,CACH;AACD,QAAO,OAAO,OAAO,QAAQ,UAAU,OAAO,UAC5C,oBACE,MAAM,QACN,WAAW,QACX,WAAW,QACX,iBACD,CACF;EACD;AAEJ,MAAa,uBACX,QACA,WACA,QACA,qBAEA,OAAO,IAAI,aAAa;CACtB,MAAM,YAAY,UAAU,aACxB;EAAE,SAAS,UAAU;EAAS;EAAQ,GACtC;CACJ,MAAM,SAAS,oBAAoB,OAAO,WAAW;CACrD,MAAM,uBAAuB,8BAA8B,QAAQ,OAAO;AAC1E,QAAO,OAAO,0BAQZ;EACA,YAAY,OAAO;EACnB;EACA,QAAQ,uBAAuB,QAAQ,QAAQ,iBAAiB;EAChE,gBAAgB,cAAY;GAC1B,MAAM;GACN,UAAU,OAAO;GACjB,UAAU,OAAO;GACjB;GACA;GACA;GACD;EACD,cAAc,OAAO,cAAY;GAC/B,MAAM;GACN,UAAU,OAAO;GACjB,UAAU,OAAO;GACjB;GACA;GACA;GACD;EACD,QAAQ,YAAY;GAClB,MAAM;GACN,UAAU,OAAO;GACjB,UAAU,OAAO;GACT;GACR;GACA;GACA;GACD;EACF,CAAC;EACF;AAQJ,MAAM,sBAAsB,WAAmB,WAC7C,OAAO,IAAI;CACT,WAAW,aAAa,OAAO;CAC/B,QAAQ,UACN,mBAAmB;EAAE;EAAW,QAAQ,OAAO,OAAO;EAAE;EAAO,CAAC;CACnE,CAAC"}
@@ -0,0 +1,30 @@
1
+ import { NodeIdString, ReadableVariableDef } from "../../OpcuaVariable.mjs";
2
+ import "../common/node-id.mjs";
3
+ import { EffectiveMonitorItemOptions, MonitorItemDictionary, MonitorOptions } from "../../OpcuaSubscription.mjs";
4
+ import { OpcuaMonitorConfigurationError } from "../../OpcuaError.mjs";
5
+ import { DataChangeFilter, NodeId, TimestampsToReturn } from "node-opcua";
6
+ import { Effect } from "effect";
7
+
8
+ //#region src/internal/monitoring/options.d.ts
9
+ type NormalizedCreateOptions = {
10
+ readonly maxItemsPerRequest: number;
11
+ readonly maxConcurrentRequests: number;
12
+ };
13
+ type NormalizedMonitorItem<Items> = {
14
+ readonly key: keyof Items & string;
15
+ readonly def: ReadableVariableDef;
16
+ readonly nodeId: NodeIdString;
17
+ readonly rawNodeId: NodeId;
18
+ };
19
+ type EffectiveMonitorItem<Items> = NormalizedMonitorItem<Items> & {
20
+ readonly requested: EffectiveMonitorItemOptions;
21
+ readonly nodeOpcuaFilter?: DataChangeFilter;
22
+ readonly timestampsToReturn: TimestampsToReturn;
23
+ readonly compatibilityKey: string;
24
+ };
25
+ declare const normalizeMonitorItems: <Items extends MonitorItemDictionary>(items: Items) => Effect.Effect<ReadonlyArray<NormalizedMonitorItem<Items>>, OpcuaMonitorConfigurationError>;
26
+ declare const validateMonitorOptions: <Items>(items: ReadonlyArray<NormalizedMonitorItem<Items>>, options: MonitorOptions<Items>) => Effect.Effect<NormalizedCreateOptions, OpcuaMonitorConfigurationError>;
27
+ declare const applyMonitorOptions: <Items>(items: ReadonlyArray<NormalizedMonitorItem<Items>>, options: MonitorOptions<Items>) => Effect.Effect<ReadonlyArray<EffectiveMonitorItem<Items>>, OpcuaMonitorConfigurationError>;
28
+ //#endregion
29
+ export { EffectiveMonitorItem, NormalizedCreateOptions, NormalizedMonitorItem, applyMonitorOptions, normalizeMonitorItems, validateMonitorOptions };
30
+ //# sourceMappingURL=options.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"options.d.mts","names":[],"sources":["../../../src/internal/monitoring/options.ts"],"sourcesContent":[],"mappings":";;;;;;;;KAgCY,uBAAA;;EAAA,SAAA,qBAAuB,EAAA,MAAA;AAKnC,CAAA;AACsB,KADV,qBACU,CAAA,KAAA,CAAA,GAAA;EACN,SAAA,GAAA,EAAA,MADM,KACN,GAAA,MAAA;EACG,SAAA,GAAA,EADH,mBACG;EACG,SAAA,MAAA,EADH,YACG;EAAM,SAAA,SAAA,EAAN,MAAM;AAG5B,CAAA;AAAgE,KAApD,oBAAoD,CAAA,KAAA,CAAA,GAAtB,qBAAsB,CAAA,KAAA,CAAA,GAAA;EAAtB,SAAA,SAAA,EACpB,2BADoB;EACpB,SAAA,eAAA,CAAA,EACO,gBADP;EACO,SAAA,kBAAA,EACE,kBADF;EACE,SAAA,gBAAA,EAAA,MAAA;CAAkB;AAsBpC,cAAA,qBAkET,EAAA,CAAA,cAlEgD,qBAkEhD,CAAA,CAAA,KAAA,EAjEK,KAiEL,EAAA,GAhED,MAAA,CAAO,MAgEN,CA/DF,aA+DE,CA/DY,qBA+DZ,CA/DkC,KA+DlC,CAAA,CAAA,EA9DF,8BA8DE,CAAA;AAlEgD,cAoEvC,sBApEuC,EAAA,CAAA,KAAA,CAAA,CAAA,KAAA,EAqE3C,aArE2C,CAqE7B,qBArE6B,CAqEP,KArEO,CAAA,CAAA,EAAA,OAAA,EAsEzC,cAtEyC,CAsE1B,KAtE0B,CAAA,EAAA,GAuEjD,MAAA,CAAO,MAvE0C,CAuEnC,uBAvEmC,EAuEV,8BAvEU,CAAA;AAC3C,cA6MI,mBA7MJ,EAAA,CAAA,KAAA,CAAA,CAAA,KAAA,EA8MA,aA9MA,CA8Mc,qBA9Md,CA8MoC,KA9MpC,CAAA,CAAA,EAAA,OAAA,EA+ME,cA/MF,CA+MiB,KA/MjB,CAAA,EAAA,GAgNN,MAAA,CAAO,MAhND,CAiNP,aAjNO,CAiNO,oBAjNP,CAiN4B,KAjN5B,CAAA,CAAA,EAkNP,8BAlNO,CAAA"}