@@ -6,7 +6,12 @@ import type {
66} from "../../../scramjet/packages/controller/src/types" ;
77import { RpcHelper , type MethodsDefinition } from "@mercuryworkshop/rpc" ;
88import * as tldts from "tldts" ;
9- import { createFetchHandler , handlefetch } from "./scramjet" ;
9+ import {
10+ createFetchHandler ,
11+ handlefetch ,
12+ renderErrorPage ,
13+ virtualInjectPath ,
14+ } from "./scramjet" ;
1015import {
1116 ScramjetHeaders ,
1217 type ScramjetFetchHandler ,
@@ -29,42 +34,55 @@ export class Controller {
2934 this . readyResolve ( ) ;
3035 } ,
3136 request : async ( data ) => {
32- let headers = new ScramjetHeaders ( ) ;
33- for ( let [ k , v ] of Object . entries ( data . initialHeaders ) ) {
34- if ( typeof v !== "string" ) v = v [ 0 ] ;
35- if ( v ) headers . set ( k , v ) ;
36- }
37- const request : ScramjetFetchRequest = {
38- rawUrl : new URL ( data . rawUrl ) ,
39- rawClientUrl : data . rawClientUrl
40- ? new URL ( data . rawClientUrl )
41- : undefined ,
42- method : data . method ,
43- initialHeaders : headers ,
44- body : data . body ,
45- mode : data . mode ,
46- cache : data . cache ,
47- referrer : data . referrer ,
48- destination : data . destination ,
49- } ;
50-
51- const fetchresp = await handlefetch ( request , this ) ;
52-
53- const response : TransferResponse = {
54- status : fetchresp . status ,
55- statusText : fetchresp . statusText ,
56- headers : fetchresp . headers ,
57- body : fetchresp . body ,
58- } ;
59-
60- let transfer : any [ ] | undefined = [ ] ;
61- if (
62- response . body instanceof ArrayBuffer ||
63- response . body instanceof ReadableStream
64- ) {
65- transfer = [ response . body ] ;
37+ try {
38+ let headers = new ScramjetHeaders ( ) ;
39+ for ( let [ k , v ] of Object . entries ( data . initialHeaders ) ) {
40+ if ( typeof v !== "string" ) v = v [ 0 ] ;
41+ if ( v ) headers . set ( k , v ) ;
42+ }
43+ const request : ScramjetFetchRequest = {
44+ rawUrl : new URL ( data . rawUrl ) ,
45+ rawClientUrl : data . rawClientUrl
46+ ? new URL ( data . rawClientUrl )
47+ : undefined ,
48+ method : data . method ,
49+ initialHeaders : headers ,
50+ body : data . body ,
51+ mode : data . mode ,
52+ cache : data . cache ,
53+ referrer : data . referrer ,
54+ destination : data . destination ,
55+ } ;
56+
57+ const fetchresp = await handlefetch ( request , this ) ;
58+
59+ const response : TransferResponse = {
60+ status : fetchresp . status ,
61+ statusText : fetchresp . statusText ,
62+ headers : fetchresp . headers ,
63+ body : fetchresp . body ,
64+ } ;
65+
66+ let transfer : any [ ] | undefined = [ ] ;
67+ if (
68+ response . body instanceof ArrayBuffer ||
69+ response . body instanceof ReadableStream
70+ ) {
71+ transfer = [ response . body ] ;
72+ }
73+ return [ response , transfer ] ;
74+ } catch ( e : any ) {
75+ return [
76+ {
77+ status : 500 ,
78+ statusText : "Internal Server Error" ,
79+ headers : {
80+ "Content-Type" : "text/html" ,
81+ } ,
82+ body : renderErrorPage ( this , e ) ,
83+ } ,
84+ ] ;
6685 }
67- return [ response , transfer ] ;
6886 } ,
6987 } ;
7088
0 commit comments