ugly-app 0.1.1069 → 0.1.1071

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 (50) hide show
  1. package/dist/cli/publish/assetUpload.d.ts +26 -0
  2. package/dist/cli/publish/assetUpload.d.ts.map +1 -0
  3. package/dist/cli/publish/assetUpload.js +82 -0
  4. package/dist/cli/publish/assetUpload.js.map +1 -0
  5. package/dist/cli/publish/orchestrator.d.ts.map +1 -1
  6. package/dist/cli/publish/orchestrator.js +20 -25
  7. package/dist/cli/publish/orchestrator.js.map +1 -1
  8. package/dist/cli/publish/providers/cloudflare.d.ts +8 -8
  9. package/dist/cli/publish/providers/cloudflare.d.ts.map +1 -1
  10. package/dist/cli/publish/providers/cloudflare.js +90 -75
  11. package/dist/cli/publish/providers/cloudflare.js.map +1 -1
  12. package/dist/cli/publish/staticOps.d.ts +2 -0
  13. package/dist/cli/publish/staticOps.d.ts.map +1 -1
  14. package/dist/cli/publish/staticOps.js +16 -5
  15. package/dist/cli/publish/staticOps.js.map +1 -1
  16. package/dist/cli/publish/staticSync.d.ts +2 -0
  17. package/dist/cli/publish/staticSync.d.ts.map +1 -1
  18. package/dist/cli/publish/staticSync.js.map +1 -1
  19. package/dist/cli/publish/uploadAuth.d.ts +9 -0
  20. package/dist/cli/publish/uploadAuth.d.ts.map +1 -0
  21. package/dist/cli/publish/uploadAuth.js +60 -0
  22. package/dist/cli/publish/uploadAuth.js.map +1 -0
  23. package/dist/cli/version.d.ts +1 -1
  24. package/dist/cli/version.js +1 -1
  25. package/dist/server/Auth.d.ts.map +1 -1
  26. package/dist/server/Auth.js +6 -0
  27. package/dist/server/Auth.js.map +1 -1
  28. package/dist/server/adapter/workers/createWorkersApp.d.ts.map +1 -1
  29. package/dist/server/adapter/workers/createWorkersApp.js +11 -1
  30. package/dist/server/adapter/workers/createWorkersApp.js.map +1 -1
  31. package/dist/server/adapter/workers/edgeCache.d.ts +17 -0
  32. package/dist/server/adapter/workers/edgeCache.d.ts.map +1 -1
  33. package/dist/server/adapter/workers/edgeCache.js +38 -0
  34. package/dist/server/adapter/workers/edgeCache.js.map +1 -1
  35. package/package.json +1 -1
  36. package/src/cli/publish/assetUpload.test.ts +258 -0
  37. package/src/cli/publish/assetUpload.ts +107 -0
  38. package/src/cli/publish/assetUploadS3.test.ts +55 -0
  39. package/src/cli/publish/orchestrator.ts +32 -27
  40. package/src/cli/publish/providers/cloudflare.ts +139 -108
  41. package/src/cli/publish/staticOps.test.ts +28 -1
  42. package/src/cli/publish/staticOps.ts +39 -32
  43. package/src/cli/publish/staticSync.ts +2 -0
  44. package/src/cli/publish/uploadAuth.test.ts +76 -0
  45. package/src/cli/publish/uploadAuth.ts +69 -0
  46. package/src/cli/version.ts +1 -1
  47. package/src/server/Auth.ts +6 -0
  48. package/src/server/adapter/workers/createWorkersApp.ts +14 -1
  49. package/src/server/adapter/workers/edgeCache.test.ts +64 -0
  50. package/src/server/adapter/workers/edgeCache.ts +38 -0
