@dcl/sdk-commands 7.20.1 → 7.20.2-22102228700.commit-61000fc

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 (55) hide show
  1. package/dist/commands/sdk-server-logs/index.d.ts +23 -0
  2. package/dist/commands/sdk-server-logs/index.js +271 -0
  3. package/dist/commands/sdk-server-logs/index.js.map +1 -0
  4. package/dist/commands/start/hammurabi-server.d.ts +19 -0
  5. package/dist/commands/start/hammurabi-server.js +78 -0
  6. package/dist/commands/start/hammurabi-server.js.map +1 -0
  7. package/dist/commands/start/index.d.ts +1 -0
  8. package/dist/commands/start/index.js +23 -4
  9. package/dist/commands/start/index.js.map +1 -1
  10. package/dist/commands/start/server/routes.js +2 -0
  11. package/dist/commands/start/server/routes.js.map +1 -1
  12. package/dist/commands/start/server/runtime-env.d.ts +71 -0
  13. package/dist/commands/start/server/runtime-env.js +226 -0
  14. package/dist/commands/start/server/runtime-env.js.map +1 -0
  15. package/dist/commands/start/server/storage-service.d.ts +8 -0
  16. package/dist/commands/start/server/storage-service.js +156 -0
  17. package/dist/commands/start/server/storage-service.js.map +1 -0
  18. package/dist/commands/start/types.d.ts +3 -0
  19. package/dist/commands/start/utils.d.ts +34 -0
  20. package/dist/commands/start/utils.js +104 -0
  21. package/dist/commands/start/utils.js.map +1 -1
  22. package/dist/commands/storage/env.d.ts +5 -0
  23. package/dist/commands/storage/env.js +86 -0
  24. package/dist/commands/storage/env.js.map +1 -0
  25. package/dist/commands/storage/index.d.ts +26 -0
  26. package/dist/commands/storage/index.js +130 -0
  27. package/dist/commands/storage/index.js.map +1 -0
  28. package/dist/commands/storage/player.d.ts +5 -0
  29. package/dist/commands/storage/player.js +143 -0
  30. package/dist/commands/storage/player.js.map +1 -0
  31. package/dist/commands/storage/scene.d.ts +5 -0
  32. package/dist/commands/storage/scene.js +105 -0
  33. package/dist/commands/storage/scene.js.map +1 -0
  34. package/dist/commands/storage/shared.d.ts +62 -0
  35. package/dist/commands/storage/shared.js +249 -0
  36. package/dist/commands/storage/shared.js.map +1 -0
  37. package/dist/commands/storage/types.d.ts +56 -0
  38. package/dist/commands/storage/types.js +23 -0
  39. package/dist/commands/storage/types.js.map +1 -0
  40. package/dist/components/analytics.d.ts +66 -0
  41. package/dist/components/analytics.js.map +1 -1
  42. package/dist/logic/auth-chain-headers.d.ts +11 -0
  43. package/dist/logic/auth-chain-headers.js +25 -0
  44. package/dist/logic/auth-chain-headers.js.map +1 -0
  45. package/dist/logic/bundle.js +16 -0
  46. package/dist/logic/bundle.js.map +1 -1
  47. package/dist/logic/error.d.ts +1 -1
  48. package/dist/logic/error.js.map +1 -1
  49. package/dist/logic/exec.d.ts +1 -0
  50. package/dist/logic/exec.js +2 -2
  51. package/dist/logic/exec.js.map +1 -1
  52. package/dist/logic/lang.js +1 -1
  53. package/dist/logic/scene-validations.d.ts +9 -1
  54. package/dist/logic/scene-validations.js.map +1 -1
  55. package/package.json +3 -3
