node-opcua-address-space 2.56.2 → 2.60.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 (237) hide show
  1. package/LICENSE +20 -20
  2. package/dist/source/address_space_ts.d.ts +0 -2
  3. package/dist/source/helpers/argument_list.js +12 -1
  4. package/dist/source/helpers/argument_list.js.map +1 -1
  5. package/dist/source/loader/load_nodeset2.js +76 -67
  6. package/dist/source/loader/load_nodeset2.js.map +1 -1
  7. package/dist/source/session_context.js +2 -2
  8. package/dist/source/session_context.js.map +1 -1
  9. package/dist/source/set_namespace_meta_data.js +1 -1
  10. package/dist/src/address_space.d.ts +2 -3
  11. package/dist/src/address_space.js +9 -6
  12. package/dist/src/address_space.js.map +1 -1
  13. package/dist/src/address_space_private.d.ts +2 -3
  14. package/dist/src/alarms_and_conditions/condition_snapshot.js +3 -3
  15. package/dist/src/alarms_and_conditions/condition_snapshot.js.map +1 -1
  16. package/dist/src/alarms_and_conditions/ua_acknowledgeable_condition_impl.js +2 -1
  17. package/dist/src/alarms_and_conditions/ua_acknowledgeable_condition_impl.js.map +1 -1
  18. package/dist/src/alarms_and_conditions/ua_alarm_condition_impl.js +1 -1
  19. package/dist/src/alarms_and_conditions/ua_alarm_condition_impl.js.map +1 -1
  20. package/dist/src/alarms_and_conditions/ua_condition_impl.js +8 -6
  21. package/dist/src/alarms_and_conditions/ua_condition_impl.js.map +1 -1
  22. package/dist/src/alarms_and_conditions/ua_off_normal_alarm_impl.js +1 -1
  23. package/dist/src/alarms_and_conditions/ua_off_normal_alarm_impl.js.map +1 -1
  24. package/dist/src/base_node_private.js +2 -2
  25. package/dist/src/base_node_private.js.map +1 -1
  26. package/dist/src/event_data.js +1 -1
  27. package/dist/src/event_data.js.map +1 -1
  28. package/dist/src/namespace_impl.d.ts +2 -2
  29. package/dist/src/namespace_impl.js +9 -9
  30. package/dist/src/namespace_impl.js.map +1 -1
  31. package/dist/src/nodeset_tools/nodeset_to_xml.js +16 -10
  32. package/dist/src/nodeset_tools/nodeset_to_xml.js.map +1 -1
  33. package/dist/src/nodeset_tools/typedictionary_to_xml.js +17 -10
  34. package/dist/src/nodeset_tools/typedictionary_to_xml.js.map +1 -1
  35. package/dist/src/reference_impl.js +1 -1
  36. package/dist/src/reference_impl.js.map +1 -1
  37. package/dist/src/state_machine/ua_shelving_state_machine_ex.js +20 -13
  38. package/dist/src/state_machine/ua_shelving_state_machine_ex.js.map +1 -1
  39. package/dist/src/ua_data_type_impl.d.ts +15 -5
  40. package/dist/src/ua_data_type_impl.js +129 -51
  41. package/dist/src/ua_data_type_impl.js.map +1 -1
  42. package/dist/src/ua_method_impl.d.ts +3 -2
  43. package/dist/src/ua_method_impl.js +5 -0
  44. package/dist/src/ua_method_impl.js.map +1 -1
  45. package/dist/src/ua_variable_impl.d.ts +6 -6
  46. package/dist/src/ua_variable_impl.js +236 -188
  47. package/dist/src/ua_variable_impl.js.map +1 -1
  48. package/dist/src/ua_variable_type_impl.d.ts +3 -4
  49. package/dist/src/ua_variable_type_impl.js +13 -18
  50. package/dist/src/ua_variable_type_impl.js.map +1 -1
  51. package/distHelpers/add_event_generator_object.js.map +1 -1
  52. package/distHelpers/mock_session.js +1 -1
  53. package/distHelpers/mock_session.js.map +1 -1
  54. package/generate.js +1 -1
  55. package/nodeJS.d.ts +1 -1
  56. package/package.json +36 -36
  57. package/source/address_space_ts.ts +0 -1
  58. package/source/helpers/argument_list.ts +13 -3
  59. package/source/loader/load_nodeset2.ts +99 -79
  60. package/source/session_context.ts +1 -1
  61. package/source/set_namespace_meta_data.ts +1 -1
  62. package/source_nodejs/index.ts +1 -1
  63. package/src/address_space.ts +21 -14
  64. package/src/address_space_private.ts +3 -3
  65. package/src/alarms_and_conditions/condition_snapshot.ts +4 -4
  66. package/src/alarms_and_conditions/ua_acknowledgeable_condition_impl.ts +7 -6
  67. package/src/alarms_and_conditions/ua_alarm_condition_impl.ts +2 -2
  68. package/src/alarms_and_conditions/ua_condition_impl.ts +29 -15
  69. package/src/alarms_and_conditions/ua_off_normal_alarm_impl.ts +1 -1
  70. package/src/base_node_private.ts +6 -2
  71. package/src/event_data.ts +1 -1
  72. package/src/namespace_impl.ts +9 -9
  73. package/src/nodeset_tools/nodeset_to_xml.ts +22 -12
  74. package/src/nodeset_tools/typedictionary_to_xml.ts +17 -7
  75. package/src/reference_impl.ts +3 -3
  76. package/src/state_machine/ua_shelving_state_machine_ex.ts +32 -19
  77. package/src/ua_data_type_impl.ts +168 -61
  78. package/src/ua_method_impl.ts +11 -5
  79. package/src/ua_variable_impl.ts +290 -218
  80. package/src/ua_variable_type_impl.ts +9 -15
  81. package/testHelpers.d.ts +1 -1
  82. package/test_helpers/add_event_generator_object.ts +4 -3
  83. package/test_helpers/mock_session.ts +1 -1
  84. package/test_helpers/test_fixtures/dataType_in_separateNamespace.xml +150 -150
  85. package/test_helpers/test_fixtures/dataType_in_separateNamespace_basic.xml +57 -57
  86. package/test_helpers/test_fixtures/dataType_in_separateNamespace_mix.xml +135 -135
  87. package/test_helpers/test_fixtures/dataType_withEnumeration.xml +82 -82
  88. package/test_helpers/test_fixtures/dataType_with_isOptionSet.xml +194 -194
  89. package/test_helpers/test_fixtures/dataType_with_union.xml +1 -1
  90. package/test_helpers/test_fixtures/fixture_empty_nodeset2.xml +106 -106
  91. package/test_helpers/test_fixtures/fixture_simple_statemachine_nodeset2.xml +1312 -1303
  92. package/test_helpers/test_fixtures/fixuture_nodeset_objects_with_some_methods.xml +362 -362
  93. package/test_helpers/test_fixtures/issue_846.xml +3172 -3172
  94. package/test_helpers/test_fixtures/issue_899_variable_with_nodeid_value.xml +32 -32
  95. package/test_helpers/test_fixtures/mini.Node.Set2.xml +14 -0
  96. package/test_helpers/test_fixtures/mini.nodeset.withVariousVariables.xml +194 -194
  97. package/test_helpers/test_fixtures/minimalist_nodeset_with_models.xml +8 -8
  98. package/test_helpers/test_fixtures/minimalist_nodeset_with_models_more_complex.xml +16 -16
  99. package/test_helpers/test_fixtures/nodeset_with_analog_items.xml +45 -45
  100. package/dist/source/interfaces/alarms_and_conditions/ua_condition_base_i.d.ts +0 -23
  101. package/dist/source/interfaces/alarms_and_conditions/ua_condition_base_i.js +0 -3
  102. package/dist/source/interfaces/alarms_and_conditions/ua_condition_base_i.js.map +0 -1
  103. package/dist/source/interfaces/data_access/ua_discrete_item.d.ts +0 -6
  104. package/dist/source/interfaces/data_access/ua_discrete_item.js +0 -3
  105. package/dist/source/interfaces/data_access/ua_discrete_item.js.map +0 -1
  106. package/dist/source/interfaces/data_access/ua_multistate_discrete.d.ts +0 -25
  107. package/dist/source/interfaces/data_access/ua_multistate_discrete.js +0 -3
  108. package/dist/source/interfaces/data_access/ua_multistate_discrete.js.map +0 -1
  109. package/dist/source/interfaces/data_access/ua_multistate_value_discrete.d.ts +0 -27
  110. package/dist/source/interfaces/data_access/ua_multistate_value_discrete.js +0 -3
  111. package/dist/source/interfaces/data_access/ua_multistate_value_discrete.js.map +0 -1
  112. package/dist/source/interfaces/data_access/ua_two_state_discrete.d.ts +0 -17
  113. package/dist/source/interfaces/data_access/ua_two_state_discrete.js +0 -3
  114. package/dist/source/interfaces/data_access/ua_two_state_discrete.js.map +0 -1
  115. package/dist/source/interfaces/data_access/ua_y_array_item.d.ts +0 -19
  116. package/dist/source/interfaces/data_access/ua_y_array_item.js +0 -3
  117. package/dist/source/interfaces/data_access/ua_y_array_item.js.map +0 -1
  118. package/dist/source/interfaces/state_machine/exclusive_limit_state_machine.d.ts +0 -11
  119. package/dist/source/interfaces/state_machine/exclusive_limit_state_machine.js +0 -3
  120. package/dist/source/interfaces/state_machine/exclusive_limit_state_machine.js.map +0 -1
  121. package/dist/source/interfaces/state_machine/finite_state_machine.d.ts +0 -70
  122. package/dist/source/interfaces/state_machine/finite_state_machine.js +0 -3
  123. package/dist/source/interfaces/state_machine/finite_state_machine.js.map +0 -1
  124. package/dist/source/interfaces/state_machine/program_finite_state_machine.d.ts +0 -74
  125. package/dist/source/interfaces/state_machine/program_finite_state_machine.js +0 -3
  126. package/dist/source/interfaces/state_machine/program_finite_state_machine.js.map +0 -1
  127. package/dist/source/interfaces/state_machine/state_machine.d.ts +0 -342
  128. package/dist/source/interfaces/state_machine/state_machine.js +0 -3
  129. package/dist/source/interfaces/state_machine/state_machine.js.map +0 -1
  130. package/dist/source/interfaces/state_machine/ua_finite_state_variable.d.ts +0 -18
  131. package/dist/source/interfaces/state_machine/ua_finite_state_variable.js +0 -3
  132. package/dist/source/interfaces/state_machine/ua_finite_state_variable.js.map +0 -1
  133. package/dist/source/interfaces/state_machine/ua_state_variable.d.ts +0 -29
  134. package/dist/source/interfaces/state_machine/ua_state_variable.js +0 -3
  135. package/dist/source/interfaces/state_machine/ua_state_variable.js.map +0 -1
  136. package/dist/source/interfaces/state_machine/ua_two_state_variable.d.ts +0 -26
  137. package/dist/source/interfaces/state_machine/ua_two_state_variable.js +0 -3
  138. package/dist/source/interfaces/state_machine/ua_two_state_variable.js.map +0 -1
  139. package/dist/source/interfaces/subscription_diagnostics_variable.d.ts +0 -41
  140. package/dist/source/interfaces/subscription_diagnostics_variable.js +0 -3
  141. package/dist/source/interfaces/subscription_diagnostics_variable.js.map +0 -1
  142. package/dist/src/alarms_and_conditions/base_event_type.d.ts +0 -26
  143. package/dist/src/alarms_and_conditions/base_event_type.js +0 -41
  144. package/dist/src/alarms_and_conditions/base_event_type.js.map +0 -1
  145. package/dist/src/alarms_and_conditions/shelving_state_machine.d.ts +0 -22
  146. package/dist/src/alarms_and_conditions/shelving_state_machine.js +0 -241
  147. package/dist/src/alarms_and_conditions/shelving_state_machine.js.map +0 -1
  148. package/dist/src/alarms_and_conditions/trip_alarm.d.ts +0 -16
  149. package/dist/src/alarms_and_conditions/trip_alarm.js +0 -21
  150. package/dist/src/alarms_and_conditions/trip_alarm.js.map +0 -1
  151. package/dist/src/alarms_and_conditions/ua_acknowledgeable_condition_base.d.ts +0 -54
  152. package/dist/src/alarms_and_conditions/ua_acknowledgeable_condition_base.js +0 -255
  153. package/dist/src/alarms_and_conditions/ua_acknowledgeable_condition_base.js.map +0 -1
  154. package/dist/src/alarms_and_conditions/ua_alarm_condition_base.d.ts +0 -138
  155. package/dist/src/alarms_and_conditions/ua_alarm_condition_base.js +0 -460
  156. package/dist/src/alarms_and_conditions/ua_alarm_condition_base.js.map +0 -1
  157. package/dist/src/alarms_and_conditions/ua_certificate_expiration_alarm.d.ts +0 -35
  158. package/dist/src/alarms_and_conditions/ua_certificate_expiration_alarm.js +0 -32
  159. package/dist/src/alarms_and_conditions/ua_certificate_expiration_alarm.js.map +0 -1
  160. package/dist/src/alarms_and_conditions/ua_condition_base.d.ts +0 -191
  161. package/dist/src/alarms_and_conditions/ua_condition_base.js +0 -1029
  162. package/dist/src/alarms_and_conditions/ua_condition_base.js.map +0 -1
  163. package/dist/src/alarms_and_conditions/ua_discrete_alarm.d.ts +0 -11
  164. package/dist/src/alarms_and_conditions/ua_discrete_alarm.js +0 -58
  165. package/dist/src/alarms_and_conditions/ua_discrete_alarm.js.map +0 -1
  166. package/dist/src/alarms_and_conditions/ua_exclusive_deviation_alarm.d.ts +0 -24
  167. package/dist/src/alarms_and_conditions/ua_exclusive_deviation_alarm.js +0 -59
  168. package/dist/src/alarms_and_conditions/ua_exclusive_deviation_alarm.js.map +0 -1
  169. package/dist/src/alarms_and_conditions/ua_exclusive_level_alarm.d.ts +0 -14
  170. package/dist/src/alarms_and_conditions/ua_exclusive_level_alarm.js +0 -17
  171. package/dist/src/alarms_and_conditions/ua_exclusive_level_alarm.js.map +0 -1
  172. package/dist/src/alarms_and_conditions/ua_exclusive_limit_alarm.d.ts +0 -22
  173. package/dist/src/alarms_and_conditions/ua_exclusive_limit_alarm.js +0 -87
  174. package/dist/src/alarms_and_conditions/ua_exclusive_limit_alarm.js.map +0 -1
  175. package/dist/src/alarms_and_conditions/ua_exclusive_rate_of_change_alarm.d.ts +0 -6
  176. package/dist/src/alarms_and_conditions/ua_exclusive_rate_of_change_alarm.js +0 -11
  177. package/dist/src/alarms_and_conditions/ua_exclusive_rate_of_change_alarm.js.map +0 -1
  178. package/dist/src/alarms_and_conditions/ua_limit_alarm.d.ts +0 -76
  179. package/dist/src/alarms_and_conditions/ua_limit_alarm.js +0 -237
  180. package/dist/src/alarms_and_conditions/ua_limit_alarm.js.map +0 -1
  181. package/dist/src/alarms_and_conditions/ua_non_exclusive_deviation_alarm.d.ts +0 -27
  182. package/dist/src/alarms_and_conditions/ua_non_exclusive_deviation_alarm.js +0 -62
  183. package/dist/src/alarms_and_conditions/ua_non_exclusive_deviation_alarm.js.map +0 -1
  184. package/dist/src/alarms_and_conditions/ua_non_exclusive_limit_alarm.d.ts +0 -49
  185. package/dist/src/alarms_and_conditions/ua_non_exclusive_limit_alarm.js +0 -176
  186. package/dist/src/alarms_and_conditions/ua_non_exclusive_limit_alarm.js.map +0 -1
  187. package/dist/src/alarms_and_conditions/ua_off_normal_alarm.d.ts +0 -47
  188. package/dist/src/alarms_and_conditions/ua_off_normal_alarm.js +0 -151
  189. package/dist/src/alarms_and_conditions/ua_off_normal_alarm.js.map +0 -1
  190. package/dist/src/alarms_and_conditions/ua_system_off_normal_alarm.d.ts +0 -16
  191. package/dist/src/alarms_and_conditions/ua_system_off_normal_alarm.js +0 -18
  192. package/dist/src/alarms_and_conditions/ua_system_off_normal_alarm.js.map +0 -1
  193. package/dist/src/base_node.d.ts +0 -289
  194. package/dist/src/base_node.js +0 -1345
  195. package/dist/src/base_node.js.map +0 -1
  196. package/dist/src/data_access/ua_analog_item.d.ts +0 -13
  197. package/dist/src/data_access/ua_analog_item.js +0 -37
  198. package/dist/src/data_access/ua_analog_item.js.map +0 -1
  199. package/dist/src/data_access/ua_data_item.d.ts +0 -16
  200. package/dist/src/data_access/ua_data_item.js +0 -66
  201. package/dist/src/data_access/ua_data_item.js.map +0 -1
  202. package/dist/src/data_access/ua_multistate_discrete.d.ts +0 -24
  203. package/dist/src/data_access/ua_multistate_discrete.js +0 -132
  204. package/dist/src/data_access/ua_multistate_discrete.js.map +0 -1
  205. package/dist/src/namespace.d.ts +0 -472
  206. package/dist/src/namespace.js +0 -1751
  207. package/dist/src/namespace.js.map +0 -1
  208. package/dist/src/reference.d.ts +0 -43
  209. package/dist/src/reference.js +0 -138
  210. package/dist/src/reference.js.map +0 -1
  211. package/dist/src/session_context.d.ts +0 -4
  212. package/dist/src/session_context.js +0 -9
  213. package/dist/src/session_context.js.map +0 -1
  214. package/dist/src/ua_data_type.d.ts +0 -83
  215. package/dist/src/ua_data_type.js +0 -289
  216. package/dist/src/ua_data_type.js.map +0 -1
  217. package/dist/src/ua_method.d.ts +0 -41
  218. package/dist/src/ua_method.js +0 -202
  219. package/dist/src/ua_method.js.map +0 -1
  220. package/dist/src/ua_object.d.ts +0 -28
  221. package/dist/src/ua_object.js +0 -153
  222. package/dist/src/ua_object.js.map +0 -1
  223. package/dist/src/ua_object_type.d.ts +0 -49
  224. package/dist/src/ua_object_type.js +0 -123
  225. package/dist/src/ua_object_type.js.map +0 -1
  226. package/dist/src/ua_reference_type.d.ts +0 -42
  227. package/dist/src/ua_reference_type.js +0 -138
  228. package/dist/src/ua_reference_type.js.map +0 -1
  229. package/dist/src/ua_variable.d.ts +0 -339
  230. package/dist/src/ua_variable.js +0 -1706
  231. package/dist/src/ua_variable.js.map +0 -1
  232. package/dist/src/ua_variable_type.d.ts +0 -57
  233. package/dist/src/ua_variable_type.js +0 -530
  234. package/dist/src/ua_variable_type.js.map +0 -1
  235. package/dist/src/ua_view.d.ts +0 -16
  236. package/dist/src/ua_view.js +0 -42
  237. package/dist/src/ua_view.js.map +0 -1
