@expo/entity-cache-adapter-local-memory 0.24.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/README.md +44 -0
- package/build/GenericLocalMemoryCacher.d.ts +20 -0
- package/build/GenericLocalMemoryCacher.js +79 -0
- package/build/GenericLocalMemoryCacher.js.map +1 -0
- package/build/LocalMemoryCacheAdapter.d.ts +11 -0
- package/build/LocalMemoryCacheAdapter.js +45 -0
- package/build/LocalMemoryCacheAdapter.js.map +1 -0
- package/build/LocalMemoryCacheAdapterProvider.d.ts +13 -0
- package/build/LocalMemoryCacheAdapterProvider.js +30 -0
- package/build/LocalMemoryCacheAdapterProvider.js.map +1 -0
- package/build/__integration-tests__/LocalMemoryCacheAdapter-integration-test.d.ts +1 -0
- package/build/__integration-tests__/LocalMemoryCacheAdapter-integration-test.js +128 -0
- package/build/__integration-tests__/LocalMemoryCacheAdapter-integration-test.js.map +1 -0
- package/build/__tests__/LocalMemoryCacheAdapter-test.d.ts +1 -0
- package/build/__tests__/LocalMemoryCacheAdapter-test.js +118 -0
- package/build/__tests__/LocalMemoryCacheAdapter-test.js.map +1 -0
- package/build/testfixtures/LocalMemoryTestEntity.d.ts +16 -0
- package/build/testfixtures/LocalMemoryTestEntity.js +53 -0
- package/build/testfixtures/LocalMemoryTestEntity.js.map +1 -0
- package/build/testfixtures/createLocalMemoryIntegrationTestEntityCompanionProvider.d.ts +6 -0
- package/build/testfixtures/createLocalMemoryIntegrationTestEntityCompanionProvider.js +32 -0
- package/build/testfixtures/createLocalMemoryIntegrationTestEntityCompanionProvider.js.map +1 -0
- package/package.json +38 -0
- package/src/GenericLocalMemoryCacher.ts +154 -0
- package/src/LocalMemoryCacheAdapter.ts +80 -0
- package/src/LocalMemoryCacheAdapterProvider.ts +43 -0
- package/src/__integration-tests__/LocalMemoryCacheAdapter-integration-test.ts +180 -0
- package/src/__tests__/LocalMemoryCacheAdapter-test.ts +125 -0
- package/src/testfixtures/LocalMemoryTestEntity.ts +100 -0
- package/src/testfixtures/createLocalMemoryIntegrationTestEntityCompanionProvider.ts +48 -0
package/README.md
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# `@expo/entity-cache-adapter-local-memory`
|
|
2
|
+
|
|
3
|
+
Cross-request [LRU](https://github.com/isaacs/node-lru-cache) cache adapter for `@expo/entity`. Use
|
|
4
|
+
this cache with caution - it is nonstandard. The cache is shared between requests in the node process.
|
|
5
|
+
|
|
6
|
+
## Why NOT use this cache
|
|
7
|
+
|
|
8
|
+
Because this is an in-memory cache, cross-box invalidation is not possible. Do not use this cache
|
|
9
|
+
if you have the following use cases:
|
|
10
|
+
|
|
11
|
+
- The objects stored have high mutability
|
|
12
|
+
- Reading a stale object from the cache is not acceptable in your application
|
|
13
|
+
- Cross-box invalidation is not possible
|
|
14
|
+
|
|
15
|
+
## Typical use cases
|
|
16
|
+
|
|
17
|
+
If your application sees many requests fetching the same objects, you can save a trip to your cache
|
|
18
|
+
cluster and backing datastore by using this in-memory cache. Here are some good use cases:
|
|
19
|
+
|
|
20
|
+
- The objects stored are mostly immutable
|
|
21
|
+
- You have a low TTL setting in your cache
|
|
22
|
+
|
|
23
|
+
## Usage
|
|
24
|
+
|
|
25
|
+
During `EntityCompanionProvider` instantiation:
|
|
26
|
+
|
|
27
|
+
```typescript
|
|
28
|
+
export const createDefaultEntityCompanionProvider = (
|
|
29
|
+
metricsAdapter: IEntityMetricsAdapter = new NoOpEntityMetricsAdapter()
|
|
30
|
+
): EntityCompanionProvider => {
|
|
31
|
+
return new EntityCompanionProvider(
|
|
32
|
+
metricsAdapter,
|
|
33
|
+
{
|
|
34
|
+
...
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
['local-memory']: {
|
|
38
|
+
cacheAdapterProvider: new LocalMemoryCacheAdapterProvider.getProvider(),
|
|
39
|
+
},
|
|
40
|
+
}
|
|
41
|
+
);
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
```
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { CacheLoadResult } from '@expo/entity';
|
|
2
|
+
import LRUCache from 'lru-cache';
|
|
3
|
+
export declare const DOES_NOT_EXIST_LOCAL_MEMORY_CACHE: unique symbol;
|
|
4
|
+
declare type LocalMemoryCacheValue<TFields> = Readonly<TFields> | typeof DOES_NOT_EXIST_LOCAL_MEMORY_CACHE;
|
|
5
|
+
export declare type LocalMemoryCache<TFields> = LRUCache<string, LocalMemoryCacheValue<TFields>>;
|
|
6
|
+
export default class GenericLocalMemoryCacher<TFields> {
|
|
7
|
+
private readonly lruCache;
|
|
8
|
+
constructor(lruCache: LocalMemoryCache<TFields>);
|
|
9
|
+
static createLRUCache<TFields>(options?: {
|
|
10
|
+
maxSize?: number;
|
|
11
|
+
ttlSeconds?: number;
|
|
12
|
+
}): LocalMemoryCache<TFields>;
|
|
13
|
+
static createNoOpLRUCache<TFields>(): LocalMemoryCache<TFields>;
|
|
14
|
+
loadManyAsync(keys: readonly string[]): Promise<ReadonlyMap<string, CacheLoadResult<TFields>>>;
|
|
15
|
+
cacheManyAsync(objectMap: ReadonlyMap<string, Readonly<TFields>>): Promise<void>;
|
|
16
|
+
cacheDBMissesAsync(keys: string[]): Promise<void>;
|
|
17
|
+
invalidateManyAsync(keys: string[]): Promise<void>;
|
|
18
|
+
makeCacheKey(parts: string[]): string;
|
|
19
|
+
}
|
|
20
|
+
export {};
|
|
@@ -0,0 +1,79 @@
|
|
|
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
|
+
exports.DOES_NOT_EXIST_LOCAL_MEMORY_CACHE = void 0;
|
|
7
|
+
const entity_1 = require("@expo/entity");
|
|
8
|
+
const lru_cache_1 = __importDefault(require("lru-cache"));
|
|
9
|
+
// Sentinel value we store in local memory to negatively cache a database miss.
|
|
10
|
+
// The sentinel value is distinct from any (positively) cached value.
|
|
11
|
+
exports.DOES_NOT_EXIST_LOCAL_MEMORY_CACHE = Symbol('doesNotExist');
|
|
12
|
+
class GenericLocalMemoryCacher {
|
|
13
|
+
constructor(lruCache) {
|
|
14
|
+
this.lruCache = lruCache;
|
|
15
|
+
}
|
|
16
|
+
static createLRUCache(options = {}) {
|
|
17
|
+
var _a, _b;
|
|
18
|
+
const DEFAULT_LRU_CACHE_MAX_AGE_SECONDS = 10;
|
|
19
|
+
const DEFAULT_LRU_CACHE_SIZE = 10000;
|
|
20
|
+
const maxAgeSeconds = (_a = options.ttlSeconds) !== null && _a !== void 0 ? _a : DEFAULT_LRU_CACHE_MAX_AGE_SECONDS;
|
|
21
|
+
const lruCacheOptions = {
|
|
22
|
+
max: (_b = options.maxSize) !== null && _b !== void 0 ? _b : DEFAULT_LRU_CACHE_SIZE,
|
|
23
|
+
sizeCalculation: (value) => value === exports.DOES_NOT_EXIST_LOCAL_MEMORY_CACHE ? 0 : 1,
|
|
24
|
+
ttl: maxAgeSeconds * 1000, // convert to ms
|
|
25
|
+
};
|
|
26
|
+
return new lru_cache_1.default(lruCacheOptions);
|
|
27
|
+
}
|
|
28
|
+
static createNoOpLRUCache() {
|
|
29
|
+
return new lru_cache_1.default({
|
|
30
|
+
max: 0,
|
|
31
|
+
maxAge: -1,
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
async loadManyAsync(keys) {
|
|
35
|
+
const cacheResults = new Map();
|
|
36
|
+
for (const key of keys) {
|
|
37
|
+
const cacheResult = this.lruCache.get(key);
|
|
38
|
+
if (cacheResult === exports.DOES_NOT_EXIST_LOCAL_MEMORY_CACHE) {
|
|
39
|
+
cacheResults.set(key, {
|
|
40
|
+
status: entity_1.CacheStatus.NEGATIVE,
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
else if (cacheResult) {
|
|
44
|
+
cacheResults.set(key, {
|
|
45
|
+
status: entity_1.CacheStatus.HIT,
|
|
46
|
+
item: cacheResult,
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
cacheResults.set(key, {
|
|
51
|
+
status: entity_1.CacheStatus.MISS,
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return cacheResults;
|
|
56
|
+
}
|
|
57
|
+
async cacheManyAsync(objectMap) {
|
|
58
|
+
for (const [key, item] of objectMap) {
|
|
59
|
+
this.lruCache.set(key, item);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
async cacheDBMissesAsync(keys) {
|
|
63
|
+
for (const key of keys) {
|
|
64
|
+
this.lruCache.set(key, exports.DOES_NOT_EXIST_LOCAL_MEMORY_CACHE);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
async invalidateManyAsync(keys) {
|
|
68
|
+
for (const key of keys) {
|
|
69
|
+
this.lruCache.del(key);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
makeCacheKey(parts) {
|
|
73
|
+
const delimiter = ':';
|
|
74
|
+
const escapedParts = parts.map((part) => part.replace('\\', '\\\\').replace(delimiter, `\\${delimiter}`));
|
|
75
|
+
return escapedParts.join(delimiter);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
exports.default = GenericLocalMemoryCacher;
|
|
79
|
+
//# sourceMappingURL=GenericLocalMemoryCacher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GenericLocalMemoryCacher.js","sourceRoot":"","sources":["../src/GenericLocalMemoryCacher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { EntityCacheAdapter, CacheLoadResult, EntityConfiguration } from '@expo/entity';
|
|
2
|
+
import { LocalMemoryCache } from './GenericLocalMemoryCacher';
|
|
3
|
+
export default class LocalMemoryCacheAdapter<TFields> extends EntityCacheAdapter<TFields> {
|
|
4
|
+
private readonly genericLocalMemoryCacher;
|
|
5
|
+
constructor(entityConfiguration: EntityConfiguration<TFields>, lruCache: LocalMemoryCache<TFields>);
|
|
6
|
+
loadManyAsync<N extends keyof TFields>(fieldName: N, fieldValues: readonly NonNullable<TFields[N]>[]): Promise<ReadonlyMap<NonNullable<TFields[N]>, CacheLoadResult<TFields>>>;
|
|
7
|
+
cacheManyAsync<N extends keyof TFields>(fieldName: N, objectMap: ReadonlyMap<NonNullable<TFields[N]>, Readonly<TFields>>): Promise<void>;
|
|
8
|
+
cacheDBMissesAsync<N extends keyof TFields>(fieldName: N, fieldValues: readonly NonNullable<TFields[N]>[]): Promise<void>;
|
|
9
|
+
invalidateManyAsync<N extends keyof TFields>(fieldName: N, fieldValues: readonly NonNullable<TFields[N]>[]): Promise<void>;
|
|
10
|
+
private makeCacheKey;
|
|
11
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
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 invariant_1 = __importDefault(require("invariant"));
|
|
8
|
+
const GenericLocalMemoryCacher_1 = __importDefault(require("./GenericLocalMemoryCacher"));
|
|
9
|
+
class LocalMemoryCacheAdapter extends entity_1.EntityCacheAdapter {
|
|
10
|
+
constructor(entityConfiguration, lruCache) {
|
|
11
|
+
super(entityConfiguration);
|
|
12
|
+
this.genericLocalMemoryCacher = new GenericLocalMemoryCacher_1.default(lruCache);
|
|
13
|
+
}
|
|
14
|
+
async loadManyAsync(fieldName, fieldValues) {
|
|
15
|
+
const localMemoryCacheKeyToFieldValueMapping = new Map(fieldValues.map((fieldValue) => [this.makeCacheKey(fieldName, fieldValue), fieldValue]));
|
|
16
|
+
const cacheResults = await this.genericLocalMemoryCacher.loadManyAsync(Array.from(localMemoryCacheKeyToFieldValueMapping.keys()));
|
|
17
|
+
return (0, entity_1.mapKeys)(cacheResults, (cacheKey) => {
|
|
18
|
+
const fieldValue = localMemoryCacheKeyToFieldValueMapping.get(cacheKey);
|
|
19
|
+
(0, invariant_1.default)(fieldValue !== undefined, 'Unspecified cache key %s returned from generic Local Memory cacher', cacheKey);
|
|
20
|
+
return fieldValue;
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
async cacheManyAsync(fieldName, objectMap) {
|
|
24
|
+
await this.genericLocalMemoryCacher.cacheManyAsync((0, entity_1.mapKeys)(objectMap, (fieldValue) => this.makeCacheKey(fieldName, fieldValue)));
|
|
25
|
+
}
|
|
26
|
+
async cacheDBMissesAsync(fieldName, fieldValues) {
|
|
27
|
+
await this.genericLocalMemoryCacher.cacheDBMissesAsync(fieldValues.map((fieldValue) => this.makeCacheKey(fieldName, fieldValue)));
|
|
28
|
+
}
|
|
29
|
+
async invalidateManyAsync(fieldName, fieldValues) {
|
|
30
|
+
await this.genericLocalMemoryCacher.invalidateManyAsync(fieldValues.map((fieldValue) => this.makeCacheKey(fieldName, fieldValue)));
|
|
31
|
+
}
|
|
32
|
+
makeCacheKey(fieldName, fieldValue) {
|
|
33
|
+
const columnName = this.entityConfiguration.entityToDBFieldsKeyMapping.get(fieldName);
|
|
34
|
+
(0, invariant_1.default)(columnName, `database field mapping missing for ${fieldName}`);
|
|
35
|
+
const parts = [
|
|
36
|
+
this.entityConfiguration.tableName,
|
|
37
|
+
`${this.entityConfiguration.cacheKeyVersion}`,
|
|
38
|
+
columnName,
|
|
39
|
+
String(fieldValue),
|
|
40
|
+
];
|
|
41
|
+
return this.genericLocalMemoryCacher.makeCacheKey(parts);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
exports.default = LocalMemoryCacheAdapter;
|
|
45
|
+
//# sourceMappingURL=LocalMemoryCacheAdapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LocalMemoryCacheAdapter.js","sourceRoot":"","sources":["../src/LocalMemoryCacheAdapter.ts"],"names":[],"mappings":";;;;;AAAA,yCAAiG;AACjG,0DAAkC;AAElC,0FAAwF;AAExF,MAAqB,uBAAiC,SAAQ,2BAA2B;IAGvF,YACE,mBAAiD,EACjD,QAAmC;QAEnC,KAAK,CAAC,mBAAmB,CAAC,CAAC;QAC3B,IAAI,CAAC,wBAAwB,GAAG,IAAI,kCAAwB,CAAC,QAAQ,CAAC,CAAC;IACzE,CAAC;IAEM,KAAK,CAAC,aAAa,CACxB,SAAY,EACZ,WAA+C;QAE/C,MAAM,sCAAsC,GAAG,IAAI,GAAG,CACpD,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,UAAU,CAAC,EAAE,UAAU,CAAC,CAAC,CACxF,CAAC;QACF,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,wBAAwB,CAAC,aAAa,CACpE,KAAK,CAAC,IAAI,CAAC,sCAAsC,CAAC,IAAI,EAAE,CAAC,CAC1D,CAAC;QAEF,OAAO,IAAA,gBAAO,EAAC,YAAY,EAAE,CAAC,QAAQ,EAAE,EAAE;YACxC,MAAM,UAAU,GAAG,sCAAsC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACxE,IAAA,mBAAS,EACP,UAAU,KAAK,SAAS,EACxB,oEAAoE,EACpE,QAAQ,CACT,CAAC;YACF,OAAO,UAAU,CAAC;QACpB,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,KAAK,CAAC,cAAc,CACzB,SAAY,EACZ,SAAkE;QAElE,MAAM,IAAI,CAAC,wBAAwB,CAAC,cAAc,CAChD,IAAA,gBAAO,EAAC,SAAS,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,CAC7E,CAAC;IACJ,CAAC;IAEM,KAAK,CAAC,kBAAkB,CAC7B,SAAY,EACZ,WAA+C;QAE/C,MAAM,IAAI,CAAC,wBAAwB,CAAC,kBAAkB,CACpD,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,CAC1E,CAAC;IACJ,CAAC;IAEM,KAAK,CAAC,mBAAmB,CAC9B,SAAY,EACZ,WAA+C;QAE/C,MAAM,IAAI,CAAC,wBAAwB,CAAC,mBAAmB,CACrD,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,CAC1E,CAAC;IACJ,CAAC;IAEO,YAAY,CAClB,SAAY,EACZ,UAAmC;QAEnC,MAAM,UAAU,GAAG,IAAI,CAAC,mBAAmB,CAAC,0BAA0B,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACtF,IAAA,mBAAS,EAAC,UAAU,EAAE,sCAAsC,SAAS,EAAE,CAAC,CAAC;QACzE,MAAM,KAAK,GAAG;YACZ,IAAI,CAAC,mBAAmB,CAAC,SAAS;YAClC,GAAG,IAAI,CAAC,mBAAmB,CAAC,eAAe,EAAE;YAC7C,UAAU;YACV,MAAM,CAAC,UAAU,CAAC;SACnB,CAAC;QACF,OAAO,IAAI,CAAC,wBAAwB,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IAC3D,CAAC;CACF;AA1ED,0CA0EC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { EntityCacheAdapter, EntityConfiguration, IEntityCacheAdapterProvider } from '@expo/entity';
|
|
2
|
+
import LocalMemoryCacheAdapter from './LocalMemoryCacheAdapter';
|
|
3
|
+
export declare class LocalMemoryCacheAdapterProvider implements IEntityCacheAdapterProvider {
|
|
4
|
+
private readonly lruCacheCreator;
|
|
5
|
+
static localMemoryCacheAdapterMap: Map<string, LocalMemoryCacheAdapter<any>>;
|
|
6
|
+
static getNoOpProvider(): IEntityCacheAdapterProvider;
|
|
7
|
+
static getProvider(options?: {
|
|
8
|
+
maxSize?: number;
|
|
9
|
+
ttlSeconds?: number;
|
|
10
|
+
}): IEntityCacheAdapterProvider;
|
|
11
|
+
private constructor();
|
|
12
|
+
getCacheAdapter<TFields>(entityConfiguration: EntityConfiguration<TFields>): EntityCacheAdapter<TFields>;
|
|
13
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
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
|
+
exports.LocalMemoryCacheAdapterProvider = void 0;
|
|
7
|
+
const entity_1 = require("@expo/entity");
|
|
8
|
+
const GenericLocalMemoryCacher_1 = __importDefault(require("./GenericLocalMemoryCacher"));
|
|
9
|
+
const LocalMemoryCacheAdapter_1 = __importDefault(require("./LocalMemoryCacheAdapter"));
|
|
10
|
+
class LocalMemoryCacheAdapterProvider {
|
|
11
|
+
constructor(lruCacheCreator) {
|
|
12
|
+
this.lruCacheCreator = lruCacheCreator;
|
|
13
|
+
}
|
|
14
|
+
static getNoOpProvider() {
|
|
15
|
+
return new LocalMemoryCacheAdapterProvider(() => GenericLocalMemoryCacher_1.default.createNoOpLRUCache());
|
|
16
|
+
}
|
|
17
|
+
static getProvider(options = {}) {
|
|
18
|
+
return new LocalMemoryCacheAdapterProvider(() => GenericLocalMemoryCacher_1.default.createLRUCache(options));
|
|
19
|
+
}
|
|
20
|
+
getCacheAdapter(entityConfiguration) {
|
|
21
|
+
return (0, entity_1.computeIfAbsent)(LocalMemoryCacheAdapterProvider.localMemoryCacheAdapterMap, entityConfiguration.tableName, () => {
|
|
22
|
+
const lruCache = this.lruCacheCreator();
|
|
23
|
+
return new LocalMemoryCacheAdapter_1.default(entityConfiguration, lruCache);
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
exports.LocalMemoryCacheAdapterProvider = LocalMemoryCacheAdapterProvider;
|
|
28
|
+
// local memory cache adapters should be shared/reused across requests
|
|
29
|
+
LocalMemoryCacheAdapterProvider.localMemoryCacheAdapterMap = new Map();
|
|
30
|
+
//# sourceMappingURL=LocalMemoryCacheAdapterProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LocalMemoryCacheAdapterProvider.js","sourceRoot":"","sources":["../src/LocalMemoryCacheAdapterProvider.ts"],"names":[],"mappings":";;;;;;AAAA,yCAKsB;AAEtB,0FAAwF;AACxF,wFAAgE;AAEhE,MAAa,+BAA+B;IAkB1C,YAAqC,eAAyD;QAAzD,oBAAe,GAAf,eAAe,CAA0C;IAAG,CAAC;IAdlG,MAAM,CAAC,eAAe;QACpB,OAAO,IAAI,+BAA+B,CAAC,GAAY,EAAE,CACvD,kCAAwB,CAAC,kBAAkB,EAAW,CACvD,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,WAAW,CAChB,UAAqD,EAAE;QAEvD,OAAO,IAAI,+BAA+B,CAAC,GAAY,EAAE,CACvD,kCAAwB,CAAC,cAAc,CAAU,OAAO,CAAC,CAC1D,CAAC;IACJ,CAAC;IAIM,eAAe,CACpB,mBAAiD;QAEjD,OAAO,IAAA,wBAAe,EACpB,+BAA+B,CAAC,0BAA0B,EAC1D,mBAAmB,CAAC,SAAS,EAC7B,GAAG,EAAE;YACH,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,EAAW,CAAC;YACjD,OAAO,IAAI,iCAAuB,CAAC,mBAAmB,EAAE,QAAQ,CAAC,CAAC;QACpE,CAAC,CACF,CAAC;IACJ,CAAC;;AA/BH,0EAgCC;AA/BC,sEAAsE;AAC/D,0DAA0B,GAAG,IAAI,GAAG,EAAwC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,128 @@
|
|
|
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 uuid_1 = require("uuid");
|
|
8
|
+
const GenericLocalMemoryCacher_1 = __importDefault(require("../GenericLocalMemoryCacher"));
|
|
9
|
+
const LocalMemoryCacheAdapter_1 = __importDefault(require("../LocalMemoryCacheAdapter"));
|
|
10
|
+
const LocalMemoryCacheAdapterProvider_1 = require("../LocalMemoryCacheAdapterProvider");
|
|
11
|
+
const LocalMemoryTestEntity_1 = __importDefault(require("../testfixtures/LocalMemoryTestEntity"));
|
|
12
|
+
const createLocalMemoryIntegrationTestEntityCompanionProvider_1 = require("../testfixtures/createLocalMemoryIntegrationTestEntityCompanionProvider");
|
|
13
|
+
class TestViewerContext extends entity_1.ViewerContext {
|
|
14
|
+
}
|
|
15
|
+
describe(LocalMemoryCacheAdapter_1.default, () => {
|
|
16
|
+
beforeEach(async () => {
|
|
17
|
+
LocalMemoryCacheAdapterProvider_1.LocalMemoryCacheAdapterProvider.localMemoryCacheAdapterMap.clear();
|
|
18
|
+
});
|
|
19
|
+
it('has correct caching behavior', async () => {
|
|
20
|
+
const viewerContext = new TestViewerContext((0, createLocalMemoryIntegrationTestEntityCompanionProvider_1.createLocalMemoryIntegrationTestEntityCompanionProvider)());
|
|
21
|
+
const cacheAdapter = viewerContext.entityCompanionProvider.getCompanionForEntity(LocalMemoryTestEntity_1.default, LocalMemoryTestEntity_1.default.getCompanionDefinition())['tableDataCoordinator']['cacheAdapter'];
|
|
22
|
+
const cacheKeyMaker = cacheAdapter['makeCacheKey'].bind(cacheAdapter);
|
|
23
|
+
const date = new Date();
|
|
24
|
+
const entity1Created = await LocalMemoryTestEntity_1.default.creator(viewerContext)
|
|
25
|
+
.setField('name', 'blah')
|
|
26
|
+
.setField('dateField', date)
|
|
27
|
+
.enforceCreateAsync();
|
|
28
|
+
// loading an entity should put it in cache
|
|
29
|
+
const entity1 = await LocalMemoryTestEntity_1.default.loader(viewerContext)
|
|
30
|
+
.enforcing()
|
|
31
|
+
.loadByIDAsync(entity1Created.getID());
|
|
32
|
+
const entitySpecificGenericCacher = LocalMemoryCacheAdapterProvider_1.LocalMemoryCacheAdapterProvider.localMemoryCacheAdapterMap.get(LocalMemoryTestEntity_1.default.getCompanionDefinition().entityConfiguration.tableName)['genericLocalMemoryCacher'];
|
|
33
|
+
const cachedResult = await entitySpecificGenericCacher.loadManyAsync([
|
|
34
|
+
cacheKeyMaker('id', entity1.getID()),
|
|
35
|
+
]);
|
|
36
|
+
const cachedValue = cachedResult.get(cacheKeyMaker('id', entity1.getID()));
|
|
37
|
+
expect(cachedValue).toMatchObject({
|
|
38
|
+
status: entity_1.CacheStatus.HIT,
|
|
39
|
+
item: {
|
|
40
|
+
id: entity1.getID(),
|
|
41
|
+
name: 'blah',
|
|
42
|
+
dateField: date,
|
|
43
|
+
},
|
|
44
|
+
});
|
|
45
|
+
// simulate non existent db fetch, should write negative result ('') to cache
|
|
46
|
+
const nonExistentId = (0, uuid_1.v4)();
|
|
47
|
+
const entityNonExistentResult = await LocalMemoryTestEntity_1.default.loader(viewerContext).loadByIDAsync(nonExistentId);
|
|
48
|
+
expect(entityNonExistentResult.ok).toBe(false);
|
|
49
|
+
const nonExistentCachedResult = await entitySpecificGenericCacher.loadManyAsync([
|
|
50
|
+
cacheKeyMaker('id', nonExistentId),
|
|
51
|
+
]);
|
|
52
|
+
expect(nonExistentCachedResult.get(cacheKeyMaker('id', nonExistentId))).toMatchObject({
|
|
53
|
+
status: entity_1.CacheStatus.NEGATIVE,
|
|
54
|
+
});
|
|
55
|
+
// load again through entities framework to ensure it reads negative result
|
|
56
|
+
const entityNonExistentResult2 = await LocalMemoryTestEntity_1.default.loader(viewerContext).loadByIDAsync(nonExistentId);
|
|
57
|
+
expect(entityNonExistentResult2.ok).toBe(false);
|
|
58
|
+
// invalidate from cache to ensure it invalidates correctly
|
|
59
|
+
await LocalMemoryTestEntity_1.default.loader(viewerContext).invalidateFieldsAsync(entity1.getAllFields());
|
|
60
|
+
const cachedResultMiss = await entitySpecificGenericCacher.loadManyAsync([
|
|
61
|
+
cacheKeyMaker('id', entity1.getID()),
|
|
62
|
+
]);
|
|
63
|
+
const cachedValueMiss = cachedResultMiss.get(cacheKeyMaker('id', entity1.getID()));
|
|
64
|
+
expect(cachedValueMiss).toMatchObject({ status: entity_1.CacheStatus.MISS });
|
|
65
|
+
});
|
|
66
|
+
it('shares the cache between different requests', async () => {
|
|
67
|
+
const genericLocalMemoryCacherLoadManySpy = jest.spyOn(GenericLocalMemoryCacher_1.default.prototype, 'loadManyAsync');
|
|
68
|
+
const viewerContext = new TestViewerContext((0, createLocalMemoryIntegrationTestEntityCompanionProvider_1.createLocalMemoryIntegrationTestEntityCompanionProvider)());
|
|
69
|
+
const date = new Date();
|
|
70
|
+
const entity1Created = await LocalMemoryTestEntity_1.default.creator(viewerContext)
|
|
71
|
+
.setField('name', 'blah')
|
|
72
|
+
.setField('dateField', date)
|
|
73
|
+
.enforceCreateAsync();
|
|
74
|
+
// loading an entity should put it in cache
|
|
75
|
+
await LocalMemoryTestEntity_1.default.loader(viewerContext)
|
|
76
|
+
.enforcing()
|
|
77
|
+
.loadByIDAsync(entity1Created.getID());
|
|
78
|
+
// load entity with a different request
|
|
79
|
+
const viewerContext2 = new TestViewerContext((0, createLocalMemoryIntegrationTestEntityCompanionProvider_1.createLocalMemoryIntegrationTestEntityCompanionProvider)());
|
|
80
|
+
const entity1WithVc2 = await LocalMemoryTestEntity_1.default.loader(viewerContext2)
|
|
81
|
+
.enforcing()
|
|
82
|
+
.loadByIDAsync(entity1Created.getID());
|
|
83
|
+
const cacheAdapter = viewerContext.entityCompanionProvider.getCompanionForEntity(LocalMemoryTestEntity_1.default, LocalMemoryTestEntity_1.default.getCompanionDefinition())['tableDataCoordinator']['cacheAdapter'];
|
|
84
|
+
const cacheKeyMaker = cacheAdapter['makeCacheKey'].bind(cacheAdapter);
|
|
85
|
+
expect(entity1WithVc2.getAllFields()).toMatchObject({
|
|
86
|
+
id: entity1WithVc2.getID(),
|
|
87
|
+
name: 'blah',
|
|
88
|
+
dateField: date,
|
|
89
|
+
});
|
|
90
|
+
expect(genericLocalMemoryCacherLoadManySpy).toBeCalledWith([
|
|
91
|
+
cacheKeyMaker('id', entity1WithVc2.getID()),
|
|
92
|
+
]);
|
|
93
|
+
expect(genericLocalMemoryCacherLoadManySpy).toBeCalledTimes(2);
|
|
94
|
+
});
|
|
95
|
+
it('respects the parameters of a noop cache', async () => {
|
|
96
|
+
const viewerContext = new TestViewerContext((0, createLocalMemoryIntegrationTestEntityCompanionProvider_1.createNoopLocalMemoryIntegrationTestEntityCompanionProvider)());
|
|
97
|
+
const cacheAdapter = viewerContext.entityCompanionProvider.getCompanionForEntity(LocalMemoryTestEntity_1.default, LocalMemoryTestEntity_1.default.getCompanionDefinition())['tableDataCoordinator']['cacheAdapter'];
|
|
98
|
+
const cacheKeyMaker = cacheAdapter['makeCacheKey'].bind(cacheAdapter);
|
|
99
|
+
const date = new Date();
|
|
100
|
+
const entity1Created = await LocalMemoryTestEntity_1.default.creator(viewerContext)
|
|
101
|
+
.setField('name', 'blah')
|
|
102
|
+
.setField('dateField', date)
|
|
103
|
+
.enforceCreateAsync();
|
|
104
|
+
// loading an entity will try to put it in cache but it's a noop cache, so it should be a miss
|
|
105
|
+
const entity1 = await LocalMemoryTestEntity_1.default.loader(viewerContext)
|
|
106
|
+
.enforcing()
|
|
107
|
+
.loadByIDAsync(entity1Created.getID());
|
|
108
|
+
const entitySpecificGenericCacher = LocalMemoryCacheAdapterProvider_1.LocalMemoryCacheAdapterProvider.localMemoryCacheAdapterMap.get(LocalMemoryTestEntity_1.default.getCompanionDefinition().entityConfiguration.tableName)['genericLocalMemoryCacher'];
|
|
109
|
+
const cachedResult = await entitySpecificGenericCacher.loadManyAsync([
|
|
110
|
+
cacheKeyMaker('id', entity1.getID()),
|
|
111
|
+
]);
|
|
112
|
+
const cachedValue = cachedResult.get(cacheKeyMaker('id', entity1.getID()));
|
|
113
|
+
expect(cachedValue).toMatchObject({
|
|
114
|
+
status: entity_1.CacheStatus.MISS,
|
|
115
|
+
});
|
|
116
|
+
// a non existent db fetch should try to write negative result ('') but it's a noop cache, so it should be a miss
|
|
117
|
+
const nonExistentId = (0, uuid_1.v4)();
|
|
118
|
+
const entityNonExistentResult = await LocalMemoryTestEntity_1.default.loader(viewerContext).loadByIDAsync(nonExistentId);
|
|
119
|
+
expect(entityNonExistentResult.ok).toBe(false);
|
|
120
|
+
const nonExistentCachedResult = await entitySpecificGenericCacher.loadManyAsync([
|
|
121
|
+
cacheKeyMaker('id', nonExistentId),
|
|
122
|
+
]);
|
|
123
|
+
expect(nonExistentCachedResult.get(cacheKeyMaker('id', nonExistentId))).toMatchObject({
|
|
124
|
+
status: entity_1.CacheStatus.MISS,
|
|
125
|
+
});
|
|
126
|
+
});
|
|
127
|
+
});
|
|
128
|
+
//# sourceMappingURL=LocalMemoryCacheAdapter-integration-test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LocalMemoryCacheAdapter-integration-test.js","sourceRoot":"","sources":["../../src/__integration-tests__/LocalMemoryCacheAdapter-integration-test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
5
|
+
}) : (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
o[k2] = m[k];
|
|
8
|
+
}));
|
|
9
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
10
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
11
|
+
}) : function(o, v) {
|
|
12
|
+
o["default"] = v;
|
|
13
|
+
});
|
|
14
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
15
|
+
if (mod && mod.__esModule) return mod;
|
|
16
|
+
var result = {};
|
|
17
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
18
|
+
__setModuleDefault(result, mod);
|
|
19
|
+
return result;
|
|
20
|
+
};
|
|
21
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
22
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
23
|
+
};
|
|
24
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
25
|
+
const entity_1 = require("@expo/entity");
|
|
26
|
+
const GenericLocalMemoryCacher_1 = __importStar(require("../GenericLocalMemoryCacher"));
|
|
27
|
+
const LocalMemoryCacheAdapter_1 = __importDefault(require("../LocalMemoryCacheAdapter"));
|
|
28
|
+
const entityConfiguration = new entity_1.EntityConfiguration({
|
|
29
|
+
idField: 'id',
|
|
30
|
+
tableName: 'blah',
|
|
31
|
+
schema: {
|
|
32
|
+
id: new entity_1.UUIDField({ columnName: 'id', cache: true }),
|
|
33
|
+
},
|
|
34
|
+
databaseAdapterFlavor: 'postgres',
|
|
35
|
+
cacheAdapterFlavor: 'local-memory',
|
|
36
|
+
});
|
|
37
|
+
describe(LocalMemoryCacheAdapter_1.default, () => {
|
|
38
|
+
describe('loadManyAsync', () => {
|
|
39
|
+
it('returns appropriate cache results', async () => {
|
|
40
|
+
const cacheAdapter = new LocalMemoryCacheAdapter_1.default(entityConfiguration, GenericLocalMemoryCacher_1.default.createLRUCache({
|
|
41
|
+
maxSize: Number.MAX_SAFE_INTEGER,
|
|
42
|
+
ttlSeconds: Number.MAX_SAFE_INTEGER,
|
|
43
|
+
}));
|
|
44
|
+
const cacheHits = new Map([['test-id-1', { id: 'test-id-1' }]]);
|
|
45
|
+
await cacheAdapter.cacheManyAsync('id', cacheHits);
|
|
46
|
+
await cacheAdapter.cacheDBMissesAsync('id', ['test-id-2']);
|
|
47
|
+
const results = await cacheAdapter.loadManyAsync('id', [
|
|
48
|
+
'test-id-1',
|
|
49
|
+
'test-id-2',
|
|
50
|
+
'test-id-3',
|
|
51
|
+
]);
|
|
52
|
+
expect(results.get('test-id-1')).toMatchObject({
|
|
53
|
+
status: entity_1.CacheStatus.HIT,
|
|
54
|
+
item: { id: 'test-id-1' },
|
|
55
|
+
});
|
|
56
|
+
expect(results.get('test-id-2')).toMatchObject({ status: entity_1.CacheStatus.NEGATIVE });
|
|
57
|
+
expect(results.get('test-id-3')).toMatchObject({ status: entity_1.CacheStatus.MISS });
|
|
58
|
+
expect(results.size).toBe(3);
|
|
59
|
+
});
|
|
60
|
+
it('returns empty map when passed empty array of fieldValues', async () => {
|
|
61
|
+
const cacheAdapter = new LocalMemoryCacheAdapter_1.default(entityConfiguration, GenericLocalMemoryCacher_1.default.createLRUCache({
|
|
62
|
+
maxSize: Number.MAX_SAFE_INTEGER,
|
|
63
|
+
ttlSeconds: Number.MAX_SAFE_INTEGER,
|
|
64
|
+
}));
|
|
65
|
+
const results = await cacheAdapter.loadManyAsync('id', []);
|
|
66
|
+
expect(results).toEqual(new Map());
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
describe('cacheManyAsync', () => {
|
|
70
|
+
it('correctly caches all objects', async () => {
|
|
71
|
+
const lruCache = GenericLocalMemoryCacher_1.default.createLRUCache({
|
|
72
|
+
maxSize: Number.MAX_SAFE_INTEGER,
|
|
73
|
+
ttlSeconds: Number.MAX_SAFE_INTEGER,
|
|
74
|
+
});
|
|
75
|
+
const cacheAdapter = new LocalMemoryCacheAdapter_1.default(entityConfiguration, lruCache);
|
|
76
|
+
await cacheAdapter.cacheManyAsync('id', new Map([['test-id-1', { id: 'test-id-1' }]]));
|
|
77
|
+
const cacheKey = cacheAdapter['makeCacheKey']('id', 'test-id-1');
|
|
78
|
+
expect(lruCache.get(cacheKey)).toMatchObject({
|
|
79
|
+
id: 'test-id-1',
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
describe('cacheDBMissesAsync', () => {
|
|
84
|
+
it('correctly caches misses', async () => {
|
|
85
|
+
const lruCache = GenericLocalMemoryCacher_1.default.createLRUCache({
|
|
86
|
+
maxSize: Number.MAX_SAFE_INTEGER,
|
|
87
|
+
ttlSeconds: Number.MAX_SAFE_INTEGER,
|
|
88
|
+
});
|
|
89
|
+
const cacheAdapter = new LocalMemoryCacheAdapter_1.default(entityConfiguration, lruCache);
|
|
90
|
+
await cacheAdapter.cacheDBMissesAsync('id', ['test-id-1']);
|
|
91
|
+
const cacheKey = cacheAdapter['makeCacheKey']('id', 'test-id-1');
|
|
92
|
+
expect(lruCache.get(cacheKey)).toEqual(GenericLocalMemoryCacher_1.DOES_NOT_EXIST_LOCAL_MEMORY_CACHE);
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
describe('invalidateManyAsync', () => {
|
|
96
|
+
it('invalidates correctly', async () => {
|
|
97
|
+
const lruCache = GenericLocalMemoryCacher_1.default.createLRUCache({
|
|
98
|
+
maxSize: Number.MAX_SAFE_INTEGER,
|
|
99
|
+
ttlSeconds: Number.MAX_SAFE_INTEGER,
|
|
100
|
+
});
|
|
101
|
+
const cacheAdapter = new LocalMemoryCacheAdapter_1.default(entityConfiguration, lruCache);
|
|
102
|
+
await cacheAdapter.cacheManyAsync('id', new Map([['test-id-1', { id: 'test-id-1' }]]));
|
|
103
|
+
await cacheAdapter.cacheDBMissesAsync('id', ['test-id-2']);
|
|
104
|
+
await cacheAdapter.invalidateManyAsync('id', ['test-id-1', 'test-id-2']);
|
|
105
|
+
const results = await cacheAdapter.loadManyAsync('id', ['test-id-1', 'test-id-2']);
|
|
106
|
+
expect(results.get('test-id-1')).toMatchObject({ status: entity_1.CacheStatus.MISS });
|
|
107
|
+
expect(results.get('test-id-2')).toMatchObject({ status: entity_1.CacheStatus.MISS });
|
|
108
|
+
});
|
|
109
|
+
it('returns when passed empty array of fieldValues', async () => {
|
|
110
|
+
const cacheAdapter = new LocalMemoryCacheAdapter_1.default(entityConfiguration, GenericLocalMemoryCacher_1.default.createLRUCache({
|
|
111
|
+
maxSize: Number.MAX_SAFE_INTEGER,
|
|
112
|
+
ttlSeconds: Number.MAX_SAFE_INTEGER,
|
|
113
|
+
}));
|
|
114
|
+
await cacheAdapter.invalidateManyAsync('id', []);
|
|
115
|
+
});
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
//# sourceMappingURL=LocalMemoryCacheAdapter-test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LocalMemoryCacheAdapter-test.js","sourceRoot":"","sources":["../../src/__tests__/LocalMemoryCacheAdapter-test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { AlwaysAllowPrivacyPolicyRule, EntityPrivacyPolicy, ViewerContext, EntityConfiguration, EntityCompanionDefinition, Entity } from '@expo/entity';
|
|
2
|
+
export declare type LocalMemoryTestEntityFields = {
|
|
3
|
+
id: string;
|
|
4
|
+
name: string;
|
|
5
|
+
dateField: Date | null;
|
|
6
|
+
};
|
|
7
|
+
export default class LocalMemoryTestEntity extends Entity<LocalMemoryTestEntityFields, string, ViewerContext> {
|
|
8
|
+
static getCompanionDefinition(): EntityCompanionDefinition<LocalMemoryTestEntityFields, string, ViewerContext, LocalMemoryTestEntity, LocalMemoryTestEntityPrivacyPolicy>;
|
|
9
|
+
}
|
|
10
|
+
export declare class LocalMemoryTestEntityPrivacyPolicy extends EntityPrivacyPolicy<LocalMemoryTestEntityFields, string, ViewerContext, LocalMemoryTestEntity> {
|
|
11
|
+
protected readonly createRules: AlwaysAllowPrivacyPolicyRule<LocalMemoryTestEntityFields, string, ViewerContext, LocalMemoryTestEntity, keyof LocalMemoryTestEntityFields>[];
|
|
12
|
+
protected readonly readRules: AlwaysAllowPrivacyPolicyRule<LocalMemoryTestEntityFields, string, ViewerContext, LocalMemoryTestEntity, keyof LocalMemoryTestEntityFields>[];
|
|
13
|
+
protected readonly updateRules: AlwaysAllowPrivacyPolicyRule<LocalMemoryTestEntityFields, string, ViewerContext, LocalMemoryTestEntity, keyof LocalMemoryTestEntityFields>[];
|
|
14
|
+
protected readonly deleteRules: AlwaysAllowPrivacyPolicyRule<LocalMemoryTestEntityFields, string, ViewerContext, LocalMemoryTestEntity, keyof LocalMemoryTestEntityFields>[];
|
|
15
|
+
}
|
|
16
|
+
export declare const localMemoryTestEntityConfiguration: EntityConfiguration<LocalMemoryTestEntityFields>;
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.localMemoryTestEntityConfiguration = exports.LocalMemoryTestEntityPrivacyPolicy = void 0;
|
|
4
|
+
const entity_1 = require("@expo/entity");
|
|
5
|
+
class LocalMemoryTestEntity extends entity_1.Entity {
|
|
6
|
+
static getCompanionDefinition() {
|
|
7
|
+
return localMemoryTestEntityCompanionDefinition;
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
exports.default = LocalMemoryTestEntity;
|
|
11
|
+
class LocalMemoryTestEntityPrivacyPolicy extends entity_1.EntityPrivacyPolicy {
|
|
12
|
+
constructor() {
|
|
13
|
+
super(...arguments);
|
|
14
|
+
this.createRules = [
|
|
15
|
+
new entity_1.AlwaysAllowPrivacyPolicyRule(),
|
|
16
|
+
];
|
|
17
|
+
this.readRules = [
|
|
18
|
+
new entity_1.AlwaysAllowPrivacyPolicyRule(),
|
|
19
|
+
];
|
|
20
|
+
this.updateRules = [
|
|
21
|
+
new entity_1.AlwaysAllowPrivacyPolicyRule(),
|
|
22
|
+
];
|
|
23
|
+
this.deleteRules = [
|
|
24
|
+
new entity_1.AlwaysAllowPrivacyPolicyRule(),
|
|
25
|
+
];
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
exports.LocalMemoryTestEntityPrivacyPolicy = LocalMemoryTestEntityPrivacyPolicy;
|
|
29
|
+
exports.localMemoryTestEntityConfiguration = new entity_1.EntityConfiguration({
|
|
30
|
+
idField: 'id',
|
|
31
|
+
tableName: 'local_memory_test_entities',
|
|
32
|
+
schema: {
|
|
33
|
+
id: new entity_1.UUIDField({
|
|
34
|
+
columnName: 'id',
|
|
35
|
+
cache: true,
|
|
36
|
+
}),
|
|
37
|
+
name: new entity_1.StringField({
|
|
38
|
+
columnName: 'name',
|
|
39
|
+
cache: true,
|
|
40
|
+
}),
|
|
41
|
+
dateField: new entity_1.DateField({
|
|
42
|
+
columnName: 'date_field',
|
|
43
|
+
}),
|
|
44
|
+
},
|
|
45
|
+
databaseAdapterFlavor: 'postgres',
|
|
46
|
+
cacheAdapterFlavor: 'local-memory',
|
|
47
|
+
});
|
|
48
|
+
const localMemoryTestEntityCompanionDefinition = new entity_1.EntityCompanionDefinition({
|
|
49
|
+
entityClass: LocalMemoryTestEntity,
|
|
50
|
+
entityConfiguration: exports.localMemoryTestEntityConfiguration,
|
|
51
|
+
privacyPolicyClass: LocalMemoryTestEntityPrivacyPolicy,
|
|
52
|
+
});
|
|
53
|
+
//# sourceMappingURL=LocalMemoryTestEntity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LocalMemoryTestEntity.js","sourceRoot":"","sources":["../../src/testfixtures/LocalMemoryTestEntity.ts"],"names":[],"mappings":";;;AAAA,yCAUsB;AAQtB,MAAqB,qBAAsB,SAAQ,eAIlD;IACC,MAAM,CAAC,sBAAsB;QAO3B,OAAO,wCAAwC,CAAC;IAClD,CAAC;CACF;AAdD,wCAcC;AAED,MAAa,kCAAmC,SAAQ,4BAKvD;IALD;;QAM8B,gBAAW,GAAG;YACxC,IAAI,qCAA4B,EAK7B;SACJ,CAAC;QAC0B,cAAS,GAAG;YACtC,IAAI,qCAA4B,EAK7B;SACJ,CAAC;QAC0B,gBAAW,GAAG;YACxC,IAAI,qCAA4B,EAK7B;SACJ,CAAC;QAC0B,gBAAW,GAAG;YACxC,IAAI,qCAA4B,EAK7B;SACJ,CAAC;IACJ,CAAC;CAAA;AAtCD,gFAsCC;AAEY,QAAA,kCAAkC,GAC7C,IAAI,4BAAmB,CAA8B;IACnD,OAAO,EAAE,IAAI;IACb,SAAS,EAAE,4BAA4B;IACvC,MAAM,EAAE;QACN,EAAE,EAAE,IAAI,kBAAS,CAAC;YAChB,UAAU,EAAE,IAAI;YAChB,KAAK,EAAE,IAAI;SACZ,CAAC;QACF,IAAI,EAAE,IAAI,oBAAW,CAAC;YACpB,UAAU,EAAE,MAAM;YAClB,KAAK,EAAE,IAAI;SACZ,CAAC;QACF,SAAS,EAAE,IAAI,kBAAS,CAAC;YACvB,UAAU,EAAE,YAAY;SACzB,CAAC;KACH;IACD,qBAAqB,EAAE,UAAU;IACjC,kBAAkB,EAAE,cAAc;CACnC,CAAC,CAAC;AAEL,MAAM,wCAAwC,GAAG,IAAI,kCAAyB,CAAC;IAC7E,WAAW,EAAE,qBAAqB;IAClC,mBAAmB,EAAE,0CAAkC;IACvD,kBAAkB,EAAE,kCAAkC;CACvD,CAAC,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { IEntityMetricsAdapter, EntityCompanionProvider } from '@expo/entity';
|
|
2
|
+
export declare const createLocalMemoryIntegrationTestEntityCompanionProvider: (localMemoryOptions?: {
|
|
3
|
+
maxSize?: number;
|
|
4
|
+
ttlSeconds?: number;
|
|
5
|
+
}, metricsAdapter?: IEntityMetricsAdapter) => EntityCompanionProvider;
|
|
6
|
+
export declare const createNoopLocalMemoryIntegrationTestEntityCompanionProvider: (metricsAdapter?: IEntityMetricsAdapter) => EntityCompanionProvider;
|