@@ -0,0 +1,226 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.loadServerStorage = loadServerStorage;
7
+ exports.saveServerStorage = saveServerStorage;
8
+ exports.loadEnvFile = loadEnvFile;
9
+ exports.getEnvStorage = getEnvStorage;
10
+ exports.getMergedEnv = getMergedEnv;
11
+ exports.setEnvValue = setEnvValue;
12
+ exports.deleteEnvValue = deleteEnvValue;
13
+ exports.getWorldStorage = getWorldStorage;
14
+ exports.getWorldValue = getWorldValue;
15
+ exports.setWorldValue = setWorldValue;
16
+ exports.deleteWorldValue = deleteWorldValue;
17
+ exports.getPlayerValue = getPlayerValue;
18
+ exports.setPlayerValue = setPlayerValue;
19
+ exports.deletePlayerValue = deletePlayerValue;
20
+ const path_1 = __importDefault(require("path"));
21
+ // Find the sdk-commands package root by resolving its package.json
22
+ const SDK_COMMANDS_ROOT = path_1.default.dirname(require.resolve('@dcl/sdk-commands/package.json'));
23
+ const RUNTIME_DATA_DIR = path_1.default.join(SDK_COMMANDS_ROOT, '.runtime-data');
24
+ const SERVER_STORAGE_FILE = 'server-storage.json';
25
+ const DEFAULT_STORAGE = {
26
+ env: {},
27
+ world: {},
28
+ players: {}
29
+ };
30
+ /**
31
+ * Ensures the runtime data directory exists.
32
+ */
33
+ async function ensureRuntimeDir(components) {
34
+ try {
35
+ const exists = await components.fs.directoryExists(RUNTIME_DATA_DIR);
36
+ if (!exists) {
37
+ await components.fs.mkdir(RUNTIME_DATA_DIR, { recursive: true });
38
+ }
39
+ }
40
+ catch (error) {
41
+ components.logger.error(`Failed to create runtime data directory: ${error}`);
42
+ }
43
+ }
44
+ /**
45
+ * Loads all server-side storage data from server-storage.json.
46
+ */
47
+ async function loadServerStorage(components) {
48
+ const storagePath = path_1.default.join(RUNTIME_DATA_DIR, SERVER_STORAGE_FILE);
49
+ try {
50
+ const exists = await components.fs.fileExists(storagePath);
51
+ if (!exists) {
52
+ return { ...DEFAULT_STORAGE };
53
+ }
54
+ const content = await components.fs.readFile(storagePath, 'utf-8');
55
+ const parsed = JSON.parse(content);
56
+ // Merge with defaults to ensure all keys exist
57
+ return {
58
+ env: parsed.env ?? {},
59
+ world: parsed.world ?? {},
60
+ players: parsed.players ?? {}
61
+ };
62
+ }
63
+ catch (error) {
64
+ components.logger.error(`Failed to load ${SERVER_STORAGE_FILE}: ${error}`);
65
+ return { ...DEFAULT_STORAGE };
66
+ }
67
+ }
68
+ /**
69
+ * Saves all server-side storage data to server-storage.json.
70
+ */
71
+ async function saveServerStorage(components, data) {
72
+ await ensureRuntimeDir(components);
73
+ const storagePath = path_1.default.join(RUNTIME_DATA_DIR, SERVER_STORAGE_FILE);
74
+ try {
75
+ await components.fs.writeFile(storagePath, JSON.stringify(data, null, 2));
76
+ }
77
+ catch (error) {
78
+ components.logger.error(`Failed to save ${SERVER_STORAGE_FILE}: ${error}`);
79
+ throw error;
80
+ }
81
+ }
82
+ /**
83
+ * Loads environment variables from a .env file in the project directory.
84
+ * Returns a Map of key-value pairs.
85
+ */
86
+ async function loadEnvFile(components, projectDirectory) {
87
+ const envMap = new Map();
88
+ const envPath = path_1.default.join(projectDirectory, '.env');
89
+ try {
90
+ const exists = await components.fs.fileExists(envPath);
91
+ if (!exists) {
92
+ return envMap;
93
+ }
94
+ const content = await components.fs.readFile(envPath, 'utf-8');
95
+ const lines = content.split('\n');
96
+ for (const line of lines) {
97
+ const trimmed = line.trim();
98
+ // Skip empty lines and comments
99
+ if (!trimmed || trimmed.startsWith('#')) {
100
+ continue;
101
+ }
102
+ const equalIndex = trimmed.indexOf('=');
103
+ if (equalIndex > 0) {
104
+ const key = trimmed.slice(0, equalIndex).trim();
105
+ let value = trimmed.slice(equalIndex + 1).trim();
106
+ // Remove surrounding quotes if present
107
+ if ((value.startsWith('"') && value.endsWith('"')) || (value.startsWith("'") && value.endsWith("'"))) {
108
+ value = value.slice(1, -1);
109
+ }
110
+ envMap.set(key, value);
111
+ }
112
+ }
113
+ }
114
+ catch (error) {
115
+ components.logger.error(`Failed to load .env file: ${error}`);
116
+ }
117
+ return envMap;
118
+ }
119
+ /**
120
+ * Gets runtime environment variables.
121
+ */
122
+ async function getEnvStorage(components) {
123
+ const storage = await loadServerStorage(components);
124
+ return storage.env;
125
+ }
126
+ /**
127
+ * Gets merged environment variables.
128
+ * Runtime values (from server-storage.json) override .env values.
129
+ */
130
+ async function getMergedEnv(components, projectDirectory) {
131
+ const envFile = await loadEnvFile(components, projectDirectory);
132
+ const runtimeEnv = await getEnvStorage(components);
133
+ // Runtime overrides .env
134
+ for (const [key, value] of Object.entries(runtimeEnv)) {
135
+ envFile.set(key, value);
136
+ }
137
+ return envFile;
138
+ }
139
+ /**
140
+ * Sets a runtime environment variable.
141
+ */
142
+ async function setEnvValue(components, key, value) {
143
+ const storage = await loadServerStorage(components);
144
+ storage.env[key] = value;
145
+ await saveServerStorage(components, storage);
146
+ }
147
+ /**
148
+ * Deletes a runtime environment variable.
149
+ * Returns true if key existed and was deleted, false otherwise.
150
+ */
151
+ async function deleteEnvValue(components, key) {
152
+ const storage = await loadServerStorage(components);
153
+ if (!(key in storage.env)) {
154
+ return false;
155
+ }
156
+ delete storage.env[key];
157
+ await saveServerStorage(components, storage);
158
+ return true;
159
+ }
160
+ /**
161
+ * Gets all world storage data.
162
+ */
163
+ async function getWorldStorage(components) {
164
+ const storage = await loadServerStorage(components);
165
+ return storage.world;
166
+ }
167
+ /**
168
+ * Gets a value from world storage.
169
+ */
170
+ async function getWorldValue(components, key) {
171
+ const storage = await loadServerStorage(components);
172
+ return storage.world[key];
173
+ }
174
+ /**
175
+ * Sets a value in world storage.
176
+ */
177
+ async function setWorldValue(components, key, value) {
178
+ const storage = await loadServerStorage(components);
179
+ storage.world[key] = value;
180
+ await saveServerStorage(components, storage);
181
+ }
182
+ /**
183
+ * Deletes a value from world storage.
184
+ * Returns true if key existed and was deleted, false otherwise.
185
+ */
186
+ async function deleteWorldValue(components, key) {
187
+ const storage = await loadServerStorage(components);
188
+ if (!(key in storage.world)) {
189
+ return false;
190
+ }
191
+ delete storage.world[key];
192
+ await saveServerStorage(components, storage);
193
+ return true;
194
+ }
195
+ /**
196
+ * Gets a value from a player's storage.
197
+ */
198
+ async function getPlayerValue(components, address, key) {
199
+ const storage = await loadServerStorage(components);
200
+ return storage.players[address]?.[key];
201
+ }
202
+ /**
203
+ * Sets a value in a player's storage.
204
+ */
205
+ async function setPlayerValue(components, address, key, value) {
206
+ const storage = await loadServerStorage(components);
207
+ if (!storage.players[address]) {
208
+ storage.players[address] = {};
209
+ }
210
+ storage.players[address][key] = value;
211
+ await saveServerStorage(components, storage);
212
+ }
213
+ /**
214
+ * Deletes a value from a player's storage.
215
+ * Returns true if key existed and was deleted, false otherwise.
216
+ */
217
+ async function deletePlayerValue(components, address, key) {
218
+ const storage = await loadServerStorage(components);
219
+ if (!storage.players[address] || !(key in storage.players[address])) {
220
+ return false;
221
+ }
222
+ delete storage.players[address][key];
223
+ await saveServerStorage(components, storage);
224
+ return true;
225
+ }
226
+ //# sourceMappingURL=runtime-env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-env.js","sourceRoot":"","sources":["../../../../src/commands/start/server/runtime-env.ts"],"names":[],"mappings":";;;;;AAyCA,8CAsBC;AAKD,8CAaC;AAMD,kCAyCC;AAKD,sCAGC;AAMD,oCAaC;AAKD,kCAQC;AAMD,wCAQC;AAKD,0CAKC;AAKD,sCAMC;AAKD,sCAQC;AAMD,4CAWC;AAKD,wCAOC;AAKD,wCAYC;AAMD,8CAYC;AAxRD,gDAAuB;AAGvB,mEAAmE;AACnE,MAAM,iBAAiB,GAAG,cAAI,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,gCAAgC,CAAC,CAAC,CAAA;AACzF,MAAM,gBAAgB,GAAG,cAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,eAAe,CAAC,CAAA;AACtE,MAAM,mBAAmB,GAAG,qBAAqB,CAAA;AAYjD,MAAM,eAAe,GAAkB;IACrC,GAAG,EAAE,EAAE;IACP,KAAK,EAAE,EAAE;IACT,OAAO,EAAE,EAAE;CACZ,CAAA;AAED;;GAEG;AACH,KAAK,UAAU,gBAAgB,CAAC,UAAgD;IAC9E,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,EAAE,CAAC,eAAe,CAAC,gBAAgB,CAAC,CAAA;QACpE,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,UAAU,CAAC,EAAE,CAAC,KAAK,CAAC,gBAAgB,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QAClE,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,4CAA4C,KAAK,EAAE,CAAC,CAAA;IAC9E,CAAC;AACH,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,iBAAiB,CAAC,UAAgD;IACtF,MAAM,WAAW,GAAG,cAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,CAAA;IAEpE,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,CAAA;QAC1D,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,EAAE,GAAG,eAAe,EAAE,CAAA;QAC/B,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,EAAE,CAAC,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC,CAAA;QAClE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAA2B,CAAA;QAE5D,+CAA+C;QAC/C,OAAO;YACL,GAAG,EAAE,MAAM,CAAC,GAAG,IAAI,EAAE;YACrB,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,EAAE;YACzB,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,EAAE;SAC9B,CAAA;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,kBAAkB,mBAAmB,KAAK,KAAK,EAAE,CAAC,CAAA;QAC1E,OAAO,EAAE,GAAG,eAAe,EAAE,CAAA;IAC/B,CAAC;AACH,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,iBAAiB,CACrC,UAAgD,EAChD,IAAmB;IAEnB,MAAM,gBAAgB,CAAC,UAAU,CAAC,CAAA;IAClC,MAAM,WAAW,GAAG,cAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,CAAA;IAEpE,IAAI,CAAC;QACH,MAAM,UAAU,CAAC,EAAE,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;IAC3E,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,kBAAkB,mBAAmB,KAAK,KAAK,EAAE,CAAC,CAAA;QAC1E,MAAM,KAAK,CAAA;IACb,CAAC;AACH,CAAC;AAED;;;GAGG;AACI,KAAK,UAAU,WAAW,CAC/B,UAAgD,EAChD,gBAAwB;IAExB,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAA;IACxC,MAAM,OAAO,GAAG,cAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAA;IAEnD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAA;QACtD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,MAAM,CAAA;QACf,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;QAC9D,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QAEjC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAA;YAC3B,gCAAgC;YAChC,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBACxC,SAAQ;YACV,CAAC;YAED,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;YACvC,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;gBACnB,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,IAAI,EAAE,CAAA;gBAC/C,IAAI,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;gBAEhD,uCAAuC;gBACvC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;oBACrG,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;gBAC5B,CAAC;gBAED,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;YACxB,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,6BAA6B,KAAK,EAAE,CAAC,CAAA;IAC/D,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,aAAa,CAAC,UAAgD;IAClF,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC,UAAU,CAAC,CAAA;IACnD,OAAO,OAAO,CAAC,GAAG,CAAA;AACpB,CAAC;AAED;;;GAGG;AACI,KAAK,UAAU,YAAY,CAChC,UAAgD,EAChD,gBAAwB;IAExB,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAAA;IAC/D,MAAM,UAAU,GAAG,MAAM,aAAa,CAAC,UAAU,CAAC,CAAA;IAElD,yBAAyB;IACzB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QACtD,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;IACzB,CAAC;IAED,OAAO,OAAO,CAAA;AAChB,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,WAAW,CAC/B,UAAgD,EAChD,GAAW,EACX,KAAa;IAEb,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC,UAAU,CAAC,CAAA;IACnD,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;IACxB,MAAM,iBAAiB,CAAC,UAAU,EAAE,OAAO,CAAC,CAAA;AAC9C,CAAC;AAED;;;GAGG;AACI,KAAK,UAAU,cAAc,CAAC,UAAgD,EAAE,GAAW;IAChG,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC,UAAU,CAAC,CAAA;IACnD,IAAI,CAAC,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1B,OAAO,KAAK,CAAA;IACd,CAAC;IACD,OAAO,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IACvB,MAAM,iBAAiB,CAAC,UAAU,EAAE,OAAO,CAAC,CAAA;IAC5C,OAAO,IAAI,CAAA;AACb,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,eAAe,CACnC,UAAgD;IAEhD,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC,UAAU,CAAC,CAAA;IACnD,OAAO,OAAO,CAAC,KAAK,CAAA;AACtB,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,aAAa,CACjC,UAAgD,EAChD,GAAW;IAEX,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC,UAAU,CAAC,CAAA;IACnD,OAAO,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;AAC3B,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,aAAa,CACjC,UAAgD,EAChD,GAAW,EACX,KAAc;IAEd,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC,UAAU,CAAC,CAAA;IACnD,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;IAC1B,MAAM,iBAAiB,CAAC,UAAU,EAAE,OAAO,CAAC,CAAA;AAC9C,CAAC;AAED;;;GAGG;AACI,KAAK,UAAU,gBAAgB,CACpC,UAAgD,EAChD,GAAW;IAEX,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC,UAAU,CAAC,CAAA;IACnD,IAAI,CAAC,CAAC,GAAG,IAAI,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,KAAK,CAAA;IACd,CAAC;IACD,OAAO,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IACzB,MAAM,iBAAiB,CAAC,UAAU,EAAE,OAAO,CAAC,CAAA;IAC5C,OAAO,IAAI,CAAA;AACb,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,cAAc,CAClC,UAAgD,EAChD,OAAe,EACf,GAAW;IAEX,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC,UAAU,CAAC,CAAA;IACnD,OAAO,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,CAAA;AACxC,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,cAAc,CAClC,UAAgD,EAChD,OAAe,EACf,GAAW,EACX,KAAc;IAEd,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC,UAAU,CAAC,CAAA;IACnD,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9B,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,CAAA;IAC/B,CAAC;IACD,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;IACrC,MAAM,iBAAiB,CAAC,UAAU,EAAE,OAAO,CAAC,CAAA;AAC9C,CAAC;AAED;;;GAGG;AACI,KAAK,UAAU,iBAAiB,CACrC,UAAgD,EAChD,OAAe,EACf,GAAW;IAEX,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC,UAAU,CAAC,CAAA;IACnD,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;QACpE,OAAO,KAAK,CAAA;IACd,CAAC;IACD,OAAO,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAA;IACpC,MAAM,iBAAiB,CAAC,UAAU,EAAE,OAAO,CAAC,CAAA;IAC5C,OAAO,IAAI,CAAA;AACb,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { Router } from '@well-known-components/http-server';
2
+ import { PreviewComponents } from '../types';
3
+ import { CliComponents } from '../../../components';
4
+ import { Workspace } from '../../../logic/workspace-validations';
5
+ /**
6
+ * Sets up storage-related endpoints for environment variables, scene storage, and player storage.
7
+ */
8
+ export declare function setupStorageEndpoints(components: CliComponents, router: Router<PreviewComponents>, workspace: Workspace): void;
@@ -0,0 +1,156 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.setupStorageEndpoints = setupStorageEndpoints;
4
+ const runtime_env_1 = require("./runtime-env");
5
+ /**
6
+ * Sets up storage-related endpoints for environment variables, scene storage, and player storage.
7
+ */
8
+ function setupStorageEndpoints(components, router, workspace) {
9
+ const withKeyValidation = async (ctx, next) => {
10
+ if (!ctx.params.key) {
11
+ return { status: 400, body: { message: 'Key is required' } };
12
+ }
13
+ return next();
14
+ };
15
+ const withAddressValidation = async (ctx, next) => {
16
+ if (!ctx.params.address) {
17
+ return { status: 400, body: { message: 'Address is required' } };
18
+ }
19
+ return next();
20
+ };
21
+ // Environment variables endpoints (/env/:key)
22
+ router.get('/env/:key', withKeyValidation, async (ctx) => {
23
+ const { key } = ctx.params;
24
+ const envVars = await (0, runtime_env_1.getMergedEnv)(components, workspace.projects[0].workingDirectory);
25
+ const value = envVars.get(key);
26
+ if (value === undefined) {
27
+ return { status: 404, body: { message: `Environment variable '${key}' not found` } };
28
+ }
29
+ return { body: JSON.stringify({ value }) };
30
+ });
31
+ router.put('/env/:key', withKeyValidation, async (ctx) => {
32
+ const { key } = ctx.params;
33
+ try {
34
+ const bodyText = await ctx.request.text();
35
+ const { value } = JSON.parse(bodyText);
36
+ await (0, runtime_env_1.setEnvValue)(components, key, value);
37
+ return { status: 204 };
38
+ }
39
+ catch (error) {
40
+ components.logger.error(`Failed to set environment variable '${key}': ${error}`);
41
+ return { status: 500, body: { message: `Failed to set environment variable '${key}'` } };
42
+ }
43
+ });
44
+ router.delete('/env/:key', withKeyValidation, async (ctx) => {
45
+ const { key } = ctx.params;
46
+ try {
47
+ await (0, runtime_env_1.deleteEnvValue)(components, key);
48
+ return { status: 204 };
49
+ }
50
+ catch (error) {
51
+ components.logger.error(`Failed to delete environment variable '${key}': ${error}`);
52
+ return { status: 500, body: { message: `Failed to delete environment variable '${key}'` } };
53
+ }
54
+ });
55
+ // Scene Storage list endpoint (GET /values, optional ?prefix=&limit=&offset=)
56
+ router.get('/values', async (ctx) => {
57
+ const prefix = ctx.url.searchParams.get('prefix');
58
+ const limitParam = ctx.url.searchParams.get('limit');
59
+ const offsetParam = ctx.url.searchParams.get('offset');
60
+ const storage = await (0, runtime_env_1.loadServerStorage)(components);
61
+ let entries = Object.entries(storage.world).map(([key, value]) => ({ key, value }));
62
+ if (prefix !== null && prefix !== '') {
63
+ entries = entries.filter((entry) => entry.key.startsWith(prefix));
64
+ }
65
+ const total = entries.length;
66
+ const offset = offsetParam !== null ? Math.max(0, parseInt(offsetParam, 10) || 0) : 0;
67
+ const limit = limitParam !== null ? Math.max(1, parseInt(limitParam, 10) || 0) : entries.length;
68
+ const paginatedEntries = limit > 0 ? entries.slice(offset, offset + limit) : entries.slice(offset);
69
+ return { body: JSON.stringify({ data: paginatedEntries, pagination: { offset, total } }) };
70
+ });
71
+ // Scene Storage endpoints (/values/:key)
72
+ router.get('/values/:key', withKeyValidation, async (ctx) => {
73
+ const { key } = ctx.params;
74
+ const value = await (0, runtime_env_1.getWorldValue)(components, key);
75
+ if (value === undefined) {
76
+ return { status: 404, body: { message: `Storage key '${key}' not found` } };
77
+ }
78
+ return { body: JSON.stringify({ value }) };
79
+ });
80
+ router.put('/values/:key', withKeyValidation, async (ctx) => {
81
+ const { key } = ctx.params;
82
+ try {
83
+ const bodyText = await ctx.request.text();
84
+ const { value } = JSON.parse(bodyText);
85
+ await (0, runtime_env_1.setWorldValue)(components, key, value);
86
+ return { body: JSON.stringify({ value }) };
87
+ }
88
+ catch (error) {
89
+ components.logger.error(`Failed to set storage value '${key}': ${error}`);
90
+ return { status: 500, body: { message: `Failed to set storage value '${key}'` } };
91
+ }
92
+ });
93
+ router.delete('/values/:key', withKeyValidation, async (ctx) => {
94
+ const { key } = ctx.params;
95
+ try {
96
+ await (0, runtime_env_1.deleteWorldValue)(components, key);
97
+ return { status: 204 };
98
+ }
99
+ catch (error) {
100
+ components.logger.error(`Failed to delete storage value '${key}': ${error}`);
101
+ return { status: 500, body: { message: `Failed to delete storage value '${key}'` } };
102
+ }
103
+ });
104
+ // Player Storage list endpoint (GET /players/:address/values, optional ?prefix=&limit=&offset=)
105
+ router.get('/players/:address/values', withAddressValidation, async (ctx) => {
106
+ const { address } = ctx.params;
107
+ const prefix = ctx.url.searchParams.get('prefix');
108
+ const limitParam = ctx.url.searchParams.get('limit');
109
+ const offsetParam = ctx.url.searchParams.get('offset');
110
+ const storage = await (0, runtime_env_1.loadServerStorage)(components);
111
+ const playerData = storage.players[address] ?? {};
112
+ let entries = Object.entries(playerData).map(([key, value]) => ({ key, value }));
113
+ if (prefix !== null && prefix !== '') {
114
+ entries = entries.filter((entry) => entry.key.startsWith(prefix));
115
+ }
116
+ const total = entries.length;
117
+ const offset = offsetParam !== null ? Math.max(0, parseInt(offsetParam, 10) || 0) : 0;
118
+ const limit = limitParam !== null ? Math.max(1, parseInt(limitParam, 10) || 0) : entries.length;
119
+ const paginatedEntries = limit > 0 ? entries.slice(offset, offset + limit) : entries.slice(offset);
120
+ return { body: JSON.stringify({ data: paginatedEntries, pagination: { offset, total } }) };
121
+ });
122
+ // Player Storage endpoints (/players/:address/values/:key)
123
+ router.get('/players/:address/values/:key', withAddressValidation, withKeyValidation, async (ctx) => {
124
+ const { address, key } = ctx.params;
125
+ const value = await (0, runtime_env_1.getPlayerValue)(components, address, key);
126
+ if (value === undefined) {
127
+ return { status: 404, body: { message: `Player storage key '${key}' not found for '${address}'` } };
128
+ }
129
+ return { body: JSON.stringify({ value }) };
130
+ });
131
+ router.put('/players/:address/values/:key', withAddressValidation, withKeyValidation, async (ctx) => {
132
+ const { address, key } = ctx.params;
133
+ try {
134
+ const bodyText = await ctx.request.text();
135
+ const { value } = JSON.parse(bodyText);
136
+ await (0, runtime_env_1.setPlayerValue)(components, address, key, value);
137
+ return { body: JSON.stringify({ value }) };
138
+ }
139
+ catch (error) {
140
+ components.logger.error(`Failed to set player storage value '${key}' for '${address}': ${error}`);
141
+ return { status: 500, body: { message: `Failed to set player storage value '${key}' for '${address}'` } };
142
+ }
143
+ });
144
+ router.delete('/players/:address/values/:key', withAddressValidation, withKeyValidation, async (ctx) => {
145
+ const { address, key } = ctx.params;
146
+ try {
147
+ await (0, runtime_env_1.deletePlayerValue)(components, address, key);
148
+ return { status: 204 };
149
+ }
150
+ catch (error) {
151
+ components.logger.error(`Failed to delete player storage value '${key}' for '${address}': ${error}`);
152
+ return { status: 500, body: { message: `Failed to delete player storage value '${key}' for '${address}'` } };
153
+ }
154
+ });
155
+ }
156
+ //# sourceMappingURL=storage-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage-service.js","sourceRoot":"","sources":["../../../../src/commands/start/server/storage-service.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,7 @@ import { RoomComponent } from '@dcl/mini-comms/dist/adapters/rooms';
4
4
  import { WebSocketComponent } from './server/ws';
