@expo/entity-cache-adapter-redis 0.45.0 → 0.46.0
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/build/{GenericRedisCacher.d.ts → src/GenericRedisCacher.d.ts} +1 -1
- package/build/{GenericRedisCacher.js → src/GenericRedisCacher.js} +7 -10
- package/build/src/GenericRedisCacher.js.map +1 -0
- package/build/{RedisCacheAdapterProvider.d.ts → src/RedisCacheAdapterProvider.d.ts} +2 -2
- package/build/src/RedisCacheAdapterProvider.js +16 -0
- package/build/src/RedisCacheAdapterProvider.js.map +1 -0
- package/build/src/RedisCommon.js.map +1 -0
- package/build/src/__integration-tests__/BatchedRedisCacheAdapter-integration-test.d.ts +1 -0
- package/build/src/__integration-tests__/BatchedRedisCacheAdapter-integration-test.js +125 -0
- package/build/src/__integration-tests__/BatchedRedisCacheAdapter-integration-test.js.map +1 -0
- package/build/src/__integration-tests__/GenericRedisCacher-full-integration-test.d.ts +1 -0
- package/build/src/__integration-tests__/GenericRedisCacher-full-integration-test.js +114 -0
- package/build/src/__integration-tests__/GenericRedisCacher-full-integration-test.js.map +1 -0
- package/build/src/__integration-tests__/GenericRedisCacher-integration-test.d.ts +1 -0
- package/build/src/__integration-tests__/GenericRedisCacher-integration-test.js +93 -0
- package/build/src/__integration-tests__/GenericRedisCacher-integration-test.js.map +1 -0
- package/build/src/__integration-tests__/errors-test.d.ts +1 -0
- package/build/src/__integration-tests__/errors-test.js +43 -0
- package/build/src/__integration-tests__/errors-test.js.map +1 -0
- package/build/src/__testfixtures__/RedisTestEntity.d.ts +16 -0
- package/build/src/__testfixtures__/RedisTestEntity.js +53 -0
- package/build/src/__testfixtures__/RedisTestEntity.js.map +1 -0
- package/build/src/__testfixtures__/createRedisIntegrationTestEntityCompanionProvider.d.ts +3 -0
- package/build/src/__testfixtures__/createRedisIntegrationTestEntityCompanionProvider.js +29 -0
- package/build/src/__testfixtures__/createRedisIntegrationTestEntityCompanionProvider.js.map +1 -0
- package/build/src/__tests__/GenericRedisCacher-test.d.ts +1 -0
- package/build/src/__tests__/GenericRedisCacher-test.js +211 -0
- package/build/src/__tests__/GenericRedisCacher-test.js.map +1 -0
- package/build/src/errors/__tests__/wrapNativeRedisCallAsync-test.d.ts +1 -0
- package/build/src/errors/__tests__/wrapNativeRedisCallAsync-test.js +40 -0
- package/build/src/errors/__tests__/wrapNativeRedisCallAsync-test.js.map +1 -0
- package/build/src/errors/wrapNativeRedisCallAsync.d.ts +1 -0
- package/build/{errors → src/errors}/wrapNativeRedisCallAsync.js +1 -1
- package/build/src/errors/wrapNativeRedisCallAsync.js.map +1 -0
- package/build/src/index.d.ts +9 -0
- package/build/{index.js → src/index.js} +2 -10
- package/build/src/index.js.map +1 -0
- package/build/src/utils/__tests__/getSurroundingCacheKeyVersionsForInvalidation-test.d.ts +1 -0
- package/build/src/utils/__tests__/getSurroundingCacheKeyVersionsForInvalidation-test.js +12 -0
- package/build/src/utils/__tests__/getSurroundingCacheKeyVersionsForInvalidation-test.js.map +1 -0
- package/build/src/utils/getSurroundingCacheKeyVersionsForInvalidation.js.map +1 -0
- package/build/tsconfig.tsbuildinfo +1 -0
- package/package.json +13 -25
- package/src/GenericRedisCacher.ts +5 -7
- package/src/RedisCacheAdapterProvider.ts +4 -4
- package/src/__integration-tests__/BatchedRedisCacheAdapter-integration-test.ts +5 -3
- package/src/__integration-tests__/GenericRedisCacher-full-integration-test.ts +4 -2
- package/src/__integration-tests__/GenericRedisCacher-integration-test.ts +5 -2
- package/src/__integration-tests__/errors-test.ts +4 -2
- package/src/__testfixtures__/RedisTestEntity.ts +6 -6
- package/src/__testfixtures__/createRedisIntegrationTestEntityCompanionProvider.ts +3 -3
- package/src/__tests__/GenericRedisCacher-test.ts +4 -3
- package/src/errors/__tests__/wrapNativeRedisCallAsync-test.ts +2 -1
- package/src/errors/wrapNativeRedisCallAsync.ts +1 -1
- package/src/index.ts +2 -3
- package/src/utils/__tests__/getSurroundingCacheKeyVersionsForInvalidation-test.ts +2 -0
- package/build/GenericRedisCacher.js.map +0 -1
- package/build/RedisCacheAdapterProvider.js +0 -18
- package/build/RedisCacheAdapterProvider.js.map +0 -1
- package/build/RedisCommon.js.map +0 -1
- package/build/errors/wrapNativeRedisCallAsync.d.ts +0 -1
- package/build/errors/wrapNativeRedisCallAsync.js.map +0 -1
- package/build/index.d.ts +0 -10
- package/build/index.js.map +0 -1
- package/build/tsconfig.build.tsbuildinfo +0 -1
- package/build/utils/getSurroundingCacheKeyVersionsForInvalidation.js.map +0 -1
- /package/build/{RedisCommon.d.ts → src/RedisCommon.d.ts} +0 -0
- /package/build/{RedisCommon.js → src/RedisCommon.js} +0 -0
- /package/build/{utils → src/utils}/getSurroundingCacheKeyVersionsForInvalidation.d.ts +0 -0
- /package/build/{utils → src/utils}/getSurroundingCacheKeyVersionsForInvalidation.js +0 -0
|
@@ -79,7 +79,7 @@ export interface GenericRedisCacheContext {
|
|
|
79
79
|
*/
|
|
80
80
|
invalidationConfig: GenericRedisCacheInvalidationConfig;
|
|
81
81
|
}
|
|
82
|
-
export
|
|
82
|
+
export declare class GenericRedisCacher<TFields extends Record<string, any>, TIDField extends keyof TFields> implements IEntityGenericCacher<TFields, TIDField> {
|
|
83
83
|
private readonly context;
|
|
84
84
|
private readonly entityConfiguration;
|
|
85
85
|
constructor(context: GenericRedisCacheContext, entityConfiguration: EntityConfiguration<TFields, TIDField>);
|
|
@@ -1,12 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.RedisCacheInvalidationStrategy = void 0;
|
|
3
|
+
exports.GenericRedisCacher = exports.RedisCacheInvalidationStrategy = void 0;
|
|
7
4
|
const entity_1 = require("@expo/entity");
|
|
8
5
|
const RedisCommon_1 = require("./RedisCommon");
|
|
9
|
-
const wrapNativeRedisCallAsync_1 =
|
|
6
|
+
const wrapNativeRedisCallAsync_1 = require("./errors/wrapNativeRedisCallAsync");
|
|
10
7
|
const getSurroundingCacheKeyVersionsForInvalidation_1 = require("./utils/getSurroundingCacheKeyVersionsForInvalidation");
|
|
11
8
|
// Sentinel value we store in Redis to negatively cache a database miss.
|
|
12
9
|
// The sentinel value is distinct from any (positively) cached value.
|
|
@@ -44,7 +41,7 @@ class GenericRedisCacher {
|
|
|
44
41
|
if (keys.length === 0) {
|
|
45
42
|
return new Map();
|
|
46
43
|
}
|
|
47
|
-
const redisResults = await (0, wrapNativeRedisCallAsync_1.
|
|
44
|
+
const redisResults = await (0, wrapNativeRedisCallAsync_1.wrapNativeRedisCallAsync)(() => this.context.redisClient.mget(...keys));
|
|
48
45
|
const results = new Map();
|
|
49
46
|
for (let i = 0; i < keys.length; i++) {
|
|
50
47
|
const key = keys[i];
|
|
@@ -76,7 +73,7 @@ class GenericRedisCacher {
|
|
|
76
73
|
objectMap.forEach((object, key) => {
|
|
77
74
|
redisTransaction = redisTransaction.set(key, JSON.stringify((0, entity_1.transformFieldsToCacheObject)(this.entityConfiguration, RedisCommon_1.redisTransformerMap, object)), 'EX', this.context.ttlSecondsPositive);
|
|
78
75
|
});
|
|
79
|
-
await (0, wrapNativeRedisCallAsync_1.
|
|
76
|
+
await (0, wrapNativeRedisCallAsync_1.wrapNativeRedisCallAsync)(() => redisTransaction.exec());
|
|
80
77
|
}
|
|
81
78
|
async cacheDBMissesAsync(keys) {
|
|
82
79
|
if (keys.length === 0) {
|
|
@@ -86,13 +83,13 @@ class GenericRedisCacher {
|
|
|
86
83
|
keys.forEach((key) => {
|
|
87
84
|
redisTransaction = redisTransaction.set(key, DOES_NOT_EXIST_REDIS, 'EX', this.context.ttlSecondsNegative);
|
|
88
85
|
});
|
|
89
|
-
await (0, wrapNativeRedisCallAsync_1.
|
|
86
|
+
await (0, wrapNativeRedisCallAsync_1.wrapNativeRedisCallAsync)(() => redisTransaction.exec());
|
|
90
87
|
}
|
|
91
88
|
async invalidateManyAsync(keys) {
|
|
92
89
|
if (keys.length === 0) {
|
|
93
90
|
return;
|
|
94
91
|
}
|
|
95
|
-
await (0, wrapNativeRedisCallAsync_1.
|
|
92
|
+
await (0, wrapNativeRedisCallAsync_1.wrapNativeRedisCallAsync)(() => this.context.redisClient.del(...keys));
|
|
96
93
|
}
|
|
97
94
|
makeCacheKeyForCacheKeyVersion(key, value, cacheKeyVersion) {
|
|
98
95
|
const cacheKeyType = key.getLoadMethodType();
|
|
@@ -117,5 +114,5 @@ class GenericRedisCacher {
|
|
|
117
114
|
}
|
|
118
115
|
}
|
|
119
116
|
}
|
|
120
|
-
exports.
|
|
117
|
+
exports.GenericRedisCacher = GenericRedisCacher;
|
|
121
118
|
//# sourceMappingURL=GenericRedisCacher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GenericRedisCacher.js","sourceRoot":"","sources":["../../src/GenericRedisCacher.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { EntityConfiguration, IEntityCacheAdapter, IEntityCacheAdapterProvider } from '@expo/entity';
|
|
2
2
|
import { GenericRedisCacheContext } from './GenericRedisCacher';
|
|
3
|
-
export
|
|
3
|
+
export declare class RedisCacheAdapterProvider implements IEntityCacheAdapterProvider {
|
|
4
4
|
private readonly context;
|
|
5
5
|
constructor(context: GenericRedisCacheContext);
|
|
6
6
|
getCacheAdapter<TFields extends Record<string, any>, TIDField extends keyof TFields>(entityConfiguration: EntityConfiguration<TFields, TIDField>): IEntityCacheAdapter<TFields, TIDField>;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RedisCacheAdapterProvider = void 0;
|
|
4
|
+
const entity_1 = require("@expo/entity");
|
|
5
|
+
const GenericRedisCacher_1 = require("./GenericRedisCacher");
|
|
6
|
+
class RedisCacheAdapterProvider {
|
|
7
|
+
context;
|
|
8
|
+
constructor(context) {
|
|
9
|
+
this.context = context;
|
|
10
|
+
}
|
|
11
|
+
getCacheAdapter(entityConfiguration) {
|
|
12
|
+
return new entity_1.GenericEntityCacheAdapter(new GenericRedisCacher_1.GenericRedisCacher(this.context, entityConfiguration));
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
exports.RedisCacheAdapterProvider = RedisCacheAdapterProvider;
|
|
16
|
+
//# sourceMappingURL=RedisCacheAdapterProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RedisCacheAdapterProvider.js","sourceRoot":"","sources":["../../src/RedisCacheAdapterProvider.ts"],"names":[],"mappings":";;;AAAA,yCAKsB;AAEtB,6DAAoF;AAEpF,MAAa,yBAAyB;IACP;IAA7B,YAA6B,OAAiC;QAAjC,YAAO,GAAP,OAAO,CAA0B;IAAG,CAAC;IAElE,eAAe,CACb,mBAA2D;QAE3D,OAAO,IAAI,kCAAyB,CAAC,IAAI,uCAAkB,CAAC,IAAI,CAAC,OAAO,EAAE,mBAAmB,CAAC,CAAC,CAAC;IAClG,CAAC;CACF;AARD,8DAQC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RedisCommon.js","sourceRoot":"","sources":["../../src/RedisCommon.ts"],"names":[],"mappings":";;;AAAA,yCAAyC;AAE5B,QAAA,mBAAmB,GAAG,IAAI,GAAG,CAAC;IACzC;QACE,kBAAS,CAAC,IAAI;QACd;YACE;;;;;;;;;;;;;eAaG;YACH,KAAK,EAAE,CAAC,GAAS,EAAE,EAAE,CAAC,GAAG,EAAE,WAAW,EAAE,IAAI,IAAI;YAChD,IAAI,EAAE,CAAC,GAAQ,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;SAChD;KACF;CACF,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const batcher_1 = require("@expo/batcher");
|
|
7
|
+
const entity_1 = require("@expo/entity");
|
|
8
|
+
const globals_1 = require("@jest/globals");
|
|
9
|
+
const invariant_1 = __importDefault(require("invariant"));
|
|
10
|
+
const ioredis_1 = __importDefault(require("ioredis"));
|
|
11
|
+
const nullthrows_1 = __importDefault(require("nullthrows"));
|
|
12
|
+
const url_1 = require("url");
|
|
13
|
+
const uuid_1 = require("uuid");
|
|
14
|
+
const GenericRedisCacher_1 = require("../GenericRedisCacher");
|
|
15
|
+
const RedisTestEntity_1 = require("../__testfixtures__/RedisTestEntity");
|
|
16
|
+
const createRedisIntegrationTestEntityCompanionProvider_1 = require("../__testfixtures__/createRedisIntegrationTestEntityCompanionProvider");
|
|
17
|
+
class BatchedRedis {
|
|
18
|
+
redis;
|
|
19
|
+
mgetBatcher = new batcher_1.Batcher(this.batchMgetAsync.bind(this), {
|
|
20
|
+
maxBatchInterval: 0,
|
|
21
|
+
});
|
|
22
|
+
constructor(redis) {
|
|
23
|
+
this.redis = redis;
|
|
24
|
+
}
|
|
25
|
+
async batchMgetAsync(keySets) {
|
|
26
|
+
// ordered distinct keys to fetch
|
|
27
|
+
const allKeysToFetch = [...new Set(keySets.flat())];
|
|
28
|
+
// fetch the distinct keys
|
|
29
|
+
const allResults = await this.redis.mget(...allKeysToFetch);
|
|
30
|
+
// put them into a map for fast lookup
|
|
31
|
+
const keysToResults = (0, entity_1.zipToMap)(allKeysToFetch, allResults);
|
|
32
|
+
// re-associate them with original key sets
|
|
33
|
+
return keySets.map((keySet) => keySet.map((key) => {
|
|
34
|
+
const result = keysToResults.get(key);
|
|
35
|
+
(0, invariant_1.default)(result !== undefined, 'result should not be undefined');
|
|
36
|
+
return result;
|
|
37
|
+
}));
|
|
38
|
+
}
|
|
39
|
+
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
40
|
+
async mget(...args) {
|
|
41
|
+
return await this.mgetBatcher.batchAsync(args);
|
|
42
|
+
}
|
|
43
|
+
multi() {
|
|
44
|
+
return this.redis.multi();
|
|
45
|
+
}
|
|
46
|
+
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
47
|
+
async del(...args) {
|
|
48
|
+
await this.redis.del(...args);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
(0, globals_1.describe)(GenericRedisCacher_1.GenericRedisCacher, () => {
|
|
52
|
+
const redis = new ioredis_1.default(new url_1.URL(process.env['REDIS_URL']).toString());
|
|
53
|
+
const redisClient = new BatchedRedis(redis);
|
|
54
|
+
let genericRedisCacheContext;
|
|
55
|
+
(0, globals_1.beforeAll)(() => {
|
|
56
|
+
genericRedisCacheContext = {
|
|
57
|
+
redisClient,
|
|
58
|
+
makeKeyFn(...parts) {
|
|
59
|
+
const delimiter = ':';
|
|
60
|
+
const escapedParts = parts.map((part) => part.replace('\\', '\\\\').replace(delimiter, `\\${delimiter}`));
|
|
61
|
+
return escapedParts.join(delimiter);
|
|
62
|
+
},
|
|
63
|
+
cacheKeyPrefix: 'test-',
|
|
64
|
+
ttlSecondsPositive: 86400, // 1 day
|
|
65
|
+
ttlSecondsNegative: 600, // 10 minutes
|
|
66
|
+
invalidationConfig: {
|
|
67
|
+
invalidationStrategy: GenericRedisCacher_1.RedisCacheInvalidationStrategy.CURRENT_CACHE_KEY_VERSION,
|
|
68
|
+
},
|
|
69
|
+
};
|
|
70
|
+
});
|
|
71
|
+
(0, globals_1.beforeEach)(async () => {
|
|
72
|
+
await redis.flushdb();
|
|
73
|
+
});
|
|
74
|
+
(0, globals_1.afterAll)(async () => {
|
|
75
|
+
redis.disconnect();
|
|
76
|
+
});
|
|
77
|
+
(0, globals_1.it)('has correct caching behavior', async () => {
|
|
78
|
+
// simulate two requests
|
|
79
|
+
const viewerContext = new entity_1.ViewerContext((0, createRedisIntegrationTestEntityCompanionProvider_1.createRedisIntegrationTestEntityCompanionProvider)(genericRedisCacheContext));
|
|
80
|
+
const mgetSpy = globals_1.jest.spyOn(redis, 'mget');
|
|
81
|
+
const genericCacher = viewerContext.entityCompanionProvider.getCompanionForEntity(RedisTestEntity_1.RedisTestEntity)['tableDataCoordinator']['cacheAdapter']['genericCacher'];
|
|
82
|
+
const entity1Created = await RedisTestEntity_1.RedisTestEntity.creator(viewerContext)
|
|
83
|
+
.setField('name', 'blah')
|
|
84
|
+
.createAsync();
|
|
85
|
+
// loading an entity should put it in cache. load by multiple requests and multiple fields in same tick to ensure batch works
|
|
86
|
+
mgetSpy.mockClear();
|
|
87
|
+
const viewerContext1 = new entity_1.ViewerContext((0, createRedisIntegrationTestEntityCompanionProvider_1.createRedisIntegrationTestEntityCompanionProvider)(genericRedisCacheContext));
|
|
88
|
+
const viewerContext2 = new entity_1.ViewerContext((0, createRedisIntegrationTestEntityCompanionProvider_1.createRedisIntegrationTestEntityCompanionProvider)(genericRedisCacheContext));
|
|
89
|
+
const viewerContext3 = new entity_1.ViewerContext((0, createRedisIntegrationTestEntityCompanionProvider_1.createRedisIntegrationTestEntityCompanionProvider)(genericRedisCacheContext));
|
|
90
|
+
const [entity1, entity2, entity3] = await Promise.all([
|
|
91
|
+
RedisTestEntity_1.RedisTestEntity.loader(viewerContext1).loadByIDAsync(entity1Created.getID()),
|
|
92
|
+
RedisTestEntity_1.RedisTestEntity.loader(viewerContext2).loadByIDAsync(entity1Created.getID()),
|
|
93
|
+
RedisTestEntity_1.RedisTestEntity.loader(viewerContext3).loadByFieldEqualingAsync('name', entity1Created.getField('name')),
|
|
94
|
+
]);
|
|
95
|
+
(0, globals_1.expect)(mgetSpy).toHaveBeenCalledTimes(1);
|
|
96
|
+
(0, globals_1.expect)(mgetSpy.mock.calls[0]).toHaveLength(2); // should dedupe the first two loads
|
|
97
|
+
(0, globals_1.expect)(entity1.getID()).toEqual(entity2.getID());
|
|
98
|
+
(0, globals_1.expect)(entity2.getID()).toEqual((0, nullthrows_1.default)(entity3).getID());
|
|
99
|
+
const cacheKeyEntity1 = genericCacher.makeCacheKeyForStorage(new entity_1.SingleFieldHolder('id'), new entity_1.SingleFieldValueHolder(entity1Created.getID()));
|
|
100
|
+
const cachedJSON = await redis.get(cacheKeyEntity1);
|
|
101
|
+
const cachedValue = JSON.parse(cachedJSON);
|
|
102
|
+
(0, globals_1.expect)(cachedValue).toMatchObject({
|
|
103
|
+
id: entity1.getID(),
|
|
104
|
+
name: 'blah',
|
|
105
|
+
});
|
|
106
|
+
const cacheKeyEntity1NameField = genericCacher.makeCacheKeyForStorage(new entity_1.SingleFieldHolder('name'), new entity_1.SingleFieldValueHolder(entity1Created.getField('name')));
|
|
107
|
+
await RedisTestEntity_1.RedisTestEntity.loader(viewerContext).loadByFieldEqualingAsync('name', entity1Created.getField('name'));
|
|
108
|
+
await (0, globals_1.expect)(redis.get(cacheKeyEntity1NameField)).resolves.toEqual(cachedJSON);
|
|
109
|
+
// simulate non existent db fetch, should write negative result ('') to cache
|
|
110
|
+
const nonExistentId = (0, uuid_1.v4)();
|
|
111
|
+
const entityNonExistentResult = await RedisTestEntity_1.RedisTestEntity.loaderWithAuthorizationResults(viewerContext).loadByIDAsync(nonExistentId);
|
|
112
|
+
(0, globals_1.expect)(entityNonExistentResult.ok).toBe(false);
|
|
113
|
+
const cacheKeyNonExistent = genericCacher.makeCacheKeyForStorage(new entity_1.SingleFieldHolder('id'), new entity_1.SingleFieldValueHolder(nonExistentId));
|
|
114
|
+
const nonExistentCachedValue = await redis.get(cacheKeyNonExistent);
|
|
115
|
+
(0, globals_1.expect)(nonExistentCachedValue).toEqual('');
|
|
116
|
+
// load again through entities framework to ensure it reads negative result
|
|
117
|
+
const entityNonExistentResult2 = await RedisTestEntity_1.RedisTestEntity.loaderWithAuthorizationResults(viewerContext).loadByIDAsync(nonExistentId);
|
|
118
|
+
(0, globals_1.expect)(entityNonExistentResult2.ok).toBe(false);
|
|
119
|
+
// invalidate from cache to ensure it invalidates correctly in both caches
|
|
120
|
+
await RedisTestEntity_1.RedisTestEntity.loaderUtils(viewerContext).invalidateFieldsAsync(entity1.getAllFields());
|
|
121
|
+
await (0, globals_1.expect)(redis.get(cacheKeyEntity1)).resolves.toBeNull();
|
|
122
|
+
await (0, globals_1.expect)(redis.get(cacheKeyEntity1NameField)).resolves.toBeNull();
|
|
123
|
+
});
|
|
124
|
+
});
|
|
125
|
+
//# sourceMappingURL=BatchedRedisCacheAdapter-integration-test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BatchedRedisCacheAdapter-integration-test.js","sourceRoot":"","sources":["../../../src/__integration-tests__/BatchedRedisCacheAdapter-integration-test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const entity_1 = require("@expo/entity");
|
|
7
|
+
const results_1 = require("@expo/results");
|
|
8
|
+
const globals_1 = require("@jest/globals");
|
|
9
|
+
const ioredis_1 = __importDefault(require("ioredis"));
|
|
10
|
+
const url_1 = require("url");
|
|
11
|
+
const uuid_1 = require("uuid");
|
|
12
|
+
const GenericRedisCacher_1 = require("../GenericRedisCacher");
|
|
13
|
+
const RedisTestEntity_1 = require("../__testfixtures__/RedisTestEntity");
|
|
14
|
+
const createRedisIntegrationTestEntityCompanionProvider_1 = require("../__testfixtures__/createRedisIntegrationTestEntityCompanionProvider");
|
|
15
|
+
class TestViewerContext extends entity_1.ViewerContext {
|
|
16
|
+
}
|
|
17
|
+
(0, globals_1.describe)(GenericRedisCacher_1.GenericRedisCacher, () => {
|
|
18
|
+
let genericRedisCacheContext;
|
|
19
|
+
(0, globals_1.beforeAll)(() => {
|
|
20
|
+
genericRedisCacheContext = {
|
|
21
|
+
redisClient: new ioredis_1.default(new url_1.URL(process.env['REDIS_URL']).toString()),
|
|
22
|
+
makeKeyFn(...parts) {
|
|
23
|
+
const delimiter = ':';
|
|
24
|
+
const escapedParts = parts.map((part) => part.replace('\\', '\\\\').replace(delimiter, `\\${delimiter}`));
|
|
25
|
+
return escapedParts.join(delimiter);
|
|
26
|
+
},
|
|
27
|
+
cacheKeyPrefix: 'test-',
|
|
28
|
+
ttlSecondsPositive: 86400, // 1 day
|
|
29
|
+
ttlSecondsNegative: 600, // 10 minutes
|
|
30
|
+
invalidationConfig: {
|
|
31
|
+
invalidationStrategy: GenericRedisCacher_1.RedisCacheInvalidationStrategy.CURRENT_CACHE_KEY_VERSION,
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
});
|
|
35
|
+
(0, globals_1.beforeEach)(async () => {
|
|
36
|
+
await genericRedisCacheContext.redisClient.flushdb();
|
|
37
|
+
});
|
|
38
|
+
(0, globals_1.afterAll)(async () => {
|
|
39
|
+
genericRedisCacheContext.redisClient.disconnect();
|
|
40
|
+
});
|
|
41
|
+
(0, globals_1.it)('has correct caching behavior', async () => {
|
|
42
|
+
const viewerContext = new TestViewerContext((0, createRedisIntegrationTestEntityCompanionProvider_1.createRedisIntegrationTestEntityCompanionProvider)(genericRedisCacheContext));
|
|
43
|
+
const genericCacher = viewerContext.entityCompanionProvider.getCompanionForEntity(RedisTestEntity_1.RedisTestEntity)['tableDataCoordinator']['cacheAdapter']['genericCacher'];
|
|
44
|
+
const entity1Created = await RedisTestEntity_1.RedisTestEntity.creator(viewerContext)
|
|
45
|
+
.setField('name', 'blah')
|
|
46
|
+
.createAsync();
|
|
47
|
+
// loading an entity should put it in cache
|
|
48
|
+
const entity1 = await RedisTestEntity_1.RedisTestEntity.loader(viewerContext).loadByIDAsync(entity1Created.getID());
|
|
49
|
+
const cachedSingleJSON = await genericRedisCacheContext.redisClient.get(genericCacher.makeCacheKeyForStorage(new entity_1.SingleFieldHolder('id'), new entity_1.SingleFieldValueHolder(entity1.getID())));
|
|
50
|
+
const cachedSingleValue = JSON.parse(cachedSingleJSON);
|
|
51
|
+
(0, globals_1.expect)(cachedSingleValue).toMatchObject({
|
|
52
|
+
id: entity1.getID(),
|
|
53
|
+
name: 'blah',
|
|
54
|
+
});
|
|
55
|
+
// loading an entity by composite field should put it in cache
|
|
56
|
+
const entity2 = await RedisTestEntity_1.RedisTestEntity.loader(viewerContext).loadByCompositeFieldEqualingAsync(['name', 'id'], { name: 'blah', id: entity1.getID() });
|
|
57
|
+
const cachedCompositeJSON = await genericRedisCacheContext.redisClient.get(genericCacher.makeCacheKeyForStorage(new entity_1.CompositeFieldHolder(['id', 'name']), new entity_1.CompositeFieldValueHolder({ id: entity2.getID(), name: 'blah' })));
|
|
58
|
+
const cachedCompositeValue = JSON.parse(cachedCompositeJSON);
|
|
59
|
+
(0, globals_1.expect)(cachedCompositeValue).toMatchObject({
|
|
60
|
+
id: entity2.getID(),
|
|
61
|
+
name: 'blah',
|
|
62
|
+
});
|
|
63
|
+
// simulate non existent db fetch, should write negative result ('') to cache
|
|
64
|
+
const nonExistentId = (0, uuid_1.v4)();
|
|
65
|
+
const entityNonExistentResult = await RedisTestEntity_1.RedisTestEntity.loaderWithAuthorizationResults(viewerContext).loadByIDAsync(nonExistentId);
|
|
66
|
+
(0, globals_1.expect)(entityNonExistentResult.ok).toBe(false);
|
|
67
|
+
const nonExistentCachedValue = await genericRedisCacheContext.redisClient.get(genericCacher.makeCacheKeyForStorage(new entity_1.SingleFieldHolder('id'), new entity_1.SingleFieldValueHolder(nonExistentId)));
|
|
68
|
+
(0, globals_1.expect)(nonExistentCachedValue).toEqual('');
|
|
69
|
+
const entityNonExistentCompositeResult = await RedisTestEntity_1.RedisTestEntity.loader(viewerContext).loadByCompositeFieldEqualingAsync(['name', 'id'], { name: 'blah', id: nonExistentId });
|
|
70
|
+
(0, globals_1.expect)(entityNonExistentCompositeResult).toBe(null);
|
|
71
|
+
const nonExistentCompositeCachedValue = await genericRedisCacheContext.redisClient.get(genericCacher.makeCacheKeyForStorage(new entity_1.CompositeFieldHolder(['id', 'name']), new entity_1.CompositeFieldValueHolder({ id: nonExistentId, name: 'blah' })));
|
|
72
|
+
(0, globals_1.expect)(nonExistentCompositeCachedValue).toEqual('');
|
|
73
|
+
// load again through entities framework to ensure it reads negative result
|
|
74
|
+
const entityNonExistentResult2 = await RedisTestEntity_1.RedisTestEntity.loaderWithAuthorizationResults(viewerContext).loadByIDAsync(nonExistentId);
|
|
75
|
+
(0, globals_1.expect)(entityNonExistentResult2.ok).toBe(false);
|
|
76
|
+
const entityNonExistentCompositeResult2 = await RedisTestEntity_1.RedisTestEntity.loader(viewerContext).loadByCompositeFieldEqualingAsync(['name', 'id'], { name: 'blah', id: nonExistentId });
|
|
77
|
+
(0, globals_1.expect)(entityNonExistentCompositeResult2).toBe(null);
|
|
78
|
+
// invalidate from cache to ensure it invalidates correctly
|
|
79
|
+
await RedisTestEntity_1.RedisTestEntity.loaderUtils(viewerContext).invalidateFieldsAsync(entity1.getAllFields());
|
|
80
|
+
const cachedValueNullKeys = genericCacher.makeCacheKeysForInvalidation(new entity_1.SingleFieldHolder('id'), new entity_1.SingleFieldValueHolder(entity1.getID()));
|
|
81
|
+
const cachedValueNull = await genericRedisCacheContext.redisClient.mget(...cachedValueNullKeys);
|
|
82
|
+
(0, globals_1.expect)(cachedValueNull.every((c) => c === null)).toBe(true);
|
|
83
|
+
const cachedValueNullCompositeKeys = genericCacher.makeCacheKeysForInvalidation(new entity_1.CompositeFieldHolder(['id', 'name']), new entity_1.CompositeFieldValueHolder({ id: entity1.getID(), name: 'blah' }));
|
|
84
|
+
const cachedValueNullComposite = await genericRedisCacheContext.redisClient.mget(...cachedValueNullCompositeKeys);
|
|
85
|
+
(0, globals_1.expect)(cachedValueNullComposite.every((c) => c === null)).toBe(true);
|
|
86
|
+
});
|
|
87
|
+
(0, globals_1.it)('caches and restores date fields', async () => {
|
|
88
|
+
const viewerContext = new TestViewerContext((0, createRedisIntegrationTestEntityCompanionProvider_1.createRedisIntegrationTestEntityCompanionProvider)(genericRedisCacheContext));
|
|
89
|
+
const date = new Date();
|
|
90
|
+
const entity1 = await (0, results_1.enforceAsyncResult)(RedisTestEntity_1.RedisTestEntity.creatorWithAuthorizationResults(viewerContext)
|
|
91
|
+
.setField('dateField', date)
|
|
92
|
+
.createAsync());
|
|
93
|
+
(0, globals_1.expect)(entity1.getField('dateField')).toEqual(date);
|
|
94
|
+
const entity2 = await RedisTestEntity_1.RedisTestEntity.loader(viewerContext).loadByIDAsync(entity1.getID());
|
|
95
|
+
(0, globals_1.expect)(entity2.getField('dateField')).toEqual(date);
|
|
96
|
+
// simulate new request
|
|
97
|
+
const vc2 = new TestViewerContext((0, createRedisIntegrationTestEntityCompanionProvider_1.createRedisIntegrationTestEntityCompanionProvider)(genericRedisCacheContext));
|
|
98
|
+
const entity3 = await RedisTestEntity_1.RedisTestEntity.loader(vc2).loadByIDAsync(entity1.getID());
|
|
99
|
+
(0, globals_1.expect)(entity3.getField('dateField')).toEqual(date);
|
|
100
|
+
});
|
|
101
|
+
(0, globals_1.it)('caches and restores empty string field keys', async () => {
|
|
102
|
+
const viewerContext = new TestViewerContext((0, createRedisIntegrationTestEntityCompanionProvider_1.createRedisIntegrationTestEntityCompanionProvider)(genericRedisCacheContext));
|
|
103
|
+
const entity1 = await (0, results_1.enforceAsyncResult)(RedisTestEntity_1.RedisTestEntity.creatorWithAuthorizationResults(viewerContext)
|
|
104
|
+
.setField('name', '')
|
|
105
|
+
.createAsync());
|
|
106
|
+
const entity2 = await RedisTestEntity_1.RedisTestEntity.loader(viewerContext).loadByFieldEqualingAsync('name', '');
|
|
107
|
+
(0, globals_1.expect)(entity2?.getID()).toEqual(entity1.getID());
|
|
108
|
+
// simulate new request
|
|
109
|
+
const vc2 = new TestViewerContext((0, createRedisIntegrationTestEntityCompanionProvider_1.createRedisIntegrationTestEntityCompanionProvider)(genericRedisCacheContext));
|
|
110
|
+
const entity3 = await RedisTestEntity_1.RedisTestEntity.loader(vc2).loadByFieldEqualingAsync('name', '');
|
|
111
|
+
(0, globals_1.expect)(entity3?.getID()).toEqual(entity1.getID());
|
|
112
|
+
});
|
|
113
|
+
});
|
|
114
|
+
//# sourceMappingURL=GenericRedisCacher-full-integration-test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GenericRedisCacher-full-integration-test.js","sourceRoot":"","sources":["../../../src/__integration-tests__/GenericRedisCacher-full-integration-test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const entity_1 = require("@expo/entity");
|
|
7
|
+
const globals_1 = require("@jest/globals");
|
|
8
|
+
const ioredis_1 = __importDefault(require("ioredis"));
|
|
9
|
+
const url_1 = require("url");
|
|
10
|
+
const GenericRedisCacher_1 = require("../GenericRedisCacher");
|
|
11
|
+
const RedisTestEntity_1 = require("../__testfixtures__/RedisTestEntity");
|
|
12
|
+
const createRedisIntegrationTestEntityCompanionProvider_1 = require("../__testfixtures__/createRedisIntegrationTestEntityCompanionProvider");
|
|
13
|
+
class TestViewerContext extends entity_1.ViewerContext {
|
|
14
|
+
}
|
|
15
|
+
(0, globals_1.describe)(GenericRedisCacher_1.GenericRedisCacher, () => {
|
|
16
|
+
let genericRedisCacheContext;
|
|
17
|
+
(0, globals_1.beforeAll)(() => {
|
|
18
|
+
genericRedisCacheContext = {
|
|
19
|
+
redisClient: new ioredis_1.default(new url_1.URL(process.env['REDIS_URL']).toString()),
|
|
20
|
+
makeKeyFn(...parts) {
|
|
21
|
+
const delimiter = ':';
|
|
22
|
+
const escapedParts = parts.map((part) => part.replace('\\', '\\\\').replace(delimiter, `\\${delimiter}`));
|
|
23
|
+
return escapedParts.join(delimiter);
|
|
24
|
+
},
|
|
25
|
+
cacheKeyPrefix: 'test-',
|
|
26
|
+
ttlSecondsPositive: 86400, // 1 day
|
|
27
|
+
ttlSecondsNegative: 600, // 10 minutes
|
|
28
|
+
invalidationConfig: {
|
|
29
|
+
invalidationStrategy: GenericRedisCacher_1.RedisCacheInvalidationStrategy.CURRENT_CACHE_KEY_VERSION,
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
});
|
|
33
|
+
(0, globals_1.beforeEach)(async () => {
|
|
34
|
+
await genericRedisCacheContext.redisClient.flushdb();
|
|
35
|
+
});
|
|
36
|
+
(0, globals_1.afterAll)(async () => {
|
|
37
|
+
genericRedisCacheContext.redisClient.disconnect();
|
|
38
|
+
});
|
|
39
|
+
(0, globals_1.it)('has correct caching and loading behavior', async () => {
|
|
40
|
+
const viewerContext = new TestViewerContext((0, createRedisIntegrationTestEntityCompanionProvider_1.createRedisIntegrationTestEntityCompanionProvider)(genericRedisCacheContext));
|
|
41
|
+
const genericRedisCacher = new GenericRedisCacher_1.GenericRedisCacher(genericRedisCacheContext, RedisTestEntity_1.redisTestEntityConfiguration);
|
|
42
|
+
const date = new Date();
|
|
43
|
+
const entity1Created = await RedisTestEntity_1.RedisTestEntity.creator(viewerContext)
|
|
44
|
+
.setField('name', 'blah')
|
|
45
|
+
.setField('dateField', date)
|
|
46
|
+
.createAsync();
|
|
47
|
+
const testKey = `test-id-key-${entity1Created.getID()}`;
|
|
48
|
+
const objectMap = new Map([
|
|
49
|
+
[testKey, entity1Created.getAllFields()],
|
|
50
|
+
]);
|
|
51
|
+
await genericRedisCacher.cacheManyAsync(objectMap);
|
|
52
|
+
const cachedJSON = await genericRedisCacheContext.redisClient.get(testKey);
|
|
53
|
+
const cachedValue = JSON.parse(cachedJSON);
|
|
54
|
+
(0, globals_1.expect)(cachedValue).toMatchObject({
|
|
55
|
+
id: entity1Created.getID(),
|
|
56
|
+
dateField: date.toISOString(),
|
|
57
|
+
});
|
|
58
|
+
const loadedObjectMap = await genericRedisCacher.loadManyAsync([testKey]);
|
|
59
|
+
const cacheLoadResult = loadedObjectMap.get(testKey);
|
|
60
|
+
(0, globals_1.expect)(cacheLoadResult).toMatchObject({
|
|
61
|
+
status: entity_1.CacheStatus.HIT,
|
|
62
|
+
item: entity1Created.getAllFields(),
|
|
63
|
+
});
|
|
64
|
+
(0, globals_1.expect)(loadedObjectMap.size).toBe(1);
|
|
65
|
+
});
|
|
66
|
+
(0, globals_1.it)('has correct negative caching behaviour', async () => {
|
|
67
|
+
const genericRedisCacher = new GenericRedisCacher_1.GenericRedisCacher(genericRedisCacheContext, RedisTestEntity_1.redisTestEntityConfiguration);
|
|
68
|
+
const testKey = `test-id-key-non-existent-id`;
|
|
69
|
+
await genericRedisCacher.cacheDBMissesAsync([testKey]);
|
|
70
|
+
const loadedObjectMap = await genericRedisCacher.loadManyAsync([testKey]);
|
|
71
|
+
const cacheLoadResult = loadedObjectMap.get(testKey);
|
|
72
|
+
(0, globals_1.expect)(cacheLoadResult.status).toBe(entity_1.CacheStatus.NEGATIVE);
|
|
73
|
+
});
|
|
74
|
+
(0, globals_1.it)('has correct invalidation behaviour', async () => {
|
|
75
|
+
const viewerContext = new TestViewerContext((0, createRedisIntegrationTestEntityCompanionProvider_1.createRedisIntegrationTestEntityCompanionProvider)(genericRedisCacheContext));
|
|
76
|
+
const genericRedisCacher = new GenericRedisCacher_1.GenericRedisCacher(genericRedisCacheContext, RedisTestEntity_1.redisTestEntityConfiguration);
|
|
77
|
+
const date = new Date();
|
|
78
|
+
const entity1Created = await RedisTestEntity_1.RedisTestEntity.creator(viewerContext)
|
|
79
|
+
.setField('name', 'blah')
|
|
80
|
+
.setField('dateField', date)
|
|
81
|
+
.createAsync();
|
|
82
|
+
const testKey = `test-id-key-${entity1Created.getID()}`;
|
|
83
|
+
const objectMap = new Map([
|
|
84
|
+
[testKey, entity1Created.getAllFields()],
|
|
85
|
+
]);
|
|
86
|
+
await genericRedisCacher.cacheManyAsync(objectMap);
|
|
87
|
+
await genericRedisCacher.invalidateManyAsync([testKey]);
|
|
88
|
+
const loadedObjectMap = await genericRedisCacher.loadManyAsync([testKey]);
|
|
89
|
+
const cacheLoadResult = loadedObjectMap.get(testKey);
|
|
90
|
+
(0, globals_1.expect)(cacheLoadResult.status).toBe(entity_1.CacheStatus.MISS);
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
//# sourceMappingURL=GenericRedisCacher-integration-test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GenericRedisCacher-integration-test.js","sourceRoot":"","sources":["../../../src/__integration-tests__/GenericRedisCacher-integration-test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const entity_1 = require("@expo/entity");
|
|
7
|
+
const globals_1 = require("@jest/globals");
|
|
8
|
+
const ioredis_1 = __importDefault(require("ioredis"));
|
|
9
|
+
const url_1 = require("url");
|
|
10
|
+
const GenericRedisCacher_1 = require("../GenericRedisCacher");
|
|
11
|
+
const RedisTestEntity_1 = require("../__testfixtures__/RedisTestEntity");
|
|
12
|
+
const createRedisIntegrationTestEntityCompanionProvider_1 = require("../__testfixtures__/createRedisIntegrationTestEntityCompanionProvider");
|
|
13
|
+
class TestViewerContext extends entity_1.ViewerContext {
|
|
14
|
+
}
|
|
15
|
+
(0, globals_1.describe)(GenericRedisCacher_1.GenericRedisCacher, () => {
|
|
16
|
+
const redisClient = new ioredis_1.default(new url_1.URL(process.env['REDIS_URL']).toString());
|
|
17
|
+
let genericRedisCacheContext;
|
|
18
|
+
(0, globals_1.beforeAll)(() => {
|
|
19
|
+
genericRedisCacheContext = {
|
|
20
|
+
redisClient,
|
|
21
|
+
makeKeyFn(...parts) {
|
|
22
|
+
const delimiter = ':';
|
|
23
|
+
const escapedParts = parts.map((part) => part.replace('\\', '\\\\').replace(delimiter, `\\${delimiter}`));
|
|
24
|
+
return escapedParts.join(delimiter);
|
|
25
|
+
},
|
|
26
|
+
cacheKeyPrefix: 'test-',
|
|
27
|
+
ttlSecondsPositive: 86400, // 1 day
|
|
28
|
+
ttlSecondsNegative: 600, // 10 minutes
|
|
29
|
+
invalidationConfig: {
|
|
30
|
+
invalidationStrategy: GenericRedisCacher_1.RedisCacheInvalidationStrategy.CURRENT_CACHE_KEY_VERSION,
|
|
31
|
+
},
|
|
32
|
+
};
|
|
33
|
+
});
|
|
34
|
+
(0, globals_1.beforeEach)(async () => {
|
|
35
|
+
await redisClient.flushdb();
|
|
36
|
+
});
|
|
37
|
+
(0, globals_1.it)('throws when redis is disconnected', async () => {
|
|
38
|
+
redisClient.disconnect();
|
|
39
|
+
const vc1 = new TestViewerContext((0, createRedisIntegrationTestEntityCompanionProvider_1.createRedisIntegrationTestEntityCompanionProvider)(genericRedisCacheContext));
|
|
40
|
+
await (0, globals_1.expect)(RedisTestEntity_1.RedisTestEntity.creator(vc1).setField('name', 'blah').createAsync()).rejects.toThrow(entity_1.EntityCacheAdapterTransientError);
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
//# sourceMappingURL=errors-test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors-test.js","sourceRoot":"","sources":["../../../src/__integration-tests__/errors-test.ts"],"names":[],"mappings":";;;;;AAAA,yCAA+E;AAC/E,2CAA4E;AAC5E,sDAA4B;AAC5B,6BAA0B;AAE1B,8DAI+B;AAC/B,yEAAsE;AACtE,6IAA0I;AAE1I,MAAM,iBAAkB,SAAQ,sBAAa;CAAG;AAEhD,IAAA,kBAAQ,EAAC,uCAAkB,EAAE,GAAG,EAAE;IAChC,MAAM,WAAW,GAAG,IAAI,iBAAK,CAAC,IAAI,SAAG,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC7E,IAAI,wBAAkD,CAAC;IAEvD,IAAA,mBAAS,EAAC,GAAG,EAAE;QACb,wBAAwB,GAAG;YACzB,WAAW;YACX,SAAS,CAAC,GAAG,KAAe;gBAC1B,MAAM,SAAS,GAAG,GAAG,CAAC;gBACtB,MAAM,YAAY,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CACtC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,KAAK,SAAS,EAAE,CAAC,CAChE,CAAC;gBACF,OAAO,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACtC,CAAC;YACD,cAAc,EAAE,OAAO;YACvB,kBAAkB,EAAE,KAAK,EAAE,QAAQ;YACnC,kBAAkB,EAAE,GAAG,EAAE,aAAa;YACtC,kBAAkB,EAAE;gBAClB,oBAAoB,EAAE,mDAA8B,CAAC,yBAAyB;aAC/E;SACF,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,IAAA,oBAAU,EAAC,KAAK,IAAI,EAAE;QACpB,MAAM,WAAW,CAAC,OAAO,EAAE,CAAC;IAC9B,CAAC,CAAC,CAAC;IAEH,IAAA,YAAE,EAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QACjD,WAAW,CAAC,UAAU,EAAE,CAAC;QAEzB,MAAM,GAAG,GAAG,IAAI,iBAAiB,CAC/B,IAAA,qGAAiD,EAAC,wBAAwB,CAAC,CAC5E,CAAC;QAEF,MAAM,IAAA,gBAAM,EACV,iCAAe,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,WAAW,EAAE,CACpE,CAAC,OAAO,CAAC,OAAO,CAAC,yCAAgC,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { AlwaysAllowPrivacyPolicyRule, Entity, EntityCompanionDefinition, EntityConfiguration, EntityPrivacyPolicy, ViewerContext } from '@expo/entity';
|
|
2
|
+
export type RedisTestEntityFields = {
|
|
3
|
+
id: string;
|
|
4
|
+
name: string;
|
|
5
|
+
dateField: Date | null;
|
|
6
|
+
};
|
|
7
|
+
export declare class RedisTestEntity extends Entity<RedisTestEntityFields, 'id', ViewerContext> {
|
|
8
|
+
static defineCompanionDefinition(): EntityCompanionDefinition<RedisTestEntityFields, 'id', ViewerContext, RedisTestEntity, RedisTestEntityPrivacyPolicy>;
|
|
9
|
+
}
|
|
10
|
+
export declare class RedisTestEntityPrivacyPolicy extends EntityPrivacyPolicy<RedisTestEntityFields, 'id', ViewerContext, RedisTestEntity> {
|
|
11
|
+
protected readonly createRules: AlwaysAllowPrivacyPolicyRule<RedisTestEntityFields, "id", ViewerContext, RedisTestEntity, keyof RedisTestEntityFields>[];
|
|
12
|
+
protected readonly readRules: AlwaysAllowPrivacyPolicyRule<RedisTestEntityFields, "id", ViewerContext, RedisTestEntity, keyof RedisTestEntityFields>[];
|
|
13
|
+
protected readonly updateRules: AlwaysAllowPrivacyPolicyRule<RedisTestEntityFields, "id", ViewerContext, RedisTestEntity, keyof RedisTestEntityFields>[];
|
|
14
|
+
protected readonly deleteRules: AlwaysAllowPrivacyPolicyRule<RedisTestEntityFields, "id", ViewerContext, RedisTestEntity, keyof RedisTestEntityFields>[];
|
|
15
|
+
}
|
|
16
|
+
export declare const redisTestEntityConfiguration: EntityConfiguration<RedisTestEntityFields, "id">;
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.redisTestEntityConfiguration = exports.RedisTestEntityPrivacyPolicy = exports.RedisTestEntity = void 0;
|
|
4
|
+
const entity_1 = require("@expo/entity");
|
|
5
|
+
class RedisTestEntity extends entity_1.Entity {
|
|
6
|
+
static defineCompanionDefinition() {
|
|
7
|
+
return {
|
|
8
|
+
entityClass: RedisTestEntity,
|
|
9
|
+
entityConfiguration: exports.redisTestEntityConfiguration,
|
|
10
|
+
privacyPolicyClass: RedisTestEntityPrivacyPolicy,
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
exports.RedisTestEntity = RedisTestEntity;
|
|
15
|
+
class RedisTestEntityPrivacyPolicy extends entity_1.EntityPrivacyPolicy {
|
|
16
|
+
createRules = [
|
|
17
|
+
new entity_1.AlwaysAllowPrivacyPolicyRule(),
|
|
18
|
+
];
|
|
19
|
+
readRules = [
|
|
20
|
+
new entity_1.AlwaysAllowPrivacyPolicyRule(),
|
|
21
|
+
];
|
|
22
|
+
updateRules = [
|
|
23
|
+
new entity_1.AlwaysAllowPrivacyPolicyRule(),
|
|
24
|
+
];
|
|
25
|
+
deleteRules = [
|
|
26
|
+
new entity_1.AlwaysAllowPrivacyPolicyRule(),
|
|
27
|
+
];
|
|
28
|
+
}
|
|
29
|
+
exports.RedisTestEntityPrivacyPolicy = RedisTestEntityPrivacyPolicy;
|
|
30
|
+
exports.redisTestEntityConfiguration = new entity_1.EntityConfiguration({
|
|
31
|
+
idField: 'id',
|
|
32
|
+
tableName: 'redis_test_entities',
|
|
33
|
+
schema: {
|
|
34
|
+
id: new entity_1.UUIDField({
|
|
35
|
+
columnName: 'id',
|
|
36
|
+
cache: true,
|
|
37
|
+
}),
|
|
38
|
+
name: new entity_1.StringField({
|
|
39
|
+
columnName: 'name',
|
|
40
|
+
cache: true,
|
|
41
|
+
}),
|
|
42
|
+
dateField: new entity_1.DateField({
|
|
43
|
+
columnName: 'date_field',
|
|
44
|
+
}),
|
|
45
|
+
},
|
|
46
|
+
databaseAdapterFlavor: 'postgres',
|
|
47
|
+
cacheAdapterFlavor: 'redis',
|
|
48
|
+
compositeFieldDefinitions: [
|
|
49
|
+
{ compositeField: ['id', 'name'], cache: true },
|
|
50
|
+
{ compositeField: ['id', 'dateField'], cache: true },
|
|
51
|
+
],
|
|
52
|
+
});
|
|
53
|
+
//# sourceMappingURL=RedisTestEntity.js.map
|