@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.
- package/README.md +139 -12
- package/browser/chunks/WorkerSigningPool.sequential-DHha7j0b.js +113 -0
- package/browser/env.d.ts +13 -0
- package/browser/env.d.ts.map +1 -0
- package/browser/index.d.ts +1 -1
- package/browser/index.d.ts.map +1 -1
- package/browser/index.js +872 -1105
- package/browser/io/index.d.ts +0 -1
- package/browser/io/index.d.ts.map +1 -1
- package/browser/types.d.ts.map +1 -1
- package/browser/workers/WorkerSigningPool.d.ts +6 -0
- package/browser/workers/WorkerSigningPool.d.ts.map +1 -1
- package/browser/workers/WorkerSigningPool.node.d.ts +6 -0
- package/browser/workers/WorkerSigningPool.node.d.ts.map +1 -1
- package/browser/workers/WorkerSigningPool.sequential.d.ts +69 -0
- package/browser/workers/WorkerSigningPool.sequential.d.ts.map +1 -0
- package/browser/workers/WorkerSigningPool.worklet.d.ts +64 -0
- package/browser/workers/WorkerSigningPool.worklet.d.ts.map +1 -0
- package/browser/workers/index.d.ts +2 -2
- package/browser/workers/index.d.ts.map +1 -1
- package/browser/workers/index.react-native.d.ts +28 -0
- package/browser/workers/index.react-native.d.ts.map +1 -0
- package/browser/workers/psbt-parallel.d.ts +2 -3
- package/browser/workers/psbt-parallel.d.ts.map +1 -1
- package/browser/workers/types.d.ts +12 -0
- package/browser/workers/types.d.ts.map +1 -1
- package/build/env.d.ts +13 -0
- package/build/env.d.ts.map +1 -0
- package/build/env.js +198 -0
- package/build/env.js.map +1 -0
- package/build/index.d.ts +2 -1
- package/build/index.d.ts.map +1 -1
- package/build/index.js +2 -1
- package/build/index.js.map +1 -1
- package/build/io/index.d.ts +0 -1
- package/build/io/index.d.ts.map +1 -1
- package/build/io/index.js +0 -2
- package/build/io/index.js.map +1 -1
- package/build/tsconfig.build.tsbuildinfo +1 -1
- package/build/types.d.ts.map +1 -1
- package/build/types.js +2 -16
- package/build/types.js.map +1 -1
- package/build/workers/WorkerSigningPool.d.ts +6 -0
- package/build/workers/WorkerSigningPool.d.ts.map +1 -1
- package/build/workers/WorkerSigningPool.js +8 -0
- package/build/workers/WorkerSigningPool.js.map +1 -1
- package/build/workers/WorkerSigningPool.node.d.ts +6 -0
- package/build/workers/WorkerSigningPool.node.d.ts.map +1 -1
- package/build/workers/WorkerSigningPool.node.js +9 -2
- package/build/workers/WorkerSigningPool.node.js.map +1 -1
- package/build/workers/WorkerSigningPool.sequential.d.ts +78 -0
- package/build/workers/WorkerSigningPool.sequential.d.ts.map +1 -0
- package/build/workers/WorkerSigningPool.sequential.js +160 -0
- package/build/workers/WorkerSigningPool.sequential.js.map +1 -0
- package/build/workers/WorkerSigningPool.worklet.d.ts +79 -0
- package/build/workers/WorkerSigningPool.worklet.d.ts.map +1 -0
- package/build/workers/WorkerSigningPool.worklet.js +388 -0
- package/build/workers/WorkerSigningPool.worklet.js.map +1 -0
- package/build/workers/index.d.ts +2 -2
- package/build/workers/index.d.ts.map +1 -1
- package/build/workers/index.js +9 -0
- package/build/workers/index.js.map +1 -1
- package/build/workers/index.react-native.d.ts +28 -0
- package/build/workers/index.react-native.d.ts.map +1 -0
- package/build/workers/index.react-native.js +67 -0
- package/build/workers/index.react-native.js.map +1 -0
- package/build/workers/psbt-parallel.d.ts +2 -3
- package/build/workers/psbt-parallel.d.ts.map +1 -1
- package/build/workers/psbt-parallel.js +4 -4
- package/build/workers/psbt-parallel.js.map +1 -1
- package/build/workers/types.d.ts +12 -0
- package/build/workers/types.d.ts.map +1 -1
- package/package.json +11 -1
- package/src/env.ts +237 -0
- package/src/index.ts +1 -2
- package/src/io/index.ts +0 -3
- package/src/types.ts +4 -27
- package/src/workers/WorkerSigningPool.node.ts +10 -2
- package/src/workers/WorkerSigningPool.sequential.ts +190 -0
- package/src/workers/WorkerSigningPool.ts +9 -0
- package/src/workers/WorkerSigningPool.worklet.ts +519 -0
- package/src/workers/index.react-native.ts +110 -0
- package/src/workers/index.ts +10 -1
- package/src/workers/psbt-parallel.ts +8 -8
- package/src/workers/types.ts +16 -0
- package/test/env.spec.ts +418 -0
- package/test/workers-pool.spec.ts +43 -0
- package/test/workers-sequential.spec.ts +669 -0
- package/test/workers-worklet.spec.ts +500 -0
- package/browser/io/MemoryPool.d.ts +0 -220
- package/browser/io/MemoryPool.d.ts.map +0 -1
- package/build/io/MemoryPool.d.ts +0 -220
- package/build/io/MemoryPool.d.ts.map +0 -1
- package/build/io/MemoryPool.js +0 -309
- package/build/io/MemoryPool.js.map +0 -1
- 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
|
*
|