5
5
  import { CliComponents } from '../../components';
6
6
  import { ISignalerComponent } from '../../components/exit-signal';
7
+ import { ChildProcess } from 'child_process';
7
8
  export type PreviewComponents = CliComponents & {
8
9
  logs: ILoggerComponent;
9
10
  server: IHttpServerComponent<PreviewComponents>;
@@ -13,4 +14,6 @@ export type PreviewComponents = CliComponents & {
13
14
  rooms: RoomComponent;
14
15
  ws: WebSocketComponent;
15
16
  signaler: ISignalerComponent;
17
+ /** Authoritative Server process (@dcl/hammurabi-server) */
18
+ hammurabiServer?: ChildProcess;
16
19
  };
@@ -6,3 +6,37 @@ export declare function getLanIp(): string | undefined;
6
6
  * Get the full LAN URL with protocol for external device access
7
7
  */
8
8
  export declare function getLanUrl(port: number | string): string | undefined;
9
+ /**
10
+ * Detects if the code is running in an Electron environment
11
+ */
12
+ export declare function isElectronEnvironment(): boolean;
13
+ /**
14
+ * Gets the spawn environment, adding ELECTRON_RUN_AS_NODE if running in Electron
15
+ */
16
+ export declare function getSpawnEnv(): {
17
+ [key: string]: string;
18
+ };
19
+ /**
20
+ * Gets the npm binary name (npm or npm.cmd on Windows)
21
+ */
22
+ export declare function getNpmBin(): string;
23
+ /**
24
+ * Gets the npx binary name (npx or npx.cmd on Windows)
25
+ */
26
+ export declare function getNpxBin(): string;
27
+ /**
28
+ * Gets the npm-cli.js path in Electron environment, or null if not found
29
+ * Should only be called when isElectronEnvironment() returns true
30
+ */
31
+ export declare function getElectronNpm(): string | null;
32
+ /**
33
+ * Attempts to find npx-cli.js on disk. Works in both regular Node.js and Electron.
34
+ *
35
+ * Tries three strategies:
36
+ * 1. Derive from process.execPath (standard Node.js installs, nvm, etc.)
37
+ * 2. Look alongside the npm binary found on PATH
38
+ * 3. Look inside Electron's app.asar.unpacked bundled npm (e.g. Creator Hub)
39
+ *
40
+ * Returns the absolute path to npx-cli.js, or null if not found.
41
+ */
42
+ export declare function findNpxCliJs(): string | null;
@@ -32,10 +32,24 @@ var __importStar = (this && this.__importStar) || (function () {
32
32
  return result;
33
33
  };
34
34
  })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
