@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 +80 -6
- package/dist/ops/allAction.d.ts.map +1 -1
- package/dist/ops/find.d.ts.map +1 -1
- package/dist/ops/findOne.d.ts.map +1 -1
- package/package.json +5 -4
- package/debug-test.js +0 -64
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;
|
|
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"}
|
package/dist/ops/find.d.ts.map
CHANGED
|
@@ -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;
|
|
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;
|
|
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.
|
|
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.
|
|
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.
|
|
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));
|