1
- import { serve as stdServe , type ServeInit , serveTls } from "https://deno.land/[email protected] /http/server.ts" ;
1
+ import type { ConnInfo , ServeInit } from "https://deno.land/[email protected] /http/server.ts" ;
2
+ import { serve as stdServe , serveTls } from "https://deno.land/[email protected] /http/server.ts" ;
2
3
import { readableStreamFromReader } from "https://deno.land/[email protected] /streams/conversion.ts" ;
3
4
import { VERSION } from "https://deno.land/x/[email protected] /version.ts" ;
4
5
import FetchError from "../framework/core/fetch_error.ts" ;
@@ -26,8 +27,10 @@ export type ServerOptions = Omit<ServeInit, "onError"> & {
26
27
ssr ?: SSR ;
27
28
onError ?: (
28
29
error : unknown ,
29
- cause : "api" | "ssr" | "transplie" | "fs" | "middleware" ,
30
- url : string ,
30
+ cause : {
31
+ by : "data-fetching" | "ssr" | "transplie" | "fs" | "middleware" ;
32
+ url : string ;
33
+ } ,
31
34
) => Response | void ;
32
35
} ;
33
36
@@ -48,7 +51,7 @@ export const serve = (options: ServerOptions = {}) => {
48
51
} ) ;
49
52
return util . computeHash ( "sha-1" , buildArgs ) ;
50
53
} ) ;
51
- const handler = async ( req : Request ) : Promise < Response > => {
54
+ const handler = async ( req : Request , connInfo : ConnInfo ) : Promise < Response > => {
52
55
const url = new URL ( req . url ) ;
53
56
const { host, pathname } = url ;
54
57
@@ -78,7 +81,7 @@ export const serve = (options: ServerOptions = {}) => {
78
81
} catch ( err ) {
79
82
if ( ! ( err instanceof Deno . errors . NotFound ) ) {
80
83
log . error ( err ) ;
81
- return onError ?.( err , "transplie" , req . url ) ??
84
+ return onError ?.( err , { by : "transplie" , url : req . url } ) ??
82
85
new Response ( errorHtml ( err . stack ?? err . message ) , {
83
86
status : 500 ,
84
87
headers : [ [ "Content-Type" , "text/html" ] ] ,
@@ -109,7 +112,7 @@ export const serve = (options: ServerOptions = {}) => {
109
112
} catch ( err ) {
110
113
if ( ! ( err instanceof Deno . errors . NotFound ) ) {
111
114
log . error ( err ) ;
112
- return onError ?.( err , "transplie" , req . url ) ??
115
+ return onError ?.( err , { by : "transplie" , url : req . url } ) ??
113
116
new Response ( errorHtml ( err . stack ?? err . message ) , {
114
117
status : 500 ,
115
118
headers : [ [ "Content-Type" , "text/html" ] ] ,
@@ -153,7 +156,7 @@ export const serve = (options: ServerOptions = {}) => {
153
156
} catch ( err ) {
154
157
if ( ! ( err instanceof Deno . errors . NotFound ) ) {
155
158
log . error ( err ) ;
156
- return onError ?.( err , "fs" , req . url ) ??
159
+ return onError ?.( err , { by : "fs" , url : req . url } ) ??
157
160
new Response ( errorHtml ( err . stack ?? err . message ) , {
158
161
status : 500 ,
159
162
headers : [ [ "Content-Type" , "text/html" ] ] ,
@@ -175,6 +178,7 @@ export const serve = (options: ServerOptions = {}) => {
175
178
176
179
const customHTMLRewriter = new Map < string , HTMLRewriterHandlers > ( ) ;
177
180
const ctx = {
181
+ connInfo,
178
182
params : { } ,
179
183
headers : new Headers ( ) ,
180
184
cookies : {
@@ -239,8 +243,8 @@ export const serve = (options: ServerOptions = {}) => {
239
243
240
244
// use middlewares
241
245
if ( Array . isArray ( middlewares ) && middlewares . length > 0 ) {
242
- try {
243
- for ( const mw of middlewares ) {
246
+ for ( const mw of middlewares ) {
247
+ try {
244
248
const handler = mw . fetch ;
245
249
if ( typeof handler === "function" ) {
246
250
let res = handler ( req , ctx ) ;
@@ -254,10 +258,13 @@ export const serve = (options: ServerOptions = {}) => {
254
258
setTimeout ( res , 0 ) ;
255
259
}
256
260
}
261
+ } catch ( err ) {
262
+ return onError ?.( err , { by : "middleware" , url : req . url } ) ??
263
+ new Response ( errorHtml ( err . stack ?? err . message ) , {
264
+ status : 500 ,
265
+ headers : [ [ "Content-Type" , "text/html" ] ] ,
266
+ } ) ;
257
267
}
258
- } catch ( err ) {
259
- return onError ?.( err , "middleware" , req . url ) ??
260
- new Response ( errorHtml ( err . stack ?? err . message ) , { status : 500 , headers : [ [ "Content-Type" , "text/html" ] ] } ) ;
261
268
}
262
269
}
263
270
@@ -296,7 +303,7 @@ export const serve = (options: ServerOptions = {}) => {
296
303
) {
297
304
return new Response ( res ) ;
298
305
}
299
- if ( res instanceof Blob ) {
306
+ if ( res instanceof Blob || res instanceof File ) {
300
307
return new Response ( res , { headers : { "Content-Type" : res . type } } ) ;
301
308
}
302
309
if ( util . isPlainObject ( res ) || Array . isArray ( res ) || res === null ) {
@@ -306,26 +313,25 @@ export const serve = (options: ServerOptions = {}) => {
306
313
}
307
314
return new Response ( "Method not allowed" , { status : 405 } ) ;
308
315
}
309
- } catch ( error ) {
310
- let err = error ;
311
- if ( err instanceof Response ) {
312
- if ( err . ok || ! fromFetchApi ) {
313
- return err ;
314
- }
315
- err = await FetchError . fromResponse ( err ) ;
316
- }
317
- const res = onError ?.( err , "api" , req . url ) ;
316
+ } catch ( err ) {
317
+ const res = onError ?.( err , { by : "data-fetching" , url : req . url } ) ;
318
318
if ( res instanceof Response ) {
319
- if ( ! fromFetchApi ) {
320
- return err ;
321
- }
322
- err = await FetchError . fromResponse ( res ) ;
319
+ return res ;
323
320
}
324
- if ( err instanceof Error ) {
321
+ if ( err instanceof Response ) {
322
+ return err ;
323
+ }
324
+ if ( err instanceof Error || typeof err === "string" ) {
325
325
log . error ( err ) ;
326
326
}
327
327
const status : number = util . isUint ( err . status || err . code ) ? err . status || err . code : 500 ;
328
- return ctx . json ( { ...err , message : err . message , status } , { status : status >= 400 ? status : 501 } ) ;
328
+ return ctx . json ( {
329
+ ...err ,
330
+ message : err . message || String ( err ) ,
331
+ status,
332
+ } , {
333
+ status : status >= 400 ? status : 501 ,
334
+ } ) ;
329
335
}
330
336
}
331
337
}
@@ -353,7 +359,7 @@ export const serve = (options: ServerOptions = {}) => {
353
359
indexHtml = null ;
354
360
} else {
355
361
log . error ( "read index.html:" , err ) ;
356
- return onError ?.( err , "fs" , req . url ) ??
362
+ return onError ?.( err , { by : "fs" , url : req . url } ) ??
357
363
new Response ( errorHtml ( err . stack ?? err . message ) , {
358
364
status : 500 ,
359
365
headers : [ [ "Content-Type" , "text/html" ] ] ,
0 commit comments