Skip to content

Commit 54d4446

Browse files
committed
fix(dev): apply globalThis guard to rate-limiter storage factory to prevent listener accumulation
1 parent 57eafa7 commit 54d4446

1 file changed

Lines changed: 21 additions & 13 deletions

File tree

apps/sim/lib/core/rate-limiter/storage/factory.ts

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,19 +7,27 @@ import { RedisTokenBucket } from './redis-token-bucket'
77

88
const logger = createLogger('RateLimitStorage')
99

10-
let cachedAdapter: RateLimitStorageAdapter | null = null
11-
let reconnectListenerRegistered = false
10+
type FactoryGlobal = typeof globalThis & {
11+
_rlCachedAdapter?: RateLimitStorageAdapter | null
12+
_rlReconnectListenerRegistered?: boolean
13+
}
14+
15+
const g = globalThis as FactoryGlobal
16+
if (!('_rlCachedAdapter' in g)) {
17+
g._rlCachedAdapter = null
18+
g._rlReconnectListenerRegistered = false
19+
}
1220

1321
export function createStorageAdapter(): RateLimitStorageAdapter {
14-
if (cachedAdapter) {
15-
return cachedAdapter
22+
if (g._rlCachedAdapter) {
23+
return g._rlCachedAdapter
1624
}
1725

18-
if (!reconnectListenerRegistered) {
26+
if (!g._rlReconnectListenerRegistered) {
1927
onRedisReconnect(() => {
20-
cachedAdapter = null
28+
g._rlCachedAdapter = null
2129
})
22-
reconnectListenerRegistered = true
30+
g._rlReconnectListenerRegistered = true
2331
}
2432

2533
const storageMethod = getStorageMethod()
@@ -30,27 +38,27 @@ export function createStorageAdapter(): RateLimitStorageAdapter {
3038
logger.warn(
3139
'Redis configured but client unavailable - falling back to PostgreSQL for rate limiting'
3240
)
33-
cachedAdapter = new DbTokenBucket()
41+
g._rlCachedAdapter = new DbTokenBucket()
3442
} else {
3543
logger.info('Rate limiting: Using Redis')
36-
cachedAdapter = new RedisTokenBucket(redis)
44+
g._rlCachedAdapter = new RedisTokenBucket(redis)
3745
}
3846
} else {
3947
logger.info('Rate limiting: Using PostgreSQL')
40-
cachedAdapter = new DbTokenBucket()
48+
g._rlCachedAdapter = new DbTokenBucket()
4149
}
4250

43-
return cachedAdapter
51+
return g._rlCachedAdapter!
4452
}
4553

4654
export function getAdapterType(): StorageMethod {
4755
return getStorageMethod()
4856
}
4957

5058
export function resetStorageAdapter(): void {
51-
cachedAdapter = null
59+
g._rlCachedAdapter = null
5260
}
5361

5462
export function setStorageAdapter(adapter: RateLimitStorageAdapter): void {
55-
cachedAdapter = adapter
63+
g._rlCachedAdapter = adapter
5664
}

0 commit comments

Comments
 (0)