@samebase/convex-hosting 0.3.1 → 0.3.2

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 CHANGED
@@ -1,5 +1,11 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.3.2
4
+
5
+ - Responses that the package sends when no uploaded file answers (400, 404, and 500) now have
6
+ `Cache-Control: no-store`. Before this change Cloudflare in front of `*.convex.site` cached a 404
7
+ for a missing script for hours, even after the file was uploaded.
8
+
3
9
  ## 0.3.1
4
10
 
5
11
  - `upload` and `deploy` no longer upload `_headers` and `_redirects` from the root of `dist/`.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,KAAK,UAAU,EAChB,MAAM,eAAe,CAAC;AAEvB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAC;AACzE,OAAO,EAEL,iBAAiB,EAKlB,MAAM,yBAAyB,CAAC;AAUjC,KAAK,UAAU,GAAG,MAAM,GAAG,CAAC,CAAC,OAAO,EAAE,OAAO,KAAK,MAAM,CAAC,CAAC;AAE1D,oEAAoE;AACpE,KAAK,eAAe,GAAG,IAAI,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC,CAAC;AAExF;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,UAAU,EAChB,SAAS,EAAE,YAAY,EACvB,EACE,UAAgB,EAChB,WAAW,EACX,UAAU,GACX,GAAE;IACD,0DAA0D;IAC1D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,sDAAsD;IACtD,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,6DAA6D;IAC7D,UAAU,CAAC,EAAE,UAAU,CAAC;CACpB,QA4DP;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,eAAe,EACpB,SAAS,EAAE,YAAY,EACvB,OAAO,EAAE,OAAO,EAChB,EACE,IAAI,EACJ,WAAmB,EACnB,UAAU,GACX,GAAE;IACD;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,uEAAuE;IACvE,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,6DAA6D;IAC7D,UAAU,CAAC,EAAE,UAAU,CAAC;CACpB,GACL,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAU1B;AAED,OAAO,EAAE,iBAAiB,EAAE,CAAC;AA0G7B;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,YAAY;;;;;;;;EAkB5D;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAQrC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,KAAK,UAAU,EAChB,MAAM,eAAe,CAAC;AAEvB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAC;AACzE,OAAO,EAEL,iBAAiB,EAMlB,MAAM,yBAAyB,CAAC;AAUjC,KAAK,UAAU,GAAG,MAAM,GAAG,CAAC,CAAC,OAAO,EAAE,OAAO,KAAK,MAAM,CAAC,CAAC;AAE1D,oEAAoE;AACpE,KAAK,eAAe,GAAG,IAAI,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC,CAAC;AAExF;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,UAAU,EAChB,SAAS,EAAE,YAAY,EACvB,EACE,UAAgB,EAChB,WAAW,EACX,UAAU,GACX,GAAE;IACD,0DAA0D;IAC1D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,sDAAsD;IACtD,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,6DAA6D;IAC7D,UAAU,CAAC,EAAE,UAAU,CAAC;CACpB,QAsDP;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,eAAe,EACpB,SAAS,EAAE,YAAY,EACvB,OAAO,EAAE,OAAO,EAChB,EACE,IAAI,EACJ,WAAmB,EACnB,UAAU,GACX,GAAE;IACD;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,uEAAuE;IACvE,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,6DAA6D;IAC7D,UAAU,CAAC,EAAE,UAAU,CAAC;CACpB,GACL,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAU1B;AAED,OAAO,EAAE,iBAAiB,EAAE,CAAC;AAoG7B;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,YAAY;;;;;;;;EAkB5D;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAQrC"}
@@ -1,6 +1,6 @@
1
1
  import { httpActionGeneric, queryGeneric, } from "convex/server";
2
2
  import { v } from "convex/values";
