@@ -89,8 +89,19 @@ export type AppConstructor<Req, Res> = Partial<{
89
89
onError : ErrorHandler
90
90
settings : AppSettings
91
91
applyExtensions : ( req : Req , res : Res , next : NextFunction ) => void
92
+ eventHandler : FetchEventListenerObject
92
93
} >
93
94
95
+ /** DENO DEPLOY TYPES */
96
+ export interface FetchEvent extends Event {
97
+ request : Request
98
+ respondWith ( response : Response | Promise < Response > ) : Promise < Response >
99
+ }
100
+
101
+ export interface FetchEventListenerObject {
102
+ handleEvent ( evt : FetchEvent ) : void | Promise < void >
103
+ }
104
+
94
105
/**
95
106
* `App` class - the starting point of tinyhttp app.
96
107
*
@@ -129,13 +140,16 @@ export class App<
129
140
applyExtensions ?: ( req : Req , res : Res , next : NextFunction ) => void
130
141
attach : ( req : Req ) => void
131
142
143
+ #eventHandler?: FetchEventListenerObject
144
+
132
145
constructor ( options : AppConstructor < Req , Res > = { } ) {
133
146
super ( )
134
147
this . onError = options ?. onError || onErrorHandler
135
148
this . noMatchHandler = options ?. noMatchHandler || this . onError . bind ( null , { code : 404 } )
136
149
this . settings = options . settings || { xPoweredBy : true }
137
150
this . applyExtensions = options ?. applyExtensions
138
151
this . attach = ( req ) => setImmediate ( this . handler . bind ( this , req , undefined ) , req )
152
+ this . #eventHandler = options . eventHandler
139
153
}
140
154
141
155
set ( setting : string , value : any ) {
@@ -288,6 +302,33 @@ export class App<
288
302
const loop = ( ) => idx < mw . length && handle ( mw [ idx ++ ] ) ( req , ( res as unknown ) as Res , next as NextFunction )
289
303
290
304
loop ( )
305
+
306
+ return res as Res
307
+ }
308
+
309
+ fetchEventHandler ( ) : FetchEventListenerObject {
310
+ if ( this . #eventHandler) {
311
+ return this . #eventHandler
312
+ }
313
+ return ( this . #eventHandler = {
314
+ handleEvent : async ( requestEvent ) => {
315
+ let resolve : ( response : Response ) => void
316
+ // deno-lint-ignore no-explicit-any
317
+ let reject : ( reason : any ) => void
318
+ const responsePromise = new Promise < Response > ( ( res , rej ) => {
319
+ resolve = res
320
+ reject = rej
321
+ } )
322
+ const respondedPromise = requestEvent . respondWith ( responsePromise )
323
+ const response = this . handler ( requestEvent . request as Req )
324
+ if ( response ) {
325
+ resolve ! ( response )
326
+ } else {
327
+ reject ! ( new Error ( 'No response returned from app handler.' ) )
328
+ }
329
+ await respondedPromise
330
+ }
331
+ } )
291
332
}
292
333
293
334
/**
0 commit comments