nacos-sdk-rust-binding-node 0.5.3 → 0.6.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/AGENTS.md ADDED
@@ -0,0 +1,148 @@
1
+ # AGENTS.md
2
+
3
+ This file provides guidance to AI coding agents when working with code in this repository.
4
+
5
+ ## Project Overview
6
+
7
+ This is a Node.js native addon providing bindings to the Nacos service discovery and configuration management system. It uses [napi-rs](https://napi.rs/) to bridge Rust (`nacos-sdk-rust`) with Node.js/TypeScript, offering better performance than the official JavaScript SDK which lacks gRPC support.
8
+
9
+ ## Architecture
10
+
11
+ ### Hybrid Rust/Node.js Structure
12
+
13
+ - **Rust Layer** (`src/*.rs`): Core Nacos client implementation using `nacos-sdk-rust`
14
+ - `lib.rs`: Entry point, `ClientOptions` struct
15
+ - `config.rs`: Configuration management (`NacosConfigClient`)
16
+ - `naming.rs`: Service discovery (`NacosNamingClient`)
17
+ - `plugin.rs`: Config filter plugin interface for encryption/decryption
18
+
19
+ - **TypeScript Definitions** (`index.d.ts`): Auto-generated from Rust code via `napi-rs` during build
20
+
21
+ ### Key Data Flows
22
+
23
+ 1. **Config Client**: `getConfig()` → Rust SDK → Nacos Server → async response
24
+ 2. **Naming Client**: `registerInstance()` → Rust SDK → Nacos Server → async response
25
+ 3. **Subscriptions**: Rust SDK maintains long-lived gRPC connections; pushes updates via `ThreadsafeFunction` callbacks to JS
26
+
27
+ ### Type Conventions
28
+
29
+ - Rust `Option<T>` maps to TypeScript `T | undefined | null`
30
+ - Async Rust methods return JavaScript Promises
31
+ - Callbacks use `ThreadsafeFunction` for thread-safe JS invocation from Rust
32
+ - Nacos errors are converted to JS `Error` with reason string
33
+
34
+ ## Build System
35
+
36
+ This project uses:
37
+ - **Cargo**: Rust dependency management and compilation
38
+ - **napi-rs**: Native Node.js addon framework
39
+ - **Yarn 3.4.1**: Package manager (specified in `packageManager` field)
40
+
41
+ ### Common Commands
42
+
43
+ ```bash
44
+ # Install dependencies
45
+ yarn install
46
+
47
+ # Build debug native addon (faster, for development)
48
+ yarn build:debug
49
+
50
+ # Build release native addon (optimized)
51
+ yarn build
52
+
53
+ # Run tests (requires compiled .node file)
54
+ yarn test
55
+
56
+ # Collect build artifacts for distribution
57
+ yarn artifacts
58
+
59
+ # Create universal macOS binary (combines x64 + arm64)
60
+ yarn universal
61
+ ```
62
+
63
+ ### Cross-Compilation Targets
64
+
65
+ The CI builds for multiple platforms (see `.github/workflows/CI.yml`):
66
+ - macOS: `x86_64-apple-darwin`, `aarch64-apple-darwin`, `universal-apple-darwin`
67
+ - Linux: `x86_64-unknown-linux-gnu/musl`, `aarch64-unknown-linux-gnu/musl`, `armv7-unknown-linux-gnueabihf`
68
+ - Windows: `x86_64-pc-windows-msvc`, `i686-pc-windows-msvc`, `aarch64-pc-windows-msvc`
69
+ - Android: `aarch64-linux-android`, `armv7-linux-androideabi`
70
+
71
+ Target-specific builds: `yarn build --target <target-triple>`
72
+
73
+ ### Build Outputs
74
+
75
+ - Compiled native addon: `nacos-sdk-rust-binding-node.<platform>.node`
76
+ - TypeScript definitions: `index.d.ts` (auto-generated)
77
+
78
+ ## Testing
79
+
80
+ Uses [AVA](https://github.com/avajs/ava) test framework with 3-minute timeout:
81
+
82
+ ```bash
83
+ # Run all tests
84
+ yarn test
85
+
86
+ # Run a specific test file
87
+ yarn test __test__/index.spec.mjs
88
+ ```
89
+
90
+ Note: Tests require the native addon to be built first (`index.node` must exist).
91
+
92
+ ## Environment Variables
93
+
94
+ - `NACOS_CLIENT_LOGGER_LEVEL`: Log level (default: `INFO`, logs to `$HOME/logs/nacos/`)
95
+ - `NACOS_CLIENT_COMMON_THREAD_CORES`: Client thread pool size (default: `1`)
96
+ - `NACOS_CLIENT_NAMING_PUSH_EMPTY_PROTECTION`: Protect against empty service list pushes (default: `true`)
97
+
98
+ See [nacos-sdk-rust docs](https://github.com/nacos-group/nacos-sdk-rust) for more environment variables.
99
+
100
+ ## API Usage Patterns
101
+
102
+ ### Config Client
103
+
104
+ ```javascript
105
+ const { NacosConfigClient } = require('nacos-sdk-rust-binding-node');
106
+
107
+ const client = new NacosConfigClient({
108
+ serverAddr: '127.0.0.1:8848',
109
+ namespace: 'my-namespace',
110
+ // Optional auth:
111
+ username: 'user',
112
+ password: 'pass'
113
+ });
114
+
115
+ const content = await client.getConfig('dataId', 'group');
116
+ await client.addListener('dataId', 'group', (err, config) => {
117
+ // Handle push updates
118
+ });
119
+ ```
120
+
121
+ ### Naming Client
122
+
123
+ ```javascript
124
+ const { NacosNamingClient } = require('nacos-sdk-rust-binding-node');
125
+
126
+ const client = new NacosNamingClient({
127
+ serverAddr: '127.0.0.1:8848',
128
+ namespace: 'my-namespace'
129
+ });
130
+
131
+ await client.registerInstance('service', 'group', {
132
+ ip: '192.168.1.1',
133
+ port: 8080
134
+ });
135
+ ```
136
+
137
+ ## Important Implementation Notes
138
+
139
+ - **removeListener/unSubscribe**: These are NOOPs - the underlying Rust SDK doesn't implement removal, but this is typically not problematic as listeners are long-lived
140
+ - **Clients are stateful**: Each client maintains persistent gRPC connections; create once and reuse for the application lifecycle
141
+ - **Auth methods**: Supports HTTP token auth (username/password) or Alibaba Cloud RAM (access_key/access_secret)
142
+ - **Build dependency**: require `nacos-sdk-rust` and `napi`
143
+
144
+ ## Troubleshooting
145
+
146
+ - If build fails, ensure Rust toolchain is up to date: `rustup update stable && cargo update`
147
+ - For cross-compilation issues, refer to the Docker images and setup in CI workflow
148
+ - Native addon loading errors usually indicate platform/architecture mismatch between build target and runtime
package/Cargo.toml CHANGED
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "nacos-sdk-rust-binding-node"
3
- version = "0.5.3"
3
+ version = "0.6.0"
4
4
  edition = "2024"
5
5
  license = "Apache-2.0"
6
6
  publish = false
@@ -19,10 +19,11 @@ crate-type = ["cdylib"]
19
19
  napi = { version = "2", default-features = false, features = ["napi4", "async"] }
20
20
  napi-derive = "2"
21
21
 
22
- #nacos-sdk = { version = "0.5.3", features = ["default", "auth-by-aliyun", "tracing-log"] }
23
- nacos-sdk = { git = "https://github.com/nacos-group/nacos-sdk-rust.git", branch = "main", features = ["default", "auth-by-aliyun", "tracing-log"] }
22
+ nacos-sdk = { version = "0.6.0", features = ["default", "auth-by-aliyun", "tracing-log"] }
23
+ #nacos-sdk = { git = "https://github.com/nacos-group/nacos-sdk-rust.git", branch = "main", features = ["default", "auth-by-aliyun", "tracing-log"] }
24
24
 
25
25
  async-trait = "0.1"
26
+ tokio = { version = "1", features = ["rt"] }
26
27
 
27
28
  [build-dependencies]
28
29
  napi-build = "2"
package/README.md CHANGED
@@ -13,7 +13,7 @@ npm 包 -> https://www.npmjs.com/package/nacos-sdk-rust-binding-node
13
13
 
14
14
  环境变量 `NACOS_CLIENT_COMMON_THREAD_CORES=4` 可设置客户端核心线程数,默认 1
15
15
 
16
- 环境变量 `ENV_NACOS_CLIENT_NAMING_PUSH_EMPTY_PROTECTION=false` 可关闭 Naming 防推空保护,默认 true
16
+ 环境变量 `NACOS_CLIENT_NAMING_PUSH_EMPTY_PROTECTION=false` 可关闭 Naming 防推空保护,默认 true
17
17
 
18
18
  更多环境变量请看 `nacos-sdk-rust` 的[文档说明](https://github.com/nacos-group/nacos-sdk-rust)
19
19
 
package/index.d.ts CHANGED
@@ -1,9 +1,99 @@
1
- /* auto-generated by NAPI-RS */
1
+ /* tslint:disable */
2
2
  /* eslint-disable */
3
+
4
+ /* auto-generated by NAPI-RS */
5
+
6
+ export declare function sum(a: number, b: number): number
7
+ export interface ClientOptions {
8
+ /** Server Addr, e.g. address:port[,address:port],...] */
9
+ serverAddr: string
10
+ /** Namespace/Tenant */
11
+ namespace: string
12
+ /** AppName */
13
+ appName?: string
14
+ /** Username for Auth, Login by Http with Token */
15
+ username?: string
16
+ /** Password for Auth, Login by Http with Token */
17
+ password?: string
18
+ /** Access_Key for Auth, Login by Aliyun Ram */
19
+ accessKey?: string
20
+ /** Access_Secret for Auth, Login by Aliyun Ram */
21
+ accessSecret?: string
22
+ /** Signature_Region_Id for Auth, Login by Aliyun Ram */
23
+ signatureRegionId?: string
24
+ /** naming push_empty_protection, default true */
25
+ namingPushEmptyProtection?: boolean
26
+ /** naming load_cache_at_start, default false */
27
+ namingLoadCacheAtStart?: boolean
28
+ /** config load_cache_at_start, default false */
29
+ configLoadCacheAtStart?: boolean
30
+ }
31
+ export interface NacosConfigResponse {
32
+ /** Namespace/Tenant */
33
+ namespace: string
34
+ /** DataId */
35
+ dataId: string
36
+ /** Group */
37
+ group: string
38
+ /** Content */
39
+ content: string
40
+ /** Content's Type; e.g. json,properties,xml,html,text,yaml */
41
+ contentType: string
42
+ /** Content's md5 */
43
+ md5: string
44
+ }
45
+ export interface NacosServiceInstance {
46
+ /** Instance Id */
47
+ instanceId?: string
48
+ /** Ip */
49
+ ip: string
50
+ /** Port */
51
+ port: number
52
+ /** Weight, default 1.0 */
53
+ weight?: number
54
+ /** Healthy or not, default true */
55
+ healthy?: boolean
56
+ /** Enabled ot not, default true */
57
+ enabled?: boolean
58
+ /** Ephemeral or not, default true */
59
+ ephemeral?: boolean
60
+ /** Cluster Name, default 'DEFAULT' */
61
+ clusterName?: string
62
+ /** Service Name */
63
+ serviceName?: string
64
+ /** Metadata, default '{}' */
65
+ metadata?: Record<string, string>
66
+ }
67
+ /** ConfigReq for [`ConfigFilter`] */
68
+ export interface NacosConfigReq {
69
+ /** DataId */
70
+ dataId: string
71
+ /** Group */
72
+ group: string
73
+ /** Namespace/Tenant */
74
+ namespace: string
75
+ /** Content */
76
+ content: string
77
+ /** Content's Encrypted Data Key. */
78
+ encryptedDataKey: string
79
+ }
80
+ /** ConfigResp for [`ConfigFilter`] */
81
+ export interface NacosConfigResp {
82
+ /** DataId */
83
+ dataId: string
84
+ /** Group */
85
+ group: string
86
+ /** Namespace/Tenant */
87
+ namespace: string
88
+ /** Content */
89
+ content: string
90
+ /** Content's Encrypted Data Key. */
91
+ encryptedDataKey: string
92
+ }
3
93
  /** Client api of Nacos Config. */
4
- export declare class NacosConfigClient {
94
+ export class NacosConfigClient {
5
95
  /** Build a Config Client. */
6
- constructor(clientOptions: ClientOptions, configFilter?: (((err: Error | null, arg0?: NacosConfigReq | undefined | null, arg1?: NacosConfigResp | undefined | null) => any)) | undefined | null)
96
+ constructor(clientOptions: ClientOptions, configFilter?: (err: Error | null, arg0?: NacosConfigReq | undefined | null, arg1?: NacosConfigResp | undefined | null) => any | undefined | null)
7
97
  /**
8
98
  * Get config's content.
9
99
  * If it fails, pay attention to err
@@ -28,17 +118,16 @@ export declare class NacosConfigClient {
28
118
  * Add NacosConfigChangeListener callback func, which listen the config change.
29
119
  * If it fails, pay attention to err
30
120
  */
31
- addListener(dataId: string, group: string, listener: ((err: Error | null, arg: NacosConfigResponse) => any)): Promise<void>
121
+ addListener(dataId: string, group: string, listener: (err: Error | null, arg: NacosConfigResponse) => any): Promise<void>
32
122
  /**
33
123
  * Remove NacosConfigChangeListener callback func, but noop....
34
124
  * The logic is not implemented internally, and only APIs are provided as compatibility.
35
125
  * Users maybe do not need it? Not removing the listener is not a big problem, Sorry!
36
126
  */
37
- removeListener(dataId: string, group: string, listener: ((err: Error | null, arg: NacosConfigResponse) => any)): Promise<void>
127
+ removeListener(dataId: string, group: string, listener: (err: Error | null, arg: NacosConfigResponse) => any): Promise<void>
38
128
  }
39
-
40
129
  /** Client api of Nacos Naming. */
41
- export declare class NacosNamingClient {
130
+ export class NacosNamingClient {
42
131
  /** Build a Naming Client. */
43
132
  constructor(clientOptions: ClientOptions)
44
133
  /**
@@ -75,102 +164,11 @@ export declare class NacosNamingClient {
75
164
  * Add NacosNamingEventListener callback func, which listen the instance change.
76
165
  * If it fails, pay attention to err
77
166
  */
78
- subscribe(serviceName: string, group: string, clusters: Array<string> | undefined | null, listener: ((err: Error | null, arg: Array<NacosServiceInstance>) => any)): Promise<void>
167
+ subscribe(serviceName: string, group: string, clusters: Array<string> | undefined | null, listener: (err: Error | null, arg: Array<NacosServiceInstance>) => any): Promise<void>
79
168
  /**
80
169
  * Remove NacosNamingEventListener callback func, but noop....
81
170
  * The logic is not implemented internally, and only APIs are provided as compatibility.
82
171
  * Users maybe do not need it? Not removing the subscription is not a big problem, Sorry!
83
172
  */
84
- unSubscribe(serviceName: string, group: string, clusters: Array<string> | undefined | null, listener: ((err: Error | null, arg: Array<NacosServiceInstance>) => any)): Promise<void>
173
+ unSubscribe(serviceName: string, group: string, clusters: Array<string> | undefined | null, listener: (err: Error | null, arg: Array<NacosServiceInstance>) => any): Promise<void>
85
174
  }
86
-
87
- export interface ClientOptions {
88
- /** Server Addr, e.g. address:port[,address:port],...] */
89
- serverAddr: string
90
- /** Namespace/Tenant */
91
- namespace: string
92
- /** AppName */
93
- appName?: string
94
- /** Username for Auth, Login by Http with Token */
95
- username?: string
96
- /** Password for Auth, Login by Http with Token */
97
- password?: string
98
- /** Access_Key for Auth, Login by Aliyun Ram */
99
- accessKey?: string
100
- /** Access_Secret for Auth, Login by Aliyun Ram */
101
- accessSecret?: string
102
- /** Signature_Region_Id for Auth, Login by Aliyun Ram */
103
- signatureRegionId?: string
104
- /** naming push_empty_protection, default true */
105
- namingPushEmptyProtection?: boolean
106
- /** naming load_cache_at_start, default false */
107
- namingLoadCacheAtStart?: boolean
108
- }
109
-
110
- /** ConfigReq for [`ConfigFilter`] */
111
- export interface NacosConfigReq {
112
- /** DataId */
113
- dataId: string
114
- /** Group */
115
- group: string
116
- /** Namespace/Tenant */
117
- namespace: string
118
- /** Content */
119
- content: string
120
- /** Content's Encrypted Data Key. */
121
- encryptedDataKey: string
122
- }
123
-
124
- /** ConfigResp for [`ConfigFilter`] */
125
- export interface NacosConfigResp {
126
- /** DataId */
127
- dataId: string
128
- /** Group */
129
- group: string
130
- /** Namespace/Tenant */
131
- namespace: string
132
- /** Content */
133
- content: string
134
- /** Content's Encrypted Data Key. */
135
- encryptedDataKey: string
136
- }
137
-
138
- export interface NacosConfigResponse {
139
- /** Namespace/Tenant */
140
- namespace: string
141
- /** DataId */
142
- dataId: string
143
- /** Group */
144
- group: string
145
- /** Content */
146
- content: string
147
- /** Content's Type; e.g. json,properties,xml,html,text,yaml */
148
- contentType: string
149
- /** Content's md5 */
150
- md5: string
151
- }
152
-
153
- export interface NacosServiceInstance {
154
- /** Instance Id */
155
- instanceId?: string
156
- /** Ip */
157
- ip: string
158
- /** Port */
159
- port: number
160
- /** Weight, default 1.0 */
161
- weight?: number
162
- /** Healthy or not, default true */
163
- healthy?: boolean
164
- /** Enabled ot not, default true */
165
- enabled?: boolean
166
- /** Ephemeral or not, default true */
167
- ephemeral?: boolean
168
- /** Cluster Name, default 'DEFAULT' */
169
- clusterName?: string
170
- /** Service Name */
171
- serviceName?: string
172
- /** Metadata, default '{}' */
173
- metadata?: Record<string, string>
174
- }
175
-
176
- export declare function sum(a: number, b: number): number
package/index.js CHANGED
@@ -1,581 +1,253 @@
1
- // prettier-ignore
2
- /* eslint-disable */
3
- // @ts-nocheck
4
- /* auto-generated by NAPI-RS */
1
+ const { existsSync, readFileSync } = require('fs')
2
+ const { join } = require('path')
5
3
 
6
- const { readFileSync } = require('node:fs')
7
- let nativeBinding = null
8
- const loadErrors = []
9
-
10
- const isMusl = () => {
11
- let musl = false
12
- if (process.platform === 'linux') {
13
- musl = isMuslFromFilesystem()
14
- if (musl === null) {
15
- musl = isMuslFromReport()
16
- }
17
- if (musl === null) {
18
- musl = isMuslFromChildProcess()
19
- }
20
- }
21
- return musl
22
- }
23
-
24
- const isFileMusl = (f) => f.includes('libc.musl-') || f.includes('ld-musl-')
4
+ const { platform, arch } = process
25
5
 
26
- const isMuslFromFilesystem = () => {
27
- try {
28
- return readFileSync('/usr/bin/ldd', 'utf-8').includes('musl')
29
- } catch {
30
- return null
31
- }
32
- }
6
+ let nativeBinding = null
7
+ let localFileExisted = false
8
+ let loadError = null
33
9
 
34
- const isMuslFromReport = () => {
35
- let report = null
36
- if (typeof process.report?.getReport === 'function') {
37
- process.report.excludeNetwork = true
38
- report = process.report.getReport()
39
- }
40
- if (!report) {
41
- return null
42
- }
43
- if (report.header && report.header.glibcVersionRuntime) {
44
- return false
45
- }
46
- if (Array.isArray(report.sharedObjects)) {
47
- if (report.sharedObjects.some(isFileMusl)) {
10
+ function isMusl() {
11
+ // For Node 10
12
+ if (!process.report || typeof process.report.getReport !== 'function') {
13
+ try {
14
+ const lddPath = require('child_process').execSync('which ldd').toString().trim();
15
+ return readFileSync(lddPath, 'utf8').includes('musl')
16
+ } catch (e) {
48
17
  return true
49
18
  }
50
- }
51
- return false
52
- }
53
-
54
- const isMuslFromChildProcess = () => {
55
- try {
56
- return require('child_process').execSync('ldd --version', { encoding: 'utf8' }).includes('musl')
57
- } catch (e) {
58
- // If we reach this case, we don't know if the system is musl or not, so is better to just fallback to false
59
- return false
19
+ } else {
20
+ const { glibcVersionRuntime } = process.report.getReport().header
21
+ return !glibcVersionRuntime
60
22
  }
61
23
  }
62
24
 
63
- function requireNative() {
64
- if (process.env.NAPI_RS_NATIVE_LIBRARY_PATH) {
65
- try {
66
- return require(process.env.NAPI_RS_NATIVE_LIBRARY_PATH);
67
- } catch (err) {
68
- loadErrors.push(err)
69
- }
70
- } else if (process.platform === 'android') {
71
- if (process.arch === 'arm64') {
72
- try {
73
- return require('./nacos-sdk-rust-binding-node.android-arm64.node')
74
- } catch (e) {
75
- loadErrors.push(e)
76
- }
77
- try {
78
- const binding = require('nacos-sdk-rust-binding-node-android-arm64')
79
- const bindingPackageVersion = require('nacos-sdk-rust-binding-node-android-arm64/package.json').version
80
- if (bindingPackageVersion !== '0.5.3' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
81
- throw new Error(`Native binding package version mismatch, expected 0.5.3 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
82
- }
83
- return binding
84
- } catch (e) {
85
- loadErrors.push(e)
86
- }
87
- } else if (process.arch === 'arm') {
88
- try {
89
- return require('./nacos-sdk-rust-binding-node.android-arm-eabi.node')
90
- } catch (e) {
91
- loadErrors.push(e)
92
- }
93
- try {
94
- const binding = require('nacos-sdk-rust-binding-node-android-arm-eabi')
95
- const bindingPackageVersion = require('nacos-sdk-rust-binding-node-android-arm-eabi/package.json').version
96
- if (bindingPackageVersion !== '0.5.3' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
97
- throw new Error(`Native binding package version mismatch, expected 0.5.3 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
98
- }
99
- return binding
100
- } catch (e) {
101
- loadErrors.push(e)
102
- }
103
- } else {
104
- loadErrors.push(new Error(`Unsupported architecture on Android ${process.arch}`))
105
- }
106
- } else if (process.platform === 'win32') {
107
- if (process.arch === 'x64') {
108
- if (process.config?.variables?.shlib_suffix === 'dll.a' || process.config?.variables?.node_target_type === 'shared_library') {
109
- try {
110
- return require('./nacos-sdk-rust-binding-node.win32-x64-gnu.node')
111
- } catch (e) {
112
- loadErrors.push(e)
113
- }
114
- try {
115
- const binding = require('nacos-sdk-rust-binding-node-win32-x64-gnu')
116
- const bindingPackageVersion = require('nacos-sdk-rust-binding-node-win32-x64-gnu/package.json').version
117
- if (bindingPackageVersion !== '0.5.3' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
118
- throw new Error(`Native binding package version mismatch, expected 0.5.3 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
119
- }
120
- return binding
121
- } catch (e) {
122
- loadErrors.push(e)
123
- }
124
- } else {
125
- try {
126
- return require('./nacos-sdk-rust-binding-node.win32-x64-msvc.node')
127
- } catch (e) {
128
- loadErrors.push(e)
129
- }
130
- try {
131
- const binding = require('nacos-sdk-rust-binding-node-win32-x64-msvc')
132
- const bindingPackageVersion = require('nacos-sdk-rust-binding-node-win32-x64-msvc/package.json').version
133
- if (bindingPackageVersion !== '0.5.3' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
134
- throw new Error(`Native binding package version mismatch, expected 0.5.3 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
135
- }
136
- return binding
137
- } catch (e) {
138
- loadErrors.push(e)
139
- }
140
- }
141
- } else if (process.arch === 'ia32') {
142
- try {
143
- return require('./nacos-sdk-rust-binding-node.win32-ia32-msvc.node')
144
- } catch (e) {
145
- loadErrors.push(e)
146
- }
147
- try {
148
- const binding = require('nacos-sdk-rust-binding-node-win32-ia32-msvc')
149
- const bindingPackageVersion = require('nacos-sdk-rust-binding-node-win32-ia32-msvc/package.json').version
150
- if (bindingPackageVersion !== '0.5.3' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
151
- throw new Error(`Native binding package version mismatch, expected 0.5.3 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
152
- }
153
- return binding
154
- } catch (e) {
155
- loadErrors.push(e)
156
- }
157
- } else if (process.arch === 'arm64') {
158
- try {
159
- return require('./nacos-sdk-rust-binding-node.win32-arm64-msvc.node')
160
- } catch (e) {
161
- loadErrors.push(e)
162
- }
163
- try {
164
- const binding = require('nacos-sdk-rust-binding-node-win32-arm64-msvc')
165
- const bindingPackageVersion = require('nacos-sdk-rust-binding-node-win32-arm64-msvc/package.json').version
166
- if (bindingPackageVersion !== '0.5.3' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
167
- throw new Error(`Native binding package version mismatch, expected 0.5.3 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
168
- }
169
- return binding
170
- } catch (e) {
171
- loadErrors.push(e)
172
- }
173
- } else {
174
- loadErrors.push(new Error(`Unsupported architecture on Windows: ${process.arch}`))
175
- }
176
- } else if (process.platform === 'darwin') {
177
- try {
178
- return require('./nacos-sdk-rust-binding-node.darwin-universal.node')
179
- } catch (e) {
180
- loadErrors.push(e)
181
- }
182
- try {
183
- const binding = require('nacos-sdk-rust-binding-node-darwin-universal')
184
- const bindingPackageVersion = require('nacos-sdk-rust-binding-node-darwin-universal/package.json').version
185
- if (bindingPackageVersion !== '0.5.3' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
186
- throw new Error(`Native binding package version mismatch, expected 0.5.3 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
187
- }
188
- return binding
189
- } catch (e) {
190
- loadErrors.push(e)
191
- }
192
- if (process.arch === 'x64') {
193
- try {
194
- return require('./nacos-sdk-rust-binding-node.darwin-x64.node')
195
- } catch (e) {
196
- loadErrors.push(e)
197
- }
198
- try {
199
- const binding = require('nacos-sdk-rust-binding-node-darwin-x64')
200
- const bindingPackageVersion = require('nacos-sdk-rust-binding-node-darwin-x64/package.json').version
201
- if (bindingPackageVersion !== '0.5.3' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
202
- throw new Error(`Native binding package version mismatch, expected 0.5.3 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
203
- }
204
- return binding
205
- } catch (e) {
206
- loadErrors.push(e)
207
- }
208
- } else if (process.arch === 'arm64') {
209
- try {
210
- return require('./nacos-sdk-rust-binding-node.darwin-arm64.node')
211
- } catch (e) {
212
- loadErrors.push(e)
213
- }
214
- try {
215
- const binding = require('nacos-sdk-rust-binding-node-darwin-arm64')
216
- const bindingPackageVersion = require('nacos-sdk-rust-binding-node-darwin-arm64/package.json').version
217
- if (bindingPackageVersion !== '0.5.3' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
218
- throw new Error(`Native binding package version mismatch, expected 0.5.3 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
219
- }
220
- return binding
221
- } catch (e) {
222
- loadErrors.push(e)
223
- }
224
- } else {
225
- loadErrors.push(new Error(`Unsupported architecture on macOS: ${process.arch}`))
226
- }
227
- } else if (process.platform === 'freebsd') {
228
- if (process.arch === 'x64') {
229
- try {
230
- return require('./nacos-sdk-rust-binding-node.freebsd-x64.node')
231
- } catch (e) {
232
- loadErrors.push(e)
233
- }
234
- try {
235
- const binding = require('nacos-sdk-rust-binding-node-freebsd-x64')
236
- const bindingPackageVersion = require('nacos-sdk-rust-binding-node-freebsd-x64/package.json').version
237
- if (bindingPackageVersion !== '0.5.3' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
238
- throw new Error(`Native binding package version mismatch, expected 0.5.3 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
239
- }
240
- return binding
241
- } catch (e) {
242
- loadErrors.push(e)
243
- }
244
- } else if (process.arch === 'arm64') {
245
- try {
246
- return require('./nacos-sdk-rust-binding-node.freebsd-arm64.node')
247
- } catch (e) {
248
- loadErrors.push(e)
249
- }
250
- try {
251
- const binding = require('nacos-sdk-rust-binding-node-freebsd-arm64')
252
- const bindingPackageVersion = require('nacos-sdk-rust-binding-node-freebsd-arm64/package.json').version
253
- if (bindingPackageVersion !== '0.5.3' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
254
- throw new Error(`Native binding package version mismatch, expected 0.5.3 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
255
- }
256
- return binding
257
- } catch (e) {
258
- loadErrors.push(e)
259
- }
260
- } else {
261
- loadErrors.push(new Error(`Unsupported architecture on FreeBSD: ${process.arch}`))
262
- }
263
- } else if (process.platform === 'linux') {
264
- if (process.arch === 'x64') {
265
- if (isMusl()) {
266
- try {
267
- return require('./nacos-sdk-rust-binding-node.linux-x64-musl.node')
268
- } catch (e) {
269
- loadErrors.push(e)
270
- }
271
- try {
272
- const binding = require('nacos-sdk-rust-binding-node-linux-x64-musl')
273
- const bindingPackageVersion = require('nacos-sdk-rust-binding-node-linux-x64-musl/package.json').version
274
- if (bindingPackageVersion !== '0.5.3' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
275
- throw new Error(`Native binding package version mismatch, expected 0.5.3 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
25
+ switch (platform) {
26
+ case 'android':
27
+ switch (arch) {
28
+ case 'arm64':
29
+ localFileExisted = existsSync(join(__dirname, 'nacos-sdk-rust-binding-node.android-arm64.node'))
30
+ try {
31
+ if (localFileExisted) {
32
+ nativeBinding = require('./nacos-sdk-rust-binding-node.android-arm64.node')
33
+ } else {
34
+ nativeBinding = require('nacos-sdk-rust-binding-node-android-arm64')
276
35
  }
277
- return binding
278
- } catch (e) {
279
- loadErrors.push(e)
280
- }
281
- } else {
282
- try {
283
- return require('./nacos-sdk-rust-binding-node.linux-x64-gnu.node')
284
36
  } catch (e) {
285
- loadErrors.push(e)
37
+ loadError = e
286
38
  }
39
+ break
40
+ case 'arm':
41
+ localFileExisted = existsSync(join(__dirname, 'nacos-sdk-rust-binding-node.android-arm-eabi.node'))
287
42
  try {
288
- const binding = require('nacos-sdk-rust-binding-node-linux-x64-gnu')
289
- const bindingPackageVersion = require('nacos-sdk-rust-binding-node-linux-x64-gnu/package.json').version
290
- if (bindingPackageVersion !== '0.5.3' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
291
- throw new Error(`Native binding package version mismatch, expected 0.5.3 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
43
+ if (localFileExisted) {
44
+ nativeBinding = require('./nacos-sdk-rust-binding-node.android-arm-eabi.node')
45
+ } else {
46
+ nativeBinding = require('nacos-sdk-rust-binding-node-android-arm-eabi')
292
47
  }
293
- return binding
294
- } catch (e) {
295
- loadErrors.push(e)
296
- }
297
- }
298
- } else if (process.arch === 'arm64') {
299
- if (isMusl()) {
300
- try {
301
- return require('./nacos-sdk-rust-binding-node.linux-arm64-musl.node')
302
48
  } catch (e) {
303
- loadErrors.push(e)
49
+ loadError = e
304
50
  }
305
- try {
306
- const binding = require('nacos-sdk-rust-binding-node-linux-arm64-musl')
307
- const bindingPackageVersion = require('nacos-sdk-rust-binding-node-linux-arm64-musl/package.json').version
308
- if (bindingPackageVersion !== '0.5.3' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
309
- throw new Error(`Native binding package version mismatch, expected 0.5.3 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
51
+ break
52
+ default:
53
+ throw new Error(`Unsupported architecture on Android ${arch}`)
54
+ }
55
+ break
56
+ case 'win32':
57
+ switch (arch) {
58
+ case 'x64':
59
+ localFileExisted = existsSync(
60
+ join(__dirname, 'nacos-sdk-rust-binding-node.win32-x64-msvc.node')
61
+ )
62
+ try {
63
+ if (localFileExisted) {
64
+ nativeBinding = require('./nacos-sdk-rust-binding-node.win32-x64-msvc.node')
65
+ } else {
66
+ nativeBinding = require('nacos-sdk-rust-binding-node-win32-x64-msvc')
310
67
  }
311
- return binding
312
- } catch (e) {
313
- loadErrors.push(e)
314
- }
315
- } else {
316
- try {
317
- return require('./nacos-sdk-rust-binding-node.linux-arm64-gnu.node')
318
68
  } catch (e) {
319
- loadErrors.push(e)
69
+ loadError = e
320
70
  }
71
+ break
72
+ case 'ia32':
73
+ localFileExisted = existsSync(
74
+ join(__dirname, 'nacos-sdk-rust-binding-node.win32-ia32-msvc.node')
75
+ )
321
76
  try {
322
- const binding = require('nacos-sdk-rust-binding-node-linux-arm64-gnu')
323
- const bindingPackageVersion = require('nacos-sdk-rust-binding-node-linux-arm64-gnu/package.json').version
324
- if (bindingPackageVersion !== '0.5.3' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
325
- throw new Error(`Native binding package version mismatch, expected 0.5.3 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
77
+ if (localFileExisted) {
78
+ nativeBinding = require('./nacos-sdk-rust-binding-node.win32-ia32-msvc.node')
79
+ } else {
80
+ nativeBinding = require('nacos-sdk-rust-binding-node-win32-ia32-msvc')
326
81
  }
327
- return binding
328
- } catch (e) {
329
- loadErrors.push(e)
330
- }
331
- }
332
- } else if (process.arch === 'arm') {
333
- if (isMusl()) {
334
- try {
335
- return require('./nacos-sdk-rust-binding-node.linux-arm-musleabihf.node')
336
82
  } catch (e) {
337
- loadErrors.push(e)
83
+ loadError = e
338
84
  }
85
+ break
86
+ case 'arm64':
87
+ localFileExisted = existsSync(
88
+ join(__dirname, 'nacos-sdk-rust-binding-node.win32-arm64-msvc.node')
89
+ )
339
90
  try {
340
- const binding = require('nacos-sdk-rust-binding-node-linux-arm-musleabihf')
341
- const bindingPackageVersion = require('nacos-sdk-rust-binding-node-linux-arm-musleabihf/package.json').version
342
- if (bindingPackageVersion !== '0.5.3' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
343
- throw new Error(`Native binding package version mismatch, expected 0.5.3 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
91
+ if (localFileExisted) {
92
+ nativeBinding = require('./nacos-sdk-rust-binding-node.win32-arm64-msvc.node')
93
+ } else {
94
+ nativeBinding = require('nacos-sdk-rust-binding-node-win32-arm64-msvc')
344
95
  }
345
- return binding
346
96
  } catch (e) {
347
- loadErrors.push(e)
97
+ loadError = e
348
98
  }
99
+ break
100
+ default:
101
+ throw new Error(`Unsupported architecture on Windows: ${arch}`)
102
+ }
103
+ break
104
+ case 'darwin':
105
+ localFileExisted = existsSync(join(__dirname, 'nacos-sdk-rust-binding-node.darwin-universal.node'))
106
+ try {
107
+ if (localFileExisted) {
108
+ nativeBinding = require('./nacos-sdk-rust-binding-node.darwin-universal.node')
349
109
  } else {
350
- try {
351
- return require('./nacos-sdk-rust-binding-node.linux-arm-gnueabihf.node')
352
- } catch (e) {
353
- loadErrors.push(e)
354
- }
355
- try {
356
- const binding = require('nacos-sdk-rust-binding-node-linux-arm-gnueabihf')
357
- const bindingPackageVersion = require('nacos-sdk-rust-binding-node-linux-arm-gnueabihf/package.json').version
358
- if (bindingPackageVersion !== '0.5.3' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
359
- throw new Error(`Native binding package version mismatch, expected 0.5.3 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
110
+ nativeBinding = require('nacos-sdk-rust-binding-node-darwin-universal')
111
+ }
112
+ break
113
+ } catch {}
114
+ switch (arch) {
115
+ case 'x64':
116
+ localFileExisted = existsSync(join(__dirname, 'nacos-sdk-rust-binding-node.darwin-x64.node'))
117
+ try {
118
+ if (localFileExisted) {
119
+ nativeBinding = require('./nacos-sdk-rust-binding-node.darwin-x64.node')
120
+ } else {
121
+ nativeBinding = require('nacos-sdk-rust-binding-node-darwin-x64')
360
122
  }
361
- return binding
362
- } catch (e) {
363
- loadErrors.push(e)
364
- }
365
- }
366
- } else if (process.arch === 'loong64') {
367
- if (isMusl()) {
368
- try {
369
- return require('./nacos-sdk-rust-binding-node.linux-loong64-musl.node')
370
123
  } catch (e) {
371
- loadErrors.push(e)
124
+ loadError = e
372
125
  }
126
+ break
127
+ case 'arm64':
128
+ localFileExisted = existsSync(
129
+ join(__dirname, 'nacos-sdk-rust-binding-node.darwin-arm64.node')
130
+ )
373
131
  try {
374
- const binding = require('nacos-sdk-rust-binding-node-linux-loong64-musl')
375
- const bindingPackageVersion = require('nacos-sdk-rust-binding-node-linux-loong64-musl/package.json').version
376
- if (bindingPackageVersion !== '0.5.3' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
377
- throw new Error(`Native binding package version mismatch, expected 0.5.3 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
132
+ if (localFileExisted) {
133
+ nativeBinding = require('./nacos-sdk-rust-binding-node.darwin-arm64.node')
134
+ } else {
135
+ nativeBinding = require('nacos-sdk-rust-binding-node-darwin-arm64')
378
136
  }
379
- return binding
380
137
  } catch (e) {
381
- loadErrors.push(e)
138
+ loadError = e
382
139
  }
140
+ break
141
+ default:
142
+ throw new Error(`Unsupported architecture on macOS: ${arch}`)
143
+ }
144
+ break
145
+ case 'freebsd':
146
+ if (arch !== 'x64') {
147
+ throw new Error(`Unsupported architecture on FreeBSD: ${arch}`)
148
+ }
149
+ localFileExisted = existsSync(join(__dirname, 'nacos-sdk-rust-binding-node.freebsd-x64.node'))
150
+ try {
151
+ if (localFileExisted) {
152
+ nativeBinding = require('./nacos-sdk-rust-binding-node.freebsd-x64.node')
383
153
  } else {
384
- try {
385
- return require('./nacos-sdk-rust-binding-node.linux-loong64-gnu.node')
386
- } catch (e) {
387
- loadErrors.push(e)
388
- }
389
- try {
390
- const binding = require('nacos-sdk-rust-binding-node-linux-loong64-gnu')
391
- const bindingPackageVersion = require('nacos-sdk-rust-binding-node-linux-loong64-gnu/package.json').version
392
- if (bindingPackageVersion !== '0.5.3' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
393
- throw new Error(`Native binding package version mismatch, expected 0.5.3 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
394
- }
395
- return binding
396
- } catch (e) {
397
- loadErrors.push(e)
398
- }
154
+ nativeBinding = require('nacos-sdk-rust-binding-node-freebsd-x64')
399
155
  }
400
- } else if (process.arch === 'riscv64') {
401
- if (isMusl()) {
402
- try {
403
- return require('./nacos-sdk-rust-binding-node.linux-riscv64-musl.node')
404
- } catch (e) {
405
- loadErrors.push(e)
406
- }
407
- try {
408
- const binding = require('nacos-sdk-rust-binding-node-linux-riscv64-musl')
409
- const bindingPackageVersion = require('nacos-sdk-rust-binding-node-linux-riscv64-musl/package.json').version
410
- if (bindingPackageVersion !== '0.5.3' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
411
- throw new Error(`Native binding package version mismatch, expected 0.5.3 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
156
+ } catch (e) {
157
+ loadError = e
158
+ }
159
+ break
160
+ case 'linux':
161
+ switch (arch) {
162
+ case 'x64':
163
+ if (isMusl()) {
164
+ localFileExisted = existsSync(
165
+ join(__dirname, 'nacos-sdk-rust-binding-node.linux-x64-musl.node')
166
+ )
167
+ try {
168
+ if (localFileExisted) {
169
+ nativeBinding = require('./nacos-sdk-rust-binding-node.linux-x64-musl.node')
170
+ } else {
171
+ nativeBinding = require('nacos-sdk-rust-binding-node-linux-x64-musl')
172
+ }
173
+ } catch (e) {
174
+ loadError = e
175
+ }
176
+ } else {
177
+ localFileExisted = existsSync(
178
+ join(__dirname, 'nacos-sdk-rust-binding-node.linux-x64-gnu.node')
179
+ )
180
+ try {
181
+ if (localFileExisted) {
182
+ nativeBinding = require('./nacos-sdk-rust-binding-node.linux-x64-gnu.node')
183
+ } else {
184
+ nativeBinding = require('nacos-sdk-rust-binding-node-linux-x64-gnu')
185
+ }
186
+ } catch (e) {
187
+ loadError = e
412
188
  }
413
- return binding
414
- } catch (e) {
415
- loadErrors.push(e)
416
189
  }
417
- } else {
418
- try {
419
- return require('./nacos-sdk-rust-binding-node.linux-riscv64-gnu.node')
420
- } catch (e) {
421
- loadErrors.push(e)
190
+ break
191
+ case 'arm64':
192
+ if (isMusl()) {
193
+ localFileExisted = existsSync(
194
+ join(__dirname, 'nacos-sdk-rust-binding-node.linux-arm64-musl.node')
195
+ )
196
+ try {
197
+ if (localFileExisted) {
198
+ nativeBinding = require('./nacos-sdk-rust-binding-node.linux-arm64-musl.node')
199
+ } else {
200
+ nativeBinding = require('nacos-sdk-rust-binding-node-linux-arm64-musl')
201
+ }
202
+ } catch (e) {
203
+ loadError = e
204
+ }
205
+ } else {
206
+ localFileExisted = existsSync(
207
+ join(__dirname, 'nacos-sdk-rust-binding-node.linux-arm64-gnu.node')
208
+ )
209
+ try {
210
+ if (localFileExisted) {
211
+ nativeBinding = require('./nacos-sdk-rust-binding-node.linux-arm64-gnu.node')
212
+ } else {
213
+ nativeBinding = require('nacos-sdk-rust-binding-node-linux-arm64-gnu')
214
+ }
215
+ } catch (e) {
216
+ loadError = e
217
+ }
422
218
  }
219
+ break
220
+ case 'arm':
221
+ localFileExisted = existsSync(
222
+ join(__dirname, 'nacos-sdk-rust-binding-node.linux-arm-gnueabihf.node')
223
+ )
423
224
  try {
424
- const binding = require('nacos-sdk-rust-binding-node-linux-riscv64-gnu')
425
- const bindingPackageVersion = require('nacos-sdk-rust-binding-node-linux-riscv64-gnu/package.json').version
426
- if (bindingPackageVersion !== '0.5.3' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
427
- throw new Error(`Native binding package version mismatch, expected 0.5.3 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
225
+ if (localFileExisted) {
226
+ nativeBinding = require('./nacos-sdk-rust-binding-node.linux-arm-gnueabihf.node')
227
+ } else {
228
+ nativeBinding = require('nacos-sdk-rust-binding-node-linux-arm-gnueabihf')
428
229
  }
429
- return binding
430
230
  } catch (e) {
431
- loadErrors.push(e)
432
- }
433
- }
434
- } else if (process.arch === 'ppc64') {
435
- try {
436
- return require('./nacos-sdk-rust-binding-node.linux-ppc64-gnu.node')
437
- } catch (e) {
438
- loadErrors.push(e)
439
- }
440
- try {
441
- const binding = require('nacos-sdk-rust-binding-node-linux-ppc64-gnu')
442
- const bindingPackageVersion = require('nacos-sdk-rust-binding-node-linux-ppc64-gnu/package.json').version
443
- if (bindingPackageVersion !== '0.5.3' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
444
- throw new Error(`Native binding package version mismatch, expected 0.5.3 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
445
- }
446
- return binding
447
- } catch (e) {
448
- loadErrors.push(e)
449
- }
450
- } else if (process.arch === 's390x') {
451
- try {
452
- return require('./nacos-sdk-rust-binding-node.linux-s390x-gnu.node')
453
- } catch (e) {
454
- loadErrors.push(e)
455
- }
456
- try {
457
- const binding = require('nacos-sdk-rust-binding-node-linux-s390x-gnu')
458
- const bindingPackageVersion = require('nacos-sdk-rust-binding-node-linux-s390x-gnu/package.json').version
459
- if (bindingPackageVersion !== '0.5.3' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
460
- throw new Error(`Native binding package version mismatch, expected 0.5.3 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
461
- }
462
- return binding
463
- } catch (e) {
464
- loadErrors.push(e)
465
- }
466
- } else {
467
- loadErrors.push(new Error(`Unsupported architecture on Linux: ${process.arch}`))
468
- }
469
- } else if (process.platform === 'openharmony') {
470
- if (process.arch === 'arm64') {
471
- try {
472
- return require('./nacos-sdk-rust-binding-node.openharmony-arm64.node')
473
- } catch (e) {
474
- loadErrors.push(e)
475
- }
476
- try {
477
- const binding = require('nacos-sdk-rust-binding-node-openharmony-arm64')
478
- const bindingPackageVersion = require('nacos-sdk-rust-binding-node-openharmony-arm64/package.json').version
479
- if (bindingPackageVersion !== '0.5.3' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
480
- throw new Error(`Native binding package version mismatch, expected 0.5.3 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
481
- }
482
- return binding
483
- } catch (e) {
484
- loadErrors.push(e)
485
- }
486
- } else if (process.arch === 'x64') {
487
- try {
488
- return require('./nacos-sdk-rust-binding-node.openharmony-x64.node')
489
- } catch (e) {
490
- loadErrors.push(e)
491
- }
492
- try {
493
- const binding = require('nacos-sdk-rust-binding-node-openharmony-x64')
494
- const bindingPackageVersion = require('nacos-sdk-rust-binding-node-openharmony-x64/package.json').version
495
- if (bindingPackageVersion !== '0.5.3' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
496
- throw new Error(`Native binding package version mismatch, expected 0.5.3 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
231
+ loadError = e
497
232
  }
498
- return binding
499
- } catch (e) {
500
- loadErrors.push(e)
501
- }
502
- } else if (process.arch === 'arm') {
503
- try {
504
- return require('./nacos-sdk-rust-binding-node.openharmony-arm.node')
505
- } catch (e) {
506
- loadErrors.push(e)
507
- }
508
- try {
509
- const binding = require('nacos-sdk-rust-binding-node-openharmony-arm')
510
- const bindingPackageVersion = require('nacos-sdk-rust-binding-node-openharmony-arm/package.json').version
511
- if (bindingPackageVersion !== '0.5.3' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
512
- throw new Error(`Native binding package version mismatch, expected 0.5.3 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
513
- }
514
- return binding
515
- } catch (e) {
516
- loadErrors.push(e)
517
- }
518
- } else {
519
- loadErrors.push(new Error(`Unsupported architecture on OpenHarmony: ${process.arch}`))
233
+ break
234
+ default:
235
+ throw new Error(`Unsupported architecture on Linux: ${arch}`)
520
236
  }
521
- } else {
522
- loadErrors.push(new Error(`Unsupported OS: ${process.platform}, architecture: ${process.arch}`))
523
- }
524
- }
525
-
526
- nativeBinding = requireNative()
527
-
528
- if (!nativeBinding || process.env.NAPI_RS_FORCE_WASI) {
529
- let wasiBinding = null
530
- let wasiBindingError = null
531
- try {
532
- wasiBinding = require('./nacos-sdk-rust-binding-node.wasi.cjs')
533
- nativeBinding = wasiBinding
534
- } catch (err) {
535
- if (process.env.NAPI_RS_FORCE_WASI) {
536
- wasiBindingError = err
537
- }
538
- }
539
- if (!nativeBinding || process.env.NAPI_RS_FORCE_WASI) {
540
- try {
541
- wasiBinding = require('nacos-sdk-rust-binding-node-wasm32-wasi')
542
- nativeBinding = wasiBinding
543
- } catch (err) {
544
- if (process.env.NAPI_RS_FORCE_WASI) {
545
- if (!wasiBindingError) {
546
- wasiBindingError = err
547
- } else {
548
- wasiBindingError.cause = err
549
- }
550
- loadErrors.push(err)
551
- }
552
- }
553
- }
554
- if (process.env.NAPI_RS_FORCE_WASI === 'error' && !wasiBinding) {
555
- const error = new Error('WASI binding not found and NAPI_RS_FORCE_WASI is set to error')
556
- error.cause = wasiBindingError
557
- throw error
558
- }
237
+ break
238
+ default:
239
+ throw new Error(`Unsupported OS: ${platform}, architecture: ${arch}`)
559
240
  }
560
241
 
561
242
  if (!nativeBinding) {
562
- if (loadErrors.length > 0) {
563
- throw new Error(
564
- `Cannot find native binding. ` +
565
- `npm has a bug related to optional dependencies (https://github.com/npm/cli/issues/4828). ` +
566
- 'Please try `npm i` again after removing both package-lock.json and node_modules directory.',
567
- {
568
- cause: loadErrors.reduce((err, cur) => {
569
- cur.cause = err
570
- return cur
571
- }),
572
- },
573
- )
243
+ if (loadError) {
244
+ throw loadError
574
245
  }
575
246
  throw new Error(`Failed to load native binding`)
576
247
  }
577
248
 
578
- module.exports = nativeBinding
579
- module.exports.NacosConfigClient = nativeBinding.NacosConfigClient
580
- module.exports.NacosNamingClient = nativeBinding.NacosNamingClient
581
- module.exports.sum = nativeBinding.sum
249
+ const { sum, NacosConfigClient, NacosNamingClient } = nativeBinding
250
+
251
+ module.exports.sum = sum
252
+ module.exports.NacosConfigClient = NacosConfigClient
253
+ module.exports.NacosNamingClient = NacosNamingClient
package/package.json CHANGED
@@ -7,7 +7,7 @@
7
7
  "binding",
8
8
  "ffi"
9
9
  ],
10
- "version": "0.5.3",
10
+ "version": "0.6.0",
11
11
  "bugs": "https://github.com/opc-source/nacos-sdk-rust-binding-node/issues",
12
12
  "license": "MIT",
13
13
  "repository": {
@@ -55,19 +55,19 @@
55
55
  },
56
56
  "packageManager": "yarn@3.4.1",
57
57
  "optionalDependencies": {
58
- "nacos-sdk-rust-binding-node-win32-x64-msvc": "0.5.3",
59
- "nacos-sdk-rust-binding-node-darwin-x64": "0.5.3",
60
- "nacos-sdk-rust-binding-node-linux-x64-gnu": "0.5.3",
61
- "nacos-sdk-rust-binding-node-darwin-arm64": "0.5.3",
62
- "nacos-sdk-rust-binding-node-android-arm64": "0.5.3",
63
- "nacos-sdk-rust-binding-node-linux-arm64-gnu": "0.5.3",
64
- "nacos-sdk-rust-binding-node-linux-arm64-musl": "0.5.3",
65
- "nacos-sdk-rust-binding-node-win32-arm64-msvc": "0.5.3",
66
- "nacos-sdk-rust-binding-node-linux-arm-gnueabihf": "0.5.3",
67
- "nacos-sdk-rust-binding-node-linux-x64-musl": "0.5.3",
68
- "nacos-sdk-rust-binding-node-freebsd-x64": "0.5.3",
69
- "nacos-sdk-rust-binding-node-win32-ia32-msvc": "0.5.3",
70
- "nacos-sdk-rust-binding-node-android-arm-eabi": "0.5.3",
71
- "nacos-sdk-rust-binding-node-darwin-universal": "0.5.3"
58
+ "nacos-sdk-rust-binding-node-win32-x64-msvc": "0.6.0",
59
+ "nacos-sdk-rust-binding-node-darwin-x64": "0.6.0",
60
+ "nacos-sdk-rust-binding-node-linux-x64-gnu": "0.6.0",
61
+ "nacos-sdk-rust-binding-node-darwin-arm64": "0.6.0",
62
+ "nacos-sdk-rust-binding-node-android-arm64": "0.6.0",
63
+ "nacos-sdk-rust-binding-node-linux-arm64-gnu": "0.6.0",
64
+ "nacos-sdk-rust-binding-node-linux-arm64-musl": "0.6.0",
65
+ "nacos-sdk-rust-binding-node-win32-arm64-msvc": "0.6.0",
66
+ "nacos-sdk-rust-binding-node-linux-arm-gnueabihf": "0.6.0",
67
+ "nacos-sdk-rust-binding-node-linux-x64-musl": "0.6.0",
68
+ "nacos-sdk-rust-binding-node-freebsd-x64": "0.6.0",
69
+ "nacos-sdk-rust-binding-node-win32-ia32-msvc": "0.6.0",
70
+ "nacos-sdk-rust-binding-node-android-arm-eabi": "0.6.0",
71
+ "nacos-sdk-rust-binding-node-darwin-universal": "0.6.0"
72
72
  }
73
73
  }
package/src/config.rs CHANGED
@@ -29,7 +29,8 @@ impl NacosConfigClient {
29
29
  client_options
30
30
  .app_name
31
31
  .unwrap_or(nacos_sdk::api::constants::UNKNOWN.to_string()),
32
- );
32
+ )
33
+ .config_load_cache_at_start(client_options.config_load_cache_at_start.unwrap_or(false));
33
34
 
34
35
  // need enable_auth_plugin_http with username & password
35
36
  let is_enable_auth_http =
@@ -67,9 +68,12 @@ impl NacosConfigClient {
67
68
  config_service_builder
68
69
  };
69
70
 
70
- let config_service = config_service_builder
71
- .build()
72
- .map_err(|nacos_err| Error::from_reason(nacos_err.to_string()))?;
71
+ let config_service = crate::get_runtime().block_on(async {
72
+ config_service_builder
73
+ .build()
74
+ .await
75
+ .map_err(|nacos_err| Error::from_reason(nacos_err.to_string()))
76
+ })?;
73
77
 
74
78
  Ok(NacosConfigClient {
75
79
  inner: config_service,
package/src/lib.rs CHANGED
@@ -8,6 +8,18 @@ pub fn sum(a: i32, b: i32) -> i32 {
8
8
  a + b
9
9
  }
10
10
 
11
+ /// Global Tokio runtime for async operations in constructors
12
+ static RT: std::sync::OnceLock<tokio::runtime::Runtime> = std::sync::OnceLock::new();
13
+
14
+ pub fn get_runtime() -> &'static tokio::runtime::Runtime {
15
+ RT.get_or_init(|| {
16
+ tokio::runtime::Builder::new_current_thread()
17
+ .enable_all()
18
+ .build()
19
+ .expect("Failed to create Tokio runtime")
20
+ })
21
+ }
22
+
11
23
  #[napi(object)]
12
24
  pub struct ClientOptions {
13
25
  /// Server Addr, e.g. address:port[,address:port],...]
@@ -30,6 +42,8 @@ pub struct ClientOptions {
30
42
  pub naming_push_empty_protection: Option<bool>,
31
43
  /// naming load_cache_at_start, default false
32
44
  pub naming_load_cache_at_start: Option<bool>,
45
+ /// config load_cache_at_start, default false
46
+ pub config_load_cache_at_start: Option<bool>,
33
47
  }
34
48
 
35
49
  mod config;
package/src/naming.rs CHANGED
@@ -53,9 +53,12 @@ impl NacosNamingClient {
53
53
  nacos_sdk::api::naming::NamingServiceBuilder::new(props)
54
54
  };
55
55
 
56
- let naming_service = naming_service_builder
57
- .build()
58
- .map_err(|nacos_err| Error::from_reason(nacos_err.to_string()))?;
56
+ let naming_service = crate::get_runtime().block_on(async {
57
+ naming_service_builder
58
+ .build()
59
+ .await
60
+ .map_err(|nacos_err| Error::from_reason(nacos_err.to_string()))
61
+ })?;
59
62
 
60
63
  Ok(NacosNamingClient {
61
64
  inner: naming_service,