@@ -0,0 +1,26 @@
1
+ import type { RemoteObject } from './staticSync.js';
2
+ /** Compare bytes, not filename conventions. Multipart ETags are not MD5s. */
3
+ export declare function unchangedUploadKeys(directory: string, remote: readonly RemoteObject[]): Promise<Set<string>>;
4
+ export interface UploadFile {
5
+ key: string;
6
+ full: string;
7
+ bytes: number;
8
+ }
9
+ export interface UploadProgress {
10
+ total: number;
11
+ uploaded: number;
12
+ bytes: number;
13
+ totalBytes: number;
14
+ skipped: number;
15
+ }
16
+ export interface UploadOptions {
17
+ /** Four streams by default; capped to avoid API/memory pressure. */
18
+ concurrency?: number;
19
+ onProgress?: (progress: UploadProgress) => void;
20
+ }
21
+ /** Stop admitting new files on failure, and settle every active upload before returning. */
22
+ export declare function uploadFiles(files: readonly UploadFile[], skipped: number, upload: (file: UploadFile) => Promise<void>, options?: UploadOptions): Promise<{
23
+ uploaded: number;
24
+ bytes: number;
25
+ }>;
26
+ //# sourceMappingURL=assetUpload.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assetUpload.d.ts","sourceRoot":"","sources":["../../../src/cli/publish/assetUpload.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEpD,6EAA6E;AAC7E,wBAAsB,mBAAmB,CACvC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,SAAS,YAAY,EAAE,GAC9B,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAuBtB;AAED,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AACD,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AACD,MAAM,WAAW,aAAa;IAC5B,oEAAoE;IACpE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,cAAc,KAAK,IAAI,CAAC;CACjD;AAED,4FAA4F;AAC5F,wBAAsB,WAAW,CAC/B,KAAK,EAAE,SAAS,UAAU,EAAE,EAC5B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,OAAO,CAAC,IAAI,CAAC,EAC3C,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAgD9C"}
@@ -0,0 +1,82 @@
1
+ import { createReadStream, promises as fs } from 'node:fs';
2
+ import path from 'node:path';
3
+ import { createHash } from 'node:crypto';
4
+ /** Compare bytes, not filename conventions. Multipart ETags are not MD5s. */
5
+ export async function unchangedUploadKeys(directory, remote) {
6
+ const unchanged = new Set();
7
+ for (const object of remote) {
8
+ const etag = object.etag?.replace(/^"|"$/g, '').toLowerCase();
9
+ if (!etag || !/^[a-f0-9]{32}$/.test(etag) || object.size === undefined)
10
+ continue;
11
+ const file = path.resolve(directory, object.key);
12
+ const relative = path.relative(path.resolve(directory), file);
13
+ if (relative.startsWith('..') || path.isAbsolute(relative))
14
+ continue;
15
+ let stat;
16
+ try {
17
+ stat = await fs.stat(file);
18
+ }
19
+ catch (error) {
20
+ if (error.code === 'ENOENT')
21
+ continue;
22
+ throw error;
23
+ }
24
+ if (!stat.isFile() || stat.size !== object.size)
25
+ continue;
26
+ const hash = createHash('md5');
27
+ for await (const chunk of createReadStream(file))
28
+ hash.update(chunk);
29
+ if (hash.digest('hex') === etag)
30
+ unchanged.add(object.key);
31
+ }
32
+ return unchanged;
33
+ }
34
+ /** Stop admitting new files on failure, and settle every active upload before returning. */
35
+ export async function uploadFiles(files, skipped, upload, options = {}) {
36
+ const concurrency = Math.max(1, Math.min(8, Math.floor(options.concurrency ?? 4) || 4));
37
+ const progress = {
38
+ total: files.length,
39
+ uploaded: 0,
40
+ bytes: 0,
41
+ totalBytes: files.reduce((sum, f) => sum + f.bytes, 0),
42
+ skipped,
43
+ };
44
+ const report = () => {
45
+ if (options.onProgress)
46
+ options.onProgress({ ...progress });
47
+ else
48
+ console.log(`[publish-assets] ${progress.uploaded}/${progress.total} files, ` +
49
+ `${(progress.bytes / 1048576).toFixed(1)}/${(progress.totalBytes / 1048576).toFixed(1)} MiB uploaded; ${skipped} unchanged`);
50
+ };
51
+ report();
52
+ const timer = setInterval(report, 10000);
53
+ timer.unref();
54
+ let next = 0;
55
+ let failed = false;
56
+ let failure;
57
+ try {
58
+ await Promise.all(Array.from({ length: Math.min(concurrency, files.length) }, async () => {
59
+ while (!failed && next < files.length) {
60
+ const file = files[next++];
61
+ try {
62
+ await upload(file);
63
+ progress.uploaded++;
64
+ progress.bytes += file.bytes;
65
+ }
66
+ catch (error) {
67
+ if (!failed)
68
+ failure = error;
69
+ failed = true;
70
+ }
71
+ }
72
+ }));
73
+ if (failed)
74
+ throw failure;
75
+ report();
76
+ return { uploaded: progress.uploaded, bytes: progress.bytes };
77
+ }
78
+ finally {
79
+ clearInterval(timer);
80
+ }
81
+ }
82
+ //# sourceMappingURL=assetUpload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assetUpload.js","sourceRoot":"","sources":["../../../src/cli/publish/assetUpload.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../../src/cli/publish/orchestrator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../../src/cli/publish/orchestrator.ts"],"names":[],"mappings":"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"}
@@ -39,9 +39,11 @@ import { PublishError } from './errors.js';
39
39
  import { projectPackageManager } from './packageManager.js';
