@btc-vision/bitcoin 7.0.0-alpha.3 → 7.0.0-alpha.4

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 (96) hide show
  1. package/README.md +139 -12
  2. package/browser/chunks/WorkerSigningPool.sequential-DHha7j0b.js +113 -0
  3. package/browser/env.d.ts +13 -0
  4. package/browser/env.d.ts.map +1 -0
  5. package/browser/index.d.ts +1 -1
  6. package/browser/index.d.ts.map +1 -1
  7. package/browser/index.js +872 -1105
  8. package/browser/io/index.d.ts +0 -1
  9. package/browser/io/index.d.ts.map +1 -1
  10. package/browser/types.d.ts.map +1 -1
  11. package/browser/workers/WorkerSigningPool.d.ts +6 -0
  12. package/browser/workers/WorkerSigningPool.d.ts.map +1 -1
  13. package/browser/workers/WorkerSigningPool.node.d.ts +6 -0
  14. package/browser/workers/WorkerSigningPool.node.d.ts.map +1 -1
  15. package/browser/workers/WorkerSigningPool.sequential.d.ts +69 -0
  16. package/browser/workers/WorkerSigningPool.sequential.d.ts.map +1 -0
  17. package/browser/workers/WorkerSigningPool.worklet.d.ts +64 -0
  18. package/browser/workers/WorkerSigningPool.worklet.d.ts.map +1 -0
  19. package/browser/workers/index.d.ts +2 -2
  20. package/browser/workers/index.d.ts.map +1 -1
  21. package/browser/workers/index.react-native.d.ts +28 -0
  22. package/browser/workers/index.react-native.d.ts.map +1 -0
  23. package/browser/workers/psbt-parallel.d.ts +2 -3
  24. package/browser/workers/psbt-parallel.d.ts.map +1 -1
  25. package/browser/workers/types.d.ts +12 -0
  26. package/browser/workers/types.d.ts.map +1 -1
  27. package/build/env.d.ts +13 -0
  28. package/build/env.d.ts.map +1 -0
  29. package/build/env.js +198 -0
  30. package/build/env.js.map +1 -0
  31. package/build/index.d.ts +2 -1
  32. package/build/index.d.ts.map +1 -1
  33. package/build/index.js +2 -1
  34. package/build/index.js.map +1 -1
  35. package/build/io/index.d.ts +0 -1
  36. package/build/io/index.d.ts.map +1 -1
  37. package/build/io/index.js +0 -2
  38. package/build/io/index.js.map +1 -1
  39. package/build/tsconfig.build.tsbuildinfo +1 -1
  40. package/build/types.d.ts.map +1 -1
  41. package/build/types.js +2 -16
  42. package/build/types.js.map +1 -1
  43. package/build/workers/WorkerSigningPool.d.ts +6 -0
  44. package/build/workers/WorkerSigningPool.d.ts.map +1 -1
  45. package/build/workers/WorkerSigningPool.js +8 -0
  46. package/build/workers/WorkerSigningPool.js.map +1 -1
  47. package/build/workers/WorkerSigningPool.node.d.ts +6 -0
  48. package/build/workers/WorkerSigningPool.node.d.ts.map +1 -1
  49. package/build/workers/WorkerSigningPool.node.js +9 -2
  50. package/build/workers/WorkerSigningPool.node.js.map +1 -1
  51. package/build/workers/WorkerSigningPool.sequential.d.ts +78 -0
  52. package/build/workers/WorkerSigningPool.sequential.d.ts.map +1 -0
  53. package/build/workers/WorkerSigningPool.sequential.js +160 -0
  54. package/build/workers/WorkerSigningPool.sequential.js.map +1 -0
  55. package/build/workers/WorkerSigningPool.worklet.d.ts +79 -0
  56. package/build/workers/WorkerSigningPool.worklet.d.ts.map +1 -0
  57. package/build/workers/WorkerSigningPool.worklet.js +388 -0
  58. package/build/workers/WorkerSigningPool.worklet.js.map +1 -0
  59. package/build/workers/index.d.ts +2 -2
  60. package/build/workers/index.d.ts.map +1 -1
  61. package/build/workers/index.js +9 -0
  62. package/build/workers/index.js.map +1 -1
  63. package/build/workers/index.react-native.d.ts +28 -0
  64. package/build/workers/index.react-native.d.ts.map +1 -0
  65. package/build/workers/index.react-native.js +67 -0
  66. package/build/workers/index.react-native.js.map +1 -0
  67. package/build/workers/psbt-parallel.d.ts +2 -3
  68. package/build/workers/psbt-parallel.d.ts.map +1 -1
  69. package/build/workers/psbt-parallel.js +4 -4
  70. package/build/workers/psbt-parallel.js.map +1 -1
  71. package/build/workers/types.d.ts +12 -0
  72. package/build/workers/types.d.ts.map +1 -1
  73. package/package.json +11 -1
  74. package/src/env.ts +237 -0
  75. package/src/index.ts +1 -2
  76. package/src/io/index.ts +0 -3
  77. package/src/types.ts +4 -27
  78. package/src/workers/WorkerSigningPool.node.ts +10 -2
  79. package/src/workers/WorkerSigningPool.sequential.ts +190 -0
  80. package/src/workers/WorkerSigningPool.ts +9 -0
  81. package/src/workers/WorkerSigningPool.worklet.ts +519 -0
  82. package/src/workers/index.react-native.ts +110 -0
  83. package/src/workers/index.ts +10 -1
  84. package/src/workers/psbt-parallel.ts +8 -8
  85. package/src/workers/types.ts +16 -0
  86. package/test/env.spec.ts +418 -0
  87. package/test/workers-pool.spec.ts +43 -0
  88. package/test/workers-sequential.spec.ts +669 -0
  89. package/test/workers-worklet.spec.ts +500 -0
  90. package/browser/io/MemoryPool.d.ts +0 -220
  91. package/browser/io/MemoryPool.d.ts.map +0 -1
  92. package/build/io/MemoryPool.d.ts +0 -220
  93. package/build/io/MemoryPool.d.ts.map +0 -1
  94. package/build/io/MemoryPool.js +0 -309
  95. package/build/io/MemoryPool.js.map +0 -1
  96. package/src/io/MemoryPool.ts +0 -343
