@timber-js/app 0.2.0-alpha.37 → 0.2.0-alpha.38

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 (56) hide show
  1. package/dist/adapters/nitro.d.ts.map +1 -1
  2. package/dist/adapters/nitro.js +27 -4
  3. package/dist/adapters/nitro.js.map +1 -1
  4. package/dist/cache/index.d.ts +5 -2
  5. package/dist/cache/index.d.ts.map +1 -1
  6. package/dist/cache/index.js +32 -8
  7. package/dist/cache/index.js.map +1 -1
  8. package/dist/cache/singleflight.d.ts +18 -1
  9. package/dist/cache/singleflight.d.ts.map +1 -1
  10. package/dist/cache/timber-cache.d.ts.map +1 -1
  11. package/dist/index.d.ts +12 -0
  12. package/dist/index.d.ts.map +1 -1
  13. package/dist/index.js +53 -4
  14. package/dist/index.js.map +1 -1
  15. package/dist/plugins/dev-error-overlay.d.ts +26 -1
  16. package/dist/plugins/dev-error-overlay.d.ts.map +1 -1
  17. package/dist/plugins/entries.d.ts.map +1 -1
  18. package/dist/server/html-injectors.d.ts +2 -2
  19. package/dist/server/html-injectors.d.ts.map +1 -1
  20. package/dist/server/index.d.ts +2 -0
  21. package/dist/server/index.d.ts.map +1 -1
  22. package/dist/server/index.js +27 -1
  23. package/dist/server/index.js.map +1 -1
  24. package/dist/server/node-stream-transforms.d.ts +13 -1
  25. package/dist/server/node-stream-transforms.d.ts.map +1 -1
  26. package/dist/server/render-timeout.d.ts +51 -0
  27. package/dist/server/render-timeout.d.ts.map +1 -0
  28. package/dist/server/rsc-entry/helpers.d.ts +46 -3
  29. package/dist/server/rsc-entry/helpers.d.ts.map +1 -1
  30. package/dist/server/rsc-entry/index.d.ts +6 -1
  31. package/dist/server/rsc-entry/index.d.ts.map +1 -1
  32. package/dist/server/rsc-entry/rsc-payload.d.ts.map +1 -1
  33. package/dist/server/rsc-entry/rsc-stream.d.ts +3 -0
  34. package/dist/server/rsc-entry/rsc-stream.d.ts.map +1 -1
  35. package/dist/server/ssr-entry.d.ts.map +1 -1
  36. package/dist/server/ssr-render.d.ts +2 -0
  37. package/dist/server/ssr-render.d.ts.map +1 -1
  38. package/package.json +1 -1
  39. package/src/adapters/nitro.ts +27 -4
  40. package/src/cache/index.ts +5 -2
  41. package/src/cache/singleflight.ts +54 -4
  42. package/src/cache/timber-cache.ts +17 -16
  43. package/src/index.ts +12 -0
  44. package/src/plugins/dev-error-overlay.ts +70 -1
  45. package/src/plugins/dev-server.ts +38 -4
  46. package/src/plugins/entries.ts +1 -0
  47. package/src/server/html-injectors.ts +32 -7
  48. package/src/server/index.ts +4 -0
  49. package/src/server/node-stream-transforms.ts +49 -13
  50. package/src/server/render-timeout.ts +108 -0
  51. package/src/server/rsc-entry/helpers.ts +122 -3
  52. package/src/server/rsc-entry/index.ts +34 -4
  53. package/src/server/rsc-entry/rsc-payload.ts +11 -3
  54. package/src/server/rsc-entry/rsc-stream.ts +24 -3
  55. package/src/server/ssr-entry.ts +9 -2
  56. package/src/server/ssr-render.ts +94 -13
package/dist/index.js CHANGED
@@ -11465,14 +11465,51 @@ function formatTerminalError(error, phase, projectRoot) {
11465
11465
  return lines.join("\n");
11466
11466
  }
