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