@dcl/sdk 7.20.1-21975617794.commit-7189140 → 7.20.1-21988479316.commit-3b19265
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/package.json +6 -6
- package/server/index.d.ts +1 -1
- package/server/index.js +1 -1
- package/server/storage/constants.d.ts +22 -0
- package/server/storage/constants.js +1 -1
- package/server/storage/index.d.ts +3 -2
- package/server/storage/index.js +4 -3
- package/server/storage/player.d.ts +9 -0
- package/server/storage/player.js +32 -1
- package/server/storage/scene.d.ts +8 -0
- package/server/storage/scene.js +30 -1
- package/src/server/index.ts +1 -1
- package/src/server/storage/constants.ts +21 -0
- package/src/server/storage/index.ts +5 -3
- package/src/server/storage/player.ts +51 -1
- package/src/server/storage/scene.ts +48 -1
package/package.json
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dcl/sdk",
|
|
3
3
|
"description": "",
|
|
4
|
-
"version": "7.20.1-
|
|
4
|
+
"version": "7.20.1-21988479316.commit-3b19265",
|
|
5
5
|
"author": "Decentraland",
|
|
6
6
|
"dependencies": {
|
|
7
|
-
"@dcl/ecs": "7.20.1-
|
|
7
|
+
"@dcl/ecs": "7.20.1-21988479316.commit-3b19265",
|
|
8
8
|
"@dcl/ecs-math": "2.1.0",
|
|
9
9
|
"@dcl/explorer": "1.0.164509-20240802172549.commit-fb95b9b",
|
|
10
|
-
"@dcl/js-runtime": "7.20.1-
|
|
11
|
-
"@dcl/react-ecs": "7.20.1-
|
|
12
|
-
"@dcl/sdk-commands": "7.20.1-
|
|
10
|
+
"@dcl/js-runtime": "7.20.1-21988479316.commit-3b19265",
|
|
11
|
+
"@dcl/react-ecs": "7.20.1-21988479316.commit-3b19265",
|
|
12
|
+
"@dcl/sdk-commands": "7.20.1-21988479316.commit-3b19265",
|
|
13
13
|
"text-encoding": "0.7.0"
|
|
14
14
|
},
|
|
15
15
|
"keywords": [],
|
|
@@ -35,5 +35,5 @@
|
|
|
35
35
|
},
|
|
36
36
|
"types": "./index.d.ts",
|
|
37
37
|
"typings": "./index.d.ts",
|
|
38
|
-
"commit": "
|
|
38
|
+
"commit": "3b19265b2333cbf74a4e7cb0245f6561e064e0c5"
|
|
39
39
|
}
|
package/server/index.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export { EnvVar } from './env-var';
|
|
2
|
-
export { Storage, IStorage, ISceneStorage, IPlayerStorage } from './storage';
|
|
2
|
+
export { Storage, IStorage, ISceneStorage, IPlayerStorage, GetValuesOptions, GetValuesResult } from './storage';
|
package/server/index.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
export { EnvVar } from './env-var';
|
|
2
2
|
export { Storage } from './storage';
|
|
3
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvc2VydmVyL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFDbEMsT0FBTyxFQUFFLE9BQU8sRUFBOEUsTUFBTSxXQUFXLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBFbnZWYXIgfSBmcm9tICcuL2Vudi12YXInXG5leHBvcnQgeyBTdG9yYWdlLCBJU3RvcmFnZSwgSVNjZW5lU3RvcmFnZSwgSVBsYXllclN0b3JhZ2UsIEdldFZhbHVlc09wdGlvbnMsIEdldFZhbHVlc1Jlc3VsdCB9IGZyb20gJy4vc3RvcmFnZSdcbiJdfQ==
|
|
@@ -1 +1,23 @@
|
|
|
1
1
|
export declare const MODULE_NAME = "Storage";
|
|
2
|
+
/**
|
|
3
|
+
* Options for getValues pagination and filtering.
|
|
4
|
+
*/
|
|
5
|
+
export interface GetValuesOptions {
|
|
6
|
+
prefix?: string;
|
|
7
|
+
limit?: number;
|
|
8
|
+
offset?: number;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Result of getValues with pagination metadata.
|
|
12
|
+
*/
|
|
13
|
+
export interface GetValuesResult {
|
|
14
|
+
/** Key-value entries for the current page. */
|
|
15
|
+
data: Array<{
|
|
16
|
+
key: string;
|
|
17
|
+
value: unknown;
|
|
18
|
+
}>;
|
|
19
|
+
pagination: {
|
|
20
|
+
offset: number;
|
|
21
|
+
total: number;
|
|
22
|
+
};
|
|
23
|
+
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export const MODULE_NAME = 'Storage';
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZlci9zdG9yYWdlL2NvbnN0YW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsU0FBUyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IE1PRFVMRV9OQU1FID0gJ1N0b3JhZ2UnXG5cbi8qKlxuICogT3B0aW9ucyBmb3IgZ2V0VmFsdWVzIHBhZ2luYXRpb24gYW5kIGZpbHRlcmluZy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXRWYWx1ZXNPcHRpb25zIHtcbiAgcHJlZml4Pzogc3RyaW5nXG4gIGxpbWl0PzogbnVtYmVyXG4gIG9mZnNldD86IG51bWJlclxufVxuXG4vKipcbiAqIFJlc3VsdCBvZiBnZXRWYWx1ZXMgd2l0aCBwYWdpbmF0aW9uIG1ldGFkYXRhLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdldFZhbHVlc1Jlc3VsdCB7XG4gIC8qKiBLZXktdmFsdWUgZW50cmllcyBmb3IgdGhlIGN1cnJlbnQgcGFnZS4gKi9cbiAgZGF0YTogQXJyYXk8eyBrZXk6IHN0cmluZzsgdmFsdWU6IHVua25vd24gfT5cbiAgcGFnaW5hdGlvbjoge1xuICAgIG9mZnNldDogbnVtYmVyXG4gICAgdG90YWw6IG51bWJlclxuICB9XG59XG4iXX0=
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { ISceneStorage } from './scene';
|
|
2
2
|
import { IPlayerStorage } from './player';
|
|
3
|
+
export { GetValuesOptions, GetValuesResult } from './constants';
|
|
3
4
|
export { ISceneStorage } from './scene';
|
|
4
5
|
export { IPlayerStorage } from './player';
|
|
5
6
|
/**
|
|
@@ -13,8 +14,8 @@ export interface IStorage extends ISceneStorage {
|
|
|
13
14
|
* Storage provides methods to store and retrieve key-value data from the
|
|
14
15
|
* Server Side Storage service.
|
|
15
16
|
*
|
|
16
|
-
* - Use Storage.get/set/delete for scene-scoped storage
|
|
17
|
-
* - Use Storage.player.get/set/delete for player-scoped storage
|
|
17
|
+
* - Use Storage.get/set/delete/getValues for scene-scoped storage
|
|
18
|
+
* - Use Storage.player.get/set/delete/getValues for player-scoped storage
|
|
18
19
|
*
|
|
19
20
|
* This module only works when running on server-side scenes.
|
|
20
21
|
*/
|
package/server/storage/index.js
CHANGED
|
@@ -11,6 +11,7 @@ const createStorage = () => {
|
|
|
11
11
|
get: sceneStorage.get,
|
|
12
12
|
set: sceneStorage.set,
|
|
13
13
|
delete: sceneStorage.delete,
|
|
14
|
+
getValues: sceneStorage.getValues,
|
|
14
15
|
// Keep player as nested property
|
|
15
16
|
player: playerStorage
|
|
16
17
|
};
|
|
@@ -19,10 +20,10 @@ const createStorage = () => {
|
|
|
19
20
|
* Storage provides methods to store and retrieve key-value data from the
|
|
20
21
|
* Server Side Storage service.
|
|
21
22
|
*
|
|
22
|
-
* - Use Storage.get/set/delete for scene-scoped storage
|
|
23
|
-
* - Use Storage.player.get/set/delete for player-scoped storage
|
|
23
|
+
* - Use Storage.get/set/delete/getValues for scene-scoped storage
|
|
24
|
+
* - Use Storage.player.get/set/delete/getValues for player-scoped storage
|
|
24
25
|
*
|
|
25
26
|
* This module only works when running on server-side scenes.
|
|
26
27
|
*/
|
|
27
28
|
export const Storage = createStorage();
|
|
28
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
29
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmVyL3N0b3JhZ2UvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGtCQUFrQixFQUFpQixNQUFNLFNBQVMsQ0FBQTtBQUMzRCxPQUFPLEVBQUUsbUJBQW1CLEVBQWtCLE1BQU0sVUFBVSxDQUFBO0FBZTlEOztHQUVHO0FBQ0gsTUFBTSxhQUFhLEdBQUcsR0FBYSxFQUFFO0lBQ25DLE1BQU0sWUFBWSxHQUFHLGtCQUFrQixFQUFFLENBQUE7SUFDekMsTUFBTSxhQUFhLEdBQUcsbUJBQW1CLEVBQUUsQ0FBQTtJQUUzQyxPQUFPO1FBQ0wsNENBQTRDO1FBQzVDLEdBQUcsRUFBRSxZQUFZLENBQUMsR0FBRztRQUNyQixHQUFHLEVBQUUsWUFBWSxDQUFDLEdBQUc7UUFDckIsTUFBTSxFQUFFLFlBQVksQ0FBQyxNQUFNO1FBQzNCLFNBQVMsRUFBRSxZQUFZLENBQUMsU0FBUztRQUNqQyxpQ0FBaUM7UUFDakMsTUFBTSxFQUFFLGFBQWE7S0FDdEIsQ0FBQTtBQUNILENBQUMsQ0FBQTtBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFhLGFBQWEsRUFBRSxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3JlYXRlU2NlbmVTdG9yYWdlLCBJU2NlbmVTdG9yYWdlIH0gZnJvbSAnLi9zY2VuZSdcbmltcG9ydCB7IGNyZWF0ZVBsYXllclN0b3JhZ2UsIElQbGF5ZXJTdG9yYWdlIH0gZnJvbSAnLi9wbGF5ZXInXG5cbi8vIFJlLWV4cG9ydCBpbnRlcmZhY2VzIGFuZCB0eXBlc1xuZXhwb3J0IHsgR2V0VmFsdWVzT3B0aW9ucywgR2V0VmFsdWVzUmVzdWx0IH0gZnJvbSAnLi9jb25zdGFudHMnXG5leHBvcnQgeyBJU2NlbmVTdG9yYWdlIH0gZnJvbSAnLi9zY2VuZSdcbmV4cG9ydCB7IElQbGF5ZXJTdG9yYWdlIH0gZnJvbSAnLi9wbGF5ZXInXG5cbi8qKlxuICogU3RvcmFnZSBpbnRlcmZhY2Ugd2l0aCBtZXRob2RzIGZvciBzY2VuZS1zY29wZWQgYW5kIHBsYXllci1zY29wZWQgc3RvcmFnZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJU3RvcmFnZSBleHRlbmRzIElTY2VuZVN0b3JhZ2Uge1xuICAvKiogUGxheWVyLXNjb3BlZCBzdG9yYWdlIGZvciBrZXktdmFsdWUgcGFpcnMgKi9cbiAgcGxheWVyOiBJUGxheWVyU3RvcmFnZVxufVxuXG4vKipcbiAqIENyZWF0ZXMgdGhlIFN0b3JhZ2UgbW9kdWxlIHdpdGggc2NlbmUtc2NvcGVkIGFuZCBwbGF5ZXItc2NvcGVkIHN0b3JhZ2UuXG4gKi9cbmNvbnN0IGNyZWF0ZVN0b3JhZ2UgPSAoKTogSVN0b3JhZ2UgPT4ge1xuICBjb25zdCBzY2VuZVN0b3JhZ2UgPSBjcmVhdGVTY2VuZVN0b3JhZ2UoKVxuICBjb25zdCBwbGF5ZXJTdG9yYWdlID0gY3JlYXRlUGxheWVyU3RvcmFnZSgpXG5cbiAgcmV0dXJuIHtcbiAgICAvLyBTcHJlYWQgc2NlbmUgc3RvcmFnZSBtZXRob2RzIGF0IHRvcCBsZXZlbFxuICAgIGdldDogc2NlbmVTdG9yYWdlLmdldCxcbiAgICBzZXQ6IHNjZW5lU3RvcmFnZS5zZXQsXG4gICAgZGVsZXRlOiBzY2VuZVN0b3JhZ2UuZGVsZXRlLFxuICAgIGdldFZhbHVlczogc2NlbmVTdG9yYWdlLmdldFZhbHVlcyxcbiAgICAvLyBLZWVwIHBsYXllciBhcyBuZXN0ZWQgcHJvcGVydHlcbiAgICBwbGF5ZXI6IHBsYXllclN0b3JhZ2VcbiAgfVxufVxuXG4vKipcbiAqIFN0b3JhZ2UgcHJvdmlkZXMgbWV0aG9kcyB0byBzdG9yZSBhbmQgcmV0cmlldmUga2V5LXZhbHVlIGRhdGEgZnJvbSB0aGVcbiAqIFNlcnZlciBTaWRlIFN0b3JhZ2Ugc2VydmljZS5cbiAqXG4gKiAtIFVzZSBTdG9yYWdlLmdldC9zZXQvZGVsZXRlL2dldFZhbHVlcyBmb3Igc2NlbmUtc2NvcGVkIHN0b3JhZ2VcbiAqIC0gVXNlIFN0b3JhZ2UucGxheWVyLmdldC9zZXQvZGVsZXRlL2dldFZhbHVlcyBmb3IgcGxheWVyLXNjb3BlZCBzdG9yYWdlXG4gKlxuICogVGhpcyBtb2R1bGUgb25seSB3b3JrcyB3aGVuIHJ1bm5pbmcgb24gc2VydmVyLXNpZGUgc2NlbmVzLlxuICovXG5leHBvcnQgY29uc3QgU3RvcmFnZTogSVN0b3JhZ2UgPSBjcmVhdGVTdG9yYWdlKClcbiJdfQ==
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { GetValuesOptions, GetValuesResult } from './constants';
|
|
1
2
|
/**
|
|
2
3
|
* Player-scoped storage interface for key-value pairs from the Server Side Storage service.
|
|
3
4
|
* This is NOT filesystem storage - data is stored in the remote storage service.
|
|
@@ -25,6 +26,14 @@ export interface IPlayerStorage {
|
|
|
25
26
|
* @returns A promise that resolves to true if deleted, false if not found
|
|
26
27
|
*/
|
|
27
28
|
delete(address: string, key: string): Promise<boolean>;
|
|
29
|
+
/**
|
|
30
|
+
* Returns key-value entries from a player's storage, optionally filtered by prefix.
|
|
31
|
+
* Supports pagination via limit and offset.
|
|
32
|
+
* @param address - The player's wallet address
|
|
33
|
+
* @param options - Optional { prefix, limit, offset } for filtering and pagination.
|
|
34
|
+
* @returns A promise that resolves to { data, pagination: { offset, total } } for pagination UI
|
|
35
|
+
*/
|
|
36
|
+
getValues(address: string, options?: GetValuesOptions): Promise<GetValuesResult>;
|
|
28
37
|
}
|
|
29
38
|
/**
|
|
30
39
|
* Creates player-scoped storage that provides methods to interact with
|
package/server/storage/player.js
CHANGED
|
@@ -55,7 +55,38 @@ export const createPlayerStorage = () => {
|
|
|
55
55
|
return false;
|
|
56
56
|
}
|
|
57
57
|
return true;
|
|
58
|
+
},
|
|
59
|
+
async getValues(address, options) {
|
|
60
|
+
assertIsServer(MODULE_NAME);
|
|
61
|
+
const { prefix, limit, offset } = options ?? {};
|
|
62
|
+
const baseUrl = await getStorageServerUrl();
|
|
63
|
+
const parts = [];
|
|
64
|
+
if (!!prefix) {
|
|
65
|
+
parts.push(`prefix=${encodeURIComponent(prefix)}`);
|
|
66
|
+
}
|
|
67
|
+
if (!!limit) {
|
|
68
|
+
parts.push(`limit=${limit}`);
|
|
69
|
+
}
|
|
70
|
+
if (!!offset) {
|
|
71
|
+
parts.push(`offset=${offset}`);
|
|
72
|
+
}
|
|
73
|
+
const query = parts.join('&');
|
|
74
|
+
const url = query
|
|
75
|
+
? `${baseUrl}/players/${encodeURIComponent(address)}/values?${query}`
|
|
76
|
+
: `${baseUrl}/players/${encodeURIComponent(address)}/values`;
|
|
77
|
+
const [error, response] = await wrapSignedFetch({ url });
|
|
78
|
+
if (error) {
|
|
79
|
+
console.error(`Failed to get player storage values for '${address}': ${error}`);
|
|
80
|
+
return { data: [], pagination: { offset: 0, total: 0 } };
|
|
81
|
+
}
|
|
82
|
+
const data = response?.data ?? [];
|
|
83
|
+
const requestedOffset = offset ?? 0;
|
|
84
|
+
const pagination = {
|
|
85
|
+
offset: response?.pagination?.offset ?? requestedOffset,
|
|
86
|
+
total: response?.pagination?.total ?? data.length
|
|
87
|
+
};
|
|
88
|
+
return { data, pagination };
|
|
58
89
|
}
|
|
59
90
|
};
|
|
60
91
|
};
|
|
61
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxheWVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZlci9zdG9yYWdlL3BsYXllci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQTtBQUNwRCxPQUFPLEVBQUUsY0FBYyxFQUFFLGVBQWUsRUFBRSxNQUFNLFVBQVUsQ0FBQTtBQUMxRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sYUFBYSxDQUFBO0FBaUN6Qzs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsR0FBbUIsRUFBRTtJQUN0RCxPQUFPO1FBQ0wsS0FBSyxDQUFDLEdBQUcsQ0FBYyxPQUFlLEVBQUUsR0FBVztZQUNqRCxjQUFjLENBQUMsV0FBVyxDQUFDLENBQUE7WUFFM0IsTUFBTSxPQUFPLEdBQUcsTUFBTSxtQkFBbUIsRUFBRSxDQUFBO1lBQzNDLE1BQU0sR0FBRyxHQUFHLEdBQUcsT0FBTyxZQUFZLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxXQUFXLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUE7WUFFakcsTUFBTSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsR0FBRyxNQUFNLGVBQWUsQ0FBZSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUE7WUFFbEUsSUFBSSxLQUFLLEVBQUU7Z0JBQ1QsT0FBTyxDQUFDLEtBQUssQ0FBQyx1Q0FBdUMsR0FBRyxVQUFVLE9BQU8sTUFBTSxLQUFLLEVBQUUsQ0FBQyxDQUFBO2dCQUN2RixPQUFPLElBQUksQ0FBQTthQUNaO1lBRUQsT0FBTyxJQUFJLEVBQUUsS0FBSyxJQUFJLElBQUksQ0FBQTtRQUM1QixDQUFDO1FBRUQsS0FBSyxDQUFDLEdBQUcsQ0FBYyxPQUFlLEVBQUUsR0FBVyxFQUFFLEtBQVE7WUFDM0QsY0FBYyxDQUFDLFdBQVcsQ0FBQyxDQUFBO1lBRTNCLE1BQU0sT0FBTyxHQUFHLE1BQU0sbUJBQW1CLEVBQUUsQ0FBQTtZQUMzQyxNQUFNLEdBQUcsR0FBRyxHQUFHLE9BQU8sWUFBWSxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsV0FBVyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFBO1lBRWpHLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxNQUFNLGVBQWUsQ0FBQztnQkFDcEMsR0FBRztnQkFDSCxJQUFJLEVBQUU7b0JBQ0osTUFBTSxFQUFFLEtBQUs7b0JBQ2IsT0FBTyxFQUFFO3dCQUNQLGNBQWMsRUFBRSxrQkFBa0I7cUJBQ25DO29CQUNELElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUM7aUJBQ2hDO2FBQ0YsQ0FBQyxDQUFBO1lBRUYsSUFBSSxLQUFLLEVBQUU7Z0JBQ1QsT0FBTyxDQUFDLEtBQUssQ0FBQyx1Q0FBdUMsR0FBRyxVQUFVLE9BQU8sTUFBTSxLQUFLLEVBQUUsQ0FBQyxDQUFBO2dCQUN2RixPQUFPLEtBQUssQ0FBQTthQUNiO1lBRUQsT0FBTyxJQUFJLENBQUE7UUFDYixDQUFDO1FBRUQsS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFlLEVBQUUsR0FBVztZQUN2QyxjQUFjLENBQUMsV0FBVyxDQUFDLENBQUE7WUFFM0IsTUFBTSxPQUFPLEdBQUcsTUFBTSxtQkFBbUIsRUFBRSxDQUFBO1lBQzNDLE1BQU0sR0FBRyxHQUFHLEdBQUcsT0FBTyxZQUFZLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxXQUFXLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUE7WUFFakcsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLE1BQU0sZUFBZSxDQUFDO2dCQUNwQyxHQUFHO2dCQUNILElBQUksRUFBRTtvQkFDSixNQUFNLEVBQUUsUUFBUTtvQkFDaEIsT0FBTyxFQUFFLEVBQUU7aUJBQ1o7YUFDRixDQUFDLENBQUE7WUFFRixJQUFJLEtBQUssRUFBRTtnQkFDVCxPQUFPLENBQUMsS0FBSyxDQUFDLDBDQUEwQyxHQUFHLFVBQVUsT0FBTyxNQUFNLEtBQUssRUFBRSxDQUFDLENBQUE7Z0JBQzFGLE9BQU8sS0FBSyxDQUFBO2FBQ2I7WUFFRCxPQUFPLElBQUksQ0FBQTtRQUNiLENBQUM7S0FDRixDQUFBO0FBQ0gsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZ2V0U3RvcmFnZVNlcnZlclVybCB9IGZyb20gJy4uL3N0b3JhZ2UtdXJsJ1xuaW1wb3J0IHsgYXNzZXJ0SXNTZXJ2ZXIsIHdyYXBTaWduZWRGZXRjaCB9IGZyb20gJy4uL3V0aWxzJ1xuaW1wb3J0IHsgTU9EVUxFX05BTUUgfSBmcm9tICcuL2NvbnN0YW50cydcblxuLyoqXG4gKiBQbGF5ZXItc2NvcGVkIHN0b3JhZ2UgaW50ZXJmYWNlIGZvciBrZXktdmFsdWUgcGFpcnMgZnJvbSB0aGUgU2VydmVyIFNpZGUgU3RvcmFnZSBzZXJ2aWNlLlxuICogVGhpcyBpcyBOT1QgZmlsZXN5c3RlbSBzdG9yYWdlIC0gZGF0YSBpcyBzdG9yZWQgaW4gdGhlIHJlbW90ZSBzdG9yYWdlIHNlcnZpY2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSVBsYXllclN0b3JhZ2Uge1xuICAvKipcbiAgICogUmV0cmlldmVzIGEgdmFsdWUgZnJvbSBhIHBsYXllcidzIHN0b3JhZ2UgYnkga2V5IGZyb20gdGhlIFNlcnZlciBTaWRlIFN0b3JhZ2Ugc2VydmljZS5cbiAgICogQHBhcmFtIGFkZHJlc3MgLSBUaGUgcGxheWVyJ3Mgd2FsbGV0IGFkZHJlc3NcbiAgICogQHBhcmFtIGtleSAtIFRoZSBrZXkgdG8gcmV0cmlldmVcbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHBhcnNlZCBKU09OIHZhbHVlLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgKi9cbiAgZ2V0PFQgPSB1bmtub3duPihhZGRyZXNzOiBzdHJpbmcsIGtleTogc3RyaW5nKTogUHJvbWlzZTxUIHwgbnVsbD5cblxuICAvKipcbiAgICogU3RvcmVzIGEgdmFsdWUgaW4gYSBwbGF5ZXIncyBzdG9yYWdlIGluIHRoZSBTZXJ2ZXIgU2lkZSBTdG9yYWdlIHNlcnZpY2UuXG4gICAqIEBwYXJhbSBhZGRyZXNzIC0gVGhlIHBsYXllcidzIHdhbGxldCBhZGRyZXNzXG4gICAqIEBwYXJhbSBrZXkgLSBUaGUga2V5IHRvIHN0b3JlIHRoZSB2YWx1ZSB1bmRlclxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gc3RvcmUgKHdpbGwgYmUgSlNPTiBzZXJpYWxpemVkKVxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0cnVlIGlmIHN1Y2Nlc3NmdWwsIGZhbHNlIG90aGVyd2lzZVxuICAgKi9cbiAgc2V0PFQgPSB1bmtub3duPihhZGRyZXNzOiBzdHJpbmcsIGtleTogc3RyaW5nLCB2YWx1ZTogVCk6IFByb21pc2U8Ym9vbGVhbj5cblxuICAvKipcbiAgICogRGVsZXRlcyBhIHZhbHVlIGZyb20gYSBwbGF5ZXIncyBzdG9yYWdlIGluIHRoZSBTZXJ2ZXIgU2lkZSBTdG9yYWdlIHNlcnZpY2UuXG4gICAqIEBwYXJhbSBhZGRyZXNzIC0gVGhlIHBsYXllcidzIHdhbGxldCBhZGRyZXNzXG4gICAqIEBwYXJhbSBrZXkgLSBUaGUga2V5IHRvIGRlbGV0ZVxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0cnVlIGlmIGRlbGV0ZWQsIGZhbHNlIGlmIG5vdCBmb3VuZFxuICAgKi9cbiAgZGVsZXRlKGFkZHJlc3M6IHN0cmluZywga2V5OiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+XG59XG5cbi8qKlxuICogQ3JlYXRlcyBwbGF5ZXItc2NvcGVkIHN0b3JhZ2UgdGhhdCBwcm92aWRlcyBtZXRob2RzIHRvIGludGVyYWN0IHdpdGhcbiAqIHBsYXllci1zcGVjaWZpYyBrZXktdmFsdWUgcGFpcnMgZnJvbSB0aGUgU2VydmVyIFNpZGUgU3RvcmFnZSBzZXJ2aWNlLlxuICogVGhpcyBtb2R1bGUgb25seSB3b3JrcyB3aGVuIHJ1bm5pbmcgb24gc2VydmVyLXNpZGUgc2NlbmVzLlxuICovXG5leHBvcnQgY29uc3QgY3JlYXRlUGxheWVyU3RvcmFnZSA9ICgpOiBJUGxheWVyU3RvcmFnZSA9PiB7XG4gIHJldHVybiB7XG4gICAgYXN5bmMgZ2V0PFQgPSB1bmtub3duPihhZGRyZXNzOiBzdHJpbmcsIGtleTogc3RyaW5nKTogUHJvbWlzZTxUIHwgbnVsbD4ge1xuICAgICAgYXNzZXJ0SXNTZXJ2ZXIoTU9EVUxFX05BTUUpXG5cbiAgICAgIGNvbnN0IGJhc2VVcmwgPSBhd2FpdCBnZXRTdG9yYWdlU2VydmVyVXJsKClcbiAgICAgIGNvbnN0IHVybCA9IGAke2Jhc2VVcmx9L3BsYXllcnMvJHtlbmNvZGVVUklDb21wb25lbnQoYWRkcmVzcyl9L3ZhbHVlcy8ke2VuY29kZVVSSUNvbXBvbmVudChrZXkpfWBcblxuICAgICAgY29uc3QgW2Vycm9yLCBkYXRhXSA9IGF3YWl0IHdyYXBTaWduZWRGZXRjaDx7IHZhbHVlOiBUIH0+KHsgdXJsIH0pXG5cbiAgICAgIGlmIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gZ2V0IHBsYXllciBzdG9yYWdlIHZhbHVlICcke2tleX0nIGZvciAnJHthZGRyZXNzfSc6ICR7ZXJyb3J9YClcbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGRhdGE/LnZhbHVlID8/IG51bGxcbiAgICB9LFxuXG4gICAgYXN5bmMgc2V0PFQgPSB1bmtub3duPihhZGRyZXNzOiBzdHJpbmcsIGtleTogc3RyaW5nLCB2YWx1ZTogVCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgYXNzZXJ0SXNTZXJ2ZXIoTU9EVUxFX05BTUUpXG5cbiAgICAgIGNvbnN0IGJhc2VVcmwgPSBhd2FpdCBnZXRTdG9yYWdlU2VydmVyVXJsKClcbiAgICAgIGNvbnN0IHVybCA9IGAke2Jhc2VVcmx9L3BsYXllcnMvJHtlbmNvZGVVUklDb21wb25lbnQoYWRkcmVzcyl9L3ZhbHVlcy8ke2VuY29kZVVSSUNvbXBvbmVudChrZXkpfWBcblxuICAgICAgY29uc3QgW2Vycm9yXSA9IGF3YWl0IHdyYXBTaWduZWRGZXRjaCh7XG4gICAgICAgIHVybCxcbiAgICAgICAgaW5pdDoge1xuICAgICAgICAgIG1ldGhvZDogJ1BVVCcsXG4gICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICAgIH0sXG4gICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyB2YWx1ZSB9KVxuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIHNldCBwbGF5ZXIgc3RvcmFnZSB2YWx1ZSAnJHtrZXl9JyBmb3IgJyR7YWRkcmVzc30nOiAke2Vycm9yfWApXG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGUoYWRkcmVzczogc3RyaW5nLCBrZXk6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgYXNzZXJ0SXNTZXJ2ZXIoTU9EVUxFX05BTUUpXG5cbiAgICAgIGNvbnN0IGJhc2VVcmwgPSBhd2FpdCBnZXRTdG9yYWdlU2VydmVyVXJsKClcbiAgICAgIGNvbnN0IHVybCA9IGAke2Jhc2VVcmx9L3BsYXllcnMvJHtlbmNvZGVVUklDb21wb25lbnQoYWRkcmVzcyl9L3ZhbHVlcy8ke2VuY29kZVVSSUNvbXBvbmVudChrZXkpfWBcblxuICAgICAgY29uc3QgW2Vycm9yXSA9IGF3YWl0IHdyYXBTaWduZWRGZXRjaCh7XG4gICAgICAgIHVybCxcbiAgICAgICAgaW5pdDoge1xuICAgICAgICAgIG1ldGhvZDogJ0RFTEVURScsXG4gICAgICAgICAgaGVhZGVyczoge31cbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBkZWxldGUgcGxheWVyIHN0b3JhZ2UgdmFsdWUgJyR7a2V5fScgZm9yICcke2FkZHJlc3N9JzogJHtlcnJvcn1gKVxuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
92
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxheWVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZlci9zdG9yYWdlL3BsYXllci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQTtBQUNwRCxPQUFPLEVBQUUsY0FBYyxFQUFFLGVBQWUsRUFBRSxNQUFNLFVBQVUsQ0FBQTtBQUMxRCxPQUFPLEVBQXFDLFdBQVcsRUFBRSxNQUFNLGFBQWEsQ0FBQTtBQTBDNUU7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLEdBQW1CLEVBQUU7SUFDdEQsT0FBTztRQUNMLEtBQUssQ0FBQyxHQUFHLENBQWMsT0FBZSxFQUFFLEdBQVc7WUFDakQsY0FBYyxDQUFDLFdBQVcsQ0FBQyxDQUFBO1lBRTNCLE1BQU0sT0FBTyxHQUFHLE1BQU0sbUJBQW1CLEVBQUUsQ0FBQTtZQUMzQyxNQUFNLEdBQUcsR0FBRyxHQUFHLE9BQU8sWUFBWSxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsV0FBVyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFBO1lBRWpHLE1BQU0sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEdBQUcsTUFBTSxlQUFlLENBQWUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFBO1lBRWxFLElBQUksS0FBSyxFQUFFO2dCQUNULE9BQU8sQ0FBQyxLQUFLLENBQUMsdUNBQXVDLEdBQUcsVUFBVSxPQUFPLE1BQU0sS0FBSyxFQUFFLENBQUMsQ0FBQTtnQkFDdkYsT0FBTyxJQUFJLENBQUE7YUFDWjtZQUVELE9BQU8sSUFBSSxFQUFFLEtBQUssSUFBSSxJQUFJLENBQUE7UUFDNUIsQ0FBQztRQUVELEtBQUssQ0FBQyxHQUFHLENBQWMsT0FBZSxFQUFFLEdBQVcsRUFBRSxLQUFRO1lBQzNELGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQTtZQUUzQixNQUFNLE9BQU8sR0FBRyxNQUFNLG1CQUFt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LEtBQUssQ0FBQyw0Q0FBNEMsT0FBTyxNQUFNLEtBQUssRUFBRSxDQUFDLENBQUE7Z0JBQy9FLE9BQU8sRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUE7YUFDekQ7WUFFRCxNQUFNLElBQUksR0FBRyxRQUFRLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQTtZQUNqQyxNQUFNLGVBQWUsR0FBRyxNQUFNLElBQUksQ0FBQyxDQUFBO1lBQ25DLE1BQU0sVUFBVSxHQUFHO2dCQUNqQixNQUFNLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxNQUFNLElBQUksZUFBZTtnQkFDdkQsS0FBSyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsS0FBSyxJQUFJLElBQUksQ0FBQyxNQUFNO2FBQ2xELENBQUE7WUFFRCxPQUFPLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxDQUFBO1FBQzdCLENBQUM7S0FDRixDQUFBO0FBQ0gsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZ2V0U3RvcmFnZVNlcnZlclVybCB9IGZyb20gJy4uL3N0b3JhZ2UtdXJsJ1xuaW1wb3J0IHsgYXNzZXJ0SXNTZXJ2ZXIsIHdyYXBTaWduZWRGZXRjaCB9IGZyb20gJy4uL3V0aWxzJ1xuaW1wb3J0IHsgR2V0VmFsdWVzT3B0aW9ucywgR2V0VmFsdWVzUmVzdWx0LCBNT0RVTEVfTkFNRSB9IGZyb20gJy4vY29uc3RhbnRzJ1xuXG4vKipcbiAqIFBsYXllci1zY29wZWQgc3RvcmFnZSBpbnRlcmZhY2UgZm9yIGtleS12YWx1ZSBwYWlycyBmcm9tIHRoZSBTZXJ2ZXIgU2lkZSBTdG9yYWdlIHNlcnZpY2UuXG4gKiBUaGlzIGlzIE5PVCBmaWxlc3lzdGVtIHN0b3JhZ2UgLSBkYXRhIGlzIHN0b3JlZCBpbiB0aGUgcmVtb3RlIHN0b3JhZ2Ugc2VydmljZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJUGxheWVyU3RvcmFnZSB7XG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgYSB2YWx1ZSBmcm9tIGEgcGxheWVyJ3Mgc3RvcmFnZSBieSBrZXkgZnJvbSB0aGUgU2VydmVyIFNpZGUgU3RvcmFnZSBzZXJ2aWNlLlxuICAgKiBAcGFyYW0gYWRkcmVzcyAtIFRoZSBwbGF5ZXIncyB3YWxsZXQgYWRkcmVzc1xuICAgKiBAcGFyYW0ga2V5IC0gVGhlIGtleSB0byByZXRyaWV2ZVxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgcGFyc2VkIEpTT04gdmFsdWUsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAqL1xuICBnZXQ8VCA9IHVua25vd24+KGFkZHJlc3M6IHN0cmluZywga2V5OiBzdHJpbmcpOiBQcm9taXNlPFQgfCBudWxsPlxuXG4gIC8qKlxuICAgKiBTdG9yZXMgYSB2YWx1ZSBpbiBhIHBsYXllcidzIHN0b3JhZ2UgaW4gdGhlIFNlcnZlciBTaWRlIFN0b3JhZ2Ugc2VydmljZS5cbiAgICogQHBhcmFtIGFkZHJlc3MgLSBUaGUgcGxheWVyJ3Mgd2FsbGV0IGFkZHJlc3NcbiAgICogQHBhcmFtIGtleSAtIFRoZSBrZXkgdG8gc3RvcmUgdGhlIHZhbHVlIHVuZGVyXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBzdG9yZSAod2lsbCBiZSBKU09OIHNlcmlhbGl6ZWQpXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRydWUgaWYgc3VjY2Vzc2Z1bCwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAqL1xuICBzZXQ8VCA9IHVua25vd24+KGFkZHJlc3M6IHN0cmluZywga2V5OiBzdHJpbmcsIHZhbHVlOiBUKTogUHJvbWlzZTxib29sZWFuPlxuXG4gIC8qKlxuICAgKiBEZWxldGVzIGEgdmFsdWUgZnJvbSBhIHBsYXllcidzIHN0b3JhZ2UgaW4gdGhlIFNlcnZlciBTaWRlIFN0b3JhZ2Ugc2VydmljZS5cbiAgICogQHBhcmFtIGFkZHJlc3MgLSBUaGUgcGxheWVyJ3Mgd2FsbGV0IGFkZHJlc3NcbiAgICogQHBhcmFtIGtleSAtIFRoZSBrZXkgdG8gZGVsZXRlXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRydWUgaWYgZGVsZXRlZCwgZmFsc2UgaWYgbm90IGZvdW5kXG4gICAqL1xuICBkZWxldGUoYWRkcmVzczogc3RyaW5nLCBrZXk6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj5cblxuICAvKipcbiAgICogUmV0dXJucyBrZXktdmFsdWUgZW50cmllcyBmcm9tIGEgcGxheWVyJ3Mgc3RvcmFnZSwgb3B0aW9uYWxseSBmaWx0ZXJlZCBieSBwcmVmaXguXG4gICAqIFN1cHBvcnRzIHBhZ2luYXRpb24gdmlhIGxpbWl0IGFuZCBvZmZzZXQuXG4gICAqIEBwYXJhbSBhZGRyZXNzIC0gVGhlIHBsYXllcidzIHdhbGxldCBhZGRyZXNzXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwgeyBwcmVmaXgsIGxpbWl0LCBvZmZzZXQgfSBmb3IgZmlsdGVyaW5nIGFuZCBwYWdpbmF0aW9uLlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB7IGRhdGEsIHBhZ2luYXRpb246IHsgb2Zmc2V0LCB0b3RhbCB9IH0gZm9yIHBhZ2luYXRpb24gVUlcbiAgICovXG4gIGdldFZhbHVlcyhhZGRyZXNzOiBzdHJpbmcsIG9wdGlvbnM/OiBHZXRWYWx1ZXNPcHRpb25zKTogUHJvbWlzZTxHZXRWYWx1ZXNSZXN1bHQ+XG59XG5cbi8qKlxuICogQ3JlYXRlcyBwbGF5ZXItc2NvcGVkIHN0b3JhZ2UgdGhhdCBwcm92aWRlcyBtZXRob2RzIHRvIGludGVyYWN0IHdpdGhcbiAqIHBsYXllci1zcGVjaWZpYyBrZXktdmFsdWUgcGFpcnMgZnJvbSB0aGUgU2VydmVyIFNpZGUgU3RvcmFnZSBzZXJ2aWNlLlxuICogVGhpcyBtb2R1bGUgb25seSB3b3JrcyB3aGVuIHJ1bm5pbmcgb24gc2VydmVyLXNpZGUgc2NlbmVzLlxuICovXG5leHBvcnQgY29uc3QgY3JlYXRlUGxheWVyU3RvcmFnZSA9ICgpOiBJUGxheWVyU3RvcmFnZSA9PiB7XG4gIHJldHVybiB7XG4gICAgYXN5bmMgZ2V0PFQgPSB1bmtub3duPihhZGRyZXNzOiBzdHJpbmcsIGtleTogc3RyaW5nKTogUHJvbWlzZTxUIHwgbnVsbD4ge1xuICAgICAgYXNzZXJ0SXNTZXJ2ZXIoTU9EVUxFX05BTUUpXG5cbiAgICAgIGNvbnN0IGJhc2VVcmwgPSBhd2FpdCBnZXRTdG9yYWdlU2VydmVyVXJsKClcbiAgICAgIGNvbnN0IHVybCA9IGAke2Jhc2VVcmx9L3BsYXllcnMvJHtlbmNvZGVVUklDb21wb25lbnQoYWRkcmVzcyl9L3ZhbHVlcy8ke2VuY29kZVVSSUNvbXBvbmVudChrZXkpfWBcblxuICAgICAgY29uc3QgW2Vycm9yLCBkYXRhXSA9IGF3YWl0IHdyYXBTaWduZWRGZXRjaDx7IHZhbHVlOiBUIH0+KHsgdXJsIH0pXG5cbiAgICAgIGlmIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gZ2V0IHBsYXllciBzdG9yYWdlIHZhbHVlICcke2tleX0nIGZvciAnJHthZGRyZXNzfSc6ICR7ZXJyb3J9YClcbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGRhdGE/LnZhbHVlID8/IG51bGxcbiAgICB9LFxuXG4gICAgYXN5bmMgc2V0PFQgPSB1bmtub3duPihhZGRyZXNzOiBzdHJpbmcsIGtleTogc3RyaW5nLCB2YWx1ZTogVCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgYXNzZXJ0SXNTZXJ2ZXIoTU9EVUxFX05BTUUpXG5cbiAgICAgIGNvbnN0IGJhc2VVcmwgPSBhd2FpdCBnZXRTdG9yYWdlU2VydmVyVXJsKClcbiAgICAgIGNvbnN0IHVybCA9IGAke2Jhc2VVcmx9L3BsYXllcnMvJHtlbmNvZGVVUklDb21wb25lbnQoYWRkcmVzcyl9L3ZhbHVlcy8ke2VuY29kZVVSSUNvbXBvbmVudChrZXkpfWBcblxuICAgICAgY29uc3QgW2Vycm9yXSA9IGF3YWl0IHdyYXBTaWduZWRGZXRjaCh7XG4gICAgICAgIHVybCxcbiAgICAgICAgaW5pdDoge1xuICAgICAgICAgIG1ldGhvZDogJ1BVVCcsXG4gICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICAgIH0sXG4gICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyB2YWx1ZSB9KVxuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIHNldCBwbGF5ZXIgc3RvcmFnZSB2YWx1ZSAnJHtrZXl9JyBmb3IgJyR7YWRkcmVzc30nOiAke2Vycm9yfWApXG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGUoYWRkcmVzczogc3RyaW5nLCBrZXk6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgYXNzZXJ0SXNTZXJ2ZXIoTU9EVUxFX05BTUUpXG5cbiAgICAgIGNvbnN0IGJhc2VVcmwgPSBhd2FpdCBnZXRTdG9yYWdlU2VydmVyVXJsKClcbiAgICAgIGNvbnN0IHVybCA9IGAke2Jhc2VVcmx9L3BsYXllcnMvJHtlbmNvZGVVUklDb21wb25lbnQoYWRkcmVzcyl9L3ZhbHVlcy8ke2VuY29kZVVSSUNvbXBvbmVudChrZXkpfWBcblxuICAgICAgY29uc3QgW2Vycm9yXSA9IGF3YWl0IHdyYXBTaWduZWRGZXRjaCh7XG4gICAgICAgIHVybCxcbiAgICAgICAgaW5pdDoge1xuICAgICAgICAgIG1ldGhvZDogJ0RFTEVURScsXG4gICAgICAgICAgaGVhZGVyczoge31cbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBkZWxldGUgcGxheWVyIHN0b3JhZ2UgdmFsdWUgJyR7a2V5fScgZm9yICcke2FkZHJlc3N9JzogJHtlcnJvcn1gKVxuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0VmFsdWVzKGFkZHJlc3M6IHN0cmluZywgb3B0aW9ucz86IEdldFZhbHVlc09wdGlvbnMpOiBQcm9taXNlPEdldFZhbHVlc1Jlc3VsdD4ge1xuICAgICAgYXNzZXJ0SXNTZXJ2ZXIoTU9EVUxFX05BTUUpXG5cbiAgICAgIGNvbnN0IHsgcHJlZml4LCBsaW1pdCwgb2Zmc2V0IH0gPSBvcHRpb25zID8/IHt9XG4gICAgICBjb25zdCBiYXNlVXJsID0gYXdhaXQgZ2V0U3RvcmFnZVNlcnZlclVybCgpXG4gICAgICBjb25zdCBwYXJ0czogc3RyaW5nW10gPSBbXVxuXG4gICAgICBpZiAoISFwcmVmaXgpIHtcbiAgICAgICAgcGFydHMucHVzaChgcHJlZml4PSR7ZW5jb2RlVVJJQ29tcG9uZW50KHByZWZpeCl9YClcbiAgICAgIH1cblxuICAgICAgaWYgKCEhbGltaXQpIHtcbiAgICAgICAgcGFydHMucHVzaChgbGltaXQ9JHtsaW1pdH1gKVxuICAgICAgfVxuXG4gICAgICBpZiAoISFvZmZzZXQpIHtcbiAgICAgICAgcGFydHMucHVzaChgb2Zmc2V0PSR7b2Zmc2V0fWApXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHF1ZXJ5ID0gcGFydHMuam9pbignJicpXG4gICAgICBjb25zdCB1cmwgPSBxdWVyeVxuICAgICAgICA/IGAke2Jhc2VVcmx9L3BsYXllcnMvJHtlbmNvZGVVUklDb21wb25lbnQoYWRkcmVzcyl9L3ZhbHVlcz8ke3F1ZXJ5fWBcbiAgICAgICAgOiBgJHtiYXNlVXJsfS9wbGF5ZXJzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGFkZHJlc3MpfS92YWx1ZXNgXG5cbiAgICAgIGNvbnN0IFtlcnJvciwgcmVzcG9uc2VdID0gYXdhaXQgd3JhcFNpZ25lZEZldGNoPEdldFZhbHVlc1Jlc3VsdD4oeyB1cmwgfSlcblxuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBnZXQgcGxheWVyIHN0b3JhZ2UgdmFsdWVzIGZvciAnJHthZGRyZXNzfSc6ICR7ZXJyb3J9YClcbiAgICAgICAgcmV0dXJuIHsgZGF0YTogW10sIHBhZ2luYXRpb246IHsgb2Zmc2V0OiAwLCB0b3RhbDogMCB9IH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgZGF0YSA9IHJlc3BvbnNlPy5kYXRhID8/IFtdXG4gICAgICBjb25zdCByZXF1ZXN0ZWRPZmZzZXQgPSBvZmZzZXQgPz8gMFxuICAgICAgY29uc3QgcGFnaW5hdGlvbiA9IHtcbiAgICAgICAgb2Zmc2V0OiByZXNwb25zZT8ucGFnaW5hdGlvbj8ub2Zmc2V0ID8/IHJlcXVlc3RlZE9mZnNldCxcbiAgICAgICAgdG90YWw6IHJlc3BvbnNlPy5wYWdpbmF0aW9uPy50b3RhbCA/PyBkYXRhLmxlbmd0aFxuICAgICAgfVxuXG4gICAgICByZXR1cm4geyBkYXRhLCBwYWdpbmF0aW9uIH1cbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { GetValuesOptions, GetValuesResult } from './constants';
|
|
1
2
|
/**
|
|
2
3
|
* Scene-scoped storage interface for key-value pairs from the Server Side Storage service.
|
|
3
4
|
* This is NOT filesystem storage - data is stored in the remote storage service.
|
|
@@ -21,6 +22,13 @@ export interface ISceneStorage {
|
|
|
21
22
|
* @returns A promise that resolves to true if deleted, false if not found
|
|
22
23
|
*/
|
|
23
24
|
delete(key: string): Promise<boolean>;
|
|
25
|
+
/**
|
|
26
|
+
* Returns key-value entries from scene storage, optionally filtered by prefix.
|
|
27
|
+
* Supports pagination via limit and offset.
|
|
28
|
+
* @param options - Optional { prefix, limit, offset } for filtering and pagination.
|
|
29
|
+
* @returns A promise that resolves to { data, pagination: { offset, total } } for pagination UI
|
|
30
|
+
*/
|
|
31
|
+
getValues(options?: GetValuesOptions): Promise<GetValuesResult>;
|
|
24
32
|
}
|
|
25
33
|
/**
|
|
26
34
|
* Creates scene-scoped storage that provides methods to interact with
|
package/server/storage/scene.js
CHANGED
|
@@ -55,7 +55,36 @@ export const createSceneStorage = () => {
|
|
|
55
55
|
return false;
|
|
56
56
|
}
|
|
57
57
|
return true;
|
|
58
|
+
},
|
|
59
|
+
async getValues(options) {
|
|
60
|
+
assertIsServer(MODULE_NAME);
|
|
61
|
+
const { prefix, limit, offset } = options ?? {};
|
|
62
|
+
const baseUrl = await getStorageServerUrl();
|
|
63
|
+
const parts = [];
|
|
64
|
+
if (!!prefix) {
|
|
65
|
+
parts.push(`prefix=${encodeURIComponent(prefix)}`);
|
|
66
|
+
}
|
|
67
|
+
if (!!limit) {
|
|
68
|
+
parts.push(`limit=${limit}`);
|
|
69
|
+
}
|
|
70
|
+
if (!!offset) {
|
|
71
|
+
parts.push(`offset=${offset}`);
|
|
72
|
+
}
|
|
73
|
+
const query = parts.join('&');
|
|
74
|
+
const url = query ? `${baseUrl}/values?${query}` : `${baseUrl}/values`;
|
|
75
|
+
const [error, response] = await wrapSignedFetch({ url });
|
|
76
|
+
if (error) {
|
|
77
|
+
console.error(`Failed to get storage values: ${error}`);
|
|
78
|
+
return { data: [], pagination: { offset: 0, total: 0 } };
|
|
79
|
+
}
|
|
80
|
+
const data = response?.data ?? [];
|
|
81
|
+
const requestedOffset = offset ?? 0;
|
|
82
|
+
const pagination = {
|
|
83
|
+
offset: response?.pagination?.offset ?? requestedOffset,
|
|
84
|
+
total: response?.pagination?.total ?? data.length
|
|
85
|
+
};
|
|
86
|
+
return { data, pagination };
|
|
58
87
|
}
|
|
59
88
|
};
|
|
60
89
|
};
|
|
61
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NlbmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmVyL3N0b3JhZ2Uvc2NlbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFDcEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxlQUFlLEVBQUUsTUFBTSxVQUFVLENBQUE7QUFDMUQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGFBQWEsQ0FBQTtBQTZCekM7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLEdBQWtCLEVBQUU7SUFDcEQsT0FBTztRQUNMLEtBQUssQ0FBQyxHQUFHLENBQWMsR0FBVztZQUNoQyxjQUFjLENBQUMsV0FBVyxDQUFDLENBQUE7WUFFM0IsTUFBTSxPQUFPLEdBQUcsTUFBTSxtQkFBbUIsRUFBRSxDQUFBO1lBQzNDLE1BQU0sR0FBRyxHQUFHLEdBQUcsT0FBTyxXQUFXLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUE7WUFFMUQsTUFBTSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsR0FBRyxNQUFNLGVBQWUsQ0FBZSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUE7WUFFbEUsSUFBSSxLQUFLLEVBQUU7Z0JBQ1QsT0FBTyxDQUFDLEtBQUssQ0FBQyxnQ0FBZ0MsR0FBRyxNQUFNLEtBQUssRUFBRSxDQUFDLENBQUE7Z0JBQy9ELE9BQU8sSUFBSSxDQUFBO2FBQ1o7WUFFRCxPQUFPLElBQUksRUFBRSxLQUFLLElBQUksSUFBSSxDQUFBO1FBQzVCLENBQUM7UUFFRCxLQUFLLENBQUMsR0FBRyxDQUFjLEdBQVcsRUFBRSxLQUFRO1lBQzFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQTtZQUUzQixNQUFNLE9BQU8sR0FBRyxNQUFNLG1CQUFtQixFQUFFLENBQUE7WUFDM0MsTUFBTSxHQUFHLEdBQUcsR0FBRyxPQUFPLFdBQVcsa0JBQWtCLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQTtZQUUxRCxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsTUFBTSxlQUFlLENBQUM7Z0JBQ3BDLEdBQUc7Z0JBQ0gsSUFBSSxFQUFFO29CQUNKLE1BQU0sRUFBRSxLQUFLO29CQUNiLE9BQU8sRUFBRTt3QkFDUCxjQUFjLEVBQUUsa0JBQWtCO3FCQUNuQztvQkFDRCxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDO2lCQUNoQzthQUNGLENBQUMsQ0FBQTtZQUVGLElBQUksS0FBSyxFQUFFO2dCQUNULE9BQU8sQ0FBQyxLQUFLLENBQUMsZ0NBQWdDLEdBQUcsTUFBTSxLQUFLLEVBQUUsQ0FBQyxDQUFBO2dCQUMvRCxPQUFPLEtBQUssQ0FBQTthQUNiO1lBRUQsT0FBTyxJQUFJLENBQUE7UUFDYixDQUFDO1FBRUQsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFXO1lBQ3RCLGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQTtZQUUzQixNQUFNLE9BQU8sR0FBRyxNQUFNLG1CQUFtQixFQUFFLENBQUE7WUFDM0MsTUFBTSxHQUFHLEdBQUcsR0FBRyxPQUFPLFdBQVcsa0JBQWtCLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQTtZQUUxRCxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsTUFBTSxlQUFlLENBQUM7Z0JBQ3BDLEdBQUc7Z0JBQ0gsSUFBSSxFQUFFO29CQUNKLE1BQU0sRUFBRSxRQUFRO29CQUNoQixPQUFPLEVBQUUsRUFBRTtpQkFDWjthQUNGLENBQUMsQ0FBQTtZQUVGLElBQUksS0FBSyxFQUFFO2dCQUNULE9BQU8sQ0FBQyxLQUFLLENBQUMsbUNBQW1DLEdBQUcsTUFBTSxLQUFLLEVBQUUsQ0FBQyxDQUFBO2dCQUNsRSxPQUFPLEtBQUssQ0FBQTthQUNiO1lBRUQsT0FBTyxJQUFJLENBQUE7UUFDYixDQUFDO0tBQ0YsQ0FBQTtBQUNILENBQUMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGdldFN0b3JhZ2VTZXJ2ZXJVcmwgfSBmcm9tICcuLi9zdG9yYWdlLXVybCdcbmltcG9ydCB7IGFzc2VydElzU2VydmVyLCB3cmFwU2lnbmVkRmV0Y2ggfSBmcm9tICcuLi91dGlscydcbmltcG9ydCB7IE1PRFVMRV9OQU1FIH0gZnJvbSAnLi9jb25zdGFudHMnXG5cbi8qKlxuICogU2NlbmUtc2NvcGVkIHN0b3JhZ2UgaW50ZXJmYWNlIGZvciBrZXktdmFsdWUgcGFpcnMgZnJvbSB0aGUgU2VydmVyIFNpZGUgU3RvcmFnZSBzZXJ2aWNlLlxuICogVGhpcyBpcyBOT1QgZmlsZXN5c3RlbSBzdG9yYWdlIC0gZGF0YSBpcyBzdG9yZWQgaW4gdGhlIHJlbW90ZSBzdG9yYWdlIHNlcnZpY2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSVNjZW5lU3RvcmFnZSB7XG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgYSB2YWx1ZSBmcm9tIHNjZW5lIHN0b3JhZ2UgYnkga2V5IGZyb20gdGhlIFNlcnZlciBTaWRlIFN0b3JhZ2Ugc2VydmljZS5cbiAgICogQHBhcmFtIGtleSAtIFRoZSBrZXkgdG8gcmV0cmlldmVcbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHBhcnNlZCBKU09OIHZhbHVlLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgKi9cbiAgZ2V0PFQgPSB1bmtub3duPihrZXk6IHN0cmluZyk6IFByb21pc2U8VCB8IG51bGw+XG5cbiAgLyoqXG4gICAqIFN0b3JlcyBhIHZhbHVlIGluIHNjZW5lIHN0b3JhZ2UgaW4gdGhlIFNlcnZlciBTaWRlIFN0b3JhZ2Ugc2VydmljZS5cbiAgICogQHBhcmFtIGtleSAtIFRoZSBrZXkgdG8gc3RvcmUgdGhlIHZhbHVlIHVuZGVyXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBzdG9yZSAod2lsbCBiZSBKU09OIHNlcmlhbGl6ZWQpXG4gICAqL1xuICBzZXQ8VCA9IHVua25vd24+KGtleTogc3RyaW5nLCB2YWx1ZTogVCk6IFByb21pc2U8Ym9vbGVhbj5cblxuICAvKipcbiAgICogRGVsZXRlcyBhIHZhbHVlIGZyb20gc2NlbmUgc3RvcmFnZSBpbiB0aGUgU2VydmVyIFNpZGUgU3RvcmFnZSBzZXJ2aWNlLlxuICAgKiBAcGFyYW0ga2V5IC0gVGhlIGtleSB0byBkZWxldGVcbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdHJ1ZSBpZiBkZWxldGVkLCBmYWxzZSBpZiBub3QgZm91bmRcbiAgICovXG4gIGRlbGV0ZShrZXk6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj5cbn1cblxuLyoqXG4gKiBDcmVhdGVzIHNjZW5lLXNjb3BlZCBzdG9yYWdlIHRoYXQgcHJvdmlkZXMgbWV0aG9kcyB0byBpbnRlcmFjdCB3aXRoXG4gKiBzY2VuZS1zcGVjaWZpYyBrZXktdmFsdWUgcGFpcnMgZnJvbSB0aGUgU2VydmVyIFNpZGUgU3RvcmFnZSBzZXJ2aWNlLlxuICogVGhpcyBtb2R1bGUgb25seSB3b3JrcyB3aGVuIHJ1bm5pbmcgb24gc2VydmVyLXNpZGUgc2NlbmVzLlxuICovXG5leHBvcnQgY29uc3QgY3JlYXRlU2NlbmVTdG9yYWdlID0gKCk6IElTY2VuZVN0b3JhZ2UgPT4ge1xuICByZXR1cm4ge1xuICAgIGFzeW5jIGdldDxUID0gdW5rbm93bj4oa2V5OiBzdHJpbmcpOiBQcm9taXNlPFQgfCBudWxsPiB7XG4gICAgICBhc3NlcnRJc1NlcnZlcihNT0RVTEVfTkFNRSlcblxuICAgICAgY29uc3QgYmFzZVVybCA9IGF3YWl0IGdldFN0b3JhZ2VTZXJ2ZXJVcmwoKVxuICAgICAgY29uc3QgdXJsID0gYCR7YmFzZVVybH0vdmFsdWVzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGtleSl9YFxuXG4gICAgICBjb25zdCBbZXJyb3IsIGRhdGFdID0gYXdhaXQgd3JhcFNpZ25lZEZldGNoPHsgdmFsdWU6IFQgfT4oeyB1cmwgfSlcblxuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBnZXQgc3RvcmFnZSB2YWx1ZSAnJHtrZXl9JzogJHtlcnJvcn1gKVxuICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgfVxuXG4gICAgICByZXR1cm4gZGF0YT8udmFsdWUgPz8gbnVsbFxuICAgIH0sXG5cbiAgICBhc3luYyBzZXQ8VCA9IHVua25vd24+KGtleTogc3RyaW5nLCB2YWx1ZTogVCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgYXNzZXJ0SXNTZXJ2ZXIoTU9EVUxFX05BTUUpXG5cbiAgICAgIGNvbnN0IGJhc2VVcmwgPSBhd2FpdCBnZXRTdG9yYWdlU2VydmVyVXJsKClcbiAgICAgIGNvbnN0IHVybCA9IGAke2Jhc2VVcmx9L3ZhbHVlcy8ke2VuY29kZVVSSUNvbXBvbmVudChrZXkpfWBcblxuICAgICAgY29uc3QgW2Vycm9yXSA9IGF3YWl0IHdyYXBTaWduZWRGZXRjaCh7XG4gICAgICAgIHVybCxcbiAgICAgICAgaW5pdDoge1xuICAgICAgICAgIG1ldGhvZDogJ1BVVCcsXG4gICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICAgIH0sXG4gICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyB2YWx1ZSB9KVxuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIHNldCBzdG9yYWdlIHZhbHVlICcke2tleX0nOiAke2Vycm9yfWApXG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGUoa2V5OiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgIGFzc2VydElzU2VydmVyKE1PRFVMRV9OQU1FKVxuXG4gICAgICBjb25zdCBiYXNlVXJsID0gYXdhaXQgZ2V0U3RvcmFnZVNlcnZlclVybCgpXG4gICAgICBjb25zdCB1cmwgPSBgJHtiYXNlVXJsfS92YWx1ZXMvJHtlbmNvZGVVUklDb21wb25lbnQoa2V5KX1gXG5cbiAgICAgIGNvbnN0IFtlcnJvcl0gPSBhd2FpdCB3cmFwU2lnbmVkRmV0Y2goe1xuICAgICAgICB1cmwsXG4gICAgICAgIGluaXQ6IHtcbiAgICAgICAgICBtZXRob2Q6ICdERUxFVEUnLFxuICAgICAgICAgIGhlYWRlcnM6IHt9XG4gICAgICAgIH1cbiAgICAgIH0pXG5cbiAgICAgIGlmIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gZGVsZXRlIHN0b3JhZ2UgdmFsdWUgJyR7a2V5fSc6ICR7ZXJyb3J9YClcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICB9XG59XG4iXX0=
|
|
90
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NlbmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmVyL3N0b3JhZ2Uvc2NlbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFDcEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxlQUFlLEVBQUUsTUFBTSxVQUFVLENBQUE7QUFDMUQsT0FBTyxFQUFxQyxXQUFXLEVBQUUsTUFBTSxhQUFhLENBQUE7QUFxQzVFOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxHQUFrQixFQUFFO0lBQ3BELE9BQU87UUFDTCxLQUFLLENBQUMsR0FBRyxDQUFjLEdBQVc7WUFDaEMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxDQUFBO1lBRTNCLE1BQU0sT0FBTyxHQUFHLE1BQU0sbUJBQW1CLEVBQUUsQ0FBQTtZQUMzQyxNQUFNLEdBQUcsR0FBRyxHQUFHLE9BQU8sV0FBVyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFBO1lBRTFELE1BQU0sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEdBQUcsTUFBTSxlQUFlLENBQWUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFBO1lBRWxFLElBQUksS0FBSyxFQUFFO2dCQUNULE9BQU8sQ0FBQyxLQUFLLENBQUMsZ0NBQWdDLEdBQUcsTUFBTSxLQUFLLEVBQUUsQ0FBQyxDQUFBO2dCQUMvRCxPQUFPLElBQUksQ0FBQTthQUNaO1lBRUQsT0FBTyxJQUFJLEVBQUUsS0FBSyxJQUFJLElBQUksQ0FBQTtRQUM1QixDQUFDO1FBRUQsS0FBSyxDQUFDLEdBQUcsQ0FBYyxHQUFXLEVBQUUsS0FBUTtZQUMxQyxjQUFjLENBQUMsV0FBVyxDQUFDLENBQUE7WUFFM0IsTUFBTSxPQUFPLEdBQUcsTUFBTSxtQkFBbUIsRUFBRSxDQUFBO1lBQzNDLE1BQU0sR0FBRyxHQUFHLEdBQUcsT0FBTyxXQUFXLGtCQUFrQixDQUFD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ZSxHQUFHLE1BQU0sSUFBSSxDQUFDLENBQUE7WUFDbkMsTUFBTSxVQUFVLEdBQUc7Z0JBQ2pCLE1BQU0sRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLE1BQU0sSUFBSSxlQUFlO2dCQUN2RCxLQUFLLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxLQUFLLElBQUksSUFBSSxDQUFDLE1BQU07YUFDbEQsQ0FBQTtZQUVELE9BQU8sRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLENBQUE7UUFDN0IsQ0FBQztLQUNGLENBQUE7QUFDSCxDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBnZXRTdG9yYWdlU2VydmVyVXJsIH0gZnJvbSAnLi4vc3RvcmFnZS11cmwnXG5pbXBvcnQgeyBhc3NlcnRJc1NlcnZlciwgd3JhcFNpZ25lZEZldGNoIH0gZnJvbSAnLi4vdXRpbHMnXG5pbXBvcnQgeyBHZXRWYWx1ZXNPcHRpb25zLCBHZXRWYWx1ZXNSZXN1bHQsIE1PRFVMRV9OQU1FIH0gZnJvbSAnLi9jb25zdGFudHMnXG5cbi8qKlxuICogU2NlbmUtc2NvcGVkIHN0b3JhZ2UgaW50ZXJmYWNlIGZvciBrZXktdmFsdWUgcGFpcnMgZnJvbSB0aGUgU2VydmVyIFNpZGUgU3RvcmFnZSBzZXJ2aWNlLlxuICogVGhpcyBpcyBOT1QgZmlsZXN5c3RlbSBzdG9yYWdlIC0gZGF0YSBpcyBzdG9yZWQgaW4gdGhlIHJlbW90ZSBzdG9yYWdlIHNlcnZpY2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSVNjZW5lU3RvcmFnZSB7XG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgYSB2YWx1ZSBmcm9tIHNjZW5lIHN0b3JhZ2UgYnkga2V5IGZyb20gdGhlIFNlcnZlciBTaWRlIFN0b3JhZ2Ugc2VydmljZS5cbiAgICogQHBhcmFtIGtleSAtIFRoZSBrZXkgdG8gcmV0cmlldmVcbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHBhcnNlZCBKU09OIHZhbHVlLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgKi9cbiAgZ2V0PFQgPSB1bmtub3duPihrZXk6IHN0cmluZyk6IFByb21pc2U8VCB8IG51bGw+XG5cbiAgLyoqXG4gICAqIFN0b3JlcyBhIHZhbHVlIGluIHNjZW5lIHN0b3JhZ2UgaW4gdGhlIFNlcnZlciBTaWRlIFN0b3JhZ2Ugc2VydmljZS5cbiAgICogQHBhcmFtIGtleSAtIFRoZSBrZXkgdG8gc3RvcmUgdGhlIHZhbHVlIHVuZGVyXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBzdG9yZSAod2lsbCBiZSBKU09OIHNlcmlhbGl6ZWQpXG4gICAqL1xuICBzZXQ8VCA9IHVua25vd24+KGtleTogc3RyaW5nLCB2YWx1ZTogVCk6IFByb21pc2U8Ym9vbGVhbj5cblxuICAvKipcbiAgICogRGVsZXRlcyBhIHZhbHVlIGZyb20gc2NlbmUgc3RvcmFnZSBpbiB0aGUgU2VydmVyIFNpZGUgU3RvcmFnZSBzZXJ2aWNlLlxuICAgKiBAcGFyYW0ga2V5IC0gVGhlIGtleSB0byBkZWxldGVcbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdHJ1ZSBpZiBkZWxldGVkLCBmYWxzZSBpZiBub3QgZm91bmRcbiAgICovXG4gIGRlbGV0ZShrZXk6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj5cblxuICAvKipcbiAgICogUmV0dXJucyBrZXktdmFsdWUgZW50cmllcyBmcm9tIHNjZW5lIHN0b3JhZ2UsIG9wdGlvbmFsbHkgZmlsdGVyZWQgYnkgcHJlZml4LlxuICAgKiBTdXBwb3J0cyBwYWdpbmF0aW9uIHZpYSBsaW1pdCBhbmQgb2Zmc2V0LlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIHsgcHJlZml4LCBsaW1pdCwgb2Zmc2V0IH0gZm9yIGZpbHRlcmluZyBhbmQgcGFnaW5hdGlvbi5cbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8geyBkYXRhLCBwYWdpbmF0aW9uOiB7IG9mZnNldCwgdG90YWwgfSB9IGZvciBwYWdpbmF0aW9uIFVJXG4gICAqL1xuICBnZXRWYWx1ZXMob3B0aW9ucz86IEdldFZhbHVlc09wdGlvbnMpOiBQcm9taXNlPEdldFZhbHVlc1Jlc3VsdD5cbn1cblxuLyoqXG4gKiBDcmVhdGVzIHNjZW5lLXNjb3BlZCBzdG9yYWdlIHRoYXQgcHJvdmlkZXMgbWV0aG9kcyB0byBpbnRlcmFjdCB3aXRoXG4gKiBzY2VuZS1zcGVjaWZpYyBrZXktdmFsdWUgcGFpcnMgZnJvbSB0aGUgU2VydmVyIFNpZGUgU3RvcmFnZSBzZXJ2aWNlLlxuICogVGhpcyBtb2R1bGUgb25seSB3b3JrcyB3aGVuIHJ1bm5pbmcgb24gc2VydmVyLXNpZGUgc2NlbmVzLlxuICovXG5leHBvcnQgY29uc3QgY3JlYXRlU2NlbmVTdG9yYWdlID0gKCk6IElTY2VuZVN0b3JhZ2UgPT4ge1xuICByZXR1cm4ge1xuICAgIGFzeW5jIGdldDxUID0gdW5rbm93bj4oa2V5OiBzdHJpbmcpOiBQcm9taXNlPFQgfCBudWxsPiB7XG4gICAgICBhc3NlcnRJc1NlcnZlcihNT0RVTEVfTkFNRSlcblxuICAgICAgY29uc3QgYmFzZVVybCA9IGF3YWl0IGdldFN0b3JhZ2VTZXJ2ZXJVcmwoKVxuICAgICAgY29uc3QgdXJsID0gYCR7YmFzZVVybH0vdmFsdWVzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGtleSl9YFxuXG4gICAgICBjb25zdCBbZXJyb3IsIGRhdGFdID0gYXdhaXQgd3JhcFNpZ25lZEZldGNoPHsgdmFsdWU6IFQgfT4oeyB1cmwgfSlcblxuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBnZXQgc3RvcmFnZSB2YWx1ZSAnJHtrZXl9JzogJHtlcnJvcn1gKVxuICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgfVxuXG4gICAgICByZXR1cm4gZGF0YT8udmFsdWUgPz8gbnVsbFxuICAgIH0sXG5cbiAgICBhc3luYyBzZXQ8VCA9IHVua25vd24+KGtleTogc3RyaW5nLCB2YWx1ZTogVCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgYXNzZXJ0SXNTZXJ2ZXIoTU9EVUxFX05BTUUpXG5cbiAgICAgIGNvbnN0IGJhc2VVcmwgPSBhd2FpdCBnZXRTdG9yYWdlU2VydmVyVXJsKClcbiAgICAgIGNvbnN0IHVybCA9IGAke2Jhc2VVcmx9L3ZhbHVlcy8ke2VuY29kZVVSSUNvbXBvbmVudChrZXkpfWBcblxuICAgICAgY29uc3QgW2Vycm9yXSA9IGF3YWl0IHdyYXBTaWduZWRGZXRjaCh7XG4gICAgICAgIHVybCxcbiAgICAgICAgaW5pdDoge1xuICAgICAgICAgIG1ldGhvZDogJ1BVVCcsXG4gICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICAgIH0sXG4gICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyB2YWx1ZSB9KVxuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIHNldCBzdG9yYWdlIHZhbHVlICcke2tleX0nOiAke2Vycm9yfWApXG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGUoa2V5OiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgIGFzc2VydElzU2VydmVyKE1PRFVMRV9OQU1FKVxuXG4gICAgICBjb25zdCBiYXNlVXJsID0gYXdhaXQgZ2V0U3RvcmFnZVNlcnZlclVybCgpXG4gICAgICBjb25zdCB1cmwgPSBgJHtiYXNlVXJsfS92YWx1ZXMvJHtlbmNvZGVVUklDb21wb25lbnQoa2V5KX1gXG5cbiAgICAgIGNvbnN0IFtlcnJvcl0gPSBhd2FpdCB3cmFwU2lnbmVkRmV0Y2goe1xuICAgICAgICB1cmwsXG4gICAgICAgIGluaXQ6IHtcbiAgICAgICAgICBtZXRob2Q6ICdERUxFVEUnLFxuICAgICAgICAgIGhlYWRlcnM6IHt9XG4gICAgICAgIH1cbiAgICAgIH0pXG5cbiAgICAgIGlmIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gZGVsZXRlIHN0b3JhZ2UgdmFsdWUgJyR7a2V5fSc6ICR7ZXJyb3J9YClcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0cnVlXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFZhbHVlcyhvcHRpb25zPzogR2V0VmFsdWVzT3B0aW9ucyk6IFByb21pc2U8R2V0VmFsdWVzUmVzdWx0PiB7XG4gICAgICBhc3NlcnRJc1NlcnZlcihNT0RVTEVfTkFNRSlcblxuICAgICAgY29uc3QgeyBwcmVmaXgsIGxpbWl0LCBvZmZzZXQgfSA9IG9wdGlvbnMgPz8ge31cbiAgICAgIGNvbnN0IGJhc2VVcmwgPSBhd2FpdCBnZXRTdG9yYWdlU2VydmVyVXJsKClcbiAgICAgIGNvbnN0IHBhcnRzOiBzdHJpbmdbXSA9IFtdXG5cbiAgICAgIGlmICghIXByZWZpeCkge1xuICAgICAgICBwYXJ0cy5wdXNoKGBwcmVmaXg9JHtlbmNvZGVVUklDb21wb25lbnQocHJlZml4KX1gKVxuICAgICAgfVxuXG4gICAgICBpZiAoISFsaW1pdCkge1xuICAgICAgICBwYXJ0cy5wdXNoKGBsaW1pdD0ke2xpbWl0fWApXG4gICAgICB9XG5cbiAgICAgIGlmICghIW9mZnNldCkge1xuICAgICAgICBwYXJ0cy5wdXNoKGBvZmZzZXQ9JHtvZmZzZXR9YClcbiAgICAgIH1cblxuICAgICAgY29uc3QgcXVlcnkgPSBwYXJ0cy5qb2luKCcmJylcbiAgICAgIGNvbnN0IHVybCA9IHF1ZXJ5ID8gYCR7YmFzZVVybH0vdmFsdWVzPyR7cXVlcnl9YCA6IGAke2Jhc2VVcmx9L3ZhbHVlc2BcblxuICAgICAgY29uc3QgW2Vycm9yLCByZXNwb25zZV0gPSBhd2FpdCB3cmFwU2lnbmVkRmV0Y2g8R2V0VmFsdWVzUmVzdWx0Pih7IHVybCB9KVxuXG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIGdldCBzdG9yYWdlIHZhbHVlczogJHtlcnJvcn1gKVxuICAgICAgICByZXR1cm4geyBkYXRhOiBbXSwgcGFnaW5hdGlvbjogeyBvZmZzZXQ6IDAsIHRvdGFsOiAwIH0gfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBkYXRhID0gcmVzcG9uc2U/LmRhdGEgPz8gW11cbiAgICAgIGNvbnN0IHJlcXVlc3RlZE9mZnNldCA9IG9mZnNldCA/PyAwXG4gICAgICBjb25zdCBwYWdpbmF0aW9uID0ge1xuICAgICAgICBvZmZzZXQ6IHJlc3BvbnNlPy5wYWdpbmF0aW9uPy5vZmZzZXQgPz8gcmVxdWVzdGVkT2Zmc2V0LFxuICAgICAgICB0b3RhbDogcmVzcG9uc2U/LnBhZ2luYXRpb24/LnRvdGFsID8/IGRhdGEubGVuZ3RoXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7IGRhdGEsIHBhZ2luYXRpb24gfVxuICAgIH1cbiAgfVxufVxuIl19
|
package/src/server/index.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export { EnvVar } from './env-var'
|
|
2
|
-
export { Storage, IStorage, ISceneStorage, IPlayerStorage } from './storage'
|
|
2
|
+
export { Storage, IStorage, ISceneStorage, IPlayerStorage, GetValuesOptions, GetValuesResult } from './storage'
|
|
@@ -1 +1,22 @@
|
|
|
1
1
|
export const MODULE_NAME = 'Storage'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Options for getValues pagination and filtering.
|
|
5
|
+
*/
|
|
6
|
+
export interface GetValuesOptions {
|
|
7
|
+
prefix?: string
|
|
8
|
+
limit?: number
|
|
9
|
+
offset?: number
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Result of getValues with pagination metadata.
|
|
14
|
+
*/
|
|
15
|
+
export interface GetValuesResult {
|
|
16
|
+
/** Key-value entries for the current page. */
|
|
17
|
+
data: Array<{ key: string; value: unknown }>
|
|
18
|
+
pagination: {
|
|
19
|
+
offset: number
|
|
20
|
+
total: number
|
|
21
|
+
}
|
|
22
|
+
}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { createSceneStorage, ISceneStorage } from './scene'
|
|
2
2
|
import { createPlayerStorage, IPlayerStorage } from './player'
|
|
3
3
|
|
|
4
|
-
// Re-export interfaces
|
|
4
|
+
// Re-export interfaces and types
|
|
5
|
+
export { GetValuesOptions, GetValuesResult } from './constants'
|
|
5
6
|
export { ISceneStorage } from './scene'
|
|
6
7
|
export { IPlayerStorage } from './player'
|
|
7
8
|
|
|
@@ -25,6 +26,7 @@ const createStorage = (): IStorage => {
|
|
|
25
26
|
get: sceneStorage.get,
|
|
26
27
|
set: sceneStorage.set,
|
|
27
28
|
delete: sceneStorage.delete,
|
|
29
|
+
getValues: sceneStorage.getValues,
|
|
28
30
|
// Keep player as nested property
|
|
29
31
|
player: playerStorage
|
|
30
32
|
}
|
|
@@ -34,8 +36,8 @@ const createStorage = (): IStorage => {
|
|
|
34
36
|
* Storage provides methods to store and retrieve key-value data from the
|
|
35
37
|
* Server Side Storage service.
|
|
36
38
|
*
|
|
37
|
-
* - Use Storage.get/set/delete for scene-scoped storage
|
|
38
|
-
* - Use Storage.player.get/set/delete for player-scoped storage
|
|
39
|
+
* - Use Storage.get/set/delete/getValues for scene-scoped storage
|
|
40
|
+
* - Use Storage.player.get/set/delete/getValues for player-scoped storage
|
|
39
41
|
*
|
|
40
42
|
* This module only works when running on server-side scenes.
|
|
41
43
|
*/
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { getStorageServerUrl } from '../storage-url'
|
|
2
2
|
import { assertIsServer, wrapSignedFetch } from '../utils'
|
|
3
|
-
import { MODULE_NAME } from './constants'
|
|
3
|
+
import { GetValuesOptions, GetValuesResult, MODULE_NAME } from './constants'
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* Player-scoped storage interface for key-value pairs from the Server Side Storage service.
|
|
@@ -31,6 +31,15 @@ export interface IPlayerStorage {
|
|
|
31
31
|
* @returns A promise that resolves to true if deleted, false if not found
|
|
32
32
|
*/
|
|
33
33
|
delete(address: string, key: string): Promise<boolean>
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Returns key-value entries from a player's storage, optionally filtered by prefix.
|
|
37
|
+
* Supports pagination via limit and offset.
|
|
38
|
+
* @param address - The player's wallet address
|
|
39
|
+
* @param options - Optional { prefix, limit, offset } for filtering and pagination.
|
|
40
|
+
* @returns A promise that resolves to { data, pagination: { offset, total } } for pagination UI
|
|
41
|
+
*/
|
|
42
|
+
getValues(address: string, options?: GetValuesOptions): Promise<GetValuesResult>
|
|
34
43
|
}
|
|
35
44
|
|
|
36
45
|
/**
|
|
@@ -101,6 +110,47 @@ export const createPlayerStorage = (): IPlayerStorage => {
|
|
|
101
110
|
}
|
|
102
111
|
|
|
103
112
|
return true
|
|
113
|
+
},
|
|
114
|
+
|
|
115
|
+
async getValues(address: string, options?: GetValuesOptions): Promise<GetValuesResult> {
|
|
116
|
+
assertIsServer(MODULE_NAME)
|
|
117
|
+
|
|
118
|
+
const { prefix, limit, offset } = options ?? {}
|
|
119
|
+
const baseUrl = await getStorageServerUrl()
|
|
120
|
+
const parts: string[] = []
|
|
121
|
+
|
|
122
|
+
if (!!prefix) {
|
|
123
|
+
parts.push(`prefix=${encodeURIComponent(prefix)}`)
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
if (!!limit) {
|
|
127
|
+
parts.push(`limit=${limit}`)
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
if (!!offset) {
|
|
131
|
+
parts.push(`offset=${offset}`)
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
const query = parts.join('&')
|
|
135
|
+
const url = query
|
|
136
|
+
? `${baseUrl}/players/${encodeURIComponent(address)}/values?${query}`
|
|
137
|
+
: `${baseUrl}/players/${encodeURIComponent(address)}/values`
|
|
138
|
+
|
|
139
|
+
const [error, response] = await wrapSignedFetch<GetValuesResult>({ url })
|
|
140
|
+
|
|
141
|
+
if (error) {
|
|
142
|
+
console.error(`Failed to get player storage values for '${address}': ${error}`)
|
|
143
|
+
return { data: [], pagination: { offset: 0, total: 0 } }
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
const data = response?.data ?? []
|
|
147
|
+
const requestedOffset = offset ?? 0
|
|
148
|
+
const pagination = {
|
|
149
|
+
offset: response?.pagination?.offset ?? requestedOffset,
|
|
150
|
+
total: response?.pagination?.total ?? data.length
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
return { data, pagination }
|
|
104
154
|
}
|
|
105
155
|
}
|
|
106
156
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { getStorageServerUrl } from '../storage-url'
|
|
2
2
|
import { assertIsServer, wrapSignedFetch } from '../utils'
|
|
3
|
-
import { MODULE_NAME } from './constants'
|
|
3
|
+
import { GetValuesOptions, GetValuesResult, MODULE_NAME } from './constants'
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* Scene-scoped storage interface for key-value pairs from the Server Side Storage service.
|
|
@@ -27,6 +27,14 @@ export interface ISceneStorage {
|
|
|
27
27
|
* @returns A promise that resolves to true if deleted, false if not found
|
|
28
28
|
*/
|
|
29
29
|
delete(key: string): Promise<boolean>
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Returns key-value entries from scene storage, optionally filtered by prefix.
|
|
33
|
+
* Supports pagination via limit and offset.
|
|
34
|
+
* @param options - Optional { prefix, limit, offset } for filtering and pagination.
|
|
35
|
+
* @returns A promise that resolves to { data, pagination: { offset, total } } for pagination UI
|
|
36
|
+
*/
|
|
37
|
+
getValues(options?: GetValuesOptions): Promise<GetValuesResult>
|
|
30
38
|
}
|
|
31
39
|
|
|
32
40
|
/**
|
|
@@ -97,6 +105,45 @@ export const createSceneStorage = (): ISceneStorage => {
|
|
|
97
105
|
}
|
|
98
106
|
|
|
99
107
|
return true
|
|
108
|
+
},
|
|
109
|
+
|
|
110
|
+
async getValues(options?: GetValuesOptions): Promise<GetValuesResult> {
|
|
111
|
+
assertIsServer(MODULE_NAME)
|
|
112
|
+
|
|
113
|
+
const { prefix, limit, offset } = options ?? {}
|
|
114
|
+
const baseUrl = await getStorageServerUrl()
|
|
115
|
+
const parts: string[] = []
|
|
116
|
+
|
|
117
|
+
if (!!prefix) {
|
|
118
|
+
parts.push(`prefix=${encodeURIComponent(prefix)}`)
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
if (!!limit) {
|
|
122
|
+
parts.push(`limit=${limit}`)
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
if (!!offset) {
|
|
126
|
+
parts.push(`offset=${offset}`)
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
const query = parts.join('&')
|
|
130
|
+
const url = query ? `${baseUrl}/values?${query}` : `${baseUrl}/values`
|
|
131
|
+
|
|
132
|
+
const [error, response] = await wrapSignedFetch<GetValuesResult>({ url })
|
|
133
|
+
|
|
134
|
+
if (error) {
|
|
135
|
+
console.error(`Failed to get storage values: ${error}`)
|
|
136
|
+
return { data: [], pagination: { offset: 0, total: 0 } }
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
const data = response?.data ?? []
|
|
140
|
+
const requestedOffset = offset ?? 0
|
|
141
|
+
const pagination = {
|
|
142
|
+
offset: response?.pagination?.offset ?? requestedOffset,
|
|
143
|
+
total: response?.pagination?.total ?? data.length
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
return { data, pagination }
|
|
100
147
|
}
|
|
101
148
|
}
|
|
102
149
|
}
|