@btc-vision/bitcoin 6.5.5 → 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 (457) hide show
  1. package/AUDIT/README.md +9 -0
  2. package/HOW_TO_WRITE_GOOD_CODE.md +2436 -0
  3. package/SECURITY.md +27 -0
  4. package/benchmark/psbt-2000-inputs.bench.ts +178 -0
  5. package/benchmark/signing.bench.ts +147 -0
  6. package/browser/address.d.ts +56 -9
  7. package/browser/address.d.ts.map +1 -0
  8. package/browser/bech32utils.d.ts +9 -1
  9. package/browser/bech32utils.d.ts.map +1 -0
  10. package/browser/bip66.d.ts +11 -6
  11. package/browser/bip66.d.ts.map +1 -0
  12. package/browser/block.d.ts +117 -11
  13. package/browser/block.d.ts.map +1 -0
  14. package/browser/branded.d.ts +20 -0
  15. package/browser/branded.d.ts.map +1 -0
  16. package/browser/crypto/crypto.d.ts +1 -0
  17. package/browser/crypto/crypto.d.ts.map +1 -0
  18. package/browser/crypto.d.ts +46 -7
  19. package/browser/crypto.d.ts.map +1 -0
  20. package/browser/ecc/context.d.ts +129 -0
  21. package/browser/ecc/context.d.ts.map +1 -0
  22. package/browser/ecc/index.d.ts +11 -0
  23. package/browser/ecc/index.d.ts.map +1 -0
  24. package/browser/ecc/types.d.ts +128 -0
  25. package/browser/ecc/types.d.ts.map +1 -0
  26. package/browser/ecpair.d.ts +99 -0
  27. package/browser/errors.d.ts +124 -0
  28. package/browser/errors.d.ts.map +1 -0
  29. package/browser/index.d.ts +32 -5
  30. package/browser/index.d.ts.map +1 -0
  31. package/browser/index.js +12482 -101
  32. package/browser/io/BinaryReader.d.ts +276 -0
  33. package/browser/io/BinaryReader.d.ts.map +1 -0
  34. package/browser/io/BinaryWriter.d.ts +391 -0
  35. package/browser/io/BinaryWriter.d.ts.map +1 -0
  36. package/browser/io/MemoryPool.d.ts +220 -0
  37. package/browser/io/MemoryPool.d.ts.map +1 -0
  38. package/browser/io/base64.d.ts +13 -0
  39. package/browser/io/base64.d.ts.map +1 -0
  40. package/browser/io/hex.d.ts +67 -0
  41. package/browser/io/hex.d.ts.map +1 -0
  42. package/browser/io/index.d.ts +17 -0
  43. package/browser/io/index.d.ts.map +1 -0
  44. package/browser/io/utils.d.ts +199 -0
  45. package/browser/io/utils.d.ts.map +1 -0
  46. package/browser/merkle.d.ts +10 -1
  47. package/browser/merkle.d.ts.map +1 -0
  48. package/browser/networks.d.ts +70 -9
  49. package/browser/networks.d.ts.map +1 -0
  50. package/browser/opcodes.d.ts +1 -0
  51. package/browser/opcodes.d.ts.map +1 -0
  52. package/browser/payments/bip341.d.ts +35 -9
  53. package/browser/payments/bip341.d.ts.map +1 -0
  54. package/browser/payments/embed.d.ts +112 -1
  55. package/browser/payments/embed.d.ts.map +1 -0
  56. package/browser/payments/index.d.ts +17 -10
  57. package/browser/payments/index.d.ts.map +1 -0
  58. package/browser/payments/p2ms.d.ts +150 -0
  59. package/browser/payments/p2ms.d.ts.map +1 -0
  60. package/browser/payments/p2op.d.ts +150 -24
  61. package/browser/payments/p2op.d.ts.map +1 -0
  62. package/browser/payments/p2pk.d.ts +154 -1
  63. package/browser/payments/p2pk.d.ts.map +1 -0
  64. package/browser/payments/p2pkh.d.ts +176 -1
  65. package/browser/payments/p2pkh.d.ts.map +1 -0
  66. package/browser/payments/p2sh.d.ts +150 -1
  67. package/browser/payments/p2sh.d.ts.map +1 -0
  68. package/browser/payments/p2tr.d.ts +185 -1
  69. package/browser/payments/p2tr.d.ts.map +1 -0
  70. package/browser/payments/p2wpkh.d.ts +161 -1
  71. package/browser/payments/p2wpkh.d.ts.map +1 -0
  72. package/browser/payments/p2wsh.d.ts +146 -1
  73. package/browser/payments/p2wsh.d.ts.map +1 -0
  74. package/browser/payments/types.d.ts +94 -64
  75. package/browser/payments/types.d.ts.map +1 -0
  76. package/browser/psbt/bip371.d.ts +34 -8
  77. package/browser/psbt/bip371.d.ts.map +1 -0
  78. package/browser/psbt/psbtutils.d.ts +56 -16
  79. package/browser/psbt/psbtutils.d.ts.map +1 -0
  80. package/browser/psbt/types.d.ts +245 -0
  81. package/browser/psbt/types.d.ts.map +1 -0
  82. package/browser/psbt/utils.d.ts +64 -0
  83. package/browser/psbt/utils.d.ts.map +1 -0
  84. package/browser/psbt/validation.d.ts +84 -0
  85. package/browser/psbt/validation.d.ts.map +1 -0
  86. package/browser/psbt.d.ts +82 -118
  87. package/browser/psbt.d.ts.map +1 -0
  88. package/browser/pubkey.d.ts +27 -6
  89. package/browser/pubkey.d.ts.map +1 -0
  90. package/browser/push_data.d.ts +24 -2
  91. package/browser/push_data.d.ts.map +1 -0
  92. package/browser/script.d.ts +33 -8
  93. package/browser/script.d.ts.map +1 -0
  94. package/browser/script_number.d.ts +17 -0
  95. package/browser/script_number.d.ts.map +1 -0
  96. package/browser/script_signature.d.ts +23 -5
  97. package/browser/script_signature.d.ts.map +1 -0
  98. package/browser/transaction.d.ts +160 -18
  99. package/browser/transaction.d.ts.map +1 -0
  100. package/browser/types.d.ts +36 -38
  101. package/browser/types.d.ts.map +1 -0
  102. package/browser/workers/WorkerSigningPool.d.ts +143 -0
  103. package/browser/workers/WorkerSigningPool.d.ts.map +1 -0
  104. package/browser/workers/WorkerSigningPool.node.d.ts +116 -0
  105. package/browser/workers/WorkerSigningPool.node.d.ts.map +1 -0
  106. package/browser/workers/ecc-bundle.d.ts +25 -0
  107. package/browser/workers/ecc-bundle.d.ts.map +1 -0
  108. package/browser/workers/index.d.ts +91 -0
  109. package/browser/workers/index.d.ts.map +1 -0
  110. package/browser/workers/psbt-parallel.d.ts +88 -0
  111. package/browser/workers/psbt-parallel.d.ts.map +1 -0
  112. package/browser/workers/signing-worker.d.ts +37 -0
  113. package/browser/workers/signing-worker.d.ts.map +1 -0
  114. package/browser/workers/types.d.ts +365 -0
  115. package/browser/workers/types.d.ts.map +1 -0
  116. package/build/address.d.ts +57 -10
  117. package/build/address.d.ts.map +1 -0
  118. package/build/address.js +80 -24
  119. package/build/address.js.map +1 -0
  120. package/build/bech32utils.d.ts +9 -1
  121. package/build/bech32utils.d.ts.map +1 -0
  122. package/build/bech32utils.js +10 -2
  123. package/build/bech32utils.js.map +1 -0
  124. package/build/bip66.d.ts +11 -6
  125. package/build/bip66.d.ts.map +1 -0
  126. package/build/bip66.js +32 -3
  127. package/build/bip66.js.map +1 -0
  128. package/build/block.d.ts +117 -11
  129. package/build/block.d.ts.map +1 -0
  130. package/build/block.js +204 -72
  131. package/build/block.js.map +1 -0
  132. package/build/branded.d.ts +20 -0
  133. package/build/branded.d.ts.map +1 -0
  134. package/build/branded.js +7 -0
  135. package/build/branded.js.map +1 -0
  136. package/build/crypto/crypto.d.ts +1 -0
  137. package/build/crypto/crypto.d.ts.map +1 -0
  138. package/build/crypto/crypto.js +1 -0
  139. package/build/crypto/crypto.js.map +1 -0
  140. package/build/crypto.d.ts +46 -7
  141. package/build/crypto.d.ts.map +1 -0
  142. package/build/crypto.js +65 -20
  143. package/build/crypto.js.map +1 -0
  144. package/build/ecc/context.d.ts +135 -0
  145. package/build/ecc/context.d.ts.map +1 -0
  146. package/build/ecc/context.js +232 -0
  147. package/build/ecc/context.js.map +1 -0
  148. package/build/ecc/index.d.ts +11 -0
  149. package/build/ecc/index.d.ts.map +1 -0
  150. package/build/ecc/index.js +11 -0
  151. package/build/ecc/index.js.map +1 -0
  152. package/build/ecc/types.d.ts +134 -0
  153. package/build/ecc/types.d.ts.map +1 -0
  154. package/build/ecc/types.js +8 -0
  155. package/build/ecc/types.js.map +1 -0
  156. package/build/errors.d.ts +124 -0
  157. package/build/errors.d.ts.map +1 -0
  158. package/build/errors.js +155 -0
  159. package/build/errors.js.map +1 -0
  160. package/build/index.d.ts +32 -5
  161. package/build/index.d.ts.map +1 -0
  162. package/build/index.js +26 -3
  163. package/build/index.js.map +1 -0
  164. package/build/io/BinaryReader.d.ts +276 -0
  165. package/build/io/BinaryReader.d.ts.map +1 -0
  166. package/build/io/BinaryReader.js +425 -0
  167. package/build/io/BinaryReader.js.map +1 -0
  168. package/build/io/BinaryWriter.d.ts +391 -0
  169. package/build/io/BinaryWriter.d.ts.map +1 -0
  170. package/build/io/BinaryWriter.js +611 -0
  171. package/build/io/BinaryWriter.js.map +1 -0
  172. package/build/io/MemoryPool.d.ts +220 -0
  173. package/build/io/MemoryPool.d.ts.map +1 -0
  174. package/build/io/MemoryPool.js +309 -0
  175. package/build/io/MemoryPool.js.map +1 -0
  176. package/build/io/base64.d.ts +13 -0
  177. package/build/io/base64.d.ts.map +1 -0
  178. package/build/io/base64.js +20 -0
  179. package/build/io/base64.js.map +1 -0
  180. package/build/io/hex.d.ts +67 -0
  181. package/build/io/hex.d.ts.map +1 -0
  182. package/build/io/hex.js +138 -0
  183. package/build/io/hex.js.map +1 -0
  184. package/build/io/index.d.ts +17 -0
  185. package/build/io/index.d.ts.map +1 -0
  186. package/build/io/index.js +23 -0
  187. package/build/io/index.js.map +1 -0
  188. package/build/io/utils.d.ts +199 -0
  189. package/build/io/utils.d.ts.map +1 -0
  190. package/build/io/utils.js +271 -0
  191. package/build/io/utils.js.map +1 -0
  192. package/build/merkle.d.ts +10 -1
  193. package/build/merkle.d.ts.map +1 -0
  194. package/build/merkle.js +12 -1
  195. package/build/merkle.js.map +1 -0
  196. package/build/networks.d.ts +70 -9
  197. package/build/networks.d.ts.map +1 -0
  198. package/build/networks.js +90 -4
  199. package/build/networks.js.map +1 -0
  200. package/build/opcodes.d.ts +1 -0
  201. package/build/opcodes.d.ts.map +1 -0
  202. package/build/opcodes.js +1 -0
  203. package/build/opcodes.js.map +1 -0
  204. package/build/payments/bip341.d.ts +36 -9
  205. package/build/payments/bip341.d.ts.map +1 -0
  206. package/build/payments/bip341.js +35 -15
  207. package/build/payments/bip341.js.map +1 -0
  208. package/build/payments/embed.d.ts +120 -1
  209. package/build/payments/embed.d.ts.map +1 -0
  210. package/build/payments/embed.js +215 -34
  211. package/build/payments/embed.js.map +1 -0
  212. package/build/payments/index.d.ts +17 -10
  213. package/build/payments/index.d.ts.map +1 -0
  214. package/build/payments/index.js +20 -10
  215. package/build/payments/index.js.map +1 -0
  216. package/build/payments/p2ms.d.ts +159 -1
  217. package/build/payments/p2ms.d.ts.map +1 -0
  218. package/build/payments/p2ms.js +427 -108
  219. package/build/payments/p2ms.js.map +1 -0
  220. package/build/payments/p2op.d.ts +158 -24
  221. package/build/payments/p2op.d.ts.map +1 -0
  222. package/build/payments/p2op.js +379 -93
  223. package/build/payments/p2op.js.map +1 -0
  224. package/build/payments/p2pk.d.ts +162 -1
  225. package/build/payments/p2pk.d.ts.map +1 -0
  226. package/build/payments/p2pk.js +327 -58
  227. package/build/payments/p2pk.js.map +1 -0
  228. package/build/payments/p2pkh.d.ts +185 -1
  229. package/build/payments/p2pkh.d.ts.map +1 -0
  230. package/build/payments/p2pkh.js +467 -114
  231. package/build/payments/p2pkh.js.map +1 -0
  232. package/build/payments/p2sh.d.ts +159 -1
  233. package/build/payments/p2sh.d.ts.map +1 -0
  234. package/build/payments/p2sh.js +500 -152
  235. package/build/payments/p2sh.js.map +1 -0
  236. package/build/payments/p2tr.d.ts +193 -1
  237. package/build/payments/p2tr.d.ts.map +1 -0
  238. package/build/payments/p2tr.js +592 -174
  239. package/build/payments/p2tr.js.map +1 -0
  240. package/build/payments/p2wpkh.d.ts +170 -1
  241. package/build/payments/p2wpkh.d.ts.map +1 -0
  242. package/build/payments/p2wpkh.js +429 -104
  243. package/build/payments/p2wpkh.js.map +1 -0
  244. package/build/payments/p2wsh.d.ts +155 -1
  245. package/build/payments/p2wsh.d.ts.map +1 -0
  246. package/build/payments/p2wsh.js +466 -144
  247. package/build/payments/p2wsh.js.map +1 -0
  248. package/build/payments/types.d.ts +98 -64
  249. package/build/payments/types.d.ts.map +1 -0
  250. package/build/payments/types.js +17 -13
  251. package/build/payments/types.js.map +1 -0
  252. package/build/psbt/bip371.d.ts +35 -9
  253. package/build/psbt/bip371.d.ts.map +1 -0
  254. package/build/psbt/bip371.js +113 -28
  255. package/build/psbt/bip371.js.map +1 -0
  256. package/build/psbt/psbtutils.d.ts +56 -16
  257. package/build/psbt/psbtutils.d.ts.map +1 -0
  258. package/build/psbt/psbtutils.js +71 -16
  259. package/build/psbt/psbtutils.js.map +1 -0
  260. package/build/psbt/types.d.ts +249 -0
  261. package/build/psbt/types.d.ts.map +1 -0
  262. package/build/psbt/types.js +6 -0
  263. package/build/psbt/types.js.map +1 -0
  264. package/build/psbt/utils.d.ts +68 -0
  265. package/build/psbt/utils.d.ts.map +1 -0
  266. package/build/psbt/utils.js +171 -0
  267. package/build/psbt/utils.js.map +1 -0
  268. package/build/psbt/validation.d.ts +88 -0
  269. package/build/psbt/validation.d.ts.map +1 -0
  270. package/build/psbt/validation.js +149 -0
  271. package/build/psbt/validation.js.map +1 -0
  272. package/build/psbt.d.ts +84 -120
  273. package/build/psbt.d.ts.map +1 -0
  274. package/build/psbt.js +411 -412
  275. package/build/psbt.js.map +1 -0
  276. package/build/pubkey.d.ts +27 -6
  277. package/build/pubkey.d.ts.map +1 -0
  278. package/build/pubkey.js +37 -13
  279. package/build/pubkey.js.map +1 -0
  280. package/build/push_data.d.ts +24 -2
  281. package/build/push_data.d.ts.map +1 -0
  282. package/build/push_data.js +44 -12
  283. package/build/push_data.js.map +1 -0
  284. package/build/script.d.ts +33 -8
  285. package/build/script.d.ts.map +1 -0
  286. package/build/script.js +100 -36
  287. package/build/script.js.map +1 -0
  288. package/build/script_number.d.ts +17 -0
  289. package/build/script_number.d.ts.map +1 -0
  290. package/build/script_number.js +19 -0
  291. package/build/script_number.js.map +1 -0
  292. package/build/script_signature.d.ts +23 -5
  293. package/build/script_signature.d.ts.map +1 -0
  294. package/build/script_signature.js +48 -15
  295. package/build/script_signature.js.map +1 -0
  296. package/build/transaction.d.ts +160 -18
  297. package/build/transaction.d.ts.map +1 -0
  298. package/build/transaction.js +443 -176
  299. package/build/transaction.js.map +1 -0
  300. package/build/tsconfig.build.tsbuildinfo +1 -0
  301. package/build/types.d.ts +36 -38
  302. package/build/types.d.ts.map +1 -0
  303. package/build/types.js +175 -57
  304. package/build/types.js.map +1 -0
  305. package/build/workers/WorkerSigningPool.d.ts +174 -0
  306. package/build/workers/WorkerSigningPool.d.ts.map +1 -0
  307. package/build/workers/WorkerSigningPool.js +553 -0
  308. package/build/workers/WorkerSigningPool.js.map +1 -0
  309. package/build/workers/WorkerSigningPool.node.d.ts +124 -0
  310. package/build/workers/WorkerSigningPool.node.d.ts.map +1 -0
  311. package/build/workers/WorkerSigningPool.node.js +753 -0
  312. package/build/workers/WorkerSigningPool.node.js.map +1 -0
  313. package/build/workers/ecc-bundle.d.ts +25 -0
  314. package/build/workers/ecc-bundle.d.ts.map +1 -0
  315. package/build/workers/ecc-bundle.js +25 -0
  316. package/build/workers/ecc-bundle.js.map +1 -0
  317. package/build/workers/index.d.ts +91 -0
  318. package/build/workers/index.d.ts.map +1 -0
  319. package/build/workers/index.js +114 -0
  320. package/build/workers/index.js.map +1 -0
  321. package/build/workers/psbt-parallel.d.ts +117 -0
  322. package/build/workers/psbt-parallel.d.ts.map +1 -0
  323. package/build/workers/psbt-parallel.js +233 -0
  324. package/build/workers/psbt-parallel.js.map +1 -0
  325. package/build/workers/signing-worker.d.ts +37 -0
  326. package/build/workers/signing-worker.d.ts.map +1 -0
  327. package/build/workers/signing-worker.js +350 -0
  328. package/build/workers/signing-worker.js.map +1 -0
  329. package/build/workers/types.d.ts +365 -0
  330. package/build/workers/types.d.ts.map +1 -0
  331. package/build/workers/types.js +60 -0
  332. package/build/workers/types.js.map +1 -0
  333. package/package.json +83 -25
  334. package/scripts/bundle-ecc.ts +111 -0
  335. package/src/address.ts +81 -44
  336. package/src/bech32utils.ts +3 -3
  337. package/src/bip66.ts +34 -24
  338. package/src/block.ts +196 -84
  339. package/src/branded.ts +18 -0
  340. package/src/crypto.ts +64 -26
  341. package/src/ecc/context.ts +277 -0
  342. package/src/ecc/index.ts +14 -0
  343. package/src/ecc/types.ts +154 -0
  344. package/src/ecpair.d.ts +99 -0
  345. package/src/errors.ts +163 -0
  346. package/src/index.ts +113 -9
  347. package/src/io/BinaryReader.ts +461 -0
  348. package/src/io/BinaryWriter.ts +696 -0
  349. package/src/io/MemoryPool.ts +343 -0
  350. package/src/io/base64.ts +20 -0
  351. package/src/io/hex.ts +155 -0
  352. package/src/io/index.ts +41 -0
  353. package/src/io/utils.ts +283 -0
  354. package/src/merkle.ts +14 -9
  355. package/src/networks.ts +9 -9
  356. package/src/payments/bip341.ts +34 -33
  357. package/src/payments/embed.ts +244 -41
  358. package/src/payments/index.ts +12 -10
  359. package/src/payments/p2ms.ts +490 -118
  360. package/src/payments/p2op.ts +431 -133
  361. package/src/payments/p2pk.ts +370 -72
  362. package/src/payments/p2pkh.ts +524 -130
  363. package/src/payments/p2sh.ts +572 -172
  364. package/src/payments/p2tr.ts +686 -194
  365. package/src/payments/p2wpkh.ts +484 -107
  366. package/src/payments/p2wsh.ts +526 -164
  367. package/src/payments/types.ts +80 -66
  368. package/src/psbt/bip371.ts +68 -51
  369. package/src/psbt/psbtutils.ts +39 -40
  370. package/src/psbt/types.ts +331 -0
  371. package/src/psbt/utils.ts +188 -0
  372. package/src/psbt/validation.ts +192 -0
  373. package/src/psbt.ts +566 -809
  374. package/src/pubkey.ts +24 -25
  375. package/src/push_data.ts +18 -16
  376. package/src/script.ts +82 -64
  377. package/src/script_number.ts +6 -6
  378. package/src/script_signature.ts +33 -36
  379. package/src/transaction.ts +458 -238
  380. package/src/types.ts +231 -100
  381. package/src/workers/WorkerSigningPool.node.ts +887 -0
  382. package/src/workers/WorkerSigningPool.ts +670 -0
  383. package/src/workers/ecc-bundle.ts +26 -0
  384. package/src/workers/index.ts +165 -0
  385. package/src/workers/psbt-parallel.ts +332 -0
  386. package/src/workers/signing-worker.ts +353 -0
  387. package/src/workers/types.ts +413 -0
  388. package/test/address.spec.ts +9 -6
  389. package/test/bitcoin.core.spec.ts +16 -17
  390. package/test/block.spec.ts +8 -7
  391. package/test/bufferutils.spec.ts +228 -214
  392. package/test/crypto.spec.ts +19 -11
  393. package/test/fixtures/p2pk.json +0 -8
  394. package/test/fixtures/p2pkh.json +1 -1
  395. package/test/fixtures/p2sh.json +1 -1
  396. package/test/fixtures/script.json +1 -1
  397. package/test/fixtures/transaction.json +2 -2
  398. package/test/integration/_regtest.ts +25 -0
  399. package/test/integration/addresses.spec.ts +4 -3
  400. package/test/integration/bip32.spec.ts +2 -1
  401. package/test/integration/blocks.spec.ts +1 -1
  402. package/test/integration/cltv.spec.ts +18 -16
  403. package/test/integration/csv.spec.ts +37 -64
  404. package/test/integration/payments.spec.ts +5 -3
  405. package/test/integration/taproot.spec.ts +76 -83
  406. package/test/integration/transactions.spec.ts +38 -35
  407. package/test/payments.spec.ts +35 -13
  408. package/test/payments.utils.ts +17 -16
  409. package/test/psbt.spec.ts +111 -100
  410. package/test/script.spec.ts +11 -10
  411. package/test/script_signature.spec.ts +9 -11
  412. package/test/taproot-cache.spec.ts +694 -0
  413. package/test/transaction.spec.ts +32 -40
  414. package/test/types.spec.ts +74 -29
  415. package/test/workers-pool.spec.ts +963 -0
  416. package/test/workers-signing.spec.ts +635 -0
  417. package/test/workers.spec.ts +1390 -0
  418. package/tsconfig.base.json +34 -18
  419. package/tsconfig.browser.json +15 -0
  420. package/tsconfig.build.json +5 -0
  421. package/tsconfig.json +5 -14
  422. package/vite.config.browser.ts +3 -42
  423. package/vitest.config.integration.ts +11 -0
  424. package/browser/bufferutils.d.ts +0 -34
  425. package/browser/chunks/crypto-BhCpKpek.js +0 -2033
  426. package/browser/chunks/payments-yjA0Evsv.js +0 -1089
  427. package/browser/chunks/psbt-URK2hBFc.js +0 -4039
  428. package/browser/chunks/script-DyPItFEl.js +0 -318
  429. package/browser/chunks/transaction-C_UbhMGn.js +0 -432
  430. package/browser/chunks/utils-DNZi-T5W.js +0 -761
  431. package/browser/ecc_lib.d.ts +0 -3
  432. package/browser/hooks/AdvancedSignatureManager.d.ts +0 -16
  433. package/browser/hooks/HookedSigner.d.ts +0 -4
  434. package/browser/hooks/SignatureManager.d.ts +0 -13
  435. package/browser/payments/lazy.d.ts +0 -2
  436. package/browser/typeforce.d.ts +0 -38
  437. package/build/bufferutils.d.ts +0 -34
  438. package/build/bufferutils.js +0 -141
  439. package/build/ecc_lib.d.ts +0 -3
  440. package/build/ecc_lib.js +0 -61
  441. package/build/hooks/AdvancedSignatureManager.d.ts +0 -16
  442. package/build/hooks/AdvancedSignatureManager.js +0 -52
  443. package/build/hooks/HookedSigner.d.ts +0 -4
  444. package/build/hooks/HookedSigner.js +0 -64
  445. package/build/hooks/SignatureManager.d.ts +0 -13
  446. package/build/hooks/SignatureManager.js +0 -45
  447. package/build/payments/lazy.d.ts +0 -2
  448. package/build/payments/lazy.js +0 -28
  449. package/build/tsconfig.tsbuildinfo +0 -1
  450. package/src/bufferutils.ts +0 -188
  451. package/src/ecc_lib.ts +0 -94
  452. package/src/hooks/AdvancedSignatureManager.ts +0 -104
  453. package/src/hooks/HookedSigner.ts +0 -108
  454. package/src/hooks/SignatureManager.ts +0 -84
  455. package/src/payments/lazy.ts +0 -28
  456. package/src/typeforce.d.ts +0 -38
  457. package/tsconfig.webpack.json +0 -18
