@catmint/adapter-vercel 0.0.0-prealpha.10 → 0.0.0-prealpha.11

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.
@@ -126,6 +126,20 @@ import * as ssrEntry from "./ssr/index.js";
126
126
  import { readFile, stat } from "node:fs/promises";
127
127
  import { join, extname } from "node:path";
128
128
  import { fileURLToPath } from "node:url";
129
+ import { createHash } from "node:crypto";
130
+
131
+ function __isClientSafeErrorLike(err) {
132
+ return err != null && typeof err === "object" && err.constructor && err.constructor.name === "ClientSafeError" && typeof err.statusCode === "number";
133
+ }
134
+
135
+ function __isRedirectErrorLike(err) {
136
+ return err != null && typeof err === "object" && err.constructor && err.constructor.name === "RedirectError" && typeof err.url === "string" && typeof err.status === "number";
137
+ }
138
+
139
+ function __errorRef(err) {
140
+ var msg = (err && typeof err === "object" && err.message) ? String(err.message) : "unknown";
141
+ return createHash("sha256").update(msg + Date.now()).digest("hex").slice(0, 8);
142
+ }
129
143
 
130
144
  const __dirname = fileURLToPath(new URL(".", import.meta.url));
131
145
  const PRERENDERED_DIR = join(__dirname, "prerendered");
@@ -355,17 +369,58 @@ ${headerPreset === "baseline"
355
369
  res.end(JSON.stringify({ error: "Invalid JSON body" }));
356
370
  return;
357
371
  }
358
- const result = await ssrEntry.handleServerFn(pathname, parsed);
359
- if (result) {
360
- applyMiddlewareHeaders();
361
- res.statusCode = 200;
372
+ try {
373
+ const result = await ssrEntry.handleServerFn(pathname, parsed);
374
+ if (result) {
375
+ // Check if the result IS a ClientSafeError (returned, not thrown)
376
+ if (__isClientSafeErrorLike(result.result)) {
377
+ applyMiddlewareHeaders();
378
+ res.statusCode = 200;
379
+ res.setHeader("Content-Type", "application/json");
380
+ res.end(JSON.stringify({
381
+ __clientSafeError: true,
382
+ error: result.result.message,
383
+ statusCode: result.result.statusCode,
384
+ data: result.result.data,
385
+ }));
386
+ return;
387
+ }
388
+ applyMiddlewareHeaders();
389
+ res.statusCode = 200;
390
+ res.setHeader("Content-Type", "application/json");
391
+ res.end(JSON.stringify(result.result));
392
+ return;
393
+ }
394
+ res.statusCode = 404;
362
395
  res.setHeader("Content-Type", "application/json");
363
- res.end(JSON.stringify(result.result));
364
- return;
396
+ res.end(JSON.stringify({ error: "Server function not found" }));
397
+ } catch (err) {
398
+ // Always log full error server-side
399
+ console.error("[catmint] Server function error:", err);
400
+
401
+ // RedirectError — send redirect envelope
402
+ if (__isRedirectErrorLike(err)) {
403
+ res.statusCode = 200;
404
+ res.setHeader("Content-Type", "application/json");
405
+ res.end(JSON.stringify({ __redirect: true, url: err.url, status: err.status }));
406
+ return;
407
+ }
408
+
409
+ // ClientSafeError — developer opted in, expose to client
410
+ if (__isClientSafeErrorLike(err)) {
411
+ res.statusCode = err.statusCode;
412
+ res.setHeader("Content-Type", "application/json");
413
+ res.end(JSON.stringify({ error: err.message, data: err.data }));
414
+ return;
415
+ }
416
+
417
+ // Default: sanitize — generic message with correlation hash
418
+ const ref = __errorRef(err);
419
+ console.error("[catmint] Error reference [ref: " + ref + "] — see above for full error");
420
+ res.statusCode = 500;
421
+ res.setHeader("Content-Type", "application/json");
422
+ res.end(JSON.stringify({ error: "Internal Server Error [ref: " + ref + "]" }));
365
423
  }
366
- res.statusCode = 404;
367
- res.setHeader("Content-Type", "application/json");
368
- res.end(JSON.stringify({ error: "Server function not found" }));
369
424
  return;
370
425
  }
371
426
 
@@ -500,6 +555,24 @@ import * as rscEntry from "./rsc/index.js";
500
555
  import * as ssrEntry from "./ssr/index.js";
501
556
  ${hasMiddlewareProtected ? 'import { prerenderedPages } from "./prerendered.js";' : ""}
502
557
  ${cacheAdapterSetup}
