node-opcua-address-space 2.135.0 → 2.137.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 (264) hide show
  1. package/dist/source/helpers/adjust_browse_direction.js +1 -2
  2. package/dist/source/helpers/adjust_browse_direction.js.map +1 -1
  3. package/dist/source/helpers/argument_list.js +6 -7
  4. package/dist/source/helpers/argument_list.js.map +1 -1
  5. package/dist/source/helpers/call_helpers.js +1 -2
  6. package/dist/source/helpers/call_helpers.js.map +1 -1
  7. package/dist/source/helpers/coerce_enum_value.js +1 -2
  8. package/dist/source/helpers/coerce_enum_value.js.map +1 -1
  9. package/dist/source/helpers/dump_tools.js +5 -6
  10. package/dist/source/helpers/dump_tools.js.map +1 -1
  11. package/dist/source/helpers/ensure_secure_access.js +1 -2
  12. package/dist/source/helpers/ensure_secure_access.js.map +1 -1
  13. package/dist/source/helpers/make_optionals_map.d.ts +1 -3
  14. package/dist/source/helpers/make_optionals_map.js +7 -4
  15. package/dist/source/helpers/make_optionals_map.js.map +1 -1
  16. package/dist/source/helpers/multiform_func.js +2 -3
  17. package/dist/source/helpers/multiform_func.js.map +1 -1
  18. package/dist/source/helpers/resolve_opaque_on_address_space.js +1 -2
  19. package/dist/source/helpers/resolve_opaque_on_address_space.js.map +1 -1
  20. package/dist/source/index.d.ts +2 -0
  21. package/dist/source/index.js +2 -0
  22. package/dist/source/index.js.map +1 -1
  23. package/dist/source/interfaces/alarms_and_conditions/condition_snapshot.d.ts +0 -3
  24. package/dist/source/interfaces/alarms_and_conditions/ua_acknowledgeable_condition_ex.d.ts +0 -2
  25. package/dist/source/interfaces/alarms_and_conditions/ua_condition_ex.d.ts +0 -2
  26. package/dist/source/interfaces/alarms_and_conditions/ua_discrete_alarm_ex.js.map +1 -1
  27. package/dist/source/interfaces/state_machine/ua_exclusive_limit_state_machine_type_ex.d.ts +1 -1
  28. package/dist/source/interfaces/state_machine/ua_shelved_state_machine_ex.d.ts +1 -2
  29. package/dist/source/interfaces/state_machine/ua_state_machine_type.d.ts +1 -0
  30. package/dist/source/loader/decode_xml_extension_object.d.ts +1 -1
  31. package/dist/source/loader/decode_xml_extension_object.js +4 -5
  32. package/dist/source/loader/decode_xml_extension_object.js.map +1 -1
  33. package/dist/source/loader/ensure_datatype_extracted.js +32 -4
  34. package/dist/source/loader/ensure_datatype_extracted.js.map +1 -1
  35. package/dist/source/loader/generateAddressSpaceRaw.js +3 -4
  36. package/dist/source/loader/generateAddressSpaceRaw.js.map +1 -1
  37. package/dist/source/loader/load_nodeset2.js +145 -737
  38. package/dist/source/loader/load_nodeset2.js.map +1 -1
  39. package/dist/source/loader/make_semver_compatible.js +1 -2
  40. package/dist/source/loader/make_semver_compatible.js.map +1 -1
  41. package/dist/source/loader/make_xml_extension_object_parser.d.ts +1 -6
  42. package/dist/source/loader/make_xml_extension_object_parser.js +52 -73
  43. package/dist/source/loader/make_xml_extension_object_parser.js.map +1 -1
  44. package/dist/source/loader/namespace_post_step.d.ts +4 -6
  45. package/dist/source/loader/namespace_post_step.js +5 -5
  46. package/dist/source/loader/namespace_post_step.js.map +1 -1
  47. package/dist/source/loader/parsers/extension_object_parser.d.ts +51 -0
  48. package/dist/source/loader/parsers/extension_object_parser.js +269 -0
  49. package/dist/source/loader/parsers/extension_object_parser.js.map +1 -0
  50. package/dist/source/loader/parsers/localized_text_parser.d.ts +25 -0
  51. package/dist/source/loader/parsers/localized_text_parser.js +30 -0
  52. package/dist/source/loader/parsers/localized_text_parser.js.map +1 -0
  53. package/dist/source/loader/parsers/nodeid_parser.d.ts +11 -0
  54. package/dist/source/loader/parsers/nodeid_parser.js +20 -0
  55. package/dist/source/loader/parsers/nodeid_parser.js.map +1 -0
  56. package/dist/source/loader/parsers/qualified_name_parser.d.ts +26 -0
  57. package/dist/source/loader/parsers/qualified_name_parser.js +35 -0
  58. package/dist/source/loader/parsers/qualified_name_parser.js.map +1 -0
  59. package/dist/source/loader/parsers/variant_parser.d.ts +29 -0
  60. package/dist/source/loader/parsers/variant_parser.js +328 -0
  61. package/dist/source/loader/parsers/variant_parser.js.map +1 -0
  62. package/dist/source/loader/register_node_promoter.js +2 -3
  63. package/dist/source/loader/register_node_promoter.js.map +1 -1
  64. package/dist/source/pseudo_session.d.ts +0 -2
  65. package/dist/source/pseudo_session.js +3 -3
  66. package/dist/source/pseudo_session.js.map +1 -1
  67. package/dist/source/session_context.d.ts +1 -1
  68. package/dist/source/session_context.js +3 -3
  69. package/dist/source/session_context.js.map +1 -1
  70. package/dist/source/set_namespace_meta_data.js +1 -2
  71. package/dist/source/set_namespace_meta_data.js.map +1 -1
  72. package/dist/source/ua_addin.d.ts +11 -0
  73. package/dist/source/ua_addin.js +42 -0
  74. package/dist/source/ua_addin.js.map +1 -0
  75. package/dist/source/ua_interface.d.ts +2 -0
  76. package/dist/source/ua_interface.js +35 -0
  77. package/dist/source/ua_interface.js.map +1 -0
  78. package/dist/source/xml_writer.d.ts +3 -5
  79. package/dist/src/_instantiate_helpers.d.ts +1 -1
  80. package/dist/src/_instantiate_helpers.js +6 -7
  81. package/dist/src/_instantiate_helpers.js.map +1 -1
  82. package/dist/src/_mandatory_child_or_requested_optional_filter.d.ts +3 -1
  83. package/dist/src/_mandatory_child_or_requested_optional_filter.js +6 -5
  84. package/dist/src/_mandatory_child_or_requested_optional_filter.js.map +1 -1
  85. package/dist/src/address_space.d.ts +1 -5
  86. package/dist/src/address_space.js +1 -1
  87. package/dist/src/address_space.js.map +1 -1
  88. package/dist/src/address_space_change_event_tools.js +3 -4
  89. package/dist/src/address_space_change_event_tools.js.map +1 -1
  90. package/dist/src/alarms_and_conditions/condition.d.ts +4 -7
  91. package/dist/src/alarms_and_conditions/condition.js +1 -25
  92. package/dist/src/alarms_and_conditions/condition.js.map +1 -1
  93. package/dist/src/alarms_and_conditions/condition_snapshot_impl.d.ts +2 -20
  94. package/dist/src/alarms_and_conditions/condition_snapshot_impl.js +211 -234
  95. package/dist/src/alarms_and_conditions/condition_snapshot_impl.js.map +1 -1
  96. package/dist/src/alarms_and_conditions/deviation_alarm_helper.js +4 -5
  97. package/dist/src/alarms_and_conditions/deviation_alarm_helper.js.map +1 -1
  98. package/dist/src/alarms_and_conditions/ua_acknowledgeable_condition_impl.d.ts +0 -2
  99. package/dist/src/alarms_and_conditions/ua_acknowledgeable_condition_impl.js +1 -2
  100. package/dist/src/alarms_and_conditions/ua_acknowledgeable_condition_impl.js.map +1 -1
  101. package/dist/src/alarms_and_conditions/ua_base_event_impl.js.map +1 -1
  102. package/dist/src/alarms_and_conditions/ua_certificate_expiration_alarm_impl.d.ts +0 -2
  103. package/dist/src/alarms_and_conditions/ua_certificate_expiration_alarm_impl.js +3 -3
  104. package/dist/src/alarms_and_conditions/ua_certificate_expiration_alarm_impl.js.map +1 -1
  105. package/dist/src/alarms_and_conditions/ua_condition_impl.d.ts +0 -2
  106. package/dist/src/alarms_and_conditions/ua_condition_impl.js +10 -12
  107. package/dist/src/alarms_and_conditions/ua_condition_impl.js.map +1 -1
  108. package/dist/src/alarms_and_conditions/ua_exclusive_limit_alarm_impl.js.map +1 -1
  109. package/dist/src/alarms_and_conditions/ua_exclusive_rate_of_change_alarm_impl.js.map +1 -1
  110. package/dist/src/apply_condition_refresh.d.ts +1 -3
  111. package/dist/src/apply_condition_refresh.js +4 -5
  112. package/dist/src/apply_condition_refresh.js.map +1 -1
  113. package/dist/src/base_node_impl.d.ts +0 -1
  114. package/dist/src/base_node_impl.js +11 -11
  115. package/dist/src/base_node_impl.js.map +1 -1
  116. package/dist/src/base_node_private.d.ts +4 -7
  117. package/dist/src/base_node_private.js +23 -25
  118. package/dist/src/base_node_private.js.map +1 -1
  119. package/dist/src/check_value_rank_compatibility.js +1 -2
  120. package/dist/src/check_value_rank_compatibility.js.map +1 -1
  121. package/dist/src/data_access/add_dataItem_stuff.js +1 -2
  122. package/dist/src/data_access/add_dataItem_stuff.js.map +1 -1
  123. package/dist/src/data_access/adjust_datavalue_status_code.js +1 -2
  124. package/dist/src/data_access/adjust_datavalue_status_code.js.map +1 -1
  125. package/dist/src/data_access/ua_multistate_discrete_impl.js +3 -3
  126. package/dist/src/data_access/ua_multistate_discrete_impl.js.map +1 -1
  127. package/dist/src/data_access/ua_multistate_value_discrete_impl.js +5 -5
  128. package/dist/src/data_access/ua_multistate_value_discrete_impl.js.map +1 -1
  129. package/dist/src/data_access/ua_two_state_discrete_impl.js +3 -3
  130. package/dist/src/data_access/ua_two_state_discrete_impl.js.map +1 -1
  131. package/dist/src/extension_object_array_node.js +4 -5
  132. package/dist/src/extension_object_array_node.js.map +1 -1
  133. package/dist/src/get_basic_datatype.js +2 -3
  134. package/dist/src/get_basic_datatype.js.map +1 -1
  135. package/dist/src/historical_access/address_space_historical_data_node.js +5 -5
  136. package/dist/src/historical_access/address_space_historical_data_node.js.map +1 -1
  137. package/dist/src/index_current.d.ts +3 -1
  138. package/dist/src/index_current.js +3 -1
  139. package/dist/src/index_current.js.map +1 -1
  140. package/dist/src/namespace_impl.js +3 -3
  141. package/dist/src/namespace_impl.js.map +1 -1
  142. package/dist/src/namespace_private.js +1 -2
  143. package/dist/src/namespace_private.js.map +1 -1
  144. package/dist/src/nodeset_tools/adjust_namespace_array.js +1 -2
  145. package/dist/src/nodeset_tools/adjust_namespace_array.js.map +1 -1
  146. package/dist/src/nodeset_tools/construct_namespace_dependency.d.ts +2 -2
  147. package/dist/src/nodeset_tools/construct_namespace_dependency.js +12 -12
  148. package/dist/src/nodeset_tools/construct_namespace_dependency.js.map +1 -1
  149. package/dist/src/nodeset_tools/dump_to_bsd.js +5 -6
  150. package/dist/src/nodeset_tools/dump_to_bsd.js.map +1 -1
  151. package/dist/src/nodeset_tools/nodeset_to_xml.d.ts +1 -1
  152. package/dist/src/nodeset_tools/nodeset_to_xml.js +62 -46
  153. package/dist/src/nodeset_tools/nodeset_to_xml.js.map +1 -1
  154. package/dist/src/private_namespace.js +3 -4
  155. package/dist/src/private_namespace.js.map +1 -1
  156. package/dist/src/reference_impl.js +4 -4
  157. package/dist/src/reference_impl.js.map +1 -1
  158. package/dist/src/role_permissions.js +1 -2
  159. package/dist/src/role_permissions.js.map +1 -1
  160. package/dist/src/state_machine/finite_state_machine.js +6 -6
  161. package/dist/src/state_machine/finite_state_machine.js.map +1 -1
  162. package/dist/src/state_machine/ua_shelving_state_machine_ex.d.ts +0 -1
  163. package/dist/src/state_machine/ua_shelving_state_machine_ex.js +2 -2
  164. package/dist/src/state_machine/ua_shelving_state_machine_ex.js.map +1 -1
  165. package/dist/src/state_machine/ua_two_state_variable.js +4 -4
  166. package/dist/src/state_machine/ua_two_state_variable.js.map +1 -1
  167. package/dist/src/tool_isSubtypeOf.d.ts +1 -1
  168. package/dist/src/tool_isSubtypeOf.js +18 -16
  169. package/dist/src/tool_isSubtypeOf.js.map +1 -1
  170. package/dist/src/ua_addin.d.ts +11 -0
  171. package/dist/src/ua_addin.js +43 -0
  172. package/dist/src/ua_addin.js.map +1 -0
  173. package/dist/src/ua_data_type_impl.js +7 -6
  174. package/dist/src/ua_data_type_impl.js.map +1 -1
  175. package/dist/src/ua_object_type_impl.js +2 -1
  176. package/dist/src/ua_object_type_impl.js.map +1 -1
  177. package/dist/src/ua_reference_type_impl.d.ts +1 -1
  178. package/dist/src/ua_reference_type_impl.js +3 -3
  179. package/dist/src/ua_reference_type_impl.js.map +1 -1
  180. package/dist/src/ua_variable_impl.js +6 -3
  181. package/dist/src/ua_variable_impl.js.map +1 -1
  182. package/dist/src/ua_variable_impl_ext_obj.js +15 -15
  183. package/dist/src/ua_variable_impl_ext_obj.js.map +1 -1
  184. package/dist/src/ua_variable_type_impl.d.ts +2 -0
  185. package/dist/src/ua_variable_type_impl.js +8 -4
  186. package/dist/src/ua_variable_type_impl.js.map +1 -1
  187. package/dist/src/validate_data_type_correctness.js +1 -2
  188. package/dist/src/validate_data_type_correctness.js.map +1 -1
  189. package/dist/tsconfig_common.tsbuildinfo +1 -1
  190. package/distHelpers/add_event_generator_object.js +1 -2
  191. package/distHelpers/add_event_generator_object.js.map +1 -1
  192. package/distHelpers/alarms_and_conditions_demo.js +1 -2
  193. package/distHelpers/alarms_and_conditions_demo.js.map +1 -1
  194. package/distHelpers/assertHasMatchingReference.js +1 -2
  195. package/distHelpers/assertHasMatchingReference.js.map +1 -1
  196. package/distHelpers/boiler_system.js +2 -3
  197. package/distHelpers/boiler_system.js.map +1 -1
  198. package/distHelpers/create_minimalist_address_space_nodeset.js +1 -2
  199. package/distHelpers/create_minimalist_address_space_nodeset.js.map +1 -1
  200. package/distHelpers/date_utils.js +1 -2
  201. package/distHelpers/date_utils.js.map +1 -1
  202. package/distHelpers/get_address_space_fixture.js +1 -2
  203. package/distHelpers/get_address_space_fixture.js.map +1 -1
  204. package/distHelpers/get_mini_address_space.js +2 -2
  205. package/distHelpers/get_mini_address_space.js.map +1 -1
  206. package/distNodeJS/generate_address_space.js +2 -3
  207. package/distNodeJS/generate_address_space.js.map +1 -1
  208. package/package.json +24 -24
  209. package/source/helpers/make_optionals_map.ts +9 -6
  210. package/source/index.ts +3 -0
  211. package/source/interfaces/alarms_and_conditions/instantiate_exclusive_deviation_alarm_options.ts +3 -1
  212. package/source/interfaces/alarms_and_conditions/instantiate_exclusive_limit_alarm_options.ts +3 -1
  213. package/source/interfaces/alarms_and_conditions/instantiate_non_exclusive_deviation_alarm_options.ts +3 -1
  214. package/source/interfaces/alarms_and_conditions/instantiate_non_exclusive_limit_alarm_options.ts +3 -1
  215. package/source/interfaces/alarms_and_conditions/ua_discrete_alarm_ex.ts +3 -1
  216. package/source/interfaces/alarms_and_conditions/ua_exclusive_deviation_alarm_ex.ts +18 -16
  217. package/source/interfaces/alarms_and_conditions/ua_exclusive_limit_alarm_ex.ts +5 -3
  218. package/source/interfaces/data_access/ua_multistate_discrete_ex.ts +4 -2
  219. package/source/interfaces/state_machine/ua_exclusive_limit_state_machine_type_ex.ts +4 -2
  220. package/source/interfaces/state_machine/ua_program_state_machine_type.ts +3 -1
  221. package/source/interfaces/state_machine/ua_shelved_state_machine_ex.ts +1 -1
  222. package/source/interfaces/state_machine/ua_state_machine_type.ts +14 -7
  223. package/source/loader/decode_xml_extension_object.ts +4 -3
  224. package/source/loader/ensure_datatype_extracted.ts +38 -2
  225. package/source/loader/generateAddressSpaceRaw.ts +4 -4
  226. package/source/loader/load_nodeset2.ts +212 -901
  227. package/source/loader/make_xml_extension_object_parser.ts +87 -123
  228. package/source/loader/namespace_post_step.ts +6 -5
  229. package/source/loader/parsers/extension_object_parser.ts +364 -0
  230. package/source/loader/parsers/localized_text_parser.ts +34 -0
  231. package/source/loader/parsers/nodeid_parser.ts +17 -0
  232. package/source/loader/parsers/qualified_name_parser.ts +43 -0
  233. package/source/loader/parsers/variant_parser.ts +427 -0
  234. package/source/loader/register_node_promoter.ts +2 -5
  235. package/source/session_context.ts +1 -1
  236. package/source/ua_addin.ts +52 -0
  237. package/source/ua_interface.ts +38 -0
  238. package/source/xml_writer.ts +4 -5
  239. package/src/_instantiate_helpers.ts +8 -2
  240. package/src/_mandatory_child_or_requested_optional_filter.ts +9 -7
  241. package/src/address_space.ts +1 -1
  242. package/src/alarms_and_conditions/condition.ts +0 -32
  243. package/src/alarms_and_conditions/condition_snapshot_impl.ts +176 -189
  244. package/src/alarms_and_conditions/ua_acknowledgeable_condition_impl.ts +1 -3
  245. package/src/alarms_and_conditions/ua_base_event_impl.ts +6 -2
  246. package/src/alarms_and_conditions/ua_condition_impl.ts +11 -13
  247. package/src/alarms_and_conditions/ua_exclusive_limit_alarm_impl.ts +3 -1
  248. package/src/alarms_and_conditions/ua_exclusive_rate_of_change_alarm_impl.ts +3 -1
  249. package/src/apply_condition_refresh.ts +4 -4
  250. package/src/base_node_impl.ts +13 -13
  251. package/src/base_node_private.ts +6 -11
  252. package/src/data_access/ua_multistate_value_discrete_impl.ts +1 -1
  253. package/src/historical_access/address_space_historical_data_node.ts +3 -3
  254. package/src/index_current.ts +4 -1
  255. package/src/nodeset_tools/construct_namespace_dependency.ts +9 -8
  256. package/src/nodeset_tools/dump_to_bsd.ts +7 -7
  257. package/src/nodeset_tools/nodeset_to_xml.ts +78 -43
  258. package/src/tool_isSubtypeOf.ts +20 -16
  259. package/src/ua_data_type_impl.ts +5 -4
  260. package/src/ua_object_type_impl.ts +4 -1
  261. package/src/ua_reference_type_impl.ts +6 -6
  262. package/src/ua_variable_impl.ts +4 -0
  263. package/src/ua_variable_impl_ext_obj.ts +2 -1
  264. package/src/ua_variable_type_impl.ts +11 -1