@@ -5,19 +5,28 @@ import * as chalk from "chalk";
5
5
 
6
6
  import { assert } from "node-opcua-assert";
7
7
  import { NodeClass, QualifiedNameLike } from "node-opcua-data-model";
8
- import { StructuredTypeSchema } from "node-opcua-factory";
8
+ import { EnumerationDefinition, StructuredTypeSchema } from "node-opcua-factory";
9
9
  import { AttributeIds } from "node-opcua-data-model";
10
10
  import { DataValue, DataValueLike } from "node-opcua-data-value";
11
11
  import { ExtensionObject } from "node-opcua-extension-object";
12
12
  import { ExpandedNodeId, NodeId } from "node-opcua-nodeid";
13
13
  import { NumericRange } from "node-opcua-numeric-range";
14
14
  import { StatusCodes } from "node-opcua-status-code";
15
- import { DataTypeDefinition, StructureDefinition, StructureField } from "node-opcua-types";
15
+ import {
16
+ DataTypeDefinition,
17
+ EnumDefinition,
18
+ EnumFieldOptions,
19
+ StructureDefinition,
20
+ StructureField,
21
+ StructureFieldOptions,
22
+ StructureType
23
+ } from "node-opcua-types";
16
24
  import { DataType } from "node-opcua-variant";