40
40
  import { promises as dnsPromises } from 'node:dns';
41
41
  import { getFreshCloudflareCredentials } from '../auth/cloudflareOauth.js';
42
+ import { unchangedUploadKeys } from './assetUpload.js';
43
+ import { createUploadTokenProvider } from './uploadAuth.js';
42
44
  import { getNeonCredentials } from '../auth/credentials.js';
43
45
  import { importTs, disposeImportTs, readUglyAppConfig, readUglyAppConfigRaw, DEFAULT_STATIC_RETENTION_DAYS, } from '../uglyappConfig.js';
44
- import { DEFAULT_STATIC_DIR, isContentAddressedKey, runBuildStatic, scanStaticDir, STATIC_PREFIX, } from '../staticAssets.js';
46
+ import { DEFAULT_STATIC_DIR, runBuildStatic, scanStaticDir, STATIC_PREFIX, } from '../staticAssets.js';
45
47
  import { ensureStaticDomain, fetchZoneName, staticHostFor, } from './staticDomain.js';
46
48
  import { createApiR2Ops, createS3R2Ops } from './staticOps.js';
47
49
  import { gcBuildPrefixes, syncStaticAssets } from './staticSync.js';
@@ -1745,16 +1747,17 @@ export async function runPublish(input) {
1745
1747
  if (!state.neon || !state.cloudflare || !state.proxy) {
1746
1748
  throw new Error('workers-deploy: missing upstream provisioning state');
1747
1749
  }
1748
- const cloudflareToken = await getSecret(`cloudflare:token:${input.projectId}`);
1750
+ let cloudflareToken = await getSecret(`cloudflare:token:${input.projectId}`);
1749
1751
  if (!cloudflareToken) {
1750
1752
  throw new Error('workers-deploy: missing cloudflare:token secret');
1751
1753
  }
1752
- // Content-addressed keys already in the bucket. A CDN-hosted bundle
1753
- // keeps the SAME keys across deploys (that's the point), so without
1754
- // this the r2-upload pass below re-PUTs the whole bundle every time
1755
- // even though nothing changed. `builds/{buildId}/…` keys are new
1756
- // each deploy and are never in this set.
1757
- const alreadyPresentStatic = new Set();
1754
+ const getUploadToken = createUploadTokenProvider(cloudflareToken, state.cloudflare.accountId, async (token) => {
1755
+ await setSecret(`cloudflare:token:${input.projectId}`, token);
1756
+ cloudflareToken = token;
1757
+ });
1758
+ cloudflareToken = await getUploadToken();
1759
+ const r2UploadDir = path.join(input.projectPath, 'dist/worker/r2-upload');
1760
+ let alreadyPresentStatic = new Set();
1758
1761
  // Escape hatch: re-PUT every static object even though the key is
1759
1762
  // already there. Needed when the OBJECT METADATA has to change —
1760
1763
  // content-addressed keys mean the bytes are right, so presence alone
@@ -1777,26 +1780,16 @@ export async function runPublish(input) {
1777
1780
  })
