@btc-vision/bitcoin 6.5.6 → 7.0.0-alpha.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 (455) hide show
  1. package/HOW_TO_WRITE_GOOD_CODE.md +2436 -0
  2. package/benchmark/psbt-2000-inputs.bench.ts +178 -0
  3. package/benchmark/signing.bench.ts +147 -0
  4. package/browser/address.d.ts +56 -9
  5. package/browser/address.d.ts.map +1 -0
  6. package/browser/bech32utils.d.ts +9 -1
  7. package/browser/bech32utils.d.ts.map +1 -0
  8. package/browser/bip66.d.ts +11 -6
  9. package/browser/bip66.d.ts.map +1 -0
  10. package/browser/block.d.ts +117 -11
  11. package/browser/block.d.ts.map +1 -0
  12. package/browser/branded.d.ts +20 -0
  13. package/browser/branded.d.ts.map +1 -0
  14. package/browser/crypto/crypto.d.ts +1 -0
  15. package/browser/crypto/crypto.d.ts.map +1 -0
  16. package/browser/crypto.d.ts +46 -7
  17. package/browser/crypto.d.ts.map +1 -0
  18. package/browser/ecc/context.d.ts +129 -0
  19. package/browser/ecc/context.d.ts.map +1 -0
  20. package/browser/ecc/index.d.ts +11 -0
  21. package/browser/ecc/index.d.ts.map +1 -0
  22. package/browser/ecc/types.d.ts +128 -0
  23. package/browser/ecc/types.d.ts.map +1 -0
  24. package/browser/ecpair.d.ts +99 -0
  25. package/browser/errors.d.ts +124 -0
  26. package/browser/errors.d.ts.map +1 -0
  27. package/browser/index.d.ts +32 -5
  28. package/browser/index.d.ts.map +1 -0
  29. package/browser/index.js +12482 -101
  30. package/browser/io/BinaryReader.d.ts +276 -0
  31. package/browser/io/BinaryReader.d.ts.map +1 -0
  32. package/browser/io/BinaryWriter.d.ts +391 -0
  33. package/browser/io/BinaryWriter.d.ts.map +1 -0
  34. package/browser/io/MemoryPool.d.ts +220 -0
  35. package/browser/io/MemoryPool.d.ts.map +1 -0
  36. package/browser/io/base64.d.ts +13 -0
  37. package/browser/io/base64.d.ts.map +1 -0
  38. package/browser/io/hex.d.ts +67 -0
  39. package/browser/io/hex.d.ts.map +1 -0
  40. package/browser/io/index.d.ts +17 -0
  41. package/browser/io/index.d.ts.map +1 -0
  42. package/browser/io/utils.d.ts +199 -0
  43. package/browser/io/utils.d.ts.map +1 -0
  44. package/browser/merkle.d.ts +10 -1
  45. package/browser/merkle.d.ts.map +1 -0
  46. package/browser/networks.d.ts +70 -9
  47. package/browser/networks.d.ts.map +1 -0
  48. package/browser/opcodes.d.ts +1 -0
  49. package/browser/opcodes.d.ts.map +1 -0
  50. package/browser/payments/bip341.d.ts +35 -9
  51. package/browser/payments/bip341.d.ts.map +1 -0
  52. package/browser/payments/embed.d.ts +112 -1
  53. package/browser/payments/embed.d.ts.map +1 -0
  54. package/browser/payments/index.d.ts +17 -10
  55. package/browser/payments/index.d.ts.map +1 -0
  56. package/browser/payments/p2ms.d.ts +150 -0
  57. package/browser/payments/p2ms.d.ts.map +1 -0
  58. package/browser/payments/p2op.d.ts +150 -24
  59. package/browser/payments/p2op.d.ts.map +1 -0
  60. package/browser/payments/p2pk.d.ts +154 -1
  61. package/browser/payments/p2pk.d.ts.map +1 -0
  62. package/browser/payments/p2pkh.d.ts +176 -1
  63. package/browser/payments/p2pkh.d.ts.map +1 -0
  64. package/browser/payments/p2sh.d.ts +150 -1
  65. package/browser/payments/p2sh.d.ts.map +1 -0
  66. package/browser/payments/p2tr.d.ts +185 -1
  67. package/browser/payments/p2tr.d.ts.map +1 -0
  68. package/browser/payments/p2wpkh.d.ts +161 -1
  69. package/browser/payments/p2wpkh.d.ts.map +1 -0
  70. package/browser/payments/p2wsh.d.ts +146 -1
  71. package/browser/payments/p2wsh.d.ts.map +1 -0
  72. package/browser/payments/types.d.ts +94 -64
  73. package/browser/payments/types.d.ts.map +1 -0
  74. package/browser/psbt/bip371.d.ts +34 -8
  75. package/browser/psbt/bip371.d.ts.map +1 -0
  76. package/browser/psbt/psbtutils.d.ts +56 -16
  77. package/browser/psbt/psbtutils.d.ts.map +1 -0
  78. package/browser/psbt/types.d.ts +245 -0
  79. package/browser/psbt/types.d.ts.map +1 -0
  80. package/browser/psbt/utils.d.ts +64 -0
  81. package/browser/psbt/utils.d.ts.map +1 -0
  82. package/browser/psbt/validation.d.ts +84 -0
  83. package/browser/psbt/validation.d.ts.map +1 -0
  84. package/browser/psbt.d.ts +82 -118
  85. package/browser/psbt.d.ts.map +1 -0
  86. package/browser/pubkey.d.ts +27 -6
  87. package/browser/pubkey.d.ts.map +1 -0
  88. package/browser/push_data.d.ts +24 -2
  89. package/browser/push_data.d.ts.map +1 -0
  90. package/browser/script.d.ts +33 -8
  91. package/browser/script.d.ts.map +1 -0
  92. package/browser/script_number.d.ts +17 -0
  93. package/browser/script_number.d.ts.map +1 -0
  94. package/browser/script_signature.d.ts +23 -5
  95. package/browser/script_signature.d.ts.map +1 -0
  96. package/browser/transaction.d.ts +160 -18
  97. package/browser/transaction.d.ts.map +1 -0
  98. package/browser/types.d.ts +36 -38
  99. package/browser/types.d.ts.map +1 -0
  100. package/browser/workers/WorkerSigningPool.d.ts +143 -0
  101. package/browser/workers/WorkerSigningPool.d.ts.map +1 -0
  102. package/browser/workers/WorkerSigningPool.node.d.ts +116 -0
  103. package/browser/workers/WorkerSigningPool.node.d.ts.map +1 -0
  104. package/browser/workers/ecc-bundle.d.ts +25 -0
  105. package/browser/workers/ecc-bundle.d.ts.map +1 -0
  106. package/browser/workers/index.d.ts +91 -0
  107. package/browser/workers/index.d.ts.map +1 -0
  108. package/browser/workers/psbt-parallel.d.ts +88 -0
  109. package/browser/workers/psbt-parallel.d.ts.map +1 -0
  110. package/browser/workers/signing-worker.d.ts +37 -0
  111. package/browser/workers/signing-worker.d.ts.map +1 -0
  112. package/browser/workers/types.d.ts +365 -0
  113. package/browser/workers/types.d.ts.map +1 -0
  114. package/build/address.d.ts +57 -10
  115. package/build/address.d.ts.map +1 -0
  116. package/build/address.js +80 -24
  117. package/build/address.js.map +1 -0
  118. package/build/bech32utils.d.ts +9 -1
  119. package/build/bech32utils.d.ts.map +1 -0
  120. package/build/bech32utils.js +10 -2
  121. package/build/bech32utils.js.map +1 -0
  122. package/build/bip66.d.ts +11 -6
  123. package/build/bip66.d.ts.map +1 -0
  124. package/build/bip66.js +32 -3
  125. package/build/bip66.js.map +1 -0
  126. package/build/block.d.ts +117 -11
  127. package/build/block.d.ts.map +1 -0
  128. package/build/block.js +204 -72
  129. package/build/block.js.map +1 -0
  130. package/build/branded.d.ts +20 -0
  131. package/build/branded.d.ts.map +1 -0
  132. package/build/branded.js +7 -0
  133. package/build/branded.js.map +1 -0
  134. package/build/crypto/crypto.d.ts +1 -0
  135. package/build/crypto/crypto.d.ts.map +1 -0
  136. package/build/crypto/crypto.js +1 -0
  137. package/build/crypto/crypto.js.map +1 -0
  138. package/build/crypto.d.ts +46 -7
  139. package/build/crypto.d.ts.map +1 -0
  140. package/build/crypto.js +65 -20
  141. package/build/crypto.js.map +1 -0
  142. package/build/ecc/context.d.ts +135 -0
  143. package/build/ecc/context.d.ts.map +1 -0
  144. package/build/ecc/context.js +232 -0
  145. package/build/ecc/context.js.map +1 -0
  146. package/build/ecc/index.d.ts +11 -0
  147. package/build/ecc/index.d.ts.map +1 -0
  148. package/build/ecc/index.js +11 -0
  149. package/build/ecc/index.js.map +1 -0
  150. package/build/ecc/types.d.ts +134 -0
  151. package/build/ecc/types.d.ts.map +1 -0
  152. package/build/ecc/types.js +8 -0
  153. package/build/ecc/types.js.map +1 -0
  154. package/build/errors.d.ts +124 -0
  155. package/build/errors.d.ts.map +1 -0
  156. package/build/errors.js +155 -0
  157. package/build/errors.js.map +1 -0
  158. package/build/index.d.ts +32 -5
  159. package/build/index.d.ts.map +1 -0
  160. package/build/index.js +26 -3
  161. package/build/index.js.map +1 -0
  162. package/build/io/BinaryReader.d.ts +276 -0
  163. package/build/io/BinaryReader.d.ts.map +1 -0
  164. package/build/io/BinaryReader.js +425 -0
  165. package/build/io/BinaryReader.js.map +1 -0
  166. package/build/io/BinaryWriter.d.ts +391 -0
  167. package/build/io/BinaryWriter.d.ts.map +1 -0
  168. package/build/io/BinaryWriter.js +611 -0
  169. package/build/io/BinaryWriter.js.map +1 -0
  170. package/build/io/MemoryPool.d.ts +220 -0
  171. package/build/io/MemoryPool.d.ts.map +1 -0
  172. package/build/io/MemoryPool.js +309 -0
  173. package/build/io/MemoryPool.js.map +1 -0
  174. package/build/io/base64.d.ts +13 -0
  175. package/build/io/base64.d.ts.map +1 -0
  176. package/build/io/base64.js +20 -0
  177. package/build/io/base64.js.map +1 -0
  178. package/build/io/hex.d.ts +67 -0
  179. package/build/io/hex.d.ts.map +1 -0
  180. package/build/io/hex.js +138 -0
  181. package/build/io/hex.js.map +1 -0
  182. package/build/io/index.d.ts +17 -0
  183. package/build/io/index.d.ts.map +1 -0
  184. package/build/io/index.js +23 -0
  185. package/build/io/index.js.map +1 -0
  186. package/build/io/utils.d.ts +199 -0
  187. package/build/io/utils.d.ts.map +1 -0
  188. package/build/io/utils.js +271 -0
  189. package/build/io/utils.js.map +1 -0
  190. package/build/merkle.d.ts +10 -1
  191. package/build/merkle.d.ts.map +1 -0
  192. package/build/merkle.js +12 -1
  193. package/build/merkle.js.map +1 -0
  194. package/build/networks.d.ts +70 -9
  195. package/build/networks.d.ts.map +1 -0
  196. package/build/networks.js +90 -4
  197. package/build/networks.js.map +1 -0
  198. package/build/opcodes.d.ts +1 -0
  199. package/build/opcodes.d.ts.map +1 -0
  200. package/build/opcodes.js +1 -0
  201. package/build/opcodes.js.map +1 -0
  202. package/build/payments/bip341.d.ts +36 -9
  203. package/build/payments/bip341.d.ts.map +1 -0
  204. package/build/payments/bip341.js +35 -15
  205. package/build/payments/bip341.js.map +1 -0
  206. package/build/payments/embed.d.ts +120 -1
  207. package/build/payments/embed.d.ts.map +1 -0
  208. package/build/payments/embed.js +215 -34
  209. package/build/payments/embed.js.map +1 -0
  210. package/build/payments/index.d.ts +17 -10
  211. package/build/payments/index.d.ts.map +1 -0
  212. package/build/payments/index.js +20 -10
  213. package/build/payments/index.js.map +1 -0
  214. package/build/payments/p2ms.d.ts +159 -1
  215. package/build/payments/p2ms.d.ts.map +1 -0
  216. package/build/payments/p2ms.js +427 -108
  217. package/build/payments/p2ms.js.map +1 -0
  218. package/build/payments/p2op.d.ts +158 -24
  219. package/build/payments/p2op.d.ts.map +1 -0
  220. package/build/payments/p2op.js +379 -93
  221. package/build/payments/p2op.js.map +1 -0
  222. package/build/payments/p2pk.d.ts +162 -1
  223. package/build/payments/p2pk.d.ts.map +1 -0
  224. package/build/payments/p2pk.js +327 -58
  225. package/build/payments/p2pk.js.map +1 -0
  226. package/build/payments/p2pkh.d.ts +185 -1
  227. package/build/payments/p2pkh.d.ts.map +1 -0
  228. package/build/payments/p2pkh.js +467 -114
  229. package/build/payments/p2pkh.js.map +1 -0
  230. package/build/payments/p2sh.d.ts +159 -1
  231. package/build/payments/p2sh.d.ts.map +1 -0
  232. package/build/payments/p2sh.js +500 -152
  233. package/build/payments/p2sh.js.map +1 -0
  234. package/build/payments/p2tr.d.ts +193 -1
  235. package/build/payments/p2tr.d.ts.map +1 -0
  236. package/build/payments/p2tr.js +592 -174
  237. package/build/payments/p2tr.js.map +1 -0
  238. package/build/payments/p2wpkh.d.ts +170 -1
  239. package/build/payments/p2wpkh.d.ts.map +1 -0
  240. package/build/payments/p2wpkh.js +429 -104
  241. package/build/payments/p2wpkh.js.map +1 -0
  242. package/build/payments/p2wsh.d.ts +155 -1
  243. package/build/payments/p2wsh.d.ts.map +1 -0
  244. package/build/payments/p2wsh.js +466 -144
  245. package/build/payments/p2wsh.js.map +1 -0
  246. package/build/payments/types.d.ts +98 -64
  247. package/build/payments/types.d.ts.map +1 -0
  248. package/build/payments/types.js +17 -13
  249. package/build/payments/types.js.map +1 -0
  250. package/build/psbt/bip371.d.ts +35 -9
  251. package/build/psbt/bip371.d.ts.map +1 -0
  252. package/build/psbt/bip371.js +113 -28
  253. package/build/psbt/bip371.js.map +1 -0
  254. package/build/psbt/psbtutils.d.ts +56 -16
  255. package/build/psbt/psbtutils.d.ts.map +1 -0
  256. package/build/psbt/psbtutils.js +71 -16
  257. package/build/psbt/psbtutils.js.map +1 -0
  258. package/build/psbt/types.d.ts +249 -0
  259. package/build/psbt/types.d.ts.map +1 -0
  260. package/build/psbt/types.js +6 -0
  261. package/build/psbt/types.js.map +1 -0
  262. package/build/psbt/utils.d.ts +68 -0
  263. package/build/psbt/utils.d.ts.map +1 -0
  264. package/build/psbt/utils.js +171 -0
  265. package/build/psbt/utils.js.map +1 -0
  266. package/build/psbt/validation.d.ts +88 -0
  267. package/build/psbt/validation.d.ts.map +1 -0
  268. package/build/psbt/validation.js +149 -0
  269. package/build/psbt/validation.js.map +1 -0
  270. package/build/psbt.d.ts +84 -120
  271. package/build/psbt.d.ts.map +1 -0
  272. package/build/psbt.js +411 -412
  273. package/build/psbt.js.map +1 -0
  274. package/build/pubkey.d.ts +27 -6
  275. package/build/pubkey.d.ts.map +1 -0
  276. package/build/pubkey.js +36 -12
  277. package/build/pubkey.js.map +1 -0
  278. package/build/push_data.d.ts +24 -2
  279. package/build/push_data.d.ts.map +1 -0
  280. package/build/push_data.js +44 -12
  281. package/build/push_data.js.map +1 -0
  282. package/build/script.d.ts +33 -8
  283. package/build/script.d.ts.map +1 -0
  284. package/build/script.js +100 -36
  285. package/build/script.js.map +1 -0
  286. package/build/script_number.d.ts +17 -0
  287. package/build/script_number.d.ts.map +1 -0
  288. package/build/script_number.js +19 -0
  289. package/build/script_number.js.map +1 -0
  290. package/build/script_signature.d.ts +23 -5
  291. package/build/script_signature.d.ts.map +1 -0
  292. package/build/script_signature.js +48 -15
  293. package/build/script_signature.js.map +1 -0
  294. package/build/transaction.d.ts +160 -18
  295. package/build/transaction.d.ts.map +1 -0
  296. package/build/transaction.js +443 -176
  297. package/build/transaction.js.map +1 -0
  298. package/build/tsconfig.build.tsbuildinfo +1 -0
  299. package/build/types.d.ts +36 -38
  300. package/build/types.d.ts.map +1 -0
  301. package/build/types.js +175 -57
  302. package/build/types.js.map +1 -0
  303. package/build/workers/WorkerSigningPool.d.ts +174 -0
  304. package/build/workers/WorkerSigningPool.d.ts.map +1 -0
  305. package/build/workers/WorkerSigningPool.js +553 -0
  306. package/build/workers/WorkerSigningPool.js.map +1 -0
  307. package/build/workers/WorkerSigningPool.node.d.ts +124 -0
  308. package/build/workers/WorkerSigningPool.node.d.ts.map +1 -0
  309. package/build/workers/WorkerSigningPool.node.js +753 -0
  310. package/build/workers/WorkerSigningPool.node.js.map +1 -0
  311. package/build/workers/ecc-bundle.d.ts +25 -0
  312. package/build/workers/ecc-bundle.d.ts.map +1 -0
  313. package/build/workers/ecc-bundle.js +25 -0
  314. package/build/workers/ecc-bundle.js.map +1 -0
  315. package/build/workers/index.d.ts +91 -0
  316. package/build/workers/index.d.ts.map +1 -0
  317. package/build/workers/index.js +114 -0
  318. package/build/workers/index.js.map +1 -0
  319. package/build/workers/psbt-parallel.d.ts +117 -0
  320. package/build/workers/psbt-parallel.d.ts.map +1 -0
  321. package/build/workers/psbt-parallel.js +233 -0
  322. package/build/workers/psbt-parallel.js.map +1 -0
  323. package/build/workers/signing-worker.d.ts +37 -0
  324. package/build/workers/signing-worker.d.ts.map +1 -0
  325. package/build/workers/signing-worker.js +350 -0
  326. package/build/workers/signing-worker.js.map +1 -0
  327. package/build/workers/types.d.ts +365 -0
  328. package/build/workers/types.d.ts.map +1 -0
  329. package/build/workers/types.js +60 -0
  330. package/build/workers/types.js.map +1 -0
  331. package/package.json +66 -8
  332. package/scripts/bundle-ecc.ts +111 -0
  333. package/src/address.ts +81 -44
  334. package/src/bech32utils.ts +3 -3
  335. package/src/bip66.ts +34 -24
  336. package/src/block.ts +196 -84
  337. package/src/branded.ts +18 -0
  338. package/src/crypto.ts +64 -26
  339. package/src/ecc/context.ts +277 -0
  340. package/src/ecc/index.ts +14 -0
  341. package/src/ecc/types.ts +154 -0
  342. package/src/ecpair.d.ts +99 -0
  343. package/src/errors.ts +163 -0
  344. package/src/index.ts +113 -9
  345. package/src/io/BinaryReader.ts +461 -0
  346. package/src/io/BinaryWriter.ts +696 -0
  347. package/src/io/MemoryPool.ts +343 -0
  348. package/src/io/base64.ts +20 -0
  349. package/src/io/hex.ts +155 -0
  350. package/src/io/index.ts +41 -0
  351. package/src/io/utils.ts +283 -0
  352. package/src/merkle.ts +14 -9
  353. package/src/networks.ts +9 -9
  354. package/src/payments/bip341.ts +34 -33
  355. package/src/payments/embed.ts +244 -41
  356. package/src/payments/index.ts +12 -10
  357. package/src/payments/p2ms.ts +490 -118
  358. package/src/payments/p2op.ts +431 -133
  359. package/src/payments/p2pk.ts +370 -72
  360. package/src/payments/p2pkh.ts +524 -130
  361. package/src/payments/p2sh.ts +572 -172
  362. package/src/payments/p2tr.ts +686 -194
  363. package/src/payments/p2wpkh.ts +484 -107
  364. package/src/payments/p2wsh.ts +526 -164
  365. package/src/payments/types.ts +80 -66
  366. package/src/psbt/bip371.ts +68 -51
  367. package/src/psbt/psbtutils.ts +39 -40
  368. package/src/psbt/types.ts +331 -0
  369. package/src/psbt/utils.ts +188 -0
  370. package/src/psbt/validation.ts +192 -0
  371. package/src/psbt.ts +566 -809
  372. package/src/pubkey.ts +22 -23
  373. package/src/push_data.ts +18 -16
  374. package/src/script.ts +82 -64
  375. package/src/script_number.ts +6 -6
  376. package/src/script_signature.ts +33 -36
  377. package/src/transaction.ts +458 -238
  378. package/src/types.ts +231 -100
  379. package/src/workers/WorkerSigningPool.node.ts +887 -0
  380. package/src/workers/WorkerSigningPool.ts +670 -0
  381. package/src/workers/ecc-bundle.ts +26 -0
  382. package/src/workers/index.ts +165 -0
  383. package/src/workers/psbt-parallel.ts +332 -0
  384. package/src/workers/signing-worker.ts +353 -0
  385. package/src/workers/types.ts +413 -0
  386. package/test/address.spec.ts +9 -6
  387. package/test/bitcoin.core.spec.ts +16 -17
  388. package/test/block.spec.ts +8 -7
  389. package/test/bufferutils.spec.ts +228 -214
  390. package/test/crypto.spec.ts +19 -11
  391. package/test/fixtures/p2pk.json +0 -8
  392. package/test/fixtures/p2pkh.json +1 -1
  393. package/test/fixtures/p2sh.json +1 -1
  394. package/test/fixtures/script.json +1 -1
  395. package/test/fixtures/transaction.json +2 -2
  396. package/test/integration/_regtest.ts +25 -0
  397. package/test/integration/addresses.spec.ts +4 -3
  398. package/test/integration/bip32.spec.ts +2 -1
  399. package/test/integration/blocks.spec.ts +1 -1
  400. package/test/integration/cltv.spec.ts +18 -16
  401. package/test/integration/csv.spec.ts +37 -64
  402. package/test/integration/payments.spec.ts +5 -3
  403. package/test/integration/taproot.spec.ts +76 -83
  404. package/test/integration/transactions.spec.ts +38 -35
  405. package/test/payments.spec.ts +35 -13
  406. package/test/payments.utils.ts +17 -16
  407. package/test/psbt.spec.ts +111 -100
  408. package/test/script.spec.ts +11 -10
  409. package/test/script_signature.spec.ts +9 -11
  410. package/test/taproot-cache.spec.ts +694 -0
  411. package/test/transaction.spec.ts +32 -40
  412. package/test/types.spec.ts +74 -29
  413. package/test/workers-pool.spec.ts +963 -0
  414. package/test/workers-signing.spec.ts +635 -0
  415. package/test/workers.spec.ts +1390 -0
  416. package/tsconfig.base.json +34 -18
  417. package/tsconfig.browser.json +15 -0
  418. package/tsconfig.build.json +5 -0
  419. package/tsconfig.json +5 -14
  420. package/vite.config.browser.ts +3 -42
  421. package/vitest.config.integration.ts +2 -0
  422. package/browser/bufferutils.d.ts +0 -34
  423. package/browser/chunks/crypto-BhCpKpek.js +0 -2033
  424. package/browser/chunks/payments-B1wlSccx.js +0 -1089
  425. package/browser/chunks/psbt-BCNk7JUx.js +0 -4055
  426. package/browser/chunks/script-DyPItFEl.js +0 -318
  427. package/browser/chunks/transaction-C_UbhMGn.js +0 -432
  428. package/browser/chunks/utils-DNZi-T5W.js +0 -761
  429. package/browser/ecc_lib.d.ts +0 -3
  430. package/browser/hooks/AdvancedSignatureManager.d.ts +0 -16
  431. package/browser/hooks/HookedSigner.d.ts +0 -4
  432. package/browser/hooks/SignatureManager.d.ts +0 -13
  433. package/browser/payments/lazy.d.ts +0 -2
  434. package/browser/typeforce.d.ts +0 -38
  435. package/build/bufferutils.d.ts +0 -34
  436. package/build/bufferutils.js +0 -141
  437. package/build/ecc_lib.d.ts +0 -3
  438. package/build/ecc_lib.js +0 -61
  439. package/build/hooks/AdvancedSignatureManager.d.ts +0 -16
  440. package/build/hooks/AdvancedSignatureManager.js +0 -52
  441. package/build/hooks/HookedSigner.d.ts +0 -4
  442. package/build/hooks/HookedSigner.js +0 -64
  443. package/build/hooks/SignatureManager.d.ts +0 -13
  444. package/build/hooks/SignatureManager.js +0 -45
  445. package/build/payments/lazy.d.ts +0 -2
  446. package/build/payments/lazy.js +0 -28
  447. package/build/tsconfig.tsbuildinfo +0 -1
  448. package/src/bufferutils.ts +0 -188
  449. package/src/ecc_lib.ts +0 -94
  450. package/src/hooks/AdvancedSignatureManager.ts +0 -104
  451. package/src/hooks/HookedSigner.ts +0 -108
  452. package/src/hooks/SignatureManager.ts +0 -84
  453. package/src/payments/lazy.ts +0 -28
  454. package/src/typeforce.d.ts +0 -38
  455. package/tsconfig.webpack.json +0 -18
