@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.
Files changed (443) hide show
  1. package/README.md +411 -0
  2. package/contracts/AntseedEscrow.sol +310 -0
  3. package/contracts/MockUSDC.sol +64 -0
  4. package/contracts/README.md +102 -0
  5. package/dist/config/encryption.d.ts +17 -0
  6. package/dist/config/encryption.d.ts.map +1 -0
  7. package/dist/config/encryption.js +49 -0
  8. package/dist/config/encryption.js.map +1 -0
  9. package/dist/config/plugin-config-manager.d.ts +31 -0
  10. package/dist/config/plugin-config-manager.d.ts.map +1 -0
  11. package/dist/config/plugin-config-manager.js +135 -0
  12. package/dist/config/plugin-config-manager.js.map +1 -0
  13. package/dist/config/plugin-loader.d.ts +25 -0
  14. package/dist/config/plugin-loader.d.ts.map +1 -0
  15. package/dist/config/plugin-loader.js +64 -0
  16. package/dist/config/plugin-loader.js.map +1 -0
  17. package/dist/discovery/announcer.d.ts +44 -0
  18. package/dist/discovery/announcer.d.ts.map +1 -0
  19. package/dist/discovery/announcer.js +129 -0
  20. package/dist/discovery/announcer.js.map +1 -0
  21. package/dist/discovery/bootstrap.d.ts +13 -0
  22. package/dist/discovery/bootstrap.d.ts.map +1 -0
  23. package/dist/discovery/bootstrap.js +39 -0
  24. package/dist/discovery/bootstrap.js.map +1 -0
  25. package/dist/discovery/default-metadata-resolver.d.ts +16 -0
  26. package/dist/discovery/default-metadata-resolver.d.ts.map +1 -0
  27. package/dist/discovery/default-metadata-resolver.js +16 -0
  28. package/dist/discovery/default-metadata-resolver.js.map +1 -0
  29. package/dist/discovery/dht-health.d.ts +38 -0
  30. package/dist/discovery/dht-health.d.ts.map +1 -0
  31. package/dist/discovery/dht-health.js +101 -0
  32. package/dist/discovery/dht-health.js.map +1 -0
  33. package/dist/discovery/dht-node.d.ts +34 -0
  34. package/dist/discovery/dht-node.d.ts.map +1 -0
  35. package/dist/discovery/dht-node.js +168 -0
  36. package/dist/discovery/dht-node.js.map +1 -0
  37. package/dist/discovery/http-metadata-resolver.d.ts +15 -0
  38. package/dist/discovery/http-metadata-resolver.d.ts.map +1 -0
  39. package/dist/discovery/http-metadata-resolver.js +33 -0
  40. package/dist/discovery/http-metadata-resolver.js.map +1 -0
  41. package/dist/discovery/index.d.ts +16 -0
  42. package/dist/discovery/index.d.ts.map +1 -0
  43. package/dist/discovery/index.js +15 -0
  44. package/dist/discovery/index.js.map +1 -0
  45. package/dist/discovery/metadata-codec.d.ts +22 -0
  46. package/dist/discovery/metadata-codec.d.ts.map +1 -0
  47. package/dist/discovery/metadata-codec.js +390 -0
  48. package/dist/discovery/metadata-codec.js.map +1 -0
  49. package/dist/discovery/metadata-resolver.d.ts +9 -0
  50. package/dist/discovery/metadata-resolver.d.ts.map +1 -0
  51. package/dist/discovery/metadata-resolver.js +2 -0
  52. package/dist/discovery/metadata-resolver.js.map +1 -0
  53. package/dist/discovery/metadata-server.d.ts +16 -0
  54. package/dist/discovery/metadata-server.d.ts.map +1 -0
  55. package/dist/discovery/metadata-server.js +59 -0
  56. package/dist/discovery/metadata-server.js.map +1 -0
  57. package/dist/discovery/metadata-validator.d.ts +12 -0
  58. package/dist/discovery/metadata-validator.d.ts.map +1 -0
  59. package/dist/discovery/metadata-validator.js +153 -0
  60. package/dist/discovery/metadata-validator.js.map +1 -0
  61. package/dist/discovery/peer-lookup.d.ts +26 -0
  62. package/dist/discovery/peer-lookup.d.ts.map +1 -0
  63. package/dist/discovery/peer-lookup.js +86 -0
  64. package/dist/discovery/peer-lookup.js.map +1 -0
  65. package/dist/discovery/peer-metadata.d.ts +31 -0
  66. package/dist/discovery/peer-metadata.d.ts.map +1 -0
  67. package/dist/discovery/peer-metadata.js +2 -0
  68. package/dist/discovery/peer-metadata.js.map +1 -0
  69. package/dist/discovery/peer-selector.d.ts +33 -0
  70. package/dist/discovery/peer-selector.d.ts.map +1 -0
  71. package/dist/discovery/peer-selector.js +80 -0
  72. package/dist/discovery/peer-selector.js.map +1 -0
  73. package/dist/discovery/profile-manager.d.ts +50 -0
  74. package/dist/discovery/profile-manager.d.ts.map +1 -0
  75. package/dist/discovery/profile-manager.js +105 -0
  76. package/dist/discovery/profile-manager.js.map +1 -0
  77. package/dist/discovery/profile-search.d.ts +27 -0
  78. package/dist/discovery/profile-search.d.ts.map +1 -0
  79. package/dist/discovery/profile-search.js +75 -0
  80. package/dist/discovery/profile-search.js.map +1 -0
  81. package/dist/discovery/reputation-verifier.d.ts +25 -0
  82. package/dist/discovery/reputation-verifier.d.ts.map +1 -0
  83. package/dist/discovery/reputation-verifier.js +27 -0
  84. package/dist/discovery/reputation-verifier.js.map +1 -0
  85. package/dist/index.d.ts +37 -0
  86. package/dist/index.d.ts.map +1 -0
  87. package/dist/index.js +32 -0
  88. package/dist/index.js.map +1 -0
  89. package/dist/interfaces/buyer-router.d.ts +21 -0
  90. package/dist/interfaces/buyer-router.d.ts.map +1 -0
  91. package/dist/interfaces/buyer-router.js +2 -0
  92. package/dist/interfaces/buyer-router.js.map +1 -0
  93. package/dist/interfaces/plugin.d.ts +31 -0
  94. package/dist/interfaces/plugin.d.ts.map +1 -0
  95. package/dist/interfaces/plugin.js +2 -0
  96. package/dist/interfaces/plugin.js.map +1 -0
  97. package/dist/interfaces/seller-provider.d.ts +69 -0
  98. package/dist/interfaces/seller-provider.d.ts.map +1 -0
  99. package/dist/interfaces/seller-provider.js +2 -0
  100. package/dist/interfaces/seller-provider.js.map +1 -0
  101. package/dist/metering/index.d.ts +7 -0
  102. package/dist/metering/index.d.ts.map +1 -0
  103. package/dist/metering/index.js +7 -0
  104. package/dist/metering/index.js.map +1 -0
  105. package/dist/metering/receipt-generator.d.ts +49 -0
  106. package/dist/metering/receipt-generator.d.ts.map +1 -0
  107. package/dist/metering/receipt-generator.js +74 -0
  108. package/dist/metering/receipt-generator.js.map +1 -0
  109. package/dist/metering/receipt-verifier.d.ts +52 -0
  110. package/dist/metering/receipt-verifier.d.ts.map +1 -0
  111. package/dist/metering/receipt-verifier.js +63 -0
  112. package/dist/metering/receipt-verifier.js.map +1 -0
  113. package/dist/metering/session-tracker.d.ts +59 -0
  114. package/dist/metering/session-tracker.d.ts.map +1 -0
  115. package/dist/metering/session-tracker.js +119 -0
  116. package/dist/metering/session-tracker.js.map +1 -0
  117. package/dist/metering/storage.d.ts +72 -0
  118. package/dist/metering/storage.d.ts.map +1 -0
  119. package/dist/metering/storage.js +446 -0
  120. package/dist/metering/storage.js.map +1 -0
  121. package/dist/metering/token-counter.d.ts +50 -0
  122. package/dist/metering/token-counter.d.ts.map +1 -0
  123. package/dist/metering/token-counter.js +96 -0
  124. package/dist/metering/token-counter.js.map +1 -0
  125. package/dist/metering/usage-aggregator.d.ts +46 -0
  126. package/dist/metering/usage-aggregator.d.ts.map +1 -0
  127. package/dist/metering/usage-aggregator.js +170 -0
  128. package/dist/metering/usage-aggregator.js.map +1 -0
  129. package/dist/node.d.ts +179 -0
  130. package/dist/node.d.ts.map +1 -0
  131. package/dist/node.js +1328 -0
  132. package/dist/node.js.map +1 -0
  133. package/dist/p2p/connection-auth.d.ts +35 -0
  134. package/dist/p2p/connection-auth.d.ts.map +1 -0
  135. package/dist/p2p/connection-auth.js +102 -0
  136. package/dist/p2p/connection-auth.js.map +1 -0
  137. package/dist/p2p/connection-manager.d.ts +101 -0
  138. package/dist/p2p/connection-manager.d.ts.map +1 -0
  139. package/dist/p2p/connection-manager.js +726 -0
  140. package/dist/p2p/connection-manager.js.map +1 -0
  141. package/dist/p2p/handshake.d.ts +47 -0
  142. package/dist/p2p/handshake.d.ts.map +1 -0
  143. package/dist/p2p/handshake.js +107 -0
  144. package/dist/p2p/handshake.js.map +1 -0
  145. package/dist/p2p/ice-config.d.ts +27 -0
  146. package/dist/p2p/ice-config.d.ts.map +1 -0
  147. package/dist/p2p/ice-config.js +43 -0
  148. package/dist/p2p/ice-config.js.map +1 -0
  149. package/dist/p2p/identity.d.ts +27 -0
  150. package/dist/p2p/identity.d.ts.map +1 -0
  151. package/dist/p2p/identity.js +76 -0
  152. package/dist/p2p/identity.js.map +1 -0
  153. package/dist/p2p/index.d.ts +12 -0
  154. package/dist/p2p/index.d.ts.map +1 -0
  155. package/dist/p2p/index.js +11 -0
  156. package/dist/p2p/index.js.map +1 -0
  157. package/dist/p2p/keepalive.d.ts +49 -0
  158. package/dist/p2p/keepalive.d.ts.map +1 -0
  159. package/dist/p2p/keepalive.js +93 -0
  160. package/dist/p2p/keepalive.js.map +1 -0
  161. package/dist/p2p/message-protocol.d.ts +50 -0
  162. package/dist/p2p/message-protocol.d.ts.map +1 -0
  163. package/dist/p2p/message-protocol.js +134 -0
  164. package/dist/p2p/message-protocol.js.map +1 -0
  165. package/dist/p2p/nat-traversal.d.ts +51 -0
  166. package/dist/p2p/nat-traversal.d.ts.map +1 -0
  167. package/dist/p2p/nat-traversal.js +135 -0
  168. package/dist/p2p/nat-traversal.js.map +1 -0
  169. package/dist/p2p/payment-codec.d.ts +20 -0
  170. package/dist/p2p/payment-codec.d.ts.map +1 -0
  171. package/dist/p2p/payment-codec.js +130 -0
  172. package/dist/p2p/payment-codec.js.map +1 -0
  173. package/dist/p2p/payment-mux.d.ts +49 -0
  174. package/dist/p2p/payment-mux.d.ts.map +1 -0
  175. package/dist/p2p/payment-mux.js +131 -0
  176. package/dist/p2p/payment-mux.js.map +1 -0
  177. package/dist/p2p/reconnect.d.ts +48 -0
  178. package/dist/p2p/reconnect.d.ts.map +1 -0
  179. package/dist/p2p/reconnect.js +89 -0
  180. package/dist/p2p/reconnect.js.map +1 -0
  181. package/dist/payments/balance-manager.d.ts +17 -0
  182. package/dist/payments/balance-manager.d.ts.map +1 -0
  183. package/dist/payments/balance-manager.js +54 -0
  184. package/dist/payments/balance-manager.js.map +1 -0
  185. package/dist/payments/buyer-payment-manager.d.ts +122 -0
  186. package/dist/payments/buyer-payment-manager.d.ts.map +1 -0
  187. package/dist/payments/buyer-payment-manager.js +280 -0
  188. package/dist/payments/buyer-payment-manager.js.map +1 -0
  189. package/dist/payments/disputes.d.ts +18 -0
  190. package/dist/payments/disputes.d.ts.map +1 -0
  191. package/dist/payments/disputes.js +47 -0
  192. package/dist/payments/disputes.js.map +1 -0
  193. package/dist/payments/evm/escrow-client.d.ts +61 -0
  194. package/dist/payments/evm/escrow-client.d.ts.map +1 -0
  195. package/dist/payments/evm/escrow-client.js +170 -0
  196. package/dist/payments/evm/escrow-client.js.map +1 -0
  197. package/dist/payments/evm/keypair.d.ts +21 -0
  198. package/dist/payments/evm/keypair.d.ts.map +1 -0
  199. package/dist/payments/evm/keypair.js +29 -0
  200. package/dist/payments/evm/keypair.js.map +1 -0
  201. package/dist/payments/evm/signatures.d.ts +11 -0
  202. package/dist/payments/evm/signatures.d.ts.map +1 -0
  203. package/dist/payments/evm/signatures.js +56 -0
  204. package/dist/payments/evm/signatures.js.map +1 -0
  205. package/dist/payments/evm/wallet.d.ts +5 -0
  206. package/dist/payments/evm/wallet.d.ts.map +1 -0
  207. package/dist/payments/evm/wallet.js +31 -0
  208. package/dist/payments/evm/wallet.js.map +1 -0
  209. package/dist/payments/index.d.ts +13 -0
  210. package/dist/payments/index.d.ts.map +1 -0
  211. package/dist/payments/index.js +14 -0
  212. package/dist/payments/index.js.map +1 -0
  213. package/dist/payments/settlement.d.ts +6 -0
  214. package/dist/payments/settlement.d.ts.map +1 -0
  215. package/dist/payments/settlement.js +25 -0
  216. package/dist/payments/settlement.js.map +1 -0
  217. package/dist/payments/types.d.ts +66 -0
  218. package/dist/payments/types.d.ts.map +1 -0
  219. package/dist/payments/types.js +2 -0
  220. package/dist/payments/types.js.map +1 -0
  221. package/dist/proxy/index.d.ts +4 -0
  222. package/dist/proxy/index.d.ts.map +1 -0
  223. package/dist/proxy/index.js +4 -0
  224. package/dist/proxy/index.js.map +1 -0
  225. package/dist/proxy/provider-detection.d.ts +20 -0
  226. package/dist/proxy/provider-detection.d.ts.map +1 -0
  227. package/dist/proxy/provider-detection.js +61 -0
  228. package/dist/proxy/provider-detection.js.map +1 -0
  229. package/dist/proxy/proxy-mux.d.ts +35 -0
  230. package/dist/proxy/proxy-mux.d.ts.map +1 -0
  231. package/dist/proxy/proxy-mux.js +137 -0
  232. package/dist/proxy/proxy-mux.js.map +1 -0
  233. package/dist/proxy/request-codec.d.ts +33 -0
  234. package/dist/proxy/request-codec.d.ts.map +1 -0
  235. package/dist/proxy/request-codec.js +238 -0
  236. package/dist/proxy/request-codec.js.map +1 -0
  237. package/dist/reputation/index.d.ts +7 -0
  238. package/dist/reputation/index.d.ts.map +1 -0
  239. package/dist/reputation/index.js +6 -0
  240. package/dist/reputation/index.js.map +1 -0
  241. package/dist/reputation/rating-manager.d.ts +20 -0
  242. package/dist/reputation/rating-manager.d.ts.map +1 -0
  243. package/dist/reputation/rating-manager.js +91 -0
  244. package/dist/reputation/rating-manager.js.map +1 -0
  245. package/dist/reputation/report-manager.d.ts +21 -0
  246. package/dist/reputation/report-manager.d.ts.map +1 -0
  247. package/dist/reputation/report-manager.js +70 -0
  248. package/dist/reputation/report-manager.js.map +1 -0
  249. package/dist/reputation/trust-engine.d.ts +36 -0
  250. package/dist/reputation/trust-engine.d.ts.map +1 -0
  251. package/dist/reputation/trust-engine.js +95 -0
  252. package/dist/reputation/trust-engine.js.map +1 -0
  253. package/dist/reputation/trust-score.d.ts +43 -0
  254. package/dist/reputation/trust-score.d.ts.map +1 -0
  255. package/dist/reputation/trust-score.js +34 -0
  256. package/dist/reputation/trust-score.js.map +1 -0
  257. package/dist/reputation/uptime-tracker.d.ts +51 -0
  258. package/dist/reputation/uptime-tracker.d.ts.map +1 -0
  259. package/dist/reputation/uptime-tracker.js +123 -0
  260. package/dist/reputation/uptime-tracker.js.map +1 -0
  261. package/dist/routing/default-router.d.ts +21 -0
  262. package/dist/routing/default-router.d.ts.map +1 -0
  263. package/dist/routing/default-router.js +60 -0
  264. package/dist/routing/default-router.js.map +1 -0
  265. package/dist/types/buyer.d.ts +36 -0
  266. package/dist/types/buyer.d.ts.map +1 -0
  267. package/dist/types/buyer.js +2 -0
  268. package/dist/types/buyer.js.map +1 -0
  269. package/dist/types/capability.d.ts +25 -0
  270. package/dist/types/capability.d.ts.map +1 -0
  271. package/dist/types/capability.js +2 -0
  272. package/dist/types/capability.js.map +1 -0
  273. package/dist/types/connection.d.ts +27 -0
  274. package/dist/types/connection.d.ts.map +1 -0
  275. package/dist/types/connection.js +11 -0
  276. package/dist/types/connection.js.map +1 -0
  277. package/dist/types/http.d.ts +19 -0
  278. package/dist/types/http.d.ts.map +1 -0
  279. package/dist/types/http.js +2 -0
  280. package/dist/types/http.js.map +1 -0
  281. package/dist/types/index.d.ts +15 -0
  282. package/dist/types/index.d.ts.map +1 -0
  283. package/dist/types/index.js +15 -0
  284. package/dist/types/index.js.map +1 -0
  285. package/dist/types/metering.d.ts +170 -0
  286. package/dist/types/metering.d.ts.map +1 -0
  287. package/dist/types/metering.js +2 -0
  288. package/dist/types/metering.js.map +1 -0
  289. package/dist/types/peer-profile.d.ts +24 -0
  290. package/dist/types/peer-profile.d.ts.map +1 -0
  291. package/dist/types/peer-profile.js +2 -0
  292. package/dist/types/peer-profile.js.map +1 -0
  293. package/dist/types/peer.d.ts +56 -0
  294. package/dist/types/peer.d.ts.map +1 -0
  295. package/dist/types/peer.js +11 -0
  296. package/dist/types/peer.js.map +1 -0
  297. package/dist/types/plugin-config.d.ts +31 -0
  298. package/dist/types/plugin-config.d.ts.map +1 -0
  299. package/dist/types/plugin-config.js +2 -0
  300. package/dist/types/plugin-config.js.map +1 -0
  301. package/dist/types/protocol.d.ts +141 -0
  302. package/dist/types/protocol.d.ts.map +1 -0
  303. package/dist/types/protocol.js +42 -0
  304. package/dist/types/protocol.js.map +1 -0
  305. package/dist/types/provider.d.ts +38 -0
  306. package/dist/types/provider.d.ts.map +1 -0
  307. package/dist/types/provider.js +11 -0
  308. package/dist/types/provider.js.map +1 -0
  309. package/dist/types/rating.d.ts +21 -0
  310. package/dist/types/rating.d.ts.map +1 -0
  311. package/dist/types/rating.js +2 -0
  312. package/dist/types/rating.js.map +1 -0
  313. package/dist/types/report.d.ts +20 -0
  314. package/dist/types/report.d.ts.map +1 -0
  315. package/dist/types/report.js +2 -0
  316. package/dist/types/report.js.map +1 -0
  317. package/dist/types/seller.d.ts +36 -0
  318. package/dist/types/seller.d.ts.map +1 -0
  319. package/dist/types/seller.js +2 -0
  320. package/dist/types/seller.js.map +1 -0
  321. package/dist/types/staking.d.ts +16 -0
  322. package/dist/types/staking.d.ts.map +1 -0
  323. package/dist/types/staking.js +6 -0
  324. package/dist/types/staking.js.map +1 -0
  325. package/dist/utils/debug.d.ts +4 -0
  326. package/dist/utils/debug.d.ts.map +1 -0
  327. package/dist/utils/debug.js +25 -0
  328. package/dist/utils/debug.js.map +1 -0
  329. package/dist/utils/hex.d.ts +3 -0
  330. package/dist/utils/hex.d.ts.map +1 -0
  331. package/dist/utils/hex.js +15 -0
  332. package/dist/utils/hex.js.map +1 -0
  333. package/package.json +62 -0
  334. package/scripts/ensure-node-native-modules.mjs +153 -0
  335. package/scripts/patch-ethers.js +44 -0
  336. package/src/config/encryption.test.ts +49 -0
  337. package/src/config/encryption.ts +53 -0
  338. package/src/config/plugin-config-manager.test.ts +92 -0
  339. package/src/config/plugin-config-manager.ts +153 -0
  340. package/src/config/plugin-loader.ts +90 -0
  341. package/src/discovery/announcer.ts +169 -0
  342. package/src/discovery/bootstrap.ts +57 -0
  343. package/src/discovery/default-metadata-resolver.ts +18 -0
  344. package/src/discovery/dht-health.ts +136 -0
  345. package/src/discovery/dht-node.ts +191 -0
  346. package/src/discovery/http-metadata-resolver.ts +47 -0
  347. package/src/discovery/index.ts +15 -0
  348. package/src/discovery/metadata-codec.ts +453 -0
  349. package/src/discovery/metadata-resolver.ts +7 -0
  350. package/src/discovery/metadata-server.ts +73 -0
  351. package/src/discovery/metadata-validator.ts +172 -0
  352. package/src/discovery/peer-lookup.ts +122 -0
  353. package/src/discovery/peer-metadata.ts +34 -0
  354. package/src/discovery/peer-selector.ts +134 -0
  355. package/src/discovery/profile-manager.ts +131 -0
  356. package/src/discovery/profile-search.ts +100 -0
  357. package/src/discovery/reputation-verifier.ts +54 -0
  358. package/src/index.ts +61 -0
  359. package/src/interfaces/buyer-router.ts +21 -0
  360. package/src/interfaces/plugin.ts +36 -0
  361. package/src/interfaces/seller-provider.ts +81 -0
  362. package/src/metering/index.ts +6 -0
  363. package/src/metering/receipt-generator.ts +105 -0
  364. package/src/metering/receipt-verifier.ts +102 -0
  365. package/src/metering/session-tracker.ts +145 -0
  366. package/src/metering/storage.ts +600 -0
  367. package/src/metering/token-counter.ts +127 -0
  368. package/src/metering/usage-aggregator.ts +236 -0
  369. package/src/node.ts +1698 -0
  370. package/src/p2p/connection-auth.ts +152 -0
  371. package/src/p2p/connection-manager.ts +916 -0
  372. package/src/p2p/handshake.ts +162 -0
  373. package/src/p2p/ice-config.ts +59 -0
  374. package/src/p2p/identity.ts +110 -0
  375. package/src/p2p/index.ts +11 -0
  376. package/src/p2p/keepalive.ts +118 -0
  377. package/src/p2p/message-protocol.ts +171 -0
  378. package/src/p2p/nat-traversal.ts +169 -0
  379. package/src/p2p/payment-codec.ts +165 -0
  380. package/src/p2p/payment-mux.ts +153 -0
  381. package/src/p2p/reconnect.ts +117 -0
  382. package/src/payments/balance-manager.ts +77 -0
  383. package/src/payments/buyer-payment-manager.ts +414 -0
  384. package/src/payments/disputes.ts +72 -0
  385. package/src/payments/evm/escrow-client.ts +263 -0
  386. package/src/payments/evm/keypair.ts +31 -0
  387. package/src/payments/evm/signatures.ts +103 -0
  388. package/src/payments/evm/wallet.ts +42 -0
  389. package/src/payments/index.ts +50 -0
  390. package/src/payments/settlement.ts +40 -0
  391. package/src/payments/types.ts +79 -0
  392. package/src/proxy/index.ts +3 -0
  393. package/src/proxy/provider-detection.ts +78 -0
  394. package/src/proxy/proxy-mux.ts +173 -0
  395. package/src/proxy/request-codec.ts +294 -0
  396. package/src/reputation/index.ts +6 -0
  397. package/src/reputation/rating-manager.ts +118 -0
  398. package/src/reputation/report-manager.ts +91 -0
  399. package/src/reputation/trust-engine.ts +120 -0
  400. package/src/reputation/trust-score.ts +74 -0
  401. package/src/reputation/uptime-tracker.ts +155 -0
  402. package/src/routing/default-router.ts +75 -0
  403. package/src/types/bittorrent-dht.d.ts +19 -0
  404. package/src/types/buyer.ts +37 -0
  405. package/src/types/capability.ts +34 -0
  406. package/src/types/connection.ts +29 -0
  407. package/src/types/http.ts +20 -0
  408. package/src/types/index.ts +14 -0
  409. package/src/types/metering.ts +175 -0
  410. package/src/types/nat-api.d.ts +29 -0
  411. package/src/types/peer-profile.ts +25 -0
  412. package/src/types/peer.ts +62 -0
  413. package/src/types/plugin-config.ts +31 -0
  414. package/src/types/protocol.ts +162 -0
  415. package/src/types/provider.ts +40 -0
  416. package/src/types/rating.ts +23 -0
  417. package/src/types/report.ts +30 -0
  418. package/src/types/seller.ts +38 -0
  419. package/src/types/staking.ts +23 -0
  420. package/src/utils/debug.ts +30 -0
  421. package/src/utils/hex.ts +14 -0
  422. package/tests/balance-manager.test.ts +156 -0
  423. package/tests/bootstrap.test.ts +108 -0
  424. package/tests/buyer-payment-manager.test.ts +358 -0
  425. package/tests/connection-auth.test.ts +87 -0
  426. package/tests/default-router.test.ts +148 -0
  427. package/tests/evm-keypair.test.ts +173 -0
  428. package/tests/identity.test.ts +133 -0
  429. package/tests/message-protocol.test.ts +212 -0
  430. package/tests/metadata-codec.test.ts +165 -0
  431. package/tests/metadata-validator.test.ts +261 -0
  432. package/tests/metering-storage.test.ts +244 -0
  433. package/tests/payment-codec.test.ts +95 -0
  434. package/tests/payment-mux.test.ts +191 -0
  435. package/tests/peer-selector.test.ts +184 -0
  436. package/tests/provider-detection.test.ts +107 -0
  437. package/tests/proxy-mux-security.test.ts +38 -0
  438. package/tests/receipt.test.ts +215 -0
  439. package/tests/reputation-integration.test.ts +195 -0
  440. package/tests/request-codec.test.ts +144 -0
  441. package/tests/token-counter.test.ts +122 -0
  442. package/tsconfig.json +9 -0
  443. package/vitest.config.ts +7 -0
