ugly-app 0.1.942 → 0.1.944
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/dist/cli/publish/staticOps.d.ts.map +1 -1
- package/dist/cli/publish/staticOps.js +35 -9
- package/dist/cli/publish/staticOps.js.map +1 -1
- package/dist/cli/version.d.ts +1 -1
- package/dist/cli/version.js +1 -1
- package/package.json +1 -1
- package/src/cli/publish/staticOps.ts +40 -12
- package/src/cli/version.ts +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"staticOps.d.ts","sourceRoot":"","sources":["../../../src/cli/publish/staticOps.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAKL,QAAQ,EACT,MAAM,oBAAoB,CAAC;AAE5B,OAAO,KAAK,EAAE,KAAK,EAAgB,MAAM,iBAAiB,CAAC;AAI3D,0EAA0E;AAC1E,eAAO,MAAM,kBAAkB,QAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"staticOps.d.ts","sourceRoot":"","sources":["../../../src/cli/publish/staticOps.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAKL,QAAQ,EACT,MAAM,oBAAoB,CAAC;AAE5B,OAAO,KAAK,EAAE,KAAK,EAAgB,MAAM,iBAAiB,CAAC;AAI3D,0EAA0E;AAC1E,eAAO,MAAM,kBAAkB,QAAoB,CAAC;AAoBpD;;;GAGG;AACH,wBAAsB,OAAO,CAAC,CAAC,EAC7B,KAAK,EAAE,CAAC,EAAE,EACV,KAAK,EAAE,MAAM,EACb,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,GAC7B,OAAO,CAAC,IAAI,CAAC,CAYf;AA4FD,wBAAgB,aAAa,CAAC,IAAI,EAAE;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,MAAM,EAAE,MAAM,CAAC;CAChB,GAAG,KAAK,CAYR;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,GAAG,KAAK,CAEzE;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB,GAAG,KAAK,CAuIR"}
|
|
@@ -23,14 +23,15 @@ const IMMUTABLE = 'public, max-age=31536000, immutable';
|
|
|
23
23
|
* In-flight DELETEs against the REST object API, so the first GC of a
|
|
24
24
|
* long-lived app finishes in minutes rather than hours.
|
|
25
25
|
*
|
|
26
|
-
* Chosen empirically
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
* rather than silent data loss — raise this only with the same measurement.
|
|
26
|
+
* Chosen empirically. A single app's sweep runs clean at this rate (measured:
|
|
27
|
+
* 8,339 deletes in ~3 min, ~46 req/s, zero 429s), but a fleet-wide rollout —
|
|
28
|
+
* several apps each clearing tens of thousands of objects back to back — DOES
|
|
29
|
+
* get throttled. So the value is paired with 429 retry below rather than being
|
|
30
|
+
* relied on to stay under any limit; raise it only alongside that backoff.
|
|
32
31
|
*/
|
|
33
32
|
const DELETE_CONCURRENCY = 16;
|
|
33
|
+
/** 429 retries per object before the sweep gives up on it. */
|
|
34
|
+
const DELETE_MAX_RETRIES = 5;
|
|
34
35
|
/**
|
|
35
36
|
* Run `fn` over `items` with at most `limit` in flight, preserving fail-fast
|
|
36
37
|
* semantics: the first rejection propagates once the in-flight work settles.
|
|
@@ -217,10 +218,35 @@ export function createApiR2Ops(args) {
|
|
|
217
218
|
// has been deploying for months faces tens of thousands of stale build
|
|
218
219
|
// objects, which at ~150 ms each is over an hour of wall clock while the
|
|
219
220
|
// publish appears hung. Run a bounded pool instead.
|
|
221
|
+
// A sweep is tens of thousands of requests long, so ANY per-request
|
|
222
|
+
// failure mode is near-certain to occur at least once — and one
|
|
223
|
+
// unretried failure discards the whole sweep. Both observed live on a
|
|
224
|
+
// 43k-object app: HTTP 429 (the API asking us to slow down) and a bare
|
|
225
|
+
// `fetch failed` (a dropped connection under sustained load). Neither is
|
|
226
|
+
// a real error, so retry both.
|
|
227
|
+
const backoff = (attempt, hintSec) => Number.isFinite(Number(hintSec))
|
|
228
|
+
? Number(hintSec) * 1000
|
|
229
|
+
: Math.min(2 ** attempt * 500, 8000);
|
|
220
230
|
await runPool(keys, DELETE_CONCURRENCY, async (key) => {
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
231
|
+
for (let attempt = 0;; attempt++) {
|
|
232
|
+
const canRetry = attempt < DELETE_MAX_RETRIES;
|
|
233
|
+
let res;
|
|
234
|
+
try {
|
|
235
|
+
res = await globalThis.fetch(`${base}/objects/${encodeURIComponent(key)}`, { method: 'DELETE', headers: auth });
|
|
236
|
+
}
|
|
237
|
+
catch (err) {
|
|
238
|
+
if (!canRetry)
|
|
239
|
+
throw err;
|
|
240
|
+
await new Promise((r) => setTimeout(r, backoff(attempt)));
|
|
241
|
+
continue;
|
|
242
|
+
}
|
|
243
|
+
// A 404 means it is already gone, which is the desired end state.
|
|
244
|
+
if (res.ok || res.status === 404)
|
|
245
|
+
return;
|
|
246
|
+
if ((res.status === 429 || res.status >= 500) && canRetry) {
|
|
247
|
+
await new Promise((r) => setTimeout(r, backoff(attempt, res.headers.get('retry-after'))));
|
|
248
|
+
continue;
|
|
249
|
+
}
|
|
224
250
|
throw new Error(`r2 delete ${key} failed: ${res.status}`);
|
|
225
251
|
}
|
|
226
252
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"staticOps.js","sourceRoot":"","sources":["../../../src/cli/publish/staticOps.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,oBAAoB,EACpB,gBAAgB,EAChB,QAAQ,GACT,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAGpD,MAAM,mBAAmB,GAAG,sCAAsC,CAAC;AAEnE,0EAA0E;AAC1E,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC;AAEpD,0EAA0E;AAC1E,MAAM,SAAS,GAAG,qCAAqC,CAAC;AAExD
|
|
1
|
+
{"version":3,"file":"staticOps.js","sourceRoot":"","sources":["../../../src/cli/publish/staticOps.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/version.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const CLI_VERSION = "0.1.
|
|
1
|
+
export declare const CLI_VERSION = "0.1.944";
|
|
2
2
|
//# sourceMappingURL=version.d.ts.map
|
package/dist/cli/version.js
CHANGED
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ugly-app",
|
|
3
3
|
"packageManager": "pnpm@10.34.5",
|
|
4
|
-
"version": "0.1.
|
|
4
|
+
"version": "0.1.944",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"comment:files": "Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.",
|
|
7
7
|
"files": [
|
|
@@ -35,15 +35,17 @@ const IMMUTABLE = 'public, max-age=31536000, immutable';
|
|
|
35
35
|
* In-flight DELETEs against the REST object API, so the first GC of a
|
|
36
36
|
* long-lived app finishes in minutes rather than hours.
|
|
37
37
|
*
|
|
38
|
-
* Chosen empirically
|
|
39
|
-
*
|
|
40
|
-
*
|
|
41
|
-
*
|
|
42
|
-
*
|
|
43
|
-
* rather than silent data loss — raise this only with the same measurement.
|
|
38
|
+
* Chosen empirically. A single app's sweep runs clean at this rate (measured:
|
|
39
|
+
* 8,339 deletes in ~3 min, ~46 req/s, zero 429s), but a fleet-wide rollout —
|
|
40
|
+
* several apps each clearing tens of thousands of objects back to back — DOES
|
|
41
|
+
* get throttled. So the value is paired with 429 retry below rather than being
|
|
42
|
+
* relied on to stay under any limit; raise it only alongside that backoff.
|
|
44
43
|
*/
|
|
45
44
|
const DELETE_CONCURRENCY = 16;
|
|
46
45
|
|
|
46
|
+
/** 429 retries per object before the sweep gives up on it. */
|
|
47
|
+
const DELETE_MAX_RETRIES = 5;
|
|
48
|
+
|
|
47
49
|
/**
|
|
48
50
|
* Run `fn` over `items` with at most `limit` in flight, preserving fail-fast
|
|
49
51
|
* semantics: the first rejection propagates once the in-flight work settles.
|
|
@@ -285,13 +287,39 @@ export function createApiR2Ops(args: {
|
|
|
285
287
|
// has been deploying for months faces tens of thousands of stale build
|
|
286
288
|
// objects, which at ~150 ms each is over an hour of wall clock while the
|
|
287
289
|
// publish appears hung. Run a bounded pool instead.
|
|
290
|
+
// A sweep is tens of thousands of requests long, so ANY per-request
|
|
291
|
+
// failure mode is near-certain to occur at least once — and one
|
|
292
|
+
// unretried failure discards the whole sweep. Both observed live on a
|
|
293
|
+
// 43k-object app: HTTP 429 (the API asking us to slow down) and a bare
|
|
294
|
+
// `fetch failed` (a dropped connection under sustained load). Neither is
|
|
295
|
+
// a real error, so retry both.
|
|
296
|
+
const backoff = (attempt: number, hintSec?: string | null): number =>
|
|
297
|
+
Number.isFinite(Number(hintSec))
|
|
298
|
+
? Number(hintSec) * 1000
|
|
299
|
+
: Math.min(2 ** attempt * 500, 8000);
|
|
300
|
+
|
|
288
301
|
await runPool(keys, DELETE_CONCURRENCY, async (key) => {
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
302
|
+
for (let attempt = 0; ; attempt++) {
|
|
303
|
+
const canRetry = attempt < DELETE_MAX_RETRIES;
|
|
304
|
+
let res: Response;
|
|
305
|
+
try {
|
|
306
|
+
res = await globalThis.fetch(
|
|
307
|
+
`${base}/objects/${encodeURIComponent(key)}`,
|
|
308
|
+
{ method: 'DELETE', headers: auth },
|
|
309
|
+
);
|
|
310
|
+
} catch (err) {
|
|
311
|
+
if (!canRetry) throw err;
|
|
312
|
+
await new Promise((r) => setTimeout(r, backoff(attempt)));
|
|
313
|
+
continue;
|
|
314
|
+
}
|
|
315
|
+
// A 404 means it is already gone, which is the desired end state.
|
|
316
|
+
if (res.ok || res.status === 404) return;
|
|
317
|
+
if ((res.status === 429 || res.status >= 500) && canRetry) {
|
|
318
|
+
await new Promise((r) =>
|
|
319
|
+
setTimeout(r, backoff(attempt, res.headers.get('retry-after'))),
|
|
320
|
+
);
|
|
321
|
+
continue;
|
|
322
|
+
}
|
|
295
323
|
throw new Error(`r2 delete ${key} failed: ${res.status}`);
|
|
296
324
|
}
|
|
297
325
|
});
|
package/src/cli/version.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
// Auto-generated by prebuild — do not edit manually
|
|
2
|
-
export const CLI_VERSION = "0.1.
|
|
2
|
+
export const CLI_VERSION = "0.1.944";
|