@guanjinke/artifact-client 1.5.1 → 1.6.1

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 (99) hide show
  1. package/README.md +32 -3
  2. package/dist/cli/setup.d.ts.map +1 -1
  3. package/dist/cli/setup.js +6 -5
  4. package/dist/cli/setup.js.map +1 -1
  5. package/dist/cli/stored-client.d.ts +24 -0
  6. package/dist/cli/stored-client.d.ts.map +1 -0
  7. package/dist/cli/stored-client.js +59 -0
  8. package/dist/cli/stored-client.js.map +1 -0
  9. package/dist/cli/web.d.ts +23 -0
  10. package/dist/cli/web.d.ts.map +1 -0
  11. package/dist/cli/web.js +99 -0
  12. package/dist/cli/web.js.map +1 -0
  13. package/dist/environment/builder.d.ts.map +1 -1
  14. package/dist/environment/builder.js +26 -13
  15. package/dist/environment/builder.js.map +1 -1
  16. package/dist/environment/catalog.d.ts.map +1 -1
  17. package/dist/environment/catalog.js +18 -0
  18. package/dist/environment/catalog.js.map +1 -1
  19. package/dist/environment/config.d.ts +1 -1
  20. package/dist/environment/config.d.ts.map +1 -1
  21. package/dist/environment/config.js +7 -5
  22. package/dist/environment/config.js.map +1 -1
  23. package/dist/environment/manager.d.ts +9 -0
  24. package/dist/environment/manager.d.ts.map +1 -1
  25. package/dist/environment/manager.js +34 -6
  26. package/dist/environment/manager.js.map +1 -1
  27. package/dist/environment/plan.d.ts +37 -1
  28. package/dist/environment/plan.d.ts.map +1 -1
  29. package/dist/environment/plan.js +71 -16
  30. package/dist/environment/plan.js.map +1 -1
  31. package/dist/environment/posix-process.d.ts +71 -0
  32. package/dist/environment/posix-process.d.ts.map +1 -0
  33. package/dist/environment/posix-process.js +393 -0
  34. package/dist/environment/posix-process.js.map +1 -0
  35. package/dist/environment/process.d.ts +3 -1
  36. package/dist/environment/process.d.ts.map +1 -1
  37. package/dist/environment/process.js +5 -2
  38. package/dist/environment/process.js.map +1 -1
  39. package/dist/environment/registry.d.ts.map +1 -1
  40. package/dist/environment/registry.js +2 -1
  41. package/dist/environment/registry.js.map +1 -1
  42. package/dist/environment/root.d.ts +24 -6
  43. package/dist/environment/root.d.ts.map +1 -1
  44. package/dist/environment/root.js +78 -24
  45. package/dist/environment/root.js.map +1 -1
  46. package/dist/environment/types.d.ts +7 -2
  47. package/dist/environment/types.d.ts.map +1 -1
  48. package/dist/environment/update.d.ts +3 -1
  49. package/dist/environment/update.d.ts.map +1 -1
  50. package/dist/environment/update.js +48 -36
  51. package/dist/environment/update.js.map +1 -1
  52. package/dist/environment/validate.d.ts.map +1 -1
  53. package/dist/environment/validate.js +5 -1
  54. package/dist/environment/validate.js.map +1 -1
  55. package/dist/index.d.ts +9 -1
  56. package/dist/index.d.ts.map +1 -1
  57. package/dist/index.js +18 -1
  58. package/dist/index.js.map +1 -1
  59. package/dist/utils/atomic.d.ts +10 -0
  60. package/dist/utils/atomic.d.ts.map +1 -0
  61. package/dist/utils/atomic.js +65 -0
  62. package/dist/utils/atomic.js.map +1 -0
  63. package/dist/utils/local-path.d.ts +14 -0
  64. package/dist/utils/local-path.d.ts.map +1 -1
  65. package/dist/utils/local-path.js +25 -0
  66. package/dist/utils/local-path.js.map +1 -1
  67. package/dist/web/api.d.ts +28 -0
  68. package/dist/web/api.d.ts.map +1 -0
  69. package/dist/web/api.js +336 -0
  70. package/dist/web/api.js.map +1 -0
  71. package/dist/web/assets.d.ts +26 -0
  72. package/dist/web/assets.d.ts.map +1 -0
  73. package/dist/web/assets.js +87 -0
  74. package/dist/web/assets.js.map +1 -0
  75. package/dist/web/http.d.ts +41 -0
  76. package/dist/web/http.d.ts.map +1 -0
  77. package/dist/web/http.js +167 -0
  78. package/dist/web/http.js.map +1 -0
  79. package/dist/web/jobs.d.ts +69 -0
  80. package/dist/web/jobs.d.ts.map +1 -0
  81. package/dist/web/jobs.js +110 -0
  82. package/dist/web/jobs.js.map +1 -0
  83. package/dist/web/providers.d.ts +12 -0
  84. package/dist/web/providers.d.ts.map +1 -0
  85. package/dist/web/providers.js +108 -0
  86. package/dist/web/providers.js.map +1 -0
  87. package/dist/web/server.d.ts +43 -0
  88. package/dist/web/server.d.ts.map +1 -0
  89. package/dist/web/server.js +148 -0
  90. package/dist/web/server.js.map +1 -0
  91. package/dist/web/static/app.js +59 -0
  92. package/dist/web/static/favicon.svg +12 -0
  93. package/dist/web/static/index.html +15 -0
  94. package/dist/web/static/styles.css +1333 -0
  95. package/dist/web/types.d.ts +82 -0
  96. package/dist/web/types.d.ts.map +1 -0
  97. package/dist/web/types.js +3 -0
  98. package/dist/web/types.js.map +1 -0
  99. package/package.json +9 -2
