@agelum/backend 0.1.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 +401 -0
- package/dist/client/hooks.d.ts +65 -0
- package/dist/client/hooks.d.ts.map +1 -0
- package/dist/client/hooks.js +339 -0
- package/dist/client/hooks.js.map +1 -0
- package/dist/client/index.d.ts +10 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +37 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/manager.d.ts +137 -0
- package/dist/client/manager.d.ts.map +1 -0
- package/dist/client/manager.js +292 -0
- package/dist/client/manager.js.map +1 -0
- package/dist/client/provider.d.ts +25 -0
- package/dist/client/provider.d.ts.map +1 -0
- package/dist/client/provider.js +121 -0
- package/dist/client/provider.js.map +1 -0
- package/dist/client/revalidation.d.ts +101 -0
- package/dist/client/revalidation.d.ts.map +1 -0
- package/dist/client/revalidation.js +313 -0
- package/dist/client/revalidation.js.map +1 -0
- package/dist/client/session.d.ts +84 -0
- package/dist/client/session.d.ts.map +1 -0
- package/dist/client/session.js +186 -0
- package/dist/client/session.js.map +1 -0
- package/dist/client/sse-client.d.ts +81 -0
- package/dist/client/sse-client.d.ts.map +1 -0
- package/dist/client/sse-client.js +221 -0
- package/dist/client/sse-client.js.map +1 -0
- package/dist/client/storage.d.ts +124 -0
- package/dist/client/storage.d.ts.map +1 -0
- package/dist/client/storage.js +441 -0
- package/dist/client/storage.js.map +1 -0
- package/dist/client/trpc.d.ts +12 -0
- package/dist/client/trpc.d.ts.map +1 -0
- package/dist/client/trpc.js +36 -0
- package/dist/client/trpc.js.map +1 -0
- package/dist/client/types.d.ts +10 -0
- package/dist/client/types.d.ts.map +1 -0
- package/dist/client/types.js +3 -0
- package/dist/client/types.js.map +1 -0
- package/dist/client.d.ts +12 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +26 -0
- package/dist/client.js.map +1 -0
- package/dist/config/schema.d.ts +261 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +69 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/core/analyzer.d.ts +15 -0
- package/dist/core/analyzer.d.ts.map +1 -0
- package/dist/core/analyzer.js +217 -0
- package/dist/core/analyzer.js.map +1 -0
- package/dist/core/driver.d.ts +7 -0
- package/dist/core/driver.d.ts.map +1 -0
- package/dist/core/driver.js +261 -0
- package/dist/core/driver.js.map +1 -0
- package/dist/core/function.d.ts +97 -0
- package/dist/core/function.d.ts.map +1 -0
- package/dist/core/function.js +252 -0
- package/dist/core/function.js.map +1 -0
- package/dist/core/sse.d.ts +98 -0
- package/dist/core/sse.d.ts.map +1 -0
- package/dist/core/sse.js +331 -0
- package/dist/core/sse.js.map +1 -0
- package/dist/core/types.d.ts +179 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +3 -0
- package/dist/core/types.js.map +1 -0
- package/dist/examples/teamhub-integration.d.ts +56 -0
- package/dist/examples/teamhub-integration.d.ts.map +1 -0
- package/dist/examples/teamhub-integration.js +188 -0
- package/dist/examples/teamhub-integration.js.map +1 -0
- package/dist/index.d.ts +39 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +57 -0
- package/dist/index.js.map +1 -0
- package/dist/providers/localStorage.d.ts +13 -0
- package/dist/providers/localStorage.d.ts.map +1 -0
- package/dist/providers/localStorage.js +64 -0
- package/dist/providers/localStorage.js.map +1 -0
- package/dist/providers/memory.d.ts +13 -0
- package/dist/providers/memory.d.ts.map +1 -0
- package/dist/providers/memory.js +40 -0
- package/dist/providers/memory.js.map +1 -0
- package/dist/providers/redis.d.ts +14 -0
- package/dist/providers/redis.d.ts.map +1 -0
- package/dist/providers/redis.js +36 -0
- package/dist/providers/redis.js.map +1 -0
- package/dist/server.d.ts +17 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +34 -0
- package/dist/server.js.map +1 -0
- package/dist/trpc/hooks.d.ts +82 -0
- package/dist/trpc/hooks.d.ts.map +1 -0
- package/dist/trpc/hooks.js +282 -0
- package/dist/trpc/hooks.js.map +1 -0
- package/dist/trpc/router.d.ts +75 -0
- package/dist/trpc/router.d.ts.map +1 -0
- package/dist/trpc/router.js +160 -0
- package/dist/trpc/router.js.map +1 -0
- package/dist/trpc/types.d.ts +105 -0
- package/dist/trpc/types.d.ts.map +1 -0
- package/dist/trpc/types.js +6 -0
- package/dist/trpc/types.js.map +1 -0
- package/package.json +87 -0
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Smart revalidation system with active hooks priority
|
|
4
|
+
* Provides intelligent query revalidation based on user interaction patterns
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.SmartRevalidationEngine = void 0;
|
|
8
|
+
exports.createSmartRevalidationEngine = createSmartRevalidationEngine;
|
|
9
|
+
class SmartRevalidationEngine {
|
|
10
|
+
storage;
|
|
11
|
+
config;
|
|
12
|
+
activeRevalidations = new Set();
|
|
13
|
+
revalidationQueue = new Map();
|
|
14
|
+
constructor(storage, config) {
|
|
15
|
+
this.storage = storage;
|
|
16
|
+
this.config = config;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Create an intelligent revalidation strategy
|
|
20
|
+
*/
|
|
21
|
+
createRevalidationStrategy(invalidatedQueries, options = {}) {
|
|
22
|
+
const { maxConcurrent = 3, priorityFirst = true, backgroundDelay = 2000, } = options;
|
|
23
|
+
// Get current active hooks for priority
|
|
24
|
+
const activeHooks = this.storage.getActiveHooksByPriority();
|
|
25
|
+
const activeQueryKeys = new Set(activeHooks.map((hook) => hook.queryKey));
|
|
26
|
+
// Categorize queries based on priority and recency
|
|
27
|
+
const immediate = [];
|
|
28
|
+
const delayed = [];
|
|
29
|
+
const background = [];
|
|
30
|
+
invalidatedQueries.forEach((queryKey) => {
|
|
31
|
+
const isActive = activeQueryKeys.has(queryKey);
|
|
32
|
+
const hook = activeHooks.find((h) => h.queryKey === queryKey);
|
|
33
|
+
const lastAccess = hook?.lastAccess || 0;
|
|
34
|
+
const accessRecency = Date.now() - lastAccess;
|
|
35
|
+
if (isActive && accessRecency < 30000) {
|
|
36
|
+
// Active and accessed within 30 seconds - immediate
|
|
37
|
+
immediate.push(queryKey);
|
|
38
|
+
}
|
|
39
|
+
else if (isActive && accessRecency < 300000) {
|
|
40
|
+
// Active but accessed within 5 minutes - delayed
|
|
41
|
+
delayed.push(queryKey);
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
// Not active or old access - background
|
|
45
|
+
background.push(queryKey);
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
// Sort by priority and recency
|
|
49
|
+
const sortByPriority = (queries) => {
|
|
50
|
+
return queries.sort((a, b) => {
|
|
51
|
+
const hookA = activeHooks.find((h) => h.queryKey === a);
|
|
52
|
+
const hookB = activeHooks.find((h) => h.queryKey === b);
|
|
53
|
+
if (!hookA && !hookB)
|
|
54
|
+
return 0;
|
|
55
|
+
if (!hookA)
|
|
56
|
+
return 1;
|
|
57
|
+
if (!hookB)
|
|
58
|
+
return -1;
|
|
59
|
+
return hookB.lastAccess - hookA.lastAccess;
|
|
60
|
+
});
|
|
61
|
+
};
|
|
62
|
+
const strategy = {
|
|
63
|
+
immediate: sortByPriority(immediate),
|
|
64
|
+
delayed: sortByPriority(delayed),
|
|
65
|
+
background: sortByPriority(background),
|
|
66
|
+
estimatedTime: this.estimateRevalidationTime(immediate, delayed, background, options),
|
|
67
|
+
};
|
|
68
|
+
console.log(`[SmartRevalidation] Strategy created:`, {
|
|
69
|
+
immediate: strategy.immediate.length,
|
|
70
|
+
delayed: strategy.delayed.length,
|
|
71
|
+
background: strategy.background.length,
|
|
72
|
+
estimatedTime: strategy.estimatedTime,
|
|
73
|
+
});
|
|
74
|
+
return strategy;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Execute the revalidation strategy
|
|
78
|
+
*/
|
|
79
|
+
async executeRevalidationStrategy(strategy, revalidateFn, options = {}) {
|
|
80
|
+
const startTime = Date.now();
|
|
81
|
+
const result = {
|
|
82
|
+
immediate: { successful: 0, failed: 0, duration: 0 },
|
|
83
|
+
delayed: { successful: 0, failed: 0, duration: 0 },
|
|
84
|
+
background: { successful: 0, failed: 0, duration: 0 },
|
|
85
|
+
totalDuration: 0,
|
|
86
|
+
overallSuccess: true,
|
|
87
|
+
};
|
|
88
|
+
try {
|
|
89
|
+
// Phase 1: Immediate revalidation (critical queries)
|
|
90
|
+
if (strategy.immediate.length > 0) {
|
|
91
|
+
console.log(`[SmartRevalidation] Phase 1: ${strategy.immediate.length} immediate queries`);
|
|
92
|
+
const immediateStart = Date.now();
|
|
93
|
+
const immediateResult = await this.executeQueryBatch(strategy.immediate, revalidateFn, { maxConcurrent: options.maxConcurrent || 3 });
|
|
94
|
+
result.immediate = {
|
|
95
|
+
successful: immediateResult.successful,
|
|
96
|
+
failed: immediateResult.failed,
|
|
97
|
+
duration: Date.now() - immediateStart,
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
// Phase 2: Delayed revalidation (important but not critical)
|
|
101
|
+
if (strategy.delayed.length > 0) {
|
|
102
|
+
console.log(`[SmartRevalidation] Phase 2: ${strategy.delayed.length} delayed queries`);
|
|
103
|
+
// Small delay to let immediate queries complete
|
|
104
|
+
await this.wait(500);
|
|
105
|
+
const delayedStart = Date.now();
|
|
106
|
+
const delayedResult = await this.executeQueryBatch(strategy.delayed, revalidateFn, { maxConcurrent: Math.max(1, (options.maxConcurrent || 3) - 1) });
|
|
107
|
+
result.delayed = {
|
|
108
|
+
successful: delayedResult.successful,
|
|
109
|
+
failed: delayedResult.failed,
|
|
110
|
+
duration: Date.now() - delayedStart,
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
// Phase 3: Background revalidation (non-critical)
|
|
114
|
+
if (strategy.background.length > 0) {
|
|
115
|
+
console.log(`[SmartRevalidation] Phase 3: ${strategy.background.length} background queries`);
|
|
116
|
+
// Execute background queries without blocking
|
|
117
|
+
this.executeBackgroundRevalidation(strategy.background, revalidateFn, options.backgroundDelay || 2000);
|
|
118
|
+
}
|
|
119
|
+
result.totalDuration = Date.now() - startTime;
|
|
120
|
+
result.overallSuccess =
|
|
121
|
+
result.immediate.failed === 0 && result.delayed.failed === 0;
|
|
122
|
+
console.log(`[SmartRevalidation] Strategy completed:`, result);
|
|
123
|
+
return result;
|
|
124
|
+
}
|
|
125
|
+
catch (error) {
|
|
126
|
+
console.error('[SmartRevalidation] Strategy execution failed:', error);
|
|
127
|
+
result.overallSuccess = false;
|
|
128
|
+
result.totalDuration = Date.now() - startTime;
|
|
129
|
+
return result;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Add queries to revalidation queue with priority
|
|
134
|
+
*/
|
|
135
|
+
queueRevalidation(queryKey, priority = 0) {
|
|
136
|
+
this.revalidationQueue.set(queryKey, {
|
|
137
|
+
priority,
|
|
138
|
+
timestamp: Date.now(),
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Process revalidation queue
|
|
143
|
+
*/
|
|
144
|
+
async processRevalidationQueue(revalidateFn, options = {}) {
|
|
145
|
+
if (this.revalidationQueue.size === 0) {
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
console.log(`[SmartRevalidation] Processing queue: ${this.revalidationQueue.size} queries`);
|
|
149
|
+
// Convert queue to sorted array
|
|
150
|
+
const queuedQueries = Array.from(this.revalidationQueue.entries())
|
|
151
|
+
.sort(([, a], [, b]) => {
|
|
152
|
+
// Sort by priority (higher first), then by timestamp (older first)
|
|
153
|
+
if (a.priority !== b.priority) {
|
|
154
|
+
return b.priority - a.priority;
|
|
155
|
+
}
|
|
156
|
+
return a.timestamp - b.timestamp;
|
|
157
|
+
})
|
|
158
|
+
.map(([queryKey]) => queryKey);
|
|
159
|
+
// Clear the queue
|
|
160
|
+
this.revalidationQueue.clear();
|
|
161
|
+
// Create strategy for queued queries
|
|
162
|
+
const strategy = this.createRevalidationStrategy(queuedQueries, options);
|
|
163
|
+
await this.executeRevalidationStrategy(strategy, revalidateFn, options);
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Smart invalidation with automatic revalidation
|
|
167
|
+
*/
|
|
168
|
+
async smartInvalidateAndRevalidate(table, revalidateFn, options = {}) {
|
|
169
|
+
console.log(`[SmartRevalidation] Smart invalidation for table: ${table}`);
|
|
170
|
+
// Invalidate affected queries
|
|
171
|
+
this.storage.invalidateByTable(table, this.config.relations);
|
|
172
|
+
// Find queries that need revalidation
|
|
173
|
+
const allQueries = Object.keys(this.storage.getRegistry()?.queries || {});
|
|
174
|
+
const affectedQueries = this.findAffectedQueries(table, allQueries);
|
|
175
|
+
if (affectedQueries.length === 0) {
|
|
176
|
+
console.log(`[SmartRevalidation] No affected queries for table: ${table}`);
|
|
177
|
+
return {
|
|
178
|
+
immediate: { successful: 0, failed: 0, duration: 0 },
|
|
179
|
+
delayed: { successful: 0, failed: 0, duration: 0 },
|
|
180
|
+
background: { successful: 0, failed: 0, duration: 0 },
|
|
181
|
+
totalDuration: 0,
|
|
182
|
+
overallSuccess: true,
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
// Create and execute revalidation strategy
|
|
186
|
+
const strategy = this.createRevalidationStrategy(affectedQueries, options);
|
|
187
|
+
return await this.executeRevalidationStrategy(strategy, revalidateFn, options);
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Execute a batch of queries with concurrency control
|
|
191
|
+
*/
|
|
192
|
+
async executeQueryBatch(queries, revalidateFn, options) {
|
|
193
|
+
let successful = 0;
|
|
194
|
+
let failed = 0;
|
|
195
|
+
// Process in batches to control concurrency
|
|
196
|
+
for (let i = 0; i < queries.length; i += options.maxConcurrent) {
|
|
197
|
+
const batch = queries.slice(i, i + options.maxConcurrent);
|
|
198
|
+
const batchResults = await Promise.allSettled(batch.map(async (queryKey) => {
|
|
199
|
+
if (this.activeRevalidations.has(queryKey)) {
|
|
200
|
+
console.log(`[SmartRevalidation] Skipping ${queryKey} (already revalidating)`);
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
this.activeRevalidations.add(queryKey);
|
|
204
|
+
try {
|
|
205
|
+
await revalidateFn(queryKey);
|
|
206
|
+
console.log(`[SmartRevalidation] ✅ Revalidated: ${queryKey}`);
|
|
207
|
+
return { success: true };
|
|
208
|
+
}
|
|
209
|
+
catch (error) {
|
|
210
|
+
console.warn(`[SmartRevalidation] ❌ Failed: ${queryKey}`, error);
|
|
211
|
+
throw error;
|
|
212
|
+
}
|
|
213
|
+
finally {
|
|
214
|
+
this.activeRevalidations.delete(queryKey);
|
|
215
|
+
}
|
|
216
|
+
}));
|
|
217
|
+
batchResults.forEach((result) => {
|
|
218
|
+
if (result.status === 'fulfilled') {
|
|
219
|
+
successful++;
|
|
220
|
+
}
|
|
221
|
+
else {
|
|
222
|
+
failed++;
|
|
223
|
+
}
|
|
224
|
+
});
|
|
225
|
+
// Small delay between batches to avoid overwhelming the server
|
|
226
|
+
if (i + options.maxConcurrent < queries.length) {
|
|
227
|
+
await this.wait(100);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
return { successful, failed };
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Execute background revalidation with rate limiting
|
|
234
|
+
*/
|
|
235
|
+
async executeBackgroundRevalidation(queries, revalidateFn, delay) {
|
|
236
|
+
// Delay before starting background revalidation
|
|
237
|
+
setTimeout(async () => {
|
|
238
|
+
console.log(`[SmartRevalidation] Starting background revalidation for ${queries.length} queries`);
|
|
239
|
+
// Process background queries slowly to avoid interference
|
|
240
|
+
for (const queryKey of queries) {
|
|
241
|
+
try {
|
|
242
|
+
if (!this.activeRevalidations.has(queryKey)) {
|
|
243
|
+
this.activeRevalidations.add(queryKey);
|
|
244
|
+
await revalidateFn(queryKey);
|
|
245
|
+
console.log(`[SmartRevalidation] 🔄 Background revalidated: ${queryKey}`);
|
|
246
|
+
this.activeRevalidations.delete(queryKey);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
catch (error) {
|
|
250
|
+
console.warn(`[SmartRevalidation] Background revalidation failed: ${queryKey}`, error);
|
|
251
|
+
this.activeRevalidations.delete(queryKey);
|
|
252
|
+
}
|
|
253
|
+
// Longer delay between background queries
|
|
254
|
+
await this.wait(500);
|
|
255
|
+
}
|
|
256
|
+
console.log('[SmartRevalidation] Background revalidation completed');
|
|
257
|
+
}, delay);
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Find queries affected by table changes
|
|
261
|
+
*/
|
|
262
|
+
findAffectedQueries(table, allQueries) {
|
|
263
|
+
const relatedTables = this.config.relations[table] || [];
|
|
264
|
+
const tablesToCheck = [table, ...relatedTables];
|
|
265
|
+
return allQueries.filter((queryKey) => {
|
|
266
|
+
// Simple heuristic: check if query key contains table name
|
|
267
|
+
return tablesToCheck.some((tableName) => queryKey.toLowerCase().includes(tableName.toLowerCase()));
|
|
268
|
+
});
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Estimate total revalidation time
|
|
272
|
+
*/
|
|
273
|
+
estimateRevalidationTime(immediate, delayed, background, options) {
|
|
274
|
+
const avgQueryTime = 150; // ms per query
|
|
275
|
+
const maxConcurrent = options.maxConcurrent || 3;
|
|
276
|
+
const immediateTime = Math.ceil(immediate.length / maxConcurrent) * avgQueryTime;
|
|
277
|
+
const delayedTime = Math.ceil(delayed.length / maxConcurrent) * avgQueryTime;
|
|
278
|
+
const backgroundTime = background.length * avgQueryTime; // Sequential for background
|
|
279
|
+
return immediateTime + delayedTime + backgroundTime / 4; // Background is parallel
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* Utility to wait for a specified time
|
|
283
|
+
*/
|
|
284
|
+
wait(ms) {
|
|
285
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
286
|
+
}
|
|
287
|
+
/**
|
|
288
|
+
* Get current revalidation statistics
|
|
289
|
+
*/
|
|
290
|
+
getRevalidationStats() {
|
|
291
|
+
const activeHooks = this.storage.getActiveHooks();
|
|
292
|
+
return {
|
|
293
|
+
activeRevalidations: this.activeRevalidations.size,
|
|
294
|
+
queuedQueries: this.revalidationQueue.size,
|
|
295
|
+
activeHooks: activeHooks.length,
|
|
296
|
+
recentActivity: activeHooks
|
|
297
|
+
.sort((a, b) => b.lastAccess - a.lastAccess)
|
|
298
|
+
.slice(0, 5)
|
|
299
|
+
.map((hook) => ({
|
|
300
|
+
queryKey: hook.queryKey,
|
|
301
|
+
timestamp: hook.lastAccess,
|
|
302
|
+
})),
|
|
303
|
+
};
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
exports.SmartRevalidationEngine = SmartRevalidationEngine;
|
|
307
|
+
/**
|
|
308
|
+
* Create a smart revalidation engine
|
|
309
|
+
*/
|
|
310
|
+
function createSmartRevalidationEngine(storage, config) {
|
|
311
|
+
return new SmartRevalidationEngine(storage, config);
|
|
312
|
+
}
|
|
313
|
+
//# sourceMappingURL=revalidation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"revalidation.js","sourceRoot":"","sources":["../../src/client/revalidation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Simple session gap detection as described in the spec
|
|
3
|
+
*
|
|
4
|
+
* Just tracks basic session info in QueryRegistry and
|
|
5
|
+
* does smart revalidation on page load
|
|
6
|
+
*/
|
|
7
|
+
export interface SessionInfo {
|
|
8
|
+
startTime: number;
|
|
9
|
+
lastSync: number;
|
|
10
|
+
realtimeConnected: boolean;
|
|
11
|
+
}
|
|
12
|
+
export interface QueryRegistryEntry {
|
|
13
|
+
lastRevalidated: number;
|
|
14
|
+
lastServerChange?: number;
|
|
15
|
+
data?: any;
|
|
16
|
+
}
|
|
17
|
+
export interface QueryRegistry {
|
|
18
|
+
organizationId: string;
|
|
19
|
+
queries: Record<string, QueryRegistryEntry>;
|
|
20
|
+
session: SessionInfo;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Simple session gap detection (as per spec)
|
|
24
|
+
*/
|
|
25
|
+
export declare class SimpleSessionManager {
|
|
26
|
+
private organizationId;
|
|
27
|
+
private storage;
|
|
28
|
+
constructor(organizationId: string, storage?: Storage);
|
|
29
|
+
/**
|
|
30
|
+
* Get current query registry from localStorage
|
|
31
|
+
*/
|
|
32
|
+
getQueryRegistry(): QueryRegistry;
|
|
33
|
+
/**
|
|
34
|
+
* Save query registry to localStorage
|
|
35
|
+
*/
|
|
36
|
+
saveQueryRegistry(registry: QueryRegistry): void;
|
|
37
|
+
/**
|
|
38
|
+
* Update session sync time
|
|
39
|
+
*/
|
|
40
|
+
updateLastSync(): void;
|
|
41
|
+
/**
|
|
42
|
+
* Set realtime connection status
|
|
43
|
+
*/
|
|
44
|
+
setRealtimeConnected(connected: boolean): void;
|
|
45
|
+
/**
|
|
46
|
+
* Check if we should revalidate on page load (simple gap detection)
|
|
47
|
+
*/
|
|
48
|
+
shouldRevalidateOnLoad(): {
|
|
49
|
+
shouldRevalidate: boolean;
|
|
50
|
+
reason: string;
|
|
51
|
+
staleCacheAge: number;
|
|
52
|
+
};
|
|
53
|
+
/**
|
|
54
|
+
* Get stale queries that need revalidation
|
|
55
|
+
*/
|
|
56
|
+
getStaleQueries(maxAge?: number): string[];
|
|
57
|
+
/**
|
|
58
|
+
* Record query execution
|
|
59
|
+
*/
|
|
60
|
+
recordQuery(queryKey: string, data?: any): void;
|
|
61
|
+
/**
|
|
62
|
+
* Mark query as invalidated (from server event)
|
|
63
|
+
*/
|
|
64
|
+
markQueryInvalidated(queryKey: string): void;
|
|
65
|
+
/**
|
|
66
|
+
* Get basic session stats
|
|
67
|
+
*/
|
|
68
|
+
getSessionStats(): {
|
|
69
|
+
sessionAge: number;
|
|
70
|
+
timeSinceLastSync: number;
|
|
71
|
+
realtimeConnected: boolean;
|
|
72
|
+
totalQueries: number;
|
|
73
|
+
staleQueries: number;
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Smart revalidation on page load (as per spec)
|
|
78
|
+
*/
|
|
79
|
+
export declare function revalidateOnPageLoad(sessionManager: SimpleSessionManager, activeHookQueries: string[], revalidateQuery: (queryKey: string) => Promise<any>): Promise<void>;
|
|
80
|
+
/**
|
|
81
|
+
* Create simple session manager
|
|
82
|
+
*/
|
|
83
|
+
export declare function createSimpleSessionManager(organizationId: string, storage?: Storage): SimpleSessionManager;
|
|
84
|
+
//# sourceMappingURL=session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/client/session.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,iBAAiB,EAAE,OAAO,CAAA;CAC3B;AAED,MAAM,WAAW,kBAAkB;IACjC,eAAe,EAAE,MAAM,CAAA;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,IAAI,CAAC,EAAE,GAAG,CAAA;CACX;AAED,MAAM,WAAW,aAAa;IAC5B,cAAc,EAAE,MAAM,CAAA;IACtB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAA;IAC3C,OAAO,EAAE,WAAW,CAAA;CACrB;AAED;;GAEG;AACH,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,cAAc,CAAQ;IAC9B,OAAO,CAAC,OAAO,CAAS;gBAEZ,cAAc,EAAE,MAAM,EAAE,OAAO,GAAE,OAAsB;IAKnE;;OAEG;IACH,gBAAgB,IAAI,aAAa;IAwBjC;;OAEG;IACH,iBAAiB,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI;IAWhD;;OAEG;IACH,cAAc,IAAI,IAAI;IAMtB;;OAEG;IACH,oBAAoB,CAAC,SAAS,EAAE,OAAO,GAAG,IAAI;IAM9C;;OAEG;IACH,sBAAsB,IAAI;QACxB,gBAAgB,EAAE,OAAO,CAAA;QACzB,MAAM,EAAE,MAAM,CAAA;QACd,aAAa,EAAE,MAAM,CAAA;KACtB;IA6BD;;OAEG;IACH,eAAe,CAAC,MAAM,GAAE,MAAsB,GAAG,MAAM,EAAE;IAezD;;OAEG;IACH,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI;IAY/C;;OAEG;IACH,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAS5C;;OAEG;IACH,eAAe,IAAI;QACjB,UAAU,EAAE,MAAM,CAAA;QAClB,iBAAiB,EAAE,MAAM,CAAA;QACzB,iBAAiB,EAAE,OAAO,CAAA;QAC1B,YAAY,EAAE,MAAM,CAAA;QACpB,YAAY,EAAE,MAAM,CAAA;KACrB;CAaF;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,cAAc,EAAE,oBAAoB,EACpC,iBAAiB,EAAE,MAAM,EAAE,EAC3B,eAAe,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,CAAC,GAClD,OAAO,CAAC,IAAI,CAAC,CAsCf;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,cAAc,EAAE,MAAM,EACtB,OAAO,CAAC,EAAE,OAAO,GAChB,oBAAoB,CAEtB"}
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Simple session gap detection as described in the spec
|
|
4
|
+
*
|
|
5
|
+
* Just tracks basic session info in QueryRegistry and
|
|
6
|
+
* does smart revalidation on page load
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.SimpleSessionManager = void 0;
|
|
10
|
+
exports.revalidateOnPageLoad = revalidateOnPageLoad;
|
|
11
|
+
exports.createSimpleSessionManager = createSimpleSessionManager;
|
|
12
|
+
/**
|
|
13
|
+
* Simple session gap detection (as per spec)
|
|
14
|
+
*/
|
|
15
|
+
class SimpleSessionManager {
|
|
16
|
+
organizationId;
|
|
17
|
+
storage;
|
|
18
|
+
constructor(organizationId, storage = localStorage) {
|
|
19
|
+
this.organizationId = organizationId;
|
|
20
|
+
this.storage = storage;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Get current query registry from localStorage
|
|
24
|
+
*/
|
|
25
|
+
getQueryRegistry() {
|
|
26
|
+
try {
|
|
27
|
+
const stored = this.storage.getItem(`reactive_registry_${this.organizationId}`);
|
|
28
|
+
if (stored) {
|
|
29
|
+
return JSON.parse(stored);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
console.warn('[SimpleSession] Failed to parse stored registry:', error);
|
|
34
|
+
}
|
|
35
|
+
// Return default registry
|
|
36
|
+
return {
|
|
37
|
+
organizationId: this.organizationId,
|
|
38
|
+
queries: {},
|
|
39
|
+
session: {
|
|
40
|
+
startTime: Date.now(),
|
|
41
|
+
lastSync: Date.now(),
|
|
42
|
+
realtimeConnected: false,
|
|
43
|
+
},
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Save query registry to localStorage
|
|
48
|
+
*/
|
|
49
|
+
saveQueryRegistry(registry) {
|
|
50
|
+
try {
|
|
51
|
+
this.storage.setItem(`reactive_registry_${this.organizationId}`, JSON.stringify(registry));
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
console.warn('[SimpleSession] Failed to save registry:', error);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Update session sync time
|
|
59
|
+
*/
|
|
60
|
+
updateLastSync() {
|
|
61
|
+
const registry = this.getQueryRegistry();
|
|
62
|
+
registry.session.lastSync = Date.now();
|
|
63
|
+
this.saveQueryRegistry(registry);
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Set realtime connection status
|
|
67
|
+
*/
|
|
68
|
+
setRealtimeConnected(connected) {
|
|
69
|
+
const registry = this.getQueryRegistry();
|
|
70
|
+
registry.session.realtimeConnected = connected;
|
|
71
|
+
this.saveQueryRegistry(registry);
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Check if we should revalidate on page load (simple gap detection)
|
|
75
|
+
*/
|
|
76
|
+
shouldRevalidateOnLoad() {
|
|
77
|
+
const registry = this.getQueryRegistry();
|
|
78
|
+
const now = Date.now();
|
|
79
|
+
const timeSinceLastSync = now - registry.session.lastSync;
|
|
80
|
+
// Simple heuristic: if it's been more than 5 minutes since last sync,
|
|
81
|
+
// or if realtime was disconnected, we should revalidate
|
|
82
|
+
const shouldRevalidate = timeSinceLastSync > 5 * 60 * 1000 || // 5 minutes
|
|
83
|
+
!registry.session.realtimeConnected;
|
|
84
|
+
let reason = '';
|
|
85
|
+
if (timeSinceLastSync > 5 * 60 * 1000) {
|
|
86
|
+
reason = `Stale cache (${Math.round(timeSinceLastSync / 1000 / 60)}m since last sync)`;
|
|
87
|
+
}
|
|
88
|
+
else if (!registry.session.realtimeConnected) {
|
|
89
|
+
reason = 'Realtime was disconnected';
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
reason = 'Cache is fresh';
|
|
93
|
+
}
|
|
94
|
+
return {
|
|
95
|
+
shouldRevalidate,
|
|
96
|
+
reason,
|
|
97
|
+
staleCacheAge: timeSinceLastSync,
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Get stale queries that need revalidation
|
|
102
|
+
*/
|
|
103
|
+
getStaleQueries(maxAge = 5 * 60 * 1000) {
|
|
104
|
+
const registry = this.getQueryRegistry();
|
|
105
|
+
const now = Date.now();
|
|
106
|
+
const staleQueries = [];
|
|
107
|
+
for (const [queryKey, entry] of Object.entries(registry.queries)) {
|
|
108
|
+
const age = now - entry.lastRevalidated;
|
|
109
|
+
if (age > maxAge) {
|
|
110
|
+
staleQueries.push(queryKey);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
return staleQueries;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Record query execution
|
|
117
|
+
*/
|
|
118
|
+
recordQuery(queryKey, data) {
|
|
119
|
+
const registry = this.getQueryRegistry();
|
|
120
|
+
registry.queries[queryKey] = {
|
|
121
|
+
lastRevalidated: Date.now(),
|
|
122
|
+
lastServerChange: Date.now(),
|
|
123
|
+
data,
|
|
124
|
+
};
|
|
125
|
+
this.saveQueryRegistry(registry);
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Mark query as invalidated (from server event)
|
|
129
|
+
*/
|
|
130
|
+
markQueryInvalidated(queryKey) {
|
|
131
|
+
const registry = this.getQueryRegistry();
|
|
132
|
+
if (registry.queries[queryKey]) {
|
|
133
|
+
registry.queries[queryKey].lastServerChange = Date.now();
|
|
134
|
+
this.saveQueryRegistry(registry);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Get basic session stats
|
|
139
|
+
*/
|
|
140
|
+
getSessionStats() {
|
|
141
|
+
const registry = this.getQueryRegistry();
|
|
142
|
+
const now = Date.now();
|
|
143
|
+
const staleQueries = this.getStaleQueries();
|
|
144
|
+
return {
|
|
145
|
+
sessionAge: now - registry.session.startTime,
|
|
146
|
+
timeSinceLastSync: now - registry.session.lastSync,
|
|
147
|
+
realtimeConnected: registry.session.realtimeConnected,
|
|
148
|
+
totalQueries: Object.keys(registry.queries).length,
|
|
149
|
+
staleQueries: staleQueries.length,
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
exports.SimpleSessionManager = SimpleSessionManager;
|
|
154
|
+
/**
|
|
155
|
+
* Smart revalidation on page load (as per spec)
|
|
156
|
+
*/
|
|
157
|
+
async function revalidateOnPageLoad(sessionManager, activeHookQueries, revalidateQuery) {
|
|
158
|
+
console.log('[SimpleSession] Checking for session gap on page load');
|
|
159
|
+
const gapCheck = sessionManager.shouldRevalidateOnLoad();
|
|
160
|
+
console.log(`[SimpleSession] Gap check: ${gapCheck.reason}`);
|
|
161
|
+
if (!gapCheck.shouldRevalidate) {
|
|
162
|
+
console.log('[SimpleSession] Cache is fresh, no revalidation needed');
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
// 1. Active hooks first (what user sees) - immediate
|
|
166
|
+
console.log(`[SimpleSession] Revalidating ${activeHookQueries.length} active queries`);
|
|
167
|
+
await Promise.all(activeHookQueries.map((queryKey) => revalidateQuery(queryKey)));
|
|
168
|
+
// 2. Background revalidation after delay - non-blocking
|
|
169
|
+
setTimeout(async () => {
|
|
170
|
+
const staleQueries = sessionManager.getStaleQueries();
|
|
171
|
+
const backgroundQueries = staleQueries.filter((q) => !activeHookQueries.includes(q));
|
|
172
|
+
if (backgroundQueries.length > 0) {
|
|
173
|
+
console.log(`[SimpleSession] Background revalidating ${backgroundQueries.length} stale queries`);
|
|
174
|
+
await Promise.allSettled(backgroundQueries.map((queryKey) => revalidateQuery(queryKey)));
|
|
175
|
+
}
|
|
176
|
+
}, 2000);
|
|
177
|
+
// Update last sync time
|
|
178
|
+
sessionManager.updateLastSync();
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Create simple session manager
|
|
182
|
+
*/
|
|
183
|
+
function createSimpleSessionManager(organizationId, storage) {
|
|
184
|
+
return new SimpleSessionManager(organizationId, storage);
|
|
185
|
+
}
|
|
186
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/client/session.ts"],"names":[],"mappings":"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"}
|