Skip to content
This repository was archived by the owner on Jul 31, 2025. It is now read-only.

Commit b4b3147

Browse files
author
v1rtl
committed
wip support for Deno Deploy
1 parent e585f12 commit b4b3147

File tree

1 file changed

+41
-0
lines changed

1 file changed

+41
-0
lines changed

app.ts

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,8 +89,19 @@ export type AppConstructor<Req, Res> = Partial<{
8989
onError: ErrorHandler
9090
settings: AppSettings
9191
applyExtensions: (req: Req, res: Res, next: NextFunction) => void
92+
eventHandler: FetchEventListenerObject
9293
}>
9394

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+
94105
/**
95106
* `App` class - the starting point of tinyhttp app.
96107
*
@@ -129,13 +140,16 @@ export class App<
129140
applyExtensions?: (req: Req, res: Res, next: NextFunction) => void
130141
attach: (req: Req) => void
131142

143+
#eventHandler?: FetchEventListenerObject
144+
132145
constructor(options: AppConstructor<Req, Res> = {}) {
133146
super()
134147
this.onError = options?.onError || onErrorHandler
135148
this.noMatchHandler = options?.noMatchHandler || this.onError.bind(null, { code: 404 })
136149
this.settings = options.settings || { xPoweredBy: true }
137150
this.applyExtensions = options?.applyExtensions
138151
this.attach = (req) => setImmediate(this.handler.bind(this, req, undefined), req)
152+
this.#eventHandler = options.eventHandler
139153
}
140154

141155
set(setting: string, value: any) {
@@ -288,6 +302,33 @@ export class App<
288302
const loop = () => idx < mw.length && handle(mw[idx++])(req, (res as unknown) as Res, next as NextFunction)
289303

290304
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+
})
291332
}
292333

293334
/**

0 commit comments

Comments
 (0)