veryfront 0.0.81 → 0.0.82
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/esm/deno.js +1 -1
- package/esm/src/cache/backend.d.ts +20 -0
- package/esm/src/cache/backend.d.ts.map +1 -1
- package/esm/src/cache/backend.js +57 -0
- package/esm/src/cache/hash.d.ts +107 -0
- package/esm/src/cache/hash.d.ts.map +1 -0
- package/esm/src/cache/hash.js +166 -0
- package/esm/src/cache/index.d.ts +3 -0
- package/esm/src/cache/index.d.ts.map +1 -1
- package/esm/src/cache/index.js +3 -0
- package/esm/src/cache/module-cache.d.ts +82 -0
- package/esm/src/cache/module-cache.d.ts.map +1 -0
- package/esm/src/cache/module-cache.js +214 -0
- package/esm/src/cache/multi-tier.d.ts +177 -0
- package/esm/src/cache/multi-tier.d.ts.map +1 -0
- package/esm/src/cache/multi-tier.js +352 -0
- package/esm/src/cli/templates/integration-loader.d.ts.map +1 -1
- package/esm/src/cli/templates/integration-loader.js +2 -4
- package/esm/src/modules/react-loader/ssr-module-loader/loader.d.ts.map +1 -1
- package/esm/src/modules/react-loader/ssr-module-loader/loader.js +121 -14
- package/esm/src/observability/tracing/span-names.d.ts +2 -0
- package/esm/src/observability/tracing/span-names.d.ts.map +1 -1
- package/esm/src/observability/tracing/span-names.js +2 -0
- package/esm/src/rendering/orchestrator/module-loader/cache.d.ts +10 -2
- package/esm/src/rendering/orchestrator/module-loader/cache.d.ts.map +1 -1
- package/esm/src/rendering/orchestrator/module-loader/cache.js +11 -6
- package/esm/src/rendering/orchestrator/module-loader/index.d.ts.map +1 -1
- package/esm/src/rendering/orchestrator/module-loader/index.js +72 -77
- package/esm/src/transforms/esm/http-cache.d.ts.map +1 -1
- package/esm/src/transforms/esm/http-cache.js +6 -29
- package/esm/src/transforms/esm/transform-cache.d.ts +25 -0
- package/esm/src/transforms/esm/transform-cache.d.ts.map +1 -1
- package/esm/src/transforms/esm/transform-cache.js +45 -0
- package/esm/src/transforms/mdx/esm-module-loader/module-fetcher/index.d.ts.map +1 -1
- package/esm/src/transforms/mdx/esm-module-loader/module-fetcher/index.js +2 -36
- package/esm/src/utils/constants/cache.d.ts +4 -0
- package/esm/src/utils/constants/cache.d.ts.map +1 -1
- package/esm/src/utils/constants/cache.js +14 -1
- package/package.json +1 -1
- package/src/deno.js +1 -1
- package/src/src/cache/backend.ts +62 -0
- package/src/src/cache/hash.ts +205 -0
- package/src/src/cache/index.ts +3 -0
- package/src/src/cache/module-cache.ts +252 -0
- package/src/src/cache/multi-tier.ts +503 -0
- package/src/src/cli/templates/integration-loader.ts +2 -8
- package/src/src/modules/react-loader/ssr-module-loader/loader.ts +137 -18
- package/src/src/observability/tracing/span-names.ts +2 -0
- package/src/src/rendering/orchestrator/module-loader/cache.ts +14 -8
- package/src/src/rendering/orchestrator/module-loader/index.ts +94 -89
- package/src/src/transforms/esm/http-cache.ts +12 -32
- package/src/src/transforms/esm/transform-cache.ts +53 -0
- package/src/src/transforms/mdx/esm-module-loader/module-fetcher/index.ts +2 -40
- package/src/src/utils/constants/cache.ts +21 -1
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pod-Level Module Cache Singleton
|
|
3
|
+
*
|
|
4
|
+
* Provides shared module caches that persist across all RenderPipeline instances
|
|
5
|
+
* within a pod. This dramatically improves cache hit rates for unchanged modules
|
|
6
|
+
* compared to per-request caches.
|
|
7
|
+
*
|
|
8
|
+
* Features:
|
|
9
|
+
* - LRU eviction to bound memory usage
|
|
10
|
+
* - TTL-based expiration to pick up source changes
|
|
11
|
+
* - Automatic registration with cache registry for debugging
|
|
12
|
+
* - Project-scoped invalidation support
|
|
13
|
+
*
|
|
14
|
+
* @module cache/module-cache
|
|
15
|
+
*/
|
|
16
|
+
import { LRUCache } from "../utils/lru-wrapper.js";
|
|
17
|
+
import { rendererLogger as logger } from "../utils/index.js";
|
|
18
|
+
import { registerLRUCache } from "./registry.js";
|
|
19
|
+
import { ESM_CACHE_MAX_ENTRIES, ESM_CACHE_TTL_MS, MODULE_CACHE_MAX_ENTRIES, MODULE_CACHE_TTL_MS, } from "../utils/constants/cache.js";
|
|
20
|
+
/**
|
|
21
|
+
* Pod-level module cache singleton.
|
|
22
|
+
*
|
|
23
|
+
* Maps module cache keys to transformed temp file paths.
|
|
24
|
+
* Key format: `{projectId}:{filePath}`
|
|
25
|
+
*/
|
|
26
|
+
let moduleCache = null;
|
|
27
|
+
/**
|
|
28
|
+
* Pod-level ESM cache singleton.
|
|
29
|
+
*
|
|
30
|
+
* Maps ESM specifiers to resolved URLs or file paths.
|
|
31
|
+
* Key format varies by usage.
|
|
32
|
+
*/
|
|
33
|
+
let esmCache = null;
|
|
34
|
+
/**
|
|
35
|
+
* Get or create the pod-level module cache.
|
|
36
|
+
*
|
|
37
|
+
* The cache is created lazily on first access and persists for the pod's lifetime.
|
|
38
|
+
* Uses LRU eviction and TTL-based expiration.
|
|
39
|
+
*/
|
|
40
|
+
export function getModuleCache() {
|
|
41
|
+
if (!moduleCache) {
|
|
42
|
+
moduleCache = new LRUCache({
|
|
43
|
+
maxEntries: MODULE_CACHE_MAX_ENTRIES,
|
|
44
|
+
ttlMs: MODULE_CACHE_TTL_MS,
|
|
45
|
+
});
|
|
46
|
+
// Register with cache registry for debugging and invalidation
|
|
47
|
+
registerLRUCache("pod-module-cache", moduleCache);
|
|
48
|
+
logger.info("[ModuleCache] Pod-level module cache initialized", {
|
|
49
|
+
maxEntries: MODULE_CACHE_MAX_ENTRIES,
|
|
50
|
+
ttlMs: MODULE_CACHE_TTL_MS,
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
return moduleCache;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Get or create the pod-level ESM cache.
|
|
57
|
+
*
|
|
58
|
+
* Used for caching ESM resolution results (specifier → URL mappings).
|
|
59
|
+
*/
|
|
60
|
+
export function getEsmCache() {
|
|
61
|
+
if (!esmCache) {
|
|
62
|
+
esmCache = new LRUCache({
|
|
63
|
+
maxEntries: ESM_CACHE_MAX_ENTRIES,
|
|
64
|
+
ttlMs: ESM_CACHE_TTL_MS,
|
|
65
|
+
});
|
|
66
|
+
// Register with cache registry for debugging and invalidation
|
|
67
|
+
registerLRUCache("pod-esm-cache", esmCache);
|
|
68
|
+
logger.info("[ModuleCache] Pod-level ESM cache initialized", {
|
|
69
|
+
maxEntries: ESM_CACHE_MAX_ENTRIES,
|
|
70
|
+
ttlMs: ESM_CACHE_TTL_MS,
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
return esmCache;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Create a Map-compatible interface for the module cache.
|
|
77
|
+
*
|
|
78
|
+
* This provides backward compatibility with code expecting Map<string, string>.
|
|
79
|
+
* The underlying storage is the pod-level LRU cache singleton.
|
|
80
|
+
*/
|
|
81
|
+
export function createModuleCache() {
|
|
82
|
+
const cache = getModuleCache();
|
|
83
|
+
return createMapInterface(cache);
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Create a Map-compatible interface for the ESM cache.
|
|
87
|
+
*
|
|
88
|
+
* This provides backward compatibility with code expecting Map<string, string>.
|
|
89
|
+
*/
|
|
90
|
+
export function createEsmCache() {
|
|
91
|
+
const cache = getEsmCache();
|
|
92
|
+
return createMapInterface(cache);
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Create a Map-compatible interface backed by an LRU cache.
|
|
96
|
+
*/
|
|
97
|
+
function createMapInterface(cache) {
|
|
98
|
+
// Create a proxy that delegates to the LRU cache
|
|
99
|
+
// This allows existing code expecting Map to work unchanged
|
|
100
|
+
return {
|
|
101
|
+
get(key) {
|
|
102
|
+
return cache.get(key);
|
|
103
|
+
},
|
|
104
|
+
set(key, value) {
|
|
105
|
+
cache.set(key, value);
|
|
106
|
+
return this;
|
|
107
|
+
},
|
|
108
|
+
has(key) {
|
|
109
|
+
return cache.has(key);
|
|
110
|
+
},
|
|
111
|
+
delete(key) {
|
|
112
|
+
return cache.delete(key);
|
|
113
|
+
},
|
|
114
|
+
clear() {
|
|
115
|
+
cache.clear();
|
|
116
|
+
},
|
|
117
|
+
get size() {
|
|
118
|
+
return cache.size;
|
|
119
|
+
},
|
|
120
|
+
// Required Map methods that iterate - these work but may be expensive
|
|
121
|
+
*keys() {
|
|
122
|
+
yield* cache.keys();
|
|
123
|
+
},
|
|
124
|
+
*values() {
|
|
125
|
+
for (const key of cache.keys()) {
|
|
126
|
+
const value = cache.get(key);
|
|
127
|
+
if (value !== undefined)
|
|
128
|
+
yield value;
|
|
129
|
+
}
|
|
130
|
+
},
|
|
131
|
+
*entries() {
|
|
132
|
+
for (const key of cache.keys()) {
|
|
133
|
+
const value = cache.get(key);
|
|
134
|
+
if (value !== undefined)
|
|
135
|
+
yield [key, value];
|
|
136
|
+
}
|
|
137
|
+
},
|
|
138
|
+
forEach(callback) {
|
|
139
|
+
for (const key of cache.keys()) {
|
|
140
|
+
const value = cache.get(key);
|
|
141
|
+
if (value !== undefined)
|
|
142
|
+
callback(value, key, this);
|
|
143
|
+
}
|
|
144
|
+
},
|
|
145
|
+
[Symbol.iterator]() {
|
|
146
|
+
return this.entries();
|
|
147
|
+
},
|
|
148
|
+
[Symbol.toStringTag]: "Map",
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Get statistics about the module caches.
|
|
153
|
+
*/
|
|
154
|
+
export function getModuleCacheStats() {
|
|
155
|
+
return {
|
|
156
|
+
moduleCache: {
|
|
157
|
+
size: moduleCache?.size ?? 0,
|
|
158
|
+
maxEntries: MODULE_CACHE_MAX_ENTRIES,
|
|
159
|
+
ttlMs: MODULE_CACHE_TTL_MS,
|
|
160
|
+
},
|
|
161
|
+
esmCache: {
|
|
162
|
+
size: esmCache?.size ?? 0,
|
|
163
|
+
maxEntries: ESM_CACHE_MAX_ENTRIES,
|
|
164
|
+
ttlMs: ESM_CACHE_TTL_MS,
|
|
165
|
+
},
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Clear all module caches.
|
|
170
|
+
*
|
|
171
|
+
* Used for invalidation when project content changes.
|
|
172
|
+
*/
|
|
173
|
+
export function clearModuleCaches() {
|
|
174
|
+
moduleCache?.clear();
|
|
175
|
+
esmCache?.clear();
|
|
176
|
+
logger.info("[ModuleCache] All module caches cleared");
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Clear module cache entries for a specific project.
|
|
180
|
+
*
|
|
181
|
+
* @param projectId - The project ID to clear entries for
|
|
182
|
+
* @returns Number of entries cleared
|
|
183
|
+
*/
|
|
184
|
+
export function clearModuleCacheForProject(projectId) {
|
|
185
|
+
if (!moduleCache)
|
|
186
|
+
return 0;
|
|
187
|
+
let cleared = 0;
|
|
188
|
+
const keysToDelete = [];
|
|
189
|
+
for (const key of moduleCache.keys()) {
|
|
190
|
+
if (key.startsWith(`${projectId}:`)) {
|
|
191
|
+
keysToDelete.push(key);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
for (const key of keysToDelete) {
|
|
195
|
+
moduleCache.delete(key);
|
|
196
|
+
cleared++;
|
|
197
|
+
}
|
|
198
|
+
if (cleared > 0) {
|
|
199
|
+
logger.info("[ModuleCache] Cleared module cache for project", { projectId, cleared });
|
|
200
|
+
}
|
|
201
|
+
return cleared;
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Destroy the module caches and cleanup resources.
|
|
205
|
+
*
|
|
206
|
+
* Should be called on server shutdown.
|
|
207
|
+
*/
|
|
208
|
+
export function destroyModuleCaches() {
|
|
209
|
+
moduleCache?.destroy();
|
|
210
|
+
esmCache?.destroy();
|
|
211
|
+
moduleCache = null;
|
|
212
|
+
esmCache = null;
|
|
213
|
+
logger.info("[ModuleCache] Module caches destroyed");
|
|
214
|
+
}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Multi-Tier Cache Abstraction
|
|
3
|
+
*
|
|
4
|
+
* Generic implementation for L1 → L2 → L3 cache flows with automatic backfill.
|
|
5
|
+
* This provides consistent caching behavior across the codebase:
|
|
6
|
+
*
|
|
7
|
+
* - L1: In-memory (fastest, per-pod, lost on restart)
|
|
8
|
+
* - L2: Local disk (fast, per-pod, survives restart)
|
|
9
|
+
* - L3: Distributed (Redis/API, cross-pod, shared state)
|
|
10
|
+
*
|
|
11
|
+
* When a cache hit occurs at a lower tier (e.g., L3), the value is automatically
|
|
12
|
+
* backfilled to higher tiers (L1, L2) for faster subsequent access.
|
|
13
|
+
*
|
|
14
|
+
* @module cache/multi-tier
|
|
15
|
+
*/
|
|
16
|
+
/**
|
|
17
|
+
* Generic cache tier interface.
|
|
18
|
+
* Each tier implements async get/set operations.
|
|
19
|
+
*/
|
|
20
|
+
export interface CacheTier<T = string> {
|
|
21
|
+
/** Tier name for logging/debugging */
|
|
22
|
+
readonly name: string;
|
|
23
|
+
/** Get a value from this tier */
|
|
24
|
+
get(key: string): Promise<T | null>;
|
|
25
|
+
/** Set a value in this tier */
|
|
26
|
+
set(key: string, value: T, ttlSeconds?: number): Promise<void>;
|
|
27
|
+
/** Delete a value from this tier */
|
|
28
|
+
delete?(key: string): Promise<void>;
|
|
29
|
+
/** Check if key exists (optional, uses get if not implemented) */
|
|
30
|
+
has?(key: string): Promise<boolean>;
|
|
31
|
+
/** Get multiple values (optional batch operation) */
|
|
32
|
+
getBatch?(keys: string[]): Promise<Map<string, T | null>>;
|
|
33
|
+
/** Set multiple values (optional batch operation) */
|
|
34
|
+
setBatch?(entries: Array<{
|
|
35
|
+
key: string;
|
|
36
|
+
value: T;
|
|
37
|
+
ttl?: number;
|
|
38
|
+
}>): Promise<void>;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Configuration for multi-tier cache.
|
|
42
|
+
*/
|
|
43
|
+
export interface MultiTierCacheConfig<T = string> {
|
|
44
|
+
/** Cache name for logging */
|
|
45
|
+
name: string;
|
|
46
|
+
/** L1: Memory tier (optional) */
|
|
47
|
+
l1?: CacheTier<T>;
|
|
48
|
+
/** L2: Disk tier (optional) */
|
|
49
|
+
l2?: CacheTier<T>;
|
|
50
|
+
/** L3: Distributed tier (optional) */
|
|
51
|
+
l3?: CacheTier<T>;
|
|
52
|
+
/** Default TTL in seconds for set operations */
|
|
53
|
+
defaultTtlSeconds?: number;
|
|
54
|
+
/** Whether to backfill higher tiers on lower-tier hits (default: true) */
|
|
55
|
+
backfillOnHit?: boolean;
|
|
56
|
+
/** Whether to use fire-and-forget for backfill operations (default: true) */
|
|
57
|
+
asyncBackfill?: boolean;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Cache hit statistics.
|
|
61
|
+
*/
|
|
62
|
+
export interface CacheStats {
|
|
63
|
+
/** Total get operations */
|
|
64
|
+
gets: number;
|
|
65
|
+
/** Hits at each tier */
|
|
66
|
+
l1Hits: number;
|
|
67
|
+
l2Hits: number;
|
|
68
|
+
l3Hits: number;
|
|
69
|
+
/** Total misses (no tier had the value) */
|
|
70
|
+
misses: number;
|
|
71
|
+
/** Set operations */
|
|
72
|
+
sets: number;
|
|
73
|
+
/** Backfill operations triggered */
|
|
74
|
+
backfills: number;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Multi-tier cache implementation.
|
|
78
|
+
*
|
|
79
|
+
* Provides automatic fallthrough from L1 → L2 → L3 with backfill on hits.
|
|
80
|
+
*
|
|
81
|
+
* @example
|
|
82
|
+
* ```typescript
|
|
83
|
+
* const cache = new MultiTierCache({
|
|
84
|
+
* name: "http-module",
|
|
85
|
+
* l1: new MemoryTier(),
|
|
86
|
+
* l3: await CacheBackends.httpModule(),
|
|
87
|
+
* defaultTtlSeconds: 86400,
|
|
88
|
+
* });
|
|
89
|
+
*
|
|
90
|
+
* const value = await cache.get("my-key");
|
|
91
|
+
* // If found in L3, automatically backfills L1
|
|
92
|
+
* ```
|
|
93
|
+
*/
|
|
94
|
+
export declare class MultiTierCache<T = string> {
|
|
95
|
+
private readonly config;
|
|
96
|
+
private stats;
|
|
97
|
+
constructor(config: MultiTierCacheConfig<T>);
|
|
98
|
+
/**
|
|
99
|
+
* Get a value from the cache.
|
|
100
|
+
*
|
|
101
|
+
* Checks tiers in order: L1 → L2 → L3.
|
|
102
|
+
* On hit at a lower tier, backfills higher tiers.
|
|
103
|
+
*/
|
|
104
|
+
get(key: string): Promise<T | null>;
|
|
105
|
+
/**
|
|
106
|
+
* Set a value in all tiers.
|
|
107
|
+
*
|
|
108
|
+
* Writes to all configured tiers in parallel (or sequentially if asyncBackfill=false).
|
|
109
|
+
*/
|
|
110
|
+
set(key: string, value: T, ttlSeconds?: number): Promise<void>;
|
|
111
|
+
/**
|
|
112
|
+
* Delete a value from all tiers.
|
|
113
|
+
*/
|
|
114
|
+
delete(key: string): Promise<void>;
|
|
115
|
+
/**
|
|
116
|
+
* Get or compute a value.
|
|
117
|
+
*
|
|
118
|
+
* If the key exists in any tier, returns it.
|
|
119
|
+
* Otherwise, calls the compute function and stores the result in all tiers.
|
|
120
|
+
*/
|
|
121
|
+
getOrCompute(key: string, computeFn: () => Promise<T>, ttlSeconds?: number): Promise<T>;
|
|
122
|
+
/**
|
|
123
|
+
* Batch get multiple values.
|
|
124
|
+
*
|
|
125
|
+
* Uses batch operations where available for efficiency.
|
|
126
|
+
* Returns a map of key → value (null if not found).
|
|
127
|
+
*/
|
|
128
|
+
getBatch(keys: string[]): Promise<Map<string, T | null>>;
|
|
129
|
+
/**
|
|
130
|
+
* Get cache statistics.
|
|
131
|
+
*/
|
|
132
|
+
getStats(): CacheStats & {
|
|
133
|
+
hitRate: number;
|
|
134
|
+
};
|
|
135
|
+
/**
|
|
136
|
+
* Reset statistics.
|
|
137
|
+
*/
|
|
138
|
+
resetStats(): void;
|
|
139
|
+
/**
|
|
140
|
+
* Backfill higher tiers with a value found at a lower tier.
|
|
141
|
+
*/
|
|
142
|
+
private backfill;
|
|
143
|
+
/**
|
|
144
|
+
* Helper for individual gets when batch operation is not available.
|
|
145
|
+
*/
|
|
146
|
+
private individualGets;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Create a memory-backed cache tier from a CacheBackend.
|
|
150
|
+
*/
|
|
151
|
+
export declare function createMemoryTier(backend: {
|
|
152
|
+
get(key: string): Promise<string | null>;
|
|
153
|
+
set(key: string, value: string, ttlSeconds?: number): Promise<void>;
|
|
154
|
+
del?(key: string): Promise<void>;
|
|
155
|
+
getBatch?(keys: string[]): Promise<Map<string, string | null>>;
|
|
156
|
+
setBatch?(entries: Array<{
|
|
157
|
+
key: string;
|
|
158
|
+
value: string;
|
|
159
|
+
ttl?: number;
|
|
160
|
+
}>): Promise<void>;
|
|
161
|
+
}): CacheTier<string>;
|
|
162
|
+
/**
|
|
163
|
+
* Create a distributed cache tier from a CacheBackend.
|
|
164
|
+
*/
|
|
165
|
+
export declare function createDistributedTier(backend: {
|
|
166
|
+
readonly type: string;
|
|
167
|
+
get(key: string): Promise<string | null>;
|
|
168
|
+
set(key: string, value: string, ttlSeconds?: number): Promise<void>;
|
|
169
|
+
del?(key: string): Promise<void>;
|
|
170
|
+
getBatch?(keys: string[]): Promise<Map<string, string | null>>;
|
|
171
|
+
setBatch?(entries: Array<{
|
|
172
|
+
key: string;
|
|
173
|
+
value: string;
|
|
174
|
+
ttl?: number;
|
|
175
|
+
}>): Promise<void>;
|
|
176
|
+
}): CacheTier<string>;
|
|
177
|
+
//# sourceMappingURL=multi-tier.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multi-tier.d.ts","sourceRoot":"","sources":["../../../src/src/cache/multi-tier.ts"],"names":[],"mappings":"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"}
|