11467
11467
  /**
11468
+ * Format RSC debug component info into a readable string for the overlay.
11469
+ *
11470
+ * Renders the server component tree that was active when an error occurred,
11471
+ * including component names and source locations from stack frames. This
11472
+ * gives developers visibility into which server components were rendering
11473
+ * without exposing source code.
11474
+ *
11475
+ * Returns an empty string if no components are provided.
11476
+ */
11477
+ function formatRscDebugContext(components) {
11478
+ if (!components || components.length === 0) return "";
11479
+ const seen = /* @__PURE__ */ new Set();
11480
+ const unique = [];
11481
+ for (const c of components) if (!seen.has(c.name)) {
11482
+ seen.add(c.name);
11483
+ unique.push(c);
11484
+ }
11485
+ const lines = ["Server Component Tree:"];
11486
+ for (let i = 0; i < unique.length; i++) {
11487
+ const c = unique[i];
11488
+ const indent = " ".repeat(i + 1);
11489
+ const envLabel = c.env ? ` [${c.env}]` : "";
11490
+ let locStr = "";
11491
+ if (c.stack && c.stack.length > 0) {
11492
+ const frame = c.stack[0];
11493
+ if (Array.isArray(frame) && frame.length >= 3) locStr = ` (${frame[1]}:${frame[2]})`;
11494
+ }
11495
+ lines.push(`${indent}${c.name}${envLabel}${locStr}`);
11496
+ }
11497
+ return lines.join("\n");
11498
+ }
11499
+ /**
11468
11500
  * Send an error to Vite's browser overlay and log it to stderr.
11469
11501
  *
11470
11502
  * Uses `server.ssrFixStacktrace()` to map stack traces back to source,
11471
11503
  * then sends the error via `server.hot.send()` for the browser overlay.
11472
11504
  *
11505
+ * When `rscDebugComponents` is provided (dev mode only), the server
11506
+ * component tree context is appended to the error message. This helps
11507
+ * developers identify which server component caused the error without
11508
+ * exposing source code.
11509
+ *
11473
11510
  * The dev server remains running — errors are handled, not fatal.
11474
11511
  */
11475
- function sendErrorToOverlay(server, error, phase, projectRoot) {
11512
+ function sendErrorToOverlay(server, error, phase, projectRoot, rscDebugComponents) {
11476
11513
  server.ssrFixStacktrace(error);
11477
11514
  const formatted = formatTerminalError(error, phase, projectRoot);
11478
11515
  process.stderr.write(`${formatted}\n`);
@@ -11480,6 +11517,8 @@ function sendErrorToOverlay(server, error, phase, projectRoot) {
11480
11517
  const componentStack = extractComponentStack(error);
11481
11518
  let message = error.message;
11482
11519
  if (componentStack) message = `${error.message}\n\nComponent Stack:\n${componentStack.trim()}`;
11520
+ const debugContext = formatRscDebugContext(rscDebugComponents ?? []);
11521
+ if (debugContext) message = `${message}\n\n${debugContext}`;
11483
11522
  try {
11484
11523
  server.hot.send({
11485
11524
  type: "error",
@@ -11697,8 +11736,8 @@ function createTimberMiddleware(server, projectRoot) {
11697
11736
  const rscModule = await rscEnv.runner.import(RSC_ENTRY_ID);
11698
11737
  handler = rscModule.default;
11699
11738
  const setHandler = rscModule.setDevPipelineErrorHandler;
11700
- if (typeof setHandler === "function") setHandler((error) => {
11701
- sendErrorToOverlay(server, error, classifyErrorPhase(error, projectRoot), projectRoot);
11739
+ if (typeof setHandler === "function") setHandler((error, _phase, debugComponents) => {
11740
+ sendErrorToOverlay(server, error, classifyErrorPhase(error, projectRoot), projectRoot, debugComponents);
11702
11741
  });
11703
11742
  } catch (error) {
11704
11743
  if (error instanceof Error) sendErrorToOverlay(server, error, "module-transform", projectRoot);
@@ -11787,15 +11826,24 @@ async function sendWebResponse(nodeRes, webResponse) {
11787
11826
  }
11788
11827
  nodeRes.flushHeaders();
11789
11828
  const reader = webResponse.body.getReader();
11829
+ let clientDisconnected = false;
11830
+ const onClose = () => {
11831
+ clientDisconnected = true;
11832
+ reader.cancel("Client disconnected").catch(() => {});
11833
+ };
11834
+ nodeRes.on("close", onClose);
11790
11835
  try {
11791
11836
  while (true) {
11792
11837
  const { done, value } = await reader.read();
11793
11838
  if (done) break;
11794
11839
  nodeRes.write(value);
11795
11840
  }
11841
+ } catch (err) {
11842
+ if (!clientDisconnected) throw err;
11796
11843
  } finally {
11844
+ nodeRes.off("close", onClose);
11797
11845
  reader.releaseLock();
11798
- nodeRes.end();
11846
+ if (!nodeRes.writableEnded) nodeRes.end();
11799
11847
  }
11800
11848
  }
11801
11849
  /**
@@ -11917,6 +11965,7 @@ function generateConfigModule(ctx) {
11917
11965
  topLoader: ctx.config.topLoader,
11918
11966
  debug: ctx.config.debug ?? false,
11919
11967
  serverTiming: ctx.config.serverTiming,
11968
+ renderTimeoutMs: ctx.config.renderTimeoutMs ?? 3e4,
11920
11969
  deploymentId: ctx.deploymentId ?? null
11921
11970
  };
11922
11971
  return [