@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.
package/dist/vue/index.js CHANGED
@@ -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;
@@ -2401,7 +2436,7 @@ __export(exports_stylePreprocessor, {
2401
2436
  compileStyleFileIfNeeded: () => compileStyleFileIfNeeded,
2402
2437
  addStyleImporter: () => addStyleImporter
2403
2438
  });
2404
- import { createHash } from "crypto";
2439
+ import { createHash as createHash2 } from "crypto";
2405
2440
  import { existsSync as existsSync6, readFileSync as readFileSync5 } from "fs";
2406
2441
  import { readFile as readFile2 } from "fs/promises";
2407
2442
  import { createRequire } from "module";
@@ -2734,7 +2769,7 @@ ${contents}` : contents, normalizePostcssModule = (mod) => {
2734
2769
  return importers;
2735
2770
  }, recordStyleOutput = (entry, css) => {
2736
2771
  const key = resolve6(entry);
2737
- const hash = createHash("sha1").update(css).digest("hex");
2772
+ const hash = createHash2("sha1").update(css).digest("hex");
2738
2773
  const previous = styleOutputHashes.get(key);
2739
2774
  styleOutputHashes.set(key, hash);
2740
2775
  return previous !== hash;
@@ -4283,9 +4318,11 @@ var setCurrentIslandManifest = (manifest) => {
4283
4318
 
4284
4319
  // src/vue/pageHandler.ts
4285
4320
  init_devRouteRegistrationCallsite();
4321
+ init_pageResponseCache();
4286
4322
 
4287
4323
  // src/core/responseEnhancers.ts
4288
4324
  init_streamingSlots();
4325
+ init_pageResponseCache();
4289
4326
  var toResponse = async (responseLike) => responseLike;
4290
4327
  var cloneHeaders = (response) => {
4291
4328
  const headers = new Headers(response.headers);
@@ -4309,8 +4346,10 @@ var enhanceHtmlResponseWithStreamingSlots = (response, {
4309
4346
  runtimePlacement,
4310
4347
  runtimePreludeScript
4311
4348
  });
4349
+ const headers = cloneHeaders(response);
4350
+ headers.set(STREAMING_PAGE_HEADER, "1");
4312
4351
  return new Response(body, {
4313
- headers: cloneHeaders(response),
4352
+ headers,
4314
4353
  status: response.status,
4315
4354
  statusText: response.statusText
4316
4355
  });
@@ -4845,20 +4884,22 @@ var handleVuePageRequest = async (input) => {
4845
4884
  hasIslands: resolvedPage.hasIslands
4846
4885
  });
4847
4886
  return new Response(htmlStream, {
4848
- headers: { "Content-Type": "text/html" }
4887
+ headers: streamingPageHeaders()
4849
4888
  });
4850
4889
  };
4851
- return await runWithStreamingSlotWarningScope(() => resolvedOptions?.collectStreamingSlots === true ? withRegisteredStreamingSlots(renderPageResponse, resolvedOptions) : renderPageResponse(), { handlerCallsite });
4890
+ const pageResponse = await runWithStreamingSlotWarningScope(() => resolvedOptions?.collectStreamingSlots === true ? withRegisteredStreamingSlots(renderPageResponse, resolvedOptions) : renderPageResponse(), { handlerCallsite });
4891
+ return withPageCacheHeaders(pageResponse, input.request);
4852
4892
  } catch (error) {
4853
4893
  console.error("[SSR] Vue render error:", error);
4854
4894
  const pageName = derivePageName(resolvedPagePath);
4855
4895
  const conventionResponse = await renderConventionError("vue", pageName, error);
4856
- if (conventionResponse)
4857
- return conventionResponse;
4858
- return new Response(ssrErrorPage("vue", error), {
4896
+ if (conventionResponse) {
4897
+ return withPageCacheHeaders(conventionResponse, input.request);
4898
+ }
4899
+ return withPageCacheHeaders(new Response(ssrErrorPage("vue", error), {
4859
4900
  headers: { "Content-Type": "text/html" },
4860
4901
  status: 500
4861
- });
4902
+ }), input.request);
4862
4903
  }
4863
4904
  };
4864
4905
  // src/vue/routerRedirectProviders.ts
@@ -5317,5 +5358,5 @@ export {
5317
5358
  Image
5318
5359
  };
5319
5360
 
5320
- //# debugId=36CE6B63A2D1DAFF64756E2164756E21
5361
+ //# debugId=9D8B3F3A3A19296464756E2164756E21
5321
5362
  //# sourceMappingURL=index.js.map