@nahisaho/yata-scale 1.8.5
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 +66 -0
- package/dist/CacheManager.d.ts +107 -0
- package/dist/CacheManager.d.ts.map +1 -0
- package/dist/CacheManager.js +343 -0
- package/dist/CacheManager.js.map +1 -0
- package/dist/IndexManager.d.ts +103 -0
- package/dist/IndexManager.d.ts.map +1 -0
- package/dist/IndexManager.js +385 -0
- package/dist/IndexManager.js.map +1 -0
- package/dist/MigrationHelper.d.ts +91 -0
- package/dist/MigrationHelper.d.ts.map +1 -0
- package/dist/MigrationHelper.js +220 -0
- package/dist/MigrationHelper.js.map +1 -0
- package/dist/QueryCoordinator.d.ts +76 -0
- package/dist/QueryCoordinator.d.ts.map +1 -0
- package/dist/QueryCoordinator.js +298 -0
- package/dist/QueryCoordinator.js.map +1 -0
- package/dist/ShardManager.d.ts +48 -0
- package/dist/ShardManager.d.ts.map +1 -0
- package/dist/ShardManager.js +193 -0
- package/dist/ShardManager.js.map +1 -0
- package/dist/SyncController.d.ts +102 -0
- package/dist/SyncController.d.ts.map +1 -0
- package/dist/SyncController.js +286 -0
- package/dist/SyncController.js.map +1 -0
- package/dist/YataScaleManager.d.ts +75 -0
- package/dist/YataScaleManager.d.ts.map +1 -0
- package/dist/YataScaleManager.js +265 -0
- package/dist/YataScaleManager.js.map +1 -0
- package/dist/cache/CacheManager.d.ts +116 -0
- package/dist/cache/CacheManager.d.ts.map +1 -0
- package/dist/cache/CacheManager.js +286 -0
- package/dist/cache/CacheManager.js.map +1 -0
- package/dist/cache/InvalidationManager.d.ts +91 -0
- package/dist/cache/InvalidationManager.d.ts.map +1 -0
- package/dist/cache/InvalidationManager.js +155 -0
- package/dist/cache/InvalidationManager.js.map +1 -0
- package/dist/cache/L1Cache.d.ts +97 -0
- package/dist/cache/L1Cache.d.ts.map +1 -0
- package/dist/cache/L1Cache.js +225 -0
- package/dist/cache/L1Cache.js.map +1 -0
- package/dist/cache/L2Cache.d.ts +93 -0
- package/dist/cache/L2Cache.d.ts.map +1 -0
- package/dist/cache/L2Cache.js +248 -0
- package/dist/cache/L2Cache.js.map +1 -0
- package/dist/cache/L3Cache.d.ts +101 -0
- package/dist/cache/L3Cache.d.ts.map +1 -0
- package/dist/cache/L3Cache.js +229 -0
- package/dist/cache/L3Cache.js.map +1 -0
- package/dist/cache/index.d.ts +12 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +11 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/errors.d.ts +255 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +515 -0
- package/dist/errors.js.map +1 -0
- package/dist/index/BPlusTreeIndex.d.ts +101 -0
- package/dist/index/BPlusTreeIndex.d.ts.map +1 -0
- package/dist/index/BPlusTreeIndex.js +310 -0
- package/dist/index/BPlusTreeIndex.js.map +1 -0
- package/dist/index/BloomFilter.d.ts +85 -0
- package/dist/index/BloomFilter.d.ts.map +1 -0
- package/dist/index/BloomFilter.js +215 -0
- package/dist/index/BloomFilter.js.map +1 -0
- package/dist/index/FullTextIndex.d.ts +87 -0
- package/dist/index/FullTextIndex.d.ts.map +1 -0
- package/dist/index/FullTextIndex.js +213 -0
- package/dist/index/FullTextIndex.js.map +1 -0
- package/dist/index/GraphIndex.d.ts +116 -0
- package/dist/index/GraphIndex.d.ts.map +1 -0
- package/dist/index/GraphIndex.js +308 -0
- package/dist/index/GraphIndex.js.map +1 -0
- package/dist/index/IndexManager.d.ts +105 -0
- package/dist/index/IndexManager.d.ts.map +1 -0
- package/dist/index/IndexManager.js +287 -0
- package/dist/index/IndexManager.js.map +1 -0
- package/dist/index/index.d.ts +12 -0
- package/dist/index/index.d.ts.map +1 -0
- package/dist/index/index.js +11 -0
- package/dist/index/index.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -0
- package/dist/query/DistributedExecutor.d.ts +78 -0
- package/dist/query/DistributedExecutor.d.ts.map +1 -0
- package/dist/query/DistributedExecutor.js +232 -0
- package/dist/query/DistributedExecutor.js.map +1 -0
- package/dist/query/QueryCoordinator.d.ts +98 -0
- package/dist/query/QueryCoordinator.d.ts.map +1 -0
- package/dist/query/QueryCoordinator.js +246 -0
- package/dist/query/QueryCoordinator.js.map +1 -0
- package/dist/query/QueryPlanner.d.ts +88 -0
- package/dist/query/QueryPlanner.d.ts.map +1 -0
- package/dist/query/QueryPlanner.js +235 -0
- package/dist/query/QueryPlanner.js.map +1 -0
- package/dist/query/WorkerPool.d.ts +108 -0
- package/dist/query/WorkerPool.d.ts.map +1 -0
- package/dist/query/WorkerPool.js +195 -0
- package/dist/query/WorkerPool.js.map +1 -0
- package/dist/query/index.d.ts +11 -0
- package/dist/query/index.d.ts.map +1 -0
- package/dist/query/index.js +10 -0
- package/dist/query/index.js.map +1 -0
- package/dist/shard/GraphPartitionStrategy.d.ts +65 -0
- package/dist/shard/GraphPartitionStrategy.d.ts.map +1 -0
- package/dist/shard/GraphPartitionStrategy.js +208 -0
- package/dist/shard/GraphPartitionStrategy.js.map +1 -0
- package/dist/shard/HashPartitionStrategy.d.ts +56 -0
- package/dist/shard/HashPartitionStrategy.d.ts.map +1 -0
- package/dist/shard/HashPartitionStrategy.js +169 -0
- package/dist/shard/HashPartitionStrategy.js.map +1 -0
- package/dist/shard/RangePartitionStrategy.d.ts +63 -0
- package/dist/shard/RangePartitionStrategy.d.ts.map +1 -0
- package/dist/shard/RangePartitionStrategy.js +157 -0
- package/dist/shard/RangePartitionStrategy.js.map +1 -0
- package/dist/shard/Rebalancer.d.ts +70 -0
- package/dist/shard/Rebalancer.d.ts.map +1 -0
- package/dist/shard/Rebalancer.js +184 -0
- package/dist/shard/Rebalancer.js.map +1 -0
- package/dist/shard/ShardManager.d.ts +123 -0
- package/dist/shard/ShardManager.d.ts.map +1 -0
- package/dist/shard/ShardManager.js +353 -0
- package/dist/shard/ShardManager.js.map +1 -0
- package/dist/shard/ShardRouter.d.ts +102 -0
- package/dist/shard/ShardRouter.d.ts.map +1 -0
- package/dist/shard/ShardRouter.js +181 -0
- package/dist/shard/ShardRouter.js.map +1 -0
- package/dist/shard/index.d.ts +13 -0
- package/dist/shard/index.d.ts.map +1 -0
- package/dist/shard/index.js +12 -0
- package/dist/shard/index.js.map +1 -0
- package/dist/sync/ConflictResolver.d.ts +71 -0
- package/dist/sync/ConflictResolver.d.ts.map +1 -0
- package/dist/sync/ConflictResolver.js +214 -0
- package/dist/sync/ConflictResolver.js.map +1 -0
- package/dist/sync/SyncController.d.ts +150 -0
- package/dist/sync/SyncController.d.ts.map +1 -0
- package/dist/sync/SyncController.js +304 -0
- package/dist/sync/SyncController.js.map +1 -0
- package/dist/sync/VectorClock.d.ts +102 -0
- package/dist/sync/VectorClock.d.ts.map +1 -0
- package/dist/sync/VectorClock.js +189 -0
- package/dist/sync/VectorClock.js.map +1 -0
- package/dist/sync/WALManager.d.ts +120 -0
- package/dist/sync/WALManager.d.ts.map +1 -0
- package/dist/sync/WALManager.js +240 -0
- package/dist/sync/WALManager.js.map +1 -0
- package/dist/sync/index.d.ts +11 -0
- package/dist/sync/index.d.ts.map +1 -0
- package/dist/sync/index.js +10 -0
- package/dist/sync/index.js.map +1 -0
- package/dist/types.d.ts +323 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +7 -0
- package/dist/types.js.map +1 -0
- package/package.json +86 -0
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @nahisaho/yata-scale - Cache Manager
|
|
3
|
+
*
|
|
4
|
+
* Coordinates multi-tier caching (L1/L2/L3)
|
|
5
|
+
*/
|
|
6
|
+
import { ok, err } from 'neverthrow';
|
|
7
|
+
import { CacheMissError } from '../errors.js';
|
|
8
|
+
import { L1Cache } from './L1Cache.js';
|
|
9
|
+
import { L2Cache } from './L2Cache.js';
|
|
10
|
+
import { L3Cache } from './L3Cache.js';
|
|
11
|
+
import { InvalidationManager } from './InvalidationManager.js';
|
|
12
|
+
/**
|
|
13
|
+
* Cache manager for multi-tier caching
|
|
14
|
+
*/
|
|
15
|
+
export class CacheManager {
|
|
16
|
+
l1;
|
|
17
|
+
l2;
|
|
18
|
+
l3;
|
|
19
|
+
invalidation;
|
|
20
|
+
config;
|
|
21
|
+
constructor(config) {
|
|
22
|
+
this.config = config;
|
|
23
|
+
// Initialize tiers
|
|
24
|
+
this.l1 = new L1Cache(config.l1MaxEntries);
|
|
25
|
+
this.l2 = new L2Cache(config.l2MaxSize);
|
|
26
|
+
this.l3 = new L3Cache(config.l3MaxEntries);
|
|
27
|
+
// Setup invalidation
|
|
28
|
+
this.invalidation = new InvalidationManager(100, 10);
|
|
29
|
+
this.invalidation.addListener((event) => this.handleInvalidation(event));
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Get entity with cache hierarchy
|
|
33
|
+
*/
|
|
34
|
+
async getEntity(id) {
|
|
35
|
+
// Try L1 (hot)
|
|
36
|
+
const l1Result = this.l1.getEntity(id);
|
|
37
|
+
if (l1Result) {
|
|
38
|
+
return ok(l1Result);
|
|
39
|
+
}
|
|
40
|
+
// Try L2 (warm)
|
|
41
|
+
const l2Result = this.l2.getEntity(id);
|
|
42
|
+
if (l2Result) {
|
|
43
|
+
// Promote to L1
|
|
44
|
+
this.l1.setEntity(l2Result);
|
|
45
|
+
return ok(l2Result);
|
|
46
|
+
}
|
|
47
|
+
// Try L3 (cold)
|
|
48
|
+
const l3Result = await this.l3.getEntity(id);
|
|
49
|
+
if (l3Result) {
|
|
50
|
+
// Promote to L2 and L1
|
|
51
|
+
this.l2.setEntity(l3Result);
|
|
52
|
+
this.l1.setEntity(l3Result);
|
|
53
|
+
return ok(l3Result);
|
|
54
|
+
}
|
|
55
|
+
return err(new CacheMissError(id));
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Set entity in cache
|
|
59
|
+
*/
|
|
60
|
+
async setEntity(entity) {
|
|
61
|
+
// Always add to L1 (hot tier)
|
|
62
|
+
this.l1.setEntity(entity);
|
|
63
|
+
// Also add to L3 for persistence
|
|
64
|
+
await this.l3.setEntity(entity);
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Delete entity from all tiers
|
|
68
|
+
*/
|
|
69
|
+
async deleteEntity(id) {
|
|
70
|
+
this.l1.deleteEntity(id);
|
|
71
|
+
this.l2.deleteEntity(id);
|
|
72
|
+
await this.l3.deleteEntity(id);
|
|
73
|
+
this.invalidation.invalidateEntity(id, 'delete');
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Get relationship with cache hierarchy
|
|
77
|
+
*/
|
|
78
|
+
async getRelationship(id) {
|
|
79
|
+
// Try L1
|
|
80
|
+
const l1Result = this.l1.getRelationship(id);
|
|
81
|
+
if (l1Result) {
|
|
82
|
+
return ok(l1Result);
|
|
83
|
+
}
|
|
84
|
+
// Try L2
|
|
85
|
+
const l2Result = this.l2.getRelationship(id);
|
|
86
|
+
if (l2Result) {
|
|
87
|
+
this.l1.setRelationship(l2Result);
|
|
88
|
+
return ok(l2Result);
|
|
89
|
+
}
|
|
90
|
+
// Try L3
|
|
91
|
+
const l3Result = await this.l3.getRelationship(id);
|
|
92
|
+
if (l3Result) {
|
|
93
|
+
this.l2.setRelationship(l3Result);
|
|
94
|
+
this.l1.setRelationship(l3Result);
|
|
95
|
+
return ok(l3Result);
|
|
96
|
+
}
|
|
97
|
+
return err(new CacheMissError(id));
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Set relationship in cache
|
|
101
|
+
*/
|
|
102
|
+
async setRelationship(relationship) {
|
|
103
|
+
this.l1.setRelationship(relationship);
|
|
104
|
+
await this.l3.setRelationship(relationship);
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Delete relationship from all tiers
|
|
108
|
+
*/
|
|
109
|
+
async deleteRelationship(id) {
|
|
110
|
+
this.l1.deleteRelationship(id);
|
|
111
|
+
this.l2.deleteRelationship(id);
|
|
112
|
+
await this.l3.deleteRelationship(id);
|
|
113
|
+
this.invalidation.invalidateRelationship(id, 'delete');
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Get multiple entities
|
|
117
|
+
*/
|
|
118
|
+
async getEntities(ids) {
|
|
119
|
+
const result = new Map();
|
|
120
|
+
const missingIds = [];
|
|
121
|
+
// Check L1 first
|
|
122
|
+
for (const id of ids) {
|
|
123
|
+
const entity = this.l1.getEntity(id);
|
|
124
|
+
if (entity) {
|
|
125
|
+
result.set(id, entity);
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
missingIds.push(id);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
if (missingIds.length === 0) {
|
|
132
|
+
return result;
|
|
133
|
+
}
|
|
134
|
+
// Check L2 for missing
|
|
135
|
+
const stillMissing = [];
|
|
136
|
+
for (const id of missingIds) {
|
|
137
|
+
const entity = this.l2.getEntity(id);
|
|
138
|
+
if (entity) {
|
|
139
|
+
result.set(id, entity);
|
|
140
|
+
this.l1.setEntity(entity); // Promote
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
stillMissing.push(id);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
if (stillMissing.length === 0) {
|
|
147
|
+
return result;
|
|
148
|
+
}
|
|
149
|
+
// Check L3 for still missing
|
|
150
|
+
const l3Results = await this.l3.getEntities(stillMissing);
|
|
151
|
+
for (const [id, entity] of l3Results) {
|
|
152
|
+
result.set(id, entity);
|
|
153
|
+
this.l2.setEntity(entity);
|
|
154
|
+
this.l1.setEntity(entity);
|
|
155
|
+
}
|
|
156
|
+
return result;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Set multiple entities
|
|
160
|
+
*/
|
|
161
|
+
async setEntities(entities) {
|
|
162
|
+
this.l1.setEntities(entities);
|
|
163
|
+
await this.l3.setEntities(entities);
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Handle invalidation event
|
|
167
|
+
*/
|
|
168
|
+
handleInvalidation(event) {
|
|
169
|
+
if (event.type === 'entity') {
|
|
170
|
+
this.l1.deleteEntity(event.id);
|
|
171
|
+
this.l2.deleteEntity(event.id);
|
|
172
|
+
// Don't delete from L3 on update, only on explicit delete
|
|
173
|
+
}
|
|
174
|
+
else {
|
|
175
|
+
this.l1.deleteRelationship(event.id);
|
|
176
|
+
this.l2.deleteRelationship(event.id);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Invalidate entity across all tiers
|
|
181
|
+
*/
|
|
182
|
+
invalidateEntity(id) {
|
|
183
|
+
this.invalidation.invalidateEntity(id);
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Invalidate multiple entities
|
|
187
|
+
*/
|
|
188
|
+
invalidateEntities(ids) {
|
|
189
|
+
this.invalidation.invalidateEntities(ids);
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Flush invalidations
|
|
193
|
+
*/
|
|
194
|
+
flushInvalidations() {
|
|
195
|
+
this.invalidation.flushNow();
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Prewarm cache with entities
|
|
199
|
+
*/
|
|
200
|
+
async prewarm(entities) {
|
|
201
|
+
// Add to all tiers
|
|
202
|
+
await this.setEntities(entities);
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Clear all caches
|
|
206
|
+
*/
|
|
207
|
+
async clear() {
|
|
208
|
+
this.l1.clear();
|
|
209
|
+
this.l2.clear();
|
|
210
|
+
await this.l3.clear();
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Perform tier demotion (move cold data down)
|
|
214
|
+
*/
|
|
215
|
+
async performDemotion() {
|
|
216
|
+
// Get hot keys from L1
|
|
217
|
+
const hotKeys = new Set(this.l1.getHotKeys(100));
|
|
218
|
+
let demoted = 0;
|
|
219
|
+
// Demote cold entities from L1 to L2
|
|
220
|
+
// Note: This is a simplified implementation
|
|
221
|
+
// In production, would track access patterns more precisely
|
|
222
|
+
return demoted;
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Get statistics for all tiers
|
|
226
|
+
*/
|
|
227
|
+
getAllStats() {
|
|
228
|
+
return {
|
|
229
|
+
l1: this.l1.getStats(),
|
|
230
|
+
l2: this.l2.getStats(),
|
|
231
|
+
l3: this.l3.getStats(),
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Get combined statistics
|
|
236
|
+
*/
|
|
237
|
+
getCombinedStats() {
|
|
238
|
+
const l1Stats = this.l1.getStats();
|
|
239
|
+
const l2Stats = this.l2.getStats();
|
|
240
|
+
const l3Stats = this.l3.getStats();
|
|
241
|
+
const totalHits = l1Stats.hitCount + l2Stats.hitCount + l3Stats.hitCount;
|
|
242
|
+
const totalMisses = l1Stats.missCount + l2Stats.missCount + l3Stats.missCount;
|
|
243
|
+
const total = totalHits + totalMisses;
|
|
244
|
+
return {
|
|
245
|
+
tier: 'all',
|
|
246
|
+
hitCount: totalHits,
|
|
247
|
+
missCount: totalMisses,
|
|
248
|
+
hitRate: total > 0 ? totalHits / total : 0,
|
|
249
|
+
entryCount: l1Stats.entryCount + l2Stats.entryCount + l3Stats.entryCount,
|
|
250
|
+
sizeBytes: l1Stats.sizeBytes + l2Stats.sizeBytes + l3Stats.sizeBytes,
|
|
251
|
+
evictionCount: l1Stats.evictionCount + l2Stats.evictionCount + l3Stats.evictionCount,
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Get L1 cache
|
|
256
|
+
*/
|
|
257
|
+
getL1() {
|
|
258
|
+
return this.l1;
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Get L2 cache
|
|
262
|
+
*/
|
|
263
|
+
getL2() {
|
|
264
|
+
return this.l2;
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Get L3 cache
|
|
268
|
+
*/
|
|
269
|
+
getL3() {
|
|
270
|
+
return this.l3;
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Get invalidation manager
|
|
274
|
+
*/
|
|
275
|
+
getInvalidationManager() {
|
|
276
|
+
return this.invalidation;
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Close the cache manager
|
|
280
|
+
*/
|
|
281
|
+
async close() {
|
|
282
|
+
this.invalidation.close();
|
|
283
|
+
await this.l3.close();
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
//# sourceMappingURL=CacheManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CacheManager.js","sourceRoot":"","sources":["../../src/cache/CacheManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @nahisaho/yata-scale - Cache Invalidation Manager
|
|
3
|
+
*
|
|
4
|
+
* Manages cache invalidation across tiers
|
|
5
|
+
*/
|
|
6
|
+
import type { Entity } from '../types.js';
|
|
7
|
+
/**
|
|
8
|
+
* Invalidation event
|
|
9
|
+
*/
|
|
10
|
+
export interface InvalidationEvent {
|
|
11
|
+
readonly type: 'entity' | 'relationship';
|
|
12
|
+
readonly id: string;
|
|
13
|
+
readonly operation: 'update' | 'delete';
|
|
14
|
+
readonly timestamp: Date;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Invalidation listener
|
|
18
|
+
*/
|
|
19
|
+
export type InvalidationListener = (event: InvalidationEvent) => void;
|
|
20
|
+
/**
|
|
21
|
+
* Invalidation pattern for bulk invalidation
|
|
22
|
+
*/
|
|
23
|
+
export interface InvalidationPattern {
|
|
24
|
+
readonly type?: string;
|
|
25
|
+
readonly namespace?: string;
|
|
26
|
+
readonly idPrefix?: string;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Cache invalidation manager
|
|
30
|
+
*/
|
|
31
|
+
export declare class InvalidationManager {
|
|
32
|
+
private listeners;
|
|
33
|
+
private pendingInvalidations;
|
|
34
|
+
private batchTimeout;
|
|
35
|
+
private readonly batchSize;
|
|
36
|
+
private readonly batchDelayMs;
|
|
37
|
+
constructor(batchSize?: number, batchDelayMs?: number);
|
|
38
|
+
/**
|
|
39
|
+
* Invalidate an entity
|
|
40
|
+
*/
|
|
41
|
+
invalidateEntity(id: string, operation?: 'update' | 'delete'): void;
|
|
42
|
+
/**
|
|
43
|
+
* Invalidate a relationship
|
|
44
|
+
*/
|
|
45
|
+
invalidateRelationship(id: string, operation?: 'update' | 'delete'): void;
|
|
46
|
+
/**
|
|
47
|
+
* Invalidate multiple entities
|
|
48
|
+
*/
|
|
49
|
+
invalidateEntities(ids: string[], operation?: 'update' | 'delete'): void;
|
|
50
|
+
/**
|
|
51
|
+
* Invalidate by pattern
|
|
52
|
+
*/
|
|
53
|
+
invalidateByPattern(pattern: InvalidationPattern, entities: Entity[]): void;
|
|
54
|
+
/**
|
|
55
|
+
* Queue an invalidation event
|
|
56
|
+
*/
|
|
57
|
+
private queueInvalidation;
|
|
58
|
+
/**
|
|
59
|
+
* Flush pending invalidations immediately
|
|
60
|
+
*/
|
|
61
|
+
flushNow(): void;
|
|
62
|
+
/**
|
|
63
|
+
* Notify all listeners
|
|
64
|
+
*/
|
|
65
|
+
private notifyListeners;
|
|
66
|
+
/**
|
|
67
|
+
* Add invalidation listener
|
|
68
|
+
*/
|
|
69
|
+
addListener(listener: InvalidationListener): void;
|
|
70
|
+
/**
|
|
71
|
+
* Remove invalidation listener
|
|
72
|
+
*/
|
|
73
|
+
removeListener(listener: InvalidationListener): void;
|
|
74
|
+
/**
|
|
75
|
+
* Clear all listeners
|
|
76
|
+
*/
|
|
77
|
+
clearListeners(): void;
|
|
78
|
+
/**
|
|
79
|
+
* Get pending invalidation count
|
|
80
|
+
*/
|
|
81
|
+
get pendingCount(): number;
|
|
82
|
+
/**
|
|
83
|
+
* Get listener count
|
|
84
|
+
*/
|
|
85
|
+
get listenerCount(): number;
|
|
86
|
+
/**
|
|
87
|
+
* Close the manager
|
|
88
|
+
*/
|
|
89
|
+
close(): void;
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=InvalidationManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InvalidationManager.d.ts","sourceRoot":"","sources":["../../src/cache/InvalidationManager.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAgB,MAAM,aAAa,CAAC;AAExD;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,cAAc,CAAC;IACzC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,SAAS,EAAE,QAAQ,GAAG,QAAQ,CAAC;IACxC,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,MAAM,oBAAoB,GAAG,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAC;AAEtE;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;GAEG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,SAAS,CAAwC;IACzD,OAAO,CAAC,oBAAoB,CAA2B;IACvD,OAAO,CAAC,YAAY,CAA8C;IAClE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;gBAE1B,SAAS,GAAE,MAAY,EAAE,YAAY,GAAE,MAAW;IAK9D;;OAEG;IACH,gBAAgB,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,GAAE,QAAQ,GAAG,QAAmB,GAAG,IAAI;IAS7E;;OAEG;IACH,sBAAsB,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,GAAE,QAAQ,GAAG,QAAmB,GAAG,IAAI;IASnF;;OAEG;IACH,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,SAAS,GAAE,QAAQ,GAAG,QAAmB,GAAG,IAAI;IAMlF;;OAEG;IACH,mBAAmB,CACjB,OAAO,EAAE,mBAAmB,EAC5B,QAAQ,EAAE,MAAM,EAAE,GACjB,IAAI;IAsBP;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAUzB;;OAEG;IACH,QAAQ,IAAI,IAAI;IAyBhB;;OAEG;IACH,OAAO,CAAC,eAAe;IAUvB;;OAEG;IACH,WAAW,CAAC,QAAQ,EAAE,oBAAoB,GAAG,IAAI;IAIjD;;OAEG;IACH,cAAc,CAAC,QAAQ,EAAE,oBAAoB,GAAG,IAAI;IAIpD;;OAEG;IACH,cAAc,IAAI,IAAI;IAItB;;OAEG;IACH,IAAI,YAAY,IAAI,MAAM,CAEzB;IAED;;OAEG;IACH,IAAI,aAAa,IAAI,MAAM,CAE1B;IAED;;OAEG;IACH,KAAK,IAAI,IAAI;CAId"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @nahisaho/yata-scale - Cache Invalidation Manager
|
|
3
|
+
*
|
|
4
|
+
* Manages cache invalidation across tiers
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Cache invalidation manager
|
|
8
|
+
*/
|
|
9
|
+
export class InvalidationManager {
|
|
10
|
+
listeners = new Set();
|
|
11
|
+
pendingInvalidations = [];
|
|
12
|
+
batchTimeout = null;
|
|
13
|
+
batchSize;
|
|
14
|
+
batchDelayMs;
|
|
15
|
+
constructor(batchSize = 100, batchDelayMs = 10) {
|
|
16
|
+
this.batchSize = batchSize;
|
|
17
|
+
this.batchDelayMs = batchDelayMs;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Invalidate an entity
|
|
21
|
+
*/
|
|
22
|
+
invalidateEntity(id, operation = 'update') {
|
|
23
|
+
this.queueInvalidation({
|
|
24
|
+
type: 'entity',
|
|
25
|
+
id,
|
|
26
|
+
operation,
|
|
27
|
+
timestamp: new Date(),
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Invalidate a relationship
|
|
32
|
+
*/
|
|
33
|
+
invalidateRelationship(id, operation = 'update') {
|
|
34
|
+
this.queueInvalidation({
|
|
35
|
+
type: 'relationship',
|
|
36
|
+
id,
|
|
37
|
+
operation,
|
|
38
|
+
timestamp: new Date(),
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Invalidate multiple entities
|
|
43
|
+
*/
|
|
44
|
+
invalidateEntities(ids, operation = 'update') {
|
|
45
|
+
for (const id of ids) {
|
|
46
|
+
this.invalidateEntity(id, operation);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Invalidate by pattern
|
|
51
|
+
*/
|
|
52
|
+
invalidateByPattern(pattern, entities) {
|
|
53
|
+
for (const entity of entities) {
|
|
54
|
+
let matches = true;
|
|
55
|
+
if (pattern.type && entity.type !== pattern.type) {
|
|
56
|
+
matches = false;
|
|
57
|
+
}
|
|
58
|
+
if (pattern.namespace && entity.namespace !== pattern.namespace) {
|
|
59
|
+
matches = false;
|
|
60
|
+
}
|
|
61
|
+
if (pattern.idPrefix && !entity.id.startsWith(pattern.idPrefix)) {
|
|
62
|
+
matches = false;
|
|
63
|
+
}
|
|
64
|
+
if (matches) {
|
|
65
|
+
this.invalidateEntity(entity.id);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Queue an invalidation event
|
|
71
|
+
*/
|
|
72
|
+
queueInvalidation(event) {
|
|
73
|
+
this.pendingInvalidations.push(event);
|
|
74
|
+
if (this.pendingInvalidations.length >= this.batchSize) {
|
|
75
|
+
this.flushNow();
|
|
76
|
+
}
|
|
77
|
+
else if (!this.batchTimeout) {
|
|
78
|
+
this.batchTimeout = setTimeout(() => this.flushNow(), this.batchDelayMs);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Flush pending invalidations immediately
|
|
83
|
+
*/
|
|
84
|
+
flushNow() {
|
|
85
|
+
if (this.batchTimeout) {
|
|
86
|
+
clearTimeout(this.batchTimeout);
|
|
87
|
+
this.batchTimeout = null;
|
|
88
|
+
}
|
|
89
|
+
if (this.pendingInvalidations.length === 0) {
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
const events = this.pendingInvalidations;
|
|
93
|
+
this.pendingInvalidations = [];
|
|
94
|
+
// Deduplicate by id (keep latest)
|
|
95
|
+
const deduped = new Map();
|
|
96
|
+
for (const event of events) {
|
|
97
|
+
deduped.set(event.id, event);
|
|
98
|
+
}
|
|
99
|
+
// Notify listeners
|
|
100
|
+
for (const event of deduped.values()) {
|
|
101
|
+
this.notifyListeners(event);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Notify all listeners
|
|
106
|
+
*/
|
|
107
|
+
notifyListeners(event) {
|
|
108
|
+
for (const listener of this.listeners) {
|
|
109
|
+
try {
|
|
110
|
+
listener(event);
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
console.error('Invalidation listener error:', error);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Add invalidation listener
|
|
119
|
+
*/
|
|
120
|
+
addListener(listener) {
|
|
121
|
+
this.listeners.add(listener);
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Remove invalidation listener
|
|
125
|
+
*/
|
|
126
|
+
removeListener(listener) {
|
|
127
|
+
this.listeners.delete(listener);
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Clear all listeners
|
|
131
|
+
*/
|
|
132
|
+
clearListeners() {
|
|
133
|
+
this.listeners.clear();
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Get pending invalidation count
|
|
137
|
+
*/
|
|
138
|
+
get pendingCount() {
|
|
139
|
+
return this.pendingInvalidations.length;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Get listener count
|
|
143
|
+
*/
|
|
144
|
+
get listenerCount() {
|
|
145
|
+
return this.listeners.size;
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Close the manager
|
|
149
|
+
*/
|
|
150
|
+
close() {
|
|
151
|
+
this.flushNow();
|
|
152
|
+
this.clearListeners();
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=InvalidationManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InvalidationManager.js","sourceRoot":"","sources":["../../src/cache/InvalidationManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @nahisaho/yata-scale - L1 Cache (Hot)
|
|
3
|
+
*
|
|
4
|
+
* In-memory LRU cache for frequently accessed data
|
|
5
|
+
*/
|
|
6
|
+
import type { CacheStats, Entity, Relationship } from '../types.js';
|
|
7
|
+
/**
|
|
8
|
+
* L1 Cache - Hot tier, in-memory LRU
|
|
9
|
+
*/
|
|
10
|
+
export declare class L1Cache {
|
|
11
|
+
private readonly entityCache;
|
|
12
|
+
private readonly relationshipCache;
|
|
13
|
+
private hits;
|
|
14
|
+
private misses;
|
|
15
|
+
constructor(maxEntries?: number);
|
|
16
|
+
/**
|
|
17
|
+
* Get entity from cache
|
|
18
|
+
*/
|
|
19
|
+
getEntity(id: string): Entity | undefined;
|
|
20
|
+
/**
|
|
21
|
+
* Set entity in cache
|
|
22
|
+
*/
|
|
23
|
+
setEntity(entity: Entity): void;
|
|
24
|
+
/**
|
|
25
|
+
* Delete entity from cache
|
|
26
|
+
*/
|
|
27
|
+
deleteEntity(id: string): boolean;
|
|
28
|
+
/**
|
|
29
|
+
* Get relationship from cache
|
|
30
|
+
*/
|
|
31
|
+
getRelationship(id: string): Relationship | undefined;
|
|
32
|
+
/**
|
|
33
|
+
* Set relationship in cache
|
|
34
|
+
*/
|
|
35
|
+
setRelationship(relationship: Relationship): void;
|
|
36
|
+
/**
|
|
37
|
+
* Delete relationship from cache
|
|
38
|
+
*/
|
|
39
|
+
deleteRelationship(id: string): boolean;
|
|
40
|
+
/**
|
|
41
|
+
* Check if entity exists in cache
|
|
42
|
+
*/
|
|
43
|
+
hasEntity(id: string): boolean;
|
|
44
|
+
/**
|
|
45
|
+
* Check if relationship exists in cache
|
|
46
|
+
*/
|
|
47
|
+
hasRelationship(id: string): boolean;
|
|
48
|
+
/**
|
|
49
|
+
* Get multiple entities
|
|
50
|
+
*/
|
|
51
|
+
getEntities(ids: string[]): Map<string, Entity>;
|
|
52
|
+
/**
|
|
53
|
+
* Set multiple entities
|
|
54
|
+
*/
|
|
55
|
+
setEntities(entities: Entity[]): void;
|
|
56
|
+
/**
|
|
57
|
+
* Clear all caches
|
|
58
|
+
*/
|
|
59
|
+
clear(): void;
|
|
60
|
+
/**
|
|
61
|
+
* Get hot keys (most accessed)
|
|
62
|
+
*/
|
|
63
|
+
getHotKeys(limit?: number): string[];
|
|
64
|
+
/**
|
|
65
|
+
* Prewarm cache with entities
|
|
66
|
+
*/
|
|
67
|
+
prewarm(entities: Entity[]): void;
|
|
68
|
+
/**
|
|
69
|
+
* Get cache statistics
|
|
70
|
+
*/
|
|
71
|
+
getStats(): CacheStats;
|
|
72
|
+
/**
|
|
73
|
+
* Estimate memory size
|
|
74
|
+
*/
|
|
75
|
+
private estimateSize;
|
|
76
|
+
/**
|
|
77
|
+
* Estimate entity size in bytes
|
|
78
|
+
*/
|
|
79
|
+
private estimateEntitySize;
|
|
80
|
+
/**
|
|
81
|
+
* Estimate relationship size in bytes
|
|
82
|
+
*/
|
|
83
|
+
private estimateRelationshipSize;
|
|
84
|
+
/**
|
|
85
|
+
* Get entity count
|
|
86
|
+
*/
|
|
87
|
+
get entityCount(): number;
|
|
88
|
+
/**
|
|
89
|
+
* Get relationship count
|
|
90
|
+
*/
|
|
91
|
+
get relationshipCount(): number;
|
|
92
|
+
/**
|
|
93
|
+
* Get total entry count
|
|
94
|
+
*/
|
|
95
|
+
get size(): number;
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=L1Cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"L1Cache.d.ts","sourceRoot":"","sources":["../../src/cache/L1Cache.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAWpE;;GAEG;AACH,qBAAa,OAAO;IAClB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAuC;IACnE,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAA6C;IAC/E,OAAO,CAAC,IAAI,CAAa;IACzB,OAAO,CAAC,MAAM,CAAa;gBAEf,UAAU,GAAE,MAAc;IAWtC;;OAEG;IACH,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAYzC;;OAEG;IACH,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAQ/B;;OAEG;IACH,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAIjC;;OAEG;IACH,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAYrD;;OAEG;IACH,eAAe,CAAC,YAAY,EAAE,YAAY,GAAG,IAAI;IAQjD;;OAEG;IACH,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAIvC;;OAEG;IACH,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAI9B;;OAEG;IACH,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAIpC;;OAEG;IACH,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;IAW/C;;OAEG;IACH,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI;IAMrC;;OAEG;IACH,KAAK,IAAI,IAAI;IAOb;;OAEG;IACH,UAAU,CAAC,KAAK,GAAE,MAAW,GAAG,MAAM,EAAE;IAiBxC;;OAEG;IACH,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI;IAMjC;;OAEG;IACH,QAAQ,IAAI,UAAU;IAatB;;OAEG;IACH,OAAO,CAAC,YAAY;IAcpB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAiB1B;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAShC;;OAEG;IACH,IAAI,WAAW,IAAI,MAAM,CAExB;IAED;;OAEG;IACH,IAAI,iBAAiB,IAAI,MAAM,CAE9B;IAED;;OAEG;IACH,IAAI,IAAI,IAAI,MAAM,CAEjB;CACF"}
|