1778
1781
  : createApiR2Ops({
1779
1782
  token: cloudflareToken,
1783
+ getToken: getUploadToken,
1780
1784
  accountId: state.cloudflare.accountId,
1781
1785
  bucket: state.cloudflare.bucket,
1782
1786
  });
1783
- for (const o of await probe.list(STATIC_PREFIX)) {
1784
- // ⚠️ PRESENCE SKIPS CONTENT-ADDRESSED KEYS ONLY. Their md5
1785
- // fragment pins the bytes (`staticKeyFor`), so an existing key
1786
- // is provably the same object. A STABLE key — the character
1787
- // kit's `anims/*.fbx`, UGMs, anything `staticKeyFor` never
1788
- // named — keeps one name across byte changes, and skipping it
1789
- // on presence meant a replaced FBX never reached the CDN
1790
- // (found when a new T-Pose deployed "successfully" and the CDN
1791
- // kept serving the old one). Stable keys re-PUT every deploy;
1792
- // that is the price of a key that does not name its bytes.
1793
- if (isContentAddressedKey(o.key))
1794
- alreadyPresentStatic.add(o.key);
1795
- }
1787
+ alreadyPresentStatic = await unchangedUploadKeys(r2UploadDir, await probe.list(STATIC_PREFIX));
1796
1788
  }
1797
- catch {
1798
- // Listing is an optimisation. If it fails, upload everything —
1799
- // slower, still correct.
1789
+ catch (error) {
1790
+ // Listing/hashing is an optimisation; fail safely by uploading.
1791
+ if (!forceStatic)
1792
+ console.warn(`[publish-assets] Cannot compare remote assets; uploading all: ${error.message}`);
1800
1793
  }
1801
1794
  const scriptBody = await fs.readFile(path.join(input.projectPath, 'dist/worker/worker.js'), 'utf-8');
1802
1795
  // Upload the SPA assets to R2 BEFORE the Worker script lands
@@ -1804,7 +1797,6 @@ export async function runPublish(input) {
1804
1797
  // /{buildId}/* directly from R2. The build:workers step
1805
1798
  // staged everything under `dist/worker/r2-upload/` with
1806
1799
  // paths that mirror their R2 keys exactly.
1807
- const r2UploadDir = path.join(input.projectPath, 'dist/worker/r2-upload');
1808
1800
  // Upload assets to R2. Preferred path: the Cloudflare REST object
1809
1801
  // API authenticated with the same Bearer token (no S3 keys, fully
1810
1802
  // non-interactive). If a project still has captured S3 keys (legacy
@@ -1848,6 +1840,7 @@ export async function runPublish(input) {
1848
1840
  else {
1849
1841
  r2Result = await cloudflare.uploadR2AssetsViaApi({
1850
1842
  token: cloudflareToken,
1843
+ getToken: getUploadToken,
1851
1844
  accountId: state.cloudflare.accountId,
1852
1845
  bucket: state.cloudflare.bucket,
1853
1846
  r2UploadDir,
@@ -1859,6 +1852,7 @@ export async function runPublish(input) {
1859
1852
  console.log(`[publish-orchestrator] uploaded ${r2Result.uploaded} asset(s) ` +
1860
1853
  `(${(r2Result.bytes / 1024).toFixed(1)} KB) to R2 ${state.cloudflare.bucket}`);
1861
1854
  }
1855
+ cloudflareToken = await getUploadToken();
1862
1856
  // ── Content-addressed static assets ─────────────────────────
1863
1857
  // These do NOT go through the Worker. The bucket gets its own
1864
1858
  // custom domain so Cloudflare's CDN serves them directly: a Worker
@@ -1878,6 +1872,7 @@ export async function runPublish(input) {
1878
1872
  })
1879
1873
  : createApiR2Ops({
1880
1874
  token: cloudflareToken,
1875
+ getToken: getUploadToken,
1881
1876
  accountId: state.cloudflare.accountId,
1882
1877
  bucket: state.cloudflare.bucket,
1883
1878
  });