@karmaniverous/entity-manager 6.5.1 → 6.7.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/dist/cjs/BaseShardQueryMapBuilder.js +34 -0
- package/dist/cjs/EntityManager.js +18 -9
- package/dist/cjs/addKeys.js +5 -5
- package/dist/cjs/decodeEntityElement.js +4 -4
- package/dist/cjs/decodeGeneratedProperty.js +5 -5
- package/dist/cjs/dehydrateIndexItem.js +3 -3
- package/dist/cjs/dehydratePageKeyMap.js +6 -6
- package/dist/cjs/encodeEntityElement.js +4 -4
- package/dist/cjs/encodeGeneratedProperty.js +4 -4
- package/dist/cjs/index.js +2 -0
- package/dist/cjs/query.js +7 -7
- package/dist/cjs/rehydrateIndexItem.js +5 -5
- package/dist/cjs/rehydratePageKeyMap.js +7 -7
- package/dist/cjs/removeKeys.js +4 -4
- package/dist/cjs/updateItemHashKey.js +3 -3
- package/dist/cjs/updateItemRangeKey.js +4 -4
- package/dist/index.d.ts +96 -80
- package/dist/mjs/BaseShardQueryMapBuilder.js +32 -0
- package/dist/mjs/EntityManager.js +18 -9
- package/dist/mjs/addKeys.js +5 -5
- package/dist/mjs/decodeEntityElement.js +4 -4
- package/dist/mjs/decodeGeneratedProperty.js +5 -5
- package/dist/mjs/dehydrateIndexItem.js +3 -3
- package/dist/mjs/dehydratePageKeyMap.js +6 -6
- package/dist/mjs/encodeEntityElement.js +4 -4
- package/dist/mjs/encodeGeneratedProperty.js +4 -4
- package/dist/mjs/index.js +1 -0
- package/dist/mjs/query.js +7 -7
- package/dist/mjs/rehydrateIndexItem.js +5 -5
- package/dist/mjs/rehydratePageKeyMap.js +7 -7
- package/dist/mjs/removeKeys.js +4 -4
- package/dist/mjs/updateItemHashKey.js +3 -3
- package/dist/mjs/updateItemRangeKey.js +4 -4
- package/package.json +1 -1
package/dist/mjs/query.js
CHANGED
|
@@ -25,22 +25,22 @@ const { compressToEncodedURIComponent, decompressFromEncodedURIComponent } = lzS
|
|
|
25
25
|
*
|
|
26
26
|
* @throws Error if {@link QueryOptions.pageKeyMap | `pageKeyMap`} keys do not match {@link QueryOptions.shardQueryMap | `shardQueryMap`} keys.
|
|
27
27
|
*/
|
|
28
|
-
async function query(entityManager, { entityToken,
|
|
28
|
+
async function query(entityManager, { entityToken, hashKeyToken, limit, pageKeyMap, pageSize, shardQueryMap, sortOrder = [], timestampFrom = 0, timestampTo = Date.now(), throttle = entityManager.config.throttle, }) {
|
|
29
29
|
try {
|
|
30
30
|
// Get defaults.
|
|
31
31
|
const { defaultLimit, defaultPageSize } = entityManager.config.entities[entityToken];
|
|
32
32
|
limit ?? (limit = defaultLimit);
|
|
33
33
|
pageSize ?? (pageSize = defaultPageSize);
|
|
34
34
|
// Validate params.
|
|
35
|
-
validateEntityGeneratedProperty(entityManager, entityToken,
|
|
35
|
+
validateEntityGeneratedProperty(entityManager, entityToken, hashKeyToken, true);
|
|
36
36
|
if (!(limit === Infinity || (isInt(limit) && limit >= 1)))
|
|
37
37
|
throw new Error('limit must be a positive integer or Infinity.');
|
|
38
38
|
if (!(isInt(pageSize) && pageSize >= 1))
|
|
39
39
|
throw new Error('pageSize must be a positive integer');
|
|
40
40
|
// Rehydrate pageKeyMap.
|
|
41
|
-
const rehydratedPageKeyMap = rehydratePageKeyMap(entityManager, pageKeyMap
|
|
41
|
+
const rehydratedPageKeyMap = rehydratePageKeyMap(entityManager, entityToken, Object.keys(shardQueryMap), pageKeyMap
|
|
42
42
|
? JSON.parse(decompressFromEncodedURIComponent(pageKeyMap))
|
|
43
|
-
: undefined,
|
|
43
|
+
: undefined, timestampFrom, timestampTo);
|
|
44
44
|
// Shortcut if pageKeyMap is empty.
|
|
45
45
|
if (!Object.keys(rehydratedPageKeyMap).length)
|
|
46
46
|
return {
|
|
@@ -88,11 +88,11 @@ async function query(entityManager, { entityToken, hashKey, limit, pageKeyMap, p
|
|
|
88
88
|
const result = {
|
|
89
89
|
count: workingResult.items.length,
|
|
90
90
|
items: workingResult.items,
|
|
91
|
-
pageKeyMap: compressToEncodedURIComponent(JSON.stringify(dehydratePageKeyMap(entityManager, workingResult.pageKeyMap
|
|
91
|
+
pageKeyMap: compressToEncodedURIComponent(JSON.stringify(dehydratePageKeyMap(entityManager, entityToken, workingResult.pageKeyMap))),
|
|
92
92
|
};
|
|
93
93
|
entityManager.logger.debug('queried entityToken across shards', {
|
|
94
94
|
entityToken,
|
|
95
|
-
|
|
95
|
+
hashKeyToken,
|
|
96
96
|
limit,
|
|
97
97
|
pageKeyMap,
|
|
98
98
|
pageSize,
|
|
@@ -110,7 +110,7 @@ async function query(entityManager, { entityToken, hashKey, limit, pageKeyMap, p
|
|
|
110
110
|
if (error instanceof Error)
|
|
111
111
|
entityManager.logger.error(error.message, {
|
|
112
112
|
entityToken,
|
|
113
|
-
|
|
113
|
+
hashKeyToken,
|
|
114
114
|
limit,
|
|
115
115
|
pageKeyMap,
|
|
116
116
|
pageSize,
|
|
@@ -12,9 +12,9 @@ import { validateEntityIndexToken } from './validateEntityIndexToken.js';
|
|
|
12
12
|
* {@link EntityManager.dehydrateIndexItem | `dehydrateIndexItem`} alphebetically sorts unwrapped index elements during the dehydration process. This method assumes delimited element values are presented in the same order.
|
|
13
13
|
*
|
|
14
14
|
* @param entityManager - {@link EntityManager | `EntityManager`} instance.
|
|
15
|
-
* @param dehydrated - Dehydrated index value.
|
|
16
15
|
* @param entityToken - {@link ConfigKeys.entities | `entityManager.config.entities`} key.
|
|
17
16
|
* @param indexToken - {@link ConfigEntity.indexes | `entityManager.config.entities.<entityToken>.indexes`} key.
|
|
17
|
+
* @param dehydrated - Dehydrated index value.
|
|
18
18
|
* @param omit - Array of index components omitted from `dehydrated`.
|
|
19
19
|
*
|
|
20
20
|
* @returns Partial {@link ItemMap | `ItemMap`} object containing rehydrated index component elements.
|
|
@@ -22,7 +22,7 @@ import { validateEntityIndexToken } from './validateEntityIndexToken.js';
|
|
|
22
22
|
* @throws `Error` if `entityToken` is invalid.
|
|
23
23
|
* @throws `Error` if `indexToken` is invalid.
|
|
24
24
|
*/
|
|
25
|
-
function rehydrateIndexItem(entityManager,
|
|
25
|
+
function rehydrateIndexItem(entityManager, entityToken, indexToken, dehydrated, omit = []) {
|
|
26
26
|
try {
|
|
27
27
|
const { generatedKeyDelimiter } = entityManager.config;
|
|
28
28
|
// Validate params.
|
|
@@ -34,11 +34,11 @@ function rehydrateIndexItem(entityManager, dehydrated, entityToken, indexToken,
|
|
|
34
34
|
if (elements.length !== values.length)
|
|
35
35
|
throw new Error('index rehydration key-value mismatch');
|
|
36
36
|
// Assign values to elements.
|
|
37
|
-
const rehydrated = shake(zipToObject(elements, values.map((value, i) => decodeEntityElement(entityManager,
|
|
37
|
+
const rehydrated = shake(zipToObject(elements, values.map((value, i) => decodeEntityElement(entityManager, entityToken, elements[i], value))));
|
|
38
38
|
entityManager.logger.debug('rehydrated index', {
|
|
39
|
-
dehydrated,
|
|
40
39
|
entityToken,
|
|
41
40
|
indexToken,
|
|
41
|
+
dehydrated,
|
|
42
42
|
elements,
|
|
43
43
|
values,
|
|
44
44
|
rehydrated,
|
|
@@ -48,9 +48,9 @@ function rehydrateIndexItem(entityManager, dehydrated, entityToken, indexToken,
|
|
|
48
48
|
catch (error) {
|
|
49
49
|
if (error instanceof Error)
|
|
50
50
|
entityManager.logger.error(error.message, {
|
|
51
|
-
dehydrated,
|
|
52
51
|
entityToken,
|
|
53
52
|
indexToken,
|
|
53
|
+
dehydrated,
|
|
54
54
|
});
|
|
55
55
|
throw error;
|
|
56
56
|
}
|
|
@@ -12,9 +12,9 @@ import { validateEntityIndexToken } from './validateEntityIndexToken.js';
|
|
|
12
12
|
* Reverses the {@link EntityManager.dehydratePageKeyMap | `dehydratePageKeyMap`} method.
|
|
13
13
|
*
|
|
14
14
|
* @param entityManager - {@link EntityManager | `EntityManager`} instance.
|
|
15
|
-
* @param dehydrated - Array of dehydrated page keys or undefined if new query.
|
|
16
15
|
* @param entityToken - {@link ConfigKeys.entities | `entityManager.config.entities`} key.
|
|
17
16
|
* @param indexTokens - Array of {@link ConfigEntity.indexes | `entityManager.config.entities.<entityToken>.indexes`} keys used as keys of the original {@link PageKeyMap | `PageKeyMap`}.
|
|
17
|
+
* @param dehydrated - Array of dehydrated page keys or undefined if new query.
|
|
18
18
|
* @param timestampFrom - Lower timestanp limit used to generate the original {@link PageKeyMap | `PageKeyMap`}. Defaults to `0`.
|
|
19
19
|
* @param timestampTo - Upper timestamp limit used to generate the original {@link PageKeyMap | `PageKeyMap`}. Defaults to `Date.now()`.
|
|
20
20
|
*
|
|
@@ -25,7 +25,7 @@ import { validateEntityIndexToken } from './validateEntityIndexToken.js';
|
|
|
25
25
|
* @throws `Error` if any `indexTokens` are invalid.
|
|
26
26
|
* @throws `Error` if `dehydrated` has invalid length.
|
|
27
27
|
*/
|
|
28
|
-
function rehydratePageKeyMap(entityManager,
|
|
28
|
+
function rehydratePageKeyMap(entityManager, entityToken, indexTokens, dehydrated, timestampFrom = 0, timestampTo = Date.now()) {
|
|
29
29
|
try {
|
|
30
30
|
// Validate params.
|
|
31
31
|
if (!indexTokens.length)
|
|
@@ -47,17 +47,17 @@ function rehydratePageKeyMap(entityManager, dehydrated, entityToken, indexTokens
|
|
|
47
47
|
return;
|
|
48
48
|
let item = {
|
|
49
49
|
[entityManager.config.hashKey]: hashKey,
|
|
50
|
-
...rehydrateIndexItem(entityManager,
|
|
50
|
+
...rehydrateIndexItem(entityManager, entityToken, index, dehydratedIndexPageKeyMaps[i], [entityManager.config.hashKey]),
|
|
51
51
|
};
|
|
52
|
-
item = updateItemRangeKey(entityManager,
|
|
52
|
+
item = updateItemRangeKey(entityManager, entityToken, item);
|
|
53
53
|
return zipToObject(getIndexComponents(entityManager, entityToken, index), (component) => entityManager.config.entities[entityToken].generated[component]
|
|
54
|
-
? encodeGeneratedProperty(entityManager,
|
|
54
|
+
? encodeGeneratedProperty(entityManager, entityToken, component, item)
|
|
55
55
|
: item[component]);
|
|
56
56
|
}));
|
|
57
57
|
entityManager.logger.debug('rehydrated page key map', {
|
|
58
|
-
dehydrated,
|
|
59
58
|
entityToken,
|
|
60
59
|
indexTokens,
|
|
60
|
+
dehydrated,
|
|
61
61
|
rehydrated,
|
|
62
62
|
});
|
|
63
63
|
return rehydrated;
|
|
@@ -65,9 +65,9 @@ function rehydratePageKeyMap(entityManager, dehydrated, entityToken, indexTokens
|
|
|
65
65
|
catch (error) {
|
|
66
66
|
if (error instanceof Error)
|
|
67
67
|
entityManager.logger.error(error.message, {
|
|
68
|
-
dehydrated,
|
|
69
68
|
entityToken,
|
|
70
69
|
indexTokens,
|
|
70
|
+
dehydrated,
|
|
71
71
|
});
|
|
72
72
|
throw error;
|
|
73
73
|
}
|
package/dist/mjs/removeKeys.js
CHANGED
|
@@ -4,14 +4,14 @@ import { validateEntityToken } from './validateEntityToken.js';
|
|
|
4
4
|
* Strips generated properties, hash key, and range key from an {@link ItemMap | `ItemMap`} object.
|
|
5
5
|
*
|
|
6
6
|
* @param entityManager - {@link EntityManager | `EntityManager`} instance.
|
|
7
|
-
* @param item - {@link ItemMap | `ItemMap`} object.
|
|
8
7
|
* @param entityToken - {@link ConfigKeys.entities | `entityManager.config.entities`} key.
|
|
8
|
+
* @param item - {@link ItemMap | `ItemMap`} object.
|
|
9
9
|
*
|
|
10
10
|
* @returns Shallow clone of `item` without generated properties, hash key or range key.
|
|
11
11
|
*
|
|
12
12
|
* @throws `Error` if `entityToken` is invalid.
|
|
13
13
|
*/
|
|
14
|
-
function removeKeys(entityManager,
|
|
14
|
+
function removeKeys(entityManager, entityToken, item) {
|
|
15
15
|
try {
|
|
16
16
|
// Validate params.
|
|
17
17
|
validateEntityToken(entityManager, entityToken);
|
|
@@ -23,15 +23,15 @@ function removeKeys(entityManager, item, entityToken) {
|
|
|
23
23
|
for (const property in entityManager.config.entities[entityToken].generated)
|
|
24
24
|
delete newItem[property];
|
|
25
25
|
entityManager.logger.debug('stripped entity item generated properties', {
|
|
26
|
-
item,
|
|
27
26
|
entityToken,
|
|
27
|
+
item,
|
|
28
28
|
newItem,
|
|
29
29
|
});
|
|
30
30
|
return newItem;
|
|
31
31
|
}
|
|
32
32
|
catch (error) {
|
|
33
33
|
if (error instanceof Error)
|
|
34
|
-
entityManager.logger.error(error.message, {
|
|
34
|
+
entityManager.logger.error(error.message, { entityToken, item });
|
|
35
35
|
throw error;
|
|
36
36
|
}
|
|
37
37
|
}
|
|
@@ -7,15 +7,15 @@ import { validateEntityToken } from './validateEntityToken.js';
|
|
|
7
7
|
* Update the hash key on a partial {@link ItemMap | `ItemMap`} object.
|
|
8
8
|
*
|
|
9
9
|
* @param entityManager - {@link EntityManager | `EntityManager`} instance.
|
|
10
|
-
* @param item - Partial {@link ItemMap | `ItemMap`} object.
|
|
11
10
|
* @param entityToken - {@link ConfigKeys.entities | `this.config.entities`} key.
|
|
11
|
+
* @param item - Partial {@link ItemMap | `ItemMap`} object.
|
|
12
12
|
* @param overwrite - Overwrite existing {@link ConfigKeys.hashKey | `this.config.hashKey`} property value (default `false`).
|
|
13
13
|
*
|
|
14
14
|
* @returns Shallow clone of `item` with updated hash key.
|
|
15
15
|
*
|
|
16
16
|
* @throws `Error` if `entityToken` is invalid.
|
|
17
17
|
*/
|
|
18
|
-
function updateItemHashKey(entityManager,
|
|
18
|
+
function updateItemHashKey(entityManager, entityToken, item, overwrite = false) {
|
|
19
19
|
try {
|
|
20
20
|
// Validate params.
|
|
21
21
|
validateEntityToken(entityManager, entityToken);
|
|
@@ -59,8 +59,8 @@ function updateItemHashKey(entityManager, item, entityToken, overwrite = false)
|
|
|
59
59
|
catch (error) {
|
|
60
60
|
if (error instanceof Error)
|
|
61
61
|
entityManager.logger.error(error.message, {
|
|
62
|
-
item,
|
|
63
62
|
entityToken,
|
|
63
|
+
item,
|
|
64
64
|
overwrite,
|
|
65
65
|
});
|
|
66
66
|
throw error;
|
|
@@ -5,8 +5,8 @@ import { validateEntityToken } from './validateEntityToken.js';
|
|
|
5
5
|
* Update the range key on a partial {@link ItemMap | `ItemMap`} object.
|
|
6
6
|
*
|
|
7
7
|
* @param entityManager - {@link EntityManager | `EntityManager`} instance.
|
|
8
|
-
* @param item - Partial {@link ItemMap | `ItemMap`} object.
|
|
9
8
|
* @param entityToken - {@link ConfigKeys.entities | `this.config.entities`} key.
|
|
9
|
+
* @param item - Partial {@link ItemMap | `ItemMap`} object.
|
|
10
10
|
* @param overwrite - Overwrite existing {@link ConfigKeys.rangeKey | `this.config.rangeKey`} property value (default `false`).
|
|
11
11
|
*
|
|
12
12
|
* @returns Shallow clone of `item` with updated range key.
|
|
@@ -14,15 +14,15 @@ import { validateEntityToken } from './validateEntityToken.js';
|
|
|
14
14
|
* @throws `Error` if `entityToken` is invalid.
|
|
15
15
|
* @throws `Error` if `item` {@link ConfigEntity.uniqueProperty | `this.config.entities<entityToken>.uniqueProperty`} property value is missing.
|
|
16
16
|
*/
|
|
17
|
-
function updateItemRangeKey(entityManager,
|
|
17
|
+
function updateItemRangeKey(entityManager, entityToken, item, overwrite = false) {
|
|
18
18
|
try {
|
|
19
19
|
// Validate params.
|
|
20
20
|
validateEntityToken(entityManager, entityToken);
|
|
21
21
|
// Return current item if rangeKey exists and overwrite is false.
|
|
22
22
|
if (item[entityManager.config.rangeKey] && !overwrite) {
|
|
23
23
|
entityManager.logger.debug('did not overwrite existing entity item range key', {
|
|
24
|
-
item,
|
|
25
24
|
entityToken,
|
|
25
|
+
item,
|
|
26
26
|
overwrite,
|
|
27
27
|
});
|
|
28
28
|
return { ...item };
|
|
@@ -49,8 +49,8 @@ function updateItemRangeKey(entityManager, item, entityToken, overwrite = false)
|
|
|
49
49
|
catch (error) {
|
|
50
50
|
if (error instanceof Error)
|
|
51
51
|
entityManager.logger.error(error.message, {
|
|
52
|
-
item,
|
|
53
52
|
entityToken,
|
|
53
|
+
item,
|
|
54
54
|
overwrite,
|
|
55
55
|
});
|
|
56
56
|
throw error;
|
package/package.json
CHANGED