Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
console.log("node-id :", dataTypeNodeId.toString());
console.log("nodeClass :", NodeClass[nodeClass.value.value]);
console.log("browseName :", browseName.value.value.toString());
console.log(result1.toString());
throw new Error("getDataTypeDefinition invalid HasEncoding reference");
}
const encodingReference = result1.references![0]!;
assert(encodingReference.browseName.toString() === "Default Binary");
// Xx console.log("Has Encoding ", encodingReference.browseName.toString(), encodingReference.nodeId.toString());
const nodeToBrowse2 = {
browseDirection: BrowseDirection.Forward,
includeSubtypes: false,
nodeClassMask: makeNodeClassMask("Variable"),
nodeId: encodingReference.nodeId,
referenceTypeId: resolveNodeId("HasDescription"),
resultMask: makeResultMask("NodeId | ReferenceType | BrowseName | NodeClass | TypeDefinition")
};
const result2 = await session.browse(nodeToBrowse2);
assert(result2.references && result2.references.length === 1);
const definitionRef = result2.references![0]!;
// xx console.log("HasDefinition ", definitionRef.browseName.toString(), definitionRef.nodeId.toString());
const nameDataValue = await session.read({
attributeId: AttributeIds.Value,
nodeId: definitionRef.nodeId
});
const name = nameDataValue.value.value as string;
// xx console.log("name ", name);
function readUAStructure(proxyManager, obj, callback) {
const session = proxyManager.session;
// 0 Object
// 1 Variable
// 2 Method
const nodeId = obj.nodeId;
const nodesToBrowse = [
// Components (except Methods)
{
// BrowseDescription
referenceTypeId: makeRefId("HasComponent"),
nodeClassMask: makeNodeClassMask("Object | Variable"), // we don't want Method here
includeSubtypes: true,
browseDirection: BrowseDirection.Forward,
nodeId: nodeId,
resultMask: resultMask
},
// Properties
{
// BrowseDescription
referenceTypeId: makeRefId("HasProperty"),
//nodeClassMask: makeNodeClassMask("Variable"),
includeSubtypes: true,
browseDirection: BrowseDirection.Forward,
nodeId: nodeId,
resultMask: resultMask
},
{
// BrowseDescription
browseDirection: BrowseDirection.Forward,
includeSubtypes: true,
// nodeClassMask: makeNodeClassMask("Variable"),
nodeId,
referenceTypeId: makeRefId("HasProperty"),
resultMask
},
// Methods
{
// BrowseDescription
browseDirection: BrowseDirection.Forward,
includeSubtypes: true,
nodeClassMask: makeNodeClassMask("Method"),
nodeId,
referenceTypeId: makeRefId("HasComponent"),
resultMask
},
// TypeDefinition
{
// BrowseDescription
browseDirection: BrowseDirection.Both,
includeSubtypes: true,
nodeId,
referenceTypeId: makeRefId("HasTypeDefinition"),
resultMask
},
// FromState
{
// BrowseDescription
// Properties
{
// BrowseDescription
referenceTypeId: makeRefId("HasProperty"),
//nodeClassMask: makeNodeClassMask("Variable"),
includeSubtypes: true,
browseDirection: BrowseDirection.Forward,
nodeId: nodeId,
resultMask: resultMask
},
// Methods
{
// BrowseDescription
referenceTypeId: makeRefId("HasComponent"),
nodeClassMask: makeNodeClassMask("Method"),
includeSubtypes: true,
browseDirection: BrowseDirection.Forward,
nodeId: nodeId,
resultMask: resultMask
},
// TypeDefinition
{
// BrowseDescription
referenceTypeId: makeRefId("HasTypeDefinition"),
includeSubtypes: true,
browseDirection: BrowseDirection.Both,
nodeId: nodeId,
resultMask: resultMask
},
// FromState
// +- HasEncoding-> "Default Binary"
// |
// +-- HasDescription -> "MyItemType"
// +- ComponentOf -> Schema
//
// Note that in 1.04 compliant server, DataType definition might be available
// in a DataTypeDefinition attributes of the DataType object
// However this is a brand new aspect of the specification and is not widely implemented
// it is also optional
// It will takes time for old opcua server to be refurbished and we may have to
// keep the current method to access type definition from embedded xsd.
//
const nodeToBrowse1 = {
browseDirection: BrowseDirection.Forward,
includeSubtypes: false,
nodeClassMask: makeNodeClassMask("Object"),
nodeId: dataTypeNodeId,
referenceTypeId: resolveNodeId("HasEncoding"),
resultMask: makeResultMask("NodeId | ReferenceType | BrowseName | NodeClass | TypeDefinition")
};
const result1 = await session.browse(nodeToBrowse1);
if (result1.references && result1.references.length > 1) {
// we have more than one possible Encoding .... only keep "Default Binary"
result1.references = result1.references.filter((r: ReferenceDescription) =>
r.browseName.toString() === "Default Binary");
}
/* istanbul ignore next */
if (!(result1.references && result1.references.length === 1)) {
const nodeClass = await session.read({
export async function exploreDataTypeDefinition(
session: IBasicSession,
dataTypeDictionaryTypeNode: NodeId,
typeDictionary: TypeDictionary,
namespaces: string[]
) {
const nodeToBrowse = {
browseDirection: BrowseDirection.Forward,
includeSubtypes: false,
nodeClassMask: makeNodeClassMask("Variable"),
nodeId: dataTypeDictionaryTypeNode,
referenceTypeId: resolveNodeId("HasComponent"),
resultMask: makeResultMask("ReferenceType | IsForward | BrowseName | NodeClass | TypeDefinition")
};
const result = await session.browse(nodeToBrowse);
const references = result.references || [];
/* istanbul ignore next */
if (references.length === 0) {
return;
}
// request the Definition of each nodes
const nodesToBrowse2 = references.map((ref: ReferenceDescription) => {
return {
browseDirection: BrowseDirection.Inverse,
return references.filter((reference) => {
const obj = resolveReferenceNode(addressSpace, reference);
if (!obj) {
return false;
}
const nodeClassName = NodeClass[obj.nodeClass];
const value = makeNodeClassMask(nodeClassName);
return (value & nodeClassMask) === value;
});
}
const nodesToBrowse2 = references.map((ref: ReferenceDescription) => {
return {
browseDirection: BrowseDirection.Inverse,
includeSubtypes: false,
nodeClassMask: makeNodeClassMask("Object | Variable"),
nodeId: ref.nodeId,
referenceTypeId: resolveNodeId("HasDescription"),
resultMask: makeResultMask("NodeId | ReferenceType | BrowseName | NodeClass | TypeDefinition")
};
});
const results2 = await session.browse(nodesToBrowse2);