node-opcua-address-space 2.97.0 → 2.98.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (342) hide show
  1. package/dist/source/address_space_ts.d.ts +118 -118
  2. package/dist/source/address_space_ts.js +17 -17
  3. package/dist/source/continuation_points/continuation_point_manager.d.ts +91 -91
  4. package/dist/source/continuation_points/continuation_point_manager.js +200 -200
  5. package/dist/source/helpers/adjust_browse_direction.d.ts +5 -5
  6. package/dist/source/helpers/adjust_browse_direction.js +11 -11
  7. package/dist/source/helpers/argument_list.d.ts +33 -33
  8. package/dist/source/helpers/argument_list.js +254 -254
  9. package/dist/source/helpers/call_helpers.d.ts +6 -6
  10. package/dist/source/helpers/call_helpers.js +71 -71
  11. package/dist/source/helpers/coerce_enum_value.d.ts +6 -6
  12. package/dist/source/helpers/coerce_enum_value.js +33 -33
  13. package/dist/source/helpers/dump_tools.d.ts +14 -14
  14. package/dist/source/helpers/dump_tools.js +78 -78
  15. package/dist/source/helpers/ensure_secure_access.d.ts +9 -9
  16. package/dist/source/helpers/ensure_secure_access.js +76 -76
  17. package/dist/source/helpers/make_optionals_map.d.ts +21 -21
  18. package/dist/source/helpers/make_optionals_map.js +29 -29
  19. package/dist/source/helpers/multiform_func.d.ts +11 -11
  20. package/dist/source/helpers/multiform_func.js +75 -75
  21. package/dist/source/helpers/resolve_opaque_on_address_space.d.ts +3 -3
  22. package/dist/source/helpers/resolve_opaque_on_address_space.js +36 -36
  23. package/dist/source/index.d.ts +61 -61
  24. package/dist/source/index.js +89 -89
  25. package/dist/source/interfaces/alarms_and_conditions/condition_info_i.d.ts +19 -19
  26. package/dist/source/interfaces/alarms_and_conditions/condition_info_i.js +2 -2
  27. package/dist/source/interfaces/alarms_and_conditions/condition_snapshot.d.ts +193 -193
  28. package/dist/source/interfaces/alarms_and_conditions/condition_snapshot.js +2 -2
  29. package/dist/source/interfaces/alarms_and_conditions/deviation_stuff.d.ts +12 -12
  30. package/dist/source/interfaces/alarms_and_conditions/deviation_stuff.js +2 -2
  31. package/dist/source/interfaces/alarms_and_conditions/install_setpoint_options.d.ts +10 -10
  32. package/dist/source/interfaces/alarms_and_conditions/install_setpoint_options.js +2 -2
  33. package/dist/source/interfaces/alarms_and_conditions/instantiate_alarm_condition_options.d.ts +7 -7
  34. package/dist/source/interfaces/alarms_and_conditions/instantiate_alarm_condition_options.js +2 -2
  35. package/dist/source/interfaces/alarms_and_conditions/instantiate_condition_options.d.ts +7 -7
  36. package/dist/source/interfaces/alarms_and_conditions/instantiate_condition_options.js +2 -2
  37. package/dist/source/interfaces/alarms_and_conditions/instantiate_exclusive_deviation_alarm_options.d.ts +4 -4
  38. package/dist/source/interfaces/alarms_and_conditions/instantiate_exclusive_deviation_alarm_options.js +2 -2
  39. package/dist/source/interfaces/alarms_and_conditions/instantiate_exclusive_limit_alarm_options.d.ts +4 -4
  40. package/dist/source/interfaces/alarms_and_conditions/instantiate_exclusive_limit_alarm_options.js +2 -2
  41. package/dist/source/interfaces/alarms_and_conditions/instantiate_limit_alarm_options.d.ts +9 -9
  42. package/dist/source/interfaces/alarms_and_conditions/instantiate_limit_alarm_options.js +2 -2
  43. package/dist/source/interfaces/alarms_and_conditions/instantiate_non_exclusive_deviation_alarm_options.d.ts +4 -4
  44. package/dist/source/interfaces/alarms_and_conditions/instantiate_non_exclusive_deviation_alarm_options.js +2 -2
  45. package/dist/source/interfaces/alarms_and_conditions/instantiate_non_exclusive_limit_alarm_options.d.ts +4 -4
  46. package/dist/source/interfaces/alarms_and_conditions/instantiate_non_exclusive_limit_alarm_options.js +2 -2
  47. package/dist/source/interfaces/alarms_and_conditions/instantiate_off_normal_alarm_options.d.ts +20 -20
  48. package/dist/source/interfaces/alarms_and_conditions/instantiate_off_normal_alarm_options.js +2 -2
  49. package/dist/source/interfaces/alarms_and_conditions/ua_acknowledgeable_condition_ex.d.ts +23 -23
  50. package/dist/source/interfaces/alarms_and_conditions/ua_acknowledgeable_condition_ex.js +2 -2
  51. package/dist/source/interfaces/alarms_and_conditions/ua_alarm_condition_ex.d.ts +32 -32
  52. package/dist/source/interfaces/alarms_and_conditions/ua_alarm_condition_ex.js +2 -2
  53. package/dist/source/interfaces/alarms_and_conditions/ua_certificate_expiration_alarm_ex.d.ts +19 -19
  54. package/dist/source/interfaces/alarms_and_conditions/ua_certificate_expiration_alarm_ex.js +2 -2
  55. package/dist/source/interfaces/alarms_and_conditions/ua_condition_ex.d.ts +45 -42
  56. package/dist/source/interfaces/alarms_and_conditions/ua_condition_ex.js +2 -2
  57. package/dist/source/interfaces/alarms_and_conditions/ua_discrete_alarm_ex.d.ts +7 -7
  58. package/dist/source/interfaces/alarms_and_conditions/ua_discrete_alarm_ex.js +25 -25
  59. package/dist/source/interfaces/alarms_and_conditions/ua_exclusive_deviation_alarm_ex.d.ts +5 -5
  60. package/dist/source/interfaces/alarms_and_conditions/ua_exclusive_deviation_alarm_ex.js +2 -2
  61. package/dist/source/interfaces/alarms_and_conditions/ua_exclusive_limit_alarm_ex.d.ts +20 -20
  62. package/dist/source/interfaces/alarms_and_conditions/ua_exclusive_limit_alarm_ex.js +2 -2
  63. package/dist/source/interfaces/alarms_and_conditions/ua_limit_alarm_ex.d.ts +26 -26
  64. package/dist/source/interfaces/alarms_and_conditions/ua_limit_alarm_ex.js +2 -2
  65. package/dist/source/interfaces/alarms_and_conditions/ua_non_exclusive_deviation_alarm_ex.d.ts +8 -8
  66. package/dist/source/interfaces/alarms_and_conditions/ua_non_exclusive_deviation_alarm_ex.js +2 -2
  67. package/dist/source/interfaces/alarms_and_conditions/ua_non_exclusive_limit_alarm_ex.d.ts +10 -10
  68. package/dist/source/interfaces/alarms_and_conditions/ua_non_exclusive_limit_alarm_ex.js +2 -2
  69. package/dist/source/interfaces/data_access/ua_multistate_discrete_ex.d.ts +21 -21
  70. package/dist/source/interfaces/data_access/ua_multistate_discrete_ex.js +2 -2
  71. package/dist/source/interfaces/data_access/ua_multistate_value_discrete_ex.d.ts +24 -24
  72. package/dist/source/interfaces/data_access/ua_multistate_value_discrete_ex.js +2 -2
  73. package/dist/source/interfaces/data_access/ua_two_state_discrete_ex.d.ts +12 -12
  74. package/dist/source/interfaces/data_access/ua_two_state_discrete_ex.js +2 -2
  75. package/dist/source/interfaces/data_access/ua_y_array_item_ex.d.ts +8 -8
  76. package/dist/source/interfaces/data_access/ua_y_array_item_ex.js +2 -2
  77. package/dist/source/interfaces/extension_object_constructor.d.ts +10 -10
  78. package/dist/source/interfaces/extension_object_constructor.js +2 -2
  79. package/dist/source/interfaces/nodeset_loader_options.d.ts +4 -4
  80. package/dist/source/interfaces/nodeset_loader_options.js +2 -2
  81. package/dist/source/interfaces/state_machine/ua_exclusive_limit_state_machine_type_ex.d.ts +12 -12
  82. package/dist/source/interfaces/state_machine/ua_exclusive_limit_state_machine_type_ex.js +2 -2
  83. package/dist/source/interfaces/state_machine/ua_finite_state_machine_type.d.ts +49 -49
  84. package/dist/source/interfaces/state_machine/ua_finite_state_machine_type.js +2 -2
  85. package/dist/source/interfaces/state_machine/ua_program_state_machine_type.d.ts +11 -11
  86. package/dist/source/interfaces/state_machine/ua_program_state_machine_type.js +2 -2
  87. package/dist/source/interfaces/state_machine/ua_shelved_state_machine_ex.d.ts +30 -30
  88. package/dist/source/interfaces/state_machine/ua_shelved_state_machine_ex.js +2 -2
  89. package/dist/source/interfaces/state_machine/ua_state_machine_type.d.ts +234 -234
  90. package/dist/source/interfaces/state_machine/ua_state_machine_type.js +2 -2
  91. package/dist/source/interfaces/state_machine/ua_transition_ex.d.ts +6 -6
  92. package/dist/source/interfaces/state_machine/ua_transition_ex.js +2 -2
  93. package/dist/source/interfaces/ua_subscription_diagnostics_variable_ex.d.ts +8 -8
  94. package/dist/source/interfaces/ua_subscription_diagnostics_variable_ex.js +2 -2
  95. package/dist/source/loader/decode_xml_extension_object.d.ts +6 -6
  96. package/dist/source/loader/decode_xml_extension_object.js +71 -71
  97. package/dist/source/loader/ensure_datatype_extracted.d.ts +5 -5
  98. package/dist/source/loader/ensure_datatype_extracted.js +70 -70
  99. package/dist/source/loader/generateAddressSpaceRaw.d.ts +11 -11
  100. package/dist/source/loader/generateAddressSpaceRaw.js +45 -45
  101. package/dist/source/loader/load_nodeset2.d.ts +17 -17
  102. package/dist/source/loader/load_nodeset2.js +1483 -1483
  103. package/dist/source/loader/make_semver_compatible.d.ts +6 -6
  104. package/dist/source/loader/make_semver_compatible.js +25 -25
  105. package/dist/source/loader/make_xml_extension_object_parser.d.ts +28 -28
  106. package/dist/source/loader/make_xml_extension_object_parser.js +326 -326
  107. package/dist/source/loader/namespace_post_step.d.ts +10 -10
  108. package/dist/source/loader/namespace_post_step.js +61 -61
  109. package/dist/source/loader/register_node_promoter.d.ts +2 -2
  110. package/dist/source/loader/register_node_promoter.js +9 -9
  111. package/dist/source/namespace.d.ts +6 -6
  112. package/dist/source/namespace.js +2 -2
  113. package/dist/source/namespace_alarm_and_condition.d.ts +32 -32
  114. package/dist/source/namespace_alarm_and_condition.js +2 -2
  115. package/dist/source/namespace_data_access.d.ts +42 -42
  116. package/dist/source/namespace_data_access.js +2 -2
  117. package/dist/source/namespace_machine_state.d.ts +8 -8
  118. package/dist/source/namespace_machine_state.js +2 -2
  119. package/dist/source/pseudo_session.d.ts +72 -72
  120. package/dist/source/pseudo_session.js +254 -254
  121. package/dist/source/session_context.d.ts +111 -111
  122. package/dist/source/session_context.js +264 -264
  123. package/dist/source/session_context.js.map +1 -1
  124. package/dist/source/set_namespace_meta_data.d.ts +2 -2
  125. package/dist/source/set_namespace_meta_data.js +59 -59
  126. package/dist/source/ua_root_folder.d.ts +9 -9
  127. package/dist/source/ua_root_folder.js +2 -2
  128. package/dist/source/ua_two_state_variable_ex.d.ts +23 -23
  129. package/dist/source/ua_two_state_variable_ex.js +2 -2
  130. package/dist/source/xml_writer.d.ts +18 -18
  131. package/dist/source/xml_writer.js +2 -2
  132. package/dist/src/address_space.d.ts +387 -387
  133. package/dist/src/address_space.js +1385 -1385
  134. package/dist/src/address_space.js.map +1 -1
  135. package/dist/src/address_space_change_event_tools.d.ts +6 -6
  136. package/dist/src/address_space_change_event_tools.js +152 -152
  137. package/dist/src/address_space_private.d.ts +43 -43
  138. package/dist/src/address_space_private.js +2 -2
  139. package/dist/src/alarms_and_conditions/condition.d.ts +5 -5
  140. package/dist/src/alarms_and_conditions/condition.js +78 -78
  141. package/dist/src/alarms_and_conditions/condition_info_impl.d.ts +26 -26
  142. package/dist/src/alarms_and_conditions/condition_info_impl.js +54 -54
  143. package/dist/src/alarms_and_conditions/condition_snapshot_impl.d.ts +222 -222
  144. package/dist/src/alarms_and_conditions/condition_snapshot_impl.js +657 -657
  145. package/dist/src/alarms_and_conditions/condition_snapshot_impl.js.map +1 -1
  146. package/dist/src/alarms_and_conditions/deviation_alarm_helper.d.ts +9 -9
  147. package/dist/src/alarms_and_conditions/deviation_alarm_helper.js +60 -60
  148. package/dist/src/alarms_and_conditions/index.d.ts +16 -16
  149. package/dist/src/alarms_and_conditions/index.js +32 -32
  150. package/dist/src/alarms_and_conditions/ua_acknowledgeable_condition_impl.d.ts +44 -44
  151. package/dist/src/alarms_and_conditions/ua_acknowledgeable_condition_impl.js +244 -244
  152. package/dist/src/alarms_and_conditions/ua_alarm_condition_impl.d.ts +93 -93
  153. package/dist/src/alarms_and_conditions/ua_alarm_condition_impl.js +418 -418
  154. package/dist/src/alarms_and_conditions/ua_alarm_condition_impl.js.map +1 -1
  155. package/dist/src/alarms_and_conditions/ua_base_event_impl.d.ts +26 -26
  156. package/dist/src/alarms_and_conditions/ua_base_event_impl.js +38 -38
  157. package/dist/src/alarms_and_conditions/ua_certificate_expiration_alarm_impl.d.ts +44 -44
  158. package/dist/src/alarms_and_conditions/ua_certificate_expiration_alarm_impl.js +183 -183
  159. package/dist/src/alarms_and_conditions/ua_condition_impl.d.ts +155 -153
  160. package/dist/src/alarms_and_conditions/ua_condition_impl.js +1028 -1028
  161. package/dist/src/alarms_and_conditions/ua_condition_impl.js.map +1 -1
  162. package/dist/src/alarms_and_conditions/ua_discrete_alarm_impl.d.ts +14 -14
  163. package/dist/src/alarms_and_conditions/ua_discrete_alarm_impl.js +34 -34
  164. package/dist/src/alarms_and_conditions/ua_exclusive_deviation_alarm_impl.d.ts +24 -24
  165. package/dist/src/alarms_and_conditions/ua_exclusive_deviation_alarm_impl.js +56 -56
  166. package/dist/src/alarms_and_conditions/ua_exclusive_level_alarm_impl.d.ts +11 -11
  167. package/dist/src/alarms_and_conditions/ua_exclusive_level_alarm_impl.js +11 -11
  168. package/dist/src/alarms_and_conditions/ua_exclusive_limit_alarm_impl.d.ts +23 -23
  169. package/dist/src/alarms_and_conditions/ua_exclusive_limit_alarm_impl.js +86 -86
  170. package/dist/src/alarms_and_conditions/ua_exclusive_rate_of_change_alarm_impl.d.ts +11 -11
  171. package/dist/src/alarms_and_conditions/ua_exclusive_rate_of_change_alarm_impl.js +7 -7
  172. package/dist/src/alarms_and_conditions/ua_limit_alarm_impl.d.ts +79 -79
  173. package/dist/src/alarms_and_conditions/ua_limit_alarm_impl.js +250 -250
  174. package/dist/src/alarms_and_conditions/ua_non_exclusive_deviation_alarm_impl.d.ts +24 -24
  175. package/dist/src/alarms_and_conditions/ua_non_exclusive_deviation_alarm_impl.js +50 -50
  176. package/dist/src/alarms_and_conditions/ua_non_exclusive_limit_alarm_impl.d.ts +19 -19
  177. package/dist/src/alarms_and_conditions/ua_non_exclusive_limit_alarm_impl.js +162 -162
  178. package/dist/src/alarms_and_conditions/ua_off_normal_alarm_impl.d.ts +46 -46
  179. package/dist/src/alarms_and_conditions/ua_off_normal_alarm_impl.js +165 -165
  180. package/dist/src/alarms_and_conditions/ua_system_off_normal_alarm_impl.d.ts +18 -18
  181. package/dist/src/alarms_and_conditions/ua_system_off_normal_alarm_impl.js +17 -17
  182. package/dist/src/apply_condition_refresh.d.ts +6 -6
  183. package/dist/src/apply_condition_refresh.js +27 -27
  184. package/dist/src/base_node_impl.d.ts +284 -284
  185. package/dist/src/base_node_impl.js +1454 -1454
  186. package/dist/src/base_node_private.d.ts +81 -81
  187. package/dist/src/base_node_private.js +832 -803
  188. package/dist/src/base_node_private.js.map +1 -1
  189. package/dist/src/check_value_rank_compatibility.d.ts +15 -15
  190. package/dist/src/check_value_rank_compatibility.js +81 -81
  191. package/dist/src/data_access/add_dataItem_stuff.d.ts +11 -11
  192. package/dist/src/data_access/add_dataItem_stuff.js +61 -61
  193. package/dist/src/data_access/check_variant_compatibility_ua_analog_item.d.ts +1 -1
  194. package/dist/src/data_access/check_variant_compatibility_ua_analog_item.js +34 -34
  195. package/dist/src/data_access/ua_multistate_discrete_impl.d.ts +32 -32
  196. package/dist/src/data_access/ua_multistate_discrete_impl.js +130 -130
  197. package/dist/src/data_access/ua_multistate_value_discrete_impl.d.ts +52 -52
  198. package/dist/src/data_access/ua_multistate_value_discrete_impl.js +253 -253
  199. package/dist/src/data_access/ua_two_state_discrete_impl.d.ts +25 -25
  200. package/dist/src/data_access/ua_two_state_discrete_impl.js +155 -155
  201. package/dist/src/event_data.d.ts +34 -34
  202. package/dist/src/event_data.js +64 -64
  203. package/dist/src/extension_object_array_node.d.ts +23 -23
  204. package/dist/src/extension_object_array_node.js +248 -248
  205. package/dist/src/historical_access/address_space_historical_data_node.d.ts +26 -26
  206. package/dist/src/historical_access/address_space_historical_data_node.js +652 -652
  207. package/dist/src/idx_iterator.d.ts +8 -8
  208. package/dist/src/idx_iterator.js +50 -50
  209. package/dist/src/index_current.d.ts +46 -46
  210. package/dist/src/index_current.js +77 -77
  211. package/dist/src/namespace_impl.d.ts +456 -456
  212. package/dist/src/namespace_impl.js +1762 -1762
  213. package/dist/src/namespace_impl.js.map +1 -1
  214. package/dist/src/namespace_private.d.ts +23 -23
  215. package/dist/src/namespace_private.js +32 -32
  216. package/dist/src/nodeid_manager.d.ts +37 -37
  217. package/dist/src/nodeid_manager.js +183 -183
  218. package/dist/src/nodeset_tools/adjust_namespace_array.d.ts +2 -2
  219. package/dist/src/nodeset_tools/adjust_namespace_array.js +13 -13
  220. package/dist/src/nodeset_tools/construct_namespace_dependency.d.ts +18 -18
  221. package/dist/src/nodeset_tools/construct_namespace_dependency.js +140 -140
  222. package/dist/src/nodeset_tools/dump_to_bsd.d.ts +2 -2
  223. package/dist/src/nodeset_tools/dump_to_bsd.js +164 -164
  224. package/dist/src/nodeset_tools/nodeset_to_xml.d.ts +10 -10
  225. package/dist/src/nodeset_tools/nodeset_to_xml.js +1287 -1287
  226. package/dist/src/private_namespace.d.ts +5 -5
  227. package/dist/src/private_namespace.js +19 -19
  228. package/dist/src/reference_impl.d.ts +43 -43
  229. package/dist/src/reference_impl.js +139 -139
  230. package/dist/src/role_permissions.d.ts +2 -2
  231. package/dist/src/role_permissions.js +10 -10
  232. package/dist/src/state_machine/finite_state_machine.d.ts +81 -81
  233. package/dist/src/state_machine/finite_state_machine.js +388 -388
  234. package/dist/src/state_machine/ua_shelving_state_machine_ex.d.ts +38 -38
  235. package/dist/src/state_machine/ua_shelving_state_machine_ex.js +250 -250
  236. package/dist/src/state_machine/ua_two_state_variable.d.ts +61 -61
  237. package/dist/src/state_machine/ua_two_state_variable.js +331 -331
  238. package/dist/src/tool_isSubtypeOf.d.ts +18 -18
  239. package/dist/src/tool_isSubtypeOf.js +124 -124
  240. package/dist/src/ua_condition_type.d.ts +8 -8
  241. package/dist/src/ua_condition_type.js +2 -2
  242. package/dist/src/ua_data_type_impl.d.ts +89 -89
  243. package/dist/src/ua_data_type_impl.js +368 -368
  244. package/dist/src/ua_method_impl.d.ts +42 -42
  245. package/dist/src/ua_method_impl.js +217 -217
  246. package/dist/src/ua_object_impl.d.ts +35 -35
  247. package/dist/src/ua_object_impl.js +168 -168
  248. package/dist/src/ua_object_type_impl.d.ts +50 -50
  249. package/dist/src/ua_object_type_impl.js +126 -126
  250. package/dist/src/ua_reference_type_impl.d.ts +45 -45
  251. package/dist/src/ua_reference_type_impl.js +141 -141
  252. package/dist/src/ua_variable_impl.d.ts +380 -380
  253. package/dist/src/ua_variable_impl.js +1738 -1738
  254. package/dist/src/ua_variable_impl_ext_obj.d.ts +23 -23
  255. package/dist/src/ua_variable_impl_ext_obj.js +670 -670
  256. package/dist/src/ua_variable_type_impl.d.ts +74 -74
  257. package/dist/src/ua_variable_type_impl.js +597 -581
  258. package/dist/src/ua_variable_type_impl.js.map +1 -1
  259. package/dist/src/ua_view_impl.d.ts +19 -19
  260. package/dist/src/ua_view_impl.js +43 -43
  261. package/dist/tsconfig_common.tsbuildinfo +1 -0
  262. package/distHelpers/add_event_generator_object.d.ts +3 -3
  263. package/distHelpers/add_event_generator_object.js +64 -64
  264. package/distHelpers/alarms_and_conditions_demo.d.ts +9 -9
  265. package/distHelpers/alarms_and_conditions_demo.js +115 -115
  266. package/distHelpers/assertHasMatchingReference.d.ts +19 -19
  267. package/distHelpers/assertHasMatchingReference.js +40 -40
  268. package/distHelpers/boiler_system.d.ts +113 -113
  269. package/distHelpers/boiler_system.js +395 -395
  270. package/distHelpers/create_minimalist_address_space_nodeset.d.ts +5 -5
  271. package/distHelpers/create_minimalist_address_space_nodeset.js +171 -171
  272. package/distHelpers/date_utils.d.ts +3 -3
  273. package/distHelpers/date_utils.js +9 -9
  274. package/distHelpers/dump_statemachine.js +127 -127
  275. package/distHelpers/get_address_space_fixture.d.ts +1 -1
  276. package/distHelpers/get_address_space_fixture.js +30 -30
  277. package/distHelpers/get_mini_address_space.d.ts +7 -7
  278. package/distHelpers/get_mini_address_space.js +36 -36
  279. package/distHelpers/index.d.ts +12 -12
  280. package/distHelpers/index.js +28 -28
  281. package/distHelpers/mock_session.d.ts +10 -10
  282. package/distHelpers/mock_session.js +25 -25
  283. package/distNodeJS/generate_address_space.d.ts +6 -6
  284. package/distNodeJS/generate_address_space.js +52 -52
  285. package/distNodeJS/index.d.ts +1 -1
  286. package/distNodeJS/index.js +17 -17
  287. package/package.json +51 -40
  288. package/source/interfaces/alarms_and_conditions/ua_condition_ex.ts +4 -3
  289. package/src/alarms_and_conditions/ua_condition_impl.ts +14 -9
  290. package/src/base_node_private.ts +73 -28
  291. package/src/ua_variable_type_impl.ts +35 -17
  292. package/.mocharc.yml +0 -12
  293. package/dist/src/tool_isSupertypeOf.d.ts +0 -18
  294. package/dist/src/tool_isSupertypeOf.js +0 -125
  295. package/dist/src/tool_isSupertypeOf.js.map +0 -1
  296. package/generate.js +0 -1
  297. package/source_nodejs/generate_address_space.ts +0 -60
  298. package/source_nodejs/index.ts +0 -1
  299. package/test_helpers/add_event_generator_object.ts +0 -71
  300. package/test_helpers/alarms_and_conditions_demo.ts +0 -151
  301. package/test_helpers/assertHasMatchingReference.ts +0 -43
  302. package/test_helpers/boiler_system.ts +0 -610
  303. package/test_helpers/create_minimalist_address_space_nodeset.ts +0 -208
  304. package/test_helpers/date_utils.ts +0 -5
  305. package/test_helpers/dump_statemachine.ts +0 -155
  306. package/test_helpers/get_address_space_fixture.ts +0 -30
  307. package/test_helpers/get_mini_address_space.ts +0 -42
  308. package/test_helpers/index.ts +0 -12
  309. package/test_helpers/mock_session.ts +0 -34
  310. package/test_helpers/test_fixtures/dataType_in_separateNamespace.xml +0 -150
  311. package/test_helpers/test_fixtures/dataType_in_separateNamespace_basic.xml +0 -57
  312. package/test_helpers/test_fixtures/dataType_in_separateNamespace_mix.xml +0 -136
  313. package/test_helpers/test_fixtures/dataType_issue.xml +0 -80
  314. package/test_helpers/test_fixtures/dataType_withEnumeration.xml +0 -82
  315. package/test_helpers/test_fixtures/dataType_with_isOptionSet.xml +0 -194
  316. package/test_helpers/test_fixtures/dataType_with_qualifiedname.xml +0 -71
  317. package/test_helpers/test_fixtures/dataType_with_recursive_structure.xml +0 -155
  318. package/test_helpers/test_fixtures/dataType_with_structures.xml +0 -605
  319. package/test_helpers/test_fixtures/dataType_with_union.xml +0 -90
  320. package/test_helpers/test_fixtures/datatype_as_per_1.04.xml +0 -118
  321. package/test_helpers/test_fixtures/datatype_with_allow_subtype.xml +0 -104
  322. package/test_helpers/test_fixtures/eurange_issue.xml +0 -74
  323. package/test_helpers/test_fixtures/example_issue1096.xml +0 -267
  324. package/test_helpers/test_fixtures/fixture_empty_nodeset2.xml +0 -106
  325. package/test_helpers/test_fixtures/fixture_simple_statemachine_nodeset2.xml +0 -1305
  326. package/test_helpers/test_fixtures/fixuture_nodeset_objects_with_some_methods.xml +0 -370
  327. package/test_helpers/test_fixtures/issue_1132_variable_with_nodeid_value.xml +0 -68
  328. package/test_helpers/test_fixtures/issue_846.xml +0 -3172
  329. package/test_helpers/test_fixtures/issue_899_variable_with_nodeid_value.xml +0 -33
  330. package/test_helpers/test_fixtures/mini.Node.Set2.xml +0 -4736
  331. package/test_helpers/test_fixtures/mini.nodeset.withVariousVariables.xml +0 -196
  332. package/test_helpers/test_fixtures/minimalist_nodeset_with_models.xml +0 -8
  333. package/test_helpers/test_fixtures/minimalist_nodeset_with_models_more_complex.xml +0 -20
  334. package/test_helpers/test_fixtures/nodeset_no_aliases.xml +0 -30
  335. package/test_helpers/test_fixtures/nodeset_no_aliases_with_aliases.xml +0 -31
  336. package/test_helpers/test_fixtures/nodeset_with_analog_items.xml +0 -45
  337. package/test_helpers/test_fixtures/nodeset_with_guid.xml +0 -1442
  338. package/test_helpers/test_fixtures/nodeset_with_int64_values.xml +0 -31
  339. package/test_helpers/test_fixtures/nodeset_with_special_char.xml +0 -34
  340. package/test_helpers/test_fixtures/nodeset_with_utf8_special_characters.xml +0 -20
  341. package/test_helpers/test_fixtures/variable_with_value.xml +0 -143
  342. package/test_helpers/test_fixtures/variabletype_with_value.xml +0 -324
