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

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.
@@ -1169,6 +1169,43 @@ var init_devRouteRegistrationCallsite = __esm(() => {
1169
1169
  pageHandlerWrappers = new WeakMap;
1170
1170
  });
1171
1171
 
1172
+ // src/core/pageResponseCache.ts
1173
+ import { createHash as createHash2 } from "crypto";
1174
+ var STREAMING_PAGE_HEADER = "x-absolute-stream", HTML_CONTENT_TYPE = "text/html", streamingPageHeaders = (extra) => {
1175
+ const headers = new Headers(extra);
1176
+ headers.set("content-type", HTML_CONTENT_TYPE);
1177
+ headers.set(STREAMING_PAGE_HEADER, "1");
1178
+ return headers;
1179
+ }, computeEtag = (html) => `W/"${createHash2("sha1").update(html).digest("base64url")}"`, withPageCacheHeaders = async (response, request, options) => {
1180
+ const contentType = response.headers.get("content-type") ?? "";
1181
+ if (!contentType.includes(HTML_CONTENT_TYPE))
1182
+ return response;
1183
+ const isStreaming = response.headers.get(STREAMING_PAGE_HEADER) === "1";
1184
+ if (isStreaming && !options?.bufferStreamForEtag || !response.body) {
1185
+ response.headers.delete(STREAMING_PAGE_HEADER);
1186
+ response.headers.set("cache-control", "no-cache");
1187
+ return response;
1188
+ }
1189
+ const html = await response.text();
1190
+ const etag = computeEtag(html);
1191
+ if (request?.headers.get("if-none-match") === etag) {
1192
+ return new Response(null, {
1193
+ headers: { "cache-control": "no-cache", etag },
1194
+ status: 304
1195
+ });
1196
+ }
1197
+ const headers = new Headers(response.headers);
1198
+ headers.delete(STREAMING_PAGE_HEADER);
1199
+ headers.set("cache-control", "no-cache");
1200
+ headers.set("etag", etag);
1201
+ return new Response(html, {
1202
+ headers,
1203
+ status: response.status,
1204
+ statusText: response.statusText
1205
+ });
1206
+ };
1207
+ var init_pageResponseCache = () => {};
1208
+
1172
1209
  // src/client/streamSwap.ts
1173
1210
  var streamSwapRuntime = () => {
1174
1211
  const absoluteWindow = window;
@@ -2445,9 +2482,11 @@ var setCurrentIslandManifest = (manifest) => {
2445
2482
 
2446
2483
  // src/svelte/pageHandler.ts
2447
2484
  init_devRouteRegistrationCallsite();
2485
+ init_pageResponseCache();
2448
2486
 
2449
2487
  // src/core/responseEnhancers.ts
2450
2488
  init_streamingSlots();
2489
+ init_pageResponseCache();
2451
2490
  var toResponse = async (responseLike) => responseLike;
2452
2491
  var cloneHeaders = (response) => {
2453
2492
  const headers = new Headers(response.headers);
@@ -2471,8 +2510,10 @@ var enhanceHtmlResponseWithStreamingSlots = (response, {
2471
2510
  runtimePlacement,
2472
2511
  runtimePreludeScript
2473
2512
  });
2513
+ const headers = cloneHeaders(response);
2514
+ headers.set(STREAMING_PAGE_HEADER, "1");
2474
2515
  return new Response(body, {
2475
- headers: cloneHeaders(response),
2516
+ headers,
2476
2517
  status: response.status,
2477
2518
  statusText: response.statusText
2478
2519
  });
@@ -2970,28 +3011,32 @@ var handleSveltePageRequest = async (input) => {
2970
3011
  });
2971
3012
  const { firstChunk, reader } = await primeSvelteStream(htmlStream);
2972
3013
  return new Response(restorePrimedStream(firstChunk, reader), {
2973
- headers: { "Content-Type": "text/html" }
3014
+ headers: streamingPageHeaders()
2974
3015
  });
2975
3016
  };
2976
- return await runWithStreamingSlotWarningScope(() => resolvedOptions?.collectStreamingSlots === true ? withRegisteredStreamingSlots(renderPageResponse, {
3017
+ const pageResponse = await runWithStreamingSlotWarningScope(() => resolvedOptions?.collectStreamingSlots === true ? withRegisteredStreamingSlots(renderPageResponse, {
2977
3018
  ...resolvedOptions,
2978
3019
  runtimePlacement: resolvedOptions.runtimePlacement ?? "body"
2979
3020
  }) : renderPageResponse(), { handlerCallsite });
3021
+ return withPageCacheHeaders(pageResponse, input.request, {
3022
+ bufferStreamForEtag: input.bufferStreamForEtag
3023
+ });
2980
3024
  } catch (error) {
2981
3025
  console.error("[SSR] Svelte render error:", error);
2982
3026
  const pageName = derivePageName(resolvedPagePath);
2983
3027
  const conventionResponse = await renderConventionError("svelte", pageName, error);
2984
- if (conventionResponse)
2985
- return conventionResponse;
2986
- return new Response(ssrErrorPage("svelte", error), {
3028
+ if (conventionResponse) {
3029
+ return withPageCacheHeaders(conventionResponse, input.request);
3030
+ }
3031
+ return withPageCacheHeaders(new Response(ssrErrorPage("svelte", error), {
2987
3032
  headers: { "Content-Type": "text/html" },
2988
3033
  status: 500
2989
- });
3034
+ }), input.request);
2990
3035
  }
2991
3036
  };
2992
3037
  export {
2993
3038
  handleSveltePageRequest
2994
3039
  };
2995
3040
 
2996
- //# debugId=083EA2E0556F07AE64756E2164756E21
3041
+ //# debugId=B672727CA49AF52C64756E2164756E21
2997
3042
  //# sourceMappingURL=server.js.map