node-opcua-address-space 2.180.0 → 2.181.0

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 (1084) hide show
  1. package/api/address_space_public.ts +63 -0
  2. package/api/address_space_ts.ts +129 -0
  3. package/api/continuation_points/continuation_point_manager.ts +271 -0
  4. package/api/helpers/argument_list.ts +310 -0
  5. package/api/helpers/call_helpers.ts +100 -0
  6. package/api/helpers/coerce_enum_value.ts +33 -0
  7. package/api/helpers/dump_tools.ts +90 -0
  8. package/api/helpers/ensure_secure_access.ts +78 -0
  9. package/api/helpers/multiform_func.ts +78 -0
  10. package/api/helpers/resolve_opaque_on_address_space.ts +26 -0
  11. package/api/index.ts +210 -0
  12. package/api/interfaces/alarms_and_conditions/condition_info_i.ts +60 -0
  13. package/api/interfaces/alarms_and_conditions/condition_snapshot.ts +236 -0
  14. package/api/interfaces/alarms_and_conditions/deviation_stuff.ts +16 -0
  15. package/api/interfaces/alarms_and_conditions/instantiate_alarm_condition_options.ts +8 -0
  16. package/api/interfaces/alarms_and_conditions/instantiate_exclusive_deviation_alarm_options.ts +6 -0
  17. package/api/interfaces/alarms_and_conditions/instantiate_exclusive_limit_alarm_options.ts +6 -0
  18. package/api/interfaces/alarms_and_conditions/instantiate_limit_alarm_options.ts +13 -0
  19. package/api/interfaces/alarms_and_conditions/instantiate_non_exclusive_deviation_alarm_options.ts +6 -0
  20. package/api/interfaces/alarms_and_conditions/instantiate_non_exclusive_limit_alarm_options.ts +6 -0
  21. package/api/interfaces/alarms_and_conditions/instantiate_off_normal_alarm_options.ts +21 -0
  22. package/api/interfaces/alarms_and_conditions/ua_acknowledgeable_condition_ex.ts +28 -0
  23. package/api/interfaces/alarms_and_conditions/ua_alarm_condition_ex.ts +72 -0
  24. package/api/interfaces/alarms_and_conditions/ua_certificate_expiration_alarm_ex.ts +36 -0
  25. package/api/interfaces/alarms_and_conditions/ua_condition_ex.ts +55 -0
  26. package/api/interfaces/alarms_and_conditions/ua_discrete_alarm_ex.ts +17 -0
  27. package/api/interfaces/alarms_and_conditions/ua_exclusive_deviation_alarm_ex.ts +21 -0
  28. package/api/interfaces/alarms_and_conditions/ua_exclusive_limit_alarm_ex.ts +21 -0
  29. package/api/interfaces/alarms_and_conditions/ua_limit_alarm_ex.ts +26 -0
  30. package/api/interfaces/alarms_and_conditions/ua_non_exclusive_deviation_alarm_ex.ts +29 -0
  31. package/api/interfaces/alarms_and_conditions/ua_non_exclusive_limit_alarm_ex.ts +25 -0
  32. package/api/interfaces/data_access/ua_multistate_discrete_ex.ts +57 -0
  33. package/api/interfaces/data_access/ua_multistate_value_discrete_ex.ts +31 -0
  34. package/api/interfaces/data_access/ua_two_state_discrete_ex.ts +15 -0
  35. package/api/interfaces/nodeset_loader_options.ts +58 -0
  36. package/api/interfaces/state_machine/ua_exclusive_limit_state_machine_type_ex.ts +20 -0
  37. package/api/interfaces/state_machine/ua_finite_state_machine_type.ts +50 -0
  38. package/api/interfaces/state_machine/ua_program_state_machine_type.ts +14 -0
  39. package/api/interfaces/state_machine/ua_shelved_state_machine_ex.ts +35 -0
  40. package/api/interfaces/state_machine/ua_state_machine_type.ts +288 -0
  41. package/api/loader/decode_xml_extension_object.ts +80 -0
  42. package/api/loader/ensure_datatype_extracted.ts +122 -0
  43. package/api/loader/generateAddressSpaceRaw.ts +470 -0
  44. package/api/loader/load_nodeset2.ts +278 -0
  45. package/api/loader/make_xml_extension_object_parser.ts +518 -0
  46. package/api/loader/namespace_post_step.ts +68 -0
  47. package/api/loader/nodeset_image.ts +451 -0
  48. package/api/loader/nodeset_image_codec.ts +576 -0
  49. package/api/loader/nodeset_image_store.ts +78 -0
  50. package/api/loader/nodeset_record.ts +141 -0
  51. package/api/loader/nodeset_record_applier.ts +889 -0
  52. package/api/loader/nodeset_source.ts +367 -0
  53. package/api/loader/nodeset_source_helpers.ts +50 -0
  54. package/api/loader/nodeset_to_image.ts +29 -0
  55. package/api/loader/nodeset_xml_producer.ts +383 -0
  56. package/api/loader/parsers/extension_object_parser.ts +374 -0
  57. package/api/loader/parsers/variant_parser.ts +363 -0
  58. package/api/loader/register_node_promoter.ts +6 -0
  59. package/api/namespace.ts +25 -0
  60. package/api/namespace_alarm_and_condition.ts +78 -0
  61. package/api/namespace_data_access.ts +92 -0
  62. package/api/namespace_machine_state.ts +20 -0
  63. package/api/pseudo_session.ts +415 -0
  64. package/api/session_context.ts +729 -0
  65. package/api/ua_interface.ts +38 -0
  66. package/api/ua_two_state_variable_ex.ts +36 -0
  67. package/bin/opcua-nodeset-image.js +192 -0
  68. package/dist/api/address_space_public.d.ts +57 -0
  69. package/dist/api/address_space_public.js +19 -0
  70. package/dist/api/address_space_public.js.map +1 -0
  71. package/dist/api/address_space_ts.d.ts +79 -0
  72. package/dist/api/address_space_ts.js +13 -0
  73. package/dist/api/address_space_ts.js.map +1 -0
  74. package/dist/api/continuation_points/continuation_point_manager.js +230 -0
  75. package/dist/api/continuation_points/continuation_point_manager.js.map +1 -0
  76. package/dist/api/helpers/adjust_browse_direction.js.map +1 -0
  77. package/dist/api/helpers/argument_list.js +263 -0
  78. package/dist/api/helpers/argument_list.js.map +1 -0
  79. package/dist/api/helpers/call_helpers.js +80 -0
  80. package/dist/api/helpers/call_helpers.js.map +1 -0
  81. package/dist/api/helpers/coerce_enum_value.d.ts +6 -0
  82. package/dist/api/helpers/coerce_enum_value.js.map +1 -0
  83. package/dist/api/helpers/dump_tools.js +81 -0
  84. package/dist/api/helpers/dump_tools.js.map +1 -0
  85. package/dist/api/helpers/ensure_secure_access.d.ts +19 -0
  86. package/dist/api/helpers/ensure_secure_access.js +67 -0
  87. package/dist/api/helpers/ensure_secure_access.js.map +1 -0
  88. package/dist/api/helpers/make_optionals_map.js.map +1 -0
  89. package/dist/api/helpers/multiform_func.js +75 -0
  90. package/dist/api/helpers/multiform_func.js.map +1 -0
  91. package/dist/api/helpers/resolve_opaque_on_address_space.js +25 -0
  92. package/dist/api/helpers/resolve_opaque_on_address_space.js.map +1 -0
  93. package/dist/api/index.d.ts +113 -0
  94. package/dist/api/index.js +234 -0
  95. package/dist/api/index.js.map +1 -0
  96. package/dist/api/interfaces/alarms_and_conditions/condition_info_i.d.ts +54 -0
  97. package/dist/api/interfaces/alarms_and_conditions/condition_info_i.js +28 -0
  98. package/dist/api/interfaces/alarms_and_conditions/condition_info_i.js.map +1 -0
  99. package/dist/api/interfaces/alarms_and_conditions/condition_snapshot.d.ts +151 -0
  100. package/dist/api/interfaces/alarms_and_conditions/condition_snapshot.js.map +1 -0
  101. package/dist/api/interfaces/alarms_and_conditions/deviation_stuff.d.ts +12 -0
  102. package/dist/api/interfaces/alarms_and_conditions/deviation_stuff.js.map +1 -0
  103. package/dist/api/interfaces/alarms_and_conditions/install_setpoint_options.js.map +1 -0
  104. package/dist/api/interfaces/alarms_and_conditions/instantiate_alarm_condition_options.d.ts +7 -0
  105. package/dist/api/interfaces/alarms_and_conditions/instantiate_alarm_condition_options.js.map +1 -0
  106. package/dist/api/interfaces/alarms_and_conditions/instantiate_condition_options.js.map +1 -0
  107. package/dist/api/interfaces/alarms_and_conditions/instantiate_exclusive_deviation_alarm_options.d.ts +4 -0
  108. package/dist/api/interfaces/alarms_and_conditions/instantiate_exclusive_deviation_alarm_options.js.map +1 -0
  109. package/dist/api/interfaces/alarms_and_conditions/instantiate_exclusive_limit_alarm_options.d.ts +4 -0
  110. package/dist/api/interfaces/alarms_and_conditions/instantiate_exclusive_limit_alarm_options.js.map +1 -0
  111. package/dist/api/interfaces/alarms_and_conditions/instantiate_limit_alarm_options.d.ts +10 -0
  112. package/dist/api/interfaces/alarms_and_conditions/instantiate_limit_alarm_options.js.map +1 -0
  113. package/dist/api/interfaces/alarms_and_conditions/instantiate_non_exclusive_deviation_alarm_options.d.ts +4 -0
  114. package/dist/api/interfaces/alarms_and_conditions/instantiate_non_exclusive_deviation_alarm_options.js.map +1 -0
  115. package/dist/api/interfaces/alarms_and_conditions/instantiate_non_exclusive_limit_alarm_options.d.ts +4 -0
  116. package/dist/api/interfaces/alarms_and_conditions/instantiate_non_exclusive_limit_alarm_options.js.map +1 -0
  117. package/dist/api/interfaces/alarms_and_conditions/instantiate_off_normal_alarm_options.d.ts +20 -0
  118. package/dist/api/interfaces/alarms_and_conditions/instantiate_off_normal_alarm_options.js.map +1 -0
  119. package/dist/api/interfaces/alarms_and_conditions/ua_acknowledgeable_condition_ex.d.ts +21 -0
  120. package/dist/api/interfaces/alarms_and_conditions/ua_acknowledgeable_condition_ex.js.map +1 -0
  121. package/dist/api/interfaces/alarms_and_conditions/ua_alarm_condition_ex.d.ts +56 -0
  122. package/dist/api/interfaces/alarms_and_conditions/ua_alarm_condition_ex.js.map +1 -0
  123. package/dist/api/interfaces/alarms_and_conditions/ua_base_event_ex.js.map +1 -0
  124. package/dist/api/interfaces/alarms_and_conditions/ua_certificate_expiration_alarm_ex.d.ts +19 -0
  125. package/dist/api/interfaces/alarms_and_conditions/ua_certificate_expiration_alarm_ex.js.map +1 -0
  126. package/dist/api/interfaces/alarms_and_conditions/ua_condition_ex.d.ts +44 -0
  127. package/dist/api/interfaces/alarms_and_conditions/ua_condition_ex.js.map +1 -0
  128. package/dist/api/interfaces/alarms_and_conditions/ua_discrete_alarm_ex.d.ts +4 -0
  129. package/dist/api/interfaces/alarms_and_conditions/ua_discrete_alarm_ex.js.map +1 -0
  130. package/dist/api/interfaces/alarms_and_conditions/ua_exclusive_deviation_alarm_ex.d.ts +5 -0
  131. package/dist/api/interfaces/alarms_and_conditions/ua_exclusive_deviation_alarm_ex.js.map +1 -0
  132. package/dist/api/interfaces/alarms_and_conditions/ua_exclusive_limit_alarm_ex.d.ts +19 -0
  133. package/dist/api/interfaces/alarms_and_conditions/ua_exclusive_limit_alarm_ex.js.map +1 -0
  134. package/dist/api/interfaces/alarms_and_conditions/ua_limit_alarm_ex.d.ts +25 -0
  135. package/dist/api/interfaces/alarms_and_conditions/ua_limit_alarm_ex.js.map +1 -0
  136. package/dist/api/interfaces/alarms_and_conditions/ua_non_exclusive_deviation_alarm_ex.d.ts +8 -0
  137. package/dist/api/interfaces/alarms_and_conditions/ua_non_exclusive_deviation_alarm_ex.js.map +1 -0
  138. package/dist/api/interfaces/alarms_and_conditions/ua_non_exclusive_limit_alarm_ex.d.ts +10 -0
  139. package/dist/api/interfaces/alarms_and_conditions/ua_non_exclusive_limit_alarm_ex.js.map +1 -0
  140. package/dist/api/interfaces/data_access/ua_multistate_discrete_ex.d.ts +44 -0
  141. package/dist/api/interfaces/data_access/ua_multistate_discrete_ex.js.map +1 -0
  142. package/dist/api/interfaces/data_access/ua_multistate_value_discrete_ex.d.ts +22 -0
  143. package/dist/api/interfaces/data_access/ua_multistate_value_discrete_ex.js.map +1 -0
  144. package/dist/api/interfaces/data_access/ua_two_state_discrete_ex.d.ts +13 -0
  145. package/dist/api/interfaces/data_access/ua_two_state_discrete_ex.js.map +1 -0
  146. package/dist/api/interfaces/data_access/ua_y_array_item_ex.js.map +1 -0
  147. package/dist/api/interfaces/extension_object_constructor.js.map +1 -0
  148. package/dist/api/interfaces/i_condition_variable_type_setter_options.js.map +1 -0
  149. package/dist/api/interfaces/i_set_state_options.js.map +1 -0
  150. package/dist/api/interfaces/nodeset_loader_options.d.ts +56 -0
  151. package/dist/api/interfaces/nodeset_loader_options.js.map +1 -0
  152. package/dist/api/interfaces/state_machine/ua_exclusive_limit_state_machine_type_ex.d.ts +12 -0
  153. package/dist/api/interfaces/state_machine/ua_exclusive_limit_state_machine_type_ex.js.map +1 -0
  154. package/dist/api/interfaces/state_machine/ua_finite_state_machine_type.d.ts +49 -0
  155. package/dist/api/interfaces/state_machine/ua_finite_state_machine_type.js.map +1 -0
  156. package/dist/api/interfaces/state_machine/ua_program_state_machine_type.d.ts +11 -0
  157. package/dist/api/interfaces/state_machine/ua_program_state_machine_type.js.map +1 -0
  158. package/dist/api/interfaces/state_machine/ua_shelved_state_machine_ex.d.ts +29 -0
  159. package/dist/api/interfaces/state_machine/ua_shelved_state_machine_ex.js.map +1 -0
  160. package/dist/api/interfaces/state_machine/ua_state_machine_type.d.ts +236 -0
  161. package/dist/api/interfaces/state_machine/ua_state_machine_type.js.map +1 -0
  162. package/dist/api/interfaces/state_machine/ua_transition_ex.js.map +1 -0
  163. package/dist/api/interfaces/ua_subscription_diagnostics_variable_ex.js.map +1 -0
  164. package/dist/api/loader/decode_xml_extension_object.d.ts +6 -0
  165. package/dist/api/loader/decode_xml_extension_object.js +69 -0
  166. package/dist/api/loader/decode_xml_extension_object.js.map +1 -0
  167. package/dist/api/loader/ensure_datatype_extracted.js +88 -0
  168. package/dist/api/loader/ensure_datatype_extracted.js.map +1 -0
  169. package/dist/api/loader/generateAddressSpaceRaw.d.ts +64 -0
  170. package/dist/api/loader/generateAddressSpaceRaw.js +379 -0
  171. package/dist/api/loader/generateAddressSpaceRaw.js.map +1 -0
  172. package/dist/api/loader/load_nodeset2.d.ts +38 -0
  173. package/dist/api/loader/load_nodeset2.js +245 -0
  174. package/dist/api/loader/load_nodeset2.js.map +1 -0
  175. package/dist/api/loader/make_semver_compatible.js.map +1 -0
  176. package/dist/api/loader/make_xml_extension_object_parser.js +417 -0
  177. package/dist/api/loader/make_xml_extension_object_parser.js.map +1 -0
  178. package/dist/api/loader/namespace_post_step.js +57 -0
  179. package/dist/api/loader/namespace_post_step.js.map +1 -0
  180. package/dist/api/loader/nodeset_image.d.ts +94 -0
  181. package/dist/api/loader/nodeset_image.js +406 -0
  182. package/dist/api/loader/nodeset_image.js.map +1 -0
  183. package/dist/api/loader/nodeset_image_codec.d.ts +104 -0
  184. package/dist/api/loader/nodeset_image_codec.js +489 -0
  185. package/dist/api/loader/nodeset_image_codec.js.map +1 -0
  186. package/dist/api/loader/nodeset_image_store.d.ts +27 -0
  187. package/dist/api/loader/nodeset_image_store.js +72 -0
  188. package/dist/api/loader/nodeset_image_store.js.map +1 -0
  189. package/dist/api/loader/nodeset_record.d.ts +125 -0
  190. package/dist/api/loader/nodeset_record.js +26 -0
  191. package/dist/api/loader/nodeset_record.js.map +1 -0
  192. package/dist/api/loader/nodeset_record_applier.d.ts +106 -0
  193. package/dist/api/loader/nodeset_record_applier.js +731 -0
  194. package/dist/api/loader/nodeset_record_applier.js.map +1 -0
  195. package/dist/api/loader/nodeset_source.d.ts +124 -0
  196. package/dist/api/loader/nodeset_source.js +307 -0
  197. package/dist/api/loader/nodeset_source.js.map +1 -0
  198. package/dist/api/loader/nodeset_source_helpers.d.ts +27 -0
  199. package/dist/api/loader/nodeset_source_helpers.js +30 -0
  200. package/dist/api/loader/nodeset_source_helpers.js.map +1 -0
  201. package/dist/api/loader/nodeset_to_image.d.ts +13 -0
  202. package/dist/api/loader/nodeset_to_image.js +30 -0
  203. package/dist/api/loader/nodeset_to_image.js.map +1 -0
  204. package/dist/api/loader/nodeset_xml_producer.d.ts +16 -0
  205. package/dist/api/loader/nodeset_xml_producer.js +349 -0
  206. package/dist/api/loader/nodeset_xml_producer.js.map +1 -0
  207. package/dist/api/loader/parsers/extension_object_parser.js +274 -0
  208. package/dist/api/loader/parsers/extension_object_parser.js.map +1 -0
  209. package/dist/api/loader/parsers/localized_text_parser.js.map +1 -0
  210. package/dist/api/loader/parsers/nodeid_parser.js.map +1 -0
  211. package/dist/api/loader/parsers/qualified_name_parser.js.map +1 -0
  212. package/dist/api/loader/parsers/variant_parser.d.ts +42 -0
  213. package/dist/api/loader/parsers/variant_parser.js +294 -0
  214. package/dist/api/loader/parsers/variant_parser.js.map +1 -0
  215. package/dist/api/loader/register_node_promoter.d.ts +2 -0
  216. package/dist/api/loader/register_node_promoter.js +9 -0
  217. package/dist/api/loader/register_node_promoter.js.map +1 -0
  218. package/dist/api/namespace.d.ts +18 -0
  219. package/dist/api/namespace.js.map +1 -0
  220. package/dist/api/namespace_alarm_and_condition.d.ts +33 -0
  221. package/dist/api/namespace_alarm_and_condition.js.map +1 -0
  222. package/dist/api/namespace_data_access.d.ts +67 -0
  223. package/dist/api/namespace_data_access.js.map +1 -0
  224. package/dist/api/namespace_machine_state.d.ts +8 -0
  225. package/dist/api/namespace_machine_state.js.map +1 -0
  226. package/dist/api/pseudo_session.d.ts +74 -0
  227. package/dist/api/pseudo_session.js +308 -0
  228. package/dist/api/pseudo_session.js.map +1 -0
  229. package/dist/api/session_context.d.ts +242 -0
  230. package/dist/api/session_context.js.map +1 -0
  231. package/dist/api/set_namespace_meta_data.js.map +1 -0
  232. package/dist/api/ua_addin.js.map +1 -0
  233. package/dist/api/ua_interface.js +25 -0
  234. package/dist/api/ua_interface.js.map +1 -0
  235. package/dist/api/ua_root_folder.js.map +1 -0
  236. package/dist/api/ua_two_state_variable_ex.d.ts +24 -0
  237. package/dist/api/ua_two_state_variable_ex.js.map +1 -0
  238. package/dist/api/xml_writer.js.map +1 -0
  239. package/dist/impl/_instantiate_helpers.js +99 -0
  240. package/dist/impl/_instantiate_helpers.js.map +1 -0
  241. package/dist/impl/_mandatory_child_or_requested_optional_filter.js +82 -0
  242. package/dist/impl/_mandatory_child_or_requested_optional_filter.js.map +1 -0
  243. package/dist/impl/address_space.d.ts +379 -0
  244. package/dist/impl/address_space.js +1383 -0
  245. package/dist/impl/address_space.js.map +1 -0
  246. package/dist/impl/address_space_change_event_tools.d.ts +6 -0
  247. package/dist/impl/address_space_change_event_tools.js.map +1 -0
  248. package/dist/impl/address_space_private.d.ts +48 -0
  249. package/dist/impl/address_space_private.js.map +1 -0
  250. package/dist/impl/alarms_and_conditions/condition.js.map +1 -0
  251. package/dist/impl/alarms_and_conditions/condition_info_impl.d.ts +19 -0
  252. package/dist/impl/alarms_and_conditions/condition_info_impl.js +39 -0
  253. package/dist/impl/alarms_and_conditions/condition_info_impl.js.map +1 -0
  254. package/dist/impl/alarms_and_conditions/condition_snapshot_impl.d.ts +271 -0
  255. package/dist/impl/alarms_and_conditions/condition_snapshot_impl.js +700 -0
  256. package/dist/impl/alarms_and_conditions/condition_snapshot_impl.js.map +1 -0
  257. package/dist/impl/alarms_and_conditions/deviation_alarm_helper.d.ts +12 -0
  258. package/dist/impl/alarms_and_conditions/deviation_alarm_helper.js +66 -0
  259. package/dist/impl/alarms_and_conditions/deviation_alarm_helper.js.map +1 -0
  260. package/dist/impl/alarms_and_conditions/index.d.ts +16 -0
  261. package/dist/impl/alarms_and_conditions/index.js +33 -0
  262. package/dist/impl/alarms_and_conditions/index.js.map +1 -0
  263. package/dist/impl/alarms_and_conditions/ua_acknowledgeable_condition_impl.d.ts +54 -0
  264. package/dist/impl/alarms_and_conditions/ua_acknowledgeable_condition_impl.js +244 -0
  265. package/dist/impl/alarms_and_conditions/ua_acknowledgeable_condition_impl.js.map +1 -0
  266. package/dist/impl/alarms_and_conditions/ua_alarm_condition_impl.d.ts +105 -0
  267. package/dist/impl/alarms_and_conditions/ua_alarm_condition_impl.js +428 -0
  268. package/dist/impl/alarms_and_conditions/ua_alarm_condition_impl.js.map +1 -0
  269. package/dist/impl/alarms_and_conditions/ua_base_event_impl.d.ts +36 -0
  270. package/dist/impl/alarms_and_conditions/ua_base_event_impl.js +32 -0
  271. package/dist/impl/alarms_and_conditions/ua_base_event_impl.js.map +1 -0
  272. package/dist/impl/alarms_and_conditions/ua_certificate_expiration_alarm_impl.d.ts +47 -0
  273. package/dist/impl/alarms_and_conditions/ua_certificate_expiration_alarm_impl.js +204 -0
  274. package/dist/impl/alarms_and_conditions/ua_certificate_expiration_alarm_impl.js.map +1 -0
  275. package/dist/impl/alarms_and_conditions/ua_condition_impl.d.ts +152 -0
  276. package/dist/impl/alarms_and_conditions/ua_condition_impl.js +1016 -0
  277. package/dist/impl/alarms_and_conditions/ua_condition_impl.js.map +1 -0
  278. package/dist/impl/alarms_and_conditions/ua_discrete_alarm_impl.d.ts +22 -0
  279. package/dist/impl/alarms_and_conditions/ua_discrete_alarm_impl.js +41 -0
  280. package/dist/impl/alarms_and_conditions/ua_discrete_alarm_impl.js.map +1 -0
  281. package/dist/impl/alarms_and_conditions/ua_exclusive_deviation_alarm_impl.d.ts +30 -0
  282. package/dist/impl/alarms_and_conditions/ua_exclusive_deviation_alarm_impl.js +54 -0
  283. package/dist/impl/alarms_and_conditions/ua_exclusive_deviation_alarm_impl.js.map +1 -0
  284. package/dist/impl/alarms_and_conditions/ua_exclusive_level_alarm_impl.d.ts +12 -0
  285. package/dist/impl/alarms_and_conditions/ua_exclusive_level_alarm_impl.js +13 -0
  286. package/dist/impl/alarms_and_conditions/ua_exclusive_level_alarm_impl.js.map +1 -0
  287. package/dist/impl/alarms_and_conditions/ua_exclusive_limit_alarm_impl.d.ts +28 -0
  288. package/dist/impl/alarms_and_conditions/ua_exclusive_limit_alarm_impl.js +86 -0
  289. package/dist/impl/alarms_and_conditions/ua_exclusive_limit_alarm_impl.js.map +1 -0
  290. package/dist/impl/alarms_and_conditions/ua_exclusive_rate_of_change_alarm_impl.d.ts +10 -0
  291. package/dist/impl/alarms_and_conditions/ua_exclusive_rate_of_change_alarm_impl.js +8 -0
  292. package/dist/impl/alarms_and_conditions/ua_exclusive_rate_of_change_alarm_impl.js.map +1 -0
  293. package/dist/impl/alarms_and_conditions/ua_limit_alarm_impl.d.ts +49 -0
  294. package/dist/impl/alarms_and_conditions/ua_limit_alarm_impl.js +207 -0
  295. package/dist/impl/alarms_and_conditions/ua_limit_alarm_impl.js.map +1 -0
  296. package/dist/impl/alarms_and_conditions/ua_non_exclusive_deviation_alarm_impl.d.ts +28 -0
  297. package/dist/impl/alarms_and_conditions/ua_non_exclusive_deviation_alarm_impl.js +54 -0
  298. package/dist/impl/alarms_and_conditions/ua_non_exclusive_deviation_alarm_impl.js.map +1 -0
  299. package/dist/impl/alarms_and_conditions/ua_non_exclusive_limit_alarm_impl.d.ts +38 -0
  300. package/dist/impl/alarms_and_conditions/ua_non_exclusive_limit_alarm_impl.js +172 -0
  301. package/dist/impl/alarms_and_conditions/ua_non_exclusive_limit_alarm_impl.js.map +1 -0
  302. package/dist/impl/alarms_and_conditions/ua_off_normal_alarm_impl.d.ts +44 -0
  303. package/dist/impl/alarms_and_conditions/ua_off_normal_alarm_impl.js +164 -0
  304. package/dist/impl/alarms_and_conditions/ua_off_normal_alarm_impl.js.map +1 -0
  305. package/dist/impl/alarms_and_conditions/ua_system_off_normal_alarm_impl.d.ts +18 -0
  306. package/dist/impl/alarms_and_conditions/ua_system_off_normal_alarm_impl.js +18 -0
  307. package/dist/impl/alarms_and_conditions/ua_system_off_normal_alarm_impl.js.map +1 -0
  308. package/dist/impl/apply_condition_refresh.d.ts +4 -0
  309. package/dist/impl/apply_condition_refresh.js +29 -0
  310. package/dist/impl/apply_condition_refresh.js.map +1 -0
  311. package/dist/impl/base_node_impl.d.ts +347 -0
  312. package/dist/impl/base_node_impl.js +1768 -0
  313. package/dist/impl/base_node_impl.js.map +1 -0
  314. package/dist/impl/base_node_private.d.ts +138 -0
  315. package/dist/impl/base_node_private.js +1028 -0
  316. package/dist/impl/base_node_private.js.map +1 -0
  317. package/dist/impl/check_value_rank_compatibility.js.map +1 -0
  318. package/dist/impl/child_accessors.d.ts +43 -0
  319. package/dist/impl/child_accessors.js +222 -0
  320. package/dist/impl/child_accessors.js.map +1 -0
  321. package/dist/impl/data_access/add_dataItem_stuff.js.map +1 -0
  322. package/dist/impl/data_access/adjust_datavalue_status_code.d.ts +7 -0
  323. package/dist/impl/data_access/adjust_datavalue_status_code.js.map +1 -0
  324. package/dist/impl/data_access/ua_multistate_discrete_impl.d.ts +38 -0
  325. package/dist/impl/data_access/ua_multistate_discrete_impl.js +143 -0
  326. package/dist/impl/data_access/ua_multistate_discrete_impl.js.map +1 -0
  327. package/dist/impl/data_access/ua_multistate_value_discrete_impl.d.ts +61 -0
  328. package/dist/impl/data_access/ua_multistate_value_discrete_impl.js +303 -0
  329. package/dist/impl/data_access/ua_multistate_value_discrete_impl.js.map +1 -0
  330. package/dist/impl/data_access/ua_two_state_discrete_impl.d.ts +30 -0
  331. package/dist/impl/data_access/ua_two_state_discrete_impl.js +164 -0
  332. package/dist/impl/data_access/ua_two_state_discrete_impl.js.map +1 -0
  333. package/dist/impl/event_data.d.ts +27 -0
  334. package/dist/impl/event_data.js +73 -0
  335. package/dist/impl/event_data.js.map +1 -0
  336. package/dist/impl/event_layout.d.ts +40 -0
  337. package/dist/impl/event_layout.js +103 -0
  338. package/dist/impl/event_layout.js.map +1 -0
  339. package/dist/impl/extension_object_array_node.d.ts +41 -0
  340. package/dist/impl/extension_object_array_node.js +274 -0
  341. package/dist/impl/extension_object_array_node.js.map +1 -0
  342. package/dist/impl/get_basic_datatype.js.map +1 -0
  343. package/dist/impl/handle_hierarchy_parent.d.ts +33 -0
  344. package/dist/impl/handle_hierarchy_parent.js +103 -0
  345. package/dist/impl/handle_hierarchy_parent.js.map +1 -0
  346. package/dist/impl/historical_access/address_space_historical_data_node.d.ts +21 -0
  347. package/dist/impl/historical_access/address_space_historical_data_node.js +658 -0
  348. package/dist/impl/historical_access/address_space_historical_data_node.js.map +1 -0
  349. package/dist/impl/historizer_factory.d.ts +18 -0
  350. package/dist/impl/historizer_factory.js +16 -0
  351. package/dist/impl/historizer_factory.js.map +1 -0
  352. package/dist/impl/idx_iterator.js.map +1 -0
  353. package/dist/impl/namespace_impl.d.ts +469 -0
  354. package/dist/impl/namespace_impl.js +1845 -0
  355. package/dist/impl/namespace_impl.js.map +1 -0
  356. package/dist/impl/namespace_private.d.ts +25 -0
  357. package/dist/impl/namespace_private.js.map +1 -0
  358. package/dist/impl/nodeid_manager.js +249 -0
  359. package/dist/impl/nodeid_manager.js.map +1 -0
  360. package/dist/impl/nodeset_tools/adjust_namespace_array.js.map +1 -0
  361. package/dist/impl/nodeset_tools/construct_namespace_dependency.d.ts +37 -0
  362. package/dist/impl/nodeset_tools/construct_namespace_dependency.js +352 -0
  363. package/dist/impl/nodeset_tools/construct_namespace_dependency.js.map +1 -0
  364. package/dist/impl/nodeset_tools/dump_to_bsd.d.ts +10 -0
  365. package/dist/impl/nodeset_tools/dump_to_bsd.js +176 -0
  366. package/dist/impl/nodeset_tools/dump_to_bsd.js.map +1 -0
  367. package/dist/impl/nodeset_tools/nodeset_to_records.d.ts +67 -0
  368. package/dist/impl/nodeset_tools/nodeset_to_records.js +773 -0
  369. package/dist/impl/nodeset_tools/nodeset_to_records.js.map +1 -0
  370. package/dist/impl/nodeset_tools/nodeset_to_xml.d.ts +28 -0
  371. package/dist/impl/nodeset_tools/nodeset_to_xml.js +1132 -0
  372. package/dist/impl/nodeset_tools/nodeset_to_xml.js.map +1 -0
  373. package/dist/impl/private_namespace.d.ts +5 -0
  374. package/dist/impl/private_namespace.js.map +1 -0
  375. package/dist/impl/reference_impl.d.ts +82 -0
  376. package/dist/impl/reference_impl.js +207 -0
  377. package/dist/impl/reference_impl.js.map +1 -0
  378. package/dist/impl/reference_type_version.d.ts +22 -0
  379. package/dist/impl/reference_type_version.js +22 -0
  380. package/dist/impl/reference_type_version.js.map +1 -0
  381. package/dist/impl/role_permissions.js.map +1 -0
  382. package/dist/impl/state_machine/finite_state_machine.d.ts +81 -0
  383. package/dist/impl/state_machine/finite_state_machine.js +573 -0
  384. package/dist/impl/state_machine/finite_state_machine.js.map +1 -0
  385. package/dist/impl/state_machine/ua_shelving_state_machine_ex.d.ts +64 -0
  386. package/dist/impl/state_machine/ua_shelving_state_machine_ex.js +249 -0
  387. package/dist/impl/state_machine/ua_shelving_state_machine_ex.js.map +1 -0
  388. package/dist/impl/state_machine/ua_two_state_variable.d.ts +55 -0
  389. package/dist/impl/state_machine/ua_two_state_variable.js +323 -0
  390. package/dist/impl/state_machine/ua_two_state_variable.js.map +1 -0
  391. package/dist/impl/tool_isSubtypeOf.d.ts +18 -0
  392. package/dist/impl/tool_isSubtypeOf.js +138 -0
  393. package/dist/impl/tool_isSubtypeOf.js.map +1 -0
  394. package/dist/impl/ua_condition_type.js.map +1 -0
  395. package/dist/impl/ua_data_type_impl.d.ts +87 -0
  396. package/dist/impl/ua_data_type_impl.js +391 -0
  397. package/dist/impl/ua_data_type_impl.js.map +1 -0
  398. package/dist/impl/ua_method_impl.d.ts +48 -0
  399. package/dist/impl/ua_method_impl.js +281 -0
  400. package/dist/impl/ua_method_impl.js.map +1 -0
  401. package/dist/impl/ua_object_impl.d.ts +38 -0
  402. package/dist/impl/ua_object_impl.js +214 -0
  403. package/dist/impl/ua_object_impl.js.map +1 -0
  404. package/dist/impl/ua_object_type_impl.d.ts +55 -0
  405. package/dist/impl/ua_object_type_impl.js +131 -0
  406. package/dist/impl/ua_object_type_impl.js.map +1 -0
  407. package/dist/impl/ua_reference_type_impl.d.ts +42 -0
  408. package/dist/impl/ua_reference_type_impl.js +157 -0
  409. package/dist/impl/ua_reference_type_impl.js.map +1 -0
  410. package/dist/impl/ua_variable_impl.d.ts +391 -0
  411. package/dist/impl/ua_variable_impl.js +2001 -0
  412. package/dist/impl/ua_variable_impl.js.map +1 -0
  413. package/dist/impl/ua_variable_impl_ext_obj.d.ts +23 -0
  414. package/dist/impl/ua_variable_impl_ext_obj.js +753 -0
  415. package/dist/impl/ua_variable_impl_ext_obj.js.map +1 -0
  416. package/dist/impl/ua_variable_type_impl.d.ts +79 -0
  417. package/dist/impl/ua_variable_type_impl.js +279 -0
  418. package/dist/impl/ua_variable_type_impl.js.map +1 -0
  419. package/dist/impl/ua_view_impl.d.ts +18 -0
  420. package/dist/impl/ua_view_impl.js +45 -0
  421. package/dist/impl/ua_view_impl.js.map +1 -0
  422. package/dist/impl/validate_data_type_correctness.d.ts +6 -0
  423. package/dist/impl/validate_data_type_correctness.js +123 -0
  424. package/dist/impl/validate_data_type_correctness.js.map +1 -0
  425. package/dist/tsconfig_base.tsbuildinfo +1 -1
  426. package/distHelpers/address_space_digest.d.ts +4 -0
  427. package/distHelpers/address_space_digest.js +9 -0
  428. package/distHelpers/address_space_digest.js.map +1 -0
  429. package/distHelpers/alarms_and_conditions_demo.d.ts +1 -1
  430. package/distHelpers/assertHasMatchingReference.d.ts +1 -1
  431. package/distHelpers/boiler_system.d.ts +1 -1
  432. package/distHelpers/boiler_system.js +3 -3
  433. package/distHelpers/boiler_system.js.map +1 -1
  434. package/distHelpers/create_minimalist_address_space_nodeset.d.ts +1 -1
  435. package/distHelpers/get_address_space_fixture.js +38 -22
  436. package/distHelpers/get_address_space_fixture.js.map +1 -1
  437. package/distHelpers/get_mini_address_space.d.ts +1 -1
  438. package/distHelpers/get_mini_address_space.js +7 -7
  439. package/distHelpers/get_mini_address_space.js.map +1 -1
  440. package/distHelpers/index.d.ts +9 -9
  441. package/distHelpers/index.js +9 -9
  442. package/distHelpers/index.js.map +1 -1
  443. package/distHelpers/mock_session.d.ts +1 -1
  444. package/distHelpers/mock_session.js +2 -2
  445. package/distHelpers/mock_session.js.map +1 -1
  446. package/distNodeJS/address_space_digest.d.ts +13 -0
  447. package/distNodeJS/address_space_digest.js +31 -0
  448. package/distNodeJS/address_space_digest.js.map +1 -0
  449. package/distNodeJS/generate_address_space.d.ts +35 -2
  450. package/distNodeJS/generate_address_space.js +201 -7
  451. package/distNodeJS/generate_address_space.js.map +1 -1
  452. package/distNodeJS/index.d.ts +3 -1
  453. package/distNodeJS/index.js +3 -1
  454. package/distNodeJS/index.js.map +1 -1
  455. package/distNodeJS/nodeset_image_file_store.d.ts +29 -0
  456. package/distNodeJS/nodeset_image_file_store.js +120 -0
  457. package/distNodeJS/nodeset_image_file_store.js.map +1 -0
  458. package/impl/_instantiate_helpers.ts +197 -0
  459. package/impl/_mandatory_child_or_requested_optional_filter.ts +100 -0
  460. package/impl/address_space.ts +1572 -0
  461. package/impl/address_space_change_event_tools.ts +177 -0
  462. package/impl/address_space_private.ts +100 -0
  463. package/impl/alarms_and_conditions/condition_info_impl.ts +45 -0
  464. package/impl/alarms_and_conditions/condition_snapshot_impl.ts +793 -0
  465. package/impl/alarms_and_conditions/deviation_alarm_helper.ts +73 -0
  466. package/impl/alarms_and_conditions/index.ts +16 -0
  467. package/impl/alarms_and_conditions/ua_acknowledgeable_condition_impl.ts +351 -0
  468. package/impl/alarms_and_conditions/ua_alarm_condition_impl.ts +515 -0
  469. package/impl/alarms_and_conditions/ua_base_event_impl.ts +61 -0
  470. package/impl/alarms_and_conditions/ua_certificate_expiration_alarm_impl.ts +246 -0
  471. package/impl/alarms_and_conditions/ua_condition_impl.ts +1286 -0
  472. package/impl/alarms_and_conditions/ua_discrete_alarm_impl.ts +60 -0
  473. package/impl/alarms_and_conditions/ua_exclusive_deviation_alarm_impl.ts +95 -0
  474. package/impl/alarms_and_conditions/ua_exclusive_level_alarm_impl.ts +21 -0
  475. package/impl/alarms_and_conditions/ua_exclusive_limit_alarm_impl.ts +112 -0
  476. package/impl/alarms_and_conditions/ua_exclusive_rate_of_change_alarm_impl.ts +25 -0
  477. package/impl/alarms_and_conditions/ua_limit_alarm_impl.ts +265 -0
  478. package/impl/alarms_and_conditions/ua_non_exclusive_deviation_alarm_impl.ts +94 -0
  479. package/impl/alarms_and_conditions/ua_non_exclusive_limit_alarm_impl.ts +232 -0
  480. package/impl/alarms_and_conditions/ua_off_normal_alarm_impl.ts +216 -0
  481. package/impl/alarms_and_conditions/ua_system_off_normal_alarm_impl.ts +26 -0
  482. package/impl/apply_condition_refresh.ts +56 -0
  483. package/impl/base_node_impl.ts +2165 -0
  484. package/impl/base_node_private.ts +1420 -0
  485. package/impl/child_accessors.ts +239 -0
  486. package/impl/data_access/adjust_datavalue_status_code.ts +36 -0
  487. package/impl/data_access/ua_multistate_discrete_impl.ts +198 -0
  488. package/impl/data_access/ua_multistate_value_discrete_impl.ts +384 -0
  489. package/impl/data_access/ua_two_state_discrete_impl.ts +195 -0
  490. package/impl/event_data.ts +80 -0
  491. package/impl/event_layout.ts +141 -0
  492. package/impl/extension_object_array_node.ts +343 -0
  493. package/impl/handle_hierarchy_parent.ts +133 -0
  494. package/impl/historical_access/address_space_historical_data_node.ts +849 -0
  495. package/impl/historizer_factory.ts +17 -0
  496. package/impl/namespace_impl.ts +2323 -0
  497. package/impl/namespace_private.ts +68 -0
  498. package/impl/nodeid_manager.ts +293 -0
  499. package/impl/nodeset_tools/construct_namespace_dependency.ts +381 -0
  500. package/impl/nodeset_tools/dump_to_bsd.ts +210 -0
  501. package/impl/nodeset_tools/nodeset_to_records.ts +846 -0
  502. package/impl/nodeset_tools/nodeset_to_xml.ts +1326 -0
  503. package/impl/private_namespace.ts +21 -0
  504. package/impl/reference_impl.ts +244 -0
  505. package/impl/reference_type_version.ts +19 -0
  506. package/impl/state_machine/finite_state_machine.ts +676 -0
  507. package/impl/state_machine/ua_shelving_state_machine_ex.ts +356 -0
  508. package/impl/state_machine/ua_two_state_variable.ts +421 -0
  509. package/impl/tool_isSubtypeOf.ts +168 -0
  510. package/impl/ua_data_type_impl.ts +486 -0
  511. package/impl/ua_method_impl.ts +364 -0
  512. package/impl/ua_object_impl.ts +278 -0
  513. package/impl/ua_object_type_impl.ts +179 -0
  514. package/impl/ua_reference_type_impl.ts +179 -0
  515. package/impl/ua_variable_impl.ts +2559 -0
  516. package/impl/ua_variable_impl_ext_obj.ts +904 -0
  517. package/impl/ua_variable_type_impl.ts +390 -0
  518. package/impl/ua_view_impl.ts +53 -0
  519. package/impl/validate_data_type_correctness.ts +142 -0
  520. package/package.json +49 -44
  521. package/source_nodejs/address_space_digest.ts +35 -0
  522. package/source_nodejs/generate_address_space.ts +181 -8
  523. package/source_nodejs/index.ts +3 -1
  524. package/source_nodejs/nodeset_image_file_store.ts +127 -0
  525. package/dist/source/address_space_ts.d.ts +0 -128
  526. package/dist/source/address_space_ts.js +0 -23
  527. package/dist/source/address_space_ts.js.map +0 -1
  528. package/dist/source/continuation_points/continuation_point_manager.js +0 -230
  529. package/dist/source/continuation_points/continuation_point_manager.js.map +0 -1
  530. package/dist/source/helpers/adjust_browse_direction.js.map +0 -1
  531. package/dist/source/helpers/argument_list.js +0 -263
  532. package/dist/source/helpers/argument_list.js.map +0 -1
  533. package/dist/source/helpers/call_helpers.js +0 -80
  534. package/dist/source/helpers/call_helpers.js.map +0 -1
  535. package/dist/source/helpers/coerce_enum_value.d.ts +0 -6
  536. package/dist/source/helpers/coerce_enum_value.js.map +0 -1
  537. package/dist/source/helpers/dump_tools.js +0 -81
  538. package/dist/source/helpers/dump_tools.js.map +0 -1
  539. package/dist/source/helpers/ensure_secure_access.d.ts +0 -9
  540. package/dist/source/helpers/ensure_secure_access.js +0 -58
  541. package/dist/source/helpers/ensure_secure_access.js.map +0 -1
  542. package/dist/source/helpers/make_optionals_map.js.map +0 -1
  543. package/dist/source/helpers/multiform_func.js +0 -75
  544. package/dist/source/helpers/multiform_func.js.map +0 -1
  545. package/dist/source/helpers/resolve_opaque_on_address_space.js +0 -25
  546. package/dist/source/helpers/resolve_opaque_on_address_space.js.map +0 -1
  547. package/dist/source/index.d.ts +0 -66
  548. package/dist/source/index.js +0 -97
  549. package/dist/source/index.js.map +0 -1
  550. package/dist/source/interfaces/alarms_and_conditions/condition_info_i.d.ts +0 -21
  551. package/dist/source/interfaces/alarms_and_conditions/condition_info_i.js +0 -3
  552. package/dist/source/interfaces/alarms_and_conditions/condition_info_i.js.map +0 -1
  553. package/dist/source/interfaces/alarms_and_conditions/condition_snapshot.d.ts +0 -150
  554. package/dist/source/interfaces/alarms_and_conditions/condition_snapshot.js.map +0 -1
  555. package/dist/source/interfaces/alarms_and_conditions/deviation_stuff.d.ts +0 -12
  556. package/dist/source/interfaces/alarms_and_conditions/deviation_stuff.js.map +0 -1
  557. package/dist/source/interfaces/alarms_and_conditions/install_setpoint_options.js.map +0 -1
  558. package/dist/source/interfaces/alarms_and_conditions/instantiate_alarm_condition_options.d.ts +0 -7
  559. package/dist/source/interfaces/alarms_and_conditions/instantiate_alarm_condition_options.js.map +0 -1
  560. package/dist/source/interfaces/alarms_and_conditions/instantiate_condition_options.js.map +0 -1
  561. package/dist/source/interfaces/alarms_and_conditions/instantiate_exclusive_deviation_alarm_options.d.ts +0 -4
  562. package/dist/source/interfaces/alarms_and_conditions/instantiate_exclusive_deviation_alarm_options.js.map +0 -1
  563. package/dist/source/interfaces/alarms_and_conditions/instantiate_exclusive_limit_alarm_options.d.ts +0 -4
  564. package/dist/source/interfaces/alarms_and_conditions/instantiate_exclusive_limit_alarm_options.js.map +0 -1
  565. package/dist/source/interfaces/alarms_and_conditions/instantiate_limit_alarm_options.d.ts +0 -10
  566. package/dist/source/interfaces/alarms_and_conditions/instantiate_limit_alarm_options.js.map +0 -1
  567. package/dist/source/interfaces/alarms_and_conditions/instantiate_non_exclusive_deviation_alarm_options.d.ts +0 -4
  568. package/dist/source/interfaces/alarms_and_conditions/instantiate_non_exclusive_deviation_alarm_options.js.map +0 -1
  569. package/dist/source/interfaces/alarms_and_conditions/instantiate_non_exclusive_limit_alarm_options.d.ts +0 -4
  570. package/dist/source/interfaces/alarms_and_conditions/instantiate_non_exclusive_limit_alarm_options.js.map +0 -1
  571. package/dist/source/interfaces/alarms_and_conditions/instantiate_off_normal_alarm_options.d.ts +0 -20
  572. package/dist/source/interfaces/alarms_and_conditions/instantiate_off_normal_alarm_options.js.map +0 -1
  573. package/dist/source/interfaces/alarms_and_conditions/ua_acknowledgeable_condition_ex.d.ts +0 -21
  574. package/dist/source/interfaces/alarms_and_conditions/ua_acknowledgeable_condition_ex.js.map +0 -1
  575. package/dist/source/interfaces/alarms_and_conditions/ua_alarm_condition_ex.d.ts +0 -33
  576. package/dist/source/interfaces/alarms_and_conditions/ua_alarm_condition_ex.js.map +0 -1
  577. package/dist/source/interfaces/alarms_and_conditions/ua_base_event_ex.js.map +0 -1
  578. package/dist/source/interfaces/alarms_and_conditions/ua_certificate_expiration_alarm_ex.d.ts +0 -19
  579. package/dist/source/interfaces/alarms_and_conditions/ua_certificate_expiration_alarm_ex.js.map +0 -1
  580. package/dist/source/interfaces/alarms_and_conditions/ua_condition_ex.d.ts +0 -44
  581. package/dist/source/interfaces/alarms_and_conditions/ua_condition_ex.js.map +0 -1
  582. package/dist/source/interfaces/alarms_and_conditions/ua_discrete_alarm_ex.d.ts +0 -4
  583. package/dist/source/interfaces/alarms_and_conditions/ua_discrete_alarm_ex.js.map +0 -1
  584. package/dist/source/interfaces/alarms_and_conditions/ua_exclusive_deviation_alarm_ex.d.ts +0 -5
  585. package/dist/source/interfaces/alarms_and_conditions/ua_exclusive_deviation_alarm_ex.js.map +0 -1
  586. package/dist/source/interfaces/alarms_and_conditions/ua_exclusive_limit_alarm_ex.d.ts +0 -19
  587. package/dist/source/interfaces/alarms_and_conditions/ua_exclusive_limit_alarm_ex.js.map +0 -1
  588. package/dist/source/interfaces/alarms_and_conditions/ua_limit_alarm_ex.d.ts +0 -25
  589. package/dist/source/interfaces/alarms_and_conditions/ua_limit_alarm_ex.js.map +0 -1
  590. package/dist/source/interfaces/alarms_and_conditions/ua_non_exclusive_deviation_alarm_ex.d.ts +0 -8
  591. package/dist/source/interfaces/alarms_and_conditions/ua_non_exclusive_deviation_alarm_ex.js.map +0 -1
  592. package/dist/source/interfaces/alarms_and_conditions/ua_non_exclusive_limit_alarm_ex.d.ts +0 -10
  593. package/dist/source/interfaces/alarms_and_conditions/ua_non_exclusive_limit_alarm_ex.js.map +0 -1
  594. package/dist/source/interfaces/data_access/ua_multistate_discrete_ex.d.ts +0 -44
  595. package/dist/source/interfaces/data_access/ua_multistate_discrete_ex.js.map +0 -1
  596. package/dist/source/interfaces/data_access/ua_multistate_value_discrete_ex.d.ts +0 -22
  597. package/dist/source/interfaces/data_access/ua_multistate_value_discrete_ex.js.map +0 -1
  598. package/dist/source/interfaces/data_access/ua_two_state_discrete_ex.d.ts +0 -13
  599. package/dist/source/interfaces/data_access/ua_two_state_discrete_ex.js.map +0 -1
  600. package/dist/source/interfaces/data_access/ua_y_array_item_ex.js.map +0 -1
  601. package/dist/source/interfaces/extension_object_constructor.js.map +0 -1
  602. package/dist/source/interfaces/i_condition_variable_type_setter_options.js.map +0 -1
  603. package/dist/source/interfaces/i_set_state_options.js.map +0 -1
  604. package/dist/source/interfaces/nodeset_loader_options.d.ts +0 -37
  605. package/dist/source/interfaces/nodeset_loader_options.js.map +0 -1
  606. package/dist/source/interfaces/state_machine/ua_exclusive_limit_state_machine_type_ex.d.ts +0 -12
  607. package/dist/source/interfaces/state_machine/ua_exclusive_limit_state_machine_type_ex.js.map +0 -1
  608. package/dist/source/interfaces/state_machine/ua_finite_state_machine_type.d.ts +0 -49
  609. package/dist/source/interfaces/state_machine/ua_finite_state_machine_type.js.map +0 -1
  610. package/dist/source/interfaces/state_machine/ua_program_state_machine_type.d.ts +0 -11
  611. package/dist/source/interfaces/state_machine/ua_program_state_machine_type.js.map +0 -1
  612. package/dist/source/interfaces/state_machine/ua_shelved_state_machine_ex.d.ts +0 -29
  613. package/dist/source/interfaces/state_machine/ua_shelved_state_machine_ex.js.map +0 -1
  614. package/dist/source/interfaces/state_machine/ua_state_machine_type.d.ts +0 -236
  615. package/dist/source/interfaces/state_machine/ua_state_machine_type.js.map +0 -1
  616. package/dist/source/interfaces/state_machine/ua_transition_ex.js.map +0 -1
  617. package/dist/source/interfaces/ua_subscription_diagnostics_variable_ex.js.map +0 -1
  618. package/dist/source/loader/decode_xml_extension_object.d.ts +0 -6
  619. package/dist/source/loader/decode_xml_extension_object.js +0 -69
  620. package/dist/source/loader/decode_xml_extension_object.js.map +0 -1
  621. package/dist/source/loader/ensure_datatype_extracted.js +0 -88
  622. package/dist/source/loader/ensure_datatype_extracted.js.map +0 -1
  623. package/dist/source/loader/generateAddressSpaceRaw.d.ts +0 -29
  624. package/dist/source/loader/generateAddressSpaceRaw.js +0 -188
  625. package/dist/source/loader/generateAddressSpaceRaw.js.map +0 -1
  626. package/dist/source/loader/load_nodeset2.d.ts +0 -15
  627. package/dist/source/loader/load_nodeset2.js +0 -1047
  628. package/dist/source/loader/load_nodeset2.js.map +0 -1
  629. package/dist/source/loader/make_semver_compatible.js.map +0 -1
  630. package/dist/source/loader/make_xml_extension_object_parser.js +0 -422
  631. package/dist/source/loader/make_xml_extension_object_parser.js.map +0 -1
  632. package/dist/source/loader/namespace_post_step.js +0 -57
  633. package/dist/source/loader/namespace_post_step.js.map +0 -1
  634. package/dist/source/loader/parsers/extension_object_parser.js +0 -274
  635. package/dist/source/loader/parsers/extension_object_parser.js.map +0 -1
  636. package/dist/source/loader/parsers/localized_text_parser.js.map +0 -1
  637. package/dist/source/loader/parsers/nodeid_parser.js.map +0 -1
  638. package/dist/source/loader/parsers/qualified_name_parser.js.map +0 -1
  639. package/dist/source/loader/parsers/variant_parser.d.ts +0 -35
  640. package/dist/source/loader/parsers/variant_parser.js +0 -331
  641. package/dist/source/loader/parsers/variant_parser.js.map +0 -1
  642. package/dist/source/loader/register_node_promoter.d.ts +0 -2
  643. package/dist/source/loader/register_node_promoter.js +0 -9
  644. package/dist/source/loader/register_node_promoter.js.map +0 -1
  645. package/dist/source/namespace.d.ts +0 -6
  646. package/dist/source/namespace.js.map +0 -1
  647. package/dist/source/namespace_alarm_and_condition.d.ts +0 -33
  648. package/dist/source/namespace_alarm_and_condition.js.map +0 -1
  649. package/dist/source/namespace_data_access.d.ts +0 -67
  650. package/dist/source/namespace_data_access.js.map +0 -1
  651. package/dist/source/namespace_machine_state.d.ts +0 -8
  652. package/dist/source/namespace_machine_state.js.map +0 -1
  653. package/dist/source/pseudo_session.d.ts +0 -74
  654. package/dist/source/pseudo_session.js +0 -308
  655. package/dist/source/pseudo_session.js.map +0 -1
  656. package/dist/source/session_context.d.ts +0 -241
  657. package/dist/source/session_context.js.map +0 -1
  658. package/dist/source/set_namespace_meta_data.js.map +0 -1
  659. package/dist/source/ua_addin.js.map +0 -1
  660. package/dist/source/ua_interface.js +0 -25
  661. package/dist/source/ua_interface.js.map +0 -1
  662. package/dist/source/ua_root_folder.js.map +0 -1
  663. package/dist/source/ua_two_state_variable_ex.d.ts +0 -24
  664. package/dist/source/ua_two_state_variable_ex.js.map +0 -1
  665. package/dist/source/xml_writer.js.map +0 -1
  666. package/dist/src/_instantiate_helpers.js +0 -99
  667. package/dist/src/_instantiate_helpers.js.map +0 -1
  668. package/dist/src/_mandatory_child_or_requested_optional_filter.js +0 -82
  669. package/dist/src/_mandatory_child_or_requested_optional_filter.js.map +0 -1
  670. package/dist/src/address_space.d.ts +0 -369
  671. package/dist/src/address_space.js +0 -1416
  672. package/dist/src/address_space.js.map +0 -1
  673. package/dist/src/address_space_change_event_tools.d.ts +0 -6
  674. package/dist/src/address_space_change_event_tools.js.map +0 -1
  675. package/dist/src/address_space_private.d.ts +0 -45
  676. package/dist/src/address_space_private.js.map +0 -1
  677. package/dist/src/alarms_and_conditions/condition.js.map +0 -1
  678. package/dist/src/alarms_and_conditions/condition_info_impl.d.ts +0 -18
  679. package/dist/src/alarms_and_conditions/condition_info_impl.js +0 -38
  680. package/dist/src/alarms_and_conditions/condition_info_impl.js.map +0 -1
  681. package/dist/src/alarms_and_conditions/condition_snapshot_impl.d.ts +0 -269
  682. package/dist/src/alarms_and_conditions/condition_snapshot_impl.js +0 -699
  683. package/dist/src/alarms_and_conditions/condition_snapshot_impl.js.map +0 -1
  684. package/dist/src/alarms_and_conditions/deviation_alarm_helper.d.ts +0 -12
  685. package/dist/src/alarms_and_conditions/deviation_alarm_helper.js +0 -66
  686. package/dist/src/alarms_and_conditions/deviation_alarm_helper.js.map +0 -1
  687. package/dist/src/alarms_and_conditions/index.d.ts +0 -16
  688. package/dist/src/alarms_and_conditions/index.js +0 -33
  689. package/dist/src/alarms_and_conditions/index.js.map +0 -1
  690. package/dist/src/alarms_and_conditions/ua_acknowledgeable_condition_impl.d.ts +0 -42
  691. package/dist/src/alarms_and_conditions/ua_acknowledgeable_condition_impl.js +0 -243
  692. package/dist/src/alarms_and_conditions/ua_acknowledgeable_condition_impl.js.map +0 -1
  693. package/dist/src/alarms_and_conditions/ua_alarm_condition_impl.d.ts +0 -80
  694. package/dist/src/alarms_and_conditions/ua_alarm_condition_impl.js +0 -415
  695. package/dist/src/alarms_and_conditions/ua_alarm_condition_impl.js.map +0 -1
  696. package/dist/src/alarms_and_conditions/ua_base_event_impl.d.ts +0 -18
  697. package/dist/src/alarms_and_conditions/ua_base_event_impl.js +0 -33
  698. package/dist/src/alarms_and_conditions/ua_base_event_impl.js.map +0 -1
  699. package/dist/src/alarms_and_conditions/ua_certificate_expiration_alarm_impl.d.ts +0 -44
  700. package/dist/src/alarms_and_conditions/ua_certificate_expiration_alarm_impl.js +0 -203
  701. package/dist/src/alarms_and_conditions/ua_certificate_expiration_alarm_impl.js.map +0 -1
  702. package/dist/src/alarms_and_conditions/ua_condition_impl.d.ts +0 -104
  703. package/dist/src/alarms_and_conditions/ua_condition_impl.js +0 -1017
  704. package/dist/src/alarms_and_conditions/ua_condition_impl.js.map +0 -1
  705. package/dist/src/alarms_and_conditions/ua_discrete_alarm_impl.d.ts +0 -19
  706. package/dist/src/alarms_and_conditions/ua_discrete_alarm_impl.js +0 -39
  707. package/dist/src/alarms_and_conditions/ua_discrete_alarm_impl.js.map +0 -1
  708. package/dist/src/alarms_and_conditions/ua_exclusive_deviation_alarm_impl.d.ts +0 -25
  709. package/dist/src/alarms_and_conditions/ua_exclusive_deviation_alarm_impl.js +0 -55
  710. package/dist/src/alarms_and_conditions/ua_exclusive_deviation_alarm_impl.js.map +0 -1
  711. package/dist/src/alarms_and_conditions/ua_exclusive_level_alarm_impl.d.ts +0 -11
  712. package/dist/src/alarms_and_conditions/ua_exclusive_level_alarm_impl.js +0 -12
  713. package/dist/src/alarms_and_conditions/ua_exclusive_level_alarm_impl.js.map +0 -1
  714. package/dist/src/alarms_and_conditions/ua_exclusive_limit_alarm_impl.d.ts +0 -23
  715. package/dist/src/alarms_and_conditions/ua_exclusive_limit_alarm_impl.js +0 -87
  716. package/dist/src/alarms_and_conditions/ua_exclusive_limit_alarm_impl.js.map +0 -1
  717. package/dist/src/alarms_and_conditions/ua_exclusive_rate_of_change_alarm_impl.d.ts +0 -10
  718. package/dist/src/alarms_and_conditions/ua_exclusive_rate_of_change_alarm_impl.js +0 -8
  719. package/dist/src/alarms_and_conditions/ua_exclusive_rate_of_change_alarm_impl.js.map +0 -1
  720. package/dist/src/alarms_and_conditions/ua_limit_alarm_impl.d.ts +0 -26
  721. package/dist/src/alarms_and_conditions/ua_limit_alarm_impl.js +0 -208
  722. package/dist/src/alarms_and_conditions/ua_limit_alarm_impl.js.map +0 -1
  723. package/dist/src/alarms_and_conditions/ua_non_exclusive_deviation_alarm_impl.d.ts +0 -23
  724. package/dist/src/alarms_and_conditions/ua_non_exclusive_deviation_alarm_impl.js +0 -55
  725. package/dist/src/alarms_and_conditions/ua_non_exclusive_deviation_alarm_impl.js.map +0 -1
  726. package/dist/src/alarms_and_conditions/ua_non_exclusive_limit_alarm_impl.d.ts +0 -27
  727. package/dist/src/alarms_and_conditions/ua_non_exclusive_limit_alarm_impl.js +0 -173
  728. package/dist/src/alarms_and_conditions/ua_non_exclusive_limit_alarm_impl.js.map +0 -1
  729. package/dist/src/alarms_and_conditions/ua_off_normal_alarm_impl.d.ts +0 -43
  730. package/dist/src/alarms_and_conditions/ua_off_normal_alarm_impl.js +0 -168
  731. package/dist/src/alarms_and_conditions/ua_off_normal_alarm_impl.js.map +0 -1
  732. package/dist/src/alarms_and_conditions/ua_system_off_normal_alarm_impl.d.ts +0 -18
  733. package/dist/src/alarms_and_conditions/ua_system_off_normal_alarm_impl.js +0 -18
  734. package/dist/src/alarms_and_conditions/ua_system_off_normal_alarm_impl.js.map +0 -1
  735. package/dist/src/apply_condition_refresh.d.ts +0 -4
  736. package/dist/src/apply_condition_refresh.js +0 -27
  737. package/dist/src/apply_condition_refresh.js.map +0 -1
  738. package/dist/src/base_node_impl.d.ts +0 -287
  739. package/dist/src/base_node_impl.js +0 -1538
  740. package/dist/src/base_node_impl.js.map +0 -1
  741. package/dist/src/base_node_private.d.ts +0 -87
  742. package/dist/src/base_node_private.js +0 -925
  743. package/dist/src/base_node_private.js.map +0 -1
  744. package/dist/src/check_value_rank_compatibility.js.map +0 -1
  745. package/dist/src/data_access/add_dataItem_stuff.js.map +0 -1
  746. package/dist/src/data_access/adjust_datavalue_status_code.d.ts +0 -7
  747. package/dist/src/data_access/adjust_datavalue_status_code.js.map +0 -1
  748. package/dist/src/data_access/ua_multistate_discrete_impl.d.ts +0 -35
  749. package/dist/src/data_access/ua_multistate_discrete_impl.js +0 -142
  750. package/dist/src/data_access/ua_multistate_discrete_impl.js.map +0 -1
  751. package/dist/src/data_access/ua_multistate_value_discrete_impl.d.ts +0 -51
  752. package/dist/src/data_access/ua_multistate_value_discrete_impl.js +0 -302
  753. package/dist/src/data_access/ua_multistate_value_discrete_impl.js.map +0 -1
  754. package/dist/src/data_access/ua_two_state_discrete_impl.d.ts +0 -20
  755. package/dist/src/data_access/ua_two_state_discrete_impl.js +0 -163
  756. package/dist/src/data_access/ua_two_state_discrete_impl.js.map +0 -1
  757. package/dist/src/event_data.d.ts +0 -18
  758. package/dist/src/event_data.js +0 -70
  759. package/dist/src/event_data.js.map +0 -1
  760. package/dist/src/extension_object_array_node.d.ts +0 -34
  761. package/dist/src/extension_object_array_node.js +0 -262
  762. package/dist/src/extension_object_array_node.js.map +0 -1
  763. package/dist/src/get_basic_datatype.js.map +0 -1
  764. package/dist/src/historical_access/address_space_historical_data_node.d.ts +0 -21
  765. package/dist/src/historical_access/address_space_historical_data_node.js +0 -654
  766. package/dist/src/historical_access/address_space_historical_data_node.js.map +0 -1
  767. package/dist/src/idx_iterator.js.map +0 -1
  768. package/dist/src/index_current.d.ts +0 -50
  769. package/dist/src/index_current.js +0 -82
  770. package/dist/src/index_current.js.map +0 -1
  771. package/dist/src/namespace_impl.d.ts +0 -450
  772. package/dist/src/namespace_impl.js +0 -1876
  773. package/dist/src/namespace_impl.js.map +0 -1
  774. package/dist/src/namespace_private.d.ts +0 -31
  775. package/dist/src/namespace_private.js.map +0 -1
  776. package/dist/src/nodeid_manager.js +0 -249
  777. package/dist/src/nodeid_manager.js.map +0 -1
  778. package/dist/src/nodeset_tools/adjust_namespace_array.js.map +0 -1
  779. package/dist/src/nodeset_tools/construct_namespace_dependency.d.ts +0 -33
  780. package/dist/src/nodeset_tools/construct_namespace_dependency.js +0 -347
  781. package/dist/src/nodeset_tools/construct_namespace_dependency.js.map +0 -1
  782. package/dist/src/nodeset_tools/dump_to_bsd.d.ts +0 -2
  783. package/dist/src/nodeset_tools/dump_to_bsd.js +0 -164
  784. package/dist/src/nodeset_tools/dump_to_bsd.js.map +0 -1
  785. package/dist/src/nodeset_tools/nodeset_to_xml.d.ts +0 -12
  786. package/dist/src/nodeset_tools/nodeset_to_xml.js +0 -1381
  787. package/dist/src/nodeset_tools/nodeset_to_xml.js.map +0 -1
  788. package/dist/src/private_namespace.d.ts +0 -5
  789. package/dist/src/private_namespace.js.map +0 -1
  790. package/dist/src/reference_impl.d.ts +0 -43
  791. package/dist/src/reference_impl.js +0 -152
  792. package/dist/src/reference_impl.js.map +0 -1
  793. package/dist/src/role_permissions.js.map +0 -1
  794. package/dist/src/state_machine/finite_state_machine.d.ts +0 -70
  795. package/dist/src/state_machine/finite_state_machine.js +0 -574
  796. package/dist/src/state_machine/finite_state_machine.js.map +0 -1
  797. package/dist/src/state_machine/ua_shelving_state_machine_ex.d.ts +0 -39
  798. package/dist/src/state_machine/ua_shelving_state_machine_ex.js +0 -249
  799. package/dist/src/state_machine/ua_shelving_state_machine_ex.js.map +0 -1
  800. package/dist/src/state_machine/ua_two_state_variable.d.ts +0 -55
  801. package/dist/src/state_machine/ua_two_state_variable.js +0 -323
  802. package/dist/src/state_machine/ua_two_state_variable.js.map +0 -1
  803. package/dist/src/tool_isSubtypeOf.d.ts +0 -18
  804. package/dist/src/tool_isSubtypeOf.js +0 -130
  805. package/dist/src/tool_isSubtypeOf.js.map +0 -1
  806. package/dist/src/ua_condition_type.js.map +0 -1
  807. package/dist/src/ua_data_type_impl.d.ts +0 -87
  808. package/dist/src/ua_data_type_impl.js +0 -393
  809. package/dist/src/ua_data_type_impl.js.map +0 -1
  810. package/dist/src/ua_method_impl.d.ts +0 -48
  811. package/dist/src/ua_method_impl.js +0 -280
  812. package/dist/src/ua_method_impl.js.map +0 -1
  813. package/dist/src/ua_object_impl.d.ts +0 -38
  814. package/dist/src/ua_object_impl.js +0 -214
  815. package/dist/src/ua_object_impl.js.map +0 -1
  816. package/dist/src/ua_object_type_impl.d.ts +0 -55
  817. package/dist/src/ua_object_type_impl.js +0 -131
  818. package/dist/src/ua_object_type_impl.js.map +0 -1
  819. package/dist/src/ua_reference_type_impl.d.ts +0 -42
  820. package/dist/src/ua_reference_type_impl.js +0 -146
  821. package/dist/src/ua_reference_type_impl.js.map +0 -1
  822. package/dist/src/ua_variable_impl.d.ts +0 -379
  823. package/dist/src/ua_variable_impl.js +0 -1940
  824. package/dist/src/ua_variable_impl.js.map +0 -1
  825. package/dist/src/ua_variable_impl_ext_obj.d.ts +0 -23
  826. package/dist/src/ua_variable_impl_ext_obj.js +0 -752
  827. package/dist/src/ua_variable_impl_ext_obj.js.map +0 -1
  828. package/dist/src/ua_variable_type_impl.d.ts +0 -79
  829. package/dist/src/ua_variable_type_impl.js +0 -276
  830. package/dist/src/ua_variable_type_impl.js.map +0 -1
  831. package/dist/src/ua_view_impl.d.ts +0 -18
  832. package/dist/src/ua_view_impl.js +0 -45
  833. package/dist/src/ua_view_impl.js.map +0 -1
  834. package/dist/src/validate_data_type_correctness.d.ts +0 -6
  835. package/dist/src/validate_data_type_correctness.js +0 -106
  836. package/dist/src/validate_data_type_correctness.js.map +0 -1
  837. package/source/address_space_ts.ts +0 -220
  838. package/source/continuation_points/continuation_point_manager.ts +0 -271
  839. package/source/helpers/argument_list.ts +0 -310
  840. package/source/helpers/call_helpers.ts +0 -100
  841. package/source/helpers/coerce_enum_value.ts +0 -33
  842. package/source/helpers/dump_tools.ts +0 -90
  843. package/source/helpers/ensure_secure_access.ts +0 -57
  844. package/source/helpers/multiform_func.ts +0 -78
  845. package/source/helpers/resolve_opaque_on_address_space.ts +0 -26
  846. package/source/index.ts +0 -72
  847. package/source/interfaces/alarms_and_conditions/condition_info_i.ts +0 -24
  848. package/source/interfaces/alarms_and_conditions/condition_snapshot.ts +0 -235
  849. package/source/interfaces/alarms_and_conditions/deviation_stuff.ts +0 -16
  850. package/source/interfaces/alarms_and_conditions/instantiate_alarm_condition_options.ts +0 -8
  851. package/source/interfaces/alarms_and_conditions/instantiate_exclusive_deviation_alarm_options.ts +0 -6
  852. package/source/interfaces/alarms_and_conditions/instantiate_exclusive_limit_alarm_options.ts +0 -6
  853. package/source/interfaces/alarms_and_conditions/instantiate_limit_alarm_options.ts +0 -13
  854. package/source/interfaces/alarms_and_conditions/instantiate_non_exclusive_deviation_alarm_options.ts +0 -6
  855. package/source/interfaces/alarms_and_conditions/instantiate_non_exclusive_limit_alarm_options.ts +0 -6
  856. package/source/interfaces/alarms_and_conditions/instantiate_off_normal_alarm_options.ts +0 -21
  857. package/source/interfaces/alarms_and_conditions/ua_acknowledgeable_condition_ex.ts +0 -28
  858. package/source/interfaces/alarms_and_conditions/ua_alarm_condition_ex.ts +0 -43
  859. package/source/interfaces/alarms_and_conditions/ua_certificate_expiration_alarm_ex.ts +0 -36
  860. package/source/interfaces/alarms_and_conditions/ua_condition_ex.ts +0 -55
  861. package/source/interfaces/alarms_and_conditions/ua_discrete_alarm_ex.ts +0 -17
  862. package/source/interfaces/alarms_and_conditions/ua_exclusive_deviation_alarm_ex.ts +0 -21
  863. package/source/interfaces/alarms_and_conditions/ua_exclusive_limit_alarm_ex.ts +0 -21
  864. package/source/interfaces/alarms_and_conditions/ua_limit_alarm_ex.ts +0 -26
  865. package/source/interfaces/alarms_and_conditions/ua_non_exclusive_deviation_alarm_ex.ts +0 -29
  866. package/source/interfaces/alarms_and_conditions/ua_non_exclusive_limit_alarm_ex.ts +0 -25
  867. package/source/interfaces/data_access/ua_multistate_discrete_ex.ts +0 -57
  868. package/source/interfaces/data_access/ua_multistate_value_discrete_ex.ts +0 -31
  869. package/source/interfaces/data_access/ua_two_state_discrete_ex.ts +0 -15
  870. package/source/interfaces/nodeset_loader_options.ts +0 -38
  871. package/source/interfaces/state_machine/ua_exclusive_limit_state_machine_type_ex.ts +0 -20
  872. package/source/interfaces/state_machine/ua_finite_state_machine_type.ts +0 -50
  873. package/source/interfaces/state_machine/ua_program_state_machine_type.ts +0 -14
  874. package/source/interfaces/state_machine/ua_shelved_state_machine_ex.ts +0 -35
  875. package/source/interfaces/state_machine/ua_state_machine_type.ts +0 -288
  876. package/source/loader/decode_xml_extension_object.ts +0 -80
  877. package/source/loader/ensure_datatype_extracted.ts +0 -122
  878. package/source/loader/generateAddressSpaceRaw.ts +0 -219
  879. package/source/loader/load_nodeset2.ts +0 -1275
  880. package/source/loader/make_xml_extension_object_parser.ts +0 -524
  881. package/source/loader/namespace_post_step.ts +0 -68
  882. package/source/loader/parsers/extension_object_parser.ts +0 -374
  883. package/source/loader/parsers/variant_parser.ts +0 -433
  884. package/source/loader/register_node_promoter.ts +0 -6
  885. package/source/namespace.ts +0 -7
  886. package/source/namespace_alarm_and_condition.ts +0 -78
  887. package/source/namespace_data_access.ts +0 -92
  888. package/source/namespace_machine_state.ts +0 -20
  889. package/source/pseudo_session.ts +0 -415
  890. package/source/session_context.ts +0 -725
  891. package/source/ua_interface.ts +0 -38
  892. package/source/ua_two_state_variable_ex.ts +0 -36
  893. package/src/_instantiate_helpers.ts +0 -197
  894. package/src/_mandatory_child_or_requested_optional_filter.ts +0 -100
  895. package/src/address_space.ts +0 -1631
  896. package/src/address_space_change_event_tools.ts +0 -177
  897. package/src/address_space_private.ts +0 -96
  898. package/src/alarms_and_conditions/condition_info_impl.ts +0 -44
  899. package/src/alarms_and_conditions/condition_snapshot_impl.ts +0 -792
  900. package/src/alarms_and_conditions/deviation_alarm_helper.ts +0 -73
  901. package/src/alarms_and_conditions/index.ts +0 -16
  902. package/src/alarms_and_conditions/ua_acknowledgeable_condition_impl.ts +0 -331
  903. package/src/alarms_and_conditions/ua_alarm_condition_impl.ts +0 -479
  904. package/src/alarms_and_conditions/ua_base_event_impl.ts +0 -42
  905. package/src/alarms_and_conditions/ua_certificate_expiration_alarm_impl.ts +0 -244
  906. package/src/alarms_and_conditions/ua_condition_impl.ts +0 -1261
  907. package/src/alarms_and_conditions/ua_discrete_alarm_impl.ts +0 -57
  908. package/src/alarms_and_conditions/ua_exclusive_deviation_alarm_impl.ts +0 -94
  909. package/src/alarms_and_conditions/ua_exclusive_level_alarm_impl.ts +0 -20
  910. package/src/alarms_and_conditions/ua_exclusive_limit_alarm_impl.ts +0 -109
  911. package/src/alarms_and_conditions/ua_exclusive_rate_of_change_alarm_impl.ts +0 -25
  912. package/src/alarms_and_conditions/ua_limit_alarm_impl.ts +0 -244
  913. package/src/alarms_and_conditions/ua_non_exclusive_deviation_alarm_impl.ts +0 -88
  914. package/src/alarms_and_conditions/ua_non_exclusive_limit_alarm_impl.ts +0 -223
  915. package/src/alarms_and_conditions/ua_off_normal_alarm_impl.ts +0 -218
  916. package/src/alarms_and_conditions/ua_system_off_normal_alarm_impl.ts +0 -26
  917. package/src/apply_condition_refresh.ts +0 -29
  918. package/src/base_node_impl.ts +0 -1907
  919. package/src/base_node_private.ts +0 -1287
  920. package/src/data_access/adjust_datavalue_status_code.ts +0 -36
  921. package/src/data_access/ua_multistate_discrete_impl.ts +0 -189
  922. package/src/data_access/ua_multistate_value_discrete_impl.ts +0 -369
  923. package/src/data_access/ua_two_state_discrete_impl.ts +0 -184
  924. package/src/event_data.ts +0 -83
  925. package/src/extension_object_array_node.ts +0 -331
  926. package/src/historical_access/address_space_historical_data_node.ts +0 -842
  927. package/src/index_current.ts +0 -51
  928. package/src/namespace_impl.ts +0 -2380
  929. package/src/namespace_private.ts +0 -77
  930. package/src/nodeid_manager.ts +0 -293
  931. package/src/nodeset_tools/construct_namespace_dependency.ts +0 -375
  932. package/src/nodeset_tools/dump_to_bsd.ts +0 -201
  933. package/src/nodeset_tools/nodeset_to_xml.ts +0 -1652
  934. package/src/private_namespace.ts +0 -21
  935. package/src/reference_impl.ts +0 -171
  936. package/src/state_machine/finite_state_machine.ts +0 -668
  937. package/src/state_machine/ua_shelving_state_machine_ex.ts +0 -330
  938. package/src/state_machine/ua_two_state_variable.ts +0 -421
  939. package/src/tool_isSubtypeOf.ts +0 -160
  940. package/src/ua_data_type_impl.ts +0 -483
  941. package/src/ua_method_impl.ts +0 -362
  942. package/src/ua_object_impl.ts +0 -278
  943. package/src/ua_object_type_impl.ts +0 -179
  944. package/src/ua_reference_type_impl.ts +0 -170
  945. package/src/ua_variable_impl.ts +0 -2489
  946. package/src/ua_variable_impl_ext_obj.ts +0 -903
  947. package/src/ua_variable_type_impl.ts +0 -385
  948. package/src/ua_view_impl.ts +0 -53
  949. package/src/validate_data_type_correctness.ts +0 -124
  950. /package/{source → api}/helpers/adjust_browse_direction.ts +0 -0
  951. /package/{source → api}/helpers/make_optionals_map.ts +0 -0
  952. /package/{source → api}/interfaces/alarms_and_conditions/install_setpoint_options.ts +0 -0
  953. /package/{source → api}/interfaces/alarms_and_conditions/instantiate_condition_options.ts +0 -0
  954. /package/{source → api}/interfaces/alarms_and_conditions/ua_base_event_ex.ts +0 -0
  955. /package/{source → api}/interfaces/data_access/ua_y_array_item_ex.ts +0 -0
  956. /package/{source → api}/interfaces/extension_object_constructor.ts +0 -0
  957. /package/{source → api}/interfaces/i_condition_variable_type_setter_options.ts +0 -0
  958. /package/{source → api}/interfaces/i_set_state_options.ts +0 -0
  959. /package/{source → api}/interfaces/state_machine/ua_transition_ex.ts +0 -0
  960. /package/{source → api}/interfaces/ua_subscription_diagnostics_variable_ex.ts +0 -0
  961. /package/{source → api}/loader/make_semver_compatible.ts +0 -0
  962. /package/{source → api}/loader/parsers/localized_text_parser.ts +0 -0
  963. /package/{source → api}/loader/parsers/nodeid_parser.ts +0 -0
  964. /package/{source → api}/loader/parsers/qualified_name_parser.ts +0 -0
  965. /package/{source → api}/set_namespace_meta_data.ts +0 -0
  966. /package/{source → api}/ua_addin.ts +0 -0
  967. /package/{source → api}/ua_root_folder.ts +0 -0
  968. /package/{source → api}/xml_writer.ts +0 -0
  969. /package/dist/{source → api}/continuation_points/continuation_point_manager.d.ts +0 -0
  970. /package/dist/{source → api}/helpers/adjust_browse_direction.d.ts +0 -0
  971. /package/dist/{source → api}/helpers/adjust_browse_direction.js +0 -0
  972. /package/dist/{source → api}/helpers/argument_list.d.ts +0 -0
  973. /package/dist/{source → api}/helpers/call_helpers.d.ts +0 -0
  974. /package/dist/{source → api}/helpers/coerce_enum_value.js +0 -0
  975. /package/dist/{source → api}/helpers/dump_tools.d.ts +0 -0
  976. /package/dist/{source → api}/helpers/make_optionals_map.d.ts +0 -0
  977. /package/dist/{source → api}/helpers/make_optionals_map.js +0 -0
  978. /package/dist/{source → api}/helpers/multiform_func.d.ts +0 -0
  979. /package/dist/{source → api}/helpers/resolve_opaque_on_address_space.d.ts +0 -0
  980. /package/dist/{source → api}/interfaces/alarms_and_conditions/condition_snapshot.js +0 -0
  981. /package/dist/{source → api}/interfaces/alarms_and_conditions/deviation_stuff.js +0 -0
  982. /package/dist/{source → api}/interfaces/alarms_and_conditions/install_setpoint_options.d.ts +0 -0
  983. /package/dist/{source → api}/interfaces/alarms_and_conditions/install_setpoint_options.js +0 -0
  984. /package/dist/{source → api}/interfaces/alarms_and_conditions/instantiate_alarm_condition_options.js +0 -0
  985. /package/dist/{source → api}/interfaces/alarms_and_conditions/instantiate_condition_options.d.ts +0 -0
  986. /package/dist/{source → api}/interfaces/alarms_and_conditions/instantiate_condition_options.js +0 -0
  987. /package/dist/{source → api}/interfaces/alarms_and_conditions/instantiate_exclusive_deviation_alarm_options.js +0 -0
  988. /package/dist/{source → api}/interfaces/alarms_and_conditions/instantiate_exclusive_limit_alarm_options.js +0 -0
  989. /package/dist/{source → api}/interfaces/alarms_and_conditions/instantiate_limit_alarm_options.js +0 -0
  990. /package/dist/{source → api}/interfaces/alarms_and_conditions/instantiate_non_exclusive_deviation_alarm_options.js +0 -0
  991. /package/dist/{source → api}/interfaces/alarms_and_conditions/instantiate_non_exclusive_limit_alarm_options.js +0 -0
  992. /package/dist/{source → api}/interfaces/alarms_and_conditions/instantiate_off_normal_alarm_options.js +0 -0
  993. /package/dist/{source → api}/interfaces/alarms_and_conditions/ua_acknowledgeable_condition_ex.js +0 -0
  994. /package/dist/{source → api}/interfaces/alarms_and_conditions/ua_alarm_condition_ex.js +0 -0
  995. /package/dist/{source → api}/interfaces/alarms_and_conditions/ua_base_event_ex.d.ts +0 -0
  996. /package/dist/{source → api}/interfaces/alarms_and_conditions/ua_base_event_ex.js +0 -0
  997. /package/dist/{source → api}/interfaces/alarms_and_conditions/ua_certificate_expiration_alarm_ex.js +0 -0
  998. /package/dist/{source → api}/interfaces/alarms_and_conditions/ua_condition_ex.js +0 -0
  999. /package/dist/{source → api}/interfaces/alarms_and_conditions/ua_discrete_alarm_ex.js +0 -0
  1000. /package/dist/{source → api}/interfaces/alarms_and_conditions/ua_exclusive_deviation_alarm_ex.js +0 -0
  1001. /package/dist/{source → api}/interfaces/alarms_and_conditions/ua_exclusive_limit_alarm_ex.js +0 -0
  1002. /package/dist/{source → api}/interfaces/alarms_and_conditions/ua_limit_alarm_ex.js +0 -0
  1003. /package/dist/{source → api}/interfaces/alarms_and_conditions/ua_non_exclusive_deviation_alarm_ex.js +0 -0
  1004. /package/dist/{source → api}/interfaces/alarms_and_conditions/ua_non_exclusive_limit_alarm_ex.js +0 -0
  1005. /package/dist/{source → api}/interfaces/data_access/ua_multistate_discrete_ex.js +0 -0
  1006. /package/dist/{source → api}/interfaces/data_access/ua_multistate_value_discrete_ex.js +0 -0
  1007. /package/dist/{source → api}/interfaces/data_access/ua_two_state_discrete_ex.js +0 -0
  1008. /package/dist/{source → api}/interfaces/data_access/ua_y_array_item_ex.d.ts +0 -0
  1009. /package/dist/{source → api}/interfaces/data_access/ua_y_array_item_ex.js +0 -0
  1010. /package/dist/{source → api}/interfaces/extension_object_constructor.d.ts +0 -0
  1011. /package/dist/{source → api}/interfaces/extension_object_constructor.js +0 -0
  1012. /package/dist/{source → api}/interfaces/i_condition_variable_type_setter_options.d.ts +0 -0
  1013. /package/dist/{source → api}/interfaces/i_condition_variable_type_setter_options.js +0 -0
  1014. /package/dist/{source → api}/interfaces/i_set_state_options.d.ts +0 -0
  1015. /package/dist/{source → api}/interfaces/i_set_state_options.js +0 -0
  1016. /package/dist/{source → api}/interfaces/nodeset_loader_options.js +0 -0
  1017. /package/dist/{source → api}/interfaces/state_machine/ua_exclusive_limit_state_machine_type_ex.js +0 -0
  1018. /package/dist/{source → api}/interfaces/state_machine/ua_finite_state_machine_type.js +0 -0
  1019. /package/dist/{source → api}/interfaces/state_machine/ua_program_state_machine_type.js +0 -0
  1020. /package/dist/{source → api}/interfaces/state_machine/ua_shelved_state_machine_ex.js +0 -0
  1021. /package/dist/{source → api}/interfaces/state_machine/ua_state_machine_type.js +0 -0
  1022. /package/dist/{source → api}/interfaces/state_machine/ua_transition_ex.d.ts +0 -0
  1023. /package/dist/{source → api}/interfaces/state_machine/ua_transition_ex.js +0 -0
  1024. /package/dist/{source → api}/interfaces/ua_subscription_diagnostics_variable_ex.d.ts +0 -0
  1025. /package/dist/{source → api}/interfaces/ua_subscription_diagnostics_variable_ex.js +0 -0
  1026. /package/dist/{source → api}/loader/ensure_datatype_extracted.d.ts +0 -0
  1027. /package/dist/{source → api}/loader/make_semver_compatible.d.ts +0 -0
  1028. /package/dist/{source → api}/loader/make_semver_compatible.js +0 -0
  1029. /package/dist/{source → api}/loader/make_xml_extension_object_parser.d.ts +0 -0
  1030. /package/dist/{source → api}/loader/namespace_post_step.d.ts +0 -0
  1031. /package/dist/{source → api}/loader/parsers/extension_object_parser.d.ts +0 -0
  1032. /package/dist/{source → api}/loader/parsers/localized_text_parser.d.ts +0 -0
  1033. /package/dist/{source → api}/loader/parsers/localized_text_parser.js +0 -0
  1034. /package/dist/{source → api}/loader/parsers/nodeid_parser.d.ts +0 -0
  1035. /package/dist/{source → api}/loader/parsers/nodeid_parser.js +0 -0
  1036. /package/dist/{source → api}/loader/parsers/qualified_name_parser.d.ts +0 -0
  1037. /package/dist/{source → api}/loader/parsers/qualified_name_parser.js +0 -0
  1038. /package/dist/{source → api}/namespace.js +0 -0
  1039. /package/dist/{source → api}/namespace_alarm_and_condition.js +0 -0
  1040. /package/dist/{source → api}/namespace_data_access.js +0 -0
  1041. /package/dist/{source → api}/namespace_machine_state.js +0 -0
  1042. /package/dist/{source → api}/session_context.js +0 -0
  1043. /package/dist/{source → api}/set_namespace_meta_data.d.ts +0 -0
  1044. /package/dist/{source → api}/set_namespace_meta_data.js +0 -0
  1045. /package/dist/{source → api}/ua_addin.d.ts +0 -0
  1046. /package/dist/{source → api}/ua_addin.js +0 -0
  1047. /package/dist/{source → api}/ua_interface.d.ts +0 -0
  1048. /package/dist/{source → api}/ua_root_folder.d.ts +0 -0
  1049. /package/dist/{source → api}/ua_root_folder.js +0 -0
  1050. /package/dist/{source → api}/ua_two_state_variable_ex.js +0 -0
  1051. /package/dist/{source → api}/xml_writer.d.ts +0 -0
  1052. /package/dist/{source → api}/xml_writer.js +0 -0
  1053. /package/dist/{src → impl}/_instantiate_helpers.d.ts +0 -0
  1054. /package/dist/{src → impl}/_mandatory_child_or_requested_optional_filter.d.ts +0 -0
  1055. /package/dist/{src → impl}/address_space_change_event_tools.js +0 -0
  1056. /package/dist/{src → impl}/address_space_private.js +0 -0
  1057. /package/dist/{src → impl}/alarms_and_conditions/condition.d.ts +0 -0
  1058. /package/dist/{src → impl}/alarms_and_conditions/condition.js +0 -0
  1059. /package/dist/{src → impl}/check_value_rank_compatibility.d.ts +0 -0
  1060. /package/dist/{src → impl}/check_value_rank_compatibility.js +0 -0
  1061. /package/dist/{src → impl}/data_access/add_dataItem_stuff.d.ts +0 -0
  1062. /package/dist/{src → impl}/data_access/add_dataItem_stuff.js +0 -0
  1063. /package/dist/{src → impl}/data_access/adjust_datavalue_status_code.js +0 -0
  1064. /package/dist/{src → impl}/get_basic_datatype.d.ts +0 -0
  1065. /package/dist/{src → impl}/get_basic_datatype.js +0 -0
  1066. /package/dist/{src → impl}/idx_iterator.d.ts +0 -0
  1067. /package/dist/{src → impl}/idx_iterator.js +0 -0
  1068. /package/dist/{src → impl}/namespace_private.js +0 -0
  1069. /package/dist/{src → impl}/nodeid_manager.d.ts +0 -0
  1070. /package/dist/{src → impl}/nodeset_tools/adjust_namespace_array.d.ts +0 -0
  1071. /package/dist/{src → impl}/nodeset_tools/adjust_namespace_array.js +0 -0
  1072. /package/dist/{src → impl}/private_namespace.js +0 -0
  1073. /package/dist/{src → impl}/role_permissions.d.ts +0 -0
  1074. /package/dist/{src → impl}/role_permissions.js +0 -0
  1075. /package/dist/{src → impl}/ua_condition_type.d.ts +0 -0
  1076. /package/dist/{src → impl}/ua_condition_type.js +0 -0
  1077. /package/{src → impl}/alarms_and_conditions/condition.ts +0 -0
  1078. /package/{src → impl}/check_value_rank_compatibility.ts +0 -0
  1079. /package/{src → impl}/data_access/add_dataItem_stuff.ts +0 -0
  1080. /package/{src → impl}/get_basic_datatype.ts +0 -0
  1081. /package/{src → impl}/idx_iterator.ts +0 -0
  1082. /package/{src → impl}/nodeset_tools/adjust_namespace_array.ts +0 -0
  1083. /package/{src → impl}/role_permissions.ts +0 -0
  1084. /package/{src → impl}/ua_condition_type.ts +0 -0
