@absolutejs/absolute 0.19.0-beta.1072 → 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.
Files changed (39) hide show
  1. package/dist/angular/browser.js +2 -2
  2. package/dist/angular/browser.js.map +3 -3
  3. package/dist/angular/components/constants.js +10 -0
  4. package/dist/angular/components/core/streamingSlotRegistrar.js +1 -1
  5. package/dist/angular/components/core/streamingSlotRegistry.js +2 -2
  6. package/dist/angular/index.js +51 -8
  7. package/dist/angular/index.js.map +7 -6
  8. package/dist/angular/server.js +51 -8
  9. package/dist/angular/server.js.map +7 -6
  10. package/dist/build.js +44 -7
  11. package/dist/build.js.map +6 -5
  12. package/dist/cli/config/server.js +49 -7
  13. package/dist/cli/index.js +15 -2
  14. package/dist/index.js +62 -12
  15. package/dist/index.js.map +9 -8
  16. package/dist/islands/index.js +2 -2
  17. package/dist/islands/index.js.map +3 -3
  18. package/dist/react/components/index.js +2 -2
  19. package/dist/react/components/index.js.map +3 -3
  20. package/dist/react/index.js +52 -11
  21. package/dist/react/index.js.map +7 -6
  22. package/dist/react/server.js +50 -9
  23. package/dist/react/server.js.map +7 -6
  24. package/dist/src/angular/components/constants.d.ts +1 -0
  25. package/dist/src/constants.d.ts +1 -0
  26. package/dist/src/core/pageResponseCache.d.ts +9 -0
  27. package/dist/svelte/index.js +50 -9
  28. package/dist/svelte/index.js.map +7 -6
  29. package/dist/svelte/server.js +50 -9
  30. package/dist/svelte/server.js.map +7 -6
  31. package/dist/vue/components/Image.js +2 -2
  32. package/dist/vue/components/Image.js.map +3 -3
  33. package/dist/vue/components/index.js +2 -2
  34. package/dist/vue/components/index.js.map +3 -3
  35. package/dist/vue/index.js +52 -11
  36. package/dist/vue/index.js.map +7 -6
  37. package/dist/vue/server.js +50 -9
  38. package/dist/vue/server.js.map +7 -6
  39. package/package.json +5 -1
@@ -37362,6 +37362,44 @@ var getRouteCallsiteStorage = () => {
37362
37362
  };
37363
37363
  var getCurrentRouteRegistrationCallsite = () => getRouteCallsiteStorage()?.getStore()?.callsite;
37364
37364
 
37365
+ // src/core/pageResponseCache.ts
37366
+ import { createHash } from "crypto";
37367
+ var STREAMING_PAGE_HEADER = "x-absolute-stream";
37368
+ var HTML_CONTENT_TYPE = "text/html";
37369
+ var streamingPageHeaders = (extra) => {
37370
+ const headers = new Headers(extra);
37371
+ headers.set("content-type", HTML_CONTENT_TYPE);
37372
+ headers.set(STREAMING_PAGE_HEADER, "1");
37373
+ return headers;
37374
+ };
37375
+ var computeEtag = (html) => `W/"${createHash("sha1").update(html).digest("base64url")}"`;
37376
+ var withPageCacheHeaders = async (response, request) => {
37377
+ const contentType = response.headers.get("content-type") ?? "";
37378
+ if (!contentType.includes(HTML_CONTENT_TYPE))
37379
+ return response;
37380
+ if (response.headers.get(STREAMING_PAGE_HEADER) === "1" || !response.body) {
37381
+ response.headers.delete(STREAMING_PAGE_HEADER);
37382
+ response.headers.set("cache-control", "no-cache");
37383
+ return response;
37384
+ }
37385
+ const html = await response.text();
37386
+ const etag = computeEtag(html);
37387
+ if (request?.headers.get("if-none-match") === etag) {
37388
+ return new Response(null, {
37389
+ headers: { "cache-control": "no-cache", etag },
37390
+ status: 304
37391
+ });
37392
+ }
37393
+ const headers = new Headers(response.headers);
37394
+ headers.set("cache-control", "no-cache");
37395
+ headers.set("etag", etag);
37396
+ return new Response(html, {
37397
+ headers,
37398
+ status: response.status,
37399
+ statusText: response.statusText
37400
+ });
37401
+ };
37402
+
37365
37403
  // src/client/streamSwap.ts
