@fjell/cache 4.7.2 → 4.7.4
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/CacheMap.d.ts +18 -18
- package/dist/browser/AsyncIndexDBCacheMap.d.ts +18 -1
- package/dist/browser/IndexDBCacheMap.d.ts +41 -43
- package/dist/browser/LocalStorageCacheMap.d.ts +18 -18
- package/dist/browser/SessionStorageCacheMap.d.ts +18 -18
- package/dist/events/CacheEventEmitter.d.ts +1 -0
- package/dist/eviction/EvictionManager.d.ts +3 -3
- package/dist/eviction/EvictionStrategy.d.ts +13 -13
- package/dist/eviction/strategies/ARCEvictionStrategy.d.ts +4 -4
- package/dist/eviction/strategies/FIFOEvictionStrategy.d.ts +4 -4
- package/dist/eviction/strategies/LFUEvictionStrategy.d.ts +4 -4
- package/dist/eviction/strategies/LRUEvictionStrategy.d.ts +4 -4
- package/dist/eviction/strategies/MRUEvictionStrategy.d.ts +4 -4
- package/dist/eviction/strategies/RandomEvictionStrategy.d.ts +4 -4
- package/dist/eviction/strategies/TwoQueueEvictionStrategy.d.ts +4 -4
- package/dist/index.js +750 -607
- package/dist/index.js.map +4 -4
- package/dist/memory/EnhancedMemoryCacheMap.d.ts +18 -18
- package/dist/memory/MemoryCacheMap.d.ts +18 -18
- package/dist/ttl/TTLManager.d.ts +10 -10
- package/package.json +7 -7
package/dist/index.js
CHANGED
|
@@ -340,19 +340,31 @@ var all = async (query = {}, locations = [], context) => {
|
|
|
340
340
|
cacheMap.deleteQueryResult(queryHash);
|
|
341
341
|
}
|
|
342
342
|
}
|
|
343
|
+
try {
|
|
344
|
+
const directCachedItems = await cacheMap.queryIn(query, locations);
|
|
345
|
+
if (directCachedItems && directCachedItems.length > 0) {
|
|
346
|
+
logger.debug("Found items directly in cache, skipping API call", { itemCount: directCachedItems.length });
|
|
347
|
+
const itemKeys = directCachedItems.map((item) => item.key);
|
|
348
|
+
await cacheMap.setQueryResult(queryHash, itemKeys);
|
|
349
|
+
logger.debug("Cached query result from direct cache hit", { queryHash, itemKeyCount: itemKeys.length });
|
|
350
|
+
return [context, validatePK(directCachedItems, pkType)];
|
|
351
|
+
}
|
|
352
|
+
} catch (error) {
|
|
353
|
+
logger.debug("Error querying cache directly, proceeding to API", { error });
|
|
354
|
+
}
|
|
343
355
|
let ret = [];
|
|
344
356
|
try {
|
|
345
357
|
ret = await api.all(query, locations);
|
|
346
|
-
|
|
347
|
-
cacheMap.set(v.key, v);
|
|
358
|
+
for (const v of ret) {
|
|
359
|
+
await cacheMap.set(v.key, v);
|
|
348
360
|
const keyStr = JSON.stringify(v.key);
|
|
349
361
|
ttlManager.onItemAdded(keyStr, cacheMap);
|
|
350
|
-
const evictedKeys = context.evictionManager.onItemAdded(keyStr, v, cacheMap);
|
|
351
|
-
|
|
362
|
+
const evictedKeys = await context.evictionManager.onItemAdded(keyStr, v, cacheMap);
|
|
363
|
+
for (const evictedKey of evictedKeys) {
|
|
352
364
|
const parsedKey = JSON.parse(evictedKey);
|
|
353
|
-
cacheMap.delete(parsedKey);
|
|
354
|
-
}
|
|
355
|
-
}
|
|
365
|
+
await cacheMap.delete(parsedKey);
|
|
366
|
+
}
|
|
367
|
+
}
|
|
356
368
|
const itemKeys = ret.map((item) => item.key);
|
|
357
369
|
cacheMap.setQueryResult(queryHash, itemKeys);
|
|
358
370
|
logger.debug("Cached query result", { queryHash, itemKeyCount: itemKeys.length });
|
|
@@ -374,85 +386,6 @@ import {
|
|
|
374
386
|
validatePK as validatePK2
|
|
375
387
|
} from "@fjell/core";
|
|
376
388
|
import { NotFoundError as NotFoundError2 } from "@fjell/http-api";
|
|
377
|
-
var logger2 = logger_default.get("one");
|
|
378
|
-
var one = async (query = {}, locations = [], context) => {
|
|
379
|
-
const { api, cacheMap, pkType, ttlManager } = context;
|
|
380
|
-
logger2.default("one", { query, locations });
|
|
381
|
-
const queryHash = createQueryHash(pkType, query, locations);
|
|
382
|
-
logger2.debug("Generated query hash for one", { queryHash });
|
|
383
|
-
const cachedItemKeys = await cacheMap.getQueryResult(queryHash);
|
|
384
|
-
if (cachedItemKeys) {
|
|
385
|
-
logger2.debug("Using cached query results", { cachedKeyCount: cachedItemKeys.length });
|
|
386
|
-
if (cachedItemKeys.length === 0) {
|
|
387
|
-
return [context, null];
|
|
388
|
-
}
|
|
389
|
-
const item = await cacheMap.get(cachedItemKeys[0]);
|
|
390
|
-
if (item) {
|
|
391
|
-
return [context, validatePK2(item, pkType)];
|
|
392
|
-
} else {
|
|
393
|
-
logger2.debug("Cached item missing, invalidating query cache");
|
|
394
|
-
cacheMap.deleteQueryResult(queryHash);
|
|
395
|
-
}
|
|
396
|
-
}
|
|
397
|
-
let retItem = null;
|
|
398
|
-
try {
|
|
399
|
-
retItem = await api.one(query, locations);
|
|
400
|
-
if (retItem) {
|
|
401
|
-
cacheMap.set(retItem.key, retItem);
|
|
402
|
-
const keyStr = JSON.stringify(retItem.key);
|
|
403
|
-
ttlManager.onItemAdded(keyStr, cacheMap);
|
|
404
|
-
const evictedKeys = context.evictionManager.onItemAdded(keyStr, retItem, cacheMap);
|
|
405
|
-
evictedKeys.forEach((evictedKey) => {
|
|
406
|
-
const parsedKey = JSON.parse(evictedKey);
|
|
407
|
-
cacheMap.delete(parsedKey);
|
|
408
|
-
});
|
|
409
|
-
cacheMap.setQueryResult(queryHash, [retItem.key]);
|
|
410
|
-
logger2.debug("Cached query result", { queryHash, itemKey: retItem.key });
|
|
411
|
-
} else {
|
|
412
|
-
cacheMap.setQueryResult(queryHash, []);
|
|
413
|
-
logger2.debug("Cached empty query result", { queryHash });
|
|
414
|
-
}
|
|
415
|
-
} catch (e) {
|
|
416
|
-
if (e instanceof NotFoundError2) {
|
|
417
|
-
cacheMap.setQueryResult(queryHash, []);
|
|
418
|
-
logger2.debug("Cached empty query result for not found", { queryHash });
|
|
419
|
-
} else {
|
|
420
|
-
throw e;
|
|
421
|
-
}
|
|
422
|
-
}
|
|
423
|
-
return [
|
|
424
|
-
context,
|
|
425
|
-
retItem ? validatePK2(retItem, pkType) : null
|
|
426
|
-
];
|
|
427
|
-
};
|
|
428
|
-
|
|
429
|
-
// src/ops/create.ts
|
|
430
|
-
import {
|
|
431
|
-
validatePK as validatePK3
|
|
432
|
-
} from "@fjell/core";
|
|
433
|
-
var logger3 = logger_default.get("create");
|
|
434
|
-
var create = async (v, locations = [], context) => {
|
|
435
|
-
const { api, cacheMap, pkType, eventEmitter, ttlManager, evictionManager } = context;
|
|
436
|
-
logger3.default("create", { v, locations });
|
|
437
|
-
const created = await api.create(v, locations);
|
|
438
|
-
cacheMap.set(created.key, created);
|
|
439
|
-
const keyStr = JSON.stringify(created.key);
|
|
440
|
-
ttlManager.onItemAdded(keyStr, cacheMap);
|
|
441
|
-
const evictedKeys = evictionManager.onItemAdded(keyStr, created, cacheMap);
|
|
442
|
-
evictedKeys.forEach((evictedKey) => {
|
|
443
|
-
const parsedKey = JSON.parse(evictedKey);
|
|
444
|
-
cacheMap.delete(parsedKey);
|
|
445
|
-
});
|
|
446
|
-
const event = CacheEventFactory.itemCreated(created.key, created, "api");
|
|
447
|
-
eventEmitter.emit(event);
|
|
448
|
-
return [context, validatePK3(created, pkType)];
|
|
449
|
-
};
|
|
450
|
-
|
|
451
|
-
// src/ops/get.ts
|
|
452
|
-
import {
|
|
453
|
-
isValidItemKey,
|
|
454
|
-
validatePK as validatePK4
|
|
455
|
-
} from "@fjell/core";
|
|
456
389
|
|
|
457
390
|
// src/utils/CacheSize.ts
|
|
458
391
|
import safeStringify from "fast-safe-stringify";
|
|
@@ -614,7 +547,110 @@ function validateSizeConfig(config) {
|
|
|
614
547
|
}
|
|
615
548
|
}
|
|
616
549
|
|
|
550
|
+
// src/ops/one.ts
|
|
551
|
+
var logger2 = logger_default.get("one");
|
|
552
|
+
var one = async (query = {}, locations = [], context) => {
|
|
553
|
+
const { api, cacheMap, pkType, ttlManager } = context;
|
|
554
|
+
logger2.default("one", { query, locations });
|
|
555
|
+
const queryHash = createQueryHash(pkType, query, locations);
|
|
556
|
+
logger2.debug("Generated query hash for one", { queryHash });
|
|
557
|
+
const cachedItemKeys = await cacheMap.getQueryResult(queryHash);
|
|
558
|
+
if (cachedItemKeys) {
|
|
559
|
+
logger2.debug("Using cached query results", { cachedKeyCount: cachedItemKeys.length });
|
|
560
|
+
if (cachedItemKeys.length === 0) {
|
|
561
|
+
return [context, null];
|
|
562
|
+
}
|
|
563
|
+
const item = await cacheMap.get(cachedItemKeys[0]);
|
|
564
|
+
if (item) {
|
|
565
|
+
return [context, validatePK2(item, pkType)];
|
|
566
|
+
} else {
|
|
567
|
+
logger2.debug("Cached item missing, invalidating query cache");
|
|
568
|
+
cacheMap.deleteQueryResult(queryHash);
|
|
569
|
+
}
|
|
570
|
+
}
|
|
571
|
+
try {
|
|
572
|
+
const directCachedItems = await cacheMap.queryIn(query, locations);
|
|
573
|
+
if (directCachedItems && directCachedItems.length > 0) {
|
|
574
|
+
logger2.debug("Found item directly in cache, skipping API call");
|
|
575
|
+
const foundItem = directCachedItems[0];
|
|
576
|
+
await cacheMap.setQueryResult(queryHash, [foundItem.key]);
|
|
577
|
+
logger2.debug("Cached query result from direct cache hit", { queryHash, itemKey: foundItem.key });
|
|
578
|
+
return [context, validatePK2(foundItem, pkType)];
|
|
579
|
+
}
|
|
580
|
+
} catch (error) {
|
|
581
|
+
logger2.debug("Error querying cache directly, proceeding to API", { error });
|
|
582
|
+
}
|
|
583
|
+
let retItem = null;
|
|
584
|
+
try {
|
|
585
|
+
retItem = await api.one(query, locations);
|
|
586
|
+
if (retItem) {
|
|
587
|
+
await cacheMap.set(retItem.key, retItem);
|
|
588
|
+
const keyStr = JSON.stringify(retItem.key);
|
|
589
|
+
const metadata = await cacheMap.getMetadata(keyStr);
|
|
590
|
+
if (!metadata) {
|
|
591
|
+
const now = Date.now();
|
|
592
|
+
const baseMetadata = {
|
|
593
|
+
key: keyStr,
|
|
594
|
+
addedAt: now,
|
|
595
|
+
lastAccessedAt: now,
|
|
596
|
+
accessCount: 1,
|
|
597
|
+
estimatedSize: estimateValueSize(retItem)
|
|
598
|
+
};
|
|
599
|
+
await cacheMap.setMetadata(keyStr, baseMetadata);
|
|
600
|
+
}
|
|
601
|
+
await ttlManager.onItemAdded(keyStr, cacheMap);
|
|
602
|
+
const evictedKeys = await context.evictionManager.onItemAdded(keyStr, retItem, cacheMap);
|
|
603
|
+
for (const evictedKey of evictedKeys) {
|
|
604
|
+
const parsedKey = JSON.parse(evictedKey);
|
|
605
|
+
await cacheMap.delete(parsedKey);
|
|
606
|
+
}
|
|
607
|
+
await cacheMap.setQueryResult(queryHash, [retItem.key]);
|
|
608
|
+
logger2.debug("Cached query result", { queryHash, itemKey: retItem.key });
|
|
609
|
+
} else {
|
|
610
|
+
await cacheMap.setQueryResult(queryHash, []);
|
|
611
|
+
logger2.debug("Cached empty query result", { queryHash });
|
|
612
|
+
}
|
|
613
|
+
} catch (e) {
|
|
614
|
+
if (e instanceof NotFoundError2) {
|
|
615
|
+
cacheMap.setQueryResult(queryHash, []);
|
|
616
|
+
logger2.debug("Cached empty query result for not found", { queryHash });
|
|
617
|
+
} else {
|
|
618
|
+
throw e;
|
|
619
|
+
}
|
|
620
|
+
}
|
|
621
|
+
return [
|
|
622
|
+
context,
|
|
623
|
+
retItem ? validatePK2(retItem, pkType) : null
|
|
624
|
+
];
|
|
625
|
+
};
|
|
626
|
+
|
|
627
|
+
// src/ops/create.ts
|
|
628
|
+
import {
|
|
629
|
+
validatePK as validatePK3
|
|
630
|
+
} from "@fjell/core";
|
|
631
|
+
var logger3 = logger_default.get("create");
|
|
632
|
+
var create = async (v, locations = [], context) => {
|
|
633
|
+
const { api, cacheMap, pkType, eventEmitter, ttlManager, evictionManager } = context;
|
|
634
|
+
logger3.default("create", { v, locations });
|
|
635
|
+
const created = await api.create(v, locations);
|
|
636
|
+
cacheMap.set(created.key, created);
|
|
637
|
+
const keyStr = JSON.stringify(created.key);
|
|
638
|
+
ttlManager.onItemAdded(keyStr, cacheMap);
|
|
639
|
+
const evictedKeys = await evictionManager.onItemAdded(keyStr, created, cacheMap);
|
|
640
|
+
for (const evictedKey of evictedKeys) {
|
|
641
|
+
const parsedKey = JSON.parse(evictedKey);
|
|
642
|
+
await cacheMap.delete(parsedKey);
|
|
643
|
+
}
|
|
644
|
+
const event = CacheEventFactory.itemCreated(created.key, created, "api");
|
|
645
|
+
eventEmitter.emit(event);
|
|
646
|
+
return [context, validatePK3(created, pkType)];
|
|
647
|
+
};
|
|
648
|
+
|
|
617
649
|
// src/ops/get.ts
|
|
650
|
+
import {
|
|
651
|
+
isValidItemKey,
|
|
652
|
+
validatePK as validatePK4
|
|
653
|
+
} from "@fjell/core";
|
|
618
654
|
var logger4 = logger_default.get("get");
|
|
619
655
|
var inFlightRequests = /* @__PURE__ */ new Map();
|
|
620
656
|
var CLEANUP_TIMEOUT = 5 * 60 * 1e3;
|
|
@@ -645,7 +681,7 @@ var get = async (key, context) => {
|
|
|
645
681
|
const keyStr2 = JSON.stringify(key);
|
|
646
682
|
const cachedItem = await cacheMap.get(key);
|
|
647
683
|
if (cachedItem) {
|
|
648
|
-
const isValid = ttlManager.validateItem(keyStr2, cacheMap);
|
|
684
|
+
const isValid = await ttlManager.validateItem(keyStr2, cacheMap);
|
|
649
685
|
if (isValid) {
|
|
650
686
|
logger4.debug("Cache hit with valid TTL", { key, defaultTTL: ttlManager.getDefaultTTL() });
|
|
651
687
|
statsManager.incrementHits();
|
|
@@ -692,9 +728,9 @@ var get = async (key, context) => {
|
|
|
692
728
|
}
|
|
693
729
|
ret = await apiRequest;
|
|
694
730
|
if (ret) {
|
|
695
|
-
cacheMap.set(ret.key, ret);
|
|
731
|
+
await cacheMap.set(ret.key, ret);
|
|
696
732
|
const keyStr2 = JSON.stringify(ret.key);
|
|
697
|
-
const metadata = cacheMap.getMetadata
|
|
733
|
+
const metadata = await cacheMap.getMetadata(keyStr2);
|
|
698
734
|
if (!metadata) {
|
|
699
735
|
const now = Date.now();
|
|
700
736
|
const baseMetadata = {
|
|
@@ -704,14 +740,14 @@ var get = async (key, context) => {
|
|
|
704
740
|
accessCount: 1,
|
|
705
741
|
estimatedSize: estimateValueSize(ret)
|
|
706
742
|
};
|
|
707
|
-
cacheMap.setMetadata
|
|
743
|
+
await cacheMap.setMetadata(keyStr2, baseMetadata);
|
|
708
744
|
}
|
|
709
|
-
const evictedKeys = context.evictionManager.onItemAdded(keyStr2, ret, cacheMap);
|
|
710
|
-
ttlManager.onItemAdded(keyStr2, cacheMap);
|
|
711
|
-
|
|
745
|
+
const evictedKeys = await context.evictionManager.onItemAdded(keyStr2, ret, cacheMap);
|
|
746
|
+
await ttlManager.onItemAdded(keyStr2, cacheMap);
|
|
747
|
+
for (const evictedKey of evictedKeys) {
|
|
712
748
|
const parsedKey = JSON.parse(evictedKey);
|
|
713
|
-
cacheMap.delete(parsedKey);
|
|
714
|
-
}
|
|
749
|
+
await cacheMap.delete(parsedKey);
|
|
750
|
+
}
|
|
715
751
|
const event = CacheEventFactory.itemRetrieved(ret.key, ret, "api");
|
|
716
752
|
context.eventEmitter.emit(event);
|
|
717
753
|
}
|
|
@@ -807,14 +843,26 @@ var update = async (key, v, context) => {
|
|
|
807
843
|
const previousItem = await cacheMap.get(key);
|
|
808
844
|
const updated = await api.update(key, v);
|
|
809
845
|
logger7.debug("Caching update result", { updatedKey: updated.key });
|
|
810
|
-
cacheMap.set(updated.key, updated);
|
|
846
|
+
await cacheMap.set(updated.key, updated);
|
|
811
847
|
const keyStr = JSON.stringify(updated.key);
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
848
|
+
const metadata = await cacheMap.getMetadata(keyStr);
|
|
849
|
+
if (!metadata) {
|
|
850
|
+
const now = Date.now();
|
|
851
|
+
const baseMetadata = {
|
|
852
|
+
key: keyStr,
|
|
853
|
+
addedAt: now,
|
|
854
|
+
lastAccessedAt: now,
|
|
855
|
+
accessCount: 1,
|
|
856
|
+
estimatedSize: estimateValueSize(updated)
|
|
857
|
+
};
|
|
858
|
+
await cacheMap.setMetadata(keyStr, baseMetadata);
|
|
859
|
+
}
|
|
860
|
+
await context.ttlManager.onItemAdded(keyStr, cacheMap);
|
|
861
|
+
const evictedKeys = await context.evictionManager.onItemAdded(keyStr, updated, cacheMap);
|
|
862
|
+
for (const evictedKey of evictedKeys) {
|
|
815
863
|
const parsedKey = JSON.parse(evictedKey);
|
|
816
|
-
cacheMap.delete(parsedKey);
|
|
817
|
-
}
|
|
864
|
+
await cacheMap.delete(parsedKey);
|
|
865
|
+
}
|
|
818
866
|
const event = CacheEventFactory.itemUpdated(updated.key, updated, previousItem, "api");
|
|
819
867
|
context.eventEmitter.emit(event);
|
|
820
868
|
return [context, validatePK6(updated, pkType)];
|
|
@@ -844,18 +892,18 @@ var action = async (key, action2, body = {}, context) => {
|
|
|
844
892
|
cacheMap.set(updated.key, updated);
|
|
845
893
|
const keyStr = JSON.stringify(updated.key);
|
|
846
894
|
context.ttlManager.onItemAdded(keyStr, cacheMap);
|
|
847
|
-
const evictedKeys = context.evictionManager.onItemAdded(keyStr, updated, cacheMap);
|
|
848
|
-
|
|
895
|
+
const evictedKeys = await context.evictionManager.onItemAdded(keyStr, updated, cacheMap);
|
|
896
|
+
for (const evictedKey of evictedKeys) {
|
|
849
897
|
try {
|
|
850
898
|
const parsedKey = JSON.parse(evictedKey);
|
|
851
|
-
cacheMap.delete(parsedKey);
|
|
899
|
+
await cacheMap.delete(parsedKey);
|
|
852
900
|
} catch (error) {
|
|
853
901
|
logger8.error("Failed to parse evicted key during deletion", {
|
|
854
902
|
evictedKey,
|
|
855
903
|
error: error instanceof Error ? error.message : String(error)
|
|
856
904
|
});
|
|
857
905
|
}
|
|
858
|
-
}
|
|
906
|
+
}
|
|
859
907
|
return [context, validatePK7(updated, pkType)];
|
|
860
908
|
};
|
|
861
909
|
|
|
@@ -874,16 +922,16 @@ var allAction = async (action2, body = {}, locations = [], context) => {
|
|
|
874
922
|
try {
|
|
875
923
|
ret = await api.allAction(action2, body, locations);
|
|
876
924
|
logger9.debug("Caching allAction results", { resultCount: ret.length });
|
|
877
|
-
|
|
878
|
-
cacheMap.set(v.key, v);
|
|
925
|
+
for (const v of ret) {
|
|
926
|
+
await cacheMap.set(v.key, v);
|
|
879
927
|
const keyStr = JSON.stringify(v.key);
|
|
880
928
|
context.ttlManager.onItemAdded(keyStr, cacheMap);
|
|
881
|
-
const evictedKeys = context.evictionManager.onItemAdded(keyStr, v, cacheMap);
|
|
882
|
-
|
|
929
|
+
const evictedKeys = await context.evictionManager.onItemAdded(keyStr, v, cacheMap);
|
|
930
|
+
for (const evictedKey of evictedKeys) {
|
|
883
931
|
const parsedKey = JSON.parse(evictedKey);
|
|
884
|
-
cacheMap.delete(parsedKey);
|
|
885
|
-
}
|
|
886
|
-
}
|
|
932
|
+
await cacheMap.delete(parsedKey);
|
|
933
|
+
}
|
|
934
|
+
}
|
|
887
935
|
} catch (e) {
|
|
888
936
|
if (e instanceof NotFoundError3) {
|
|
889
937
|
} else {
|
|
@@ -943,16 +991,16 @@ var find = async (finder, params = {}, locations = [], context) => {
|
|
|
943
991
|
}
|
|
944
992
|
}
|
|
945
993
|
const ret = await api.find(finder, params, locations);
|
|
946
|
-
|
|
947
|
-
cacheMap.set(v.key, v);
|
|
994
|
+
for (const v of ret) {
|
|
995
|
+
await cacheMap.set(v.key, v);
|
|
948
996
|
const keyStr = JSON.stringify(v.key);
|
|
949
997
|
ttlManager.onItemAdded(keyStr, cacheMap);
|
|
950
|
-
const evictedKeys = context.evictionManager.onItemAdded(keyStr, v, cacheMap);
|
|
951
|
-
|
|
998
|
+
const evictedKeys = await context.evictionManager.onItemAdded(keyStr, v, cacheMap);
|
|
999
|
+
for (const evictedKey of evictedKeys) {
|
|
952
1000
|
const parsedKey = JSON.parse(evictedKey);
|
|
953
|
-
cacheMap.delete(parsedKey);
|
|
954
|
-
}
|
|
955
|
-
}
|
|
1001
|
+
await cacheMap.delete(parsedKey);
|
|
1002
|
+
}
|
|
1003
|
+
}
|
|
956
1004
|
const itemKeys = ret.map((item) => item.key);
|
|
957
1005
|
cacheMap.setQueryResult(queryHash, itemKeys);
|
|
958
1006
|
logger12.debug("Cached query result", { queryHash, itemKeyCount: itemKeys.length });
|
|
@@ -984,11 +1032,11 @@ var findOne = async (finder, finderParams = {}, locations = [], context) => {
|
|
|
984
1032
|
cacheMap.set(ret.key, ret);
|
|
985
1033
|
const keyStr = JSON.stringify(ret.key);
|
|
986
1034
|
ttlManager.onItemAdded(keyStr, cacheMap);
|
|
987
|
-
const evictedKeys = context.evictionManager.onItemAdded(keyStr, ret, cacheMap);
|
|
988
|
-
|
|
1035
|
+
const evictedKeys = await context.evictionManager.onItemAdded(keyStr, ret, cacheMap);
|
|
1036
|
+
for (const evictedKey of evictedKeys) {
|
|
989
1037
|
const parsedKey = JSON.parse(evictedKey);
|
|
990
|
-
cacheMap.delete(parsedKey);
|
|
991
|
-
}
|
|
1038
|
+
await cacheMap.delete(parsedKey);
|
|
1039
|
+
}
|
|
992
1040
|
cacheMap.setQueryResult(queryHash, [ret.key]);
|
|
993
1041
|
logger13.debug("Cached query result", { queryHash, itemKey: ret.key });
|
|
994
1042
|
return [context, validatePK10(ret, pkType)];
|
|
@@ -1061,14 +1109,26 @@ var set = async (key, v, context) => {
|
|
|
1061
1109
|
throw new Error("Key does not match item key");
|
|
1062
1110
|
}
|
|
1063
1111
|
const previousItem = await cacheMap.get(key);
|
|
1064
|
-
cacheMap.set(key, v);
|
|
1112
|
+
await cacheMap.set(key, v);
|
|
1065
1113
|
const keyStr = JSON.stringify(key);
|
|
1066
|
-
|
|
1067
|
-
|
|
1068
|
-
|
|
1114
|
+
const metadata = await cacheMap.getMetadata(keyStr);
|
|
1115
|
+
if (!metadata) {
|
|
1116
|
+
const now = Date.now();
|
|
1117
|
+
const baseMetadata = {
|
|
1118
|
+
key: keyStr,
|
|
1119
|
+
addedAt: now,
|
|
1120
|
+
lastAccessedAt: now,
|
|
1121
|
+
accessCount: 1,
|
|
1122
|
+
estimatedSize: estimateValueSize(v)
|
|
1123
|
+
};
|
|
1124
|
+
await cacheMap.setMetadata(keyStr, baseMetadata);
|
|
1125
|
+
}
|
|
1126
|
+
await ttlManager.onItemAdded(keyStr, cacheMap);
|
|
1127
|
+
const evictedKeys = await evictionManager.onItemAdded(keyStr, v, cacheMap);
|
|
1128
|
+
for (const evictedKey of evictedKeys) {
|
|
1069
1129
|
const parsedKey = JSON.parse(evictedKey);
|
|
1070
|
-
cacheMap.delete(parsedKey);
|
|
1071
|
-
}
|
|
1130
|
+
await cacheMap.delete(parsedKey);
|
|
1131
|
+
}
|
|
1072
1132
|
const event = CacheEventFactory.itemSet(key, v, previousItem);
|
|
1073
1133
|
eventEmitter.emit(event);
|
|
1074
1134
|
return [context, validatePK11(v, pkType)];
|
|
@@ -1127,7 +1187,7 @@ var MemoryCacheMap = class _MemoryCacheMap extends CacheMap {
|
|
|
1127
1187
|
}
|
|
1128
1188
|
return null;
|
|
1129
1189
|
}
|
|
1130
|
-
set(key, value) {
|
|
1190
|
+
async set(key, value) {
|
|
1131
1191
|
logger15.trace("set", { key, value });
|
|
1132
1192
|
const hashedKey = this.normalizedHashFunction(key);
|
|
1133
1193
|
const keyStr = JSON.stringify(key);
|
|
@@ -1154,7 +1214,7 @@ var MemoryCacheMap = class _MemoryCacheMap extends CacheMap {
|
|
|
1154
1214
|
const entry = this.map[hashedKey];
|
|
1155
1215
|
return !!entry && this.normalizedHashFunction(entry.originalKey) === hashedKey;
|
|
1156
1216
|
}
|
|
1157
|
-
delete(key) {
|
|
1217
|
+
async delete(key) {
|
|
1158
1218
|
logger15.trace("delete", { key });
|
|
1159
1219
|
const hashedKey = this.normalizedHashFunction(key);
|
|
1160
1220
|
const entry = this.map[hashedKey];
|
|
@@ -1170,13 +1230,13 @@ var MemoryCacheMap = class _MemoryCacheMap extends CacheMap {
|
|
|
1170
1230
|
}
|
|
1171
1231
|
}
|
|
1172
1232
|
}
|
|
1173
|
-
keys() {
|
|
1233
|
+
async keys() {
|
|
1174
1234
|
return Object.values(this.map).map((entry) => entry.originalKey);
|
|
1175
1235
|
}
|
|
1176
1236
|
async values() {
|
|
1177
1237
|
return Object.values(this.map).map((entry) => entry.value);
|
|
1178
1238
|
}
|
|
1179
|
-
clear() {
|
|
1239
|
+
async clear() {
|
|
1180
1240
|
this.map = {};
|
|
1181
1241
|
this.metadataMap.clear();
|
|
1182
1242
|
this.queryResultCache = {};
|
|
@@ -1210,10 +1270,11 @@ var MemoryCacheMap = class _MemoryCacheMap extends CacheMap {
|
|
|
1210
1270
|
}
|
|
1211
1271
|
async clone() {
|
|
1212
1272
|
const clone = new _MemoryCacheMap(this.types);
|
|
1213
|
-
|
|
1273
|
+
const keys = await this.keys();
|
|
1274
|
+
for (const key of keys) {
|
|
1214
1275
|
const value = await this.get(key);
|
|
1215
1276
|
if (value) {
|
|
1216
|
-
clone.set(key, value);
|
|
1277
|
+
await clone.set(key, value);
|
|
1217
1278
|
}
|
|
1218
1279
|
}
|
|
1219
1280
|
for (const [queryHash, entry] of Object.entries(this.queryResultCache)) {
|
|
@@ -1225,7 +1286,7 @@ var MemoryCacheMap = class _MemoryCacheMap extends CacheMap {
|
|
|
1225
1286
|
return clone;
|
|
1226
1287
|
}
|
|
1227
1288
|
// Query result caching methods implementation
|
|
1228
|
-
setQueryResult(queryHash, itemKeys) {
|
|
1289
|
+
async setQueryResult(queryHash, itemKeys) {
|
|
1229
1290
|
logger15.trace("setQueryResult", { queryHash, itemKeys });
|
|
1230
1291
|
const entry = {
|
|
1231
1292
|
itemKeys: [...itemKeys]
|
|
@@ -1241,54 +1302,54 @@ var MemoryCacheMap = class _MemoryCacheMap extends CacheMap {
|
|
|
1241
1302
|
}
|
|
1242
1303
|
return [...entry.itemKeys];
|
|
1243
1304
|
}
|
|
1244
|
-
hasQueryResult(queryHash) {
|
|
1305
|
+
async hasQueryResult(queryHash) {
|
|
1245
1306
|
const entry = this.queryResultCache[queryHash];
|
|
1246
1307
|
return !!entry;
|
|
1247
1308
|
}
|
|
1248
|
-
deleteQueryResult(queryHash) {
|
|
1309
|
+
async deleteQueryResult(queryHash) {
|
|
1249
1310
|
logger15.trace("deleteQueryResult", { queryHash });
|
|
1250
1311
|
delete this.queryResultCache[queryHash];
|
|
1251
1312
|
}
|
|
1252
|
-
invalidateItemKeys(keys) {
|
|
1313
|
+
async invalidateItemKeys(keys) {
|
|
1253
1314
|
logger15.debug("invalidateItemKeys", { keys });
|
|
1254
|
-
|
|
1255
|
-
this.delete(key);
|
|
1256
|
-
}
|
|
1315
|
+
for (const key of keys) {
|
|
1316
|
+
await this.delete(key);
|
|
1317
|
+
}
|
|
1257
1318
|
}
|
|
1258
1319
|
async invalidateLocation(locations) {
|
|
1259
1320
|
logger15.debug("invalidateLocation", { locations });
|
|
1260
1321
|
if (locations.length === 0) {
|
|
1261
|
-
const allKeys = this.keys();
|
|
1322
|
+
const allKeys = await this.keys();
|
|
1262
1323
|
const primaryKeys = allKeys.filter((key) => !isComKey(key));
|
|
1263
|
-
this.invalidateItemKeys(primaryKeys);
|
|
1324
|
+
await this.invalidateItemKeys(primaryKeys);
|
|
1264
1325
|
} else {
|
|
1265
1326
|
const itemsInLocation = await this.allIn(locations);
|
|
1266
1327
|
const keysToInvalidate = itemsInLocation.map((item) => item.key);
|
|
1267
|
-
this.invalidateItemKeys(keysToInvalidate);
|
|
1328
|
+
await this.invalidateItemKeys(keysToInvalidate);
|
|
1268
1329
|
}
|
|
1269
|
-
this.clearQueryResults();
|
|
1330
|
+
await this.clearQueryResults();
|
|
1270
1331
|
}
|
|
1271
|
-
clearQueryResults() {
|
|
1332
|
+
async clearQueryResults() {
|
|
1272
1333
|
logger15.trace("clearQueryResults");
|
|
1273
1334
|
this.queryResultCache = {};
|
|
1274
1335
|
}
|
|
1275
1336
|
// CacheMapMetadataProvider implementation
|
|
1276
|
-
getMetadata(key) {
|
|
1337
|
+
async getMetadata(key) {
|
|
1277
1338
|
return this.metadataMap.get(key) || null;
|
|
1278
1339
|
}
|
|
1279
|
-
setMetadata(key, metadata) {
|
|
1340
|
+
async setMetadata(key, metadata) {
|
|
1280
1341
|
this.metadataMap.set(key, metadata);
|
|
1281
1342
|
}
|
|
1282
|
-
deleteMetadata(key) {
|
|
1343
|
+
async deleteMetadata(key) {
|
|
1283
1344
|
this.metadataMap.delete(key);
|
|
1284
1345
|
}
|
|
1285
|
-
getAllMetadata() {
|
|
1346
|
+
async getAllMetadata() {
|
|
1286
1347
|
return new Map(this.metadataMap);
|
|
1287
1348
|
}
|
|
1288
|
-
clearMetadata() {
|
|
1349
|
+
async clearMetadata() {
|
|
1289
1350
|
this.metadataMap.clear();
|
|
1290
1351
|
}
|
|
1291
|
-
getCurrentSize() {
|
|
1352
|
+
async getCurrentSize() {
|
|
1292
1353
|
let sizeBytes = 0;
|
|
1293
1354
|
for (const entry of Object.values(this.map)) {
|
|
1294
1355
|
sizeBytes += estimateValueSize(entry.value);
|
|
@@ -1298,7 +1359,7 @@ var MemoryCacheMap = class _MemoryCacheMap extends CacheMap {
|
|
|
1298
1359
|
sizeBytes
|
|
1299
1360
|
};
|
|
1300
1361
|
}
|
|
1301
|
-
getSizeLimits() {
|
|
1362
|
+
async getSizeLimits() {
|
|
1302
1363
|
return {
|
|
1303
1364
|
maxItems: null,
|
|
1304
1365
|
maxSizeBytes: null
|
|
@@ -1356,7 +1417,7 @@ var EnhancedMemoryCacheMap = class _EnhancedMemoryCacheMap extends CacheMap {
|
|
|
1356
1417
|
}
|
|
1357
1418
|
return null;
|
|
1358
1419
|
}
|
|
1359
|
-
set(key, value) {
|
|
1420
|
+
async set(key, value) {
|
|
1360
1421
|
logger16.trace("set", { key, value });
|
|
1361
1422
|
const hashedKey = this.normalizedHashFunction(key);
|
|
1362
1423
|
const estimatedSize = estimateValueSize(value);
|
|
@@ -1402,7 +1463,7 @@ var EnhancedMemoryCacheMap = class _EnhancedMemoryCacheMap extends CacheMap {
|
|
|
1402
1463
|
const entry = this.map[hashedKey];
|
|
1403
1464
|
return !!entry && this.normalizedHashFunction(entry.originalKey) === hashedKey && entry.value !== null;
|
|
1404
1465
|
}
|
|
1405
|
-
delete(key) {
|
|
1466
|
+
async delete(key) {
|
|
1406
1467
|
this.deleteInternal(key, true, "filter");
|
|
1407
1468
|
}
|
|
1408
1469
|
deleteInternal(key, invalidateQueries = false, invalidationMode = "remove") {
|
|
@@ -1428,13 +1489,13 @@ var EnhancedMemoryCacheMap = class _EnhancedMemoryCacheMap extends CacheMap {
|
|
|
1428
1489
|
}
|
|
1429
1490
|
}
|
|
1430
1491
|
}
|
|
1431
|
-
keys() {
|
|
1492
|
+
async keys() {
|
|
1432
1493
|
return Object.values(this.map).filter((entry) => entry.value !== null).map((entry) => entry.originalKey);
|
|
1433
1494
|
}
|
|
1434
1495
|
async values() {
|
|
1435
1496
|
return Object.values(this.map).filter((entry) => entry.value !== null).map((entry) => entry.value);
|
|
1436
1497
|
}
|
|
1437
|
-
clear() {
|
|
1498
|
+
async clear() {
|
|
1438
1499
|
logger16.debug("Clearing cache", {
|
|
1439
1500
|
itemsCleared: this.currentItemCount,
|
|
1440
1501
|
bytesFreed: this.currentSizeBytes
|
|
@@ -1478,14 +1539,15 @@ var EnhancedMemoryCacheMap = class _EnhancedMemoryCacheMap extends CacheMap {
|
|
|
1478
1539
|
sizeConfig.maxItems = this.maxItems;
|
|
1479
1540
|
}
|
|
1480
1541
|
const clone = new _EnhancedMemoryCacheMap(this.types, sizeConfig);
|
|
1481
|
-
|
|
1542
|
+
const keys = await this.keys();
|
|
1543
|
+
for (const key of keys) {
|
|
1482
1544
|
const value = await this.get(key);
|
|
1483
1545
|
if (value) {
|
|
1484
|
-
clone.set(key, value);
|
|
1546
|
+
await clone.set(key, value);
|
|
1485
1547
|
}
|
|
1486
1548
|
}
|
|
1487
1549
|
for (const [queryHash, entry] of Object.entries(this.queryResultCache)) {
|
|
1488
|
-
clone.setQueryResult(queryHash, entry.itemKeys);
|
|
1550
|
+
await clone.setQueryResult(queryHash, entry.itemKeys);
|
|
1489
1551
|
}
|
|
1490
1552
|
return clone;
|
|
1491
1553
|
}
|
|
@@ -1509,7 +1571,7 @@ var EnhancedMemoryCacheMap = class _EnhancedMemoryCacheMap extends CacheMap {
|
|
|
1509
1571
|
return stats;
|
|
1510
1572
|
}
|
|
1511
1573
|
// Query result caching methods
|
|
1512
|
-
setQueryResult(queryHash, itemKeys) {
|
|
1574
|
+
async setQueryResult(queryHash, itemKeys) {
|
|
1513
1575
|
logger16.trace("setQueryResult", { queryHash, itemKeys });
|
|
1514
1576
|
if (queryHash in this.queryResultCache) {
|
|
1515
1577
|
this.removeQueryResultFromSizeTracking(queryHash);
|
|
@@ -1529,28 +1591,28 @@ var EnhancedMemoryCacheMap = class _EnhancedMemoryCacheMap extends CacheMap {
|
|
|
1529
1591
|
}
|
|
1530
1592
|
return [...entry.itemKeys];
|
|
1531
1593
|
}
|
|
1532
|
-
hasQueryResult(queryHash) {
|
|
1594
|
+
async hasQueryResult(queryHash) {
|
|
1533
1595
|
const entry = this.queryResultCache[queryHash];
|
|
1534
1596
|
return !!entry;
|
|
1535
1597
|
}
|
|
1536
|
-
deleteQueryResult(queryHash) {
|
|
1598
|
+
async deleteQueryResult(queryHash) {
|
|
1537
1599
|
if (queryHash in this.queryResultCache) {
|
|
1538
1600
|
this.removeQueryResultFromSizeTracking(queryHash);
|
|
1539
1601
|
delete this.queryResultCache[queryHash];
|
|
1540
1602
|
}
|
|
1541
1603
|
}
|
|
1542
|
-
clearQueryResults() {
|
|
1604
|
+
async clearQueryResults() {
|
|
1543
1605
|
this.queryResultCache = {};
|
|
1544
1606
|
this.queryResultsCacheSize = 0;
|
|
1545
1607
|
}
|
|
1546
|
-
invalidateItemKeys(keys) {
|
|
1608
|
+
async invalidateItemKeys(keys) {
|
|
1547
1609
|
logger16.debug("invalidateItemKeys", { keys });
|
|
1548
1610
|
if (keys.length === 0) {
|
|
1549
1611
|
return;
|
|
1550
1612
|
}
|
|
1551
|
-
|
|
1613
|
+
for (const key of keys) {
|
|
1552
1614
|
this.deleteInternal(key, false);
|
|
1553
|
-
}
|
|
1615
|
+
}
|
|
1554
1616
|
this.invalidateQueriesReferencingKeys(keys);
|
|
1555
1617
|
}
|
|
1556
1618
|
filterQueriesReferencingKeys(keys) {
|
|
@@ -1597,14 +1659,14 @@ var EnhancedMemoryCacheMap = class _EnhancedMemoryCacheMap extends CacheMap {
|
|
|
1597
1659
|
logger16.debug("invalidateLocation", { locations });
|
|
1598
1660
|
let keysToInvalidate = [];
|
|
1599
1661
|
if (locations.length === 0) {
|
|
1600
|
-
const allKeys = this.keys();
|
|
1662
|
+
const allKeys = await this.keys();
|
|
1601
1663
|
const primaryKeys = allKeys.filter((key) => !isComKey2(key));
|
|
1602
1664
|
keysToInvalidate = primaryKeys;
|
|
1603
1665
|
} else {
|
|
1604
1666
|
const itemsInLocation = await this.allIn(locations);
|
|
1605
1667
|
keysToInvalidate = itemsInLocation.map((item) => item.key);
|
|
1606
1668
|
}
|
|
1607
|
-
this.invalidateItemKeys(keysToInvalidate);
|
|
1669
|
+
await this.invalidateItemKeys(keysToInvalidate);
|
|
1608
1670
|
}
|
|
1609
1671
|
/**
|
|
1610
1672
|
* Add query result to size tracking
|
|
@@ -1644,14 +1706,14 @@ var EnhancedMemoryCacheMap = class _EnhancedMemoryCacheMap extends CacheMap {
|
|
|
1644
1706
|
return this.currentSizeBytes + this.queryResultsCacheSize;
|
|
1645
1707
|
}
|
|
1646
1708
|
// CacheMapMetadataProvider implementation
|
|
1647
|
-
getMetadata(key) {
|
|
1709
|
+
async getMetadata(key) {
|
|
1648
1710
|
const entry = this.map[key];
|
|
1649
1711
|
if (entry && !entry.metadataCleared) {
|
|
1650
1712
|
return entry.metadata;
|
|
1651
1713
|
}
|
|
1652
1714
|
return null;
|
|
1653
1715
|
}
|
|
1654
|
-
setMetadata(key, metadata) {
|
|
1716
|
+
async setMetadata(key, metadata) {
|
|
1655
1717
|
const entry = this.map[key];
|
|
1656
1718
|
if (entry) {
|
|
1657
1719
|
entry.metadata = metadata;
|
|
@@ -1672,9 +1734,9 @@ var EnhancedMemoryCacheMap = class _EnhancedMemoryCacheMap extends CacheMap {
|
|
|
1672
1734
|
};
|
|
1673
1735
|
}
|
|
1674
1736
|
}
|
|
1675
|
-
deleteMetadata(_key) {
|
|
1737
|
+
async deleteMetadata(_key) {
|
|
1676
1738
|
}
|
|
1677
|
-
getAllMetadata() {
|
|
1739
|
+
async getAllMetadata() {
|
|
1678
1740
|
const metadata = /* @__PURE__ */ new Map();
|
|
1679
1741
|
for (const [hashedKey, entry] of Object.entries(this.map)) {
|
|
1680
1742
|
if (!entry.metadataCleared) {
|
|
@@ -1683,7 +1745,7 @@ var EnhancedMemoryCacheMap = class _EnhancedMemoryCacheMap extends CacheMap {
|
|
|
1683
1745
|
}
|
|
1684
1746
|
return metadata;
|
|
1685
1747
|
}
|
|
1686
|
-
clearMetadata() {
|
|
1748
|
+
async clearMetadata() {
|
|
1687
1749
|
const keysToRemove = [];
|
|
1688
1750
|
for (const [hashedKey, entry] of Object.entries(this.map)) {
|
|
1689
1751
|
if (entry.value === null) {
|
|
@@ -1696,13 +1758,13 @@ var EnhancedMemoryCacheMap = class _EnhancedMemoryCacheMap extends CacheMap {
|
|
|
1696
1758
|
delete this.map[key];
|
|
1697
1759
|
}
|
|
1698
1760
|
}
|
|
1699
|
-
getCurrentSize() {
|
|
1761
|
+
async getCurrentSize() {
|
|
1700
1762
|
return {
|
|
1701
1763
|
itemCount: this.currentItemCount,
|
|
1702
1764
|
sizeBytes: this.currentSizeBytes
|
|
1703
1765
|
};
|
|
1704
1766
|
}
|
|
1705
|
-
getSizeLimits() {
|
|
1767
|
+
async getSizeLimits() {
|
|
1706
1768
|
return {
|
|
1707
1769
|
maxItems: this.maxItems ?? null,
|
|
1708
1770
|
maxSizeBytes: this.maxSizeBytes ?? null
|
|
@@ -1842,7 +1904,7 @@ var LocalStorageCacheMap = class _LocalStorageCacheMap extends CacheMap {
|
|
|
1842
1904
|
return null;
|
|
1843
1905
|
}
|
|
1844
1906
|
}
|
|
1845
|
-
set(key, value) {
|
|
1907
|
+
async set(key, value) {
|
|
1846
1908
|
logger17.trace("set", { key, value });
|
|
1847
1909
|
for (let attempt = 0; attempt < this.MAX_RETRY_ATTEMPTS; attempt++) {
|
|
1848
1910
|
try {
|
|
@@ -1896,7 +1958,7 @@ var LocalStorageCacheMap = class _LocalStorageCacheMap extends CacheMap {
|
|
|
1896
1958
|
return false;
|
|
1897
1959
|
}
|
|
1898
1960
|
}
|
|
1899
|
-
delete(key) {
|
|
1961
|
+
async delete(key) {
|
|
1900
1962
|
logger17.trace("delete", { key });
|
|
1901
1963
|
try {
|
|
1902
1964
|
const storageKey = this.getStorageKey(key);
|
|
@@ -1911,7 +1973,7 @@ var LocalStorageCacheMap = class _LocalStorageCacheMap extends CacheMap {
|
|
|
1911
1973
|
if (locations.length === 0) {
|
|
1912
1974
|
logger17.debug("Returning all items, LocKeys is empty");
|
|
1913
1975
|
const items = [];
|
|
1914
|
-
for (const key of allKeys) {
|
|
1976
|
+
for (const key of await allKeys) {
|
|
1915
1977
|
const item = await this.get(key);
|
|
1916
1978
|
if (item !== null) {
|
|
1917
1979
|
items.push(item);
|
|
@@ -1920,14 +1982,15 @@ var LocalStorageCacheMap = class _LocalStorageCacheMap extends CacheMap {
|
|
|
1920
1982
|
return items;
|
|
1921
1983
|
} else {
|
|
1922
1984
|
const locKeys = locations;
|
|
1923
|
-
|
|
1924
|
-
|
|
1925
|
-
|
|
1985
|
+
const resolvedKeys = await allKeys;
|
|
1986
|
+
logger17.debug("allIn", { locKeys, keys: resolvedKeys.length });
|
|
1987
|
+
const filteredKeys = resolvedKeys.filter((key) => key && isComKey3(key)).filter((key) => {
|
|
1988
|
+
const ComKey13 = key;
|
|
1926
1989
|
logger17.debug("Comparing Location Keys", {
|
|
1927
1990
|
locKeys,
|
|
1928
|
-
ComKey:
|
|
1991
|
+
ComKey: ComKey13
|
|
1929
1992
|
});
|
|
1930
|
-
return isLocKeyArrayEqual(locKeys,
|
|
1993
|
+
return isLocKeyArrayEqual(locKeys, ComKey13.loc);
|
|
1931
1994
|
});
|
|
1932
1995
|
const items = [];
|
|
1933
1996
|
for (const key of filteredKeys) {
|
|
@@ -1963,7 +2026,7 @@ var LocalStorageCacheMap = class _LocalStorageCacheMap extends CacheMap {
|
|
|
1963
2026
|
}
|
|
1964
2027
|
return null;
|
|
1965
2028
|
}
|
|
1966
|
-
keys() {
|
|
2029
|
+
async keys() {
|
|
1967
2030
|
const keys = [];
|
|
1968
2031
|
try {
|
|
1969
2032
|
const storageKeys = this.getAllStorageKeys();
|
|
@@ -1993,7 +2056,7 @@ var LocalStorageCacheMap = class _LocalStorageCacheMap extends CacheMap {
|
|
|
1993
2056
|
}
|
|
1994
2057
|
return values;
|
|
1995
2058
|
}
|
|
1996
|
-
clear() {
|
|
2059
|
+
async clear() {
|
|
1997
2060
|
logger17.debug("Clearing localStorage cache");
|
|
1998
2061
|
try {
|
|
1999
2062
|
const storageKeys = this.getAllStorageKeys();
|
|
@@ -2006,7 +2069,7 @@ var LocalStorageCacheMap = class _LocalStorageCacheMap extends CacheMap {
|
|
|
2006
2069
|
}
|
|
2007
2070
|
}
|
|
2008
2071
|
// Query result caching methods implementation
|
|
2009
|
-
setQueryResult(queryHash, itemKeys) {
|
|
2072
|
+
async setQueryResult(queryHash, itemKeys) {
|
|
2010
2073
|
logger17.trace("setQueryResult", { queryHash, itemKeys });
|
|
2011
2074
|
const queryKey = `${this.keyPrefix}:query:${queryHash}`;
|
|
2012
2075
|
const entry = {
|
|
@@ -2036,7 +2099,7 @@ var LocalStorageCacheMap = class _LocalStorageCacheMap extends CacheMap {
|
|
|
2036
2099
|
return null;
|
|
2037
2100
|
}
|
|
2038
2101
|
}
|
|
2039
|
-
hasQueryResult(queryHash) {
|
|
2102
|
+
async hasQueryResult(queryHash) {
|
|
2040
2103
|
const queryKey = `${this.keyPrefix}:query:${queryHash}`;
|
|
2041
2104
|
try {
|
|
2042
2105
|
return localStorage.getItem(queryKey) !== null;
|
|
@@ -2045,7 +2108,7 @@ var LocalStorageCacheMap = class _LocalStorageCacheMap extends CacheMap {
|
|
|
2045
2108
|
return false;
|
|
2046
2109
|
}
|
|
2047
2110
|
}
|
|
2048
|
-
deleteQueryResult(queryHash) {
|
|
2111
|
+
async deleteQueryResult(queryHash) {
|
|
2049
2112
|
logger17.trace("deleteQueryResult", { queryHash });
|
|
2050
2113
|
const queryKey = `${this.keyPrefix}:query:${queryHash}`;
|
|
2051
2114
|
try {
|
|
@@ -2054,36 +2117,37 @@ var LocalStorageCacheMap = class _LocalStorageCacheMap extends CacheMap {
|
|
|
2054
2117
|
logger17.error("Failed to delete query result from localStorage", { queryHash, error });
|
|
2055
2118
|
}
|
|
2056
2119
|
}
|
|
2057
|
-
invalidateItemKeys(keys) {
|
|
2120
|
+
async invalidateItemKeys(keys) {
|
|
2058
2121
|
logger17.debug("invalidateItemKeys", { keys });
|
|
2059
|
-
|
|
2122
|
+
for (const key of keys) {
|
|
2060
2123
|
try {
|
|
2061
|
-
this.delete(key);
|
|
2124
|
+
await this.delete(key);
|
|
2062
2125
|
} catch (error) {
|
|
2063
2126
|
logger17.error("Failed to delete key during invalidation", { key, error });
|
|
2064
2127
|
}
|
|
2065
|
-
}
|
|
2128
|
+
}
|
|
2066
2129
|
}
|
|
2067
2130
|
async invalidateLocation(locations) {
|
|
2068
2131
|
logger17.debug("invalidateLocation", { locations });
|
|
2069
2132
|
try {
|
|
2070
2133
|
if (locations.length === 0) {
|
|
2071
|
-
const allKeys = this.keys();
|
|
2134
|
+
const allKeys = await this.keys();
|
|
2072
2135
|
const primaryKeys = allKeys.filter((key) => !isComKey3(key));
|
|
2073
|
-
this.invalidateItemKeys(primaryKeys);
|
|
2136
|
+
await this.invalidateItemKeys(primaryKeys);
|
|
2074
2137
|
} else {
|
|
2075
|
-
const
|
|
2138
|
+
const allKeys = await this.keys();
|
|
2139
|
+
const keysToInvalidate = allKeys.filter((key) => key && isComKey3(key)).filter((key) => {
|
|
2076
2140
|
const compositeKey = key;
|
|
2077
2141
|
return isLocKeyArrayEqual(locations, compositeKey.loc);
|
|
2078
2142
|
});
|
|
2079
|
-
this.invalidateItemKeys(keysToInvalidate);
|
|
2143
|
+
await this.invalidateItemKeys(keysToInvalidate);
|
|
2080
2144
|
}
|
|
2081
|
-
this.clearQueryResults();
|
|
2145
|
+
await this.clearQueryResults();
|
|
2082
2146
|
} catch (error) {
|
|
2083
2147
|
logger17.error("Error in invalidateLocation", { locations, error });
|
|
2084
2148
|
}
|
|
2085
2149
|
}
|
|
2086
|
-
clearQueryResults() {
|
|
2150
|
+
async clearQueryResults() {
|
|
2087
2151
|
logger17.trace("clearQueryResults");
|
|
2088
2152
|
const queryPrefix = `${this.keyPrefix}:query:`;
|
|
2089
2153
|
try {
|
|
@@ -2100,7 +2164,7 @@ var LocalStorageCacheMap = class _LocalStorageCacheMap extends CacheMap {
|
|
|
2100
2164
|
}
|
|
2101
2165
|
}
|
|
2102
2166
|
// CacheMapMetadataProvider implementation
|
|
2103
|
-
getMetadata(key) {
|
|
2167
|
+
async getMetadata(key) {
|
|
2104
2168
|
try {
|
|
2105
2169
|
const metadataKey = `${this.keyPrefix}:metadata:${key}`;
|
|
2106
2170
|
const stored = localStorage.getItem(metadataKey);
|
|
@@ -2118,7 +2182,7 @@ var LocalStorageCacheMap = class _LocalStorageCacheMap extends CacheMap {
|
|
|
2118
2182
|
throw error;
|
|
2119
2183
|
}
|
|
2120
2184
|
}
|
|
2121
|
-
setMetadata(key, metadata) {
|
|
2185
|
+
async setMetadata(key, metadata) {
|
|
2122
2186
|
for (let attempt = 0; attempt < this.MAX_RETRY_ATTEMPTS; attempt++) {
|
|
2123
2187
|
try {
|
|
2124
2188
|
const metadataKey = `${this.keyPrefix}:metadata:${key}`;
|
|
@@ -2146,7 +2210,7 @@ var LocalStorageCacheMap = class _LocalStorageCacheMap extends CacheMap {
|
|
|
2146
2210
|
}
|
|
2147
2211
|
}
|
|
2148
2212
|
}
|
|
2149
|
-
deleteMetadata(key) {
|
|
2213
|
+
async deleteMetadata(key) {
|
|
2150
2214
|
try {
|
|
2151
2215
|
const metadataKey = `${this.keyPrefix}:metadata:${key}`;
|
|
2152
2216
|
localStorage.removeItem(metadataKey);
|
|
@@ -2155,7 +2219,7 @@ var LocalStorageCacheMap = class _LocalStorageCacheMap extends CacheMap {
|
|
|
2155
2219
|
throw error;
|
|
2156
2220
|
}
|
|
2157
2221
|
}
|
|
2158
|
-
getAllMetadata() {
|
|
2222
|
+
async getAllMetadata() {
|
|
2159
2223
|
const metadata = /* @__PURE__ */ new Map();
|
|
2160
2224
|
try {
|
|
2161
2225
|
const metadataPrefix = `${this.keyPrefix}:metadata:`;
|
|
@@ -2179,7 +2243,7 @@ var LocalStorageCacheMap = class _LocalStorageCacheMap extends CacheMap {
|
|
|
2179
2243
|
}
|
|
2180
2244
|
return metadata;
|
|
2181
2245
|
}
|
|
2182
|
-
clearMetadata() {
|
|
2246
|
+
async clearMetadata() {
|
|
2183
2247
|
try {
|
|
2184
2248
|
const metadataPrefix = `${this.keyPrefix}:metadata:`;
|
|
2185
2249
|
const keysToDelete = this.getAllKeysStartingWith(metadataPrefix);
|
|
@@ -2189,7 +2253,7 @@ var LocalStorageCacheMap = class _LocalStorageCacheMap extends CacheMap {
|
|
|
2189
2253
|
throw error;
|
|
2190
2254
|
}
|
|
2191
2255
|
}
|
|
2192
|
-
getCurrentSize() {
|
|
2256
|
+
async getCurrentSize() {
|
|
2193
2257
|
let itemCount = 0;
|
|
2194
2258
|
let sizeBytes = 0;
|
|
2195
2259
|
try {
|
|
@@ -2228,7 +2292,7 @@ var LocalStorageCacheMap = class _LocalStorageCacheMap extends CacheMap {
|
|
|
2228
2292
|
}
|
|
2229
2293
|
return { itemCount, sizeBytes };
|
|
2230
2294
|
}
|
|
2231
|
-
getSizeLimits() {
|
|
2295
|
+
async getSizeLimits() {
|
|
2232
2296
|
return {
|
|
2233
2297
|
maxItems: null,
|
|
2234
2298
|
// No specific item limit
|
|
@@ -2319,7 +2383,7 @@ var SessionStorageCacheMap = class _SessionStorageCacheMap extends CacheMap {
|
|
|
2319
2383
|
return null;
|
|
2320
2384
|
}
|
|
2321
2385
|
}
|
|
2322
|
-
set(key, value) {
|
|
2386
|
+
async set(key, value) {
|
|
2323
2387
|
try {
|
|
2324
2388
|
const storageKey = this.getStorageKey(key);
|
|
2325
2389
|
logger18.trace("set", { storageKey });
|
|
@@ -2357,7 +2421,7 @@ var SessionStorageCacheMap = class _SessionStorageCacheMap extends CacheMap {
|
|
|
2357
2421
|
return false;
|
|
2358
2422
|
}
|
|
2359
2423
|
}
|
|
2360
|
-
delete(key) {
|
|
2424
|
+
async delete(key) {
|
|
2361
2425
|
logger18.trace("delete", { key });
|
|
2362
2426
|
try {
|
|
2363
2427
|
const storageKey = this.getStorageKey(key);
|
|
@@ -2371,7 +2435,7 @@ var SessionStorageCacheMap = class _SessionStorageCacheMap extends CacheMap {
|
|
|
2371
2435
|
if (locations.length === 0) {
|
|
2372
2436
|
logger18.debug("Returning all items, LocKeys is empty");
|
|
2373
2437
|
const items = [];
|
|
2374
|
-
for (const key of allKeys) {
|
|
2438
|
+
for (const key of await allKeys) {
|
|
2375
2439
|
const item = await this.get(key);
|
|
2376
2440
|
if (item !== null) {
|
|
2377
2441
|
items.push(item);
|
|
@@ -2380,14 +2444,15 @@ var SessionStorageCacheMap = class _SessionStorageCacheMap extends CacheMap {
|
|
|
2380
2444
|
return items;
|
|
2381
2445
|
} else {
|
|
2382
2446
|
const locKeys = locations;
|
|
2383
|
-
|
|
2384
|
-
|
|
2385
|
-
|
|
2447
|
+
const resolvedKeys = await allKeys;
|
|
2448
|
+
logger18.debug("allIn", { locKeys, keys: resolvedKeys.length });
|
|
2449
|
+
const filteredKeys = resolvedKeys.filter((key) => key && isComKey4(key)).filter((key) => {
|
|
2450
|
+
const ComKey13 = key;
|
|
2386
2451
|
logger18.debug("Comparing Location Keys", {
|
|
2387
2452
|
locKeys,
|
|
2388
|
-
ComKey:
|
|
2453
|
+
ComKey: ComKey13
|
|
2389
2454
|
});
|
|
2390
|
-
return isLocKeyArrayEqual(locKeys,
|
|
2455
|
+
return isLocKeyArrayEqual(locKeys, ComKey13.loc);
|
|
2391
2456
|
});
|
|
2392
2457
|
const items = [];
|
|
2393
2458
|
for (const key of filteredKeys) {
|
|
@@ -2412,7 +2477,7 @@ var SessionStorageCacheMap = class _SessionStorageCacheMap extends CacheMap {
|
|
|
2412
2477
|
async clone() {
|
|
2413
2478
|
return new _SessionStorageCacheMap(this.types, this.keyPrefix);
|
|
2414
2479
|
}
|
|
2415
|
-
keys() {
|
|
2480
|
+
async keys() {
|
|
2416
2481
|
const keys = [];
|
|
2417
2482
|
try {
|
|
2418
2483
|
const storageKeys = this.getAllStorageKeys();
|
|
@@ -2454,7 +2519,7 @@ var SessionStorageCacheMap = class _SessionStorageCacheMap extends CacheMap {
|
|
|
2454
2519
|
}
|
|
2455
2520
|
return values;
|
|
2456
2521
|
}
|
|
2457
|
-
clear() {
|
|
2522
|
+
async clear() {
|
|
2458
2523
|
logger18.debug("Clearing sessionStorage cache");
|
|
2459
2524
|
try {
|
|
2460
2525
|
const storageKeys = this.getAllStorageKeys();
|
|
@@ -2466,7 +2531,7 @@ var SessionStorageCacheMap = class _SessionStorageCacheMap extends CacheMap {
|
|
|
2466
2531
|
}
|
|
2467
2532
|
}
|
|
2468
2533
|
// Query result caching methods implementation
|
|
2469
|
-
setQueryResult(queryHash, itemKeys) {
|
|
2534
|
+
async setQueryResult(queryHash, itemKeys) {
|
|
2470
2535
|
logger18.trace("setQueryResult", { queryHash, itemKeys });
|
|
2471
2536
|
const queryKey = `${this.keyPrefix}:query:${queryHash}`;
|
|
2472
2537
|
const entry = {
|
|
@@ -2497,7 +2562,7 @@ var SessionStorageCacheMap = class _SessionStorageCacheMap extends CacheMap {
|
|
|
2497
2562
|
return null;
|
|
2498
2563
|
}
|
|
2499
2564
|
}
|
|
2500
|
-
hasQueryResult(queryHash) {
|
|
2565
|
+
async hasQueryResult(queryHash) {
|
|
2501
2566
|
const queryKey = `${this.keyPrefix}:query:${queryHash}`;
|
|
2502
2567
|
try {
|
|
2503
2568
|
return sessionStorage.getItem(queryKey) !== null;
|
|
@@ -2506,7 +2571,7 @@ var SessionStorageCacheMap = class _SessionStorageCacheMap extends CacheMap {
|
|
|
2506
2571
|
return false;
|
|
2507
2572
|
}
|
|
2508
2573
|
}
|
|
2509
|
-
deleteQueryResult(queryHash) {
|
|
2574
|
+
async deleteQueryResult(queryHash) {
|
|
2510
2575
|
logger18.trace("deleteQueryResult", { queryHash });
|
|
2511
2576
|
const queryKey = `${this.keyPrefix}:query:${queryHash}`;
|
|
2512
2577
|
try {
|
|
@@ -2515,26 +2580,26 @@ var SessionStorageCacheMap = class _SessionStorageCacheMap extends CacheMap {
|
|
|
2515
2580
|
logger18.error("Failed to delete query result from sessionStorage", { queryHash, error });
|
|
2516
2581
|
}
|
|
2517
2582
|
}
|
|
2518
|
-
invalidateItemKeys(keys) {
|
|
2583
|
+
async invalidateItemKeys(keys) {
|
|
2519
2584
|
logger18.debug("invalidateItemKeys", { keys });
|
|
2520
|
-
|
|
2521
|
-
this.delete(key);
|
|
2522
|
-
}
|
|
2585
|
+
for (const key of keys) {
|
|
2586
|
+
await this.delete(key);
|
|
2587
|
+
}
|
|
2523
2588
|
}
|
|
2524
2589
|
async invalidateLocation(locations) {
|
|
2525
2590
|
logger18.debug("invalidateLocation", { locations });
|
|
2526
2591
|
if (locations.length === 0) {
|
|
2527
|
-
const allKeys = this.keys();
|
|
2592
|
+
const allKeys = await this.keys();
|
|
2528
2593
|
const primaryKeys = allKeys.filter((key) => !isComKey4(key));
|
|
2529
|
-
this.invalidateItemKeys(primaryKeys);
|
|
2594
|
+
await this.invalidateItemKeys(primaryKeys);
|
|
2530
2595
|
} else {
|
|
2531
2596
|
const itemsInLocation = await this.allIn(locations);
|
|
2532
2597
|
const keysToInvalidate = itemsInLocation.map((item) => item.key);
|
|
2533
|
-
this.invalidateItemKeys(keysToInvalidate);
|
|
2598
|
+
await this.invalidateItemKeys(keysToInvalidate);
|
|
2534
2599
|
}
|
|
2535
|
-
this.clearQueryResults();
|
|
2600
|
+
await this.clearQueryResults();
|
|
2536
2601
|
}
|
|
2537
|
-
clearQueryResults() {
|
|
2602
|
+
async clearQueryResults() {
|
|
2538
2603
|
logger18.trace("clearQueryResults");
|
|
2539
2604
|
const queryPrefix = `${this.keyPrefix}:query:`;
|
|
2540
2605
|
try {
|
|
@@ -2551,7 +2616,7 @@ var SessionStorageCacheMap = class _SessionStorageCacheMap extends CacheMap {
|
|
|
2551
2616
|
}
|
|
2552
2617
|
}
|
|
2553
2618
|
// CacheMapMetadataProvider implementation
|
|
2554
|
-
getMetadata(key) {
|
|
2619
|
+
async getMetadata(key) {
|
|
2555
2620
|
try {
|
|
2556
2621
|
const metadataKey = `${this.keyPrefix}:metadata:${key}`;
|
|
2557
2622
|
const stored = sessionStorage.getItem(metadataKey);
|
|
@@ -2560,7 +2625,7 @@ var SessionStorageCacheMap = class _SessionStorageCacheMap extends CacheMap {
|
|
|
2560
2625
|
return null;
|
|
2561
2626
|
}
|
|
2562
2627
|
}
|
|
2563
|
-
setMetadata(key, metadata) {
|
|
2628
|
+
async setMetadata(key, metadata) {
|
|
2564
2629
|
try {
|
|
2565
2630
|
const metadataKey = `${this.keyPrefix}:metadata:${key}`;
|
|
2566
2631
|
const jsonString = safeStringify2(metadata);
|
|
@@ -2568,14 +2633,14 @@ var SessionStorageCacheMap = class _SessionStorageCacheMap extends CacheMap {
|
|
|
2568
2633
|
} catch {
|
|
2569
2634
|
}
|
|
2570
2635
|
}
|
|
2571
|
-
deleteMetadata(key) {
|
|
2636
|
+
async deleteMetadata(key) {
|
|
2572
2637
|
try {
|
|
2573
2638
|
const metadataKey = `${this.keyPrefix}:metadata:${key}`;
|
|
2574
2639
|
sessionStorage.removeItem(metadataKey);
|
|
2575
2640
|
} catch {
|
|
2576
2641
|
}
|
|
2577
2642
|
}
|
|
2578
|
-
getAllMetadata() {
|
|
2643
|
+
async getAllMetadata() {
|
|
2579
2644
|
const metadata = /* @__PURE__ */ new Map();
|
|
2580
2645
|
const metadataPrefix = `${this.keyPrefix}:metadata:`;
|
|
2581
2646
|
try {
|
|
@@ -2598,7 +2663,7 @@ var SessionStorageCacheMap = class _SessionStorageCacheMap extends CacheMap {
|
|
|
2598
2663
|
return metadata;
|
|
2599
2664
|
}
|
|
2600
2665
|
}
|
|
2601
|
-
clearMetadata() {
|
|
2666
|
+
async clearMetadata() {
|
|
2602
2667
|
try {
|
|
2603
2668
|
const metadataPrefix = `${this.keyPrefix}:metadata:`;
|
|
2604
2669
|
const keysToDelete = [];
|
|
@@ -2612,7 +2677,7 @@ var SessionStorageCacheMap = class _SessionStorageCacheMap extends CacheMap {
|
|
|
2612
2677
|
} catch {
|
|
2613
2678
|
}
|
|
2614
2679
|
}
|
|
2615
|
-
getCurrentSize() {
|
|
2680
|
+
async getCurrentSize() {
|
|
2616
2681
|
let itemCount = 0;
|
|
2617
2682
|
let sizeBytes = 0;
|
|
2618
2683
|
try {
|
|
@@ -2642,7 +2707,7 @@ var SessionStorageCacheMap = class _SessionStorageCacheMap extends CacheMap {
|
|
|
2642
2707
|
}
|
|
2643
2708
|
return { itemCount, sizeBytes };
|
|
2644
2709
|
}
|
|
2645
|
-
getSizeLimits() {
|
|
2710
|
+
async getSizeLimits() {
|
|
2646
2711
|
return {
|
|
2647
2712
|
maxItems: null,
|
|
2648
2713
|
// No specific item limit
|
|
@@ -2652,6 +2717,12 @@ var SessionStorageCacheMap = class _SessionStorageCacheMap extends CacheMap {
|
|
|
2652
2717
|
}
|
|
2653
2718
|
};
|
|
2654
2719
|
|
|
2720
|
+
// src/browser/IndexDBCacheMap.ts
|
|
2721
|
+
import {
|
|
2722
|
+
isComKey as isComKey6,
|
|
2723
|
+
isQueryMatch as isQueryMatch6
|
|
2724
|
+
} from "@fjell/core";
|
|
2725
|
+
|
|
2655
2726
|
// src/browser/AsyncIndexDBCacheMap.ts
|
|
2656
2727
|
import {
|
|
2657
2728
|
isComKey as isComKey5,
|
|
@@ -2666,6 +2737,8 @@ var AsyncIndexDBCacheMap = class _AsyncIndexDBCacheMap {
|
|
|
2666
2737
|
version;
|
|
2667
2738
|
normalizedHashFunction;
|
|
2668
2739
|
dbPromise = null;
|
|
2740
|
+
// Current storage format version
|
|
2741
|
+
static CURRENT_VERSION = 1;
|
|
2669
2742
|
constructor(types, dbName = "fjell-indexdb-cache", storeName = "cache", version = 1) {
|
|
2670
2743
|
this.types = types;
|
|
2671
2744
|
this.dbName = dbName;
|
|
@@ -2676,6 +2749,10 @@ var AsyncIndexDBCacheMap = class _AsyncIndexDBCacheMap {
|
|
|
2676
2749
|
async getDB() {
|
|
2677
2750
|
if (!this.dbPromise) {
|
|
2678
2751
|
this.dbPromise = new Promise((resolve, reject) => {
|
|
2752
|
+
if (typeof indexedDB === "undefined") {
|
|
2753
|
+
reject(new Error("IndexedDB is not available in this environment"));
|
|
2754
|
+
return;
|
|
2755
|
+
}
|
|
2679
2756
|
const request = indexedDB.open(this.dbName, this.version);
|
|
2680
2757
|
request.onerror = () => {
|
|
2681
2758
|
logger19.error("Error opening IndexedDB", { error: request.error });
|
|
@@ -2727,8 +2804,41 @@ var AsyncIndexDBCacheMap = class _AsyncIndexDBCacheMap {
|
|
|
2727
2804
|
return null;
|
|
2728
2805
|
}
|
|
2729
2806
|
}
|
|
2730
|
-
|
|
2731
|
-
|
|
2807
|
+
/**
|
|
2808
|
+
* Get both the value and metadata for an item
|
|
2809
|
+
*/
|
|
2810
|
+
async getWithMetadata(key) {
|
|
2811
|
+
logger19.trace("getWithMetadata", { key });
|
|
2812
|
+
try {
|
|
2813
|
+
const db = await this.getDB();
|
|
2814
|
+
const transaction = db.transaction([this.storeName], "readonly");
|
|
2815
|
+
const store = transaction.objectStore(this.storeName);
|
|
2816
|
+
const storageKey = this.getStorageKey(key);
|
|
2817
|
+
return new Promise((resolve, reject) => {
|
|
2818
|
+
const request = store.get(storageKey);
|
|
2819
|
+
request.onerror = () => {
|
|
2820
|
+
logger19.error("Error getting from IndexedDB", { key, error: request.error });
|
|
2821
|
+
reject(request.error);
|
|
2822
|
+
};
|
|
2823
|
+
request.onsuccess = () => {
|
|
2824
|
+
const stored = request.result;
|
|
2825
|
+
if (stored && this.normalizedHashFunction(stored.originalKey) === this.normalizedHashFunction(key)) {
|
|
2826
|
+
resolve({
|
|
2827
|
+
value: stored.value,
|
|
2828
|
+
metadata: stored.metadata
|
|
2829
|
+
});
|
|
2830
|
+
} else {
|
|
2831
|
+
resolve(null);
|
|
2832
|
+
}
|
|
2833
|
+
};
|
|
2834
|
+
});
|
|
2835
|
+
} catch (error) {
|
|
2836
|
+
logger19.error("Error in IndexedDB getWithMetadata operation", { key, error });
|
|
2837
|
+
return null;
|
|
2838
|
+
}
|
|
2839
|
+
}
|
|
2840
|
+
async set(key, value, metadata) {
|
|
2841
|
+
logger19.trace("set", { key, value, hasMetadata: !!metadata });
|
|
2732
2842
|
try {
|
|
2733
2843
|
const db = await this.getDB();
|
|
2734
2844
|
const transaction = db.transaction([this.storeName], "readwrite");
|
|
@@ -2736,7 +2846,9 @@ var AsyncIndexDBCacheMap = class _AsyncIndexDBCacheMap {
|
|
|
2736
2846
|
const storageKey = this.getStorageKey(key);
|
|
2737
2847
|
const storedItem = {
|
|
2738
2848
|
originalKey: key,
|
|
2739
|
-
value
|
|
2849
|
+
value,
|
|
2850
|
+
metadata,
|
|
2851
|
+
version: _AsyncIndexDBCacheMap.CURRENT_VERSION
|
|
2740
2852
|
};
|
|
2741
2853
|
return new Promise((resolve, reject) => {
|
|
2742
2854
|
const request = store.put(storedItem, storageKey);
|
|
@@ -2753,6 +2865,23 @@ var AsyncIndexDBCacheMap = class _AsyncIndexDBCacheMap {
|
|
|
2753
2865
|
throw new Error(`Failed to store item in IndexedDB: ${error}`);
|
|
2754
2866
|
}
|
|
2755
2867
|
}
|
|
2868
|
+
/**
|
|
2869
|
+
* Update only the metadata for an existing item
|
|
2870
|
+
*/
|
|
2871
|
+
async setMetadata(key, metadata) {
|
|
2872
|
+
logger19.trace("setMetadata", { key, metadata });
|
|
2873
|
+
try {
|
|
2874
|
+
const existing = await this.getWithMetadata(key);
|
|
2875
|
+
if (existing) {
|
|
2876
|
+
await this.set(key, existing.value, metadata);
|
|
2877
|
+
} else {
|
|
2878
|
+
logger19.warning("Attempted to set metadata for non-existent item", { key });
|
|
2879
|
+
}
|
|
2880
|
+
} catch (error) {
|
|
2881
|
+
logger19.error("Error in IndexedDB setMetadata operation", { key, error });
|
|
2882
|
+
throw new Error(`Failed to update metadata in IndexedDB: ${error}`);
|
|
2883
|
+
}
|
|
2884
|
+
}
|
|
2756
2885
|
async includesKey(key) {
|
|
2757
2886
|
try {
|
|
2758
2887
|
const db = await this.getDB();
|
|
@@ -2812,12 +2941,12 @@ var AsyncIndexDBCacheMap = class _AsyncIndexDBCacheMap {
|
|
|
2812
2941
|
const locKeys = locations;
|
|
2813
2942
|
logger19.debug("allIn", { locKeys, keys: allKeys.length });
|
|
2814
2943
|
const filteredKeys = allKeys.filter((key) => key && isComKey5(key)).filter((key) => {
|
|
2815
|
-
const
|
|
2944
|
+
const ComKey13 = key;
|
|
2816
2945
|
logger19.debug("Comparing Location Keys", {
|
|
2817
2946
|
locKeys,
|
|
2818
|
-
ComKey:
|
|
2947
|
+
ComKey: ComKey13
|
|
2819
2948
|
});
|
|
2820
|
-
return isLocKeyArrayEqual(locKeys,
|
|
2949
|
+
return isLocKeyArrayEqual(locKeys, ComKey13.loc);
|
|
2821
2950
|
});
|
|
2822
2951
|
const promises = filteredKeys.map((key) => this.get(key));
|
|
2823
2952
|
const results = await Promise.all(promises);
|
|
@@ -2865,6 +2994,40 @@ var AsyncIndexDBCacheMap = class _AsyncIndexDBCacheMap {
|
|
|
2865
2994
|
return [];
|
|
2866
2995
|
}
|
|
2867
2996
|
}
|
|
2997
|
+
/**
|
|
2998
|
+
* Get all metadata entries from IndexedDB
|
|
2999
|
+
*/
|
|
3000
|
+
async getAllMetadata() {
|
|
3001
|
+
const metadataMap = /* @__PURE__ */ new Map();
|
|
3002
|
+
try {
|
|
3003
|
+
const db = await this.getDB();
|
|
3004
|
+
const transaction = db.transaction([this.storeName], "readonly");
|
|
3005
|
+
const store = transaction.objectStore(this.storeName);
|
|
3006
|
+
return new Promise((resolve, reject) => {
|
|
3007
|
+
const request = store.openCursor();
|
|
3008
|
+
request.onerror = () => {
|
|
3009
|
+
logger19.error("Error getting metadata from IndexedDB", { error: request.error });
|
|
3010
|
+
reject(request.error);
|
|
3011
|
+
};
|
|
3012
|
+
request.onsuccess = (event) => {
|
|
3013
|
+
const cursor = event.target.result;
|
|
3014
|
+
if (cursor) {
|
|
3015
|
+
const stored = cursor.value;
|
|
3016
|
+
if (stored.metadata) {
|
|
3017
|
+
const keyStr = JSON.stringify(stored.originalKey);
|
|
3018
|
+
metadataMap.set(keyStr, stored.metadata);
|
|
3019
|
+
}
|
|
3020
|
+
cursor.continue();
|
|
3021
|
+
} else {
|
|
3022
|
+
resolve(metadataMap);
|
|
3023
|
+
}
|
|
3024
|
+
};
|
|
3025
|
+
});
|
|
3026
|
+
} catch (error) {
|
|
3027
|
+
logger19.error("Error in IndexedDB getAllMetadata operation", { error });
|
|
3028
|
+
return metadataMap;
|
|
3029
|
+
}
|
|
3030
|
+
}
|
|
2868
3031
|
async values() {
|
|
2869
3032
|
const values = [];
|
|
2870
3033
|
try {
|
|
@@ -3108,247 +3271,249 @@ var AsyncIndexDBCacheMap = class _AsyncIndexDBCacheMap {
|
|
|
3108
3271
|
};
|
|
3109
3272
|
|
|
3110
3273
|
// src/browser/IndexDBCacheMap.ts
|
|
3274
|
+
var logger20 = logger_default.get("IndexDBCacheMap");
|
|
3111
3275
|
var IndexDBCacheMap = class _IndexDBCacheMap extends CacheMap {
|
|
3112
3276
|
implementationType = "browser/indexedDB";
|
|
3277
|
+
// Memory storage
|
|
3278
|
+
memoryMap = {};
|
|
3279
|
+
queryResultCache = {};
|
|
3280
|
+
metadataMap = /* @__PURE__ */ new Map();
|
|
3281
|
+
normalizedHashFunction;
|
|
3282
|
+
types;
|
|
3283
|
+
// IndexedDB for persistence
|
|
3113
3284
|
asyncCache;
|
|
3114
|
-
|
|
3285
|
+
// Background sync management
|
|
3115
3286
|
syncInterval = null;
|
|
3116
|
-
|
|
3117
|
-
|
|
3118
|
-
pendingSyncOperations = /* @__PURE__ */ new Map();
|
|
3119
|
-
initializationPromise = null;
|
|
3120
|
-
isInitialized = false;
|
|
3121
|
-
MAX_RETRY_ATTEMPTS = 3;
|
|
3122
|
-
operationSequence = 0;
|
|
3287
|
+
pendingOperations = [];
|
|
3288
|
+
sequenceCounter = 0;
|
|
3123
3289
|
constructor(types, dbName = "fjell-indexdb-cache", storeName = "cache", version = 1) {
|
|
3124
3290
|
super(types);
|
|
3291
|
+
this.types = types;
|
|
3292
|
+
this.normalizedHashFunction = createNormalizedHashFunction();
|
|
3125
3293
|
this.asyncCache = new AsyncIndexDBCacheMap(types, dbName, storeName, version);
|
|
3126
|
-
this.memoryCache = new MemoryCacheMap(types);
|
|
3127
3294
|
this.initializeFromIndexedDB();
|
|
3128
3295
|
this.startPeriodicSync();
|
|
3129
3296
|
}
|
|
3130
3297
|
async initializeFromIndexedDB() {
|
|
3131
|
-
|
|
3132
|
-
|
|
3133
|
-
|
|
3134
|
-
|
|
3135
|
-
|
|
3136
|
-
|
|
3137
|
-
|
|
3138
|
-
|
|
3139
|
-
|
|
3140
|
-
|
|
3141
|
-
|
|
3142
|
-
}
|
|
3298
|
+
try {
|
|
3299
|
+
const keys = await this.asyncCache.keys();
|
|
3300
|
+
for (const key of keys) {
|
|
3301
|
+
const hashedKey = this.normalizedHashFunction(key);
|
|
3302
|
+
if (!this.memoryMap[hashedKey]) {
|
|
3303
|
+
const value = await this.asyncCache.get(key);
|
|
3304
|
+
if (value) {
|
|
3305
|
+
this.memoryMap[hashedKey] = {
|
|
3306
|
+
originalKey: key,
|
|
3307
|
+
value
|
|
3308
|
+
};
|
|
3143
3309
|
}
|
|
3144
3310
|
}
|
|
3145
|
-
this.isInitialized = true;
|
|
3146
|
-
} catch (error) {
|
|
3147
|
-
console.warn("Failed to initialize from IndexedDB:", error);
|
|
3148
|
-
this.isInitialized = true;
|
|
3149
3311
|
}
|
|
3150
|
-
}
|
|
3151
|
-
|
|
3312
|
+
} catch (error) {
|
|
3313
|
+
console.warn("Failed to initialize from IndexedDB, using memory-only mode:", error);
|
|
3314
|
+
}
|
|
3152
3315
|
}
|
|
3153
3316
|
startPeriodicSync() {
|
|
3154
3317
|
this.syncInterval = setInterval(() => {
|
|
3155
|
-
this.
|
|
3156
|
-
},
|
|
3157
|
-
}
|
|
3158
|
-
async syncToIndexedDB() {
|
|
3159
|
-
try {
|
|
3160
|
-
await this.processPendingOperations();
|
|
3161
|
-
const memoryKeys = this.memoryCache.keys();
|
|
3162
|
-
for (const key of memoryKeys) {
|
|
3163
|
-
const value = await this.memoryCache.get(key);
|
|
3164
|
-
if (value) {
|
|
3165
|
-
await this.asyncCache.set(key, value);
|
|
3166
|
-
}
|
|
3167
|
-
}
|
|
3168
|
-
} catch (error) {
|
|
3169
|
-
console.warn("Failed to sync to IndexedDB:", error);
|
|
3170
|
-
}
|
|
3318
|
+
this.processPendingOperations();
|
|
3319
|
+
}, 10);
|
|
3171
3320
|
}
|
|
3172
3321
|
async processPendingOperations() {
|
|
3173
|
-
|
|
3174
|
-
|
|
3175
|
-
|
|
3176
|
-
|
|
3177
|
-
continue;
|
|
3178
|
-
}
|
|
3322
|
+
if (this.pendingOperations.length === 0) return;
|
|
3323
|
+
const operations = [...this.pendingOperations];
|
|
3324
|
+
this.pendingOperations = [];
|
|
3325
|
+
for (const op of operations) {
|
|
3179
3326
|
try {
|
|
3180
|
-
|
|
3181
|
-
|
|
3182
|
-
|
|
3183
|
-
|
|
3327
|
+
switch (op.type) {
|
|
3328
|
+
case "set":
|
|
3329
|
+
if (op.key && op.value) {
|
|
3330
|
+
await this.asyncCache.set(op.key, op.value, op.metadata);
|
|
3331
|
+
}
|
|
3332
|
+
break;
|
|
3333
|
+
case "delete":
|
|
3334
|
+
if (op.key) {
|
|
3335
|
+
await this.asyncCache.delete(op.key);
|
|
3336
|
+
}
|
|
3337
|
+
break;
|
|
3338
|
+
case "clear":
|
|
3339
|
+
await this.asyncCache.clear();
|
|
3340
|
+
break;
|
|
3184
3341
|
}
|
|
3185
3342
|
} catch (error) {
|
|
3186
|
-
console.warn(
|
|
3187
|
-
const currentOp = this.pendingSyncOperations.get(keyStr);
|
|
3188
|
-
if (!currentOp || currentOp.sequenceId !== operation.sequenceId || currentOp.cancelled) {
|
|
3189
|
-
if (currentOp && currentOp.sequenceId === operation.sequenceId) {
|
|
3190
|
-
this.pendingSyncOperations.delete(keyStr);
|
|
3191
|
-
}
|
|
3192
|
-
}
|
|
3343
|
+
console.warn("Failed to sync operation to IndexedDB:", error);
|
|
3193
3344
|
}
|
|
3194
3345
|
}
|
|
3195
3346
|
}
|
|
3196
|
-
|
|
3197
|
-
|
|
3198
|
-
const
|
|
3199
|
-
const
|
|
3200
|
-
if (
|
|
3201
|
-
|
|
3347
|
+
// Synchronous memory operations
|
|
3348
|
+
async get(key) {
|
|
3349
|
+
const hashedKey = this.normalizedHashFunction(key);
|
|
3350
|
+
const entry = this.memoryMap[hashedKey];
|
|
3351
|
+
if (entry && this.normalizedHashFunction(entry.originalKey) === hashedKey) {
|
|
3352
|
+
return entry.value;
|
|
3202
3353
|
}
|
|
3203
|
-
|
|
3204
|
-
|
|
3205
|
-
|
|
3206
|
-
|
|
3207
|
-
|
|
3208
|
-
|
|
3209
|
-
|
|
3210
|
-
|
|
3211
|
-
|
|
3212
|
-
|
|
3213
|
-
|
|
3214
|
-
|
|
3215
|
-
|
|
3216
|
-
|
|
3217
|
-
|
|
3218
|
-
|
|
3219
|
-
}
|
|
3220
|
-
this.
|
|
3354
|
+
return null;
|
|
3355
|
+
}
|
|
3356
|
+
async set(key, value) {
|
|
3357
|
+
const hashedKey = this.normalizedHashFunction(key);
|
|
3358
|
+
const now = Date.now();
|
|
3359
|
+
const metadata = {
|
|
3360
|
+
key: JSON.stringify(key),
|
|
3361
|
+
addedAt: now,
|
|
3362
|
+
lastAccessedAt: now,
|
|
3363
|
+
accessCount: 1,
|
|
3364
|
+
estimatedSize: JSON.stringify(value).length
|
|
3365
|
+
// rough estimate
|
|
3366
|
+
};
|
|
3367
|
+
this.memoryMap[hashedKey] = {
|
|
3368
|
+
originalKey: key,
|
|
3369
|
+
value
|
|
3370
|
+
};
|
|
3371
|
+
this.pendingOperations.push({
|
|
3221
3372
|
type: "set",
|
|
3222
3373
|
key,
|
|
3223
3374
|
value,
|
|
3224
|
-
|
|
3225
|
-
|
|
3226
|
-
cancelled: false
|
|
3375
|
+
metadata,
|
|
3376
|
+
sequenceId: ++this.sequenceCounter
|
|
3227
3377
|
});
|
|
3378
|
+
this.processPendingOperations();
|
|
3228
3379
|
}
|
|
3229
|
-
|
|
3230
|
-
const
|
|
3231
|
-
const
|
|
3232
|
-
|
|
3233
|
-
|
|
3234
|
-
|
|
3235
|
-
|
|
3236
|
-
|
|
3237
|
-
|
|
3238
|
-
|
|
3239
|
-
const currentOp = this.pendingSyncOperations.get(keyStr);
|
|
3240
|
-
if (currentOp && currentOp.sequenceId === sequenceId && !currentOp.cancelled) {
|
|
3241
|
-
this.pendingSyncOperations.delete(keyStr);
|
|
3242
|
-
}
|
|
3243
|
-
} catch (error) {
|
|
3244
|
-
console.warn("Failed to sync delete operation to IndexedDB:", error);
|
|
3245
|
-
const currentOp = this.pendingSyncOperations.get(keyStr);
|
|
3246
|
-
if (!currentOp || currentOp.sequenceId !== sequenceId || currentOp.cancelled) {
|
|
3247
|
-
if (currentOp && currentOp.sequenceId === sequenceId) {
|
|
3248
|
-
this.pendingSyncOperations.delete(keyStr);
|
|
3249
|
-
}
|
|
3250
|
-
}
|
|
3251
|
-
}
|
|
3252
|
-
})();
|
|
3253
|
-
this.pendingSyncOperations.set(keyStr, {
|
|
3380
|
+
async includesKey(key) {
|
|
3381
|
+
const hashedKey = this.normalizedHashFunction(key);
|
|
3382
|
+
const entry = this.memoryMap[hashedKey];
|
|
3383
|
+
return !!(entry && this.normalizedHashFunction(entry.originalKey) === hashedKey);
|
|
3384
|
+
}
|
|
3385
|
+
async delete(key) {
|
|
3386
|
+
const hashedKey = this.normalizedHashFunction(key);
|
|
3387
|
+
delete this.memoryMap[hashedKey];
|
|
3388
|
+
this.metadataMap.delete(hashedKey);
|
|
3389
|
+
this.pendingOperations.push({
|
|
3254
3390
|
type: "delete",
|
|
3255
3391
|
key,
|
|
3256
|
-
sequenceId
|
|
3257
|
-
promise: syncPromise,
|
|
3258
|
-
cancelled: false
|
|
3392
|
+
sequenceId: ++this.sequenceCounter
|
|
3259
3393
|
});
|
|
3394
|
+
this.processPendingOperations();
|
|
3260
3395
|
}
|
|
3261
|
-
|
|
3262
|
-
|
|
3263
|
-
operation.cancelled = true;
|
|
3264
|
-
}
|
|
3265
|
-
this.pendingSyncOperations.clear();
|
|
3266
|
-
Promise.resolve().then(async () => {
|
|
3267
|
-
try {
|
|
3268
|
-
await this.asyncCache.clear();
|
|
3269
|
-
} catch (error) {
|
|
3270
|
-
console.warn("Failed to sync clear operation to IndexedDB:", error);
|
|
3271
|
-
}
|
|
3272
|
-
});
|
|
3396
|
+
async keys() {
|
|
3397
|
+
return Object.values(this.memoryMap).map((entry) => entry.originalKey);
|
|
3273
3398
|
}
|
|
3274
|
-
async
|
|
3275
|
-
|
|
3276
|
-
try {
|
|
3277
|
-
await this.initializationPromise;
|
|
3278
|
-
} catch (error) {
|
|
3279
|
-
console.warn("IndexedDB initialization failed, using memory cache only:", error);
|
|
3280
|
-
}
|
|
3281
|
-
}
|
|
3282
|
-
return this.memoryCache.get(key);
|
|
3399
|
+
async values() {
|
|
3400
|
+
return Object.values(this.memoryMap).map((entry) => entry.value);
|
|
3283
3401
|
}
|
|
3284
|
-
|
|
3285
|
-
this.
|
|
3286
|
-
this.
|
|
3402
|
+
async clear() {
|
|
3403
|
+
this.memoryMap = {};
|
|
3404
|
+
this.queryResultCache = {};
|
|
3405
|
+
this.metadataMap.clear();
|
|
3406
|
+
this.pendingOperations.push({
|
|
3407
|
+
type: "clear",
|
|
3408
|
+
sequenceId: ++this.sequenceCounter
|
|
3409
|
+
});
|
|
3410
|
+
this.processPendingOperations();
|
|
3287
3411
|
}
|
|
3288
|
-
async
|
|
3289
|
-
|
|
3290
|
-
|
|
3291
|
-
|
|
3292
|
-
|
|
3293
|
-
|
|
3412
|
+
async allIn(locations) {
|
|
3413
|
+
const result = [];
|
|
3414
|
+
for (const entry of Object.values(this.memoryMap)) {
|
|
3415
|
+
const key = entry.originalKey;
|
|
3416
|
+
if (locations.length === 0) {
|
|
3417
|
+
result.push(entry.value);
|
|
3418
|
+
} else if (isComKey6(key)) {
|
|
3419
|
+
if (isLocKeyArrayEqual(key.loc, locations)) {
|
|
3420
|
+
result.push(entry.value);
|
|
3421
|
+
}
|
|
3294
3422
|
}
|
|
3295
3423
|
}
|
|
3296
|
-
return
|
|
3297
|
-
}
|
|
3298
|
-
delete(key) {
|
|
3299
|
-
this.memoryCache.delete(key);
|
|
3300
|
-
this.queueDeleteForSync(key);
|
|
3301
|
-
}
|
|
3302
|
-
async allIn(locations) {
|
|
3303
|
-
return this.memoryCache.allIn(locations);
|
|
3424
|
+
return result;
|
|
3304
3425
|
}
|
|
3305
3426
|
async contains(query, locations) {
|
|
3306
|
-
|
|
3427
|
+
const items = await this.queryIn(query, locations);
|
|
3428
|
+
return items.length > 0;
|
|
3307
3429
|
}
|
|
3308
3430
|
async queryIn(query, locations) {
|
|
3309
|
-
|
|
3431
|
+
const candidates = await this.allIn(locations);
|
|
3432
|
+
if (!query.compoundCondition) {
|
|
3433
|
+
return candidates;
|
|
3434
|
+
}
|
|
3435
|
+
return candidates.filter((item) => isQueryMatch6(item, query));
|
|
3310
3436
|
}
|
|
3311
|
-
|
|
3312
|
-
|
|
3437
|
+
// Query result caching methods
|
|
3438
|
+
async setQueryResult(queryHash, itemKeys) {
|
|
3439
|
+
this.queryResultCache[queryHash] = {
|
|
3440
|
+
itemKeys
|
|
3441
|
+
};
|
|
3313
3442
|
}
|
|
3314
|
-
|
|
3315
|
-
|
|
3443
|
+
async getQueryResult(queryHash) {
|
|
3444
|
+
const entry = this.queryResultCache[queryHash];
|
|
3445
|
+
return entry ? entry.itemKeys : null;
|
|
3316
3446
|
}
|
|
3317
|
-
async
|
|
3318
|
-
return this.
|
|
3447
|
+
async hasQueryResult(queryHash) {
|
|
3448
|
+
return queryHash in this.queryResultCache;
|
|
3319
3449
|
}
|
|
3320
|
-
|
|
3321
|
-
this.
|
|
3322
|
-
this.queueClearForSync();
|
|
3450
|
+
async deleteQueryResult(queryHash) {
|
|
3451
|
+
delete this.queryResultCache[queryHash];
|
|
3323
3452
|
}
|
|
3324
|
-
|
|
3325
|
-
|
|
3326
|
-
return this.memoryCache.setQueryResult(queryHash, itemKeys);
|
|
3453
|
+
async clearQueryResults() {
|
|
3454
|
+
this.queryResultCache = {};
|
|
3327
3455
|
}
|
|
3328
|
-
|
|
3329
|
-
|
|
3330
|
-
|
|
3331
|
-
|
|
3332
|
-
|
|
3333
|
-
|
|
3456
|
+
// Invalidation methods
|
|
3457
|
+
async invalidateItemKeys(keys) {
|
|
3458
|
+
for (const queryHash in this.queryResultCache) {
|
|
3459
|
+
const entry = this.queryResultCache[queryHash];
|
|
3460
|
+
if (entry && entry.itemKeys.some((key) => keys.some(
|
|
3461
|
+
(affectedKey) => this.normalizedHashFunction(affectedKey) === this.normalizedHashFunction(key)
|
|
3462
|
+
))) {
|
|
3463
|
+
delete this.queryResultCache[queryHash];
|
|
3334
3464
|
}
|
|
3335
3465
|
}
|
|
3336
|
-
return this.memoryCache.getQueryResult(queryHash);
|
|
3337
3466
|
}
|
|
3338
|
-
|
|
3339
|
-
|
|
3467
|
+
async invalidateLocation(locations) {
|
|
3468
|
+
const itemsToDelete = [];
|
|
3469
|
+
for (const entry of Object.values(this.memoryMap)) {
|
|
3470
|
+
const key = entry.originalKey;
|
|
3471
|
+
if (isComKey6(key) && isLocKeyArrayEqual(key.loc, locations)) {
|
|
3472
|
+
itemsToDelete.push(key);
|
|
3473
|
+
}
|
|
3474
|
+
}
|
|
3475
|
+
this.invalidateItemKeys(itemsToDelete);
|
|
3340
3476
|
}
|
|
3341
|
-
|
|
3342
|
-
|
|
3477
|
+
// Metadata operations
|
|
3478
|
+
async getMetadata(key) {
|
|
3479
|
+
return this.metadataMap.get(key) || null;
|
|
3343
3480
|
}
|
|
3344
|
-
|
|
3345
|
-
|
|
3481
|
+
async setMetadata(key, metadata) {
|
|
3482
|
+
this.metadataMap.set(key, metadata);
|
|
3346
3483
|
}
|
|
3347
|
-
async
|
|
3348
|
-
|
|
3484
|
+
async deleteMetadata(key) {
|
|
3485
|
+
this.metadataMap.delete(key);
|
|
3349
3486
|
}
|
|
3350
|
-
|
|
3351
|
-
return this.
|
|
3487
|
+
async getAllMetadata() {
|
|
3488
|
+
return new Map(this.metadataMap);
|
|
3489
|
+
}
|
|
3490
|
+
async clearMetadata() {
|
|
3491
|
+
this.metadataMap.clear();
|
|
3492
|
+
}
|
|
3493
|
+
// Size operations
|
|
3494
|
+
async getCurrentSize() {
|
|
3495
|
+
const itemCount = Object.keys(this.memoryMap).length;
|
|
3496
|
+
let sizeBytes = 0;
|
|
3497
|
+
for (const entry of Object.values(this.memoryMap)) {
|
|
3498
|
+
sizeBytes += JSON.stringify(entry.value).length;
|
|
3499
|
+
}
|
|
3500
|
+
return { itemCount, sizeBytes };
|
|
3501
|
+
}
|
|
3502
|
+
async getSizeLimits() {
|
|
3503
|
+
return { maxItems: null, maxSizeBytes: null };
|
|
3504
|
+
}
|
|
3505
|
+
// Clone operation
|
|
3506
|
+
async clone() {
|
|
3507
|
+
const cloned = new _IndexDBCacheMap(
|
|
3508
|
+
this.types,
|
|
3509
|
+
"fjell-indexdb-cache-clone",
|
|
3510
|
+
"cache-clone",
|
|
3511
|
+
1
|
|
3512
|
+
);
|
|
3513
|
+
cloned.memoryMap = { ...this.memoryMap };
|
|
3514
|
+
cloned.queryResultCache = { ...this.queryResultCache };
|
|
3515
|
+
cloned.metadataMap = new Map(this.metadataMap);
|
|
3516
|
+
return cloned;
|
|
3352
3517
|
}
|
|
3353
3518
|
/**
|
|
3354
3519
|
* Clean up resources when the cache is no longer needed
|
|
@@ -3359,29 +3524,6 @@ var IndexDBCacheMap = class _IndexDBCacheMap extends CacheMap {
|
|
|
3359
3524
|
this.syncInterval = null;
|
|
3360
3525
|
}
|
|
3361
3526
|
}
|
|
3362
|
-
// CacheMapMetadataProvider implementation
|
|
3363
|
-
// Delegate to the memory cache for metadata operations for consistency
|
|
3364
|
-
getMetadata(key) {
|
|
3365
|
-
return this.memoryCache.getMetadata(key);
|
|
3366
|
-
}
|
|
3367
|
-
setMetadata(key, metadata) {
|
|
3368
|
-
this.memoryCache.setMetadata(key, metadata);
|
|
3369
|
-
}
|
|
3370
|
-
deleteMetadata(key) {
|
|
3371
|
-
this.memoryCache.deleteMetadata(key);
|
|
3372
|
-
}
|
|
3373
|
-
getAllMetadata() {
|
|
3374
|
-
return this.memoryCache.getAllMetadata();
|
|
3375
|
-
}
|
|
3376
|
-
clearMetadata() {
|
|
3377
|
-
this.memoryCache.clearMetadata();
|
|
3378
|
-
}
|
|
3379
|
-
getCurrentSize() {
|
|
3380
|
-
return this.memoryCache.getCurrentSize();
|
|
3381
|
-
}
|
|
3382
|
-
getSizeLimits() {
|
|
3383
|
-
return this.memoryCache.getSizeLimits();
|
|
3384
|
-
}
|
|
3385
3527
|
};
|
|
3386
3528
|
|
|
3387
3529
|
// src/Options.ts
|
|
@@ -3561,7 +3703,7 @@ var createOperations = (api, coordinate, cacheMap, pkType, options, eventEmitter
|
|
|
3561
3703
|
};
|
|
3562
3704
|
|
|
3563
3705
|
// src/eviction/EvictionManager.ts
|
|
3564
|
-
var
|
|
3706
|
+
var logger21 = logger_default.get("EvictionManager");
|
|
3565
3707
|
var EvictionManager = class {
|
|
3566
3708
|
evictionStrategy;
|
|
3567
3709
|
constructor(evictionStrategy) {
|
|
@@ -3573,7 +3715,7 @@ var EvictionManager = class {
|
|
|
3573
3715
|
*/
|
|
3574
3716
|
setEvictionStrategy(strategy) {
|
|
3575
3717
|
this.evictionStrategy = strategy;
|
|
3576
|
-
|
|
3718
|
+
logger21.debug("Eviction strategy updated", {
|
|
3577
3719
|
strategy: strategy?.getStrategyName() || "none"
|
|
3578
3720
|
});
|
|
3579
3721
|
}
|
|
@@ -3589,14 +3731,14 @@ var EvictionManager = class {
|
|
|
3589
3731
|
* @param key - Item key
|
|
3590
3732
|
* @param metadataProvider - Cache metadata provider
|
|
3591
3733
|
*/
|
|
3592
|
-
onItemAccessed(key, metadataProvider) {
|
|
3734
|
+
async onItemAccessed(key, metadataProvider) {
|
|
3593
3735
|
if (!this.evictionStrategy) {
|
|
3594
3736
|
return;
|
|
3595
3737
|
}
|
|
3596
3738
|
try {
|
|
3597
|
-
this.evictionStrategy.onItemAccessed(key, metadataProvider);
|
|
3739
|
+
await this.evictionStrategy.onItemAccessed(key, metadataProvider);
|
|
3598
3740
|
} catch (error) {
|
|
3599
|
-
|
|
3741
|
+
logger21.error("Error in eviction strategy onItemAccessed", { key, error });
|
|
3600
3742
|
}
|
|
3601
3743
|
}
|
|
3602
3744
|
/**
|
|
@@ -3606,29 +3748,29 @@ var EvictionManager = class {
|
|
|
3606
3748
|
* @param metadataProvider - Cache metadata provider
|
|
3607
3749
|
* @returns Array of keys that were evicted
|
|
3608
3750
|
*/
|
|
3609
|
-
onItemAdded(key, value, metadataProvider) {
|
|
3751
|
+
async onItemAdded(key, value, metadataProvider) {
|
|
3610
3752
|
const evictedKeys = [];
|
|
3611
3753
|
if (!this.evictionStrategy) {
|
|
3612
3754
|
return evictedKeys;
|
|
3613
3755
|
}
|
|
3614
3756
|
try {
|
|
3615
3757
|
const estimatedSize = estimateValueSize(value);
|
|
3616
|
-
const context = this.createEvictionContext(metadataProvider, estimatedSize);
|
|
3617
|
-
const keysToEvict = this.evictionStrategy.selectForEviction(metadataProvider, context);
|
|
3758
|
+
const context = await this.createEvictionContext(metadataProvider, estimatedSize);
|
|
3759
|
+
const keysToEvict = await this.evictionStrategy.selectForEviction(metadataProvider, context);
|
|
3618
3760
|
for (const evictKey of keysToEvict) {
|
|
3619
|
-
this.evictionStrategy.onItemRemoved(evictKey, metadataProvider);
|
|
3761
|
+
await this.evictionStrategy.onItemRemoved(evictKey, metadataProvider);
|
|
3620
3762
|
evictedKeys.push(evictKey);
|
|
3621
3763
|
}
|
|
3622
|
-
this.evictionStrategy.onItemAdded(key, estimatedSize, metadataProvider);
|
|
3764
|
+
await this.evictionStrategy.onItemAdded(key, estimatedSize, metadataProvider);
|
|
3623
3765
|
if (evictedKeys.length > 0) {
|
|
3624
|
-
|
|
3766
|
+
logger21.debug("Items evicted during addition", {
|
|
3625
3767
|
newKey: key,
|
|
3626
3768
|
evictedKeys,
|
|
3627
3769
|
strategy: this.evictionStrategy.getStrategyName()
|
|
3628
3770
|
});
|
|
3629
3771
|
}
|
|
3630
3772
|
} catch (error) {
|
|
3631
|
-
|
|
3773
|
+
logger21.error("Error in eviction strategy onItemAdded", { key, error });
|
|
3632
3774
|
}
|
|
3633
3775
|
return evictedKeys;
|
|
3634
3776
|
}
|
|
@@ -3644,7 +3786,7 @@ var EvictionManager = class {
|
|
|
3644
3786
|
try {
|
|
3645
3787
|
this.evictionStrategy.onItemRemoved(key, metadataProvider);
|
|
3646
3788
|
} catch (error) {
|
|
3647
|
-
|
|
3789
|
+
logger21.error("Error in eviction strategy onItemRemoved", { key, error });
|
|
3648
3790
|
}
|
|
3649
3791
|
}
|
|
3650
3792
|
/**
|
|
@@ -3652,26 +3794,26 @@ var EvictionManager = class {
|
|
|
3652
3794
|
* @param metadataProvider - Cache metadata provider
|
|
3653
3795
|
* @returns Array of keys that were evicted
|
|
3654
3796
|
*/
|
|
3655
|
-
performEviction(metadataProvider) {
|
|
3797
|
+
async performEviction(metadataProvider) {
|
|
3656
3798
|
const evictedKeys = [];
|
|
3657
3799
|
if (!this.evictionStrategy) {
|
|
3658
3800
|
return evictedKeys;
|
|
3659
3801
|
}
|
|
3660
3802
|
try {
|
|
3661
|
-
const context = this.createEvictionContext(metadataProvider);
|
|
3662
|
-
const keysToEvict = this.evictionStrategy.selectForEviction(metadataProvider, context);
|
|
3803
|
+
const context = await this.createEvictionContext(metadataProvider);
|
|
3804
|
+
const keysToEvict = await this.evictionStrategy.selectForEviction(metadataProvider, context);
|
|
3663
3805
|
for (const evictKey of keysToEvict) {
|
|
3664
|
-
this.evictionStrategy.onItemRemoved(evictKey, metadataProvider);
|
|
3806
|
+
await this.evictionStrategy.onItemRemoved(evictKey, metadataProvider);
|
|
3665
3807
|
evictedKeys.push(evictKey);
|
|
3666
3808
|
}
|
|
3667
3809
|
if (evictedKeys.length > 0) {
|
|
3668
|
-
|
|
3810
|
+
logger21.debug("Manual eviction performed", {
|
|
3669
3811
|
evictedKeys,
|
|
3670
3812
|
strategy: this.evictionStrategy.getStrategyName()
|
|
3671
3813
|
});
|
|
3672
3814
|
}
|
|
3673
3815
|
} catch (error) {
|
|
3674
|
-
|
|
3816
|
+
logger21.error("Error in manual eviction", { error });
|
|
3675
3817
|
}
|
|
3676
3818
|
return evictedKeys;
|
|
3677
3819
|
}
|
|
@@ -3688,9 +3830,9 @@ var EvictionManager = class {
|
|
|
3688
3830
|
* @param newItemSize - Size of item being added (optional)
|
|
3689
3831
|
* @returns Eviction context
|
|
3690
3832
|
*/
|
|
3691
|
-
createEvictionContext(metadataProvider, newItemSize) {
|
|
3692
|
-
const currentSize = metadataProvider.getCurrentSize();
|
|
3693
|
-
const limits = metadataProvider.getSizeLimits();
|
|
3833
|
+
async createEvictionContext(metadataProvider, newItemSize) {
|
|
3834
|
+
const currentSize = await metadataProvider.getCurrentSize();
|
|
3835
|
+
const limits = await metadataProvider.getSizeLimits();
|
|
3694
3836
|
return {
|
|
3695
3837
|
currentSize,
|
|
3696
3838
|
limits,
|
|
@@ -3772,11 +3914,11 @@ var EvictionStrategy = class {
|
|
|
3772
3914
|
|
|
3773
3915
|
// src/eviction/strategies/LRUEvictionStrategy.ts
|
|
3774
3916
|
var LRUEvictionStrategy = class extends EvictionStrategy {
|
|
3775
|
-
selectForEviction(metadataProvider, context) {
|
|
3917
|
+
async selectForEviction(metadataProvider, context) {
|
|
3776
3918
|
if (!this.isEvictionNeeded(context)) {
|
|
3777
3919
|
return [];
|
|
3778
3920
|
}
|
|
3779
|
-
const allMetadata = metadataProvider.getAllMetadata();
|
|
3921
|
+
const allMetadata = await metadataProvider.getAllMetadata();
|
|
3780
3922
|
if (allMetadata.size === 0) {
|
|
3781
3923
|
return [];
|
|
3782
3924
|
}
|
|
@@ -3788,15 +3930,15 @@ var LRUEvictionStrategy = class extends EvictionStrategy {
|
|
|
3788
3930
|
}
|
|
3789
3931
|
return keysToEvict;
|
|
3790
3932
|
}
|
|
3791
|
-
onItemAccessed(key, metadataProvider) {
|
|
3792
|
-
const metadata = metadataProvider.getMetadata(key);
|
|
3933
|
+
async onItemAccessed(key, metadataProvider) {
|
|
3934
|
+
const metadata = await metadataProvider.getMetadata(key);
|
|
3793
3935
|
if (metadata) {
|
|
3794
3936
|
metadata.lastAccessedAt = Date.now();
|
|
3795
3937
|
metadata.accessCount++;
|
|
3796
|
-
metadataProvider.setMetadata(key, metadata);
|
|
3938
|
+
await metadataProvider.setMetadata(key, metadata);
|
|
3797
3939
|
}
|
|
3798
3940
|
}
|
|
3799
|
-
onItemAdded(key, estimatedSize, metadataProvider) {
|
|
3941
|
+
async onItemAdded(key, estimatedSize, metadataProvider) {
|
|
3800
3942
|
const now = Date.now();
|
|
3801
3943
|
const metadata = {
|
|
3802
3944
|
key,
|
|
@@ -3805,10 +3947,10 @@ var LRUEvictionStrategy = class extends EvictionStrategy {
|
|
|
3805
3947
|
accessCount: 1,
|
|
3806
3948
|
estimatedSize
|
|
3807
3949
|
};
|
|
3808
|
-
metadataProvider.setMetadata(key, metadata);
|
|
3950
|
+
await metadataProvider.setMetadata(key, metadata);
|
|
3809
3951
|
}
|
|
3810
|
-
onItemRemoved(key, metadataProvider) {
|
|
3811
|
-
metadataProvider.deleteMetadata(key);
|
|
3952
|
+
async onItemRemoved(key, metadataProvider) {
|
|
3953
|
+
await metadataProvider.deleteMetadata(key);
|
|
3812
3954
|
}
|
|
3813
3955
|
getStrategyName() {
|
|
3814
3956
|
return "lru";
|
|
@@ -4142,8 +4284,8 @@ var LFUEvictionStrategy = class extends EvictionStrategy {
|
|
|
4142
4284
|
this.sketch = this.config.useProbabilisticCounting ? new CountMinSketch(this.config.sketchWidth, this.config.sketchDepth) : null;
|
|
4143
4285
|
this.lastDecayTime = Date.now();
|
|
4144
4286
|
}
|
|
4145
|
-
selectForEviction(metadataProvider, context) {
|
|
4146
|
-
const allMetadata = metadataProvider.getAllMetadata();
|
|
4287
|
+
async selectForEviction(metadataProvider, context) {
|
|
4288
|
+
const allMetadata = await metadataProvider.getAllMetadata();
|
|
4147
4289
|
if (allMetadata.size === 0) return [];
|
|
4148
4290
|
if (!this.isEvictionNeeded(context)) {
|
|
4149
4291
|
return [];
|
|
@@ -4161,8 +4303,8 @@ var LFUEvictionStrategy = class extends EvictionStrategy {
|
|
|
4161
4303
|
});
|
|
4162
4304
|
return sortedEntries.slice(0, evictionCount).map(([key]) => key);
|
|
4163
4305
|
}
|
|
4164
|
-
onItemAccessed(key, metadataProvider) {
|
|
4165
|
-
const metadata = metadataProvider.getMetadata(key);
|
|
4306
|
+
async onItemAccessed(key, metadataProvider) {
|
|
4307
|
+
const metadata = await metadataProvider.getMetadata(key);
|
|
4166
4308
|
if (!metadata) return;
|
|
4167
4309
|
const now = Date.now();
|
|
4168
4310
|
metadata.lastAccessedAt = now;
|
|
@@ -4175,9 +4317,9 @@ var LFUEvictionStrategy = class extends EvictionStrategy {
|
|
|
4175
4317
|
}
|
|
4176
4318
|
metadata.frequencyScore = this.calculateFrequencyScore(metadata, now);
|
|
4177
4319
|
metadata.lastFrequencyUpdate = now;
|
|
4178
|
-
metadataProvider.setMetadata(key, metadata);
|
|
4320
|
+
await metadataProvider.setMetadata(key, metadata);
|
|
4179
4321
|
}
|
|
4180
|
-
onItemAdded(key, estimatedSize, metadataProvider) {
|
|
4322
|
+
async onItemAdded(key, estimatedSize, metadataProvider) {
|
|
4181
4323
|
const now = Date.now();
|
|
4182
4324
|
const metadata = {
|
|
4183
4325
|
key,
|
|
@@ -4192,10 +4334,10 @@ var LFUEvictionStrategy = class extends EvictionStrategy {
|
|
|
4192
4334
|
if (this.sketch) {
|
|
4193
4335
|
this.sketch.increment(key);
|
|
4194
4336
|
}
|
|
4195
|
-
metadataProvider.setMetadata(key, metadata);
|
|
4337
|
+
await metadataProvider.setMetadata(key, metadata);
|
|
4196
4338
|
}
|
|
4197
|
-
onItemRemoved(key, metadataProvider) {
|
|
4198
|
-
metadataProvider.deleteMetadata(key);
|
|
4339
|
+
async onItemRemoved(key, metadataProvider) {
|
|
4340
|
+
await metadataProvider.deleteMetadata(key);
|
|
4199
4341
|
}
|
|
4200
4342
|
/**
|
|
4201
4343
|
* Get the effective frequency for an item, applying real-time decay if needed
|
|
@@ -4262,11 +4404,11 @@ var LFUEvictionStrategy = class extends EvictionStrategy {
|
|
|
4262
4404
|
|
|
4263
4405
|
// src/eviction/strategies/FIFOEvictionStrategy.ts
|
|
4264
4406
|
var FIFOEvictionStrategy = class extends EvictionStrategy {
|
|
4265
|
-
selectForEviction(metadataProvider, context) {
|
|
4407
|
+
async selectForEviction(metadataProvider, context) {
|
|
4266
4408
|
if (!this.isEvictionNeeded(context)) {
|
|
4267
4409
|
return [];
|
|
4268
4410
|
}
|
|
4269
|
-
const allMetadata = metadataProvider.getAllMetadata();
|
|
4411
|
+
const allMetadata = await metadataProvider.getAllMetadata();
|
|
4270
4412
|
if (allMetadata.size === 0) {
|
|
4271
4413
|
return [];
|
|
4272
4414
|
}
|
|
@@ -4278,15 +4420,15 @@ var FIFOEvictionStrategy = class extends EvictionStrategy {
|
|
|
4278
4420
|
}
|
|
4279
4421
|
return keysToEvict;
|
|
4280
4422
|
}
|
|
4281
|
-
onItemAccessed(key, metadataProvider) {
|
|
4282
|
-
const metadata = metadataProvider.getMetadata(key);
|
|
4423
|
+
async onItemAccessed(key, metadataProvider) {
|
|
4424
|
+
const metadata = await metadataProvider.getMetadata(key);
|
|
4283
4425
|
if (metadata) {
|
|
4284
4426
|
metadata.lastAccessedAt = Date.now();
|
|
4285
4427
|
metadata.accessCount++;
|
|
4286
|
-
metadataProvider.setMetadata(key, metadata);
|
|
4428
|
+
await metadataProvider.setMetadata(key, metadata);
|
|
4287
4429
|
}
|
|
4288
4430
|
}
|
|
4289
|
-
onItemAdded(key, estimatedSize, metadataProvider) {
|
|
4431
|
+
async onItemAdded(key, estimatedSize, metadataProvider) {
|
|
4290
4432
|
const now = Date.now();
|
|
4291
4433
|
const metadata = {
|
|
4292
4434
|
key,
|
|
@@ -4295,10 +4437,10 @@ var FIFOEvictionStrategy = class extends EvictionStrategy {
|
|
|
4295
4437
|
accessCount: 1,
|
|
4296
4438
|
estimatedSize
|
|
4297
4439
|
};
|
|
4298
|
-
metadataProvider.setMetadata(key, metadata);
|
|
4440
|
+
await metadataProvider.setMetadata(key, metadata);
|
|
4299
4441
|
}
|
|
4300
|
-
onItemRemoved(key, metadataProvider) {
|
|
4301
|
-
metadataProvider.deleteMetadata(key);
|
|
4442
|
+
async onItemRemoved(key, metadataProvider) {
|
|
4443
|
+
await metadataProvider.deleteMetadata(key);
|
|
4302
4444
|
}
|
|
4303
4445
|
getStrategyName() {
|
|
4304
4446
|
return "fifo";
|
|
@@ -4310,8 +4452,8 @@ var MRUEvictionStrategy = class extends EvictionStrategy {
|
|
|
4310
4452
|
getStrategyName() {
|
|
4311
4453
|
return "MRU";
|
|
4312
4454
|
}
|
|
4313
|
-
selectForEviction(metadataProvider, context) {
|
|
4314
|
-
const allMetadata = metadataProvider.getAllMetadata();
|
|
4455
|
+
async selectForEviction(metadataProvider, context) {
|
|
4456
|
+
const allMetadata = await metadataProvider.getAllMetadata();
|
|
4315
4457
|
if (allMetadata.size === 0) return [];
|
|
4316
4458
|
if (!this.isEvictionNeeded(context)) {
|
|
4317
4459
|
return [];
|
|
@@ -4323,14 +4465,14 @@ var MRUEvictionStrategy = class extends EvictionStrategy {
|
|
|
4323
4465
|
});
|
|
4324
4466
|
return sortedEntries.slice(0, evictionCount).map(([key]) => key);
|
|
4325
4467
|
}
|
|
4326
|
-
onItemAccessed(key, metadataProvider) {
|
|
4327
|
-
const metadata = metadataProvider.getMetadata(key);
|
|
4468
|
+
async onItemAccessed(key, metadataProvider) {
|
|
4469
|
+
const metadata = await metadataProvider.getMetadata(key);
|
|
4328
4470
|
if (!metadata) return;
|
|
4329
4471
|
metadata.lastAccessedAt = Date.now();
|
|
4330
4472
|
metadata.accessCount++;
|
|
4331
|
-
metadataProvider.setMetadata(key, metadata);
|
|
4473
|
+
await metadataProvider.setMetadata(key, metadata);
|
|
4332
4474
|
}
|
|
4333
|
-
onItemAdded(key, estimatedSize, metadataProvider) {
|
|
4475
|
+
async onItemAdded(key, estimatedSize, metadataProvider) {
|
|
4334
4476
|
const now = Date.now();
|
|
4335
4477
|
const metadata = {
|
|
4336
4478
|
key,
|
|
@@ -4339,20 +4481,20 @@ var MRUEvictionStrategy = class extends EvictionStrategy {
|
|
|
4339
4481
|
accessCount: 1,
|
|
4340
4482
|
estimatedSize
|
|
4341
4483
|
};
|
|
4342
|
-
metadataProvider.setMetadata(key, metadata);
|
|
4484
|
+
await metadataProvider.setMetadata(key, metadata);
|
|
4343
4485
|
}
|
|
4344
|
-
onItemRemoved(key, metadataProvider) {
|
|
4345
|
-
metadataProvider.deleteMetadata(key);
|
|
4486
|
+
async onItemRemoved(key, metadataProvider) {
|
|
4487
|
+
await metadataProvider.deleteMetadata(key);
|
|
4346
4488
|
}
|
|
4347
4489
|
};
|
|
4348
4490
|
|
|
4349
4491
|
// src/eviction/strategies/RandomEvictionStrategy.ts
|
|
4350
4492
|
var RandomEvictionStrategy = class extends EvictionStrategy {
|
|
4351
|
-
selectForEviction(metadataProvider, context) {
|
|
4493
|
+
async selectForEviction(metadataProvider, context) {
|
|
4352
4494
|
if (!this.isEvictionNeeded(context)) {
|
|
4353
4495
|
return [];
|
|
4354
4496
|
}
|
|
4355
|
-
const allMetadata = metadataProvider.getAllMetadata();
|
|
4497
|
+
const allMetadata = await metadataProvider.getAllMetadata();
|
|
4356
4498
|
if (allMetadata.size === 0) {
|
|
4357
4499
|
return [];
|
|
4358
4500
|
}
|
|
@@ -4366,15 +4508,15 @@ var RandomEvictionStrategy = class extends EvictionStrategy {
|
|
|
4366
4508
|
}
|
|
4367
4509
|
return keysToEvict;
|
|
4368
4510
|
}
|
|
4369
|
-
onItemAccessed(key, metadataProvider) {
|
|
4370
|
-
const metadata = metadataProvider.getMetadata(key);
|
|
4511
|
+
async onItemAccessed(key, metadataProvider) {
|
|
4512
|
+
const metadata = await metadataProvider.getMetadata(key);
|
|
4371
4513
|
if (metadata) {
|
|
4372
4514
|
metadata.lastAccessedAt = Date.now();
|
|
4373
4515
|
metadata.accessCount++;
|
|
4374
|
-
metadataProvider.setMetadata(key, metadata);
|
|
4516
|
+
await metadataProvider.setMetadata(key, metadata);
|
|
4375
4517
|
}
|
|
4376
4518
|
}
|
|
4377
|
-
onItemAdded(key, estimatedSize, metadataProvider) {
|
|
4519
|
+
async onItemAdded(key, estimatedSize, metadataProvider) {
|
|
4378
4520
|
const now = Date.now();
|
|
4379
4521
|
const metadata = {
|
|
4380
4522
|
key,
|
|
@@ -4383,10 +4525,10 @@ var RandomEvictionStrategy = class extends EvictionStrategy {
|
|
|
4383
4525
|
accessCount: 1,
|
|
4384
4526
|
estimatedSize
|
|
4385
4527
|
};
|
|
4386
|
-
metadataProvider.setMetadata(key, metadata);
|
|
4528
|
+
await metadataProvider.setMetadata(key, metadata);
|
|
4387
4529
|
}
|
|
4388
|
-
onItemRemoved(key, metadataProvider) {
|
|
4389
|
-
metadataProvider.deleteMetadata(key);
|
|
4530
|
+
async onItemRemoved(key, metadataProvider) {
|
|
4531
|
+
await metadataProvider.deleteMetadata(key);
|
|
4390
4532
|
}
|
|
4391
4533
|
getStrategyName() {
|
|
4392
4534
|
return "random";
|
|
@@ -4414,8 +4556,8 @@ var ARCEvictionStrategy = class extends EvictionStrategy {
|
|
|
4414
4556
|
this.maxGhostSize = this.config.maxCacheSize;
|
|
4415
4557
|
this.lastDecayTime = Date.now();
|
|
4416
4558
|
}
|
|
4417
|
-
selectForEviction(metadataProvider, context) {
|
|
4418
|
-
const allMetadata = metadataProvider.getAllMetadata();
|
|
4559
|
+
async selectForEviction(metadataProvider, context) {
|
|
4560
|
+
const allMetadata = await metadataProvider.getAllMetadata();
|
|
4419
4561
|
if (allMetadata.size === 0) return [];
|
|
4420
4562
|
if (!this.isEvictionNeeded(context)) {
|
|
4421
4563
|
return [];
|
|
@@ -4485,8 +4627,8 @@ var ARCEvictionStrategy = class extends EvictionStrategy {
|
|
|
4485
4627
|
}
|
|
4486
4628
|
return null;
|
|
4487
4629
|
}
|
|
4488
|
-
onItemAccessed(key, metadataProvider) {
|
|
4489
|
-
const metadata = metadataProvider.getMetadata(key);
|
|
4630
|
+
async onItemAccessed(key, metadataProvider) {
|
|
4631
|
+
const metadata = await metadataProvider.getMetadata(key);
|
|
4490
4632
|
if (!metadata) return;
|
|
4491
4633
|
const now = Date.now();
|
|
4492
4634
|
const updatedMetadata = {
|
|
@@ -4523,9 +4665,9 @@ var ARCEvictionStrategy = class extends EvictionStrategy {
|
|
|
4523
4665
|
if (targetAdjusted) {
|
|
4524
4666
|
this.cleanupGhostLists();
|
|
4525
4667
|
}
|
|
4526
|
-
metadataProvider.setMetadata(key, updatedMetadata);
|
|
4668
|
+
await metadataProvider.setMetadata(key, updatedMetadata);
|
|
4527
4669
|
}
|
|
4528
|
-
onItemAdded(key, estimatedSize, metadataProvider) {
|
|
4670
|
+
async onItemAdded(key, estimatedSize, metadataProvider) {
|
|
4529
4671
|
const now = Date.now();
|
|
4530
4672
|
const metadata = {
|
|
4531
4673
|
key,
|
|
@@ -4539,16 +4681,16 @@ var ARCEvictionStrategy = class extends EvictionStrategy {
|
|
|
4539
4681
|
metadata.frequencyScore = 1;
|
|
4540
4682
|
metadata.lastFrequencyUpdate = now;
|
|
4541
4683
|
}
|
|
4542
|
-
metadataProvider.setMetadata(key, metadata);
|
|
4684
|
+
await metadataProvider.setMetadata(key, metadata);
|
|
4543
4685
|
}
|
|
4544
|
-
onItemRemoved(key, metadataProvider) {
|
|
4545
|
-
const metadata = metadataProvider.getMetadata(key);
|
|
4686
|
+
async onItemRemoved(key, metadataProvider) {
|
|
4687
|
+
const metadata = await metadataProvider.getMetadata(key);
|
|
4546
4688
|
if (metadata && this.isFrequentItem(metadata)) {
|
|
4547
4689
|
this.addToFrequentGhosts(key);
|
|
4548
4690
|
} else {
|
|
4549
4691
|
this.addToRecentGhosts(key);
|
|
4550
4692
|
}
|
|
4551
|
-
metadataProvider.deleteMetadata(key);
|
|
4693
|
+
await metadataProvider.deleteMetadata(key);
|
|
4552
4694
|
this.cleanupGhostLists();
|
|
4553
4695
|
}
|
|
4554
4696
|
/**
|
|
@@ -4746,15 +4888,15 @@ var TwoQueueEvictionStrategy = class extends EvictionStrategy {
|
|
|
4746
4888
|
this.maxGhostSize = this.config.maxCacheSize;
|
|
4747
4889
|
this.lastDecayTime = Date.now();
|
|
4748
4890
|
}
|
|
4749
|
-
selectForEviction(metadataProvider, context) {
|
|
4750
|
-
const allMetadata = metadataProvider.getAllMetadata();
|
|
4891
|
+
async selectForEviction(metadataProvider, context) {
|
|
4892
|
+
const allMetadata = await metadataProvider.getAllMetadata();
|
|
4751
4893
|
if (allMetadata.size === 0) return [];
|
|
4752
4894
|
if (!this.isEvictionNeeded(context)) {
|
|
4753
4895
|
return [];
|
|
4754
4896
|
}
|
|
4755
4897
|
const evictionCount = this.calculateEvictionCount(context);
|
|
4756
4898
|
if (evictionCount <= 0) return [];
|
|
4757
|
-
this.applyPeriodicDecay(allMetadata);
|
|
4899
|
+
await this.applyPeriodicDecay(allMetadata);
|
|
4758
4900
|
const keysToEvict = [];
|
|
4759
4901
|
for (let i = 0; i < evictionCount; i++) {
|
|
4760
4902
|
let keyToEvict = null;
|
|
@@ -4817,8 +4959,8 @@ var TwoQueueEvictionStrategy = class extends EvictionStrategy {
|
|
|
4817
4959
|
}
|
|
4818
4960
|
return bestKey || (items.size > 0 ? items.keys().next().value ?? null : null);
|
|
4819
4961
|
}
|
|
4820
|
-
onItemAccessed(key, metadataProvider) {
|
|
4821
|
-
const metadata = metadataProvider.getMetadata(key);
|
|
4962
|
+
async onItemAccessed(key, metadataProvider) {
|
|
4963
|
+
const metadata = await metadataProvider.getMetadata(key);
|
|
4822
4964
|
if (!metadata) return;
|
|
4823
4965
|
const now = Date.now();
|
|
4824
4966
|
metadata.lastAccessedAt = now;
|
|
@@ -4841,11 +4983,11 @@ var TwoQueueEvictionStrategy = class extends EvictionStrategy {
|
|
|
4841
4983
|
this.hotQueue.unshift(key);
|
|
4842
4984
|
}
|
|
4843
4985
|
}
|
|
4844
|
-
metadataProvider.setMetadata(key, metadata);
|
|
4986
|
+
await metadataProvider.setMetadata(key, metadata);
|
|
4845
4987
|
}
|
|
4846
|
-
onItemAdded(key, estimatedSize, metadataProvider) {
|
|
4988
|
+
async onItemAdded(key, estimatedSize, metadataProvider) {
|
|
4847
4989
|
const now = Date.now();
|
|
4848
|
-
let metadata = metadataProvider.getMetadata(key);
|
|
4990
|
+
let metadata = await metadataProvider.getMetadata(key);
|
|
4849
4991
|
if (!metadata) {
|
|
4850
4992
|
metadata = {
|
|
4851
4993
|
key,
|
|
@@ -4878,9 +5020,9 @@ var TwoQueueEvictionStrategy = class extends EvictionStrategy {
|
|
|
4878
5020
|
this.ghostQueue.delete(firstKey);
|
|
4879
5021
|
}
|
|
4880
5022
|
}
|
|
4881
|
-
metadataProvider.setMetadata(key, metadata);
|
|
5023
|
+
await metadataProvider.setMetadata(key, metadata);
|
|
4882
5024
|
}
|
|
4883
|
-
onItemRemoved(key, metadataProvider) {
|
|
5025
|
+
async onItemRemoved(key, metadataProvider) {
|
|
4884
5026
|
const recentIndex = this.recentQueue.indexOf(key);
|
|
4885
5027
|
if (recentIndex !== -1) {
|
|
4886
5028
|
this.recentQueue.splice(recentIndex, 1);
|
|
@@ -4889,7 +5031,7 @@ var TwoQueueEvictionStrategy = class extends EvictionStrategy {
|
|
|
4889
5031
|
if (hotIndex !== -1) {
|
|
4890
5032
|
this.hotQueue.splice(hotIndex, 1);
|
|
4891
5033
|
}
|
|
4892
|
-
metadataProvider.deleteMetadata(key);
|
|
5034
|
+
await metadataProvider.deleteMetadata(key);
|
|
4893
5035
|
}
|
|
4894
5036
|
/**
|
|
4895
5037
|
* Determine if an item should be promoted from recent to hot queue
|
|
@@ -4934,7 +5076,7 @@ var TwoQueueEvictionStrategy = class extends EvictionStrategy {
|
|
|
4934
5076
|
/**
|
|
4935
5077
|
* Apply periodic decay to hot queue items
|
|
4936
5078
|
*/
|
|
4937
|
-
applyPeriodicDecay(items) {
|
|
5079
|
+
async applyPeriodicDecay(items) {
|
|
4938
5080
|
if ((this.config.hotQueueDecayFactor ?? 0) === 0) return;
|
|
4939
5081
|
const now = Date.now();
|
|
4940
5082
|
const timeSinceDecay = now - this.lastDecayTime;
|
|
@@ -5018,7 +5160,7 @@ function createEvictionStrategy(policy, maxCacheSize, config) {
|
|
|
5018
5160
|
}
|
|
5019
5161
|
|
|
5020
5162
|
// src/ttl/TTLManager.ts
|
|
5021
|
-
var
|
|
5163
|
+
var logger22 = logger_default.get("TTLManager");
|
|
5022
5164
|
var TTLManager = class {
|
|
5023
5165
|
config;
|
|
5024
5166
|
cleanupTimer;
|
|
@@ -5058,18 +5200,18 @@ var TTLManager = class {
|
|
|
5058
5200
|
this.startAutoCleanup();
|
|
5059
5201
|
}
|
|
5060
5202
|
}
|
|
5061
|
-
|
|
5203
|
+
logger22.debug("TTL configuration updated", { config: this.config });
|
|
5062
5204
|
}
|
|
5063
5205
|
/**
|
|
5064
5206
|
* Set TTL metadata for an item when it's added
|
|
5065
5207
|
*/
|
|
5066
|
-
onItemAdded(key, metadataProvider, itemTTL) {
|
|
5208
|
+
async onItemAdded(key, metadataProvider, itemTTL) {
|
|
5067
5209
|
if (!this.isTTLEnabled() && !itemTTL) {
|
|
5068
5210
|
return;
|
|
5069
5211
|
}
|
|
5070
|
-
const metadata = metadataProvider.getMetadata(key);
|
|
5212
|
+
const metadata = await metadataProvider.getMetadata(key);
|
|
5071
5213
|
if (!metadata) {
|
|
5072
|
-
|
|
5214
|
+
logger22.warning("No metadata found for item when setting TTL", { key });
|
|
5073
5215
|
return;
|
|
5074
5216
|
}
|
|
5075
5217
|
const ttl = itemTTL || this.config.defaultTTL;
|
|
@@ -5079,22 +5221,22 @@ var TTLManager = class {
|
|
|
5079
5221
|
expiresAt: metadata.addedAt + ttl,
|
|
5080
5222
|
ttl
|
|
5081
5223
|
};
|
|
5082
|
-
metadataProvider.setMetadata(key, ttlMetadata);
|
|
5083
|
-
|
|
5224
|
+
await metadataProvider.setMetadata(key, ttlMetadata);
|
|
5225
|
+
logger22.trace("TTL set for item", { key, ttl, expiresAt: ttlMetadata.expiresAt });
|
|
5084
5226
|
}
|
|
5085
5227
|
}
|
|
5086
5228
|
/**
|
|
5087
5229
|
* Check if an item has expired
|
|
5088
5230
|
*/
|
|
5089
|
-
isExpired(key, metadataProvider) {
|
|
5090
|
-
const metadata = metadataProvider.getMetadata(key);
|
|
5231
|
+
async isExpired(key, metadataProvider) {
|
|
5232
|
+
const metadata = await metadataProvider.getMetadata(key);
|
|
5091
5233
|
if (!metadata || !metadata.expiresAt) {
|
|
5092
5234
|
return false;
|
|
5093
5235
|
}
|
|
5094
5236
|
const now = Date.now();
|
|
5095
5237
|
const expired = now >= metadata.expiresAt;
|
|
5096
5238
|
if (expired) {
|
|
5097
|
-
|
|
5239
|
+
logger22.trace("Item expired", { key, expiresAt: metadata.expiresAt, now });
|
|
5098
5240
|
}
|
|
5099
5241
|
return expired;
|
|
5100
5242
|
}
|
|
@@ -5102,17 +5244,17 @@ var TTLManager = class {
|
|
|
5102
5244
|
* Check if an item is valid (not expired) before returning it
|
|
5103
5245
|
* Returns true if item is valid, false if expired
|
|
5104
5246
|
*/
|
|
5105
|
-
validateItem(key, metadataProvider) {
|
|
5247
|
+
async validateItem(key, metadataProvider) {
|
|
5106
5248
|
if (!this.config.validateOnAccess) {
|
|
5107
5249
|
return true;
|
|
5108
5250
|
}
|
|
5109
|
-
return !this.isExpired(key, metadataProvider);
|
|
5251
|
+
return !await this.isExpired(key, metadataProvider);
|
|
5110
5252
|
}
|
|
5111
5253
|
/**
|
|
5112
5254
|
* Get TTL information for an item
|
|
5113
5255
|
*/
|
|
5114
|
-
getItemTTLInfo(key, metadataProvider) {
|
|
5115
|
-
const metadata = metadataProvider.getMetadata(key);
|
|
5256
|
+
async getItemTTLInfo(key, metadataProvider) {
|
|
5257
|
+
const metadata = await metadataProvider.getMetadata(key);
|
|
5116
5258
|
if (!metadata || !metadata.expiresAt) {
|
|
5117
5259
|
return { hasTTL: false, isExpired: false };
|
|
5118
5260
|
}
|
|
@@ -5130,9 +5272,9 @@ var TTLManager = class {
|
|
|
5130
5272
|
/**
|
|
5131
5273
|
* Find all expired items
|
|
5132
5274
|
*/
|
|
5133
|
-
findExpiredItems(metadataProvider) {
|
|
5275
|
+
async findExpiredItems(metadataProvider) {
|
|
5134
5276
|
const expiredKeys = [];
|
|
5135
|
-
const allMetadata = metadataProvider.getAllMetadata();
|
|
5277
|
+
const allMetadata = await metadataProvider.getAllMetadata();
|
|
5136
5278
|
const now = Date.now();
|
|
5137
5279
|
for (const [key, metadata] of allMetadata) {
|
|
5138
5280
|
const ttlMetadata = metadata;
|
|
@@ -5141,7 +5283,7 @@ var TTLManager = class {
|
|
|
5141
5283
|
}
|
|
5142
5284
|
}
|
|
5143
5285
|
if (expiredKeys.length > 0) {
|
|
5144
|
-
|
|
5286
|
+
logger22.debug("Found expired items", { count: expiredKeys.length, keys: expiredKeys });
|
|
5145
5287
|
}
|
|
5146
5288
|
return expiredKeys;
|
|
5147
5289
|
}
|
|
@@ -5149,34 +5291,34 @@ var TTLManager = class {
|
|
|
5149
5291
|
* Manually clean up expired items
|
|
5150
5292
|
* Returns the keys of items that were expired
|
|
5151
5293
|
*/
|
|
5152
|
-
cleanupExpiredItems(metadataProvider) {
|
|
5153
|
-
return this.findExpiredItems(metadataProvider);
|
|
5294
|
+
async cleanupExpiredItems(metadataProvider) {
|
|
5295
|
+
return await this.findExpiredItems(metadataProvider);
|
|
5154
5296
|
}
|
|
5155
5297
|
/**
|
|
5156
5298
|
* Get remaining TTL for an item in milliseconds
|
|
5157
5299
|
*/
|
|
5158
|
-
getRemainingTTL(key, metadataProvider) {
|
|
5159
|
-
const info = this.getItemTTLInfo(key, metadataProvider);
|
|
5300
|
+
async getRemainingTTL(key, metadataProvider) {
|
|
5301
|
+
const info = await this.getItemTTLInfo(key, metadataProvider);
|
|
5160
5302
|
return info.hasTTL ? info.remainingTTL || 0 : null;
|
|
5161
5303
|
}
|
|
5162
5304
|
/**
|
|
5163
5305
|
* Extend TTL for an item
|
|
5164
5306
|
*/
|
|
5165
|
-
extendTTL(key, metadataProvider, additionalTTL) {
|
|
5166
|
-
const metadata = metadataProvider.getMetadata(key);
|
|
5307
|
+
async extendTTL(key, metadataProvider, additionalTTL) {
|
|
5308
|
+
const metadata = await metadataProvider.getMetadata(key);
|
|
5167
5309
|
if (!metadata || !metadata.expiresAt) {
|
|
5168
5310
|
return false;
|
|
5169
5311
|
}
|
|
5170
5312
|
metadata.expiresAt += additionalTTL;
|
|
5171
|
-
metadataProvider.setMetadata(key, metadata);
|
|
5172
|
-
|
|
5313
|
+
await metadataProvider.setMetadata(key, metadata);
|
|
5314
|
+
logger22.trace("TTL extended for item", { key, additionalTTL, newExpiresAt: metadata.expiresAt });
|
|
5173
5315
|
return true;
|
|
5174
5316
|
}
|
|
5175
5317
|
/**
|
|
5176
5318
|
* Reset TTL for an item (refresh expiration)
|
|
5177
5319
|
*/
|
|
5178
|
-
refreshTTL(key, metadataProvider, newTTL) {
|
|
5179
|
-
const metadata = metadataProvider.getMetadata(key);
|
|
5320
|
+
async refreshTTL(key, metadataProvider, newTTL) {
|
|
5321
|
+
const metadata = await metadataProvider.getMetadata(key);
|
|
5180
5322
|
if (!metadata) {
|
|
5181
5323
|
return false;
|
|
5182
5324
|
}
|
|
@@ -5190,8 +5332,8 @@ var TTLManager = class {
|
|
|
5190
5332
|
expiresAt: now + ttl,
|
|
5191
5333
|
ttl
|
|
5192
5334
|
};
|
|
5193
|
-
metadataProvider.setMetadata(key, ttlMetadata);
|
|
5194
|
-
|
|
5335
|
+
await metadataProvider.setMetadata(key, ttlMetadata);
|
|
5336
|
+
logger22.trace("TTL refreshed for item", { key, ttl, expiresAt: ttlMetadata.expiresAt });
|
|
5195
5337
|
return true;
|
|
5196
5338
|
}
|
|
5197
5339
|
/**
|
|
@@ -5203,9 +5345,9 @@ var TTLManager = class {
|
|
|
5203
5345
|
}
|
|
5204
5346
|
if (this.config.cleanupInterval) {
|
|
5205
5347
|
this.cleanupTimer = setInterval(() => {
|
|
5206
|
-
|
|
5348
|
+
logger22.trace("Auto cleanup timer triggered");
|
|
5207
5349
|
}, this.config.cleanupInterval);
|
|
5208
|
-
|
|
5350
|
+
logger22.debug("Auto cleanup started", { interval: this.config.cleanupInterval });
|
|
5209
5351
|
}
|
|
5210
5352
|
}
|
|
5211
5353
|
/**
|
|
@@ -5215,7 +5357,7 @@ var TTLManager = class {
|
|
|
5215
5357
|
if (this.cleanupTimer) {
|
|
5216
5358
|
clearInterval(this.cleanupTimer);
|
|
5217
5359
|
this.cleanupTimer = null;
|
|
5218
|
-
|
|
5360
|
+
logger22.debug("Auto cleanup stopped");
|
|
5219
5361
|
}
|
|
5220
5362
|
}
|
|
5221
5363
|
/**
|
|
@@ -5223,7 +5365,7 @@ var TTLManager = class {
|
|
|
5223
5365
|
*/
|
|
5224
5366
|
destroy() {
|
|
5225
5367
|
this.stopAutoCleanup();
|
|
5226
|
-
|
|
5368
|
+
logger22.debug("TTL manager destroyed");
|
|
5227
5369
|
}
|
|
5228
5370
|
};
|
|
5229
5371
|
|
|
@@ -5498,12 +5640,13 @@ var CacheEventEmitter = class {
|
|
|
5498
5640
|
}
|
|
5499
5641
|
/**
|
|
5500
5642
|
* Check if two location arrays match
|
|
5643
|
+
* Filter locations must be a prefix of event locations (in order)
|
|
5501
5644
|
*/
|
|
5502
5645
|
locationsMatch(filter, eventLocations) {
|
|
5503
|
-
if (filter.length === 0
|
|
5504
|
-
return
|
|
5646
|
+
if (filter.length === 0) {
|
|
5647
|
+
return eventLocations.length === 0;
|
|
5505
5648
|
}
|
|
5506
|
-
if (filter.length
|
|
5649
|
+
if (filter.length > eventLocations.length) {
|
|
5507
5650
|
return false;
|
|
5508
5651
|
}
|
|
5509
5652
|
return filter.every((filterLoc, index) => {
|
|
@@ -5620,9 +5763,9 @@ var CacheStatsManager = class {
|
|
|
5620
5763
|
};
|
|
5621
5764
|
|
|
5622
5765
|
// src/Cache.ts
|
|
5623
|
-
var
|
|
5766
|
+
var logger23 = logger_default.get("Cache");
|
|
5624
5767
|
var createCache = (api, coordinate, registry, options) => {
|
|
5625
|
-
|
|
5768
|
+
logger23.debug("createCache", { coordinate, registry, options });
|
|
5626
5769
|
const completeOptions = createOptions(options);
|
|
5627
5770
|
const cacheMap = createCacheMap(coordinate.kta, completeOptions);
|
|
5628
5771
|
const pkType = coordinate.kta[0];
|
|
@@ -5701,13 +5844,13 @@ var isCache = (cache) => {
|
|
|
5701
5844
|
};
|
|
5702
5845
|
|
|
5703
5846
|
// src/InstanceFactory.ts
|
|
5704
|
-
var
|
|
5847
|
+
var logger24 = logger_default.get("InstanceFactory");
|
|
5705
5848
|
var createInstanceFactory = (api, options) => {
|
|
5706
5849
|
const templateOptions = createOptions(options);
|
|
5707
5850
|
validateOptions(templateOptions);
|
|
5708
5851
|
return (coordinate, context) => {
|
|
5709
5852
|
const instanceOptions = createOptions(options);
|
|
5710
|
-
|
|
5853
|
+
logger24.debug("Creating cache instance", {
|
|
5711
5854
|
coordinate,
|
|
5712
5855
|
registry: context.registry,
|
|
5713
5856
|
api,
|
|
@@ -5771,9 +5914,9 @@ var createInstanceFactory = (api, options) => {
|
|
|
5771
5914
|
};
|
|
5772
5915
|
|
|
5773
5916
|
// src/Instance.ts
|
|
5774
|
-
var
|
|
5917
|
+
var logger25 = logger_default.get("Instance");
|
|
5775
5918
|
var createInstance = (registry, coordinate, api, options) => {
|
|
5776
|
-
|
|
5919
|
+
logger25.debug("createInstance", { coordinate, api, registry, options });
|
|
5777
5920
|
return createCache(api, coordinate, registry, options);
|
|
5778
5921
|
};
|
|
5779
5922
|
var isInstance = (instance) => {
|
|
@@ -5781,7 +5924,7 @@ var isInstance = (instance) => {
|
|
|
5781
5924
|
};
|
|
5782
5925
|
|
|
5783
5926
|
// src/Aggregator.ts
|
|
5784
|
-
var
|
|
5927
|
+
var logger26 = logger_default.get("ItemAggregator");
|
|
5785
5928
|
var toCacheConfig = (config) => {
|
|
5786
5929
|
let cacheConfig;
|
|
5787
5930
|
if (config.optional === void 0) {
|
|
@@ -5793,22 +5936,22 @@ var toCacheConfig = (config) => {
|
|
|
5793
5936
|
};
|
|
5794
5937
|
var createAggregator = async (cache, { aggregates = {}, events = {} }) => {
|
|
5795
5938
|
const populate = async (item) => {
|
|
5796
|
-
|
|
5939
|
+
logger26.default("populate", { item });
|
|
5797
5940
|
for (const key in aggregates) {
|
|
5798
5941
|
await populateAggregate(key, item);
|
|
5799
5942
|
}
|
|
5800
5943
|
for (const key in events) {
|
|
5801
5944
|
await populateEvent(key, item);
|
|
5802
5945
|
}
|
|
5803
|
-
|
|
5946
|
+
logger26.default("populate done", { item });
|
|
5804
5947
|
return item;
|
|
5805
5948
|
};
|
|
5806
5949
|
const populateAggregate = async (key, item) => {
|
|
5807
|
-
|
|
5950
|
+
logger26.default("populate aggregate key", { key });
|
|
5808
5951
|
const cacheConfig = toCacheConfig(aggregates[key]);
|
|
5809
5952
|
if (item.refs === void 0) {
|
|
5810
5953
|
if (cacheConfig.optional === false) {
|
|
5811
|
-
|
|
5954
|
+
logger26.error("Item does not have refs an is not optional ", { item });
|
|
5812
5955
|
throw new Error("Item does not have refs an is not optional " + JSON.stringify(item));
|
|
5813
5956
|
} else {
|
|
5814
5957
|
if (item.events && Object.prototype.hasOwnProperty.call(item.events, key)) {
|
|
@@ -5817,7 +5960,7 @@ var createAggregator = async (cache, { aggregates = {}, events = {} }) => {
|
|
|
5817
5960
|
}
|
|
5818
5961
|
} else if (item.refs[key] === void 0) {
|
|
5819
5962
|
if (cacheConfig.optional === false) {
|
|
5820
|
-
|
|
5963
|
+
logger26.error("Item does not have mandatory ref with key, not optional ", { key, item });
|
|
5821
5964
|
throw new Error("Item does not have mandatory ref with key, not optional " + key + " " + JSON.stringify(item));
|
|
5822
5965
|
} else {
|
|
5823
5966
|
if (item.events && Object.prototype.hasOwnProperty.call(item.events, key)) {
|
|
@@ -5826,7 +5969,7 @@ var createAggregator = async (cache, { aggregates = {}, events = {} }) => {
|
|
|
5826
5969
|
}
|
|
5827
5970
|
} else {
|
|
5828
5971
|
const ref = item.refs[key];
|
|
5829
|
-
|
|
5972
|
+
logger26.default("AGG Retrieving Item in Populate", { key: ref });
|
|
5830
5973
|
const newItem = await cacheConfig.cache.operations.retrieve(ref);
|
|
5831
5974
|
if (newItem) {
|
|
5832
5975
|
if (item.aggs === void 0) {
|
|
@@ -5840,25 +5983,25 @@ var createAggregator = async (cache, { aggregates = {}, events = {} }) => {
|
|
|
5840
5983
|
}
|
|
5841
5984
|
};
|
|
5842
5985
|
const populateEvent = async (key, item) => {
|
|
5843
|
-
|
|
5986
|
+
logger26.default("populate event key", { key });
|
|
5844
5987
|
const cacheConfig = toCacheConfig(events[key]);
|
|
5845
5988
|
if (item.events === void 0) {
|
|
5846
5989
|
throw new Error("Item does not have events " + JSON.stringify(item));
|
|
5847
5990
|
} else if (item.events[key] === void 0) {
|
|
5848
5991
|
if (cacheConfig.optional === false) {
|
|
5849
|
-
|
|
5992
|
+
logger26.error("Item does not have mandatory event with key", { key, item });
|
|
5850
5993
|
throw new Error("Item does not have mandatory event with key " + key + " " + JSON.stringify(item));
|
|
5851
5994
|
}
|
|
5852
5995
|
} else {
|
|
5853
5996
|
const event = item.events[key];
|
|
5854
5997
|
if (event.by === void 0) {
|
|
5855
|
-
|
|
5998
|
+
logger26.error(
|
|
5856
5999
|
"populateEvent with an Event that does not have by",
|
|
5857
6000
|
{ event, ik: item.key, eventKey: key }
|
|
5858
6001
|
);
|
|
5859
6002
|
throw new Error("populateEvent with an Event that does not have by: " + JSON.stringify({ key }));
|
|
5860
6003
|
}
|
|
5861
|
-
|
|
6004
|
+
logger26.default("EVENT Retrieving Item in Populate", { key: event.by });
|
|
5862
6005
|
const newItem = await cacheConfig.cache.operations.retrieve(event.by);
|
|
5863
6006
|
if (newItem) {
|
|
5864
6007
|
event.agg = newItem;
|
|
@@ -5866,13 +6009,13 @@ var createAggregator = async (cache, { aggregates = {}, events = {} }) => {
|
|
|
5866
6009
|
}
|
|
5867
6010
|
};
|
|
5868
6011
|
const all2 = async (query = {}, locations = []) => {
|
|
5869
|
-
|
|
6012
|
+
logger26.default("all", { query, locations });
|
|
5870
6013
|
const items = await cache.operations.all(query, locations);
|
|
5871
6014
|
const populatedItems = await Promise.all(items.map(async (item) => populate(item)));
|
|
5872
6015
|
return populatedItems;
|
|
5873
6016
|
};
|
|
5874
6017
|
const one2 = async (query = {}, locations = []) => {
|
|
5875
|
-
|
|
6018
|
+
logger26.default("one", { query, locations });
|
|
5876
6019
|
const item = await cache.operations.one(query, locations);
|
|
5877
6020
|
let populatedItem = null;
|
|
5878
6021
|
if (item) {
|
|
@@ -5881,30 +6024,30 @@ var createAggregator = async (cache, { aggregates = {}, events = {} }) => {
|
|
|
5881
6024
|
return populatedItem;
|
|
5882
6025
|
};
|
|
5883
6026
|
const action2 = async (key, action3, body = {}) => {
|
|
5884
|
-
|
|
6027
|
+
logger26.default("action", { key, action: action3, body });
|
|
5885
6028
|
const item = await cache.operations.action(key, action3, body);
|
|
5886
6029
|
const populatedItem = await populate(item);
|
|
5887
6030
|
return populatedItem;
|
|
5888
6031
|
};
|
|
5889
6032
|
const allAction2 = async (action3, body = {}, locations = []) => {
|
|
5890
|
-
|
|
6033
|
+
logger26.default("action", { action: action3, body, locations });
|
|
5891
6034
|
const items = await cache.operations.allAction(action3, body, locations);
|
|
5892
6035
|
const populatedItems = await Promise.all(items.map(async (item) => populate(item)));
|
|
5893
6036
|
return populatedItems;
|
|
5894
6037
|
};
|
|
5895
6038
|
const allFacet2 = async (facet3, params = {}, locations = []) => {
|
|
5896
|
-
|
|
6039
|
+
logger26.default("allFacet", { facet: facet3, params, locations });
|
|
5897
6040
|
const response = await cache.operations.allFacet(facet3, params, locations);
|
|
5898
6041
|
return response;
|
|
5899
6042
|
};
|
|
5900
6043
|
const create2 = async (v, locations = []) => {
|
|
5901
|
-
|
|
6044
|
+
logger26.default("create", { v, locations });
|
|
5902
6045
|
const item = await cache.operations.create(v, locations);
|
|
5903
6046
|
const populatedItem = await populate(item);
|
|
5904
6047
|
return populatedItem;
|
|
5905
6048
|
};
|
|
5906
6049
|
const get2 = async (key) => {
|
|
5907
|
-
|
|
6050
|
+
logger26.default("get", { key });
|
|
5908
6051
|
const item = await cache.operations.get(key);
|
|
5909
6052
|
let populatedItem = null;
|
|
5910
6053
|
if (item) {
|
|
@@ -5913,7 +6056,7 @@ var createAggregator = async (cache, { aggregates = {}, events = {} }) => {
|
|
|
5913
6056
|
return populatedItem;
|
|
5914
6057
|
};
|
|
5915
6058
|
const retrieve2 = async (key) => {
|
|
5916
|
-
|
|
6059
|
+
logger26.default("retrieve", { key });
|
|
5917
6060
|
const item = await cache.operations.retrieve(key);
|
|
5918
6061
|
let populatedItem = null;
|
|
5919
6062
|
if (item) {
|
|
@@ -5922,34 +6065,34 @@ var createAggregator = async (cache, { aggregates = {}, events = {} }) => {
|
|
|
5922
6065
|
return populatedItem;
|
|
5923
6066
|
};
|
|
5924
6067
|
const remove2 = async (key) => {
|
|
5925
|
-
|
|
6068
|
+
logger26.default("remove", { key });
|
|
5926
6069
|
await cache.operations.remove(key);
|
|
5927
6070
|
};
|
|
5928
6071
|
const update2 = async (key, v) => {
|
|
5929
|
-
|
|
6072
|
+
logger26.default("update", { key, v });
|
|
5930
6073
|
const item = await cache.operations.update(key, v);
|
|
5931
6074
|
const populatedItem = await populate(item);
|
|
5932
6075
|
return populatedItem;
|
|
5933
6076
|
};
|
|
5934
6077
|
const facet2 = async (key, facet3) => {
|
|
5935
|
-
|
|
6078
|
+
logger26.default("facet", { key, facet: facet3 });
|
|
5936
6079
|
const response = await cache.operations.facet(key, facet3);
|
|
5937
6080
|
return response;
|
|
5938
6081
|
};
|
|
5939
6082
|
const find2 = async (finder, finderParams = {}, locations = []) => {
|
|
5940
|
-
|
|
6083
|
+
logger26.default("find", { finder, finderParams, locations });
|
|
5941
6084
|
const items = await cache.operations.find(finder, finderParams, locations);
|
|
5942
6085
|
const populatedItems = await Promise.all(items.map(async (item) => populate(item)));
|
|
5943
6086
|
return populatedItems;
|
|
5944
6087
|
};
|
|
5945
6088
|
const findOne2 = async (finder, finderParams = {}, locations = []) => {
|
|
5946
|
-
|
|
6089
|
+
logger26.default("find", { finder, finderParams, locations });
|
|
5947
6090
|
const item = await cache.operations.findOne(finder, finderParams, locations);
|
|
5948
6091
|
const populatedItem = await populate(item);
|
|
5949
6092
|
return populatedItem;
|
|
5950
6093
|
};
|
|
5951
6094
|
const set2 = async (key, v) => {
|
|
5952
|
-
|
|
6095
|
+
logger26.default("set", { key, v });
|
|
5953
6096
|
const item = await cache.operations.set(key, v);
|
|
5954
6097
|
const populatedItem = await populate(item);
|
|
5955
6098
|
return populatedItem;
|
|
@@ -6001,13 +6144,13 @@ var createAggregator = async (cache, { aggregates = {}, events = {} }) => {
|
|
|
6001
6144
|
import {
|
|
6002
6145
|
createRegistry as createBaseRegistry
|
|
6003
6146
|
} from "@fjell/registry";
|
|
6004
|
-
var
|
|
6147
|
+
var logger27 = logger_default.get("Registry");
|
|
6005
6148
|
var createRegistryFactory = () => {
|
|
6006
6149
|
return (type, registryHub) => {
|
|
6007
6150
|
if (type !== "cache") {
|
|
6008
6151
|
throw new Error(`Cache registry factory can only create 'cache' type registries, got: ${type}`);
|
|
6009
6152
|
}
|
|
6010
|
-
|
|
6153
|
+
logger27.debug("Creating cache registry", { type, registryHub });
|
|
6011
6154
|
const baseRegistry = createBaseRegistry(type, registryHub);
|
|
6012
6155
|
return baseRegistry;
|
|
6013
6156
|
};
|