@@ -0,0 +1,726 @@
1
+ import { EventEmitter } from "node:events";
2
+ import net from "node:net";
3
+ import { ConnectionState } from "../types/connection.js";
4
+ import { getDefaultIceConfig } from "./ice-config.js";
5
+ import { NonceReplayGuard, buildConnectionAuthEnvelope, verifyConnectionAuthEnvelope, } from "./connection-auth.js";
6
+ let _nodeDatachannel = null;
7
+ async function loadNodeDatachannel() {
8
+ if (_nodeDatachannel)
9
+ return _nodeDatachannel;
10
+ _nodeDatachannel = await import("node-datachannel");
11
+ return _nodeDatachannel;
12
+ }
13
+ function getNodeDatachannel() {
14
+ if (!_nodeDatachannel)
15
+ throw new Error("node-datachannel not loaded");
16
+ return _nodeDatachannel;
17
+ }
18
+ const DATA_CHANNEL_LABEL = "antseed-data";
19
+ const LINE_SEPARATOR = "\n";
20
+ const INITIAL_LINE_TIMEOUT_MS = 10_000;
21
+ const MAX_INITIAL_LINE_BYTES = 8 * 1024;
22
+ /** Represents a single P2P connection. */
23
+ export class PeerConnection extends EventEmitter {
24
+ remotePeerId;
25
+ isInitiator;
26
+ _state = ConnectionState.Connecting;
27
+ _timeoutMs;
28
+ _timeoutHandle = null;
29
+ _rtc = null;
30
+ _dataChannel = null;
31
+ _rawSocket = null;
32
+ _signalingSocket = null;
33
+ constructor(config) {
34
+ super();
35
+ this.remotePeerId = config.remotePeerId;
36
+ this.isInitiator = config.isInitiator;
37
+ this._timeoutMs = config.timeoutMs ?? 30_000;
38
+ }
39
+ get state() {
40
+ return this._state;
41
+ }
42
+ attachRtcPeer(rtc) {
43
+ this._rtc = rtc;
44
+ }
45
+ attachSignalingSocket(socket) {
46
+ this._signalingSocket = socket;
47
+ }
48
+ attachDataChannel(channel) {
49
+ this._dataChannel = channel;
50
+ channel.onOpen(() => {
51
+ this.clearTimeout();
52
+ if (this._state === ConnectionState.Connecting) {
53
+ this.setState(ConnectionState.Open);
54
+ }
55
+ });
56
+ channel.onClosed(() => {
57
+ if (this._state !== ConnectionState.Closed && this._state !== ConnectionState.Failed) {
58
+ this.setState(ConnectionState.Closed);
59
+ }
60
+ });
61
+ channel.onError((err) => {
62
+ this.fail(new Error(`DataChannel error: ${err}`));
63
+ });
64
+ channel.onMessage((msg) => {
65
+ if (typeof msg === "string") {
66
+ this.emit("message", new TextEncoder().encode(msg));
67
+ }
68
+ else {
69
+ this.emit("message", new Uint8Array(msg));
70
+ }
71
+ });
72
+ }
73
+ attachRawSocket(socket, initialData) {
74
+ this._rawSocket = socket;
75
+ socket.on("data", (chunk) => {
76
+ this.emit("message", new Uint8Array(chunk));
77
+ });
78
+ socket.on("error", (err) => {
79
+ this.fail(err);
80
+ });
81
+ socket.on("close", () => {
82
+ if (this._state !== ConnectionState.Closed && this._state !== ConnectionState.Failed) {
83
+ this.setState(ConnectionState.Closed);
84
+ }
85
+ });
86
+ this.clearTimeout();
87
+ if (this._state === ConnectionState.Connecting) {
88
+ this.setState(ConnectionState.Open);
89
+ }
90
+ if (initialData && initialData.length > 0) {
91
+ queueMicrotask(() => {
92
+ this.emit("message", initialData);
93
+ });
94
+ }
95
+ }
96
+ fail(err) {
97
+ if (this._state !== ConnectionState.Failed && this._state !== ConnectionState.Closed) {
98
+ this.setState(ConnectionState.Failed);
99
+ }
100
+ this._teardownTransports();
101
+ this._emitError(err);
102
+ }
103
+ /** Transition to a new state and emit event. */
104
+ setState(newState) {
105
+ if (this._state === newState)
106
+ return;
107
+ this._state = newState;
108
+ this.emit("stateChange", newState);
109
+ }
110
+ /** Start the connection timeout. */
111
+ startTimeout() {
112
+ this._timeoutHandle = setTimeout(() => {
113
+ if (this._state === ConnectionState.Connecting) {
114
+ this.fail(new Error(`Connection to ${this.remotePeerId} timed out`));
115
+ }
116
+ }, this._timeoutMs);
117
+ }
118
+ /** Clear the connection timeout. */
119
+ clearTimeout() {
120
+ if (this._timeoutHandle) {
121
+ clearTimeout(this._timeoutHandle);
122
+ this._timeoutHandle = null;
123
+ }
124
+ }
125
+ /** Send a message through the active transport. */
126
+ send(data) {
127
+ if (this._state !== ConnectionState.Open && this._state !== ConnectionState.Authenticated) {
128
+ throw new Error(`Cannot send in state ${this._state}`);
129
+ }
130
+ if (this._dataChannel && this._dataChannel.isOpen()) {
131
+ const ok = this._dataChannel.sendMessageBinary(data);
132
+ if (!ok) {
133
+ throw new Error(`Failed to send data to ${this.remotePeerId}`);
134
+ }
135
+ return;
136
+ }
137
+ if (!this._rawSocket || this._rawSocket.destroyed || !this._rawSocket.writable) {
138
+ throw new Error(`Cannot send to ${this.remotePeerId}: no writable transport`);
139
+ }
140
+ this._rawSocket.write(Buffer.from(data));
141
+ }
142
+ /** Close the connection gracefully. */
143
+ close() {
144
+ if (this._state === ConnectionState.Closed) {
145
+ return;
146
+ }
147
+ this.clearTimeout();
148
+ this.setState(ConnectionState.Closing);
149
+ this._teardownTransports();
150
+ this.setState(ConnectionState.Closed);
151
+ this.removeAllListeners();
152
+ }
153
+ _teardownTransports() {
154
+ if (this._dataChannel) {
155
+ try {
156
+ this._dataChannel.close();
157
+ }
158
+ catch {
159
+ // best effort close
160
+ }
161
+ this._dataChannel = null;
162
+ }
163
+ if (this._rtc) {
164
+ try {
165
+ this._rtc.close();
166
+ }
167
+ catch {
168
+ // best effort close
169
+ }
170
+ this._rtc = null;
171
+ }
172
+ if (this._rawSocket && !this._rawSocket.destroyed) {
173
+ this._rawSocket.destroy();
174
+ }
175
+ this._rawSocket = null;
176
+ if (this._signalingSocket && !this._signalingSocket.destroyed) {
177
+ this._signalingSocket.destroy();
178
+ }
179
+ this._signalingSocket = null;
180
+ }
181
+ _emitError(err) {
182
+ if (this.listenerCount("error") > 0) {
183
+ this.emit("error", err);
184
+ }
185
+ }
186
+ }
187
+ /** Manages all peer connections and optional inbound listening. */
188
+ export class ConnectionManager extends EventEmitter {
189
+ _connections = new Map();
190
+ _iceConfig;
191
+ _localPeerId = null;
192
+ _localPrivateKey = null;
193
+ _listenHost = "127.0.0.1";
194
+ _listenPort = null;
195
+ _server = null;
196
+ _transportMode;
197
+ _metadataProvider = null;
198
+ _ipConnectionCounts = new Map();
199
+ _introReplayGuard = new NonceReplayGuard();
200
+ static _knownEndpoints = new Map();
201
+ static _detectedTransportMode = null;
202
+ constructor(iceConfig) {
203
+ super();
204
+ this._iceConfig = iceConfig ?? getDefaultIceConfig();
205
+ this._transportMode = ConnectionManager._detectTransportMode();
206
+ }
207
+ static async init(iceConfig) {
208
+ try {
209
+ await loadNodeDatachannel();
210
+ }
211
+ catch {
212
+ // node-datachannel not available — TCP fallback will be used
213
+ }
214
+ return new ConnectionManager(iceConfig);
215
+ }
216
+ get iceConfig() {
217
+ return this._iceConfig;
218
+ }
219
+ get connections() {
220
+ return this._connections;
221
+ }
222
+ getListeningPort() {
223
+ return this._listenPort;
224
+ }
225
+ setMetadataProvider(provider) {
226
+ this._metadataProvider = provider;
227
+ }
228
+ setLocalPeerId(peerId) {
229
+ this._localPeerId = peerId;
230
+ }
231
+ setLocalIdentity(identity) {
232
+ this._localPeerId = identity.peerId;
233
+ this._localPrivateKey = identity.privateKey;
234
+ }
235
+ static registerPeerEndpoint(peerId, endpoint) {
236
+ this._knownEndpoints.set(peerId, endpoint);
237
+ }
238
+ static resolvePeerEndpoint(peerId) {
239
+ return this._knownEndpoints.get(peerId);
240
+ }
241
+ registerPeerEndpoint(peerId, endpoint) {
242
+ ConnectionManager.registerPeerEndpoint(peerId, endpoint);
243
+ }
244
+ async startListening(config) {
245
+ this._localPeerId = config.peerId;
246
+ this._listenHost = config.host ?? "127.0.0.1";
247
+ this._listenPort = config.port;
248
+ if (this._server) {
249
+ return;
250
+ }
251
+ this._server = net.createServer((socket) => {
252
+ const ip = socket.remoteAddress ?? 'unknown';
253
+ const current = this._ipConnectionCounts.get(ip) ?? 0;
254
+ if (current >= 10) {
255
+ socket.destroy();
256
+ return;
257
+ }
258
+ this._ipConnectionCounts.set(ip, current + 1);
259
+ socket.once('close', () => {
260
+ const count = this._ipConnectionCounts.get(ip) ?? 1;
261
+ if (count <= 1) {
262
+ this._ipConnectionCounts.delete(ip);
263
+ }
264
+ else {
265
+ this._ipConnectionCounts.set(ip, count - 1);
266
+ }
267
+ });
268
+ this._handleInboundSocket(socket);
269
+ });
270
+ this._server.maxConnections = 256;
271
+ await new Promise((resolve, reject) => {
272
+ this._server.once("error", reject);
273
+ this._server.listen(this._listenPort, this._listenHost, () => resolve());
274
+ });
275
+ // Resolve actual bound port (important when port 0 is used for OS-assigned)
276
+ const addr = this._server.address();
277
+ if (addr && typeof addr !== 'string') {
278
+ this._listenPort = addr.port;
279
+ }
280
+ ConnectionManager.registerPeerEndpoint(config.peerId, {
281
+ host: this._listenHost,
282
+ port: this._listenPort,
283
+ });
284
+ }
285
+ async stopListening() {
286
+ if (!this._server) {
287
+ return;
288
+ }
289
+ const server = this._server;
290
+ this._server = null;
291
+ await new Promise((resolve) => {
292
+ server.close(() => resolve());
293
+ });
294
+ if (this._localPeerId) {
295
+ ConnectionManager._knownEndpoints.delete(this._localPeerId);
296
+ }
297
+ }
298
+ /** Create a new outbound connection. */
299
+ createConnection(config) {
300
+ const existing = this._connections.get(config.remotePeerId);
301
+ if (existing && existing.state !== ConnectionState.Closed && existing.state !== ConnectionState.Failed) {
302
+ throw new Error(`Connection to ${config.remotePeerId} already exists`);
303
+ }
304
+ const conn = new PeerConnection(config);
305
+ this._registerConnection(config.remotePeerId, conn);
306
+ conn.startTimeout();
307
+ if (!this._localPeerId) {
308
+ queueMicrotask(() => {
309
+ conn.fail(new Error("Local peer id is not configured"));
310
+ });
311
+ return conn;
312
+ }
313
+ if (!this._localPrivateKey) {
314
+ queueMicrotask(() => {
315
+ conn.fail(new Error("Local private key is not configured"));
316
+ });
317
+ return conn;
318
+ }
319
+ const endpoint = config.endpoint ?? ConnectionManager.resolvePeerEndpoint(config.remotePeerId);
320
+ if (!endpoint) {
321
+ queueMicrotask(() => {
322
+ conn.fail(new Error(`No endpoint registered for peer ${config.remotePeerId}`));
323
+ });
324
+ return conn;
325
+ }
326
+ ConnectionManager.registerPeerEndpoint(config.remotePeerId, endpoint);
327
+ if (this._transportMode === "webrtc") {
328
+ this._createWebRtcConnection(config, conn, endpoint);
329
+ }
330
+ else {
331
+ this._createTcpConnection(config, conn, endpoint);
332
+ }
333
+ return conn;
334
+ }
335
+ /** Get an existing connection by peer ID. */
336
+ getConnection(peerId) {
337
+ return this._connections.get(peerId);
338
+ }
339
+ /** Close a specific connection. */
340
+ closeConnection(peerId) {
341
+ const conn = this._connections.get(peerId);
342
+ if (conn) {
343
+ conn.close();
344
+ }
345
+ }
346
+ /** Close all connections and clean up. */
347
+ closeAll() {
348
+ for (const conn of this._connections.values()) {
349
+ conn.close();
350
+ }
351
+ this._connections.clear();
352
+ if (this._server) {
353
+ void this.stopListening();
354
+ }
355
+ }
356
+ _createWebRtcConnection(config, conn, endpoint) {
357
+ const signalingSocket = net.connect({ host: endpoint.host, port: endpoint.port });
358
+ conn.attachSignalingSocket(signalingSocket);
359
+ let rtc = null;
360
+ const pendingSignals = [];
361
+ this._attachSignalingParser(signalingSocket, (msg) => {
362
+ if (!rtc) {
363
+ pendingSignals.push(msg);
364
+ return;
365
+ }
366
+ this._applySignalToRtc(rtc, msg, conn);
367
+ }, (err) => conn.fail(err), "");
368
+ signalingSocket.once("connect", () => {
369
+ this._sendLine(signalingSocket, {
370
+ type: "hello",
371
+ auth: buildConnectionAuthEnvelope("hello", this._localPeerId, this._localPrivateKey),
372
+ });
373
+ rtc = this._createRtcPeer(config.remotePeerId);
374
+ conn.attachRtcPeer(rtc);
375
+ this._wireRtcPeer(conn, rtc, signalingSocket, true);
376
+ for (const signal of pendingSignals) {
377
+ this._applySignalToRtc(rtc, signal, conn);
378
+ }
379
+ pendingSignals.length = 0;
380
+ });
381
+ signalingSocket.on("error", (err) => {
382
+ if (conn.state === ConnectionState.Connecting) {
383
+ conn.fail(err);
384
+ }
385
+ });
386
+ signalingSocket.on("close", () => {
387
+ if (conn.state === ConnectionState.Connecting) {
388
+ conn.fail(new Error(`Signaling socket closed before connection to ${config.remotePeerId} opened`));
389
+ }
390
+ });
391
+ }
392
+ _createTcpConnection(config, conn, endpoint) {
393
+ const socket = net.connect({ host: endpoint.host, port: endpoint.port });
394
+ socket.once("connect", () => {
395
+ this._sendLine(socket, {
396
+ type: "intro",
397
+ auth: buildConnectionAuthEnvelope("intro", this._localPeerId, this._localPrivateKey),
398
+ });
399
+ conn.attachRawSocket(socket);
400
+ });
401
+ socket.on("error", (err) => {
402
+ if (conn.state === ConnectionState.Connecting) {
403
+ conn.fail(err);
404
+ }
405
+ });
406
+ socket.on("close", () => {
407
+ if (conn.state === ConnectionState.Connecting) {
408
+ conn.fail(new Error(`TCP socket closed before connection to ${config.remotePeerId} opened`));
409
+ }
410
+ });
411
+ }
412
+ _handleInboundSocket(socket) {
413
+ let buffer = Buffer.alloc(0);
414
+ const timeout = setTimeout(() => {
415
+ socket.destroy(new Error("Inbound socket intro timeout"));
416
+ }, INITIAL_LINE_TIMEOUT_MS);
417
+ const onData = (chunk) => {
418
+ if (buffer.length + chunk.length > MAX_INITIAL_LINE_BYTES) {
419
+ socket.off("data", onData);
420
+ clearTimeout(timeout);
421
+ socket.destroy(new Error("Inbound socket intro exceeded 8KB limit"));
422
+ return;
423
+ }
424
+ buffer = Buffer.concat([buffer, chunk]);
425
+ const lineBreak = buffer.indexOf(0x0a); // '\n'
426
+ if (lineBreak < 0) {
427
+ return;
428
+ }
429
+ socket.off("data", onData);
430
+ clearTimeout(timeout);
431
+ const line = buffer.subarray(0, lineBreak).toString("utf8").trim();
432
+ const remaining = buffer.subarray(lineBreak + 1);
433
+ // Detect HTTP requests (metadata endpoint served on signaling port)
434
+ if (line.startsWith("GET ") || line.startsWith("HEAD ")) {
435
+ this._serveHttpMetadata(socket, line);
436
+ return;
437
+ }
438
+ let intro;
439
+ try {
440
+ intro = JSON.parse(line);
441
+ }
442
+ catch {
443
+ socket.destroy(new Error("Failed to parse initial socket message"));
444
+ return;
445
+ }
446
+ if (intro.type !== "intro" && intro.type !== "hello") {
447
+ socket.destroy(new Error("Unsupported initial socket message type"));
448
+ return;
449
+ }
450
+ const verified = verifyConnectionAuthEnvelope({
451
+ type: intro.type,
452
+ auth: intro.auth,
453
+ replayGuard: this._introReplayGuard,
454
+ });
455
+ if (!verified.ok || !verified.peerId) {
456
+ socket.destroy(new Error(`Inbound auth failed: ${verified.reason ?? "unknown reason"}`));
457
+ return;
458
+ }
459
+ if (intro.type === "intro") {
460
+ this._acceptTcpInbound(socket, verified.peerId, remaining);
461
+ return;
462
+ }
463
+ if (intro.type === "hello") {
464
+ this._acceptWebRtcInbound(socket, verified.peerId, remaining.toString("utf8"));
465
+ return;
466
+ }
467
+ socket.destroy(new Error("Unsupported initial socket message type"));
468
+ };
469
+ socket.on("data", onData);
470
+ socket.on("error", (err) => {
471
+ clearTimeout(timeout);
472
+ this._emitError(err);
473
+ });
474
+ socket.on("close", () => {
475
+ clearTimeout(timeout);
476
+ });
477
+ }
478
+ _serveHttpMetadata(socket, requestLine) {
479
+ const MAX_HEADER_SIZE = 8 * 1024; // 8KB
480
+ let headerBytes = 0;
481
+ const headerTimeout = setTimeout(() => {
482
+ socket.destroy(new Error("HTTP header read timeout"));
483
+ }, 5_000);
484
+ const onData = (chunk) => {
485
+ headerBytes += chunk.length;
486
+ if (headerBytes > MAX_HEADER_SIZE) {
487
+ clearTimeout(headerTimeout);
488
+ socket.off("data", onData);
489
+ socket.destroy(new Error("HTTP headers exceeded 8KB limit"));
490
+ return;
491
+ }
492
+ if (chunk.includes(Buffer.from("\r\n\r\n")) || chunk.includes(Buffer.from("\n\n"))) {
493
+ clearTimeout(headerTimeout);
494
+ socket.off("data", onData);
495
+ }
496
+ };
497
+ socket.on("data", onData);
498
+ const url = requestLine.split(" ")[1] ?? "";
499
+ let statusLine;
500
+ let body;
501
+ if (url !== "/metadata") {
502
+ statusLine = "404 Not Found";
503
+ body = JSON.stringify({ error: "not found" });
504
+ }
505
+ else if (!this._metadataProvider) {
506
+ statusLine = "503 Service Unavailable";
507
+ body = JSON.stringify({ error: "metadata not available" });
508
+ }
509
+ else {
510
+ const metadata = this._metadataProvider();
511
+ if (!metadata) {
512
+ statusLine = "503 Service Unavailable";
513
+ body = JSON.stringify({ error: "metadata not available" });
514
+ }
515
+ else {
516
+ statusLine = "200 OK";
517
+ body = JSON.stringify(metadata);
518
+ }
519
+ }
520
+ socket.end(`HTTP/1.1 ${statusLine}\r\n` +
521
+ `Content-Type: application/json\r\n` +
522
+ `Content-Length: ${Buffer.byteLength(body)}\r\n` +
523
+ `Connection: close\r\n` +
524
+ `\r\n` +
525
+ body);
526
+ }
527
+ _acceptTcpInbound(socket, remotePeerId, remainingData) {
528
+ const existing = this._connections.get(remotePeerId);
529
+ if (existing && existing.state !== ConnectionState.Closed && existing.state !== ConnectionState.Failed) {
530
+ socket.destroy(new Error(`Connection from ${remotePeerId} already exists`));
531
+ return;
532
+ }
533
+ const conn = new PeerConnection({
534
+ remotePeerId,
535
+ isInitiator: false,
536
+ });
537
+ this._registerConnection(remotePeerId, conn);
538
+ conn.attachRawSocket(socket, remainingData.length > 0 ? new Uint8Array(remainingData) : undefined);
539
+ this.emit("connection", conn);
540
+ }
541
+ _acceptWebRtcInbound(socket, remotePeerId, initialSignalingBuffer) {
542
+ const existing = this._connections.get(remotePeerId);
543
+ if (existing && existing.state !== ConnectionState.Closed && existing.state !== ConnectionState.Failed) {
544
+ socket.destroy(new Error(`Connection from ${remotePeerId} already exists`));
545
+ return;
546
+ }
547
+ const conn = new PeerConnection({
548
+ remotePeerId,
549
+ isInitiator: false,
550
+ });
551
+ conn.attachSignalingSocket(socket);
552
+ this._registerConnection(remotePeerId, conn);
553
+ const rtc = this._createRtcPeer(remotePeerId);
554
+ conn.attachRtcPeer(rtc);
555
+ this._wireRtcPeer(conn, rtc, socket, false);
556
+ this._attachSignalingParser(socket, (msg) => {
557
+ this._applySignalToRtc(rtc, msg, conn);
558
+ }, (err) => conn.fail(err), initialSignalingBuffer);
559
+ socket.on("close", () => {
560
+ if (conn.state === ConnectionState.Connecting) {
561
+ conn.fail(new Error(`Inbound signaling from ${remotePeerId} closed before connection opened`));
562
+ }
563
+ });
564
+ socket.on("error", (err) => {
565
+ conn.fail(err);
566
+ });
567
+ this.emit("connection", conn);
568
+ }
569
+ _wireRtcPeer(conn, rtc, signalingSocket, isInitiator) {
570
+ rtc.onLocalDescription((sdp, descriptionType) => {
571
+ this._sendLine(signalingSocket, {
572
+ type: "sdp",
573
+ sdp,
574
+ descriptionType: this._normalizeDescriptionType(descriptionType),
575
+ });
576
+ });
577
+ rtc.onLocalCandidate((candidate, mid) => {
578
+ this._sendLine(signalingSocket, {
579
+ type: "candidate",
580
+ candidate,
581
+ mid,
582
+ });
583
+ });
584
+ rtc.onStateChange((state) => {
585
+ const lower = state.toLowerCase();
586
+ if (lower === "failed" || lower === "disconnected" || lower === "closed") {
587
+ if (conn.state === ConnectionState.Connecting || conn.state === ConnectionState.Open) {
588
+ conn.fail(new Error(`WebRTC state is ${state}`));
589
+ }
590
+ else if (conn.state === ConnectionState.Authenticated) {
591
+ conn.close();
592
+ }
593
+ }
594
+ });
595
+ if (isInitiator) {
596
+ const channel = rtc.createDataChannel(DATA_CHANNEL_LABEL, { ordered: true });
597
+ conn.attachDataChannel(channel);
598
+ rtc.setLocalDescription();
599
+ }
600
+ else {
601
+ rtc.onDataChannel((channel) => {
602
+ conn.attachDataChannel(channel);
603
+ });
604
+ }
605
+ }
606
+ _createRtcPeer(remotePeerId) {
607
+ const ndc = getNodeDatachannel();
608
+ const iceServers = this._iceConfig.iceServers.flatMap((server) => {
609
+ return Array.isArray(server.urls) ? server.urls : [server.urls];
610
+ });
611
+ return new ndc.PeerConnection(`idleai-${remotePeerId.slice(0, 12)}`, {
612
+ iceServers,
613
+ iceTransportPolicy: this._iceConfig.iceTransportPolicy ?? "all",
614
+ });
615
+ }
616
+ _applySignalToRtc(rtc, signal, conn) {
617
+ try {
618
+ if (signal.type === "sdp") {
619
+ rtc.setRemoteDescription(signal.sdp, signal.descriptionType);
620
+ }
621
+ else {
622
+ rtc.addRemoteCandidate(signal.candidate, signal.mid);
623
+ }
624
+ }
625
+ catch (err) {
626
+ conn.fail(err instanceof Error ? err : new Error(String(err)));
627
+ }
628
+ }
629
+ _attachSignalingParser(socket, onMessage, onError, initialBuffer) {
630
+ const MAX_BUFFER_SIZE = 64 * 1024; // 64KB
631
+ let buffer = initialBuffer;
632
+ const processBuffer = () => {
633
+ while (true) {
634
+ const lineBreak = buffer.indexOf(LINE_SEPARATOR);
635
+ if (lineBreak < 0) {
636
+ break;
637
+ }
638
+ const line = buffer.slice(0, lineBreak).trim();
639
+ buffer = buffer.slice(lineBreak + LINE_SEPARATOR.length);
640
+ if (line.length === 0) {
641
+ continue;
642
+ }
643
+ try {
644
+ const parsed = JSON.parse(line);
645
+ onMessage(parsed);
646
+ }
647
+ catch (err) {
648
+ onError(err instanceof Error ? err : new Error(String(err)));
649
+ return;
650
+ }
651
+ }
652
+ };
653
+ if (buffer.length > 0) {
654
+ processBuffer();
655
+ }
656
+ socket.on("data", (chunk) => {
657
+ buffer += chunk.toString("utf8");
658
+ if (buffer.length > MAX_BUFFER_SIZE) {
659
+ socket.destroy(new Error("Signaling buffer exceeded 64KB limit"));
660
+ return;
661
+ }
662
+ processBuffer();
663
+ });
664
+ }
665
+ _sendLine(socket, payload) {
666
+ if (socket.destroyed) {
667
+ throw new Error("Cannot send message on destroyed socket");
668
+ }
669
+ socket.write(JSON.stringify(payload) + LINE_SEPARATOR);
670
+ }
671
+ _registerConnection(peerId, conn) {
672
+ this._connections.set(peerId, conn);
673
+ conn.on("stateChange", (state) => {
674
+ this.emit("connectionStateChange", peerId, state);
675
+ if (state === ConnectionState.Closed || state === ConnectionState.Failed) {
676
+ this._connections.delete(peerId);
677
+ }
678
+ });
679
+ conn.on("error", (err) => {
680
+ this._emitError(err);
681
+ });
682
+ }
683
+ static _detectTransportMode() {
684
+ if (this._detectedTransportMode) {
685
+ return this._detectedTransportMode;
686
+ }
687
+ try {
688
+ const ndc = _nodeDatachannel;
689
+ if (!ndc) {
690
+ this._detectedTransportMode = "tcp";
691
+ return this._detectedTransportMode;
692
+ }
693
+ const probe = new ndc.PeerConnection("idleai-transport-probe", { iceServers: [] });
694
+ try {
695
+ const channel = probe.createDataChannel("probe", { ordered: true });
696
+ channel.close();
697
+ }
698
+ finally {
699
+ probe.close();
700
+ }
701
+ this._detectedTransportMode = "webrtc";
702
+ }
703
+ catch {
704
+ this._detectedTransportMode = "tcp";
705
+ }
706
+ return this._detectedTransportMode;
707
+ }
708
+ _normalizeDescriptionType(type) {
709
+ switch (type) {
710
+ case "offer":
711
+ case "answer":
712
+ case "pranswer":
713
+ case "rollback":
714
+ case "unspec":
715
+ return type;
716
+ default:
717
+ return "unspec";
718
+ }
719
+ }
720
+ _emitError(err) {
721
+ if (this.listenerCount("error") > 0) {
722
+ this.emit("error", err);
723
+ }
724
+ }
725
+ }
726
+ //# sourceMappingURL=connection-manager.js.map