17
- import { UAObject, ISessionContext, UADataType, UAVariable, BaseNode } from "node-opcua-address-space-base";
25
+ import { UAObject, ISessionContext, UADataType, UAVariable, BaseNode, CreateDataTypeOptions } from "node-opcua-address-space-base";
26
+ import { DataTypeIds } from "node-opcua-constants";
18
27
 
19
28
  import { SessionContext } from "../source/session_context";
20
- import { BaseNodeImpl } from "./base_node_impl";
29
+ import { BaseNodeImpl, InternalBaseNodeOptions } from "./base_node_impl";
21
30
  import { BaseNode_References_toString, BaseNode_toString, ToStringBuilder, ToStringOption } from "./base_node_private";
22
31
  import * as tools from "./tool_isSupertypeOf";
23
32
  import { get_subtypeOf } from "./tool_isSupertypeOf";
@@ -44,13 +53,10 @@ export interface EnumerationInfo {
44
53
  nameIndex: { [id: string]: IEnumItem };
45
54
  valueIndex: { [id: number]: IEnumItem };
46
55
  }
47
-
48
- function findBasicDataType(dataType: UADataType): DataType {
49
- if (dataType.nodeId.namespace === 0 && dataType.nodeId.value <= 25) {
50
- // we have a well-known DataType
51
- return dataType.nodeId.value as DataType;
52
- }
53
- return findBasicDataType(dataType.subtypeOfObj as UADataType);
56
+ export interface UADataTypeOptions extends InternalBaseNodeOptions {
57
+ partialDefinition: StructureFieldOptions[] | EnumFieldOptions[];
58
+ isAbstract?: boolean;
59
+ symbolicName?: string;
54
60
  }
55
61
 
56
62
  export class UADataTypeImpl extends BaseNodeImpl implements UADataType {
@@ -83,18 +89,23 @@ export class UADataTypeImpl extends BaseNodeImpl implements UADataType {
83
89
 
84
90
  private enumStrings?: any;
85
91
  private enumValues?: any;
86
- private $definition?: DataTypeDefinition;
87
- private $fullDefinition?: DataTypeDefinition;
92
+ private $partialDefinition?: StructureFieldOptions[] | EnumFieldOptions[];
93
+ private $fullDefinition?: StructureDefinition | EnumDefinition;
88
94
 
89
- constructor(options: any) {
95
+ constructor(options: UADataTypeOptions) {
90
96
  super(options);
91
- this.$definition = options.$definition;
92
- this.isAbstract = options.isAbstract === null ? false : options.isAbstract;
97
+ if (options.partialDefinition) {
98
+ this.$partialDefinition = options.partialDefinition;
99
+ }
100
+ this.isAbstract = options.isAbstract === undefined || options.isAbstract === null ? false : options.isAbstract;
93
101
  this.symbolicName = options.symbolicName || this.browseName.name!;
94
102
  }
95
103
 
96
104
  public get basicDataType(): DataType {
97
- return findBasicDataType(this);
105
+ return this.getBasicDataType();
106
+ }
107
+ public getBasicDataType(): DataType {
108
+ return this.addressSpace.findCorrespondingBasicDataType(this);
98
109
  }
99
110
 
100
111
  public readAttribute(
@@ -113,7 +124,7 @@ export class UADataTypeImpl extends BaseNodeImpl implements UADataType {
113
124
  break;
114
125
  case AttributeIds.DataTypeDefinition:
115
126
  {
116
- const _definition = this._getDefinition(true);
127
+ const _definition = this._getDefinition()?.clone();
117
128
  if (_definition !== null) {
118
129
  options.value = { dataType: DataType.ExtensionObject, value: _definition };
119
130
  } else {
@@ -246,57 +257,92 @@ export class UADataTypeImpl extends BaseNodeImpl implements UADataType {
246
257
  return indexes;
247
258
  }
248
259
 
249
- public _getDefinition(mergeWithBase: boolean): DataTypeDefinition | null {
260
+ isStructure(): boolean {
261
+ const definition = this._getDefinition();
262
+ return definition instanceof StructureDefinition;
263
+ }
264
+ getStructureDefinition(): StructureDefinition {
265
+ const definition = this._getDefinition();
266
+ assert(definition instanceof StructureDefinition);
267
+ return definition as StructureDefinition;
268
+ }
269
+
270
+ isEnumeration(): boolean {
271
+ const definition = this._getDefinition();
272
+ return definition instanceof EnumDefinition;
273
+ }
274
+ getEnumDefinition(): EnumDefinition {
275
+ const definition = this._getDefinition();
276
+ assert(definition instanceof EnumDefinition);
277
+ return definition as EnumDefinition;
278
+ }
279
+
280
+ // eslint-disable-next-line complexity
281
+ public _getDefinition(): DataTypeDefinition | null {
250
282
  if (this.$fullDefinition !== undefined) {
251
- return mergeWithBase ? this.$fullDefinition : this.$definition!;
283
+ return this.$fullDefinition;
252
284
  }
253
- if (!this.$definition) {
254
- const structure = this.addressSpace.findDataType("Structure")!;
255
- if (!structure) {
256
- return null;
285
+ const addressSpace = this.addressSpace;
286
+ const enumeration = addressSpace.findDataType("Enumeration");
287
+ const structure = addressSpace.findDataType("Structure");
288
+ const union = addressSpace.findDataType("Union");
289
+
290
+ // we have a data type from a companion specification
291
+ // let's see if this data type need to be registered
292
+ const isEnumeration = enumeration && this.isSupertypeOf(enumeration);
293
+ const isStructure = structure && this.isSupertypeOf(structure);
294
+ const isUnion = !!(structure && union && this.isSupertypeOf(union));
295
+
296
+ const isRootDataType = (n: UADataType) => n.nodeId.namespace === 0 && n.nodeId.value === DataTypeIds.BaseDataType;
297
+ // https://reference.opcfoundation.org/v104/Core/docs/Part3/8.49/#Table34
298
+ if (isStructure) {
299
+ // eslint-disable-next-line @typescript-eslint/no-this-alias
300
+ let dataTypeNode: UADataTypeImpl | null = this;
301
+ const allPartialDefinitions: StructureFieldOptions[][] = [];
302
+ while (dataTypeNode && !isRootDataType(dataTypeNode)) {
303
+ if (dataTypeNode.$partialDefinition) {
304
+ allPartialDefinitions.push(dataTypeNode.$partialDefinition as StructureFieldOptions[]);
305
+ }
306
+ dataTypeNode = dataTypeNode.subtypeOfObj as UADataTypeImpl | null;
257
307
  }
258
- if (this.isSupertypeOf(structure)) {
259
- // <Definition> tag was missing in XML file as it was empty
260
- this.$definition = new StructureDefinition({});
308
+ // merge them:
309
+ const definitionFields: StructureFieldOptions[] = [];
310
+ for (const dd of allPartialDefinitions.reverse()) {
311
+ definitionFields.push(...dd);
261
312
  }
262
- }
263
-
264
- // https://reference.opcfoundation.org/v104/Core/docs/Part3/8.49/#Table34
265
- // The list of fields that make up the data type.
266
- // This definition assumes the structure has a sequential layout.
267
- // The StructureField DataType is defined in 8.51.
268
- // For Structures derived from another Structure DataType this list shall begin with the fields
269
- // of the baseDataType followed by the fields of this StructureDefinition.
270
-
271
- // from OPC Unified Architecture, Part 6 86 Release 1.04
272
- // A DataTypeDefinition defines an abstract representation of _a UADataType that can be used by
273
- // design tools to automatically create serialization code. The fields in the DataTypeDefinition type
274
- // are defined in Table F.12.
275
- const _definition = this.$definition || null;
276
- if (_definition && _definition instanceof StructureDefinition && this.binaryEncodingNodeId) {
277
- _definition.defaultEncodingId = this.binaryEncodingNodeId!;
278
- const subtype = this.subtypeOf;
279
- if (subtype) {
280
- _definition.baseDataType = subtype;
313
+ const basicDataType = this.subtypeOfObj?.nodeId || new NodeId();
314
+ const defaultEncodingId = this.binaryEncodingNodeId || this.xmlEncodingNodeId || new NodeId();
315
+ const definitionName = this.browseName.name!;
316
+ this.$fullDefinition = makeStructureDefinition(
317
+ definitionName,
318
+ basicDataType,
319
+ defaultEncodingId,
320
+ definitionFields,
321
+ isUnion
322
+ );
323
+ } else if (isEnumeration) {
324
+ const allPartialDefinitions: StructureFieldOptions[][] = [];
325
+ // eslint-disable-next-line @typescript-eslint/no-this-alias
326
+ let dataTypeNode: UADataTypeImpl | null = this;
327
+ while (dataTypeNode && !isRootDataType(dataTypeNode)) {
328
+ if (dataTypeNode.$partialDefinition) {
329
+ allPartialDefinitions.push(dataTypeNode.$partialDefinition as StructureFieldOptions[]);
330
+ }
331
+ dataTypeNode = dataTypeNode.subtypeOfObj as UADataTypeImpl | null;
281
332
  }
282
- }
283
- this.$fullDefinition = this.$definition?.clone();
284
-
285
- let _baseDefinition: DataTypeDefinition | null = null;
286
- if (this.subtypeOfObj) {
287
- _baseDefinition = (this.subtypeOfObj as UADataTypeImpl)._getDefinition(mergeWithBase);
288
- }
289
- if (this.$fullDefinition && this.$definition instanceof StructureDefinition && _baseDefinition) {
290
- const b = _baseDefinition as StructureDefinition;
291
- if (b.fields?.length) {
292
- const f = this.$fullDefinition as StructureDefinition;
293
- f.fields = (<StructureField[]>[]).concat(b.fields!, f.fields!);
333
+ // merge them:
334
+ const definitionFields: StructureFieldOptions[] = [];
335
+ for (const dd of allPartialDefinitions.reverse()) {
336
+ definitionFields.push(...dd);
294
337
  }
338
+ this.$fullDefinition = makeEnumDefinition(definitionFields);
295
339
  }
296
- return mergeWithBase ? this.$fullDefinition || null : this.$definition || null;
340
+
341
+ return this.$fullDefinition!;
297
342
  }
343
+
298
344
  public getDefinition(): DataTypeDefinition {
299
- const d = this._getDefinition(true);
345
+ const d = this._getDefinition();
300
346
  if (!d) {
301
347
  throw new Error("DataType has no definition property");
302
348
  }
@@ -315,7 +361,7 @@ export class UADataTypeImpl extends BaseNodeImpl implements UADataType {
315
361
  }
316
362
 
317
363
  function dataTypeDefinition_toString(this: UADataTypeImpl, options: ToStringOption) {
318
- const definition = this._getDefinition(false);
364
+ const definition = this._getDefinition();
319
365
  if (!definition) {
320
366
  return;
321
367
  }
@@ -354,3 +400,64 @@ export function DataType_toString(this: UADataTypeImpl, options: ToStringOption)
354
400
 
355
401
  dataTypeDefinition_toString.call(this, options);
356
402
  }
403
+
404
+ function makeEnumDefinition(definitionFields: EnumFieldOptions[]) {
405
+ return new EnumDefinition({
406
+ fields: definitionFields.map((x) => ({
407
+ description: x.description,
408
+ name: x.name,
409
+ value: x.value
410
+ }))
411
+ });
412
+ }
413
+ function makeStructureDefinition(
414
+ name: string,
415
+ baseDataType: NodeId,
416
+ defaultEncodingId: NodeId,
417
+ fields: StructureFieldOptions[],
418
+ isUnion: boolean
419
+ ): StructureDefinition {
420
+ // Structure = 0,
421
+ // StructureWithOptionalFields = 1,
422
+ // Union = 2,
423
+ const hasOptionalFields = fields.filter((field) => field.isOptional).length > 0;
424
+
425
+ const structureType = isUnion
426
+ ? StructureType.Union
427
+ : hasOptionalFields
428
+ ? StructureType.StructureWithOptionalFields
429
+ : StructureType.Structure;
430
+
431
+ const sd = new StructureDefinition({
432
+ baseDataType,
433
+ defaultEncodingId,
434
+ fields,
435
+ structureType
436
+ });
437
+ return sd;
438
+ }
439
+
440
+ /*
441
+ function lockReadOnlyWithWriteDetection<T>(obj: T): T {
442
+ if (obj instanceof Array) {
443
+ return obj.map(lockReadOnlyWithWriteDetection) as unknown as T;
444
+ }
445
+ if (obj instanceof Object) {
446
+ const _org = obj;
447
+ for (const [key, value] of Object.entries(obj)) {
448
+ lockReadOnlyWithWriteDetection(value);
449
+ }
450
+ obj = new Proxy(obj, {
451
+ get: (target: any, prop: string) => {
452
+ return target[prop];
453
+ },
454
+ set: (target: any, prop: string | symbol, value: any, receiver: any) => {
455
+ console.log("QQQQQ Cannot modify stuff ");
456
+ debugger;
457
+ throw new Error("Invalid");
458
+ }
459
+ });
460
+ }
461
+ return obj;
462
+ }
463
+ */
@@ -1,6 +1,7 @@
1
1
  /**
2
2
  * @module node-opcua-address-space
3
3
  */
4
+ import { callbackify } from "util";
4
5
  import * as chalk from "chalk";
5
6
  import { assert } from "node-opcua-assert";
6
7
 
@@ -11,13 +12,14 @@ import { make_debugLog, make_errorLog, make_warningLog } from "node-opcua-debug"
11
12
  import { NodeId } from "node-opcua-nodeid";
12
13
  import { NumericRange } from "node-opcua-numeric-range";
13
14
  import { Argument } from "node-opcua-service-call";
14
- import { StatusCodes } from "node-opcua-status-code";
15
+ import { CallbackT, StatusCodes } from "node-opcua-status-code";
15
16
  import { CallMethodResultOptions, PermissionType } from "node-opcua-types";
16
17
  import { Variant } from "node-opcua-variant";
17
18
  import { DataType, VariantLike } from "node-opcua-variant";
18
19
  import {
19
20
  MethodFunctor,
20
- MethodFunctorCallback,
21
+ MethodFunctorA,
22
+ MethodFunctorC,
21
23
  UAMethod,
22
24
  UAObject,
23
25
  CloneExtraInfo,
@@ -122,6 +124,10 @@ export class UAMethodImpl extends BaseNodeImpl implements UAMethod {
122
124
 
123
125
  public bindMethod(async_func: MethodFunctor): void {
124
126
  assert(typeof async_func === "function");
127
+ if (async_func.length === 2) {
128
+ async_func = callbackify(async_func as MethodFunctorA) as MethodFunctorC;
129
+ }
130
+ assert(async_func.length === 3);
125
131
  this._asyncExecutionFunction = async_func;
126
132
  }
127
133
  public execute(
@@ -133,13 +139,13 @@ export class UAMethodImpl extends BaseNodeImpl implements UAMethod {
133
139
  object: UAObject | UAObjectType | null,
134
140
  inputArguments: null | VariantLike[],
135
141
  context: ISessionContext,
136
- callback: MethodFunctorCallback
142
+ callback: CallbackT<CallMethodResultOptions>
137
143
  ): void;
138
144
  public execute(
139
145
  object: UAObject | UAObjectType | null,
140
146
  inputArguments: VariantLike[] | null,
141
147
  context: ISessionContext,
142
- callback?: MethodFunctorCallback
148
+ callback?: CallbackT<CallMethodResultOptions>
143
149
  ): any {
144
150
  // istanbul ignore next
145
151
  if (!callback) {
@@ -200,7 +206,7 @@ export class UAMethodImpl extends BaseNodeImpl implements UAMethod {
200
206
  this as UAMethodImpl,
201
207
  inputArguments as Variant[],
202
208
  context,
203
- (err: Error | null, callMethodResult: CallMethodResultOptions) => {
209
+ (err: Error | null, callMethodResult?: CallMethodResultOptions) => {
204
210
  if (err) {
205
211
  debugLog(err.message);
206
212
  debugLog(err);