@@ -1,582 +1,598 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.initialize_properties_and_components = exports.assertUnusedChildBrowseName = exports.UAVariableTypeImpl = exports.topMostParentIsObjectTypeOrVariableType = void 0;
4
- /**
5
- * @module node-opcua-address-space
6
- */
7
- // tslint:disable:max-classes-per-file
8
- // tslint:disable:no-console
9
- const chalk = require("chalk");
10
- const node_opcua_assert_1 = require("node-opcua-assert");
11
- const node_opcua_constants_1 = require("node-opcua-constants");
12
- const node_opcua_data_model_1 = require("node-opcua-data-model");
13
- const node_opcua_data_value_1 = require("node-opcua-data-value");
14
- const node_opcua_debug_1 = require("node-opcua-debug");
15
- const node_opcua_nodeid_1 = require("node-opcua-nodeid");
16
- const node_opcua_status_code_1 = require("node-opcua-status-code");
17
- const node_opcua_utils_1 = require("node-opcua-utils");
18
- const node_opcua_variant_1 = require("node-opcua-variant");
19
- const session_context_1 = require("../source/session_context");
20
- const make_optionals_map_1 = require("../source/helpers/make_optionals_map");
21
- const base_node_impl_1 = require("./base_node_impl");
22
- const base_node_private_1 = require("./base_node_private");
23
- const tools = require("./tool_isSubtypeOf");
24
- const tool_isSubtypeOf_1 = require("./tool_isSubtypeOf");
25
- const tool_isSubtypeOf_2 = require("./tool_isSubtypeOf");
26
- const check_value_rank_compatibility_1 = require("./check_value_rank_compatibility");
27
- const debugLog = (0, node_opcua_debug_1.make_debugLog)(__filename);
28
- const doDebug = (0, node_opcua_debug_1.checkDebugFlag)(__filename);
29
- const warningLog = (0, node_opcua_debug_1.make_warningLog)(__filename);
30
- const errorLog = (0, node_opcua_debug_1.make_errorLog)(__filename);
31
- // eslint-disable-next-line prefer-const
32
- let doTrace = (0, node_opcua_debug_1.checkDebugFlag)("INSTANTIATE");
33
- const traceLog = errorLog;
34
- function topMostParentIsObjectTypeOrVariableType(addressSpace, options) {
35
- var _a;
36
- if (options.modellingRule) {
37
- return true;
38
- }
39
- const parent = options.propertyOf || options.componentOf;
40
- if (!parent) {
41
- return false;
42
- }
43
- const parentNode = addressSpace._coerceNode(parent);
44
- if (!parentNode) {
45
- return false;
46
- }
47
- let currentNode = parentNode;
48
- while (currentNode) {
49
- const nodeClass = parentNode.nodeClass;
50
- if (nodeClass === node_opcua_data_model_1.NodeClass.ObjectType || nodeClass === node_opcua_data_model_1.NodeClass.VariableType) {
51
- return true;
52
- }
53
- if (nodeClass === node_opcua_data_model_1.NodeClass.Object || nodeClass === node_opcua_data_model_1.NodeClass.Variable || nodeClass === node_opcua_data_model_1.NodeClass.Method) {
54
- /** */
55
- }
56
- currentNode = (_a = currentNode.findReferencesEx("HasChild", node_opcua_data_model_1.BrowseDirection.Inverse)[0]) === null || _a === void 0 ? void 0 : _a.node;
57
- }
58
- return false;
59
- }
60
- exports.topMostParentIsObjectTypeOrVariableType = topMostParentIsObjectTypeOrVariableType;
61
- function deprecate(func) {
62
- return func;
63
- }
64
- class UAVariableTypeImpl extends base_node_impl_1.BaseNodeImpl {
65
- get subtypeOf() {
66
- return tool_isSubtypeOf_2.get_subtypeOf.call(this);
67
- }
68
- get subtypeOfObj() {
69
- return tool_isSubtypeOf_1.get_subtypeOfObj.call(this);
70
- }
71
- constructor(options) {
72
- super(options);
73
- this.nodeClass = node_opcua_data_model_1.NodeClass.VariableType;
74
- this.isSubtypeOf = tools.construct_isSubtypeOf(UAVariableTypeImpl);
75
- /** @deprecated - use isSubtypeOf instead */
76
- this.isSupertypeOf = deprecate(tools.construct_isSubtypeOf(UAVariableTypeImpl));
77
- (0, node_opcua_variant_1.verifyRankAndDimensions)(options);
78
- this.valueRank = options.valueRank || -1;
79
- this.arrayDimensions = options.arrayDimensions || null;
80
- this.minimumSamplingInterval = 0;
81
- this.historizing = (0, node_opcua_utils_1.isNullOrUndefined)(options.historizing) ? false : options.historizing;
82
- this.isAbstract = (0, node_opcua_utils_1.isNullOrUndefined)(options.isAbstract) ? false : options.isAbstract;
83
- this.value = options.value; // optional default value for instances of this UAVariableType
84
- this.dataType = (0, node_opcua_nodeid_1.coerceNodeId)(options.dataType); // DataType (NodeId)
85
- if (options.value) {
86
- this.value = new node_opcua_variant_1.Variant(options.value);
87
- }
88
- }
89
- readAttribute(context, attributeId) {
90
- (0, node_opcua_assert_1.assert)(!context || context instanceof session_context_1.SessionContext);
91
- const options = {};
92
- switch (attributeId) {
93
- case node_opcua_data_model_1.AttributeIds.IsAbstract:
94
- options.value = { dataType: node_opcua_variant_1.DataType.Boolean, value: this.isAbstract ? true : false };
95
- options.statusCode = node_opcua_status_code_1.StatusCodes.Good;
96
- break;
97
- case node_opcua_data_model_1.AttributeIds.Value:
98
- if (Object.prototype.hasOwnProperty.call(this, "value") && this.value !== undefined) {
99
- (0, node_opcua_assert_1.assert)(this.value.schema.name === "Variant");
100
- options.value = this.value;
101
- options.statusCode = node_opcua_status_code_1.StatusCodes.Good;
102
- }
103
- else {
104
- debugLog(" warning Value not implemented");
105
- options.value = { dataType: node_opcua_variant_1.DataType.Null };
106
- options.statusCode = node_opcua_status_code_1.StatusCodes.BadAttributeIdInvalid;
107
- }
108
- break;
109
- case node_opcua_data_model_1.AttributeIds.DataType:
110
- (0, node_opcua_assert_1.assert)(this.dataType instanceof node_opcua_nodeid_1.NodeId);
111
- options.value = { dataType: node_opcua_variant_1.DataType.NodeId, value: this.dataType };
112
- options.statusCode = node_opcua_status_code_1.StatusCodes.Good;
113
- break;
114
- case node_opcua_data_model_1.AttributeIds.ValueRank:
115
- options.value = { dataType: node_opcua_variant_1.DataType.Int32, value: this.valueRank };
116
- options.statusCode = node_opcua_status_code_1.StatusCodes.Good;
117
- break;
118
- case node_opcua_data_model_1.AttributeIds.ArrayDimensions:
119
- (0, node_opcua_assert_1.assert)(Array.isArray(this.arrayDimensions) || this.arrayDimensions === null);
120
- options.value = {
121
- arrayType: node_opcua_variant_1.VariantArrayType.Array,
122
- dataType: node_opcua_variant_1.DataType.UInt32,
123
- value: this.arrayDimensions
124
- };
125
- options.statusCode = node_opcua_status_code_1.StatusCodes.Good;
126
- break;
127
- default:
128
- return super.readAttribute(context, attributeId);
129
- }
130
- return new node_opcua_data_value_1.DataValue(options);
131
- }
132
- toString() {
133
- const options = new base_node_private_1.ToStringBuilder();
134
- base_node_private_1.UAVariableType_toString.call(this, options);
135
- return options.toString();
136
- }
137
- /**
138
- * instantiate an object of this UAVariableType
139
- * The instantiation takes care of object type inheritance when constructing inner properties
140
-
141
- * Note : HasComponent usage scope
142
- *
143
- * ```text
144
- * Source | Destination
145
- * -------------------+---------------------------
146
- * Object | Object, Variable,Method
147
- * ObjectType |
148
- * -------------------+---------------------------
149
- * DataVariable | Variable
150
- * DataVariableType |
151
- * ```
152
- *
153
- * see : OPCUA 1.03 page 44 $6.4 Instances of ObjectTypes and VariableTypes
154
- */
155
- instantiate(options) {
156
- const addressSpace = this.addressSpace;
157
- // xx assert(!this.isAbstract, "cannot instantiate abstract UAVariableType");
158
- (0, node_opcua_assert_1.assert)(options, "missing option object");
159
- (0, node_opcua_assert_1.assert)(typeof options.browseName === "string" || (options.browseName !== null && typeof options.browseName === "object"), "expecting a browse name");
160
- (0, node_opcua_assert_1.assert)(!Object.prototype.hasOwnProperty.call(options, "propertyOf"), "Use addressSpace#addVariable({ propertyOf: xxx}); to add a property");
161
- assertUnusedChildBrowseName(addressSpace, options);
162
- const baseVariableType = addressSpace.findVariableType("BaseVariableType");
163
- (0, node_opcua_assert_1.assert)(baseVariableType, "BaseVariableType must be defined in the address space");
164
- let dataType = options.dataType !== undefined ? options.dataType : this.dataType;
165
- // may be required (i.e YArrayItemType )
166
- dataType = this.resolveNodeId(dataType); // DataType (NodeId)
167
- (0, node_opcua_assert_1.assert)(dataType instanceof node_opcua_nodeid_1.NodeId);
168
- const valueRank = options.valueRank !== undefined ? options.valueRank : this.valueRank;
169
- const { result, errorMessage } = (0, check_value_rank_compatibility_1.checkValueRankCompatibility)(valueRank, this.valueRank);
170
- if (!result) {
171
- errorLog(errorMessage);
172
- throw new Error(errorMessage);
173
- }
174
- const arrayDimensions = options.arrayDimensions !== undefined ? options.arrayDimensions : this.arrayDimensions;
175
- // istanbul ignore next
176
- if (!dataType || dataType.isEmpty()) {
177
- warningLog(" options.dataType", options.dataType ? options.dataType.toString() : "<null>");
178
- warningLog(" this.dataType", this.dataType ? this.dataType.toString() : "<null>");
179
- throw new Error(" A valid dataType must be specified");
180
- }
181
- const copyAlsoModellingRules = topMostParentIsObjectTypeOrVariableType(addressSpace, options);
182
- const defaultDataType = this.dataType;
183
- // BadAttributeIdInvalid
184
- const defaultDataValue = this.readAttribute(null, node_opcua_data_model_1.AttributeIds.Value);
185
- const defaultValue = (defaultDataType.namespace === 0 && defaultDataType.value == 0) || defaultDataValue.statusCode.isNotGood()
186
- ? undefined
187
- : defaultDataValue.value;
188
- const opts = {
189
- arrayDimensions,
190
- browseName: options.browseName,
191
- componentOf: options.componentOf,
192
- dataType,
193
- description: options.description || this.description,
194
- displayName: options.displayName || "",
195
- eventSourceOf: options.eventSourceOf,
196
- minimumSamplingInterval: options.minimumSamplingInterval,
197
- modellingRule: options.modellingRule,
198
- nodeId: options.nodeId,
199
- notifierOf: options.notifierOf,
200
- organizedBy: options.organizedBy,
201
- typeDefinition: this.nodeId,
202
- value: options.value || defaultValue,
203
- valueRank
204
- };
205
- const namespace = options.namespace || addressSpace.getOwnNamespace();
206
- const instance = namespace.addVariable(opts);
207
- // xx assert(instance.minimumSamplingInterval === options.minimumSamplingInterval);
208
- initialize_properties_and_components(instance, baseVariableType, this, copyAlsoModellingRules, options.optionals);
209
- // if VariableType is a type of Structure DataType
210
- // we need to instantiate a dataValue
211
- // and create a bidirectional binding with the individual properties of this type
212
- instance.bindExtensionObject(options.extensionObject, { createMissingProp: false });
213
- (0, node_opcua_assert_1.assert)(instance.typeDefinition.toString() === this.nodeId.toString());
214
- instance.install_extra_properties();
215
- if (this._postInstantiateFunc) {
216
- this._postInstantiateFunc(instance, this);
217
- }
218
- return instance;
219
- }
220
- }
221
- exports.UAVariableTypeImpl = UAVariableTypeImpl;
222
- /**
223
- * return true if node is a mandatory child or a requested optional
224
- * @method MandatoryChildOrRequestedOptionalFilter
225
- * @param instance
226
- * @param optionalsMap
227
- * @return {Boolean}
228
- */
229
- class MandatoryChildOrRequestedOptionalFilter {
230
- constructor(instance, optionalsMap) {
231
- // should we clone the node to be a component or propertyOf of a instance
232
- (0, node_opcua_assert_1.assert)(optionalsMap !== null && typeof optionalsMap === "object");
233
- (0, node_opcua_assert_1.assert)(null !== instance);
234
- this.optionalsMap = optionalsMap;
235
- this.instance = instance;
236
- this.references = instance.allReferences();
237
- }
238
- shouldKeep(node) {
239
- var _a;
240
- const addressSpace = node.addressSpace;
241
- const alreadyIn = this.references.filter((r) => {
242
- const n = addressSpace.findNode(r.nodeId);
243
- // istanbul ignore next
244
- if (!n) {
245
- warningLog(" cannot find node ", r.nodeId.toString());
246
- return false;
247
- }
248
- return n.browseName.name.toString() === node.browseName.name.toString();
249
- });
250
- if (alreadyIn.length > 0) {
251
- (0, node_opcua_assert_1.assert)(alreadyIn.length === 1, "Duplication found ?");
252
- // a child with the same browse name has already been install
253
- // probably from a SuperClass, we should ignore this.
254
- return false; // ignore
255
- }
256
- const modellingRule = node.modellingRule;
257
- switch (modellingRule) {
258
- case null:
259
- case undefined:
260
- debugLog("node ", node.browseName.toString(), node.nodeId.toString(), " has no modellingRule ", (_a = node.parentNodeId) === null || _a === void 0 ? void 0 : _a.toString());
261
- /**
262
- * in some badly generated NodeSet2.xml file, the modellingRule is not specified
263
- *
264
- * but in some other NodeSet2.xml, this means that the data are only attached to the Type node and shall not be
265
- * instantiate in the corresponding instance (example is the state variable of a finite state machine that are only
266
- * defined in the Type node)
267
- *
268
- * we should not consider it as an error, and treat it as not present
269
- */
270
- return false;
271
- case "Mandatory":
272
- return true; // keep;
273
- case "Optional":
274
- // only if in requested optionals
275
- return node.browseName.name in this.optionalsMap;
276
- case "OptionalPlaceholder":
277
- return false; // ignored
278
- default:
279
- return false; // ignored
280
- }
281
- }
282
- filterFor(childInstance) {
283
- const browseName = childInstance.browseName.name;
284
- let map = {};
285
- if (browseName in this.optionalsMap) {
286
- map = this.optionalsMap[browseName];
287
- }
288
- const newFilter = new MandatoryChildOrRequestedOptionalFilter(childInstance, map);
289
- return newFilter;
290
- }
291
- }
292
- /*
293
- * @function _get_parent_as_VariableOrObjectType
294
- * @param originalObject
295
- * @return {null|BaseNode}
296
- * @private
297
- */
298
- function _get_parent_as_VariableOrObjectType(originalObject) {
299
- if (originalObject.nodeClass === node_opcua_data_model_1.NodeClass.Method) {
300
- return null;
301
- }
302
- const addressSpace = originalObject.addressSpace;
303
- const parents = originalObject.findReferencesEx("HasChild", node_opcua_data_model_1.BrowseDirection.Inverse);
304
- // istanbul ignore next
305
- if (parents.length > 1) {
306
- warningLog(" object ", originalObject.browseName.toString(), " has more than one parent !");
307
- warningLog(originalObject.toString());
308
- warningLog(" parents : ");
309
- for (const parent of parents) {
310
- warningLog(" ", parent.toString(), addressSpace.findNode(parent.nodeId).browseName.toString());
311
- }
312
- return null;
313
- }
314
- (0, node_opcua_assert_1.assert)(parents.length === 0 || parents.length === 1);
315
- if (parents.length === 0) {
316
- return null;
317
- }
318
- const theParent = addressSpace.findNode(parents[0].nodeId);
319
- if (theParent && (theParent.nodeClass === node_opcua_data_model_1.NodeClass.VariableType || theParent.nodeClass === node_opcua_data_model_1.NodeClass.ObjectType)) {
320
- return theParent;
321
- }
322
- return null;
323
- }
324
- class CloneHelper {
325
- constructor() {
326
- this.level = 0;
327
- this.mapOrgToClone = new Map();
328
- }
329
- pad() {
330
- return " ".padEnd(this.level * 2, " ");
331
- }
332
- registerClonedObject(objInType, clonedObj) {
333
- this.mapOrgToClone.set(objInType.nodeId.toString(), {
334
- cloned: clonedObj,
335
- original: objInType
336
- });
337
- //
338
- // /-----------------------------\
339
- // | AcknowledgeableConditionType |
340
- // \-----------------------------/
341
- // ^ |
342
- // | +---------------------|- (EnabledState) (shadow element)
343
- // |
344
- // /-----------------------------\
345
- // | AlarmConditionType |
346
- // \-----------------------------/
347
- // |
348
- // +-------------------------------|- EnabledState <
349
- //
350
- // find also child object with the same browse name that are
351
- // overridden in the SuperType
352
- //
353
- const origParent = _get_parent_as_VariableOrObjectType(objInType);
354
- if (origParent) {
355
- let base = origParent.subtypeOfObj;
356
- while (base) {
357
- const shadowChild = base.getChildByName(objInType.browseName);
358
- if (shadowChild) {
359
- this.mapOrgToClone.set(shadowChild.nodeId.toString(), {
360
- cloned: clonedObj,
361
- original: shadowChild
362
- });
363
- }
364
- base = base.subtypeOfObj;
365
- }
366
- }
367
- // find subTypeOf
368
- }
369
- }
370
- // install properties and components on a instantiated Object
371
- //
372
- // based on their ModelingRule
373
- // => Mandatory => Installed
374
- // => Optional => Not Installed , unless it appear in optionals array
375
- // => OptionalPlaceHolder => Not Installed
376
- // => null (no modelling rule ) => Not Installed
377
- //
378
- function _initialize_properties_and_components(instance, topMostType, typeDefinitionNode, copyAlsoModellingRules, optionalsMap, extraInfo) {
379
- if (doDebug) {
380
- debugLog("instance browseName =", instance.browseName.toString());
381
- debugLog("typeNode =", typeDefinitionNode.browseName.toString());
382
- debugLog("optionalsMap =", Object.keys(optionalsMap).join(" "));
383
- const c = typeDefinitionNode.findReferencesEx("Aggregates");
384
- debugLog("typeDefinition aggregates =", c.map((x) => x.node.browseName.toString()).join(" "));
385
- }
386
- optionalsMap = optionalsMap || {};
387
- if ((0, node_opcua_nodeid_1.sameNodeId)(topMostType.nodeId, typeDefinitionNode.nodeId)) {
388
- return; // nothing to do
389
- }
390
- const filter = new MandatoryChildOrRequestedOptionalFilter(instance, optionalsMap);
391
- doTrace &&
392
- traceLog(chalk.cyan(extraInfo.pad(), "cloning relevant member of typeDefinition class"), typeDefinitionNode.browseName.toString());
393
- const browseNameMap = new Set();
394
- (0, base_node_private_1._clone_children_references)(typeDefinitionNode, instance, copyAlsoModellingRules, filter, extraInfo, browseNameMap);
395
- // now apply recursion on baseTypeDefinition to get properties and components from base class
396
- const baseTypeDefinitionNodeId = typeDefinitionNode.subtypeOf;
397
- const baseTypeDefinition = typeDefinitionNode.subtypeOfObj;
398
- doTrace &&
399
- traceLog(chalk.cyan(extraInfo.pad(), "now apply recursion on baseTypeDefinition to get properties and components from base class"), baseTypeDefinition.browseName.toString());
400
- // istanbul ignore next
401
- if (!baseTypeDefinition) {
402
- throw new Error(chalk.red("Cannot find object with nodeId ") + baseTypeDefinitionNodeId);
403
- }
404
- extraInfo.level++;
405
- _initialize_properties_and_components(instance, topMostType, baseTypeDefinition, copyAlsoModellingRules, optionalsMap, extraInfo);
406
- extraInfo.level--;
407
- }
408
- /**
409
- * @method hasChildWithBrowseName
410
- * returns true if the parent object has a child with the provided browseName
411
- * @param parent
412
- * @param childBrowseName
413
- */
414
- function hasChildWithBrowseName(parent, childBrowseName) {
415
- if (!parent) {
416
- throw Error("Internal error");
417
- }
418
- // extract children
419
- const children = parent.findReferencesAsObject("HasChild", true);
420
- return (children.filter((child) => {
421
- var _a, _b;
422
- return ((_a = child.browseName.name) === null || _a === void 0 ? void 0 : _a.toString()) === ((_b = childBrowseName.name) === null || _b === void 0 ? void 0 : _b.toString());
423
- }).length > 0);
424
- }
425
- function getParent(addressSpace, options) {
426
- const parent = options.componentOf || options.organizedBy;
427
- if (parent instanceof node_opcua_nodeid_1.NodeId) {
428
- return addressSpace.findNode(parent);
429
- }
430
- return parent;
431
- }
432
- function assertUnusedChildBrowseName(addressSpace, options) {
433
- const resolveOptionalObject = (node) => node ? addressSpace._coerceNode(node) || undefined : undefined;
434
- options.componentOf = resolveOptionalObject(options.componentOf);
435
- options.organizedBy = resolveOptionalObject(options.organizedBy);
436
- (0, node_opcua_assert_1.assert)(!(options.componentOf && options.organizedBy));
437
- const parent = getParent(addressSpace, options);
438
- if (!parent) {
439
- return;
440
- }
441
- (0, node_opcua_assert_1.assert)(parent !== null && typeof parent === "object");
442
- if (!(parent instanceof base_node_impl_1.BaseNodeImpl)) {
443
- throw new Error("Invalid parent parent is " + parent.constructor.name);
444
- }
445
- // istanbul ignore next
446
- // verify that no components already exists in parent
447
- if (parent && hasChildWithBrowseName(parent, (0, node_opcua_data_model_1.coerceQualifiedName)(options.browseName))) {
448
- throw new Error("object " +
449
- parent.browseName.name.toString() +
450
- " have already a child with browseName " +
451
- options.browseName.toString());
452
- }
453
- }
454
- exports.assertUnusedChildBrowseName = assertUnusedChildBrowseName;
455
- exports.assertUnusedChildBrowseName = assertUnusedChildBrowseName;
456
- exports.initialize_properties_and_components = initialize_properties_and_components;
457
- const hasTypeDefinitionNodeId = (0, node_opcua_nodeid_1.makeNodeId)(node_opcua_constants_1.ReferenceTypeIds.HasTypeDefinition);
458
- const hasModellingRuleNodeId = (0, node_opcua_nodeid_1.makeNodeId)(node_opcua_constants_1.ReferenceTypeIds.HasModellingRule);
459
- /**
460
- * remove unwanted reference such as HasTypeDefinition and HasModellingRule
461
- * from the list
462
- */
463
- function _remove_unwanted_ref(references) {
464
- // filter out HasTypeDefinition (i=40) , HasModellingRule (i=37);
465
- references = references.filter((reference) => !(0, node_opcua_nodeid_1.sameNodeId)(reference.referenceType, hasTypeDefinitionNodeId) &&
466
- !(0, node_opcua_nodeid_1.sameNodeId)(reference.referenceType, hasModellingRuleNodeId));
467
- return references;
468
- }
469
- /**
470
- *
471
- */
472
- function findNonHierarchicalReferences(originalObject) {
473
- // todo: MEMOIZE this method
474
- const addressSpace = originalObject.addressSpace;
475
- const referenceId = addressSpace.findReferenceType("NonHierarchicalReferences");
476
- if (!referenceId) {
477
- return [];
478
- }
479
- (0, node_opcua_assert_1.assert)(referenceId);
480
- // we need to explore the non hierarchical references backwards
481
- let references = originalObject.findReferencesEx("NonHierarchicalReferences", node_opcua_data_model_1.BrowseDirection.Inverse);
482
- references = [].concat(references, originalObject.findReferencesEx("HasEventSource", node_opcua_data_model_1.BrowseDirection.Inverse));
483
- const parent = _get_parent_as_VariableOrObjectType(originalObject);
484
- if (parent && parent.subtypeOfObj) {
485
- // parent is a ObjectType or VariableType and is not a root type
486
- (0, node_opcua_assert_1.assert)(parent.nodeClass === node_opcua_data_model_1.NodeClass.VariableType || parent.nodeClass === node_opcua_data_model_1.NodeClass.ObjectType);
487
- // let investigate the same child base child
488
- const child = parent.subtypeOfObj.getChildByName(originalObject.browseName);
489
- if (child) {
490
- const baseRef = findNonHierarchicalReferences(child);
491
- references = [].concat(references, baseRef);
492
- }
493
- }
494
- // perform some cleanup
495
- references = _remove_unwanted_ref(references);
496
- return references;
497
- }
498
- function reconstructNonHierarchicalReferences(extraInfo) {
499
- const findImplementedObject = (ref) => extraInfo.mapOrgToClone.get(ref.nodeId.toString()) || null;
500
- // navigate through original objects to find those that are being references by node that
501
- // have been cloned .
502
- // this could be node organized by some FunctionalGroup
503
- //
504
- for (const { original, cloned } of extraInfo.mapOrgToClone.values()) {
505
- // find NonHierarchical References on original object
506
- const originalNonHierarchical = findNonHierarchicalReferences(original);
507
- if (originalNonHierarchical.length === 0) {
508
- continue;
509
- }
510
- // istanbul ignore next
511
- if (doDebug) {
512
- debugLog(" investigation ", original.browseName.toString(), cloned.nodeClass.toString(), original.nodeClass.toString(), original.nodeId.toString(), cloned.nodeId.toString());
513
- }
514
- for (const ref of originalNonHierarchical) {
515
- const info = findImplementedObject(ref);
516
- // if the object pointed by this reference is also cloned ...
517
- if (info) {
518
- const originalDest = info.original;
519
- const cloneDest = info.cloned;
520
- // istanbul ignore next
521
- if (doDebug) {
522
- debugLog(chalk.cyan(" adding reference "), ref.referenceType, " from cloned ", cloned.nodeId.toString(), cloned.browseName.toString(), " to cloned ", cloneDest.nodeId.toString(), cloneDest.browseName.toString());
523
- }
524
- // restore reference
525
- cloned.addReference({
526
- isForward: false,
527
- nodeId: cloneDest.nodeId,
528
- referenceType: ref.referenceType
529
- });
530
- }
531
- }
532
- }
533
- }
534
- /**
535
- * recreate functional group types according to type definition
536
- *
537
- * @method reconstructFunctionalGroupType
538
- * @param baseType
539
- */
540
- /* @example:
541
- *
542
- * MyDeviceType
543
- * |
544
- * +----------|- ParameterSet(BaseObjectType)
545
- * | |
546
- * | +-----------------|- Parameter1
547
- * | ^
548
- * +----------|- Config(FunctionalGroupType) |
549
- * | |
550
- * +-------- Organizes---+
551
- */
552
- function reconstructFunctionalGroupType(extraInfo) {
553
- // navigate through original objects to find those that are being organized by some FunctionalGroup
554
- for (const { original, cloned } of extraInfo.mapOrgToClone.values()) {
555
- const organizedByArray = original.findReferencesEx("Organizes", node_opcua_data_model_1.BrowseDirection.Inverse);
556
- for (const ref of organizedByArray) {
557
- const info = extraInfo.mapOrgToClone.get(ref.nodeId.toString());
558
- if (!info)
559
- continue;
560
- const folder = info.original;
561
- (0, node_opcua_assert_1.assert)(folder.typeDefinitionObj.browseName.name.toString() === "FunctionalGroupType");
562
- // now create the same reference with the instantiated function group
563
- const destFolder = info.cloned;
564
- (0, node_opcua_assert_1.assert)(ref.referenceType);
565
- destFolder.addReference({
566
- isForward: !ref.isForward,
567
- nodeId: cloned.nodeId,
568
- referenceType: ref.referenceType
569
- });
570
- }
571
- }
572
- }
573
- function initialize_properties_and_components(instance, topMostType, nodeType, copyAlsoModellingRules, optionals) {
574
- const extraInfo = new CloneHelper();
575
- extraInfo.registerClonedObject(nodeType, instance);
576
- const optionalsMap = (0, make_optionals_map_1.makeOptionalsMap)(optionals);
577
- _initialize_properties_and_components(instance, topMostType, nodeType, copyAlsoModellingRules, optionalsMap, extraInfo);
578
- reconstructFunctionalGroupType(extraInfo);
579
- reconstructNonHierarchicalReferences(extraInfo);
580
- }
581
- exports.initialize_properties_and_components = initialize_properties_and_components;
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.initialize_properties_and_components = exports.assertUnusedChildBrowseName = exports.UAVariableTypeImpl = exports.topMostParentIsObjectTypeOrVariableType = void 0;
4
+ /**
5
+ * @module node-opcua-address-space
6
+ */
7
+ // tslint:disable:max-classes-per-file
8
+ // tslint:disable:no-console
9
+ const chalk = require("chalk");
10
+ const node_opcua_assert_1 = require("node-opcua-assert");
11
+ const node_opcua_constants_1 = require("node-opcua-constants");
12
+ const node_opcua_data_model_1 = require("node-opcua-data-model");
13
+ const node_opcua_data_value_1 = require("node-opcua-data-value");
14
+ const node_opcua_debug_1 = require("node-opcua-debug");
15
+ const node_opcua_nodeid_1 = require("node-opcua-nodeid");
16
+ const node_opcua_status_code_1 = require("node-opcua-status-code");
17
+ const node_opcua_utils_1 = require("node-opcua-utils");
18
+ const node_opcua_variant_1 = require("node-opcua-variant");
19
+ const session_context_1 = require("../source/session_context");
20
+ const make_optionals_map_1 = require("../source/helpers/make_optionals_map");
21
+ const base_node_impl_1 = require("./base_node_impl");
22
+ const base_node_private_1 = require("./base_node_private");
23
+ const tools = require("./tool_isSubtypeOf");
24
+ const tool_isSubtypeOf_1 = require("./tool_isSubtypeOf");
25
+ const tool_isSubtypeOf_2 = require("./tool_isSubtypeOf");
26
+ const check_value_rank_compatibility_1 = require("./check_value_rank_compatibility");
27
+ const debugLog = (0, node_opcua_debug_1.make_debugLog)(__filename);
28
+ const doDebug = (0, node_opcua_debug_1.checkDebugFlag)(__filename);
29
+ const warningLog = (0, node_opcua_debug_1.make_warningLog)(__filename);
30
+ const errorLog = (0, node_opcua_debug_1.make_errorLog)(__filename);
31
+ // eslint-disable-next-line prefer-const
32
+ let doTrace = (0, node_opcua_debug_1.checkDebugFlag)("INSTANTIATE");
33
+ const traceLog = errorLog;
34
+ function topMostParentIsObjectTypeOrVariableType(addressSpace, options) {
35
+ var _a;
36
+ if (options.modellingRule) {
37
+ return true;
38
+ }
39
+ const parent = options.propertyOf || options.componentOf;
40
+ if (!parent) {
41
+ return false;
42
+ }
43
+ const parentNode = addressSpace._coerceNode(parent);
44
+ if (!parentNode) {
45
+ return false;
46
+ }
47
+ let currentNode = parentNode;
48
+ while (currentNode) {
49
+ const nodeClass = parentNode.nodeClass;
50
+ if (nodeClass === node_opcua_data_model_1.NodeClass.ObjectType || nodeClass === node_opcua_data_model_1.NodeClass.VariableType) {
51
+ return true;
52
+ }
53
+ if (nodeClass === node_opcua_data_model_1.NodeClass.Object || nodeClass === node_opcua_data_model_1.NodeClass.Variable || nodeClass === node_opcua_data_model_1.NodeClass.Method) {
54
+ /** */
55
+ }
56
+ currentNode = (_a = currentNode.findReferencesEx("HasChild", node_opcua_data_model_1.BrowseDirection.Inverse)[0]) === null || _a === void 0 ? void 0 : _a.node;
57
+ }
58
+ return false;
59
+ }
60
+ exports.topMostParentIsObjectTypeOrVariableType = topMostParentIsObjectTypeOrVariableType;
61
+ function deprecate(func) {
62
+ return func;
63
+ }
64
+ class UAVariableTypeImpl extends base_node_impl_1.BaseNodeImpl {
65
+ get subtypeOf() {
66
+ return tool_isSubtypeOf_2.get_subtypeOf.call(this);
67
+ }
68
+ get subtypeOfObj() {
69
+ return tool_isSubtypeOf_1.get_subtypeOfObj.call(this);
70
+ }
71
+ constructor(options) {
72
+ super(options);
73
+ this.nodeClass = node_opcua_data_model_1.NodeClass.VariableType;
74
+ this.isSubtypeOf = tools.construct_isSubtypeOf(UAVariableTypeImpl);
75
+ /** @deprecated - use isSubtypeOf instead */
76
+ this.isSupertypeOf = deprecate(tools.construct_isSubtypeOf(UAVariableTypeImpl));
77
+ (0, node_opcua_variant_1.verifyRankAndDimensions)(options);
78
+ this.valueRank = options.valueRank || -1;
79
+ this.arrayDimensions = options.arrayDimensions || null;
80
+ this.minimumSamplingInterval = 0;
81
+ this.historizing = (0, node_opcua_utils_1.isNullOrUndefined)(options.historizing) ? false : options.historizing;
82
+ this.isAbstract = (0, node_opcua_utils_1.isNullOrUndefined)(options.isAbstract) ? false : options.isAbstract;
83
+ this.value = options.value; // optional default value for instances of this UAVariableType
84
+ this.dataType = (0, node_opcua_nodeid_1.coerceNodeId)(options.dataType); // DataType (NodeId)
85
+ if (options.value) {
86
+ this.value = new node_opcua_variant_1.Variant(options.value);
87
+ }
88
+ }
89
+ readAttribute(context, attributeId) {
90
+ (0, node_opcua_assert_1.assert)(!context || context instanceof session_context_1.SessionContext);
91
+ const options = {};
92
+ switch (attributeId) {
93
+ case node_opcua_data_model_1.AttributeIds.IsAbstract:
94
+ options.value = { dataType: node_opcua_variant_1.DataType.Boolean, value: this.isAbstract ? true : false };
95
+ options.statusCode = node_opcua_status_code_1.StatusCodes.Good;
96
+ break;
97
+ case node_opcua_data_model_1.AttributeIds.Value:
98
+ if (Object.prototype.hasOwnProperty.call(this, "value") && this.value !== undefined) {
99
+ (0, node_opcua_assert_1.assert)(this.value.schema.name === "Variant");
100
+ options.value = this.value;
101
+ options.statusCode = node_opcua_status_code_1.StatusCodes.Good;
102
+ }
103
+ else {
104
+ debugLog(" warning Value not implemented");
105
+ options.value = { dataType: node_opcua_variant_1.DataType.Null };
106
+ options.statusCode = node_opcua_status_code_1.StatusCodes.BadAttributeIdInvalid;
107
+ }
108
+ break;
109
+ case node_opcua_data_model_1.AttributeIds.DataType:
110
+ (0, node_opcua_assert_1.assert)(this.dataType instanceof node_opcua_nodeid_1.NodeId);
111
+ options.value = { dataType: node_opcua_variant_1.DataType.NodeId, value: this.dataType };
112
+ options.statusCode = node_opcua_status_code_1.StatusCodes.Good;
113
+ break;
114
+ case node_opcua_data_model_1.AttributeIds.ValueRank:
115
+ options.value = { dataType: node_opcua_variant_1.DataType.Int32, value: this.valueRank };
116
+ options.statusCode = node_opcua_status_code_1.StatusCodes.Good;
117
+ break;
118
+ case node_opcua_data_model_1.AttributeIds.ArrayDimensions:
119
+ (0, node_opcua_assert_1.assert)(Array.isArray(this.arrayDimensions) || this.arrayDimensions === null);
120
+ options.value = {
121
+ arrayType: node_opcua_variant_1.VariantArrayType.Array,
122
+ dataType: node_opcua_variant_1.DataType.UInt32,
123
+ value: this.arrayDimensions
124
+ };
125
+ options.statusCode = node_opcua_status_code_1.StatusCodes.Good;
126
+ break;
127
+ default:
128
+ return super.readAttribute(context, attributeId);
129
+ }
130
+ return new node_opcua_data_value_1.DataValue(options);
131
+ }
132
+ toString() {
133
+ const options = new base_node_private_1.ToStringBuilder();
134
+ base_node_private_1.UAVariableType_toString.call(this, options);
135
+ return options.toString();
136
+ }
137
+ /**
138
+ * instantiate an object of this UAVariableType
139
+ * The instantiation takes care of object type inheritance when constructing inner properties
140
+
141
+ * Note : HasComponent usage scope
142
+ *
143
+ * ```text
144
+ * Source | Destination
145
+ * -------------------+---------------------------
146
+ * Object | Object, Variable,Method
147
+ * ObjectType |
148
+ * -------------------+---------------------------
149
+ * DataVariable | Variable
150
+ * DataVariableType |
151
+ * ```
152
+ *
153
+ * see : OPCUA 1.03 page 44 $6.4 Instances of ObjectTypes and VariableTypes
154
+ */
155
+ instantiate(options) {
156
+ const addressSpace = this.addressSpace;
157
+ // xx assert(!this.isAbstract, "cannot instantiate abstract UAVariableType");
158
+ (0, node_opcua_assert_1.assert)(options, "missing option object");
159
+ (0, node_opcua_assert_1.assert)(typeof options.browseName === "string" || (options.browseName !== null && typeof options.browseName === "object"), "expecting a browse name");
160
+ (0, node_opcua_assert_1.assert)(!Object.prototype.hasOwnProperty.call(options, "propertyOf"), "Use addressSpace#addVariable({ propertyOf: xxx}); to add a property");
161
+ assertUnusedChildBrowseName(addressSpace, options);
162
+ const baseVariableType = addressSpace.findVariableType("BaseVariableType");
163
+ (0, node_opcua_assert_1.assert)(baseVariableType, "BaseVariableType must be defined in the address space");
164
+ let dataType = options.dataType !== undefined ? options.dataType : this.dataType;
165
+ // may be required (i.e YArrayItemType )
166
+ dataType = this.resolveNodeId(dataType); // DataType (NodeId)
167
+ (0, node_opcua_assert_1.assert)(dataType instanceof node_opcua_nodeid_1.NodeId);
168
+ const valueRank = options.valueRank !== undefined ? options.valueRank : this.valueRank;
169
+ const { result, errorMessage } = (0, check_value_rank_compatibility_1.checkValueRankCompatibility)(valueRank, this.valueRank);
170
+ if (!result) {
171
+ errorLog(errorMessage);
172
+ throw new Error(errorMessage);
173
+ }
174
+ const arrayDimensions = options.arrayDimensions !== undefined ? options.arrayDimensions : this.arrayDimensions;
175
+ // istanbul ignore next
176
+ if (!dataType || dataType.isEmpty()) {
177
+ warningLog(" options.dataType", options.dataType ? options.dataType.toString() : "<null>");
178
+ warningLog(" this.dataType", this.dataType ? this.dataType.toString() : "<null>");
179
+ throw new Error(" A valid dataType must be specified");
180
+ }
181
+ const copyAlsoModellingRules = topMostParentIsObjectTypeOrVariableType(addressSpace, options);
182
+ const defaultDataType = this.dataType;
183
+ // BadAttributeIdInvalid
184
+ const defaultDataValue = this.readAttribute(null, node_opcua_data_model_1.AttributeIds.Value);
185
+ const defaultValue = (defaultDataType.namespace === 0 && defaultDataType.value == 0) || defaultDataValue.statusCode.isNotGood()
186
+ ? undefined
187
+ : defaultDataValue.value;
188
+ const opts = {
189
+ arrayDimensions,
190
+ browseName: options.browseName,
191
+ componentOf: options.componentOf,
192
+ dataType,
193
+ description: options.description || this.description,
194
+ displayName: options.displayName || "",
195
+ eventSourceOf: options.eventSourceOf,
196
+ minimumSamplingInterval: options.minimumSamplingInterval,
197
+ modellingRule: options.modellingRule,
198
+ nodeId: options.nodeId,
199
+ notifierOf: options.notifierOf,
200
+ organizedBy: options.organizedBy,
201
+ typeDefinition: this.nodeId,
202
+ value: options.value || defaultValue,
203
+ valueRank
204
+ };
205
+ const namespace = options.namespace || addressSpace.getOwnNamespace();
206
+ const instance = namespace.addVariable(opts);
207
+ // xx assert(instance.minimumSamplingInterval === options.minimumSamplingInterval);
208
+ initialize_properties_and_components(instance, baseVariableType, this, copyAlsoModellingRules, options.optionals);
209
+ // if VariableType is a type of Structure DataType
210
+ // we need to instantiate a dataValue
211
+ // and create a bidirectional binding with the individual properties of this type
212
+ instance.bindExtensionObject(options.extensionObject, { createMissingProp: false });
213
+ (0, node_opcua_assert_1.assert)(instance.typeDefinition.toString() === this.nodeId.toString());
214
+ instance.install_extra_properties();
215
+ if (this._postInstantiateFunc) {
216
+ this._postInstantiateFunc(instance, this);
217
+ }
218
+ return instance;
219
+ }
220
+ }
221
+ exports.UAVariableTypeImpl = UAVariableTypeImpl;
222
+ /**
223
+ * return true if node is a mandatory child or a requested optional
224
+ * @method MandatoryChildOrRequestedOptionalFilter
225
+ * @param instance
226
+ * @param optionalsMap
227
+ * @return {Boolean}
228
+ */
229
+ class MandatoryChildOrRequestedOptionalFilter {
230
+ constructor(instance, optionalsMap) {
231
+ // should we clone the node to be a component or propertyOf of a instance
232
+ (0, node_opcua_assert_1.assert)(optionalsMap !== null && typeof optionalsMap === "object");
233
+ (0, node_opcua_assert_1.assert)(null !== instance);
234
+ this.optionalsMap = optionalsMap;
235
+ this.instance = instance;
236
+ this.references = instance.allReferences();
237
+ }
238
+ shouldKeep(node) {
239
+ var _a;
240
+ const addressSpace = node.addressSpace;
241
+ const alreadyIn = this.references.filter((r) => {
242
+ const n = addressSpace.findNode(r.nodeId);
243
+ // istanbul ignore next
244
+ if (!n) {
245
+ warningLog(" cannot find node ", r.nodeId.toString());
246
+ return false;
247
+ }
248
+ return n.browseName.name.toString() === node.browseName.name.toString();
249
+ });
250
+ if (alreadyIn.length > 0) {
251
+ (0, node_opcua_assert_1.assert)(alreadyIn.length === 1, "Duplication found ?");
252
+ // a child with the same browse name has already been install
253
+ // probably from a SuperClass, we should ignore this.
254
+ return false; // ignore
255
+ }
256
+ const modellingRule = node.modellingRule;
257
+ switch (modellingRule) {
258
+ case null:
259
+ case undefined:
260
+ debugLog("node ", node.browseName.toString(), node.nodeId.toString(), " has no modellingRule ", (_a = node.parentNodeId) === null || _a === void 0 ? void 0 : _a.toString());
261
+ /**
262
+ * in some badly generated NodeSet2.xml file, the modellingRule is not specified
263
+ *
264
+ * but in some other NodeSet2.xml, this means that the data are only attached to the Type node and shall not be
265
+ * instantiate in the corresponding instance (example is the state variable of a finite state machine that are only
266
+ * defined in the Type node)
267
+ *
268
+ * we should not consider it as an error, and treat it as not present
269
+ */
270
+ return false;
271
+ case "Mandatory":
272
+ return true; // keep;
273
+ case "Optional":
274
+ // only if in requested optionals
275
+ return node.browseName.name in this.optionalsMap;
276
+ case "OptionalPlaceholder":
277
+ return false; // ignored
278
+ default:
279
+ return false; // ignored
280
+ }
281
+ }
282
+ filterFor(childInstance) {
283
+ const browseName = childInstance.browseName.name;
284
+ let map = {};
285
+ if (browseName in this.optionalsMap) {
286
+ map = this.optionalsMap[browseName];
287
+ }
288
+ const newFilter = new MandatoryChildOrRequestedOptionalFilter(childInstance, map);
289
+ return newFilter;
290
+ }
291
+ }
292
+ /*
293
+ * @function _get_parent_as_VariableOrObjectType
294
+ * @param originalObject
295
+ * @return {null|BaseNode}
296
+ * @private
297
+ */
298
+ function _get_parent_as_VariableOrObjectType(originalObject) {
299
+ if (originalObject.nodeClass === node_opcua_data_model_1.NodeClass.Method) {
300
+ return null;
301
+ }
302
+ const addressSpace = originalObject.addressSpace;
303
+ const parents = originalObject.findReferencesEx("HasChild", node_opcua_data_model_1.BrowseDirection.Inverse);
304
+ // istanbul ignore next
305
+ if (parents.length > 1) {
306
+ warningLog(" object ", originalObject.browseName.toString(), " has more than one parent !");
307
+ warningLog(originalObject.toString());
308
+ warningLog(" parents : ");
309
+ for (const parent of parents) {
310
+ warningLog(" ", parent.toString(), addressSpace.findNode(parent.nodeId).browseName.toString());
311
+ }
312
+ return null;
313
+ }
314
+ (0, node_opcua_assert_1.assert)(parents.length === 0 || parents.length === 1);
315
+ if (parents.length === 0) {
316
+ return null;
317
+ }
318
+ const theParent = addressSpace.findNode(parents[0].nodeId);
319
+ if (theParent && (theParent.nodeClass === node_opcua_data_model_1.NodeClass.VariableType || theParent.nodeClass === node_opcua_data_model_1.NodeClass.ObjectType)) {
320
+ return theParent;
321
+ }
322
+ return null;
323
+ }
324
+ class CloneHelper {
325
+ constructor() {
326
+ this.level = 0;
327
+ this.mapOrgToClone = new Map();
328
+ }
329
+ pad() {
330
+ return " ".padEnd(this.level * 2, " ");
331
+ }
332
+ registerClonedObject(objInType, clonedObj) {
333
+ this.mapOrgToClone.set(objInType.nodeId.toString(), {
334
+ cloned: clonedObj,
335
+ original: objInType
336
+ });
337
+ //
338
+ // /-----------------------------\
339
+ // | AcknowledgeableConditionType |
340
+ // \-----------------------------/
341
+ // ^ |
342
+ // | +---------------------|- (EnabledState) (shadow element)
343
+ // |
344
+ // /-----------------------------\
345
+ // | AlarmConditionType |
346
+ // \-----------------------------/
347
+ // |
348
+ // +-------------------------------|- EnabledState <
349
+ //
350
+ // find also child object with the same browse name that are
351
+ // overridden in the SuperType
352
+ //
353
+ const origParent = _get_parent_as_VariableOrObjectType(objInType);
354
+ if (origParent) {
355
+ let base = origParent.subtypeOfObj;
356
+ while (base) {
357
+ const shadowChild = base.getChildByName(objInType.browseName);
358
+ if (shadowChild) {
359
+ this.mapOrgToClone.set(shadowChild.nodeId.toString(), {
360
+ cloned: clonedObj,
361
+ original: shadowChild
362
+ });
363
+ }
364
+ base = base.subtypeOfObj;
365
+ }
366
+ }
367
+ // find subTypeOf
368
+ }
369
+ getCloned(original) {
370
+ const info = this.mapOrgToClone.get(original.nodeId.toString());
371
+ if (info) {
372
+ return info.cloned;
373
+ }
374
+ return null;
375
+ }
376
+ }
377
+ // install properties and components on a instantiated Object
378
+ //
379
+ // based on their ModelingRule
380
+ // => Mandatory => Installed
381
+ // => Optional => Not Installed , unless it appear in optionals array
382
+ // => OptionalPlaceHolder => Not Installed
383
+ // => null (no modelling rule ) => Not Installed
384
+ //
385
+ function _initialize_properties_and_components(instance, topMostType, typeDefinitionNode, copyAlsoModellingRules, optionalsMap, extraInfo, browseNameMap) {
386
+ if (doDebug) {
387
+ debugLog("instance browseName =", instance.browseName.toString());
388
+ debugLog("typeNode =", typeDefinitionNode.browseName.toString());
389
+ debugLog("optionalsMap =", Object.keys(optionalsMap).join(" "));
390
+ const c = typeDefinitionNode.findReferencesEx("Aggregates");
391
+ debugLog("typeDefinition aggregates =", c.map((x) => x.node.browseName.toString()).join(" "));
392
+ }
393
+ optionalsMap = optionalsMap || {};
394
+ if ((0, node_opcua_nodeid_1.sameNodeId)(topMostType.nodeId, typeDefinitionNode.nodeId)) {
395
+ return; // nothing to do
396
+ }
397
+ const filter = new MandatoryChildOrRequestedOptionalFilter(instance, optionalsMap);
398
+ doTrace &&
399
+ traceLog(chalk.cyan(extraInfo.pad(), "cloning relevant member of typeDefinition class"), typeDefinitionNode.browseName.toString());
400
+ (0, base_node_private_1._clone_hierarchical_references)(typeDefinitionNode, instance, copyAlsoModellingRules, filter, extraInfo, browseNameMap);
401
+ // now apply recursion on baseTypeDefinition to get properties and components from base class
402
+ const baseTypeDefinitionNodeId = typeDefinitionNode.subtypeOf;
403
+ const baseTypeDefinition = typeDefinitionNode.subtypeOfObj;
404
+ doTrace &&
405
+ traceLog(chalk.cyan(extraInfo.pad(), "now apply recursion on baseTypeDefinition to get properties and components from base class"), baseTypeDefinition.browseName.toString());
406
+ // istanbul ignore next
407
+ if (!baseTypeDefinition) {
408
+ throw new Error(chalk.red("Cannot find object with nodeId ") + baseTypeDefinitionNodeId);
409
+ }
410
+ extraInfo.level++;
411
+ _initialize_properties_and_components(instance, topMostType, baseTypeDefinition, copyAlsoModellingRules, optionalsMap, extraInfo, browseNameMap);
412
+ extraInfo.level--;
413
+ }
414
+ /**
415
+ * @method hasChildWithBrowseName
416
+ * returns true if the parent object has a child with the provided browseName
417
+ * @param parent
418
+ * @param childBrowseName
419
+ */
420
+ function hasChildWithBrowseName(parent, childBrowseName) {
421
+ if (!parent) {
422
+ throw Error("Internal error");
423
+ }
424
+ // extract children
425
+ const children = parent.findReferencesAsObject("HasChild", true);
426
+ return (children.filter((child) => {
427
+ var _a, _b;
428
+ return ((_a = child.browseName.name) === null || _a === void 0 ? void 0 : _a.toString()) === ((_b = childBrowseName.name) === null || _b === void 0 ? void 0 : _b.toString());
429
+ }).length > 0);
430
+ }
431
+ function getParent(addressSpace, options) {
432
+ const parent = options.componentOf || options.organizedBy;
433
+ if (parent instanceof node_opcua_nodeid_1.NodeId) {
434
+ return addressSpace.findNode(parent);
435
+ }
436
+ return parent;
437
+ }
438
+ function assertUnusedChildBrowseName(addressSpace, options) {
439
+ const resolveOptionalObject = (node) => node ? addressSpace._coerceNode(node) || undefined : undefined;
440
+ options.componentOf = resolveOptionalObject(options.componentOf);
441
+ options.organizedBy = resolveOptionalObject(options.organizedBy);
442
+ (0, node_opcua_assert_1.assert)(!(options.componentOf && options.organizedBy));
443
+ const parent = getParent(addressSpace, options);
444
+ if (!parent) {
445
+ return;
446
+ }
447
+ (0, node_opcua_assert_1.assert)(parent !== null && typeof parent === "object");
448
+ if (!(parent instanceof base_node_impl_1.BaseNodeImpl)) {
449
+ throw new Error("Invalid parent parent is " + parent.constructor.name);
450
+ }
451
+ // istanbul ignore next
452
+ // verify that no components already exists in parent
453
+ if (parent && hasChildWithBrowseName(parent, (0, node_opcua_data_model_1.coerceQualifiedName)(options.browseName))) {
454
+ throw new Error("object " +
455
+ parent.browseName.name.toString() +
456
+ " have already a child with browseName " +
457
+ options.browseName.toString());
458
+ }
459
+ }
460
+ exports.assertUnusedChildBrowseName = assertUnusedChildBrowseName;
461
+ exports.assertUnusedChildBrowseName = assertUnusedChildBrowseName;
462
+ exports.initialize_properties_and_components = initialize_properties_and_components;
463
+ const hasTypeDefinitionNodeId = (0, node_opcua_nodeid_1.makeNodeId)(node_opcua_constants_1.ReferenceTypeIds.HasTypeDefinition);
464
+ const hasModellingRuleNodeId = (0, node_opcua_nodeid_1.makeNodeId)(node_opcua_constants_1.ReferenceTypeIds.HasModellingRule);
465
+ /**
466
+ * remove unwanted reference such as HasTypeDefinition and HasModellingRule
467
+ * from the list
468
+ */
469
+ function _remove_unwanted_ref(references) {
470
+ // filter out HasTypeDefinition (i=40) , HasModellingRule (i=37);
471
+ references = references.filter((reference) => !(0, node_opcua_nodeid_1.sameNodeId)(reference.referenceType, hasTypeDefinitionNodeId) &&
472
+ !(0, node_opcua_nodeid_1.sameNodeId)(reference.referenceType, hasModellingRuleNodeId));
473
+ return references;
474
+ }
475
+ /**
476
+ *
477
+ */
478
+ function findNonHierarchicalReferences(originalObject) {
479
+ // todo: MEMOIZE this method
480
+ const addressSpace = originalObject.addressSpace;
481
+ const referenceId = addressSpace.findReferenceType("NonHierarchicalReferences");
482
+ if (!referenceId) {
483
+ return [];
484
+ }
485
+ (0, node_opcua_assert_1.assert)(referenceId);
486
+ // we need to explore the non hierarchical references backwards
487
+ let references = originalObject.findReferencesEx("NonHierarchicalReferences", node_opcua_data_model_1.BrowseDirection.Inverse);
488
+ references = [].concat(references, originalObject.findReferencesEx("HasEventSource", node_opcua_data_model_1.BrowseDirection.Inverse));
489
+ const parent = _get_parent_as_VariableOrObjectType(originalObject);
490
+ if (parent && parent.subtypeOfObj) {
491
+ // parent is a ObjectType or VariableType and is not a root type
492
+ (0, node_opcua_assert_1.assert)(parent.nodeClass === node_opcua_data_model_1.NodeClass.VariableType || parent.nodeClass === node_opcua_data_model_1.NodeClass.ObjectType);
493
+ // let investigate the same child base child
494
+ const child = parent.subtypeOfObj.getChildByName(originalObject.browseName);
495
+ if (child) {
496
+ const baseRef = findNonHierarchicalReferences(child);
497
+ references = [].concat(references, baseRef);
498
+ }
499
+ }
500
+ // perform some cleanup
501
+ references = _remove_unwanted_ref(references);
502
+ return references;
503
+ }
504
+ function reconstructNonHierarchicalReferences(extraInfo) {
505
+ const findImplementedObject = (ref) => extraInfo.mapOrgToClone.get(ref.nodeId.toString()) || null;
506
+ // navigate through original objects to find those that are being references by node that
507
+ // have been cloned .
508
+ // this could be node organized by some FunctionalGroup
509
+ //
510
+ for (const { original, cloned } of extraInfo.mapOrgToClone.values()) {
511
+ // find NonHierarchical References on original object
512
+ const originalNonHierarchical = findNonHierarchicalReferences(original);
513
+ if (originalNonHierarchical.length === 0) {
514
+ continue;
515
+ }
516
+ // istanbul ignore next
517
+ if (doDebug) {
518
+ debugLog(" investigation ", original.browseName.toString(), cloned.nodeClass.toString(), original.nodeClass.toString(), original.nodeId.toString(), cloned.nodeId.toString());
519
+ }
520
+ for (const ref of originalNonHierarchical) {
521
+ const info = findImplementedObject(ref);
522
+ // if the object pointed by this reference is also cloned ...
523
+ if (info) {
524
+ const originalDest = info.original;
525
+ const cloneDest = info.cloned;
526
+ // istanbul ignore next
527
+ if (doDebug) {
528
+ debugLog(chalk.cyan(" adding reference "), ref.referenceType, " from cloned ", cloned.nodeId.toString(), cloned.browseName.toString(), " to cloned ", cloneDest.nodeId.toString(), cloneDest.browseName.toString());
529
+ }
530
+ // restore reference
531
+ cloned.addReference({
532
+ isForward: false,
533
+ nodeId: cloneDest.nodeId,
534
+ referenceType: ref.referenceType
535
+ });
536
+ }
537
+ }
538
+ }
539
+ }
540
+ /**
541
+ * recreate functional group types according to type definition
542
+ *
543
+ * @method reconstructFunctionalGroupType
544
+ * @param baseType
545
+ */
546
+ /* @example:
547
+ *
548
+ * MyDeviceType
549
+ * |
550
+ * +----------|- ParameterSet(BaseObjectType)
551
+ * | |
552
+ * | +-----------------|- Parameter1
553
+ * | ^
554
+ * +----------|- Config(FunctionalGroupType) |
555
+ * | |
556
+ * +-------- Organizes---+
557
+ */
558
+ function reconstructFunctionalGroupType(extraInfo) {
559
+ // navigate through original objects to find those that are being organized by some FunctionalGroup
560
+ for (const { original, cloned } of extraInfo.mapOrgToClone.values()) {
561
+ const organizedByArray = original.findReferencesEx("Organizes", node_opcua_data_model_1.BrowseDirection.Inverse);
562
+ for (const ref of organizedByArray) {
563
+ const info = extraInfo.mapOrgToClone.get(ref.nodeId.toString());
564
+ if (!info)
565
+ continue;
566
+ const folder = info.original;
567
+ if (folder.nodeClass !== node_opcua_data_model_1.NodeClass.Object)
568
+ continue;
569
+ if (!folder.typeDefinitionObj)
570
+ continue;
571
+ (0, node_opcua_assert_1.assert)(folder.typeDefinitionObj.browseName.name.toString() === "FunctionalGroupType");
572
+ // now create the same reference with the instantiated function group
573
+ const destFolder = info.cloned;
574
+ (0, node_opcua_assert_1.assert)(ref.referenceType);
575
+ // may be we should check that the referenceType is a subtype of Organizes
576
+ const alreadyExist = destFolder.findReferences(ref.referenceType, !ref.isForward).find((r) => r.nodeId === cloned.nodeId);
577
+ if (alreadyExist) {
578
+ continue;
579
+ }
580
+ destFolder.addReference({
581
+ isForward: !ref.isForward,
582
+ nodeId: cloned.nodeId,
583
+ referenceType: ref.referenceType
584
+ });
585
+ }
586
+ }
587
+ }
588
+ function initialize_properties_and_components(instance, topMostType, nodeType, copyAlsoModellingRules, optionals) {
589
+ const extraInfo = new CloneHelper();
590
+ extraInfo.registerClonedObject(nodeType, instance);
591
+ const optionalsMap = (0, make_optionals_map_1.makeOptionalsMap)(optionals);
592
+ const browseNameMap = new Set();
593
+ _initialize_properties_and_components(instance, topMostType, nodeType, copyAlsoModellingRules, optionalsMap, extraInfo, browseNameMap);
594
+ reconstructFunctionalGroupType(extraInfo);
595
+ reconstructNonHierarchicalReferences(extraInfo);
596
+ }
597
+ exports.initialize_properties_and_components = initialize_properties_and_components;
582
598
  //# sourceMappingURL=ua_variable_type_impl.js.map