@sip-protocol/sdk 0.7.2 → 0.7.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 (262) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +267 -0
  3. package/dist/{TransportWebUSB-TQ7WZ4LE.mjs → TransportWebUSB-YQMAGJAJ.mjs} +12 -9
  4. package/dist/browser.d.mts +10 -4
  5. package/dist/browser.d.ts +10 -4
  6. package/dist/browser.js +48874 -18336
  7. package/dist/browser.mjs +674 -48
  8. package/dist/chunk-4GRJ5MAW.mjs +152 -0
  9. package/dist/chunk-5D7A3L3W.mjs +717 -0
  10. package/dist/chunk-64AYA5F5.mjs +7834 -0
  11. package/dist/chunk-GMDGB22A.mjs +379 -0
  12. package/dist/chunk-I534WKN7.mjs +328 -0
  13. package/dist/chunk-IBZVA5Y7.mjs +1003 -0
  14. package/dist/chunk-PRRZAWJE.mjs +223 -0
  15. package/dist/{chunk-UJCSKKID.mjs → chunk-XGB3TDIC.mjs} +13 -1
  16. package/dist/chunk-YWGJ77A2.mjs +33806 -0
  17. package/dist/{chunk-6WGN57S2.mjs → chunk-Z3K7W5S3.mjs} +48 -0
  18. package/dist/constants-LHAAUC2T.mjs +51 -0
  19. package/dist/dist-2OGQ7FED.mjs +3957 -0
  20. package/dist/dist-IFHPYLDX.mjs +254 -0
  21. package/dist/fulfillment_proof-ANHVPKTB.mjs +21 -0
  22. package/dist/funding_proof-ICFZ5LHY.mjs +21 -0
  23. package/dist/index-DXh2IGkz.d.ts +24681 -0
  24. package/dist/index-DeE1ZzA4.d.mts +24681 -0
  25. package/dist/index.d.mts +9 -3
  26. package/dist/index.d.ts +9 -3
  27. package/dist/index.js +48676 -17318
  28. package/dist/index.mjs +583 -19
  29. package/dist/interface-Bf7w1PLW.d.mts +679 -0
  30. package/dist/interface-Bf7w1PLW.d.ts +679 -0
  31. package/dist/{noir-DKfEzWy9.d.mts → noir-kzbLVTei.d.mts} +31 -21
  32. package/dist/{noir-DKfEzWy9.d.ts → noir-kzbLVTei.d.ts} +31 -21
  33. package/dist/proofs/halo2.d.mts +151 -0
  34. package/dist/proofs/halo2.d.ts +151 -0
  35. package/dist/proofs/halo2.js +350 -0
  36. package/dist/proofs/halo2.mjs +11 -0
  37. package/dist/proofs/kimchi.d.mts +160 -0
  38. package/dist/proofs/kimchi.d.ts +160 -0
  39. package/dist/proofs/kimchi.js +431 -0
  40. package/dist/proofs/kimchi.mjs +13 -0
  41. package/dist/proofs/noir.d.mts +1 -1
  42. package/dist/proofs/noir.d.ts +1 -1
  43. package/dist/proofs/noir.js +74 -18
  44. package/dist/proofs/noir.mjs +84 -24
  45. package/dist/solana-U3MEGU7W.mjs +280 -0
  46. package/dist/validity_proof-3POXLPNY.mjs +21 -0
  47. package/package.json +54 -21
  48. package/src/adapters/index.ts +41 -0
  49. package/src/adapters/jupiter.ts +571 -0
  50. package/src/adapters/near-intents.ts +135 -0
  51. package/src/advisor/advisor.ts +653 -0
  52. package/src/advisor/index.ts +54 -0
  53. package/src/advisor/tools.ts +303 -0
  54. package/src/advisor/types.ts +164 -0
  55. package/src/chains/ethereum/announcement.ts +536 -0
  56. package/src/chains/ethereum/bnb-optimizations.ts +474 -0
  57. package/src/chains/ethereum/commitment.ts +522 -0
  58. package/src/chains/ethereum/constants.ts +462 -0
  59. package/src/chains/ethereum/deployment.ts +596 -0
  60. package/src/chains/ethereum/gas-estimation.ts +538 -0
  61. package/src/chains/ethereum/index.ts +268 -0
  62. package/src/chains/ethereum/optimizations.ts +614 -0
  63. package/src/chains/ethereum/privacy-adapter.ts +855 -0
  64. package/src/chains/ethereum/registry.ts +584 -0
  65. package/src/chains/ethereum/rpc.ts +905 -0
  66. package/src/chains/ethereum/stealth.ts +491 -0
  67. package/src/chains/ethereum/token.ts +790 -0
  68. package/src/chains/ethereum/transfer.ts +637 -0
  69. package/src/chains/ethereum/types.ts +456 -0
  70. package/src/chains/ethereum/viewing-key.ts +455 -0
  71. package/src/chains/near/commitment.ts +608 -0
  72. package/src/chains/near/constants.ts +284 -0
  73. package/src/chains/near/function-call.ts +871 -0
  74. package/src/chains/near/history.ts +654 -0
  75. package/src/chains/near/implicit-account.ts +840 -0
  76. package/src/chains/near/index.ts +393 -0
  77. package/src/chains/near/native-transfer.ts +658 -0
  78. package/src/chains/near/nep141.ts +775 -0
  79. package/src/chains/near/privacy-adapter.ts +889 -0
  80. package/src/chains/near/resolver.ts +971 -0
  81. package/src/chains/near/rpc.ts +1016 -0
  82. package/src/chains/near/stealth.ts +419 -0
  83. package/src/chains/near/types.ts +317 -0
  84. package/src/chains/near/viewing-key.ts +876 -0
  85. package/src/chains/solana/anchor-transfer.ts +386 -0
  86. package/src/chains/solana/commitment.ts +577 -0
  87. package/src/chains/solana/constants.ts +126 -12
  88. package/src/chains/solana/ephemeral-keys.ts +543 -0
  89. package/src/chains/solana/index.ts +276 -1
  90. package/src/chains/solana/key-derivation.ts +418 -0
  91. package/src/chains/solana/kit-compat.ts +334 -0
  92. package/src/chains/solana/optimizations.ts +560 -0
  93. package/src/chains/solana/privacy-adapter.ts +605 -0
  94. package/src/chains/solana/providers/generic.ts +201 -0
  95. package/src/chains/solana/providers/helius-enhanced-types.ts +336 -0
  96. package/src/chains/solana/providers/helius-enhanced.ts +623 -0
  97. package/src/chains/solana/providers/helius.ts +402 -0
  98. package/src/chains/solana/providers/index.ts +85 -0
  99. package/src/chains/solana/providers/interface.ts +221 -0
  100. package/src/chains/solana/providers/quicknode.ts +409 -0
  101. package/src/chains/solana/providers/triton.ts +426 -0
  102. package/src/chains/solana/providers/webhook.ts +790 -0
  103. package/src/chains/solana/rpc-client.ts +1150 -0
  104. package/src/chains/solana/scan.ts +170 -73
  105. package/src/chains/solana/sol-transfer.ts +732 -0
  106. package/src/chains/solana/spl-transfer.ts +886 -0
  107. package/src/chains/solana/stealth-scanner.ts +703 -0
  108. package/src/chains/solana/sunspot-verifier.ts +453 -0
  109. package/src/chains/solana/transaction-builder.ts +755 -0
  110. package/src/chains/solana/transfer.ts +74 -5
  111. package/src/chains/solana/types.ts +77 -7
  112. package/src/chains/solana/utils.ts +110 -0
  113. package/src/chains/solana/viewing-key.ts +807 -0
  114. package/src/compliance/fireblocks.ts +921 -0
  115. package/src/compliance/index.ts +37 -0
  116. package/src/compliance/range-sas.ts +956 -0
  117. package/src/config/endpoints.ts +100 -0
  118. package/src/crypto.ts +11 -8
  119. package/src/errors.ts +82 -0
  120. package/src/evm/erc4337-relayer.ts +830 -0
  121. package/src/evm/index.ts +47 -0
  122. package/src/fees/calculator.ts +396 -0
  123. package/src/fees/index.ts +87 -0
  124. package/src/fees/near-contract.ts +429 -0
  125. package/src/fees/types.ts +268 -0
  126. package/src/index.ts +785 -1
  127. package/src/intent.ts +6 -3
  128. package/src/logger.ts +324 -0
  129. package/src/network/index.ts +80 -0
  130. package/src/network/proxy.ts +691 -0
  131. package/src/optimizations/index.ts +541 -0
  132. package/src/oracle/types.ts +1 -0
  133. package/src/privacy-backends/arcium-types.ts +727 -0
  134. package/src/privacy-backends/arcium.ts +719 -0
  135. package/src/privacy-backends/combined-privacy.ts +866 -0
  136. package/src/privacy-backends/cspl-token.ts +595 -0
  137. package/src/privacy-backends/cspl-types.ts +512 -0
  138. package/src/privacy-backends/cspl.ts +907 -0
  139. package/src/privacy-backends/health.ts +488 -0
  140. package/src/privacy-backends/inco-types.ts +323 -0
  141. package/src/privacy-backends/inco.ts +616 -0
  142. package/src/privacy-backends/index.ts +336 -0
  143. package/src/privacy-backends/interface.ts +906 -0
  144. package/src/privacy-backends/lru-cache.ts +343 -0
  145. package/src/privacy-backends/magicblock.ts +458 -0
  146. package/src/privacy-backends/mock.ts +258 -0
  147. package/src/privacy-backends/privacycash-types.ts +278 -0
  148. package/src/privacy-backends/privacycash.ts +456 -0
  149. package/src/privacy-backends/private-swap.ts +570 -0
  150. package/src/privacy-backends/rate-limiter.ts +683 -0
  151. package/src/privacy-backends/registry.ts +690 -0
  152. package/src/privacy-backends/router.ts +626 -0
  153. package/src/privacy-backends/shadowwire.ts +449 -0
  154. package/src/privacy-backends/sip-native.ts +256 -0
  155. package/src/privacy-logger.ts +191 -0
  156. package/src/production-safety.ts +373 -0
  157. package/src/proofs/aggregator.ts +1029 -0
  158. package/src/proofs/browser-composer.ts +1150 -0
  159. package/src/proofs/browser.ts +113 -25
  160. package/src/proofs/cache/index.ts +127 -0
  161. package/src/proofs/cache/interface.ts +545 -0
  162. package/src/proofs/cache/key-generator.ts +188 -0
  163. package/src/proofs/cache/lru-cache.ts +481 -0
  164. package/src/proofs/cache/multi-tier-cache.ts +575 -0
  165. package/src/proofs/cache/persistent-cache.ts +788 -0
  166. package/src/proofs/compliance-proof.ts +872 -0
  167. package/src/proofs/composer/base.ts +923 -0
  168. package/src/proofs/composer/index.ts +25 -0
  169. package/src/proofs/composer/interface.ts +518 -0
  170. package/src/proofs/composer/types.ts +383 -0
  171. package/src/proofs/converters/halo2.ts +452 -0
  172. package/src/proofs/converters/index.ts +208 -0
  173. package/src/proofs/converters/interface.ts +363 -0
  174. package/src/proofs/converters/kimchi.ts +462 -0
  175. package/src/proofs/converters/noir.ts +451 -0
  176. package/src/proofs/fallback.ts +888 -0
  177. package/src/proofs/halo2.ts +42 -0
  178. package/src/proofs/index.ts +471 -0
  179. package/src/proofs/interface.ts +13 -0
  180. package/src/proofs/kimchi.ts +42 -0
  181. package/src/proofs/lazy.ts +1004 -0
  182. package/src/proofs/mock.ts +25 -1
  183. package/src/proofs/noir.ts +111 -30
  184. package/src/proofs/orchestrator.ts +960 -0
  185. package/src/proofs/parallel/concurrency.ts +297 -0
  186. package/src/proofs/parallel/dependency-graph.ts +602 -0
  187. package/src/proofs/parallel/executor.ts +420 -0
  188. package/src/proofs/parallel/index.ts +131 -0
  189. package/src/proofs/parallel/interface.ts +685 -0
  190. package/src/proofs/parallel/worker-pool.ts +644 -0
  191. package/src/proofs/providers/halo2.ts +560 -0
  192. package/src/proofs/providers/index.ts +34 -0
  193. package/src/proofs/providers/kimchi.ts +641 -0
  194. package/src/proofs/validator.ts +881 -0
  195. package/src/proofs/verifier.ts +867 -0
  196. package/src/quantum/index.ts +112 -0
  197. package/src/quantum/winternitz-vault.ts +639 -0
  198. package/src/quantum/wots.ts +611 -0
  199. package/src/settlement/backends/direct-chain.ts +1 -0
  200. package/src/settlement/index.ts +9 -0
  201. package/src/settlement/router.ts +732 -46
  202. package/src/solana/index.ts +72 -0
  203. package/src/solana/jito-relayer.ts +687 -0
  204. package/src/solana/noir-verifier-types.ts +430 -0
  205. package/src/solana/noir-verifier.ts +816 -0
  206. package/src/stealth/address-derivation.ts +193 -0
  207. package/src/stealth/ed25519.ts +431 -0
  208. package/src/stealth/index.ts +233 -0
  209. package/src/stealth/meta-address.ts +221 -0
  210. package/src/stealth/secp256k1.ts +368 -0
  211. package/src/stealth/utils.ts +194 -0
  212. package/src/stealth.ts +50 -1504
  213. package/src/surveillance/algorithms/address-reuse.ts +143 -0
  214. package/src/surveillance/algorithms/cluster.ts +247 -0
  215. package/src/surveillance/algorithms/exchange.ts +295 -0
  216. package/src/surveillance/algorithms/temporal.ts +337 -0
  217. package/src/surveillance/analyzer.ts +442 -0
  218. package/src/surveillance/index.ts +64 -0
  219. package/src/surveillance/scoring.ts +372 -0
  220. package/src/surveillance/types.ts +264 -0
  221. package/src/sync/index.ts +106 -0
  222. package/src/sync/manager.ts +504 -0
  223. package/src/sync/mock-provider.ts +318 -0
  224. package/src/sync/oblivious.ts +625 -0
  225. package/src/tokens/index.ts +15 -0
  226. package/src/tokens/registry.ts +301 -0
  227. package/src/utils/deprecation.ts +94 -0
  228. package/src/utils/index.ts +9 -0
  229. package/src/wallet/ethereum/index.ts +68 -0
  230. package/src/wallet/ethereum/metamask-privacy.ts +420 -0
  231. package/src/wallet/ethereum/multi-wallet.ts +646 -0
  232. package/src/wallet/ethereum/privacy-adapter.ts +700 -0
  233. package/src/wallet/ethereum/types.ts +3 -1
  234. package/src/wallet/ethereum/walletconnect-adapter.ts +675 -0
  235. package/src/wallet/hardware/index.ts +10 -0
  236. package/src/wallet/hardware/ledger-privacy.ts +414 -0
  237. package/src/wallet/index.ts +71 -0
  238. package/src/wallet/near/adapter.ts +626 -0
  239. package/src/wallet/near/index.ts +86 -0
  240. package/src/wallet/near/meteor-wallet.ts +1153 -0
  241. package/src/wallet/near/my-near-wallet.ts +790 -0
  242. package/src/wallet/near/wallet-selector.ts +702 -0
  243. package/src/wallet/solana/adapter.ts +6 -4
  244. package/src/wallet/solana/index.ts +13 -0
  245. package/src/wallet/solana/privacy-adapter.ts +567 -0
  246. package/src/wallet/sui/types.ts +6 -4
  247. package/src/zcash/rpc-client.ts +13 -6
  248. package/dist/chunk-3INS3PR5.mjs +0 -884
  249. package/dist/chunk-3OVABDRH.mjs +0 -17096
  250. package/dist/chunk-DLDWZFYC.mjs +0 -1495
  251. package/dist/chunk-E6SZWREQ.mjs +0 -57
  252. package/dist/chunk-G33LB27A.mjs +0 -16166
  253. package/dist/chunk-HGU6HZRC.mjs +0 -231
  254. package/dist/chunk-L2K34JCU.mjs +0 -1496
  255. package/dist/chunk-SN4ZDTVW.mjs +0 -16166
  256. package/dist/constants-VOI7BSLK.mjs +0 -27
  257. package/dist/index-BYZbDjal.d.ts +0 -11390
  258. package/dist/index-CHB3KuOB.d.mts +0 -11859
  259. package/dist/index-CzWPI6Le.d.ts +0 -11859
  260. package/dist/index-xbWjohNq.d.mts +0 -11390
  261. package/dist/solana-5EMCTPTS.mjs +0 -46
  262. package/dist/solana-Q4NAVBTS.mjs +0 -46
