@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;
@@ -3683,9 +3720,11 @@ var setCurrentIslandManifest = (manifest) => {
3683
3720
 
3684
3721
  // src/svelte/pageHandler.ts
3685
3722
  init_devRouteRegistrationCallsite();
3723
+ init_pageResponseCache();
3686
3724
 
3687
3725
  // src/core/responseEnhancers.ts
3688
3726
  init_streamingSlots();
3727
+ init_pageResponseCache();
3689
3728
  var toResponse = async (responseLike) => responseLike;
3690
3729
  var cloneHeaders = (response) => {
3691
3730
  const headers = new Headers(response.headers);
@@ -3709,8 +3748,10 @@ var enhanceHtmlResponseWithStreamingSlots = (response, {
3709
3748
  runtimePlacement,
3710
3749
  runtimePreludeScript
3711
3750
  });
3751
+ const headers = cloneHeaders(response);
3752
+ headers.set(STREAMING_PAGE_HEADER, "1");
3712
3753
  return new Response(body, {
3713
- headers: cloneHeaders(response),
3754
+ headers,
3714
3755
  status: response.status,
3715
3756
  statusText: response.statusText
3716
3757
  });
@@ -4208,23 +4249,27 @@ var handleSveltePageRequest = async (input) => {
4208
4249
  });
4209
4250
  const { firstChunk, reader } = await primeSvelteStream(htmlStream);
4210
4251
  return new Response(restorePrimedStream(firstChunk, reader), {
4211
- headers: { "Content-Type": "text/html" }
4252
+ headers: streamingPageHeaders()
4212
4253
  });
4213
4254
  };
4214
- return await runWithStreamingSlotWarningScope(() => resolvedOptions?.collectStreamingSlots === true ? withRegisteredStreamingSlots(renderPageResponse, {
4255
+ const pageResponse = await runWithStreamingSlotWarningScope(() => resolvedOptions?.collectStreamingSlots === true ? withRegisteredStreamingSlots(renderPageResponse, {
4215
4256
  ...resolvedOptions,
4216
4257
  runtimePlacement: resolvedOptions.runtimePlacement ?? "body"
4217
4258
  }) : renderPageResponse(), { handlerCallsite });
4259
+ return withPageCacheHeaders(pageResponse, input.request, {
4260
+ bufferStreamForEtag: input.bufferStreamForEtag
4261
+ });
4218
4262
  } catch (error) {
4219
4263
  console.error("[SSR] Svelte render error:", error);
4220
4264
  const pageName = derivePageName(resolvedPagePath);
4221
4265
  const conventionResponse = await renderConventionError("svelte", pageName, error);
4222
- if (conventionResponse)
4223
- return conventionResponse;
4224
- return new Response(ssrErrorPage("svelte", error), {
4266
+ if (conventionResponse) {
4267
+ return withPageCacheHeaders(conventionResponse, input.request);
4268
+ }
4269
+ return withPageCacheHeaders(new Response(ssrErrorPage("svelte", error), {
4225
4270
  headers: { "Content-Type": "text/html" },
4226
4271
  status: 500
4227
- });
4272
+ }), input.request);
4228
4273
  }
4229
4274
  };
4230
4275
  // src/svelte/createIsland.ts
@@ -4368,5 +4413,5 @@ export {
4368
4413
  createTypedIsland
4369
4414
  };
4370
4415
 
4371
- //# debugId=49F155C14E8657C764756E2164756E21
4416
+ //# debugId=30411E4A4C5EB56264756E2164756E21
4372
4417
  //# sourceMappingURL=index.js.map