@revealui/core 0.3.0 → 0.5.2
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/dist/client/admin/components/AdminDashboard.d.ts.map +1 -1
- package/dist/client/admin/components/AdminDashboard.js +20 -3
- package/dist/client/richtext/index.d.ts.map +1 -1
- package/dist/client/richtext/plugins/FloatingToolbarPlugin.js +1 -3
- package/dist/collections/operations/create.d.ts +2 -1
- package/dist/collections/operations/create.d.ts.map +1 -1
- package/dist/collections/operations/create.js +28 -1
- package/dist/database/type-adapter.d.ts.map +1 -1
- package/dist/features.d.ts +13 -3
- package/dist/features.d.ts.map +1 -1
- package/dist/features.js +17 -0
- package/dist/globals/GlobalOperations.d.ts.map +1 -1
- package/dist/globals/GlobalOperations.js +12 -2
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -1
- package/dist/license.d.ts +6 -0
- package/dist/license.d.ts.map +1 -1
- package/dist/license.js +14 -1
- package/dist/monitoring/alerts.d.ts +4 -4
- package/dist/monitoring/alerts.d.ts.map +1 -1
- package/dist/plugins/nested-docs.d.ts.map +1 -1
- package/dist/plugins/nested-docs.js +0 -1
- package/dist/queries/queryBuilder.d.ts.map +1 -1
- package/dist/queries/queryBuilder.js +4 -3
- package/dist/richtext/index.d.ts.map +1 -1
- package/dist/storage/vercel-blob.d.ts.map +1 -1
- package/dist/storage/vercel-blob.js +3 -0
- package/dist/types/api.d.ts.map +1 -1
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/core.d.ts +1 -1
- package/dist/types/core.d.ts.map +1 -1
- package/dist/types/extensions.d.ts.map +1 -1
- package/dist/types/frontend.d.ts.map +1 -1
- package/dist/types/legacy.d.ts.map +1 -1
- package/dist/types/query.d.ts.map +1 -1
- package/dist/types/runtime.d.ts +1 -0
- package/dist/types/runtime.d.ts.map +1 -1
- package/dist/utils/error-responses.d.ts.map +1 -1
- package/dist/utils/error-responses.js +2 -3
- package/package.json +24 -24
- package/dist/caching/app-cache.d.ts +0 -242
- package/dist/caching/app-cache.d.ts.map +0 -1
- package/dist/caching/app-cache.js +0 -438
- package/dist/caching/cdn-config.d.ts +0 -155
- package/dist/caching/cdn-config.d.ts.map +0 -1
- package/dist/caching/cdn-config.js +0 -415
- package/dist/caching/edge-cache.d.ts +0 -177
- package/dist/caching/edge-cache.d.ts.map +0 -1
- package/dist/caching/edge-cache.js +0 -414
- package/dist/caching/service-worker.d.ts +0 -157
- package/dist/caching/service-worker.d.ts.map +0 -1
- package/dist/caching/service-worker.js +0 -438
- package/dist/client/admin/utils/auth.d.ts +0 -23
- package/dist/client/admin/utils/auth.d.ts.map +0 -1
- package/dist/client/admin/utils/auth.js +0 -52
- package/dist/client/http/client.d.ts +0 -15
- package/dist/client/http/client.d.ts.map +0 -1
- package/dist/client/http/client.js +0 -49
- package/dist/client/http/fetchBanner.d.ts +0 -18
- package/dist/client/http/fetchBanner.d.ts.map +0 -1
- package/dist/client/http/fetchBanner.js +0 -44
- package/dist/client/http/fetchCard.d.ts +0 -18
- package/dist/client/http/fetchCard.d.ts.map +0 -1
- package/dist/client/http/fetchCard.js +0 -46
- package/dist/client/http/fetchEvents.d.ts +0 -18
- package/dist/client/http/fetchEvents.d.ts.map +0 -1
- package/dist/client/http/fetchEvents.js +0 -44
- package/dist/client/http/fetchHero.d.ts +0 -17
- package/dist/client/http/fetchHero.d.ts.map +0 -1
- package/dist/client/http/fetchHero.js +0 -55
- package/dist/client/http/fetchMainInfos.d.ts +0 -17
- package/dist/client/http/fetchMainInfos.d.ts.map +0 -1
- package/dist/client/http/fetchMainInfos.js +0 -44
- package/dist/client/http/fetchVideos.d.ts +0 -13
- package/dist/client/http/fetchVideos.d.ts.map +0 -1
- package/dist/client/http/fetchVideos.js +0 -36
- package/dist/client/http/index.d.ts +0 -19
- package/dist/client/http/index.d.ts.map +0 -1
- package/dist/client/http/index.js +0 -11
- package/dist/error-handling/circuit-breaker.d.ts +0 -262
- package/dist/error-handling/circuit-breaker.d.ts.map +0 -1
- package/dist/error-handling/circuit-breaker.js +0 -550
- package/dist/error-handling/retry.d.ts +0 -194
- package/dist/error-handling/retry.d.ts.map +0 -1
- package/dist/error-handling/retry.js +0 -455
- package/dist/errors/index.d.ts +0 -23
- package/dist/errors/index.d.ts.map +0 -1
- package/dist/errors/index.js +0 -40
- package/dist/generated/agents/index.d.ts +0 -8
- package/dist/generated/agents/index.d.ts.map +0 -1
- package/dist/generated/agents/index.js +0 -7
- package/dist/generated/components/index.d.ts +0 -8
- package/dist/generated/components/index.d.ts.map +0 -1
- package/dist/generated/components/index.js +0 -7
- package/dist/generated/functions/index.d.ts +0 -8
- package/dist/generated/functions/index.d.ts.map +0 -1
- package/dist/generated/functions/index.js +0 -7
- package/dist/generated/hooks/index.d.ts +0 -8
- package/dist/generated/hooks/index.d.ts.map +0 -1
- package/dist/generated/hooks/index.js +0 -7
- package/dist/generated/plans/index.d.ts +0 -8
- package/dist/generated/plans/index.d.ts.map +0 -1
- package/dist/generated/plans/index.js +0 -7
- package/dist/generated/prompts/index.d.ts +0 -8
- package/dist/generated/prompts/index.d.ts.map +0 -1
- package/dist/generated/prompts/index.js +0 -7
- package/dist/generated/tools/index.d.ts +0 -8
- package/dist/generated/tools/index.d.ts.map +0 -1
- package/dist/generated/tools/index.js +0 -7
- package/dist/generated/types/supabase.d.ts +0 -193
- package/dist/generated/types/supabase.d.ts.map +0 -1
- package/dist/generated/types/supabase.js +0 -5
- package/dist/optimization/asset-optimizer.d.ts +0 -206
- package/dist/optimization/asset-optimizer.d.ts.map +0 -1
- package/dist/optimization/asset-optimizer.js +0 -336
- package/dist/optimization/build-optimizer.d.ts +0 -202
- package/dist/optimization/build-optimizer.d.ts.map +0 -1
- package/dist/optimization/build-optimizer.js +0 -271
- package/dist/optimization/bundle-analyzer.d.ts +0 -98
- package/dist/optimization/bundle-analyzer.d.ts.map +0 -1
- package/dist/optimization/bundle-analyzer.js +0 -346
- package/dist/optimization/code-splitting.d.ts +0 -121
- package/dist/optimization/code-splitting.d.ts.map +0 -1
- package/dist/optimization/code-splitting.js +0 -261
- package/dist/plugin/index.d.ts +0 -12
- package/dist/plugin/index.d.ts.map +0 -1
- package/dist/plugin/index.js +0 -4
- package/dist/security/audit.d.ts +0 -188
- package/dist/security/audit.d.ts.map +0 -1
- package/dist/security/audit.js +0 -433
- package/dist/security/auth.d.ts +0 -110
- package/dist/security/auth.d.ts.map +0 -1
- package/dist/security/auth.js +0 -257
- package/dist/security/authorization.d.ts +0 -211
- package/dist/security/authorization.d.ts.map +0 -1
- package/dist/security/authorization.js +0 -492
- package/dist/security/encryption.d.ts +0 -226
- package/dist/security/encryption.d.ts.map +0 -1
- package/dist/security/encryption.js +0 -534
- package/dist/security/gdpr-storage.d.ts +0 -102
- package/dist/security/gdpr-storage.d.ts.map +0 -1
- package/dist/security/gdpr-storage.js +0 -65
- package/dist/security/gdpr.d.ts +0 -320
- package/dist/security/gdpr.d.ts.map +0 -1
- package/dist/security/gdpr.js +0 -531
- package/dist/security/headers.d.ts +0 -184
- package/dist/security/headers.d.ts.map +0 -1
- package/dist/security/headers.js +0 -420
- package/dist/utils/jwt-validation.d.ts +0 -14
- package/dist/utils/jwt-validation.d.ts.map +0 -1
- package/dist/utils/jwt-validation.js +0 -36
- package/dist/utils/request-headers.d.ts +0 -15
- package/dist/utils/request-headers.d.ts.map +0 -1
- package/dist/utils/request-headers.js +0 -31
|
@@ -1,438 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Application-Level Caching
|
|
3
|
-
*
|
|
4
|
-
* Utilities for React Query, SWR, and application-level cache management
|
|
5
|
-
*/
|
|
6
|
-
import { logger } from '../observability/logger.js';
|
|
7
|
-
export const DEFAULT_REACT_QUERY_CONFIG = {
|
|
8
|
-
defaultOptions: {
|
|
9
|
-
queries: {
|
|
10
|
-
staleTime: 1000 * 60 * 5, // 5 minutes
|
|
11
|
-
cacheTime: 1000 * 60 * 30, // 30 minutes
|
|
12
|
-
refetchOnWindowFocus: true,
|
|
13
|
-
refetchOnReconnect: true,
|
|
14
|
-
refetchOnMount: true,
|
|
15
|
-
retry: 3,
|
|
16
|
-
retryDelay: (attemptIndex) => Math.min(1000 * 2 ** attemptIndex, 30000),
|
|
17
|
-
},
|
|
18
|
-
mutations: {
|
|
19
|
-
retry: 3,
|
|
20
|
-
retryDelay: (attemptIndex) => Math.min(1000 * 2 ** attemptIndex, 30000),
|
|
21
|
-
},
|
|
22
|
-
},
|
|
23
|
-
};
|
|
24
|
-
export const DEFAULT_SWR_CONFIG = {
|
|
25
|
-
revalidateOnFocus: true,
|
|
26
|
-
revalidateOnReconnect: true,
|
|
27
|
-
refreshInterval: 0,
|
|
28
|
-
dedupingInterval: 2000,
|
|
29
|
-
loadingTimeout: 3000,
|
|
30
|
-
errorRetryInterval: 5000,
|
|
31
|
-
errorRetryCount: 3,
|
|
32
|
-
focusThrottleInterval: 5000,
|
|
33
|
-
shouldRetryOnError: true,
|
|
34
|
-
keepPreviousData: false,
|
|
35
|
-
};
|
|
36
|
-
/**
|
|
37
|
-
* Cache Key Generator
|
|
38
|
-
*/
|
|
39
|
-
export class CacheKeyGenerator {
|
|
40
|
-
prefix;
|
|
41
|
-
constructor(prefix = 'app') {
|
|
42
|
-
this.prefix = prefix;
|
|
43
|
-
}
|
|
44
|
-
/**
|
|
45
|
-
* Generate key for list queries
|
|
46
|
-
*/
|
|
47
|
-
list(resource, filters) {
|
|
48
|
-
const key = [this.prefix, resource, 'list'];
|
|
49
|
-
if (filters && Object.keys(filters).length > 0) {
|
|
50
|
-
key.push(JSON.stringify(filters));
|
|
51
|
-
}
|
|
52
|
-
return key;
|
|
53
|
-
}
|
|
54
|
-
/**
|
|
55
|
-
* Generate key for detail queries
|
|
56
|
-
*/
|
|
57
|
-
detail(resource, id) {
|
|
58
|
-
return [this.prefix, resource, 'detail', String(id)];
|
|
59
|
-
}
|
|
60
|
-
/**
|
|
61
|
-
* Generate key for custom queries
|
|
62
|
-
*/
|
|
63
|
-
custom(...parts) {
|
|
64
|
-
return [
|
|
65
|
-
this.prefix,
|
|
66
|
-
...parts.map((part) => (typeof part === 'object' ? JSON.stringify(part) : String(part))),
|
|
67
|
-
];
|
|
68
|
-
}
|
|
69
|
-
/**
|
|
70
|
-
* Generate key for infinite queries
|
|
71
|
-
*/
|
|
72
|
-
infinite(resource, filters) {
|
|
73
|
-
const key = [this.prefix, resource, 'infinite'];
|
|
74
|
-
if (filters && Object.keys(filters).length > 0) {
|
|
75
|
-
key.push(JSON.stringify(filters));
|
|
76
|
-
}
|
|
77
|
-
return key;
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
/**
|
|
81
|
-
* Cache Invalidation Strategies
|
|
82
|
-
*/
|
|
83
|
-
export class CacheInvalidator {
|
|
84
|
-
/**
|
|
85
|
-
* Invalidate by resource
|
|
86
|
-
*/
|
|
87
|
-
static byResource(resource) {
|
|
88
|
-
return ['app', resource];
|
|
89
|
-
}
|
|
90
|
-
/**
|
|
91
|
-
* Invalidate by ID
|
|
92
|
-
*/
|
|
93
|
-
static byId(resource, id) {
|
|
94
|
-
return ['app', resource, 'detail', String(id)];
|
|
95
|
-
}
|
|
96
|
-
/**
|
|
97
|
-
* Invalidate lists
|
|
98
|
-
*/
|
|
99
|
-
static lists(resource) {
|
|
100
|
-
return ['app', resource, 'list'];
|
|
101
|
-
}
|
|
102
|
-
/**
|
|
103
|
-
* Invalidate infinite queries
|
|
104
|
-
*/
|
|
105
|
-
static infinite(resource) {
|
|
106
|
-
return ['app', resource, 'infinite'];
|
|
107
|
-
}
|
|
108
|
-
/**
|
|
109
|
-
* Invalidate all
|
|
110
|
-
*/
|
|
111
|
-
static all() {
|
|
112
|
-
return ['app'];
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
/**
|
|
116
|
-
* Optimistic Update Helper
|
|
117
|
-
*/
|
|
118
|
-
export class OptimisticUpdater {
|
|
119
|
-
/**
|
|
120
|
-
* Update list (add item)
|
|
121
|
-
*/
|
|
122
|
-
static addToList(oldData, newItem) {
|
|
123
|
-
if (!oldData)
|
|
124
|
-
return [newItem];
|
|
125
|
-
return [...oldData, newItem];
|
|
126
|
-
}
|
|
127
|
-
/**
|
|
128
|
-
* Update list (remove item)
|
|
129
|
-
*/
|
|
130
|
-
static removeFromList(oldData, id) {
|
|
131
|
-
if (!oldData)
|
|
132
|
-
return [];
|
|
133
|
-
return oldData.filter((item) => item.id !== id);
|
|
134
|
-
}
|
|
135
|
-
/**
|
|
136
|
-
* Update list (update item)
|
|
137
|
-
*/
|
|
138
|
-
static updateInList(oldData, id, updates) {
|
|
139
|
-
if (!oldData)
|
|
140
|
-
return [];
|
|
141
|
-
return oldData.map((item) => (item.id === id ? { ...item, ...updates } : item));
|
|
142
|
-
}
|
|
143
|
-
/**
|
|
144
|
-
* Update detail
|
|
145
|
-
*/
|
|
146
|
-
static updateDetail(oldData, updates) {
|
|
147
|
-
if (!oldData)
|
|
148
|
-
return undefined;
|
|
149
|
-
return { ...oldData, ...updates };
|
|
150
|
-
}
|
|
151
|
-
/**
|
|
152
|
-
* Update paginated list
|
|
153
|
-
*/
|
|
154
|
-
static updatePaginatedList(oldData, id, updates) {
|
|
155
|
-
if (!oldData)
|
|
156
|
-
return undefined;
|
|
157
|
-
return {
|
|
158
|
-
...oldData,
|
|
159
|
-
pages: oldData.pages.map((page) => ({
|
|
160
|
-
...page,
|
|
161
|
-
data: page.data.map((item) => (item.id === id ? { ...item, ...updates } : item)),
|
|
162
|
-
})),
|
|
163
|
-
};
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
export class CachePrefetcher {
|
|
167
|
-
/**
|
|
168
|
-
* Prefetch on hover
|
|
169
|
-
*/
|
|
170
|
-
static onHover(prefetchFn, delay = 300) {
|
|
171
|
-
let timeout = null;
|
|
172
|
-
return {
|
|
173
|
-
onMouseEnter: () => {
|
|
174
|
-
timeout = setTimeout(() => {
|
|
175
|
-
prefetchFn();
|
|
176
|
-
}, delay);
|
|
177
|
-
},
|
|
178
|
-
onMouseLeave: () => {
|
|
179
|
-
if (timeout) {
|
|
180
|
-
clearTimeout(timeout);
|
|
181
|
-
timeout = null;
|
|
182
|
-
}
|
|
183
|
-
},
|
|
184
|
-
};
|
|
185
|
-
}
|
|
186
|
-
/**
|
|
187
|
-
* Prefetch on visibility
|
|
188
|
-
*/
|
|
189
|
-
static onVisible(element, prefetchFn, options) {
|
|
190
|
-
if (!element || typeof IntersectionObserver === 'undefined') {
|
|
191
|
-
return () => { };
|
|
192
|
-
}
|
|
193
|
-
const observer = new IntersectionObserver((entries) => {
|
|
194
|
-
for (const entry of entries) {
|
|
195
|
-
if (entry.isIntersecting) {
|
|
196
|
-
prefetchFn();
|
|
197
|
-
observer.disconnect();
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
}, options);
|
|
201
|
-
observer.observe(element);
|
|
202
|
-
return () => observer.disconnect();
|
|
203
|
-
}
|
|
204
|
-
/**
|
|
205
|
-
* Prefetch on idle
|
|
206
|
-
*/
|
|
207
|
-
static onIdle(prefetchFn) {
|
|
208
|
-
if ('requestIdleCallback' in window) {
|
|
209
|
-
window.requestIdleCallback(() => prefetchFn());
|
|
210
|
-
}
|
|
211
|
-
else {
|
|
212
|
-
setTimeout(() => prefetchFn(), 1);
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
export class CachePersistence {
|
|
217
|
-
config;
|
|
218
|
-
constructor(config) {
|
|
219
|
-
this.config = {
|
|
220
|
-
storage: 'localStorage',
|
|
221
|
-
version: 1,
|
|
222
|
-
maxAge: 1000 * 60 * 60 * 24, // 1 day
|
|
223
|
-
...config,
|
|
224
|
-
};
|
|
225
|
-
}
|
|
226
|
-
/**
|
|
227
|
-
* Save to storage
|
|
228
|
-
*/
|
|
229
|
-
async save(data) {
|
|
230
|
-
const entry = {
|
|
231
|
-
data,
|
|
232
|
-
version: this.config.version,
|
|
233
|
-
timestamp: Date.now(),
|
|
234
|
-
};
|
|
235
|
-
try {
|
|
236
|
-
if (this.config.storage === 'indexedDB') {
|
|
237
|
-
await this.saveToIndexedDB(entry);
|
|
238
|
-
}
|
|
239
|
-
else {
|
|
240
|
-
const storage = this.config.storage === 'localStorage' ? localStorage : sessionStorage;
|
|
241
|
-
storage.setItem(this.config.key, JSON.stringify(entry));
|
|
242
|
-
}
|
|
243
|
-
}
|
|
244
|
-
catch (error) {
|
|
245
|
-
logger.error('Cache persistence save failed', error instanceof Error ? error : new Error(String(error)));
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
/**
|
|
249
|
-
* Load from storage
|
|
250
|
-
*/
|
|
251
|
-
async load() {
|
|
252
|
-
try {
|
|
253
|
-
let entry;
|
|
254
|
-
if (this.config.storage === 'indexedDB') {
|
|
255
|
-
entry = await this.loadFromIndexedDB();
|
|
256
|
-
}
|
|
257
|
-
else {
|
|
258
|
-
const storage = this.config.storage === 'localStorage' ? localStorage : sessionStorage;
|
|
259
|
-
const stored = storage.getItem(this.config.key);
|
|
260
|
-
if (!stored)
|
|
261
|
-
return null;
|
|
262
|
-
entry = JSON.parse(stored);
|
|
263
|
-
}
|
|
264
|
-
if (!entry)
|
|
265
|
-
return null;
|
|
266
|
-
// Check version
|
|
267
|
-
if (entry.version !== this.config.version) {
|
|
268
|
-
await this.remove();
|
|
269
|
-
return null;
|
|
270
|
-
}
|
|
271
|
-
// Check age
|
|
272
|
-
const age = Date.now() - entry.timestamp;
|
|
273
|
-
if (age > this.config.maxAge) {
|
|
274
|
-
await this.remove();
|
|
275
|
-
return null;
|
|
276
|
-
}
|
|
277
|
-
return entry.data;
|
|
278
|
-
}
|
|
279
|
-
catch (error) {
|
|
280
|
-
logger.error('Cache persistence load failed', error instanceof Error ? error : new Error(String(error)));
|
|
281
|
-
return null;
|
|
282
|
-
}
|
|
283
|
-
}
|
|
284
|
-
/**
|
|
285
|
-
* Remove from storage
|
|
286
|
-
*/
|
|
287
|
-
async remove() {
|
|
288
|
-
try {
|
|
289
|
-
if (this.config.storage === 'indexedDB') {
|
|
290
|
-
await this.removeFromIndexedDB();
|
|
291
|
-
}
|
|
292
|
-
else {
|
|
293
|
-
const storage = this.config.storage === 'localStorage' ? localStorage : sessionStorage;
|
|
294
|
-
storage.removeItem(this.config.key);
|
|
295
|
-
}
|
|
296
|
-
}
|
|
297
|
-
catch (error) {
|
|
298
|
-
logger.error('Cache persistence remove failed', error instanceof Error ? error : new Error(String(error)));
|
|
299
|
-
}
|
|
300
|
-
}
|
|
301
|
-
/**
|
|
302
|
-
* Save to IndexedDB
|
|
303
|
-
*/
|
|
304
|
-
async saveToIndexedDB(entry) {
|
|
305
|
-
return new Promise((resolve, reject) => {
|
|
306
|
-
const request = indexedDB.open('app-cache', 1);
|
|
307
|
-
request.onerror = () => reject(request.error);
|
|
308
|
-
request.onsuccess = () => {
|
|
309
|
-
const db = request.result;
|
|
310
|
-
const transaction = db.transaction(['cache'], 'readwrite');
|
|
311
|
-
const store = transaction.objectStore('cache');
|
|
312
|
-
const putRequest = store.put(entry, this.config.key);
|
|
313
|
-
putRequest.onerror = () => reject(putRequest.error);
|
|
314
|
-
putRequest.onsuccess = () => resolve();
|
|
315
|
-
};
|
|
316
|
-
request.onupgradeneeded = (event) => {
|
|
317
|
-
const db = event.target.result;
|
|
318
|
-
if (!db.objectStoreNames.contains('cache')) {
|
|
319
|
-
db.createObjectStore('cache');
|
|
320
|
-
}
|
|
321
|
-
};
|
|
322
|
-
});
|
|
323
|
-
}
|
|
324
|
-
/**
|
|
325
|
-
* Load from IndexedDB
|
|
326
|
-
*/
|
|
327
|
-
async loadFromIndexedDB() {
|
|
328
|
-
return new Promise((resolve, reject) => {
|
|
329
|
-
const request = indexedDB.open('app-cache', 1);
|
|
330
|
-
request.onerror = () => reject(request.error);
|
|
331
|
-
request.onsuccess = () => {
|
|
332
|
-
const db = request.result;
|
|
333
|
-
const transaction = db.transaction(['cache'], 'readonly');
|
|
334
|
-
const store = transaction.objectStore('cache');
|
|
335
|
-
const getRequest = store.get(this.config.key);
|
|
336
|
-
getRequest.onerror = () => reject(getRequest.error);
|
|
337
|
-
getRequest.onsuccess = () => resolve(getRequest.result || null);
|
|
338
|
-
};
|
|
339
|
-
request.onupgradeneeded = (event) => {
|
|
340
|
-
const db = event.target.result;
|
|
341
|
-
if (!db.objectStoreNames.contains('cache')) {
|
|
342
|
-
db.createObjectStore('cache');
|
|
343
|
-
}
|
|
344
|
-
};
|
|
345
|
-
});
|
|
346
|
-
}
|
|
347
|
-
/**
|
|
348
|
-
* Remove from IndexedDB
|
|
349
|
-
*/
|
|
350
|
-
async removeFromIndexedDB() {
|
|
351
|
-
return new Promise((resolve, reject) => {
|
|
352
|
-
const request = indexedDB.open('app-cache', 1);
|
|
353
|
-
request.onerror = () => reject(request.error);
|
|
354
|
-
request.onsuccess = () => {
|
|
355
|
-
const db = request.result;
|
|
356
|
-
const transaction = db.transaction(['cache'], 'readwrite');
|
|
357
|
-
const store = transaction.objectStore('cache');
|
|
358
|
-
const deleteRequest = store.delete(this.config.key);
|
|
359
|
-
deleteRequest.onerror = () => reject(deleteRequest.error);
|
|
360
|
-
deleteRequest.onsuccess = () => resolve();
|
|
361
|
-
};
|
|
362
|
-
});
|
|
363
|
-
}
|
|
364
|
-
}
|
|
365
|
-
export class CacheStatsTracker {
|
|
366
|
-
hits = 0;
|
|
367
|
-
misses = 0;
|
|
368
|
-
_cacheSize = 0;
|
|
369
|
-
/**
|
|
370
|
-
* Record cache hit
|
|
371
|
-
*/
|
|
372
|
-
recordHit() {
|
|
373
|
-
this.hits++;
|
|
374
|
-
}
|
|
375
|
-
/**
|
|
376
|
-
* Record cache miss
|
|
377
|
-
*/
|
|
378
|
-
recordMiss() {
|
|
379
|
-
this.misses++;
|
|
380
|
-
}
|
|
381
|
-
/**
|
|
382
|
-
* Update the reported cache size (call from the cache implementation)
|
|
383
|
-
*/
|
|
384
|
-
setCacheSize(size) {
|
|
385
|
-
this._cacheSize = size;
|
|
386
|
-
}
|
|
387
|
-
/**
|
|
388
|
-
* Get statistics
|
|
389
|
-
*/
|
|
390
|
-
getStats() {
|
|
391
|
-
const totalQueries = this.hits + this.misses;
|
|
392
|
-
const hitRate = totalQueries > 0 ? (this.hits / totalQueries) * 100 : 0;
|
|
393
|
-
return {
|
|
394
|
-
hits: this.hits,
|
|
395
|
-
misses: this.misses,
|
|
396
|
-
hitRate,
|
|
397
|
-
totalQueries,
|
|
398
|
-
cacheSize: this._cacheSize,
|
|
399
|
-
};
|
|
400
|
-
}
|
|
401
|
-
/**
|
|
402
|
-
* Reset statistics
|
|
403
|
-
*/
|
|
404
|
-
reset() {
|
|
405
|
-
this.hits = 0;
|
|
406
|
-
this.misses = 0;
|
|
407
|
-
this._cacheSize = 0;
|
|
408
|
-
}
|
|
409
|
-
}
|
|
410
|
-
/**
|
|
411
|
-
* Query dedupe helper
|
|
412
|
-
*/
|
|
413
|
-
export class QueryDeduplicator {
|
|
414
|
-
pending = new Map();
|
|
415
|
-
/**
|
|
416
|
-
* Deduplicate query
|
|
417
|
-
*/
|
|
418
|
-
async dedupe(key, queryFn) {
|
|
419
|
-
// Check if query is already pending
|
|
420
|
-
const existing = this.pending.get(key);
|
|
421
|
-
if (existing) {
|
|
422
|
-
return existing;
|
|
423
|
-
}
|
|
424
|
-
// Execute query
|
|
425
|
-
const promise = queryFn();
|
|
426
|
-
// Store pending query
|
|
427
|
-
this.pending.set(key, promise);
|
|
428
|
-
// Remove from pending when done
|
|
429
|
-
promise.then(() => this.pending.delete(key)).catch(() => this.pending.delete(key));
|
|
430
|
-
return promise;
|
|
431
|
-
}
|
|
432
|
-
/**
|
|
433
|
-
* Clear pending queries
|
|
434
|
-
*/
|
|
435
|
-
clear() {
|
|
436
|
-
this.pending.clear();
|
|
437
|
-
}
|
|
438
|
-
}
|
|
@@ -1,155 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* CDN Configuration and Cache Management
|
|
3
|
-
*
|
|
4
|
-
* Utilities for CDN caching, edge caching, and cache invalidation
|
|
5
|
-
*/
|
|
6
|
-
/**
|
|
7
|
-
* CDN Cache Configuration
|
|
8
|
-
*/
|
|
9
|
-
export interface CDNCacheConfig {
|
|
10
|
-
provider?: 'cloudflare' | 'vercel' | 'fastly' | 'custom';
|
|
11
|
-
zones?: string[];
|
|
12
|
-
ttl?: number;
|
|
13
|
-
staleWhileRevalidate?: number;
|
|
14
|
-
staleIfError?: number;
|
|
15
|
-
bypassCache?: boolean;
|
|
16
|
-
cacheKey?: string[];
|
|
17
|
-
varyHeaders?: string[];
|
|
18
|
-
}
|
|
19
|
-
export declare const DEFAULT_CDN_CONFIG: CDNCacheConfig;
|
|
20
|
-
/**
|
|
21
|
-
* Generate Cache-Control header
|
|
22
|
-
*/
|
|
23
|
-
export declare function generateCacheControl(config: {
|
|
24
|
-
maxAge?: number;
|
|
25
|
-
sMaxAge?: number;
|
|
26
|
-
staleWhileRevalidate?: number;
|
|
27
|
-
staleIfError?: number;
|
|
28
|
-
public?: boolean;
|
|
29
|
-
private?: boolean;
|
|
30
|
-
immutable?: boolean;
|
|
31
|
-
noCache?: boolean;
|
|
32
|
-
noStore?: boolean;
|
|
33
|
-
}): string;
|
|
34
|
-
/**
|
|
35
|
-
* Cache presets for different asset types
|
|
36
|
-
*/
|
|
37
|
-
export declare const CDN_CACHE_PRESETS: {
|
|
38
|
-
readonly immutable: {
|
|
39
|
-
readonly maxAge: 31536000;
|
|
40
|
-
readonly sMaxAge: 31536000;
|
|
41
|
-
readonly public: true;
|
|
42
|
-
readonly immutable: true;
|
|
43
|
-
};
|
|
44
|
-
readonly static: {
|
|
45
|
-
readonly maxAge: 2592000;
|
|
46
|
-
readonly sMaxAge: 31536000;
|
|
47
|
-
readonly staleWhileRevalidate: 86400;
|
|
48
|
-
readonly public: true;
|
|
49
|
-
};
|
|
50
|
-
readonly api: {
|
|
51
|
-
readonly maxAge: 0;
|
|
52
|
-
readonly sMaxAge: 60;
|
|
53
|
-
readonly staleWhileRevalidate: 30;
|
|
54
|
-
readonly public: true;
|
|
55
|
-
};
|
|
56
|
-
readonly page: {
|
|
57
|
-
readonly maxAge: 0;
|
|
58
|
-
readonly sMaxAge: 300;
|
|
59
|
-
readonly staleWhileRevalidate: 60;
|
|
60
|
-
readonly public: true;
|
|
61
|
-
};
|
|
62
|
-
readonly private: {
|
|
63
|
-
readonly maxAge: 300;
|
|
64
|
-
readonly private: true;
|
|
65
|
-
readonly staleWhileRevalidate: 60;
|
|
66
|
-
};
|
|
67
|
-
readonly noCache: {
|
|
68
|
-
readonly noStore: true;
|
|
69
|
-
};
|
|
70
|
-
readonly revalidate: {
|
|
71
|
-
readonly maxAge: 0;
|
|
72
|
-
readonly sMaxAge: 0;
|
|
73
|
-
readonly noCache: true;
|
|
74
|
-
};
|
|
75
|
-
};
|
|
76
|
-
/**
|
|
77
|
-
* CDN Purge Configuration
|
|
78
|
-
*/
|
|
79
|
-
export interface CDNPurgeConfig {
|
|
80
|
-
provider: 'cloudflare' | 'vercel' | 'fastly';
|
|
81
|
-
apiKey?: string;
|
|
82
|
-
apiSecret?: string;
|
|
83
|
-
zoneId?: string;
|
|
84
|
-
distributionId?: string;
|
|
85
|
-
}
|
|
86
|
-
/**
|
|
87
|
-
* Purge CDN cache
|
|
88
|
-
*/
|
|
89
|
-
export declare function purgeCDNCache(urls: string[], config: CDNPurgeConfig): Promise<{
|
|
90
|
-
success: boolean;
|
|
91
|
-
purged: number;
|
|
92
|
-
errors?: string[];
|
|
93
|
-
}>;
|
|
94
|
-
/**
|
|
95
|
-
* Purge by cache tag
|
|
96
|
-
*/
|
|
97
|
-
export declare function purgeCacheByTag(tags: string[], config: CDNPurgeConfig): Promise<{
|
|
98
|
-
success: boolean;
|
|
99
|
-
purged: number;
|
|
100
|
-
errors?: string[];
|
|
101
|
-
}>;
|
|
102
|
-
/**
|
|
103
|
-
* Purge everything
|
|
104
|
-
*/
|
|
105
|
-
export declare function purgeAllCache(config: CDNPurgeConfig): Promise<{
|
|
106
|
-
success: boolean;
|
|
107
|
-
errors?: string[];
|
|
108
|
-
}>;
|
|
109
|
-
/**
|
|
110
|
-
* CDN cache warming
|
|
111
|
-
*/
|
|
112
|
-
export declare function warmCDNCache(urls: string[], options?: {
|
|
113
|
-
concurrency?: number;
|
|
114
|
-
headers?: Record<string, string>;
|
|
115
|
-
}): Promise<{
|
|
116
|
-
warmed: number;
|
|
117
|
-
failed: number;
|
|
118
|
-
errors: string[];
|
|
119
|
-
}>;
|
|
120
|
-
/**
|
|
121
|
-
* Generate cache tags
|
|
122
|
-
*/
|
|
123
|
-
export declare function generateCacheTags(resource: {
|
|
124
|
-
type: string;
|
|
125
|
-
id?: string | number;
|
|
126
|
-
related?: string[];
|
|
127
|
-
}): string[];
|
|
128
|
-
/**
|
|
129
|
-
* Edge cache configuration for Vercel
|
|
130
|
-
*/
|
|
131
|
-
export declare function generateVercelCacheConfig(preset: keyof typeof CDN_CACHE_PRESETS): {
|
|
132
|
-
headers: {
|
|
133
|
-
'Cache-Control': string;
|
|
134
|
-
'CDN-Cache-Control': string;
|
|
135
|
-
'Vercel-CDN-Cache-Control': string;
|
|
136
|
-
};
|
|
137
|
-
};
|
|
138
|
-
/**
|
|
139
|
-
* Edge cache configuration for Cloudflare
|
|
140
|
-
*/
|
|
141
|
-
export declare function generateCloudflareConfig(preset: keyof typeof CDN_CACHE_PRESETS, options?: {
|
|
142
|
-
cacheTags?: string[];
|
|
143
|
-
bypassOnCookie?: string;
|
|
144
|
-
}): {
|
|
145
|
-
headers: Record<string, string>;
|
|
146
|
-
};
|
|
147
|
-
/**
|
|
148
|
-
* Check if response should be cached
|
|
149
|
-
*/
|
|
150
|
-
export declare function shouldCacheResponse(status: number, headers: Headers): boolean;
|
|
151
|
-
/**
|
|
152
|
-
* Calculate cache TTL from headers
|
|
153
|
-
*/
|
|
154
|
-
export declare function getCacheTTL(headers: Headers): number;
|
|
155
|
-
//# sourceMappingURL=cdn-config.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cdn-config.d.ts","sourceRoot":"","sources":["../../src/caching/cdn-config.ts"],"names":[],"mappings":"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"}
|