@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/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
- ret.forEach((v) => {
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
- evictedKeys.forEach((evictedKey) => {
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?.(keyStr2);
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?.(keyStr2, baseMetadata);
743
+ await cacheMap.setMetadata(keyStr2, baseMetadata);
708
744
  }
709
- const evictedKeys = context.evictionManager.onItemAdded(keyStr2, ret, cacheMap);
710
- ttlManager.onItemAdded(keyStr2, cacheMap);
711
- evictedKeys.forEach((evictedKey) => {
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
- context.ttlManager.onItemAdded(keyStr, cacheMap);
813
- const evictedKeys = context.evictionManager.onItemAdded(keyStr, updated, cacheMap);
814
- evictedKeys.forEach((evictedKey) => {
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
- evictedKeys.forEach((evictedKey) => {
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
- ret.forEach((v) => {
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
- evictedKeys.forEach((evictedKey) => {
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
- ret.forEach((v) => {
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
- evictedKeys.forEach((evictedKey) => {
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
- evictedKeys.forEach((evictedKey) => {
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
- ttlManager.onItemAdded(keyStr, cacheMap);
1067
- const evictedKeys = evictionManager.onItemAdded(keyStr, v, cacheMap);
1068
- evictedKeys.forEach((evictedKey) => {
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
- for (const key of this.keys()) {
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
- keys.forEach((key) => {
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
- for (const key of this.keys()) {
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
- keys.forEach((key) => {
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
- logger17.debug("allIn", { locKeys, keys: allKeys.length });
1924
- const filteredKeys = allKeys.filter((key) => key && isComKey3(key)).filter((key) => {
1925
- const ComKey12 = key;
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: ComKey12
1991
+ ComKey: ComKey13
1929
1992
  });
1930
- return isLocKeyArrayEqual(locKeys, ComKey12.loc);
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
- keys.forEach((key) => {
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 keysToInvalidate = this.keys().filter((key) => key && isComKey3(key)).filter((key) => {
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
- logger18.debug("allIn", { locKeys, keys: allKeys.length });
2384
- const filteredKeys = allKeys.filter((key) => key && isComKey4(key)).filter((key) => {
2385
- const ComKey12 = key;
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: ComKey12
2453
+ ComKey: ComKey13
2389
2454
  });
2390
- return isLocKeyArrayEqual(locKeys, ComKey12.loc);
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
- keys.forEach((key) => {
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
- async set(key, value) {
2731
- logger19.trace("set", { key, value });
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 ComKey12 = key;
2944
+ const ComKey13 = key;
2816
2945
  logger19.debug("Comparing Location Keys", {
2817
2946
  locKeys,
2818
- ComKey: ComKey12
2947
+ ComKey: ComKey13
2819
2948
  });
2820
- return isLocKeyArrayEqual(locKeys, ComKey12.loc);
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
- memoryCache;
3285
+ // Background sync management
3115
3286
  syncInterval = null;
3116
- SYNC_INTERVAL_MS = 5e3;
3117
- // Sync every 5 seconds
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
- if (this.initializationPromise) {
3132
- return this.initializationPromise;
3133
- }
3134
- this.initializationPromise = (async () => {
3135
- try {
3136
- const keys = await this.asyncCache.keys();
3137
- for (const key of keys) {
3138
- if (!this.memoryCache.includesKey(key)) {
3139
- const value = await this.asyncCache.get(key);
3140
- if (value) {
3141
- this.memoryCache.set(key, value);
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
- return this.initializationPromise;
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.syncToIndexedDB();
3156
- }, this.SYNC_INTERVAL_MS);
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
- const pendingOps = Array.from(this.pendingSyncOperations.entries());
3174
- for (const [keyStr, operation] of pendingOps) {
3175
- if (operation.cancelled) {
3176
- this.pendingSyncOperations.delete(keyStr);
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
- await operation.promise;
3181
- const currentOp = this.pendingSyncOperations.get(keyStr);
3182
- if (currentOp && currentOp.sequenceId === operation.sequenceId) {
3183
- this.pendingSyncOperations.delete(keyStr);
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(`Failed to process pending ${operation.type} operation:`, error);
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
- queueForSync(key, value) {
3197
- const keyStr = JSON.stringify(key);
3198
- const sequenceId = ++this.operationSequence;
3199
- const existingOp = this.pendingSyncOperations.get(keyStr);
3200
- if (existingOp) {
3201
- existingOp.cancelled = true;
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
- const syncPromise = (async () => {
3204
- try {
3205
- await this.asyncCache.set(key, value);
3206
- const currentOp = this.pendingSyncOperations.get(keyStr);
3207
- if (currentOp && currentOp.sequenceId === sequenceId && !currentOp.cancelled) {
3208
- this.pendingSyncOperations.delete(keyStr);
3209
- }
3210
- } catch (error) {
3211
- console.warn("Failed to sync single operation to IndexedDB:", error);
3212
- const currentOp = this.pendingSyncOperations.get(keyStr);
3213
- if (!currentOp || currentOp.sequenceId !== sequenceId || currentOp.cancelled) {
3214
- if (currentOp && currentOp.sequenceId === sequenceId) {
3215
- this.pendingSyncOperations.delete(keyStr);
3216
- }
3217
- }
3218
- }
3219
- })();
3220
- this.pendingSyncOperations.set(keyStr, {
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
- sequenceId,
3225
- promise: syncPromise,
3226
- cancelled: false
3375
+ metadata,
3376
+ sequenceId: ++this.sequenceCounter
3227
3377
  });
3378
+ this.processPendingOperations();
3228
3379
  }
3229
- queueDeleteForSync(key) {
3230
- const keyStr = JSON.stringify(key);
3231
- const sequenceId = ++this.operationSequence;
3232
- const existingOp = this.pendingSyncOperations.get(keyStr);
3233
- if (existingOp) {
3234
- existingOp.cancelled = true;
3235
- }
3236
- const syncPromise = (async () => {
3237
- try {
3238
- await this.asyncCache.delete(key);
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
- queueClearForSync() {
3262
- for (const operation of this.pendingSyncOperations.values()) {
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 get(key) {
3275
- if (!this.isInitialized && this.initializationPromise) {
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
- set(key, value) {
3285
- this.memoryCache.set(key, value);
3286
- this.queueForSync(key, value);
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 includesKey(key) {
3289
- if (!this.isInitialized && this.initializationPromise) {
3290
- try {
3291
- await this.initializationPromise;
3292
- } catch (error) {
3293
- console.warn("IndexedDB initialization failed, using memory cache only:", error);
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 this.memoryCache.includesKey(key);
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
- return this.memoryCache.contains(query, locations);
3427
+ const items = await this.queryIn(query, locations);
3428
+ return items.length > 0;
3307
3429
  }
3308
3430
  async queryIn(query, locations) {
3309
- return this.memoryCache.queryIn(query, locations);
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
- async clone() {
3312
- return new _IndexDBCacheMap(this.types);
3437
+ // Query result caching methods
3438
+ async setQueryResult(queryHash, itemKeys) {
3439
+ this.queryResultCache[queryHash] = {
3440
+ itemKeys
3441
+ };
3313
3442
  }
3314
- keys() {
3315
- return this.memoryCache.keys();
3443
+ async getQueryResult(queryHash) {
3444
+ const entry = this.queryResultCache[queryHash];
3445
+ return entry ? entry.itemKeys : null;
3316
3446
  }
3317
- async values() {
3318
- return this.memoryCache.values();
3447
+ async hasQueryResult(queryHash) {
3448
+ return queryHash in this.queryResultCache;
3319
3449
  }
3320
- clear() {
3321
- this.memoryCache.clear();
3322
- this.queueClearForSync();
3450
+ async deleteQueryResult(queryHash) {
3451
+ delete this.queryResultCache[queryHash];
3323
3452
  }
3324
- // Query result caching methods implementation
3325
- setQueryResult(queryHash, itemKeys) {
3326
- return this.memoryCache.setQueryResult(queryHash, itemKeys);
3453
+ async clearQueryResults() {
3454
+ this.queryResultCache = {};
3327
3455
  }
3328
- async getQueryResult(queryHash) {
3329
- if (!this.isInitialized && this.initializationPromise) {
3330
- try {
3331
- await this.initializationPromise;
3332
- } catch (error) {
3333
- console.warn("IndexedDB initialization failed, using memory cache only:", error);
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
- hasQueryResult(queryHash) {
3339
- return this.memoryCache.hasQueryResult(queryHash);
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
- deleteQueryResult(queryHash) {
3342
- return this.memoryCache.deleteQueryResult(queryHash);
3477
+ // Metadata operations
3478
+ async getMetadata(key) {
3479
+ return this.metadataMap.get(key) || null;
3343
3480
  }
3344
- invalidateItemKeys(keys) {
3345
- return this.memoryCache.invalidateItemKeys(keys);
3481
+ async setMetadata(key, metadata) {
3482
+ this.metadataMap.set(key, metadata);
3346
3483
  }
3347
- async invalidateLocation(locations) {
3348
- return await this.memoryCache.invalidateLocation(locations);
3484
+ async deleteMetadata(key) {
3485
+ this.metadataMap.delete(key);
3349
3486
  }
3350
- clearQueryResults() {
3351
- return this.memoryCache.clearQueryResults();
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 logger20 = logger_default.get("EvictionManager");
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
- logger20.debug("Eviction strategy updated", {
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
- logger20.error("Error in eviction strategy onItemAccessed", { key, error });
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
- logger20.debug("Items evicted during addition", {
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
- logger20.error("Error in eviction strategy onItemAdded", { key, error });
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
- logger20.error("Error in eviction strategy onItemRemoved", { key, error });
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
- logger20.debug("Manual eviction performed", {
3810
+ logger21.debug("Manual eviction performed", {
3669
3811
  evictedKeys,
3670
3812
  strategy: this.evictionStrategy.getStrategyName()
3671
3813
  });
3672
3814
  }
3673
3815
  } catch (error) {
3674
- logger20.error("Error in manual eviction", { error });
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 logger21 = logger_default.get("TTLManager");
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
- logger21.debug("TTL configuration updated", { config: this.config });
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
- logger21.warning("No metadata found for item when setting TTL", { key });
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
- logger21.trace("TTL set for item", { key, ttl, expiresAt: ttlMetadata.expiresAt });
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
- logger21.trace("Item expired", { key, expiresAt: metadata.expiresAt, now });
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
- logger21.debug("Found expired items", { count: expiredKeys.length, keys: expiredKeys });
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
- logger21.trace("TTL extended for item", { key, additionalTTL, newExpiresAt: metadata.expiresAt });
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
- logger21.trace("TTL refreshed for item", { key, ttl, expiresAt: ttlMetadata.expiresAt });
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
- logger21.trace("Auto cleanup timer triggered");
5348
+ logger22.trace("Auto cleanup timer triggered");
5207
5349
  }, this.config.cleanupInterval);
5208
- logger21.debug("Auto cleanup started", { interval: this.config.cleanupInterval });
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
- logger21.debug("Auto cleanup stopped");
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
- logger21.debug("TTL manager destroyed");
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 && eventLocations.length === 0) {
5504
- return true;
5646
+ if (filter.length === 0) {
5647
+ return eventLocations.length === 0;
5505
5648
  }
5506
- if (filter.length !== eventLocations.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 logger22 = logger_default.get("Cache");
5766
+ var logger23 = logger_default.get("Cache");
5624
5767
  var createCache = (api, coordinate, registry, options) => {
5625
- logger22.debug("createCache", { coordinate, registry, options });
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 logger23 = logger_default.get("InstanceFactory");
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
- logger23.debug("Creating cache instance", {
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 logger24 = logger_default.get("Instance");
5917
+ var logger25 = logger_default.get("Instance");
5775
5918
  var createInstance = (registry, coordinate, api, options) => {
5776
- logger24.debug("createInstance", { coordinate, api, registry, options });
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 logger25 = logger_default.get("ItemAggregator");
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
- logger25.default("populate", { item });
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
- logger25.default("populate done", { item });
5946
+ logger26.default("populate done", { item });
5804
5947
  return item;
5805
5948
  };
5806
5949
  const populateAggregate = async (key, item) => {
5807
- logger25.default("populate aggregate key", { key });
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
- logger25.error("Item does not have refs an is not optional ", { item });
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
- logger25.error("Item does not have mandatory ref with key, not optional ", { key, item });
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
- logger25.default("AGG Retrieving Item in Populate", { key: ref });
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
- logger25.default("populate event key", { key });
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
- logger25.error("Item does not have mandatory event with key", { key, item });
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
- logger25.error(
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
- logger25.default("EVENT Retrieving Item in Populate", { key: event.by });
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
- logger25.default("all", { query, locations });
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
- logger25.default("one", { query, locations });
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
- logger25.default("action", { key, action: action3, body });
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
- logger25.default("action", { action: action3, body, locations });
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
- logger25.default("allFacet", { facet: facet3, params, locations });
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
- logger25.default("create", { v, locations });
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
- logger25.default("get", { key });
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
- logger25.default("retrieve", { key });
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
- logger25.default("remove", { key });
6068
+ logger26.default("remove", { key });
5926
6069
  await cache.operations.remove(key);
5927
6070
  };
5928
6071
  const update2 = async (key, v) => {
5929
- logger25.default("update", { key, v });
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
- logger25.default("facet", { key, facet: facet3 });
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
- logger25.default("find", { finder, finderParams, locations });
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
- logger25.default("find", { finder, finderParams, locations });
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
- logger25.default("set", { key, v });
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 logger26 = logger_default.get("Registry");
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
- logger26.debug("Creating cache registry", { type, registryHub });
6153
+ logger27.debug("Creating cache registry", { type, registryHub });
6011
6154
  const baseRegistry = createBaseRegistry(type, registryHub);
6012
6155
  return baseRegistry;
6013
6156
  };