node-opcua-address-space 2.77.0 → 2.79.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 (109) hide show
  1. package/dist/source/continuation_points/continuation_point_manager.d.ts +59 -0
  2. package/dist/source/continuation_points/continuation_point_manager.js +6 -6
  3. package/dist/source/continuation_points/continuation_point_manager.js.map +1 -1
  4. package/dist/source/index.d.ts +1 -0
  5. package/dist/source/index.js +1 -0
  6. package/dist/source/index.js.map +1 -1
  7. package/dist/source/loader/ensure_datatype_extracted.js +25 -0
  8. package/dist/source/loader/ensure_datatype_extracted.js.map +1 -1
  9. package/dist/source/loader/generateAddressSpaceRaw.d.ts +2 -1
  10. package/dist/source/loader/generateAddressSpaceRaw.js +2 -2
  11. package/dist/source/loader/generateAddressSpaceRaw.js.map +1 -1
  12. package/dist/source/loader/load_nodeset2.d.ts +7 -3
  13. package/dist/source/loader/load_nodeset2.js +66 -31
  14. package/dist/source/loader/load_nodeset2.js.map +1 -1
  15. package/dist/source/xml_writer.d.ts +5 -0
  16. package/dist/src/alarms_and_conditions/ua_limit_alarm_impl.d.ts +1 -1
  17. package/dist/src/base_node_impl.d.ts +1 -0
  18. package/dist/src/base_node_impl.js +30 -3
  19. package/dist/src/base_node_impl.js.map +1 -1
  20. package/dist/src/base_node_private.js +5 -0
  21. package/dist/src/base_node_private.js.map +1 -1
  22. package/dist/src/historical_access/address_space_historical_data_node.js +14 -3
  23. package/dist/src/historical_access/address_space_historical_data_node.js.map +1 -1
  24. package/dist/src/index_current.d.ts +2 -1
  25. package/dist/src/index_current.js +3 -2
  26. package/dist/src/index_current.js.map +1 -1
  27. package/dist/src/namespace_impl.d.ts +2 -0
  28. package/dist/src/namespace_impl.js +11 -1
  29. package/dist/src/namespace_impl.js.map +1 -1
  30. package/dist/src/namespace_private.d.ts +1 -0
  31. package/dist/src/namespace_private.js.map +1 -1
  32. package/dist/src/nodeid_manager.d.ts +1 -0
  33. package/dist/src/nodeid_manager.js +14 -2
  34. package/dist/src/nodeid_manager.js.map +1 -1
  35. package/dist/src/nodeset_tools/{typedictionary_to_xml.d.ts → dump_to_bsd.d.ts} +1 -1
  36. package/dist/src/nodeset_tools/{typedictionary_to_xml.js → dump_to_bsd.js} +14 -5
  37. package/dist/src/nodeset_tools/dump_to_bsd.js.map +1 -0
  38. package/dist/src/nodeset_tools/nodeset_to_xml.d.ts +9 -1
  39. package/dist/src/nodeset_tools/nodeset_to_xml.js +220 -89
  40. package/dist/src/nodeset_tools/nodeset_to_xml.js.map +1 -1
  41. package/dist/src/tool_isSupertypeOf.js +12 -2
  42. package/dist/src/tool_isSupertypeOf.js.map +1 -1
  43. package/dist/src/ua_data_type_impl.js +10 -5
  44. package/dist/src/ua_data_type_impl.js.map +1 -1
  45. package/dist/src/ua_method_impl.d.ts +2 -1
  46. package/dist/src/ua_method_impl.js +9 -1
  47. package/dist/src/ua_method_impl.js.map +1 -1
  48. package/dist/src/ua_object_impl.js +8 -1
  49. package/dist/src/ua_object_impl.js.map +1 -1
  50. package/dist/src/ua_variable_impl.d.ts +5 -0
  51. package/dist/src/ua_variable_impl.js +36 -2
  52. package/dist/src/ua_variable_impl.js.map +1 -1
  53. package/dist/src/ua_variable_impl_ext_obj.js +1 -1
  54. package/dist/src/ua_variable_impl_ext_obj.js.map +1 -1
  55. package/distHelpers/get_mini_address_space.js +1 -1
  56. package/distHelpers/get_mini_address_space.js.map +1 -1
  57. package/distNodeJS/generate_address_space.d.ts +3 -1
  58. package/distNodeJS/generate_address_space.js +13 -2
  59. package/distNodeJS/generate_address_space.js.map +1 -1
  60. package/package.json +26 -26
  61. package/source/continuation_points/continuation_point_manager.ts +13 -12
  62. package/source/index.ts +1 -0
  63. package/source/loader/ensure_datatype_extracted.ts +38 -3
  64. package/source/loader/generateAddressSpaceRaw.ts +4 -3
  65. package/source/loader/load_nodeset2.ts +86 -33
  66. package/source/xml_writer.ts +3 -0
  67. package/source_nodejs/generate_address_space.ts +27 -5
  68. package/src/alarms_and_conditions/ua_limit_alarm_impl.ts +1 -1
  69. package/src/base_node_impl.ts +34 -3
  70. package/src/base_node_private.ts +6 -0
  71. package/src/historical_access/address_space_historical_data_node.ts +18 -3
  72. package/src/index_current.ts +3 -1
  73. package/src/namespace_impl.ts +24 -1
  74. package/src/namespace_private.ts +2 -0
  75. package/src/nodeid_manager.ts +14 -5
  76. package/src/nodeset_tools/{typedictionary_to_xml.ts → dump_to_bsd.ts} +24 -14
  77. package/src/nodeset_tools/nodeset_to_xml.ts +278 -77
  78. package/src/tool_isSupertypeOf.ts +14 -2
  79. package/src/ua_data_type_impl.ts +11 -7
  80. package/src/ua_method_impl.ts +9 -3
  81. package/src/ua_object_impl.ts +12 -2
  82. package/src/ua_variable_impl.ts +42 -4
  83. package/src/ua_variable_impl_ext_obj.ts +1 -1
  84. package/test_helpers/get_mini_address_space.ts +1 -1
  85. package/test_helpers/test_fixtures/mini.Node.Set2.xml +207 -0
  86. package/test_helpers/test_fixtures/nodeset_no_aliases.xml +30 -0
  87. package/test_helpers/test_fixtures/nodeset_no_aliases_with_aliases.xml +31 -0
  88. package/dist/source/helpers/check_event_clause.d.ts +0 -17
  89. package/dist/source/helpers/check_event_clause.js +0 -53
  90. package/dist/source/helpers/check_event_clause.js.map +0 -1
  91. package/dist/src/alarms_and_conditions/check_where_clause.d.ts +0 -4
  92. package/dist/src/alarms_and_conditions/check_where_clause.js +0 -110
  93. package/dist/src/alarms_and_conditions/check_where_clause.js.map +0 -1
  94. package/dist/src/alarms_and_conditions/condition_info.d.ts +0 -27
  95. package/dist/src/alarms_and_conditions/condition_info.js +0 -55
  96. package/dist/src/alarms_and_conditions/condition_info.js.map +0 -1
  97. package/dist/src/alarms_and_conditions/condition_snapshot.d.ts +0 -233
  98. package/dist/src/alarms_and_conditions/condition_snapshot.js +0 -667
  99. package/dist/src/alarms_and_conditions/condition_snapshot.js.map +0 -1
  100. package/dist/src/alarms_and_conditions/extract_event_fields.d.ts +0 -10
  101. package/dist/src/alarms_and_conditions/extract_event_fields.js +0 -90
  102. package/dist/src/alarms_and_conditions/extract_event_fields.js.map +0 -1
  103. package/dist/src/data_access/ua_multistate_value_discrete.d.ts +0 -51
  104. package/dist/src/data_access/ua_multistate_value_discrete.js +0 -250
  105. package/dist/src/data_access/ua_multistate_value_discrete.js.map +0 -1
  106. package/dist/src/data_access/ua_two_state_discrete.d.ts +0 -25
  107. package/dist/src/data_access/ua_two_state_discrete.js +0 -154
  108. package/dist/src/data_access/ua_two_state_discrete.js.map +0 -1
  109. package/dist/src/nodeset_tools/typedictionary_to_xml.js.map +0 -1