37366
37404
  var streamSwapRuntime = () => {
37367
37405
  const absoluteWindow = window;
@@ -38095,8 +38133,10 @@ var enhanceHtmlResponseWithStreamingSlots = (response, {
38095
38133
  runtimePlacement,
38096
38134
  runtimePreludeScript
38097
38135
  });
38136
+ const headers = cloneHeaders(response);
38137
+ headers.set(STREAMING_PAGE_HEADER, "1");
38098
38138
  return new Response(body, {
38099
- headers: cloneHeaders(response),
38139
+ headers,
38100
38140
  status: response.status,
38101
38141
  statusText: response.statusText
38102
38142
  });
@@ -38565,19 +38605,21 @@ var handleReactPageRequest = async (input) => {
38565
38605
  });
38566
38606
  }
38567
38607
  return new Response(htmlStream, {
38568
- headers: { "Content-Type": "text/html" }
38608
+ headers: streamingPageHeaders()
38569
38609
  });
38570
38610
  };
38571
- return await runWithStreamingSlotWarningScope(() => options?.collectStreamingSlots === true ? withRegisteredStreamingSlots(renderPageResponse, options) : renderPageResponse(), { handlerCallsite });
38611
+ const pageResponse = await runWithStreamingSlotWarningScope(() => options?.collectStreamingSlots === true ? withRegisteredStreamingSlots(renderPageResponse, options) : renderPageResponse(), { handlerCallsite });
38612
+ return withPageCacheHeaders(pageResponse, input.request);
38572
38613
  } catch (error) {
38573
38614
  console.error("[SSR] React render error:", error);
38574
38615
  const conventionResponse = await renderConventionError("react", pageName, error);
38575
- if (conventionResponse)
38576
- return conventionResponse;
38577
- return new Response(ssrErrorPage("react", error), {
38616
+ if (conventionResponse) {
38617
+ return withPageCacheHeaders(conventionResponse, input.request);
38618
+ }
38619
+ return withPageCacheHeaders(new Response(ssrErrorPage("react", error), {
38578
38620
  headers: { "Content-Type": "text/html" },
38579
38621
  status: 500
38580
- });
38622
+ }), input.request);
38581
38623
  }
38582
38624
  };
38583
38625
 
package/dist/cli/index.js CHANGED
@@ -48,7 +48,7 @@ var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
48
48
  var __require = import.meta.require;
49
49
 
50
50
  // src/constants.ts
