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.
Files changed (43) hide show
  1. package/CHANGELOG.md +75 -0
  2. package/dist/fleet/browser.d.ts +12 -0
  3. package/dist/fleet/browser.d.ts.map +1 -1
  4. package/dist/fleet/browser.js +3 -0
  5. package/dist/fleet/browser.js.map +1 -1
  6. package/dist/fleet/sight.d.ts +11 -1
  7. package/dist/fleet/sight.d.ts.map +1 -1
  8. package/dist/fleet/sight.js +105 -6
  9. package/dist/fleet/sight.js.map +1 -1
  10. package/dist/harness.d.ts +26 -1
  11. package/dist/harness.d.ts.map +1 -1
  12. package/dist/harness.js +89 -10
  13. package/dist/harness.js.map +1 -1
  14. package/dist/mcp/authenticator.d.ts +17 -0
  15. package/dist/mcp/authenticator.d.ts.map +1 -0
  16. package/dist/mcp/authenticator.js +63 -0
  17. package/dist/mcp/authenticator.js.map +1 -0
  18. package/dist/mcp/inbox.d.ts +16 -0
  19. package/dist/mcp/inbox.d.ts.map +1 -0
  20. package/dist/mcp/inbox.js +55 -0
  21. package/dist/mcp/inbox.js.map +1 -0
  22. package/dist/mcp/server.d.ts +2 -0
  23. package/dist/mcp/server.d.ts.map +1 -1
  24. package/dist/mcp/server.js +141 -31
  25. package/dist/mcp/server.js.map +1 -1
  26. package/dist/product.d.ts +12 -0
  27. package/dist/product.d.ts.map +1 -1
  28. package/dist/runs/report.d.ts.map +1 -1
  29. package/dist/runs/report.js +1 -0
  30. package/dist/runs/report.js.map +1 -1
  31. package/dist/runs/run.d.ts +25 -0
  32. package/dist/runs/run.d.ts.map +1 -1
  33. package/dist/runs/run.js +118 -70
  34. package/dist/runs/run.js.map +1 -1
  35. package/dist/standins/builtin/s3/index.d.ts.map +1 -1
  36. package/dist/standins/builtin/s3/index.js +105 -13
  37. package/dist/standins/builtin/s3/index.js.map +1 -1
  38. package/dist/standins/manifest.d.ts +1 -1
  39. package/dist/time.d.ts +6 -0
  40. package/dist/time.d.ts.map +1 -1
  41. package/dist/time.js +18 -0
  42. package/dist/time.js.map +1 -1
  43. package/package.json +3 -2
@@ -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 scenario = loadScenario(scenarioId, scenarioDir);
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
- const people = await h.people(w.id);
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
- catch (e) {
120
- await h.destroyWorld(w.id).catch(() => undefined);
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
- r.checks = await h.check(r.worldId);
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
  },
@@ -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":"AAiBA;;;GAGG;AACH,eAAO,MAAM,UAAU,QAAmB,CAAC"}
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 = buckets.get(bucket);
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 = buckets.get(req.params.bucket);
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 = buckets.get(req.params.bucket);
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 s3err(400, 'InvalidRequest', 'Only the list of uploads in parts is served on a bucket here.');
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