@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,120 @@
|
|
|
1
|
+
import { readFile, writeFile, mkdir } from 'node:fs/promises';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import type { PeerId } from '../types/peer.js';
|
|
4
|
+
import type { TrustScore, TrustComponents } from './trust-score.js';
|
|
5
|
+
import { DEFAULT_COMPONENTS, computeTrustScore } from './trust-score.js';
|
|
6
|
+
|
|
7
|
+
export interface TrustEngineConfig {
|
|
8
|
+
configDir: string;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export class TrustScoreEngine {
|
|
12
|
+
private readonly configDir: string;
|
|
13
|
+
private scores: Map<string, TrustScore> = new Map();
|
|
14
|
+
|
|
15
|
+
constructor(config: TrustEngineConfig) {
|
|
16
|
+
this.configDir = config.configDir;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Update trust score for a peer with new component data.
|
|
21
|
+
* Merges partial components with existing or defaults.
|
|
22
|
+
*/
|
|
23
|
+
updateScore(peerId: PeerId, partialComponents: Partial<TrustComponents>): TrustScore {
|
|
24
|
+
const existing = this.scores.get(peerId);
|
|
25
|
+
const components: TrustComponents = {
|
|
26
|
+
...(existing?.components ?? DEFAULT_COMPONENTS),
|
|
27
|
+
...partialComponents,
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
const score: TrustScore = {
|
|
31
|
+
peerId,
|
|
32
|
+
score: computeTrustScore(components),
|
|
33
|
+
components,
|
|
34
|
+
updatedAt: Date.now(),
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
this.scores.set(peerId, score);
|
|
38
|
+
return score;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
getScore(peerId: PeerId): TrustScore | null {
|
|
42
|
+
return this.scores.get(peerId) ?? null;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
getAllScores(): TrustScore[] {
|
|
46
|
+
return Array.from(this.scores.values());
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Compute report rate component for trust score.
|
|
51
|
+
* Based on unique reporters with 30-day half-life decay.
|
|
52
|
+
*/
|
|
53
|
+
computeReportComponent(reports: Array<{ reporterPeerId: string; timestamp: number }>): number {
|
|
54
|
+
if (reports.length === 0) return 1.0;
|
|
55
|
+
|
|
56
|
+
const now = Date.now();
|
|
57
|
+
const HALF_LIFE_MS = 30 * 24 * 60 * 60 * 1000;
|
|
58
|
+
|
|
59
|
+
const reporterWeights = new Map<string, number>();
|
|
60
|
+
for (const r of reports) {
|
|
61
|
+
const age = now - r.timestamp;
|
|
62
|
+
const weight = Math.pow(0.5, age / HALF_LIFE_MS);
|
|
63
|
+
const existing = reporterWeights.get(r.reporterPeerId) ?? 0;
|
|
64
|
+
reporterWeights.set(r.reporterPeerId, Math.max(existing, weight));
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
const totalWeight = Array.from(reporterWeights.values()).reduce((a, b) => a + b, 0);
|
|
68
|
+
return Math.max(0, 1 - totalWeight / 5);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Compute peer rating component for trust score.
|
|
73
|
+
* Uses Bayesian averaging: blend with global average until enough ratings.
|
|
74
|
+
*/
|
|
75
|
+
computeRatingComponent(
|
|
76
|
+
ratings: Array<{ overallScore: number; raterTrustScore?: number }>,
|
|
77
|
+
globalAverage: number = 3.0,
|
|
78
|
+
minRatings: number = 5,
|
|
79
|
+
): number {
|
|
80
|
+
if (ratings.length === 0) return 0.5;
|
|
81
|
+
|
|
82
|
+
let weightedSum = 0;
|
|
83
|
+
let totalWeight = 0;
|
|
84
|
+
|
|
85
|
+
for (const r of ratings) {
|
|
86
|
+
const weight = r.raterTrustScore !== undefined ? r.raterTrustScore / 100 : 0.5;
|
|
87
|
+
weightedSum += r.overallScore * weight;
|
|
88
|
+
totalWeight += weight;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
const rawAverage = totalWeight > 0 ? weightedSum / totalWeight : globalAverage;
|
|
92
|
+
|
|
93
|
+
const n = ratings.length;
|
|
94
|
+
const bayesian = (minRatings * globalAverage + n * rawAverage) / (minRatings + n);
|
|
95
|
+
|
|
96
|
+
return Math.max(0, Math.min(1, (bayesian - 1) / 4));
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
async save(): Promise<void> {
|
|
100
|
+
await mkdir(this.configDir, { recursive: true });
|
|
101
|
+
const filePath = join(this.configDir, 'trust-scores.json');
|
|
102
|
+
const data = Array.from(this.scores.values());
|
|
103
|
+
await writeFile(filePath, JSON.stringify(data, null, 2), 'utf-8');
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
async load(): Promise<void> {
|
|
107
|
+
const filePath = join(this.configDir, 'trust-scores.json');
|
|
108
|
+
try {
|
|
109
|
+
const raw = await readFile(filePath, 'utf-8');
|
|
110
|
+
const data = JSON.parse(raw) as TrustScore[];
|
|
111
|
+
this.scores.clear();
|
|
112
|
+
for (const score of data) {
|
|
113
|
+
this.scores.set(score.peerId, score);
|
|
114
|
+
}
|
|
115
|
+
} catch {
|
|
116
|
+
// File doesn't exist or is invalid — start fresh
|
|
117
|
+
this.scores.clear();
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import type { PeerId } from '../types/peer.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Individual components that make up a trust score.
|
|
5
|
+
* Each component is normalized to 0.0 - 1.0.
|
|
6
|
+
*/
|
|
7
|
+
export interface TrustComponents {
|
|
8
|
+
/** Successful delivery rate (completed requests / total requests) */
|
|
9
|
+
deliveryRate: number;
|
|
10
|
+
/** Inverse dispute rate (1 - disputes/total) */
|
|
11
|
+
disputeRate: number;
|
|
12
|
+
/** Uptime percentage over rolling window */
|
|
13
|
+
uptimeRate: number;
|
|
14
|
+
/** Response quality score from metering data */
|
|
15
|
+
responseQuality: number;
|
|
16
|
+
/** Weight based on staked amount (normalized) */
|
|
17
|
+
stakeWeight: number;
|
|
18
|
+
/** Aggregate peer ratings (normalized average) */
|
|
19
|
+
peerRatings: number;
|
|
20
|
+
/** Account age factor (logarithmic scale) */
|
|
21
|
+
accountAge: number;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Computed trust score for a peer.
|
|
26
|
+
*/
|
|
27
|
+
export interface TrustScore {
|
|
28
|
+
peerId: PeerId;
|
|
29
|
+
/** Overall trust score 0-100 */
|
|
30
|
+
score: number;
|
|
31
|
+
/** Individual component scores */
|
|
32
|
+
components: TrustComponents;
|
|
33
|
+
/** When this score was last computed */
|
|
34
|
+
updatedAt: number;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/** Default weights for trust score computation. */
|
|
38
|
+
export const DEFAULT_TRUST_WEIGHTS: Record<keyof TrustComponents, number> = {
|
|
39
|
+
deliveryRate: 0.25,
|
|
40
|
+
disputeRate: 0.25,
|
|
41
|
+
uptimeRate: 0.15,
|
|
42
|
+
responseQuality: 0.15,
|
|
43
|
+
stakeWeight: 0.10,
|
|
44
|
+
peerRatings: 0.05,
|
|
45
|
+
accountAge: 0.05,
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
/** Default component values for unknown metrics */
|
|
49
|
+
export const DEFAULT_COMPONENTS: TrustComponents = {
|
|
50
|
+
deliveryRate: 0.5,
|
|
51
|
+
disputeRate: 0.5,
|
|
52
|
+
uptimeRate: 0.5,
|
|
53
|
+
responseQuality: 0.5,
|
|
54
|
+
stakeWeight: 0.0,
|
|
55
|
+
peerRatings: 0.5,
|
|
56
|
+
accountAge: 0.0,
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Compute a trust score from components using weighted sum.
|
|
61
|
+
* @returns Score from 0-100
|
|
62
|
+
*/
|
|
63
|
+
export function computeTrustScore(
|
|
64
|
+
components: TrustComponents,
|
|
65
|
+
weights: Partial<Record<keyof TrustComponents, number>> = {}
|
|
66
|
+
): number {
|
|
67
|
+
const w = { ...DEFAULT_TRUST_WEIGHTS, ...weights };
|
|
68
|
+
let score = 0;
|
|
69
|
+
for (const key of Object.keys(w) as Array<keyof TrustComponents>) {
|
|
70
|
+
const component = Math.max(0, Math.min(1, components[key]));
|
|
71
|
+
score += component * w[key];
|
|
72
|
+
}
|
|
73
|
+
return Math.round(score * 100 * 100) / 100; // 2 decimal places
|
|
74
|
+
}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import { EventEmitter } from 'node:events';
|
|
2
|
+
import type { PeerId } from '../types/peer.js';
|
|
3
|
+
|
|
4
|
+
export interface UptimeWindow {
|
|
5
|
+
start: number;
|
|
6
|
+
end: number;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export interface PeerUptimeRecord {
|
|
10
|
+
peerId: PeerId;
|
|
11
|
+
windows: UptimeWindow[];
|
|
12
|
+
lastPingAt: number;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export interface UptimeTrackerConfig {
|
|
16
|
+
/** How long since last ping before a peer is considered offline (ms). Default: 120_000 (2 min) */
|
|
17
|
+
offlineThresholdMs?: number;
|
|
18
|
+
/** Rolling window for uptime calculation (ms). Default: 7 * 24 * 60 * 60 * 1000 (7 days) */
|
|
19
|
+
windowDurationMs?: number;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const DEFAULT_OFFLINE_THRESHOLD = 120_000;
|
|
23
|
+
const DEFAULT_WINDOW_DURATION = 7 * 24 * 60 * 60 * 1000;
|
|
24
|
+
|
|
25
|
+
export class UptimeTracker extends EventEmitter {
|
|
26
|
+
private records: Map<string, PeerUptimeRecord> = new Map();
|
|
27
|
+
private readonly offlineThresholdMs: number;
|
|
28
|
+
private readonly windowDurationMs: number;
|
|
29
|
+
private checkInterval: ReturnType<typeof setInterval> | null = null;
|
|
30
|
+
|
|
31
|
+
constructor(config?: UptimeTrackerConfig) {
|
|
32
|
+
super();
|
|
33
|
+
this.offlineThresholdMs = config?.offlineThresholdMs ?? DEFAULT_OFFLINE_THRESHOLD;
|
|
34
|
+
this.windowDurationMs = config?.windowDurationMs ?? DEFAULT_WINDOW_DURATION;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Record a ping from a peer — marks them as online.
|
|
39
|
+
*/
|
|
40
|
+
recordPing(peerId: PeerId): void {
|
|
41
|
+
const now = Date.now();
|
|
42
|
+
const record = this.records.get(peerId);
|
|
43
|
+
|
|
44
|
+
if (!record) {
|
|
45
|
+
// New peer — start first window
|
|
46
|
+
this.records.set(peerId, {
|
|
47
|
+
peerId,
|
|
48
|
+
windows: [{ start: now, end: now }],
|
|
49
|
+
lastPingAt: now,
|
|
50
|
+
});
|
|
51
|
+
this.emit('peer-online', peerId);
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
const lastWindow = record.windows[record.windows.length - 1];
|
|
56
|
+
const timeSinceLastPing = now - record.lastPingAt;
|
|
57
|
+
|
|
58
|
+
if (timeSinceLastPing > this.offlineThresholdMs) {
|
|
59
|
+
// Was offline — start new window
|
|
60
|
+
if (lastWindow) {
|
|
61
|
+
lastWindow.end = record.lastPingAt;
|
|
62
|
+
}
|
|
63
|
+
record.windows.push({ start: now, end: now });
|
|
64
|
+
this.emit('peer-online', peerId);
|
|
65
|
+
} else if (lastWindow) {
|
|
66
|
+
// Extend current window
|
|
67
|
+
lastWindow.end = now;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
record.lastPingAt = now;
|
|
71
|
+
this.pruneOldWindows(record);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Explicitly record a peer going offline.
|
|
76
|
+
*/
|
|
77
|
+
recordOffline(peerId: PeerId): void {
|
|
78
|
+
const record = this.records.get(peerId);
|
|
79
|
+
if (!record) return;
|
|
80
|
+
|
|
81
|
+
const lastWindow = record.windows[record.windows.length - 1];
|
|
82
|
+
if (lastWindow) {
|
|
83
|
+
lastWindow.end = Date.now();
|
|
84
|
+
}
|
|
85
|
+
this.emit('peer-offline', peerId);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Calculate uptime rate for a peer over the rolling window.
|
|
90
|
+
* @returns 0.0 to 1.0
|
|
91
|
+
*/
|
|
92
|
+
getUptimeRate(peerId: PeerId): number {
|
|
93
|
+
const record = this.records.get(peerId);
|
|
94
|
+
if (!record || record.windows.length === 0) return 0;
|
|
95
|
+
|
|
96
|
+
const now = Date.now();
|
|
97
|
+
const windowStart = now - this.windowDurationMs;
|
|
98
|
+
let totalUptime = 0;
|
|
99
|
+
|
|
100
|
+
for (const w of record.windows) {
|
|
101
|
+
const effectiveStart = Math.max(w.start, windowStart);
|
|
102
|
+
const effectiveEnd = Math.min(w.end, now);
|
|
103
|
+
if (effectiveEnd > effectiveStart) {
|
|
104
|
+
totalUptime += effectiveEnd - effectiveStart;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
return Math.min(1, totalUptime / this.windowDurationMs);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Get uptime rates for all tracked peers.
|
|
113
|
+
*/
|
|
114
|
+
getAllUptimeRates(): Map<PeerId, number> {
|
|
115
|
+
const rates = new Map<PeerId, number>();
|
|
116
|
+
for (const record of this.records.values()) {
|
|
117
|
+
rates.set(record.peerId, this.getUptimeRate(record.peerId));
|
|
118
|
+
}
|
|
119
|
+
return rates;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Start periodic checking for peers that have gone offline.
|
|
124
|
+
*/
|
|
125
|
+
startTracking(): void {
|
|
126
|
+
if (this.checkInterval) return;
|
|
127
|
+
this.checkInterval = setInterval(() => {
|
|
128
|
+
const now = Date.now();
|
|
129
|
+
for (const record of this.records.values()) {
|
|
130
|
+
if (now - record.lastPingAt > this.offlineThresholdMs) {
|
|
131
|
+
const lastWindow = record.windows[record.windows.length - 1];
|
|
132
|
+
if (lastWindow && lastWindow.end === record.lastPingAt) {
|
|
133
|
+
// Close the window — peer went offline
|
|
134
|
+
this.emit('peer-offline', record.peerId);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}, this.offlineThresholdMs);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Stop periodic tracking.
|
|
143
|
+
*/
|
|
144
|
+
stopTracking(): void {
|
|
145
|
+
if (this.checkInterval) {
|
|
146
|
+
clearInterval(this.checkInterval);
|
|
147
|
+
this.checkInterval = null;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
private pruneOldWindows(record: PeerUptimeRecord): void {
|
|
152
|
+
const cutoff = Date.now() - this.windowDurationMs;
|
|
153
|
+
record.windows = record.windows.filter(w => w.end > cutoff);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import type { Router } from '../interfaces/buyer-router.js';
|
|
2
|
+
import type { PeerInfo } from '../types/peer.js';
|
|
3
|
+
import type { SerializedHttpRequest } from '../types/http.js';
|
|
4
|
+
|
|
5
|
+
export interface DefaultRouterConfig {
|
|
6
|
+
minReputation?: number; // Default: 50
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export class DefaultRouter implements Router {
|
|
10
|
+
private _minReputation: number;
|
|
11
|
+
private _latencyMap = new Map<string, number>();
|
|
12
|
+
|
|
13
|
+
constructor(config?: DefaultRouterConfig) {
|
|
14
|
+
this._minReputation = config?.minReputation ?? 50;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
selectPeer(_req: SerializedHttpRequest, peers: PeerInfo[]): PeerInfo | null {
|
|
18
|
+
const eligible = peers.filter(
|
|
19
|
+
(p) => !this._hasReputation(p) || this._effectiveReputation(p) >= this._minReputation
|
|
20
|
+
);
|
|
21
|
+
if (eligible.length === 0) return null;
|
|
22
|
+
|
|
23
|
+
eligible.sort((a, b) => {
|
|
24
|
+
const priceA = a.defaultInputUsdPerMillion ?? Infinity;
|
|
25
|
+
const priceB = b.defaultInputUsdPerMillion ?? Infinity;
|
|
26
|
+
if (priceA !== priceB) return priceA - priceB;
|
|
27
|
+
// Prefer higher trust scores (descending)
|
|
28
|
+
const trustA = this._effectiveReputation(a);
|
|
29
|
+
const trustB = this._effectiveReputation(b);
|
|
30
|
+
if (trustA !== trustB) return trustB - trustA;
|
|
31
|
+
const latA = this._latencyMap.get(a.peerId) ?? Infinity;
|
|
32
|
+
const latB = this._latencyMap.get(b.peerId) ?? Infinity;
|
|
33
|
+
return latA - latB;
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
return eligible[0] ?? null;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
onResult(peer: PeerInfo, result: { success: boolean; latencyMs: number; tokens: number }): void {
|
|
40
|
+
if (result.success) {
|
|
41
|
+
const prev = this._latencyMap.get(peer.peerId) ?? result.latencyMs;
|
|
42
|
+
this._latencyMap.set(peer.peerId, prev * 0.7 + result.latencyMs * 0.3);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
private _effectiveReputation(peer: PeerInfo): number {
|
|
47
|
+
if (this._isFiniteNonNegative(peer.onChainReputation)) {
|
|
48
|
+
return peer.onChainReputation;
|
|
49
|
+
}
|
|
50
|
+
if (this._isFiniteNonNegative(peer.trustScore)) {
|
|
51
|
+
return peer.trustScore;
|
|
52
|
+
}
|
|
53
|
+
if (this._isFiniteNonNegative(peer.reputationScore)) {
|
|
54
|
+
return peer.reputationScore;
|
|
55
|
+
}
|
|
56
|
+
return 0;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
private _hasReputation(peer: PeerInfo): boolean {
|
|
60
|
+
if (this._isFiniteNonNegative(peer.onChainReputation)) {
|
|
61
|
+
const sessionCount = this._isFiniteNonNegative(peer.onChainSessionCount) ? peer.onChainSessionCount : undefined;
|
|
62
|
+
const disputeCount = this._isFiniteNonNegative(peer.onChainDisputeCount) ? peer.onChainDisputeCount : undefined;
|
|
63
|
+
if (sessionCount !== undefined || disputeCount !== undefined) {
|
|
64
|
+
return (sessionCount ?? 0) > 0 || (disputeCount ?? 0) > 0;
|
|
65
|
+
}
|
|
66
|
+
return true;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
return this._isFiniteNonNegative(peer.trustScore) || this._isFiniteNonNegative(peer.reputationScore);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
private _isFiniteNonNegative(value: number | undefined): value is number {
|
|
73
|
+
return typeof value === 'number' && Number.isFinite(value) && value >= 0;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
declare module "bittorrent-dht" {
|
|
2
|
+
import { EventEmitter } from "node:events";
|
|
3
|
+
|
|
4
|
+
interface DHTOptions {
|
|
5
|
+
bootstrap?: string[];
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
class DHT extends EventEmitter {
|
|
9
|
+
constructor(options?: DHTOptions);
|
|
10
|
+
listen(port: number, callback?: () => void): void;
|
|
11
|
+
announce(infoHash: Buffer, port: number, callback?: (err?: Error) => void): void;
|
|
12
|
+
lookup(infoHash: Buffer, callback?: () => void): void;
|
|
13
|
+
destroy(callback?: () => void): void;
|
|
14
|
+
address(): { port: number } | null;
|
|
15
|
+
nodes: { toArray(): unknown[] };
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export default DHT;
|
|
19
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { ProviderType } from './metering.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Per-provider preferences for the buyer.
|
|
5
|
+
*/
|
|
6
|
+
export interface BuyerProviderPreference {
|
|
7
|
+
/** Provider type to route through P2P */
|
|
8
|
+
type: ProviderType;
|
|
9
|
+
/** Whether this provider is enabled for P2P routing */
|
|
10
|
+
enabled: boolean;
|
|
11
|
+
/** Maximum price per 1K tokens in USD cents the buyer is willing to pay. */
|
|
12
|
+
maxPricePerKToken: number;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Top-level buyer configuration.
|
|
17
|
+
*/
|
|
18
|
+
export interface BuyerConfig {
|
|
19
|
+
/** Whether buyer mode is enabled */
|
|
20
|
+
enabled: boolean;
|
|
21
|
+
/** Local proxy listen port. Default: 8377 */
|
|
22
|
+
proxyPort: number;
|
|
23
|
+
/** Local proxy listen host. Default: '127.0.0.1' */
|
|
24
|
+
proxyHost: string;
|
|
25
|
+
/** Per-provider preferences */
|
|
26
|
+
providers: BuyerProviderPreference[];
|
|
27
|
+
/** Minimum peer reputation score (0-100). Default: 50 */
|
|
28
|
+
minPeerReputation: number;
|
|
29
|
+
/** Maximum number of peers to maintain in the pool. Default: 10 */
|
|
30
|
+
maxPoolSize: number;
|
|
31
|
+
/** Health check interval in ms. Default: 30_000 */
|
|
32
|
+
healthCheckIntervalMs: number;
|
|
33
|
+
/** Timeout for requests forwarded to peers in ms. Default: 120_000 */
|
|
34
|
+
requestTimeoutMs: number;
|
|
35
|
+
/** Whether to automatically set env vars for CLI tools. Default: true */
|
|
36
|
+
autoSetEnvVars: boolean;
|
|
37
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provider capability types — what a peer can offer beyond inference.
|
|
3
|
+
*/
|
|
4
|
+
export type ProviderCapability =
|
|
5
|
+
| 'inference'
|
|
6
|
+
| 'agent'
|
|
7
|
+
| 'skill'
|
|
8
|
+
| 'tool'
|
|
9
|
+
| 'embedding'
|
|
10
|
+
| 'image-gen'
|
|
11
|
+
| 'tts'
|
|
12
|
+
| 'stt';
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Pricing tier for an offering.
|
|
16
|
+
*/
|
|
17
|
+
export interface PricingTier {
|
|
18
|
+
unit: 'token' | 'request' | 'minute' | 'task';
|
|
19
|
+
pricePerUnit: number;
|
|
20
|
+
currency: 'USD';
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* A discrete offering that a peer advertises.
|
|
25
|
+
*/
|
|
26
|
+
export interface PeerOffering {
|
|
27
|
+
capability: ProviderCapability;
|
|
28
|
+
name: string;
|
|
29
|
+
description: string;
|
|
30
|
+
inputSchema?: Record<string, unknown>;
|
|
31
|
+
outputSchema?: Record<string, unknown>;
|
|
32
|
+
models?: string[];
|
|
33
|
+
pricing: PricingTier;
|
|
34
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { PeerId } from "./peer.js";
|
|
2
|
+
|
|
3
|
+
/** Connection lifecycle states. */
|
|
4
|
+
export enum ConnectionState {
|
|
5
|
+
Connecting = "connecting",
|
|
6
|
+
Open = "open",
|
|
7
|
+
Authenticated = "authenticated",
|
|
8
|
+
Closing = "closing",
|
|
9
|
+
Closed = "closed",
|
|
10
|
+
Failed = "failed",
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/** Events emitted by a PeerConnection. */
|
|
14
|
+
export interface ConnectionEvents {
|
|
15
|
+
stateChange: (state: ConnectionState) => void;
|
|
16
|
+
message: (data: Uint8Array) => void;
|
|
17
|
+
error: (err: Error) => void;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/** Configuration for a single connection. */
|
|
21
|
+
export interface ConnectionConfig {
|
|
22
|
+
remotePeerId: PeerId;
|
|
23
|
+
isInitiator: boolean;
|
|
24
|
+
timeoutMs?: number;
|
|
25
|
+
endpoint?: {
|
|
26
|
+
host: string;
|
|
27
|
+
port: number;
|
|
28
|
+
};
|
|
29
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export interface SerializedHttpRequest {
|
|
2
|
+
requestId: string;
|
|
3
|
+
method: string;
|
|
4
|
+
path: string;
|
|
5
|
+
headers: Record<string, string>;
|
|
6
|
+
body: Uint8Array;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export interface SerializedHttpResponse {
|
|
10
|
+
requestId: string;
|
|
11
|
+
statusCode: number;
|
|
12
|
+
headers: Record<string, string>;
|
|
13
|
+
body: Uint8Array;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export interface SerializedHttpResponseChunk {
|
|
17
|
+
requestId: string;
|
|
18
|
+
data: Uint8Array;
|
|
19
|
+
done: boolean;
|
|
20
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export * from './peer.js';
|
|
2
|
+
export * from './protocol.js';
|
|
3
|
+
export * from './connection.js';
|
|
4
|
+
export * from './metering.js';
|
|
5
|
+
export * from './provider.js';
|
|
6
|
+
export * from './seller.js';
|
|
7
|
+
export * from './buyer.js';
|
|
8
|
+
export * from './http.js';
|
|
9
|
+
export * from './capability.js';
|
|
10
|
+
export * from './peer-profile.js';
|
|
11
|
+
export * from './staking.js';
|
|
12
|
+
export * from './report.js';
|
|
13
|
+
export * from './rating.js';
|
|
14
|
+
export * from './plugin-config.js';
|