@dcl/sdk 7.20.2-22169778016.commit-030cbfe → 7.20.2-22231111352.commit-d2f6f0a

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.
Files changed (63) hide show
  1. package/network/binary-message-bus.d.ts +3 -6
  2. package/network/binary-message-bus.js +5 -9
  3. package/network/index.d.ts +2 -8
  4. package/network/index.js +3 -16
  5. package/network/message-bus-sync.d.ts +1 -14
  6. package/network/message-bus-sync.js +103 -166
  7. package/network/state.js +5 -3
  8. package/package.json +6 -6
  9. package/src/network/binary-message-bus.ts +4 -9
  10. package/src/network/index.ts +3 -40
  11. package/src/network/message-bus-sync.ts +110 -180
  12. package/src/network/state.ts +4 -3
  13. package/atom.d.ts +0 -19
  14. package/atom.js +0 -83
  15. package/future.d.ts +0 -8
  16. package/future.js +0 -26
  17. package/network/chunking.d.ts +0 -5
  18. package/network/chunking.js +0 -38
  19. package/network/events/implementation.d.ts +0 -93
  20. package/network/events/implementation.js +0 -230
  21. package/network/events/index.d.ts +0 -42
  22. package/network/events/index.js +0 -43
  23. package/network/events/protocol.d.ts +0 -27
  24. package/network/events/protocol.js +0 -66
  25. package/network/events/registry.d.ts +0 -8
  26. package/network/events/registry.js +0 -3
  27. package/network/server/index.d.ts +0 -14
  28. package/network/server/index.js +0 -219
  29. package/network/server/utils.d.ts +0 -18
  30. package/network/server/utils.js +0 -135
  31. package/server/env-var.d.ts +0 -15
  32. package/server/env-var.js +0 -31
  33. package/server/index.d.ts +0 -2
  34. package/server/index.js +0 -3
  35. package/server/storage/constants.d.ts +0 -23
  36. package/server/storage/constants.js +0 -2
  37. package/server/storage/index.d.ts +0 -22
  38. package/server/storage/index.js +0 -29
  39. package/server/storage/player.d.ts +0 -43
  40. package/server/storage/player.js +0 -92
  41. package/server/storage/scene.d.ts +0 -38
  42. package/server/storage/scene.js +0 -90
  43. package/server/storage-url.d.ts +0 -10
  44. package/server/storage-url.js +0 -29
  45. package/server/utils.d.ts +0 -35
  46. package/server/utils.js +0 -56
  47. package/src/atom.ts +0 -98
  48. package/src/future.ts +0 -38
  49. package/src/network/chunking.ts +0 -45
  50. package/src/network/events/implementation.ts +0 -286
  51. package/src/network/events/index.ts +0 -48
  52. package/src/network/events/protocol.ts +0 -94
  53. package/src/network/events/registry.ts +0 -18
  54. package/src/network/server/index.ts +0 -301
  55. package/src/network/server/utils.ts +0 -189
  56. package/src/server/env-var.ts +0 -36
  57. package/src/server/index.ts +0 -2
  58. package/src/server/storage/constants.ts +0 -22
  59. package/src/server/storage/index.ts +0 -44
  60. package/src/server/storage/player.ts +0 -156
  61. package/src/server/storage/scene.ts +0 -149
  62. package/src/server/storage-url.ts +0 -34
  63. package/src/server/utils.ts +0 -73