35
38
  Object.defineProperty(exports, "__esModule", { value: true });
36
39
  exports.getLanIp = getLanIp;
37
40
  exports.getLanUrl = getLanUrl;
41
+ exports.isElectronEnvironment = isElectronEnvironment;
42
+ exports.getSpawnEnv = getSpawnEnv;
43
+ exports.getNpmBin = getNpmBin;
44
+ exports.getNpxBin = getNpxBin;
45
+ exports.getElectronNpm = getElectronNpm;
46
+ exports.findNpxCliJs = findNpxCliJs;
38
47
  const os = __importStar(require("os"));
48
+ const fs_1 = __importDefault(require("fs"));
49
+ const path_1 = __importDefault(require("path"));
50
+ // Platform-aware binary names
51
+ const npmBin = /^win/.test(process.platform) ? 'npm.cmd' : 'npm';
52
+ const npxBin = /^win/.test(process.platform) ? 'npx.cmd' : 'npx';
39
53
  /**
40
54
  * Get the LAN IP address for external device access (e.g., mobile preview)
41
55
  */
@@ -54,4 +68,94 @@ function getLanUrl(port) {
54
68
  return undefined;
55
69
  return `http://${ip}:${port}`;
56
70
  }
71
+ /**
72
+ * Detects if the code is running in an Electron environment
73
+ */
74
+ function isElectronEnvironment() {
75
+ return typeof process.versions !== 'undefined' && 'electron' in process.versions;
76
+ }
77
+ /**
78
+ * Gets the spawn environment, adding ELECTRON_RUN_AS_NODE if running in Electron
79
+ */
80
+ function getSpawnEnv() {
81
+ if (isElectronEnvironment()) {
82
+ return {
83
+ ...process.env,
84
+ ELECTRON_RUN_AS_NODE: '1'
85
+ };
86
+ }
87
+ return process.env;
88
+ }
89
+ /**
90
+ * Gets the npm binary name (npm or npm.cmd on Windows)
91
+ */
92
+ function getNpmBin() {
93
+ return npmBin;
94
+ }
95
+ /**
96
+ * Gets the npx binary name (npx or npx.cmd on Windows)
97
+ */
98
+ function getNpxBin() {
99
+ return npxBin;
100
+ }
101
+ /**
102
+ * Gets the npm-cli.js path in Electron environment, or null if not found
103
+ * Should only be called when isElectronEnvironment() returns true
104
+ */
105
+ function getElectronNpm() {
106
+ const npmPath = process.env.PATH?.split(path_1.default.delimiter)
107
+ .map((dir) => path_1.default.join(dir, npmBin))
108
+ .find((npm) => fs_1.default.existsSync(npm)) || npmBin;
109
+ if (fs_1.default.existsSync(npmPath)) {
110
+ const npmCliJs = path_1.default.join(path_1.default.dirname(npmPath), 'npm-cli.js');
111
+ if (fs_1.default.existsSync(npmCliJs)) {
112
+ return npmCliJs;
113
+ }
114
+ }
115
+ return null;
116
+ }
117
+ /**
118
+ * Attempts to find npx-cli.js on disk. Works in both regular Node.js and Electron.
119
+ *
120
+ * Tries three strategies:
121
+ * 1. Derive from process.execPath (standard Node.js installs, nvm, etc.)
122
+ * 2. Look alongside the npm binary found on PATH
123
+ * 3. Look inside Electron's app.asar.unpacked bundled npm (e.g. Creator Hub)
124
+ *
125
+ * Returns the absolute path to npx-cli.js, or null if not found.
126
+ */
127
+ function findNpxCliJs() {
128
+ const execDir = path_1.default.dirname(process.execPath);
129
+ // Strategy 1: Derive from process.execPath
130
+ // Unix: {prefix}/bin/node -> {prefix}/lib/node_modules/npm/bin/npx-cli.js
131
+ // Windows: {prefix}/node.exe -> {prefix}/node_modules/npm/bin/npx-cli.js
132
+ const execPathCandidates = [
133
+ path_1.default.join(execDir, '..', 'lib', 'node_modules', 'npm', 'bin', 'npx-cli.js'),
134
+ path_1.default.join(execDir, 'node_modules', 'npm', 'bin', 'npx-cli.js')
135
+ ];
136
+ for (const candidate of execPathCandidates) {
137
+ if (fs_1.default.existsSync(candidate)) {
138
+ return candidate;
139
+ }
140
+ }
141
+ // Strategy 2: Find npx-cli.js next to npm on PATH
142
+ const npmPath = process.env.PATH?.split(path_1.default.delimiter)
143
+ .map((dir) => path_1.default.join(dir, npmBin))
144
+ .find((npm) => fs_1.default.existsSync(npm)) || npmBin;
145
+ if (fs_1.default.existsSync(npmPath)) {
146
+ const npxCliJs = path_1.default.join(path_1.default.dirname(npmPath), 'npx-cli.js');
147
+ if (fs_1.default.existsSync(npxCliJs)) {
148
+ return npxCliJs;
149
+ }
150
+ }
151
+ // Strategy 3: Look in Electron's app.asar.unpacked bundled npm
152
+ const resourcesPath = process.resourcesPath;
153
+ if (resourcesPath) {
154
+ const npxCliJs = path_1.default.join(resourcesPath, 'app.asar.unpacked', 'node_modules', 'npm', 'bin', 'npx-cli.js');
155
+ if (fs_1.default.existsSync(npxCliJs)) {
156
+ return npxCliJs;
157
+ }
158
+ }
159
+ return null;
160
+ }
57
161
  //# sourceMappingURL=utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/commands/start/utils.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAKA,4BAKC;AAKD,8BAIC;AAnBD,uCAAwB;AAExB;;GAEG;AACH,SAAgB,QAAQ;IACtB,MAAM,iBAAiB,GAAG,EAAE,CAAC,iBAAiB,EAAE,CAAA;IAChD,OAAO,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC;SACpC,IAAI,EAAE;SACN,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,OAAO,KAAK,WAAW,CAAC,EAAE,OAAO,CAAA;AACnH,CAAC;AAED;;GAEG;AACH,SAAgB,SAAS,CAAC,IAAqB;IAC7C,MAAM,EAAE,GAAG,QAAQ,EAAE,CAAA;IACrB,IAAI,CAAC,EAAE;QAAE,OAAO,SAAS,CAAA;IACzB,OAAO,UAAU,EAAE,IAAI,IAAI,EAAE,CAAA;AAC/B,CAAC"}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/commands/start/utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { Options } from './types';
2
+ /**
3
+ * Handles environment variable operations in the server-side storage service (set, delete, clear)
4
+ */
5
+ export declare const handleEnv: (action: string, key: string | undefined, options: Options) => Promise<void>;