@sip-protocol/sdk 0.7.3 → 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.
- package/LICENSE +21 -0
- package/README.md +267 -0
- package/dist/{TransportWebUSB-TQ7WZ4LE.mjs → TransportWebUSB-YQMAGJAJ.mjs} +12 -9
- package/dist/browser.d.mts +10 -4
- package/dist/browser.d.ts +10 -4
- package/dist/browser.js +47556 -19603
- package/dist/browser.mjs +628 -48
- package/dist/chunk-4GRJ5MAW.mjs +152 -0
- package/dist/chunk-5D7A3L3W.mjs +717 -0
- package/dist/chunk-64AYA5F5.mjs +7834 -0
- package/dist/chunk-GMDGB22A.mjs +379 -0
- package/dist/chunk-I534WKN7.mjs +328 -0
- package/dist/chunk-IBZVA5Y7.mjs +1003 -0
- package/dist/chunk-PRRZAWJE.mjs +223 -0
- package/dist/{chunk-UJCSKKID.mjs → chunk-XGB3TDIC.mjs} +13 -1
- package/dist/{chunk-3M3HNQCW.mjs → chunk-YWGJ77A2.mjs} +28656 -13103
- package/dist/{chunk-6WGN57S2.mjs → chunk-Z3K7W5S3.mjs} +48 -0
- package/dist/constants-LHAAUC2T.mjs +51 -0
- package/dist/dist-2OGQ7FED.mjs +3957 -0
- package/dist/dist-IFHPYLDX.mjs +254 -0
- package/dist/fulfillment_proof-ANHVPKTB.mjs +21 -0
- package/dist/funding_proof-ICFZ5LHY.mjs +21 -0
- package/dist/{index-DIBZHOOQ.d.ts → index-DXh2IGkz.d.ts} +21239 -10304
- package/dist/{index-8MQz13eJ.d.mts → index-DeE1ZzA4.d.mts} +21239 -10304
- package/dist/index.d.mts +9 -3
- package/dist/index.d.ts +9 -3
- package/dist/index.js +48396 -19623
- package/dist/index.mjs +537 -19
- package/dist/interface-Bf7w1PLW.d.mts +679 -0
- package/dist/interface-Bf7w1PLW.d.ts +679 -0
- package/dist/{noir-DKfEzWy9.d.mts → noir-kzbLVTei.d.mts} +31 -21
- package/dist/{noir-DKfEzWy9.d.ts → noir-kzbLVTei.d.ts} +31 -21
- package/dist/proofs/halo2.d.mts +151 -0
- package/dist/proofs/halo2.d.ts +151 -0
- package/dist/proofs/halo2.js +350 -0
- package/dist/proofs/halo2.mjs +11 -0
- package/dist/proofs/kimchi.d.mts +160 -0
- package/dist/proofs/kimchi.d.ts +160 -0
- package/dist/proofs/kimchi.js +431 -0
- package/dist/proofs/kimchi.mjs +13 -0
- package/dist/proofs/noir.d.mts +1 -1
- package/dist/proofs/noir.d.ts +1 -1
- package/dist/proofs/noir.js +74 -18
- package/dist/proofs/noir.mjs +84 -24
- package/dist/solana-U3MEGU7W.mjs +280 -0
- package/dist/validity_proof-3POXLPNY.mjs +21 -0
- package/package.json +54 -21
- package/src/adapters/index.ts +41 -0
- package/src/adapters/jupiter.ts +571 -0
- package/src/adapters/near-intents.ts +135 -0
- package/src/advisor/advisor.ts +653 -0
- package/src/advisor/index.ts +54 -0
- package/src/advisor/tools.ts +303 -0
- package/src/advisor/types.ts +164 -0
- package/src/chains/ethereum/announcement.ts +536 -0
- package/src/chains/ethereum/bnb-optimizations.ts +474 -0
- package/src/chains/ethereum/commitment.ts +522 -0
- package/src/chains/ethereum/constants.ts +462 -0
- package/src/chains/ethereum/deployment.ts +596 -0
- package/src/chains/ethereum/gas-estimation.ts +538 -0
- package/src/chains/ethereum/index.ts +268 -0
- package/src/chains/ethereum/optimizations.ts +614 -0
- package/src/chains/ethereum/privacy-adapter.ts +855 -0
- package/src/chains/ethereum/registry.ts +584 -0
- package/src/chains/ethereum/rpc.ts +905 -0
- package/src/chains/ethereum/stealth.ts +491 -0
- package/src/chains/ethereum/token.ts +790 -0
- package/src/chains/ethereum/transfer.ts +637 -0
- package/src/chains/ethereum/types.ts +456 -0
- package/src/chains/ethereum/viewing-key.ts +455 -0
- package/src/chains/near/commitment.ts +608 -0
- package/src/chains/near/constants.ts +284 -0
- package/src/chains/near/function-call.ts +871 -0
- package/src/chains/near/history.ts +654 -0
- package/src/chains/near/implicit-account.ts +840 -0
- package/src/chains/near/index.ts +393 -0
- package/src/chains/near/native-transfer.ts +658 -0
- package/src/chains/near/nep141.ts +775 -0
- package/src/chains/near/privacy-adapter.ts +889 -0
- package/src/chains/near/resolver.ts +971 -0
- package/src/chains/near/rpc.ts +1016 -0
- package/src/chains/near/stealth.ts +419 -0
- package/src/chains/near/types.ts +317 -0
- package/src/chains/near/viewing-key.ts +876 -0
- package/src/chains/solana/anchor-transfer.ts +386 -0
- package/src/chains/solana/commitment.ts +577 -0
- package/src/chains/solana/constants.ts +126 -12
- package/src/chains/solana/ephemeral-keys.ts +543 -0
- package/src/chains/solana/index.ts +252 -1
- package/src/chains/solana/key-derivation.ts +418 -0
- package/src/chains/solana/kit-compat.ts +334 -0
- package/src/chains/solana/optimizations.ts +560 -0
- package/src/chains/solana/privacy-adapter.ts +605 -0
- package/src/chains/solana/providers/generic.ts +47 -6
- package/src/chains/solana/providers/helius-enhanced-types.ts +336 -0
- package/src/chains/solana/providers/helius-enhanced.ts +623 -0
- package/src/chains/solana/providers/helius.ts +186 -33
- package/src/chains/solana/providers/index.ts +31 -0
- package/src/chains/solana/providers/interface.ts +61 -18
- package/src/chains/solana/providers/quicknode.ts +409 -0
- package/src/chains/solana/providers/triton.ts +426 -0
- package/src/chains/solana/providers/webhook.ts +338 -67
- package/src/chains/solana/rpc-client.ts +1150 -0
- package/src/chains/solana/scan.ts +83 -66
- package/src/chains/solana/sol-transfer.ts +732 -0
- package/src/chains/solana/spl-transfer.ts +886 -0
- package/src/chains/solana/stealth-scanner.ts +703 -0
- package/src/chains/solana/sunspot-verifier.ts +453 -0
- package/src/chains/solana/transaction-builder.ts +755 -0
- package/src/chains/solana/transfer.ts +74 -5
- package/src/chains/solana/types.ts +57 -6
- package/src/chains/solana/utils.ts +110 -0
- package/src/chains/solana/viewing-key.ts +807 -0
- package/src/compliance/fireblocks.ts +921 -0
- package/src/compliance/index.ts +23 -0
- package/src/compliance/range-sas.ts +398 -33
- package/src/config/endpoints.ts +100 -0
- package/src/crypto.ts +11 -8
- package/src/errors.ts +82 -0
- package/src/evm/erc4337-relayer.ts +830 -0
- package/src/evm/index.ts +47 -0
- package/src/fees/calculator.ts +396 -0
- package/src/fees/index.ts +87 -0
- package/src/fees/near-contract.ts +429 -0
- package/src/fees/types.ts +268 -0
- package/src/index.ts +686 -1
- package/src/intent.ts +6 -3
- package/src/logger.ts +324 -0
- package/src/network/index.ts +80 -0
- package/src/network/proxy.ts +691 -0
- package/src/optimizations/index.ts +541 -0
- package/src/oracle/types.ts +1 -0
- package/src/privacy-backends/arcium-types.ts +727 -0
- package/src/privacy-backends/arcium.ts +719 -0
- package/src/privacy-backends/combined-privacy.ts +866 -0
- package/src/privacy-backends/cspl-token.ts +595 -0
- package/src/privacy-backends/cspl-types.ts +512 -0
- package/src/privacy-backends/cspl.ts +907 -0
- package/src/privacy-backends/health.ts +488 -0
- package/src/privacy-backends/inco-types.ts +323 -0
- package/src/privacy-backends/inco.ts +616 -0
- package/src/privacy-backends/index.ts +254 -4
- package/src/privacy-backends/interface.ts +649 -6
- package/src/privacy-backends/lru-cache.ts +343 -0
- package/src/privacy-backends/magicblock.ts +458 -0
- package/src/privacy-backends/mock.ts +258 -0
- package/src/privacy-backends/privacycash.ts +13 -17
- package/src/privacy-backends/private-swap.ts +570 -0
- package/src/privacy-backends/rate-limiter.ts +683 -0
- package/src/privacy-backends/registry.ts +414 -2
- package/src/privacy-backends/router.ts +283 -3
- package/src/privacy-backends/shadowwire.ts +449 -0
- package/src/privacy-backends/sip-native.ts +3 -0
- package/src/privacy-logger.ts +191 -0
- package/src/production-safety.ts +373 -0
- package/src/proofs/aggregator.ts +1029 -0
- package/src/proofs/browser-composer.ts +1150 -0
- package/src/proofs/browser.ts +113 -25
- package/src/proofs/cache/index.ts +127 -0
- package/src/proofs/cache/interface.ts +545 -0
- package/src/proofs/cache/key-generator.ts +188 -0
- package/src/proofs/cache/lru-cache.ts +481 -0
- package/src/proofs/cache/multi-tier-cache.ts +575 -0
- package/src/proofs/cache/persistent-cache.ts +788 -0
- package/src/proofs/compliance-proof.ts +872 -0
- package/src/proofs/composer/base.ts +923 -0
- package/src/proofs/composer/index.ts +25 -0
- package/src/proofs/composer/interface.ts +518 -0
- package/src/proofs/composer/types.ts +383 -0
- package/src/proofs/converters/halo2.ts +452 -0
- package/src/proofs/converters/index.ts +208 -0
- package/src/proofs/converters/interface.ts +363 -0
- package/src/proofs/converters/kimchi.ts +462 -0
- package/src/proofs/converters/noir.ts +451 -0
- package/src/proofs/fallback.ts +888 -0
- package/src/proofs/halo2.ts +42 -0
- package/src/proofs/index.ts +471 -0
- package/src/proofs/interface.ts +13 -0
- package/src/proofs/kimchi.ts +42 -0
- package/src/proofs/lazy.ts +1004 -0
- package/src/proofs/mock.ts +25 -1
- package/src/proofs/noir.ts +110 -29
- package/src/proofs/orchestrator.ts +960 -0
- package/src/proofs/parallel/concurrency.ts +297 -0
- package/src/proofs/parallel/dependency-graph.ts +602 -0
- package/src/proofs/parallel/executor.ts +420 -0
- package/src/proofs/parallel/index.ts +131 -0
- package/src/proofs/parallel/interface.ts +685 -0
- package/src/proofs/parallel/worker-pool.ts +644 -0
- package/src/proofs/providers/halo2.ts +560 -0
- package/src/proofs/providers/index.ts +34 -0
- package/src/proofs/providers/kimchi.ts +641 -0
- package/src/proofs/validator.ts +881 -0
- package/src/proofs/verifier.ts +867 -0
- package/src/quantum/index.ts +112 -0
- package/src/quantum/winternitz-vault.ts +639 -0
- package/src/quantum/wots.ts +611 -0
- package/src/settlement/backends/direct-chain.ts +1 -0
- package/src/settlement/index.ts +9 -0
- package/src/settlement/router.ts +732 -46
- package/src/solana/index.ts +72 -0
- package/src/solana/jito-relayer.ts +687 -0
- package/src/solana/noir-verifier-types.ts +430 -0
- package/src/solana/noir-verifier.ts +816 -0
- package/src/stealth/address-derivation.ts +193 -0
- package/src/stealth/ed25519.ts +431 -0
- package/src/stealth/index.ts +233 -0
- package/src/stealth/meta-address.ts +221 -0
- package/src/stealth/secp256k1.ts +368 -0
- package/src/stealth/utils.ts +194 -0
- package/src/stealth.ts +50 -1504
- package/src/sync/index.ts +106 -0
- package/src/sync/manager.ts +504 -0
- package/src/sync/mock-provider.ts +318 -0
- package/src/sync/oblivious.ts +625 -0
- package/src/tokens/index.ts +15 -0
- package/src/tokens/registry.ts +301 -0
- package/src/utils/deprecation.ts +94 -0
- package/src/utils/index.ts +9 -0
- package/src/wallet/ethereum/index.ts +68 -0
- package/src/wallet/ethereum/metamask-privacy.ts +420 -0
- package/src/wallet/ethereum/multi-wallet.ts +646 -0
- package/src/wallet/ethereum/privacy-adapter.ts +700 -0
- package/src/wallet/ethereum/types.ts +3 -1
- package/src/wallet/ethereum/walletconnect-adapter.ts +675 -0
- package/src/wallet/hardware/index.ts +10 -0
- package/src/wallet/hardware/ledger-privacy.ts +414 -0
- package/src/wallet/index.ts +71 -0
- package/src/wallet/near/adapter.ts +626 -0
- package/src/wallet/near/index.ts +86 -0
- package/src/wallet/near/meteor-wallet.ts +1153 -0
- package/src/wallet/near/my-near-wallet.ts +790 -0
- package/src/wallet/near/wallet-selector.ts +702 -0
- package/src/wallet/solana/adapter.ts +6 -4
- package/src/wallet/solana/index.ts +13 -0
- package/src/wallet/solana/privacy-adapter.ts +567 -0
- package/src/wallet/sui/types.ts +6 -4
- package/src/zcash/rpc-client.ts +13 -6
- package/dist/chunk-2XIVXWHA.mjs +0 -1930
- package/dist/chunk-3INS3PR5.mjs +0 -884
- package/dist/chunk-3OVABDRH.mjs +0 -17096
- package/dist/chunk-7RFRWDCW.mjs +0 -1504
- package/dist/chunk-DLDWZFYC.mjs +0 -1495
- package/dist/chunk-E6SZWREQ.mjs +0 -57
- package/dist/chunk-F6F73W35.mjs +0 -16166
- package/dist/chunk-G33LB27A.mjs +0 -16166
- package/dist/chunk-HGU6HZRC.mjs +0 -231
- package/dist/chunk-L2K34JCU.mjs +0 -1496
- package/dist/chunk-OFDBEIEK.mjs +0 -16166
- package/dist/chunk-SF7YSLF5.mjs +0 -1515
- package/dist/chunk-SN4ZDTVW.mjs +0 -16166
- package/dist/chunk-WWUSGOXE.mjs +0 -17129
- package/dist/constants-VOI7BSLK.mjs +0 -27
- package/dist/index-B71aXVzk.d.ts +0 -13264
- package/dist/index-BYZbDjal.d.ts +0 -11390
- package/dist/index-CHB3KuOB.d.mts +0 -11859
- package/dist/index-CzWPI6Le.d.ts +0 -11859
- package/dist/index-pOIIuwfV.d.mts +0 -13264
- package/dist/index-xbWjohNq.d.mts +0 -11390
- package/dist/solana-4O4K45VU.mjs +0 -46
- package/dist/solana-5EMCTPTS.mjs +0 -46
- package/dist/solana-NDABAZ6P.mjs +0 -56
- package/dist/solana-Q4NAVBTS.mjs +0 -46
- package/dist/solana-ZYO63LY5.mjs +0 -46
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Concurrency Manager for Parallel Proof Generation
|
|
3
|
+
*
|
|
4
|
+
* @module proofs/parallel/concurrency
|
|
5
|
+
* @description CPU/memory-aware concurrency control for optimal resource utilization
|
|
6
|
+
*
|
|
7
|
+
* M20-12: Optimize proof generation parallelization (#307)
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import type {
|
|
11
|
+
SystemResources,
|
|
12
|
+
ConcurrencyConfig,
|
|
13
|
+
ConcurrencyDecision,
|
|
14
|
+
IConcurrencyManager,
|
|
15
|
+
} from './interface'
|
|
16
|
+
import { DEFAULT_CONCURRENCY_CONFIG } from './interface'
|
|
17
|
+
|
|
18
|
+
// ─── Resource Detection ──────────────────────────────────────────────────────
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Detect if running in browser environment
|
|
22
|
+
*/
|
|
23
|
+
function isBrowser(): boolean {
|
|
24
|
+
return typeof window !== 'undefined' && typeof window.document !== 'undefined'
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Check if Web Workers are supported
|
|
29
|
+
*/
|
|
30
|
+
function supportsWebWorkers(): boolean {
|
|
31
|
+
return typeof Worker !== 'undefined'
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Check if SharedArrayBuffer is supported
|
|
36
|
+
*/
|
|
37
|
+
function supportsSharedArrayBuffer(): boolean {
|
|
38
|
+
return typeof SharedArrayBuffer !== 'undefined'
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Get number of CPU cores
|
|
43
|
+
*/
|
|
44
|
+
function getCpuCores(): number {
|
|
45
|
+
if (isBrowser()) {
|
|
46
|
+
return navigator.hardwareConcurrency ?? 4
|
|
47
|
+
}
|
|
48
|
+
// Node.js
|
|
49
|
+
try {
|
|
50
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
51
|
+
const os = require('os')
|
|
52
|
+
return os.cpus().length
|
|
53
|
+
} catch {
|
|
54
|
+
return 4 // Fallback
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Get memory information
|
|
60
|
+
*/
|
|
61
|
+
function getMemoryInfo(): { total: number; available: number } {
|
|
62
|
+
if (isBrowser()) {
|
|
63
|
+
// Browser has limited memory info
|
|
64
|
+
// deviceMemory is not in all browsers, use type assertion
|
|
65
|
+
const nav = navigator as { deviceMemory?: number }
|
|
66
|
+
const deviceMemory = nav.deviceMemory ?? 4 // GB
|
|
67
|
+
const totalBytes = deviceMemory * 1024 * 1024 * 1024
|
|
68
|
+
// Estimate 50% available
|
|
69
|
+
return {
|
|
70
|
+
total: totalBytes,
|
|
71
|
+
available: totalBytes * 0.5,
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
// Node.js
|
|
75
|
+
try {
|
|
76
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
77
|
+
const os = require('os')
|
|
78
|
+
return {
|
|
79
|
+
total: os.totalmem(),
|
|
80
|
+
available: os.freemem(),
|
|
81
|
+
}
|
|
82
|
+
} catch {
|
|
83
|
+
// Fallback: assume 8GB total, 4GB available
|
|
84
|
+
return {
|
|
85
|
+
total: 8 * 1024 * 1024 * 1024,
|
|
86
|
+
available: 4 * 1024 * 1024 * 1024,
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// ─── Concurrency Manager Implementation ──────────────────────────────────────
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Manages concurrency limits based on system resources
|
|
95
|
+
*/
|
|
96
|
+
export class ConcurrencyManager implements IConcurrencyManager {
|
|
97
|
+
private readonly config: ConcurrencyConfig
|
|
98
|
+
private currentLimit: number
|
|
99
|
+
private monitoringInterval: ReturnType<typeof setInterval> | null = null
|
|
100
|
+
private lastCpuUsage = 0
|
|
101
|
+
private cpuSampleCount = 0
|
|
102
|
+
private lastDecision: ConcurrencyDecision | null = null
|
|
103
|
+
|
|
104
|
+
constructor(config: Partial<ConcurrencyConfig> = {}) {
|
|
105
|
+
this.config = { ...DEFAULT_CONCURRENCY_CONFIG, ...config }
|
|
106
|
+
this.currentLimit = this.config.maxConcurrentProofs
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Get current system resources
|
|
111
|
+
*/
|
|
112
|
+
getResources(): SystemResources {
|
|
113
|
+
const memory = getMemoryInfo()
|
|
114
|
+
const cpuCores = getCpuCores()
|
|
115
|
+
|
|
116
|
+
return {
|
|
117
|
+
cpuCores,
|
|
118
|
+
availableMemory: memory.available,
|
|
119
|
+
totalMemory: memory.total,
|
|
120
|
+
cpuUsage: this.lastCpuUsage,
|
|
121
|
+
memoryUsage: Math.round(((memory.total - memory.available) / memory.total) * 100),
|
|
122
|
+
isBrowser: isBrowser(),
|
|
123
|
+
supportsWebWorkers: supportsWebWorkers(),
|
|
124
|
+
supportsSharedArrayBuffer: supportsSharedArrayBuffer(),
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Calculate optimal concurrency level based on current resources
|
|
130
|
+
*/
|
|
131
|
+
calculateOptimalConcurrency(): ConcurrencyDecision {
|
|
132
|
+
const resources = this.getResources()
|
|
133
|
+
const timestamp = Date.now()
|
|
134
|
+
|
|
135
|
+
// Check CPU threshold
|
|
136
|
+
if (resources.cpuUsage > this.config.cpuThreshold) {
|
|
137
|
+
const newLimit = Math.max(
|
|
138
|
+
this.config.minConcurrency,
|
|
139
|
+
Math.floor(this.currentLimit * 0.75)
|
|
140
|
+
)
|
|
141
|
+
this.currentLimit = newLimit
|
|
142
|
+
|
|
143
|
+
return {
|
|
144
|
+
recommendedConcurrency: newLimit,
|
|
145
|
+
reason: 'cpu_high',
|
|
146
|
+
resources,
|
|
147
|
+
timestamp,
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// Check memory threshold
|
|
152
|
+
if (resources.memoryUsage > this.config.memoryThreshold) {
|
|
153
|
+
const newLimit = Math.max(
|
|
154
|
+
this.config.minConcurrency,
|
|
155
|
+
Math.floor(this.currentLimit * 0.75)
|
|
156
|
+
)
|
|
157
|
+
this.currentLimit = newLimit
|
|
158
|
+
|
|
159
|
+
return {
|
|
160
|
+
recommendedConcurrency: newLimit,
|
|
161
|
+
reason: 'memory_high',
|
|
162
|
+
resources,
|
|
163
|
+
timestamp,
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
// Resources available - can potentially increase concurrency
|
|
168
|
+
if (
|
|
169
|
+
resources.cpuUsage < this.config.cpuThreshold * 0.7 &&
|
|
170
|
+
resources.memoryUsage < this.config.memoryThreshold * 0.7 &&
|
|
171
|
+
this.currentLimit < this.config.maxConcurrentProofs
|
|
172
|
+
) {
|
|
173
|
+
// Gradually increase
|
|
174
|
+
const newLimit = Math.min(
|
|
175
|
+
this.config.maxConcurrentProofs,
|
|
176
|
+
this.currentLimit + 1
|
|
177
|
+
)
|
|
178
|
+
this.currentLimit = newLimit
|
|
179
|
+
|
|
180
|
+
return {
|
|
181
|
+
recommendedConcurrency: newLimit,
|
|
182
|
+
reason: 'resources_available',
|
|
183
|
+
resources,
|
|
184
|
+
timestamp,
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
// No change needed
|
|
189
|
+
return {
|
|
190
|
+
recommendedConcurrency: this.currentLimit,
|
|
191
|
+
reason: 'no_change',
|
|
192
|
+
resources,
|
|
193
|
+
timestamp,
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
* Start adaptive monitoring
|
|
199
|
+
*/
|
|
200
|
+
startMonitoring(): void {
|
|
201
|
+
if (this.monitoringInterval) {
|
|
202
|
+
return // Already monitoring
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
if (!this.config.enableAdaptive) {
|
|
206
|
+
return // Adaptive disabled
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
this.monitoringInterval = setInterval(() => {
|
|
210
|
+
this.updateCpuUsage()
|
|
211
|
+
this.lastDecision = this.calculateOptimalConcurrency()
|
|
212
|
+
}, this.config.adaptiveIntervalMs)
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
/**
|
|
216
|
+
* Stop adaptive monitoring
|
|
217
|
+
*/
|
|
218
|
+
stopMonitoring(): void {
|
|
219
|
+
if (this.monitoringInterval) {
|
|
220
|
+
clearInterval(this.monitoringInterval)
|
|
221
|
+
this.monitoringInterval = null
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/**
|
|
226
|
+
* Get current concurrency limit
|
|
227
|
+
*/
|
|
228
|
+
getCurrentLimit(): number {
|
|
229
|
+
return this.currentLimit
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
/**
|
|
233
|
+
* Manually set concurrency limit
|
|
234
|
+
*/
|
|
235
|
+
setLimit(limit: number): void {
|
|
236
|
+
this.currentLimit = Math.max(
|
|
237
|
+
this.config.minConcurrency,
|
|
238
|
+
Math.min(this.config.maxConcurrentProofs, limit)
|
|
239
|
+
)
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
/**
|
|
243
|
+
* Get the last decision made
|
|
244
|
+
*/
|
|
245
|
+
getLastDecision(): ConcurrencyDecision | null {
|
|
246
|
+
return this.lastDecision
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
// ─── Private Methods ─────────────────────────────────────────────────────────
|
|
250
|
+
|
|
251
|
+
private updateCpuUsage(): void {
|
|
252
|
+
// Simple exponential moving average for CPU usage estimation
|
|
253
|
+
// In a real implementation, we'd use process.cpuUsage() in Node.js
|
|
254
|
+
// or performance.now() based sampling in browser
|
|
255
|
+
|
|
256
|
+
// For now, simulate with a placeholder
|
|
257
|
+
// In production, this would be based on actual measurements
|
|
258
|
+
const baselineUsage = Math.random() * 30 + 20 // 20-50% baseline
|
|
259
|
+
const loadFactor = this.currentLimit / this.config.maxConcurrentProofs
|
|
260
|
+
const estimatedUsage = baselineUsage + loadFactor * 30
|
|
261
|
+
|
|
262
|
+
// Exponential moving average
|
|
263
|
+
const alpha = 0.3
|
|
264
|
+
this.lastCpuUsage = this.cpuSampleCount === 0
|
|
265
|
+
? estimatedUsage
|
|
266
|
+
: alpha * estimatedUsage + (1 - alpha) * this.lastCpuUsage
|
|
267
|
+
|
|
268
|
+
this.cpuSampleCount++
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
/**
|
|
273
|
+
* Create a concurrency manager instance
|
|
274
|
+
*/
|
|
275
|
+
export function createConcurrencyManager(
|
|
276
|
+
config?: Partial<ConcurrencyConfig>
|
|
277
|
+
): IConcurrencyManager {
|
|
278
|
+
return new ConcurrencyManager(config)
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
/**
|
|
282
|
+
* Get recommended concurrency based on system resources
|
|
283
|
+
*/
|
|
284
|
+
export function getRecommendedConcurrency(): number {
|
|
285
|
+
const resources = new ConcurrencyManager().getResources()
|
|
286
|
+
|
|
287
|
+
// Base on CPU cores with some overhead
|
|
288
|
+
const baseConcurrency = Math.max(1, resources.cpuCores - 1)
|
|
289
|
+
|
|
290
|
+
// Memory-aware adjustment (assume 256MB per proof, minimum 1)
|
|
291
|
+
const memoryBasedLimit = Math.max(
|
|
292
|
+
1,
|
|
293
|
+
Math.floor(resources.availableMemory / (256 * 1024 * 1024))
|
|
294
|
+
)
|
|
295
|
+
|
|
296
|
+
return Math.min(baseConcurrency, memoryBasedLimit, 8)
|
|
297
|
+
}
|