@@ -0,0 +1,427 @@
1
+ import { coerceBoolean, coerceInt64, coerceUInt64, DataType, Int64, isValidGuid, UInt64 } from "node-opcua-basic-types";
2
+ import { IAddressSpace, UAVariable, UAVariableType } from "node-opcua-address-space-base";
3
+ import { coerceLocalizedText, coerceQualifiedName, LocalizedTextOptions, NodeClass, QualifiedNameOptions } from "node-opcua-data-model";
4
+ import { ExtensionObject } from "node-opcua-extension-object";
5
+ import { resolveNodeId, NodeIdLike, NodeId } from "node-opcua-nodeid";
6
+ import { VariantArrayType, VariantOptions } from "node-opcua-variant";
7
+ import { assert } from "node-opcua-assert";
8
+ import { ParserLike, ReaderStateParserLike, XmlAttributes } from "node-opcua-xml2json";
9
+ import { make_debugLog } from "node-opcua-debug";
10
+
11
+ import { localizedText_parser } from "./localized_text_parser";
12
+ import { makeQualifiedNameParser } from "./qualified_name_parser";
13
+ import {
14
+ createXMLExtensionObjectDecodingTask,
15
+ makeExtensionObjectInnerParser,
16
+ makeExtensionObjectParser,
17
+ } from "./extension_object_parser";
18
+ import { makeNodeIdParser } from "./nodeid_parser";
19
+
20
+ const debugLog = make_debugLog(__dirname);
21
+
22
+ export type Task = (addressSpace2: IAddressSpace) => Promise<void>;
23
+
24
+ type IBasicReaderStateParserLike<T> = ReaderStateParserLike & {
25
+ value: T | undefined;
26
+ text: string;
27
+ };
28
+ function BasicType_parser<T>(dataType: string, parseFunc: (this: { value: T | undefined }, text: string) => any): ParserLike {
29
+ const _parser: Record<string, ReaderStateParserLike> = {};
30
+ const a = {
31
+ init(this: IBasicReaderStateParserLike<T>, name: string, attrs: XmlAttributes, parent: any, endElement: any) {
32
+ this.value = undefined;
33
+ },
34
+ finish(this: IBasicReaderStateParserLike<T>) {
35
+ this.value = parseFunc.call(this, this.text);
36
+ }
37
+ }
38
+ _parser[dataType] = a as ReaderStateParserLike;
39
+ return _parser as ParserLike;
40
+ }
41
+
42
+
43
+
44
+
45
+ function ListOf<T>(_setValue: (data: VariantOptions) => void, dataType: string, parseFunc: any) {
46
+ return {
47
+ init(this: ListOfTParser<T>) {
48
+ this.listData = [];
49
+ },
50
+
51
+ parser: BasicType_parser<T>(dataType, parseFunc),
52
+
53
+ finish(this: ListOfTParser<T>) {
54
+ _setValue({
55
+ arrayType: VariantArrayType.Array,
56
+ dataType: (DataType as any)[dataType],
57
+ value: this.listData
58
+ });
59
+ },
60
+ endElement(this: ListOfTParser<T>, element: string) {
61
+ this.listData.push(this.parser[dataType].value);
62
+ }
63
+ };
64
+ }
65
+
66
+
67
+ interface Parser {
68
+ parent: Parser | any;
69
+ }
70
+
71
+
72
+
73
+ function installExtensionObjectListInitializationPostTask(
74
+ postTasks2_AssignedExtensionObjectToDataValue: Task[],
75
+ element: ListOfExtensionObjectParser) {
76
+
77
+
78
+
79
+ let listExtensionObject = element.listExtensionObject;
80
+ let nodeId = element.parent.parent.obj.nodeId;
81
+ assert(nodeId, "expecting a nodeid");
82
+ const task = async (addressSpace2: IAddressSpace) => {
83
+ const node = addressSpace2.findNode(nodeId)!;
84
+ if (!node) {
85
+ debugLog("Cannot find node with nodeId " + nodeId + ". may be the node was marked as deprecated");
86
+ } else if (node.nodeClass === NodeClass.Variable) {
87
+ const v = node as UAVariable;
88
+ assert(v.getBasicDataType() === DataType.ExtensionObject, "expecting an extension object");
89
+ v.bindExtensionObject(listExtensionObject as ExtensionObject[], { createMissingProp: false });
90
+ } else if (node.nodeClass === NodeClass.VariableType) {
91
+ // no need to bind a variable type
92
+ const v = node as UAVariableType;
93
+ (v as any) /*fix me*/.value.value = listExtensionObject;
94
+ }
95
+ listExtensionObject.slice(0);
96
+ (listExtensionObject as any) = undefined;
97
+ (nodeId as any) = undefined;
98
+ };
99
+ postTasks2_AssignedExtensionObjectToDataValue.push(task);
100
+ }
101
+
102
+
103
+
104
+
105
+ export interface ListOfTParser<T> extends Parser {
106
+ listData: T[];
107
+ parent: Parser;
108
+ parser: {
109
+ [key: string]: Parser | any;
110
+ };
111
+ }
112
+ function parser2<T>(_setValue: (data: VariantOptions) => void, type: string, p: (a: any) => any): any {
113
+ return {
114
+ finish(this: T & { text: string }) {
115
+ _setValue({
116
+ arrayType: VariantArrayType.Scalar,
117
+ dataType: (DataType as any)[type],
118
+ value: p(this.text)
119
+ });
120
+ }
121
+ };
122
+ }
123
+ const parseUInt64 = (str: string): UInt64 => coerceUInt64(str);
124
+ const parseInt64 = (str: string): Int64 => coerceInt64(str);
125
+
126
+
127
+
128
+
129
+ export interface ListOfExtensionObjectParser extends ListOfTParser<ExtensionObject> {
130
+ isDeferred: boolean;
131
+ listExtensionObject: (ExtensionObject | null)[];
132
+ listExtensionObjectXML: { xmlEncodingNodeId: NodeId; bodyXML: string }[];
133
+ parser: {
134
+ ExtensionObject: ParserLike;
135
+ };
136
+ }
137
+
138
+
139
+
140
+ export function makeVariantReader<T extends ReaderStateParserLike>(
141
+ setValue: (self: T, data: VariantOptions) => void,
142
+ setDeferredValue: (self: T, data: VariantOptions, deferedTask: () => ExtensionObject | ExtensionObject[] | null) => void,
143
+ postExtensionObjectDecoding: (task: (addressSpace: IAddressSpace) => Promise<void>) => void,
144
+ translateNodeId: (nodeId: string) => NodeId,
145
+ ): ReaderStateParserLike {
146
+
147
+ let self: T;
148
+ const setValue2 = (data: VariantOptions) => {
149
+ setValue(self, data);
150
+ }
151
+ const reader = {
152
+ init(this: ReaderStateParserLike) {
153
+ /* empty */
154
+ self = this as T;
155
+ },
156
+ parser: {
157
+ QualifiedName: {
158
+ ...makeQualifiedNameParser(translateNodeId).QualifiedName,
159
+ finish(this: any) {
160
+ setValue2({
161
+ dataType: DataType.QualifiedName,
162
+ value: coerceQualifiedName({...this.qualifiedName})
163
+ });
164
+ }
165
+ },
166
+ LocalizedText: {
167
+ ...localizedText_parser.LocalizedText,
168
+ finish(this: any) {
169
+ setValue2({
170
+ dataType: DataType.LocalizedText,
171
+ value: coerceLocalizedText({...this.localizedText})
172
+ });
173
+ }
174
+ },
175
+ XmlElement: {
176
+ finish(this: any) {
177
+ setValue2({
178
+ dataType: DataType.XmlElement,
179
+ value: this.text
180
+ });
181
+ }
182
+ },
183
+ String: {
184
+ finish(this: any) {
185
+ setValue2({
186
+ dataType: DataType.String,
187
+ value: this.text
188
+ });
189
+ }
190
+ },
191
+ Guid: {
192
+ parser: {
193
+ String: {
194
+ finish(this: any) {
195
+ const guid = this.text;
196
+ if (!isValidGuid(guid)) {
197
+ /* ?*/
198
+ }
199
+ setValue2({
200
+ dataType: DataType.Guid,
201
+ arrayType: VariantArrayType.Scalar,
202
+ value: this.text
203
+ });
204
+ }
205
+ }
206
+ }
207
+ },
208
+ NodeId: {
209
+ parser: {
210
+ Identifier: {
211
+ finish(this: any) {
212
+ const nodeId = this.text;
213
+ setValue2({
214
+ dataType: DataType.NodeId,
215
+ arrayType: VariantArrayType.Scalar,
216
+ value: translateNodeId(resolveNodeId(nodeId).toString())
217
+ });
218
+ }
219
+ }
220
+ }
221
+ },
222
+ Boolean: parser2(setValue2, "Boolean", coerceBoolean),
223
+ Byte: parser2(setValue2, "Byte", parseInt),
224
+ Int16: parser2(setValue2, "Int16", parseInt),
225
+ Int32: parser2(setValue2, "Int32", parseInt),
226
+ Int8: parser2(setValue2, "Int8", parseInt),
227
+ SByte: parser2(setValue2, "SByte", parseInt),
228
+ UInt16: parser2(setValue2, "UInt16", parseInt),
229
+ UInt32: parser2(setValue2, "UInt32", parseInt),
230
+ UInt8: parser2(setValue2, "UInt8", parseInt),
231
+
232
+ UInt64: parser2(setValue2, "UInt64", parseUInt64),
233
+ Int64: parser2(setValue2, "Int64", parseInt64),
234
+
235
+ ByteString: {
236
+ init(this: any) {
237
+ this.value = null;
238
+ },
239
+ finish(this: any) {
240
+ const base64text = this.text;
241
+ const byteString = Buffer.from(base64text, "base64");
242
+ setValue2({
243
+ arrayType: VariantArrayType.Scalar,
244
+ dataType: DataType.ByteString,
245
+ value: byteString
246
+ });
247
+ }
248
+ },
249
+ Float: {
250
+ finish(this: any) {
251
+ setValue2({
252
+ dataType: DataType.Float,
253
+ value: parseFloat(this.text)
254
+ });
255
+ }
256
+ },
257
+
258
+ Double: {
259
+ finish(this: any) {
260
+ setValue2({
261
+ dataType: DataType.Double,
262
+ value: parseFloat(this.text)
263
+ });
264
+ }
265
+ },
266
+
267
+ ExtensionObject: makeExtensionObjectInnerParser<ListOfExtensionObjectParser>(
268
+ translateNodeId,
269
+ (extensionObject: ExtensionObject) => {
270
+ setValue2({
271
+ dataType: DataType.ExtensionObject,
272
+ value: extensionObject
273
+ });
274
+ },
275
+ (xmlEncodingNodeId: NodeId, bodyXML: string, data) => {
276
+
277
+ let _capturedExtensionObject: ExtensionObject | ExtensionObject[] | null = null;
278
+ // extension object creation will be postponed
279
+ const task0 = createXMLExtensionObjectDecodingTask(
280
+ translateNodeId,
281
+ xmlEncodingNodeId,
282
+ bodyXML,
283
+ (extensionObject: ExtensionObject) => {
284
+ _capturedExtensionObject = extensionObject;
285
+ });
286
+ postExtensionObjectDecoding(task0);
287
+ setDeferredValue(self, {
288
+ dataType: DataType.ExtensionObject,
289
+ arrayType: VariantArrayType.Scalar,
290
+ value: null
291
+ }, () => _capturedExtensionObject);
292
+ }
293
+ ),
294
+
295
+ ListOfExtensionObject: {
296
+ init(this: ListOfExtensionObjectParser) {
297
+ this.listExtensionObject = [];
298
+ this.listExtensionObjectXML = [];
299
+ this.isDeferred = false;
300
+ },
301
+ parser: makeExtensionObjectParser<ListOfExtensionObjectParser>(
302
+ translateNodeId,
303
+ (extensionOject: ExtensionObject, self) => {
304
+ // const self = reader.parser!.ListOfExtensionObject as ListOfExtensionObjectParser;
305
+ self.listExtensionObject.push(extensionOject);
306
+ },
307
+ (xmlEncodingNodeId: NodeId, bodyXML: string, self) => {
308
+ // constœ self = reader.parser!.ListOfExtensionObject as ListOfExtensionObjectParser;
309
+ self.isDeferred = true;
310
+ self.listExtensionObjectXML.push({ xmlEncodingNodeId, bodyXML });
311
+ // extension object creation will be postponed
312
+ self.listExtensionObject.push(null);
313
+ const index = self.listExtensionObject.length - 1;
314
+ assert(index >= 0);
315
+ let listExtensionObject = self.listExtensionObject;
316
+ const task0 = createXMLExtensionObjectDecodingTask(
317
+ translateNodeId,
318
+ xmlEncodingNodeId,
319
+ bodyXML,
320
+ (extensionObject: ExtensionObject) => {
321
+ listExtensionObject[index] = extensionObject;
322
+ });
323
+ postExtensionObjectDecoding(task0);
324
+ }
325
+ ),
326
+ finish(this: ListOfExtensionObjectParser) {
327
+ if (!this.isDeferred) {
328
+ setValue2({
329
+ arrayType: VariantArrayType.Array,
330
+ dataType: DataType.ExtensionObject,
331
+ value: this.listExtensionObject
332
+ });
333
+ } else {
334
+ // postpone the creation of the extension object
335
+ const listExtensionObject: ExtensionObject[] = this.listExtensionObject as any;
336
+ setDeferredValue(self,
337
+ {
338
+ arrayType: VariantArrayType.Array,
339
+ dataType: DataType.ExtensionObject,
340
+ value: null
341
+ },
342
+ () => listExtensionObject,
343
+ );
344
+ this.listExtensionObject = [];
345
+ }
346
+ },
347
+ },
348
+
349
+ ListOfLocalizedText: {
350
+ init(this: ListOfTParser<LocalizedTextOptions>) {
351
+ this.listData = [];
352
+ },
353
+ parser: {
354
+ ...localizedText_parser
355
+ },
356
+ endElement(this: ListOfTParser<QualifiedNameOptions> /*element*/) {
357
+ this.listData.push(this.parser.LocalizedText.value);
358
+ },
359
+ finish(this: ListOfTParser<QualifiedNameOptions>) {
360
+ setValue2({
361
+ arrayType: VariantArrayType.Array,
362
+ dataType: DataType.LocalizedText,
363
+ value: this.listData
364
+ });
365
+ }
366
+ },
367
+ ListOfQualifiedName: {
368
+ init(this: ListOfTParser<QualifiedNameOptions>) {
369
+ this.listData = [];
370
+ },
371
+ parser: makeQualifiedNameParser(translateNodeId),
372
+ endElement(this: ListOfTParser<QualifiedNameOptions> /*element*/) {
373
+ this.listData.push(this.parser.QualifiedName.value);
374
+ },
375
+ finish(this: ListOfTParser<QualifiedNameOptions>) {
376
+ setValue2({
377
+ arrayType: VariantArrayType.Array,
378
+ dataType: DataType.QualifiedName,
379
+ value: this.listData
380
+ });
381
+ }
382
+ },
383
+ ListOfNodeId: {
384
+ init(this: ListOfTParser<NodeIdLike>) {
385
+ this.listData = [];
386
+ },
387
+ parser: makeNodeIdParser(translateNodeId),
388
+ endElement(this: ListOfTParser<NodeIdLike>, elementName: string) {
389
+ this.listData.push(this.parser.NodeId.nodeId);
390
+ },
391
+ finish(this: ListOfTParser<NodeIdLike>) {
392
+ setValue2({
393
+ arrayType: VariantArrayType.Array,
394
+ dataType: DataType.NodeId,
395
+ value: this.listData
396
+ });
397
+ }
398
+ },
399
+
400
+ ListOfBoolean: ListOf<boolean>(setValue2, "Boolean", coerceBoolean),
401
+
402
+ ListOfByte: ListOf<number>(setValue2, "Byte", parseInt),
403
+
404
+ ListOfDouble: ListOf<number>(setValue2, "Double", parseFloat),
405
+
406
+ ListOfFloat: ListOf<number>(setValue2, "Float", parseFloat),
407
+
408
+ ListOfInt32: ListOf<number>(setValue2, "Int32", parseInt),
409
+
410
+ ListOfInt16: ListOf<number>(setValue2, "Int16", parseInt),
411
+
412
+ ListOfInt8: ListOf<number>(setValue2, "Int8", parseInt),
413
+
414
+ ListOfUInt32: ListOf<number>(setValue2, "UInt32", parseInt),
415
+
416
+ ListOfUInt16: ListOf<number>(setValue2, "UInt16", parseInt),
417
+
418
+ ListOfUInt8: ListOf<number>(setValue2, "UInt8", parseInt),
419
+
420
+ ListOfString: ListOf<string>(setValue2, "String", (value: string) => value),
421
+
422
+ ListOfXmlElement: ListOf<string>(setValue2, "XmlElement", (value: string) => value),
423
+
424
+ }
425
+ };
426
+ return reader as any as ReaderStateParserLike;
427
+ }
@@ -1,9 +1,6 @@
1
- import { NodeIdLike, resolveNodeId } from "node-opcua-nodeid";
2
- import { UAObject, UAVariable } from "node-opcua-address-space-base";
3
-
1
+ import { resolveNodeId } from "node-opcua-nodeid";
4
2
  import { g_promotableObject, Promoter } from "./namespace_post_step";