@@ -1,11 +1,13 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.dumpXml = void 0;
4
+ /* eslint-disable complexity */
4
5
  /**
5
6
  * @module node-opcua-address-space
6
7
  */
7
8
  // produce nodeset xml files
8
9
  const node_opcua_assert_1 = require("node-opcua-assert");
10
+ const node_opcua_constants_1 = require("node-opcua-constants");
9
11
  const node_opcua_debug_1 = require("node-opcua-debug");
10
12
  const node_opcua_data_model_1 = require("node-opcua-data-model");
11
13
  const node_opcua_nodeid_1 = require("node-opcua-nodeid");
@@ -23,6 +25,7 @@ const namespace_impl_1 = require("../namespace_impl");
23
25
  const ua_method_impl_1 = require("../ua_method_impl");
24
26
  const ua_data_type_impl_1 = require("../ua_data_type_impl");
25
27
  const ua_variable_type_impl_1 = require("../ua_variable_type_impl");
28
+ const index_current_1 = require("../index_current");
26
29
  const decode_xml_extension_object_1 = require("../../source/loader/decode_xml_extension_object");
27
30
  const construct_namespace_dependency_1 = require("./construct_namespace_dependency");
28
31
  // tslint:disable:no-var-requires
@@ -63,6 +66,10 @@ function translateBrowseName(xw, browseName) {
63
66
  function b(xw, browseName) {
64
67
  return translateBrowseName(xw, browseName).toString().replace("ns=0;", "");
65
68
  }
69
+ function _dumpReverseReferences(xw, node) {
70
+ const addressSpace = node.addressSpace;
71
+ const hasSubtypeReferenceType = addressSpace.findReferenceType("HasSubtype");
72
+ }
66
73
  function _dumpReferences(xw, node) {
67
74
  xw.startElement("References");
68
75
  const addressSpace = node.addressSpace;
@@ -153,25 +160,54 @@ function _dumpQualifiedName(xw, v) {
153
160
  function _dumpXmlElement(xw, v) {
154
161
  xw.text(v);
155
162
  }
156
- /*
157
- <uax:ExtensionObject>
158
- <uax:TypeId>
159
- <uax:Identifier>i=339</uax:Identifier>
160
- </uax:TypeId>
161
- <uax:Body>
162
- <BuildInfo xmlns="http://opcfoundation.org/UA/2008/02/Types.xsd">
163
- <ProductUri></ProductUri>
164
- <ManufacturerName></ManufacturerName>
165
- <ProductName></ProductName>
166
- <SoftwareVersion></SoftwareVersion>
167
- <BuildNumber></BuildNumber>
168
- <BuildDate>1900-01-01T00:00:00Z</BuildDate>
169
- </BuildInfo>
170
- </uax:Body>
171
- </uax:ExtensionObject>
172
- */
163
+ function initXmlWriterEx(xw, map, namespaceArray) {
164
+ const xwe = xw;
165
+ xwe.map = map;
166
+ xwe.stackMap = [];
167
+ xwe.namespaceArray = namespaceArray;
168
+ }
169
+ function findXsdNamespaceUri(xw, nodeId) {
170
+ const xwe = xw;
171
+ if (!xwe.namespaceArray) {
172
+ return "";
173
+ }
174
+ const namespace = xwe.namespaceArray[nodeId.namespace];
175
+ if (namespace === "http://opcfoundation.org/UA/") {
176
+ return "http://opcfoundation.org/UA/2008/02/Types.xsd";
177
+ }
178
+ return namespace.replace(/\/$/, "") + "/Types.xsd";
179
+ }
180
+ function getPrefix(xw, namespace) {
181
+ const xwe = xw;
182
+ if (!xwe.map)
183
+ return "";
184
+ const p = xwe.map[namespace] || "";
185
+ return p ? p + ":" : "";
186
+ }
187
+ function restoreDefaultNamespace(xw) {
188
+ const xwe = xw;
189
+ if (!xwe.map)
190
+ return;
191
+ xwe.map = xwe.stackMap.pop();
192
+ }
193
+ function setDefaultNamespace(xw, namespace) {
194
+ const xwe = xw;
195
+ if (!xwe.map)
196
+ return;
197
+ if (xwe.map[namespace] !== "") {
198
+ xw.writeAttribute("xmlns", namespace);
199
+ }
200
+ xwe.stackMap.push(Object.assign({}, xwe.map));
201
+ xwe.map[namespace] = "";
202
+ }
203
+ function startElementEx(xw, ns, name, defaultNamespace) {
204
+ const xwe = xw;
205
+ xw.startElement(name);
206
+ setDefaultNamespace(xw, defaultNamespace);
207
+ }
173
208
  function _dumpNodeId(xw, v) {
174
- xw.startElement("Identifier");
209
+ const xmlns = getPrefix(xw, "http://opcfoundation.org/UA/2008/02/Types.xsd");
210
+ xw.startElement(`${xmlns}Identifier`);
175
211
  xw.text(n(xw, v));
176
212
  xw.endElement();
177
213
  }
@@ -184,12 +220,15 @@ function _dumpVariantValue(xw, dataType, node, value) {
184
220
  if (dataType === node_opcua_variant_1.DataType.Null) {
185
221
  return;
186
222
  }
187
- xw.startElement(node_opcua_variant_1.DataType[dataType]);
223
+ const uax = getPrefix(xw, "http://opcfoundation.org/UA/2008/02/Types.xsd");
224
+ xw.startElement(`${uax}${node_opcua_variant_1.DataType[dataType]}`);
188
225
  const definitionMap = (0, decode_xml_extension_object_1.makeDefinitionMap)(node.addressSpace);
189
226
  _dumpVariantInnerValue(xw, dataType, dataTypeNode.nodeId, definitionMap, value);
190
227
  xw.endElement();
191
228
  }
192
229
  function _dumpVariantInnerExtensionObject(xw, definitionMap, definition, value) {
230
+ const namespaceUri = findXsdNamespaceUri(xw, definition.defaultEncodingId);
231
+ const ns = getPrefix(xw, namespaceUri);
193
232
  for (const field of definition.fields || []) {
194
233
  const dataTypeNodeId = field.dataType;
195
234
  const fieldName = field.name;
@@ -203,7 +242,8 @@ function _dumpVariantInnerExtensionObject(xw, definitionMap, definition, value)
203
242
  continue; // ns=0;i=0 is reserved
204
243
  }
205
244
  const { name, definition } = definitionMap.findDefinition(dataTypeNodeId);
206
- xw.startElement(fieldName);
245
+ startElementEx(xw, ns, fieldName, namespaceUri);
246
+ // xw.startElement(fieldName);
207
247
  let fun = (value) => {
208
248
  /** */
209
249
  };
@@ -239,6 +279,7 @@ function _dumpVariantInnerExtensionObject(xw, definitionMap, definition, value)
239
279
  console.log(field);
240
280
  // throw err;
241
281
  }
282
+ restoreDefaultNamespace(xw);
242
283
  xw.endElement();
243
284
  }
244
285
  }
@@ -252,6 +293,7 @@ function _dumpVariantInnerValueEnum(xw, definition, value) {
252
293
  }
253
294
  // eslint-disable-next-line complexity
254
295
  function _dumpVariantInnerValue(xw, dataType, dataTypeNodeId, definitionMap, value) {
296
+ const uax = getPrefix(xw, "http://opcfoundation.org/UA/2008/02/Types.xsd");
255
297
  switch (dataType) {
256
298
  case null:
257
299
  case node_opcua_variant_1.DataType.Null:
@@ -293,12 +335,12 @@ function _dumpVariantInnerValue(xw, dataType, dataTypeNodeId, definitionMap, val
293
335
  case node_opcua_variant_1.DataType.Guid:
294
336
  /*
295
337
  <uax:Guid>
296
- <uax:String>947c29a7-490d-4dc9-adda-1109e3e8fcb7</uax:String>
338
+ <uax:String>947c29a7-490d-4dc9-adda-1109e3e8fcb7</uax:String>
297
339
  </uax:Guid>
298
340
  */
299
341
  if (value !== undefined && value !== null) {
300
342
  // xw.writeAttribute("xmlns", "http://opcfoundation.org/UA/2008/02/Types.xsd");
301
- xw.startElement("String");
343
+ xw.startElement(`${uax}String`);
302
344
  xw.text(value.toString());
303
345
  xw.endElement();
304
346
  }
@@ -326,10 +368,13 @@ function _dumpVariantInnerValue(xw, dataType, dataTypeNodeId, definitionMap, val
326
368
  */
327
369
  function _dumpVariantExtensionObjectValue_Body(xw, definitionMap, name, definition, value) {
328
370
  if (value) {
329
- xw.startElement(name);
371
+ const namespaceUri = findXsdNamespaceUri(xw, definition.defaultEncodingId);
372
+ const ns = getPrefix(xw, namespaceUri);
373
+ startElementEx(xw, ns, `${name}`, namespaceUri);
330
374
  if (value) {
331
375
  _dumpVariantInnerExtensionObject(xw, definitionMap, definition, value);
332
376
  }
377
+ restoreDefaultNamespace(xw);
333
378
  xw.endElement();
334
379
  }
335
380
  }
@@ -338,24 +383,29 @@ function _dumpVariantExtensionObjectValue(xw, dataTypeNodeId, definitionMap, val
338
383
  // const encodingDefaultXml = (getStructureTypeConstructor(schema.name) as any).encodingDefaultXml;
339
384
  const encodingDefaultXml = value.schema.encodingDefaultXml;
340
385
  if (!encodingDefaultXml) {
386
+ warningLog("dataType Name ", name, "with ", dataTypeNodeId.toString(), " does not have xml encoding");
341
387
  // throw new Error("Extension Object doesn't provide a XML ");
342
388
  return;
343
389
  }
344
- xw.startElement("ExtensionObject");
390
+ const uax = getPrefix(xw, "http://opcfoundation.org/UA/2008/02/Types.xsd");
391
+ startElementEx(xw, uax, `ExtensionObject`, "http://opcfoundation.org/UA/2008/02/Types.xsd");
345
392
  {
346
- xw.startElement("TypeId");
393
+ const uax = getPrefix(xw, "http://opcfoundation.org/UA/2008/02/Types.xsd");
394
+ xw.startElement(`${uax}TypeId`);
347
395
  {
348
396
  // find HasEncoding node
349
397
  // xx var encodingDefaultXml = schema.encodingDefaultXml;
350
- xw.startElement("Identifier");
398
+ xw.startElement(`${uax}Identifier`);
351
399
  xw.text(n(xw, encodingDefaultXml));
352
400
  xw.endElement();
353
401
  }
354
402
  xw.endElement();
355
- xw.startElement("Body");
403
+ startElementEx(xw, uax, "Body", "http://opcfoundation.org/UA/2008/02/Types.xsd");
356
404
  _dumpVariantExtensionObjectValue_Body(xw, definitionMap, name, definition, value);
405
+ restoreDefaultNamespace(xw);
357
406
  xw.endElement();
358
407
  }
408
+ restoreDefaultNamespace(xw);
359
409
  xw.endElement();
360
410
  }
361
411
  function _dumpVariantExtensionObjectValue2(xw, dataTypeNode, value) {
@@ -384,10 +434,7 @@ function _isDefaultValue(value) {
384
434
  }
385
435
  break;
386
436
  case node_opcua_variant_1.DataType.Boolean:
387
- if (!value.value) {
388
- return true;
389
- }
390
- break;
437
+ return false; // we want it all the time !
391
438
  case node_opcua_variant_1.DataType.SByte:
392
439
  case node_opcua_variant_1.DataType.Byte:
393
440
  case node_opcua_variant_1.DataType.UInt16:
@@ -440,7 +487,7 @@ function _dumpValue(xw, node, value) {
440
487
  return;
441
488
  }
442
489
  (0, node_opcua_assert_1.assert)(value instanceof node_opcua_variant_1.Variant);
443
- const dataTypeNode = addressSpace.findNode(node.dataType);
490
+ const dataTypeNode = addressSpace.findDataType(node.dataType);
444
491
  if (!dataTypeNode) {
445
492
  console.log("Cannot find dataType:", node.dataType);
446
493
  return;
@@ -457,15 +504,13 @@ function _dumpValue(xw, node, value) {
457
504
  return;
458
505
  }
459
506
  xw.startElement("Value");
507
+ const uax = getPrefix(xw, "http://opcfoundation.org/UA/2008/02/Types.xsd");
460
508
  if (isExtensionObject) {
461
- const dataTypeNode = addressSpace.findDataType(node.dataType);
462
- if (!dataTypeNode) {
463
- throw new Error("Cannot find data type " + node.dataType.toString());
464
- }
465
509
  const encodeXml = _dumpVariantExtensionObjectValue2.bind(null, xw, dataTypeNode);
466
510
  if (value.arrayType === node_opcua_variant_1.VariantArrayType.Array) {
467
- xw.startElement("ListOf" + baseDataTypeName);
511
+ startElementEx(xw, uax, `ListOf${baseDataTypeName}`, "http://opcfoundation.org/UA/2008/02/Types.xsd");
468
512
  value.value.forEach(encodeXml);
513
+ restoreDefaultNamespace(xw);
469
514
  xw.endElement();
470
515
  }
471
516
  else if (value.arrayType === node_opcua_variant_1.VariantArrayType.Scalar) {
@@ -481,15 +526,15 @@ function _dumpValue(xw, node, value) {
481
526
  const encodeXml = _dumpVariantValue.bind(null, xw, value.dataType, node);
482
527
  if (value.arrayType === node_opcua_variant_1.VariantArrayType.Matrix) {
483
528
  // console.log("Warning _dumpValue : Matrix not supported yet");
484
- xw.startElement("ListOf" + dataTypeName);
485
- xw.writeAttribute("xmlns", "http://opcfoundation.org/UA/2008/02/Types.xsd");
529
+ startElementEx(xw, uax, `ListOf${dataTypeName}`, "http://opcfoundation.org/UA/2008/02/Types.xsd");
486
530
  value.value.forEach(encodeXml);
531
+ restoreDefaultNamespace(xw);
487
532
  xw.endElement();
488
533
  }
489
534
  else if (value.arrayType === node_opcua_variant_1.VariantArrayType.Array) {
490
- xw.startElement("ListOf" + dataTypeName);
491
- xw.writeAttribute("xmlns", "http://opcfoundation.org/UA/2008/02/Types.xsd");
535
+ startElementEx(xw, uax, `ListOf${dataTypeName}`, "http://opcfoundation.org/UA/2008/02/Types.xsd");
492
536
  value.value.forEach(encodeXml);
537
+ restoreDefaultNamespace(xw);
493
538
  xw.endElement();
494
539
  }
495
540
  else if (value.arrayType === node_opcua_variant_1.VariantArrayType.Scalar) {
@@ -511,11 +556,9 @@ function _dumpArrayDimensionsAttribute(xw, node) {
511
556
  xw.writeAttribute("ArrayDimensions", node.arrayDimensions.join(","));
512
557
  }
513
558
  }
514
- function visitUANode(node, options, forward) {
559
+ function visitUANode(node, data, forward) {
515
560
  (0, node_opcua_assert_1.assert)(typeof forward === "boolean");
516
561
  const addressSpace = node.addressSpace;
517
- options.elements = options.elements || [];
518
- options.index_el = options.index_el || {};
519
562
  // visit references
520
563
  function process_reference(reference) {
521
564
  // only backward or forward references
@@ -526,16 +569,16 @@ function visitUANode(node, options, forward) {
526
569
  return; // skip OPCUA namespace
527
570
  }
528
571
  const k = _hash(reference);
529
- if (!options.index_el[k]) {
530
- options.index_el[k] = 1;
572
+ if (!data.index_el[k]) {
573
+ data.index_el[k] = 1;
531
574
  const o = addressSpace.findNode(k);
532
575
  if (o) {
533
- visitUANode(o, options, forward);
576
+ visitUANode(o, data, forward);
534
577
  }
535
578
  }
536
579
  }
537
580
  node.ownReferences().forEach(process_reference);
538
- options.elements.push(node);
581
+ data.elements.push(node);
539
582
  return node;
540
583
  }
541
584
  function dumpNodeInXml(xw, node) {
@@ -593,10 +636,20 @@ function dumpReferencedNodes(xw, node, forward) {
593
636
  }
594
637
  }
595
638
  }
639
+ function getParent(node) {
640
+ if (node instanceof ua_variable_impl_1.UAVariableImpl || node instanceof ua_method_impl_1.UAMethodImpl || node instanceof ua_object_impl_1.UAObjectImpl) {
641
+ return node.parent;
642
+ }
643
+ return null;
644
+ }
596
645
  const currentReadFlag = (0, node_opcua_data_model_1.makeAccessLevelFlag)("CurrentRead");
597
646
  function dumpCommonAttributes(xw, node) {
598
647
  xw.writeAttribute("NodeId", n(xw, node.nodeId));
599
648
  xw.writeAttribute("BrowseName", b(xw, node.browseName));
649
+ const parentNode = getParent(node);
650
+ if (parentNode) {
651
+ xw.writeAttribute("ParentNodeId", n(xw, parentNode.nodeId));
652
+ }
600
653
  if (Object.prototype.hasOwnProperty.call(node, "symbolicName")) {
601
654
  xw.writeAttribute("SymbolicName", node.symbolicName);
602
655
  }
@@ -677,13 +730,20 @@ function _dumpStructureDefinition(xw, structureDefinition, baseStructureDefiniti
677
730
  xw.endElement();
678
731
  }
679
732
  }
733
+ function _dumpEncoding(xw, uaEncoding) {
734
+ const uaDescription = uaEncoding.findReferencesAsObject("HasDescription")[0];
735
+ if (uaDescription) {
736
+ dumpUAVariable(xw, uaDescription);
737
+ }
738
+ _dumpUAObject(xw, uaEncoding);
739
+ }
680
740
  function _dumpEncodings(xw, uaDataType) {
681
741
  const encodings = uaDataType.findReferencesExAsObject("HasEncoding", node_opcua_data_model_1.BrowseDirection.Forward);
682
- for (const encoding of encodings) {
683
- if (encoding.nodeClass !== node_opcua_data_model_1.NodeClass.Object) {
742
+ for (const uaEncoding of encodings) {
743
+ if (uaEncoding.nodeClass !== node_opcua_data_model_1.NodeClass.Object) {
684
744
  continue;
685
745
  }
686
- _dumpUAObject(xw, encoding);
746
+ _dumpEncoding(xw, uaEncoding);
687
747
  }
688
748
  }
689
749
  function _dumpUADataTypeDefinition(xw, uaDataType) {
@@ -696,15 +756,20 @@ function _dumpUADataTypeDefinition(xw, uaDataType) {
696
756
  return;
697
757
  }
698
758
  if (uaDataType.isStructure()) {
699
- const definition = uaDataType.getStructureDefinition();
700
- const baseDefinition = uaDataTypeBase ? uaDataTypeBase.getStructureDefinition() : null;
701
- xw.startElement("Definition");
702
- xw.writeAttribute("Name", b(xw, uaDataType.browseName));
703
- if (definition.structureType === node_opcua_types_1.StructureType.Union) {
704
- xw.writeAttribute("IsUnion", "true");
759
+ // in case the namespace is conforming to 1.03 specification the DataTypeDefinition attribute
760
+ // will be not be readable....
761
+ const dataValue = uaDataType.readAttribute(index_current_1.SessionContext.defaultContext, node_opcua_basic_types_1.AttributeIds.DataTypeDefinition);
762
+ if (true || dataValue.statusCode === node_opcua_basic_types_1.StatusCodes.Good) {
763
+ const definition = uaDataType.getStructureDefinition();
764
+ const baseDefinition = uaDataTypeBase ? uaDataTypeBase.getStructureDefinition() : null;
765
+ xw.startElement("Definition");
766
+ xw.writeAttribute("Name", b(xw, uaDataType.browseName));
767
+ if (definition.structureType === node_opcua_types_1.StructureType.Union) {
768
+ xw.writeAttribute("IsUnion", "true");
769
+ }
770
+ _dumpStructureDefinition(xw, definition, baseDefinition);
771
+ xw.endElement();
705
772
  }
706
- _dumpStructureDefinition(xw, definition, baseDefinition);
707
- xw.endElement();
708
773
  return;
709
774
  }
710
775
  }
@@ -732,6 +797,10 @@ function _markAsVisited(xw, node) {
732
797
  xw.visitedNode[_hash(node)] = 1;
733
798
  }
734
799
  function dumpUAVariable(xw, node) {
800
+ (0, node_opcua_assert_1.assert)(node.nodeClass === node_opcua_data_model_1.NodeClass.Variable);
801
+ if (xw.visitedNode[_hash(node)]) {
802
+ return;
803
+ }
735
804
  _markAsVisited(xw, node);
736
805
  dumpReferencedNodes(xw, node, false);
737
806
  const addressSpace = node.addressSpace;
@@ -764,6 +833,7 @@ function dumpUAVariable(xw, node) {
764
833
  dumpAggregates(xw, node);
765
834
  }
766
835
  function dumpUAVariableType(xw, node) {
836
+ (0, node_opcua_assert_1.assert)(node.nodeClass === node_opcua_data_model_1.NodeClass.VariableType);
767
837
  xw.visitedNode = xw.visitedNode || {};
768
838
  (0, node_opcua_assert_1.assert)(!xw.visitedNode[_hash(node)]);
769
839
  xw.visitedNode[_hash(node)] = 1;
@@ -809,6 +879,7 @@ function dumpUAObject(xw, node) {
809
879
  xw.writeComment("Object - " + b(xw, node.browseName) + " }}}} ");
810
880
  }
811
881
  function _dumpUAObject(xw, node) {
882
+ (0, node_opcua_assert_1.assert)(node.nodeClass === node_opcua_data_model_1.NodeClass.Object);
812
883
  xw.visitedNode = xw.visitedNode || {};
813
884
  (0, node_opcua_assert_1.assert)(!xw.visitedNode[_hash(node)]);
814
885
  xw.visitedNode[_hash(node)] = 1;
@@ -853,6 +924,7 @@ function dumpAggregates(xw, node) {
853
924
  // Xx xw.writeComment("Aggregates }} ");
854
925
  }
855
926
  function dumpUAObjectType(xw, node) {
927
+ (0, node_opcua_assert_1.assert)(node.nodeClass === node_opcua_data_model_1.NodeClass.ObjectType);
856
928
  (0, node_opcua_assert_1.assert)(node instanceof ua_object_type_impl_1.UAObjectTypeImpl);
857
929
  xw.writeComment("ObjectType - " + b(xw, node.browseName) + " {{{{ ");
858
930
  _markAsVisited(xw, node);
@@ -866,6 +938,7 @@ function dumpUAObjectType(xw, node) {
866
938
  xw.writeComment("ObjectType - " + b(xw, node.browseName) + " }}}}");
867
939
  }
868
940
  function dumpUAMethod(xw, node) {
941
+ (0, node_opcua_assert_1.assert)(node.nodeClass === node_opcua_data_model_1.NodeClass.Method);
869
942
  _markAsVisited(xw, node);
870
943
  dumpReferencedNodes(xw, node, false);
871
944
  xw.startElement("UAMethod");
@@ -894,16 +967,16 @@ function resolveDataTypeName(addressSpace, dataType) {
894
967
  }
895
968
  return dataTypeNode.browseName;
896
969
  }
897
- function buildUpAliases(node, xw, options) {
970
+ function buildUpAliases(node, xw, data) {
898
971
  const addressSpace = node.addressSpace;
899
- options.aliases = options.aliases || {};
900
- options.aliases_visited = options.aliases_visited || {};
972
+ if (!data.aliases_visited)
973
+ data.aliases_visited = {};
901
974
  const k = _hash(node);
902
975
  // istanbul ignore next
903
- if (options.aliases_visited[k]) {
976
+ if (data.aliases_visited[k]) {
904
977
  return;
905
978
  }
906
- options.aliases_visited[k] = 1;
979
+ data.aliases_visited[k] = 1;
907
980
  // put datatype into aliases list
908
981
  if (node.nodeClass === node_opcua_data_model_1.NodeClass.Variable || node.nodeClass === node_opcua_data_model_1.NodeClass.VariableType) {
909
982
  const nodeV = node;
@@ -911,8 +984,8 @@ function buildUpAliases(node, xw, options) {
911
984
  // name
912
985
  const dataTypeName = b(xw, resolveDataTypeName(addressSpace, nodeV.dataType));
913
986
  if (dataTypeName) {
914
- if (!options.aliases[dataTypeName]) {
915
- options.aliases[dataTypeName] = n(xw, nodeV.dataType);
987
+ if (!data.aliases[dataTypeName]) {
988
+ data.aliases[dataTypeName] = n(xw, nodeV.dataType);
916
989
  }
917
990
  }
918
991
  }
@@ -920,8 +993,8 @@ function buildUpAliases(node, xw, options) {
920
993
  // name
921
994
  const dataTypeName = b(xw, resolveDataTypeName(addressSpace, nodeV.dataType));
922
995
  if (dataTypeName) {
923
- if (!options.aliases[dataTypeName]) {
924
- options.aliases[dataTypeName] = n(xw, nodeV.dataType);
996
+ if (!data.aliases[dataTypeName]) {
997
+ data.aliases[dataTypeName] = n(xw, nodeV.dataType);
925
998
  }
926
999
  }
927
1000
  }
@@ -929,12 +1002,12 @@ function buildUpAliases(node, xw, options) {
929
1002
  function collectReferenceNameInAlias(reference) {
930
1003
  // reference.referenceType
931
1004
  const key = b(xw, (0, base_node_impl_1.getReferenceType)(reference).browseName);
932
- if (!options.aliases.key) {
1005
+ if (!data.aliases.key) {
933
1006
  if (reference.referenceType.namespace === 0) {
934
- options.aliases[key] = reference.referenceType.toString().replace("ns=0;", "");
1007
+ data.aliases[key] = reference.referenceType.toString().replace("ns=0;", "");
935
1008
  }
936
1009
  else {
937
- options.aliases[key] = n(xw, reference.referenceType);
1010
+ data.aliases[key] = n(xw, reference.referenceType);
938
1011
  }
939
1012
  }
940
1013
  }
@@ -989,12 +1062,12 @@ function sortByNodeId(a, b) {
989
1062
  function dumpXml(node, options) {
990
1063
  const namespace = node.namespace;
991
1064
  // make a first visit so that we determine which node to output and in which order
992
- const nodesToVisit = {};
1065
+ const data = { aliases: {}, aliases_visited: {}, index_el: {}, elements: [] };
993
1066
  const dependency = (0, construct_namespace_dependency_1.constructNamespaceDependency)(namespace);
994
1067
  const translationTable = constructNamespaceTranslationTable(dependency);
995
1068
  const xw = new XMLWriter(true);
996
1069
  xw.translationTable = translationTable;
997
- visitUANode(node, nodesToVisit, false);
1070
+ visitUANode(node, data, false);
998
1071
  xw.startDocument({ encoding: "utf-8" });
999
1072
  xw.startElement("UANodeSet");
1000
1073
  xw.writeAttribute("xmlns:xs", "http://www.w3.org/2001/XMLSchema-instance");
@@ -1002,9 +1075,23 @@ function dumpXml(node, options) {
1002
1075
  xw.writeAttribute("Version", "1.02");
1003
1076
  xw.writeAttribute("LastModified", new Date().toISOString());
1004
1077
  xw.writeAttribute("xmlns", "http://opcfoundation.org/UA/2011/03/UANodeSet.xsd");
1005
- buildUpAliases(node, xw, nodesToVisit);
1006
- writeAliases(xw, nodesToVisit.aliases);
1007
- for (const el of nodesToVisit.elements) {
1078
+ buildUpAliases(node, xw, data);
1079
+ writeAliases(xw, data.aliases);
1080
+ const xmlNamspace = {
1081
+ default: { namespace: "http://opcfoundation.org/UA/2011/03/UANodeSet.xsd" }
1082
+ };
1083
+ xw.startElement("Extensions");
1084
+ {
1085
+ xw.startElement("Extension");
1086
+ {
1087
+ xw.startElement("ModelInfo");
1088
+ xw.writeAttribute("NodeOPCUA");
1089
+ xw.endElement();
1090
+ }
1091
+ xw.endElement();
1092
+ }
1093
+ xw.endElement();
1094
+ for (const el of data.elements) {
1008
1095
  el.dumpXML(xw);
1009
1096
  }
1010
1097
  xw.endElement();
@@ -1033,10 +1120,17 @@ ua_object_type_impl_1.UAObjectTypeImpl.prototype.dumpXML = function (xw) {
1033
1120
  ua_data_type_impl_1.UADataTypeImpl.prototype.dumpXML = function (xw) {
1034
1121
  dumpUADataType(xw, this);
1035
1122
  };
1123
+ function makeTypeXsd(namespaceUri) {
1124
+ return namespaceUri.replace(/\/$/, "") + "/Type.xsd";
1125
+ }
1036
1126
  // eslint-disable-next-line max-statements
1037
1127
  namespace_impl_1.NamespaceImpl.prototype.toNodeset2XML = function () {
1038
1128
  const dependency = (0, construct_namespace_dependency_1.constructNamespaceDependency)(this);
1039
1129
  const translationTable = constructNamespaceTranslationTable(dependency);
1130
+ const namespaceArrayNode = this.addressSpace.findNode(node_opcua_constants_1.VariableIds.Server_NamespaceArray);
1131
+ const namespaceArray = namespaceArrayNode
1132
+ ? namespaceArrayNode.readAttribute(null, node_opcua_basic_types_1.AttributeIds.Value).value.value
1133
+ : [];
1040
1134
  const xw = new XMLWriter(true);
1041
1135
  xw.translationTable = translationTable;
1042
1136
  xw.startDocument({ encoding: "utf-8", version: "1.0" });
@@ -1044,10 +1138,25 @@ namespace_impl_1.NamespaceImpl.prototype.toNodeset2XML = function () {
1044
1138
  xw.writeAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");
1045
1139
  xw.writeAttribute("xmlns:uax", "http://opcfoundation.org/UA/2008/02/Types.xsd");
1046
1140
  xw.writeAttribute("xmlns", "http://opcfoundation.org/UA/2011/03/UANodeSet.xsd");
1141
+ const namespacesMap = {
1142
+ "http://opcfoundation.org/UA/2011/03/UANodeSet.xsd": "",
1143
+ "http://opcfoundation.org/UA/2008/02/Types.xsd": "uax",
1144
+ "http://www.w3.org/2001/XMLSchema-instance": "xsi"
1145
+ };
1146
+ for (const namespace of dependency) {
1147
+ if (namespace.index === 0) {
1148
+ continue;
1149
+ }
1150
+ const translatedIndex = translationTable[namespace.index];
1151
+ const smallName = `ns${translatedIndex}`;
1152
+ xw.writeAttribute(`xmlns:${smallName}`, makeTypeXsd(namespace.namespaceUri));
1153
+ namespacesMap[namespace.namespaceUri] = smallName;
1154
+ }
1047
1155
  // xx xw.writeAttribute("Version", "1.02");
1048
1156
  // xx xw.writeAttribute("LastModified", (new Date()).toISOString());
1049
1157
  // ------------- INamespace Uris
1050
1158
  xw.startElement("NamespaceUris");
1159
+ initXmlWriterEx(xw, namespacesMap, namespaceArray);
1051
1160
  // xx const namespaceArray = namespace.addressSpace.getNamespaceArray();
1052
1161
  for (const depend of dependency) {
1053
1162
  if (depend.index === 0) {
@@ -1078,11 +1187,11 @@ namespace_impl_1.NamespaceImpl.prototype.toNodeset2XML = function () {
1078
1187
  xw.endElement();
1079
1188
  }
1080
1189
  xw.endElement();
1081
- const s = {};
1190
+ const data = { aliases: {} };
1082
1191
  for (const node of this.nodeIterator()) {
1083
- buildUpAliases(node, xw, s);
1192
+ buildUpAliases(node, xw, data);
1084
1193
  }
1085
- writeAliases(xw, s.aliases);
1194
+ writeAliases(xw, data.aliases);
1086
1195
  xw.visitedNode = {};
1087
1196
  // -------------- writeReferences
1088
1197
  xw.writeComment("ReferenceTypes");
@@ -1092,10 +1201,7 @@ namespace_impl_1.NamespaceImpl.prototype.toNodeset2XML = function () {
1092
1201
  }
1093
1202
  // -------------- Dictionaries
1094
1203
  const addressSpace = this.addressSpace;
1095
- const opcBinaryTypeSystem = addressSpace.findNode("OPCBinarySchema_TypeSystem");
1096
- if (opcBinaryTypeSystem) {
1097
- // let find all DataType dictionary node corresponding to a given namespace
1098
- // (have DataTypeDictionaryType)
1204
+ const getDataTypeDescription = (opcBinaryTypeSystem) => {
1099
1205
  const nodeToBrowse = new node_opcua_types_1.BrowseDescription({
1100
1206
  browseDirection: node_opcua_data_model_1.BrowseDirection.Forward,
1101
1207
  includeSubtypes: false,
@@ -1106,12 +1212,8 @@ namespace_impl_1.NamespaceImpl.prototype.toNodeset2XML = function () {
1106
1212
  });
1107
1213
  const result = opcBinaryTypeSystem.browseNode(nodeToBrowse).filter((r) => r.nodeId.namespace === this.index);
1108
1214
  (0, node_opcua_assert_1.assert)(result.length <= 1);
1109
- if (result.length === 1) {
1110
- xw.writeComment("DataSystem");
1111
- const dataSystemType = addressSpace.findNode(result[0].nodeId);
1112
- dumpNodeInXml(xw, dataSystemType);
1113
- }
1114
- }
1215
+ return result;
1216
+ };
1115
1217
  // -------------- DataTypes
1116
1218
  const dataTypes = [...this._dataTypeIterator()].sort(sortByBrowseName);
1117
1219
  if (dataTypes.length) {
@@ -1122,6 +1224,35 @@ namespace_impl_1.NamespaceImpl.prototype.toNodeset2XML = function () {
1122
1224
  dumpNodeInXml(xw, dataType);
1123
1225
  }
1124
1226
  }
1227
+ // --------------
1228
+ const opcBinaryTypeSystem = addressSpace.findNode(node_opcua_constants_1.ObjectIds.OPCBinarySchema_TypeSystem);
1229
+ const opcXmlSchemaTypeSystem = addressSpace.findNode(node_opcua_constants_1.ObjectIds.XmlSchema_TypeSystem);
1230
+ if (opcBinaryTypeSystem) {
1231
+ // let find all DataType dictionary node corresponding to a given namespace
1232
+ // (have DataTypeDictionaryType)
1233
+ const result = getDataTypeDescription(opcBinaryTypeSystem);
1234
+ if (result.length === 1) {
1235
+ xw.writeComment("DataSystem - Binary");
1236
+ const dataSystemType = addressSpace.findNode(result[0].nodeId);
1237
+ const types = dataSystemType.getComponents();
1238
+ for (const f of types) {
1239
+ dumpNodeInXml(xw, f);
1240
+ }
1241
+ dumpNodeInXml(xw, dataSystemType);
1242
+ }
1243
+ }
1244
+ if (opcXmlSchemaTypeSystem) {
1245
+ const result = getDataTypeDescription(opcXmlSchemaTypeSystem);
1246
+ if (result.length === 1) {
1247
+ xw.writeComment("DataSystem - Xml");
1248
+ const dataSystemType = addressSpace.findNode(result[0].nodeId);
1249
+ const types = dataSystemType.getComponents();
1250
+ for (const f of types) {
1251
+ dumpNodeInXml(xw, f);
1252
+ }
1253
+ dumpNodeInXml(xw, dataSystemType);
1254
+ }
1255
+ }
1125
1256
  }
1126
1257
  // -------------- ObjectTypes
1127
1258
  xw.writeComment("ObjectTypes");