@@ -0,0 +1,753 @@
1
+ /**
2
+ * Node.js-specific worker signing pool implementation.
3
+ *
4
+ * Uses worker_threads module for true parallel execution.
5
+ * Private keys are isolated per-worker and zeroed immediately after signing.
6
+ *
7
+ * @packageDocumentation
8
+ */
9
+ import { Worker, isMainThread } from 'worker_threads';
10
+ import { cpus } from 'os';
11
+ import { WorkerState, isBatchResult, isWorkerReady } from './types.js';
12
+ /**
13
+ * ECC library types for Node.js worker.
14
+ */
15
+ export const NodeEccLibrary = {
16
+ /** Pure JS @noble/secp256k1 (default, ~12KB) */
17
+ Noble: 'noble',
18
+ /** WASM-based tiny-secp256k1 (faster, ~1.2MB) */
19
+ TinySecp256k1: 'tiny-secp256k1',
20
+ };
21
+ /**
22
+ * Default configuration values for Node.js.
23
+ */
24
+ const DEFAULT_CONFIG = {
25
+ workerCount: cpus().length,
26
+ taskTimeoutMs: 30000,
27
+ maxKeyHoldTimeMs: 5000,
28
+ verifySignatures: true,
29
+ preserveWorkers: false,
30
+ eccLibrary: NodeEccLibrary.TinySecp256k1,
31
+ };
32
+ /**
33
+ * Worker-based parallel signing pool for Node.js.
34
+ *
35
+ * Uses worker_threads for true parallel execution.
36
+ * Provides secure key handling with immediate zeroing after use.
37
+ *
38
+ * @example
39
+ * ```typescript
40
+ * import { NodeWorkerSigningPool } from '@btc-vision/bitcoin/workers';
41
+ *
42
+ * // Initialize pool at app startup
43
+ * const pool = NodeWorkerSigningPool.getInstance({ workerCount: 4 });
44
+ * pool.preserveWorkers();
45
+ *
46
+ * // Sign batch
47
+ * const result = await pool.signBatch(tasks, keyPair);
48
+ *
49
+ * // Cleanup at app shutdown
50
+ * await pool.shutdown();
51
+ * ```
52
+ */
53
+ export class NodeWorkerSigningPool {
54
+ /**
55
+ * Singleton instance.
56
+ */
57
+ static #instance = null;
58
+ /**
59
+ * Pool configuration.
60
+ */
61
+ #config;
62
+ /**
63
+ * Worker pool.
64
+ */
65
+ #workers = [];
66
+ /**
67
+ * Pending batches awaiting completion.
68
+ */
69
+ #pendingBatches = new Map();
70
+ /**
71
+ * Worker script as data URL.
72
+ */
73
+ #workerScript = null;
74
+ /**
75
+ * Whether workers are preserved between batches.
76
+ */
77
+ #preserveWorkers = false;
78
+ /**
79
+ * Next worker ID counter.
80
+ */
81
+ #nextWorkerId = 0;
82
+ /**
83
+ * Next task ID counter.
84
+ */
85
+ #nextTaskId = 0;
86
+ /**
87
+ * Whether the pool is initialized.
88
+ */
89
+ #initialized = false;
90
+ /**
91
+ * Whether the pool is shutting down.
92
+ */
93
+ #shuttingDown = false;
94
+ /**
95
+ * Creates a new NodeWorkerSigningPool.
96
+ *
97
+ * @param config - Pool configuration
98
+ */
99
+ constructor(config = {}) {
100
+ if (!isMainThread) {
101
+ throw new Error('NodeWorkerSigningPool can only be created in the main thread');
102
+ }
103
+ this.#config = { ...DEFAULT_CONFIG, ...config };
104
+ this.#preserveWorkers = this.#config.preserveWorkers;
105
+ }
106
+ /**
107
+ * Gets the singleton pool instance.
108
+ *
109
+ * @param config - Optional configuration (only used on first call)
110
+ * @returns The singleton pool instance
111
+ */
112
+ static getInstance(config) {
113
+ if (!NodeWorkerSigningPool.#instance) {
114
+ NodeWorkerSigningPool.#instance = new NodeWorkerSigningPool(config);
115
+ }
116
+ return NodeWorkerSigningPool.#instance;
117
+ }
118
+ /**
119
+ * Resets the singleton instance (for testing).
120
+ */
121
+ static resetInstance() {
122
+ if (NodeWorkerSigningPool.#instance) {
123
+ NodeWorkerSigningPool.#instance.shutdown().catch(() => { });
124
+ NodeWorkerSigningPool.#instance = null;
125
+ }
126
+ }
127
+ /**
128
+ * Number of workers in the pool.
129
+ */
130
+ get workerCount() {
131
+ return this.#workers.length;
132
+ }
133
+ /**
134
+ * Number of idle workers available.
135
+ */
136
+ get idleWorkerCount() {
137
+ return this.#workers.filter((w) => w.state === WorkerState.Idle).length;
138
+ }
139
+ /**
140
+ * Number of busy workers.
141
+ */
142
+ get busyWorkerCount() {
143
+ return this.#workers.filter((w) => w.state === WorkerState.Busy).length;
144
+ }
145
+ /**
146
+ * Whether workers are being preserved between batches.
147
+ */
148
+ get isPreservingWorkers() {
149
+ return this.#preserveWorkers;
150
+ }
151
+ /**
152
+ * Enables worker preservation between signing batches.
153
+ */
154
+ preserveWorkers() {
155
+ this.#preserveWorkers = true;
156
+ }
157
+ /**
158
+ * Disables worker preservation.
159
+ */
160
+ releaseWorkers() {
161
+ this.#preserveWorkers = false;
162
+ }
163
+ /**
164
+ * Initializes the worker pool.
165
+ *
166
+ * @returns Promise that resolves when all workers are ready
167
+ */
168
+ async initialize() {
169
+ if (this.#initialized) {
170
+ return;
171
+ }
172
+ if (this.#shuttingDown) {
173
+ throw new Error('Cannot initialize pool while shutting down');
174
+ }
175
+ // Create inline worker script
176
+ this.#workerScript = this.#createWorkerScript();
177
+ // Create workers
178
+ const workerPromises = [];
179
+ for (let i = 0; i < this.#config.workerCount; i++) {
180
+ workerPromises.push(this.#createWorker());
181
+ }
182
+ await Promise.all(workerPromises);
183
+ this.#initialized = true;
184
+ }
185
+ /**
186
+ * Signs a batch of tasks in parallel.
187
+ *
188
+ * Tasks are distributed across workers and processed in batches for efficiency.
189
+ *
190
+ * @param tasks - Signing tasks
191
+ * @param keyPair - Key pair with getPrivateKey() method
192
+ * @returns Promise resolving to signing results
193
+ */
194
+ async signBatch(tasks, keyPair) {
195
+ const startTime = performance.now();
196
+ // Initialize if needed
197
+ if (!this.#initialized) {
198
+ await this.initialize();
199
+ }
200
+ if (tasks.length === 0) {
201
+ return {
202
+ success: true,
203
+ signatures: new Map(),
204
+ errors: new Map(),
205
+ durationMs: performance.now() - startTime,
206
+ };
207
+ }
208
+ // Distribute tasks across workers
209
+ const workerCount = Math.min(this.#workers.length, tasks.length);
210
+ const taskBatches = Array.from({ length: workerCount }, () => []);
211
+ for (let i = 0; i < tasks.length; i++) {
212
+ taskBatches[i % workerCount].push(tasks[i]);
213
+ }
214
+ // Get private key once
215
+ const privateKey = keyPair.getPrivateKey();
216
+ try {
217
+ // Send batches to workers in parallel
218
+ const batchResults = await Promise.allSettled(taskBatches.map((batch, index) => this.#signBatchOnWorker(batch, privateKey, keyPair.publicKey, index)));
219
+ // Collect all results
220
+ const signatures = new Map();
221
+ const errors = new Map();
222
+ for (const result of batchResults) {
223
+ if (result.status === 'fulfilled') {
224
+ const batchResult = result.value;
225
+ // Add successful signatures
226
+ for (const sig of batchResult.results) {
227
+ signatures.set(sig.inputIndex, {
228
+ type: 'result',
229
+ taskId: sig.taskId,
230
+ signature: sig.signature,
231
+ inputIndex: sig.inputIndex,
232
+ publicKey: sig.publicKey,
233
+ signatureType: sig.signatureType,
234
+ leafHash: sig.leafHash,
235
+ });
236
+ }
237
+ // Add errors
238
+ for (const err of batchResult.errors) {
239
+ errors.set(err.inputIndex, err.error);
240
+ }
241
+ }
242
+ else {
243
+ // Entire batch failed
244
+ const reason = result.reason;
245
+ const errorMsg = reason?.message ?? 'Batch signing failed';
246
+ console.error('Batch signing failed:', errorMsg);
247
+ }
248
+ }
249
+ // Cleanup workers if not preserving
250
+ if (!this.#preserveWorkers) {
251
+ await this.#terminateIdleWorkers();
252
+ }
253
+ return {
254
+ success: errors.size === 0,
255
+ signatures,
256
+ errors,
257
+ durationMs: performance.now() - startTime,
258
+ };
259
+ }
260
+ finally {
261
+ // SECURITY: Zero the key in main thread
262
+ privateKey.fill(0);
263
+ }
264
+ }
265
+ /**
266
+ * Shuts down the pool and terminates all workers.
267
+ *
268
+ * @returns Promise that resolves when all workers are terminated
269
+ */
270
+ async shutdown() {
271
+ if (this.#shuttingDown) {
272
+ return;
273
+ }
274
+ this.#shuttingDown = true;
275
+ // Terminate all workers
276
+ const terminatePromises = this.#workers.map((worker) => this.#terminateWorker(worker));
277
+ await Promise.all(terminatePromises);
278
+ // Clear state
279
+ this.#workers.length = 0;
280
+ this.#pendingBatches.clear();
281
+ this.#workerScript = null;
282
+ this.#initialized = false;
283
+ this.#shuttingDown = false;
284
+ }
285
+ /**
286
+ * Creates the inline worker script for Node.js worker_threads.
287
+ * Supports both @noble/secp256k1 (pure JS) and tiny-secp256k1 (WASM).
288
+ */
289
+ #createWorkerScript() {
290
+ // Node.js worker_threads can directly require/import modules
291
+ const workerCode = `
292
+ const { parentPort } = require('worker_threads');
293
+
294
+ /**
295
+ * Zero out a Uint8Array to clear sensitive data.
296
+ */
297
+ function secureZero(arr) {
298
+ if (arr && arr.fill) {
299
+ arr.fill(0);
300
+ // Double-write to prevent optimization
301
+ for (let i = 0; i < arr.length; i++) {
302
+ arr[i] = 0;
303
+ }
304
+ }
305
+ }
306
+
307
+ /**
308
+ * ECC library reference.
309
+ */
310
+ let eccLib = null;
311
+
312
+ /**
313
+ * Initialize ECC library based on type.
314
+ */
315
+ async function initEcc(eccType) {
316
+ if (eccType === '${NodeEccLibrary.TinySecp256k1}') {
317
+ // Load tiny-secp256k1 (WASM-based, faster for batch operations)
318
+ const tinysecp = await import('tiny-secp256k1');
319
+ eccLib = {
320
+ sign: (hash, privateKey) => {
321
+ return tinysecp.sign(hash, privateKey);
322
+ },
323
+ signSchnorr: (hash, privateKey) => {
324
+ return tinysecp.signSchnorr(hash, privateKey);
325
+ }
326
+ };
327
+ } else {
328
+ // Default to @noble/secp256k1 (pure JS, no WASM)
329
+ const noble = await import('@noble/secp256k1');
330
+ eccLib = {
331
+ sign: (hash, privateKey) => {
332
+ // noble returns Signature object, we need raw bytes
333
+ const sig = noble.sign(hash, privateKey, { lowS: true });
334
+ return sig.toCompactRawBytes();
335
+ },
336
+ signSchnorr: (hash, privateKey) => {
337
+ return noble.schnorr.sign(hash, privateKey);
338
+ }
339
+ };
340
+ }
341
+ }
342
+
343
+ parentPort.on('message', async (msg) => {
344
+ switch (msg.type) {
345
+ case 'init':
346
+ try {
347
+ await initEcc(msg.eccType || 'tiny-secp256k1');
348
+ parentPort.postMessage({ type: 'ready' });
349
+ } catch (error) {
350
+ parentPort.postMessage({
351
+ type: 'error',
352
+ taskId: 'init',
353
+ error: 'Failed to load ECC library: ' + (error.message || error),
354
+ inputIndex: -1
355
+ });
356
+ }
357
+ break;
358
+
359
+ case 'sign':
360
+ handleSign(msg);
361
+ break;
362
+
363
+ case 'signBatch':
364
+ handleSignBatch(msg);
365
+ break;
366
+
367
+ case 'shutdown':
368
+ parentPort.postMessage({ type: 'shutdown-ack' });
369
+ process.exit(0);
370
+ break;
371
+
372
+ default:
373
+ parentPort.postMessage({
374
+ type: 'error',
375
+ taskId: msg.taskId || 'unknown',
376
+ error: 'Unknown message type: ' + msg.type,
377
+ inputIndex: msg.inputIndex || -1
378
+ });
379
+ }
380
+ });
381
+
382
+ function handleSign(msg) {
383
+ const {
384
+ taskId,
385
+ hash,
386
+ privateKey,
387
+ publicKey,
388
+ signatureType,
389
+ lowR,
390
+ inputIndex,
391
+ sighashType,
392
+ leafHash
393
+ } = msg;
394
+
395
+ // Validate inputs
396
+ if (!hash || hash.length !== 32) {
397
+ secureZero(privateKey);
398
+ parentPort.postMessage({
399
+ type: 'error',
400
+ taskId: taskId,
401
+ error: 'Invalid hash: must be 32 bytes',
402
+ inputIndex: inputIndex
403
+ });
404
+ return;
405
+ }
406
+
407
+ if (!privateKey || privateKey.length !== 32) {
408
+ secureZero(privateKey);
409
+ parentPort.postMessage({
410
+ type: 'error',
411
+ taskId: taskId,
412
+ error: 'Invalid private key: must be 32 bytes',
413
+ inputIndex: inputIndex
414
+ });
415
+ return;
416
+ }
417
+
418
+ if (!eccLib) {
419
+ secureZero(privateKey);
420
+ parentPort.postMessage({
421
+ type: 'error',
422
+ taskId: taskId,
423
+ error: 'ECC library not initialized. Call init first.',
424
+ inputIndex: inputIndex
425
+ });
426
+ return;
427
+ }
428
+
429
+ let signature;
430
+
431
+ try {
432
+ if (signatureType === 1) {
433
+ // Schnorr signature (BIP340)
434
+ signature = eccLib.signSchnorr(hash, privateKey);
435
+ } else {
436
+ // ECDSA signature
437
+ signature = eccLib.sign(hash, privateKey, { lowR: lowR || false });
438
+ }
439
+
440
+ if (!signature) {
441
+ throw new Error('Signing returned null or undefined');
442
+ }
443
+
444
+ } catch (error) {
445
+ secureZero(privateKey);
446
+ parentPort.postMessage({
447
+ type: 'error',
448
+ taskId: taskId,
449
+ error: error.message || 'Signing failed',
450
+ inputIndex: inputIndex
451
+ });
452
+ return;
453
+ }
454
+
455
+ // CRITICAL: Zero the private key immediately
456
+ secureZero(privateKey);
457
+
458
+ const result = {
459
+ type: 'result',
460
+ taskId: taskId,
461
+ signature: signature,
462
+ inputIndex: inputIndex,
463
+ publicKey: publicKey,
464
+ signatureType: signatureType
465
+ };
466
+
467
+ if (leafHash) {
468
+ result.leafHash = leafHash;
469
+ }
470
+
471
+ parentPort.postMessage(result);
472
+ }
473
+
474
+ function handleSignBatch(msg) {
475
+ const { batchId, tasks, privateKey } = msg;
476
+ const results = [];
477
+ const errors = [];
478
+
479
+ // Validate private key once
480
+ if (!privateKey || privateKey.length !== 32) {
481
+ secureZero(privateKey);
482
+ parentPort.postMessage({
483
+ type: 'batchResult',
484
+ batchId: batchId,
485
+ results: [],
486
+ errors: [{ inputIndex: -1, error: 'Invalid private key: must be 32 bytes' }]
487
+ });
488
+ return;
489
+ }
490
+
491
+ if (!eccLib) {
492
+ secureZero(privateKey);
493
+ parentPort.postMessage({
494
+ type: 'batchResult',
495
+ batchId: batchId,
496
+ results: [],
497
+ errors: [{ inputIndex: -1, error: 'ECC library not initialized. Call init first.' }]
498
+ });
499
+ return;
500
+ }
501
+
502
+ // Process all tasks
503
+ for (const task of tasks) {
504
+ const { taskId, hash, publicKey, signatureType, lowR, inputIndex, sighashType, leafHash } = task;
505
+
506
+ // Validate hash
507
+ if (!hash || hash.length !== 32) {
508
+ errors.push({ taskId, inputIndex, error: 'Invalid hash: must be 32 bytes' });
509
+ continue;
510
+ }
511
+
512
+ try {
513
+ let signature;
514
+ if (signatureType === 1) {
515
+ // Schnorr signature (BIP340)
516
+ signature = eccLib.signSchnorr(hash, privateKey);
517
+ } else {
518
+ // ECDSA signature
519
+ signature = eccLib.sign(hash, privateKey, { lowR: lowR || false });
520
+ }
521
+
522
+ if (!signature) {
523
+ throw new Error('Signing returned null or undefined');
524
+ }
525
+
526
+ const result = {
527
+ taskId: taskId,
528
+ signature: signature,
529
+ inputIndex: inputIndex,
530
+ publicKey: publicKey,
531
+ signatureType: signatureType
532
+ };
533
+
534
+ if (leafHash) {
535
+ result.leafHash = leafHash;
536
+ }
537
+
538
+ results.push(result);
539
+ } catch (error) {
540
+ errors.push({ taskId, inputIndex, error: error.message || 'Signing failed' });
541
+ }
542
+ }
543
+
544
+ // CRITICAL: Zero the private key after processing all tasks
545
+ secureZero(privateKey);
546
+
547
+ // Send batch result back
548
+ parentPort.postMessage({
549
+ type: 'batchResult',
550
+ batchId: batchId,
551
+ results: results,
552
+ errors: errors
553
+ });
554
+ }
555
+ `;
556
+ return workerCode;
557
+ }
558
+ /**
559
+ * Creates a new worker and adds it to the pool.
560
+ */
561
+ async #createWorker() {
562
+ if (!this.#workerScript) {
563
+ throw new Error('Worker script not created');
564
+ }
565
+ const workerId = this.#nextWorkerId++;
566
+ // Create worker with eval code
567
+ const worker = new Worker(this.#workerScript, {
568
+ eval: true,
569
+ name: `signing-worker-${workerId}`,
570
+ });
571
+ const pooledWorker = {
572
+ id: workerId,
573
+ state: WorkerState.Initializing,
574
+ worker,
575
+ currentTaskId: null,
576
+ taskStartTime: null,
577
+ };
578
+ this.#workers.push(pooledWorker);
579
+ // Wait for worker to be ready
580
+ await new Promise((resolve, reject) => {
581
+ const timeout = setTimeout(() => {
582
+ reject(new Error(`Worker ${workerId} initialization timeout`));
583
+ }, 10000);
584
+ const messageHandler = (data) => {
585
+ if (isWorkerReady(data)) {
586
+ clearTimeout(timeout);
587
+ worker.off('message', messageHandler);
588
+ pooledWorker.state = WorkerState.Idle;
589
+ resolve();
590
+ }
591
+ };
592
+ worker.on('message', messageHandler);
593
+ worker.on('error', (error) => {
594
+ clearTimeout(timeout);
595
+ reject(new Error(`Worker ${workerId} error: ${error.message}`));
596
+ });
597
+ // Send init message with ECC library type
598
+ worker.postMessage({
599
+ type: 'init',
600
+ eccType: this.#config.eccLibrary,
601
+ });
602
+ });
603
+ // Set up message handler for signing results
604
+ worker.on('message', (data) => {
605
+ this.#handleWorkerMessage(pooledWorker, data);
606
+ });
607
+ }
608
+ /**
609
+ * Signs a batch of tasks on a specific worker.
610
+ */
611
+ async #signBatchOnWorker(tasks, privateKey, publicKey, workerIndex) {
612
+ if (tasks.length === 0) {
613
+ return { type: 'batchResult', batchId: '', results: [], errors: [] };
614
+ }
615
+ // Get worker at index (or wait for idle)
616
+ const worker = this.#workers[workerIndex] ?? (await this.#getIdleWorker());
617
+ // Generate unique batch ID
618
+ const batchId = `batch-${this.#nextTaskId++}`;
619
+ return new Promise((resolve, reject) => {
620
+ // Set up timeout
621
+ const timeoutId = setTimeout(() => {
622
+ this.#pendingBatches.delete(batchId);
623
+ worker.state = WorkerState.Idle;
624
+ worker.currentTaskId = null;
625
+ worker.taskStartTime = null;
626
+ // SECURITY: Terminate worker that exceeded key hold time
627
+ this.#terminateWorker(worker).catch(() => { });
628
+ this.#createWorker().catch(() => { });
629
+ reject(new Error(`Batch signing timeout for ${tasks.length} tasks`));
630
+ }, this.#config.maxKeyHoldTimeMs);
631
+ // Store pending batch
632
+ const pendingBatch = {
633
+ batchId,
634
+ resolve,
635
+ reject,
636
+ timeoutId,
637
+ };
638
+ this.#pendingBatches.set(batchId, pendingBatch);
639
+ // Mark worker as busy
640
+ worker.state = WorkerState.Busy;
641
+ worker.currentTaskId = batchId;
642
+ worker.taskStartTime = Date.now();
643
+ // Convert tasks to batch format
644
+ const batchTasks = tasks.map((task) => ({
645
+ taskId: task.taskId,
646
+ hash: task.hash,
647
+ publicKey,
648
+ signatureType: task.signatureType,
649
+ lowR: task.lowR,
650
+ inputIndex: task.inputIndex,
651
+ sighashType: task.sighashType,
652
+ leafHash: task.leafHash,
653
+ }));
654
+ // Create batch message
655
+ const message = {
656
+ type: 'signBatch',
657
+ batchId,
658
+ tasks: batchTasks,
659
+ privateKey,
660
+ };
661
+ // Send to worker
662
+ worker.worker.postMessage(message);
663
+ });
664
+ }
665
+ /**
666
+ * Gets an idle worker, creating one if necessary.
667
+ */
668
+ async #getIdleWorker() {
669
+ let worker = this.#workers.find((w) => w.state === WorkerState.Idle);
670
+ if (worker) {
671
+ return worker;
672
+ }
673
+ if (this.#workers.length < this.#config.workerCount) {
674
+ await this.#createWorker();
675
+ worker = this.#workers.find((w) => w.state === WorkerState.Idle);
676
+ if (worker) {
677
+ return worker;
678
+ }
679
+ }
680
+ return new Promise((resolve) => {
681
+ const checkInterval = setInterval(() => {
682
+ const idleWorker = this.#workers.find((w) => w.state === WorkerState.Idle);
683
+ if (idleWorker) {
684
+ clearInterval(checkInterval);
685
+ resolve(idleWorker);
686
+ }
687
+ }, 10);
688
+ });
689
+ }
690
+ /**
691
+ * Handles a message from a worker.
692
+ */
693
+ #handleWorkerMessage(worker, response) {
694
+ if (isBatchResult(response)) {
695
+ const pending = this.#pendingBatches.get(response.batchId);
696
+ if (pending) {
697
+ clearTimeout(pending.timeoutId);
698
+ this.#pendingBatches.delete(response.batchId);
699
+ worker.state = WorkerState.Idle;
700
+ worker.currentTaskId = null;
701
+ worker.taskStartTime = null;
702
+ pending.resolve(response);
703
+ }
704
+ }
705
+ // Ignore ready and shutdown-ack messages here (handled elsewhere)
706
+ }
707
+ /**
708
+ * Terminates a worker.
709
+ */
710
+ async #terminateWorker(worker) {
711
+ if (worker.state === WorkerState.Terminated) {
712
+ return;
713
+ }
714
+ worker.state = WorkerState.ShuttingDown;
715
+ worker.worker.postMessage({ type: 'shutdown' });
716
+ await new Promise((resolve) => {
717
+ const timeout = setTimeout(async () => {
718
+ await worker.worker.terminate();
719
+ worker.state = WorkerState.Terminated;
720
+ resolve();
721
+ }, 1000);
722
+ const handler = (data) => {
723
+ if (data.type === 'shutdown-ack') {
724
+ clearTimeout(timeout);
725
+ worker.worker.off('message', handler);
726
+ void worker.worker.terminate().then(() => {
727
+ worker.state = WorkerState.Terminated;
728
+ resolve();
729
+ });
730
+ }
731
+ };
732
+ worker.worker.on('message', handler);
733
+ });
734
+ const index = this.#workers.indexOf(worker);
735
+ if (index >= 0) {
736
+ this.#workers.splice(index, 1);
737
+ }
738
+ }
739
+ /**
740
+ * Terminates all idle workers.
741
+ */
742
+ async #terminateIdleWorkers() {
743
+ const idleWorkers = this.#workers.filter((w) => w.state === WorkerState.Idle);
744
+ await Promise.all(idleWorkers.map((w) => this.#terminateWorker(w)));
745
+ }
746
+ }
747
+ /**
748
+ * Convenience function to get the singleton pool instance.
749
+ */
750
+ export function getNodeSigningPool(config) {
751
+ return NodeWorkerSigningPool.getInstance(config);
752
+ }
753
+ //# sourceMappingURL=WorkerSigningPool.node.js.map