diff --git a/Cargo.toml b/Cargo.toml index fe4e758..2de43ab 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,23 +8,23 @@ crate-type = ["cdylib"] path = "rust/lib.rs" [dependencies] -libp2p-identity = { version = "0.2.10", features = ["ed25519", "peerid", "rand", "rsa", "secp256k1", "serde"] } -libp2p-tls = "0.6.0" +libp2p-identity = { version = "0.2.12", features = ["ed25519", "peerid", "rand", "rsa", "secp256k1", "serde"] } +libp2p-tls = "0.6.2" # Default enable napi4 feature, see https://nodejs.org/api/n-api.html#node-api-version-matrix -napi = { version = "3.0.0-alpha.28", default-features = false, features = ["napi9", "async", "tokio_rt"] } -napi-derive = "3.0.0-alpha.26" -oneshot = "0.1.10" +napi = { version = "3.0.0", default-features = false, features = ["napi9", "async", "tokio_rt"] } +napi-derive = "3.0.0" +oneshot = "0.1.11" pin-project-lite = "0.2.16" -quinn = "0.11.6" -ring = "0.17.9" -rustls = { version = "0.23.23", features = ["ring"] } -tokio = { version = "1.43.0", features = ["full"] } +quinn = "0.11.8" +ring = "0.17.14" +rustls = { version = "0.23.29", features = ["ring"] } +tokio = { version = "1.46.1", features = ["full"] } # included to satisfy napi dependencies -ctor = "0.3.6" -socket2 = "0.5.8" +ctor = "0.4.2" +socket2 = "0.6.0" [build-dependencies] -napi-build = "2.1.4" +napi-build = "2.2.2" [profile.release] lto = true diff --git a/package.json b/package.json index 9bc239e..0847d51 100644 --- a/package.json +++ b/package.json @@ -73,7 +73,7 @@ "@chainsafe/is-ip": "^2.1.0", "@libp2p/interface-compliance-tests": "^6.4.15", "@libp2p/logger": "^5.1.21", - "@napi-rs/cli": "^3.0.0-alpha.70", + "@napi-rs/cli": "^3.0.0", "aegir": "^47.0.19", "p-event": "^6.0.1", "sinon-ts": "^2.0.0", diff --git a/src/napi.js b/src/napi.js index 43f3366..e41ebce 100644 --- a/src/napi.js +++ b/src/napi.js @@ -36,7 +36,11 @@ const isMuslFromFilesystem = () => { } const isMuslFromReport = () => { - const report = typeof process.report.getReport === 'function' ? process.report.getReport() : null + let report = null + if (typeof process.report?.getReport === 'function') { + process.report.excludeNetwork = true + report = process.report.getReport() + } if (!report) { return null } @@ -65,7 +69,7 @@ function requireNative() { try { nativeBinding = require(process.env.NAPI_RS_NATIVE_LIBRARY_PATH); } catch (err) { - loadErrors.push(err); + loadErrors.push(err) } } else if (process.platform === 'android') { if (process.arch === 'arm64') { @@ -79,7 +83,6 @@ function requireNative() { } catch (e) { loadErrors.push(e) } - } else if (process.arch === 'arm') { try { return require('./libp2p-quic.android-arm-eabi.node') @@ -91,7 +94,6 @@ function requireNative() { } catch (e) { loadErrors.push(e) } - } else { loadErrors.push(new Error(`Unsupported architecture on Android ${process.arch}`)) } @@ -107,7 +109,6 @@ function requireNative() { } catch (e) { loadErrors.push(e) } - } else if (process.arch === 'ia32') { try { return require('./libp2p-quic.win32-ia32-msvc.node') @@ -119,7 +120,6 @@ function requireNative() { } catch (e) { loadErrors.push(e) } - } else if (process.arch === 'arm64') { try { return require('./libp2p-quic.win32-arm64-msvc.node') @@ -131,22 +131,20 @@ function requireNative() { } catch (e) { loadErrors.push(e) } - } else { loadErrors.push(new Error(`Unsupported architecture on Windows: ${process.arch}`)) } } else if (process.platform === 'darwin') { try { - return require('./libp2p-quic.darwin-universal.node') - } catch (e) { - loadErrors.push(e) - } - try { - return require('@chainsafe/libp2p-quic-darwin-universal') - } catch (e) { - loadErrors.push(e) - } - + return require('./libp2p-quic.darwin-universal.node') + } catch (e) { + loadErrors.push(e) + } + try { + return require('@chainsafe/libp2p-quic-darwin-universal') + } catch (e) { + loadErrors.push(e) + } if (process.arch === 'x64') { try { return require('./libp2p-quic.darwin-x64.node') @@ -158,7 +156,6 @@ function requireNative() { } catch (e) { loadErrors.push(e) } - } else if (process.arch === 'arm64') { try { return require('./libp2p-quic.darwin-arm64.node') @@ -170,7 +167,6 @@ function requireNative() { } catch (e) { loadErrors.push(e) } - } else { loadErrors.push(new Error(`Unsupported architecture on macOS: ${process.arch}`)) } @@ -186,7 +182,6 @@ function requireNative() { } catch (e) { loadErrors.push(e) } - } else if (process.arch === 'arm64') { try { return require('./libp2p-quic.freebsd-arm64.node') @@ -198,7 +193,6 @@ function requireNative() { } catch (e) { loadErrors.push(e) } - } else { loadErrors.push(new Error(`Unsupported architecture on FreeBSD: ${process.arch}`)) } @@ -206,133 +200,160 @@ function requireNative() { if (process.arch === 'x64') { if (isMusl()) { try { - return require('./libp2p-quic.linux-x64-musl.node') - } catch (e) { - loadErrors.push(e) - } - try { - return require('@chainsafe/libp2p-quic-linux-x64-musl') - } catch (e) { - loadErrors.push(e) - } - + return require('./libp2p-quic.linux-x64-musl.node') + } catch (e) { + loadErrors.push(e) + } + try { + return require('@chainsafe/libp2p-quic-linux-x64-musl') + } catch (e) { + loadErrors.push(e) + } } else { try { - return require('./libp2p-quic.linux-x64-gnu.node') - } catch (e) { - loadErrors.push(e) - } - try { - return require('@chainsafe/libp2p-quic-linux-x64-gnu') - } catch (e) { - loadErrors.push(e) - } - + return require('./libp2p-quic.linux-x64-gnu.node') + } catch (e) { + loadErrors.push(e) + } + try { + return require('@chainsafe/libp2p-quic-linux-x64-gnu') + } catch (e) { + loadErrors.push(e) + } } } else if (process.arch === 'arm64') { if (isMusl()) { try { - return require('./libp2p-quic.linux-arm64-musl.node') - } catch (e) { - loadErrors.push(e) - } - try { - return require('@chainsafe/libp2p-quic-linux-arm64-musl') - } catch (e) { - loadErrors.push(e) - } - + return require('./libp2p-quic.linux-arm64-musl.node') + } catch (e) { + loadErrors.push(e) + } + try { + return require('@chainsafe/libp2p-quic-linux-arm64-musl') + } catch (e) { + loadErrors.push(e) + } } else { try { - return require('./libp2p-quic.linux-arm64-gnu.node') - } catch (e) { - loadErrors.push(e) - } - try { - return require('@chainsafe/libp2p-quic-linux-arm64-gnu') - } catch (e) { - loadErrors.push(e) - } - + return require('./libp2p-quic.linux-arm64-gnu.node') + } catch (e) { + loadErrors.push(e) + } + try { + return require('@chainsafe/libp2p-quic-linux-arm64-gnu') + } catch (e) { + loadErrors.push(e) + } } } else if (process.arch === 'arm') { if (isMusl()) { try { - return require('./libp2p-quic.linux-arm-musleabihf.node') - } catch (e) { - loadErrors.push(e) - } - try { - return require('@chainsafe/libp2p-quic-linux-arm-musleabihf') - } catch (e) { - loadErrors.push(e) + return require('./libp2p-quic.linux-arm-musleabihf.node') + } catch (e) { + loadErrors.push(e) + } + try { + return require('@chainsafe/libp2p-quic-linux-arm-musleabihf') + } catch (e) { + loadErrors.push(e) + } + } else { + try { + return require('./libp2p-quic.linux-arm-gnueabihf.node') + } catch (e) { + loadErrors.push(e) + } + try { + return require('@chainsafe/libp2p-quic-linux-arm-gnueabihf') + } catch (e) { + loadErrors.push(e) + } } - + } else if (process.arch === 'riscv64') { + if (isMusl()) { + try { + return require('./libp2p-quic.linux-riscv64-musl.node') + } catch (e) { + loadErrors.push(e) + } + try { + return require('@chainsafe/libp2p-quic-linux-riscv64-musl') + } catch (e) { + loadErrors.push(e) + } } else { try { - return require('./libp2p-quic.linux-arm-gnueabihf.node') + return require('./libp2p-quic.linux-riscv64-gnu.node') + } catch (e) { + loadErrors.push(e) + } + try { + return require('@chainsafe/libp2p-quic-linux-riscv64-gnu') + } catch (e) { + loadErrors.push(e) + } + } + } else if (process.arch === 'ppc64') { + try { + return require('./libp2p-quic.linux-ppc64-gnu.node') } catch (e) { loadErrors.push(e) } try { - return require('@chainsafe/libp2p-quic-linux-arm-gnueabihf') + return require('@chainsafe/libp2p-quic-linux-ppc64-gnu') } catch (e) { loadErrors.push(e) } - - } - } else if (process.arch === 'riscv64') { - if (isMusl()) { - try { - return require('./libp2p-quic.linux-riscv64-musl.node') + } else if (process.arch === 's390x') { + try { + return require('./libp2p-quic.linux-s390x-gnu.node') } catch (e) { loadErrors.push(e) } try { - return require('@chainsafe/libp2p-quic-linux-riscv64-musl') + return require('@chainsafe/libp2p-quic-linux-s390x-gnu') } catch (e) { loadErrors.push(e) } - - } else { - try { - return require('./libp2p-quic.linux-riscv64-gnu.node') + } else { + loadErrors.push(new Error(`Unsupported architecture on Linux: ${process.arch}`)) + } + } else if (process.platform === 'openharmony') { + if (process.arch === 'arm64') { + try { + return require('./libp2p-quic.linux-arm64-ohos.node') } catch (e) { loadErrors.push(e) } try { - return require('@chainsafe/libp2p-quic-linux-riscv64-gnu') + return require('@chainsafe/libp2p-quic-linux-arm64-ohos') } catch (e) { loadErrors.push(e) } - - } - } else if (process.arch === 'ppc64') { + } else if (process.arch === 'x64') { try { - return require('./libp2p-quic.linux-ppc64-gnu.node') + return require('./libp2p-quic.linux-x64-ohos.node') } catch (e) { loadErrors.push(e) } try { - return require('@chainsafe/libp2p-quic-linux-ppc64-gnu') + return require('@chainsafe/libp2p-quic-linux-x64-ohos') } catch (e) { loadErrors.push(e) } - - } else if (process.arch === 's390x') { + } else if (process.arch === 'arm') { try { - return require('./libp2p-quic.linux-s390x-gnu.node') + return require('./libp2p-quic.linux-arm-ohos.node') } catch (e) { loadErrors.push(e) } try { - return require('@chainsafe/libp2p-quic-linux-s390x-gnu') + return require('@chainsafe/libp2p-quic-linux-arm-ohos') } catch (e) { loadErrors.push(e) } - } else { - loadErrors.push(new Error(`Unsupported architecture on Linux: ${process.arch}`)) + loadErrors.push(new Error(`Unsupported architecture on OpenHarmony: ${process.arch}`)) } } else { loadErrors.push(new Error(`Unsupported OS: ${process.platform}, architecture: ${process.arch}`)) @@ -362,11 +383,12 @@ if (!nativeBinding || process.env.NAPI_RS_FORCE_WASI) { if (!nativeBinding) { if (loadErrors.length > 0) { - // TODO Link to documentation with potential fixes - // - The package owner could build/publish bindings for this arch - // - The user may need to bundle the correct files - // - The user may need to re-install node_modules to get new packages - throw new Error('Failed to load native binding', { cause: loadErrors }) + throw new Error( + `Cannot find native binding. ` + + `npm has a bug related to optional dependencies (https://github.com/npm/cli/issues/4828). ` + + 'Please try `npm i` again after removing both package-lock.json and node_modules directory.', + { cause: loadErrors } + ) } throw new Error(`Failed to load native binding`) } diff --git a/yarn.lock b/yarn.lock index 7869e9c..966e98d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -860,7 +860,7 @@ __metadata: "@libp2p/utils": "npm:^6.7.1" "@multiformats/multiaddr": "npm:^12.4.0" "@multiformats/multiaddr-matcher": "npm:^2.0.1" - "@napi-rs/cli": "npm:^3.0.0-alpha.70" + "@napi-rs/cli": "npm:^3.0.0" aegir: "npm:^47.0.19" it-stream-types: "npm:^2.0.2" p-event: "npm:^6.0.1" @@ -2655,9 +2655,9 @@ __metadata: languageName: node linkType: hard -"@napi-rs/cli@npm:^3.0.0-alpha.70": - version: 3.0.0-alpha.92 - resolution: "@napi-rs/cli@npm:3.0.0-alpha.92" +"@napi-rs/cli@npm:^3.0.0": + version: 3.0.0 + resolution: "@napi-rs/cli@npm:3.0.0" dependencies: "@inquirer/prompts": "npm:^7.4.0" "@napi-rs/cross-toolchain": "npm:^0.0.19" @@ -2684,7 +2684,7 @@ __metadata: bin: napi: ./dist/cli.js napi-raw: ./cli.mjs - checksum: 10c0/58118e413e9f3d98b991ce1869475c06b6a837c0373f43bb74e2509d48d7d7281d1b4b9c3d2b5aa45c11957d08b5e758a547ae9757c8299ef72fb02751f03208 + checksum: 10c0/b0ef4e408078f0b3605f13e3de79de6efb692b2de698db86bb51525bfd9f178488f810ae71f334910f4d109f75536ac32672ae01f2ef582b37bb6840e0718f28 languageName: node linkType: hard