@node-i3x/app 0.5.3 → 0.7.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/README.md +19 -14
- package/dist/cli.js +1 -1
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +9 -3
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/i3x.config.example.yml +7 -4
- package/package.json +5 -4
package/README.md
CHANGED
|
@@ -38,9 +38,11 @@ Options:
|
|
|
38
38
|
-H, --host <host> REST API bind address (default: 0.0.0.0)
|
|
39
39
|
--security-mode <mode> OPC UA security mode (default: None)
|
|
40
40
|
--optimized-client <mode> Optimized client: auto | disabled
|
|
41
|
-
--
|
|
41
|
+
--publish-interval <ms> OPC UA publishing interval in milliseconds
|
|
42
|
+
--sampling-interval <ms> OPC UA sampling interval in milliseconds
|
|
42
43
|
--log-level <level> debug | info | warn | error
|
|
43
|
-
--no-
|
|
44
|
+
--no-preload Skip model preload on startup
|
|
45
|
+
--preload-strict Exit if model preload fails
|
|
44
46
|
-c, --config <path> Path to config file
|
|
45
47
|
-h, --help Show help
|
|
46
48
|
```
|
|
@@ -52,7 +54,7 @@ i3X uses layered configuration. Each layer overrides the previous:
|
|
|
52
54
|
```
|
|
53
55
|
1. Built-in defaults
|
|
54
56
|
2. Config file (i3x.config.yml)
|
|
55
|
-
3. Environment variables (
|
|
57
|
+
3. Environment variables (NODE_I3X_*)
|
|
56
58
|
4. CLI arguments (--endpoint, --port, ...)
|
|
57
59
|
```
|
|
58
60
|
|
|
@@ -66,8 +68,9 @@ endpoint: opc.tcp://192.168.1.100:4840
|
|
|
66
68
|
port: 8080
|
|
67
69
|
host: 0.0.0.0
|
|
68
70
|
logLevel: info
|
|
69
|
-
|
|
70
|
-
|
|
71
|
+
publishIntervalMs: 1000
|
|
72
|
+
samplingIntervalMs: 250
|
|
73
|
+
preload: true
|
|
71
74
|
```
|
|
72
75
|
|
|
73
76
|
Supported file names (auto-discovered):
|
|
@@ -84,18 +87,20 @@ Supported file names (auto-discovered):
|
|
|
84
87
|
|
|
85
88
|
### Environment Variables
|
|
86
89
|
|
|
87
|
-
All environment variables are prefixed with `
|
|
90
|
+
All environment variables are prefixed with `NODE_I3X_`:
|
|
88
91
|
|
|
89
92
|
| Variable | Config key | Default |
|
|
90
93
|
|---|---|---|
|
|
91
|
-
| `
|
|
92
|
-
| `
|
|
93
|
-
| `
|
|
94
|
-
| `
|
|
95
|
-
| `
|
|
96
|
-
| `
|
|
97
|
-
| `
|
|
98
|
-
| `
|
|
94
|
+
| `NODE_I3X_OPCUA_ENDPOINT` | `endpoint` | `opc.tcp://localhost:4840` |
|
|
95
|
+
| `NODE_I3X_PORT` | `port` | `8080` |
|
|
96
|
+
| `NODE_I3X_HOST` | `host` | `0.0.0.0` |
|
|
97
|
+
| `NODE_I3X_OPCUA_SECURITY_MODE` | `securityMode` | `None` |
|
|
98
|
+
| `NODE_I3X_OPCUA_OPTIMIZED_CLIENT` | `optimizedClient` | `auto` |
|
|
99
|
+
| `NODE_I3X_PUBLISH_INTERVAL_MS` | `publishIntervalMs` | `1000` |
|
|
100
|
+
| `NODE_I3X_SAMPLING_INTERVAL_MS` | `samplingIntervalMs` | `250` |
|
|
101
|
+
| `NODE_I3X_LOG_LEVEL` | `logLevel` | `info` |
|
|
102
|
+
| `NODE_I3X_PRELOAD` | `preload` | `true` |
|
|
103
|
+
| `NODE_I3X_PRELOAD_STRICT` | `preloadStrict` | `false` |
|
|
99
104
|
|
|
100
105
|
## Programmatic Usage
|
|
101
106
|
|
package/dist/cli.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{createRequire as
|
|
2
|
+
import{createRequire as j}from"module";import{Command as $}from"commander";import{cosmiconfig as M}from"cosmiconfig";import{load as E}from"js-yaml";var w={endpoint:"opc.tcp://localhost:4840",port:8080,host:"0.0.0.0",securityMode:"Auto",securityPolicy:"Auto",optimizedClient:"auto",publishIntervalMs:1e3,samplingIntervalMs:250,logLevel:"info",preload:!0,preloadStrict:!1,readOnly:!1,requireAuth:!1,experimental:!1};function o(e){return process.env[e]}function h(e){let i=process.env[e];return i?parseInt(i,10):void 0}function I(e){let i=process.env[e];if(i)return i==="1"||i.toLowerCase()==="true"}function D(){let e={},i=o("NODE_I3X_OPCUA_ENDPOINT")??o("NODE_I3X_ENDPOINT");i&&(e.endpoint=i);let t=h("NODE_I3X_PORT");t!==void 0&&(e.port=t);let r=o("NODE_I3X_HOST");r&&(e.host=r);let l=o("NODE_I3X_OPCUA_SECURITY_MODE");l&&(e.securityMode=l);let n=o("NODE_I3X_OPCUA_SECURITY_POLICY");n&&(e.securityPolicy=n);let a=o("NODE_I3X_PKI_FOLDER");a&&(e.pkiFolder=a);let m=o("NODE_I3X_CERTIFICATE_SUBJECT");m&&(e.certificateSubject=m);let c=o("NODE_I3X_OPCUA_OPTIMIZED_CLIENT");(c==="auto"||c==="disabled")&&(e.optimizedClient=c);let p=h("NODE_I3X_PUBLISH_INTERVAL_MS");p!==void 0&&(e.publishIntervalMs=p);let d=h("NODE_I3X_SAMPLING_INTERVAL_MS");d!==void 0&&(e.samplingIntervalMs=d);let g=o("NODE_I3X_LOG_LEVEL");g&&(e.logLevel=g);let f=I("NODE_I3X_PRELOAD");f!==void 0&&(e.preload=f);let y=I("NODE_I3X_PRELOAD_STRICT");y!==void 0&&(e.preloadStrict=y);let u=o("NODE_I3X_OPCUA_USERNAME");u&&(e.username=u);let v=o("NODE_I3X_OPCUA_PASSWORD");v&&(e.password=v);let S=I("NODE_I3X_READ_ONLY");S!==void 0&&(e.readOnly=S);let O=I("NODE_I3X_REQUIRE_AUTH");O!==void 0&&(e.requireAuth=O);let _=I("NODE_I3X_EXPERIMENTAL");_!==void 0&&(e.experimental=_);let C=o("NODE_I3X_API_KEY");return C&&(e.apiKey=C),e}async function P(e,i){let t={},r=M("i3x",{searchPlaces:["i3x.config.yml","i3x.config.yaml","i3x.config.json",".i3xrc",".i3xrc.json",".i3xrc.yml",".i3xrc.yaml","package.json"],loaders:{".yml":(n,a)=>E(a),".yaml":(n,a)=>E(a)}});try{let n=i?await r.load(i):await r.search();n&&!n.isEmpty&&(t=n.config)}catch(n){console.debug(`No config file loaded: ${n.message}`)}let l=D();return{...w,...t,...l,...e}}import{randomBytes as U}from"crypto";import{consoleLogger as T,createI3xStack as L}from"@node-i3x/core";import{OpcUaClient as k,OpcUaDataSourceAdapter as R}from"@node-i3x/opcua-connector";import{createApp as X}from"@node-i3x/rest-server";function A(e,i,t){let r=["",` i3X Server v${e}`,"",` OPC UA: ${i.endpoint}`,` REST: http://${i.host}:${i.port}`,` Auth: ${i.apiKey?`Bearer${i.requireAuth?" (required)":""}`:"none (open)"}`];t!==void 0&&r.push(` Model: ${t} nodes`),r.push(""),r.push(" Press Ctrl+C to stop"),r.push("");let n=Math.max(...r.map(p=>p.length))+2,a="-".repeat(n),m=` +${a}+`,c=` +${a}+`;console.log(m);for(let p of r)console.log(` |${p.padEnd(n)}|`);console.log(c),console.log()}function s(e,i,t){let r={type:"progress",phase:e,message:i,timestamp:Date.now(),...t};typeof process.send=="function"&&process.send(r)}async function b(e,i){let t=T;s("initializing","Creating OPC UA client...");let r=new k({endpointUrl:e.endpoint,securityMode:e.securityMode,securityPolicy:e.securityPolicy,pkiFolder:e.pkiFolder,certificateSubject:e.certificateSubject,optimizedClient:e.optimizedClient,username:e.username,password:e.password},t),l=new R(r,t),{modelService:n,valueService:a,historyService:m,subscriptionService:c,typeService:p}=L(l,t,{publishIntervalMs:e.publishIntervalMs,samplingIntervalMs:e.samplingIntervalMs});s("creating-rest","Creating REST API server...");let d=e.apiKey;if(d==="auto"&&(d=`i3x_sk_${U(16).toString("hex")}`),e.requireAuth&&!d&&(t.error('requireAuth is enabled but no apiKey is configured. Set --api-key <key> (or "auto") to enable Bearer token authentication, or disable requireAuth.'),process.exit(1)),d){let u=e.requireAuth?"enforced":"enabled";t.info(`API authentication ${u} (Bearer token)`)}let g=await X({dataSource:l,modelService:n,typeService:p,valueService:a,historyService:m,subscriptionService:c,logger:t,readOnly:e.readOnly,apiKey:d,experimental:e.experimental,getOpcuaStats:()=>r.getStats()});s("connecting",`Connecting to ${e.endpoint}...`),await l.connect(),s("connected","OPC UA session established");let f;if(e.preload)try{s("preloading-model","Preloading object model..."),f=(await n.preloadModel()).nodesById.size,s("model-loaded",`Model loaded: ${f} nodes`,{nodeCount:f}),s("preloading-types","Preloading type definitions..."),await p.preloadTypes(),s("types-loaded","Type definitions loaded")}catch(u){s("error",`Model preload failed: ${String(u)}`),t.error(`Model preload failed: ${String(u)}`),e.preloadStrict&&process.exit(1)}s("starting-http","Starting HTTP server..."),await g.listen({port:e.port,host:e.host}),s("ready",`Server listening on ${e.host}:${e.port}`,{port:e.port,host:e.host,apiKey:d,opcuaStartupStats:r.getStats()}),A(i,e,f);let y=async()=>{t.info("Shutting down..."),await g.close(),await c.close(),await l.disconnect(),process.exit(0)};process.on("SIGINT",y),process.on("SIGTERM",y)}var q=j(import.meta.url),x=q("../package.json"),N=new $;N.name("i3x").description("Expose OPC UA servers as i3X REST APIs").version(x.version).option("-e, --endpoint <url>","OPC UA endpoint URL").option("-p, --port <port>","REST API port",parseInt).option("-H, --host <host>","REST API bind address").option("--security-mode <mode>","OPC UA security mode (None, Sign, SignAndEncrypt, Auto)").option("--security-policy <policy>","OPC UA security policy (e.g. Basic256Sha256)").option("--pki-folder <path>","PKI folder for certificate storage").option("--certificate-subject <subject>","X.500 subject for the client certificate (e.g. /CN=my-app/O=Acme/OU=user@acme.com)").option("--optimized-client <mode>","Optimized client: auto | disabled").option("--publish-interval <ms>","OPC UA publishing interval in milliseconds",parseInt).option("--sampling-interval <ms>","OPC UA sampling interval in milliseconds",parseInt).option("--log-level <level>","Log level: debug | info | warn | error").option("--no-preload","Skip model preload on startup").option("--preload-strict","Exit if model preload fails").option("--username <user>","OPC UA username for UserName identity token").option("--password <pass>","OPC UA password for UserName identity token").option("--read-only","Disable write operations (advertise read-only capabilities)").option("--experimental","Enable experimental convenience and extension routes").option("--require-auth","Require Bearer token auth (exit if no apiKey is configured)").option("--api-key <key>",'API key for Bearer token auth (use "auto" to generate)').option("-c, --config <path>","Path to config file").action(async e=>{let i={};e.endpoint&&(i.endpoint=e.endpoint),e.port!==void 0&&(i.port=e.port),e.host&&(i.host=e.host),e.securityMode&&(i.securityMode=e.securityMode),e.securityPolicy&&(i.securityPolicy=e.securityPolicy),e.pkiFolder&&(i.pkiFolder=e.pkiFolder),e.certificateSubject&&(i.certificateSubject=e.certificateSubject),e.optimizedClient&&(i.optimizedClient=e.optimizedClient),e.publishInterval!==void 0&&(i.publishIntervalMs=e.publishInterval),e.samplingInterval!==void 0&&(i.samplingIntervalMs=e.samplingInterval),e.logLevel&&(i.logLevel=e.logLevel),e.preload===!1&&(i.preload=!1),e.preloadStrict&&(i.preloadStrict=!0),e.username&&(i.username=e.username),e.password&&(i.password=e.password),e.readOnly&&(i.readOnly=!0),e.experimental&&(i.experimental=!0),e.requireAuth&&(i.requireAuth=!0),e.apiKey&&(i.apiKey=e.apiKey);let t=await P(i,e.config);await b(t,x.version)});N.parse();
|
|
3
3
|
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli.ts","../src/config.ts","../src/server.ts","../src/banner.ts"],"mappings":";AAAA,OAAS,iBAAAA,MAAqB,SAC9B,OAAS,WAAAC,MAAe,YCDxB,OAAS,eAAAC,MAAmB,cAC5B,OAAS,QAAQC,MAAgB,
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts","../src/config.ts","../src/server.ts","../src/banner.ts"],"mappings":"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","names":["createRequire","Command","cosmiconfig","loadYaml","DEFAULTS","envStr","key","envInt","v","envBool","fromEnv","result","endpoint","port","host","securityMode","securityPolicy","pkiFolder","certSubject","optimizedClient","publishInterval","samplingInterval","logLevel","preload","preloadStrict","username","password","readOnly","requireAuth","experimental","apiKey","resolveConfig","cliArgs","configPath","fileConfig","explorer","_filepath","content","err","envConfig","randomBytes","consoleLogger","createI3xStack","OpcUaClient","OpcUaDataSourceAdapter","createApp","printBanner","version","config","nodeCount","lines","width","l","hr","top","bot","line","sendProgress","phase","message","extra","msg","startServer","config","version","logger","consoleLogger","opcuaClient","OpcUaClient","dataSource","OpcUaDataSourceAdapter","modelService","valueService","historyService","subscriptionService","typeService","createI3xStack","apiKey","randomBytes","mode","app","createApp","nodeCount","err","printBanner","shutdown","require","createRequire","pkg","program","Command","opts","cliArgs","config","resolveConfig","startServer"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -3,12 +3,18 @@ interface I3xConfig {
|
|
|
3
3
|
port: number;
|
|
4
4
|
host: string;
|
|
5
5
|
securityMode: string;
|
|
6
|
+
securityPolicy: string;
|
|
7
|
+
pkiFolder?: string;
|
|
8
|
+
certificateSubject?: string;
|
|
6
9
|
optimizedClient: 'auto' | 'disabled';
|
|
7
|
-
|
|
10
|
+
publishIntervalMs: number;
|
|
11
|
+
samplingIntervalMs: number;
|
|
8
12
|
logLevel: string;
|
|
9
|
-
|
|
10
|
-
|
|
13
|
+
preload: boolean;
|
|
14
|
+
preloadStrict: boolean;
|
|
11
15
|
readOnly: boolean;
|
|
16
|
+
requireAuth: boolean;
|
|
17
|
+
experimental: boolean;
|
|
12
18
|
username?: string;
|
|
13
19
|
password?: string;
|
|
14
20
|
apiKey?: string;
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{cosmiconfig as
|
|
1
|
+
import{cosmiconfig as P}from"cosmiconfig";import{load as v}from"js-yaml";var A={endpoint:"opc.tcp://localhost:4840",port:8080,host:"0.0.0.0",securityMode:"Auto",securityPolicy:"Auto",optimizedClient:"auto",publishIntervalMs:1e3,samplingIntervalMs:250,logLevel:"info",preload:!0,preloadStrict:!1,readOnly:!1,requireAuth:!1,experimental:!1};function i(e){return process.env[e]}function y(e){let t=process.env[e];return t?parseInt(t,10):void 0}function _(e){let t=process.env[e];if(t)return t==="1"||t.toLowerCase()==="true"}function b(){let e={},t=i("NODE_I3X_OPCUA_ENDPOINT")??i("NODE_I3X_ENDPOINT");t&&(e.endpoint=t);let o=y("NODE_I3X_PORT");o!==void 0&&(e.port=o);let n=i("NODE_I3X_HOST");n&&(e.host=n);let l=i("NODE_I3X_OPCUA_SECURITY_MODE");l&&(e.securityMode=l);let r=i("NODE_I3X_OPCUA_SECURITY_POLICY");r&&(e.securityPolicy=r);let s=i("NODE_I3X_PKI_FOLDER");s&&(e.pkiFolder=s);let m=i("NODE_I3X_CERTIFICATE_SUBJECT");m&&(e.certificateSubject=m);let c=i("NODE_I3X_OPCUA_OPTIMIZED_CLIENT");(c==="auto"||c==="disabled")&&(e.optimizedClient=c);let p=y("NODE_I3X_PUBLISH_INTERVAL_MS");p!==void 0&&(e.publishIntervalMs=p);let d=y("NODE_I3X_SAMPLING_INTERVAL_MS");d!==void 0&&(e.samplingIntervalMs=d);let I=i("NODE_I3X_LOG_LEVEL");I&&(e.logLevel=I);let f=_("NODE_I3X_PRELOAD");f!==void 0&&(e.preload=f);let g=_("NODE_I3X_PRELOAD_STRICT");g!==void 0&&(e.preloadStrict=g);let u=i("NODE_I3X_OPCUA_USERNAME");u&&(e.username=u);let E=i("NODE_I3X_OPCUA_PASSWORD");E&&(e.password=E);let S=_("NODE_I3X_READ_ONLY");S!==void 0&&(e.readOnly=S);let O=_("NODE_I3X_REQUIRE_AUTH");O!==void 0&&(e.requireAuth=O);let h=_("NODE_I3X_EXPERIMENTAL");h!==void 0&&(e.experimental=h);let C=i("NODE_I3X_API_KEY");return C&&(e.apiKey=C),e}async function N(e,t){let o={},n=P("i3x",{searchPlaces:["i3x.config.yml","i3x.config.yaml","i3x.config.json",".i3xrc",".i3xrc.json",".i3xrc.yml",".i3xrc.yaml","package.json"],loaders:{".yml":(r,s)=>v(s),".yaml":(r,s)=>v(s)}});try{let r=t?await n.load(t):await n.search();r&&!r.isEmpty&&(o=r.config)}catch(r){console.debug(`No config file loaded: ${r.message}`)}let l=b();return{...A,...o,...l,...e}}import{randomBytes as D}from"crypto";import{consoleLogger as M,createI3xStack as T}from"@node-i3x/core";import{OpcUaClient as w,OpcUaDataSourceAdapter as L}from"@node-i3x/opcua-connector";import{createApp as X}from"@node-i3x/rest-server";function x(e,t,o){let n=["",` i3X Server v${e}`,"",` OPC UA: ${t.endpoint}`,` REST: http://${t.host}:${t.port}`,` Auth: ${t.apiKey?`Bearer${t.requireAuth?" (required)":""}`:"none (open)"}`];o!==void 0&&n.push(` Model: ${o} nodes`),n.push(""),n.push(" Press Ctrl+C to stop"),n.push("");let r=Math.max(...n.map(p=>p.length))+2,s="-".repeat(r),m=` +${s}+`,c=` +${s}+`;console.log(m);for(let p of n)console.log(` |${p.padEnd(r)}|`);console.log(c),console.log()}function a(e,t,o){let n={type:"progress",phase:e,message:t,timestamp:Date.now(),...o};typeof process.send=="function"&&process.send(n)}async function R(e,t){let o=M;a("initializing","Creating OPC UA client...");let n=new w({endpointUrl:e.endpoint,securityMode:e.securityMode,securityPolicy:e.securityPolicy,pkiFolder:e.pkiFolder,certificateSubject:e.certificateSubject,optimizedClient:e.optimizedClient,username:e.username,password:e.password},o),l=new L(n,o),{modelService:r,valueService:s,historyService:m,subscriptionService:c,typeService:p}=T(l,o,{publishIntervalMs:e.publishIntervalMs,samplingIntervalMs:e.samplingIntervalMs});a("creating-rest","Creating REST API server...");let d=e.apiKey;if(d==="auto"&&(d=`i3x_sk_${D(16).toString("hex")}`),e.requireAuth&&!d&&(o.error('requireAuth is enabled but no apiKey is configured. Set --api-key <key> (or "auto") to enable Bearer token authentication, or disable requireAuth.'),process.exit(1)),d){let u=e.requireAuth?"enforced":"enabled";o.info(`API authentication ${u} (Bearer token)`)}let I=await X({dataSource:l,modelService:r,typeService:p,valueService:s,historyService:m,subscriptionService:c,logger:o,readOnly:e.readOnly,apiKey:d,experimental:e.experimental,getOpcuaStats:()=>n.getStats()});a("connecting",`Connecting to ${e.endpoint}...`),await l.connect(),a("connected","OPC UA session established");let f;if(e.preload)try{a("preloading-model","Preloading object model..."),f=(await r.preloadModel()).nodesById.size,a("model-loaded",`Model loaded: ${f} nodes`,{nodeCount:f}),a("preloading-types","Preloading type definitions..."),await p.preloadTypes(),a("types-loaded","Type definitions loaded")}catch(u){a("error",`Model preload failed: ${String(u)}`),o.error(`Model preload failed: ${String(u)}`),e.preloadStrict&&process.exit(1)}a("starting-http","Starting HTTP server..."),await I.listen({port:e.port,host:e.host}),a("ready",`Server listening on ${e.host}:${e.port}`,{port:e.port,host:e.host,apiKey:d,opcuaStartupStats:n.getStats()}),x(t,e,f);let g=async()=>{o.info("Shutting down..."),await I.close(),await c.close(),await l.disconnect(),process.exit(0)};process.on("SIGINT",g),process.on("SIGTERM",g)}export{N as resolveConfig,R as startServer};
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/config.ts","../src/server.ts","../src/banner.ts"],"mappings":"AAAA,OAAS,eAAAA,MAAmB,cAC5B,OAAS,QAAQC,MAAgB,
|
|
1
|
+
{"version":3,"sources":["../src/config.ts","../src/server.ts","../src/banner.ts"],"mappings":"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","names":["cosmiconfig","loadYaml","DEFAULTS","envStr","key","envInt","v","envBool","fromEnv","result","endpoint","port","host","securityMode","securityPolicy","pkiFolder","certSubject","optimizedClient","publishInterval","samplingInterval","logLevel","preload","preloadStrict","username","password","readOnly","requireAuth","experimental","apiKey","resolveConfig","cliArgs","configPath","fileConfig","explorer","_filepath","content","err","envConfig","randomBytes","consoleLogger","createI3xStack","OpcUaClient","OpcUaDataSourceAdapter","createApp","printBanner","version","config","nodeCount","lines","width","l","hr","top","bot","line","sendProgress","phase","message","extra","msg","startServer","config","version","logger","consoleLogger","opcuaClient","OpcUaClient","dataSource","OpcUaDataSourceAdapter","modelService","valueService","historyService","subscriptionService","typeService","createI3xStack","apiKey","randomBytes","mode","app","createApp","nodeCount","err","printBanner","shutdown"]}
|
package/i3x.config.example.yml
CHANGED
|
@@ -12,10 +12,13 @@ host: 0.0.0.0
|
|
|
12
12
|
securityMode: None
|
|
13
13
|
# optimizedClient: auto
|
|
14
14
|
|
|
15
|
-
#
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
15
|
+
# OPC UA subscription intervals (milliseconds)
|
|
16
|
+
publishIntervalMs: 1000
|
|
17
|
+
samplingIntervalMs: 250
|
|
18
|
+
|
|
19
|
+
# Model preloading
|
|
20
|
+
preload: true
|
|
21
|
+
# preloadStrict: false
|
|
19
22
|
|
|
20
23
|
# Logging
|
|
21
24
|
logLevel: info
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@node-i3x/app",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.7.0",
|
|
4
4
|
"description": "i3X CLI -- expose OPC UA servers as i3X REST APIs",
|
|
5
5
|
"license": "AGPL-3.0-or-later OR LicenseRef-Sterfive-Commercial",
|
|
6
6
|
"author": "Sterfive SAS <contact@sterfive.com> (https://sterfive.com)",
|
|
@@ -18,6 +18,7 @@
|
|
|
18
18
|
},
|
|
19
19
|
"exports": {
|
|
20
20
|
".": {
|
|
21
|
+
"source": "./src/index.ts",
|
|
21
22
|
"types": "./dist/index.d.ts",
|
|
22
23
|
"import": "./dist/index.js"
|
|
23
24
|
}
|
|
@@ -39,9 +40,9 @@
|
|
|
39
40
|
"typecheck": "tsc --noEmit"
|
|
40
41
|
},
|
|
41
42
|
"dependencies": {
|
|
42
|
-
"@node-i3x/core": "0.
|
|
43
|
-
"@node-i3x/opcua-connector": "0.
|
|
44
|
-
"@node-i3x/rest-server": "0.
|
|
43
|
+
"@node-i3x/core": "0.7.0",
|
|
44
|
+
"@node-i3x/opcua-connector": "0.7.0",
|
|
45
|
+
"@node-i3x/rest-server": "0.7.0",
|
|
45
46
|
"commander": "^15.0.0",
|
|
46
47
|
"cosmiconfig": "^9.0.2",
|
|
47
48
|
"fastify": "^5.8.5",
|