5
3
 
6
4
  export function registerNodePromoter(standardNodeId: number, promoter: Promoter, onInstanceOnly = false): void {
7
-
8
- g_promotableObject[resolveNodeId(standardNodeId).toString()] = { promoter, onInstanceOnly };
5
+ g_promotableObject.set(resolveNodeId(standardNodeId).toString(),{ promoter, onInstanceOnly });
9
6
  }
@@ -193,7 +193,7 @@ export class SessionContext implements ISessionContext {
193
193
 
194
194
  public object: any;
195
195
  public currentTime?: PreciseClock;
196
- public continuationPoints: any = {};
196
+ public continuationPoints: Buffer[] = [];
197
197
  public userIdentity?: string;
198
198
  public readonly session?: ISessionBase;
199
199
  public readonly server?: IServerBase;
@@ -0,0 +1,52 @@
1
+ import { ModellingRuleType, UAObject, UAObjectType, UAVariableT } from "node-opcua-address-space-base";
2
+ import { DataType } from "node-opcua-basic-types";
3
+ import { coerceQualifiedName, QualifiedName, QualifiedNameLike } from "node-opcua-data-model";
4
+
5
+ export interface InstantiateAddInOptions {
6
+ defaultName?: QualifiedNameLike;
7
+ modellingRule?: ModellingRuleType;
8
+ addInOf: UAObject | UAObjectType;
9
+ copyAlsoModellingRules?: boolean;
10
+ }
11
+
12
+ export function instantiateAddIn(objectType: UAObjectType, options: InstantiateAddInOptions): UAObject {
13
+
14
+ let defaultName = options.defaultName;
15
+ // check that objectType has he shape of an addInd
16
+ const defaultInstanceBrowseName = objectType.getPropertyByName("DefaultInstanceBrowseName");
17
+ if (!defaultInstanceBrowseName) {
18
+ throw new Error("objectType must have a DefaultInstanceBrowseName property");
19
+ }
20
+
21
+ const browseName = coerceQualifiedName(defaultName || defaultInstanceBrowseName.readValue().value.value as QualifiedName);
22
+ const addIn = objectType.instantiate({
23
+ namespace: objectType.namespace,
24
+ browseName: browseName,
25
+ modellingRule: options.modellingRule,
26
+ copyAlsoModellingRules: options.copyAlsoModellingRules,
27
+ });
28
+ options.addInOf.addReference({
29
+ referenceType: "HasAddIn",
30
+ nodeId: addIn.nodeId
31
+ })
32
+ return addIn;
33
+ }
34
+
35
+ export function addDefaultInstanceBrowseName(objectType: UAObjectType, defaultBrowseName: string)
36
+ : UAVariableT<QualifiedName, DataType.QualifiedName> {
37
+
38
+ const namespace1 = objectType.namespace;
39
+ const uaVaraible = namespace1.addVariable({
40
+ browseName: coerceQualifiedName({ name: "DefaultInstanceBrowseName", namespaceIndex: 0 }),
41
+ propertyOf: objectType,
42
+ typeDefinition: "PropertyType",
43
+ dataType: DataType.QualifiedName,
44
+ value: {
45
+ dataType: DataType.QualifiedName,
46
+ value: { namespaceIndex: namespace1.index, name: defaultBrowseName }
47
+ },
48
+ modellingRule: null
49
+ });
50
+ return uaVaraible as UAVariableT<QualifiedName, DataType.QualifiedName>;
51
+
52
+ }
@@ -0,0 +1,38 @@
1
+
2
+
3
+ import { UAObject, UAObjectType, UAVariable, UAVariableType } from "node-opcua-address-space-base";
4
+ import { BrowseDirection } from "node-opcua-data-model";
5
+
6
+ export function implementInterface(uaNode: UAObject | UAObjectType | UAVariable | UAVariableType, interfaceType: UAObjectType) {
7
+
8
+ const addressSpace = uaNode.addressSpace;
9
+ const tmp = interfaceType.instantiate({
10
+ browseName: "_tmp_",
11
+ copyAlsoModellingRules: true,
12
+ copyAlsoAllOptionals: true,
13
+ modellingRule: "Mandatory"
14
+ });
15
+ //
16
+ uaNode.addReference({
17
+ nodeId: interfaceType,
18
+ referenceType: "HasInterface"
19
+ });
20
+ const childrenRef = tmp.findReferencesEx("HasChild", BrowseDirection.Forward);
21
+ // transfer children to uaNode
22
+ for (const childRef of childrenRef) {
23
+
24
+ tmp.removeReference({
25
+ nodeId: childRef.nodeId,
26
+ referenceType: childRef.referenceType,
27
+ isForward: childRef.isForward
28
+ });
29
+ uaNode.addReference({
30
+ nodeId: childRef.nodeId,
31
+ referenceType: childRef.referenceType,
32
+ isForward: childRef.isForward
33
+ });
34
+ }
35
+ addressSpace.deleteNode(tmp);
36
+ console.log(uaNode.toString());
37
+
38
+ }
@@ -1,10 +1,9 @@
1
- export interface ITranslationTable {
2
- [key: number]: number;
3
- }
1
+ export type TranslationTable = Map<number, number>;
2
+
4
3
  export interface XmlWriter {
5
- translationTable: ITranslationTable;
4
+ translationTable: TranslationTable;
6
5
  priorityTable: number[];
7
- visitedNode: any;
6
+ visitedNode: Set<any>;
8
7
 
9
8
  startDocument(options: { encoding: string; version: string }): void;
10
9
  startElement(elementName: string): this;
@@ -47,6 +47,7 @@ function _initialize_properties_and_components<B extends UAObject | UAVariable |
47
47
  topMostType: T,
48
48
  typeDefinitionNode: T,
49
49
  copyAlsoModellingRules: boolean,
50
+ copyAlsoAllOptionals: boolean,
50
51
  optionalsMap: OptionalMap,
51
52
  extraInfo: CloneHelper,
52
53
  browseNameMap: Set<string>
@@ -65,7 +66,7 @@ function _initialize_properties_and_components<B extends UAObject | UAVariable |
65
66
  return; // nothing to do
66
67
  }
67
68
 
68
- const filter = new MandatoryChildOrRequestedOptionalFilter(instance, optionalsMap);
69
+ const filter = new MandatoryChildOrRequestedOptionalFilter(instance, copyAlsoAllOptionals, optionalsMap);
69
70
 
70
71
  doTrace &&
71
72
  traceLog(
@@ -99,6 +100,7 @@ function _initialize_properties_and_components<B extends UAObject | UAVariable |
99
100
  topMostType,
100
101
  baseTypeDefinition,
101
102
  copyAlsoModellingRules,
103
+ copyAlsoAllOptionals,
102
104
  optionalsMap,
103
105
  extraInfo,
104
106
  browseNameMap
@@ -109,7 +111,10 @@ function _initialize_properties_and_components<B extends UAObject | UAVariable |
109
111
  export function initialize_properties_and_components<
110
112
  B extends UAObject | UAVariable | UAMethod,
111
113
  T extends UAVariableType | UAObjectType
112
- >(instance: B, topMostType: T, nodeType: T, copyAlsoModellingRules: boolean, optionals?: string[]): void {
114
+ >(instance: B, topMostType: T, nodeType: T,
115
+ copyAlsoModellingRules: boolean,
116
+ copyAlsoAllOptionals: boolean,
117
+ optionals?: string[]): void {
113
118
  const extraInfo = new CloneHelper();
114
119
 
115
120
  extraInfo.pushContext({
@@ -130,6 +135,7 @@ export function initialize_properties_and_components<
130
135
  topMostType,
131
136
  nodeType,
132
137
  copyAlsoModellingRules,
138
+ copyAlsoAllOptionals,
133
139
  optionalsMap,
134
140
  extraInfo,
135
141
  browseNameMap
@@ -12,14 +12,16 @@ const errorLog = make_errorLog(__filename);
12
12
  const doTrace = checkDebugFlag("INSTANTIATE");
13
13
  const traceLog = errorLog;
14
14
 
15
+ export type OptionalMap = Record<string, string | Record<string, any>>;
15
16
  export class MandatoryChildOrRequestedOptionalFilter implements CloneFilter {
16
17
  private readonly instance: BaseNode;
17
- private readonly optionalsMap: any;
18
+ private readonly optionalsMap: OptionalMap;
18
19
  private readonly references: UAReference[];
20
+ private readonly copyAlsoAllOptionals: boolean = false;
19
21
 
20
- constructor(instance: BaseNode, optionalsMap: any) {
22
+ constructor(instance: BaseNode, copyAlsoAllOptionals: boolean, optionalsMap: OptionalMap) {
23
+ this.copyAlsoAllOptionals = copyAlsoAllOptionals;
21
24
  // should we clone the node to be a component or propertyOf of a instance
22
- assert(optionalsMap !== null && typeof optionalsMap === "object");
23
25
  assert(null !== instance);
24
26
  this.optionalsMap = optionalsMap;
25
27
  this.instance = instance;
@@ -74,7 +76,7 @@ export class MandatoryChildOrRequestedOptionalFilter implements CloneFilter {
74
76
  return true; // keep;
75
77
  case "Optional":
76
78
  // only if in requested optionals
77
- return node.browseName!.name! in this.optionalsMap;
79
+ return this.copyAlsoAllOptionals || (node.browseName!.name! in this.optionalsMap);
78
80
  case "OptionalPlaceholder":
79
81
  return false; // ignored
80
82
  default:
@@ -85,14 +87,14 @@ export class MandatoryChildOrRequestedOptionalFilter implements CloneFilter {
85
87
  public filterFor(childInstance: UAVariable | UAObject | UAMethod): CloneFilter {
86
88
  const browseName: string = childInstance.browseName.name!;
87
89
 
88
- let map = {};
90
+ let map: OptionalMap = Object.create(null);
89
91
 
90
92
  if (browseName in this.optionalsMap) {
91
- map = this.optionalsMap[browseName];
93
+ map = this.optionalsMap[browseName] as any;
92
94
  }
93
95
  // istanbul ignore next
94
96
  doTrace && traceLog("filterFor ", browseName, map);
95
- const newFilter = new MandatoryChildOrRequestedOptionalFilter(childInstance, map);
97
+ const newFilter = new MandatoryChildOrRequestedOptionalFilter(childInstance, false, map);
96
98
  return newFilter;
97
99
  }
98
100
  }
@@ -162,7 +162,7 @@ export class AddressSpace implements AddressSpacePrivate {
162
162
  */
163
163
  public suspendBackReference = false;
164
164
  public isFrugal = false;
165
- public historizingNodes?: { [key: string]: UAVariable } = {};
165
+ public historizingNodes: Set<UAVariable> = new Set();
166
166
  public _condition_refresh_in_progress = false;
167
167
 
168
168
  public readonly isNodeIdString = isNodeIdString;