"use strict";
/**
* @module opcua.address_space
* @class AddressSpace
*/
const assert = require("node-opcua-assert").assert;
const util = require("util");
const _ = require("underscore");
const NodeId = require("node-opcua-nodeid").NodeId;
const UADataType = require("./ua_data_type").UADataType;
const eoan = require("./extension_object_array_node");
exports.install = function (AddressSpace) {
AddressSpace.prototype.getExtensionObjectConstructor = function (dataType) {
assert(dataType, "expecting a dataType");
if (dataType instanceof NodeId) {
const tmp = this.findNode(dataType);
if (!tmp) {
throw new Error("constructExtensionObject: cannot resolve dataType " + dataType);
}
dataType = tmp;
}
if (!(dataType instanceof UADataType)) {
throw new Error("constructExtensionObject: dataType has unexpectedtype" + dataType);
}
eoan.prepareDataType(dataType);
const Constructor = dataType._extensionObjectConstructor;
return Constructor;
};
/**
* @method constructExtensionObject
* @param dataType {UADataType}
* @param [options {Object} =null]
* @return {Object}
*
*
* @example
*
* // example 1
* var extObj = addressSpace.constructExtensionObject("BuildInfo",{ productName: "PRODUCTNAME"});
*
* // example 2
* serverStatusDataType.should.be.instanceOf(UADataType);
* serverStatusDataType.browseName.toString().should.eql("ServerStatusDataType");
* var serverStatus = addressSpace.constructExtensionObject(serverStatusDataType);
* serverStatus.constructor.name.should.eql("ServerStatus");
*/
AddressSpace.prototype.constructExtensionObject = function(dataType,options){
const Constructor = this.getExtensionObjectConstructor(dataType);
return new Constructor(options);
};
};