558
+ function __isClientSafeErrorLike(err) {
559
+ return err != null && typeof err === "object" && err.constructor && err.constructor.name === "ClientSafeError" && typeof err.statusCode === "number";
560
+ }
561
+
562
+ function __isRedirectErrorLike(err) {
563
+ return err != null && typeof err === "object" && err.constructor && err.constructor.name === "RedirectError" && typeof err.url === "string" && typeof err.status === "number";
564
+ }
565
+
566
+ async function __errorRef(err) {
567
+ var msg = (err && typeof err === "object" && err.message) ? String(err.message) : "unknown";
568
+ var data = new TextEncoder().encode(msg + Date.now());
569
+ var buf = await crypto.subtle.digest("SHA-256", data);
570
+ var arr = new Uint8Array(buf);
571
+ var hex = "";
572
+ for (var i = 0; i < arr.length; i++) hex += arr[i].toString(16).padStart(2, "0");
573
+ return hex.slice(0, 8);
574
+ }
575
+
503
576
  async function statusPageResponse(statusCode, pathname) {
504
577
  if (rscEntry.renderStatusPage && ssrEntry.renderToHtml) {
505
578
  try {
@@ -674,17 +747,58 @@ ${headerPreset === "baseline"
674
747
  { status: 400, headers: { "Content-Type": "application/json" } },
675
748
  );
676
749
  }
677
- const result = await ssrEntry.handleServerFn(pathname, parsed);
678
- if (result) {
679
- return applyMiddlewareHeaders(secureResponse(JSON.stringify(result.result), {
680
- status: 200,
681
- headers: { "Content-Type": "application/json" },
682
- }));
750
+ try {
751
+ const result = await ssrEntry.handleServerFn(pathname, parsed);
752
+ if (result) {
753
+ // Check if the result IS a ClientSafeError (returned, not thrown)
754
+ if (__isClientSafeErrorLike(result.result)) {
755
+ return applyMiddlewareHeaders(secureResponse(JSON.stringify({
756
+ __clientSafeError: true,
757
+ error: result.result.message,
758
+ statusCode: result.result.statusCode,
759
+ data: result.result.data,
760
+ }), {
761
+ status: 200,
762
+ headers: { "Content-Type": "application/json" },
763
+ }));
764
+ }
765
+ return applyMiddlewareHeaders(secureResponse(JSON.stringify(result.result), {
766
+ status: 200,
767
+ headers: { "Content-Type": "application/json" },
768
+ }));
769
+ }
770
+ return secureResponse(
771
+ JSON.stringify({ error: "Server function not found" }),
772
+ { status: 404, headers: { "Content-Type": "application/json" } },
773
+ );
774
+ } catch (err) {
775
+ // Always log full error server-side
776
+ console.error("[catmint] Server function error:", err);
777
+
778
+ // RedirectError — send redirect envelope
779
+ if (__isRedirectErrorLike(err)) {
780
+ return secureResponse(
781
+ JSON.stringify({ __redirect: true, url: err.url, status: err.status }),
782
+ { status: 200, headers: { "Content-Type": "application/json" } },
783
+ );
784
+ }
785
+
786
+ // ClientSafeError — developer opted in, expose to client
787
+ if (__isClientSafeErrorLike(err)) {
788
+ return secureResponse(
789
+ JSON.stringify({ error: err.message, data: err.data }),
790
+ { status: err.statusCode, headers: { "Content-Type": "application/json" } },
791
+ );
792
+ }
793
+
794
+ // Default: sanitize — generic message with correlation hash
795
+ const ref = await __errorRef(err);
796
+ console.error("[catmint] Error reference [ref: " + ref + "] — see above for full error");
797
+ return secureResponse(
798
+ JSON.stringify({ error: "Internal Server Error [ref: " + ref + "]" }),
799
+ { status: 500, headers: { "Content-Type": "application/json" } },
800
+ );
683
801
  }
684
- return secureResponse(
685
- JSON.stringify({ error: "Server function not found" }),
686
- { status: 404, headers: { "Content-Type": "application/json" } },
687
- );
688
802
  }
689
803
 
690
804
  // 3. RSC flight stream for client-side navigation (/__catmint/rsc?path=...)
@@ -1 +1 @@
1
- {"version":3,"file":"function-gen.js","sourceRoot":"","sources":["../src/function-gen.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"function-gen.js","sourceRoot":"","sources":["../src/function-gen.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@catmint/adapter-vercel",
3
- "version": "0.0.0-prealpha.10",
3
+ "version": "0.0.0-prealpha.11",
4
4
  "type": "module",
5
5
  "private": false,
6
6
  "license": "MIT",
@@ -14,7 +14,7 @@
14
14
  }
15
15
  },
16
16
  "dependencies": {
17
- "catmint": "0.0.0-prealpha.10"
17
+ "catmint": "0.0.0-prealpha.11"
18
18
  },
19
19
  "devDependencies": {
20
20
  "typescript": "^5.7.0"