swarmbox 0.13.0 → 0.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +75 -0
- package/dist/fleet/browser.d.ts +12 -0
- package/dist/fleet/browser.d.ts.map +1 -1
- package/dist/fleet/browser.js +3 -0
- package/dist/fleet/browser.js.map +1 -1
- package/dist/fleet/sight.d.ts +11 -1
- package/dist/fleet/sight.d.ts.map +1 -1
- package/dist/fleet/sight.js +105 -6
- package/dist/fleet/sight.js.map +1 -1
- package/dist/harness.d.ts +26 -1
- package/dist/harness.d.ts.map +1 -1
- package/dist/harness.js +89 -10
- package/dist/harness.js.map +1 -1
- package/dist/mcp/authenticator.d.ts +17 -0
- package/dist/mcp/authenticator.d.ts.map +1 -0
- package/dist/mcp/authenticator.js +63 -0
- package/dist/mcp/authenticator.js.map +1 -0
- package/dist/mcp/inbox.d.ts +16 -0
- package/dist/mcp/inbox.d.ts.map +1 -0
- package/dist/mcp/inbox.js +55 -0
- package/dist/mcp/inbox.js.map +1 -0
- package/dist/mcp/server.d.ts +2 -0
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +141 -31
- package/dist/mcp/server.js.map +1 -1
- package/dist/product.d.ts +12 -0
- package/dist/product.d.ts.map +1 -1
- package/dist/runs/report.d.ts.map +1 -1
- package/dist/runs/report.js +1 -0
- package/dist/runs/report.js.map +1 -1
- package/dist/runs/run.d.ts +25 -0
- package/dist/runs/run.d.ts.map +1 -1
- package/dist/runs/run.js +118 -70
- package/dist/runs/run.js.map +1 -1
- package/dist/standins/builtin/s3/index.d.ts.map +1 -1
- package/dist/standins/builtin/s3/index.js +105 -13
- package/dist/standins/builtin/s3/index.js.map +1 -1
- package/dist/standins/manifest.d.ts +1 -1
- package/dist/time.d.ts +6 -0
- package/dist/time.d.ts.map +1 -1
- package/dist/time.js +18 -0
- package/dist/time.js.map +1 -1
- package/package.json +3 -2
package/dist/runs/run.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/runs/run.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/runs/run.ts"],"names":[],"mappings":"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"}
|
package/dist/runs/run.js
CHANGED
|
@@ -19,6 +19,8 @@ import { loadScenario } from "../scenarios/spec.js";
|
|
|
19
19
|
import { openBudget } from "./budget.js";
|
|
20
20
|
import { renderReport } from "./report.js";
|
|
21
21
|
const minutesSince = (iso) => (Date.now() - Date.parse(iso)) / 60_000;
|
|
22
|
+
/** Under the 60 s an MCP client waits for a tool's answer by default (claude -p's included). */
|
|
23
|
+
const START_WAIT_MS = 45_000;
|
|
22
24
|
export function createRuns(h, opts = {}) {
|
|
23
25
|
const env = opts.env ?? process.env;
|
|
24
26
|
const product = h.product;
|
|
@@ -26,6 +28,9 @@ export function createRuns(h, opts = {}) {
|
|
|
26
28
|
const sink = opts.findings === undefined ? product.findings : opts.findings;
|
|
27
29
|
const budget = openBudget(home, env);
|
|
28
30
|
const runs = new Map();
|
|
31
|
+
const starts = new Map();
|
|
32
|
+
const wait = Number(env.SWARMBOX_START_WAIT_MS);
|
|
33
|
+
const startWaitMs = Number.isFinite(wait) && wait > 0 ? wait : START_WAIT_MS;
|
|
29
34
|
const get = (id) => {
|
|
30
35
|
const r = runs.get(id);
|
|
31
36
|
if (!r)
|
|
@@ -43,84 +48,113 @@ export function createRuns(h, opts = {}) {
|
|
|
43
48
|
commit: r.commit,
|
|
44
49
|
findings: r.findings.length,
|
|
45
50
|
});
|
|
51
|
+
/** The world, its clock, the cast on their screens, and the run's record. */
|
|
52
|
+
const open = async (id, scenario, options) => {
|
|
53
|
+
const w = await h.createWorld({
|
|
54
|
+
...(scenario.world.tenants ? { tenants: scenario.world.tenants } : {}),
|
|
55
|
+
seed: scenario.world.seed,
|
|
56
|
+
...(scenario.world.keep ? { keep: scenario.world.keep } : {}),
|
|
57
|
+
...(options ? { options } : {}),
|
|
58
|
+
...(scenario.world.standins ? { standins: scenario.world.standins } : {}),
|
|
59
|
+
});
|
|
60
|
+
try {
|
|
61
|
+
const people = await h.people(w.id);
|
|
62
|
+
// The day starts where the scenario says, before anyone signs in, in the first tenant's zone.
|
|
63
|
+
if (scenario.world.startsAt) {
|
|
64
|
+
const tenant = scenario.cast[0]?.tenant ?? w.world.tenants[0];
|
|
65
|
+
const zone = people.find((p) => p.tenant === tenant)?.timeZone ?? 'UTC';
|
|
66
|
+
const now = new Date((await h.moveClock(w.id)).process.at);
|
|
67
|
+
const to = startInstant(scenario.world.startsAt, zone, now);
|
|
68
|
+
if (to.getTime() > now.getTime())
|
|
69
|
+
await h.moveClock(w.id, { to: to.toISOString() });
|
|
70
|
+
}
|
|
71
|
+
// The cast, by role: the first person holding it, the second for a second of the same role.
|
|
72
|
+
const used = new Set();
|
|
73
|
+
const cast = [];
|
|
74
|
+
for (const c of scenario.cast) {
|
|
75
|
+
const p = people.find((x) => x.roles.includes(c.role) && (!c.tenant || x.tenant === c.tenant) && !used.has(x.id));
|
|
76
|
+
if (!p) {
|
|
77
|
+
const roles = [...new Set(people.flatMap((x) => x.roles))].join(', ');
|
|
78
|
+
throw new HarnessError(`this world has no ${c.role} left for the cast (it has: ${roles || 'nobody'})`);
|
|
79
|
+
}
|
|
80
|
+
used.add(p.id);
|
|
81
|
+
// The app this person works in: the scenario's word, else the product's (a technician's tablet).
|
|
82
|
+
const app = c.app ?? (await product.appFor?.(p, w.world));
|
|
83
|
+
const s = await h.openScreen(w.id, p.id, undefined, app === undefined ? {} : { app });
|
|
84
|
+
// Every action, request and frame from here on, replayable with `npx playwright show-trace`.
|
|
85
|
+
await s.screen.context.tracing.start({ screenshots: true, snapshots: true });
|
|
86
|
+
cast.push({ role: c.role, ...(c.part ? { part: c.part } : {}), persona: p, screen: s.id });
|
|
87
|
+
}
|
|
88
|
+
const dir = join(home, 'runs', id);
|
|
89
|
+
mkdirSync(join(dir, 'findings'), { recursive: true });
|
|
90
|
+
mkdirSync(join(dir, 'traces'), { recursive: true });
|
|
91
|
+
const r = {
|
|
92
|
+
id,
|
|
93
|
+
product: product.title ?? product.name,
|
|
94
|
+
scenario,
|
|
95
|
+
worldId: w.id,
|
|
96
|
+
dir,
|
|
97
|
+
startedAt: new Date().toISOString(),
|
|
98
|
+
cast,
|
|
99
|
+
findings: [],
|
|
100
|
+
provenance: describeProvenance(w.world.provenance),
|
|
101
|
+
commit: w.world.provenance.commit,
|
|
102
|
+
};
|
|
103
|
+
runs.set(id, r);
|
|
104
|
+
save(r);
|
|
105
|
+
return r;
|
|
106
|
+
}
|
|
107
|
+
catch (e) {
|
|
108
|
+
await h.destroyWorld(w.id).catch(() => undefined);
|
|
109
|
+
throw e;
|
|
110
|
+
}
|
|
111
|
+
};
|
|
112
|
+
function begin(scenarioId) {
|
|
113
|
+
const scenario = loadScenario(scenarioId, scenarioDir);
|
|
114
|
+
const again = [...starts.values()].find((x) => x.scenario === scenario.id && !x.error);
|
|
115
|
+
if (again)
|
|
116
|
+
return again;
|
|
117
|
+
const refused = budget.refusal();
|
|
118
|
+
if (refused)
|
|
119
|
+
throw new HarnessError(`not starting ${scenarioId}: ${refused}`);
|
|
120
|
+
const options = scenario.world.options;
|
|
121
|
+
if (options && !product.worldOptions)
|
|
122
|
+
throw new HarnessError(`${scenarioId}: world.options given, and ${product.name} takes none`);
|
|
123
|
+
const checked = options ? z.strictObject(product.worldOptions).safeParse(options) : undefined;
|
|
124
|
+
if (checked && !checked.success)
|
|
125
|
+
throw new HarnessError(`${scenarioId}: world.options: ${z.prettifyError(checked.error)}`);
|
|
126
|
+
budget.started();
|
|
127
|
+
const stamp = new Date().toISOString().slice(0, 16).replace(/[-:]/g, '').replace('T', '-');
|
|
128
|
+
const id = `${stamp}-${scenario.id}-${randomBytes(2).toString('hex')}`;
|
|
129
|
+
const s = {
|
|
130
|
+
id,
|
|
131
|
+
scenario: scenario.id,
|
|
132
|
+
since: new Date().toISOString(),
|
|
133
|
+
ready: open(id, scenario, checked?.data),
|
|
134
|
+
};
|
|
135
|
+
s.ready.catch((e) => (s.error = e.message));
|
|
136
|
+
starts.set(id, s);
|
|
137
|
+
return s;
|
|
138
|
+
}
|
|
46
139
|
return {
|
|
47
140
|
budget,
|
|
48
141
|
scenarioDir,
|
|
49
142
|
get,
|
|
50
143
|
active: () => [...runs.values()].filter((r) => !r.endedAt),
|
|
144
|
+
starting: () => [...starts.values()],
|
|
145
|
+
taken: (id) => void starts.delete(id),
|
|
146
|
+
startWaitMs,
|
|
147
|
+
// A caller that waits for the run takes it.
|
|
51
148
|
async start(scenarioId) {
|
|
52
|
-
const
|
|
53
|
-
const refused = budget.refusal();
|
|
54
|
-
if (refused)
|
|
55
|
-
throw new HarnessError(`not starting ${scenarioId}: ${refused}`);
|
|
56
|
-
const options = scenario.world.options;
|
|
57
|
-
if (options && !product.worldOptions)
|
|
58
|
-
throw new HarnessError(`${scenarioId}: world.options given, and ${product.name} takes none`);
|
|
59
|
-
const checked = options ? z.strictObject(product.worldOptions).safeParse(options) : undefined;
|
|
60
|
-
if (checked && !checked.success)
|
|
61
|
-
throw new HarnessError(`${scenarioId}: world.options: ${z.prettifyError(checked.error)}`);
|
|
62
|
-
budget.started();
|
|
63
|
-
const w = await h.createWorld({
|
|
64
|
-
...(scenario.world.tenants ? { tenants: scenario.world.tenants } : {}),
|
|
65
|
-
seed: scenario.world.seed,
|
|
66
|
-
...(scenario.world.keep ? { keep: scenario.world.keep } : {}),
|
|
67
|
-
...(checked ? { options: checked.data } : {}),
|
|
68
|
-
...(scenario.world.standins ? { standins: scenario.world.standins } : {}),
|
|
69
|
-
});
|
|
149
|
+
const s = begin(scenarioId);
|
|
70
150
|
try {
|
|
71
|
-
|
|
72
|
-
// The day starts where the scenario says, before anyone signs in, in the first tenant's zone.
|
|
73
|
-
if (scenario.world.startsAt) {
|
|
74
|
-
const tenant = scenario.cast[0]?.tenant ?? w.world.tenants[0];
|
|
75
|
-
const zone = people.find((p) => p.tenant === tenant)?.timeZone ?? 'UTC';
|
|
76
|
-
const now = new Date((await h.moveClock(w.id)).process.at);
|
|
77
|
-
const to = startInstant(scenario.world.startsAt, zone, now);
|
|
78
|
-
if (to.getTime() > now.getTime())
|
|
79
|
-
await h.moveClock(w.id, { to: to.toISOString() });
|
|
80
|
-
}
|
|
81
|
-
// The cast, by role: the first person holding it, the second for a second of the same role.
|
|
82
|
-
const used = new Set();
|
|
83
|
-
const cast = [];
|
|
84
|
-
for (const c of scenario.cast) {
|
|
85
|
-
const p = people.find((x) => x.roles.includes(c.role) && (!c.tenant || x.tenant === c.tenant) && !used.has(x.id));
|
|
86
|
-
if (!p) {
|
|
87
|
-
const roles = [...new Set(people.flatMap((x) => x.roles))].join(', ');
|
|
88
|
-
throw new HarnessError(`this world has no ${c.role} left for the cast (it has: ${roles || 'nobody'})`);
|
|
89
|
-
}
|
|
90
|
-
used.add(p.id);
|
|
91
|
-
// The app this person works in: the scenario's word, else the product's (a technician's tablet).
|
|
92
|
-
const app = c.app ?? (await product.appFor?.(p, w.world));
|
|
93
|
-
const s = await h.openScreen(w.id, p.id, undefined, app === undefined ? {} : { app });
|
|
94
|
-
// Every action, request and frame from here on, replayable with `npx playwright show-trace`.
|
|
95
|
-
await s.screen.context.tracing.start({ screenshots: true, snapshots: true });
|
|
96
|
-
cast.push({ role: c.role, ...(c.part ? { part: c.part } : {}), persona: p, screen: s.id });
|
|
97
|
-
}
|
|
98
|
-
const stamp = new Date().toISOString().slice(0, 16).replace(/[-:]/g, '').replace('T', '-');
|
|
99
|
-
const id = `${stamp}-${scenario.id}-${randomBytes(2).toString('hex')}`;
|
|
100
|
-
const dir = join(home, 'runs', id);
|
|
101
|
-
mkdirSync(join(dir, 'findings'), { recursive: true });
|
|
102
|
-
mkdirSync(join(dir, 'traces'), { recursive: true });
|
|
103
|
-
const r = {
|
|
104
|
-
id,
|
|
105
|
-
product: product.title ?? product.name,
|
|
106
|
-
scenario,
|
|
107
|
-
worldId: w.id,
|
|
108
|
-
dir,
|
|
109
|
-
startedAt: new Date().toISOString(),
|
|
110
|
-
cast,
|
|
111
|
-
findings: [],
|
|
112
|
-
provenance: describeProvenance(w.world.provenance),
|
|
113
|
-
commit: w.world.provenance.commit,
|
|
114
|
-
};
|
|
115
|
-
runs.set(id, r);
|
|
116
|
-
save(r);
|
|
117
|
-
return r;
|
|
151
|
+
return await s.ready;
|
|
118
152
|
}
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
throw e;
|
|
153
|
+
finally {
|
|
154
|
+
starts.delete(s.id);
|
|
122
155
|
}
|
|
123
156
|
},
|
|
157
|
+
begin,
|
|
124
158
|
async join(screenId) {
|
|
125
159
|
const s = h.screen(screenId);
|
|
126
160
|
const r = [...runs.values()].find((x) => !x.endedAt && x.worldId === s.worldId);
|
|
@@ -174,6 +208,10 @@ export function createRuns(h, opts = {}) {
|
|
|
174
208
|
const r = get(runId);
|
|
175
209
|
if (r.endedAt)
|
|
176
210
|
throw new HarnessError(`run ${runId} has already ended`);
|
|
211
|
+
starts.delete(runId);
|
|
212
|
+
// Its world can have stopped first (stopped by hand, or it died): the run still ends, with what it has.
|
|
213
|
+
const alive = () => h.worlds().some((w) => w.id === r.worldId);
|
|
214
|
+
let gone = !alive();
|
|
177
215
|
r.traces = [];
|
|
178
216
|
// A screen closed during the run (a customer's link, done with) has no trace left to stop.
|
|
179
217
|
const open = (id) => h.screens().find((x) => x.id === id);
|
|
@@ -187,7 +225,17 @@ export function createRuns(h, opts = {}) {
|
|
|
187
225
|
.flatMap((c) => open(c.screen)?.signals ?? [])
|
|
188
226
|
.filter((s) => s.at >= r.startedAt)
|
|
189
227
|
.sort((a, b) => a.at.localeCompare(b.at));
|
|
190
|
-
|
|
228
|
+
const none = { settled: {}, results: [] };
|
|
229
|
+
r.checks = gone
|
|
230
|
+
? none
|
|
231
|
+
: await h.check(r.worldId).catch((e) => {
|
|
232
|
+
if (alive())
|
|
233
|
+
throw e;
|
|
234
|
+
gone = true;
|
|
235
|
+
return none;
|
|
236
|
+
});
|
|
237
|
+
if (gone)
|
|
238
|
+
r.worldGone = `world ${r.worldId} had already stopped, so no checks ran`;
|
|
191
239
|
r.endedAt = new Date().toISOString();
|
|
192
240
|
r.browserMinutes = Math.round(minutesSince(r.startedAt) * r.cast.length * 100) / 100;
|
|
193
241
|
if (summary)
|
|
@@ -209,7 +257,7 @@ export function createRuns(h, opts = {}) {
|
|
|
209
257
|
save(r);
|
|
210
258
|
const report = join(r.dir, 'report.html');
|
|
211
259
|
writeFileSync(report, renderReport(r));
|
|
212
|
-
if (!keepWorld)
|
|
260
|
+
if (!keepWorld && !gone)
|
|
213
261
|
await h.destroyWorld(r.worldId).catch(() => undefined);
|
|
214
262
|
return { ...r, report };
|
|
215
263
|
},
|
package/dist/runs/run.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/runs/run.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/runs/run.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/standins/builtin/s3/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/standins/builtin/s3/index.ts"],"names":[],"mappings":"AAkBA;;;GAGG;AACH,eAAO,MAAM,UAAU,QAAmB,CAAC"}
|
|
@@ -6,7 +6,8 @@
|
|
|
6
6
|
//
|
|
7
7
|
// An account's console settings, as the product gives them (account(tenant, settings)): region, the region its
|
|
8
8
|
// requests are signed for ("auto" by default, as R2 and Railway's buckets have it), and corsOrigins, a comma list of
|
|
9
|
-
// origins browsers may upload from to its buckets (by default any of the world's own hosts)
|
|
9
|
+
// origins browsers may upload from to its buckets (by default any of the world's own hosts), and buckets, a comma
|
|
10
|
+
// list of buckets made in the console, there before the product starts.
|
|
10
11
|
import { createHash, createHmac, randomBytes } from 'node:crypto';
|
|
11
12
|
import { mkdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs';
|
|
12
13
|
import { join } from 'node:path';
|
|
@@ -271,9 +272,21 @@ function bodyChecks(req, bytes, trailer) {
|
|
|
271
272
|
return s3err(400, 'BadDigest', `The ${upper(one.name)} you specified did not match the calculated checksum.`);
|
|
272
273
|
return { md5, given: one ?? null };
|
|
273
274
|
}
|
|
275
|
+
/** Whose bucket this is: whoever made it, or the account whose console settings list it (made on first use). */
|
|
276
|
+
function ownerOf(ctx, bucket) {
|
|
277
|
+
const made = buckets.get(bucket);
|
|
278
|
+
if (made !== undefined)
|
|
279
|
+
return made;
|
|
280
|
+
for (const [tenant, settings] of ctx.settings)
|
|
281
|
+
if ((settings.buckets ?? '').split(',').some((b) => b.trim() === bucket)) {
|
|
282
|
+
buckets.set(bucket, tenant);
|
|
283
|
+
return tenant;
|
|
284
|
+
}
|
|
285
|
+
return undefined;
|
|
286
|
+
}
|
|
274
287
|
/** Whether a browser on `origin` may reach this bucket: its owner's corsOrigins, or the world's own hosts. */
|
|
275
288
|
function allowed(ctx, bucket, origin) {
|
|
276
|
-
const owner =
|
|
289
|
+
const owner = ownerOf(ctx, bucket);
|
|
277
290
|
if (owner === undefined)
|
|
278
291
|
return false;
|
|
279
292
|
const listed = (ctx.settings.get(owner)?.corsOrigins ?? '')
|
|
@@ -298,8 +311,8 @@ const corsOf = (ctx, req) => {
|
|
|
298
311
|
: {};
|
|
299
312
|
};
|
|
300
313
|
/** The bucket a request names, if it is the caller's: S3's NoSuchBucket, or AccessDenied for another account's. */
|
|
301
|
-
function ownBucket(req, tenant) {
|
|
302
|
-
const owner =
|
|
314
|
+
function ownBucket(req, tenant, ctx) {
|
|
315
|
+
const owner = ownerOf(ctx, req.params.bucket);
|
|
303
316
|
if (owner === undefined)
|
|
304
317
|
return s3err(404, 'NoSuchBucket', 'The specified bucket does not exist');
|
|
305
318
|
if (owner !== tenant)
|
|
@@ -339,7 +352,7 @@ const routes = {
|
|
|
339
352
|
const v = verify(req, ctx);
|
|
340
353
|
if (isReply(v))
|
|
341
354
|
return v;
|
|
342
|
-
const owner =
|
|
355
|
+
const owner = ownerOf(ctx, req.params.bucket);
|
|
343
356
|
if (owner !== undefined && owner !== v.tenant)
|
|
344
357
|
return s3err(409, 'BucketAlreadyExists', 'The requested bucket name is not available.');
|
|
345
358
|
const where = /<LocationConstraint>([^<]*)<\/LocationConstraint>/.exec(req.text())?.[1];
|
|
@@ -353,7 +366,7 @@ const routes = {
|
|
|
353
366
|
const v = verify(req, ctx);
|
|
354
367
|
if (isReply(v))
|
|
355
368
|
return v;
|
|
356
|
-
const refused = ownBucket(req, v.tenant);
|
|
369
|
+
const refused = ownBucket(req, v.tenant, ctx);
|
|
357
370
|
return { status: refused ? refused.status : 200 };
|
|
358
371
|
},
|
|
359
372
|
'bucket.get': (req, ctx) => listUploads(req, ctx),
|
|
@@ -378,7 +391,7 @@ const routes = {
|
|
|
378
391
|
const v = verify(req, ctx);
|
|
379
392
|
if (isReply(v))
|
|
380
393
|
return { ...v, headers: { ...v.headers, ...corsOf(ctx, req) } };
|
|
381
|
-
const refused = ownBucket(req, v.tenant);
|
|
394
|
+
const refused = ownBucket(req, v.tenant, ctx);
|
|
382
395
|
if (refused)
|
|
383
396
|
return refused;
|
|
384
397
|
if (ctx.take('reject', { tenant: v.tenant, target: objectKey(req) }))
|
|
@@ -441,7 +454,7 @@ const routes = {
|
|
|
441
454
|
const v = verify(req, ctx);
|
|
442
455
|
if (isReply(v))
|
|
443
456
|
return { status: v.status };
|
|
444
|
-
const refused = ownBucket(req, v.tenant);
|
|
457
|
+
const refused = ownBucket(req, v.tenant, ctx);
|
|
445
458
|
if (refused)
|
|
446
459
|
return { status: refused.status };
|
|
447
460
|
const o = objects.get(objectKey(req));
|
|
@@ -453,7 +466,7 @@ const routes = {
|
|
|
453
466
|
const v = verify(req, ctx);
|
|
454
467
|
if (isReply(v))
|
|
455
468
|
return v;
|
|
456
|
-
const refused = ownBucket(req, v.tenant);
|
|
469
|
+
const refused = ownBucket(req, v.tenant, ctx);
|
|
457
470
|
if (refused)
|
|
458
471
|
return refused;
|
|
459
472
|
const uploadId = req.query.get('uploadId');
|
|
@@ -482,7 +495,7 @@ const routes = {
|
|
|
482
495
|
const v = verify(req, ctx);
|
|
483
496
|
if (isReply(v))
|
|
484
497
|
return v;
|
|
485
|
-
const refused = ownBucket(req, v.tenant);
|
|
498
|
+
const refused = ownBucket(req, v.tenant, ctx);
|
|
486
499
|
if (refused)
|
|
487
500
|
return refused;
|
|
488
501
|
const uploadId = req.query.get('uploadId');
|
|
@@ -504,7 +517,7 @@ const routes = {
|
|
|
504
517
|
const v = verify(req, ctx);
|
|
505
518
|
if (isReply(v))
|
|
506
519
|
return v;
|
|
507
|
-
const refused = ownBucket(req, v.tenant);
|
|
520
|
+
const refused = ownBucket(req, v.tenant, ctx);
|
|
508
521
|
if (refused)
|
|
509
522
|
return refused;
|
|
510
523
|
const k = objectKey(req);
|
|
@@ -660,11 +673,11 @@ function listUploads(req, ctx) {
|
|
|
660
673
|
const v = verify(req, ctx);
|
|
661
674
|
if (isReply(v))
|
|
662
675
|
return v;
|
|
663
|
-
const refused = ownBucket(req, v.tenant);
|
|
676
|
+
const refused = ownBucket(req, v.tenant, ctx);
|
|
664
677
|
if (refused)
|
|
665
678
|
return refused;
|
|
666
679
|
if (!req.query.has('uploads'))
|
|
667
|
-
return
|
|
680
|
+
return listObjects(req);
|
|
668
681
|
const bucket = req.params.bucket;
|
|
669
682
|
const prefix = req.query.get('prefix') ?? '';
|
|
670
683
|
const max = Math.min(Number(req.query.get('max-uploads') ?? 1000), 1000);
|
|
@@ -685,4 +698,83 @@ function listUploads(req, ctx) {
|
|
|
685
698
|
.join('') +
|
|
686
699
|
`</ListMultipartUploadsResult>`);
|
|
687
700
|
}
|
|
701
|
+
/**
|
|
702
|
+
* ListObjects (V1) and ListObjectsV2 (list-type=2): keys in order, under a prefix, rolled up into CommonPrefixes
|
|
703
|
+
* at a delimiter, a page at a time (max-keys counts both). V2 pages by an opaque continuation token or start-after,
|
|
704
|
+
* V1 by marker. A product often lists a record's files before it cleans them up.
|
|
705
|
+
*/
|
|
706
|
+
function listObjects(req) {
|
|
707
|
+
const bucket = req.params.bucket;
|
|
708
|
+
const q = req.query;
|
|
709
|
+
const v2 = q.get('list-type') === '2';
|
|
710
|
+
const prefix = q.get('prefix') ?? '';
|
|
711
|
+
const delimiter = q.get('delimiter') ?? '';
|
|
712
|
+
const maxKeys = Math.max(0, Math.min(Number(q.get('max-keys') ?? 1000) || 0, 1000));
|
|
713
|
+
const token = q.get('continuation-token');
|
|
714
|
+
let after;
|
|
715
|
+
if (v2 && token !== null) {
|
|
716
|
+
after = Buffer.from(token, 'base64url').toString('utf8');
|
|
717
|
+
if (!token || Buffer.from(after, 'utf8').toString('base64url') !== token)
|
|
718
|
+
return s3err(400, 'InvalidArgument', 'The continuation token provided is incorrect');
|
|
719
|
+
}
|
|
720
|
+
else
|
|
721
|
+
after = (v2 ? q.get('start-after') : q.get('marker')) ?? '';
|
|
722
|
+
const url = q.get('encoding-type') === 'url';
|
|
723
|
+
const enc = (k) => escapeXml(url ? encodeURIComponent(k).replace(/%2F/g, '/') : k);
|
|
724
|
+
const keys = [...objects.keys()]
|
|
725
|
+
.filter((k) => k.startsWith(`${bucket}/`))
|
|
726
|
+
.map((k) => k.slice(bucket.length + 1))
|
|
727
|
+
.filter((k) => k.startsWith(prefix))
|
|
728
|
+
.sort((a, b) => (a < b ? -1 : a > b ? 1 : 0));
|
|
729
|
+
// Each entry is a key, or the common prefix it rolls up into; one at or before where the last page ended was
|
|
730
|
+
// given already, and so was a prefix that page ended inside.
|
|
731
|
+
const entries = [];
|
|
732
|
+
for (const k of keys) {
|
|
733
|
+
const cut = delimiter ? k.indexOf(delimiter, prefix.length) : -1;
|
|
734
|
+
if (cut < 0) {
|
|
735
|
+
if (k > after)
|
|
736
|
+
entries.push({ key: k });
|
|
737
|
+
continue;
|
|
738
|
+
}
|
|
739
|
+
const p = k.slice(0, cut + delimiter.length);
|
|
740
|
+
if (entries.at(-1)?.prefix !== p && p > after && !after.startsWith(p))
|
|
741
|
+
entries.push({ prefix: p });
|
|
742
|
+
}
|
|
743
|
+
const page = entries.slice(0, maxKeys);
|
|
744
|
+
const truncated = entries.length > page.length;
|
|
745
|
+
const last = page.at(-1);
|
|
746
|
+
// Where the next page starts, as S3 gives it: the last key, or the last common prefix (all under it are given).
|
|
747
|
+
const next = last ? (last.prefix ?? last.key) : '';
|
|
748
|
+
const tag = (name, value) => `<${name}>${value}</${name}>`;
|
|
749
|
+
const body = tag('Name', escapeXml(bucket)) +
|
|
750
|
+
tag('Prefix', enc(prefix)) +
|
|
751
|
+
(delimiter ? tag('Delimiter', enc(delimiter)) : '') +
|
|
752
|
+
tag('MaxKeys', String(maxKeys)) +
|
|
753
|
+
(url ? tag('EncodingType', 'url') : '') +
|
|
754
|
+
tag('IsTruncated', String(truncated)) +
|
|
755
|
+
(v2
|
|
756
|
+
? tag('KeyCount', String(page.length)) +
|
|
757
|
+
(token !== null ? tag('ContinuationToken', escapeXml(token)) : '') +
|
|
758
|
+
(q.get('start-after') !== null ? tag('StartAfter', enc(q.get('start-after'))) : '') +
|
|
759
|
+
(truncated ? tag('NextContinuationToken', Buffer.from(next, 'utf8').toString('base64url')) : '')
|
|
760
|
+
: tag('Marker', enc(q.get('marker') ?? '')) + (truncated ? tag('NextMarker', enc(next)) : '')) +
|
|
761
|
+
page
|
|
762
|
+
.filter((e) => e.key !== undefined)
|
|
763
|
+
.map((e) => {
|
|
764
|
+
const o = objects.get(`${bucket}/${e.key}`);
|
|
765
|
+
return ('<Contents>' +
|
|
766
|
+
tag('Key', enc(e.key)) +
|
|
767
|
+
tag('LastModified', o.modified.toISOString()) +
|
|
768
|
+
tag('ETag', escapeXml(o.etag)) +
|
|
769
|
+
tag('Size', String(o.size)) +
|
|
770
|
+
tag('StorageClass', 'STANDARD') +
|
|
771
|
+
'</Contents>');
|
|
772
|
+
})
|
|
773
|
+
.join('') +
|
|
774
|
+
page
|
|
775
|
+
.filter((e) => e.prefix !== undefined)
|
|
776
|
+
.map((e) => `<CommonPrefixes>${tag('Prefix', enc(e.prefix))}</CommonPrefixes>`)
|
|
777
|
+
.join('');
|
|
778
|
+
return xml(200, `<ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">${body}</ListBucketResult>`);
|
|
779
|
+
}
|
|
688
780
|
//# sourceMappingURL=index.js.map
|