51
- var ANSI_ESCAPE_CODE = 27, ANSI_ESCAPE_LENGTH = 3, ASCII_SPACE = 32, BASE_36_RADIX = 36, BYTES_PER_KILOBYTE = 1024, CLI_ARGS_OFFSET = 3, DEFAULT_PORT = 3000, EXCLUDE_LAST_OFFSET = -1, HTTP_STATUS_OK = 200, HOURS_IN_DAY = 24, HOURS_IN_HALF_DAY = 12, INSTANCE_PROBE_TIMEOUT_MS = 250, MAX_ERROR_LENGTH = 200, MILLISECONDS_IN_A_SECOND = 1000, MINUTES_IN_AN_HOUR = 60, SECONDS_IN_A_MINUTE = 60, MILLISECONDS_IN_A_MINUTE, MILLISECONDS_IN_A_DAY, LIST_LOG_TAIL_MAX_BYTES = 65536, LIST_TUI_COLUMN_GAP = 2, LIST_TUI_DEFAULT_HEIGHT = 28, LIST_TUI_DEFAULT_WIDTH = 100, LIST_TUI_ESCAPE_SEQUENCE_TIMEOUT_MS = 30, LIST_TUI_FOOTER_LINE_COUNT = 2, LIST_TUI_MARKER_WIDTH = 2, LIST_TUI_MIN_LOG_HEIGHT = 3, LIST_TUI_MIN_URL_WIDTH = 16, LIST_TUI_RENDER_DEBOUNCE_MS = 16, LIST_TUI_STATUS_MESSAGE_TIMEOUT_MS = 4000, LIST_WATCH_REFRESH_MS = 1000, SIGINT_EXIT_CODE = 130, SIGTERM_EXIT_CODE = 143, TIME_PRECISION = 2, TWO_THIRDS, UNFOUND_INDEX = -1, WORKSPACE_COMMAND_ARGS_OFFSET = 3, WORKSPACE_FAILURE_LOG_PRINT_LIMIT = 30, WORKSPACE_FAILURE_RECENT_LOG_LIMIT = 60, WORKSPACE_READY_ATTEMPT_TIMEOUT_MS = 5000, WORKSPACE_READY_PROBE_INTERVAL_MS = 250, WORKSPACE_READY_TIMEOUT_MS = 30000, WORKSPACE_SHUTDOWN_TIMEOUT_MS = 1e4, WORKSPACE_TUI_DEFAULT_HEIGHT = 28, WORKSPACE_TUI_DEFAULT_WIDTH = 100, WORKSPACE_TUI_ESCAPE_SEQUENCE_TIMEOUT_MS = 30, WORKSPACE_TUI_FOOTER_LINE_COUNT = 3, WORKSPACE_TUI_MIN_LOG_HEIGHT = 3, WORKSPACE_TUI_MIN_SERVICE_NAME_WIDTH = 7, WORKSPACE_TUI_MIN_TARGET_WIDTH = 8, WORKSPACE_TUI_MIN_WRAP_WIDTH = 12, WORKSPACE_TUI_PROMPT_CURSOR_OFFSET = 3, WORKSPACE_TUI_RECENT_LOG_LIMIT = 40, WORKSPACE_TUI_RENDER_DEBOUNCE_MS = 16, WORKSPACE_TUI_STATUS_WIDTH = 10, WORKSPACE_TUI_TARGET_PADDING_WIDTH = 6, WORKSPACE_TUI_VISIBILITY_WIDTH = 8;
51
+ var ANSI_ESCAPE_CODE = 27, ANSI_ESCAPE_LENGTH = 3, ASCII_SPACE = 32, BASE_36_RADIX = 36, BYTES_PER_KILOBYTE = 1024, CLI_ARGS_OFFSET = 3, DEFAULT_PORT = 3000, EXCLUDE_LAST_OFFSET = -1, HTTP_STATUS_OK = 200, HOURS_IN_DAY = 24, HOURS_IN_HALF_DAY = 12, INSTANCE_PROBE_TIMEOUT_MS = 250, MAX_ERROR_LENGTH = 200, MILLISECONDS_IN_A_SECOND = 1000, MINUTES_IN_AN_HOUR = 60, SECONDS_IN_A_MINUTE = 60, MILLISECONDS_IN_A_MINUTE, MILLISECONDS_IN_A_DAY, LIST_LOG_TAIL_MAX_BYTES = 65536, LIST_TUI_COLUMN_GAP = 2, LIST_TUI_DEFAULT_HEIGHT = 28, LIST_TUI_DEFAULT_WIDTH = 100, LIST_TUI_ESCAPE_SEQUENCE_TIMEOUT_MS = 30, LIST_TUI_FOOTER_LINE_COUNT = 2, LIST_TUI_MARKER_WIDTH = 2, LIST_TUI_MIN_LOG_HEIGHT = 3, LIST_TUI_MIN_URL_WIDTH = 16, LIST_TUI_RENDER_DEBOUNCE_MS = 16, LIST_TUI_STATUS_MESSAGE_TIMEOUT_MS = 4000, LIST_WATCH_REFRESH_MS = 1000, SIGINT_EXIT_CODE = 130, SIGTERM_EXIT_CODE = 143, TIME_PRECISION = 2, TWO_THIRDS, UNFOUND_INDEX = -1, DEFAULT_WEBSOCKET_IDLE_TIMEOUT_SECONDS = 240, WORKSPACE_COMMAND_ARGS_OFFSET = 3, WORKSPACE_FAILURE_LOG_PRINT_LIMIT = 30, WORKSPACE_FAILURE_RECENT_LOG_LIMIT = 60, WORKSPACE_READY_ATTEMPT_TIMEOUT_MS = 5000, WORKSPACE_READY_PROBE_INTERVAL_MS = 250, WORKSPACE_READY_TIMEOUT_MS = 30000, WORKSPACE_SHUTDOWN_TIMEOUT_MS = 1e4, WORKSPACE_TUI_DEFAULT_HEIGHT = 28, WORKSPACE_TUI_DEFAULT_WIDTH = 100, WORKSPACE_TUI_ESCAPE_SEQUENCE_TIMEOUT_MS = 30, WORKSPACE_TUI_FOOTER_LINE_COUNT = 3, WORKSPACE_TUI_MIN_LOG_HEIGHT = 3, WORKSPACE_TUI_MIN_SERVICE_NAME_WIDTH = 7, WORKSPACE_TUI_MIN_TARGET_WIDTH = 8, WORKSPACE_TUI_MIN_WRAP_WIDTH = 12, WORKSPACE_TUI_PROMPT_CURSOR_OFFSET = 3, WORKSPACE_TUI_RECENT_LOG_LIMIT = 40, WORKSPACE_TUI_RENDER_DEBOUNCE_MS = 16, WORKSPACE_TUI_STATUS_WIDTH = 10, WORKSPACE_TUI_TARGET_PADDING_WIDTH = 6, WORKSPACE_TUI_VISIBILITY_WIDTH = 8;
52
52
  var init_constants = __esm(() => {
53
53
  MILLISECONDS_IN_A_MINUTE = MILLISECONDS_IN_A_SECOND * SECONDS_IN_A_MINUTE;
54
54
  MILLISECONDS_IN_A_DAY = MILLISECONDS_IN_A_SECOND * SECONDS_IN_A_MINUTE * MINUTES_IN_AN_HOUR * HOURS_IN_DAY;
@@ -177314,7 +177314,20 @@ const server = Bun.serve({
177314
177314
  // Registering Elysia's WebSocket dispatcher here (plus assigning app.server in
177315
177315
  // resolveRuntimeFetch) is what makes .ws() routes work in a compiled server \u2014
177316
177316
  // without it, every upgrade request falls through to the 404 below.
177317
- websocket: elysiaWebsocket,
177317
+ //
177318
+ // idleTimeout + sendPings keep long-lived sockets (voice intake, referee,
177319
+ // realtime sync) alive through greeting playback / silent listening. The
177320
+ // compiled runtime builds its own Bun.serve and never reads the app's
177321
+ // config.websocket, so without these a quiet caller was killed at Bun's small
177322
+ // fallback (~60s) with INACTIVE_CLIENT. sendPings (Bun default, explicit here)
177323
+ // is protocol-level keepalive the browser answers without JS \u2014 so a throttled
177324
+ // background tab still responds. elysiaWebsocket has no idleTimeout/sendPings,
177325
+ // so spreading it last keeps the dispatcher without clobbering these.
177326
+ websocket: {
177327
+ idleTimeout: ${DEFAULT_WEBSOCKET_IDLE_TIMEOUT_SECONDS},
177328
+ sendPings: true,
177329
+ ...elysiaWebsocket
177330
+ },
177318
177331
  async fetch(request) {
177319
177332
  const url = new URL(request.url);
177320
177333
 
package/dist/index.js CHANGED
@@ -5921,7 +5921,7 @@ var init_compileTailwind = __esm(() => {
5921
5921
  });
5922
5922
 
5923
5923
  // src/constants.ts
5924
- var ANGULAR_INIT_TIMEOUT_MS = 500, ANSI_ESCAPE_CODE = 27, ANSI_ESCAPE_LENGTH = 3, ASCII_SPACE = 32, BASE_36_RADIX = 36, BUN_BUILD_WARNING_SUPPRESSION = "wildcard sideEffects are not supported yet", TAILWIND_BUN_CSS_WARNING_PATTERN, BODY_SLICE_LENGTH = 2000, BYTES_PER_KILOBYTE = 1024, CLI_ARGS_OFFSET = 3, CSS_ERROR_RESOLVE_DELAY_MS = 50, CSS_MAX_CHECK_ATTEMPTS = 10, CSS_MAX_PARSE_TIMEOUT_MS = 500, CSS_SHEET_READY_TIMEOUT_MS = 100, DEFAULT_CHUNK_SIZE = 16384, DEFAULT_DEBOUNCE_MS = 15, DEFAULT_PORT = 3000, DEV_SERVER_RESTART_DEBOUNCE_MS = 100, DOM_UPDATE_DELAY_MS = 50, FILE_PROTOCOL_PREFIX_LENGTH = 7, FOCUS_ID_PREFIX_LENGTH = 3, FOCUS_IDX_PREFIX_LENGTH = 4, FOCUS_NAME_PREFIX_LENGTH = 5, ESLINT_STUDIO_DEFAULT_HOST = "eslint.absolute.localhost", ESLINT_STUDIO_DEFAULT_PORT = 4099, CONFIG_DEFAULT_HOST = "config.absolute.localhost", CONFIG_DEFAULT_PORT = 4099, HMR_UPDATE_TIMEOUT_MS = 2000, HOOK_SIGNATURE_LENGTH = 12, EXCLUDE_LAST_OFFSET = -1, HTTP_STATUS_OK = 200, HTTP_STATUS_BAD_REQUEST = 400, HTTP_STATUS_NOT_FOUND = 404, HOURS_IN_DAY = 24, HOURS_IN_HALF_DAY = 12, IMAGE_DEFAULT_DEVICE_SIZES, IMAGE_DEFAULT_IMAGE_SIZES, IMAGE_DEFAULT_QUALITY = 75, IMAGE_GLOB_SUFFIX_LENGTH = 2, INSTANCE_PROBE_TIMEOUT_MS = 250, MAX_ERROR_LENGTH = 200, MAX_RECONNECT_ATTEMPTS = 60, MILLISECONDS_IN_A_SECOND = 1000, MINUTES_IN_AN_HOUR = 60, SECONDS_IN_A_MINUTE = 60, MILLISECONDS_IN_A_MINUTE, MILLISECONDS_IN_A_DAY, OVERLAY_FADE_DURATION_MS = 150, PING_INTERVAL_MS = 30000, LIST_LOG_TAIL_MAX_BYTES = 65536, LIST_TUI_COLUMN_GAP = 2, LIST_TUI_DEFAULT_HEIGHT = 28, LIST_TUI_DEFAULT_WIDTH = 100, LIST_TUI_ESCAPE_SEQUENCE_TIMEOUT_MS = 30, LIST_TUI_FOOTER_LINE_COUNT = 2, LIST_TUI_MARKER_WIDTH = 2, LIST_TUI_MIN_LOG_HEIGHT = 3, LIST_TUI_MIN_URL_WIDTH = 16, LIST_TUI_RENDER_DEBOUNCE_MS = 16, LIST_TUI_STATUS_MESSAGE_TIMEOUT_MS = 4000, LIST_WATCH_REFRESH_MS = 1000, RAF_BATCH_COUNT = 3, RANDOM_ID_END_INDEX = 11, REBUILD_BATCH_DELAY_MS = 10, REBUILD_RELOAD_DELAY_MS = 200, RECONNECT_INITIAL_DELAY_MS = 500, RECONNECT_POLL_INTERVAL_MS = 300, REACT_STREAM_SLOT_FAST_DELAY_MS = 5, REACT_STREAM_SLOT_SLOW_DELAY_MS = 20, SIGINT_EXIT_CODE = 130, SIGTERM_EXIT_CODE = 143, SVELTE_CSS_LOAD_TIMEOUT_MS = 500, TIME_PRECISION = 2, TWO_THIRDS, UNFOUND_INDEX = -1, WEBSOCKET_NORMAL_CLOSURE = 1000, WORKSPACE_COMMAND_ARGS_OFFSET = 3, WORKSPACE_FAILURE_LOG_PRINT_LIMIT = 30, WORKSPACE_FAILURE_RECENT_LOG_LIMIT = 60, WORKSPACE_READY_ATTEMPT_TIMEOUT_MS = 5000, WORKSPACE_READY_PROBE_INTERVAL_MS = 250, WORKSPACE_READY_TIMEOUT_MS = 30000, WORKSPACE_SHUTDOWN_TIMEOUT_MS = 1e4, WORKSPACE_TUI_DEFAULT_HEIGHT = 28, WORKSPACE_TUI_DEFAULT_WIDTH = 100, WORKSPACE_TUI_ESCAPE_SEQUENCE_TIMEOUT_MS = 30, WORKSPACE_TUI_FOOTER_LINE_COUNT = 3, WORKSPACE_TUI_MIN_LOG_HEIGHT = 3, WORKSPACE_TUI_MIN_SERVICE_NAME_WIDTH = 7, WORKSPACE_TUI_MIN_TARGET_WIDTH = 8, WORKSPACE_TUI_MIN_WRAP_WIDTH = 12, WORKSPACE_TUI_PROMPT_CURSOR_OFFSET = 3, WORKSPACE_TUI_RECENT_LOG_LIMIT = 40, WORKSPACE_TUI_RENDER_DEBOUNCE_MS = 16, WORKSPACE_TUI_STATUS_WIDTH = 10, WORKSPACE_TUI_TARGET_PADDING_WIDTH = 6, WORKSPACE_TUI_VISIBILITY_WIDTH = 8;
5924
+ var ANGULAR_INIT_TIMEOUT_MS = 500, ANSI_ESCAPE_CODE = 27, ANSI_ESCAPE_LENGTH = 3, ASCII_SPACE = 32, BASE_36_RADIX = 36, BUN_BUILD_WARNING_SUPPRESSION = "wildcard sideEffects are not supported yet", TAILWIND_BUN_CSS_WARNING_PATTERN, BODY_SLICE_LENGTH = 2000, BYTES_PER_KILOBYTE = 1024, CLI_ARGS_OFFSET = 3, CSS_ERROR_RESOLVE_DELAY_MS = 50, CSS_MAX_CHECK_ATTEMPTS = 10, CSS_MAX_PARSE_TIMEOUT_MS = 500, CSS_SHEET_READY_TIMEOUT_MS = 100, DEFAULT_CHUNK_SIZE = 16384, DEFAULT_DEBOUNCE_MS = 15, DEFAULT_PORT = 3000, DEV_SERVER_RESTART_DEBOUNCE_MS = 100, DOM_UPDATE_DELAY_MS = 50, FILE_PROTOCOL_PREFIX_LENGTH = 7, FOCUS_ID_PREFIX_LENGTH = 3, FOCUS_IDX_PREFIX_LENGTH = 4, FOCUS_NAME_PREFIX_LENGTH = 5, ESLINT_STUDIO_DEFAULT_HOST = "eslint.absolute.localhost", ESLINT_STUDIO_DEFAULT_PORT = 4099, CONFIG_DEFAULT_HOST = "config.absolute.localhost", CONFIG_DEFAULT_PORT = 4099, HMR_UPDATE_TIMEOUT_MS = 2000, HOOK_SIGNATURE_LENGTH = 12, EXCLUDE_LAST_OFFSET = -1, HTTP_STATUS_OK = 200, HTTP_STATUS_BAD_REQUEST = 400, HTTP_STATUS_NOT_FOUND = 404, HOURS_IN_DAY = 24, HOURS_IN_HALF_DAY = 12, IMAGE_DEFAULT_DEVICE_SIZES, IMAGE_DEFAULT_IMAGE_SIZES, IMAGE_DEFAULT_QUALITY = 75, IMAGE_GLOB_SUFFIX_LENGTH = 2, INSTANCE_PROBE_TIMEOUT_MS = 250, MAX_ERROR_LENGTH = 200, MAX_RECONNECT_ATTEMPTS = 60, MILLISECONDS_IN_A_SECOND = 1000, MINUTES_IN_AN_HOUR = 60, SECONDS_IN_A_MINUTE = 60, MILLISECONDS_IN_A_MINUTE, MILLISECONDS_IN_A_DAY, OVERLAY_FADE_DURATION_MS = 150, PING_INTERVAL_MS = 30000, LIST_LOG_TAIL_MAX_BYTES = 65536, LIST_TUI_COLUMN_GAP = 2, LIST_TUI_DEFAULT_HEIGHT = 28, LIST_TUI_DEFAULT_WIDTH = 100, LIST_TUI_ESCAPE_SEQUENCE_TIMEOUT_MS = 30, LIST_TUI_FOOTER_LINE_COUNT = 2, LIST_TUI_MARKER_WIDTH = 2, LIST_TUI_MIN_LOG_HEIGHT = 3, LIST_TUI_MIN_URL_WIDTH = 16, LIST_TUI_RENDER_DEBOUNCE_MS = 16, LIST_TUI_STATUS_MESSAGE_TIMEOUT_MS = 4000, LIST_WATCH_REFRESH_MS = 1000, RAF_BATCH_COUNT = 3, RANDOM_ID_END_INDEX = 11, REBUILD_BATCH_DELAY_MS = 10, REBUILD_RELOAD_DELAY_MS = 200, RECONNECT_INITIAL_DELAY_MS = 500, RECONNECT_POLL_INTERVAL_MS = 300, REACT_STREAM_SLOT_FAST_DELAY_MS = 5, REACT_STREAM_SLOT_SLOW_DELAY_MS = 20, SIGINT_EXIT_CODE = 130, SIGTERM_EXIT_CODE = 143, SVELTE_CSS_LOAD_TIMEOUT_MS = 500, TIME_PRECISION = 2, TWO_THIRDS, UNFOUND_INDEX = -1, WEBSOCKET_NORMAL_CLOSURE = 1000, DEFAULT_WEBSOCKET_IDLE_TIMEOUT_SECONDS = 240, WORKSPACE_COMMAND_ARGS_OFFSET = 3, WORKSPACE_FAILURE_LOG_PRINT_LIMIT = 30, WORKSPACE_FAILURE_RECENT_LOG_LIMIT = 60, WORKSPACE_READY_ATTEMPT_TIMEOUT_MS = 5000, WORKSPACE_READY_PROBE_INTERVAL_MS = 250, WORKSPACE_READY_TIMEOUT_MS = 30000, WORKSPACE_SHUTDOWN_TIMEOUT_MS = 1e4, WORKSPACE_TUI_DEFAULT_HEIGHT = 28, WORKSPACE_TUI_DEFAULT_WIDTH = 100, WORKSPACE_TUI_ESCAPE_SEQUENCE_TIMEOUT_MS = 30, WORKSPACE_TUI_FOOTER_LINE_COUNT = 3, WORKSPACE_TUI_MIN_LOG_HEIGHT = 3, WORKSPACE_TUI_MIN_SERVICE_NAME_WIDTH = 7, WORKSPACE_TUI_MIN_TARGET_WIDTH = 8, WORKSPACE_TUI_MIN_WRAP_WIDTH = 12, WORKSPACE_TUI_PROMPT_CURSOR_OFFSET = 3, WORKSPACE_TUI_RECENT_LOG_LIMIT = 40, WORKSPACE_TUI_RENDER_DEBOUNCE_MS = 16, WORKSPACE_TUI_STATUS_WIDTH = 10, WORKSPACE_TUI_TARGET_PADDING_WIDTH = 6, WORKSPACE_TUI_VISIBILITY_WIDTH = 8;
5925
5925
  var init_constants = __esm(() => {
5926
5926
  TAILWIND_BUN_CSS_WARNING_PATTERN = /invalid @ rule encountered: '@(theme|tailwind|source|utility|variant|custom-variant|apply|reference|plugin|config)'/;
5927
5927
  IMAGE_DEFAULT_DEVICE_SIZES = [
@@ -8678,6 +8678,41 @@ var init_staticIslandPages = __esm(() => {
8678
8678
  HTMX_STREAM_SLOT_TAG_RE = /<abs-htmx-stream-slot\b([^>]*?)(?:\/>|>([\s\S]*?)<\/abs-htmx-stream-slot>)/gi;
8679
8679
  });
8680
8680
 
8681
+ // src/core/pageResponseCache.ts
8682
+ import { createHash as createHash3 } from "crypto";
8683
+ var STREAMING_PAGE_HEADER = "x-absolute-stream", HTML_CONTENT_TYPE = "text/html", streamingPageHeaders = (extra) => {
8684
+ const headers = new Headers(extra);
8685
+ headers.set("content-type", HTML_CONTENT_TYPE);
8686
+ headers.set(STREAMING_PAGE_HEADER, "1");
8687
+ return headers;
8688
+ }, computeEtag = (html) => `W/"${createHash3("sha1").update(html).digest("base64url")}"`, withPageCacheHeaders = async (response, request) => {
8689
+ const contentType = response.headers.get("content-type") ?? "";
8690
+ if (!contentType.includes(HTML_CONTENT_TYPE))
8691
+ return response;
8692
+ if (response.headers.get(STREAMING_PAGE_HEADER) === "1" || !response.body) {
8693
+ response.headers.delete(STREAMING_PAGE_HEADER);
8694
+ response.headers.set("cache-control", "no-cache");
8695
+ return response;
8696
+ }
8697
+ const html = await response.text();
8698
+ const etag = computeEtag(html);
8699
+ if (request?.headers.get("if-none-match") === etag) {
8700
+ return new Response(null, {
8701
+ headers: { "cache-control": "no-cache", etag },
8702
+ status: 304
8703
+ });
8704
+ }
8705
+ const headers = new Headers(response.headers);
8706
+ headers.set("cache-control", "no-cache");
8707
+ headers.set("etag", etag);
8708
+ return new Response(html, {
8709
+ headers,
8710
+ status: response.status,
8711
+ statusText: response.statusText
8712
+ });
8713
+ };
8714
+ var init_pageResponseCache = () => {};
8715
+
8681
8716
  // node_modules/@elysiajs/openapi/dist/index.mjs
8682
8717
  var exports_dist = {};
8683
8718
  __export(exports_dist, {
@@ -21379,7 +21414,7 @@ var devVendorPaths = null, getDevVendorPaths = () => devVendorPaths, setDevVendo
21379
21414
  // src/build/angularLinkerPlugin.ts
21380
21415
  import { existsSync as existsSync21, mkdirSync as mkdirSync5, readFileSync as readFileSync15, writeFileSync as writeFileSync6 } from "fs";
21381
21416
  import { dirname as dirname11, join as join23, relative as relative7, resolve as resolve17 } from "path";
21382
- import { createHash as createHash3 } from "crypto";
21417
+ import { createHash as createHash4 } from "crypto";
21383
21418
  var CACHE_ROOT, ANGULAR_LINKER_CANDIDATE_RE, createAngularLinkerPlugin = (linkerJitMode) => ({
21384
21419
  name: "angular-linker",
21385
21420
  setup(bld) {
@@ -21398,7 +21433,7 @@ var CACHE_ROOT, ANGULAR_LINKER_CANDIDATE_RE, createAngularLinkerPlugin = (linker
21398
21433
  if (!checkLink || !checkLink(args.path, source)) {
21399
21434
  return;
21400
21435
  }
21401
- const hash = createHash3("md5").update(source).digest("hex");
21436
+ const hash = createHash4("md5").update(source).digest("hex");
21402
21437
  const cachePath = join23(cacheDir, `${hash}.js`);
21403
21438
  if (existsSync21(cachePath)) {
21404
21439
  return {
@@ -34264,18 +34299,20 @@ var resolveRequestPathname = (request) => {
34264
34299
  }
34265
34300
  const innerHtml = bundle.renderToHTML(props ?? {});
34266
34301
  const html = buildHtmlShell(resolvedHeadTag, innerHtml.replace(/^<div>|<\/div>$/g, ""), indexPath, props);
34267
- return new Response(html, {
34302
+ return withPageCacheHeaders(new Response(html, {
34268
34303
  headers: { "Content-Type": "text/html" }
34269
- });
34304
+ }), input.request);
34270
34305
  } catch (error) {
34271
34306
  console.error("[SSR] Ember render error:", error);
34272
- return new Response(ssrErrorPage("ember", error), {
34307
+ return withPageCacheHeaders(new Response(ssrErrorPage("ember", error), {
34273
34308
  headers: { "Content-Type": "text/html" },
34274
34309
  status: 500
34275
- });
34310
+ }), input.request);
34276
34311
  }
34277
34312
  };
34278
- var init_pageHandler = () => {};
34313
+ var init_pageHandler = __esm(() => {
34314
+ init_pageResponseCache();
34315
+ });
34279
34316
 
34280
34317
  // src/ember/index.ts
34281
34318
  var exports_ember = {};
@@ -38965,10 +39002,12 @@ var setCurrentIslandManifest = (manifest) => {
38965
39002
  };
38966
39003
 
38967
39004
  // src/core/pageHandlers.ts
39005
+ init_pageResponseCache();
38968
39006
  init_staticStreaming();
38969
39007
 
38970
39008
  // src/core/responseEnhancers.ts
38971
39009
  init_streamingSlots();
39010
+ init_pageResponseCache();
38972
39011
  var toResponse = async (responseLike) => responseLike;
38973
39012
  var cloneHeaders = (response) => {
38974
39013
  const headers = new Headers(response.headers);
@@ -38992,8 +39031,10 @@ var enhanceHtmlResponseWithStreamingSlots = (response, {
38992
39031
  runtimePlacement,
38993
39032
  runtimePreludeScript
38994
39033
  });
39034
+ const headers = cloneHeaders(response);
39035
+ headers.set(STREAMING_PAGE_HEADER, "1");
38995
39036
  return new Response(body, {
38996
- headers: cloneHeaders(response),
39037
+ headers,
38997
39038
  status: response.status,
38998
39039
  statusText: response.statusText
38999
39040
  });
@@ -39020,12 +39061,12 @@ var withRegisteredStreamingSlots = async (renderResponse, options = {}) => {
39020
39061
  var handleStaticPageRequest = async (pagePath, options = {}, settings = {}) => {
39021
39062
  const html = await file(pagePath).text();
39022
39063
  const transformedHtml = await transformCurrentStaticPageHtml(html, settings);
39023
- return withStreamingSlots(new Response(injectIslandPageContext(transformedHtml), {
39064
+ return withPageCacheHeaders(await withStreamingSlots(new Response(injectIslandPageContext(transformedHtml), {
39024
39065
  headers: { "Content-Type": "text/html" }
39025
39066
  }), {
39026
39067
  ...options,
39027
39068
  streamingSlots: options.streamingSlots ?? []
39028
- });
39069
+ }));
39029
39070
  };
39030
39071
  var handleHTMLPageRequest = (pagePath, options) => {
39031
39072
  const htmlFile = file(pagePath);
@@ -40087,9 +40128,17 @@ var selfRegisterInstance = () => {
40087
40128
  startedAt: new Date().toISOString()
40088
40129
  });
40089
40130
  };
40131
+ var applyWebSocketKeepaliveDefaults = (app) => {
40132
+ app.config.websocket = {
40133
+ idleTimeout: DEFAULT_WEBSOCKET_IDLE_TIMEOUT_SECONDS,
40134
+ sendPings: true,
40135
+ ...app.config.websocket ?? {}
40136
+ };
40137
+ };
40090
40138
  var networking = (app) => {
40091
40139
  if (env4.ABSOLUTE_COMPILED_RUNTIME === "1")
40092
40140
  return app;
40141
+ applyWebSocketKeepaliveDefaults(app);
40093
40142
  if (env4.NODE_ENV === "development") {
40094
40143
  app.get("/__absolute/routes", () => app.routes.map((route) => ({
40095
40144
  method: route.method,
@@ -46641,6 +46690,7 @@ export {
46641
46690
  ESLINT_STUDIO_DEFAULT_HOST,
46642
46691
  DOM_UPDATE_DELAY_MS,
46643
46692
  DEV_SERVER_RESTART_DEBOUNCE_MS,
46693
+ DEFAULT_WEBSOCKET_IDLE_TIMEOUT_SECONDS,
46644
46694
  DEFAULT_PORT,
46645
46695
  DEFAULT_DEBOUNCE_MS,
46646
46696
  DEFAULT_CHUNK_SIZE,
@@ -46661,5 +46711,5 @@ export {
46661
46711
  ANGULAR_INIT_TIMEOUT_MS
46662
46712
  };
46663
46713
 
46664
- //# debugId=8A2CABA7603DDD1464756E2164756E21
46714
+ //# debugId=2D1E98E62AB63D3064756E2164756E21
46665
46715
  //# sourceMappingURL=index.js.map