3
- import { cacheControlFor, decodeRequestPath, etagMatches, getMimeType, getSetupHtml, isHtmlContentType, } from "../component/serving.js";
3
+ import { cacheControlFor, decodeRequestPath, errorResponse, etagMatches, getMimeType, getSetupHtml, isHtmlContentType, } from "../component/serving.js";
4
4
  const deploymentInfoValidator = v.object({
5
5
  _id: v.string(),
6
6
  _creationTime: v.number(),
@@ -37,10 +37,7 @@ export function registerStaticRoutes(http, component, { pathPrefix = "/", spaFal
37
37
  const serveStaticFile = httpActionGeneric(async (ctx, request) => {
38
38
  const decodedPath = decodeRequestPath(new URL(request.url).pathname);
39
39
  if (decodedPath === null) {
40
- return new Response("Bad Request", {
41
- status: 400,
42
- headers: { "Content-Type": "text/plain" },
43
- });
40
+ return errorResponse(400, "Bad Request");
44
41
  }
45
42
  let path = decodedPath;
46
43
  if (normalizedPrefix && path.startsWith(normalizedPrefix)) {
@@ -65,10 +62,7 @@ export function registerStaticRoutes(http, component, { pathPrefix = "/", spaFal
65
62
  },
66
63
  });
67
64
  }
68
- return new Response("Not Found", {
69
- status: 404,
70
- headers: { "Content-Type": "text/plain" },
71
- });
65
+ return errorResponse(404, "Not Found");
72
66
  });
73
67
  http.route({
74
68
  pathPrefix: pathPrefix === "/" ? "/" : `${normalizedPrefix}/`,
@@ -184,10 +178,7 @@ async function serveAsset(ctx, component, request, path, { spaFallback, cdnBaseU
184
178
  });
185
179
  }
186
180
  if (!asset.storageUrl) {
187
- return new Response("Asset not available", {
188
- status: 500,
189
- headers: { "Content-Type": "text/plain" },
190
- });
181
+ return errorResponse(500, "Asset not available");
191
182
  }
192
183
  if (asset.etag && etagMatches(request.headers.get("If-None-Match"), asset.etag)) {
193
184
  return new Response(null, {
@@ -197,10 +188,7 @@ async function serveAsset(ctx, component, request, path, { spaFallback, cdnBaseU
197
188
  }
198
189
  const storageResponse = await fetch(asset.storageUrl);
199
190
  if (!storageResponse.ok || !storageResponse.body) {
200
- return new Response("Storage error", {
201
- status: 500,
202
- headers: { "Content-Type": "text/plain" },
203
- });
191
+ return errorResponse(500, "Storage error");
204
192
  }
205
193
  return new Response(storageResponse.body, {
206
194
  status: 200,
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/component/http.ts"],"names":[],"mappings":"AAeA,wBAAgB,cAAc,IAAI,MAAM,CAUvC;AA8GD,QAAA,MAAM,IAAI,oCAAe,CAAC;AAQ1B,eAAe,IAAI,CAAC"}
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/component/http.ts"],"names":[],"mappings":"AAgBA,wBAAgB,cAAc,IAAI,MAAM,CAUvC;AAkGD,QAAA,MAAM,IAAI,oCAAe,CAAC;AAQ1B,eAAe,IAAI,CAAC"}
@@ -1,7 +1,7 @@
1
1
  import { httpRouter } from "convex/server";
2
2
  import { httpAction } from "./_generated/server.js";
3
3
  import { internal } from "./_generated/api.js";
4
- import { cacheControlFor, decodeRequestPath, etagMatches, getMimeType, getSetupHtml, isHtmlContentType, } from "./serving.js";
4
+ import { cacheControlFor, decodeRequestPath, errorResponse, etagMatches, getMimeType, getSetupHtml, isHtmlContentType, } from "./serving.js";
5
5
  // CONVEX_SITE_URL reflects the component's mount point (including any httpPrefix).
6
6
  // We use it to strip the prefix from incoming request paths so lookups in
7
7
  // the asset table remain relative to the component (e.g. `/index.html`).
@@ -23,10 +23,7 @@ const serveStaticFile = httpAction(async (ctx, request) => {
23
23
  const url = new URL(request.url);
24
24
  const decodedPath = decodeRequestPath(url.pathname);
25
25
  if (decodedPath === null) {
26
- return new Response("Bad Request", {
27
- status: 400,
28
- headers: { "Content-Type": "text/plain" },
29
- });
26
+ return errorResponse(400, "Bad Request");
30
27
  }
31
28
  let path = decodedPath;
32
29
  const mountPrefix = getMountPrefix();
@@ -52,10 +49,7 @@ const serveStaticFile = httpAction(async (ctx, request) => {
52
49
  },
53
50
  });
54
51
  }
55
- return new Response("Not Found", {
56
- status: 404,
57
- headers: { "Content-Type": "text/plain" },
58
- });
52
+ return errorResponse(404, "Not Found");
59
53
  }
60
54
  const contentType = asset.contentType || getMimeType(path);
61
55
  // CDN redirect: blobs are served by the platform at /fs/blobs/{id}, which
@@ -71,10 +65,7 @@ const serveStaticFile = httpAction(async (ctx, request) => {
71
65
  });
72
66
  }
73
67
  if (!asset.storageId) {
74
- return new Response("Asset not available", {
75
- status: 500,
76
- headers: { "Content-Type": "text/plain" },
77
- });
68
+ return errorResponse(500, "Asset not available");
78
69
  }
79
70
  const etag = `"${asset.storageId}"`;
80
71
  const ifNoneMatch = request.headers.get("If-None-Match");
@@ -100,10 +91,7 @@ const serveStaticFile = httpAction(async (ctx, request) => {
100
91
  },
101
92
  });
102
93
  }
103
- return new Response("Storage error", {
104
- status: 500,
105
- headers: { "Content-Type": "text/plain" },
106
- });
94
+ return errorResponse(500, "Storage error");
107
95
  }
108
96
  return new Response(blob, {
109
97
  status: 200,
@@ -1 +1 @@
1
- {"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/component/http.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/component/http.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,12 @@ export declare function hasFileExtension(path: string): boolean;
4
4
  export declare function isHashedAsset(path: string): boolean;
5
5
  export declare function isHtmlContentType(contentType: string): boolean;
6
6
  export declare function cacheControlFor(path: string): string;
7
+ /**
8
+ * A plain-text response sent when no uploaded file answers. Without
9
+ * `no-store`, Cloudflare in front of `*.convex.site` caches it for paths with a
10
+ * static extension, so a missing file stays a cached 404 after it is uploaded.
11
+ */
12
+ export declare function errorResponse(status: number, body: string): Response;
7
13
  /**
8
14
  * Decode the URL pathname before looking it up in the asset table. A malformed
9
15
  * escape sequence is a bad request, not a missing static asset.
@@ -1 +1 @@
1
- {"version":3,"file":"serving.d.ts","sourceRoot":"","sources":["../../src/component/serving.ts"],"names":[],"mappings":"AA0BA,wBAAgB,YAAY,IAAI,MAAM,CA0ErC;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGhD;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGtD;AAMD,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGnD;AAED,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAE9D;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAIpD;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAMjE;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAUpF"}
1
+ {"version":3,"file":"serving.d.ts","sourceRoot":"","sources":["../../src/component/serving.ts"],"names":[],"mappings":"AA0BA,wBAAgB,YAAY,IAAI,MAAM,CA0ErC;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGhD;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGtD;AAMD,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGnD;AAED,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAE9D;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAIpD;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,QAAQ,CAKpE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAMjE;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAUpF"}
@@ -121,6 +121,17 @@ export function cacheControlFor(path) {
121
121
  ? "public, max-age=31536000, immutable"
122
122
  : "public, max-age=0, must-revalidate";
123
123
  }
124
+ /**
125
+ * A plain-text response sent when no uploaded file answers. Without
126
+ * `no-store`, Cloudflare in front of `*.convex.site` caches it for paths with a
127
+ * static extension, so a missing file stays a cached 404 after it is uploaded.
128
+ */
129
+ export function errorResponse(status, body) {
130
+ return new Response(body, {
131
+ status,
132
+ headers: { "Content-Type": "text/plain", "Cache-Control": "no-store" },
133
+ });
134
+ }
124
135
  /**
125
136
  * Decode the URL pathname before looking it up in the asset table. A malformed
126
137
  * escape sequence is a bad request, not a missing static asset.
@@ -1 +1 @@
1
- {"version":3,"file":"serving.js","sourceRoot":"","sources":["../../src/component/serving.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"serving.js","sourceRoot":"","sources":["../../src/component/serving.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@samebase/convex-hosting",
3
- "version": "0.3.1",
3
+ "version": "0.3.2",
4
4
  "description": "A Convex component that hosts a web app: static files, with optional server rendering.",
5
5
  "keywords": [
6
6
  "component",
@@ -213,9 +213,24 @@ describe("registerStaticRoutes", () => {
213
213
  );
214
214
 
215
215
  expect(response.status).toBe(400);
216
+ expect(response.headers.get("Cache-Control")).toBe("no-store");
216
217
  expect(runQuery).not.toHaveBeenCalled();
217
218
  });
218
219
 
220
+ test("returns an uncached 404 for a missing file", async () => {
221
+ const handler = staticHandler();
222
+
223
+ const response = await invokeHandler(
224
+ handler,
225
+ vi.fn().mockResolvedValue(null),
226
+ new Request("https://app.convex.site/assets/missing.js"),
227
+ );
228
+
229
+ expect(response.status).toBe(404);
230
+ // A CDN must not keep the 404 after the file is uploaded.
231
+ expect(response.headers.get("Cache-Control")).toBe("no-store");
232
+ });
233
+
219
234
  test("strips a path prefix and forwards the SPA override", async () => {
220
235
  const http = httpRouter();
221
236
  registerStaticRoutes(http, components.hosting, {
@@ -434,6 +449,30 @@ describe("serveStaticAsset", () => {
434
449
  expect(redirected?.headers.get("Location")).toBe("https://cdn.example/blobs/blob-1");
435
450
  });
436
451
 
452
+ test.each([
453
+ ["Asset not available", { contentType: "text/html; charset=utf-8" }],
454
+ [
455
+ "Storage error",
456
+ {
457
+ storageUrl: "https://storage.example/app",
458
+ contentType: "application/javascript; charset=utf-8",
459
+ etag: '"storage-id"',
460
+ },
461
+ ],
462
+ ])("returns an uncached 500 for a found file it can't read: %s", async (body, asset) => {
463
+ vi.stubGlobal("fetch", vi.fn().mockResolvedValue(new Response(null, { status: 404 })));
464
+
465
+ const response = await serveStaticAsset(
466
+ serveCtx(vi.fn().mockResolvedValue(asset)),
467
+ components.hosting,
468
+ new Request("https://app.convex.site/app.js"),
469
+ );
470
+
471
+ expect(response?.status).toBe(500);
472
+ expect(response?.headers.get("Cache-Control")).toBe("no-store");
473
+ expect(await response?.text()).toBe(body);
474
+ });
475
+
437
476
  test("returns null for an inherited v1 file missing from app storage", async () => {
438
477
  const runQuery = vi.fn().mockResolvedValue({
439
478
  appStorageId: "deleted-storage-id",
@@ -10,6 +10,7 @@ import type { ComponentApi } from "../component/_generated/component.js";
10
10
  import {
11
11
  cacheControlFor,
12
12
  decodeRequestPath,
13
+ errorResponse,
13
14
  etagMatches,
14
15
  getMimeType,
15
16
  getSetupHtml,
@@ -75,10 +76,7 @@ export function registerStaticRoutes(
75
76
  const serveStaticFile = httpActionGeneric(async (ctx, request) => {
76
77
  const decodedPath = decodeRequestPath(new URL(request.url).pathname);
77
78
  if (decodedPath === null) {
78
- return new Response("Bad Request", {
79
- status: 400,
80
- headers: { "Content-Type": "text/plain" },
81
- });
79
+ return errorResponse(400, "Bad Request");
82
80
  }
83
81
  let path = decodedPath;
84
82
 
@@ -105,10 +103,7 @@ export function registerStaticRoutes(
105
103
  },
106
104
  });
107
105
  }
108
- return new Response("Not Found", {
109
- status: 404,
110
- headers: { "Content-Type": "text/plain" },
111
- });
106
+ return errorResponse(404, "Not Found");
112
107
  });
113
108
 
114
109
  http.route({
@@ -262,10 +257,7 @@ async function serveAsset(
262
257
  }
263
258
 
264
259
  if (!asset.storageUrl) {
265
- return new Response("Asset not available", {
266
- status: 500,
267
- headers: { "Content-Type": "text/plain" },
268
- });
260
+ return errorResponse(500, "Asset not available");
269
261
  }
270
262
 
271
263
  if (asset.etag && etagMatches(request.headers.get("If-None-Match"), asset.etag)) {
@@ -277,10 +269,7 @@ async function serveAsset(
277
269
 
278
270
  const storageResponse = await fetch(asset.storageUrl);
279
271
  if (!storageResponse.ok || !storageResponse.body) {
280
- return new Response("Storage error", {
281
- status: 500,
282
- headers: { "Content-Type": "text/plain" },
283
- });
272
+ return errorResponse(500, "Storage error");
284
273
  }
285
274
 
286
275
  return new Response(storageResponse.body, {
@@ -99,6 +99,7 @@ describe("static file serving", () => {
99
99
  const t = initConvexTest();
100
100
  const res = await t.fetch("/bad%ZZpath", {});
101
101
  expect(res.status).toBe(400);
102
+ expect(res.headers.get("Cache-Control")).toBe("no-store");
102
103
  });
103
104
 
104
105
  test("SPA fallback serves index.html for extension-less misses", async () => {
@@ -116,6 +117,36 @@ describe("static file serving", () => {
116
117
 
117
118
  const res = await t.fetch("/missing.js", {});
118
119
  expect(res.status).toBe(404);
120
+ // A CDN must not keep the 404 after the file is uploaded.
121
+ expect(res.headers.get("Cache-Control")).toBe("no-store");
122
+ });
123
+
124
+ test("returns an uncached 500 when a file's storage is gone", async () => {
125
+ const t = initConvexTest();
126
+ const storageId = await storeAsset(t, "/app.js", "x", "application/javascript; charset=utf-8");
127
+ await t.run(async (ctx) => {
128
+ await ctx.storage.delete(storageId);
129
+ });
130
+
131
+ const res = await t.fetch("/app.js", {});
132
+ expect(res.status).toBe(500);
133
+ expect(res.headers.get("Cache-Control")).toBe("no-store");
134
+ });
135
+
136
+ test("returns an uncached 500 for an HTML file stored only as a blob", async () => {
137
+ const t = initConvexTest();
138
+ await t.run(async (ctx) => {
139
+ await ctx.db.insert("staticAssets", {
140
+ path: "/about.html",
141
+ blobId: "blob-1",
142
+ contentType: "text/html; charset=utf-8",
143
+ deploymentId: "deploy-1",
144
+ });
145
+ });
146
+
147
+ const res = await t.fetch("/about.html", {});
148
+ expect(res.status).toBe(500);
149
+ expect(res.headers.get("Cache-Control")).toBe("no-store");
119
150
  });
120
151
 
121
152
  test("shows the setup page when nothing is deployed", async () => {
@@ -4,6 +4,7 @@ import { internal } from "./_generated/api.js";
4
4
  import {
5
5
  cacheControlFor,
6
6
  decodeRequestPath,
7
+ errorResponse,
7
8
  etagMatches,
8
9
  getMimeType,
9
10
  getSetupHtml,
@@ -29,10 +30,7 @@ const serveStaticFile = httpAction(async (ctx, request) => {
29
30
  const url = new URL(request.url);
30
31
  const decodedPath = decodeRequestPath(url.pathname);
31
32
  if (decodedPath === null) {
32
- return new Response("Bad Request", {
33
- status: 400,
34
- headers: { "Content-Type": "text/plain" },
35
- });
33
+ return errorResponse(400, "Bad Request");
36
34
  }
37
35
  let path = decodedPath;
38
36
 
@@ -62,10 +60,7 @@ const serveStaticFile = httpAction(async (ctx, request) => {
62
60
  },
63
61
  });
64
62
  }
65
- return new Response("Not Found", {
66
- status: 404,
67
- headers: { "Content-Type": "text/plain" },
68
- });
63
+ return errorResponse(404, "Not Found");
69
64
  }
70
65
 
71
66
  const contentType = asset.contentType || getMimeType(path);
@@ -84,10 +79,7 @@ const serveStaticFile = httpAction(async (ctx, request) => {
84
79
  }
85
80
 
86
81
  if (!asset.storageId) {
87
- return new Response("Asset not available", {
88
- status: 500,
89
- headers: { "Content-Type": "text/plain" },
90
- });
82
+ return errorResponse(500, "Asset not available");
91
83
  }
92
84
 
93
85
  const etag = `"${asset.storageId}"`;
@@ -116,10 +108,7 @@ const serveStaticFile = httpAction(async (ctx, request) => {
116
108
  },
117
109
  });
118
110
  }
119
- return new Response("Storage error", {
120
- status: 500,
121
- headers: { "Content-Type": "text/plain" },
122
- });
111
+ return errorResponse(500, "Storage error");
123
112
  }
124
113
 
125
114
  return new Response(blob, {
@@ -129,6 +129,18 @@ export function cacheControlFor(path: string): string {
129
129
  : "public, max-age=0, must-revalidate";
130
130
  }
131
131
 
132
+ /**
133
+ * A plain-text response sent when no uploaded file answers. Without
134
+ * `no-store`, Cloudflare in front of `*.convex.site` caches it for paths with a
135
+ * static extension, so a missing file stays a cached 404 after it is uploaded.
136
+ */
137
+ export function errorResponse(status: number, body: string): Response {
138
+ return new Response(body, {
139
+ status,
140
+ headers: { "Content-Type": "text/plain", "Cache-Control": "no-store" },
141
+ });
142
+ }
143
+
132
144
  /**
133
145
  * Decode the URL pathname before looking it up in the asset table. A malformed
134
146
  * escape sequence is a bad request, not a missing static asset.