@@ -0,0 +1,553 @@
1
+ /**
2
+ * Worker-based parallel signing pool.
3
+ *
4
+ * Provides secure parallel signature computation using worker threads.
5
+ * Private keys are isolated per-worker and zeroed immediately after signing.
6
+ *
7
+ * SECURITY ARCHITECTURE:
8
+ * - Keys are NEVER shared via SharedArrayBuffer
9
+ * - Each key is cloned to ONE worker via postMessage
10
+ * - Keys are zeroed in worker immediately after signing
11
+ * - Workers can be preserved for performance or terminated for security
12
+ *
13
+ * @example
14
+ * ```typescript
15
+ * import { WorkerSigningPool } from '@btc-vision/bitcoin';
16
+ *
17
+ * // Get singleton pool instance
18
+ * const pool = WorkerSigningPool.getInstance();
19
+ *
20
+ * // Preserve workers for multiple signing operations (faster)
21
+ * pool.preserveWorkers();
22
+ *
23
+ * // Sign multiple inputs in parallel
24
+ * const result = await pool.signBatch(tasks, keyPair);
25
+ *
26
+ * // Shutdown when done (optional - cleans up workers)
27
+ * await pool.shutdown();
28
+ * ```
29
+ *
30
+ * @packageDocumentation
31
+ */
32
+ import { WorkerState, isBatchResult, isWorkerReady, } from './types.js';
33
+ import { createWorkerBlobUrl, revokeWorkerBlobUrl } from './signing-worker.js';
34
+ /**
35
+ * Default configuration values.
36
+ */
37
+ const DEFAULT_CONFIG = {
38
+ workerCount: typeof navigator !== 'undefined' ? navigator.hardwareConcurrency || 4 : 4,
39
+ taskTimeoutMs: 30000,
40
+ maxKeyHoldTimeMs: 5000,
41
+ verifySignatures: true,
42
+ preserveWorkers: false,
43
+ };
44
+ /**
45
+ * Worker-based parallel signing pool.
46
+ *
47
+ * Manages a pool of worker threads for parallel signature computation.
48
+ * Provides secure key handling with immediate zeroing after use.
49
+ *
50
+ * @example
51
+ * ```typescript
52
+ * // Initialize pool at app startup
53
+ * const pool = WorkerSigningPool.getInstance({ workerCount: 4 });
54
+ * pool.preserveWorkers();
55
+ *
56
+ * // Use for PSBT signing
57
+ * const tasks = prepareSigningTasks(psbt, keyPair);
58
+ * const result = await pool.signBatch(tasks, keyPair);
59
+ *
60
+ * // Apply signatures to PSBT
61
+ * applySignatures(psbt, result.signatures);
62
+ * ```
63
+ */
64
+ export class WorkerSigningPool {
65
+ /**
66
+ * Singleton instance.
67
+ */
68
+ static #instance = null;
69
+ /**
70
+ * Pool configuration.
71
+ */
72
+ #config;
73
+ /**
74
+ * Worker pool.
75
+ */
76
+ #workers = [];
77
+ /**
78
+ * Pending batches awaiting completion.
79
+ */
80
+ #pendingBatches = new Map();
81
+ /**
82
+ * Worker blob URL (shared across all workers).
83
+ */
84
+ #workerBlobUrl = null;
85
+ /**
86
+ * Whether workers are preserved between batches.
87
+ */
88
+ #preserveWorkers = false;
89
+ /**
90
+ * Next worker ID counter.
91
+ */
92
+ #nextWorkerId = 0;
93
+ /**
94
+ * Next task ID counter.
95
+ */
96
+ #nextTaskId = 0;
97
+ /**
98
+ * Whether the pool is initialized.
99
+ */
100
+ #initialized = false;
101
+ /**
102
+ * Whether the pool is shutting down.
103
+ */
104
+ #shuttingDown = false;
105
+ /**
106
+ * Creates a new WorkerSigningPool.
107
+ *
108
+ * @param config - Pool configuration
109
+ */
110
+ constructor(config = {}) {
111
+ this.#config = { ...DEFAULT_CONFIG, ...config };
112
+ this.#preserveWorkers = this.#config.preserveWorkers;
113
+ }
114
+ /**
115
+ * Gets the singleton pool instance.
116
+ *
117
+ * @param config - Optional configuration (only used on first call)
118
+ * @returns The singleton pool instance
119
+ *
120
+ * @example
121
+ * ```typescript
122
+ * const pool = WorkerSigningPool.getInstance({ workerCount: 8 });
123
+ * ```
124
+ */
125
+ static getInstance(config) {
126
+ if (!WorkerSigningPool.#instance) {
127
+ WorkerSigningPool.#instance = new WorkerSigningPool(config);
128
+ }
129
+ return WorkerSigningPool.#instance;
130
+ }
131
+ /**
132
+ * Resets the singleton instance (for testing).
133
+ */
134
+ static resetInstance() {
135
+ if (WorkerSigningPool.#instance) {
136
+ WorkerSigningPool.#instance.shutdown().catch(() => { });
137
+ WorkerSigningPool.#instance = null;
138
+ }
139
+ }
140
+ /**
141
+ * Number of workers in the pool.
142
+ */
143
+ get workerCount() {
144
+ return this.#workers.length;
145
+ }
146
+ /**
147
+ * Number of idle workers available.
148
+ */
149
+ get idleWorkerCount() {
150
+ return this.#workers.filter((w) => w.state === WorkerState.Idle).length;
151
+ }
152
+ /**
153
+ * Number of busy workers.
154
+ */
155
+ get busyWorkerCount() {
156
+ return this.#workers.filter((w) => w.state === WorkerState.Busy).length;
157
+ }
158
+ /**
159
+ * Whether workers are being preserved between batches.
160
+ */
161
+ get isPreservingWorkers() {
162
+ return this.#preserveWorkers;
163
+ }
164
+ /**
165
+ * Enables worker preservation between signing batches.
166
+ *
167
+ * When enabled, workers remain alive after completing a batch,
168
+ * ready for the next signing operation. This is faster but
169
+ * keeps workers in memory.
170
+ *
171
+ * Call shutdown() when done to terminate all workers.
172
+ *
173
+ * @example
174
+ * ```typescript
175
+ * const pool = WorkerSigningPool.getInstance();
176
+ * pool.preserveWorkers(); // Enable at app startup
177
+ *
178
+ * // ... do many signing operations ...
179
+ *
180
+ * await pool.shutdown(); // Cleanup at app shutdown
181
+ * ```
182
+ */
183
+ preserveWorkers() {
184
+ this.#preserveWorkers = true;
185
+ }
186
+ /**
187
+ * Disables worker preservation.
188
+ *
189
+ * Workers will be terminated after each signing batch.
190
+ * More secure (no persistent workers) but slower for multiple batches.
191
+ */
192
+ releaseWorkers() {
193
+ this.#preserveWorkers = false;
194
+ }
195
+ /**
196
+ * Initializes the worker pool.
197
+ *
198
+ * Creates workers and waits for them to be ready.
199
+ * Called automatically on first signBatch() if not called manually.
200
+ *
201
+ * @returns Promise that resolves when all workers are ready
202
+ */
203
+ async initialize() {
204
+ if (this.#initialized) {
205
+ return;
206
+ }
207
+ if (this.#shuttingDown) {
208
+ throw new Error('Cannot initialize pool while shutting down');
209
+ }
210
+ // Create worker blob URL (ECC library is bundled at compile time)
211
+ this.#workerBlobUrl = createWorkerBlobUrl();
212
+ // Create workers
213
+ const workerPromises = [];
214
+ for (let i = 0; i < this.#config.workerCount; i++) {
215
+ workerPromises.push(this.#createWorker());
216
+ }
217
+ await Promise.all(workerPromises);
218
+ this.#initialized = true;
219
+ }
220
+ /**
221
+ * Signs a batch of tasks in parallel.
222
+ *
223
+ * SECURITY: Private keys are obtained via keyPair.getPrivateKey() and
224
+ * cloned to workers. Keys are zeroed in workers immediately after signing.
225
+ *
226
+ * Tasks are distributed across workers and processed in batches for efficiency.
227
+ *
228
+ * @param tasks - Signing tasks (hashes, input indices, etc.)
229
+ * @param keyPair - Key pair with getPrivateKey() method
230
+ * @returns Promise resolving to signing results
231
+ *
232
+ * @example
233
+ * ```typescript
234
+ * const tasks: SigningTask[] = [
235
+ * { taskId: '1', inputIndex: 0, hash: hash0, signatureType: SignatureType.ECDSA, sighashType: 0x01 },
236
+ * { taskId: '2', inputIndex: 1, hash: hash1, signatureType: SignatureType.Schnorr, sighashType: 0x00 },
237
+ * ];
238
+ *
239
+ * const result = await pool.signBatch(tasks, keyPair);
240
+ *
241
+ * if (result.success) {
242
+ * for (const [inputIndex, sig] of result.signatures) {
243
+ * console.log(`Input ${inputIndex}: ${sig.signature}`);
244
+ * }
245
+ * }
246
+ * ```
247
+ */
248
+ async signBatch(tasks, keyPair) {
249
+ const startTime = performance.now();
250
+ // Initialize if needed
251
+ if (!this.#initialized) {
252
+ await this.initialize();
253
+ }
254
+ if (tasks.length === 0) {
255
+ return {
256
+ success: true,
257
+ signatures: new Map(),
258
+ errors: new Map(),
259
+ durationMs: performance.now() - startTime,
260
+ };
261
+ }
262
+ // Distribute tasks across workers
263
+ const workerCount = Math.min(this.#workers.length, tasks.length);
264
+ const taskBatches = Array.from({ length: workerCount }, () => []);
265
+ for (let i = 0; i < tasks.length; i++) {
266
+ taskBatches[i % workerCount].push(tasks[i]);
267
+ }
268
+ // Get private key once
269
+ const privateKey = keyPair.getPrivateKey();
270
+ try {
271
+ // Send batches to workers in parallel
272
+ const batchResults = await Promise.allSettled(taskBatches.map((batch, index) => this.#signBatchOnWorker(batch, privateKey, keyPair.publicKey, index)));
273
+ // Collect all results
274
+ const signatures = new Map();
275
+ const errors = new Map();
276
+ for (let i = 0; i < batchResults.length; i++) {
277
+ const result = batchResults[i];
278
+ if (result.status === 'fulfilled') {
279
+ const batchResult = result.value;
280
+ // Add successful signatures
281
+ for (const sig of batchResult.results) {
282
+ signatures.set(sig.inputIndex, {
283
+ type: 'result',
284
+ taskId: sig.taskId,
285
+ signature: sig.signature,
286
+ inputIndex: sig.inputIndex,
287
+ publicKey: sig.publicKey,
288
+ signatureType: sig.signatureType,
289
+ leafHash: sig.leafHash,
290
+ });
291
+ }
292
+ // Add errors
293
+ for (const err of batchResult.errors) {
294
+ errors.set(err.inputIndex, err.error);
295
+ }
296
+ }
297
+ else {
298
+ // Entire batch failed - mark all tasks in batch as failed
299
+ const reason = result.reason;
300
+ const errorMsg = reason?.message ?? 'Batch signing failed';
301
+ // Add error for each task in the failed batch
302
+ const failedBatch = taskBatches[i];
303
+ for (const task of failedBatch) {
304
+ errors.set(task.inputIndex, errorMsg);
305
+ }
306
+ }
307
+ }
308
+ // Cleanup workers if not preserving
309
+ if (!this.#preserveWorkers) {
310
+ await this.#terminateIdleWorkers();
311
+ }
312
+ return {
313
+ success: errors.size === 0,
314
+ signatures,
315
+ errors,
316
+ durationMs: performance.now() - startTime,
317
+ };
318
+ }
319
+ finally {
320
+ // SECURITY: Zero the key in main thread
321
+ privateKey.fill(0);
322
+ }
323
+ }
324
+ /**
325
+ * Shuts down the pool and terminates all workers.
326
+ *
327
+ * Call this when the application is done with signing operations.
328
+ *
329
+ * @returns Promise that resolves when all workers are terminated
330
+ */
331
+ async shutdown() {
332
+ if (this.#shuttingDown) {
333
+ return;
334
+ }
335
+ this.#shuttingDown = true;
336
+ // Terminate all workers
337
+ const terminatePromises = this.#workers.map((worker) => this.#terminateWorker(worker));
338
+ await Promise.all(terminatePromises);
339
+ // Clear state
340
+ this.#workers.length = 0;
341
+ this.#pendingBatches.clear();
342
+ // Revoke blob URL
343
+ if (this.#workerBlobUrl) {
344
+ revokeWorkerBlobUrl(this.#workerBlobUrl);
345
+ this.#workerBlobUrl = null;
346
+ }
347
+ this.#initialized = false;
348
+ this.#shuttingDown = false;
349
+ }
350
+ /**
351
+ * Creates a new worker and adds it to the pool.
352
+ */
353
+ async #createWorker() {
354
+ if (!this.#workerBlobUrl) {
355
+ throw new Error('Worker blob URL not created');
356
+ }
357
+ const workerId = this.#nextWorkerId++;
358
+ // Create worker from blob URL
359
+ const worker = new Worker(this.#workerBlobUrl, {
360
+ name: `signing-worker-${workerId}`,
361
+ });
362
+ const pooledWorker = {
363
+ id: workerId,
364
+ state: WorkerState.Initializing,
365
+ worker,
366
+ currentTaskId: null,
367
+ taskStartTime: null,
368
+ };
369
+ this.#workers.push(pooledWorker);
370
+ // Wait for worker to be ready
371
+ await new Promise((resolve, reject) => {
372
+ const timeout = setTimeout(() => {
373
+ reject(new Error(`Worker ${workerId} initialization timeout`));
374
+ }, 10000);
375
+ const messageHandler = (event) => {
376
+ if (isWorkerReady(event.data)) {
377
+ clearTimeout(timeout);
378
+ worker.removeEventListener('message', messageHandler);
379
+ pooledWorker.state = WorkerState.Idle;
380
+ resolve();
381
+ }
382
+ };
383
+ worker.addEventListener('message', messageHandler);
384
+ worker.addEventListener('error', (error) => {
385
+ clearTimeout(timeout);
386
+ reject(new Error(`Worker ${workerId} error: ${error.message}`));
387
+ });
388
+ // Send init message (ECC library is bundled in worker code)
389
+ worker.postMessage({
390
+ type: 'init',
391
+ });
392
+ });
393
+ // Set up message handler for signing results
394
+ worker.addEventListener('message', (event) => {
395
+ this.#handleWorkerMessage(pooledWorker, event.data);
396
+ });
397
+ }
398
+ /**
399
+ * Signs a batch of tasks on a specific worker.
400
+ */
401
+ async #signBatchOnWorker(tasks, privateKey, publicKey, workerIndex) {
402
+ if (tasks.length === 0) {
403
+ return { type: 'batchResult', batchId: '', results: [], errors: [] };
404
+ }
405
+ // Get worker at index (or wait for idle)
406
+ const worker = this.#workers[workerIndex] ?? (await this.#getIdleWorker());
407
+ // Generate unique batch ID
408
+ const batchId = `batch-${this.#nextTaskId++}`;
409
+ return new Promise((resolve, reject) => {
410
+ // Set up timeout
411
+ const timeoutId = setTimeout(() => {
412
+ this.#pendingBatches.delete(batchId);
413
+ worker.state = WorkerState.Idle;
414
+ worker.currentTaskId = null;
415
+ worker.taskStartTime = null;
416
+ // SECURITY: Terminate worker that exceeded key hold time
417
+ this.#terminateWorker(worker).catch(() => { });
418
+ this.#createWorker().catch(() => { });
419
+ reject(new Error(`Batch signing timeout for ${tasks.length} tasks`));
420
+ }, this.#config.maxKeyHoldTimeMs);
421
+ // Store pending batch
422
+ const pendingBatch = {
423
+ batchId,
424
+ resolve,
425
+ reject,
426
+ timeoutId,
427
+ };
428
+ this.#pendingBatches.set(batchId, pendingBatch);
429
+ // Mark worker as busy
430
+ worker.state = WorkerState.Busy;
431
+ worker.currentTaskId = batchId;
432
+ worker.taskStartTime = Date.now();
433
+ // Convert tasks to batch format
434
+ const batchTasks = tasks.map((task) => ({
435
+ taskId: task.taskId,
436
+ hash: task.hash,
437
+ publicKey,
438
+ signatureType: task.signatureType,
439
+ lowR: task.lowR,
440
+ inputIndex: task.inputIndex,
441
+ sighashType: task.sighashType,
442
+ leafHash: task.leafHash,
443
+ }));
444
+ // Create batch message
445
+ // SECURITY: privateKey is cloned via postMessage, NOT shared
446
+ const message = {
447
+ type: 'signBatch',
448
+ batchId,
449
+ tasks: batchTasks,
450
+ privateKey, // Cloned to worker, zeroed there after all signatures
451
+ };
452
+ // Send to worker
453
+ worker.worker.postMessage(message);
454
+ });
455
+ }
456
+ /**
457
+ * Gets an idle worker, creating one if necessary.
458
+ */
459
+ async #getIdleWorker() {
460
+ // Find idle worker
461
+ let worker = this.#workers.find((w) => w.state === WorkerState.Idle);
462
+ if (worker) {
463
+ return worker;
464
+ }
465
+ // No idle workers - wait for one to become available
466
+ // or create a new one if under limit
467
+ if (this.#workers.length < this.#config.workerCount) {
468
+ await this.#createWorker();
469
+ worker = this.#workers.find((w) => w.state === WorkerState.Idle);
470
+ if (worker) {
471
+ return worker;
472
+ }
473
+ }
474
+ // Wait for any worker to become idle
475
+ return new Promise((resolve) => {
476
+ const checkInterval = setInterval(() => {
477
+ const idleWorker = this.#workers.find((w) => w.state === WorkerState.Idle);
478
+ if (idleWorker) {
479
+ clearInterval(checkInterval);
480
+ resolve(idleWorker);
481
+ }
482
+ }, 10);
483
+ });
484
+ }
485
+ /**
486
+ * Handles a message from a worker.
487
+ */
488
+ #handleWorkerMessage(worker, response) {
489
+ if (isBatchResult(response)) {
490
+ const pending = this.#pendingBatches.get(response.batchId);
491
+ if (pending) {
492
+ clearTimeout(pending.timeoutId);
493
+ this.#pendingBatches.delete(response.batchId);
494
+ worker.state = WorkerState.Idle;
495
+ worker.currentTaskId = null;
496
+ worker.taskStartTime = null;
497
+ pending.resolve(response);
498
+ }
499
+ }
500
+ // Ignore ready and shutdown-ack messages here (handled elsewhere)
501
+ }
502
+ /**
503
+ * Terminates a worker.
504
+ */
505
+ async #terminateWorker(worker) {
506
+ if (worker.state === WorkerState.Terminated) {
507
+ return;
508
+ }
509
+ worker.state = WorkerState.ShuttingDown;
510
+ // Send shutdown message
511
+ worker.worker.postMessage({ type: 'shutdown' });
512
+ // Wait briefly for acknowledgment, then terminate
513
+ await new Promise((resolve) => {
514
+ const timeout = setTimeout(() => {
515
+ worker.worker.terminate();
516
+ worker.state = WorkerState.Terminated;
517
+ resolve();
518
+ }, 1000);
519
+ const handler = (event) => {
520
+ if (event.data.type === 'shutdown-ack') {
521
+ clearTimeout(timeout);
522
+ worker.worker.removeEventListener('message', handler);
523
+ worker.worker.terminate();
524
+ worker.state = WorkerState.Terminated;
525
+ resolve();
526
+ }
527
+ };
528
+ worker.worker.addEventListener('message', handler);
529
+ });
530
+ // Remove from pool
531
+ const index = this.#workers.indexOf(worker);
532
+ if (index >= 0) {
533
+ this.#workers.splice(index, 1);
534
+ }
535
+ }
536
+ /**
537
+ * Terminates all idle workers.
538
+ */
539
+ async #terminateIdleWorkers() {
540
+ const idleWorkers = this.#workers.filter((w) => w.state === WorkerState.Idle);
541
+ await Promise.all(idleWorkers.map((w) => this.#terminateWorker(w)));
542
+ }
543
+ }
544
+ /**
545
+ * Convenience function to get the singleton pool instance.
546
+ *
547
+ * @param config - Optional configuration
548
+ * @returns The singleton pool instance
549
+ */
550
+ export function getSigningPool(config) {
551
+ return WorkerSigningPool.getInstance(config);
552
+ }
553
+ //# sourceMappingURL=WorkerSigningPool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorkerSigningPool.js","sourceRoot":"","sources":["../../src/workers/WorkerSigningPool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,124 @@
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 type { WorkerPoolConfig, SigningTask, ParallelSignerKeyPair, ParallelSigningResult } from './types.js';
10
+ /**
11
+ * ECC library types for Node.js worker.
12
+ */
13
+ export declare const NodeEccLibrary: {
14
+ /** Pure JS @noble/secp256k1 (default, ~12KB) */
15
+ readonly Noble: "noble";
16
+ /** WASM-based tiny-secp256k1 (faster, ~1.2MB) */
17
+ readonly TinySecp256k1: "tiny-secp256k1";
18
+ };
19
+ export type NodeEccLibrary = (typeof NodeEccLibrary)[keyof typeof NodeEccLibrary];
20
+ /**
21
+ * Extended configuration for Node.js worker pool.
22
+ */
23
+ export interface NodeWorkerPoolConfig extends WorkerPoolConfig {
24
+ /**
25
+ * ECC library type for signing.
26
+ * - NodeEccLibrary.Noble: Pure JS @noble/secp256k1 (default, ~12KB)
27
+ * - NodeEccLibrary.TinySecp256k1: WASM-based tiny-secp256k1 (faster)
28
+ *
29
+ * Default: NodeEccLibrary.Noble
30
+ */
31
+ readonly eccLibrary?: NodeEccLibrary;
32
+ }
33
+ /**
34
+ * Worker-based parallel signing pool for Node.js.
35
+ *
36
+ * Uses worker_threads for true parallel execution.
37
+ * Provides secure key handling with immediate zeroing after use.
38
+ *
39
+ * @example
40
+ * ```typescript
41
+ * import { NodeWorkerSigningPool } from '@btc-vision/bitcoin/workers';
42
+ *
43
+ * // Initialize pool at app startup
44
+ * const pool = NodeWorkerSigningPool.getInstance({ workerCount: 4 });
45
+ * pool.preserveWorkers();
46
+ *
47
+ * // Sign batch
48
+ * const result = await pool.signBatch(tasks, keyPair);
49
+ *
50
+ * // Cleanup at app shutdown
51
+ * await pool.shutdown();
52
+ * ```
53
+ */
54
+ export declare class NodeWorkerSigningPool {
55
+ #private;
56
+ /**
57
+ * Creates a new NodeWorkerSigningPool.
58
+ *
59
+ * @param config - Pool configuration
60
+ */
61
+ private constructor();
62
+ /**
63
+ * Gets the singleton pool instance.
64
+ *
65
+ * @param config - Optional configuration (only used on first call)
66
+ * @returns The singleton pool instance
67
+ */
68
+ static getInstance(config?: NodeWorkerPoolConfig): NodeWorkerSigningPool;
69
+ /**
70
+ * Resets the singleton instance (for testing).
71
+ */
72
+ static resetInstance(): void;
73
+ /**
74
+ * Number of workers in the pool.
75
+ */
76
+ get workerCount(): number;
77
+ /**
78
+ * Number of idle workers available.
79
+ */
80
+ get idleWorkerCount(): number;
81
+ /**
82
+ * Number of busy workers.
83
+ */
84
+ get busyWorkerCount(): number;
85
+ /**
86
+ * Whether workers are being preserved between batches.
87
+ */
88
+ get isPreservingWorkers(): boolean;
89
+ /**
90
+ * Enables worker preservation between signing batches.
91
+ */
92
+ preserveWorkers(): void;
93
+ /**
94
+ * Disables worker preservation.
95
+ */
96
+ releaseWorkers(): void;
97
+ /**
98
+ * Initializes the worker pool.
99
+ *
100
+ * @returns Promise that resolves when all workers are ready
101
+ */
102
+ initialize(): Promise<void>;
103
+ /**
104
+ * Signs a batch of tasks in parallel.
105
+ *
106
+ * Tasks are distributed across workers and processed in batches for efficiency.
107
+ *
108
+ * @param tasks - Signing tasks
109
+ * @param keyPair - Key pair with getPrivateKey() method
110
+ * @returns Promise resolving to signing results
111
+ */
112
+ signBatch(tasks: readonly SigningTask[], keyPair: ParallelSignerKeyPair): Promise<ParallelSigningResult>;
113
+ /**
114
+ * Shuts down the pool and terminates all workers.
115
+ *
116
+ * @returns Promise that resolves when all workers are terminated
117
+ */
118
+ shutdown(): Promise<void>;
119
+ }
120
+ /**
121
+ * Convenience function to get the singleton pool instance.
122
+ */
123
+ export declare function getNodeSigningPool(config?: NodeWorkerPoolConfig): NodeWorkerSigningPool;
124
+ //# sourceMappingURL=WorkerSigningPool.node.d.ts.map