@@ -0,0 +1,2559 @@
1
+ /**
2
+ * @module node-opcua-address-space
3
+ */
4
+ import { types } from "node:util";
5
+ import chalk from "chalk";
6
+ import type {
7
+ BindVariableOptions,
8
+ CloneFilter,
9
+ CloneOptions,
10
+ ISessionContext,
11
+ IVariableHistorian,
12
+ ListenerSignature,
13
+ TimestampGetFunc,
14
+ TimestampSetFunc,
15
+ UADataType,
16
+ UAVariable,
17
+ UAVariableEvents,
18
+ UAVariableT,
19
+ UAVariableType
20
+ } from "node-opcua-address-space-base";
21
+ import {
22
+ type BindExtensionObjectOptions,
23
+ type CloneExtraInfo,
24
+ type ContinuationData,
25
+ defaultCloneFilter,
26
+ type GetFunc,
27
+ makeDefaultCloneExtraInfo,
28
+ type SetFunc,
29
+ type VariableDataValueGetterSync,
30
+ type VariableDataValueSetterWithCallback,
31
+ type VariableSetter
32
+ } from "node-opcua-address-space-base";
33
+ import { assert } from "node-opcua-assert";
34
+ import {
35
+ AccessLevelFlag,
36
+ AttributeIds,
37
+ convertAccessLevelFlagToByte,
38
+ isDataEncoding,
39
+ isValidDataEncoding,
40
+ makeAccessLevelFlag,
41
+ NodeClass,
42
+ type QualifiedName,
43
+ type QualifiedNameLike
44
+ } from "node-opcua-data-model";
45
+ import {
46
+ DataValue,
47
+ type DataValueLike,
48
+ type DataValueT,
49
+ extractRange,
50
+ makeNowDataValue,
51
+ sameDataValue
52
+ } from "node-opcua-data-value";
53
+ import { coerceClock, getCurrentClock, type PreciseClock } from "node-opcua-date-time";
54
+ import { checkDebugFlag, make_debugLog, make_errorLog, make_warningLog } from "node-opcua-debug";
55
+ import { ExtensionObject, OpaqueStructure } from "node-opcua-extension-object";
56
+ import { NodeId, type NodeIdLike } from "node-opcua-nodeid";
57
+ import type { UAHistoricalDataConfiguration } from "node-opcua-nodeset-ua";
58
+ import { NumericRange } from "node-opcua-numeric-range";
59
+ import { WriteValue } from "node-opcua-service-write";
60
+ import type { StatusCodeCallback } from "node-opcua-status-code";
61
+ import { type CallbackT, StatusCode, StatusCodes } from "node-opcua-status-code";
62
+ import {
63
+ type HistoryReadDetails,
64
+ HistoryReadResult,
65
+ PermissionType,
66
+ type ReadAtTimeDetails,
67
+ type ReadEventDetails,
68
+ type ReadProcessedDetails,
69
+ type ReadRawModifiedDetails,
70
+ type WriteValueOptions
71
+ } from "node-opcua-types";
72
+ import {
73
+ adjustVariant,
74
+ DataType,
75
+ sameVariant,
76
+ Variant,
77
+ VariantArrayType,
78
+ type VariantLike,
79
+ verifyRankAndDimensions
80
+ } from "node-opcua-variant";
81
+ import { convertToCallbackFunction1 } from "../api/helpers/multiform_func.js";
82
+ import { SessionContext } from "../api/session_context.js";
83
+ import { apply_condition_refresh, type ConditionRefreshCache } from "./apply_condition_refresh.js";
84
+ import { BaseNodeImpl, type InternalBaseNodeOptions } from "./base_node_impl.js";
85
+ import { _clone, ToStringBuilder, UAVariable_toString, valueRankToString } from "./base_node_private.js";
86
+ import { adjustDataValueStatusCode } from "./data_access/adjust_datavalue_status_code.js";
87
+ import { _getBasicDataType } from "./get_basic_datatype.js";
88
+ import { type EnumerationInfo, type IEnumItem, UADataTypeImpl } from "./ua_data_type_impl.js";
89
+ import {
90
+ _bindExtensionObject,
91
+ _bindExtensionObjectArrayOrMatrix,
92
+ _installExtensionObjectBindingOnProperties,
93
+ extractPartialData,
94
+ incrementElement,
95
+ propagateTouchValueDownward,
96
+ propagateTouchValueDownwardArray,
97
+ propagateTouchValueUpward,
98
+ setExtensionObjectPartialValue
99
+ } from "./ua_variable_impl_ext_obj.js";
100
+ import { validateDataTypeCorrectness } from "./validate_data_type_correctness.js";
101
+
102
+ const debugLog = make_debugLog("ua_variable_impl");
103
+ const warningLog = make_warningLog("ua_variable_impl");
104
+ const doDebug = checkDebugFlag("ua_variable_impl");
105
+ const errorLog = make_errorLog("ua_variable_impl");
106
+
107
+ const plainChalk = new Proxy(chalk, { get: () => (s: string) => s }) as typeof chalk;
108
+
109
+ export function adjust_accessLevel(accessLevel: string | number | AccessLevelFlag | null | undefined): AccessLevelFlag {
110
+ const flag = makeAccessLevelFlag(accessLevel ?? "CurrentRead | CurrentWrite");
111
+ assert(Number.isFinite(flag));
112
+ return flag;
113
+ }
114
+
115
+ export function adjust_userAccessLevel(
116
+ userAccessLevel: string | number | AccessLevelFlag | null | undefined,
117
+ accessLevel: string | number | AccessLevelFlag | null
118
+ ): AccessLevelFlag | undefined {
119
+ if (userAccessLevel === undefined) {
120
+ return undefined;
121
+ }
122
+ userAccessLevel = adjust_accessLevel(userAccessLevel);
123
+ accessLevel = adjust_accessLevel(accessLevel);
124
+ return makeAccessLevelFlag(accessLevel & userAccessLevel);
125
+ }
126
+
127
+ function adjust_samplingInterval(minimumSamplingInterval: number): number {
128
+ assert(Number.isFinite(minimumSamplingInterval));
129
+ if (minimumSamplingInterval < 0) {
130
+ return -1; // only -1 is a valid negative value for samplingInterval and means "unspecified"
131
+ }
132
+ return minimumSamplingInterval;
133
+ }
134
+
135
+ function is_Variant(v: unknown): boolean {
136
+ return v instanceof Variant;
137
+ }
138
+
139
+ function is_StatusCode(v: unknown): boolean {
140
+ return !!(
141
+ v?.constructor &&
142
+ (v instanceof StatusCode ||
143
+ v.constructor.name === "ConstantStatusCode" ||
144
+ v.constructor.name === "StatusCode" ||
145
+ v.constructor.name === "ModifiableStatusCode")
146
+ );
147
+ }
148
+
149
+ function is_Variant_or_StatusCode(v: unknown): boolean {
150
+ if (is_Variant(v)) {
151
+ // /@@assert(v.isValid());
152
+ }
153
+ return is_Variant(v) || is_StatusCode(v);
154
+ }
155
+
156
+ function default_func(this: UAVariable, dataValue1: DataValue, callback1: CallbackT<StatusCode>) {
157
+ return _default_writable_timestamped_set_func.call(this, dataValue1, callback1);
158
+ }
159
+
160
+ interface UAVariableOptions extends InternalBaseNodeOptions {
161
+ value?: unknown;
162
+ dataType: NodeId | string;
163
+ /**
164
+ * This attribute indicates whether the Value attribute of the Variable is an array and how many dimensions the array has.
165
+ * It may have the following values:
166
+ * * n > 1: the Value is an array with the specified number of dimensions.
167
+ * * OneDimension (1): The value is an array with one dimension.
168
+ * * OneOrMoreDimensions (0): The value is an array with one or more dimensions.
169
+ * * Scalar (−1): The value is not an array.
170
+ * * Any (−2): The value can be a scalar or an array with any number of dimensions.
171
+ * * ScalarOrOneDimension (−3): The value can be a scalar or a one dimensional array.
172
+ * * All DataTypes are considered to be scalar, even if they have array-like semantics like ByteString and String.
173
+ */
174
+ valueRank?: number;
175
+ arrayDimensions?: null | number[];
176
+ accessLevel?: keyof typeof AccessLevelFlag | AccessLevelFlag | null;
177
+ userAccessLevel?: keyof typeof AccessLevelFlag | AccessLevelFlag | null;
178
+ minimumSamplingInterval?: number; // default -1
179
+ historizing?: boolean;
180
+ }
181
+
182
+ /**
183
+ * A OPCUA Variable Node
184
+ *
185
+ * @class UAVariable
186
+ * @constructor
187
+ * @extends BaseNode
188
+ * The AccessLevel Attribute is used to indicate how the Value of a Variable can be accessed (read/write) and if it
189
+ * contains current and/or historic data. The AccessLevel does not take any user access rights into account,
190
+ * i.e. although the Variable is writable this may be restricted to a certain user / user group.
191
+ * The AccessLevel is an 8-bit unsigned integer with the structure defined in the following table:
192
+ *
193
+ * Field Bit Description
194
+ * CurrentRead 0 Indicates if the current value is readable
195
+ * (0 means not readable, 1 means readable).
196
+ * CurrentWrite 1 Indicates if the current value is writable
197
+ * (0 means not writable, 1 means writable).
198
+ * HistoryRead 2 Indicates if the history of the value is readable
199
+ * (0 means not readable, 1 means readable).
200
+ * HistoryWrite 3 Indicates if the history of the value is writable (0 means not writable, 1 means writable).
201
+ * SemanticChange 4 Indicates if the Variable used as Property generates SemanticChangeEvents (see 9.31).
202
+ * Reserved 5:7 Reserved for future use. Shall always be zero.
203
+ *
204
+ * The first two bits also indicate if a current value of this Variable is available and the second two bits
205
+ * indicates if the history of the Variable is available via the OPC UA server.
206
+ *
207
+ */
208
+ export class UAVariableImpl<T extends UAVariableEvents & ListenerSignature<T> = UAVariableEvents>
209
+ extends BaseNodeImpl<T>
210
+ implements UAVariable<T>, UAVariableImplExtArray
211
+ {
212
+ // -------------- UAvaraibleImplExArray
213
+ $$variableType?: UAVariableType;
214
+ $$dataType?: UADataType = undefined;
215
+ $$getElementBrowseName?: (extObject: ExtensionObject, index: number | number[]) => QualifiedName;
216
+ $$extensionObjectArray?: ExtensionObject[];
217
+ $$indexPropertyName?: string;
218
+ // --------------
219
+
220
+ public readonly nodeClass = NodeClass.Variable;
221
+
222
+ public dataType: NodeId;
223
+ private _basicDataType?: DataType;
224
+
225
+ // narrowing this to ExtensionObject breaks declaration-merging in ua_two_state_variable.ts and elsewhere
226
+ // (concrete *T variants bind $extensionObject to a different, more specific shape) — see the matching
227
+ // comment on UAVariable.$extensionObject in node-opcua-address-space-base for the documented precedent.
228
+ // biome-ignore lint/suspicious/noExplicitAny: see comment above
229
+ public $extensionObject?: any;
230
+ public $set_ExtensionObject?: (newValue: ExtensionObject, sourceTimestamp: PreciseClock, cache: Set<UAVariableImpl>) => void;
231
+
232
+ public $historicalDataConfiguration?: UAHistoricalDataConfiguration;
233
+ public varHistorian?: IVariableHistorian;
234
+
235
+ /**
236
+ * @internal @private
237
+ */
238
+ public $dataValue: DataValue;
239
+ public accessLevel: number;
240
+ public userAccessLevel?: number;
241
+ public valueRank: number;
242
+ public minimumSamplingInterval: number;
243
+ public historizing: boolean;
244
+ public semantic_version: number;
245
+ public arrayDimensions: null | number[];
246
+
247
+ public _timestamped_get_func?: TimestampGetFunc | null;
248
+ public _timestamped_set_func?: VariableDataValueSetterWithCallback | null;
249
+ public _get_func?: GetFunc | null;
250
+ public _set_func?: ((value: Variant, callback: (err: Error | null, statusCode?: StatusCode) => void) => void) | null;
251
+ public refreshFunc?: (callback: CallbackT<DataValue>) => void;
252
+ public __waiting_callbacks?: CallbackT<DataValue>[];
253
+
254
+ get typeDefinitionObj(): UAVariableType {
255
+ // c8 ignore next
256
+ if (super.typeDefinitionObj && super.typeDefinitionObj.nodeClass !== NodeClass.VariableType) {
257
+ // this could happen in faulty external nodeset and has been seen once
258
+ // in an nano server
259
+ warningLog(super.typeDefinitionObj.toString());
260
+ const baseVariableType = this.addressSpace.findVariableType("BaseVariableType");
261
+ if (!baseVariableType) throw new Error("Cannot find BaseVariableType in address space");
262
+ return baseVariableType;
263
+ }
264
+ return super.typeDefinitionObj as UAVariableType;
265
+ }
266
+ get typeDefinition(): NodeId {
267
+ return super.typeDefinition;
268
+ }
269
+ constructor(options: UAVariableOptions) {
270
+ super(options);
271
+
272
+ verifyRankAndDimensions(options);
273
+ this.valueRank = options.valueRank ?? -1;
274
+ this.arrayDimensions = options.arrayDimensions ?? null;
275
+
276
+ this.dataType = this.resolveNodeId(options.dataType); // DataType (NodeId)
277
+
278
+ this.accessLevel = adjust_accessLevel(options.accessLevel);
279
+
280
+ this.userAccessLevel = adjust_userAccessLevel(options.userAccessLevel, this.accessLevel);
281
+
282
+ this.minimumSamplingInterval = adjust_samplingInterval(options.minimumSamplingInterval || 0);
283
+
284
+ this.historizing = !!options.historizing; // coerced to boolean"
285
+
286
+ // a Variant built from null takes the constructor's short path; the options form costs twice as much
287
+ this.$dataValue = new DataValue({ statusCode: StatusCodes.UncertainInitialValue, value: new Variant(null) });
288
+
289
+ if (options.value) {
290
+ this.bindVariable(options.value);
291
+ }
292
+
293
+ this.setMaxListeners(5000);
294
+
295
+ this.semantic_version = 0;
296
+ }
297
+ private checkAccessLevelPrivate(_context: ISessionContext, accessLevel: AccessLevelFlag): boolean {
298
+ if (this.userAccessLevel === undefined) {
299
+ return true;
300
+ }
301
+ return (this.userAccessLevel & accessLevel) === accessLevel;
302
+ }
303
+ private checkPermissionPrivate(context: ISessionContext, permission: PermissionType): boolean {
304
+ if (!context) return true;
305
+ assert(context instanceof SessionContext);
306
+ if (context.checkPermission) {
307
+ if (!(context.checkPermission instanceof Function)) {
308
+ errorLog("context checkPermission is not a function");
309
+ return false;
310
+ }
311
+ if (!context.checkPermission(this, permission)) {
312
+ return false;
313
+ }
314
+ }
315
+ return true;
316
+ }
317
+ private checkPermissionAndAccessLevelPrivate(
318
+ context: ISessionContext,
319
+ permission: PermissionType,
320
+ accessLevel: AccessLevelFlag
321
+ ): boolean {
322
+ if (!this.checkPermissionPrivate(context, permission)) {
323
+ return false;
324
+ }
325
+ return this.checkAccessLevelPrivate(context, accessLevel);
326
+ }
327
+
328
+ public isReadable(_context: ISessionContext): boolean {
329
+ return (this.accessLevel & AccessLevelFlag.CurrentRead) === AccessLevelFlag.CurrentRead;
330
+ }
331
+
332
+ public isUserReadable(context: ISessionContext): boolean {
333
+ if (!this.isReadable(context)) {
334
+ return false;
335
+ }
336
+ if (!this.checkPermissionPrivate(context, PermissionType.Read)) {
337
+ return false;
338
+ }
339
+ return this.checkAccessLevelPrivate(context, AccessLevelFlag.CurrentRead);
340
+ }
341
+
342
+ public isWritable(_context: ISessionContext): boolean {
343
+ return (this.accessLevel & AccessLevelFlag.CurrentWrite) === AccessLevelFlag.CurrentWrite;
344
+ }
345
+
346
+ public isUserWritable(context: ISessionContext): boolean {
347
+ if (!this.isWritable(context)) {
348
+ return false;
349
+ }
350
+ return this.checkPermissionAndAccessLevelPrivate(context, PermissionType.Write, AccessLevelFlag.CurrentWrite);
351
+ }
352
+
353
+ public canUserReadHistory(context: ISessionContext): boolean {
354
+ return this.checkPermissionAndAccessLevelPrivate(context, PermissionType.ReadHistory, AccessLevelFlag.HistoryRead);
355
+ }
356
+ public canUserWriteHistorizingAttribute(context: ISessionContext): boolean {
357
+ if (context && !context.checkPermission(this, PermissionType.WriteHistorizing)) {
358
+ return false;
359
+ }
360
+ return true;
361
+ }
362
+ public canUserInsertHistory(context: ISessionContext): boolean {
363
+ return this.checkPermissionAndAccessLevelPrivate(context, PermissionType.InsertHistory, AccessLevelFlag.HistoryWrite);
364
+ }
365
+ public canUserModifyHistory(context: ISessionContext): boolean {
366
+ return this.checkPermissionAndAccessLevelPrivate(context, PermissionType.ModifyHistory, AccessLevelFlag.HistoryWrite);
367
+ }
368
+ public canUserDeleteHistory(context: ISessionContext): boolean {
369
+ return this.checkPermissionAndAccessLevelPrivate(context, PermissionType.DeleteHistory, AccessLevelFlag.HistoryWrite);
370
+ }
371
+
372
+ /**
373
+ *
374
+ *
375
+ * from OPC.UA.Spec 1.02 part 4
376
+ * 5.10.2.4 StatusCodes
377
+ * Table 51 defines values for the operation level statusCode contained in the DataValue structure of
378
+ * each values element. Common StatusCodes are defined in Table 166.
379
+ *
380
+ * Table 51 Read Operation Level Result Codes
381
+ *
382
+ * | Symbolic Id | Description
383
+ * |-----------------------------|---------------------------------------------------------------------------------------------|
384
+ * |BadNodeIdInvalid | The syntax of the node id is not valid.|
385
+ * |BadNodeIdUnknown |The node id refers to a node that does not exist in the server address space.|
386
+ * |BadAttributeIdInvalid | BadAttributeIdInvalid The attribute is not supported for the specified node.|
387
+ * |BadIndexRangeInvalid | The syntax of the index range parameter is invalid.|
388
+ * |BadIndexRangeNoData | No data exists within the range of indexes specified.|
389
+ * |BadDataEncodingInvalid | The data encoding is invalid.|
390
+ * | | This result is used if no dataEncoding can be applied because an Attribute other|
391
+ * | | than Value was requested or the DataType of the Value Attribute is not a subtype|
392
+ * | | of the Structure DataType.|
393
+ * |BadDataEncodingUnsupported | The server does not support the requested data encoding for the node. |
394
+ * | | This result is used if a dataEncoding can be applied but the passed data encoding |
395
+ * | | is not known to the Server. |
396
+ * |BadNotReadable | The access level does not allow reading or subscribing to the Node.|
397
+ * |BadUserAccessDenied | User does not have permission to perform the requested operation. (table 165)|
398
+ */
399
+ public readValue(
400
+ context?: ISessionContext | null,
401
+ indexRange?: NumericRange,
402
+ dataEncoding?: QualifiedNameLike | null
403
+ ): DataValue {
404
+ if (!context) {
405
+ context = SessionContext.defaultContext;
406
+ }
407
+
408
+ if (context.isAccessRestricted(this)) {
409
+ return new DataValue({ statusCode: StatusCodes.BadSecurityModeInsufficient });
410
+ }
411
+
412
+ if (!this.isReadable(context)) {
413
+ return new DataValue({ statusCode: StatusCodes.BadNotReadable });
414
+ }
415
+ if (!this.checkPermissionPrivate(context, PermissionType.Read)) {
416
+ return new DataValue({ statusCode: StatusCodes.BadUserAccessDenied });
417
+ }
418
+ if (!this.isUserReadable(context)) {
419
+ return new DataValue({ statusCode: StatusCodes.BadNotReadable });
420
+ }
421
+ if (!isValidDataEncoding(dataEncoding)) {
422
+ // Table 51: no encoding can be applied to a non-Structure value. The CTT
423
+ // (Attribute Read 037) still expects the requested timestamps on this Bad
424
+ // result, and a DataValue may carry them whatever its status.
425
+ return makeNowDataValue({ statusCode: StatusCodes.BadDataEncodingInvalid });
426
+ }
427
+
428
+ if (this._timestamped_get_func) {
429
+ if (this._timestamped_get_func.length === 0) {
430
+ const dataValueOrPromise = (this._timestamped_get_func as VariableDataValueGetterSync)();
431
+ if (!Object.hasOwn(dataValueOrPromise.constructor.prototype, "then")) {
432
+ if (dataValueOrPromise !== this.$dataValue) {
433
+ // we may have a problem here if we use a getter that returns a dataValue that is a ExtensionObject
434
+ if (dataValueOrPromise.value?.dataType === DataType.ExtensionObject) {
435
+ if (this.$extensionObject || this.$$extensionObjectArray) {
436
+ // we have an extension object already bound to this node
437
+ // the client is asking us to replace the object entirely by a new one
438
+ // const ext = dataValue.value.value;
439
+ this._internal_set_dataValue(dataValueOrPromise);
440
+ return dataValueOrPromise;
441
+ }
442
+ }
443
+
444
+ // TO DO : is this necessary ? this may interfere with current use of $dataValue
445
+ this.$dataValue = dataValueOrPromise as DataValue;
446
+ if (this.$dataValue.statusCode.isGoodish()) {
447
+ this.verifyVariantCompatibility(this.$dataValue.value);
448
+ }
449
+ }
450
+ } else {
451
+ errorLog(
452
+ "[NODE-OPCUA-E28] Unsupported: _timestamped_get_func returns a Promise ! , when the uaVariable has an async getter. Fix your application code."
453
+ );
454
+ }
455
+ }
456
+ }
457
+
458
+ let dataValue = this.$dataValue;
459
+
460
+ if (dataValue.statusCode.isGoodish()) {
461
+ // note : extractRange will clone the dataValue
462
+ dataValue = extractRange(dataValue, indexRange);
463
+ }
464
+
465
+ /* c8 ignore next */
466
+ if (
467
+ dataValue.statusCode.equals(StatusCodes.BadWaitingForInitialData) ||
468
+ dataValue.statusCode.equals(StatusCodes.UncertainInitialValue)
469
+ ) {
470
+ // c8 ignore next
471
+ doDebug &&
472
+ debugLog(
473
+ chalk.red(" Warning: UAVariable#readValue ") +
474
+ chalk.cyan(this.browseName.toString()) +
475
+ " (" +
476
+ chalk.yellow(this.nodeId.toString()) +
477
+ ") exists but dataValue has not been defined"
478
+ );
479
+ }
480
+ return dataValue;
481
+ }
482
+
483
+ public isEnumeration(): boolean {
484
+ return this.addressSpacePrivate.isEnumeration(this.dataType);
485
+ }
486
+
487
+ /**
488
+ * return true if the DataType is of type Extension object
489
+ * this is not taking into account the valueRank of the variable
490
+ */
491
+ public isExtensionObject(): boolean {
492
+ // DataType must be one of Structure
493
+ if (this.dataType.isEmpty()) return false;
494
+ const dataTypeNode = this.addressSpace.findDataType(this.dataType) as UADataType;
495
+ if (!dataTypeNode) {
496
+ throw new Error(` Cannot find DataType ${this.dataType.toString()} in standard address Space`);
497
+ }
498
+ const structureNode = this.addressSpace.findDataType("Structure");
499
+ if (!structureNode) {
500
+ throw new Error(" Cannot find 'Structure' DataType in standard address Space");
501
+ }
502
+ return dataTypeNode.isSubtypeOf(structureNode);
503
+ }
504
+
505
+ public _getEnumerationInfo(): EnumerationInfo {
506
+ // DataType must be one of Enumeration
507
+ assert(this.isEnumeration(), "Variable is not an enumeration");
508
+ const dataTypeNode = this.addressSpace.findDataType(this.dataType) as UADataTypeImpl;
509
+ return dataTypeNode._getEnumerationInfo();
510
+ }
511
+
512
+ public asyncRefresh(oldestDate: PreciseClock, callback: CallbackT<DataValue>): void;
513
+ public asyncRefresh(oldestDate: PreciseClock): Promise<DataValue>;
514
+ public asyncRefresh(oldestDate: PreciseClock, callback?: CallbackT<DataValue>): Promise<DataValue> | undefined {
515
+ // asyncRefresh is always invoked with a callback at runtime: the public overload without
516
+ // a callback is only reachable through the withCallback() wrapper installed below, which
517
+ // synthesizes one before calling into this implementation.
518
+ const cb = callback as CallbackT<DataValue>;
519
+ if (this.$dataValue.statusCode.isGoodish()) {
520
+ this.verifyVariantCompatibility(this.$dataValue.value);
521
+ }
522
+
523
+ const lessOrEqual = (a: PreciseClock, b: PreciseClock) => {
524
+ return (
525
+ a.timestamp.getTime() < b.timestamp.getTime() ||
526
+ (a.timestamp.getTime() === b.timestamp.getTime() && a.picoseconds <= b.picoseconds)
527
+ );
528
+ };
529
+
530
+ if (!this.refreshFunc) {
531
+ // no refresh func
532
+ const dataValue = this.readValue();
533
+ dataValue.serverTimestamp = oldestDate.timestamp;
534
+ dataValue.serverPicoseconds = oldestDate.picoseconds;
535
+ const serverClock = coerceClock(dataValue.serverTimestamp, dataValue.serverPicoseconds);
536
+ if (lessOrEqual(oldestDate, serverClock)) {
537
+ cb(null, dataValue);
538
+ return;
539
+ } else {
540
+ // fake
541
+ cb(null, dataValue);
542
+ return;
543
+ }
544
+ }
545
+
546
+ const c1 = this.$dataValue.serverTimestamp
547
+ ? coerceClock(this.$dataValue.serverTimestamp, this.$dataValue.serverPicoseconds)
548
+ : null;
549
+
550
+ if (c1 && lessOrEqual(oldestDate, c1)) {
551
+ const dataValue = this.readValue().clone();
552
+ dataValue.serverTimestamp = oldestDate.timestamp;
553
+ dataValue.serverPicoseconds = oldestDate.picoseconds;
554
+ cb(null, dataValue);
555
+ return;
556
+ }
557
+ try {
558
+ this.refreshFunc.call(this, (err: Error | null, dataValue?: DataValueLike) => {
559
+ // c8 ignore next
560
+ if (err || !dataValue) {
561
+ errorLog(
562
+ "-------------- refresh call failed",
563
+ this.browseName.toString(),
564
+ this.nodeId.toString(),
565
+ err?.message
566
+ );
567
+ dataValue = { statusCode: StatusCodes.BadNoDataAvailable };
568
+ }
569
+ if (dataValue && dataValue !== this.$dataValue) {
570
+ this._internal_set_dataValue(coerceDataValue(dataValue), null);
571
+ }
572
+ cb(err, this.$dataValue);
573
+ });
574
+ } catch (err) {
575
+ errorLog("-------------- refresh call failed 2", this.browseName.toString(), this.nodeId.toString());
576
+ errorLog(err);
577
+ const dataValue = new DataValue({ statusCode: StatusCodes.BadInternalError });
578
+ this._internal_set_dataValue(dataValue, null);
579
+ cb(err as Error, this.$dataValue);
580
+ }
581
+ return undefined;
582
+ }
583
+
584
+ public readEnumValue(): IEnumItem {
585
+ const value = this.readValue().value.value as number;
586
+ const enumInfo = this._getEnumerationInfo();
587
+ const enumV = enumInfo.valueIndex[value];
588
+ return { value, name: enumV ? enumV.name : "?????" };
589
+ }
590
+
591
+ public writeEnumValue(value: string | number): void {
592
+ const enumInfo = this._getEnumerationInfo();
593
+
594
+ if (typeof value === "string") {
595
+ if (!Object.hasOwn(enumInfo.nameIndex, value)) {
596
+ const possibleValues = Object.keys(enumInfo.nameIndex).join(",");
597
+ throw new Error(`UAVariable#writeEnumValue: cannot find value ${value} in [${possibleValues}]`);
598
+ }
599
+ const valueIndex = enumInfo.nameIndex[value].value;
600
+ value = valueIndex;
601
+ }
602
+ if (Number.isFinite(value)) {
603
+ const possibleValues = Object.keys(enumInfo.nameIndex).join(",");
604
+
605
+ if (!enumInfo.valueIndex[value]) {
606
+ throw new Error(`UAVariable#writeEnumValue : value out of range ${value} in [${possibleValues}]`);
607
+ }
608
+ this.setValueFromSource({
609
+ dataType: DataType.Int32,
610
+ value
611
+ });
612
+ } else {
613
+ throw new Error("UAVariable#writeEnumValue: value type mismatch");
614
+ }
615
+ }
616
+
617
+ public readAttribute(
618
+ context: ISessionContext | null,
619
+ attributeId: AttributeIds,
620
+ indexRange?: NumericRange,
621
+ dataEncoding?: QualifiedNameLike | null
622
+ ): DataValue {
623
+ context = context || SessionContext.defaultContext;
624
+ assert(context instanceof SessionContext);
625
+
626
+ const options: DataValueLike = {};
627
+
628
+ if (attributeId !== AttributeIds.Value) {
629
+ if (indexRange?.isDefined()) {
630
+ options.statusCode = StatusCodes.BadIndexRangeNoData;
631
+ return new DataValue(options);
632
+ }
633
+ if (isDataEncoding(dataEncoding)) {
634
+ options.statusCode = StatusCodes.BadDataEncodingInvalid;
635
+ return new DataValue(options);
636
+ }
637
+ }
638
+
639
+ switch (attributeId) {
640
+ case AttributeIds.Value:
641
+ return this.readValue(context, indexRange, dataEncoding);
642
+
643
+ case AttributeIds.DataType:
644
+ return this._readDataType();
645
+
646
+ case AttributeIds.ValueRank:
647
+ return this._readValueRank();
648
+
649
+ case AttributeIds.ArrayDimensions:
650
+ return this._readArrayDimensions();
651
+
652
+ case AttributeIds.AccessLevel:
653
+ return this._readAccessLevel(context);
654
+
655
+ case AttributeIds.UserAccessLevel:
656
+ return this._readUserAccessLevel(context);
657
+
658
+ case AttributeIds.MinimumSamplingInterval:
659
+ return this._readMinimumSamplingInterval();
660
+
661
+ case AttributeIds.Historizing:
662
+ return this._readHistorizing();
663
+
664
+ case AttributeIds.AccessLevelEx:
665
+ return this._readAccessLevelEx(context);
666
+ default:
667
+ return BaseNodeImpl.prototype.readAttribute.call(this, context, attributeId);
668
+ }
669
+ }
670
+
671
+ public getBasicDataType(): DataType {
672
+ return _getBasicDataType(this);
673
+ }
674
+ public adjustVariant(variant: Variant): Variant {
675
+ return adjustVariant(variant, this.valueRank, this.getBasicDataType());
676
+ }
677
+ public verifyVariantCompatibility(variant: Variant): void {
678
+ try {
679
+ // c8 ignore next
680
+ if (Object.hasOwn(variant, "value")) {
681
+ if (variant.dataType === null || variant.dataType === undefined) {
682
+ throw new Error(
683
+ "Variant must provide a valid dataType : variant = " +
684
+ variant.toString() +
685
+ " this.dataType= " +
686
+ this.dataType.toString()
687
+ );
688
+ }
689
+ if (
690
+ variant.dataType === DataType.Boolean &&
691
+ (this.dataType.namespace !== 0 || this.dataType.value !== DataType.Boolean)
692
+ ) {
693
+ throw new Error(
694
+ "Variant must provide a valid Boolean : variant = " +
695
+ variant.toString() +
696
+ " this.dataType= " +
697
+ this.dataType.toString()
698
+ );
699
+ }
700
+ if (
701
+ this.dataType.namespace === 0 &&
702
+ this.dataType.value === DataType.LocalizedText &&
703
+ variant.dataType !== DataType.LocalizedText &&
704
+ variant.dataType !== DataType.Null
705
+ ) {
706
+ throw new Error(
707
+ "Variant must provide a valid LocalizedText : variant = " +
708
+ variant.toString() +
709
+ " this.dataType= " +
710
+ this.dataType.toString()
711
+ );
712
+ }
713
+ }
714
+ const basicType = this.getBasicDataType();
715
+
716
+ if (basicType === DataType.String && variant.dataType === DataType.ByteString) {
717
+ return; // this is allowed
718
+ }
719
+ if (basicType === DataType.ByteString && variant.dataType === DataType.String) {
720
+ return; // this is allowed
721
+ }
722
+
723
+ if (
724
+ basicType !== DataType.Null &&
725
+ basicType !== DataType.Variant &&
726
+ variant.dataType !== DataType.Null &&
727
+ variant.dataType !== basicType
728
+ ) {
729
+ const message =
730
+ "UAVariable.setValueFromSource " +
731
+ this.browseName.toString() +
732
+ " nodeId:" +
733
+ this.nodeId.toString() +
734
+ " dataType:" +
735
+ this.dataType.toString() +
736
+ ":\n" +
737
+ "the provided variant must have the expected dataType!\n" +
738
+ " - the expected dataType is " +
739
+ chalk.cyan(DataType[basicType]) +
740
+ "\n" +
741
+ " - the actual dataType is " +
742
+ chalk.magenta(DataType[variant.dataType]) +
743
+ "\n" +
744
+ " - " +
745
+ variant.toString();
746
+ throw new Error(message);
747
+ }
748
+ } catch (err) {
749
+ errorLog("UAVariable ", (err as Error)?.message, this.browseName.toString(), " nodeId=", this.nodeId.toString());
750
+ errorLog((err as Error).message);
751
+ errorLog((err as Error).stack);
752
+ throw err;
753
+ }
754
+ }
755
+ /**
756
+ * setValueFromSource is used to let the device sets the variable values
757
+ * this method also records the current time as sourceTimestamp and serverTimestamp.
758
+ . *
759
+ * The method will raise an exception if the value is not compatible with the dataType and expected dimension
760
+ *
761
+
762
+ * @param variant {Variant}
763
+ * @param [statusCode {StatusCode} = StatusCodes.Good]
764
+ * @param [sourceTimestamp= Now]
765
+ */
766
+ public setValueFromSource(variant: VariantLike, statusCode?: StatusCode, sourceTimestamp?: Date): void {
767
+ try {
768
+ statusCode = statusCode || StatusCodes.Good;
769
+ const variant1 = Variant.coerce(variant);
770
+ this.verifyVariantCompatibility(variant1);
771
+ const now = coerceClock(sourceTimestamp, 0);
772
+
773
+ const dataValue = new DataValue(null);
774
+ dataValue.serverPicoseconds = now.picoseconds;
775
+ dataValue.serverTimestamp = now.timestamp;
776
+ dataValue.sourcePicoseconds = now.picoseconds;
777
+ dataValue.sourceTimestamp = now.timestamp;
778
+ dataValue.statusCode = statusCode;
779
+ dataValue.value = variant1;
780
+
781
+ if (dataValue.value.dataType === DataType.ExtensionObject) {
782
+ // early, detailed diagnostics on a malformed extension object (the actual throw
783
+ // happens below in _internal_set_dataValue).
784
+ const valueIsCorrect = this.checkExtensionObjectIsCorrect(dataValue.value.value);
785
+ if (!valueIsCorrect) {
786
+ errorLog("setValueFromSource Invalid value !");
787
+ errorLog(this.toString());
788
+ errorLog(dataValue.toString());
789
+ }
790
+ }
791
+ // Route every value - scalar or ExtensionObject - through _internal_set_dataValue.
792
+ // This guarantees the change is consistently propagated to observers (historian,
793
+ // monitored items) and, when the node is a bound extension object (or a bound
794
+ // sub-structure child), cascaded through the proxy field setters by the overridden
795
+ // _inner_replace_dataValue. Previously ExtensionObject values were special-cased with a
796
+ // silent "this.$dataValue = dataValue" assignment that skipped notification for plain
797
+ // (unbound) extension object variables and threw on bound sub-structure children.
798
+ this._internal_set_dataValue(dataValue);
799
+ } catch (err) {
800
+ errorLog("UAVariable#setValueFromString Error : ", this.browseName.toString(), this.nodeId.toString());
801
+ errorLog((err as Error).message);
802
+ errorLog(this.parent?.toString());
803
+ throw err;
804
+ }
805
+ }
806
+
807
+ /**
808
+ * The initial value of a variable a nodeset file declares, or the default of its data type.
809
+ *
810
+ * What setValueFromSource does, minus what a variable nobody has seen yet cannot need: the
811
+ * clone of the previous value and the comparison with it, the change event and the touch of
812
+ * the parents. The compatibility checks stay, since a wrong <Value> in a third-party nodeset
813
+ * is exactly what they catch. A variable that is bound already (an extension object proxy,
814
+ * a setter) takes the full path.
815
+ *
816
+ * @internal
817
+ */
818
+ public _setInitialDataValue(variant: VariantLike, statusCode: StatusCode = StatusCodes.Good): void {
819
+ // the loader creates every variable with an empty value object, which the constructor
820
+ // binds, so a bound setter is the norm here and not a reason to take the long path:
821
+ // setValueFromSource never consults it either. A bound extension object is.
822
+ if (this.$$extensionObjectArray || this.$set_ExtensionObject) {
823
+ this.setValueFromSource(variant, statusCode);
824
+ return;
825
+ }
826
+ try {
827
+ const variant1 = Variant.coerce(variant);
828
+ this.verifyVariantCompatibility(variant1);
829
+ if (variant1.dataType === DataType.ExtensionObject && !this.checkExtensionObjectIsCorrect(variant1.value)) {
830
+ throw new Error("invalid extension object");
831
+ }
832
+ const now = getCurrentClock();
833
+ this.$dataValue = new DataValue({
834
+ value: variant1,
835
+ statusCode,
836
+ sourceTimestamp: now.timestamp,
837
+ sourcePicoseconds: now.picoseconds,
838
+ serverTimestamp: now.timestamp,
839
+ serverPicoseconds: now.picoseconds
840
+ });
841
+ } catch (err) {
842
+ throw new Error(
843
+ `UAVariable#_setInitialDataValue ${this.browseName.toString()} ${this.nodeId.toString()}: ${(err as Error).message}`
844
+ );
845
+ }
846
+ }
847
+
848
+ private adjustDataValueStatusCode(dataValue: DataValue): StatusCode {
849
+ const statusCode = adjustDataValueStatusCode(
850
+ this,
851
+ dataValue,
852
+ (this as unknown as { acceptValueOutOfRange?: boolean }).acceptValueOutOfRange || false
853
+ );
854
+ return statusCode;
855
+ }
856
+
857
+ public writeValue(
858
+ context: ISessionContext,
859
+ dataValue: DataValue,
860
+ indexRange: string | NumericRange | null,
861
+ callback: StatusCodeCallback
862
+ ): void;
863
+ public writeValue(context: ISessionContext, dataValue: DataValue, callback: StatusCodeCallback): void;
864
+ public writeValue(
865
+ context: ISessionContext,
866
+ dataValue: DataValue,
867
+ indexRange?: string | NumericRange | null
868
+ ): Promise<StatusCode>;
869
+ public writeValue(context: ISessionContext, dataValue: DataValue, ...args: unknown[]): Promise<StatusCode> | undefined {
870
+ context = context || SessionContext.defaultContext;
871
+ assert(context instanceof SessionContext);
872
+
873
+ if (!dataValue.sourceTimestamp) {
874
+ // source timestamp was not specified by the caller
875
+ // we will set the timestamp ourself with the current clock
876
+ if (context.currentTime) {
877
+ dataValue.sourceTimestamp = context.currentTime.timestamp;
878
+ dataValue.sourcePicoseconds = context.currentTime.picoseconds;
879
+ } else {
880
+ const { timestamp, picoseconds } = getCurrentClock();
881
+ dataValue.sourceTimestamp = timestamp;
882
+ dataValue.sourcePicoseconds = picoseconds;
883
+ }
884
+ }
885
+
886
+ if (context.currentTime && !dataValue.serverTimestamp) {
887
+ dataValue.serverTimestamp = context.currentTime.timestamp;
888
+ dataValue.serverPicoseconds = context.currentTime.picoseconds;
889
+ }
890
+
891
+ // adjust arguments if optional indexRange Parameter is not given
892
+ let indexRange: NumericRange | null = null;
893
+ let callback: StatusCodeCallback;
894
+ if (args.length === 1) {
895
+ indexRange = new NumericRange();
896
+ callback = args[0] as StatusCodeCallback;
897
+ } else if (args.length === 2) {
898
+ indexRange = args[0] as NumericRange;
899
+ callback = args[1] as StatusCodeCallback;
900
+ } else {
901
+ throw new Error("Invalid Number of args");
902
+ }
903
+
904
+ assert(typeof callback === "function");
905
+ assert(dataValue instanceof DataValue);
906
+ // index range could be string
907
+ indexRange = NumericRange.coerce(indexRange);
908
+
909
+ // test write permission
910
+ if (!this.isWritable(context)) {
911
+ callback?.(null, StatusCodes.BadNotWritable);
912
+ return;
913
+ }
914
+ if (!this.checkPermissionPrivate(context, PermissionType.Write)) {
915
+ callback?.(null, StatusCodes.BadUserAccessDenied);
916
+ return;
917
+ }
918
+
919
+ // isWritable() and the role permission above already passed, so a false result
920
+ // here can only come from the UserAccessLevel attribute withholding CurrentWrite
921
+ // for this user (Part 3 5.6.3): that is an access decision, not an unsupported call.
922
+ if (!this.isUserWritable(context)) {
923
+ callback?.(null, StatusCodes.BadUserAccessDenied);
924
+ return;
925
+ }
926
+
927
+ // adjust special case
928
+ const variant = adjustVariant2.call(this, dataValue.value);
929
+
930
+ const statusCode = this.checkVariantCompatibility(variant);
931
+ if (statusCode.isNot(StatusCodes.Good)) {
932
+ callback?.(null, statusCode);
933
+ return;
934
+ }
935
+
936
+ // adjust dataValue.statusCode based on InstrumentRange and EngineeringUnits
937
+ const statusCode2 = this.adjustDataValueStatusCode(dataValue);
938
+ if (statusCode2.isNotGood()) {
939
+ callback?.(null, statusCode2);
940
+ return;
941
+ }
942
+
943
+ const write_func = this._timestamped_set_func || default_func;
944
+
945
+ if (!write_func) {
946
+ warningLog(` warning ${this.nodeId.toString()} ${this.browseName.toString()} has no setter. \n`);
947
+ warningLog("Please make sure to bind the variable or to pass a valid value: new Variant({}) during construction time");
948
+ callback?.(null, StatusCodes.BadNotWritable);
949
+ return;
950
+ }
951
+ assert(write_func);
952
+
953
+ write_func.call(this, dataValue, (err?: Error | null, statusCode1?: StatusCode) => {
954
+ if (!err) {
955
+ dataValue && this.verifyVariantCompatibility(dataValue.value);
956
+
957
+ if (indexRange && !indexRange.isEmpty()) {
958
+ if (!indexRange.isValid()) {
959
+ callback?.(null, StatusCodes.BadIndexRangeInvalid);
960
+ return;
961
+ }
962
+
963
+ const newArrayOrMatrix = dataValue.value.value;
964
+
965
+ if (dataValue.value.arrayType === VariantArrayType.Array) {
966
+ if (this.$dataValue.value.arrayType !== VariantArrayType.Array) {
967
+ callback(null, StatusCodes.BadTypeMismatch);
968
+ return;
969
+ }
970
+ // check that destination data is also an array
971
+ assert(check_valid_array(this.$dataValue.value.dataType, this.$dataValue.value.value));
972
+ const destArr = this.$dataValue.value.value;
973
+ const result = indexRange.set_values(destArr, newArrayOrMatrix);
974
+
975
+ if (result.statusCode.isNot(StatusCodes.Good)) {
976
+ callback?.(null, result.statusCode);
977
+ return;
978
+ }
979
+ dataValue.value.value = result.array;
980
+
981
+ // scrap original array so we detect range
982
+ this.$dataValue.value.value = null;
983
+ } else if (dataValue.value.arrayType === VariantArrayType.Matrix) {
984
+ const dimensions = this.$dataValue.value.dimensions;
985
+ if (this.$dataValue.value.arrayType !== VariantArrayType.Matrix || !dimensions) {
986
+ // not a matrix !
987
+ callback?.(null, StatusCodes.BadTypeMismatch);
988
+ return;
989
+ }
990
+ const matrix = this.$dataValue.value.value;
991
+ const result = indexRange.set_values_matrix(
992
+ {
993
+ matrix,
994
+ dimensions
995
+ },
996
+ newArrayOrMatrix
997
+ );
998
+ if (result.statusCode.isNot(StatusCodes.Good)) {
999
+ callback?.(null, result.statusCode);
1000
+ return;
1001
+ }
1002
+ dataValue.value.dimensions = this.$dataValue.value.dimensions;
1003
+ dataValue.value.value = result.matrix;
1004
+
1005
+ // scrap original array so we detect range
1006
+ this.$dataValue.value.value = null;
1007
+ } else {
1008
+ callback?.(null, StatusCodes.BadTypeMismatch);
1009
+ return;
1010
+ }
1011
+ }
1012
+ try {
1013
+ this._internal_set_dataValue(dataValue, indexRange);
1014
+ } catch (err) {
1015
+ if (types.isNativeError(err)) {
1016
+ warningLog(err.message);
1017
+ }
1018
+ callback?.(null, StatusCodes.BadInternalError);
1019
+ return;
1020
+ }
1021
+ }
1022
+ callback?.(err || null, statusCode1);
1023
+ });
1024
+ return undefined;
1025
+ }
1026
+
1027
+ public writeAttribute(context: ISessionContext | null, writeValue: WriteValueOptions, callback: StatusCodeCallback): void;
1028
+ public writeAttribute(context: ISessionContext | null, writeValue: WriteValueOptions): Promise<StatusCode>;
1029
+ public writeAttribute(
1030
+ context: ISessionContext | null,
1031
+ writeValueOptions: WriteValueOptions,
1032
+ callback?: (err: Error | null, statusCode?: StatusCode) => void
1033
+ ): Promise<StatusCode> | undefined {
1034
+ // c8 ignore next
1035
+ if (!callback) {
1036
+ throw new Error("Internal error");
1037
+ }
1038
+
1039
+ if (!this.canUserWriteAttribute(context, writeValueOptions.attributeId as AttributeIds)) {
1040
+ callback(null, StatusCodes.BadUserAccessDenied);
1041
+ return;
1042
+ }
1043
+ const writeValue: WriteValue =
1044
+ writeValueOptions instanceof WriteValue ? (writeValueOptions as WriteValue) : new WriteValue(writeValueOptions);
1045
+
1046
+ context = context || SessionContext.defaultContext;
1047
+
1048
+ assert(context instanceof SessionContext);
1049
+ assert(writeValue instanceof WriteValue);
1050
+ assert(writeValue.value instanceof DataValue);
1051
+ assert(writeValue.value?.value instanceof Variant);
1052
+ assert(typeof callback === "function");
1053
+
1054
+ // Spec 1.0.2 Part 4 page 58
1055
+ // If the SourceTimestamp or the ServerTimestamp is specified, the Server shall
1056
+ // use these values.
1057
+
1058
+ // xx _apply_default_timestamps(writeValue.value);
1059
+
1060
+ switch (writeValue.attributeId) {
1061
+ case AttributeIds.Value:
1062
+ this.writeValue(context, writeValue.value as DataValue, writeValue.indexRange, callback);
1063
+ break;
1064
+ case AttributeIds.Historizing:
1065
+ if (writeValue.value?.value.dataType !== DataType.Boolean) {
1066
+ callback(null, StatusCodes.BadTypeMismatch);
1067
+ break;
1068
+ }
1069
+ if (!this.checkPermissionPrivate(context, PermissionType.WriteHistorizing)) {
1070
+ callback(null, StatusCodes.BadUserAccessDenied);
1071
+ break;
1072
+ }
1073
+
1074
+ if (!this.canUserWriteHistorizingAttribute(context)) {
1075
+ callback(null, StatusCodes.BadHistoryOperationUnsupported);
1076
+ break;
1077
+ }
1078
+
1079
+ // Historizing is a real, writable attribute of a Variable (Part 3 5.6.2); a node
1080
+ // without an HA Configuration simply cannot honour it right now, which is
1081
+ // BadNotWritable, not BadNotSupported (that would mean the attribute never applies).
1082
+ if (!this.getChildByName("HA Configuration")) {
1083
+ callback(null, StatusCodes.BadNotWritable);
1084
+ break;
1085
+ }
1086
+ // check if user is allowed to do that !
1087
+ // TODO
1088
+ this.historizing = !!writeValue.value?.value.value; // yes ! indeed !
1089
+ callback(null, StatusCodes.Good);
1090
+ break;
1091
+
1092
+ default:
1093
+ super.writeAttribute(context, writeValue, callback);
1094
+ break;
1095
+ }
1096
+ return undefined;
1097
+ }
1098
+
1099
+ /**
1100
+
1101
+ * note:
1102
+ * this method is overridden in address-space-data-access
1103
+ * @return {StatusCode}
1104
+ */
1105
+ public checkVariantCompatibility(value: Variant): StatusCode {
1106
+ // test dataType
1107
+ if (!this._validate_DataType(value.dataType)) {
1108
+ return StatusCodes.BadTypeMismatch;
1109
+ }
1110
+ try {
1111
+ this.verifyVariantCompatibility(value);
1112
+ } catch (_err) {
1113
+ return StatusCodes.BadTypeMismatch;
1114
+ }
1115
+ return StatusCodes.Good;
1116
+ }
1117
+
1118
+ /**
1119
+ * touch the source timestamp of a Variable and cascade up the change
1120
+ * to the parent variable if any.
1121
+ */
1122
+ public touchValue(optionalNow?: PreciseClock): void {
1123
+ const now = optionalNow || getCurrentClock();
1124
+ propagateTouchValueUpward(this, now);
1125
+ }
1126
+
1127
+ /**
1128
+ * bind a variable with a get and set functions.
1129
+ *
1130
+ * properties:
1131
+ * - value: a Variant or a status code
1132
+ * - sourceTimestamp
1133
+ * - sourcePicoseconds
1134
+ * @param [options.timestamped_set]
1135
+ * @param [options.refreshFunc] the variable asynchronous getter function.
1136
+ * @param [overwrite {Boolean} = false] set overwrite to true to overwrite existing binding
1137
+ * @return void
1138
+ *
1139
+ *
1140
+ * ### Providing read access to the underlying value
1141
+ *
1142
+ * #### Variation 1
1143
+ *
1144
+ * In this variation, the user provides a function that returns a Variant with the current value.
1145
+ *
1146
+ * The sourceTimestamp will be set automatically.
1147
+ *
1148
+ * The get function is called synchronously.
1149
+ *
1150
+ * @example
1151
+ *
1152
+ *
1153
+ * ```javascript
1154
+ * ...
1155
+ * var options = {
1156
+ * get : () => {
1157
+ * return new Variant({...});
1158
+ * },
1159
+ * set : function(variant) {
1160
+ * // store the variant somewhere
1161
+ * return StatusCodes.Good;
1162
+ * }
1163
+ * };
1164
+ * ...
1165
+ * engine.bindVariable(nodeId,options):
1166
+ * ...
1167
+ * ```
1168
+ *
1169
+ *
1170
+ * #### Variation 2:
1171
+ *
1172
+ * This variation can be used when the user wants to specify a specific '''sourceTimestamp''' associated
1173
+ * with the current value of the UAVariable.
1174
+ *
1175
+ * The provided ```timestamped_get``` function should return an object with three properties:
1176
+ * * value: containing the variant value or a error StatusCode,
1177
+ * * sourceTimestamp
1178
+ * * sourcePicoseconds
1179
+ *
1180
+ * ```javascript
1181
+ * ...
1182
+ * var myDataValue = new DataValue({
1183
+ * value: {dataType: DataType.Double , value: 10.0},
1184
+ * sourceTimestamp : new Date(),
1185
+ * sourcePicoseconds: 0
1186
+ * });
1187
+ * ...
1188
+ * var options = {
1189
+ * timestamped_get : () => { return myDataValue; }
1190
+ * };
1191
+ * ...
1192
+ * engine.bindVariable(nodeId,options):
1193
+ * ...
1194
+ * // record a new value
1195
+ * myDataValue.value.value = 5.0;
1196
+ * myDataValue.sourceTimestamp = new Date();
1197
+ * ...
1198
+ * ```
1199
+ *
1200
+ *
1201
+ * #### Variation 3:
1202
+ *
1203
+ * This variation can be used when the value associated with the variables requires a asynchronous function call to be
1204
+ * extracted. In this case, the user should provide an async method ```refreshFunc```.
1205
+ *
1206
+ *
1207
+ * The ```refreshFunc``` shall do whatever is necessary to fetch the most up to date version of the variable value, and
1208
+ * call the ```callback``` function when the data is ready.
1209
+ *
1210
+ *
1211
+ * The ```callback``` function follow the standard callback function signature:
1212
+ * * the first argument shall be **null** or **Error**, depending of the outcome of the fetch operation,
1213
+ * * the second argument shall be a DataValue with the new UAVariable Value, a StatusCode, and time stamps.
1214
+ *
1215
+ *
1216
+ * Optionally, it is possible to pass a sourceTimestamp and a sourcePicoseconds value as a third and fourth arguments
1217
+ * of the callback. When sourceTimestamp and sourcePicoseconds are missing, the system will set their default value
1218
+ * to the current time..
1219
+ *
1220
+ *
1221
+ * ```javascript
1222
+ * ...
1223
+ * var options = {
1224
+ * refreshFunc : function(callback) {
1225
+ * ... do_some_async_stuff_to_get_the_new_variable_value
1226
+ * var dataValue = new DataValue({
1227
+ * value: new Variant({...}),
1228
+ * statusCode: StatusCodes.Good,
1229
+ * sourceTimestamp: new Date()
1230
+ * });
1231
+ * callback(null,dataValue);
1232
+ * }
1233
+ * };
1234
+ * ...
1235
+ * variable.bindVariable(nodeId,options):
1236
+ * ...
1237
+ * ```
1238
+ *
1239
+ * ### Providing write access to the underlying value
1240
+ *
1241
+ * #### Variation1 - provide a simple synchronous set function
1242
+ *
1243
+ *
1244
+ * #### Notes
1245
+ * to do : explain return StatusCodes.GoodCompletesAsynchronously;
1246
+ *
1247
+ */
1248
+ public bindVariable(options?: BindVariableOptions, overwrite?: boolean): void {
1249
+ if (overwrite) {
1250
+ this._timestamped_set_func = null;
1251
+ this._timestamped_get_func = null;
1252
+ this._get_func = null;
1253
+ this._set_func = null;
1254
+ this.refreshFunc = undefined;
1255
+ this._historyRead = UAVariableImpl.prototype._historyRead;
1256
+ }
1257
+
1258
+ options = options || {};
1259
+
1260
+ assert(typeof this._timestamped_set_func !== "function", "UAVariable already bound");
1261
+ assert(typeof this._timestamped_get_func !== "function", "UAVariable already bound");
1262
+
1263
+ bind_getter.call(this, options);
1264
+ bind_setter.call(this, options);
1265
+
1266
+ const _historyRead = options.historyRead;
1267
+ if (_historyRead) {
1268
+ assert(typeof this._historyRead !== "function" || this._historyRead === UAVariableImpl.prototype._historyRead);
1269
+ assert(typeof _historyRead === "function");
1270
+
1271
+ this._historyRead = _historyRead;
1272
+ assert(this._historyRead.length === 6);
1273
+ }
1274
+ // post conditions
1275
+ assert(typeof this._timestamped_set_func === "function");
1276
+ assert(this._timestamped_set_func?.length === 2, "expecting 2 parameters");
1277
+ }
1278
+
1279
+ /**
1280
+
1281
+ */
1282
+ public readValueAsync(context: ISessionContext | null, callback: CallbackT<DataValue>): void;
1283
+ public readValueAsync(context: ISessionContext | null): Promise<DataValue>;
1284
+ public readValueAsync(context: ISessionContext | null, callback?: CallbackT<DataValue>): Promise<DataValue> | undefined {
1285
+ assert(typeof callback === "function");
1286
+
1287
+ context = context || SessionContext.defaultContext;
1288
+
1289
+ this.__waiting_callbacks = this.__waiting_callbacks || [];
1290
+ this.__waiting_callbacks.push(callback as CallbackT<DataValue>);
1291
+
1292
+ const _readValueAsync_in_progress = this.__waiting_callbacks.length >= 2;
1293
+ if (_readValueAsync_in_progress) {
1294
+ return;
1295
+ }
1296
+
1297
+ if (this.isDisposed()) {
1298
+ callback?.(null, new DataValue({ statusCode: StatusCodes.BadNodeIdUnknown }));
1299
+ return;
1300
+ }
1301
+
1302
+ const readImmediate = (innerCallback: (err: Error | null, dataValue: DataValue) => void) => {
1303
+ assert(this.$dataValue instanceof DataValue);
1304
+ const dataValue = this.readValue(context);
1305
+ innerCallback(null, dataValue);
1306
+ };
1307
+
1308
+ let func: (innerCallback: (err: Error | null, dataValue: DataValue) => void) => void;
1309
+
1310
+ const answerStatusOnly = (statusCode: StatusCode) => (innerCallback: (err: Error | null, dataValue: DataValue) => void) =>
1311
+ innerCallback(null, new DataValue({ statusCode }));
1312
+
1313
+ if (context.isAccessRestricted(this)) {
1314
+ // same gate as readValue(): a variable bound with a simple get()
1315
+ // also gets a refreshFunc, sending every read down the asyncRefresh
1316
+ // branch below - which calls the getter directly and never passes
1317
+ // through readValue(). Without this check here, a node hardened
1318
+ // with AccessRestrictions(EncryptionRequired) answered its value
1319
+ // over an unencrypted channel.
1320
+ func = answerStatusOnly(StatusCodes.BadSecurityModeInsufficient);
1321
+ } else if (!this.isReadable(context)) {
1322
+ func = answerStatusOnly(StatusCodes.BadNotReadable);
1323
+ } else if (!this.checkPermissionPrivate(context, PermissionType.Read)) {
1324
+ func = answerStatusOnly(StatusCodes.BadUserAccessDenied);
1325
+ } else if (!this.isUserReadable(context)) {
1326
+ func = answerStatusOnly(StatusCodes.BadNotReadable);
1327
+ } else {
1328
+ const clock = getCurrentClock();
1329
+ func = typeof this.refreshFunc === "function" ? this.asyncRefresh.bind(this, clock) : readImmediate;
1330
+ }
1331
+
1332
+ const satisfy_callbacks = (err: Error | null, dataValue?: DataValue) => {
1333
+ // now call all pending callbacks
1334
+ const callbacks = this.__waiting_callbacks || [];
1335
+ this.__waiting_callbacks = [];
1336
+ const _n = callbacks.length;
1337
+ for (const callback1 of callbacks) {
1338
+ callback1.call(this, err, dataValue);
1339
+ }
1340
+ };
1341
+
1342
+ try {
1343
+ func.call(this, satisfy_callbacks);
1344
+ } catch (err) {
1345
+ // c8 ignore next
1346
+ if (doDebug) {
1347
+ debugLog(chalk.red("func readValueAsync has failed "));
1348
+ if (types.isNativeError(err)) {
1349
+ debugLog(" stack", err.stack);
1350
+ }
1351
+ }
1352
+ satisfy_callbacks(err as Error);
1353
+ }
1354
+ return undefined;
1355
+ }
1356
+
1357
+ public getWriteMask(): number {
1358
+ return super.getWriteMask();
1359
+ }
1360
+
1361
+ public getUserWriteMask(): number {
1362
+ return super.getUserWriteMask();
1363
+ }
1364
+
1365
+ public clone(options: CloneOptions, optionalFilter?: CloneFilter, extraInfo?: CloneExtraInfo): UAVariable {
1366
+ options = {
1367
+ ...options,
1368
+ // check this eventNotifier: this.eventNotifier,
1369
+ // check this symbolicName: this.symbolicName,
1370
+
1371
+ accessLevel: this.accessLevel,
1372
+ arrayDimensions: this.arrayDimensions,
1373
+ dataType: this.dataType,
1374
+ historizing: this.historizing,
1375
+ minimumSamplingInterval: this.minimumSamplingInterval,
1376
+ userAccessLevel: this.userAccessLevel,
1377
+ valueRank: this.valueRank
1378
+ };
1379
+
1380
+ const newVariable = _clone(
1381
+ this,
1382
+ UAVariableImpl<T>,
1383
+ options,
1384
+ optionalFilter || defaultCloneFilter,
1385
+ extraInfo || makeDefaultCloneExtraInfo(this)
1386
+ ) as UAVariableImpl<T>;
1387
+
1388
+ newVariable.bindVariable();
1389
+
1390
+ assert(typeof newVariable._timestamped_set_func === "function");
1391
+
1392
+ assert(newVariable.dataType === this.dataType);
1393
+ newVariable.$dataValue = this.$dataValue.clone();
1394
+
1395
+ // also bind extension object
1396
+ const v = newVariable.$dataValue.value;
1397
+ if (v.dataType === DataType.ExtensionObject && v.value && v.arrayType === VariantArrayType.Scalar) {
1398
+ try {
1399
+ newVariable.bindExtensionObject(newVariable.$dataValue.value.value);
1400
+ } catch (err) {
1401
+ errorLog("Error binding extension objects");
1402
+ errorLog((err as Error).message);
1403
+ errorLog(this.toString());
1404
+ errorLog("---------------------------------------");
1405
+ errorLog(this.$dataValue.toString());
1406
+ errorLog("---------------------------------------");
1407
+ errorLog(newVariable.$dataValue.toString());
1408
+ throw err;
1409
+ }
1410
+ }
1411
+ return newVariable;
1412
+ }
1413
+
1414
+ public getDataTypeNode(): UADataType {
1415
+ const addressSpace = this.addressSpace;
1416
+ if (this.dataType.isEmpty()) {
1417
+ this.dataType = this.resolveNodeId(DataType.Variant);
1418
+ }
1419
+ const dt = addressSpace.findNode(this.dataType);
1420
+ // c8 ignore next
1421
+ if (!dt) {
1422
+ throw new Error(`getDataTypeNode: cannot find dataType ${this.dataType.toString()}`);
1423
+ }
1424
+ return dt as UADataType;
1425
+ }
1426
+
1427
+ public get dataTypeObj(): UADataType {
1428
+ return this.getDataTypeNode();
1429
+ }
1430
+
1431
+ public checkExtensionObjectIsCorrect(extObj: ExtensionObject | ExtensionObject[] | null): boolean {
1432
+ if (!extObj) {
1433
+ return true;
1434
+ }
1435
+ const addressSpace = this.addressSpace;
1436
+ if (!addressSpace) {
1437
+ return true;
1438
+ }
1439
+ const dataType = addressSpace.findDataType(this.dataType);
1440
+ if (!dataType) {
1441
+ // may be we are in the process of loading a xml file and the corresponding dataType
1442
+ // has not yet been loaded !
1443
+ return true;
1444
+ }
1445
+ if (dataType.nodeId.namespace === 0 && dataType.nodeId.value === DataType.ExtensionObject) {
1446
+ return true;
1447
+ }
1448
+ const Constructor = addressSpace.getExtensionObjectConstructor(this.dataType);
1449
+
1450
+ if (this.valueRank === -1) {
1451
+ /** Scalar */
1452
+ if (Array.isArray(extObj)) {
1453
+ return false;
1454
+ }
1455
+ return checkExtensionObjectIsCorrectScalar.call(this, extObj);
1456
+ } else if (this.valueRank >= 1) {
1457
+ /** array */
1458
+ if (!Array.isArray(extObj)) {
1459
+ // let's coerce this scalar into an 1-element array if it is a valid extension object
1460
+ if (checkExtensionObjectIsCorrectScalar.call(this, extObj)) {
1461
+ warningLog(
1462
+ `warning: checkExtensionObjectIsCorrect : expecting a array but got a scalar (value rank of '${this.browseName.toString()}' is 1)\nautomatic conversion from scalar to array with 1 element is taking place.`
1463
+ );
1464
+ extObj = [extObj];
1465
+ } else {
1466
+ return false;
1467
+ }
1468
+ }
1469
+ return checkExtensionObjectIsCorrectArray.call(this, extObj);
1470
+ } else if (this.valueRank === 0) {
1471
+ // Scalar or Array
1472
+ const isCorrectScalar = !Array.isArray(extObj) && checkExtensionObjectIsCorrectScalar.call(this, extObj);
1473
+ const isCorrectArray =
1474
+ Array.isArray(extObj) && checkExtensionObjectIsCorrectArray.call(this, extObj as ExtensionObject[]);
1475
+ return isCorrectArray || isCorrectScalar;
1476
+ } else {
1477
+ throw new Error(
1478
+ `checkExtensionObjectIsCorrect: Not Implemented case, please contact sterfive : this.valueRank =${this.valueRank}`
1479
+ );
1480
+ }
1481
+ function checkExtensionObjectIsCorrectScalar(this: UAVariableImpl, extObj: ExtensionObject | null): boolean {
1482
+ // c8 ignore next
1483
+ if (!extObj?.constructor) {
1484
+ errorLog(extObj);
1485
+ throw new Error("expecting an valid extension object");
1486
+ }
1487
+
1488
+ if (extObj.constructor.name === Constructor.name) {
1489
+ return true;
1490
+ }
1491
+
1492
+ if (extObj instanceof OpaqueStructure) {
1493
+ throw new Error("An opaque structure is not expected here");
1494
+ }
1495
+ // let's verify that the constructor is a sub-class of Constructor
1496
+ let current: IStructuredTypeSchema | null = extObj.schema;
1497
+ while (current) {
1498
+ if (current.name === Constructor.name) {
1499
+ return true;
1500
+ }
1501
+ current = current.getBaseSchema();
1502
+ }
1503
+ return false;
1504
+ }
1505
+
1506
+ function checkExtensionObjectIsCorrectArray(this: UAVariableImpl, extObjArray: ExtensionObject[]): boolean {
1507
+ // c8 ignore next
1508
+ for (const extObj of extObjArray) {
1509
+ if (!extObj?.constructor) {
1510
+ errorLog(extObj);
1511
+ throw new Error("expecting an valid extension object");
1512
+ }
1513
+ }
1514
+ try {
1515
+ for (const e of extObjArray) {
1516
+ if (!e) {
1517
+ continue;
1518
+ }
1519
+ if (e.constructor.name !== Constructor.name) {
1520
+ // c8 ignore next
1521
+ doDebug && debugLog("extObj.constructor.name ", e.constructor.name, "expected", Constructor.name);
1522
+ return false;
1523
+ }
1524
+ }
1525
+ return true;
1526
+ } catch (err) {
1527
+ errorLog(err);
1528
+ return false;
1529
+ }
1530
+ }
1531
+ }
1532
+
1533
+ public changeDataType(newDataType: NodeIdLike, newValue?: VariantLike): void {
1534
+ changeUAVariableDataType(this, newDataType, newValue);
1535
+ }
1536
+
1537
+ /**
1538
+ * @private
1539
+ * install UAVariable to exposed th
1540
+ *
1541
+ * precondition:
1542
+ */
1543
+ public installExtensionObjectVariables(): void {
1544
+ _installExtensionObjectBindingOnProperties(this, { createMissingProp: true });
1545
+ }
1546
+ /**
1547
+
1548
+ * @return {ExtensionObject}
1549
+ */
1550
+ public bindExtensionObjectScalar(
1551
+ optionalExtensionObject?: ExtensionObject,
1552
+ options?: BindExtensionObjectOptions
1553
+ ): ExtensionObject | null {
1554
+ assert(this.valueRank === -1, "expecting an Scalar variable here");
1555
+ return _bindExtensionObject(this, optionalExtensionObject, options) as ExtensionObject;
1556
+ }
1557
+
1558
+ public bindExtensionObjectArray(
1559
+ optionalExtensionObject?: ExtensionObject[],
1560
+ options?: BindExtensionObjectOptions
1561
+ ): ExtensionObject[] | null {
1562
+ assert(this.valueRank >= 1, "expecting an Array or a Matrix variable here");
1563
+ return _bindExtensionObjectArrayOrMatrix(this, optionalExtensionObject, options);
1564
+ }
1565
+
1566
+ public bindExtensionObject(
1567
+ optionalExtensionObject?: ExtensionObject | ExtensionObject[],
1568
+ options?: BindExtensionObjectOptions
1569
+ ): ExtensionObject | ExtensionObject[] | null {
1570
+ // coerce to ExtensionObject[] when this.valueRank === 1
1571
+ if (
1572
+ optionalExtensionObject &&
1573
+ this.valueRank === 1 &&
1574
+ !Array.isArray(optionalExtensionObject) &&
1575
+ optionalExtensionObject instanceof ExtensionObject
1576
+ ) {
1577
+ warningLog(
1578
+ "bindExtensionObject: coerce to ExtensionObject[] when valueRank === 1 and value is a scalar extension object"
1579
+ );
1580
+ optionalExtensionObject = [optionalExtensionObject];
1581
+ }
1582
+
1583
+ if (optionalExtensionObject) {
1584
+ if (Array.isArray(optionalExtensionObject)) {
1585
+ assert(this.valueRank >= 1, "bindExtensionObject: expecting an Array of Matrix variable here");
1586
+ return _bindExtensionObjectArrayOrMatrix(this, optionalExtensionObject, options);
1587
+ } else {
1588
+ if (this.valueRank !== -1 && this.valueRank !== 0) {
1589
+ throw new Error(`bindExtensionObject: expecting an Scalar variable here but got value rank ${this.valueRank}`);
1590
+ }
1591
+ return _bindExtensionObject(this, optionalExtensionObject, options) as ExtensionObject;
1592
+ }
1593
+ }
1594
+ assert(optionalExtensionObject === undefined || optionalExtensionObject === null);
1595
+ if (this.valueRank === -1) {
1596
+ return _bindExtensionObject(this, undefined, options) as ExtensionObject;
1597
+ } else if (this.valueRank === 1) {
1598
+ return _bindExtensionObjectArrayOrMatrix(this, undefined, options);
1599
+ } else if (this.valueRank > 1) {
1600
+ return _bindExtensionObjectArrayOrMatrix(this, undefined, options);
1601
+ }
1602
+ // unsupported case ...
1603
+ return null;
1604
+ }
1605
+
1606
+ public updateExtensionObjectPartial(partialExtensionObject?: Record<string, unknown>): ExtensionObject {
1607
+ setExtensionObjectPartialValue(this, partialExtensionObject);
1608
+ return this.$extensionObject as ExtensionObject;
1609
+ }
1610
+
1611
+ public incrementExtensionObjectPartial(path: string | string[]): void {
1612
+ const extensionObject = this.readValue().value.value as ExtensionObject;
1613
+ const partialData = extractPartialData(path, extensionObject);
1614
+ incrementElement(path, partialData);
1615
+ setExtensionObjectPartialValue(this, partialData);
1616
+ }
1617
+
1618
+ public toString(): string {
1619
+ const options = new ToStringBuilder();
1620
+ UAVariable_toString.call(this, options);
1621
+ return options.toString();
1622
+ }
1623
+
1624
+ public toJSON(): Record<string, unknown> {
1625
+ let value: unknown;
1626
+ let statusCode: string | undefined;
1627
+ try {
1628
+ const dv = this.$dataValue;
1629
+ if (dv) {
1630
+ statusCode = dv.statusCode?.toString();
1631
+ if (dv.value && !(dv.value.value instanceof OpaqueStructure)) {
1632
+ value = dv.value.value;
1633
+ }
1634
+ }
1635
+ } catch {
1636
+ // ignore — value access may fail for bound variables
1637
+ }
1638
+ return {
1639
+ ...super.toJSON(),
1640
+ typeDefinition: this.typeDefinitionObj?.browseName.toString(),
1641
+ dataType: this.dataType?.toString(),
1642
+ valueRank: this.valueRank,
1643
+ arrayDimensions: this.arrayDimensions,
1644
+ accessLevel: AccessLevelFlag[this.accessLevel],
1645
+ statusCode,
1646
+ value
1647
+ };
1648
+ }
1649
+
1650
+ public [Symbol.for("nodejs.util.inspect.custom")](depth: number | null, inspectOptions: { colors?: boolean }): string {
1651
+ const c = inspectOptions?.colors === false ? plainChalk : chalk;
1652
+ const typeName = this.typeDefinitionObj?.browseName.toString() ?? "?";
1653
+ const displayName = this.displayName.length ? this.displayName.map((d) => d.text).join(" | ") : "";
1654
+ if (depth !== null && depth <= 0) {
1655
+ return `${c.cyan("UAVariable<")}${c.green(this.browseName.toString())}${c.grey(` ${this.nodeId.toString()}`)}${c.cyan(">")}`;
1656
+ }
1657
+ const dt = this.dataType?.toString() ?? "?";
1658
+ let valueStr = "";
1659
+ let statusStr = "";
1660
+ try {
1661
+ const dv = this.$dataValue;
1662
+ if (dv) {
1663
+ if (dv.statusCode) statusStr = dv.statusCode.toString();
1664
+ if (
1665
+ dv.value &&
1666
+ dv.value.value !== undefined &&
1667
+ dv.value.value !== null &&
1668
+ !(dv.value.value instanceof OpaqueStructure)
1669
+ ) {
1670
+ const v = dv.value.value;
1671
+ valueStr = typeof v === "object" ? Object.prototype.toString.call(v) : String(v);
1672
+ if (valueStr.length > 80) valueStr = `${valueStr.slice(0, 77)}...`;
1673
+ }
1674
+ }
1675
+ } catch {
1676
+ // ignore
1677
+ }
1678
+ const lines = [
1679
+ `${c.cyan("UAVariable ")}${c.green(this.browseName.toString())}${c.grey(` ${this.nodeId.toString()}`)}`,
1680
+ c.yellow(" typeDefinition : ") + typeName,
1681
+ c.yellow(" displayName : ") + displayName,
1682
+ c.yellow(" dataType : ") + dt,
1683
+ c.yellow(" valueRank : ") + valueRankToString(this.valueRank),
1684
+ c.yellow(" accessLevel : ") + AccessLevelFlag[this.accessLevel]
1685
+ ];
1686
+ if (this.arrayDimensions?.length) {
1687
+ lines.push(c.yellow(" arrayDimensions: ") + JSON.stringify(this.arrayDimensions));
1688
+ }
1689
+ if (valueStr) {
1690
+ lines.push(c.yellow(" value : ") + valueStr);
1691
+ }
1692
+ if (statusStr && statusStr !== "Good (0x00000000)") {
1693
+ lines.push(c.yellow(" statusCode : ") + statusStr);
1694
+ }
1695
+ if (this.description?.text) {
1696
+ lines.push(c.yellow(" description : ") + this.description.text);
1697
+ }
1698
+ return lines.join("\n");
1699
+ }
1700
+
1701
+ // ---------------------------------------------------------------------------------------------------
1702
+ // History
1703
+ // ---------------------------------------------------------------------------------------------------
1704
+
1705
+ public historyRead(
1706
+ context: ISessionContext,
1707
+ historyReadDetails:
1708
+ | HistoryReadDetails
1709
+ | ReadRawModifiedDetails
1710
+ | ReadEventDetails
1711
+ | ReadProcessedDetails
1712
+ | ReadAtTimeDetails,
1713
+ indexRange: NumericRange | null,
1714
+ dataEncoding: QualifiedNameLike | null,
1715
+ continuationData: ContinuationData
1716
+ ): Promise<HistoryReadResult>;
1717
+
1718
+ public historyRead(
1719
+ context: ISessionContext,
1720
+ historyReadDetails:
1721
+ | HistoryReadDetails
1722
+ | ReadRawModifiedDetails
1723
+ | ReadEventDetails
1724
+ | ReadProcessedDetails
1725
+ | ReadAtTimeDetails,
1726
+ indexRange: NumericRange | null,
1727
+ dataEncoding: QualifiedNameLike | null,
1728
+ continuationData: ContinuationData,
1729
+ callback: CallbackT<HistoryReadResult>
1730
+ ): void;
1731
+ public historyRead(
1732
+ context: ISessionContext,
1733
+ historyReadDetails:
1734
+ | HistoryReadDetails
1735
+ | ReadRawModifiedDetails
1736
+ | ReadEventDetails
1737
+ | ReadProcessedDetails
1738
+ | ReadAtTimeDetails,
1739
+ indexRange: NumericRange | null,
1740
+ dataEncoding: QualifiedNameLike | null,
1741
+ continuationData: ContinuationData,
1742
+ callback?: CallbackT<HistoryReadResult>
1743
+ ): Promise<HistoryReadResult> | undefined {
1744
+ assert(context instanceof SessionContext);
1745
+ assert(typeof callback === "function");
1746
+ if (typeof this._historyRead !== "function") {
1747
+ callback?.(null, new HistoryReadResult({ statusCode: StatusCodes.BadNotReadable }));
1748
+ return;
1749
+ }
1750
+
1751
+ this._historyRead(
1752
+ context,
1753
+ historyReadDetails,
1754
+ indexRange,
1755
+ dataEncoding,
1756
+ continuationData,
1757
+ callback as CallbackT<HistoryReadResult>
1758
+ );
1759
+ return undefined;
1760
+ }
1761
+
1762
+ public _historyReadRaw(
1763
+ _context: ISessionContext,
1764
+ _historyReadRawModifiedDetails: ReadRawModifiedDetails,
1765
+ _indexRange: NumericRange | null,
1766
+ _dataEncoding: QualifiedNameLike | null,
1767
+ _continuationData: ContinuationData,
1768
+ _callback: CallbackT<HistoryReadResult>
1769
+ ): void {
1770
+ throw new Error("");
1771
+ }
1772
+
1773
+ public _historyReadRawModify(
1774
+ _context: ISessionContext,
1775
+ _historyReadRawModifiedDetails: ReadRawModifiedDetails,
1776
+ _indexRange: NumericRange | null,
1777
+ _dataEncoding: QualifiedNameLike | null,
1778
+ _continuationData: ContinuationData,
1779
+ _callback?: CallbackT<HistoryReadResult>
1780
+ ): void {
1781
+ throw new Error("");
1782
+ }
1783
+
1784
+ public _historyRead(
1785
+ context: ISessionContext,
1786
+ _historyReadDetails:
1787
+ | HistoryReadDetails
1788
+ | ReadRawModifiedDetails
1789
+ | ReadEventDetails
1790
+ | ReadProcessedDetails
1791
+ | ReadAtTimeDetails,
1792
+ _indexRange: NumericRange | null,
1793
+ _dataEncoding: QualifiedNameLike | null,
1794
+ _continuationData: ContinuationData,
1795
+ callback: CallbackT<HistoryReadResult>
1796
+ ): void {
1797
+ if (!this.checkPermissionPrivate(context, PermissionType.ReadHistory)) {
1798
+ const result = new HistoryReadResult({
1799
+ statusCode: StatusCodes.BadUserAccessDenied
1800
+ });
1801
+ callback(null, result);
1802
+ }
1803
+ if (!this.canUserReadHistory(context)) {
1804
+ const result = new HistoryReadResult({
1805
+ statusCode: StatusCodes.BadHistoryOperationUnsupported
1806
+ });
1807
+ callback(null, result);
1808
+ }
1809
+ const result = new HistoryReadResult({
1810
+ statusCode: StatusCodes.BadHistoryOperationUnsupported
1811
+ });
1812
+ callback(null, result);
1813
+ }
1814
+
1815
+ public _historyPush(_newDataValue: DataValue): void {
1816
+ throw new Error("");
1817
+ }
1818
+
1819
+ public _historyReadRawAsync(
1820
+ _historyReadRawModifiedDetails: ReadRawModifiedDetails,
1821
+ _maxNumberToExtract: number,
1822
+ _isReversed: boolean,
1823
+ _reverseDataValue: boolean,
1824
+ _callback: CallbackT<DataValue[]>
1825
+ ): void {
1826
+ throw new Error("");
1827
+ }
1828
+
1829
+ public _historyReadModify(
1830
+ _context: ISessionContext,
1831
+ _historyReadRawModifiedDetails: ReadRawModifiedDetails,
1832
+ _indexRange: NumericRange | null,
1833
+ _dataEncoding: QualifiedNameLike | null,
1834
+ _continuationData: ContinuationData,
1835
+ _callback: CallbackT<HistoryReadResult>
1836
+ ): void {
1837
+ throw new Error("");
1838
+ }
1839
+
1840
+ public _update_startOfOnlineArchive(_newDate: Date): void {
1841
+ // please install
1842
+ throw new Error("");
1843
+ }
1844
+
1845
+ public _update_startOfArchive(_newDate: Date): void {
1846
+ throw new Error("");
1847
+ }
1848
+
1849
+ public _validate_DataType(variantDataType: DataType): boolean {
1850
+ return validateDataTypeCorrectness(this.addressSpace, this.dataType, variantDataType, /* allow Nulls */ false, this.nodeId);
1851
+ }
1852
+
1853
+ public _internal_set_value(value: Variant): void {
1854
+ if (value.dataType !== DataType.Null) {
1855
+ this.verifyVariantCompatibility(value);
1856
+ }
1857
+ this.$dataValue.value = value;
1858
+ }
1859
+
1860
+ public _internal_set_dataValue(dataValue: DataValue, indexRange?: NumericRange | null): void {
1861
+ assert(dataValue, "expecting a dataValue");
1862
+ assert(dataValue instanceof DataValue, "expecting dataValue to be a DataValue");
1863
+ assert(dataValue !== this.$dataValue, "expecting dataValue to be different from previous DataValue instance");
1864
+
1865
+ const addressSpace = this.addressSpace;
1866
+
1867
+ // c8 ignore next
1868
+ if (!addressSpace) {
1869
+ warningLog("UAVariable#_internal_set_dataValue : no addressSpace ! may be node has already been deleted ?");
1870
+ return;
1871
+ }
1872
+
1873
+ // c8 ignore next
1874
+ if (dataValue.value.arrayType === VariantArrayType.Matrix) {
1875
+ if (!dataValue.value.dimensions) {
1876
+ throw new Error("missing dimensions: a Matrix Variant needs a dimension");
1877
+ }
1878
+ const nbElements = dataValue.value.dimensions.reduce((acc, x) => acc * x, 1);
1879
+ if (dataValue.value.value.length !== 0 && dataValue.value.value.length !== nbElements) {
1880
+ throw new Error(
1881
+ `Internal Error: matrix dimension doesn't match the number of element in the array : ${dataValue.toString()} "\n expecting ${nbElements} elements but got ${
1882
+ dataValue.value.value.length
1883
+ }`
1884
+ );
1885
+ }
1886
+ }
1887
+
1888
+ // c8 ignore next
1889
+ if (dataValue.value.dataType === DataType.ExtensionObject) {
1890
+ // c8 ignore next
1891
+ if (!this.checkExtensionObjectIsCorrect(dataValue.value.value)) {
1892
+ warningLog(dataValue.toString());
1893
+ throw new Error(`Invalid Extension Object on nodeId =${this.nodeId.toString()}`);
1894
+ }
1895
+ }
1896
+
1897
+ this.verifyVariantCompatibility(dataValue.value);
1898
+
1899
+ this._inner_replace_dataValue(dataValue, indexRange);
1900
+ }
1901
+
1902
+ /**
1903
+ * @private
1904
+ */
1905
+ public _inner_replace_dataValue(dataValue: DataValue, indexRange?: NumericRange | null) {
1906
+ assert(this.$dataValue.value instanceof Variant);
1907
+ const old_dataValue = this.$dataValue.clone();
1908
+
1909
+ if (this.$$extensionObjectArray && dataValue.value.arrayType !== VariantArrayType.Scalar) {
1910
+ // we have a bounded array or matrix
1911
+ assert(Array.isArray(dataValue.value.value));
1912
+ if (this.$$extensionObjectArray !== this.$dataValue.value.value) {
1913
+ throw new Error("internal error");
1914
+ }
1915
+ this.$$extensionObjectArray = dataValue.value.value;
1916
+ this.$dataValue.value.value = dataValue.value.value;
1917
+
1918
+ this.$dataValue.statusCode = dataValue.statusCode || StatusCodes.Good;
1919
+ this.$dataValue.serverTimestamp = dataValue.serverTimestamp;
1920
+ this.$dataValue.serverPicoseconds = dataValue.serverPicoseconds;
1921
+ this.$dataValue.sourceTimestamp = dataValue.sourceTimestamp;
1922
+ this.$dataValue.sourcePicoseconds = dataValue.sourcePicoseconds;
1923
+ } else if (
1924
+ this._basicDataType === DataType.ExtensionObject &&
1925
+ this.valueRank === -1 &&
1926
+ this.$set_ExtensionObject &&
1927
+ dataValue.value.arrayType === VariantArrayType.Scalar
1928
+ ) {
1929
+ // the entire extension object is changed.
1930
+ this.$dataValue.statusCode = this.$dataValue.statusCode || StatusCodes.Good;
1931
+ const preciseClock = coerceClock(this.$dataValue.sourceTimestamp, this.$dataValue.sourcePicoseconds);
1932
+ this.$set_ExtensionObject(dataValue.value.value, preciseClock, new Set());
1933
+ } else {
1934
+ this.$dataValue = dataValue;
1935
+ this.$dataValue.statusCode = this.$dataValue.statusCode || StatusCodes.Good;
1936
+ }
1937
+ // repair missing timestamps
1938
+ const now = new Date();
1939
+ if (!dataValue.serverTimestamp) {
1940
+ this.$dataValue.serverTimestamp = old_dataValue.serverTimestamp || now;
1941
+ this.$dataValue.serverPicoseconds = old_dataValue.serverPicoseconds || 0;
1942
+ }
1943
+ if (!dataValue.sourceTimestamp) {
1944
+ this.$dataValue.sourceTimestamp = old_dataValue.sourceTimestamp || now;
1945
+ this.$dataValue.sourcePicoseconds = old_dataValue.sourcePicoseconds || 0;
1946
+ }
1947
+
1948
+ if (!sameDataValue(old_dataValue, dataValue)) {
1949
+ if (this.getBasicDataType() === DataType.ExtensionObject) {
1950
+ const preciseClock = coerceClock(this.$dataValue.sourceTimestamp, this.$dataValue.sourcePicoseconds);
1951
+ const cache: Set<UAVariable> = new Set();
1952
+ if (this.$$extensionObjectArray) {
1953
+ this.touchValue(preciseClock);
1954
+ propagateTouchValueDownwardArray(this, preciseClock, cache);
1955
+ } else {
1956
+ this.touchValue(preciseClock);
1957
+ propagateTouchValueDownward(this, preciseClock, cache);
1958
+ }
1959
+ } else {
1960
+ (this as UAVariable).emit("value_changed", this.$dataValue.clone(), indexRange);
1961
+ }
1962
+ }
1963
+ }
1964
+
1965
+ public _conditionRefresh(_cache?: ConditionRefreshCache): void {
1966
+ apply_condition_refresh.call(this, _cache);
1967
+ }
1968
+
1969
+ public handle_semantic_changed(_dataValue: DataValue): void {
1970
+ this.semantic_version = this.semantic_version + 1;
1971
+ (this as UAVariable).emit("semantic_changed");
1972
+ }
1973
+
1974
+ private _readDataType(): DataValue {
1975
+ assert(this.dataType instanceof NodeId);
1976
+ const options = {
1977
+ statusCode: StatusCodes.Good,
1978
+ value: {
1979
+ dataType: DataType.NodeId,
1980
+ value: this.dataType
1981
+ }
1982
+ };
1983
+ return new DataValue(options);
1984
+ }
1985
+
1986
+ private _readValueRank(): DataValue {
1987
+ assert(typeof this.valueRank === "number");
1988
+ const options = {
1989
+ statusCode: StatusCodes.Good,
1990
+ value: { dataType: DataType.Int32, value: this.valueRank }
1991
+ };
1992
+ return new DataValue(options);
1993
+ }
1994
+
1995
+ private _readArrayDimensions(): DataValue {
1996
+ assert(Array.isArray(this.arrayDimensions) || this.arrayDimensions === null);
1997
+ assert(!this.arrayDimensions || this.valueRank > 0, "arrayDimension must be null if valueRank <0");
1998
+ const options = {
1999
+ statusCode: StatusCodes.Good,
2000
+ value: { dataType: DataType.UInt32, arrayType: VariantArrayType.Array, value: this.arrayDimensions }
2001
+ };
2002
+ return new DataValue(options);
2003
+ }
2004
+
2005
+ private _readAccessLevel(context: ISessionContext): DataValue {
2006
+ assert(context instanceof SessionContext);
2007
+ const options = {
2008
+ statusCode: StatusCodes.Good,
2009
+ value: { dataType: DataType.Byte, value: convertAccessLevelFlagToByte(this.accessLevel) }
2010
+ };
2011
+ return new DataValue(options);
2012
+ }
2013
+
2014
+ private _readAccessLevelEx(context: ISessionContext): DataValue {
2015
+ assert(context instanceof SessionContext);
2016
+ const options = {
2017
+ statusCode: StatusCodes.Good,
2018
+ // Extra flags are not supported yet. to do:
2019
+ value: { dataType: DataType.UInt32, value: convertAccessLevelFlagToByte(this.accessLevel) }
2020
+ };
2021
+ return new DataValue(options);
2022
+ }
2023
+
2024
+ private _readUserAccessLevel(context: ISessionContext): DataValue {
2025
+ assert(context instanceof SessionContext);
2026
+
2027
+ const effectiveUserAccessLevel = _calculateEffectiveUserAccessLevelFromPermission(this, context, this.userAccessLevel);
2028
+
2029
+ const options = {
2030
+ value: {
2031
+ dataType: DataType.Byte,
2032
+ statusCode: StatusCodes.Good,
2033
+ value: convertAccessLevelFlagToByte(effectiveUserAccessLevel)
2034
+ }
2035
+ };
2036
+ return new DataValue(options);
2037
+ }
2038
+
2039
+ private _readMinimumSamplingInterval(): DataValue {
2040
+ // expect a Duration => Double
2041
+ const options: DataValueLike = {};
2042
+ if (this.minimumSamplingInterval === undefined) {
2043
+ options.statusCode = StatusCodes.BadAttributeIdInvalid;
2044
+ } else {
2045
+ options.value = { dataType: DataType.Double, value: this.minimumSamplingInterval };
2046
+ options.statusCode = StatusCodes.Good;
2047
+ }
2048
+ return new DataValue(options);
2049
+ }
2050
+
2051
+ private _readHistorizing(): DataValue {
2052
+ assert(typeof this.historizing === "boolean");
2053
+ const options = {
2054
+ statusCode: StatusCodes.Good,
2055
+ value: { dataType: DataType.Boolean, value: !!this.historizing }
2056
+ };
2057
+ return new DataValue(options);
2058
+ }
2059
+ }
2060
+
2061
+ import type { IStructuredTypeSchema } from "node-opcua-factory";
2062
+ import { withCallback } from "thenify-ex";
2063
+
2064
+ UAVariableImpl.prototype.asyncRefresh = withCallback(UAVariableImpl.prototype.asyncRefresh);
2065
+ UAVariableImpl.prototype.writeValue = withCallback(UAVariableImpl.prototype.writeValue);
2066
+ UAVariableImpl.prototype.writeAttribute = withCallback(UAVariableImpl.prototype.writeAttribute);
2067
+ UAVariableImpl.prototype.historyRead = withCallback(UAVariableImpl.prototype.historyRead);
2068
+ UAVariableImpl.prototype.readValueAsync = withCallback(UAVariableImpl.prototype.readValueAsync);
2069
+
2070
+ export interface UAVariableImplExtArray {
2071
+ $$variableType?: UAVariableType;
2072
+ $$dataType?: UADataType;
2073
+ $$getElementBrowseName?: (extObject: ExtensionObject, index: number | number[]) => QualifiedName;
2074
+ $$extensionObjectArray?: ExtensionObject[];
2075
+ $$indexPropertyName?: string;
2076
+ }
2077
+
2078
+ function check_valid_array(dataType: DataType, array: unknown): boolean {
2079
+ if (Array.isArray(array)) {
2080
+ return true;
2081
+ }
2082
+ switch (dataType) {
2083
+ case DataType.Double:
2084
+ return array instanceof Float64Array;
2085
+ case DataType.Float:
2086
+ return array instanceof Float32Array;
2087
+ case DataType.Int32:
2088
+ return array instanceof Int32Array;
2089
+ case DataType.Int16:
2090
+ return array instanceof Int16Array;
2091
+ case DataType.SByte:
2092
+ return array instanceof Int8Array;
2093
+ case DataType.UInt32:
2094
+ return array instanceof Uint32Array;
2095
+ case DataType.UInt16:
2096
+ return array instanceof Uint16Array;
2097
+ case DataType.Byte:
2098
+ return array instanceof Uint8Array || array instanceof Buffer;
2099
+ }
2100
+ return false;
2101
+ }
2102
+
2103
+ // function _apply_default_timestamps(dataValue: DataValue): void {
2104
+ // const now = getCurrentClock();
2105
+ // assert(dataValue instanceof DataValue);
2106
+
2107
+ // if (!dataValue.sourceTimestamp) {
2108
+ // dataValue.sourceTimestamp = now.timestamp;
2109
+ // dataValue.sourcePicoseconds = now.picoseconds;
2110
+ // }
2111
+ // if (!dataValue.serverTimestamp) {
2112
+ // dataValue.serverTimestamp = now.timestamp;
2113
+ // dataValue.serverPicoseconds = now.picoseconds;
2114
+ // }
2115
+ // }
2116
+
2117
+ function unsetFlag(flags: number, mask: number): number {
2118
+ return flags & ~mask;
2119
+ }
2120
+ function _setFlag(flags: number, mask: number): number {
2121
+ return flags | mask;
2122
+ }
2123
+
2124
+ function _calculateEffectiveUserAccessLevelFromPermission(
2125
+ node: UAVariable,
2126
+ context: ISessionContext,
2127
+ userAccessLevel: AccessLevelFlag | undefined
2128
+ ): AccessLevelFlag {
2129
+ function __adjustFlag(
2130
+ permissionType: PermissionType,
2131
+ access: AccessLevelFlag,
2132
+ userAccessLevel1: AccessLevelFlag
2133
+ ): AccessLevelFlag {
2134
+ if ((node.accessLevel & access) === 0 || (userAccessLevel1 & access) === 0) {
2135
+ userAccessLevel1 = unsetFlag(userAccessLevel1, access);
2136
+ } else {
2137
+ if (!context.checkPermission(node, permissionType)) {
2138
+ userAccessLevel1 = unsetFlag(userAccessLevel1, access);
2139
+ }
2140
+ }
2141
+ return userAccessLevel1;
2142
+ }
2143
+ userAccessLevel = node.userAccessLevel === undefined ? node.accessLevel : node.userAccessLevel & node.accessLevel;
2144
+ if (context.checkPermission) {
2145
+ assert(context.checkPermission instanceof Function);
2146
+ userAccessLevel = __adjustFlag(PermissionType.Read, AccessLevelFlag.CurrentRead, userAccessLevel);
2147
+ userAccessLevel = __adjustFlag(PermissionType.Write, AccessLevelFlag.CurrentWrite, userAccessLevel);
2148
+ userAccessLevel = __adjustFlag(PermissionType.Write, AccessLevelFlag.StatusWrite, userAccessLevel);
2149
+ userAccessLevel = __adjustFlag(PermissionType.Write, AccessLevelFlag.TimestampWrite, userAccessLevel);
2150
+ userAccessLevel = __adjustFlag(PermissionType.ReadHistory, AccessLevelFlag.HistoryRead, userAccessLevel);
2151
+ userAccessLevel = __adjustFlag(PermissionType.DeleteHistory, AccessLevelFlag.HistoryWrite, userAccessLevel);
2152
+ return userAccessLevel;
2153
+ } else {
2154
+ return userAccessLevel;
2155
+ }
2156
+ }
2157
+
2158
+ function adjustVariant2(this: UAVariableImpl, variant: Variant): Variant {
2159
+ // convert Variant( Scalar|ByteString) => Variant(Array|ByteArray)
2160
+ const _addressSpace = this.addressSpace;
2161
+ const basicType = this.getBasicDataType();
2162
+ variant = adjustVariant(variant, this.valueRank, basicType);
2163
+ return variant;
2164
+ }
2165
+
2166
+ function _not_writable_timestamped_set_func(
2167
+ dataValue: DataValue,
2168
+ callback: (err: Error | null, statusCode: StatusCode, dataValue?: DataValue | null) => void
2169
+ ) {
2170
+ assert(dataValue instanceof DataValue);
2171
+ callback(null, StatusCodes.BadNotWritable, null);
2172
+ }
2173
+
2174
+ function _default_writable_timestamped_set_func(
2175
+ dataValue: DataValue,
2176
+ callback: (err: Error | null, statusCode: StatusCode, dataValue?: DataValue | null) => void
2177
+ ) {
2178
+ assert(dataValue instanceof DataValue);
2179
+ callback(null, StatusCodes.Good, dataValue);
2180
+ }
2181
+
2182
+ type f1<T, D, R> = (this: T, data: D) => R;
2183
+ type f2<T, D, R> = (this: T, data: D) => Promise<R>;
2184
+ type f3<T, D, R> = (this: T, data: D, callback: (err: Error | null, r?: R) => void) => void;
2185
+
2186
+ function turn_sync_to_async<T, D, R>(f: f1<T, D, R> | f2<T, D, R> | f3<T, D, R>, numberOfArgs: number): f3<T, D, R> {
2187
+ if (f.length <= numberOfArgs) {
2188
+ return function (this: T, data: D, callback: (err: Error | null, r?: R) => void) {
2189
+ new Promise<R>((resolve, reject) => {
2190
+ try {
2191
+ // const ff1 = f as f1<T, D, R>;
2192
+ const ff2 = f as f2<T, D, R>;
2193
+ const r: R | Promise<R> = ff2.call(this, data);
2194
+ if (r instanceof Promise) {
2195
+ r.then(resolve, reject);
2196
+ } else {
2197
+ resolve(r);
2198
+ }
2199
+ } catch (err) {
2200
+ reject(err);
2201
+ }
2202
+ })
2203
+ .then((r) => {
2204
+ callback(null, r);
2205
+ })
2206
+ .catch((err) => {
2207
+ callback(err as Error);
2208
+ });
2209
+ };
2210
+ } else {
2211
+ assert(f.length === numberOfArgs + 1);
2212
+ return f;
2213
+ }
2214
+ }
2215
+
2216
+ const _default_minimumSamplingInterval = 1000;
2217
+
2218
+ function coerceDataValue(dataValue: DataValue | DataValueLike): DataValue {
2219
+ if (dataValue instanceof DataValue) {
2220
+ return dataValue;
2221
+ }
2222
+ return new DataValue(dataValue);
2223
+ }
2224
+
2225
+ // variation #3 :
2226
+ function _Variable_bind_with_async_refresh(
2227
+ this: UAVariableImpl,
2228
+ options: { refreshFunc: RefreshFunc; get?: undefined; timestamped_get?: undefined }
2229
+ ) {
2230
+ assert(this instanceof UAVariableImpl);
2231
+
2232
+ assert(typeof options.refreshFunc === "function");
2233
+ assert(!options.get, "a getter shall not be specified when refreshFunc is set");
2234
+ assert(!options.timestamped_get, "a getter shall not be specified when refreshFunc is set");
2235
+
2236
+ assert(!this.refreshFunc);
2237
+
2238
+ this.refreshFunc = options.refreshFunc;
2239
+ /*
2240
+ // TO DO : REVISIT THIS ASSUMPTION
2241
+ if (false && this.minimumSamplingInterval === 0) {
2242
+ // when a getter /timestamped_getter or async_getter is provided
2243
+ // samplingInterval cannot be 0, as the item value must be scanned to be updated.
2244
+ this.minimumSamplingInterval = _default_minimumSamplingInterval; // MonitoredItem.minimumSamplingInterval;
2245
+ // c8 ignore next
2246
+ doDebug && debugLog(`adapting minimumSamplingInterval on ${this.browseName.toString()} to ${this.minimumSamplingInterval}`);
2247
+ }
2248
+ */
2249
+ }
2250
+
2251
+ // variation 2
2252
+ function _Variable_bind_with_timestamped_get(
2253
+ this: UAVariableImpl,
2254
+ options: {
2255
+ get: undefined;
2256
+ timestamped_get: TimestampGetFunc;
2257
+ }
2258
+ ) {
2259
+ /* jshint validthis: true */
2260
+ assert(this instanceof UAVariableImpl);
2261
+ assert(typeof options.timestamped_get === "function");
2262
+ assert(!options.get, "should not specify 'get' when 'timestamped_get' exists ");
2263
+ assert(!this._timestamped_get_func);
2264
+
2265
+ const async_refresh_func = (callback: (err: Error | null, dataValue?: DataValue) => void) => {
2266
+ Promise.resolve((this._timestamped_get_func as VariableDataValueGetterSync).call(this))
2267
+ .then((dataValue) => callback(null, dataValue))
2268
+ .catch((err) => {
2269
+ errorLog("asyncRefresh error: Variable is ", this.nodeId.toString(), this.browseName.toString());
2270
+ callback(err as Error);
2271
+ });
2272
+ };
2273
+ const pThis = this as UAVariable;
2274
+ if (options.timestamped_get.length === 0) {
2275
+ const timestamped_get = options.timestamped_get as (this: UAVariable) => DataValue | Promise<DataValue>;
2276
+ // sync version | Promise version
2277
+ this._timestamped_get_func = timestamped_get;
2278
+
2279
+ const dataValue_verify = timestamped_get.call(pThis);
2280
+ // dataValue_verify should be a DataValue or a Promise
2281
+ /* c8 ignore next */
2282
+ if (!(dataValue_verify instanceof DataValue) && typeof dataValue_verify.then !== "function") {
2283
+ errorLog(
2284
+ chalk.red(" Bind variable error: "),
2285
+ " the timestamped_get function must return a DataValue or a Promise<DataValue>" +
2286
+ "\n value_check.constructor.name ",
2287
+ dataValue_verify ? dataValue_verify.constructor.name : "null"
2288
+ );
2289
+
2290
+ throw new Error(" Bind variable error: " + " the timestamped_get function must return a DataValue");
2291
+ }
2292
+ _Variable_bind_with_async_refresh.call(this, { refreshFunc: async_refresh_func });
2293
+ } else if (options.timestamped_get.length === 1) {
2294
+ _Variable_bind_with_async_refresh.call(this, { refreshFunc: options.timestamped_get });
2295
+ } else {
2296
+ errorLog("timestamped_get has a invalid number of argument , should be 0 or 1 ");
2297
+ throw new Error("timestamped_get has a invalid number of argument , should be 0 or 1 ");
2298
+ }
2299
+ }
2300
+
2301
+ // variation 1
2302
+ function _Variable_bind_with_simple_get(this: UAVariableImpl, options: GetterOptions) {
2303
+ assert(this instanceof UAVariableImpl);
2304
+ assert(typeof options.get === "function", "should specify get function");
2305
+ assert(options.get?.length === 0, "get function should not have arguments");
2306
+ assert(!options.timestamped_get, "should not specify a timestamped_get function when get is specified");
2307
+ assert(!this._timestamped_get_func);
2308
+ assert(!this._get_func);
2309
+
2310
+ this._get_func = options.get;
2311
+
2312
+ const timestamped_get_func_from__Variable_bind_with_simple_get = () => {
2313
+ const value: Variant | StatusCode = (this._get_func as GetFunc)();
2314
+
2315
+ /* c8 ignore next */
2316
+ if (!is_Variant_or_StatusCode(value)) {
2317
+ errorLog(
2318
+ chalk.red(" Bind variable error: "),
2319
+ " : the getter must return a Variant or a StatusCode" + "\nvalue_check.constructor.name ",
2320
+ value ? value.constructor.name : "null"
2321
+ );
2322
+ throw new Error(
2323
+ " bindVariable : the value getter function returns a invalid result ( expecting a Variant or a StatusCode !!!"
2324
+ );
2325
+ }
2326
+ if (is_StatusCode(value)) {
2327
+ return new DataValue({ statusCode: value as StatusCode });
2328
+ } else {
2329
+ if (!this.$dataValue?.statusCode.isGoodish() || !sameVariant(this.$dataValue.value, value as Variant)) {
2330
+ // rebuilding artificially timestamps with current clock as they are not provided
2331
+ // by the underlying getter function
2332
+ const { timestamp: sourceTimestamp, picoseconds: sourcePicoseconds } = getCurrentClock();
2333
+ const serverTimestamp = sourceTimestamp;
2334
+ const serverPicoseconds = sourcePicoseconds;
2335
+ this._inner_replace_dataValue(
2336
+ new DataValue({ value, sourceTimestamp, sourcePicoseconds, serverTimestamp, serverPicoseconds })
2337
+ );
2338
+ }
2339
+ return this.$dataValue;
2340
+ }
2341
+ };
2342
+
2343
+ _Variable_bind_with_timestamped_get.call(this, {
2344
+ get: undefined,
2345
+ timestamped_get: timestamped_get_func_from__Variable_bind_with_simple_get
2346
+ });
2347
+ }
2348
+
2349
+ type SimpleSetOptions = { set?: SetFunc; timestamped_set: undefined };
2350
+ function _Variable_bind_with_simple_set(this: UAVariableImpl, options: SimpleSetOptions) {
2351
+ assert(this instanceof UAVariableImpl);
2352
+ assert(typeof options.set === "function", "should specify set function");
2353
+ assert(!options.timestamped_set, "should not specify a timestamped_set function");
2354
+
2355
+ assert(!this._timestamped_set_func);
2356
+ assert(!this._set_func);
2357
+
2358
+ //
2359
+ const set_func = turn_sync_to_async<UAVariable, Variant, StatusCode>(options.set as VariableSetter, 1);
2360
+ this._set_func = set_func;
2361
+
2362
+ assert(set_func.length === 2, " set function must have 2 arguments ( variant, callback)");
2363
+
2364
+ this._timestamped_set_func = (
2365
+ timestamped_value: DataValue,
2366
+ callback: (err: Error | null, statusCode: StatusCode, dataValue: DataValue) => void
2367
+ ) => {
2368
+ assert(timestamped_value instanceof DataValue);
2369
+ set_func.call(this, timestamped_value.value, (err: Error | null, statusCode?: StatusCode) => {
2370
+ // c8 ignore next
2371
+ if (!err && !statusCode) {
2372
+ errorLog(
2373
+ chalk.red("UAVariable Binding Error _set_func must return a StatusCode, check the bindVariable parameters")
2374
+ );
2375
+ errorLog(chalk.yellow("StatusCode.Good is assumed"));
2376
+ return callback(err, StatusCodes.Good, timestamped_value);
2377
+ }
2378
+ if (statusCode?.isNotGood()) {
2379
+ // record the value but still record the statusCode !
2380
+ timestamped_value.statusCode = statusCode;
2381
+ }
2382
+ callback(err, statusCode ?? StatusCodes.BadInternalError, timestamped_value);
2383
+ });
2384
+ };
2385
+ }
2386
+
2387
+ function _Variable_bind_with_timestamped_set(
2388
+ this: UAVariableImpl,
2389
+ options: {
2390
+ timestamped_set: TimestampSetFunc;
2391
+ set: undefined;
2392
+ }
2393
+ ) {
2394
+ assert(
2395
+ options.timestamped_set.length === 2 || options.timestamped_set.length === 1,
2396
+ "timestamped_set must have 2 parameters timestamped_set: function(dataValue,callback){} or one paramater timestamped_set: function(dataValue): Promise<StatusCode>{}"
2397
+ );
2398
+ assert(!options.set, "should not specify set when timestamped_set_func exists ");
2399
+ this._timestamped_set_func = convertToCallbackFunction1<StatusCode, DataValue, UAVariable>(options.timestamped_set);
2400
+ }
2401
+
2402
+ interface SetterOptions {
2403
+ set?: SetFunc;
2404
+ timestamped_set?: TimestampSetFunc;
2405
+ timestamped_get?: TimestampGetFunc;
2406
+ }
2407
+ function bind_setter(this: UAVariableImpl, options: SetterOptions) {
2408
+ if (options.set && typeof options.set === "function") {
2409
+ // variation 1
2410
+ if (options.timestamped_set === undefined) {
2411
+ _Variable_bind_with_simple_set.call(this, options as SimpleSetOptions);
2412
+ } else {
2413
+ throw new Error("bind_setter : options should not specify both set and timestamped_set ");
2414
+ }
2415
+ } else if (typeof options.timestamped_set === "function") {
2416
+ // variation 2
2417
+ assert(typeof options.timestamped_get === "function", "timestamped_set must be used with timestamped_get ");
2418
+ _Variable_bind_with_timestamped_set.call(this, {
2419
+ set: undefined,
2420
+ timestamped_set: options.timestamped_set
2421
+ });
2422
+ } else if (typeof options.timestamped_get === "function") {
2423
+ // timestamped_get is specified but timestamped_set is not
2424
+ // => Value is read-only
2425
+ _Variable_bind_with_timestamped_set.call(this, {
2426
+ set: undefined,
2427
+ timestamped_set: _not_writable_timestamped_set_func
2428
+ });
2429
+ } else {
2430
+ _Variable_bind_with_timestamped_set.call(this, {
2431
+ set: undefined,
2432
+ timestamped_set: _default_writable_timestamped_set_func
2433
+ });
2434
+ }
2435
+ }
2436
+
2437
+ type RefreshFunc = (callback: CallbackT<DataValue>) => void;
2438
+ interface GetterOptions {
2439
+ get?: GetFunc;
2440
+ timestamped_get?: TimestampGetFunc;
2441
+ refreshFunc?: RefreshFunc;
2442
+ dataType?: DataType | string;
2443
+ value?: unknown;
2444
+ }
2445
+ function bind_getter(this: UAVariableImpl, options: GetterOptions) {
2446
+ if (typeof options.get === "function") {
2447
+ // variation 1
2448
+ _Variable_bind_with_simple_get.call(this, options);
2449
+ } else if (typeof options.timestamped_get === "function") {
2450
+ // variation 2
2451
+ _Variable_bind_with_timestamped_get.call(this, {
2452
+ get: undefined,
2453
+ timestamped_get: options.timestamped_get
2454
+ });
2455
+ } else if (typeof options.refreshFunc === "function") {
2456
+ // variation 3
2457
+ if (options.get !== undefined || options.timestamped_get !== undefined) {
2458
+ throw new Error("bind_getter : options should not specify both get and timestamped_get ");
2459
+ }
2460
+ _Variable_bind_with_async_refresh.call(this, { refreshFunc: options.refreshFunc });
2461
+ } else {
2462
+ assert(!Object.hasOwn(options, "set"), "getter is missing : a getter must be provided if a setter is provided");
2463
+ // xx bind_variant.call(this,options);
2464
+ if (options.dataType !== undefined) {
2465
+ // if (options.dataType !== DataType.ExtensionObject) {
2466
+ this.setValueFromSource(options as VariantLike);
2467
+ // }
2468
+ }
2469
+ }
2470
+ }
2471
+
2472
+ export class UAVariableImplT<T, DT extends DataType> extends UAVariableImpl implements UAVariableT<T, DT> {
2473
+ public readValue(
2474
+ context?: ISessionContext | null,
2475
+ indexRange?: NumericRange,
2476
+ dataEncoding?: QualifiedNameLike | null
2477
+ ): DataValueT<T, DT> {
2478
+ return super.readValue(context, indexRange, dataEncoding) as DataValueT<T, DT>;
2479
+ }
2480
+
2481
+ public readValueAsync(context: ISessionContext | null): Promise<DataValueT<T, DT>>;
2482
+ public readValueAsync(context: ISessionContext | null, callback: CallbackT<DataValueT<T, DT>>): void;
2483
+ public readValueAsync(
2484
+ context: ISessionContext | null,
2485
+ callback?: CallbackT<DataValueT<T, DT>>
2486
+ ): Promise<DataValueT<T, DT>> | undefined {
2487
+ // forward the arguments we were actually given. The base method is thenified, and
2488
+ // thenify decides between promise and callback form by argument count, so passing an
2489
+ // explicit undefined callback makes it hand that undefined straight through.
2490
+ if (callback === undefined) {
2491
+ return super.readValueAsync(context) as Promise<DataValueT<T, DT>>;
2492
+ }
2493
+ super.readValueAsync(context, callback as CallbackT<DataValue>);
2494
+ return undefined;
2495
+ }
2496
+
2497
+ public writeValue(
2498
+ context: ISessionContext,
2499
+ dataValue: DataValueT<T, DT>,
2500
+ indexRange: NumericRange | null,
2501
+ callback: StatusCodeCallback
2502
+ ): void;
2503
+ public writeValue(context: ISessionContext, dataValue: DataValueT<T, DT>, callback: StatusCodeCallback): void;
2504
+ public writeValue(
2505
+ context: ISessionContext,
2506
+ dataValue: DataValueT<T, DT>,
2507
+ indexRange?: NumericRange | null
2508
+ ): Promise<StatusCode>;
2509
+ public writeValue(
2510
+ context: ISessionContext,
2511
+ dataValue: DataValueT<T, DT>,
2512
+ indexRangeOrCallback?: NumericRange | null | StatusCodeCallback,
2513
+ callback?: StatusCodeCallback
2514
+ ): Promise<StatusCode> | undefined {
2515
+ // same reason as readValueAsync above: forward the arity we were called with, and
2516
+ // keep the call on `super.writeValue` so it stays a method call - binding it to a
2517
+ // local would drop `this`
2518
+ type Write = (...args: unknown[]) => Promise<StatusCode> | undefined;
2519
+ if (callback === undefined) {
2520
+ if (indexRangeOrCallback === undefined) {
2521
+ return (super.writeValue as Write)(context, dataValue);
2522
+ }
2523
+ return (super.writeValue as Write)(context, dataValue, indexRangeOrCallback);
2524
+ }
2525
+ return (super.writeValue as Write)(context, dataValue, indexRangeOrCallback, callback);
2526
+ }
2527
+ }
2528
+
2529
+ function changeUAVariableDataType(uaVariable: UAVariableImpl, newDataType: NodeIdLike, valueLike?: VariantLike) {
2530
+ let value: Variant | null = valueLike ? (valueLike instanceof Variant ? valueLike : new Variant(valueLike)) : null;
2531
+
2532
+ const addressSpace = uaVariable.addressSpace;
2533
+ const newDataTypeNode = addressSpace.findNode(newDataType) as UADataType;
2534
+ // c8 ignore next
2535
+ if (!newDataTypeNode || !(newDataTypeNode instanceof UADataTypeImpl)) {
2536
+ throw new Error(`Cannot find newDataTypeNode ${newDataType.toString()}`);
2537
+ }
2538
+
2539
+ const newBaseDataType: DataType = newDataTypeNode.basicDataType;
2540
+ // c8 ignore next
2541
+ if (newBaseDataType === DataType.Null) {
2542
+ throw new Error("newDataTypeNode must be a DataType");
2543
+ }
2544
+ if (!value) {
2545
+ value = uaVariable.readValue().value;
2546
+ value.dataType = newBaseDataType;
2547
+ }
2548
+ if (newBaseDataType !== value.dataType) {
2549
+ throw new Error("newDataTypeNode must be of the same base dataType as the value");
2550
+ }
2551
+
2552
+ // change uaVariable.dataType
2553
+ uaVariable.dataType = newDataTypeNode.nodeId;
2554
+ (uaVariable as unknown as { _basicDataType?: DataType | null })._basicDataType = null;
2555
+ uaVariable.$dataValue.value.dataType = newBaseDataType;
2556
+ uaVariable.$dataValue.value = value;
2557
+ // also change the value to ensure that we have a default value with the correct dataType
2558
+ uaVariable._internal_set_value(value);
2559
+ }