@@ -0,0 +1,190 @@
1
+ /**
2
+ * Sequential signing pool for environments without worker support (React Native).
3
+ *
4
+ * Signs inputs one-by-one on the main thread using the CryptoBackend
5
+ * from EccContext. Same API shape as WorkerSigningPool so consumers
6
+ * can swap transparently.
7
+ *
8
+ * @packageDocumentation
9
+ */
10
+
11
+ import type {
12
+ ParallelSignerKeyPair,
13
+ ParallelSigningResult,
14
+ SigningResultMessage,
15
+ SigningTask,
16
+ WorkerPoolConfig,
17
+ } from './types.js';
18
+ import { SignatureType } from './types.js';
19
+ import { EccContext } from '../ecc/context.js';
20
+ import type { MessageHash, PrivateKey } from '@btc-vision/ecpair';
21
+
22
+ /**
23
+ * Sequential signing pool — signs inputs one-by-one on the main thread.
24
+ *
25
+ * Provides the same public API as WorkerSigningPool but without any
26
+ * threading. Intended for React Native or other environments where
27
+ * Web Workers and worker_threads are unavailable.
28
+ *
29
+ * @example
30
+ * ```typescript
31
+ * import { SequentialSigningPool } from '@btc-vision/bitcoin/workers';
32
+ *
33
+ * const pool = SequentialSigningPool.getInstance();
34
+ * const result = await pool.signBatch(tasks, keyPair);
35
+ * ```
36
+ */
37
+ export class SequentialSigningPool {
38
+ static #instance: SequentialSigningPool | null = null;
39
+
40
+ private constructor(_config: WorkerPoolConfig = {}) {
41
+ // Config accepted for API compatibility but not used —
42
+ // sequential pool has no workers to configure.
43
+ }
44
+
45
+ /**
46
+ * Number of workers — always 0 for sequential pool.
47
+ */
48
+ public get workerCount(): number {
49
+ return 0;
50
+ }
51
+
52
+ /**
53
+ * Idle workers — always 0.
54
+ */
55
+ public get idleWorkerCount(): number {
56
+ return 0;
57
+ }
58
+
59
+ /**
60
+ * Busy workers — always 0.
61
+ */
62
+ public get busyWorkerCount(): number {
63
+ return 0;
64
+ }
65
+
66
+ /**
67
+ * Whether workers are preserved — always false (no workers to preserve).
68
+ */
69
+ public get isPreservingWorkers(): boolean {
70
+ return false;
71
+ }
72
+
73
+ /**
74
+ * Gets the singleton instance.
75
+ */
76
+ public static getInstance(config?: WorkerPoolConfig): SequentialSigningPool {
77
+ if (!SequentialSigningPool.#instance) {
78
+ SequentialSigningPool.#instance = new SequentialSigningPool(config);
79
+ }
80
+ return SequentialSigningPool.#instance;
81
+ }
82
+
83
+ /**
84
+ * Resets the singleton instance (for testing).
85
+ */
86
+ public static resetInstance(): void {
87
+ SequentialSigningPool.#instance = null;
88
+ }
89
+
90
+ /**
91
+ * No-op — no workers to preserve.
92
+ */
93
+ public preserveWorkers(): void {
94
+ // No-op: no workers to preserve
95
+ }
96
+
97
+ /**
98
+ * No-op — no workers to release.
99
+ */
100
+ public releaseWorkers(): void {
101
+ // No-op
102
+ }
103
+
104
+ /**
105
+ * No-op — no initialization required.
106
+ */
107
+ public async initialize(): Promise<void> {
108
+ // No-op: nothing to initialize
109
+ }
110
+
111
+ /**
112
+ * Signs tasks sequentially on the main thread.
113
+ */
114
+ // eslint-disable-next-line @typescript-eslint/require-await
115
+ public async signBatch(
116
+ tasks: readonly SigningTask[],
117
+ keyPair: ParallelSignerKeyPair,
118
+ ): Promise<ParallelSigningResult> {
119
+ const startTime = performance.now();
120
+
121
+ if (tasks.length === 0) {
122
+ return {
123
+ success: true,
124
+ signatures: new Map(),
125
+ errors: new Map(),
126
+ durationMs: performance.now() - startTime,
127
+ };
128
+ }
129
+
130
+ const ecc = EccContext.get().lib;
131
+ const privateKey = keyPair.getPrivateKey();
132
+
133
+ const signatures = new Map<number, SigningResultMessage>();
134
+ const errors = new Map<number, string>();
135
+
136
+ try {
137
+ for (const task of tasks) {
138
+ try {
139
+ let signature: Uint8Array;
140
+
141
+ const hash = task.hash as MessageHash;
142
+ const key = privateKey as PrivateKey;
143
+
144
+ if (task.signatureType === SignatureType.Schnorr) {
145
+ signature = ecc.signSchnorr!(hash, key);
146
+ } else {
147
+ signature = ecc.sign(hash, key);
148
+ }
149
+
150
+ signatures.set(task.inputIndex, {
151
+ type: 'result',
152
+ taskId: task.taskId,
153
+ signature,
154
+ inputIndex: task.inputIndex,
155
+ publicKey: keyPair.publicKey,
156
+ signatureType: task.signatureType,
157
+ leafHash: task.leafHash,
158
+ });
159
+ } catch (err: unknown) {
160
+ const message = err instanceof Error ? err.message : 'Signing failed';
161
+ errors.set(task.inputIndex, message);
162
+ }
163
+ }
164
+ } finally {
165
+ // SECURITY: Zero the private key
166
+ privateKey.fill(0);
167
+ }
168
+
169
+ return {
170
+ success: errors.size === 0,
171
+ signatures,
172
+ errors,
173
+ durationMs: performance.now() - startTime,
174
+ };
175
+ }
176
+
177
+ /**
178
+ * No-op — no workers to shut down.
179
+ */
180
+ public async shutdown(): Promise<void> {
181
+ // No-op: nothing to shut down
182
+ }
183
+
184
+ /**
185
+ * Enables `await using pool = ...` syntax.
186
+ */
187
+ public async [Symbol.asyncDispose](): Promise<void> {
188
+ await this.shutdown();
189
+ }
190
+ }
@@ -389,6 +389,15 @@ export class WorkerSigningPool {
389
389
  }
390
390
  }
391
391
 
392
+ /**
393
+ * Disposes of the pool by shutting down all workers.
394
+ *
395
+ * Enables `await using pool = ...` syntax for automatic cleanup.
396
+ */
397
+ public async [Symbol.asyncDispose](): Promise<void> {
398
+ await this.shutdown();
399
+ }
400
+
392
401
  /**
393
402
  * Shuts down the pool and terminates all workers.
394
403
  *