node-opcua-address-space 2.178.0 → 2.180.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 (185) hide show
  1. package/dist/source/address_space_ts.d.ts +16 -6
  2. package/dist/source/address_space_ts.js +1 -1
  3. package/dist/source/address_space_ts.js.map +1 -1
  4. package/dist/source/helpers/argument_list.js +2 -2
  5. package/dist/source/helpers/argument_list.js.map +1 -1
  6. package/dist/source/helpers/call_helpers.js +3 -0
  7. package/dist/source/helpers/call_helpers.js.map +1 -1
  8. package/dist/source/helpers/dump_tools.js +6 -2
  9. package/dist/source/helpers/dump_tools.js.map +1 -1
  10. package/dist/source/helpers/make_optionals_map.d.ts +3 -1
  11. package/dist/source/helpers/make_optionals_map.js.map +1 -1
  12. package/dist/source/interfaces/extension_object_constructor.d.ts +1 -1
  13. package/dist/source/interfaces/state_machine/ua_state_machine_type.js +0 -1
  14. package/dist/source/interfaces/state_machine/ua_state_machine_type.js.map +1 -1
  15. package/dist/source/loader/decode_xml_extension_object.js.map +1 -1
  16. package/dist/source/loader/ensure_datatype_extracted.js.map +1 -1
  17. package/dist/source/loader/generateAddressSpaceRaw.js +2 -1
  18. package/dist/source/loader/generateAddressSpaceRaw.js.map +1 -1
  19. package/dist/source/loader/load_nodeset2.js +12 -8
  20. package/dist/source/loader/load_nodeset2.js.map +1 -1
  21. package/dist/source/loader/make_xml_extension_object_parser.js +26 -7
  22. package/dist/source/loader/make_xml_extension_object_parser.js.map +1 -1
  23. package/dist/source/loader/namespace_post_step.js.map +1 -1
  24. package/dist/source/loader/parsers/extension_object_parser.d.ts +6 -4
  25. package/dist/source/loader/parsers/extension_object_parser.js +12 -6
  26. package/dist/source/loader/parsers/extension_object_parser.js.map +1 -1
  27. package/dist/source/loader/parsers/localized_text_parser.d.ts +1 -1
  28. package/dist/source/loader/parsers/nodeid_parser.d.ts +10 -2
  29. package/dist/source/loader/parsers/nodeid_parser.js.map +1 -1
  30. package/dist/source/loader/parsers/qualified_name_parser.d.ts +1 -2
  31. package/dist/source/loader/parsers/variant_parser.d.ts +8 -2
  32. package/dist/source/loader/parsers/variant_parser.js +11 -8
  33. package/dist/source/loader/parsers/variant_parser.js.map +1 -1
  34. package/dist/source/pseudo_session.js +70 -24
  35. package/dist/source/pseudo_session.js.map +1 -1
  36. package/dist/source/session_context.js +26 -19
  37. package/dist/source/session_context.js.map +1 -1
  38. package/dist/source/xml_writer.d.ts +1 -1
  39. package/dist/src/_instantiate_helpers.js +0 -3
  40. package/dist/src/_instantiate_helpers.js.map +1 -1
  41. package/dist/src/_mandatory_child_or_requested_optional_filter.d.ts +3 -2
  42. package/dist/src/_mandatory_child_or_requested_optional_filter.js +0 -2
  43. package/dist/src/_mandatory_child_or_requested_optional_filter.js.map +1 -1
  44. package/dist/src/address_space.d.ts +7 -2
  45. package/dist/src/address_space.js +36 -28
  46. package/dist/src/address_space.js.map +1 -1
  47. package/dist/src/address_space_private.d.ts +1 -0
  48. package/dist/src/alarms_and_conditions/condition_snapshot_impl.js +6 -9
  49. package/dist/src/alarms_and_conditions/condition_snapshot_impl.js.map +1 -1
  50. package/dist/src/alarms_and_conditions/ua_acknowledgeable_condition_impl.js +6 -6
  51. package/dist/src/alarms_and_conditions/ua_acknowledgeable_condition_impl.js.map +1 -1
  52. package/dist/src/alarms_and_conditions/ua_alarm_condition_impl.js +8 -4
  53. package/dist/src/alarms_and_conditions/ua_alarm_condition_impl.js.map +1 -1
  54. package/dist/src/alarms_and_conditions/ua_certificate_expiration_alarm_impl.js.map +1 -1
  55. package/dist/src/alarms_and_conditions/ua_condition_impl.js +6 -5
  56. package/dist/src/alarms_and_conditions/ua_condition_impl.js.map +1 -1
  57. package/dist/src/alarms_and_conditions/ua_discrete_alarm_impl.js +3 -0
  58. package/dist/src/alarms_and_conditions/ua_discrete_alarm_impl.js.map +1 -1
  59. package/dist/src/alarms_and_conditions/ua_non_exclusive_limit_alarm_impl.js +0 -1
  60. package/dist/src/alarms_and_conditions/ua_non_exclusive_limit_alarm_impl.js.map +1 -1
  61. package/dist/src/alarms_and_conditions/ua_off_normal_alarm_impl.js.map +1 -1
  62. package/dist/src/base_node_impl.js +17 -8
  63. package/dist/src/base_node_impl.js.map +1 -1
  64. package/dist/src/base_node_private.js +0 -6
  65. package/dist/src/base_node_private.js.map +1 -1
  66. package/dist/src/extension_object_array_node.d.ts +9 -1
  67. package/dist/src/extension_object_array_node.js +20 -3
  68. package/dist/src/extension_object_array_node.js.map +1 -1
  69. package/dist/src/get_basic_datatype.js +3 -1
  70. package/dist/src/get_basic_datatype.js.map +1 -1
  71. package/dist/src/historical_access/address_space_historical_data_node.js +2 -4
  72. package/dist/src/historical_access/address_space_historical_data_node.js.map +1 -1
  73. package/dist/src/namespace_impl.js +6 -5
  74. package/dist/src/namespace_impl.js.map +1 -1
  75. package/dist/src/nodeid_manager.js +4 -5
  76. package/dist/src/nodeid_manager.js.map +1 -1
  77. package/dist/src/nodeset_tools/construct_namespace_dependency.js +10 -11
  78. package/dist/src/nodeset_tools/construct_namespace_dependency.js.map +1 -1
  79. package/dist/src/nodeset_tools/dump_to_bsd.js +2 -4
  80. package/dist/src/nodeset_tools/dump_to_bsd.js.map +1 -1
  81. package/dist/src/nodeset_tools/nodeset_to_xml.d.ts +1 -1
  82. package/dist/src/nodeset_tools/nodeset_to_xml.js +71 -43
  83. package/dist/src/nodeset_tools/nodeset_to_xml.js.map +1 -1
  84. package/dist/src/private_namespace.js.map +1 -1
  85. package/dist/src/reference_impl.d.ts +2 -2
  86. package/dist/src/reference_impl.js +5 -4
  87. package/dist/src/reference_impl.js.map +1 -1
  88. package/dist/src/state_machine/finite_state_machine.js +1 -1
  89. package/dist/src/state_machine/finite_state_machine.js.map +1 -1
  90. package/dist/src/state_machine/ua_shelving_state_machine_ex.js.map +1 -1
  91. package/dist/src/state_machine/ua_two_state_variable.js +9 -7
  92. package/dist/src/state_machine/ua_two_state_variable.js.map +1 -1
  93. package/dist/src/tool_isSubtypeOf.js.map +1 -1
  94. package/dist/src/ua_data_type_impl.js +4 -4
  95. package/dist/src/ua_data_type_impl.js.map +1 -1
  96. package/dist/src/ua_method_impl.js +21 -11
  97. package/dist/src/ua_method_impl.js.map +1 -1
  98. package/dist/src/ua_object_type_impl.d.ts +5 -2
  99. package/dist/src/ua_object_type_impl.js +4 -3
  100. package/dist/src/ua_object_type_impl.js.map +1 -1
  101. package/dist/src/ua_reference_type_impl.js +1 -2
  102. package/dist/src/ua_reference_type_impl.js.map +1 -1
  103. package/dist/src/ua_variable_impl.d.ts +9 -11
  104. package/dist/src/ua_variable_impl.js +103 -65
  105. package/dist/src/ua_variable_impl.js.map +1 -1
  106. package/dist/src/ua_variable_impl_ext_obj.d.ts +6 -6
  107. package/dist/src/ua_variable_impl_ext_obj.js +33 -22
  108. package/dist/src/ua_variable_impl_ext_obj.js.map +1 -1
  109. package/dist/src/ua_variable_type_impl.js +6 -2
  110. package/dist/src/ua_variable_type_impl.js.map +1 -1
  111. package/dist/tsconfig_base.tsbuildinfo +1 -1
  112. package/distHelpers/add_event_generator_object.js +3 -0
  113. package/distHelpers/add_event_generator_object.js.map +1 -1
  114. package/distHelpers/boiler_system.js +27 -6
  115. package/distHelpers/boiler_system.js.map +1 -1
  116. package/distHelpers/create_minimalist_address_space_nodeset.js +3 -3
  117. package/distHelpers/create_minimalist_address_space_nodeset.js.map +1 -1
  118. package/distHelpers/date_utils.js.map +1 -1
  119. package/distHelpers/dump_statemachine.js +1 -1
  120. package/distHelpers/dump_statemachine.js.map +1 -1
  121. package/distHelpers/get_address_space_fixture.js +0 -1
  122. package/distHelpers/get_address_space_fixture.js.map +1 -1
  123. package/package.json +41 -41
  124. package/source/address_space_ts.ts +19 -9
  125. package/source/helpers/argument_list.ts +2 -2
  126. package/source/helpers/call_helpers.ts +4 -1
  127. package/source/helpers/dump_tools.ts +7 -3
  128. package/source/helpers/make_optionals_map.ts +4 -2
  129. package/source/interfaces/alarms_and_conditions/ua_acknowledgeable_condition_ex.ts +4 -3
  130. package/source/interfaces/alarms_and_conditions/ua_alarm_condition_ex.ts +10 -11
  131. package/source/interfaces/alarms_and_conditions/ua_condition_ex.ts +6 -7
  132. package/source/interfaces/extension_object_constructor.ts +1 -1
  133. package/source/interfaces/state_machine/ua_program_state_machine_type.ts +0 -1
  134. package/source/interfaces/state_machine/ua_state_machine_type.ts +0 -1
  135. package/source/loader/decode_xml_extension_object.ts +3 -3
  136. package/source/loader/ensure_datatype_extracted.ts +6 -2
  137. package/source/loader/generateAddressSpaceRaw.ts +5 -4
  138. package/source/loader/load_nodeset2.ts +12 -8
  139. package/source/loader/make_xml_extension_object_parser.ts +78 -45
  140. package/source/loader/namespace_post_step.ts +1 -1
  141. package/source/loader/parsers/extension_object_parser.ts +36 -27
  142. package/source/loader/parsers/localized_text_parser.ts +1 -1
  143. package/source/loader/parsers/nodeid_parser.ts +10 -2
  144. package/source/loader/parsers/qualified_name_parser.ts +1 -1
  145. package/source/loader/parsers/variant_parser.ts +53 -40
  146. package/source/pseudo_session.ts +81 -28
  147. package/source/session_context.ts +28 -19
  148. package/source/xml_writer.ts +1 -1
  149. package/src/_instantiate_helpers.ts +0 -3
  150. package/src/_mandatory_child_or_requested_optional_filter.ts +3 -4
  151. package/src/address_space.ts +58 -42
  152. package/src/address_space_private.ts +2 -0
  153. package/src/alarms_and_conditions/condition_snapshot_impl.ts +6 -10
  154. package/src/alarms_and_conditions/ua_acknowledgeable_condition_impl.ts +5 -7
  155. package/src/alarms_and_conditions/ua_alarm_condition_impl.ts +20 -13
  156. package/src/alarms_and_conditions/ua_base_event_impl.ts +1 -1
  157. package/src/alarms_and_conditions/ua_certificate_expiration_alarm_impl.ts +1 -1
  158. package/src/alarms_and_conditions/ua_condition_impl.ts +12 -10
  159. package/src/alarms_and_conditions/ua_discrete_alarm_impl.ts +8 -5
  160. package/src/alarms_and_conditions/ua_non_exclusive_limit_alarm_impl.ts +0 -1
  161. package/src/alarms_and_conditions/ua_off_normal_alarm_impl.ts +0 -1
  162. package/src/apply_condition_refresh.ts +1 -1
  163. package/src/base_node_impl.ts +30 -35
  164. package/src/base_node_private.ts +0 -6
  165. package/src/extension_object_array_node.ts +44 -15
  166. package/src/get_basic_datatype.ts +4 -1
  167. package/src/historical_access/address_space_historical_data_node.ts +2 -5
  168. package/src/namespace_impl.ts +24 -17
  169. package/src/nodeid_manager.ts +8 -11
  170. package/src/nodeset_tools/construct_namespace_dependency.ts +18 -15
  171. package/src/nodeset_tools/dump_to_bsd.ts +6 -8
  172. package/src/nodeset_tools/nodeset_to_xml.ts +105 -75
  173. package/src/private_namespace.ts +7 -2
  174. package/src/reference_impl.ts +11 -10
  175. package/src/state_machine/finite_state_machine.ts +12 -10
  176. package/src/state_machine/ua_shelving_state_machine_ex.ts +4 -4
  177. package/src/state_machine/ua_two_state_variable.ts +12 -9
  178. package/src/tool_isSubtypeOf.ts +2 -9
  179. package/src/ua_data_type_impl.ts +4 -4
  180. package/src/ua_method_impl.ts +24 -14
  181. package/src/ua_object_type_impl.ts +12 -6
  182. package/src/ua_reference_type_impl.ts +2 -3
  183. package/src/ua_variable_impl.ts +142 -96
  184. package/src/ua_variable_impl_ext_obj.ts +110 -82
  185. package/src/ua_variable_type_impl.ts +17 -5
