Skip to content

Commit 712aab0

Browse files
committed
chore: release v0.9.7
1 parent d6c99e1 commit 712aab0

16 files changed

Lines changed: 420 additions & 21 deletions

File tree

doc/mapping-datatype-valuerank-to-json-schema.md

Lines changed: 281 additions & 0 deletions
Large diffs are not rendered by default.

packages/app/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# @node-i3x/app
22

3+
## 0.9.7 (2026-07-13)
4+
5+
- docs(github): modernize issue templates and support files
6+
37
## 0.9.6 (2026-06-30)
48

59
- docs: add live testing info and dashboard image to README

packages/app/package.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@node-i3x/app",
3-
"version": "0.9.6",
3+
"version": "0.9.7",
44
"description": "i3X CLI -- expose OPC UA servers as i3X REST APIs",
55
"license": "AGPL-3.0-or-later OR LicenseRef-Sterfive-Commercial",
66
"author": "Sterfive SAS <contact@sterfive.com> (https://sterfive.com)",
@@ -40,9 +40,9 @@
4040
"typecheck": "tsc --noEmit"
4141
},
4242
"dependencies": {
43-
"@node-i3x/core": "0.9.6",
44-
"@node-i3x/opcua-connector": "0.9.6",
45-
"@node-i3x/rest-server": "0.9.6",
43+
"@node-i3x/core": "0.9.7",
44+
"@node-i3x/opcua-connector": "0.9.7",
45+
"@node-i3x/rest-server": "0.9.7",
4646
"commander": "^15.0.0",
4747
"cosmiconfig": "^9.0.2",
4848
"fastify": "^5.8.5",

packages/core/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# @node-i3x/core
22

3+
## 0.9.7 (2026-07-13)
4+
5+
- docs(github): modernize issue templates and support files
6+
37
## 0.9.6 (2026-06-30)
48

59
- docs: add live testing info and dashboard image to README

packages/core/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@node-i3x/core",
3-
"version": "0.9.6",
3+
"version": "0.9.7",
44
"description": "i3X domain core — models, ports, and services (zero dependencies)",
55
"license": "AGPL-3.0-or-later OR LicenseRef-Sterfive-Commercial",
66
"author": "Sterfive SAS <contact@sterfive.com> (https://sterfive.com)",

packages/demo-embedded/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# @node-i3x/demo-embedded
22

3+
## 0.9.7 (2026-07-13)
4+
5+
- docs(github): modernize issue templates and support files
6+
37
## 0.9.6 (2026-06-30)
48

59
- docs: add live testing info and dashboard image to README

packages/demo-embedded/package.json

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@node-i3x/demo-embedded",
3-
"version": "0.9.6",
3+
"version": "0.9.7",
44
"license": "AGPL-3.0-or-later OR LicenseRef-Sterfive-Commercial",
55
"author": "Sterfive SAS <contact@sterfive.com> (https://sterfive.com)",
66
"homepage": "https://sterfive.com",
@@ -41,10 +41,10 @@
4141
"client": "npx tsx src/client.ts"
4242
},
4343
"dependencies": {
44-
"@node-i3x/core": "0.9.6",
45-
"@node-i3x/opcua-connector": "0.9.6",
46-
"@node-i3x/pseudo-session-connector": "0.9.6",
47-
"@node-i3x/rest-server": "0.9.6",
44+
"@node-i3x/core": "0.9.7",
45+
"@node-i3x/opcua-connector": "0.9.7",
46+
"@node-i3x/pseudo-session-connector": "0.9.7",
47+
"@node-i3x/rest-server": "0.9.7",
4848
"fastify": "^5.8.5",
4949
"@fastify/cors": "^11.2.0",
5050
"fastify-plugin": "^6.0.0",

packages/opcua-connector/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# @node-i3x/opcua-connector
22

3+
## 0.9.7 (2026-07-13)
4+
5+
- docs(github): modernize issue templates and support files
6+
37
## 0.9.6 (2026-06-30)
48

59
- docs: add live testing info and dashboard image to README

packages/opcua-connector/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@node-i3x/opcua-connector",
3-
"version": "0.9.6",
3+
"version": "0.9.7",
44
"description": "i3X OPC UA adapter — implements IDataSourcePort using node-opcua",
55
"license": "AGPL-3.0-or-later OR LicenseRef-Sterfive-Commercial",
66
"author": "Sterfive SAS <contact@sterfive.com> (https://sterfive.com)",
@@ -58,7 +58,7 @@
5858
"typecheck": "tsc --noEmit"
5959
},
6060
"dependencies": {
61-
"@node-i3x/core": "0.9.6",
61+
"@node-i3x/core": "0.9.7",
6262
"node-opcua": "^2.173.1",
6363
"node-opcua-certificate-manager": "^2.173.0",
6464
"node-opcua-client": "^2.173.1",

packages/opcua-connector/src/opcua-client.ts

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,14 @@ function validateOpcUaClientOptions(opts: OpcUaClientOptions): void {
141141
throw new Error('OPC UA browseFilter array must contain only strings');
142142
}
143143
}
144+
if (opts.browseMaxDepth !== undefined) {
145+
if (
146+
typeof opts.browseMaxDepth !== 'number' ||
147+
!Number.isInteger(opts.browseMaxDepth)
148+
) {
149+
throw new Error('OPC UA browseMaxDepth must be an integer');
150+
}
151+
}
144152
const stringFields: (keyof OpcUaClientOptions)[] = [
145153
'username',
146154
'password',
@@ -185,7 +193,12 @@ export class OpcUaClient {
185193
> &
186194
Pick<
187195
OpcUaClientOptions,
188-
'username' | 'password' | 'applicationUri' | 'pkiFolder' | 'certificateSubject'
196+
| 'username'
197+
| 'password'
198+
| 'applicationUri'
199+
| 'pkiFolder'
200+
| 'certificateSubject'
201+
| 'browseMaxDepth'
189202
>;
190203

191204
constructor(
@@ -206,6 +219,7 @@ export class OpcUaClient {
206219
applicationUri: opts.applicationUri,
207220
pkiFolder: opts.pkiFolder,
208221
certificateSubject: opts.certificateSubject,
222+
browseMaxDepth: opts.browseMaxDepth ?? 25,
209223
};
210224
}
211225

@@ -504,8 +518,8 @@ export class OpcUaClient {
504518
const visited = new Set<string>();
505519
let totalTx = 0;
506520

507-
let frontier: Array<{ nodeId: string; parentId: string | null }> = [
508-
{ nodeId: seedNodeId, parentId: null },
521+
let frontier: Array<{ nodeId: string; parentId: string | null; depth: number }> = [
522+
{ nodeId: seedNodeId, parentId: null, depth: 0 },
509523
];
510524

511525
const useParallel = this._opts.browseStrategy !== 'browseAll';
@@ -555,10 +569,19 @@ export class OpcUaClient {
555569
if (m !== null) output.push(m);
556570
}
557571

558-
if (!shouldRecurse || shouldRecurse(ref, item.nodeId)) {
572+
const maxDepth = this._opts.browseMaxDepth;
573+
const nextDepth = item.depth + 1;
574+
const canRecurse =
575+
maxDepth === undefined || maxDepth < 0 || nextDepth <= maxDepth;
576+
577+
if (canRecurse && (!shouldRecurse || shouldRecurse(ref, item.nodeId))) {
559578
if (!queued.has(childId)) {
560579
queued.add(childId);
561-
nextFrontier.push({ nodeId: childId, parentId: item.nodeId });
580+
nextFrontier.push({
581+
nodeId: childId,
582+
parentId: item.nodeId,
583+
depth: nextDepth,
584+
});
562585
}
563586
}
564587
}

0 commit comments

Comments
 (0)