@sip-protocol/sdk 0.7.3 → 0.8.0
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 +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 +44 -11
- 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,343 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LRU (Least Recently Used) Cache Implementation
|
|
3
|
+
*
|
|
4
|
+
* A generic, efficient LRU cache with configurable max size and optional TTL.
|
|
5
|
+
* Automatically evicts the least recently used entries when the cache is full.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* // Basic usage with max size
|
|
10
|
+
* const cache = new LRUCache<string, User>({ maxSize: 100 })
|
|
11
|
+
* cache.set('user:123', user)
|
|
12
|
+
* const cached = cache.get('user:123')
|
|
13
|
+
*
|
|
14
|
+
* // With TTL expiration (5 minutes)
|
|
15
|
+
* const cacheWithTTL = new LRUCache<string, Balance>({
|
|
16
|
+
* maxSize: 1000,
|
|
17
|
+
* ttl: 5 * 60 * 1000,
|
|
18
|
+
* })
|
|
19
|
+
* ```
|
|
20
|
+
*
|
|
21
|
+
* @see https://en.wikipedia.org/wiki/Cache_replacement_policies#Least_recently_used_(LRU)
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Configuration options for LRU cache
|
|
26
|
+
*/
|
|
27
|
+
export interface LRUCacheConfig {
|
|
28
|
+
/**
|
|
29
|
+
* Maximum number of entries to store.
|
|
30
|
+
* When exceeded, the least recently used entry is evicted.
|
|
31
|
+
*
|
|
32
|
+
* @default 1000
|
|
33
|
+
*/
|
|
34
|
+
maxSize?: number
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Time-to-live in milliseconds for cache entries.
|
|
38
|
+
* Entries older than this are considered expired and will be evicted.
|
|
39
|
+
* If not set, entries never expire based on time.
|
|
40
|
+
*
|
|
41
|
+
* @default undefined (no TTL)
|
|
42
|
+
*/
|
|
43
|
+
ttl?: number
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Called when an entry is evicted from the cache.
|
|
47
|
+
* Useful for cleanup operations or logging.
|
|
48
|
+
*/
|
|
49
|
+
onEvict?: (key: string, value: unknown) => void
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Internal cache entry with metadata
|
|
54
|
+
*/
|
|
55
|
+
interface CacheEntry<V> {
|
|
56
|
+
/** The cached value */
|
|
57
|
+
value: V
|
|
58
|
+
/** Timestamp when entry was created/updated */
|
|
59
|
+
createdAt: number
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* LRU Cache Statistics
|
|
64
|
+
*/
|
|
65
|
+
export interface LRUCacheStats {
|
|
66
|
+
/** Current number of entries */
|
|
67
|
+
size: number
|
|
68
|
+
/** Maximum allowed entries */
|
|
69
|
+
maxSize: number
|
|
70
|
+
/** Number of cache hits */
|
|
71
|
+
hits: number
|
|
72
|
+
/** Number of cache misses */
|
|
73
|
+
misses: number
|
|
74
|
+
/** Hit rate as a percentage (0-100) */
|
|
75
|
+
hitRate: number
|
|
76
|
+
/** Number of entries evicted */
|
|
77
|
+
evictions: number
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* LRU (Least Recently Used) Cache
|
|
82
|
+
*
|
|
83
|
+
* Efficient O(1) get/set operations using Map iteration order.
|
|
84
|
+
* When the cache exceeds maxSize, the oldest (least recently used) entries
|
|
85
|
+
* are automatically evicted.
|
|
86
|
+
*
|
|
87
|
+
* @typeParam K - Key type (must be a valid Map key)
|
|
88
|
+
* @typeParam V - Value type
|
|
89
|
+
*/
|
|
90
|
+
export class LRUCache<K extends string, V> {
|
|
91
|
+
private cache: Map<K, CacheEntry<V>> = new Map()
|
|
92
|
+
private readonly config: Required<Pick<LRUCacheConfig, 'maxSize'>> & LRUCacheConfig
|
|
93
|
+
private stats = { hits: 0, misses: 0, evictions: 0 }
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Create a new LRU cache
|
|
97
|
+
*
|
|
98
|
+
* @param config - Cache configuration
|
|
99
|
+
*/
|
|
100
|
+
constructor(config: LRUCacheConfig = {}) {
|
|
101
|
+
this.config = {
|
|
102
|
+
maxSize: config.maxSize ?? 1000,
|
|
103
|
+
ttl: config.ttl,
|
|
104
|
+
onEvict: config.onEvict,
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
if (this.config.maxSize < 1) {
|
|
108
|
+
throw new Error('maxSize must be at least 1')
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Get a value from the cache
|
|
114
|
+
*
|
|
115
|
+
* If the entry exists and hasn't expired, it's moved to the end
|
|
116
|
+
* of the cache (most recently used position).
|
|
117
|
+
*
|
|
118
|
+
* @param key - Cache key
|
|
119
|
+
* @returns The cached value, or undefined if not found/expired
|
|
120
|
+
*/
|
|
121
|
+
get(key: K): V | undefined {
|
|
122
|
+
const entry = this.cache.get(key)
|
|
123
|
+
|
|
124
|
+
if (!entry) {
|
|
125
|
+
this.stats.misses++
|
|
126
|
+
return undefined
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// Check TTL expiration
|
|
130
|
+
if (this.isExpired(entry)) {
|
|
131
|
+
this.delete(key)
|
|
132
|
+
this.stats.misses++
|
|
133
|
+
return undefined
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// Move to end (most recently used) by re-inserting
|
|
137
|
+
this.cache.delete(key)
|
|
138
|
+
this.cache.set(key, entry)
|
|
139
|
+
|
|
140
|
+
this.stats.hits++
|
|
141
|
+
return entry.value
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Check if a key exists in the cache (without updating LRU order)
|
|
146
|
+
*
|
|
147
|
+
* @param key - Cache key
|
|
148
|
+
* @returns True if key exists and hasn't expired
|
|
149
|
+
*/
|
|
150
|
+
has(key: K): boolean {
|
|
151
|
+
const entry = this.cache.get(key)
|
|
152
|
+
if (!entry) return false
|
|
153
|
+
|
|
154
|
+
if (this.isExpired(entry)) {
|
|
155
|
+
this.delete(key)
|
|
156
|
+
return false
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
return true
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* Set a value in the cache
|
|
164
|
+
*
|
|
165
|
+
* If the cache is at capacity, the least recently used entry
|
|
166
|
+
* is evicted before adding the new entry.
|
|
167
|
+
*
|
|
168
|
+
* @param key - Cache key
|
|
169
|
+
* @param value - Value to cache
|
|
170
|
+
*/
|
|
171
|
+
set(key: K, value: V): void {
|
|
172
|
+
// Delete existing entry to update LRU order
|
|
173
|
+
if (this.cache.has(key)) {
|
|
174
|
+
this.cache.delete(key)
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
// Evict oldest entries if at capacity
|
|
178
|
+
while (this.cache.size >= this.config.maxSize) {
|
|
179
|
+
this.evictOldest()
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
// Add new entry at end (most recently used)
|
|
183
|
+
this.cache.set(key, {
|
|
184
|
+
value,
|
|
185
|
+
createdAt: Date.now(),
|
|
186
|
+
})
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/**
|
|
190
|
+
* Delete an entry from the cache
|
|
191
|
+
*
|
|
192
|
+
* @param key - Cache key
|
|
193
|
+
* @returns True if the entry was deleted
|
|
194
|
+
*/
|
|
195
|
+
delete(key: K): boolean {
|
|
196
|
+
const entry = this.cache.get(key)
|
|
197
|
+
if (!entry) return false
|
|
198
|
+
|
|
199
|
+
this.cache.delete(key)
|
|
200
|
+
|
|
201
|
+
if (this.config.onEvict) {
|
|
202
|
+
this.config.onEvict(key, entry.value)
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
return true
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
/**
|
|
209
|
+
* Clear all entries from the cache
|
|
210
|
+
*/
|
|
211
|
+
clear(): void {
|
|
212
|
+
if (this.config.onEvict) {
|
|
213
|
+
for (const [key, entry] of this.cache) {
|
|
214
|
+
this.config.onEvict(key, entry.value)
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
this.cache.clear()
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
/**
|
|
221
|
+
* Get the current number of entries
|
|
222
|
+
*/
|
|
223
|
+
get size(): number {
|
|
224
|
+
return this.cache.size
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
/**
|
|
228
|
+
* Get all keys in the cache (in LRU order, oldest first)
|
|
229
|
+
*/
|
|
230
|
+
keys(): IterableIterator<K> {
|
|
231
|
+
return this.cache.keys()
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
/**
|
|
235
|
+
* Get all values in the cache (in LRU order, oldest first)
|
|
236
|
+
*/
|
|
237
|
+
values(): V[] {
|
|
238
|
+
return Array.from(this.cache.values()).map(entry => entry.value)
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
/**
|
|
242
|
+
* Get cache statistics
|
|
243
|
+
*
|
|
244
|
+
* @returns Cache stats including hit rate and eviction count
|
|
245
|
+
*/
|
|
246
|
+
getStats(): LRUCacheStats {
|
|
247
|
+
const totalAccesses = this.stats.hits + this.stats.misses
|
|
248
|
+
return {
|
|
249
|
+
size: this.cache.size,
|
|
250
|
+
maxSize: this.config.maxSize,
|
|
251
|
+
hits: this.stats.hits,
|
|
252
|
+
misses: this.stats.misses,
|
|
253
|
+
hitRate: totalAccesses > 0 ? (this.stats.hits / totalAccesses) * 100 : 0,
|
|
254
|
+
evictions: this.stats.evictions,
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
/**
|
|
259
|
+
* Reset cache statistics
|
|
260
|
+
*/
|
|
261
|
+
resetStats(): void {
|
|
262
|
+
this.stats = { hits: 0, misses: 0, evictions: 0 }
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
/**
|
|
266
|
+
* Prune expired entries from the cache
|
|
267
|
+
*
|
|
268
|
+
* This is automatically called during get(), but can be called
|
|
269
|
+
* manually to clean up expired entries proactively.
|
|
270
|
+
*
|
|
271
|
+
* @returns Number of entries pruned
|
|
272
|
+
*/
|
|
273
|
+
prune(): number {
|
|
274
|
+
if (!this.config.ttl) return 0
|
|
275
|
+
|
|
276
|
+
let pruned = 0
|
|
277
|
+
const now = Date.now()
|
|
278
|
+
|
|
279
|
+
for (const [key, entry] of this.cache) {
|
|
280
|
+
if (now - entry.createdAt > this.config.ttl) {
|
|
281
|
+
this.delete(key)
|
|
282
|
+
pruned++
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
return pruned
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
// ─── Private Methods ────────────────────────────────────────────────────────
|
|
290
|
+
|
|
291
|
+
/**
|
|
292
|
+
* Check if an entry has expired based on TTL
|
|
293
|
+
*/
|
|
294
|
+
private isExpired(entry: CacheEntry<V>): boolean {
|
|
295
|
+
if (!this.config.ttl) return false
|
|
296
|
+
return Date.now() - entry.createdAt > this.config.ttl
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
/**
|
|
300
|
+
* Evict the oldest (least recently used) entry
|
|
301
|
+
*/
|
|
302
|
+
private evictOldest(): void {
|
|
303
|
+
// Map iteration order is insertion order, so first entry is oldest
|
|
304
|
+
const oldestKey = this.cache.keys().next().value
|
|
305
|
+
if (oldestKey !== undefined) {
|
|
306
|
+
const entry = this.cache.get(oldestKey)
|
|
307
|
+
this.cache.delete(oldestKey)
|
|
308
|
+
this.stats.evictions++
|
|
309
|
+
|
|
310
|
+
if (this.config.onEvict && entry) {
|
|
311
|
+
this.config.onEvict(oldestKey, entry.value)
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
/**
|
|
318
|
+
* Default cache sizes for different use cases
|
|
319
|
+
*/
|
|
320
|
+
export const DEFAULT_CACHE_SIZES = {
|
|
321
|
+
/** Token accounts cache */
|
|
322
|
+
TOKEN_ACCOUNTS: 1000,
|
|
323
|
+
/** Balance cache */
|
|
324
|
+
BALANCES: 500,
|
|
325
|
+
/** Computation cache */
|
|
326
|
+
COMPUTATIONS: 100,
|
|
327
|
+
/** Pool info cache */
|
|
328
|
+
POOLS: 50,
|
|
329
|
+
} as const
|
|
330
|
+
|
|
331
|
+
/**
|
|
332
|
+
* Default TTL values in milliseconds
|
|
333
|
+
*/
|
|
334
|
+
export const DEFAULT_CACHE_TTL = {
|
|
335
|
+
/** Token accounts: 5 minutes */
|
|
336
|
+
TOKEN_ACCOUNTS: 5 * 60 * 1000,
|
|
337
|
+
/** Balances: 30 seconds (balances change frequently) */
|
|
338
|
+
BALANCES: 30 * 1000,
|
|
339
|
+
/** Computations: 10 minutes */
|
|
340
|
+
COMPUTATIONS: 10 * 60 * 1000,
|
|
341
|
+
/** Pool info: 1 minute */
|
|
342
|
+
POOLS: 60 * 1000,
|
|
343
|
+
} as const
|