@btc-vision/bitcoin 7.0.0-alpha.2 → 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 +455 -155
- package/browser/chunks/WorkerSigningPool.sequential-DHha7j0b.js +113 -0
- package/browser/ecc/context.d.ts +22 -21
- package/browser/ecc/context.d.ts.map +1 -1
- package/browser/ecc/index.d.ts +1 -1
- package/browser/ecc/index.d.ts.map +1 -1
- package/browser/ecc/types.d.ts +10 -123
- package/browser/ecc/types.d.ts.map +1 -1
- package/browser/env.d.ts +13 -0
- package/browser/env.d.ts.map +1 -0
- package/browser/index.d.ts +3 -3
- package/browser/index.d.ts.map +1 -1
- package/browser/index.js +5790 -4295
- package/browser/io/index.d.ts +0 -1
- package/browser/io/index.d.ts.map +1 -1
- package/browser/payments/p2tr.d.ts.map +1 -1
- package/browser/psbt/types.d.ts +2 -68
- package/browser/psbt/types.d.ts.map +1 -1
- package/browser/psbt.d.ts +9 -11
- package/browser/psbt.d.ts.map +1 -1
- package/browser/types.d.ts +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/ecc/context.d.ts +22 -21
- package/build/ecc/context.d.ts.map +1 -1
- package/build/ecc/context.js +19 -114
- package/build/ecc/context.js.map +1 -1
- package/build/ecc/index.d.ts +1 -1
- package/build/ecc/index.d.ts.map +1 -1
- package/build/ecc/types.d.ts +7 -126
- package/build/ecc/types.d.ts.map +1 -1
- package/build/ecc/types.js +4 -1
- package/build/ecc/types.js.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 +4 -3
- 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/payments/p2tr.d.ts.map +1 -1
- package/build/payments/p2tr.js +2 -3
- package/build/payments/p2tr.js.map +1 -1
- package/build/psbt/types.d.ts +2 -68
- package/build/psbt/types.d.ts.map +1 -1
- package/build/psbt.d.ts +9 -11
- package/build/psbt.d.ts.map +1 -1
- package/build/psbt.js +38 -53
- package/build/psbt.js.map +1 -1
- package/build/tsconfig.build.tsbuildinfo +1 -1
- package/build/types.d.ts +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 +14 -4
- package/src/ecc/context.ts +26 -147
- package/src/ecc/index.ts +2 -2
- package/src/ecc/types.ts +7 -138
- package/src/env.ts +237 -0
- package/src/index.ts +2 -4
- package/src/io/index.ts +0 -3
- package/src/payments/p2tr.ts +2 -2
- package/src/psbt/types.ts +2 -84
- package/src/psbt.ts +63 -121
- package/src/types.ts +5 -28
- 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,388 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Worklet-based parallel signing pool for React Native.
|
|
3
|
+
*
|
|
4
|
+
* Uses `react-native-worklets` (Software Mansion v0.7+) to run signing
|
|
5
|
+
* operations in parallel across multiple worklet runtimes.
|
|
6
|
+
* Each runtime gets its own ECC module instance via eval of the bundled
|
|
7
|
+
* @noble/secp256k1 IIFE string.
|
|
8
|
+
*
|
|
9
|
+
* SECURITY ARCHITECTURE:
|
|
10
|
+
* - Private keys are cloned per-runtime (structuredClone semantics)
|
|
11
|
+
* - Keys are zeroed inside worklet AND in main thread finally block
|
|
12
|
+
* - Tainted runtimes (timeout) are replaced, not reused
|
|
13
|
+
*
|
|
14
|
+
* @packageDocumentation
|
|
15
|
+
*/
|
|
16
|
+
import { SignatureType } from './types.js';
|
|
17
|
+
/**
|
|
18
|
+
* Default configuration for the worklet pool.
|
|
19
|
+
*/
|
|
20
|
+
const DEFAULT_CONFIG = {
|
|
21
|
+
workerCount: 4,
|
|
22
|
+
taskTimeoutMs: 30000,
|
|
23
|
+
maxKeyHoldTimeMs: 5000,
|
|
24
|
+
verifySignatures: true,
|
|
25
|
+
preserveWorkers: false,
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* Worklet-based parallel signing pool for React Native.
|
|
29
|
+
*
|
|
30
|
+
* Mirrors the API of WorkerSigningPool (browser) but uses
|
|
31
|
+
* `react-native-worklets` runtimes instead of Web Workers.
|
|
32
|
+
* `runOnRuntime()` returns a Promise directly — no postMessage protocol.
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* ```typescript
|
|
36
|
+
* import { WorkletSigningPool } from '@btc-vision/bitcoin/workers';
|
|
37
|
+
*
|
|
38
|
+
* const pool = WorkletSigningPool.getInstance();
|
|
39
|
+
* pool.preserveWorkers();
|
|
40
|
+
*
|
|
41
|
+
* const result = await pool.signBatch(tasks, keyPair);
|
|
42
|
+
* await pool.shutdown();
|
|
43
|
+
* ```
|
|
44
|
+
*/
|
|
45
|
+
export class WorkletSigningPool {
|
|
46
|
+
static #instance = null;
|
|
47
|
+
#config;
|
|
48
|
+
#runtimes = [];
|
|
49
|
+
#workletsModule = null;
|
|
50
|
+
#eccBundleCode = null;
|
|
51
|
+
#preserveWorkers = false;
|
|
52
|
+
#nextRuntimeId = 0;
|
|
53
|
+
#initialized = false;
|
|
54
|
+
#shuttingDown = false;
|
|
55
|
+
/**
|
|
56
|
+
* Whether Uint8Array survives worklet boundary.
|
|
57
|
+
* Detected during initialize(); if false, we encode as number[].
|
|
58
|
+
*/
|
|
59
|
+
#uint8ArraySupported = true;
|
|
60
|
+
constructor(config = {}) {
|
|
61
|
+
this.#config = { ...DEFAULT_CONFIG, ...config };
|
|
62
|
+
this.#preserveWorkers = this.#config.preserveWorkers;
|
|
63
|
+
}
|
|
64
|
+
/** Number of active runtimes. */
|
|
65
|
+
get workerCount() {
|
|
66
|
+
return this.#runtimes.length;
|
|
67
|
+
}
|
|
68
|
+
/** Idle runtimes (all non-tainted). */
|
|
69
|
+
get idleWorkerCount() {
|
|
70
|
+
return this.#runtimes.filter((r) => !r.tainted).length;
|
|
71
|
+
}
|
|
72
|
+
/** Busy runtimes — always 0 outside of signBatch. */
|
|
73
|
+
get busyWorkerCount() {
|
|
74
|
+
return 0;
|
|
75
|
+
}
|
|
76
|
+
/** Whether runtimes are preserved between batches. */
|
|
77
|
+
get isPreservingWorkers() {
|
|
78
|
+
return this.#preserveWorkers;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Gets the singleton pool instance.
|
|
82
|
+
*
|
|
83
|
+
* @param config - Optional configuration (only used on first call)
|
|
84
|
+
*/
|
|
85
|
+
static getInstance(config) {
|
|
86
|
+
if (!WorkletSigningPool.#instance) {
|
|
87
|
+
WorkletSigningPool.#instance = new WorkletSigningPool(config);
|
|
88
|
+
}
|
|
89
|
+
return WorkletSigningPool.#instance;
|
|
90
|
+
}
|
|
91
|
+
/** Resets the singleton instance (for testing). */
|
|
92
|
+
static resetInstance() {
|
|
93
|
+
if (WorkletSigningPool.#instance) {
|
|
94
|
+
WorkletSigningPool.#instance.shutdown().catch(() => { });
|
|
95
|
+
WorkletSigningPool.#instance = null;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
/** Enable runtime preservation between signing batches. */
|
|
99
|
+
preserveWorkers() {
|
|
100
|
+
this.#preserveWorkers = true;
|
|
101
|
+
}
|
|
102
|
+
/** Disable runtime preservation. */
|
|
103
|
+
releaseWorkers() {
|
|
104
|
+
this.#preserveWorkers = false;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Initializes the worklet pool.
|
|
108
|
+
*
|
|
109
|
+
* Dynamically imports `react-native-worklets`, creates N runtimes,
|
|
110
|
+
* and injects the ECC bundle into each via eval.
|
|
111
|
+
*
|
|
112
|
+
* @throws If `react-native-worklets` is not installed or eval fails
|
|
113
|
+
*/
|
|
114
|
+
async initialize() {
|
|
115
|
+
if (this.#initialized) {
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
if (this.#shuttingDown) {
|
|
119
|
+
throw new Error('Cannot initialize pool while shutting down');
|
|
120
|
+
}
|
|
121
|
+
// Lazy dynamic import — module loads even without the dep
|
|
122
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
123
|
+
const worklets = await import('react-native-worklets');
|
|
124
|
+
this.#workletsModule = worklets;
|
|
125
|
+
// Load ECC bundle
|
|
126
|
+
const { ECC_BUNDLE } = await import('./ecc-bundle.js');
|
|
127
|
+
this.#eccBundleCode = ECC_BUNDLE;
|
|
128
|
+
// Create runtimes and inject ECC
|
|
129
|
+
for (let i = 0; i < this.#config.workerCount; i++) {
|
|
130
|
+
await this.#createRuntime();
|
|
131
|
+
}
|
|
132
|
+
// Feature-detect Uint8Array support across worklet boundary
|
|
133
|
+
const firstRuntime = this.#runtimes[0];
|
|
134
|
+
if (firstRuntime) {
|
|
135
|
+
try {
|
|
136
|
+
const result = await this.#workletsModule.runOnRuntime(firstRuntime.runtime, () => {
|
|
137
|
+
const arr = new Uint8Array([1, 2, 3]);
|
|
138
|
+
return arr instanceof Uint8Array;
|
|
139
|
+
});
|
|
140
|
+
this.#uint8ArraySupported = result;
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
this.#uint8ArraySupported = false;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
this.#initialized = true;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Signs a batch of tasks in parallel across worklet runtimes.
|
|
150
|
+
*
|
|
151
|
+
* SECURITY: Private keys are cloned per-runtime and zeroed both
|
|
152
|
+
* inside the worklet and in the main thread finally block.
|
|
153
|
+
*/
|
|
154
|
+
async signBatch(tasks, keyPair) {
|
|
155
|
+
const startTime = performance.now();
|
|
156
|
+
if (!this.#initialized) {
|
|
157
|
+
await this.initialize();
|
|
158
|
+
}
|
|
159
|
+
if (tasks.length === 0) {
|
|
160
|
+
return {
|
|
161
|
+
success: true,
|
|
162
|
+
signatures: new Map(),
|
|
163
|
+
errors: new Map(),
|
|
164
|
+
durationMs: performance.now() - startTime,
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
// Distribute tasks round-robin
|
|
168
|
+
const runtimeCount = Math.min(this.#runtimes.length, tasks.length);
|
|
169
|
+
const taskBatches = Array.from({ length: runtimeCount }, () => []);
|
|
170
|
+
for (let i = 0; i < tasks.length; i++) {
|
|
171
|
+
const batch = taskBatches[i % runtimeCount];
|
|
172
|
+
const task = tasks[i];
|
|
173
|
+
if (batch && task) {
|
|
174
|
+
batch.push(task);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
const privateKey = keyPair.getPrivateKey();
|
|
178
|
+
try {
|
|
179
|
+
const batchResults = await Promise.allSettled(taskBatches.map((batch, index) => this.#signBatchOnRuntime(batch, privateKey, keyPair.publicKey, index)));
|
|
180
|
+
const signatures = new Map();
|
|
181
|
+
const errors = new Map();
|
|
182
|
+
for (let i = 0; i < batchResults.length; i++) {
|
|
183
|
+
const result = batchResults[i];
|
|
184
|
+
if (!result)
|
|
185
|
+
continue;
|
|
186
|
+
if (result.status === 'fulfilled') {
|
|
187
|
+
for (const sig of result.value.signatures) {
|
|
188
|
+
signatures.set(sig.inputIndex, sig);
|
|
189
|
+
}
|
|
190
|
+
for (const [idx, errMsg] of result.value.errors) {
|
|
191
|
+
errors.set(idx, errMsg);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
else {
|
|
195
|
+
const reason = result.reason;
|
|
196
|
+
const errorMsg = reason?.message ?? 'Worklet batch signing failed';
|
|
197
|
+
const failedBatch = taskBatches[i];
|
|
198
|
+
if (failedBatch) {
|
|
199
|
+
for (const task of failedBatch) {
|
|
200
|
+
errors.set(task.inputIndex, errorMsg);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
// Cleanup runtimes if not preserving
|
|
206
|
+
if (!this.#preserveWorkers) {
|
|
207
|
+
await this.shutdown();
|
|
208
|
+
}
|
|
209
|
+
return {
|
|
210
|
+
success: errors.size === 0,
|
|
211
|
+
signatures,
|
|
212
|
+
errors,
|
|
213
|
+
durationMs: performance.now() - startTime,
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
finally {
|
|
217
|
+
// SECURITY: Zero the key in main thread
|
|
218
|
+
privateKey.fill(0);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
/** Shuts down all runtimes. */
|
|
222
|
+
// eslint-disable-next-line @typescript-eslint/require-await
|
|
223
|
+
async shutdown() {
|
|
224
|
+
if (this.#shuttingDown) {
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
227
|
+
this.#shuttingDown = true;
|
|
228
|
+
// Worklet runtimes don't have a destroy() — clear references for GC
|
|
229
|
+
this.#runtimes.length = 0;
|
|
230
|
+
this.#workletsModule = null;
|
|
231
|
+
this.#eccBundleCode = null;
|
|
232
|
+
this.#initialized = false;
|
|
233
|
+
this.#shuttingDown = false;
|
|
234
|
+
}
|
|
235
|
+
/** Enables `await using pool = ...` syntax. */
|
|
236
|
+
async [Symbol.asyncDispose]() {
|
|
237
|
+
await this.shutdown();
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Creates a new worklet runtime and injects the ECC bundle.
|
|
241
|
+
*/
|
|
242
|
+
async #createRuntime() {
|
|
243
|
+
if (!this.#workletsModule || !this.#eccBundleCode) {
|
|
244
|
+
throw new Error('Worklets module or ECC bundle not loaded');
|
|
245
|
+
}
|
|
246
|
+
const id = this.#nextRuntimeId++;
|
|
247
|
+
const runtime = this.#workletsModule.createWorkletRuntime(`signing-runtime-${id}`);
|
|
248
|
+
// Inject ECC bundle into the worklet runtime.
|
|
249
|
+
// The bundle declares `var nobleBundle = (()=>{...})()` with "use strict",
|
|
250
|
+
// so a plain eval won't leak it to globalThis. We use `new Function` to
|
|
251
|
+
// execute the bundle and then explicitly assign the result.
|
|
252
|
+
const bundleCode = this.#eccBundleCode;
|
|
253
|
+
await this.#workletsModule.runOnRuntime(runtime, () => {
|
|
254
|
+
'worklet';
|
|
255
|
+
// eslint-disable-next-line @typescript-eslint/no-implied-eval
|
|
256
|
+
const fn = new Function(bundleCode + '; return nobleBundle;');
|
|
257
|
+
globalThis['nobleBundle'] = fn();
|
|
258
|
+
});
|
|
259
|
+
const pooled = { id, runtime, tainted: false };
|
|
260
|
+
this.#runtimes.push(pooled);
|
|
261
|
+
return pooled;
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Replaces a tainted runtime with a fresh one.
|
|
265
|
+
*/
|
|
266
|
+
async #replaceRuntime(pooled) {
|
|
267
|
+
const idx = this.#runtimes.indexOf(pooled);
|
|
268
|
+
if (idx >= 0) {
|
|
269
|
+
this.#runtimes.splice(idx, 1);
|
|
270
|
+
}
|
|
271
|
+
try {
|
|
272
|
+
await this.#createRuntime();
|
|
273
|
+
}
|
|
274
|
+
catch {
|
|
275
|
+
// If replacement fails, pool continues with fewer runtimes
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Signs a batch of tasks on a specific runtime.
|
|
280
|
+
*/
|
|
281
|
+
async #signBatchOnRuntime(tasks, privateKey, publicKey, runtimeIndex) {
|
|
282
|
+
if (tasks.length === 0) {
|
|
283
|
+
return { signatures: [], errors: new Map() };
|
|
284
|
+
}
|
|
285
|
+
const pooled = this.#runtimes[runtimeIndex];
|
|
286
|
+
if (!pooled || pooled.tainted) {
|
|
287
|
+
throw new Error(`Runtime ${runtimeIndex} unavailable or tainted`);
|
|
288
|
+
}
|
|
289
|
+
if (!this.#workletsModule) {
|
|
290
|
+
throw new Error('Worklets module not loaded');
|
|
291
|
+
}
|
|
292
|
+
// Prepare data for worklet transfer
|
|
293
|
+
const useArrayEncoding = !this.#uint8ArraySupported;
|
|
294
|
+
const keyData = useArrayEncoding
|
|
295
|
+
? Array.from(privateKey)
|
|
296
|
+
: new Uint8Array(privateKey);
|
|
297
|
+
const taskData = tasks.map((t) => ({
|
|
298
|
+
taskId: t.taskId,
|
|
299
|
+
inputIndex: t.inputIndex,
|
|
300
|
+
hash: useArrayEncoding ? Array.from(t.hash) : new Uint8Array(t.hash),
|
|
301
|
+
signatureType: t.signatureType,
|
|
302
|
+
lowR: t.lowR,
|
|
303
|
+
sighashType: t.sighashType,
|
|
304
|
+
leafHash: t.leafHash
|
|
305
|
+
? (useArrayEncoding ? Array.from(t.leafHash) : new Uint8Array(t.leafHash))
|
|
306
|
+
: undefined,
|
|
307
|
+
}));
|
|
308
|
+
const pubKeyData = useArrayEncoding
|
|
309
|
+
? Array.from(publicKey)
|
|
310
|
+
: new Uint8Array(publicKey);
|
|
311
|
+
// Dispatch to worklet runtime with timeout
|
|
312
|
+
const signingPromise = this.#workletsModule.runOnRuntime(pooled.runtime, () => {
|
|
313
|
+
'worklet';
|
|
314
|
+
// Inside the worklet runtime, nobleBundle is available from init eval
|
|
315
|
+
// The bundled secp.sign() returns a compact 64-byte Uint8Array directly
|
|
316
|
+
// (not a Signature object). secp.schnorr.sign() also returns Uint8Array.
|
|
317
|
+
const eccModule = globalThis['nobleBundle'];
|
|
318
|
+
const toU8 = (data) => data instanceof Uint8Array ? data : new Uint8Array(data);
|
|
319
|
+
const privKey = toU8(keyData);
|
|
320
|
+
const results = [];
|
|
321
|
+
const errors = [];
|
|
322
|
+
try {
|
|
323
|
+
for (const task of taskData) {
|
|
324
|
+
try {
|
|
325
|
+
const hash = toU8(task.hash);
|
|
326
|
+
let signature;
|
|
327
|
+
if (task.signatureType === 1) {
|
|
328
|
+
signature = eccModule.secp.schnorr.sign(hash, privKey);
|
|
329
|
+
}
|
|
330
|
+
else {
|
|
331
|
+
// prehash: false — input is already a 32-byte hash
|
|
332
|
+
signature = eccModule.secp.sign(hash, privKey, {
|
|
333
|
+
lowS: true,
|
|
334
|
+
prehash: false,
|
|
335
|
+
});
|
|
336
|
+
}
|
|
337
|
+
const entry = {
|
|
338
|
+
type: 'result',
|
|
339
|
+
taskId: task.taskId,
|
|
340
|
+
signature: Array.from(signature),
|
|
341
|
+
inputIndex: task.inputIndex,
|
|
342
|
+
publicKey: Array.from(toU8(pubKeyData)),
|
|
343
|
+
signatureType: task.signatureType,
|
|
344
|
+
};
|
|
345
|
+
if (task.leafHash) {
|
|
346
|
+
entry.leafHash = Array.from(toU8(task.leafHash));
|
|
347
|
+
}
|
|
348
|
+
results.push(entry);
|
|
349
|
+
}
|
|
350
|
+
catch (err) {
|
|
351
|
+
const msg = err instanceof Error ? err.message : 'Signing failed';
|
|
352
|
+
errors.push({ inputIndex: task.inputIndex, error: msg });
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
finally {
|
|
357
|
+
// SECURITY: Zero key inside worklet
|
|
358
|
+
privKey.fill(0);
|
|
359
|
+
}
|
|
360
|
+
return { results, errors };
|
|
361
|
+
});
|
|
362
|
+
// Timeout guard
|
|
363
|
+
const timeoutPromise = new Promise((_resolve, reject) => {
|
|
364
|
+
setTimeout(() => {
|
|
365
|
+
pooled.tainted = true;
|
|
366
|
+
this.#replaceRuntime(pooled).catch(() => { });
|
|
367
|
+
reject(new Error(`Worklet signing timeout for ${tasks.length} tasks`));
|
|
368
|
+
}, this.#config.maxKeyHoldTimeMs);
|
|
369
|
+
});
|
|
370
|
+
const raw = await Promise.race([signingPromise, timeoutPromise]);
|
|
371
|
+
// Convert results back to proper types
|
|
372
|
+
const signatures = raw.results.map((r) => ({
|
|
373
|
+
type: 'result',
|
|
374
|
+
taskId: r.taskId,
|
|
375
|
+
signature: new Uint8Array(r.signature),
|
|
376
|
+
inputIndex: r.inputIndex,
|
|
377
|
+
publicKey: new Uint8Array(r.publicKey),
|
|
378
|
+
signatureType: r.signatureType,
|
|
379
|
+
leafHash: r.leafHash ? new Uint8Array(r.leafHash) : undefined,
|
|
380
|
+
}));
|
|
381
|
+
const errors = new Map();
|
|
382
|
+
for (const e of raw.errors) {
|
|
383
|
+
errors.set(e.inputIndex, e.error);
|
|
384
|
+
}
|
|
385
|
+
return { signatures, errors };
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
//# sourceMappingURL=WorkerSigningPool.worklet.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WorkerSigningPool.worklet.js","sourceRoot":"","sources":["../../src/workers/WorkerSigningPool.worklet.ts"],"names":[],"mappings":"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"}
|
package/build/workers/index.d.ts
CHANGED
|
@@ -46,7 +46,7 @@
|
|
|
46
46
|
* @packageDocumentation
|
|
47
47
|
*/
|
|
48
48
|
import type { WorkerPoolConfig, SigningTask, ParallelSignerKeyPair, ParallelSigningResult } from './types.js';
|
|
49
|
-
export { SignatureType, type SigningTaskMessage, type BatchSigningMessage, type BatchSigningTask, type BatchSigningResultMessage, type BatchSigningTaskResult, type BatchSigningTaskError, type WorkerInitMessage, type WorkerShutdownMessage, type WorkerMessage, type SigningResultMessage, type SigningErrorMessage, type WorkerReadyMessage, type WorkerShutdownAckMessage, type WorkerResponse, isSigningError, isSigningResult, isBatchResult, isWorkerReady, type WorkerEccLib, type WorkerPoolConfig, type SigningTask, type ParallelSignerKeyPair, type ParallelSigningResult, WorkerState, type PooledWorker, } from './types.js';
|
|
49
|
+
export { SignatureType, type SigningTaskMessage, type BatchSigningMessage, type BatchSigningTask, type BatchSigningResultMessage, type BatchSigningTaskResult, type BatchSigningTaskError, type WorkerInitMessage, type WorkerShutdownMessage, type WorkerMessage, type SigningResultMessage, type SigningErrorMessage, type WorkerReadyMessage, type WorkerShutdownAckMessage, type WorkerResponse, isSigningError, isSigningResult, isBatchResult, isWorkerReady, type WorkerEccLib, type WorkerPoolConfig, type SigningTask, type ParallelSignerKeyPair, type ParallelSigningResult, type SigningPoolLike, WorkerState, type PooledWorker, } from './types.js';
|
|
50
50
|
export { WorkerSigningPool, getSigningPool } from './WorkerSigningPool.js';
|
|
51
51
|
export { generateWorkerCode, createWorkerBlobUrl, revokeWorkerBlobUrl } from './signing-worker.js';
|
|
52
52
|
export { ECC_BUNDLE, ECC_BUNDLE_SIZE } from './ecc-bundle.js';
|
|
@@ -56,7 +56,7 @@ export { signPsbtParallel, prepareSigningTasks, applySignaturesToPsbt, type Para
|
|
|
56
56
|
*
|
|
57
57
|
* @returns 'node' for Node.js, 'browser' for browsers, 'unknown' otherwise
|
|
58
58
|
*/
|
|
59
|
-
export declare function detectRuntime(): 'node' | 'browser' | 'unknown';
|
|
59
|
+
export declare function detectRuntime(): 'node' | 'browser' | 'react-native' | 'unknown';
|
|
60
60
|
/**
|
|
61
61
|
* Creates a signing pool appropriate for the current runtime.
|
|
62
62
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/workers/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAG9G,OAAO,EACH,aAAa,EACb,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,EACrB,KAAK,yBAAyB,EAC9B,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EAC1B,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,EAC1B,KAAK,aAAa,EAClB,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,KAAK,wBAAwB,EAC7B,KAAK,cAAc,EACnB,cAAc,EACd,eAAe,EACf,aAAa,EACb,aAAa,EACb,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACrB,KAAK,WAAW,EAChB,KAAK,qBAAqB,EAC1B,KAAK,qBAAqB,EAC1B,WAAW,EACX,KAAK,YAAY,GACpB,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAG3E,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAGnG,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAG9D,OAAO,EACH,gBAAgB,EAChB,mBAAmB,EACnB,qBAAqB,EACrB,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,GAC3B,MAAM,oBAAoB,CAAC;AAE5B;;;;GAIG;AACH,wBAAgB,aAAa,IAAI,MAAM,GAAG,SAAS,GAAG,SAAS,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/workers/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAG9G,OAAO,EACH,aAAa,EACb,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,EACrB,KAAK,yBAAyB,EAC9B,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EAC1B,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,EAC1B,KAAK,aAAa,EAClB,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,KAAK,wBAAwB,EAC7B,KAAK,cAAc,EACnB,cAAc,EACd,eAAe,EACf,aAAa,EACb,aAAa,EACb,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACrB,KAAK,WAAW,EAChB,KAAK,qBAAqB,EAC1B,KAAK,qBAAqB,EAC1B,KAAK,eAAe,EACpB,WAAW,EACX,KAAK,YAAY,GACpB,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAG3E,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAGnG,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAG9D,OAAO,EACH,gBAAgB,EAChB,mBAAmB,EACnB,qBAAqB,EACrB,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,GAC3B,MAAM,oBAAoB,CAAC;AAE5B;;;;GAIG;AACH,wBAAgB,aAAa,IAAI,MAAM,GAAG,SAAS,GAAG,cAAc,GAAG,SAAS,CAW/E;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAsB,iBAAiB,CAAC,MAAM,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC;IACxE,SAAS,EAAE,CACP,KAAK,EAAE,SAAS,WAAW,EAAE,EAC7B,OAAO,EAAE,qBAAqB,KAC7B,OAAO,CAAC,qBAAqB,CAAC,CAAC;IACpC,eAAe,EAAE,MAAM,IAAI,CAAC;IAC5B,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,mBAAmB,EAAE,OAAO,CAAC;CAChC,CAAC,CAqBD"}
|
package/build/workers/index.js
CHANGED
|
@@ -61,6 +61,9 @@ export { signPsbtParallel, prepareSigningTasks, applySignaturesToPsbt, } from '.
|
|
|
61
61
|
* @returns 'node' for Node.js, 'browser' for browsers, 'unknown' otherwise
|
|
62
62
|
*/
|
|
63
63
|
export function detectRuntime() {
|
|
64
|
+
if (typeof navigator !== 'undefined' && navigator.product === 'ReactNative') {
|
|
65
|
+
return 'react-native';
|
|
66
|
+
}
|
|
64
67
|
if (typeof process !== 'undefined' && process.versions?.node) {
|
|
65
68
|
return 'node';
|
|
66
69
|
}
|
|
@@ -104,6 +107,12 @@ export async function createSigningPool(config) {
|
|
|
104
107
|
await pool.initialize();
|
|
105
108
|
return pool;
|
|
106
109
|
}
|
|
110
|
+
else if (runtime === 'react-native') {
|
|
111
|
+
const { SequentialSigningPool } = await import('./WorkerSigningPool.sequential.js');
|
|
112
|
+
const pool = SequentialSigningPool.getInstance(config);
|
|
113
|
+
await pool.initialize();
|
|
114
|
+
return pool;
|
|
115
|
+
}
|
|
107
116
|
else {
|
|
108
117
|
throw new Error('Unsupported runtime for worker signing pool');
|
|
109
118
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/workers/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AAIH,eAAe;AACf,OAAO,EACH,aAAa,EAeb,cAAc,EACd,eAAe,EACf,aAAa,EACb,aAAa,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/workers/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AAIH,eAAe;AACf,OAAO,EACH,aAAa,EAeb,cAAc,EACd,eAAe,EACf,aAAa,EACb,aAAa,EAOb,WAAW,GAEd,MAAM,YAAY,CAAC;AAEpB,sBAAsB;AACtB,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAE3E,sDAAsD;AACtD,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAEnG,+CAA+C;AAC/C,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAE9D,oCAAoC;AACpC,OAAO,EACH,gBAAgB,EAChB,mBAAmB,EACnB,qBAAqB,GAGxB,MAAM,oBAAoB,CAAC;AAE5B;;;;GAIG;AACH,MAAM,UAAU,aAAa;IACzB,IAAI,OAAO,SAAS,KAAK,WAAW,IAAI,SAAS,CAAC,OAAO,KAAK,aAAa,EAAE,CAAC;QAC1E,OAAO,cAAc,CAAC;IAC1B,CAAC;IACD,IAAI,OAAO,OAAO,KAAK,WAAW,IAAI,OAAO,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC;QAC3D,OAAO,MAAM,CAAC;IAClB,CAAC;IACD,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;QACjE,OAAO,SAAS,CAAC;IACrB,CAAC;IACD,OAAO,SAAS,CAAC;AACrB,CAAC;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,MAAyB;IAa7D,MAAM,OAAO,GAAG,aAAa,EAAE,CAAC;IAEhC,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QACrB,MAAM,EAAE,qBAAqB,EAAE,GAAG,MAAM,MAAM,CAAC,6BAA6B,CAAC,CAAC;QAC9E,MAAM,IAAI,GAAG,qBAAqB,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QACvD,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC;IAChB,CAAC;SAAM,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC/B,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC,wBAAwB,CAAC,CAAC;QACrE,MAAM,IAAI,GAAG,iBAAiB,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QACnD,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC;IAChB,CAAC;SAAM,IAAI,OAAO,KAAK,cAAc,EAAE,CAAC;QACpC,MAAM,EAAE,qBAAqB,EAAE,GAAG,MAAM,MAAM,CAAC,mCAAmC,CAAC,CAAC;QACpF,MAAM,IAAI,GAAG,qBAAqB,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QACvD,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC;IAChB,CAAC;SAAM,CAAC;QACJ,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IACnE,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* React Native entry point for the workers module.
|
|
3
|
+
*
|
|
4
|
+
* Provides the same public API as the browser/Node.js workers module
|
|
5
|
+
* but uses WorkletSigningPool (parallel via react-native-worklets)
|
|
6
|
+
* when available, falling back to SequentialSigningPool (main-thread).
|
|
7
|
+
*
|
|
8
|
+
* @packageDocumentation
|
|
9
|
+
*/
|
|
10
|
+
export { SignatureType, type SigningTaskMessage, type BatchSigningMessage, type BatchSigningTask, type BatchSigningResultMessage, type BatchSigningTaskResult, type BatchSigningTaskError, type WorkerInitMessage, type WorkerShutdownMessage, type WorkerMessage, type SigningResultMessage, type SigningErrorMessage, type WorkerReadyMessage, type WorkerShutdownAckMessage, type WorkerResponse, isSigningError, isSigningResult, isBatchResult, isWorkerReady, type WorkerEccLib, type WorkerPoolConfig, type SigningTask, type ParallelSignerKeyPair, type ParallelSigningResult, type SigningPoolLike, WorkerState, type PooledWorker, } from './types.js';
|
|
11
|
+
export { SequentialSigningPool } from './WorkerSigningPool.sequential.js';
|
|
12
|
+
export { WorkletSigningPool } from './WorkerSigningPool.worklet.js';
|
|
13
|
+
export { SequentialSigningPool as WorkerSigningPool } from './WorkerSigningPool.sequential.js';
|
|
14
|
+
export { signPsbtParallel, prepareSigningTasks, applySignaturesToPsbt, type ParallelSignOptions, type PsbtParallelKeyPair, } from './psbt-parallel.js';
|
|
15
|
+
/**
|
|
16
|
+
* Detects the runtime environment.
|
|
17
|
+
*
|
|
18
|
+
* @returns Always 'react-native' in this entry point.
|
|
19
|
+
*/
|
|
20
|
+
export declare function detectRuntime(): 'node' | 'browser' | 'react-native' | 'unknown';
|
|
21
|
+
/**
|
|
22
|
+
* Creates a signing pool appropriate for the React Native runtime.
|
|
23
|
+
*
|
|
24
|
+
* Tries to use WorkletSigningPool (parallel via react-native-worklets).
|
|
25
|
+
* Falls back to SequentialSigningPool if worklets are not installed.
|
|
26
|
+
*/
|
|
27
|
+
export declare function createSigningPool(config?: import('./types.js').WorkerPoolConfig): Promise<import('./types.js').SigningPoolLike>;
|
|
28
|
+
//# sourceMappingURL=index.react-native.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.react-native.d.ts","sourceRoot":"","sources":["../../src/workers/index.react-native.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EACH,aAAa,EACb,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,EACrB,KAAK,yBAAyB,EAC9B,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EAC1B,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,EAC1B,KAAK,aAAa,EAClB,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,KAAK,wBAAwB,EAC7B,KAAK,cAAc,EACnB,cAAc,EACd,eAAe,EACf,aAAa,EACb,aAAa,EACb,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACrB,KAAK,WAAW,EAChB,KAAK,qBAAqB,EAC1B,KAAK,qBAAqB,EAC1B,KAAK,eAAe,EACpB,WAAW,EACX,KAAK,YAAY,GACpB,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAG1E,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAGpE,OAAO,EAAE,qBAAqB,IAAI,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAG/F,OAAO,EACH,gBAAgB,EAChB,mBAAmB,EACnB,qBAAqB,EACrB,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,GAC3B,MAAM,oBAAoB,CAAC;AAE5B;;;;GAIG;AACH,wBAAgB,aAAa,IAAI,MAAM,GAAG,SAAS,GAAG,cAAc,GAAG,SAAS,CAE/E;AAQD;;;;;GAKG;AACH,wBAAsB,iBAAiB,CACnC,MAAM,CAAC,EAAE,OAAO,YAAY,EAAE,gBAAgB,GAC/C,OAAO,CAAC,OAAO,YAAY,EAAE,eAAe,CAAC,CA2B/C"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* React Native entry point for the workers module.
|
|
3
|
+
*
|
|
4
|
+
* Provides the same public API as the browser/Node.js workers module
|
|
5
|
+
* but uses WorkletSigningPool (parallel via react-native-worklets)
|
|
6
|
+
* when available, falling back to SequentialSigningPool (main-thread).
|
|
7
|
+
*
|
|
8
|
+
* @packageDocumentation
|
|
9
|
+
*/
|
|
10
|
+
// Type exports (same as main index.ts)
|
|
11
|
+
export { SignatureType, isSigningError, isSigningResult, isBatchResult, isWorkerReady, WorkerState, } from './types.js';
|
|
12
|
+
// Sequential pool (React Native fallback)
|
|
13
|
+
export { SequentialSigningPool } from './WorkerSigningPool.sequential.js';
|
|
14
|
+
// Worklet pool (React Native parallel signing)
|
|
15
|
+
export { WorkletSigningPool } from './WorkerSigningPool.worklet.js';
|
|
16
|
+
// Alias for API compatibility — consumers using `WorkerSigningPool` get the sequential pool
|
|
17
|
+
export { SequentialSigningPool as WorkerSigningPool } from './WorkerSigningPool.sequential.js';
|
|
18
|
+
// PSBT parallel signing integration (works with any SigningPoolLike)
|
|
19
|
+
export { signPsbtParallel, prepareSigningTasks, applySignaturesToPsbt, } from './psbt-parallel.js';
|
|
20
|
+
/**
|
|
21
|
+
* Detects the runtime environment.
|
|
22
|
+
*
|
|
23
|
+
* @returns Always 'react-native' in this entry point.
|
|
24
|
+
*/
|
|
25
|
+
export function detectRuntime() {
|
|
26
|
+
return 'react-native';
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Cached result of the worklets availability check.
|
|
30
|
+
* `null` = not yet checked, `true` = available, `false` = unavailable.
|
|
31
|
+
*/
|
|
32
|
+
let workletsAvailable = null;
|
|
33
|
+
/**
|
|
34
|
+
* Creates a signing pool appropriate for the React Native runtime.
|
|
35
|
+
*
|
|
36
|
+
* Tries to use WorkletSigningPool (parallel via react-native-worklets).
|
|
37
|
+
* Falls back to SequentialSigningPool if worklets are not installed.
|
|
38
|
+
*/
|
|
39
|
+
export async function createSigningPool(config) {
|
|
40
|
+
// Check worklets availability (cached after first probe)
|
|
41
|
+
if (workletsAvailable === null) {
|
|
42
|
+
try {
|
|
43
|
+
await import('react-native-worklets');
|
|
44
|
+
workletsAvailable = true;
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
workletsAvailable = false;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
if (workletsAvailable) {
|
|
51
|
+
try {
|
|
52
|
+
const { WorkletSigningPool } = await import('./WorkerSigningPool.worklet.js');
|
|
53
|
+
const pool = WorkletSigningPool.getInstance(config);
|
|
54
|
+
await pool.initialize();
|
|
55
|
+
return pool;
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
// Initialization failed (e.g. eval blocked) — fall through
|
|
59
|
+
workletsAvailable = false;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
const { SequentialSigningPool } = await import('./WorkerSigningPool.sequential.js');
|
|
63
|
+
const pool = SequentialSigningPool.getInstance(config);
|
|
64
|
+
await pool.initialize();
|
|
65
|
+
return pool;
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=index.react-native.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.react-native.js","sourceRoot":"","sources":["../../src/workers/index.react-native.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,uCAAuC;AACvC,OAAO,EACH,aAAa,EAeb,cAAc,EACd,eAAe,EACf,aAAa,EACb,aAAa,EAOb,WAAW,GAEd,MAAM,YAAY,CAAC;AAEpB,0CAA0C;AAC1C,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAE1E,+CAA+C;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAEpE,4FAA4F;AAC5F,OAAO,EAAE,qBAAqB,IAAI,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAE/F,qEAAqE;AACrE,OAAO,EACH,gBAAgB,EAChB,mBAAmB,EACnB,qBAAqB,GAGxB,MAAM,oBAAoB,CAAC;AAE5B;;;;GAIG;AACH,MAAM,UAAU,aAAa;IACzB,OAAO,cAAc,CAAC;AAC1B,CAAC;AAED;;;GAGG;AACH,IAAI,iBAAiB,GAAmB,IAAI,CAAC;AAE7C;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACnC,MAA8C;IAE9C,yDAAyD;IACzD,IAAI,iBAAiB,KAAK,IAAI,EAAE,CAAC;QAC7B,IAAI,CAAC;YACD,MAAM,MAAM,CAAC,uBAAiC,CAAC,CAAC;YAChD,iBAAiB,GAAG,IAAI,CAAC;QAC7B,CAAC;QAAC,MAAM,CAAC;YACL,iBAAiB,GAAG,KAAK,CAAC;QAC9B,CAAC;IACL,CAAC;IAED,IAAI,iBAAiB,EAAE,CAAC;QACpB,IAAI,CAAC;YACD,MAAM,EAAE,kBAAkB,EAAE,GAAG,MAAM,MAAM,CAAC,gCAAgC,CAAC,CAAC;YAC9E,MAAM,IAAI,GAAG,kBAAkB,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YACpD,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC;QAChB,CAAC;QAAC,MAAM,CAAC;YACL,2DAA2D;YAC3D,iBAAiB,GAAG,KAAK,CAAC;QAC9B,CAAC;IACL,CAAC;IAED,MAAM,EAAE,qBAAqB,EAAE,GAAG,MAAM,MAAM,CAAC,mCAAmC,CAAC,CAAC;IACpF,MAAM,IAAI,GAAG,qBAAqB,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IACvD,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;IACxB,OAAO,IAAI,CAAC;AAChB,CAAC"}
|
|
@@ -28,8 +28,7 @@
|
|
|
28
28
|
* @packageDocumentation
|
|
29
29
|
*/
|
|
30
30
|
import type { Psbt } from '../psbt.js';
|
|
31
|
-
import type { ParallelSignerKeyPair, ParallelSigningResult, SigningTask, WorkerPoolConfig } from './types.js';
|
|
32
|
-
import { WorkerSigningPool } from './WorkerSigningPool.js';
|
|
31
|
+
import type { ParallelSignerKeyPair, ParallelSigningResult, SigningPoolLike, SigningTask, WorkerPoolConfig } from './types.js';
|
|
33
32
|
/**
|
|
34
33
|
* Options for parallel PSBT signing.
|
|
35
34
|
*/
|
|
@@ -93,7 +92,7 @@ export interface PsbtParallelKeyPair extends ParallelSignerKeyPair {
|
|
|
93
92
|
* const result = await signPsbtParallel(psbt, keyPair, { workerCount: 4 });
|
|
94
93
|
* ```
|
|
95
94
|
*/
|
|
96
|
-
export declare function signPsbtParallel(psbt: Psbt, keyPair: PsbtParallelKeyPair, poolOrConfig?:
|
|
95
|
+
export declare function signPsbtParallel(psbt: Psbt, keyPair: PsbtParallelKeyPair, poolOrConfig?: SigningPoolLike | WorkerPoolConfig, options?: ParallelSignOptions): Promise<ParallelSigningResult>;
|
|
97
96
|
/**
|
|
98
97
|
* Prepares signing tasks from a PSBT.
|
|
99
98
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"psbt-parallel.d.ts","sourceRoot":"","sources":["../../src/workers/psbt-parallel.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAIH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEvC,OAAO,KAAK,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,WAAW,EAAE,gBAAgB,EAAG,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"psbt-parallel.d.ts","sourceRoot":"","sources":["../../src/workers/psbt-parallel.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAIH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEvC,OAAO,KAAK,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,eAAe,EAAE,WAAW,EAAE,gBAAgB,EAAG,MAAM,YAAY,CAAC;AAMhI;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAChC;;;OAGG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAE1C;;OAEG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,UAAU,CAAC;IAElC;;OAEG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAEvC;;;OAGG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,mBAAoB,SAAQ,qBAAqB;IAC9D,yCAAyC;IACzC,QAAQ,CAAC,OAAO,CAAC,EAAE;QAAE,aAAa,EAAE,MAAM,CAAA;KAAE,CAAC;CAChD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAsB,gBAAgB,CAClC,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,mBAAmB,EAC5B,YAAY,CAAC,EAAE,eAAe,GAAG,gBAAgB,EACjD,OAAO,GAAE,mBAAwB,GAClC,OAAO,CAAC,qBAAqB,CAAC,CA6ChC;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CAC/B,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,mBAAmB,EAC5B,OAAO,GAAE,mBAAwB,GAClC,WAAW,EAAE,CA4Bf;AAuED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACjC,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,qBAAqB,EAC7B,OAAO,EAAE,mBAAmB,GAC7B,IAAI,CAyCN"}
|
|
@@ -29,7 +29,6 @@
|
|
|
29
29
|
*/
|
|
30
30
|
import { Transaction } from '../transaction.js';
|
|
31
31
|
import { SignatureType } from './types.js';
|
|
32
|
-
import { WorkerSigningPool } from './WorkerSigningPool.js';
|
|
33
32
|
import { toXOnly } from '../pubkey.js';
|
|
34
33
|
import { isTaprootInput, serializeTaprootSignature } from '../psbt/bip371.js';
|
|
35
34
|
import * as bscript from '../script.js';
|
|
@@ -68,10 +67,11 @@ export async function signPsbtParallel(psbt, keyPair, poolOrConfig, options = {}
|
|
|
68
67
|
// Get or create pool
|
|
69
68
|
let pool;
|
|
70
69
|
let shouldShutdown = false;
|
|
71
|
-
if (poolOrConfig
|
|
70
|
+
if (poolOrConfig && 'signBatch' in poolOrConfig) {
|
|
72
71
|
pool = poolOrConfig;
|
|
73
72
|
}
|
|
74
73
|
else {
|
|
74
|
+
const { WorkerSigningPool } = await import('./WorkerSigningPool.js');
|
|
75
75
|
pool = WorkerSigningPool.getInstance(poolOrConfig);
|
|
76
76
|
if (!pool.isPreservingWorkers) {
|
|
77
77
|
shouldShutdown = true;
|
|
@@ -218,10 +218,10 @@ export function applySignaturesToPsbt(psbt, result, keyPair) {
|
|
|
218
218
|
}
|
|
219
219
|
else {
|
|
220
220
|
// ECDSA signature
|
|
221
|
-
const encodedSig = bscript.signature.encode(
|
|
221
|
+
const encodedSig = bscript.signature.encode(sigResult.signature, input.sighashType ?? Transaction.SIGHASH_ALL);
|
|
222
222
|
const partialSig = [
|
|
223
223
|
{
|
|
224
|
-
pubkey:
|
|
224
|
+
pubkey: Uint8Array.from(pubkey),
|
|
225
225
|
signature: encodedSig,
|
|
226
226
|
},
|
|
227
227
|
];
|