@antseed/node 0.1.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 +411 -0
- package/contracts/AntseedEscrow.sol +310 -0
- package/contracts/MockUSDC.sol +64 -0
- package/contracts/README.md +102 -0
- package/dist/config/encryption.d.ts +17 -0
- package/dist/config/encryption.d.ts.map +1 -0
- package/dist/config/encryption.js +49 -0
- package/dist/config/encryption.js.map +1 -0
- package/dist/config/plugin-config-manager.d.ts +31 -0
- package/dist/config/plugin-config-manager.d.ts.map +1 -0
- package/dist/config/plugin-config-manager.js +135 -0
- package/dist/config/plugin-config-manager.js.map +1 -0
- package/dist/config/plugin-loader.d.ts +25 -0
- package/dist/config/plugin-loader.d.ts.map +1 -0
- package/dist/config/plugin-loader.js +64 -0
- package/dist/config/plugin-loader.js.map +1 -0
- package/dist/discovery/announcer.d.ts +44 -0
- package/dist/discovery/announcer.d.ts.map +1 -0
- package/dist/discovery/announcer.js +129 -0
- package/dist/discovery/announcer.js.map +1 -0
- package/dist/discovery/bootstrap.d.ts +13 -0
- package/dist/discovery/bootstrap.d.ts.map +1 -0
- package/dist/discovery/bootstrap.js +39 -0
- package/dist/discovery/bootstrap.js.map +1 -0
- package/dist/discovery/default-metadata-resolver.d.ts +16 -0
- package/dist/discovery/default-metadata-resolver.d.ts.map +1 -0
- package/dist/discovery/default-metadata-resolver.js +16 -0
- package/dist/discovery/default-metadata-resolver.js.map +1 -0
- package/dist/discovery/dht-health.d.ts +38 -0
- package/dist/discovery/dht-health.d.ts.map +1 -0
- package/dist/discovery/dht-health.js +101 -0
- package/dist/discovery/dht-health.js.map +1 -0
- package/dist/discovery/dht-node.d.ts +34 -0
- package/dist/discovery/dht-node.d.ts.map +1 -0
- package/dist/discovery/dht-node.js +168 -0
- package/dist/discovery/dht-node.js.map +1 -0
- package/dist/discovery/http-metadata-resolver.d.ts +15 -0
- package/dist/discovery/http-metadata-resolver.d.ts.map +1 -0
- package/dist/discovery/http-metadata-resolver.js +33 -0
- package/dist/discovery/http-metadata-resolver.js.map +1 -0
- package/dist/discovery/index.d.ts +16 -0
- package/dist/discovery/index.d.ts.map +1 -0
- package/dist/discovery/index.js +15 -0
- package/dist/discovery/index.js.map +1 -0
- package/dist/discovery/metadata-codec.d.ts +22 -0
- package/dist/discovery/metadata-codec.d.ts.map +1 -0
- package/dist/discovery/metadata-codec.js +390 -0
- package/dist/discovery/metadata-codec.js.map +1 -0
- package/dist/discovery/metadata-resolver.d.ts +9 -0
- package/dist/discovery/metadata-resolver.d.ts.map +1 -0
- package/dist/discovery/metadata-resolver.js +2 -0
- package/dist/discovery/metadata-resolver.js.map +1 -0
- package/dist/discovery/metadata-server.d.ts +16 -0
- package/dist/discovery/metadata-server.d.ts.map +1 -0
- package/dist/discovery/metadata-server.js +59 -0
- package/dist/discovery/metadata-server.js.map +1 -0
- package/dist/discovery/metadata-validator.d.ts +12 -0
- package/dist/discovery/metadata-validator.d.ts.map +1 -0
- package/dist/discovery/metadata-validator.js +153 -0
- package/dist/discovery/metadata-validator.js.map +1 -0
- package/dist/discovery/peer-lookup.d.ts +26 -0
- package/dist/discovery/peer-lookup.d.ts.map +1 -0
- package/dist/discovery/peer-lookup.js +86 -0
- package/dist/discovery/peer-lookup.js.map +1 -0
- package/dist/discovery/peer-metadata.d.ts +31 -0
- package/dist/discovery/peer-metadata.d.ts.map +1 -0
- package/dist/discovery/peer-metadata.js +2 -0
- package/dist/discovery/peer-metadata.js.map +1 -0
- package/dist/discovery/peer-selector.d.ts +33 -0
- package/dist/discovery/peer-selector.d.ts.map +1 -0
- package/dist/discovery/peer-selector.js +80 -0
- package/dist/discovery/peer-selector.js.map +1 -0
- package/dist/discovery/profile-manager.d.ts +50 -0
- package/dist/discovery/profile-manager.d.ts.map +1 -0
- package/dist/discovery/profile-manager.js +105 -0
- package/dist/discovery/profile-manager.js.map +1 -0
- package/dist/discovery/profile-search.d.ts +27 -0
- package/dist/discovery/profile-search.d.ts.map +1 -0
- package/dist/discovery/profile-search.js +75 -0
- package/dist/discovery/profile-search.js.map +1 -0
- package/dist/discovery/reputation-verifier.d.ts +25 -0
- package/dist/discovery/reputation-verifier.d.ts.map +1 -0
- package/dist/discovery/reputation-verifier.js +27 -0
- package/dist/discovery/reputation-verifier.js.map +1 -0
- package/dist/index.d.ts +37 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +32 -0
- package/dist/index.js.map +1 -0
- package/dist/interfaces/buyer-router.d.ts +21 -0
- package/dist/interfaces/buyer-router.d.ts.map +1 -0
- package/dist/interfaces/buyer-router.js +2 -0
- package/dist/interfaces/buyer-router.js.map +1 -0
- package/dist/interfaces/plugin.d.ts +31 -0
- package/dist/interfaces/plugin.d.ts.map +1 -0
- package/dist/interfaces/plugin.js +2 -0
- package/dist/interfaces/plugin.js.map +1 -0
- package/dist/interfaces/seller-provider.d.ts +69 -0
- package/dist/interfaces/seller-provider.d.ts.map +1 -0
- package/dist/interfaces/seller-provider.js +2 -0
- package/dist/interfaces/seller-provider.js.map +1 -0
- package/dist/metering/index.d.ts +7 -0
- package/dist/metering/index.d.ts.map +1 -0
- package/dist/metering/index.js +7 -0
- package/dist/metering/index.js.map +1 -0
- package/dist/metering/receipt-generator.d.ts +49 -0
- package/dist/metering/receipt-generator.d.ts.map +1 -0
- package/dist/metering/receipt-generator.js +74 -0
- package/dist/metering/receipt-generator.js.map +1 -0
- package/dist/metering/receipt-verifier.d.ts +52 -0
- package/dist/metering/receipt-verifier.d.ts.map +1 -0
- package/dist/metering/receipt-verifier.js +63 -0
- package/dist/metering/receipt-verifier.js.map +1 -0
- package/dist/metering/session-tracker.d.ts +59 -0
- package/dist/metering/session-tracker.d.ts.map +1 -0
- package/dist/metering/session-tracker.js +119 -0
- package/dist/metering/session-tracker.js.map +1 -0
- package/dist/metering/storage.d.ts +72 -0
- package/dist/metering/storage.d.ts.map +1 -0
- package/dist/metering/storage.js +446 -0
- package/dist/metering/storage.js.map +1 -0
- package/dist/metering/token-counter.d.ts +50 -0
- package/dist/metering/token-counter.d.ts.map +1 -0
- package/dist/metering/token-counter.js +96 -0
- package/dist/metering/token-counter.js.map +1 -0
- package/dist/metering/usage-aggregator.d.ts +46 -0
- package/dist/metering/usage-aggregator.d.ts.map +1 -0
- package/dist/metering/usage-aggregator.js +170 -0
- package/dist/metering/usage-aggregator.js.map +1 -0
- package/dist/node.d.ts +179 -0
- package/dist/node.d.ts.map +1 -0
- package/dist/node.js +1328 -0
- package/dist/node.js.map +1 -0
- package/dist/p2p/connection-auth.d.ts +35 -0
- package/dist/p2p/connection-auth.d.ts.map +1 -0
- package/dist/p2p/connection-auth.js +102 -0
- package/dist/p2p/connection-auth.js.map +1 -0
- package/dist/p2p/connection-manager.d.ts +101 -0
- package/dist/p2p/connection-manager.d.ts.map +1 -0
- package/dist/p2p/connection-manager.js +726 -0
- package/dist/p2p/connection-manager.js.map +1 -0
- package/dist/p2p/handshake.d.ts +47 -0
- package/dist/p2p/handshake.d.ts.map +1 -0
- package/dist/p2p/handshake.js +107 -0
- package/dist/p2p/handshake.js.map +1 -0
- package/dist/p2p/ice-config.d.ts +27 -0
- package/dist/p2p/ice-config.d.ts.map +1 -0
- package/dist/p2p/ice-config.js +43 -0
- package/dist/p2p/ice-config.js.map +1 -0
- package/dist/p2p/identity.d.ts +27 -0
- package/dist/p2p/identity.d.ts.map +1 -0
- package/dist/p2p/identity.js +76 -0
- package/dist/p2p/identity.js.map +1 -0
- package/dist/p2p/index.d.ts +12 -0
- package/dist/p2p/index.d.ts.map +1 -0
- package/dist/p2p/index.js +11 -0
- package/dist/p2p/index.js.map +1 -0
- package/dist/p2p/keepalive.d.ts +49 -0
- package/dist/p2p/keepalive.d.ts.map +1 -0
- package/dist/p2p/keepalive.js +93 -0
- package/dist/p2p/keepalive.js.map +1 -0
- package/dist/p2p/message-protocol.d.ts +50 -0
- package/dist/p2p/message-protocol.d.ts.map +1 -0
- package/dist/p2p/message-protocol.js +134 -0
- package/dist/p2p/message-protocol.js.map +1 -0
- package/dist/p2p/nat-traversal.d.ts +51 -0
- package/dist/p2p/nat-traversal.d.ts.map +1 -0
- package/dist/p2p/nat-traversal.js +135 -0
- package/dist/p2p/nat-traversal.js.map +1 -0
- package/dist/p2p/payment-codec.d.ts +20 -0
- package/dist/p2p/payment-codec.d.ts.map +1 -0
- package/dist/p2p/payment-codec.js +130 -0
- package/dist/p2p/payment-codec.js.map +1 -0
- package/dist/p2p/payment-mux.d.ts +49 -0
- package/dist/p2p/payment-mux.d.ts.map +1 -0
- package/dist/p2p/payment-mux.js +131 -0
- package/dist/p2p/payment-mux.js.map +1 -0
- package/dist/p2p/reconnect.d.ts +48 -0
- package/dist/p2p/reconnect.d.ts.map +1 -0
- package/dist/p2p/reconnect.js +89 -0
- package/dist/p2p/reconnect.js.map +1 -0
- package/dist/payments/balance-manager.d.ts +17 -0
- package/dist/payments/balance-manager.d.ts.map +1 -0
- package/dist/payments/balance-manager.js +54 -0
- package/dist/payments/balance-manager.js.map +1 -0
- package/dist/payments/buyer-payment-manager.d.ts +122 -0
- package/dist/payments/buyer-payment-manager.d.ts.map +1 -0
- package/dist/payments/buyer-payment-manager.js +280 -0
- package/dist/payments/buyer-payment-manager.js.map +1 -0
- package/dist/payments/disputes.d.ts +18 -0
- package/dist/payments/disputes.d.ts.map +1 -0
- package/dist/payments/disputes.js +47 -0
- package/dist/payments/disputes.js.map +1 -0
- package/dist/payments/evm/escrow-client.d.ts +61 -0
- package/dist/payments/evm/escrow-client.d.ts.map +1 -0
- package/dist/payments/evm/escrow-client.js +170 -0
- package/dist/payments/evm/escrow-client.js.map +1 -0
- package/dist/payments/evm/keypair.d.ts +21 -0
- package/dist/payments/evm/keypair.d.ts.map +1 -0
- package/dist/payments/evm/keypair.js +29 -0
- package/dist/payments/evm/keypair.js.map +1 -0
- package/dist/payments/evm/signatures.d.ts +11 -0
- package/dist/payments/evm/signatures.d.ts.map +1 -0
- package/dist/payments/evm/signatures.js +56 -0
- package/dist/payments/evm/signatures.js.map +1 -0
- package/dist/payments/evm/wallet.d.ts +5 -0
- package/dist/payments/evm/wallet.d.ts.map +1 -0
- package/dist/payments/evm/wallet.js +31 -0
- package/dist/payments/evm/wallet.js.map +1 -0
- package/dist/payments/index.d.ts +13 -0
- package/dist/payments/index.d.ts.map +1 -0
- package/dist/payments/index.js +14 -0
- package/dist/payments/index.js.map +1 -0
- package/dist/payments/settlement.d.ts +6 -0
- package/dist/payments/settlement.d.ts.map +1 -0
- package/dist/payments/settlement.js +25 -0
- package/dist/payments/settlement.js.map +1 -0
- package/dist/payments/types.d.ts +66 -0
- package/dist/payments/types.d.ts.map +1 -0
- package/dist/payments/types.js +2 -0
- package/dist/payments/types.js.map +1 -0
- package/dist/proxy/index.d.ts +4 -0
- package/dist/proxy/index.d.ts.map +1 -0
- package/dist/proxy/index.js +4 -0
- package/dist/proxy/index.js.map +1 -0
- package/dist/proxy/provider-detection.d.ts +20 -0
- package/dist/proxy/provider-detection.d.ts.map +1 -0
- package/dist/proxy/provider-detection.js +61 -0
- package/dist/proxy/provider-detection.js.map +1 -0
- package/dist/proxy/proxy-mux.d.ts +35 -0
- package/dist/proxy/proxy-mux.d.ts.map +1 -0
- package/dist/proxy/proxy-mux.js +137 -0
- package/dist/proxy/proxy-mux.js.map +1 -0
- package/dist/proxy/request-codec.d.ts +33 -0
- package/dist/proxy/request-codec.d.ts.map +1 -0
- package/dist/proxy/request-codec.js +238 -0
- package/dist/proxy/request-codec.js.map +1 -0
- package/dist/reputation/index.d.ts +7 -0
- package/dist/reputation/index.d.ts.map +1 -0
- package/dist/reputation/index.js +6 -0
- package/dist/reputation/index.js.map +1 -0
- package/dist/reputation/rating-manager.d.ts +20 -0
- package/dist/reputation/rating-manager.d.ts.map +1 -0
- package/dist/reputation/rating-manager.js +91 -0
- package/dist/reputation/rating-manager.js.map +1 -0
- package/dist/reputation/report-manager.d.ts +21 -0
- package/dist/reputation/report-manager.d.ts.map +1 -0
- package/dist/reputation/report-manager.js +70 -0
- package/dist/reputation/report-manager.js.map +1 -0
- package/dist/reputation/trust-engine.d.ts +36 -0
- package/dist/reputation/trust-engine.d.ts.map +1 -0
- package/dist/reputation/trust-engine.js +95 -0
- package/dist/reputation/trust-engine.js.map +1 -0
- package/dist/reputation/trust-score.d.ts +43 -0
- package/dist/reputation/trust-score.d.ts.map +1 -0
- package/dist/reputation/trust-score.js +34 -0
- package/dist/reputation/trust-score.js.map +1 -0
- package/dist/reputation/uptime-tracker.d.ts +51 -0
- package/dist/reputation/uptime-tracker.d.ts.map +1 -0
- package/dist/reputation/uptime-tracker.js +123 -0
- package/dist/reputation/uptime-tracker.js.map +1 -0
- package/dist/routing/default-router.d.ts +21 -0
- package/dist/routing/default-router.d.ts.map +1 -0
- package/dist/routing/default-router.js +60 -0
- package/dist/routing/default-router.js.map +1 -0
- package/dist/types/buyer.d.ts +36 -0
- package/dist/types/buyer.d.ts.map +1 -0
- package/dist/types/buyer.js +2 -0
- package/dist/types/buyer.js.map +1 -0
- package/dist/types/capability.d.ts +25 -0
- package/dist/types/capability.d.ts.map +1 -0
- package/dist/types/capability.js +2 -0
- package/dist/types/capability.js.map +1 -0
- package/dist/types/connection.d.ts +27 -0
- package/dist/types/connection.d.ts.map +1 -0
- package/dist/types/connection.js +11 -0
- package/dist/types/connection.js.map +1 -0
- package/dist/types/http.d.ts +19 -0
- package/dist/types/http.d.ts.map +1 -0
- package/dist/types/http.js +2 -0
- package/dist/types/http.js.map +1 -0
- package/dist/types/index.d.ts +15 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +15 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/metering.d.ts +170 -0
- package/dist/types/metering.d.ts.map +1 -0
- package/dist/types/metering.js +2 -0
- package/dist/types/metering.js.map +1 -0
- package/dist/types/peer-profile.d.ts +24 -0
- package/dist/types/peer-profile.d.ts.map +1 -0
- package/dist/types/peer-profile.js +2 -0
- package/dist/types/peer-profile.js.map +1 -0
- package/dist/types/peer.d.ts +56 -0
- package/dist/types/peer.d.ts.map +1 -0
- package/dist/types/peer.js +11 -0
- package/dist/types/peer.js.map +1 -0
- package/dist/types/plugin-config.d.ts +31 -0
- package/dist/types/plugin-config.d.ts.map +1 -0
- package/dist/types/plugin-config.js +2 -0
- package/dist/types/plugin-config.js.map +1 -0
- package/dist/types/protocol.d.ts +141 -0
- package/dist/types/protocol.d.ts.map +1 -0
- package/dist/types/protocol.js +42 -0
- package/dist/types/protocol.js.map +1 -0
- package/dist/types/provider.d.ts +38 -0
- package/dist/types/provider.d.ts.map +1 -0
- package/dist/types/provider.js +11 -0
- package/dist/types/provider.js.map +1 -0
- package/dist/types/rating.d.ts +21 -0
- package/dist/types/rating.d.ts.map +1 -0
- package/dist/types/rating.js +2 -0
- package/dist/types/rating.js.map +1 -0
- package/dist/types/report.d.ts +20 -0
- package/dist/types/report.d.ts.map +1 -0
- package/dist/types/report.js +2 -0
- package/dist/types/report.js.map +1 -0
- package/dist/types/seller.d.ts +36 -0
- package/dist/types/seller.d.ts.map +1 -0
- package/dist/types/seller.js +2 -0
- package/dist/types/seller.js.map +1 -0
- package/dist/types/staking.d.ts +16 -0
- package/dist/types/staking.d.ts.map +1 -0
- package/dist/types/staking.js +6 -0
- package/dist/types/staking.js.map +1 -0
- package/dist/utils/debug.d.ts +4 -0
- package/dist/utils/debug.d.ts.map +1 -0
- package/dist/utils/debug.js +25 -0
- package/dist/utils/debug.js.map +1 -0
- package/dist/utils/hex.d.ts +3 -0
- package/dist/utils/hex.d.ts.map +1 -0
- package/dist/utils/hex.js +15 -0
- package/dist/utils/hex.js.map +1 -0
- package/package.json +62 -0
- package/scripts/ensure-node-native-modules.mjs +153 -0
- package/scripts/patch-ethers.js +44 -0
- package/src/config/encryption.test.ts +49 -0
- package/src/config/encryption.ts +53 -0
- package/src/config/plugin-config-manager.test.ts +92 -0
- package/src/config/plugin-config-manager.ts +153 -0
- package/src/config/plugin-loader.ts +90 -0
- package/src/discovery/announcer.ts +169 -0
- package/src/discovery/bootstrap.ts +57 -0
- package/src/discovery/default-metadata-resolver.ts +18 -0
- package/src/discovery/dht-health.ts +136 -0
- package/src/discovery/dht-node.ts +191 -0
- package/src/discovery/http-metadata-resolver.ts +47 -0
- package/src/discovery/index.ts +15 -0
- package/src/discovery/metadata-codec.ts +453 -0
- package/src/discovery/metadata-resolver.ts +7 -0
- package/src/discovery/metadata-server.ts +73 -0
- package/src/discovery/metadata-validator.ts +172 -0
- package/src/discovery/peer-lookup.ts +122 -0
- package/src/discovery/peer-metadata.ts +34 -0
- package/src/discovery/peer-selector.ts +134 -0
- package/src/discovery/profile-manager.ts +131 -0
- package/src/discovery/profile-search.ts +100 -0
- package/src/discovery/reputation-verifier.ts +54 -0
- package/src/index.ts +61 -0
- package/src/interfaces/buyer-router.ts +21 -0
- package/src/interfaces/plugin.ts +36 -0
- package/src/interfaces/seller-provider.ts +81 -0
- package/src/metering/index.ts +6 -0
- package/src/metering/receipt-generator.ts +105 -0
- package/src/metering/receipt-verifier.ts +102 -0
- package/src/metering/session-tracker.ts +145 -0
- package/src/metering/storage.ts +600 -0
- package/src/metering/token-counter.ts +127 -0
- package/src/metering/usage-aggregator.ts +236 -0
- package/src/node.ts +1698 -0
- package/src/p2p/connection-auth.ts +152 -0
- package/src/p2p/connection-manager.ts +916 -0
- package/src/p2p/handshake.ts +162 -0
- package/src/p2p/ice-config.ts +59 -0
- package/src/p2p/identity.ts +110 -0
- package/src/p2p/index.ts +11 -0
- package/src/p2p/keepalive.ts +118 -0
- package/src/p2p/message-protocol.ts +171 -0
- package/src/p2p/nat-traversal.ts +169 -0
- package/src/p2p/payment-codec.ts +165 -0
- package/src/p2p/payment-mux.ts +153 -0
- package/src/p2p/reconnect.ts +117 -0
- package/src/payments/balance-manager.ts +77 -0
- package/src/payments/buyer-payment-manager.ts +414 -0
- package/src/payments/disputes.ts +72 -0
- package/src/payments/evm/escrow-client.ts +263 -0
- package/src/payments/evm/keypair.ts +31 -0
- package/src/payments/evm/signatures.ts +103 -0
- package/src/payments/evm/wallet.ts +42 -0
- package/src/payments/index.ts +50 -0
- package/src/payments/settlement.ts +40 -0
- package/src/payments/types.ts +79 -0
- package/src/proxy/index.ts +3 -0
- package/src/proxy/provider-detection.ts +78 -0
- package/src/proxy/proxy-mux.ts +173 -0
- package/src/proxy/request-codec.ts +294 -0
- package/src/reputation/index.ts +6 -0
- package/src/reputation/rating-manager.ts +118 -0
- package/src/reputation/report-manager.ts +91 -0
- package/src/reputation/trust-engine.ts +120 -0
- package/src/reputation/trust-score.ts +74 -0
- package/src/reputation/uptime-tracker.ts +155 -0
- package/src/routing/default-router.ts +75 -0
- package/src/types/bittorrent-dht.d.ts +19 -0
- package/src/types/buyer.ts +37 -0
- package/src/types/capability.ts +34 -0
- package/src/types/connection.ts +29 -0
- package/src/types/http.ts +20 -0
- package/src/types/index.ts +14 -0
- package/src/types/metering.ts +175 -0
- package/src/types/nat-api.d.ts +29 -0
- package/src/types/peer-profile.ts +25 -0
- package/src/types/peer.ts +62 -0
- package/src/types/plugin-config.ts +31 -0
- package/src/types/protocol.ts +162 -0
- package/src/types/provider.ts +40 -0
- package/src/types/rating.ts +23 -0
- package/src/types/report.ts +30 -0
- package/src/types/seller.ts +38 -0
- package/src/types/staking.ts +23 -0
- package/src/utils/debug.ts +30 -0
- package/src/utils/hex.ts +14 -0
- package/tests/balance-manager.test.ts +156 -0
- package/tests/bootstrap.test.ts +108 -0
- package/tests/buyer-payment-manager.test.ts +358 -0
- package/tests/connection-auth.test.ts +87 -0
- package/tests/default-router.test.ts +148 -0
- package/tests/evm-keypair.test.ts +173 -0
- package/tests/identity.test.ts +133 -0
- package/tests/message-protocol.test.ts +212 -0
- package/tests/metadata-codec.test.ts +165 -0
- package/tests/metadata-validator.test.ts +261 -0
- package/tests/metering-storage.test.ts +244 -0
- package/tests/payment-codec.test.ts +95 -0
- package/tests/payment-mux.test.ts +191 -0
- package/tests/peer-selector.test.ts +184 -0
- package/tests/provider-detection.test.ts +107 -0
- package/tests/proxy-mux-security.test.ts +38 -0
- package/tests/receipt.test.ts +215 -0
- package/tests/reputation-integration.test.ts +195 -0
- package/tests/request-codec.test.ts +144 -0
- package/tests/token-counter.test.ts +122 -0
- package/tsconfig.json +9 -0
- package/vitest.config.ts +7 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { PeerId } from './peer.js';
|
|
2
|
+
export type RatingDimension = 'quality' | 'speed' | 'reliability' | 'value' | 'overall';
|
|
3
|
+
export interface PeerRating {
|
|
4
|
+
ratingId: string;
|
|
5
|
+
raterPeerId: PeerId;
|
|
6
|
+
targetPeerId: PeerId;
|
|
7
|
+
sessionId: string;
|
|
8
|
+
dimensions: Record<RatingDimension, 1 | 2 | 3 | 4 | 5>;
|
|
9
|
+
comment?: string;
|
|
10
|
+
timestamp: number;
|
|
11
|
+
/** Ed25519 signature (hex) */
|
|
12
|
+
signature: string;
|
|
13
|
+
}
|
|
14
|
+
export interface AggregateRating {
|
|
15
|
+
peerId: PeerId;
|
|
16
|
+
averageByDimension: Record<RatingDimension, number>;
|
|
17
|
+
overallAverage: number;
|
|
18
|
+
totalRatings: number;
|
|
19
|
+
lastUpdated: number;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=rating.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rating.d.ts","sourceRoot":"","sources":["../../src/types/rating.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAExC,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,OAAO,GAAG,aAAa,GAAG,OAAO,GAAG,SAAS,CAAC;AAExF,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC,eAAe,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IACvD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,8BAA8B;IAC9B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,kBAAkB,EAAE,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;IACpD,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;CACrB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rating.js","sourceRoot":"","sources":["../../src/types/rating.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { PeerId } from './peer.js';
|
|
2
|
+
export type ReportReason = 'bad-quality' | 'overcharging' | 'timeout' | 'harmful-content' | 'fraud' | 'impersonation' | 'other';
|
|
3
|
+
export type ReportStatus = 'pending' | 'acknowledged' | 'resolved' | 'dismissed';
|
|
4
|
+
export interface ReportEvidence {
|
|
5
|
+
type: 'receipt' | 'log' | 'screenshot' | 'text';
|
|
6
|
+
data: string;
|
|
7
|
+
}
|
|
8
|
+
export interface PeerReport {
|
|
9
|
+
reportId: string;
|
|
10
|
+
reporterPeerId: PeerId;
|
|
11
|
+
targetPeerId: PeerId;
|
|
12
|
+
reason: ReportReason;
|
|
13
|
+
evidence: ReportEvidence[];
|
|
14
|
+
sessionId?: string;
|
|
15
|
+
timestamp: number;
|
|
16
|
+
status: ReportStatus;
|
|
17
|
+
/** Ed25519 signature over report data (hex string) */
|
|
18
|
+
signature: string;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=report.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../src/types/report.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAExC,MAAM,MAAM,YAAY,GACpB,aAAa,GACb,cAAc,GACd,SAAS,GACT,iBAAiB,GACjB,OAAO,GACP,eAAe,GACf,OAAO,CAAC;AAEZ,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,cAAc,GAAG,UAAU,GAAG,WAAW,CAAC;AAEjF,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,SAAS,GAAG,KAAK,GAAG,YAAY,GAAG,MAAM,CAAC;IAChD,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,YAAY,CAAC;IACrB,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,YAAY,CAAC;IACrB,sDAAsD;IACtD,SAAS,EAAE,MAAM,CAAC;CACnB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report.js","sourceRoot":"","sources":["../../src/types/report.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { ProviderType } from './metering.js';
|
|
2
|
+
export interface SellerProviderPricingConfig {
|
|
3
|
+
inputUsdPerMillion: number;
|
|
4
|
+
outputUsdPerMillion: number;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Per-provider capacity and pricing configuration for sellers.
|
|
8
|
+
*/
|
|
9
|
+
export interface SellerProviderConfig {
|
|
10
|
+
/** Provider identifier (must match a key in AntseedConfig.providers) */
|
|
11
|
+
type: ProviderType;
|
|
12
|
+
/** Whether this provider is enabled for selling */
|
|
13
|
+
enabled: boolean;
|
|
14
|
+
/** Plan limit in messages per hour. */
|
|
15
|
+
planLimitMsgPerHour: number;
|
|
16
|
+
/** Reserve floor in messages per hour. */
|
|
17
|
+
reserveFloorMsgPerHour: number;
|
|
18
|
+
/** Default pricing in USD per 1M tokens. */
|
|
19
|
+
pricing: SellerProviderPricingConfig;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Top-level seller configuration.
|
|
23
|
+
*/
|
|
24
|
+
export interface SellerConfig {
|
|
25
|
+
/** Whether seller mode is enabled */
|
|
26
|
+
enabled: boolean;
|
|
27
|
+
/** Maximum number of concurrent buyer connections */
|
|
28
|
+
maxConcurrentBuyers: number;
|
|
29
|
+
/** Per-provider selling configuration */
|
|
30
|
+
providers: SellerProviderConfig[];
|
|
31
|
+
/** Session timeout in ms. Default: 300_000 (5 minutes). */
|
|
32
|
+
sessionTimeoutMs: number;
|
|
33
|
+
/** DHT re-announce interval in ms. Default: 60_000 (1 minute). */
|
|
34
|
+
announceIntervalMs: number;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=seller.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seller.d.ts","sourceRoot":"","sources":["../../src/types/seller.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAElD,MAAM,WAAW,2BAA2B;IAC1C,kBAAkB,EAAE,MAAM,CAAC;IAC3B,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,wEAAwE;IACxE,IAAI,EAAE,YAAY,CAAC;IACnB,mDAAmD;IACnD,OAAO,EAAE,OAAO,CAAC;IACjB,uCAAuC;IACvC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,0CAA0C;IAC1C,sBAAsB,EAAE,MAAM,CAAC;IAC/B,4CAA4C;IAC5C,OAAO,EAAE,2BAA2B,CAAC;CACtC;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,qCAAqC;IACrC,OAAO,EAAE,OAAO,CAAC;IACjB,qDAAqD;IACrD,mBAAmB,EAAE,MAAM,CAAC;IAC5B,yCAAyC;IACzC,SAAS,EAAE,oBAAoB,EAAE,CAAC;IAClC,2DAA2D;IAC3D,gBAAgB,EAAE,MAAM,CAAC;IACzB,kEAAkE;IAClE,kBAAkB,EAAE,MAAM,CAAC;CAC5B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seller.js","sourceRoot":"","sources":["../../src/types/seller.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { PeerId } from './peer.js';
|
|
2
|
+
export type StakeStatus = 'active' | 'slashed' | 'withdrawn';
|
|
3
|
+
export interface StakeInfo {
|
|
4
|
+
peerId: PeerId;
|
|
5
|
+
amountUSDC: number;
|
|
6
|
+
stakedAt: number;
|
|
7
|
+
lockPeriodDays: number;
|
|
8
|
+
status: StakeStatus;
|
|
9
|
+
}
|
|
10
|
+
export interface StakeConfig {
|
|
11
|
+
minStakeUSDC: number;
|
|
12
|
+
lockPeriodDays: number;
|
|
13
|
+
slashPercentage: number;
|
|
14
|
+
}
|
|
15
|
+
export declare const DEFAULT_STAKE_CONFIG: StakeConfig;
|
|
16
|
+
//# sourceMappingURL=staking.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"staking.d.ts","sourceRoot":"","sources":["../../src/types/staking.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAExC,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,SAAS,GAAG,WAAW,CAAC;AAE7D,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,WAAW,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,eAAO,MAAM,oBAAoB,EAAE,WAIlC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"staking.js","sourceRoot":"","sources":["../../src/types/staking.ts"],"names":[],"mappings":"AAkBA,MAAM,CAAC,MAAM,oBAAoB,GAAgB;IAC/C,YAAY,EAAE,GAAG;IACjB,cAAc,EAAE,EAAE;IAClB,eAAe,EAAE,EAAE;CACpB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"debug.d.ts","sourceRoot":"","sources":["../../src/utils/debug.ts"],"names":[],"mappings":"AAIA,wBAAgB,cAAc,IAAI,OAAO,CAaxC;AAED,wBAAgB,QAAQ,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAIjD;AAED,wBAAgB,SAAS,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAIlD"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
function normalizeDebugValue(value) {
|
|
2
|
+
return (value ?? '').trim().toLowerCase();
|
|
3
|
+
}
|
|
4
|
+
export function isDebugEnabled() {
|
|
5
|
+
const fromAntseed = normalizeDebugValue(process.env['ANTSEED_DEBUG']);
|
|
6
|
+
if (fromAntseed === '1' ||
|
|
7
|
+
fromAntseed === 'true' ||
|
|
8
|
+
fromAntseed === 'yes' ||
|
|
9
|
+
fromAntseed === 'on') {
|
|
10
|
+
return true;
|
|
11
|
+
}
|
|
12
|
+
const fromDebug = normalizeDebugValue(process.env['DEBUG']);
|
|
13
|
+
return fromDebug === '*' || fromDebug.includes('antseed');
|
|
14
|
+
}
|
|
15
|
+
export function debugLog(...args) {
|
|
16
|
+
if (isDebugEnabled()) {
|
|
17
|
+
console.log(...args);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
export function debugWarn(...args) {
|
|
21
|
+
if (isDebugEnabled()) {
|
|
22
|
+
console.warn(...args);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=debug.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"debug.js","sourceRoot":"","sources":["../../src/utils/debug.ts"],"names":[],"mappings":"AAAA,SAAS,mBAAmB,CAAC,KAAyB;IACpD,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,MAAM,WAAW,GAAG,mBAAmB,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC;IACtE,IACE,WAAW,KAAK,GAAG;QACnB,WAAW,KAAK,MAAM;QACtB,WAAW,KAAK,KAAK;QACrB,WAAW,KAAK,IAAI,EACpB,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,SAAS,GAAG,mBAAmB,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;IAC5D,OAAO,SAAS,KAAK,GAAG,IAAI,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;AAC5D,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,GAAG,IAAe;IACzC,IAAI,cAAc,EAAE,EAAE,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;IACvB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,GAAG,IAAe;IAC1C,IAAI,cAAc,EAAE,EAAE,CAAC;QACrB,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;IACxB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hex.d.ts","sourceRoot":"","sources":["../../src/utils/hex.ts"],"names":[],"mappings":"AAAA,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAOlD;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAIpD"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export function hexToBytes(hex) {
|
|
2
|
+
if (hex.length % 2 !== 0)
|
|
3
|
+
throw new Error("Hex string must have even length");
|
|
4
|
+
const bytes = new Uint8Array(hex.length / 2);
|
|
5
|
+
for (let i = 0; i < hex.length; i += 2) {
|
|
6
|
+
bytes[i / 2] = parseInt(hex.slice(i, i + 2), 16);
|
|
7
|
+
}
|
|
8
|
+
return bytes;
|
|
9
|
+
}
|
|
10
|
+
export function bytesToHex(bytes) {
|
|
11
|
+
return Array.from(bytes)
|
|
12
|
+
.map((b) => b.toString(16).padStart(2, "0"))
|
|
13
|
+
.join("");
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=hex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hex.js","sourceRoot":"","sources":["../../src/utils/hex.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,UAAU,CAAC,GAAW;IACpC,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;IAC9E,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC7C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACvC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACnD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAiB;IAC1C,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;SACrB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;SAC3C,IAAI,CAAC,EAAE,CAAC,CAAC;AACd,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@antseed/node",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Antseed Network protocol SDK — P2P inference marketplace",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"engines": {
|
|
7
|
+
"node": ">=20.0.0"
|
|
8
|
+
},
|
|
9
|
+
"main": "dist/index.js",
|
|
10
|
+
"types": "dist/index.d.ts",
|
|
11
|
+
"exports": {
|
|
12
|
+
".": {
|
|
13
|
+
"import": "./dist/index.js",
|
|
14
|
+
"types": "./dist/index.d.ts"
|
|
15
|
+
},
|
|
16
|
+
"./p2p": {
|
|
17
|
+
"import": "./dist/p2p/index.js",
|
|
18
|
+
"types": "./dist/p2p/index.d.ts"
|
|
19
|
+
},
|
|
20
|
+
"./discovery": {
|
|
21
|
+
"import": "./dist/discovery/index.js",
|
|
22
|
+
"types": "./dist/discovery/index.d.ts"
|
|
23
|
+
},
|
|
24
|
+
"./metering": {
|
|
25
|
+
"import": "./dist/metering/index.js",
|
|
26
|
+
"types": "./dist/metering/index.d.ts"
|
|
27
|
+
},
|
|
28
|
+
"./payments": {
|
|
29
|
+
"import": "./dist/payments/index.js",
|
|
30
|
+
"types": "./dist/payments/index.d.ts"
|
|
31
|
+
},
|
|
32
|
+
"./types": {
|
|
33
|
+
"import": "./dist/types/index.js",
|
|
34
|
+
"types": "./dist/types/index.d.ts"
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
"scripts": {
|
|
38
|
+
"postinstall": "node scripts/patch-ethers.js",
|
|
39
|
+
"ensure:native": "node scripts/ensure-node-native-modules.mjs",
|
|
40
|
+
"build": "tsc",
|
|
41
|
+
"pretest": "npm run ensure:native",
|
|
42
|
+
"test": "\"$npm_node_execpath\" ./node_modules/vitest/vitest.mjs run",
|
|
43
|
+
"typecheck": "tsc --noEmit"
|
|
44
|
+
},
|
|
45
|
+
"dependencies": {
|
|
46
|
+
"@noble/ed25519": "^2.1.0",
|
|
47
|
+
"@silentbot1/nat-api": "^0.4.9",
|
|
48
|
+
"better-sqlite3": "^12.6.2",
|
|
49
|
+
"bittorrent-dht": "^11.0.11",
|
|
50
|
+
"ethers": "~6.16.0",
|
|
51
|
+
"node-datachannel": "^0.7.0"
|
|
52
|
+
},
|
|
53
|
+
"optionalDependencies": {
|
|
54
|
+
"keytar": "^7.9.0"
|
|
55
|
+
},
|
|
56
|
+
"devDependencies": {
|
|
57
|
+
"@types/better-sqlite3": "^7.6.13",
|
|
58
|
+
"@types/node": "^20.11.0",
|
|
59
|
+
"typescript": "^5.3.0",
|
|
60
|
+
"vitest": "^1.2.0"
|
|
61
|
+
}
|
|
62
|
+
}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { execFileSync } from 'node:child_process';
|
|
4
|
+
import { existsSync, readFileSync, writeFileSync } from 'node:fs';
|
|
5
|
+
import { createRequire } from 'node:module';
|
|
6
|
+
import path from 'node:path';
|
|
7
|
+
import { fileURLToPath } from 'node:url';
|
|
8
|
+
|
|
9
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
10
|
+
const __dirname = path.dirname(__filename);
|
|
11
|
+
const nodePackageDir = path.resolve(__dirname, '..');
|
|
12
|
+
const packageJsonPath = path.resolve(nodePackageDir, 'package.json');
|
|
13
|
+
const markerPath = path.resolve(nodePackageDir, 'node_modules', 'better-sqlite3', '.node-runtime-meta.json');
|
|
14
|
+
const runtime = {
|
|
15
|
+
nodeExec: process.execPath,
|
|
16
|
+
nodeArch: process.arch,
|
|
17
|
+
nodeVersion: process.version,
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
function readMarker() {
|
|
21
|
+
if (!existsSync(markerPath)) return null;
|
|
22
|
+
try {
|
|
23
|
+
const raw = readFileSync(markerPath, 'utf8');
|
|
24
|
+
const parsed = JSON.parse(raw);
|
|
25
|
+
if (!parsed || typeof parsed !== 'object') return null;
|
|
26
|
+
return parsed;
|
|
27
|
+
} catch {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function markerMatches(marker) {
|
|
33
|
+
return marker?.nodeExec === runtime.nodeExec
|
|
34
|
+
&& marker?.nodeArch === runtime.nodeArch
|
|
35
|
+
&& marker?.nodeVersion === runtime.nodeVersion;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function writeMarker() {
|
|
39
|
+
writeFileSync(
|
|
40
|
+
markerPath,
|
|
41
|
+
JSON.stringify({ ...runtime, updatedAt: new Date().toISOString() }, null, 2),
|
|
42
|
+
'utf8',
|
|
43
|
+
);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function loadBetterSqlite3() {
|
|
47
|
+
try {
|
|
48
|
+
const req = createRequire(packageJsonPath);
|
|
49
|
+
const Database = req('better-sqlite3');
|
|
50
|
+
const db = new Database(':memory:');
|
|
51
|
+
db.close();
|
|
52
|
+
return { ok: true, reason: null };
|
|
53
|
+
} catch (err) {
|
|
54
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
55
|
+
return { ok: false, reason: message };
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function resolveNpmCli() {
|
|
60
|
+
const envNpmExecPath = process.env.npm_execpath;
|
|
61
|
+
if (envNpmExecPath && existsSync(envNpmExecPath)) {
|
|
62
|
+
return envNpmExecPath;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
try {
|
|
66
|
+
const resolved = execFileSync(
|
|
67
|
+
process.execPath,
|
|
68
|
+
['-p', "require.resolve('npm/bin/npm-cli.js')"],
|
|
69
|
+
{ encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'] },
|
|
70
|
+
).trim();
|
|
71
|
+
if (resolved.length > 0 && existsSync(resolved)) {
|
|
72
|
+
return resolved;
|
|
73
|
+
}
|
|
74
|
+
} catch {
|
|
75
|
+
// fall through
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
try {
|
|
79
|
+
const prefix = execFileSync(
|
|
80
|
+
'npm',
|
|
81
|
+
['config', 'get', 'prefix'],
|
|
82
|
+
{ encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'] },
|
|
83
|
+
).trim();
|
|
84
|
+
const fromPrefix = path.resolve(prefix, 'lib', 'node_modules', 'npm', 'bin', 'npm-cli.js');
|
|
85
|
+
if (existsSync(fromPrefix)) {
|
|
86
|
+
return fromPrefix;
|
|
87
|
+
}
|
|
88
|
+
} catch {
|
|
89
|
+
// fall through
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
const commonCandidates = [
|
|
93
|
+
'/usr/local/lib/node_modules/npm/bin/npm-cli.js',
|
|
94
|
+
'/opt/homebrew/lib/node_modules/npm/bin/npm-cli.js',
|
|
95
|
+
path.resolve(path.dirname(process.execPath), '..', 'lib', 'node_modules', 'npm', 'bin', 'npm-cli.js'),
|
|
96
|
+
];
|
|
97
|
+
for (const candidate of commonCandidates) {
|
|
98
|
+
if (existsSync(candidate)) {
|
|
99
|
+
return candidate;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
return '';
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
function rebuildBetterSqlite3() {
|
|
107
|
+
const npmCli = resolveNpmCli();
|
|
108
|
+
if (!existsSync(npmCli)) {
|
|
109
|
+
throw new Error(`Unable to locate npm-cli.js for runtime ${process.execPath}`);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
execFileSync(
|
|
113
|
+
process.execPath,
|
|
114
|
+
[npmCli, 'rebuild', 'better-sqlite3', '--build-from-source'],
|
|
115
|
+
{
|
|
116
|
+
cwd: nodePackageDir,
|
|
117
|
+
stdio: 'inherit',
|
|
118
|
+
env: {
|
|
119
|
+
...process.env,
|
|
120
|
+
npm_config_arch: process.arch,
|
|
121
|
+
npm_config_build_from_source: 'true',
|
|
122
|
+
},
|
|
123
|
+
},
|
|
124
|
+
);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
if (!existsSync(path.resolve(nodePackageDir, 'node_modules', 'better-sqlite3'))) {
|
|
128
|
+
console.log('[native] better-sqlite3 not installed; skipping.');
|
|
129
|
+
process.exit(0);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
const marker = readMarker();
|
|
133
|
+
if (markerMatches(marker)) {
|
|
134
|
+
const loaded = loadBetterSqlite3();
|
|
135
|
+
if (loaded.ok) {
|
|
136
|
+
console.log(`[native] better-sqlite3 already aligned for Node ${runtime.nodeVersion} (${runtime.nodeArch}).`);
|
|
137
|
+
process.exit(0);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
const before = loadBetterSqlite3();
|
|
142
|
+
if (!before.ok) {
|
|
143
|
+
console.log(`[native] rebuilding better-sqlite3 for Node ${runtime.nodeVersion} (${runtime.nodeArch})...`);
|
|
144
|
+
rebuildBetterSqlite3();
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
const after = loadBetterSqlite3();
|
|
148
|
+
if (!after.ok) {
|
|
149
|
+
throw new Error(`[native] better-sqlite3 failed to load after rebuild: ${after.reason}`);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
writeMarker();
|
|
153
|
+
console.log('[native] better-sqlite3 runtime alignment complete.');
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Patches ethers v6 lib.esm/index.d.ts to avoid type-checking raw TypeScript sources.
|
|
3
|
+
*
|
|
4
|
+
* ethers v6 ships a lib.esm/index.d.ts that re-exports directly from the package's
|
|
5
|
+
* own TypeScript source tree (src.ts/). Because these are .ts files (not .d.ts),
|
|
6
|
+
* TypeScript's skipLibCheck does not apply to them and they fail under strict settings.
|
|
7
|
+
*
|
|
8
|
+
* The fix: redirect the two offending lines to the CJS build's ethers.d.ts, which
|
|
9
|
+
* contains only compiled, relative-path imports and is clean under any tsconfig.
|
|
10
|
+
*
|
|
11
|
+
* Related: https://github.com/ethers-io/ethers.js/issues/4014
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import { readFileSync, writeFileSync, existsSync } from 'node:fs'
|
|
15
|
+
import { resolve, dirname } from 'node:path'
|
|
16
|
+
import { fileURLToPath } from 'node:url'
|
|
17
|
+
|
|
18
|
+
const __dirname = fileURLToPath(new URL('.', import.meta.url))
|
|
19
|
+
const indexDts = resolve(__dirname, '../node_modules/ethers/lib.esm/index.d.ts')
|
|
20
|
+
|
|
21
|
+
if (!existsSync(indexDts)) {
|
|
22
|
+
// ethers not installed (optional dep scenario) — skip silently
|
|
23
|
+
process.exit(0)
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
const original = readFileSync(indexDts, 'utf-8')
|
|
27
|
+
|
|
28
|
+
if (!original.includes('../src.ts/ethers.ts')) {
|
|
29
|
+
// Already patched or a fixed version of ethers — nothing to do
|
|
30
|
+
process.exit(0)
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const patched = original
|
|
34
|
+
.replace(
|
|
35
|
+
'import * as ethers from "../src.ts/ethers.ts";',
|
|
36
|
+
'import * as ethers from "../lib.commonjs/ethers.js";'
|
|
37
|
+
)
|
|
38
|
+
.replace(
|
|
39
|
+
'export * from "../src.ts/ethers.ts";',
|
|
40
|
+
'export * from "../lib.commonjs/ethers.js";'
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
writeFileSync(indexDts, patched, 'utf-8')
|
|
44
|
+
console.log('patched ethers/lib.esm/index.d.ts → uses compiled CJS declarations')
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest'
|
|
2
|
+
import { encryptValue, decryptValue, deriveMachineKey, generateSalt } from './encryption.js'
|
|
3
|
+
|
|
4
|
+
describe('encryption', () => {
|
|
5
|
+
it('should round-trip encrypt and decrypt', () => {
|
|
6
|
+
const salt = generateSalt()
|
|
7
|
+
const key = deriveMachineKey(salt)
|
|
8
|
+
const plaintext = 'sk-ant-api03-secret-key-value'
|
|
9
|
+
const encrypted = encryptValue(plaintext, key)
|
|
10
|
+
expect(encrypted).not.toBe(plaintext)
|
|
11
|
+
const decrypted = decryptValue(encrypted, key)
|
|
12
|
+
expect(decrypted).toBe(plaintext)
|
|
13
|
+
})
|
|
14
|
+
|
|
15
|
+
it('should produce different ciphertexts for same input (random IV)', () => {
|
|
16
|
+
const salt = generateSalt()
|
|
17
|
+
const key = deriveMachineKey(salt)
|
|
18
|
+
const plaintext = 'test-secret'
|
|
19
|
+
const a = encryptValue(plaintext, key)
|
|
20
|
+
const b = encryptValue(plaintext, key)
|
|
21
|
+
expect(a).not.toBe(b)
|
|
22
|
+
})
|
|
23
|
+
|
|
24
|
+
it('should fail to decrypt with wrong key', () => {
|
|
25
|
+
const salt1 = generateSalt()
|
|
26
|
+
const salt2 = generateSalt()
|
|
27
|
+
const key1 = deriveMachineKey(salt1)
|
|
28
|
+
const key2 = deriveMachineKey(salt2)
|
|
29
|
+
const encrypted = encryptValue('secret', key1)
|
|
30
|
+
expect(() => decryptValue(encrypted, key2)).toThrow()
|
|
31
|
+
})
|
|
32
|
+
|
|
33
|
+
it('should handle empty string', () => {
|
|
34
|
+
const salt = generateSalt()
|
|
35
|
+
const key = deriveMachineKey(salt)
|
|
36
|
+
const encrypted = encryptValue('', key)
|
|
37
|
+
const decrypted = decryptValue(encrypted, key)
|
|
38
|
+
expect(decrypted).toBe('')
|
|
39
|
+
})
|
|
40
|
+
|
|
41
|
+
it('should handle unicode', () => {
|
|
42
|
+
const salt = generateSalt()
|
|
43
|
+
const key = deriveMachineKey(salt)
|
|
44
|
+
const plaintext = 'héllo wörld 🔑'
|
|
45
|
+
const encrypted = encryptValue(plaintext, key)
|
|
46
|
+
const decrypted = decryptValue(encrypted, key)
|
|
47
|
+
expect(decrypted).toBe(plaintext)
|
|
48
|
+
})
|
|
49
|
+
})
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { createCipheriv, createDecipheriv, randomBytes, scryptSync } from 'node:crypto'
|
|
2
|
+
import { hostname, homedir } from 'node:os'
|
|
3
|
+
|
|
4
|
+
const ALGORITHM = 'aes-256-gcm'
|
|
5
|
+
const SALT_LENGTH = 32
|
|
6
|
+
const IV_LENGTH = 16
|
|
7
|
+
const TAG_LENGTH = 16
|
|
8
|
+
const KEY_LENGTH = 32
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Derive an encryption key from a machine-specific seed.
|
|
12
|
+
*/
|
|
13
|
+
export function deriveMachineKey(salt: Buffer): Buffer {
|
|
14
|
+
const seed = [
|
|
15
|
+
process.env['USER'] ?? process.env['USERNAME'] ?? '',
|
|
16
|
+
hostname(),
|
|
17
|
+
homedir(),
|
|
18
|
+
].join(':')
|
|
19
|
+
return scryptSync(seed, salt, KEY_LENGTH)
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Encrypt a string value. Returns base64-encoded ciphertext with IV and auth tag prepended.
|
|
24
|
+
*/
|
|
25
|
+
export function encryptValue(plaintext: string, key: Buffer): string {
|
|
26
|
+
const iv = randomBytes(IV_LENGTH)
|
|
27
|
+
const cipher = createCipheriv(ALGORITHM, key, iv)
|
|
28
|
+
const encrypted = Buffer.concat([cipher.update(plaintext, 'utf-8'), cipher.final()])
|
|
29
|
+
const tag = cipher.getAuthTag()
|
|
30
|
+
const combined = Buffer.concat([iv, tag, encrypted])
|
|
31
|
+
return combined.toString('base64')
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Decrypt a base64-encoded value produced by encryptValue.
|
|
36
|
+
*/
|
|
37
|
+
export function decryptValue(encoded: string, key: Buffer): string {
|
|
38
|
+
const combined = Buffer.from(encoded, 'base64')
|
|
39
|
+
const iv = combined.subarray(0, IV_LENGTH)
|
|
40
|
+
const tag = combined.subarray(IV_LENGTH, IV_LENGTH + TAG_LENGTH)
|
|
41
|
+
const ciphertext = combined.subarray(IV_LENGTH + TAG_LENGTH)
|
|
42
|
+
const decipher = createDecipheriv(ALGORITHM, key, iv)
|
|
43
|
+
decipher.setAuthTag(tag)
|
|
44
|
+
const decrypted = Buffer.concat([decipher.update(ciphertext), decipher.final()])
|
|
45
|
+
return decrypted.toString('utf-8')
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Generate a fresh random salt for key derivation.
|
|
50
|
+
*/
|
|
51
|
+
export function generateSalt(): Buffer {
|
|
52
|
+
return randomBytes(SALT_LENGTH)
|
|
53
|
+
}
|