@@ -150,17 +150,24 @@ export class PseudoSession implements IBasicSession {
150
150
  public browse(nodesToBrowse: BrowseDescriptionLike[], callback: ResponseCallback<BrowseResult[]>): void;
151
151
  public browse(nodeToBrowse: BrowseDescriptionLike): Promise<BrowseResult>;
152
152
  public browse(nodesToBrowse: BrowseDescriptionLike[]): Promise<BrowseResult[]>;
153
- public browse(nodesToBrowse: BrowseDescriptionLike | BrowseDescriptionLike[], callback?: ResponseCallback<any>): any {
153
+ public browse(
154
+ nodesToBrowse: BrowseDescriptionLike | BrowseDescriptionLike[],
155
+ callback?: ResponseCallback<BrowseResult> | ResponseCallback<BrowseResult[]>
156
+ // biome-ignore lint/suspicious/noConfusingVoidType: implementation must satisfy both the void (callback) and Promise<T> (thenify-wrapped) overloads; biome's suggested undefined-in-union fix breaks the "not all code paths return a value" check
157
+ ): void | Promise<BrowseResult> | Promise<BrowseResult[]> {
154
158
  const isArray = Array.isArray(nodesToBrowse);
155
159
  if (!isArray) {
156
- return this.browse([nodesToBrowse as BrowseDescriptionLike], (err, results) => {
157
- return callback?.(err, results ? results[0] : undefined);
160
+ const callbackSingle = callback as ResponseCallback<BrowseResult> | undefined;
161
+ this.browse([nodesToBrowse as BrowseDescriptionLike], (err, results) => {
162
+ callbackSingle?.(err, results ? results[0] : undefined);
158
163
  });
164
+ return;
159
165
  }
166
+ const callbackArray = callback as ResponseCallback<BrowseResult[]> | undefined;
160
167
  const browseAll = (nodesToBrowse: BrowseDescriptionOptions[], callack: ResponseCallback<BrowseResult[]>) => {
161
168
  const results: BrowseResult[] = [];
162
169
  for (const browseDescription of nodesToBrowse as BrowseDescriptionOptions[]) {
163
- browseDescription.referenceTypeId = resolveNodeId(browseDescription.referenceTypeId!);
170
+ browseDescription.referenceTypeId = resolveNodeId(browseDescription.referenceTypeId || NodeId.nullNodeId);
164
171
  const _browseDescription = coerceBrowseDescription(browseDescription);
165
172
  const nodeId = resolveNodeId(_browseDescription.nodeId);
166
173
  const r = this[$addressSpace].browseSingleNode(nodeId, _browseDescription, this[$context]);
@@ -179,7 +186,7 @@ export class PseudoSession implements IBasicSession {
179
186
  maxBrowseContinuationPoints: this.maxBrowseContinuationPoints
180
187
  },
181
188
  nodesToBrowse as BrowseDescriptionOptions[],
182
- callback
189
+ callbackArray
183
190
  );
184
191
  });
185
192
  }
@@ -188,7 +195,11 @@ export class PseudoSession implements IBasicSession {
188
195
  public read(nodesToRead: ReadValueIdOptions[], callback: ResponseCallback<DataValue[]>): void;
189
196
  public read(nodeToRead: ReadValueIdOptions): Promise<DataValue>;
190
197
  public read(nodesToRead: ReadValueIdOptions[]): Promise<DataValue[]>;
191
- public read(nodesToRead: ReadValueIdOptions[] | ReadValueIdOptions, callback?: ResponseCallback<any>): any {
198
+ public read(
199
+ nodesToRead: ReadValueIdOptions[] | ReadValueIdOptions,
200
+ callback?: ResponseCallback<DataValue> | ResponseCallback<DataValue[]>
201
+ // biome-ignore lint/suspicious/noConfusingVoidType: implementation must satisfy both the void (callback) and Promise<T> (thenify-wrapped) overloads; biome's suggested undefined-in-union fix breaks the "not all code paths return a value" check
202
+ ): void | Promise<DataValue> | Promise<DataValue[]> {
192
203
  const isArray = Array.isArray(nodesToRead);
193
204
  if (!isArray) {
194
205
  nodesToRead = [nodesToRead as ReadValueIdOptions];
@@ -197,7 +208,10 @@ export class PseudoSession implements IBasicSession {
197
208
  const context = this[$context];
198
209
 
199
210
  const readV = async (nodeToRead: ReadValueIdOptions): Promise<DataValue> => {
200
- const obj = this[$addressSpace].findNode(nodeToRead.nodeId!);
211
+ if (!nodeToRead.nodeId) {
212
+ return new DataValue({ statusCode: StatusCodes.BadNodeIdUnknown });
213
+ }
214
+ const obj = this[$addressSpace].findNode(nodeToRead.nodeId);
201
215
  if (!obj) {
202
216
  return new DataValue({ statusCode: StatusCodes.BadNodeIdUnknown });
203
217
  }
@@ -206,15 +220,23 @@ export class PseudoSession implements IBasicSession {
206
220
  return await (obj as UAVariable).readValueAsync(context);
207
221
  }
208
222
  assert(!!nodeToRead.nodeId, "expecting a nodeId");
209
- assert(!!nodeToRead.attributeId, "expecting a attributeId");
210
- const attributeId = nodeToRead.attributeId!;
223
+ if (!nodeToRead.attributeId) {
224
+ throw new Error("expecting a attributeId");
225
+ }
226
+ const attributeId = nodeToRead.attributeId;
211
227
  const indexRange = nodeToRead.indexRange;
212
228
  const dataEncoding = nodeToRead.dataEncoding;
213
229
  const dataValue = obj.readAttribute(context, attributeId, indexRange, dataEncoding);
214
230
  return dataValue;
215
231
  };
216
232
  Promise.all(_nodesToRead.map(async (nodeToRead: ReadValueIdOptions) => await readV(nodeToRead)))
217
- .then((dataValues) => callback?.(null, isArray ? dataValues : dataValues[0]))
233
+ .then((dataValues) => {
234
+ if (isArray) {
235
+ (callback as ResponseCallback<DataValue[]> | undefined)?.(null, dataValues);
236
+ } else {
237
+ (callback as ResponseCallback<DataValue> | undefined)?.(null, dataValues[0]);
238
+ }
239
+ })
218
240
  .catch((err) => callback?.(err));
219
241
  }
220
242
 
@@ -236,22 +258,26 @@ export class PseudoSession implements IBasicSession {
236
258
  public browseNext(
237
259
  continuationPoints: Buffer | Buffer[],
238
260
  releaseContinuationPoints: boolean,
239
- callback?: ResponseCallback<any>
240
- ): any {
261
+ callback?: ResponseCallback<BrowseResult> | ResponseCallback<BrowseResult[]>
262
+ // biome-ignore lint/suspicious/noConfusingVoidType: implementation must satisfy both the void (callback) and Promise<T> (thenify-wrapped) overloads; biome's suggested undefined-in-union fix breaks the "not all code paths return a value" check
263
+ ): void | Promise<BrowseResult> | Promise<BrowseResult[]> {
241
264
  setImmediate(() => {
242
265
  if (continuationPoints instanceof Buffer) {
243
- return this.browseNext([continuationPoints], releaseContinuationPoints, (err, _results) => {
266
+ const callbackSingle = callback as ResponseCallback<BrowseResult> | undefined;
267
+ this.browseNext([continuationPoints], releaseContinuationPoints, (err, _results) => {
244
268
  if (err) {
245
- return callback?.(err);
269
+ callbackSingle?.(err);
270
+ return;
246
271
  }
247
- callback?.(null, _results?.[0]);
272
+ callbackSingle?.(null, _results?.[0]);
248
273
  });
274
+ return;
249
275
  }
250
276
  innerBrowseNext(
251
277
  { continuationPointManager: this.continuationPointManager },
252
278
  continuationPoints as Buffer[],
253
279
  releaseContinuationPoints,
254
- callback
280
+ callback as ResponseCallback<BrowseResult[]> | undefined
255
281
  );
256
282
  });
257
283
  }
@@ -261,7 +287,11 @@ export class PseudoSession implements IBasicSession {
261
287
  public call(methodsToCall: CallMethodRequestLike[], callback: ResponseCallback<CallMethodResult[]>): void;
262
288
  public call(methodToCall: CallMethodRequestLike): Promise<CallMethodResult>;
263
289
  public call(methodsToCall: CallMethodRequestLike[]): Promise<CallMethodResult[]>;
264
- public call(methodsToCall: CallMethodRequestLike | CallMethodRequestLike[], callback?: ResponseCallback<any>): any {
290
+ public call(
291
+ methodsToCall: CallMethodRequestLike | CallMethodRequestLike[],
292
+ callback?: ResponseCallback<CallMethodResult> | ResponseCallback<CallMethodResult[]>
293
+ // biome-ignore lint/suspicious/noConfusingVoidType: implementation must satisfy both the void (callback) and Promise<T> (thenify-wrapped) overloads; biome's suggested undefined-in-union fix breaks the "not all code paths return a value" check
294
+ ): void | Promise<CallMethodResult> | Promise<CallMethodResult[]> {
265
295
  const isArray = Array.isArray(methodsToCall);
266
296
  if (!isArray) {
267
297
  methodsToCall = [methodsToCall as CallMethodRequestLike];
@@ -281,7 +311,11 @@ export class PseudoSession implements IBasicSession {
281
311
  })
282
312
  )
283
313
  .then((callMethodResults) => {
284
- callback?.(null, isArray ? callMethodResults : callMethodResults[0]);
314
+ if (isArray) {
315
+ (callback as ResponseCallback<CallMethodResult[]> | undefined)?.(null, callMethodResults);
316
+ } else {
317
+ (callback as ResponseCallback<CallMethodResult> | undefined)?.(null, callMethodResults[0]);
318
+ }
285
319
  })
286
320
  .catch((err) => {
287
321
  callback?.(err);
@@ -290,7 +324,11 @@ export class PseudoSession implements IBasicSession {
290
324
 
291
325
  public getArgumentDefinition(methodId: MethodId): Promise<ArgumentDefinition>;
292
326
  public getArgumentDefinition(methodId: MethodId, callback: ResponseCallback<ArgumentDefinition>): void;
293
- public getArgumentDefinition(methodId: MethodId, callback?: ResponseCallback<ArgumentDefinition>): any {
327
+ public getArgumentDefinition(
328
+ methodId: MethodId,
329
+ callback?: ResponseCallback<ArgumentDefinition>
330
+ // biome-ignore lint/suspicious/noConfusingVoidType: implementation must satisfy both the void (callback) and Promise<T> (thenify-wrapped) overloads; biome's suggested undefined-in-union fix breaks the "not all code paths return a value" check
331
+ ): void | Promise<ArgumentDefinition> {
294
332
  getArgumentDefinitionHelper(this, methodId)
295
333
  .then((result) => {
296
334
  callback?.(null, result);
@@ -304,7 +342,11 @@ export class PseudoSession implements IBasicSession {
304
342
  public translateBrowsePath(browsePath: BrowsePath, callback: ResponseCallback<BrowsePathResult>): void;
305
343
  public translateBrowsePath(browsePath: BrowsePath): Promise<BrowsePathResult>;
306
344
  public translateBrowsePath(browsePaths: BrowsePath[]): Promise<BrowsePathResult[]>;
307
- public translateBrowsePath(browsePaths: BrowsePath[] | BrowsePath, callback?: ResponseCallback<any>): any {
345
+ public translateBrowsePath(
346
+ browsePaths: BrowsePath[] | BrowsePath,
347
+ callback?: ResponseCallback<BrowsePathResult> | ResponseCallback<BrowsePathResult[]>
348
+ // biome-ignore lint/suspicious/noConfusingVoidType: implementation must satisfy both the void (callback) and Promise<T> (thenify-wrapped) overloads; biome's suggested undefined-in-union fix breaks the "not all code paths return a value" check
349
+ ): void | Promise<BrowsePathResult> | Promise<BrowsePathResult[]> {
308
350
  const isArray = Array.isArray(browsePaths);
309
351
  if (!isArray) {
310
352
  browsePaths = [browsePaths as BrowsePath];
@@ -312,23 +354,32 @@ export class PseudoSession implements IBasicSession {
312
354
  const browsePathResults = (browsePaths as BrowsePath[]).map((browsePath: BrowsePath) => {
313
355
  return this[$addressSpace].browsePath(browsePath);
314
356
  });
315
- callback?.(null, isArray ? browsePathResults : browsePathResults[0]);
357
+ if (isArray) {
358
+ (callback as ResponseCallback<BrowsePathResult[]> | undefined)?.(null, browsePathResults);
359
+ } else {
360
+ (callback as ResponseCallback<BrowsePathResult> | undefined)?.(null, browsePathResults[0]);
361
+ }
316
362
  }
317
363
  public write(nodeToWrite: WriteValueOptions, callback: ResponseCallback<StatusCode>): void;
318
364
  public write(nodesToWrite: WriteValueOptions[], callback: ResponseCallback<StatusCode[]>): void;
319
365
  public write(nodeToWrite: WriteValueOptions): Promise<StatusCode>;
320
366
  public write(nodesToWrite: WriteValueOptions[]): Promise<StatusCode[]>;
321
- public write(nodesToWrite: WriteValueOptions[] | WriteValueOptions, callback?: ResponseCallback<any>): any {
367
+ public write(
368
+ nodesToWrite: WriteValueOptions[] | WriteValueOptions,
369
+ callback?: ResponseCallback<StatusCode> | ResponseCallback<StatusCode[]>
370
+ // biome-ignore lint/suspicious/noConfusingVoidType: implementation must satisfy both the void (callback) and Promise<T> (thenify-wrapped) overloads; biome's suggested undefined-in-union fix breaks the "not all code paths return a value" check
371
+ ): void | Promise<StatusCode> | Promise<StatusCode[]> {
322
372
  const isArray = Array.isArray(nodesToWrite);
323
373
  const _nodesToWrite: WriteValueOptions[] = !isArray ? [nodesToWrite] : nodesToWrite;
324
374
  const context = this[$context];
325
375
  setImmediate(() => {
326
376
  const statusCodesPromises = _nodesToWrite.map((nodeToWrite: WriteValueOptions) => {
327
- assert(!!nodeToWrite.nodeId, "expecting a nodeId");
328
377
  assert(!!nodeToWrite.attributeId, "expecting a attributeId");
329
378
 
330
- const nodeId = nodeToWrite.nodeId!;
331
- const obj = this[$addressSpace].findNode(nodeId);
379
+ if (!nodeToWrite.nodeId) {
380
+ return StatusCodes.BadNodeIdUnknown;
381
+ }
382
+ const obj = this[$addressSpace].findNode(nodeToWrite.nodeId);
332
383
  if (!obj) {
333
384
  return StatusCodes.BadNodeIdUnknown;
334
385
  }
@@ -340,7 +391,11 @@ export class PseudoSession implements IBasicSession {
340
391
  });
341
392
  Promise.all(statusCodesPromises)
342
393
  .then((statusCodes) => {
343
- callback?.(null, isArray ? statusCodes : statusCodes[0]);
394
+ if (isArray) {
395
+ (callback as ResponseCallback<StatusCode[]> | undefined)?.(null, statusCodes as StatusCode[]);
396
+ } else {
397
+ (callback as ResponseCallback<StatusCode> | undefined)?.(null, statusCodes[0]);
398
+ }
344
399
  })
345
400
  .catch((err) => {
346
401
  callback?.(err);
@@ -349,8 +404,6 @@ export class PseudoSession implements IBasicSession {
349
404
  }
350
405
  }
351
406
 
352
- // tslint:disable:no-var-requires
353
- // tslint:disable:max-line-length
354
407
  import { withCallback } from "thenify-ex";
355
408
 
356
409
  PseudoSession.prototype.read = withCallback(PseudoSession.prototype.read);
@@ -70,6 +70,7 @@ function getUserName(userIdentityToken: AnyUserIdentityToken): string {
70
70
  // The canonical definition now lives in node-opcua-constants so that
71
71
  // client-side packages can use it without pulling in address-space.
72
72
  import { WellKnownRoles } from "node-opcua-constants";
73
+
73
74
  export { WellKnownRoles } from "node-opcua-constants";
74
75
 
75
76
  /** @deprecated Use WellKnownRoles instead */
@@ -244,28 +245,36 @@ function getDefaultUserRolePermissionsOnNamespace(
244
245
  }
245
246
 
246
247
  const namespaces = namespace.addressSpace.rootFolder?.objects?.server?.namespaces;
247
- if (!namespaces) {
248
- return null;
249
- }
250
- const uaNamespaceObject = namespaces.getChildByName(namespace.namespaceUri);
251
- if (!uaNamespaceObject) {
252
- return null;
253
- }
254
- const defaultUserRolePermissions = uaNamespaceObject.getChildByName("DefaultUserRolePermissions") as UAVariable;
255
- if (defaultUserRolePermissions) {
256
- const dataValue = defaultUserRolePermissions.readValue();
257
- if (dataValue?.statusCode.isGood() && dataValue.value.value && dataValue.value.value.length > 0) {
258
- return dataValue.value.value as RolePermissionType[];
248
+ const uaNamespaceObject = namespaces?.getChildByName(namespace.namespaceUri);
249
+ if (uaNamespaceObject) {
250
+ // DefaultUserRolePermissions is the user-specific policy and wins when it carries a value.
251
+ const defaultUserRolePermissions = uaNamespaceObject.getChildByName("DefaultUserRolePermissions") as UAVariable;
252
+ if (defaultUserRolePermissions) {
253
+ const dataValue = defaultUserRolePermissions.readValue();
254
+ if (dataValue?.statusCode.isGood() && dataValue.value.value && dataValue.value.value.length > 0) {
255
+ return dataValue.value.value as RolePermissionType[];
256
+ }
259
257
  }
260
- }
261
- const defaultRolePermissions = uaNamespaceObject.getChildByName("DefaultRolePermissions") as UAVariable;
262
- if (defaultRolePermissions) {
263
- const dataValue = defaultRolePermissions.readValue();
264
- if (dataValue?.statusCode.isGood()) {
265
- return dataValue.value.value as RolePermissionType[] | null;
258
+ const defaultRolePermissions = uaNamespaceObject.getChildByName("DefaultRolePermissions") as UAVariable;
259
+ if (defaultRolePermissions) {
260
+ const dataValue = defaultRolePermissions.readValue();
261
+ const value = dataValue?.value?.value as RolePermissionType[] | null | undefined;
262
+ // Honour a real value only. The metadata node is left Null-typed (value === null)
263
+ // unless setNamespaceMetaData() bound it, so a null must fall through to the
264
+ // namespace policy below instead of short-circuiting the whole lookup to null.
265
+ if (dataValue?.statusCode.isGood() && value !== null && value !== undefined) {
266
+ return value;
267
+ }
266
268
  }
267
269
  }
268
- return null;
270
+
271
+ // Fall back to the policy configured programmatically via Namespace.setDefaultRolePermissions().
272
+ // The NamespaceMetadata node is only bound to that field when setNamespaceMetaData() is called
273
+ // (which throws on NodeSet2-loaded namespaces), and is absent entirely for a programmatically
274
+ // created namespace. Consulting the field here keeps the configured default consistent between
275
+ // the local getter (BaseNode.getRolePermissions(inherited=true)) and this enforcement path,
276
+ // so setDefaultRolePermissions() takes effect without also requiring setNamespaceMetaData().
277
+ return namespace.getDefaultRolePermissions();
269
278
  }
270
279
 
271
280
  /**
@@ -3,7 +3,7 @@ export type TranslationTable = Map<number, number>;
3
3
  export interface XmlWriter {
4
4
  translationTable: TranslationTable;
5
5
  priorityTable: number[];
6
- visitedNode: Set<any>;
6
+ visitedNode: Set<string>;
7
7
 
8
8
  startDocument(options: { encoding: string; version: string }): void;
9
9
  startElement(elementName: string): this;
@@ -1,8 +1,6 @@
1
1
  /**
2
2
  * @module node-opcua-address-space
3
3
  */
4
- // tslint:disable:max-classes-per-file
5
- // tslint:disable:no-console
6
4
  import chalk from "chalk";
7
5
  import {
8
6
  CloneHelper,
@@ -26,7 +24,6 @@ import { _clone_hierarchical_references } from "./base_node_private";
26
24
  const warningLog = make_warningLog("INSTANTIATE");
27
25
  const errorLog = make_errorLog("INSTANTIATE");
28
26
 
29
- // eslint-disable-next-line prefer-const
30
27
  const doTrace = checkDebugFlag("INSTANTIATE");
31
28
  const traceLog = errorLog;
32
29
 
@@ -18,20 +18,19 @@ const errorLog = make_errorLog(__filename);
18
18
  const doTrace = checkDebugFlag("INSTANTIATE");
19
19
  const traceLog = errorLog;
20
20
 
21
- export type OptionalMap = Record<string, string | Record<string, any>>;
21
+ export interface OptionalMap {
22
+ [key: string]: OptionalMap;
23
+ }
22
24
  export class MandatoryChildOrRequestedOptionalFilter implements CloneFilter {
23
25
  private readonly optionalsMap: OptionalMap;
24
26
  private readonly references: UAReference[];
25
27
  private readonly copyAlsoAllOptionals: boolean = false;
26
28
 
27
- private readonly _instance: BaseNode;
28
-
29
29
  constructor(instance: BaseNode, copyAlsoAllOptionals: boolean, optionalsMap: OptionalMap) {
30
30
  this.copyAlsoAllOptionals = copyAlsoAllOptionals;
31
31
  // should we clone the node to be a component or propertyOf of a instance
32
32
  assert(null !== instance);
33
33
  this.optionalsMap = optionalsMap;
34
- this._instance = instance;
35
34
  this.references = instance.findReferencesEx("Aggregates", BrowseDirection.Forward);
36
35
  }
37
36
 
@@ -9,6 +9,8 @@ import type {
9
9
  IEventData,
10
10
  IHistoricalDataNodeOptions,
11
11
  ISessionContext,
12
+ IVariableHistorian,
13
+ IVariableHistorianOptions,
12
14
  MethodCallInterceptor,
13
15
  RaiseEventData,
14
16
  ShutdownTask,
@@ -75,7 +77,6 @@ const errorLog = make_errorLog(__filename);
75
77
  const debugLog = make_debugLog(__filename);
76
78
  const warningLog = make_warningLog(__filename);
77
79
 
78
- // tslint:disable-next-line:no-var-requires
79
80
  const Dequeue = require("dequeue");
80
81
 
81
82
  const regexNumberColumnString = /^([0-9]+):(.*)/;
@@ -152,6 +153,10 @@ function isNodeIdString(str: unknown): boolean {
152
153
  *
153
154
  * const addressSpace = AddressSpace.create();
154
155
  */
156
+ export interface IHistorizerFactory {
157
+ create(node: UAVariable, options: IVariableHistorianOptions): IVariableHistorian;
158
+ }
159
+
155
160
  export class AddressSpace implements AddressSpacePrivate {
156
161
  public get rootFolder(): UARootFolder {
157
162
  const rootFolder = this.findNode(this.resolveNodeId("RootFolder"));
@@ -163,7 +168,7 @@ export class AddressSpace implements AddressSpacePrivate {
163
168
  }
164
169
 
165
170
  public static isNonEmptyQualifiedName = isNonEmptyQualifiedName;
166
- public static historizerFactory?: any;
171
+ public static historizerFactory?: IHistorizerFactory;
167
172
 
168
173
  public static create(): AddressSpace {
169
174
  return new AddressSpace();
@@ -184,6 +189,8 @@ export class AddressSpace implements AddressSpacePrivate {
184
189
  private readonly _private_namespaceIndex: number;
185
190
  private readonly _namespaceArray: NamespacePrivate[];
186
191
  private _shutdownTask?: ShutdownTask[];
192
+ private _eventIdCounter?: Buffer;
193
+ public $$extraDataTypeManager?: ExtraDataTypeManager;
187
194
  private _modelChangeTransactionCounter = 0;
188
195
  private _modelChanges: ModelChangeStructureDataType[] = [];
189
196
  public _methodCallInterceptors: MethodCallInterceptor[] = [];
@@ -213,12 +220,10 @@ export class AddressSpace implements AddressSpacePrivate {
213
220
  * @internal
214
221
  */
215
222
  public getDataTypeManager(): ExtraDataTypeManager {
216
- const addressSpacePriv: any = this as any;
217
- assert(
218
- addressSpacePriv.$$extraDataTypeManager,
219
- "expecting a $$extraDataTypeManager please make sure ensureDatatypeExtracted is called"
220
- );
221
- return addressSpacePriv.$$extraDataTypeManager;
223
+ if (!this.$$extraDataTypeManager) {
224
+ throw new Error("expecting a $$extraDataTypeManager please make sure ensureDatatypeExtracted is called");
225
+ }
226
+ return this.$$extraDataTypeManager;
222
227
  }
223
228
 
224
229
  public getNamespaceUri(namespaceIndex: number): string {
@@ -283,7 +288,7 @@ export class AddressSpace implements AddressSpacePrivate {
283
288
  public registerNamespace(namespaceUri: string): NamespacePrivate {
284
289
  let index = this._namespaceArray.findIndex((ns) => ns.namespaceUri === namespaceUri);
285
290
  if (index !== -1) {
286
- assert((this._namespaceArray[index].addressSpace as any) === (this as any));
291
+ assert(this._namespaceArray[index].addressSpace === this);
287
292
  return this._namespaceArray[index];
288
293
  }
289
294
  index = this._namespaceArray.length;
@@ -454,7 +459,7 @@ export class AddressSpace implements AddressSpacePrivate {
454
459
  if (dataType instanceof UADataTypeImpl) {
455
460
  return this.findDataType(dataType.nodeId);
456
461
  } else if (dataType instanceof NodeId) {
457
- return _find_by_node_id<UADataType>(this, dataType!, namespaceIndex);
462
+ return _find_by_node_id<UADataType>(this, dataType, namespaceIndex);
458
463
  }
459
464
  if (typeof dataType === "number") {
460
465
  if (DataType[dataType] !== undefined) {
@@ -492,11 +497,12 @@ export class AddressSpace implements AddressSpacePrivate {
492
497
  }
493
498
 
494
499
  if (dataTypeNode instanceof NodeId) {
495
- dataTypeNode = this.findDataType(dataTypeNode)!;
500
+ const foundDataTypeNode = this.findDataType(dataTypeNode);
496
501
  /* c8 ignore next */
497
- if (!dataTypeNode) {
502
+ if (!foundDataTypeNode) {
498
503
  throw Error(`cannot find dataTypeNode ${_orig_dataTypeNode.toString()}`);
499
504
  }
505
+ dataTypeNode = foundDataTypeNode;
500
506
  }
501
507
  /* c8 ignore next */
502
508
  if (!(dataTypeNode instanceof UADataTypeImpl)) {
@@ -669,16 +675,15 @@ export class AddressSpace implements AddressSpacePrivate {
669
675
  *
670
676
  */
671
677
  const offset = 16;
672
- const self = this as any;
673
- if (!self._eventIdCounter) {
674
- self._eventIdCounter = randomBytes(20);
675
- self._eventIdCounter.writeInt32BE(0, offset);
678
+ if (!this._eventIdCounter) {
679
+ this._eventIdCounter = randomBytes(20);
680
+ this._eventIdCounter.writeInt32BE(0, offset);
676
681
  }
677
- self._eventIdCounter.writeInt32BE(self._eventIdCounter.readInt32BE(offset) + 1, offset);
682
+ this._eventIdCounter.writeInt32BE(this._eventIdCounter.readInt32BE(offset) + 1, offset);
678
683
 
679
684
  return new Variant({
680
685
  dataType: DataType.ByteString,
681
- value: Buffer.from(self._eventIdCounter)
686
+ value: Buffer.from(this._eventIdCounter)
682
687
  }) as VariantT<Buffer, DataType.ByteString>;
683
688
  }
684
689
 
@@ -758,7 +763,7 @@ export class AddressSpace implements AddressSpacePrivate {
758
763
  throw new Error("BaseObjectType must be defined in the address space");
759
764
  }
760
765
 
761
- const hasProperty = (data: any, propertyName: string): boolean => Object.hasOwn(data, propertyName);
766
+ const hasProperty = (data: RaiseEventData, propertyName: string): boolean => Object.hasOwn(data, propertyName);
762
767
 
763
768
  const visitedProperties: { [key: string]: number } = {};
764
769
  const alreadyVisited = (key: string) => Object.hasOwn(visitedProperties, key);
@@ -781,7 +786,6 @@ export class AddressSpace implements AddressSpacePrivate {
781
786
  // c8 ignore next
782
787
  if (doDebug) {
783
788
  if (node.modellingRule === "Mandatory") {
784
- // tslint:disable:no-console
785
789
  errorLog(
786
790
  chalk.red("ERROR : AddressSpace#constructEventData(eventType,options) " + "cannot find property ") +
787
791
  self.browseName.toString() +
@@ -822,7 +826,7 @@ export class AddressSpace implements AddressSpacePrivate {
822
826
  });
823
827
  }
824
828
 
825
- const populate_data = (self: any, eventData1: any) => {
829
+ const populate_data = (self: UAObjectType, eventData1: EventData) => {
826
830
  if (sameNodeId(baseObjectType?.nodeId, self.nodeId)) {
827
831
  return; // nothing to do
828
832
  }
@@ -839,7 +843,8 @@ export class AddressSpace implements AddressSpacePrivate {
839
843
  throw new Error(chalk.red("Cannot find object with nodeId ") + baseTypeNodeId);
840
844
  }
841
845
 
842
- populate_data(baseType, eventData1);
846
+ // subtypeOf always points to another node in the ObjectType hierarchy
847
+ populate_data(baseType as UAObjectType, eventData1);
843
848
 
844
849
  // get properties and components from base class
845
850
  const properties = self.getProperties();
@@ -853,7 +858,7 @@ export class AddressSpace implements AddressSpacePrivate {
853
858
 
854
859
  for (const node of children) {
855
860
  // only keep those that have a "HasModellingRule"
856
- if (!(node as any).modellingRule) {
861
+ if (!node.modellingRule) {
857
862
  continue;
858
863
  }
859
864
  // ignore also methods
@@ -1022,21 +1027,26 @@ export class AddressSpace implements AddressSpacePrivate {
1022
1027
  const _dataType = dataType as UADataTypeImpl;
1023
1028
 
1024
1029
  // to do verify that dataType is of type "Structure"
1030
+ const structureDataType = this.findDataType("Structure");
1025
1031
  /* c8 ignore next */
1026
- if (!_dataType.isSubtypeOf(this.findDataType("Structure")!)) {
1027
- debugLog(_dataType.toString());
1032
+ if (!structureDataType) {
1033
+ throw new Error("getExtensionObjectConstructor: cannot find 'Structure' DataType in standard address Space");
1028
1034
  }
1029
- assert(_dataType.isSubtypeOf(this.findDataType("Structure")!));
1035
+ /* c8 ignore next */
1036
+ if (!_dataType.isSubtypeOf(structureDataType)) {
1037
+ // c8 ignore next
1038
+ doDebug && debugLog(_dataType.toString());
1039
+ }
1040
+ assert(_dataType.isSubtypeOf(structureDataType));
1030
1041
  if (!_dataType._extensionObjectConstructor) {
1031
- const addressSpacePriv: any = this as any;
1032
- if (!addressSpacePriv.$$extraDataTypeManager) {
1042
+ if (!this.$$extraDataTypeManager) {
1033
1043
  throw new Error(
1034
1044
  `getExtensionObjectConstructor: cannot build a constructor for ${_dataType.browseName.toString()} (${_dataType.nodeId.toString()}): ` +
1035
1045
  "the DataType manager is not initialised. " +
1036
1046
  "Make sure generateAddressSpace() completed successfully and/or that ensureDatatypeExtracted(addressSpace) was awaited before using structured DataTypes."
1037
1047
  );
1038
1048
  }
1039
- const dataTypeManager = addressSpacePriv.$$extraDataTypeManager as ExtraDataTypeManager;
1049
+ const dataTypeManager = this.$$extraDataTypeManager;
1040
1050
  _dataType._extensionObjectConstructor = dataTypeManager.getExtensionObjectConstructorFromDataType(
1041
1051
  _dataType.nodeId
1042
1052
  ) as ExtensionObjectConstructorFuncWithSchema;
@@ -1153,7 +1163,7 @@ export class AddressSpace implements AddressSpacePrivate {
1153
1163
  // check if referenceTypeId is correct
1154
1164
  if (browseDescription.referenceTypeId instanceof NodeId) {
1155
1165
  if (browseDescription.referenceTypeId.value === 0) {
1156
- (browseDescription as any).referenceTypeId = null;
1166
+ (browseDescription as unknown as { referenceTypeId: NodeId | null }).referenceTypeId = null;
1157
1167
  } else {
1158
1168
  const rf = this.findNode(browseDescription.referenceTypeId);
1159
1169
  if (!rf || !(rf instanceof UAReferenceTypeImpl)) {
@@ -1185,7 +1195,7 @@ export class AddressSpace implements AddressSpacePrivate {
1185
1195
  if (folder && !_isFolder(this, folder)) {
1186
1196
  throw new Error(`Parent folder must be of FolderType ${folder.typeDefinition.toString()}`);
1187
1197
  }
1188
- return folder as any as BaseNode;
1198
+ return folder;
1189
1199
  }
1190
1200
 
1191
1201
  /**
@@ -1214,7 +1224,7 @@ export class AddressSpace implements AddressSpacePrivate {
1214
1224
  public extractRootViews(node: UAObject | UAVariable): UAView[] {
1215
1225
  assert(node.nodeClass === NodeClass.Object || node.nodeClass === NodeClass.Variable);
1216
1226
 
1217
- const visitedMap: any = {};
1227
+ const visitedMap: Record<string, BaseNode> = {};
1218
1228
 
1219
1229
  const q = new Dequeue();
1220
1230
  q.push(node);
@@ -1275,9 +1285,9 @@ export class AddressSpace implements AddressSpacePrivate {
1275
1285
 
1276
1286
  // https://github.com/you-dont-need/You-Dont-Need-Lodash-Underscore
1277
1287
  // const nodeIds = _.uniq(this._modelChanges.map((c: any) => c.affected));
1278
- const nodeIds = [...new Set(this._modelChanges.map((c: any) => c.affected))];
1288
+ const nodeIds = [...new Set(this._modelChanges.map((c) => c.affected))];
1279
1289
 
1280
- const nodes = nodeIds.map((nodeId: NodeId) => this.findNode(nodeId)!);
1290
+ const nodes = nodeIds.map((nodeId: NodeId) => this.findNode(nodeId));
1281
1291
 
1282
1292
  nodes.forEach(_increase_version_number);
1283
1293
  // raise events
@@ -1360,8 +1370,9 @@ export class AddressSpace implements AddressSpacePrivate {
1360
1370
  } else {
1361
1371
  let _nodeId = params.nodeId as NodeId;
1362
1372
  assert(!!_nodeId, "missing 'nodeId' in reference");
1363
- if (_nodeId && (_nodeId as any).nodeId) {
1364
- _nodeId = (_nodeId as any).nodeId as NodeId;
1373
+ const _nodeIdWithNodeId = _nodeId as unknown as { nodeId?: NodeId };
1374
+ if (_nodeId && _nodeIdWithNodeId.nodeId) {
1375
+ _nodeId = _nodeIdWithNodeId.nodeId;
1365
1376
  }
1366
1377
  _nodeId = resolveNodeId(_nodeId);
1367
1378
  params.nodeId = _nodeId;
@@ -1429,7 +1440,11 @@ export class AddressSpace implements AddressSpacePrivate {
1429
1440
  public _coerceTypeDefinition(typeDefinition: string | NodeId): NodeId {
1430
1441
  if (typeof typeDefinition === "string") {
1431
1442
  // coerce parent folder to an node
1432
- const typeDefinitionNode = this.findNode(typeDefinition)!;
1443
+ const typeDefinitionNode = this.findNode(typeDefinition);
1444
+ /* c8 ignore next */
1445
+ if (!typeDefinitionNode) {
1446
+ throw new Error(`_coerceTypeDefinition: cannot find node ${typeDefinition}`);
1447
+ }
1433
1448
  typeDefinition = typeDefinitionNode.nodeId;
1434
1449
  }
1435
1450
  assert(typeDefinition instanceof NodeId);
@@ -1462,12 +1477,13 @@ export class AddressSpace implements AddressSpacePrivate {
1462
1477
  if (!baseTypeNode) {
1463
1478
  throw new Error(`Cannot find ObjectType or VariableType for ${baseType.toString()}`);
1464
1479
  }
1480
+ const baseTypeNodeWithIsSubtypeOf = baseTypeNode as unknown as { isSubtypeOf?: (t: BaseNode) => boolean };
1465
1481
  /* c8 ignore next */
1466
- if (!(baseTypeNode as any).isSubtypeOf) {
1482
+ if (!baseTypeNodeWithIsSubtypeOf.isSubtypeOf) {
1467
1483
  throw new Error(`Cannot find ObjectType or VariableType for ${baseType.toString()}`);
1468
1484
  }
1469
1485
  /* c8 ignore next */
1470
- if (!(baseTypeNode as any).isSubtypeOf(topMostBaseTypeNode)) {
1486
+ if (!baseTypeNodeWithIsSubtypeOf.isSubtypeOf(topMostBaseTypeNode)) {
1471
1487
  throw new Error("wrong type ");
1472
1488
  }
1473
1489
  return baseTypeNode;
@@ -1494,7 +1510,7 @@ export class AddressSpace implements AddressSpacePrivate {
1494
1510
  throw new Error(` Cannot find DataType ${dataType.toString()} in standard address Space`);
1495
1511
  }
1496
1512
 
1497
- const enumerationNode = this.findDataType("Enumeration")!;
1513
+ const enumerationNode = this.findDataType("Enumeration");
1498
1514
  if (!enumerationNode) {
1499
1515
  throw new Error(" Cannot find 'Enumeration' DataType in standard address Space");
1500
1516
  }
@@ -1503,9 +1519,9 @@ export class AddressSpace implements AddressSpacePrivate {
1503
1519
 
1504
1520
  private _coerce_Type(
1505
1521
  dataType: BaseNode | string | NodeId | number,
1506
- typeMap: any,
1522
+ typeMap: Record<string, number | string>,
1507
1523
  typeMapName: string,
1508
- finderMethod: any
1524
+ finderMethod: (this: AddressSpace, nodeId: NodeId) => BaseNode | null
1509
1525
  ): NodeId {
1510
1526
  if (typeof dataType === "number") {
1511
1527
  return this._coerce_Type(coerceNodeId(dataType), typeMap, typeMapName, finderMethod);
@@ -36,6 +36,8 @@ export interface AddressSpacePrivate extends IAddressSpace {
36
36
 
37
37
  _condition_refresh_in_progress: boolean;
38
38
 
39
+ $$extraDataTypeManager?: ExtraDataTypeManager;
40
+
39
41
  _coerceNode(node: string | BaseNode | NodeIdLike): BaseNode | null;
40
42
 
41
43
  _coerceFolder(folder: string | BaseNode | NodeId): BaseNode | null;