@@ -0,0 +1,420 @@
1
+ /**
2
+ * Parallel Proof Executor
3
+ *
4
+ * @module proofs/parallel/executor
5
+ * @description Main executor for parallel proof generation with dependency resolution
6
+ *
7
+ * M20-12: Optimize proof generation parallelization (#307)
8
+ */
9
+
10
+ import type { SingleProof } from '@sip-protocol/types'
11
+ import type {
12
+ DependencyNode,
13
+ ParallelExecutionOptions,
14
+ ParallelProgressEvent,
15
+ ParallelExecutionResult,
16
+ ParallelExecutionStats,
17
+ ParallelExecutionError,
18
+ ProofTask,
19
+ IParallelExecutor,
20
+ IDependencyAnalyzer,
21
+ IWorkerPool,
22
+ IConcurrencyManager,
23
+ } from './interface'
24
+ import { DependencyAnalyzer } from './dependency-graph'
25
+ import { ConcurrencyManager } from './concurrency'
26
+ import { WorkerPool } from './worker-pool'
27
+ import type { ComposableProofProvider } from '../composer'
28
+
29
+ // ─── Parallel Executor Implementation ────────────────────────────────────────
30
+
31
+ /**
32
+ * Executes proofs in parallel with dependency resolution and resource optimization
33
+ */
34
+ export class ParallelExecutor implements IParallelExecutor {
35
+ private readonly analyzer: IDependencyAnalyzer
36
+ private readonly concurrencyManager: IConcurrencyManager
37
+ private pool: IWorkerPool | null = null
38
+ private readonly providerFactory: () => ComposableProofProvider
39
+
40
+ private running = false
41
+ private cancelled = false
42
+ private completed = 0
43
+ private total = 0
44
+
45
+ constructor(providerFactory: () => ComposableProofProvider) {
46
+ this.analyzer = new DependencyAnalyzer()
47
+ this.concurrencyManager = new ConcurrencyManager()
48
+ this.providerFactory = providerFactory
49
+ }
50
+
51
+ /**
52
+ * Execute proofs in parallel with dependency resolution
53
+ */
54
+ async execute(
55
+ nodes: DependencyNode[],
56
+ options?: ParallelExecutionOptions
57
+ ): Promise<ParallelExecutionResult> {
58
+ if (nodes.length === 0) {
59
+ return this.createEmptyResult()
60
+ }
61
+
62
+ this.running = true
63
+ this.cancelled = false
64
+ this.completed = 0
65
+ this.total = nodes.length
66
+
67
+ const startTime = Date.now()
68
+ const errors: ParallelExecutionError[] = []
69
+ const proofMap = new Map<string, SingleProof>()
70
+ const completedSet = new Set<string>()
71
+
72
+ // Analyze dependencies
73
+ const analysis = this.analyzer.analyze(nodes)
74
+
75
+ if (analysis.hasCycles) {
76
+ throw new Error(
77
+ `Dependency cycle detected: ${analysis.cyclePath?.join(' -> ')}`
78
+ )
79
+ }
80
+
81
+ // Initialize worker pool
82
+ const poolConfig = {
83
+ minWorkers: 1,
84
+ maxWorkers: Math.min(
85
+ analysis.suggestedParallelism,
86
+ this.concurrencyManager.getCurrentLimit()
87
+ ),
88
+ ...options?.poolConfig,
89
+ }
90
+
91
+ this.pool = new WorkerPool(poolConfig, this.providerFactory)
92
+
93
+ // Start concurrency monitoring
94
+ this.concurrencyManager.startMonitoring()
95
+
96
+ try {
97
+ // Process in levels (parallel within level, sequential across levels)
98
+ let currentLevel = 0
99
+ let maxParallelism = 0
100
+ let totalParallelism = 0
101
+ let parallelismSamples = 0
102
+ let criticalPathTime = 0
103
+ const levelStartTimes = new Map<number, number>()
104
+
105
+ for (const level of analysis.executionLevels) {
106
+ if (this.cancelled) break
107
+
108
+ levelStartTimes.set(currentLevel, Date.now())
109
+ const levelTasks: Promise<{ id: string; proof: SingleProof }>[] = []
110
+
111
+ // Track parallelism
112
+ maxParallelism = Math.max(maxParallelism, level.length)
113
+ totalParallelism += level.length
114
+ parallelismSamples++
115
+
116
+ // Submit all tasks in this level
117
+ for (const nodeId of level) {
118
+ if (this.cancelled) break
119
+
120
+ const node = analysis.graph.nodes.get(nodeId)!
121
+ const task = this.createTask(node)
122
+
123
+ // Emit progress event
124
+ this.emitProgress(options, {
125
+ type: 'task_started',
126
+ taskId: nodeId,
127
+ completed: this.completed,
128
+ total: this.total,
129
+ percentage: Math.round((this.completed / this.total) * 100),
130
+ elapsedMs: Date.now() - startTime,
131
+ currentParallelism: level.length,
132
+ poolStats: this.pool?.getStats(),
133
+ })
134
+
135
+ const taskPromise = this.pool!
136
+ .submit(task, {
137
+ priority: task.priority,
138
+ maxRetries: task.maxRetries,
139
+ timeoutMs: options?.timeoutMs ?? 120000,
140
+ onComplete: () => {
141
+ this.completed++
142
+ completedSet.add(nodeId)
143
+
144
+ this.emitProgress(options, {
145
+ type: 'task_completed',
146
+ taskId: nodeId,
147
+ completed: this.completed,
148
+ total: this.total,
149
+ percentage: Math.round((this.completed / this.total) * 100),
150
+ elapsedMs: Date.now() - startTime,
151
+ estimatedRemainingMs: this.estimateRemainingTime(startTime),
152
+ currentParallelism: levelTasks.length,
153
+ poolStats: this.pool?.getStats(),
154
+ })
155
+ },
156
+ onError: (t, error) => {
157
+ errors.push({
158
+ taskId: t.id,
159
+ message: error.message,
160
+ stack: error.stack,
161
+ retryCount: t.retryCount,
162
+ wasRetried: t.retryCount > 0,
163
+ timestamp: Date.now(),
164
+ })
165
+
166
+ this.emitProgress(options, {
167
+ type: 'task_failed',
168
+ taskId: nodeId,
169
+ completed: this.completed,
170
+ total: this.total,
171
+ percentage: Math.round((this.completed / this.total) * 100),
172
+ elapsedMs: Date.now() - startTime,
173
+ currentParallelism: levelTasks.length,
174
+ poolStats: this.pool?.getStats(),
175
+ })
176
+ },
177
+ })
178
+ .then((proof) => ({ id: nodeId, proof }))
179
+
180
+ levelTasks.push(taskPromise)
181
+ }
182
+
183
+ // Wait for all tasks in this level to complete
184
+ const results = await Promise.allSettled(levelTasks)
185
+
186
+ // Collect successful results
187
+ for (const result of results) {
188
+ if (result.status === 'fulfilled') {
189
+ proofMap.set(result.value.id, result.value.proof)
190
+ }
191
+ }
192
+
193
+ // Track critical path time (if this level is on critical path)
194
+ const levelTime = Date.now() - (levelStartTimes.get(currentLevel) ?? startTime)
195
+ const isCriticalPathLevel = level.some((id) =>
196
+ analysis.graph.criticalPath.includes(id)
197
+ )
198
+ if (isCriticalPathLevel) {
199
+ criticalPathTime += levelTime
200
+ }
201
+
202
+ this.emitProgress(options, {
203
+ type: 'batch_completed',
204
+ completed: this.completed,
205
+ total: this.total,
206
+ percentage: Math.round((this.completed / this.total) * 100),
207
+ elapsedMs: Date.now() - startTime,
208
+ currentParallelism: 0,
209
+ poolStats: this.pool?.getStats(),
210
+ })
211
+
212
+ currentLevel++
213
+ }
214
+
215
+ const totalTime = Date.now() - startTime
216
+ const averageParallelism =
217
+ parallelismSamples > 0 ? totalParallelism / parallelismSamples : 1
218
+
219
+ // Calculate speedup vs sequential execution
220
+ const sequentialTime = this.estimateSequentialTime(nodes)
221
+ const speedupFactor = sequentialTime > 0 ? totalTime / sequentialTime : 1
222
+ const efficiency = averageParallelism > 0 ? speedupFactor / averageParallelism : 1
223
+
224
+ this.emitProgress(options, {
225
+ type: 'all_completed',
226
+ completed: this.completed,
227
+ total: this.total,
228
+ percentage: 100,
229
+ elapsedMs: totalTime,
230
+ currentParallelism: 0,
231
+ poolStats: this.pool?.getStats(),
232
+ })
233
+
234
+ // Build ordered proof array
235
+ const orderedProofs: SingleProof[] = []
236
+ if (options?.preserveOrder !== false) {
237
+ // Use execution order
238
+ const executionOrder = this.analyzer.getExecutionOrder(analysis.graph)
239
+ for (const nodeId of executionOrder) {
240
+ const proof = proofMap.get(nodeId)
241
+ if (proof) {
242
+ orderedProofs.push(proof)
243
+ }
244
+ }
245
+ } else {
246
+ orderedProofs.push(...proofMap.values())
247
+ }
248
+
249
+ const stats: ParallelExecutionStats = {
250
+ totalTimeMs: totalTime,
251
+ criticalPathTimeMs: criticalPathTime,
252
+ maxParallelism,
253
+ averageParallelism,
254
+ tasksCompleted: this.completed,
255
+ tasksFailed: errors.length,
256
+ workSteals: this.pool?.getStats().workSteals ?? 0,
257
+ peakMemoryUsage: this.pool?.getStats().peakMemoryUsage ?? 0,
258
+ speedupFactor,
259
+ efficiency,
260
+ }
261
+
262
+ return {
263
+ proofs: orderedProofs,
264
+ proofMap,
265
+ stats,
266
+ errors,
267
+ success: errors.length === 0,
268
+ }
269
+ } finally {
270
+ this.running = false
271
+ this.concurrencyManager.stopMonitoring()
272
+ await this.pool?.shutdown()
273
+ this.pool = null
274
+ }
275
+ }
276
+
277
+ /**
278
+ * Cancel ongoing execution
279
+ */
280
+ async cancel(): Promise<void> {
281
+ this.cancelled = true
282
+ if (this.pool) {
283
+ await this.pool.shutdown()
284
+ }
285
+ }
286
+
287
+ /**
288
+ * Get current execution status
289
+ */
290
+ getStatus(): {
291
+ readonly running: boolean
292
+ readonly progress: number
293
+ readonly completed: number
294
+ readonly total: number
295
+ } {
296
+ return {
297
+ running: this.running,
298
+ progress: this.total > 0 ? Math.round((this.completed / this.total) * 100) : 0,
299
+ completed: this.completed,
300
+ total: this.total,
301
+ }
302
+ }
303
+
304
+ /**
305
+ * Get the dependency analyzer
306
+ */
307
+ getAnalyzer(): IDependencyAnalyzer {
308
+ return this.analyzer
309
+ }
310
+
311
+ /**
312
+ * Get the worker pool
313
+ */
314
+ getPool(): IWorkerPool {
315
+ if (!this.pool) {
316
+ throw new Error('Worker pool not initialized. Call execute() first.')
317
+ }
318
+ return this.pool
319
+ }
320
+
321
+ /**
322
+ * Get the concurrency manager
323
+ */
324
+ getConcurrencyManager(): IConcurrencyManager {
325
+ return this.concurrencyManager
326
+ }
327
+
328
+ // ─── Private Methods ─────────────────────────────────────────────────────────
329
+
330
+ private createTask(node: DependencyNode): ProofTask {
331
+ return {
332
+ id: node.id,
333
+ node,
334
+ priority: this.getPriority(node),
335
+ status: 'pending',
336
+ createdAt: Date.now(),
337
+ retryCount: 0,
338
+ maxRetries: 2,
339
+ }
340
+ }
341
+
342
+ private getPriority(node: DependencyNode): ProofTask['priority'] {
343
+ if (node.priority !== undefined) {
344
+ if (node.priority >= 3) return 'critical'
345
+ if (node.priority >= 2) return 'high'
346
+ if (node.priority >= 1) return 'normal'
347
+ return 'low'
348
+ }
349
+ return 'normal'
350
+ }
351
+
352
+ private createEmptyResult(): ParallelExecutionResult {
353
+ return {
354
+ proofs: [],
355
+ proofMap: new Map(),
356
+ stats: {
357
+ totalTimeMs: 0,
358
+ criticalPathTimeMs: 0,
359
+ maxParallelism: 0,
360
+ averageParallelism: 0,
361
+ tasksCompleted: 0,
362
+ tasksFailed: 0,
363
+ workSteals: 0,
364
+ peakMemoryUsage: 0,
365
+ speedupFactor: 1,
366
+ efficiency: 1,
367
+ },
368
+ errors: [],
369
+ success: true,
370
+ }
371
+ }
372
+
373
+ private emitProgress(
374
+ options: ParallelExecutionOptions | undefined,
375
+ event: ParallelProgressEvent
376
+ ): void {
377
+ if (options?.enableProgress !== false && options?.onProgress) {
378
+ options.onProgress(event)
379
+ }
380
+ }
381
+
382
+ private estimateRemainingTime(startTime: number): number {
383
+ if (this.completed === 0) {
384
+ return 0
385
+ }
386
+
387
+ const elapsedMs = Date.now() - startTime
388
+ const avgTimePerTask = elapsedMs / this.completed
389
+ const remaining = this.total - this.completed
390
+
391
+ return Math.round(avgTimePerTask * remaining)
392
+ }
393
+
394
+ private estimateSequentialTime(nodes: DependencyNode[]): number {
395
+ // Sum of all estimated costs (normalized to ms)
396
+ // Assuming 1 cost unit = 10ms
397
+ return nodes.reduce((sum, node) => sum + node.estimatedCost * 10, 0)
398
+ }
399
+ }
400
+
401
+ /**
402
+ * Create a parallel executor instance
403
+ */
404
+ export function createParallelExecutor(
405
+ providerFactory: () => ComposableProofProvider
406
+ ): IParallelExecutor {
407
+ return new ParallelExecutor(providerFactory)
408
+ }
409
+
410
+ /**
411
+ * Execute proofs in parallel (convenience function)
412
+ */
413
+ export async function executeParallel(
414
+ nodes: DependencyNode[],
415
+ providerFactory: () => ComposableProofProvider,
416
+ options?: ParallelExecutionOptions
417
+ ): Promise<ParallelExecutionResult> {
418
+ const executor = createParallelExecutor(providerFactory)
419
+ return executor.execute(nodes, options)
420
+ }
@@ -0,0 +1,131 @@
1
+ /**
2
+ * Parallel Proof Generation Module
3
+ *
4
+ * @module proofs/parallel
5
+ * @description Optimized parallel proof generation with dependency resolution,
6
+ * work stealing, and resource-aware concurrency control
7
+ *
8
+ * M20-12: Optimize proof generation parallelization (#307)
9
+ *
10
+ * ## Overview
11
+ *
12
+ * This module provides infrastructure for executing multiple proof generation
13
+ * tasks in parallel with:
14
+ *
15
+ * - **Dependency Graph Analysis**: Determines optimal execution order
16
+ * - **Worker Pool**: Manages parallel workers with work stealing
17
+ * - **Concurrency Control**: CPU/memory-aware dynamic concurrency
18
+ * - **Progress Tracking**: Real-time execution progress events
19
+ *
20
+ * ## Usage
21
+ *
22
+ * ```typescript
23
+ * import {
24
+ * createParallelExecutor,
25
+ * createDependencyNode,
26
+ * } from '@sip-protocol/sdk/proofs/parallel'
27
+ *
28
+ * // Create proof nodes with dependencies
29
+ * const nodes = [
30
+ * createDependencyNode('proof-1', 'commitment', 'noir'),
31
+ * createDependencyNode('proof-2', 'funding', 'noir', {
32
+ * dependencies: ['proof-1'],
33
+ * }),
34
+ * createDependencyNode('proof-3', 'validity', 'halo2', {
35
+ * dependencies: ['proof-1'],
36
+ * }),
37
+ * createDependencyNode('proof-4', 'fulfillment', 'noir', {
38
+ * dependencies: ['proof-2', 'proof-3'],
39
+ * }),
40
+ * ]
41
+ *
42
+ * // Execute in parallel
43
+ * const executor = createParallelExecutor(() => myProofProvider)
44
+ * const result = await executor.execute(nodes, {
45
+ * onProgress: (event) => console.log(`${event.percentage}% complete`),
46
+ * })
47
+ *
48
+ * console.log(`Generated ${result.proofs.length} proofs`)
49
+ * console.log(`Speedup: ${result.stats.speedupFactor}x`)
50
+ * ```
51
+ */
52
+
53
+ // ─── Types and Interfaces ────────────────────────────────────────────────────
54
+
55
+ export type {
56
+ // Dependency Graph
57
+ DependencyNode,
58
+ DependencyEdge,
59
+ DependencyGraph,
60
+ GraphAnalysis,
61
+ // Worker Pool
62
+ WorkerStatus,
63
+ WorkerInfo,
64
+ WorkerPoolConfig,
65
+ WorkerPoolStats,
66
+ // Tasks
67
+ TaskStatus,
68
+ TaskPriority,
69
+ ProofTask,
70
+ TaskSubmitOptions,
71
+ // Concurrency
72
+ SystemResources,
73
+ ConcurrencyConfig,
74
+ ConcurrencyDecision,
75
+ // Work Stealing
76
+ WorkerStealingStats,
77
+ WorkStealEvent,
78
+ // Execution
79
+ ParallelExecutionOptions,
80
+ ParallelProgressEvent,
81
+ ParallelExecutionResult,
82
+ ParallelExecutionStats,
83
+ ParallelExecutionError,
84
+ // Scheduler
85
+ SchedulingStrategy,
86
+ SchedulerConfig,
87
+ // Interface contracts
88
+ IDependencyAnalyzer,
89
+ IWorkerPool,
90
+ IConcurrencyManager,
91
+ IWorkStealingScheduler,
92
+ IParallelExecutor,
93
+ } from './interface'
94
+
95
+ export {
96
+ DEFAULT_WORKER_POOL_CONFIG,
97
+ DEFAULT_CONCURRENCY_CONFIG,
98
+ DEFAULT_SCHEDULER_CONFIG,
99
+ } from './interface'
100
+
101
+ // ─── Dependency Graph ────────────────────────────────────────────────────────
102
+
103
+ export {
104
+ DependencyAnalyzer,
105
+ createDependencyAnalyzer,
106
+ createDependencyNode,
107
+ } from './dependency-graph'
108
+
109
+ // ─── Concurrency Management ──────────────────────────────────────────────────
110
+
111
+ export {
112
+ ConcurrencyManager,
113
+ createConcurrencyManager,
114
+ getRecommendedConcurrency,
115
+ } from './concurrency'
116
+
117
+ // ─── Worker Pool ─────────────────────────────────────────────────────────────
118
+
119
+ export {
120
+ WorkerPool,
121
+ WorkStealingScheduler,
122
+ createWorkerPool,
123
+ } from './worker-pool'
124
+
125
+ // ─── Parallel Executor ───────────────────────────────────────────────────────
126
+
127
+ export {
128
+ ParallelExecutor,
129
+ createParallelExecutor,
130
+ executeParallel,
131
+ } from './executor'