@microsoft/agents-hosting-storage-cosmos 1.4.0-beta.7.g541749904d → 1.4.2
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/src/cosmosDbKeyEscape.d.ts +6 -11
- package/dist/src/cosmosDbKeyEscape.js +34 -41
- package/dist/src/cosmosDbKeyEscape.js.map +1 -1
- package/dist/src/cosmosDbPartitionedStorage.js +4 -4
- package/dist/src/cosmosDbPartitionedStorage.js.map +1 -1
- package/package.json +3 -3
- package/src/cosmosDbKeyEscape.ts +46 -51
- package/src/cosmosDbPartitionedStorage.ts +5 -5
|
@@ -1,13 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Escapes a key for use in Cosmos DB.
|
|
3
|
+
* @param key The key to escape.
|
|
4
|
+
* @param keySuffix The suffix to append to the key.
|
|
5
|
+
* @param compatibilityMode Indicates whether compatibility mode is enabled.
|
|
6
|
+
* @returns The escaped key.
|
|
3
7
|
*/
|
|
4
|
-
export declare
|
|
5
|
-
/**
|
|
6
|
-
* Escapes a key for use in Cosmos DB.
|
|
7
|
-
* @param key The key to escape.
|
|
8
|
-
* @param keySuffix The suffix to append to the key.
|
|
9
|
-
* @param compatibilityMode Indicates whether compatibility mode is enabled.
|
|
10
|
-
* @returns The escaped key.
|
|
11
|
-
*/
|
|
12
|
-
function escapeKey(key: string, keySuffix?: string, compatibilityMode?: boolean): string;
|
|
13
|
-
}
|
|
8
|
+
export declare function escapeKey(key: string, keySuffix?: string, compatibilityMode?: boolean): string;
|
|
@@ -1,55 +1,48 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.escapeKey = escapeKey;
|
|
4
4
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
5
5
|
// Licensed under the MIT License.
|
|
6
6
|
const crypto_1 = require("crypto");
|
|
7
7
|
const agents_activity_1 = require("@microsoft/agents-activity");
|
|
8
8
|
const errorHelper_1 = require("./errorHelper");
|
|
9
|
+
const maxKeyLength = 255;
|
|
10
|
+
const illegalKeys = ['\\', '?', '/', '#', '\t', '\n', '\r', '*'];
|
|
11
|
+
const illegalKeyCharacterReplacementMap = illegalKeys.reduce((map, c) => {
|
|
12
|
+
map.set(c, `*${c.charCodeAt(0).toString(16)}`);
|
|
13
|
+
return map;
|
|
14
|
+
}, new Map());
|
|
9
15
|
/**
|
|
10
|
-
*
|
|
16
|
+
* Escapes a key for use in Cosmos DB.
|
|
17
|
+
* @param key The key to escape.
|
|
18
|
+
* @param keySuffix The suffix to append to the key.
|
|
19
|
+
* @param compatibilityMode Indicates whether compatibility mode is enabled.
|
|
20
|
+
* @returns The escaped key.
|
|
11
21
|
*/
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
const illegalKeys = ['\\', '?', '/', '#', '\t', '\n', '\r', '*'];
|
|
16
|
-
const illegalKeyCharacterReplacementMap = illegalKeys.reduce((map, c) => {
|
|
17
|
-
map.set(c, `*${c.charCodeAt(0).toString(16)}`);
|
|
18
|
-
return map;
|
|
19
|
-
}, new Map());
|
|
20
|
-
/**
|
|
21
|
-
* Escapes a key for use in Cosmos DB.
|
|
22
|
-
* @param key The key to escape.
|
|
23
|
-
* @param keySuffix The suffix to append to the key.
|
|
24
|
-
* @param compatibilityMode Indicates whether compatibility mode is enabled.
|
|
25
|
-
* @returns The escaped key.
|
|
26
|
-
*/
|
|
27
|
-
function escapeKey(key, keySuffix, compatibilityMode) {
|
|
28
|
-
if (!key) {
|
|
29
|
-
throw agents_activity_1.ExceptionHelper.generateException(Error, errorHelper_1.Errors.MissingKeyParameter);
|
|
30
|
-
}
|
|
31
|
-
const keySplitted = key.split('');
|
|
32
|
-
const firstIllegalCharIndex = keySplitted.findIndex((c) => illegalKeys.some((i) => i === c));
|
|
33
|
-
if (firstIllegalCharIndex === -1) {
|
|
34
|
-
return truncateKey(`${key}${keySuffix || ''}`, compatibilityMode);
|
|
35
|
-
}
|
|
36
|
-
const sanitizedKey = keySplitted.reduce((result, c) => result + (illegalKeyCharacterReplacementMap.has(c) ? illegalKeyCharacterReplacementMap.get(c) : c), '');
|
|
37
|
-
return truncateKey(`${sanitizedKey}${keySuffix || ''}`, compatibilityMode);
|
|
22
|
+
function escapeKey(key, keySuffix, compatibilityMode) {
|
|
23
|
+
if (!key) {
|
|
24
|
+
throw agents_activity_1.ExceptionHelper.generateException(Error, errorHelper_1.Errors.MissingKeyParameter);
|
|
38
25
|
}
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
26
|
+
const keySplitted = key.split('');
|
|
27
|
+
const firstIllegalCharIndex = keySplitted.findIndex((c) => illegalKeys.some((i) => i === c));
|
|
28
|
+
if (firstIllegalCharIndex === -1) {
|
|
29
|
+
return truncateKey(`${key}${keySuffix || ''}`, compatibilityMode);
|
|
30
|
+
}
|
|
31
|
+
const sanitizedKey = keySplitted.reduce((result, c) => result + (illegalKeyCharacterReplacementMap.has(c) ? illegalKeyCharacterReplacementMap.get(c) : c), '');
|
|
32
|
+
return truncateKey(`${sanitizedKey}${keySuffix || ''}`, compatibilityMode);
|
|
33
|
+
}
|
|
34
|
+
function truncateKey(key, truncateKeysForCompatibility) {
|
|
35
|
+
if (truncateKeysForCompatibility === false) {
|
|
47
36
|
return key;
|
|
48
37
|
}
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
hash.update(key);
|
|
52
|
-
return hash.digest('hex');
|
|
38
|
+
if (key.length > maxKeyLength) {
|
|
39
|
+
key = hashKey(key);
|
|
53
40
|
}
|
|
54
|
-
|
|
41
|
+
return key;
|
|
42
|
+
}
|
|
43
|
+
function hashKey(key) {
|
|
44
|
+
const hash = (0, crypto_1.createHash)('sha256');
|
|
45
|
+
hash.update(key);
|
|
46
|
+
return hash.digest('hex');
|
|
47
|
+
}
|
|
55
48
|
//# sourceMappingURL=cosmosDbKeyEscape.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cosmosDbKeyEscape.js","sourceRoot":"","sources":["../../src/cosmosDbKeyEscape.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"cosmosDbKeyEscape.js","sourceRoot":"","sources":["../../src/cosmosDbKeyEscape.ts"],"names":[],"mappings":";;AAuBA,8BAwBC;AA/CD,4DAA4D;AAC5D,kCAAkC;AAClC,mCAAmC;AACnC,gEAA4D;AAC5D,+CAAsC;AAEtC,MAAM,YAAY,GAAW,GAAG,CAAA;AAChC,MAAM,WAAW,GAAsB,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,CAAA;AACnF,MAAM,iCAAiC,GAAwB,WAAW,CAAC,MAAM,CAC/E,CAAC,GAAwB,EAAE,CAAS,EAAE,EAAE;IACtC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;IAC9C,OAAO,GAAG,CAAA;AACZ,CAAC,EACD,IAAI,GAAG,EAAE,CACV,CAAA;AAED;;;;;;GAMG;AACH,SAAgB,SAAS,CAAE,GAAW,EAAE,SAAkB,EAAE,iBAA2B;IACrF,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,iCAAe,CAAC,iBAAiB,CACrC,KAAK,EACL,oBAAM,CAAC,mBAAmB,CAC3B,CAAA;IACH,CAAC;IAED,MAAM,WAAW,GAAa,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;IAC3C,MAAM,qBAAqB,GAAW,WAAW,CAAC,SAAS,CAAC,CAAC,CAAS,EAAW,EAAE,CACjF,WAAW,CAAC,IAAI,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CACzC,CAAA;IAED,IAAI,qBAAqB,KAAK,CAAC,CAAC,EAAE,CAAC;QACjC,OAAO,WAAW,CAAC,GAAG,GAAG,GAAG,SAAS,IAAI,EAAE,EAAE,EAAE,iBAAiB,CAAC,CAAA;IACnE,CAAC;IAED,MAAM,YAAY,GAAG,WAAW,CAAC,MAAM,CACrC,CAAC,MAAc,EAAE,CAAS,EAAE,EAAE,CAC5B,MAAM,GAAG,CAAC,iCAAiC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,iCAAiC,CAAC,GAAG,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EACrG,EAAE,CACH,CAAA;IAED,OAAO,WAAW,CAAC,GAAG,YAAY,GAAG,SAAS,IAAI,EAAE,EAAE,EAAE,iBAAiB,CAAC,CAAA;AAC5E,CAAC;AAED,SAAS,WAAW,CAAE,GAAW,EAAE,4BAAsC;IACvE,IAAI,4BAA4B,KAAK,KAAK,EAAE,CAAC;QAC3C,OAAO,GAAG,CAAA;IACZ,CAAC;IAED,IAAI,GAAG,CAAC,MAAM,GAAG,YAAY,EAAE,CAAC;QAC9B,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAA;IACpB,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,SAAS,OAAO,CAAE,GAAW;IAC3B,MAAM,IAAI,GAAG,IAAA,mBAAU,EAAC,QAAQ,CAAC,CAAA;IACjC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;IAChB,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;AAC3B,CAAC"}
|
|
@@ -68,7 +68,7 @@ class CosmosDbPartitionedStorage {
|
|
|
68
68
|
if (cosmosDbStorageOptions.compatibilityMode) {
|
|
69
69
|
throw agents_activity_1.ExceptionHelper.generateException(ReferenceError, errorHelper_1.Errors.InvalidCompatibilityModeWithKeySuffix);
|
|
70
70
|
}
|
|
71
|
-
const suffixEscaped = cosmosDbKeyEscape_1.
|
|
71
|
+
const suffixEscaped = (0, cosmosDbKeyEscape_1.escapeKey)(cosmosDbStorageOptions.keySuffix);
|
|
72
72
|
if (cosmosDbStorageOptions.keySuffix !== suffixEscaped) {
|
|
73
73
|
throw agents_activity_1.ExceptionHelper.generateException(ReferenceError, errorHelper_1.Errors.InvalidKeySuffixCharacters, undefined, { keySuffix: cosmosDbStorageOptions.keySuffix });
|
|
74
74
|
}
|
|
@@ -90,7 +90,7 @@ class CosmosDbPartitionedStorage {
|
|
|
90
90
|
const storeItems = {};
|
|
91
91
|
await Promise.all(keys.map(async (k) => {
|
|
92
92
|
try {
|
|
93
|
-
const escapedKey = cosmosDbKeyEscape_1.
|
|
93
|
+
const escapedKey = (0, cosmosDbKeyEscape_1.escapeKey)(k, this.cosmosDbStorageOptions.keySuffix, this.cosmosDbStorageOptions.compatibilityMode);
|
|
94
94
|
const readItemResponse = await this.container
|
|
95
95
|
.item(escapedKey, this.getPartitionKey(escapedKey))
|
|
96
96
|
.read();
|
|
@@ -128,7 +128,7 @@ class CosmosDbPartitionedStorage {
|
|
|
128
128
|
await this.initialize();
|
|
129
129
|
await Promise.all(Object.entries(changes).map(async ([key, { eTag, ...change }]) => {
|
|
130
130
|
const document = new documentStoreItem_1.DocumentStoreItem({
|
|
131
|
-
id: cosmosDbKeyEscape_1.
|
|
131
|
+
id: (0, cosmosDbKeyEscape_1.escapeKey)(key, this.cosmosDbStorageOptions.keySuffix, this.cosmosDbStorageOptions.compatibilityMode),
|
|
132
132
|
realId: key,
|
|
133
133
|
document: change,
|
|
134
134
|
});
|
|
@@ -151,7 +151,7 @@ class CosmosDbPartitionedStorage {
|
|
|
151
151
|
async delete(keys) {
|
|
152
152
|
await this.initialize();
|
|
153
153
|
await Promise.all(keys.map(async (k) => {
|
|
154
|
-
const escapedKey = cosmosDbKeyEscape_1.
|
|
154
|
+
const escapedKey = (0, cosmosDbKeyEscape_1.escapeKey)(k, this.cosmosDbStorageOptions.keySuffix, this.cosmosDbStorageOptions.compatibilityMode);
|
|
155
155
|
try {
|
|
156
156
|
await this.container.item(escapedKey, this.getPartitionKey(escapedKey)).delete();
|
|
157
157
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cosmosDbPartitionedStorage.js","sourceRoot":"","sources":["../../src/cosmosDbPartitionedStorage.ts"],"names":[],"mappings":";AAAA,4DAA4D;AAC5D,kCAAkC;;;AAElC,0CAAuD;AACvD,
|
|
1
|
+
{"version":3,"file":"cosmosDbPartitionedStorage.js","sourceRoot":"","sources":["../../src/cosmosDbPartitionedStorage.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://json.schemastore.org/package.json",
|
|
3
3
|
"name": "@microsoft/agents-hosting-storage-cosmos",
|
|
4
|
-
"version": "1.4.
|
|
4
|
+
"version": "1.4.2",
|
|
5
5
|
"homepage": "https://github.com/microsoft/Agents-for-js",
|
|
6
6
|
"repository": {
|
|
7
7
|
"type": "git",
|
|
@@ -17,8 +17,8 @@
|
|
|
17
17
|
"types": "dist/src/index.d.ts",
|
|
18
18
|
"dependencies": {
|
|
19
19
|
"@azure/cosmos": "^4.9.1",
|
|
20
|
-
"@microsoft/agents-hosting": "1.4.
|
|
21
|
-
"@microsoft/agents-activity": "1.4.
|
|
20
|
+
"@microsoft/agents-hosting": "1.4.2",
|
|
21
|
+
"@microsoft/agents-activity": "1.4.2"
|
|
22
22
|
},
|
|
23
23
|
"license": "MIT",
|
|
24
24
|
"files": [
|
package/src/cosmosDbKeyEscape.ts
CHANGED
|
@@ -4,67 +4,62 @@ import { createHash } from 'crypto'
|
|
|
4
4
|
import { ExceptionHelper } from '@microsoft/agents-activity'
|
|
5
5
|
import { Errors } from './errorHelper'
|
|
6
6
|
|
|
7
|
+
const maxKeyLength: number = 255
|
|
8
|
+
const illegalKeys: readonly string[] = ['\\', '?', '/', '#', '\t', '\n', '\r', '*']
|
|
9
|
+
const illegalKeyCharacterReplacementMap: Map<string, string> = illegalKeys.reduce<Map<string, string>>(
|
|
10
|
+
(map: Map<string, string>, c: string) => {
|
|
11
|
+
map.set(c, `*${c.charCodeAt(0).toString(16)}`)
|
|
12
|
+
return map
|
|
13
|
+
},
|
|
14
|
+
new Map()
|
|
15
|
+
)
|
|
16
|
+
|
|
7
17
|
/**
|
|
8
|
-
*
|
|
18
|
+
* Escapes a key for use in Cosmos DB.
|
|
19
|
+
* @param key The key to escape.
|
|
20
|
+
* @param keySuffix The suffix to append to the key.
|
|
21
|
+
* @param compatibilityMode Indicates whether compatibility mode is enabled.
|
|
22
|
+
* @returns The escaped key.
|
|
9
23
|
*/
|
|
10
|
-
export
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
map.set(c, `*${c.charCodeAt(0).toString(16)}`)
|
|
16
|
-
return map
|
|
17
|
-
},
|
|
18
|
-
new Map()
|
|
19
|
-
)
|
|
20
|
-
|
|
21
|
-
/**
|
|
22
|
-
* Escapes a key for use in Cosmos DB.
|
|
23
|
-
* @param key The key to escape.
|
|
24
|
-
* @param keySuffix The suffix to append to the key.
|
|
25
|
-
* @param compatibilityMode Indicates whether compatibility mode is enabled.
|
|
26
|
-
* @returns The escaped key.
|
|
27
|
-
*/
|
|
28
|
-
export function escapeKey (key: string, keySuffix?: string, compatibilityMode?: boolean): string {
|
|
29
|
-
if (!key) {
|
|
30
|
-
throw ExceptionHelper.generateException(
|
|
31
|
-
Error,
|
|
32
|
-
Errors.MissingKeyParameter
|
|
33
|
-
)
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
const keySplitted: string[] = key.split('')
|
|
37
|
-
const firstIllegalCharIndex: number = keySplitted.findIndex((c: string): boolean =>
|
|
38
|
-
illegalKeys.some((i: string) => i === c)
|
|
24
|
+
export function escapeKey (key: string, keySuffix?: string, compatibilityMode?: boolean): string {
|
|
25
|
+
if (!key) {
|
|
26
|
+
throw ExceptionHelper.generateException(
|
|
27
|
+
Error,
|
|
28
|
+
Errors.MissingKeyParameter
|
|
39
29
|
)
|
|
30
|
+
}
|
|
40
31
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
const sanitizedKey = keySplitted.reduce(
|
|
46
|
-
(result: string, c: string) =>
|
|
47
|
-
result + (illegalKeyCharacterReplacementMap.has(c) ? illegalKeyCharacterReplacementMap.get(c)! : c),
|
|
48
|
-
''
|
|
49
|
-
)
|
|
32
|
+
const keySplitted: string[] = key.split('')
|
|
33
|
+
const firstIllegalCharIndex: number = keySplitted.findIndex((c: string): boolean =>
|
|
34
|
+
illegalKeys.some((i: string) => i === c)
|
|
35
|
+
)
|
|
50
36
|
|
|
51
|
-
|
|
37
|
+
if (firstIllegalCharIndex === -1) {
|
|
38
|
+
return truncateKey(`${key}${keySuffix || ''}`, compatibilityMode)
|
|
52
39
|
}
|
|
53
40
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
41
|
+
const sanitizedKey = keySplitted.reduce(
|
|
42
|
+
(result: string, c: string) =>
|
|
43
|
+
result + (illegalKeyCharacterReplacementMap.has(c) ? illegalKeyCharacterReplacementMap.get(c)! : c),
|
|
44
|
+
''
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
return truncateKey(`${sanitizedKey}${keySuffix || ''}`, compatibilityMode)
|
|
48
|
+
}
|
|
58
49
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
}
|
|
50
|
+
function truncateKey (key: string, truncateKeysForCompatibility?: boolean): string {
|
|
51
|
+
if (truncateKeysForCompatibility === false) {
|
|
62
52
|
return key
|
|
63
53
|
}
|
|
64
54
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
hash.update(key)
|
|
68
|
-
return hash.digest('hex')
|
|
55
|
+
if (key.length > maxKeyLength) {
|
|
56
|
+
key = hashKey(key)
|
|
69
57
|
}
|
|
58
|
+
return key
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function hashKey (key: string): string {
|
|
62
|
+
const hash = createHash('sha256')
|
|
63
|
+
hash.update(key)
|
|
64
|
+
return hash.digest('hex')
|
|
70
65
|
}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// Licensed under the MIT License.
|
|
3
3
|
|
|
4
4
|
import { Container, CosmosClient } from '@azure/cosmos'
|
|
5
|
-
import {
|
|
5
|
+
import { escapeKey } from './cosmosDbKeyEscape'
|
|
6
6
|
import { DocumentStoreItem } from './documentStoreItem'
|
|
7
7
|
import { CosmosDbPartitionedStorageOptions } from './cosmosDbPartitionedStorageOptions'
|
|
8
8
|
import { Storage, StoreItems } from '@microsoft/agents-hosting'
|
|
@@ -95,7 +95,7 @@ export class CosmosDbPartitionedStorage implements Storage {
|
|
|
95
95
|
Errors.InvalidCompatibilityModeWithKeySuffix
|
|
96
96
|
)
|
|
97
97
|
}
|
|
98
|
-
const suffixEscaped =
|
|
98
|
+
const suffixEscaped = escapeKey(cosmosDbStorageOptions.keySuffix)
|
|
99
99
|
if (cosmosDbStorageOptions.keySuffix !== suffixEscaped) {
|
|
100
100
|
throw ExceptionHelper.generateException(
|
|
101
101
|
ReferenceError,
|
|
@@ -129,7 +129,7 @@ export class CosmosDbPartitionedStorage implements Storage {
|
|
|
129
129
|
await Promise.all(
|
|
130
130
|
keys.map(async (k: string): Promise<void> => {
|
|
131
131
|
try {
|
|
132
|
-
const escapedKey =
|
|
132
|
+
const escapedKey = escapeKey(
|
|
133
133
|
k,
|
|
134
134
|
this.cosmosDbStorageOptions.keySuffix,
|
|
135
135
|
this.cosmosDbStorageOptions.compatibilityMode
|
|
@@ -185,7 +185,7 @@ export class CosmosDbPartitionedStorage implements Storage {
|
|
|
185
185
|
await Promise.all(
|
|
186
186
|
Object.entries(changes).map(async ([key, { eTag, ...change }]): Promise<void> => {
|
|
187
187
|
const document = new DocumentStoreItem({
|
|
188
|
-
id:
|
|
188
|
+
id: escapeKey(
|
|
189
189
|
key,
|
|
190
190
|
this.cosmosDbStorageOptions.keySuffix,
|
|
191
191
|
this.cosmosDbStorageOptions.compatibilityMode
|
|
@@ -222,7 +222,7 @@ export class CosmosDbPartitionedStorage implements Storage {
|
|
|
222
222
|
|
|
223
223
|
await Promise.all(
|
|
224
224
|
keys.map(async (k: string): Promise<void> => {
|
|
225
|
-
const escapedKey =
|
|
225
|
+
const escapedKey = escapeKey(
|
|
226
226
|
k,
|
|
227
227
|
this.cosmosDbStorageOptions.keySuffix,
|
|
228
228
|
this.cosmosDbStorageOptions.compatibilityMode
|