@absolutejs/absolute 0.19.0-beta.1073 → 0.19.0-beta.1074

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.
@@ -204,6 +204,41 @@ var init_devRouteRegistrationCallsite = __esm(() => {
204
204
  pageHandlerWrappers = new WeakMap;
205
205
  });
206
206
 
207
+ // src/core/pageResponseCache.ts
208
+ import { createHash } from "crypto";
209
+ var STREAMING_PAGE_HEADER = "x-absolute-stream", HTML_CONTENT_TYPE = "text/html", streamingPageHeaders = (extra) => {
210
+ const headers = new Headers(extra);
211
+ headers.set("content-type", HTML_CONTENT_TYPE);
212
+ headers.set(STREAMING_PAGE_HEADER, "1");
213
+ return headers;
214
+ }, computeEtag = (html) => `W/"${createHash("sha1").update(html).digest("base64url")}"`, withPageCacheHeaders = async (response, request) => {
215
+ const contentType = response.headers.get("content-type") ?? "";
216
+ if (!contentType.includes(HTML_CONTENT_TYPE))
217
+ return response;
218
+ if (response.headers.get(STREAMING_PAGE_HEADER) === "1" || !response.body) {
219
+ response.headers.delete(STREAMING_PAGE_HEADER);
220
+ response.headers.set("cache-control", "no-cache");
221
+ return response;
222
+ }
223
+ const html = await response.text();
224
+ const etag = computeEtag(html);
225
+ if (request?.headers.get("if-none-match") === etag) {
226
+ return new Response(null, {
227
+ headers: { "cache-control": "no-cache", etag },
228
+ status: 304
229
+ });
230
+ }
231
+ const headers = new Headers(response.headers);
232
+ headers.set("cache-control", "no-cache");
233
+ headers.set("etag", etag);
234
+ return new Response(html, {
235
+ headers,
236
+ status: response.status,
237
+ statusText: response.statusText
238
+ });
239
+ };
240
+ var init_pageResponseCache = () => {};
241
+
207
242
  // src/client/streamSwap.ts
208
243
  var streamSwapRuntime = () => {
209
244
  const absoluteWindow = window;
@@ -1663,9 +1698,11 @@ var setCurrentIslandManifest = (manifest) => {
1663
1698
 
1664
1699
  // src/vue/pageHandler.ts
1665
1700
  init_devRouteRegistrationCallsite();
1701
+ init_pageResponseCache();
1666
1702
 
1667
1703
  // src/core/responseEnhancers.ts
1668
1704
  init_streamingSlots();
1705
+ init_pageResponseCache();
1669
1706
  var toResponse = async (responseLike) => responseLike;
1670
1707
  var cloneHeaders = (response) => {
1671
1708
  const headers = new Headers(response.headers);
@@ -1689,8 +1726,10 @@ var enhanceHtmlResponseWithStreamingSlots = (response, {
1689
1726
  runtimePlacement,
1690
1727
  runtimePreludeScript
1691
1728
  });
1729
+ const headers = cloneHeaders(response);
1730
+ headers.set(STREAMING_PAGE_HEADER, "1");
1692
1731
  return new Response(body, {
1693
- headers: cloneHeaders(response),
1732
+ headers,
1694
1733
  status: response.status,
1695
1734
  statusText: response.statusText
1696
1735
  });
@@ -2225,20 +2264,22 @@ var handleVuePageRequest = async (input) => {
2225
2264
  hasIslands: resolvedPage.hasIslands
2226
2265
  });
2227
2266
  return new Response(htmlStream, {
2228
- headers: { "Content-Type": "text/html" }
2267
+ headers: streamingPageHeaders()
2229
2268
  });
2230
2269
  };
2231
- return await runWithStreamingSlotWarningScope(() => resolvedOptions?.collectStreamingSlots === true ? withRegisteredStreamingSlots(renderPageResponse, resolvedOptions) : renderPageResponse(), { handlerCallsite });
2270
+ const pageResponse = await runWithStreamingSlotWarningScope(() => resolvedOptions?.collectStreamingSlots === true ? withRegisteredStreamingSlots(renderPageResponse, resolvedOptions) : renderPageResponse(), { handlerCallsite });
2271
+ return withPageCacheHeaders(pageResponse, input.request);
2232
2272
  } catch (error) {
2233
2273
  console.error("[SSR] Vue render error:", error);
2234
2274
  const pageName = derivePageName(resolvedPagePath);
2235
2275
  const conventionResponse = await renderConventionError("vue", pageName, error);
2236
- if (conventionResponse)
2237
- return conventionResponse;
2238
- return new Response(ssrErrorPage("vue", error), {
2276
+ if (conventionResponse) {
2277
+ return withPageCacheHeaders(conventionResponse, input.request);
2278
+ }
2279
+ return withPageCacheHeaders(new Response(ssrErrorPage("vue", error), {
2239
2280
  headers: { "Content-Type": "text/html" },
2240
2281
  status: 500
2241
- });
2282
+ }), input.request);
2242
2283
  }
2243
2284
  };
2244
2285
  // src/vue/routerRedirectProviders.ts
@@ -2263,5 +2304,5 @@ export {
2263
2304
  applyVueRouterRedirect
2264
2305
  };
2265
2306
 
2266
- //# debugId=DF370BFB52D534FE64756E2164756E21
2307
+ //# debugId=8E3E2F75CCC3FBB264756E2164756E21
2267
2308
  //# sourceMappingURL=server.js.map