@@ -1,23 +0,0 @@
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 +0,0 @@
1
- export const MODULE_NAME = 'Storage';
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZlci9zdG9yYWdlL2NvbnN0YW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsU0FBUyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IE1PRFVMRV9OQU1FID0gJ1N0b3JhZ2UnXG5cbi8qKlxuICogT3B0aW9ucyBmb3IgZ2V0VmFsdWVzIHBhZ2luYXRpb24gYW5kIGZpbHRlcmluZy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXRWYWx1ZXNPcHRpb25zIHtcbiAgcHJlZml4Pzogc3RyaW5nXG4gIGxpbWl0PzogbnVtYmVyXG4gIG9mZnNldD86IG51bWJlclxufVxuXG4vKipcbiAqIFJlc3VsdCBvZiBnZXRWYWx1ZXMgd2l0aCBwYWdpbmF0aW9uIG1ldGFkYXRhLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdldFZhbHVlc1Jlc3VsdCB7XG4gIC8qKiBLZXktdmFsdWUgZW50cmllcyBmb3IgdGhlIGN1cnJlbnQgcGFnZS4gKi9cbiAgZGF0YTogQXJyYXk8eyBrZXk6IHN0cmluZzsgdmFsdWU6IHVua25vd24gfT5cbiAgcGFnaW5hdGlvbjoge1xuICAgIG9mZnNldDogbnVtYmVyXG4gICAgdG90YWw6IG51bWJlclxuICB9XG59XG4iXX0=
@@ -1,22 +0,0 @@
1
- import { ISceneStorage } from './scene';
2
- import { IPlayerStorage } from './player';
3
- export { GetValuesOptions, GetValuesResult } from './constants';
4
- export { ISceneStorage } from './scene';
5
- export { IPlayerStorage } from './player';
6
- /**
7
- * Storage interface with methods for scene-scoped and player-scoped storage.
8
- */
9
- export interface IStorage extends ISceneStorage {
10
- /** Player-scoped storage for key-value pairs */
11
- player: IPlayerStorage;
12
- }
13
- /**
14
- * Storage provides methods to store and retrieve key-value data from the
15
- * Server Side Storage service.
16
- *
17
- * - Use Storage.get/set/delete/getValues for scene-scoped storage
18
- * - Use Storage.player.get/set/delete/getValues for player-scoped storage
19
- *
20
- * This module only works when running on server-side scenes.
21
- */
22
- export declare const Storage: IStorage;
@@ -1,29 +0,0 @@
1
- import { createSceneStorage } from './scene';
2
- import { createPlayerStorage } from './player';
3
- /**
4
- * Creates the Storage module with scene-scoped and player-scoped storage.
5
- */
6
- const createStorage = () => {
7
- const sceneStorage = createSceneStorage();
8
- const playerStorage = createPlayerStorage();
9
- return {
10
- // Spread scene storage methods at top level
11
- get: sceneStorage.get,
12
- set: sceneStorage.set,
13
- delete: sceneStorage.delete,
14
- getValues: sceneStorage.getValues,
15
- // Keep player as nested property
16
- player: playerStorage
17
- };
18
- };
19
- /**
20
- * Storage provides methods to store and retrieve key-value data from the
21
- * Server Side Storage service.
22
- *
23
- * - Use Storage.get/set/delete/getValues for scene-scoped storage
24
- * - Use Storage.player.get/set/delete/getValues for player-scoped storage
25
- *
26
- * This module only works when running on server-side scenes.
27
- */
28
- export const Storage = createStorage();
29
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmVyL3N0b3JhZ2UvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGtCQUFrQixFQUFpQixNQUFNLFNBQVMsQ0FBQTtBQUMzRCxPQUFPLEVBQUUsbUJBQW1CLEVBQWtCLE1BQU0sVUFBVSxDQUFBO0FBZTlEOztHQUVHO0FBQ0gsTUFBTSxhQUFhLEdBQUcsR0FBYSxFQUFFO0lBQ25DLE1BQU0sWUFBWSxHQUFHLGtCQUFrQixFQUFFLENBQUE7SUFDekMsTUFBTSxhQUFhLEdBQUcsbUJBQW1CLEVBQUUsQ0FBQTtJQUUzQyxPQUFPO1FBQ0wsNENBQTRDO1FBQzVDLEdBQUcsRUFBRSxZQUFZLENBQUMsR0FBRztRQUNyQixHQUFHLEVBQUUsWUFBWSxDQUFDLEdBQUc7UUFDckIsTUFBTSxFQUFFLFlBQVksQ0FBQyxNQUFNO1FBQzNCLFNBQVMsRUFBRSxZQUFZLENBQUMsU0FBUztRQUNqQyxpQ0FBaUM7UUFDakMsTUFBTSxFQUFFLGFBQWE7S0FDdEIsQ0FBQTtBQUNILENBQUMsQ0FBQTtBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFhLGFBQWEsRUFBRSxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3JlYXRlU2NlbmVTdG9yYWdlLCBJU2NlbmVTdG9yYWdlIH0gZnJvbSAnLi9zY2VuZSdcbmltcG9ydCB7IGNyZWF0ZVBsYXllclN0b3JhZ2UsIElQbGF5ZXJTdG9yYWdlIH0gZnJvbSAnLi9wbGF5ZXInXG5cbi8vIFJlLWV4cG9ydCBpbnRlcmZhY2VzIGFuZCB0eXBlc1xuZXhwb3J0IHsgR2V0VmFsdWVzT3B0aW9ucywgR2V0VmFsdWVzUmVzdWx0IH0gZnJvbSAnLi9jb25zdGFudHMnXG5leHBvcnQgeyBJU2NlbmVTdG9yYWdlIH0gZnJvbSAnLi9zY2VuZSdcbmV4cG9ydCB7IElQbGF5ZXJTdG9yYWdlIH0gZnJvbSAnLi9wbGF5ZXInXG5cbi8qKlxuICogU3RvcmFnZSBpbnRlcmZhY2Ugd2l0aCBtZXRob2RzIGZvciBzY2VuZS1zY29wZWQgYW5kIHBsYXllci1zY29wZWQgc3RvcmFnZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJU3RvcmFnZSBleHRlbmRzIElTY2VuZVN0b3JhZ2Uge1xuICAvKiogUGxheWVyLXNjb3BlZCBzdG9yYWdlIGZvciBrZXktdmFsdWUgcGFpcnMgKi9cbiAgcGxheWVyOiBJUGxheWVyU3RvcmFnZVxufVxuXG4vKipcbiAqIENyZWF0ZXMgdGhlIFN0b3JhZ2UgbW9kdWxlIHdpdGggc2NlbmUtc2NvcGVkIGFuZCBwbGF5ZXItc2NvcGVkIHN0b3JhZ2UuXG4gKi9cbmNvbnN0IGNyZWF0ZVN0b3JhZ2UgPSAoKTogSVN0b3JhZ2UgPT4ge1xuICBjb25zdCBzY2VuZVN0b3JhZ2UgPSBjcmVhdGVTY2VuZVN0b3JhZ2UoKVxuICBjb25zdCBwbGF5ZXJTdG9yYWdlID0gY3JlYXRlUGxheWVyU3RvcmFnZSgpXG5cbiAgcmV0dXJuIHtcbiAgICAvLyBTcHJlYWQgc2NlbmUgc3RvcmFnZSBtZXRob2RzIGF0IHRvcCBsZXZlbFxuICAgIGdldDogc2NlbmVTdG9yYWdlLmdldCxcbiAgICBzZXQ6IHNjZW5lU3RvcmFnZS5zZXQsXG4gICAgZGVsZXRlOiBzY2VuZVN0b3JhZ2UuZGVsZXRlLFxuICAgIGdldFZhbHVlczogc2NlbmVTdG9yYWdlLmdldFZhbHVlcyxcbiAgICAvLyBLZWVwIHBsYXllciBhcyBuZXN0ZWQgcHJvcGVydHlcbiAgICBwbGF5ZXI6IHBsYXllclN0b3JhZ2VcbiAgfVxufVxuXG4vKipcbiAqIFN0b3JhZ2UgcHJvdmlkZXMgbWV0aG9kcyB0byBzdG9yZSBhbmQgcmV0cmlldmUga2V5LXZhbHVlIGRhdGEgZnJvbSB0aGVcbiAqIFNlcnZlciBTaWRlIFN0b3JhZ2Ugc2VydmljZS5cbiAqXG4gKiAtIFVzZSBTdG9yYWdlLmdldC9zZXQvZGVsZXRlL2dldFZhbHVlcyBmb3Igc2NlbmUtc2NvcGVkIHN0b3JhZ2VcbiAqIC0gVXNlIFN0b3JhZ2UucGxheWVyLmdldC9zZXQvZGVsZXRlL2dldFZhbHVlcyBmb3IgcGxheWVyLXNjb3BlZCBzdG9yYWdlXG4gKlxuICogVGhpcyBtb2R1bGUgb25seSB3b3JrcyB3aGVuIHJ1bm5pbmcgb24gc2VydmVyLXNpZGUgc2NlbmVzLlxuICovXG5leHBvcnQgY29uc3QgU3RvcmFnZTogSVN0b3JhZ2UgPSBjcmVhdGVTdG9yYWdlKClcbiJdfQ==
@@ -1,43 +0,0 @@
1
- import { GetValuesOptions, GetValuesResult } from './constants';
2
- /**
3
- * Player-scoped storage interface for key-value pairs from the Server Side Storage service.
4
- * This is NOT filesystem storage - data is stored in the remote storage service.
5
- */
6
- export interface IPlayerStorage {
7
- /**
8
- * Retrieves a value from a player's storage by key from the Server Side Storage service.
9
- * @param address - The player's wallet address
10
- * @param key - The key to retrieve
11
- * @returns A promise that resolves to the parsed JSON value, or null if not found
12
- */
13
- get<T = unknown>(address: string, key: string): Promise<T | null>;
14
- /**
15
- * Stores a value in a player's storage in the Server Side Storage service.
16
- * @param address - The player's wallet address
17
- * @param key - The key to store the value under
18
- * @param value - The value to store (will be JSON serialized)
19
- * @returns A promise that resolves to true if successful, false otherwise
20
- */
21
- set<T = unknown>(address: string, key: string, value: T): Promise<boolean>;
22
- /**
23
- * Deletes a value from a player's storage in the Server Side Storage service.
24
- * @param address - The player's wallet address
25
- * @param key - The key to delete
26
- * @returns A promise that resolves to true if deleted, false if not found
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>;
37
- }
38
- /**
39
- * Creates player-scoped storage that provides methods to interact with
40
- * player-specific key-value pairs from the Server Side Storage service.
41
- * This module only works when running on server-side scenes.
42
- */
43
- export declare const createPlayerStorage: () => IPlayerStorage;
@@ -1,92 +0,0 @@
1
- import { getStorageServerUrl } from '../storage-url';
2
- import { assertIsServer, wrapSignedFetch } from '../utils';
3
- import { MODULE_NAME } from './constants';
4
- /**
5
- * Creates player-scoped storage that provides methods to interact with
6
- * player-specific key-value pairs from the Server Side Storage service.
7
- * This module only works when running on server-side scenes.
8
- */
9
- export const createPlayerStorage = () => {
10
- return {
11
- async get(address, key) {
12
- assertIsServer(MODULE_NAME);
13
- const baseUrl = await getStorageServerUrl();
14
- const url = `${baseUrl}/players/${encodeURIComponent(address)}/values/${encodeURIComponent(key)}`;
15
- const [error, data] = await wrapSignedFetch({ url });
16
- if (error) {
17
- console.error(`Failed to get player storage value '${key}' for '${address}': ${error}`);
18
- return null;
19
- }
20
- return data?.value ?? null;
21
- },
22
- async set(address, key, value) {
23
- assertIsServer(MODULE_NAME);
24
- const baseUrl = await getStorageServerUrl();
25
- const url = `${baseUrl}/players/${encodeURIComponent(address)}/values/${encodeURIComponent(key)}`;
26
- const [error] = await wrapSignedFetch({
27
- url,
28
- init: {
29
- method: 'PUT',
30
- headers: {
31
- 'content-type': 'application/json'
32
- },
33
- body: JSON.stringify({ value })
34
- }
35
- });
36
- if (error) {
37
- console.error(`Failed to set player storage value '${key}' for '${address}': ${error}`);
38
- return false;
39
- }
40
- return true;
41
- },
42
- async delete(address, key) {
43
- assertIsServer(MODULE_NAME);
44
- const baseUrl = await getStorageServerUrl();
45
- const url = `${baseUrl}/players/${encodeURIComponent(address)}/values/${encodeURIComponent(key)}`;
46
- const [error] = await wrapSignedFetch({
47
- url,
48
- init: {
49
- method: 'DELETE',
50
- headers: {}
51
- }
52
- });
53
- if (error) {
54
- console.error(`Failed to delete player storage value '${key}' for '${address}': ${error}`);
55
- return false;
56
- }
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 };
89
- }
90
- };
91
- };
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,38 +0,0 @@
1
- import { GetValuesOptions, GetValuesResult } from './constants';
2
- /**
3
- * Scene-scoped storage interface for key-value pairs from the Server Side Storage service.
4
- * This is NOT filesystem storage - data is stored in the remote storage service.
5
- */
6
- export interface ISceneStorage {
7
- /**
8
- * Retrieves a value from scene storage by key from the Server Side Storage service.
9
- * @param key - The key to retrieve
10
- * @returns A promise that resolves to the parsed JSON value, or null if not found
11
- */
12
- get<T = unknown>(key: string): Promise<T | null>;
13
- /**
14
- * Stores a value in scene storage in the Server Side Storage service.
15
- * @param key - The key to store the value under
16
- * @param value - The value to store (will be JSON serialized)
17
- */
18
- set<T = unknown>(key: string, value: T): Promise<boolean>;
19
- /**
20
- * Deletes a value from scene storage in the Server Side Storage service.
21
- * @param key - The key to delete
22
- * @returns A promise that resolves to true if deleted, false if not found
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>;
32
- }
33
- /**
34
- * Creates scene-scoped storage that provides methods to interact with
35
- * scene-specific key-value pairs from the Server Side Storage service.
36
- * This module only works when running on server-side scenes.
37
- */
38
- export declare const createSceneStorage: () => ISceneStorage;
@@ -1,90 +0,0 @@
1
- import { getStorageServerUrl } from '../storage-url';
2
- import { assertIsServer, wrapSignedFetch } from '../utils';
3
- import { MODULE_NAME } from './constants';
4
- /**
5
- * Creates scene-scoped storage that provides methods to interact with
6
- * scene-specific key-value pairs from the Server Side Storage service.
7
- * This module only works when running on server-side scenes.
8
- */
9
- export const createSceneStorage = () => {
10
- return {
11
- async get(key) {
12
- assertIsServer(MODULE_NAME);
13
- const baseUrl = await getStorageServerUrl();
14
- const url = `${baseUrl}/values/${encodeURIComponent(key)}`;
15
- const [error, data] = await wrapSignedFetch({ url });
16
- if (error) {
17
- console.error(`Failed to get storage value '${key}': ${error}`);
18
- return null;
19
- }
20
- return data?.value ?? null;
21
- },
22
- async set(key, value) {
23
- assertIsServer(MODULE_NAME);
24
- const baseUrl = await getStorageServerUrl();
25
- const url = `${baseUrl}/values/${encodeURIComponent(key)}`;
26
- const [error] = await wrapSignedFetch({
27
- url,
28
- init: {
29
- method: 'PUT',
30
- headers: {
31
- 'content-type': 'application/json'
32
- },
33
- body: JSON.stringify({ value })
34
- }
35
- });
36
- if (error) {
37
- console.error(`Failed to set storage value '${key}': ${error}`);
38
- return false;
39
- }
40
- return true;
41
- },
42
- async delete(key) {
43
- assertIsServer(MODULE_NAME);
44
- const baseUrl = await getStorageServerUrl();
45
- const url = `${baseUrl}/values/${encodeURIComponent(key)}`;
46
- const [error] = await wrapSignedFetch({
47
- url,
48
- init: {
49
- method: 'DELETE',
50
- headers: {}
51
- }
52
- });
53
- if (error) {
54
- console.error(`Failed to delete storage value '${key}': ${error}`);
55
- return false;
56
- }
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 };
87
- }
88
- };
89
- };
90
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NlbmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmVyL3N0b3JhZ2Uvc2NlbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFDcEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxlQUFlLEVBQUUsTUFBTSxVQUFVLENBQUE7QUFDMUQsT0FBTyxFQUFxQyxXQUFXLEVBQUUsTUFBTSxhQUFhLENBQUE7QUFxQzVFOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxHQUFrQixFQUFFO0lBQ3BELE9BQU87UUFDTCxLQUFLLENBQUMsR0FBRyxDQUFjLEdBQVc7WUFDaEMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxDQUFBO1lBRTNCLE1BQU0sT0FBTyxHQUFHLE1BQU0sbUJBQW1CLEVBQUUsQ0FBQTtZQUMzQyxNQUFNLEdBQUcsR0FBRyxHQUFHLE9BQU8sV0FBVyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFBO1lBRTFELE1BQU0sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEdBQUcsTUFBTSxlQUFlLENBQWUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFBO1lBRWxFLElBQUksS0FBSyxFQUFFO2dCQUNULE9BQU8sQ0FBQyxLQUFLLENBQUMsZ0NBQWdDLEdBQUcsTUFBTSxLQUFLLEVBQUUsQ0FBQyxDQUFBO2dCQUMvRCxPQUFPLElBQUksQ0FBQTthQUNaO1lBRUQsT0FBTyxJQUFJLEVBQUUsS0FBSyxJQUFJLElBQUksQ0FBQTtRQUM1QixDQUFDO1FBRUQsS0FBSyxDQUFDLEdBQUcsQ0FBYyxHQUFXLEVBQUUsS0FBUTtZQUMxQyxjQUFjLENBQUMsV0FBVyxDQUFDLENBQUE7WUFFM0IsTUFBTSxPQUFPLEdBQUcsTUFBTSxtQkFBbUIsRUFBRSxDQUFBO1lBQzNDLE1BQU0sR0FBRyxHQUFHLEdBQUcsT0FBTyxXQUFXLGtCQUFrQixDQUFD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ZSxHQUFHLE1BQU0sSUFBSSxDQUFDLENBQUE7WUFDbkMsTUFBTSxVQUFVLEdBQUc7Z0JBQ2pCLE1BQU0sRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLE1BQU0sSUFBSSxlQUFlO2dCQUN2RCxLQUFLLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxLQUFLLElBQUksSUFBSSxDQUFDLE1BQU07YUFDbEQsQ0FBQTtZQUVELE9BQU8sRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLENBQUE7UUFDN0IsQ0FBQztLQUNGLENBQUE7QUFDSCxDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBnZXRTdG9yYWdlU2VydmVyVXJsIH0gZnJvbSAnLi4vc3RvcmFnZS11cmwnXG5pbXBvcnQgeyBhc3NlcnRJc1NlcnZlciwgd3JhcFNpZ25lZEZldGNoIH0gZnJvbSAnLi4vdXRpbHMnXG5pbXBvcnQgeyBHZXRWYWx1ZXNPcHRpb25zLCBHZXRWYWx1ZXNSZXN1bHQsIE1PRFVMRV9OQU1FIH0gZnJvbSAnLi9jb25zdGFudHMnXG5cbi8qKlxuICogU2NlbmUtc2NvcGVkIHN0b3JhZ2UgaW50ZXJmYWNlIGZvciBrZXktdmFsdWUgcGFpcnMgZnJvbSB0aGUgU2VydmVyIFNpZGUgU3RvcmFnZSBzZXJ2aWNlLlxuICogVGhpcyBpcyBOT1QgZmlsZXN5c3RlbSBzdG9yYWdlIC0gZGF0YSBpcyBzdG9yZWQgaW4gdGhlIHJlbW90ZSBzdG9yYWdlIHNlcnZpY2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSVNjZW5lU3RvcmFnZSB7XG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgYSB2YWx1ZSBmcm9tIHNjZW5lIHN0b3JhZ2UgYnkga2V5IGZyb20gdGhlIFNlcnZlciBTaWRlIFN0b3JhZ2Ugc2VydmljZS5cbiAgICogQHBhcmFtIGtleSAtIFRoZSBrZXkgdG8gcmV0cmlldmVcbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHBhcnNlZCBKU09OIHZhbHVlLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgKi9cbiAgZ2V0PFQgPSB1bmtub3duPihrZXk6IHN0cmluZyk6IFByb21pc2U8VCB8IG51bGw+XG5cbiAgLyoqXG4gICAqIFN0b3JlcyBhIHZhbHVlIGluIHNjZW5lIHN0b3JhZ2UgaW4gdGhlIFNlcnZlciBTaWRlIFN0b3JhZ2Ugc2VydmljZS5cbiAgICogQHBhcmFtIGtleSAtIFRoZSBrZXkgdG8gc3RvcmUgdGhlIHZhbHVlIHVuZGVyXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBzdG9yZSAod2lsbCBiZSBKU09OIHNlcmlhbGl6ZWQpXG4gICAqL1xuICBzZXQ8VCA9IHVua25vd24+KGtleTogc3RyaW5nLCB2YWx1ZTogVCk6IFByb21pc2U8Ym9vbGVhbj5cblxuICAvKipcbiAgICogRGVsZXRlcyBhIHZhbHVlIGZyb20gc2NlbmUgc3RvcmFnZSBpbiB0aGUgU2VydmVyIFNpZGUgU3RvcmFnZSBzZXJ2aWNlLlxuICAgKiBAcGFyYW0ga2V5IC0gVGhlIGtleSB0byBkZWxldGVcbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdHJ1ZSBpZiBkZWxldGVkLCBmYWxzZSBpZiBub3QgZm91bmRcbiAgICovXG4gIGRlbGV0ZShrZXk6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj5cblxuICAvKipcbiAgICogUmV0dXJucyBrZXktdmFsdWUgZW50cmllcyBmcm9tIHNjZW5lIHN0b3JhZ2UsIG9wdGlvbmFsbHkgZmlsdGVyZWQgYnkgcHJlZml4LlxuICAgKiBTdXBwb3J0cyBwYWdpbmF0aW9uIHZpYSBsaW1pdCBhbmQgb2Zmc2V0LlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIHsgcHJlZml4LCBsaW1pdCwgb2Zmc2V0IH0gZm9yIGZpbHRlcmluZyBhbmQgcGFnaW5hdGlvbi5cbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8geyBkYXRhLCBwYWdpbmF0aW9uOiB7IG9mZnNldCwgdG90YWwgfSB9IGZvciBwYWdpbmF0aW9uIFVJXG4gICAqL1xuICBnZXRWYWx1ZXMob3B0aW9ucz86IEdldFZhbHVlc09wdGlvbnMpOiBQcm9taXNlPEdldFZhbHVlc1Jlc3VsdD5cbn1cblxuLyoqXG4gKiBDcmVhdGVzIHNjZW5lLXNjb3BlZCBzdG9yYWdlIHRoYXQgcHJvdmlkZXMgbWV0aG9kcyB0byBpbnRlcmFjdCB3aXRoXG4gKiBzY2VuZS1zcGVjaWZpYyBrZXktdmFsdWUgcGFpcnMgZnJvbSB0aGUgU2VydmVyIFNpZGUgU3RvcmFnZSBzZXJ2aWNlLlxuICogVGhpcyBtb2R1bGUgb25seSB3b3JrcyB3aGVuIHJ1bm5pbmcgb24gc2VydmVyLXNpZGUgc2NlbmVzLlxuICovXG5leHBvcnQgY29uc3QgY3JlYXRlU2NlbmVTdG9yYWdlID0gKCk6IElTY2VuZVN0b3JhZ2UgPT4ge1xuICByZXR1cm4ge1xuICAgIGFzeW5jIGdldDxUID0gdW5rbm93bj4oa2V5OiBzdHJpbmcpOiBQcm9taXNlPFQgfCBudWxsPiB7XG4gICAgICBhc3NlcnRJc1NlcnZlcihNT0RVTEVfTkFNRSlcblxuICAgICAgY29uc3QgYmFzZVVybCA9IGF3YWl0IGdldFN0b3JhZ2VTZXJ2ZXJVcmwoKVxuICAgICAgY29uc3QgdXJsID0gYCR7YmFzZVVybH0vdmFsdWVzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGtleSl9YFxuXG4gICAgICBjb25zdCBbZXJyb3IsIGRhdGFdID0gYXdhaXQgd3JhcFNpZ25lZEZldGNoPHsgdmFsdWU6IFQgfT4oeyB1cmwgfSlcblxuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBnZXQgc3RvcmFnZSB2YWx1ZSAnJHtrZXl9JzogJHtlcnJvcn1gKVxuICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgfVxuXG4gICAgICByZXR1cm4gZGF0YT8udmFsdWUgPz8gbnVsbFxuICAgIH0sXG5cbiAgICBhc3luYyBzZXQ8VCA9IHVua25vd24+KGtleTogc3RyaW5nLCB2YWx1ZTogVCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgYXNzZXJ0SXNTZXJ2ZXIoTU9EVUxFX05BTUUpXG5cbiAgICAgIGNvbnN0IGJhc2VVcmwgPSBhd2FpdCBnZXRTdG9yYWdlU2VydmVyVXJsKClcbiAgICAgIGNvbnN0IHVybCA9IGAke2Jhc2VVcmx9L3ZhbHVlcy8ke2VuY29kZVVSSUNvbXBvbmVudChrZXkpfWBcblxuICAgICAgY29uc3QgW2Vycm9yXSA9IGF3YWl0IHdyYXBTaWduZWRGZXRjaCh7XG4gICAgICAgIHVybCxcbiAgICAgICAgaW5pdDoge1xuICAgICAgICAgIG1ldGhvZDogJ1BVVCcsXG4gICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICAgIH0sXG4gICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyB2YWx1ZSB9KVxuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIHNldCBzdG9yYWdlIHZhbHVlICcke2tleX0nOiAke2Vycm9yfWApXG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGUoa2V5OiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgIGFzc2VydElzU2VydmVyKE1PRFVMRV9OQU1FKVxuXG4gICAgICBjb25zdCBiYXNlVXJsID0gYXdhaXQgZ2V0U3RvcmFnZVNlcnZlclVybCgpXG4gICAgICBjb25zdCB1cmwgPSBgJHtiYXNlVXJsfS92YWx1ZXMvJHtlbmNvZGVVUklDb21wb25lbnQoa2V5KX1gXG5cbiAgICAgIGNvbnN0IFtlcnJvcl0gPSBhd2FpdCB3cmFwU2lnbmVkRmV0Y2goe1xuICAgICAgICB1cmwsXG4gICAgICAgIGluaXQ6IHtcbiAgICAgICAgICBtZXRob2Q6ICdERUxFVEUnLFxuICAgICAgICAgIGhlYWRlcnM6IHt9XG4gICAgICAgIH1cbiAgICAgIH0pXG5cbiAgICAgIGlmIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gZGVsZXRlIHN0b3JhZ2UgdmFsdWUgJyR7a2V5fSc6ICR7ZXJyb3J9YClcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0cnVlXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFZhbHVlcyhvcHRpb25zPzogR2V0VmFsdWVzT3B0aW9ucyk6IFByb21pc2U8R2V0VmFsdWVzUmVzdWx0PiB7XG4gICAgICBhc3NlcnRJc1NlcnZlcihNT0RVTEVfTkFNRSlcblxuICAgICAgY29uc3QgeyBwcmVmaXgsIGxpbWl0LCBvZmZzZXQgfSA9IG9wdGlvbnMgPz8ge31cbiAgICAgIGNvbnN0IGJhc2VVcmwgPSBhd2FpdCBnZXRTdG9yYWdlU2VydmVyVXJsKClcbiAgICAgIGNvbnN0IHBhcnRzOiBzdHJpbmdbXSA9IFtdXG5cbiAgICAgIGlmICghIXByZWZpeCkge1xuICAgICAgICBwYXJ0cy5wdXNoKGBwcmVmaXg9JHtlbmNvZGVVUklDb21wb25lbnQocHJlZml4KX1gKVxuICAgICAgfVxuXG4gICAgICBpZiAoISFsaW1pdCkge1xuICAgICAgICBwYXJ0cy5wdXNoKGBsaW1pdD0ke2xpbWl0fWApXG4gICAgICB9XG5cbiAgICAgIGlmICghIW9mZnNldCkge1xuICAgICAgICBwYXJ0cy5wdXNoKGBvZmZzZXQ9JHtvZmZzZXR9YClcbiAgICAgIH1cblxuICAgICAgY29uc3QgcXVlcnkgPSBwYXJ0cy5qb2luKCcmJylcbiAgICAgIGNvbnN0IHVybCA9IHF1ZXJ5ID8gYCR7YmFzZVVybH0vdmFsdWVzPyR7cXVlcnl9YCA6IGAke2Jhc2VVcmx9L3ZhbHVlc2BcblxuICAgICAgY29uc3QgW2Vycm9yLCByZXNwb25zZV0gPSBhd2FpdCB3cmFwU2lnbmVkRmV0Y2g8R2V0VmFsdWVzUmVzdWx0Pih7IHVybCB9KVxuXG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIGdldCBzdG9yYWdlIHZhbHVlczogJHtlcnJvcn1gKVxuICAgICAgICByZXR1cm4geyBkYXRhOiBbXSwgcGFnaW5hdGlvbjogeyBvZmZzZXQ6IDAsIHRvdGFsOiAwIH0gfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBkYXRhID0gcmVzcG9uc2U/LmRhdGEgPz8gW11cbiAgICAgIGNvbnN0IHJlcXVlc3RlZE9mZnNldCA9IG9mZnNldCA/PyAwXG4gICAgICBjb25zdCBwYWdpbmF0aW9uID0ge1xuICAgICAgICBvZmZzZXQ6IHJlc3BvbnNlPy5wYWdpbmF0aW9uPy5vZmZzZXQgPz8gcmVxdWVzdGVkT2Zmc2V0LFxuICAgICAgICB0b3RhbDogcmVzcG9uc2U/LnBhZ2luYXRpb24/LnRvdGFsID8/IGRhdGEubGVuZ3RoXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7IGRhdGEsIHBhZ2luYXRpb24gfVxuICAgIH1cbiAgfVxufVxuIl19
@@ -1,10 +0,0 @@
1
- /**
2
- * Determines the correct storage server URL based on the current realm.
3
- *
4
- * - If `isPreview` is true, uses the realm's baseUrl (localhost)
5
- * - If the realm's baseUrl contains `.zone`, uses storage.decentraland.zone
6
- * - Otherwise, uses storage.decentraland.org (production)
7
- *
8
- * @returns The storage server base URL
9
- */
10
- export declare function getStorageServerUrl(): Promise<string>;
@@ -1,29 +0,0 @@
1
- import { getRealm } from '~system/Runtime';
2
- const STORAGE_SERVER_ORG = 'https://storage.decentraland.org';
3
- const STORAGE_SERVER_ZONE = 'https://storage.decentraland.zone';
4
- /**
5
- * Determines the correct storage server URL based on the current realm.
6
- *
7
- * - If `isPreview` is true, uses the realm's baseUrl (localhost)
8
- * - If the realm's baseUrl contains `.zone`, uses storage.decentraland.zone
9
- * - Otherwise, uses storage.decentraland.org (production)
10
- *
11
- * @returns The storage server base URL
12
- */
13
- export async function getStorageServerUrl() {
14
- const { realmInfo } = await getRealm({});
15
- if (!realmInfo) {
16
- throw new Error('Unable to retrieve realm information');
17
- }
18
- // Local development / preview mode
19
- if (realmInfo.isPreview) {
20
- return realmInfo.baseUrl;
21
- }
22
- // Staging / testing environment
23
- if (realmInfo.baseUrl.includes('.zone')) {
24
- return STORAGE_SERVER_ZONE;
25
- }
26
- // Production environment
27
- return STORAGE_SERVER_ORG;
28
- }
29
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZS11cmwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvc2VydmVyL3N0b3JhZ2UtdXJsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQTtBQUUxQyxNQUFNLGtCQUFrQixHQUFHLGtDQUFrQyxDQUFBO0FBQzdELE1BQU0sbUJBQW1CLEdBQUcsbUNBQW1DLENBQUE7QUFFL0Q7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLG1CQUFtQjtJQUN2QyxNQUFNLEVBQUUsU0FBUyxFQUFFLEdBQUcsTUFBTSxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUE7SUFFeEMsSUFBSSxDQUFDLFNBQVMsRUFBRTtRQUNkLE1BQU0sSUFBSSxLQUFLLENBQUMsc0NBQXNDLENBQUMsQ0FBQTtLQUN4RDtJQUVELG1DQUFtQztJQUNuQyxJQUFJLFNBQVMsQ0FBQyxTQUFTLEVBQUU7UUFDdkIsT0FBTyxTQUFTLENBQUMsT0FBTyxDQUFBO0tBQ3pCO0lBRUQsZ0NBQWdDO0lBQ2hDLElBQUksU0FBUyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUU7UUFDdkMsT0FBTyxtQkFBbUIsQ0FBQTtLQUMzQjtJQUVELHlCQUF5QjtJQUN6QixPQUFPLGtCQUFrQixDQUFBO0FBQzNCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBnZXRSZWFsbSB9IGZyb20gJ35zeXN0ZW0vUnVudGltZSdcblxuY29uc3QgU1RPUkFHRV9TRVJWRVJfT1JHID0gJ2h0dHBzOi8vc3RvcmFnZS5kZWNlbnRyYWxhbmQub3JnJ1xuY29uc3QgU1RPUkFHRV9TRVJWRVJfWk9ORSA9ICdodHRwczovL3N0b3JhZ2UuZGVjZW50cmFsYW5kLnpvbmUnXG5cbi8qKlxuICogRGV0ZXJtaW5lcyB0aGUgY29ycmVjdCBzdG9yYWdlIHNlcnZlciBVUkwgYmFzZWQgb24gdGhlIGN1cnJlbnQgcmVhbG0uXG4gKlxuICogLSBJZiBgaXNQcmV2aWV3YCBpcyB0cnVlLCB1c2VzIHRoZSByZWFsbSdzIGJhc2VVcmwgKGxvY2FsaG9zdClcbiAqIC0gSWYgdGhlIHJlYWxtJ3MgYmFzZVVybCBjb250YWlucyBgLnpvbmVgLCB1c2VzIHN0b3JhZ2UuZGVjZW50cmFsYW5kLnpvbmVcbiAqIC0gT3RoZXJ3aXNlLCB1c2VzIHN0b3JhZ2UuZGVjZW50cmFsYW5kLm9yZyAocHJvZHVjdGlvbilcbiAqXG4gKiBAcmV0dXJucyBUaGUgc3RvcmFnZSBzZXJ2ZXIgYmFzZSBVUkxcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFN0b3JhZ2VTZXJ2ZXJVcmwoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgeyByZWFsbUluZm8gfSA9IGF3YWl0IGdldFJlYWxtKHt9KVxuXG4gIGlmICghcmVhbG1JbmZvKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gcmV0cmlldmUgcmVhbG0gaW5mb3JtYXRpb24nKVxuICB9XG5cbiAgLy8gTG9jYWwgZGV2ZWxvcG1lbnQgLyBwcmV2aWV3IG1vZGVcbiAgaWYgKHJlYWxtSW5mby5pc1ByZXZpZXcpIHtcbiAgICByZXR1cm4gcmVhbG1JbmZvLmJhc2VVcmxcbiAgfVxuXG4gIC8vIFN0YWdpbmcgLyB0ZXN0aW5nIGVudmlyb25tZW50XG4gIGlmIChyZWFsbUluZm8uYmFzZVVybC5pbmNsdWRlcygnLnpvbmUnKSkge1xuICAgIHJldHVybiBTVE9SQUdFX1NFUlZFUl9aT05FXG4gIH1cblxuICAvLyBQcm9kdWN0aW9uIGVudmlyb25tZW50XG4gIHJldHVybiBTVE9SQUdFX1NFUlZFUl9PUkdcbn1cbiJdfQ==
package/server/utils.d.ts DELETED
@@ -1,35 +0,0 @@
1
- /// <reference types="@dcl/js-runtime" />
2
- import { SignedFetchRequest } from '~system/SignedFetch';
3
- /**
4
- * Validates that the code is running on a server-side scene.
5
- * Throws an error if called from a client-side context.
6
- *
7
- * @param moduleName - The name of the module for the error message
8
- * @throws Error if not running on a server-side scene
9
- */
10
- export declare function assertIsServer(moduleName: string): void;
11
- /**
12
- * Result type for operations that can fail.
13
- * Returns a tuple of [error, null] on failure or [null, data] on success.
14
- */
15
- export type Result<T, E = string> = [E, null] | [null, T];
16
- /**
17
- * Extended result type that includes HTTP status code information.
18
- */
19
- export type FetchResult<T> = [string, null, number?] | [null, T, number];
20
- /**
21
- * Wraps a promise to catch errors and return a Result tuple.
22
- * This allows for cleaner error handling without try-catch blocks.
23
- *
24
- * @param promise - The promise to wrap
25
- * @returns A tuple of [error, null] on failure or [null, data] on success
26
- */
27
- export declare function tryCatch<T, E = Error>(promise: Promise<T>): Promise<Result<T, E>>;
28
- /**
29
- * Wraps signedFetch with automatic error handling and JSON parsing.
30
- * Returns a FetchResult tuple with parsed JSON data or error message and status code.
31
- *
32
- * @param signedFetchBody - The signedFetch request configuration
33
- * @returns A tuple of [error, null, statusCode?] on failure or [null, data, statusCode] on success
34
- */
35
- export declare function wrapSignedFetch<T = unknown>(signedFetchBody: SignedFetchRequest): Promise<FetchResult<T>>;
package/server/utils.js DELETED
@@ -1,56 +0,0 @@
1
- import { signedFetch } from '~system/SignedFetch';
2
- import { isServer } from '../network';
3
- /**
4
- * Validates that the code is running on a server-side scene.
5
- * Throws an error if called from a client-side context.
6
- *
7
- * @param moduleName - The name of the module for the error message
8
- * @throws Error if not running on a server-side scene
9
- */
10
- export function assertIsServer(moduleName) {
11
- if (!isServer()) {
12
- throw new Error(`${moduleName} is only available on server-side scenes`);
13
- }
14
- }
15
- /**
16
- * Wraps a promise to catch errors and return a Result tuple.
17
- * This allows for cleaner error handling without try-catch blocks.
18
- *
19
- * @param promise - The promise to wrap
20
- * @returns A tuple of [error, null] on failure or [null, data] on success
21
- */
22
- export async function tryCatch(promise) {
23
- try {
24
- const data = await promise;
25
- return [null, data];
26
- }
27
- catch (error) {
28
- return [error, null];
29
- }
30
- }
31
- /**
32
- * Wraps signedFetch with automatic error handling and JSON parsing.
33
- * Returns a FetchResult tuple with parsed JSON data or error message and status code.
34
- *
35
- * @param signedFetchBody - The signedFetch request configuration
36
- * @returns A tuple of [error, null, statusCode?] on failure or [null, data, statusCode] on success
37
- */
38
- export async function wrapSignedFetch(signedFetchBody) {
39
- const [error, response] = await tryCatch(signedFetch(signedFetchBody));
40
- if (error) {
41
- console.error(`Error in ${signedFetchBody.url} endpoint`, { error });
42
- return [error.message, null, undefined];
43
- }
44
- if (!response.ok) {
45
- const errorMessage = `${response.status} ${response.statusText}`;
46
- console.error(`Error in ${signedFetchBody.url} endpoint`, { response });
47
- return [errorMessage, null, response.status];
48
- }
49
- const [parseError, body] = await tryCatch(JSON.parse(response.body || '{}'));
50
- if (parseError) {
51
- console.error(`Failed to parse response from ${signedFetchBody.url}`);
52
- return ['Failed to parse response', null, response.status];
53
- }
54
- return [null, (body ?? {}), response.status];
55
- }
56
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvc2VydmVyL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQXNCLE1BQU0scUJBQXFCLENBQUE7QUFDckUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFlBQVksQ0FBQTtBQUVyQzs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsY0FBYyxDQUFDLFVBQWtCO0lBQy9DLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRTtRQUNmLE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxVQUFVLDBDQUEwQyxDQUFDLENBQUE7S0FDekU7QUFDSCxDQUFDO0FBYUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxRQUFRLENBQWUsT0FBbUI7SUFDOUQsSUFBSTtRQUNGLE1BQU0sSUFBSSxHQUFHLE1BQU0sT0FBTyxDQUFBO1FBQzFCLE9BQU8sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUE7S0FDcEI7SUFBQyxPQUFPLEtBQUssRUFBRTtRQUNkLE9BQU8sQ0FBQyxLQUFVLEVBQUUsSUFBSSxDQUFDLENBQUE7S0FDMUI7QUFDSCxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxlQUFlLENBQWMsZUFBbUM7SUFDcEYsTUFBTSxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsR0FBRyxNQUFNLFFBQVEsQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQTtJQUV0RSxJQUFJLEtBQUssRUFBRTtRQUNULE9BQU8sQ0FBQyxLQUFLLENBQUMsWUFBWSxlQUFlLENBQUMsR0FBRyxXQUFXLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFBO1FBQ3BFLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQTtLQUN4QztJQUVELElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFO1FBQ2hCLE1BQU0sWUFBWSxHQUFHLEdBQUcsUUFBUSxDQUFDLE1BQU0sSUFBSSxRQUFRLENBQUMsVUFBVSxFQUFFLENBQUE7UUFDaEUsT0FBTyxDQUFDLEtBQUssQ0FBQyxZQUFZLGVBQWUsQ0FBQyxHQUFHLFdBQVcsRUFBRSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUE7UUFDdkUsT0FBTyxDQUFDLFlBQVksRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFBO0tBQzdDO0lBRUQsTUFBTSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsR0FBRyxNQUFNLFFBQVEsQ0FBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQTtJQUUvRSxJQUFJLFVBQVUsRUFBRTtRQUNkLE9BQU8sQ0FBQyxLQUFLLENBQUMsaUNBQWlDLGVBQWUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFBO1FBQ3JFLE9BQU8sQ0FBQywwQkFBMEIsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFBO0tBQzNEO0lBRUQsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksSUFBSSxFQUFFLENBQU0sRUFBRSxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUE7QUFDbkQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHNpZ25lZEZldGNoLCBTaWduZWRGZXRjaFJlcXVlc3QgfSBmcm9tICd+c3lzdGVtL1NpZ25lZEZldGNoJ1xuaW1wb3J0IHsgaXNTZXJ2ZXIgfSBmcm9tICcuLi9uZXR3b3JrJ1xuXG4vKipcbiAqIFZhbGlkYXRlcyB0aGF0IHRoZSBjb2RlIGlzIHJ1bm5pbmcgb24gYSBzZXJ2ZXItc2lkZSBzY2VuZS5cbiAqIFRocm93cyBhbiBlcnJvciBpZiBjYWxsZWQgZnJvbSBhIGNsaWVudC1zaWRlIGNvbnRleHQuXG4gKlxuICogQHBhcmFtIG1vZHVsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgbW9kdWxlIGZvciB0aGUgZXJyb3IgbWVzc2FnZVxuICogQHRocm93cyBFcnJvciBpZiBub3QgcnVubmluZyBvbiBhIHNlcnZlci1zaWRlIHNjZW5lXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRJc1NlcnZlcihtb2R1bGVOYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKCFpc1NlcnZlcigpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke21vZHVsZU5hbWV9IGlzIG9ubHkgYXZhaWxhYmxlIG9uIHNlcnZlci1zaWRlIHNjZW5lc2ApXG4gIH1cbn1cblxuLyoqXG4gKiBSZXN1bHQgdHlwZSBmb3Igb3BlcmF0aW9ucyB0aGF0IGNhbiBmYWlsLlxuICogUmV0dXJucyBhIHR1cGxlIG9mIFtlcnJvciwgbnVsbF0gb24gZmFpbHVyZSBvciBbbnVsbCwgZGF0YV0gb24gc3VjY2Vzcy5cbiAqL1xuZXhwb3J0IHR5cGUgUmVzdWx0PFQsIEUgPSBzdHJpbmc+ID0gW0UsIG51bGxdIHwgW251bGwsIFRdXG5cbi8qKlxuICogRXh0ZW5kZWQgcmVzdWx0IHR5cGUgdGhhdCBpbmNsdWRlcyBIVFRQIHN0YXR1cyBjb2RlIGluZm9ybWF0aW9uLlxuICovXG5leHBvcnQgdHlwZSBGZXRjaFJlc3VsdDxUPiA9IFtzdHJpbmcsIG51bGwsIG51bWJlcj9dIHwgW251bGwsIFQsIG51bWJlcl1cblxuLyoqXG4gKiBXcmFwcyBhIHByb21pc2UgdG8gY2F0Y2ggZXJyb3JzIGFuZCByZXR1cm4gYSBSZXN1bHQgdHVwbGUuXG4gKiBUaGlzIGFsbG93cyBmb3IgY2xlYW5lciBlcnJvciBoYW5kbGluZyB3aXRob3V0IHRyeS1jYXRjaCBibG9ja3MuXG4gKlxuICogQHBhcmFtIHByb21pc2UgLSBUaGUgcHJvbWlzZSB0byB3cmFwXG4gKiBAcmV0dXJucyBBIHR1cGxlIG9mIFtlcnJvciwgbnVsbF0gb24gZmFpbHVyZSBvciBbbnVsbCwgZGF0YV0gb24gc3VjY2Vzc1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdHJ5Q2F0Y2g8VCwgRSA9IEVycm9yPihwcm9taXNlOiBQcm9taXNlPFQ+KTogUHJvbWlzZTxSZXN1bHQ8VCwgRT4+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcHJvbWlzZVxuICAgIHJldHVybiBbbnVsbCwgZGF0YV1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gW2Vycm9yIGFzIEUsIG51bGxdXG4gIH1cbn1cblxuLyoqXG4gKiBXcmFwcyBzaWduZWRGZXRjaCB3aXRoIGF1dG9tYXRpYyBlcnJvciBoYW5kbGluZyBhbmQgSlNPTiBwYXJzaW5nLlxuICogUmV0dXJucyBhIEZldGNoUmVzdWx0IHR1cGxlIHdpdGggcGFyc2VkIEpTT04gZGF0YSBvciBlcnJvciBtZXNzYWdlIGFuZCBzdGF0dXMgY29kZS5cbiAqXG4gKiBAcGFyYW0gc2lnbmVkRmV0Y2hCb2R5IC0gVGhlIHNpZ25lZEZldGNoIHJlcXVlc3QgY29uZmlndXJhdGlvblxuICogQHJldHVybnMgQSB0dXBsZSBvZiBbZXJyb3IsIG51bGwsIHN0YXR1c0NvZGU/XSBvbiBmYWlsdXJlIG9yIFtudWxsLCBkYXRhLCBzdGF0dXNDb2RlXSBvbiBzdWNjZXNzXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3cmFwU2lnbmVkRmV0Y2g8VCA9IHVua25vd24+KHNpZ25lZEZldGNoQm9keTogU2lnbmVkRmV0Y2hSZXF1ZXN0KTogUHJvbWlzZTxGZXRjaFJlc3VsdDxUPj4ge1xuICBjb25zdCBbZXJyb3IsIHJlc3BvbnNlXSA9IGF3YWl0IHRyeUNhdGNoKHNpZ25lZEZldGNoKHNpZ25lZEZldGNoQm9keSkpXG5cbiAgaWYgKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihgRXJyb3IgaW4gJHtzaWduZWRGZXRjaEJvZHkudXJsfSBlbmRwb2ludGAsIHsgZXJyb3IgfSlcbiAgICByZXR1cm4gW2Vycm9yLm1lc3NhZ2UsIG51bGwsIHVuZGVmaW5lZF1cbiAgfVxuXG4gIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBgJHtyZXNwb25zZS5zdGF0dXN9ICR7cmVzcG9uc2Uuc3RhdHVzVGV4dH1gXG4gICAgY29uc29sZS5lcnJvcihgRXJyb3IgaW4gJHtzaWduZWRGZXRjaEJvZHkudXJsfSBlbmRwb2ludGAsIHsgcmVzcG9uc2UgfSlcbiAgICByZXR1cm4gW2Vycm9yTWVzc2FnZSwgbnVsbCwgcmVzcG9uc2Uuc3RhdHVzXVxuICB9XG5cbiAgY29uc3QgW3BhcnNlRXJyb3IsIGJvZHldID0gYXdhaXQgdHJ5Q2F0Y2g8VD4oSlNPTi5wYXJzZShyZXNwb25zZS5ib2R5IHx8ICd7fScpKVxuXG4gIGlmIChwYXJzZUVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIHBhcnNlIHJlc3BvbnNlIGZyb20gJHtzaWduZWRGZXRjaEJvZHkudXJsfWApXG4gICAgcmV0dXJuIFsnRmFpbGVkIHRvIHBhcnNlIHJlc3BvbnNlJywgbnVsbCwgcmVzcG9uc2Uuc3RhdHVzXVxuICB9XG5cbiAgcmV0dXJuIFtudWxsLCAoYm9keSA/PyB7fSkgYXMgVCwgcmVzcG9uc2Uuc3RhdHVzXVxufVxuIl19
package/src/atom.ts DELETED
@@ -1,98 +0,0 @@
1
- import future, { IFuture } from './future'
2
-
3
- // atom value wrapper like in clojure
4
-
5
- // Simple Observable implementation to replace Babylon.js dependency
6
- class SimpleObservable<T> {
7
- private observers: ((value: T) => void)[] = []
8
- private onceObservers: ((value: T) => void)[] = []
9
-
10
- add(callback: (value: T) => void): (value: T) => void {
11
- this.observers.push(callback)
12
- return callback
13
- }
14
-
15
- addOnce(callback: (value: T) => void): void {
16
- this.onceObservers.push(callback)
17
- }
18
-
19
- remove(callback: (value: T) => void): void {
20
- const index = this.observers.indexOf(callback)
21
- if (index > -1) {
22
- this.observers.splice(index, 1)
23
- }
24
- }
25
-
26
- notifyObservers(value: T): void {
27
- this.observers.forEach((observer) => observer(value))
28
-
29
- if (this.onceObservers.length > 0) {
30
- this.onceObservers.forEach((observer) => observer(value))
31
- this.onceObservers.length = 0
32
- }
33
- }
34
- }
35
-
36
- const EMPTY = Symbol('empty')
37
- type EMPTY = typeof EMPTY
38
-
39
- export type Atom<T> = {
40
- deref(): Promise<T>
41
- getOrNull(): T | null
42
- observable: SimpleObservable<T>
43
- swap(value: T): T | void
44
- pipe(fn: (value: T) => void | Promise<void>): Promise<void>
45
- }
46
-
47
- export function Atom<T>(initialValue: T | EMPTY = EMPTY): Atom<T> {
48
- const observable = new SimpleObservable<T>()
49
- let value: T | EMPTY = initialValue
50
- const valueFutures: IFuture<T>[] = []
51
-
52
- observable.addOnce((value) => {
53
- valueFutures.forEach(($) => $.resolve(value))
54
- valueFutures.length = 0
55
- })
56
-
57
- return {
58
- async pipe(fn) {
59
- observable.add(async (t) => {
60
- try {
61
- await fn(t)
62
- } catch (err) {
63
- console.error(err)
64
- }
65
- })
66
- if (value !== EMPTY) {
67
- try {
68
- await fn(value)
69
- } catch (err) {
70
- console.error(err)
71
- }
72
- }
73
- },
74
- deref() {
75
- if (value === EMPTY) {
76
- const ret = future<T>()
77
- valueFutures.push(ret)
78
- return ret
79
- }
80
- return Promise.resolve(value)
81
- },
82
- getOrNull() {
83
- if (value === EMPTY) {
84
- return null
85
- }
86
- return value
87
- },
88
- observable,
89
- swap(newValue) {
90
- const oldValue = value
91
- if (newValue !== value) {
92
- value = newValue
93
- observable.notifyObservers(value)
94
- }
95
- return oldValue === EMPTY ? undefined : oldValue
96
- }
97
- }
98
- }