@fjell/cache 4.7.10 → 4.7.11
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 +110 -4
- 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 +3 -3
- 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,7 +1078,7 @@ 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
1084
|
logger12.debug("Generated query hash for find", { queryHash });
|
|
@@ -1033,6 +1103,22 @@ var find = async (finder, params = {}, locations = [], context) => {
|
|
|
1033
1103
|
cacheMap.deleteQueryResult(queryHash);
|
|
1034
1104
|
}
|
|
1035
1105
|
}
|
|
1106
|
+
if (!cachedItemKeys) {
|
|
1107
|
+
try {
|
|
1108
|
+
const directCachedItems = await cacheMap.queryIn(params, locations);
|
|
1109
|
+
if (directCachedItems && directCachedItems.length > 0) {
|
|
1110
|
+
logger12.debug("Found items directly in cache, skipping API call", { itemCount: directCachedItems.length });
|
|
1111
|
+
const itemKeys2 = directCachedItems.map((item) => item.key);
|
|
1112
|
+
await cacheMap.setQueryResult(queryHash, itemKeys2);
|
|
1113
|
+
logger12.debug("Cached query result from direct cache hit", { queryHash, itemKeyCount: itemKeys2.length });
|
|
1114
|
+
const event2 = CacheEventFactory.createQueryEvent(params, locations, directCachedItems);
|
|
1115
|
+
eventEmitter.emit(event2);
|
|
1116
|
+
return [context, validatePK9(directCachedItems, pkType)];
|
|
1117
|
+
}
|
|
1118
|
+
} catch (error) {
|
|
1119
|
+
logger12.debug("Error querying cache directly, proceeding to API", { error });
|
|
1120
|
+
}
|
|
1121
|
+
}
|
|
1036
1122
|
const ret = await api.find(finder, params, locations);
|
|
1037
1123
|
for (const v of ret) {
|
|
1038
1124
|
await cacheMap.set(v.key, v);
|
|
@@ -1047,6 +1133,8 @@ var find = async (finder, params = {}, locations = [], context) => {
|
|
|
1047
1133
|
const itemKeys = ret.map((item) => item.key);
|
|
1048
1134
|
cacheMap.setQueryResult(queryHash, itemKeys);
|
|
1049
1135
|
logger12.debug("Cached query result", { queryHash, itemKeyCount: itemKeys.length });
|
|
1136
|
+
const event = CacheEventFactory.createQueryEvent(params, locations, ret);
|
|
1137
|
+
eventEmitter.emit(event);
|
|
1050
1138
|
return [context, validatePK9(ret, pkType)];
|
|
1051
1139
|
};
|
|
1052
1140
|
|
|
@@ -1056,7 +1144,7 @@ import {
|
|
|
1056
1144
|
} from "@fjell/core";
|
|
1057
1145
|
var logger13 = logger_default.get("findOne");
|
|
1058
1146
|
var findOne = async (finder, finderParams = {}, locations = [], context) => {
|
|
1059
|
-
const { api, cacheMap, pkType, ttlManager } = context;
|
|
1147
|
+
const { api, cacheMap, pkType, ttlManager, eventEmitter } = context;
|
|
1060
1148
|
logger13.default("findOne", { finder, finderParams, locations });
|
|
1061
1149
|
const queryHash = createFinderHash(finder, finderParams, locations);
|
|
1062
1150
|
logger13.debug("Generated query hash for findOne", { queryHash });
|
|
@@ -1071,6 +1159,22 @@ var findOne = async (finder, finderParams = {}, locations = [], context) => {
|
|
|
1071
1159
|
cacheMap.deleteQueryResult(queryHash);
|
|
1072
1160
|
}
|
|
1073
1161
|
}
|
|
1162
|
+
if (!cachedItemKeys || cachedItemKeys.length === 0) {
|
|
1163
|
+
try {
|
|
1164
|
+
const directCachedItems = await cacheMap.queryIn(finderParams, locations);
|
|
1165
|
+
if (directCachedItems && directCachedItems.length > 0) {
|
|
1166
|
+
logger13.debug("Found items directly in cache, skipping API call", { itemCount: directCachedItems.length });
|
|
1167
|
+
const firstItem = directCachedItems[0];
|
|
1168
|
+
await cacheMap.setQueryResult(queryHash, [firstItem.key]);
|
|
1169
|
+
logger13.debug("Cached query result from direct cache hit", { queryHash, itemKey: firstItem.key });
|
|
1170
|
+
const event2 = CacheEventFactory.createQueryEvent(finderParams, locations, [firstItem]);
|
|
1171
|
+
eventEmitter.emit(event2);
|
|
1172
|
+
return [context, validatePK10(firstItem, pkType)];
|
|
1173
|
+
}
|
|
1174
|
+
} catch (error) {
|
|
1175
|
+
logger13.debug("Error querying cache directly, proceeding to API", { error });
|
|
1176
|
+
}
|
|
1177
|
+
}
|
|
1074
1178
|
const ret = await api.findOne(finder, finderParams, locations);
|
|
1075
1179
|
cacheMap.set(ret.key, ret);
|
|
1076
1180
|
const keyStr = JSON.stringify(ret.key);
|
|
@@ -1082,6 +1186,8 @@ var findOne = async (finder, finderParams = {}, locations = [], context) => {
|
|
|
1082
1186
|
}
|
|
1083
1187
|
cacheMap.setQueryResult(queryHash, [ret.key]);
|
|
1084
1188
|
logger13.debug("Cached query result", { queryHash, itemKey: ret.key });
|
|
1189
|
+
const event = CacheEventFactory.createQueryEvent(finderParams, locations, [ret]);
|
|
1190
|
+
eventEmitter.emit(event);
|
|
1085
1191
|
return [context, validatePK10(ret, pkType)];
|
|
1086
1192
|
};
|
|
1087
1193
|
|
|
@@ -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,CA0FvD,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,CA2ErD,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.11",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"cache",
|
|
7
7
|
"fjell"
|
|
@@ -36,11 +36,11 @@
|
|
|
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
45
|
"flatted": "^3.3.3"
|
|
46
46
|
},
|
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));
|