@@ -0,0 +1,336 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createRequestHandler = createRequestHandler;
4
+ const crypto_1 = require("crypto");
5
+ const registry_1 = require("../environment/registry");
6
+ const plan_1 = require("../environment/plan");
7
+ const update_1 = require("../environment/update");
8
+ const assets_1 = require("./assets");
9
+ const http_1 = require("./http");
10
+ /** The page has no inline script or style, so the strictest policy still works. */
11
+ const htmlPolicy = "default-src 'none'; script-src 'self'; style-src 'self'; img-src 'self' data:; connect-src 'self'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'";
12
+ const failure = (error) => (error instanceof Error ? error.message : String(error));
13
+ /** Constant-time comparison over fixed-size digests, so unequal lengths are safe. */
14
+ function tokenMatches(presented, expected) {
15
+ if (presented === undefined)
16
+ return false;
17
+ const a = (0, crypto_1.createHash)('sha256').update(presented).digest();
18
+ const b = (0, crypto_1.createHash)('sha256').update(expected).digest();
19
+ return (0, crypto_1.timingSafeEqual)(a, b);
20
+ }
21
+ function presentedToken(request) {
22
+ const direct = (0, http_1.header)(request, 'x-afm-token');
23
+ if (direct)
24
+ return direct;
25
+ const authorization = (0, http_1.header)(request, 'authorization');
26
+ return authorization?.toLowerCase().startsWith('bearer ') ? authorization.slice(7).trim() : undefined;
27
+ }
28
+ function createRequestHandler(context) {
29
+ return (request, response) => {
30
+ handle(context, request, response).catch(error => {
31
+ if (response.headersSent || response.writableEnded) {
32
+ response.destroy();
33
+ return;
34
+ }
35
+ const status = error instanceof http_1.HttpError ? error.status : 500;
36
+ (0, http_1.sendJson)(response, status, { error: failure(error) }, error instanceof http_1.HttpError ? error.allow : undefined);
37
+ });
38
+ };
39
+ }
40
+ async function handle(context, request, response) {
41
+ // The Host check comes first: this server binds 127.0.0.1, and a DNS-rebound
42
+ // request reaches it while carrying the attacker's own host name.
43
+ if (!context.allowedHosts.has(((0, http_1.header)(request, 'host') ?? '').toLowerCase()))
44
+ throw new http_1.HttpError(403, 'Unexpected Host header: this server answers only 127.0.0.1/localhost on its own port.');
45
+ const url = new URL(request.url ?? '/', 'http://127.0.0.1');
46
+ const segments = url.pathname.split('/').filter(Boolean);
47
+ if (segments[0] === 'api')
48
+ return api(context, request, response, segments);
49
+ return staticAsset(context, request, response, url.pathname);
50
+ }
51
+ async function api(context, request, response, segments) {
52
+ // A cross-origin page cannot read a reply without CORS, and cannot send a
53
+ // custom header without a preflight we never answer; the Origin check is the
54
+ // belt to that suspender for anything a browser sends anyway.
55
+ const origin = (0, http_1.header)(request, 'origin');
56
+ if (origin !== undefined) {
57
+ const permitted = [...context.allowedHosts].some(host => origin === `http://${host}`);
58
+ if (!permitted)
59
+ throw new http_1.HttpError(403, 'Cross-origin requests are not accepted.');
60
+ }
61
+ if (!tokenMatches(presentedToken(request), context.token))
62
+ throw new http_1.HttpError(401, 'Missing or invalid token. Open the URL printed by `afm web` (it carries the token).');
63
+ const method = request.method ?? 'GET';
64
+ // /api/state | /api/jobs | /api/jobs/<id> | /api/environments | /api/environments/<name>/<action>
65
+ if (segments[1] === 'state' && segments.length === 2) {
66
+ if (method !== 'GET')
67
+ throw new http_1.HttpError(405, 'GET only.', 'GET');
68
+ return (0, http_1.sendJson)(response, 200, await state(context));
69
+ }
70
+ if (segments[1] === 'jobs') {
71
+ if (segments.length === 2) {
72
+ if (method !== 'GET')
73
+ throw new http_1.HttpError(405, 'GET only.', 'GET');
74
+ return (0, http_1.sendJson)(response, 200, { jobs: context.jobs.list() });
75
+ }
76
+ if (segments.length === 3 && method === 'GET') {
77
+ const job = context.jobs.get(decodeURIComponent(segments[2]));
78
+ if (!job)
79
+ throw new http_1.HttpError(404, 'Unknown job.');
80
+ return (0, http_1.sendJson)(response, 200, job);
81
+ }
82
+ throw new http_1.HttpError(404, 'Unknown endpoint.');
83
+ }
84
+ if (segments[1] === 'credentials') {
85
+ if (segments.length === 2 && method === 'POST')
86
+ return (0, http_1.sendJson)(response, 200, await saveCredentials(context, request));
87
+ if (segments.length === 3 && method === 'DELETE') {
88
+ const provider = decodeURIComponent(segments[2] ?? '');
89
+ if (provider !== 'az' && provider !== 'oss')
90
+ throw new http_1.HttpError(400, '"provider" must be az or oss.');
91
+ await context.providers.clear(provider);
92
+ return (0, http_1.sendJson)(response, 200, credentialsState(context));
93
+ }
94
+ if (segments.length === 2 || segments.length === 3)
95
+ throw new http_1.HttpError(405, method === 'POST' ? 'DELETE only.' : 'POST only.', 'POST, DELETE');
96
+ throw new http_1.HttpError(404, 'Unknown endpoint.');
97
+ }
98
+ if (segments[1] === 'environment-root' && segments.length === 2) {
99
+ if (method !== 'POST')
100
+ throw new http_1.HttpError(405, 'POST only.', 'POST');
101
+ return (0, http_1.sendJson)(response, 200, await setEnvironmentRoot(context, request));
102
+ }
103
+ if (segments[1] === 'environments') {
104
+ if (segments.length === 2) {
105
+ if (method !== 'POST')
106
+ throw new http_1.HttpError(405, 'POST only.', 'POST');
107
+ return (0, http_1.sendJson)(response, 202, await create(context, request));
108
+ }
109
+ const name = decodeURIComponent(segments[2] ?? '');
110
+ if (segments.length === 3) {
111
+ if (method !== 'DELETE')
112
+ throw new http_1.HttpError(405, 'DELETE only.', 'DELETE');
113
+ return (0, http_1.sendJson)(response, 202, await remove(context, request, name));
114
+ }
115
+ if (segments.length === 4 && segments[3] === 'modules') {
116
+ if (method !== 'POST')
117
+ throw new http_1.HttpError(405, 'POST only.', 'POST');
118
+ return (0, http_1.sendJson)(response, 202, await updateModules(context, request, name));
119
+ }
120
+ if (segments.length === 4 && segments[3] === 'lifecycle') {
121
+ if (method !== 'POST')
122
+ throw new http_1.HttpError(405, 'POST only.', 'POST');
123
+ return (0, http_1.sendJson)(response, 202, await lifecycle(context, request, name));
124
+ }
125
+ }
126
+ throw new http_1.HttpError(404, 'Unknown endpoint.');
127
+ }
128
+ async function staticAsset(context, request, response, pathname) {
129
+ const method = request.method ?? 'GET';
130
+ if (method !== 'GET' && method !== 'HEAD')
131
+ throw new http_1.HttpError(405, 'GET only.', 'GET, HEAD');
132
+ const route = pathname.endsWith('/') && pathname !== '/' ? pathname.slice(0, -1) : pathname;
133
+ if (!assets_1.assetRoutes[route])
134
+ throw new http_1.HttpError(404, 'Not found.');
135
+ const asset = await (0, assets_1.loadAsset)(context.assetsDirectory, route);
136
+ if (!asset)
137
+ throw new http_1.HttpError(404, 'Web interface asset is missing; rebuild with "npm run build".');
138
+ (0, http_1.sendText)(response, 200, asset.body.toString('utf8'), asset.contentType, asset.contentType.startsWith('text/html') ? { 'Content-Security-Policy': htmlPolicy } : undefined);
139
+ }
140
+ /** Projection of a registry row: the page never needs process command lines. */
141
+ function environmentRow(row) {
142
+ return {
143
+ id: row.id, name: row.name, root: row.root, port: row.port, edition: row.edition, major: row.major, profile: row.profile,
144
+ modules: row.modules, localModules: row.localModules ?? [], state: row.state, observedState: row.observedState,
145
+ ...(row.problem !== undefined ? { problem: row.problem } : {}),
146
+ createdAt: row.createdAt, ...(row.lastMode !== undefined ? { lastMode: row.lastMode } : {}),
147
+ ...(row.run ? { pid: row.run.pid, runMode: row.run.mode } : {}),
148
+ };
149
+ }
150
+ /** Non-secret credential facts the page may show after a save or a clear. */
151
+ function credentialsState(context) {
152
+ return { providers: context.providers.available(), providerInfo: context.providers.info() };
153
+ }
154
+ /**
155
+ * Store one provider's credentials.
156
+ *
157
+ * The reply carries availability and non-secret names only: a SAS URL or an OSS
158
+ * key is never sent back to the browser (or into a job log).
159
+ */
160
+ async function saveCredentials(context, request) {
161
+ const body = await (0, http_1.readJson)(request, context.maxBodyBytes);
162
+ const provider = (0, http_1.requireEnum)(body, 'provider', ['az', 'oss']);
163
+ const credentials = {
164
+ ...((0, http_1.optionalString)(body, 'sasUrl') !== undefined ? { sasUrl: (0, http_1.optionalString)(body, 'sasUrl') } : {}),
165
+ ...((0, http_1.optionalString)(body, 'keyId') !== undefined ? { keyId: (0, http_1.optionalString)(body, 'keyId') } : {}),
166
+ ...((0, http_1.optionalString)(body, 'key') !== undefined ? { key: (0, http_1.optionalString)(body, 'key') } : {}),
167
+ ...((0, http_1.optionalString)(body, 'bucket') !== undefined ? { bucket: (0, http_1.optionalString)(body, 'bucket') } : {}),
168
+ ...((0, http_1.optionalString)(body, 'region') !== undefined ? { region: (0, http_1.optionalString)(body, 'region') } : {}),
169
+ };
170
+ try {
171
+ await context.providers.save(provider, credentials);
172
+ }
173
+ catch (error) {
174
+ throw new http_1.HttpError(400, failure(error));
175
+ }
176
+ return credentialsState(context);
177
+ }
178
+ /** Remember the directory new environments are created in; `unset` forgets it. */
179
+ async function setEnvironmentRoot(context, request) {
180
+ const body = await (0, http_1.readJson)(request, context.maxBodyBytes);
181
+ const unset = (0, http_1.optionalBoolean)(body, 'unset') ?? false;
182
+ const requested = (0, http_1.optionalString)(body, 'root');
183
+ if (unset && requested !== undefined && requested.trim() !== '')
184
+ throw new http_1.HttpError(400, 'Pass either "root" or "unset", not both.');
185
+ try {
186
+ const root = await context.setEnvironmentRoot(unset || requested === undefined || requested.trim() === '' ? null : requested.trim());
187
+ return { environmentRoot: root, exists: root !== null };
188
+ }
189
+ catch (error) {
190
+ throw new http_1.HttpError(400, failure(error));
191
+ }
192
+ }
193
+ async function state(context) {
194
+ const info = context.state();
195
+ const rows = await context.manager.list();
196
+ return {
197
+ version: info.version,
198
+ platform: info.platform,
199
+ environmentRoot: info.environmentRoot,
200
+ providers: context.providers.available(),
201
+ providerInfo: context.providers.info(),
202
+ createOptions: { optionalModulesByEdition: plan_1.optionalModulesByEdition, editions: ['cn', 'en'], majors: ['9.1', 'dev'], defaultPort: plan_1.defaultPort, portRange: { first: plan_1.portRange.first, last: plan_1.portRange.last } },
203
+ updateOptions: { modules: [...update_1.updatableModules] },
204
+ environments: rows.map(environmentRow),
205
+ jobs: context.jobs.list().slice(0, 12),
206
+ };
207
+ }
208
+ async function create(context, request) {
209
+ const body = await (0, http_1.readJson)(request, context.maxBodyBytes);
210
+ const name = (0, http_1.requireString)(body, 'name');
211
+ try {
212
+ (0, registry_1.validateName)(name);
213
+ }
214
+ catch (error) {
215
+ throw new http_1.HttpError(400, failure(error));
216
+ }
217
+ const provider = (0, http_1.requireEnum)(body, 'provider', ['az', 'oss']);
218
+ if (!context.providers.available()[provider])
219
+ throw new http_1.HttpError(400, `Provider ${provider} has no stored credentials. Run "afm ${provider} login" first.`);
220
+ const major = (0, http_1.requireString)(body, 'major');
221
+ const modules = body.modules === undefined ? [] : (0, http_1.requireStringList)(body, 'modules');
222
+ const edition = (0, http_1.optionalEnum)(body, 'edition', ['cn', 'en']) ?? 'cn';
223
+ const port = (0, http_1.requireOptionalInteger)(body, 'port', 1, 65535);
224
+ const dryRun = (0, http_1.optionalBoolean)(body, 'dryRun') ?? false;
225
+ const requestedRoot = (0, http_1.optionalString)(body, 'root')?.trim() || undefined;
226
+ // Fail a duplicate name before a job is queued; the manager re-checks inside
227
+ // the registry lock, which is the authoritative reservation.
228
+ if ((await context.registry.read()).some(entry => entry.name.toLowerCase() === name.toLowerCase()))
229
+ throw new http_1.HttpError(409, `Environment name already registered: ${name}.`);
230
+ const root = await context.resolveRoot(name, requestedRoot, dryRun);
231
+ const options = { root, major, modules, edition, profile: 'embedded', ...(port !== undefined ? { port } : {}), dryRun };
232
+ // `create-env` validates the options and target directory before it builds a
233
+ // plan; doing the same here turns a bad major or module into an immediate 400
234
+ // instead of a failed job.
235
+ try {
236
+ await (0, plan_1.validateEnvironmentOptions)(options);
237
+ }
238
+ catch (error) {
239
+ throw new http_1.HttpError(400, failure(error));
240
+ }
241
+ return context.jobs.run({ kind: 'create', target: name, provider, dryRun }, progress => context.manager.create(name, options, () => context.providers.client(provider), progress));
242
+ }
243
+ async function requireEnvironment(context, name) {
244
+ try {
245
+ (0, registry_1.validateName)(name);
246
+ }
247
+ catch (error) {
248
+ throw new http_1.HttpError(400, failure(error));
249
+ }
250
+ try {
251
+ return await context.registry.get(name);
252
+ }
253
+ catch (error) {
254
+ throw new http_1.HttpError(404, failure(error));
255
+ }
256
+ }
257
+ async function remove(context, request, name) {
258
+ const entry = await requireEnvironment(context, name);
259
+ const body = await (0, http_1.readJson)(request, context.maxBodyBytes);
260
+ const confirmation = (0, http_1.optionalString)(body, 'confirm')?.trim() ?? '';
261
+ if (confirmation.toLowerCase() !== entry.name.toLowerCase())
262
+ throw new http_1.HttpError(400, `Deletion requires "confirm": "${entry.name}" — the environment name typed exactly.`);
263
+ const target = entry.name;
264
+ return context.jobs.run({ kind: 'delete', target }, progress => {
265
+ progress(`Stopping and deleting ${target} at ${entry.root}`);
266
+ return context.manager.delete(target, async () => true);
267
+ });
268
+ }
269
+ async function lifecycle(context, request, name) {
270
+ const entry = await requireEnvironment(context, name);
271
+ const body = await (0, http_1.readJson)(request, context.maxBodyBytes);
272
+ const action = (0, http_1.requireEnum)(body, 'action', ['start', 'stop', 'restart']);
273
+ const target = entry.name;
274
+ return context.jobs.run({ kind: 'lifecycle', target }, async (progress) => {
275
+ // Background only: a foreground monitor inherits this server's console and
276
+ // would keep the job open until the web server itself exits.
277
+ if (action === 'start') {
278
+ progress(`Starting ${target} in background mode`);
279
+ await context.manager.start(target, 'background');
280
+ }
281
+ else if (action === 'restart') {
282
+ progress(`Restarting ${target} in background mode`);
283
+ await context.manager.restart(target, 'background');
284
+ }
285
+ else {
286
+ progress(`Stopping ${target}`);
287
+ await context.manager.stop(target);
288
+ }
289
+ const after = (await context.registry.read()).find(entry => entry.name.toLowerCase() === target.toLowerCase());
290
+ progress(`${target}: ${action} complete; registry state ${after?.state ?? 'unknown'}. Output goes to <root>/logs/server.*.log; HTTP readiness is not checked.`);
291
+ return { name: target, action, ...(action === 'stop' ? {} : { mode: 'background' }) };
292
+ });
293
+ }
294
+ async function updateModules(context, request, name) {
295
+ const entry = await requireEnvironment(context, name);
296
+ const body = await (0, http_1.readJson)(request, context.maxBodyBytes);
297
+ const specs = (0, http_1.requireRawStringList)(body, 'specs');
298
+ let parsed;
299
+ try {
300
+ parsed = (0, update_1.parseModuleSpecs)(specs);
301
+ }
302
+ catch (error) {
303
+ throw new http_1.HttpError(400, failure(error));
304
+ }
305
+ if (!parsed.length)
306
+ throw new http_1.HttpError(400, '"specs" must contain at least one module spec.');
307
+ const dryRun = (0, http_1.optionalBoolean)(body, 'dryRun') ?? false;
308
+ const requestedProvider = (0, http_1.optionalString)(body, 'provider');
309
+ if (requestedProvider !== undefined && requestedProvider !== 'az' && requestedProvider !== 'oss')
310
+ throw new http_1.HttpError(400, '"provider" must be az or oss.');
311
+ // Local-only updates never construct a client, so no provider is needed then.
312
+ const needsRemote = parsed.some(spec => spec.localPath === undefined);
313
+ let provider;
314
+ if (needsRemote) {
315
+ const available = context.providers.available();
316
+ const configured = ['az', 'oss'].filter(candidate => available[candidate]);
317
+ if (requestedProvider !== undefined)
318
+ provider = requestedProvider;
319
+ else if (configured.length === 1)
320
+ provider = configured[0];
321
+ else if (!configured.length)
322
+ throw new http_1.HttpError(400, 'No cloud provider is configured: run "afm az login" or "afm oss login" first.');
323
+ else
324
+ throw new http_1.HttpError(400, 'Both az and oss are configured: pass "provider" to say which one resolves these artifacts.');
325
+ if (!available[provider])
326
+ throw new http_1.HttpError(400, `Provider ${provider} has no stored credentials. Run "afm ${provider} login" first.`);
327
+ }
328
+ const target = entry.name;
329
+ const clientFactory = () => {
330
+ if (provider === undefined)
331
+ throw new Error('A cloud provider is required for remote module specs.');
332
+ return context.providers.client(provider);
333
+ };
334
+ return context.jobs.run({ kind: 'update', target, ...(provider !== undefined ? { provider } : {}), dryRun }, progress => context.updater.update(target, specs, clientFactory, { dryRun, onProgress: progress }));
335
+ }
336
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/web/api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * The web bundle is a fixed set of files built from `web/` by
3
+ * `scripts/build-web.js` into `dist/web/static`. Only these exact routes are
4
+ * served, so no request can ever reach a caller-chosen path.
5
+ */
6
+ export type AssetRoute = {
7
+ file: string;
8
+ contentType: string;
9
+ };
10
+ export declare const assetRoutes: Record<string, AssetRoute>;
11
+ /** Every file a complete `dist/web/static` build contains. */
12
+ export declare const assetFiles: readonly ["index.html", "app.js", "styles.css", "favicon.svg"];
13
+ /** `dist/web/static` next to the compiled server. */
14
+ export declare function defaultAssetDirectory(): string;
15
+ export declare function loadAsset(directory: string, route: string): Promise<{
16
+ body: Buffer;
17
+ contentType: string;
18
+ } | undefined>;
19
+ /**
20
+ * Fail fast with an actionable message when the frontend was never built.
21
+ *
22
+ * `tsc` alone does not produce the bundle, so a server started from a
23
+ * partially built tree would otherwise serve 404s for its own page.
24
+ */
25
+ export declare function verifyAssets(directory: string): Promise<void>;
26
+ //# sourceMappingURL=assets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assets.d.ts","sourceRoot":"","sources":["../../src/web/assets.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,MAAM,MAAM,UAAU,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC;AAE/D,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAOlD,CAAC;AAEF,8DAA8D;AAC9D,eAAO,MAAM,UAAU,gEAAiE,CAAC;AAEzF,qDAAqD;AACrD,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C;AAED,wBAAsB,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAAC,CAS5H;AAED;;;;;GAKG;AACH,wBAAsB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CASnE"}
@@ -0,0 +1,87 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.assetFiles = exports.assetRoutes = void 0;
37
+ exports.defaultAssetDirectory = defaultAssetDirectory;
38
+ exports.loadAsset = loadAsset;
39
+ exports.verifyAssets = verifyAssets;
40
+ const fs = __importStar(require("fs/promises"));
41
+ const path = __importStar(require("path"));
42
+ exports.assetRoutes = {
43
+ '/': { file: 'index.html', contentType: 'text/html; charset=utf-8' },
44
+ '/index.html': { file: 'index.html', contentType: 'text/html; charset=utf-8' },
45
+ '/app.js': { file: 'app.js', contentType: 'text/javascript; charset=utf-8' },
46
+ '/styles.css': { file: 'styles.css', contentType: 'text/css; charset=utf-8' },
47
+ // The page declares this icon, so it must be served or every load logs a 404.
48
+ '/favicon.svg': { file: 'favicon.svg', contentType: 'image/svg+xml' },
49
+ };
50
+ /** Every file a complete `dist/web/static` build contains. */
51
+ exports.assetFiles = ['index.html', 'app.js', 'styles.css', 'favicon.svg'];
52
+ /** `dist/web/static` next to the compiled server. */
53
+ function defaultAssetDirectory() {
54
+ return path.join(__dirname, 'static');
55
+ }
56
+ async function loadAsset(directory, route) {
57
+ const asset = exports.assetRoutes[route];
58
+ if (!asset)
59
+ return undefined;
60
+ try {
61
+ return { body: await fs.readFile(path.join(directory, asset.file)), contentType: asset.contentType };
62
+ }
63
+ catch (error) {
64
+ if (error.code === 'ENOENT')
65
+ return undefined;
66
+ throw error;
67
+ }
68
+ }
69
+ /**
70
+ * Fail fast with an actionable message when the frontend was never built.
71
+ *
72
+ * `tsc` alone does not produce the bundle, so a server started from a
73
+ * partially built tree would otherwise serve 404s for its own page.
74
+ */
75
+ async function verifyAssets(directory) {
76
+ for (const file of exports.assetFiles) {
77
+ try {
78
+ const stat = await fs.stat(path.join(directory, file));
79
+ if (!stat.isFile())
80
+ throw new Error('not a file');
81
+ }
82
+ catch {
83
+ throw new Error(`Web interface asset missing: ${path.join(directory, file)}. Run "npm run build" to build the web bundle.`);
84
+ }
85
+ }
86
+ }
87
+ //# sourceMappingURL=assets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assets.js","sourceRoot":"","sources":["../../src/web/assets.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuBA,sDAEC;AAED,8BASC;AAQD,oCASC;AArDD,gDAAkC;AAClC,2CAA6B;AAShB,QAAA,WAAW,GAA+B;IACrD,GAAG,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,0BAA0B,EAAE;IACpE,aAAa,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,0BAA0B,EAAE;IAC9E,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,gCAAgC,EAAE;IAC5E,aAAa,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,yBAAyB,EAAE;IAC7E,8EAA8E;IAC9E,cAAc,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,WAAW,EAAE,eAAe,EAAE;CACtE,CAAC;AAEF,8DAA8D;AACjD,QAAA,UAAU,GAAG,CAAC,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE,aAAa,CAAU,CAAC;AAEzF,qDAAqD;AACrD,SAAgB,qBAAqB;IACnC,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;AACxC,CAAC;AAEM,KAAK,UAAU,SAAS,CAAC,SAAiB,EAAE,KAAa;IAC9D,MAAM,KAAK,GAAG,mBAAW,CAAC,KAAK,CAAC,CAAC;IACjC,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,IAAI,CAAC;QACH,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC;IACvG,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,SAAS,CAAC;QACzE,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACI,KAAK,UAAU,YAAY,CAAC,SAAiB;IAClD,KAAK,MAAM,IAAI,IAAI,kBAAU,EAAE,CAAC;QAC9B,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC;YACvD,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;gBAAE,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC;QACpD,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,KAAK,CAAC,gCAAgC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,gDAAgD,CAAC,CAAC;QAC9H,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,41 @@
1
+ import { IncomingMessage, ServerResponse } from 'http';
2
+ /** A failure that should reach the caller as an HTTP status rather than a 500. */
3
+ export declare class HttpError extends Error {
4
+ readonly status: number;
5
+ readonly allow?: string | undefined;
6
+ constructor(status: number, message: string, allow?: string | undefined);
7
+ }
8
+ /** Response headers shared by every reply; no CORS header is ever sent. */
9
+ export declare function applySecurityHeaders(response: ServerResponse): void;
10
+ export declare function sendJson(response: ServerResponse, status: number, payload: unknown, allow?: string): void;
11
+ export declare function sendText(response: ServerResponse, status: number, text: string, contentType: string, extra?: Record<string, string>): void;
12
+ /** First value of a possibly repeated header, or undefined. */
13
+ export declare function header(request: IncomingMessage, name: string): string | undefined;
14
+ /**
15
+ * Read a JSON object body.
16
+ *
17
+ * Only `application/json` is accepted, so a browser form (which can be posted
18
+ * cross-origin without a preflight) can never reach a state-changing handler.
19
+ * An oversized body is drained rather than aborted, so the caller still
20
+ * receives the 413 instead of a reset connection.
21
+ */
22
+ export declare function readJson(request: IncomingMessage, limit: number): Promise<Record<string, unknown>>;
23
+ export declare function requireString(body: Record<string, unknown>, field: string): string;
24
+ export declare function optionalString(body: Record<string, unknown>, field: string): string | undefined;
25
+ export declare function requireEnum<T extends string>(body: Record<string, unknown>, field: string, allowed: readonly T[]): T;
26
+ export declare function optionalEnum<T extends string>(body: Record<string, unknown>, field: string, allowed: readonly T[]): T | undefined;
27
+ export declare function requireOptionalInteger(body: Record<string, unknown>, field: string, min: number, max: number): number | undefined;
28
+ export declare function optionalBoolean(body: Record<string, unknown>, field: string): boolean | undefined;
29
+ /** A `string[]` field that also accepts a single whitespace/comma separated string. */
30
+ export declare function requireStringList(body: Record<string, unknown>, field: string): string[];
31
+ /**
32
+ * A `string[]` field that is passed through unsplit.
33
+ *
34
+ * Module *specs* must reach `parseModuleSpecs` verbatim: a spec carrying a local
35
+ * source (`dashboard=D:\my build\out.dll`) is split on commas only there, so a
36
+ * Windows path may contain spaces.
37
+ */
38
+ export declare function requireRawStringList(body: Record<string, unknown>, field: string): string[];
39
+ /** Same separator handling as the CLI's `--modules` values for plain module names. */
40
+ export declare function splitList(value: string): string[];
41
+ //# sourceMappingURL=http.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/web/http.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,MAAM,CAAC;AAEvD,kFAAkF;AAClF,qBAAa,SAAU,SAAQ,KAAK;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM;IAAmB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM;gBAAxD,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAW,KAAK,CAAC,EAAE,MAAM,YAAA;CAC9E;AAED,2EAA2E;AAC3E,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,cAAc,GAAG,IAAI,CAInE;AAED,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CASzG;AAED,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAK1I;AAED,+DAA+D;AAC/D,wBAAgB,MAAM,CAAC,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAGjF;AAED;;;;;;;GAOG;AACH,wBAAsB,QAAQ,CAAC,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAkBxG;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAIlF;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAK/F;AAED,wBAAgB,WAAW,CAAC,CAAC,SAAS,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,GAAG,CAAC,CAIpH;AAED,wBAAgB,YAAY,CAAC,CAAC,SAAS,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,GAAG,CAAC,GAAG,SAAS,CAGjI;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAKjI;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAKjG;AAED,uFAAuF;AACvF,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAQxF;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAK3F;AAED,sFAAsF;AACtF,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAEjD"}