-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathlimits.ts
More file actions
71 lines (64 loc) · 2.19 KB
/
limits.ts
File metadata and controls
71 lines (64 loc) · 2.19 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
// src/infra/query/persistence/limits.ts
/**
* FILE: limits.ts
* LAYER: infra/query/persistence
* ---------------------------------------------------------------------
* PURPOSE:
* Centralized persistence TTL and filtering rules for React Query cache.
* Used by PersistQueryClientProvider via dehydrateOptions.
*
* HOW IT WORKS:
* - Each query can specify meta.persistence:
* 'realtime' | 'nearRealtime' | 'reference' | 'none'
* - Only safe profiles are persisted by policy.
* - TTL is applied at dehydrate time to avoid writing stale data.
* ---------------------------------------------------------------------
*/
export type PersistenceProfile =
| 'realtime'
| 'nearRealtime'
| 'reference'
| 'none'
export const PersistenceTTL: Record<
Exclude<PersistenceProfile, 'none'>,
number
> = {
realtime: 15_000, // 15s (upper bound)
nearRealtime: 120_000, // 2m
reference: 24 * 60 * 60 * 1000, // 24h
}
export const PersistencePolicy = {
/**
* Global toggle: which profiles are allowed to be persisted.
* We usually do not persist realtime (changes too often and bloats cache).
*/
allowedProfiles: new Set<PersistenceProfile>(['nearRealtime', 'reference']),
/**
* Default profile if feature forgot to set meta.persistence.
* Prefer nearRealtime; use 'none' for strict mode.
*/
defaultProfile: 'nearRealtime' as Exclude<PersistenceProfile, 'none'>,
/**
* Hard safety: never persist queries that are explicitly marked sensitive.
* Feature can set meta.sensitive = true
*/
isSensitive(meta: unknown): boolean {
return Boolean((meta as any)?.sensitive)
},
/**
* Read profile from query meta.
*/
getProfile(meta: unknown): PersistenceProfile {
const p = (meta as any)?.persistence as PersistenceProfile | undefined
return p ?? PersistencePolicy.defaultProfile
},
/**
* TTL check based on query state timestamps.
* We consider dataUpdatedAt as freshness source.
*/
isFreshEnough(profile: PersistenceProfile, dataUpdatedAt: number): boolean {
if (profile === 'none') return false
const ttl = PersistenceTTL[profile as Exclude<PersistenceProfile, 'none'>]
return Date.now() - dataUpdatedAt <= ttl
},
} as const