@fjell/cache 4.7.10 → 4.7.13

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
@@ -957,15 +957,36 @@ import {
957
957
  import { NotFoundError as NotFoundError3 } from "@fjell/http-api";
958
958
  var logger9 = logger_default.get("allAction");
959
959
  var allAction = async (action2, body = {}, locations = [], context) => {
960
- const { api, cacheMap, pkType } = context;
960
+ const { api, cacheMap, pkType, eventEmitter } = context;
961
961
  logger9.default("allAction", { action: action2, body, locations });
962
+ const existingItems = [];
963
+ if (locations && locations.length > 0) {
964
+ try {
965
+ const cachedItems = await cacheMap.allIn(locations);
966
+ if (cachedItems) {
967
+ existingItems.push(...cachedItems);
968
+ }
969
+ } catch (error) {
970
+ logger9.debug("Could not retrieve existing items for comparison", { error });
971
+ }
972
+ }
962
973
  logger9.debug("Invalidating location before allAction", { locations });
963
- cacheMap.invalidateLocation(locations);
974
+ await cacheMap.invalidateLocation(locations);
964
975
  let ret = [];
965
976
  try {
966
977
  ret = await api.allAction(action2, body, locations);
967
978
  logger9.debug("Caching allAction results", { resultCount: ret.length });
979
+ const modifiedItems = [];
980
+ const newItems = [];
968
981
  for (const v of ret) {
982
+ const existedBefore = existingItems.some(
983
+ (existing) => JSON.stringify(existing.key) === JSON.stringify(v.key)
984
+ );
985
+ if (existedBefore) {
986
+ modifiedItems.push(v);
987
+ } else {
988
+ newItems.push(v);
989
+ }
969
990
  await cacheMap.set(v.key, v);
970
991
  const keyStr = JSON.stringify(v.key);
971
992
  context.ttlManager.onItemAdded(keyStr, cacheMap);
@@ -975,6 +996,55 @@ var allAction = async (action2, body = {}, locations = [], context) => {
975
996
  await cacheMap.delete(parsedKey);
976
997
  }
977
998
  }
999
+ for (const item of modifiedItems) {
1000
+ logger9.debug("Emitting item_updated event for modified item", { key: item.key });
1001
+ const itemEvent = CacheEventFactory.itemUpdated(
1002
+ item.key,
1003
+ item,
1004
+ null,
1005
+ // We don't have the previous item state
1006
+ "operation"
1007
+ );
1008
+ eventEmitter.emit(itemEvent);
1009
+ }
1010
+ for (const item of newItems) {
1011
+ logger9.debug("Emitting item_created event for new item", { key: item.key });
1012
+ const itemEvent = CacheEventFactory.itemCreated(
1013
+ item.key,
1014
+ item,
1015
+ "operation"
1016
+ );
1017
+ eventEmitter.emit(itemEvent);
1018
+ }
1019
+ if (modifiedItems.length > 0) {
1020
+ const modifiedKeys = modifiedItems.map((item) => item.key);
1021
+ logger9.debug("Invalidating individual item keys for modified items", {
1022
+ keyCount: modifiedKeys.length,
1023
+ keys: modifiedKeys
1024
+ });
1025
+ await cacheMap.invalidateItemKeys(modifiedKeys);
1026
+ }
1027
+ await cacheMap.clearQueryResults();
1028
+ logger9.debug("Emitting query_invalidated event after allAction", {
1029
+ eventType: "query_invalidated",
1030
+ reason: "item_changed",
1031
+ action: action2,
1032
+ modifiedCount: modifiedItems.length,
1033
+ newCount: newItems.length
1034
+ });
1035
+ const queryInvalidatedEvent = CacheEventFactory.createQueryInvalidatedEvent(
1036
+ [],
1037
+ // We don't track which specific queries were invalidated
1038
+ "item_changed",
1039
+ {
1040
+ source: "operation",
1041
+ context: {
1042
+ operation: "allAction",
1043
+ requestId: `allAction_${action2}_${Date.now()}`
1044
+ }
1045
+ }
1046
+ );
1047
+ eventEmitter.emit(queryInvalidatedEvent);
978
1048
  } catch (e) {
979
1049
  if (e instanceof NotFoundError3) {
980
1050
  } else {
@@ -1008,13 +1078,13 @@ import {
1008
1078
  } from "@fjell/core";
1009
1079
  var logger12 = logger_default.get("find");
1010
1080
  var find = async (finder, params = {}, locations = [], context) => {
1011
- const { api, cacheMap, pkType, ttlManager } = context;
1081
+ const { api, cacheMap, pkType, ttlManager, eventEmitter } = context;
1012
1082
  logger12.default("find", { finder, params, locations });
1013
1083
  const queryHash = createFinderHash(finder, params, locations);
1014
- logger12.debug("Generated query hash for find", { queryHash });
1084
+ logger12.debug("Generated query hash for find", { queryHash, finder, params, locations });
1015
1085
  const cachedItemKeys = await cacheMap.getQueryResult(queryHash);
1016
1086
  if (cachedItemKeys) {
1017
- logger12.debug("Using cached query results", { cachedKeyCount: cachedItemKeys.length });
1087
+ logger12.debug("Using cached query results", { cachedKeyCount: cachedItemKeys.length, queryHash });
1018
1088
  const cachedItems = [];
1019
1089
  let allItemsAvailable = true;
1020
1090
  for (const itemKey of cachedItemKeys) {
@@ -1047,6 +1117,8 @@ var find = async (finder, params = {}, locations = [], context) => {
1047
1117
  const itemKeys = ret.map((item) => item.key);
1048
1118
  cacheMap.setQueryResult(queryHash, itemKeys);
1049
1119
  logger12.debug("Cached query result", { queryHash, itemKeyCount: itemKeys.length });
1120
+ const event = CacheEventFactory.createQueryEvent(params, locations, ret);
1121
+ eventEmitter.emit(event);
1050
1122
  return [context, validatePK9(ret, pkType)];
1051
1123
  };
1052
1124
 
@@ -1056,7 +1128,7 @@ import {
1056
1128
  } from "@fjell/core";
1057
1129
  var logger13 = logger_default.get("findOne");
1058
1130
  var findOne = async (finder, finderParams = {}, locations = [], context) => {
1059
- const { api, cacheMap, pkType, ttlManager } = context;
1131
+ const { api, cacheMap, pkType, ttlManager, eventEmitter } = context;
1060
1132
  logger13.default("findOne", { finder, finderParams, locations });
1061
1133
  const queryHash = createFinderHash(finder, finderParams, locations);
1062
1134
  logger13.debug("Generated query hash for findOne", { queryHash });
@@ -1082,6 +1154,8 @@ var findOne = async (finder, finderParams = {}, locations = [], context) => {
1082
1154
  }
1083
1155
  cacheMap.setQueryResult(queryHash, [ret.key]);
1084
1156
  logger13.debug("Cached query result", { queryHash, itemKey: ret.key });
1157
+ const event = CacheEventFactory.createQueryEvent(finderParams, locations, [ret]);
1158
+ eventEmitter.emit(event);
1085
1159
  return [context, validatePK10(ret, pkType)];
1086
1160
  };
1087
1161
 
@@ -1 +1 @@
1
- {"version":3,"file":"allAction.d.ts","sourceRoot":"","sources":["../../src/ops/allAction.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,IAAI,EACJ,WAAW,EAEZ,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAK/C,eAAO,MAAM,SAAS,GACpB,CAAC,SAAS,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EACrC,CAAC,SAAS,MAAM,EAChB,EAAE,SAAS,MAAM,GAAG,KAAK,EACzB,EAAE,SAAS,MAAM,GAAG,KAAK,EACzB,EAAE,SAAS,MAAM,GAAG,KAAK,EACzB,EAAE,SAAS,MAAM,GAAG,KAAK,EACzB,EAAE,SAAS,MAAM,GAAG,KAAK,EAEzB,QAAQ,MAAM,EACd,MAAM,GAAG,YAAK,EACd,YAAW,WAAW,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,aAAK,EACpD,SAAS,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,KAC9C,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAsCvD,CAAC"}
1
+ {"version":3,"file":"allAction.d.ts","sourceRoot":"","sources":["../../src/ops/allAction.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,IAAI,EACJ,WAAW,EAEZ,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAM/C,eAAO,MAAM,SAAS,GACpB,CAAC,SAAS,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EACrC,CAAC,SAAS,MAAM,EAChB,EAAE,SAAS,MAAM,GAAG,KAAK,EACzB,EAAE,SAAS,MAAM,GAAG,KAAK,EACzB,EAAE,SAAS,MAAM,GAAG,KAAK,EACzB,EAAE,SAAS,MAAM,GAAG,KAAK,EACzB,EAAE,SAAS,MAAM,GAAG,KAAK,EAEzB,QAAQ,MAAM,EACd,MAAM,GAAG,YAAK,EACd,YAAW,WAAW,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,aAAK,EACpD,SAAS,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,KAC9C,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAiIvD,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"find.d.ts","sourceRoot":"","sources":["../../src/ops/find.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,IAAI,EACJ,WAAW,EAEZ,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAM/C,eAAO,MAAM,IAAI,GACf,CAAC,SAAS,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EACrC,CAAC,SAAS,MAAM,EAChB,EAAE,SAAS,MAAM,GAAG,KAAK,EACzB,EAAE,SAAS,MAAM,GAAG,KAAK,EACzB,EAAE,SAAS,MAAM,GAAG,KAAK,EACzB,EAAE,SAAS,MAAM,GAAG,KAAK,EACzB,EAAE,SAAS,MAAM,GAAG,KAAK,EAEzB,QAAQ,MAAM,EACd,QAAQ,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,KAAK,CAAC,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC,CAAC,YAAK,EACvG,YAAW,WAAW,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,aAAK,EACpD,SAAS,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,KAC9C,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CA6DvD,CAAC"}
1
+ {"version":3,"file":"find.d.ts","sourceRoot":"","sources":["../../src/ops/find.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,IAAI,EACJ,WAAW,EAEZ,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAO/C,eAAO,MAAM,IAAI,GACf,CAAC,SAAS,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EACrC,CAAC,SAAS,MAAM,EAChB,EAAE,SAAS,MAAM,GAAG,KAAK,EACzB,EAAE,SAAS,MAAM,GAAG,KAAK,EACzB,EAAE,SAAS,MAAM,GAAG,KAAK,EACzB,EAAE,SAAS,MAAM,GAAG,KAAK,EACzB,EAAE,SAAS,MAAM,GAAG,KAAK,EAEzB,QAAQ,MAAM,EACd,QAAQ,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,KAAK,CAAC,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC,CAAC,YAAK,EACvG,YAAW,WAAW,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,aAAK,EACpD,SAAS,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,KAC9C,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAoEvD,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"findOne.d.ts","sourceRoot":"","sources":["../../src/ops/findOne.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,IAAI,EACJ,WAAW,EAEZ,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAM/C,eAAO,MAAM,OAAO,GAClB,CAAC,SAAS,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EACrC,CAAC,SAAS,MAAM,EAChB,EAAE,SAAS,MAAM,GAAG,KAAK,EACzB,EAAE,SAAS,MAAM,GAAG,KAAK,EACzB,EAAE,SAAS,MAAM,GAAG,KAAK,EACzB,EAAE,SAAS,MAAM,GAAG,KAAK,EACzB,EAAE,SAAS,MAAM,GAAG,KAAK,EAEzB,QAAQ,MAAM,EACd,cAAc,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,KAAK,CAAC,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC,CAAC,YAAK,EAC7G,YAAW,WAAW,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,aAAK,EACpD,SAAS,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,KAC9C,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CA8CrD,CAAC"}
1
+ {"version":3,"file":"findOne.d.ts","sourceRoot":"","sources":["../../src/ops/findOne.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,IAAI,EACJ,WAAW,EAEZ,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAO/C,eAAO,MAAM,OAAO,GAClB,CAAC,SAAS,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EACrC,CAAC,SAAS,MAAM,EAChB,EAAE,SAAS,MAAM,GAAG,KAAK,EACzB,EAAE,SAAS,MAAM,GAAG,KAAK,EACzB,EAAE,SAAS,MAAM,GAAG,KAAK,EACzB,EAAE,SAAS,MAAM,GAAG,KAAK,EACzB,EAAE,SAAS,MAAM,GAAG,KAAK,EAEzB,QAAQ,MAAM,EACd,cAAc,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,KAAK,CAAC,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC,CAAC,YAAK,EAC7G,YAAW,WAAW,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,aAAK,EACpD,SAAS,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,KAC9C,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAqDrD,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@fjell/cache",
3
3
  "description": "Cache for Fjell",
4
- "version": "4.7.10",
4
+ "version": "4.7.13",
5
5
  "keywords": [
6
6
  "cache",
7
7
  "fjell"
@@ -36,13 +36,14 @@
36
36
  "docs:test": "cd docs && npm run test"
37
37
  },
38
38
  "dependencies": {
39
- "@fjell/client-api": "^4.4.27",
39
+ "@fjell/client-api": "^4.4.28",
40
40
  "@fjell/core": "^4.4.38",
41
41
  "@fjell/http-api": "^4.4.36",
42
42
  "@fjell/logging": "^4.4.44",
43
- "@fjell/registry": "^4.4.32",
43
+ "@fjell/registry": "^4.4.33",
44
44
  "fast-safe-stringify": "^2.1.1",
45
- "flatted": "^3.3.3"
45
+ "flatted": "^3.3.3",
46
+ "yocto-queue": "^1.2.1"
46
47
  },
47
48
  "devDependencies": {
48
49
  "@eslint/eslintrc": "^3.3.1",
package/debug-test.js DELETED
@@ -1,64 +0,0 @@
1
- import { MemoryCacheMap } from './dist/index.js';
2
-
3
- // Test data types
4
- const priKey1 = { kt: 'test', pk: '1' };
5
- const comKey1 = {
6
- kt: 'test',
7
- pk: '3',
8
- loc: [{ kt: 'container', lk: 'container1' }]
9
- };
10
-
11
- // Create cache map
12
- const cacheMap = new MemoryCacheMap(['test', 'container']);
13
-
14
- // Add test items
15
- await cacheMap.set(priKey1, { key: priKey1, id: '1', name: 'Item 1', value: 100 });
16
- await cacheMap.set(comKey1, { key: comKey1, id: '3', name: 'Item 3', value: 300 });
17
-
18
- // Set query result
19
- const queryHash = 'test_query';
20
- cacheMap.setQueryResult(queryHash, [priKey1, comKey1]);
21
-
22
- console.log('Before invalidation:');
23
- console.log('Query result exists:', await cacheMap.hasQueryResult(queryHash));
24
- console.log('priKey1 exists:', await cacheMap.includesKey(priKey1));
25
- console.log('comKey1 exists:', await cacheMap.includesKey(comKey1));
26
-
27
- // Check the query result content
28
- const queryResult = await cacheMap.getQueryResult(queryHash);
29
- console.log('Query result content:', queryResult);
30
-
31
- // Check the internal query result cache
32
- console.log('Internal query result cache keys:', Object.keys(cacheMap.queryResultCache || {}));
33
-
34
- // Invalidate location
35
- const location = [{ kt: 'container', lk: 'container1' }];
36
- console.log('\nInvalidating location:', location);
37
-
38
- // Check what keys will be invalidated
39
- const itemsInLocation = await cacheMap.allIn(location);
40
- console.log('Items in location:', itemsInLocation);
41
- const keysToInvalidate = itemsInLocation.map(item => item.key);
42
- console.log('Keys to invalidate:', keysToInvalidate);
43
-
44
- await cacheMap.invalidateLocation(location);
45
-
46
- console.log('\nAfter invalidation:');
47
- console.log('Query result exists:', await cacheMap.hasQueryResult(queryHash));
48
- console.log('priKey1 exists:', await cacheMap.includesKey(priKey1));
49
- console.log('comKey1 exists:', await cacheMap.includesKey(comKey1));
50
-
51
- // Check what keys were actually invalidated
52
- console.log('\nAll keys after invalidation:', await cacheMap.keys());
53
-
54
- // Check if the query result was modified
55
- const queryResultAfter = await cacheMap.getQueryResult(queryHash);
56
- console.log('Query result content after:', queryResultAfter);
57
-
58
- // Check the internal query result cache again
59
- console.log('Internal query result cache keys after:', Object.keys(cacheMap.queryResultCache || {}));
60
-
61
- // Try to manually delete the query result to see if that works
62
- console.log('\nManually deleting query result...');
63
- await cacheMap.deleteQueryResult(queryHash);
64
- console.log('Query result exists after manual deletion:', await cacheMap.hasQueryResult(queryHash));