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.
- package/dist/cli/publish/assetUpload.d.ts +26 -0
- package/dist/cli/publish/assetUpload.d.ts.map +1 -0
- package/dist/cli/publish/assetUpload.js +82 -0
- package/dist/cli/publish/assetUpload.js.map +1 -0
- package/dist/cli/publish/orchestrator.d.ts.map +1 -1
- package/dist/cli/publish/orchestrator.js +20 -25
- package/dist/cli/publish/orchestrator.js.map +1 -1
- package/dist/cli/publish/providers/cloudflare.d.ts +8 -8
- package/dist/cli/publish/providers/cloudflare.d.ts.map +1 -1
- package/dist/cli/publish/providers/cloudflare.js +90 -75
- package/dist/cli/publish/providers/cloudflare.js.map +1 -1
- package/dist/cli/publish/staticOps.d.ts +2 -0
- package/dist/cli/publish/staticOps.d.ts.map +1 -1
- package/dist/cli/publish/staticOps.js +16 -5
- package/dist/cli/publish/staticOps.js.map +1 -1
- package/dist/cli/publish/staticSync.d.ts +2 -0
- package/dist/cli/publish/staticSync.d.ts.map +1 -1
- package/dist/cli/publish/staticSync.js.map +1 -1
- package/dist/cli/publish/uploadAuth.d.ts +9 -0
- package/dist/cli/publish/uploadAuth.d.ts.map +1 -0
- package/dist/cli/publish/uploadAuth.js +60 -0
- package/dist/cli/publish/uploadAuth.js.map +1 -0
- package/dist/cli/version.d.ts +1 -1
- package/dist/cli/version.js +1 -1
- package/dist/server/Auth.d.ts.map +1 -1
- package/dist/server/Auth.js +6 -0
- package/dist/server/Auth.js.map +1 -1
- package/dist/server/adapter/workers/createWorkersApp.d.ts.map +1 -1
- package/dist/server/adapter/workers/createWorkersApp.js +11 -1
- package/dist/server/adapter/workers/createWorkersApp.js.map +1 -1
- package/dist/server/adapter/workers/edgeCache.d.ts +17 -0
- package/dist/server/adapter/workers/edgeCache.d.ts.map +1 -1
- package/dist/server/adapter/workers/edgeCache.js +38 -0
- package/dist/server/adapter/workers/edgeCache.js.map +1 -1
- package/package.json +1 -1
- package/src/cli/publish/assetUpload.test.ts +258 -0
- package/src/cli/publish/assetUpload.ts +107 -0
- package/src/cli/publish/assetUploadS3.test.ts +55 -0
- package/src/cli/publish/orchestrator.ts +32 -27
- package/src/cli/publish/providers/cloudflare.ts +139 -108
- package/src/cli/publish/staticOps.test.ts +28 -1
- package/src/cli/publish/staticOps.ts +39 -32
- package/src/cli/publish/staticSync.ts +2 -0
- package/src/cli/publish/uploadAuth.test.ts +76 -0
- package/src/cli/publish/uploadAuth.ts +69 -0
- package/src/cli/version.ts +1 -1
- package/src/server/Auth.ts +6 -0
- package/src/server/adapter/workers/createWorkersApp.ts +14 -1
- package/src/server/adapter/workers/edgeCache.test.ts +64 -0
- 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":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;
|
|
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,
|
|
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
|
-
|
|
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
|
-
|
|
1753
|
-
|
|
1754
|
-
|
|
1755
|
-
|
|
1756
|
-
|
|
1757
|
-
const
|
|
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
|
-
|
|
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
|
|
1799
|
-
|
|
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
|
});
|