Skip to content

Commit

Permalink
feat: defineRenderHandler (#395)
Browse files Browse the repository at this point in the history
  • Loading branch information
pi0 committed Aug 8, 2022
1 parent aa703dc commit 758b046
Show file tree
Hide file tree
Showing 4 changed files with 50 additions and 2 deletions.
3 changes: 2 additions & 1 deletion src/imports.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,8 @@ export const nitroImports: Preset[] = [
'useStorage',
'useNitroApp',
'defineNitroPlugin',
'nitroPlugin'
'nitroPlugin',
'defineRenderHandler'
]
},
{
Expand Down
2 changes: 1 addition & 1 deletion src/rollup/plugins/handlers.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { hash } from 'ohash'
import type { Nitro, NitroEventHandler } from '../../types'
import type { Nitro } from '../../types'
import { virtual } from './virtual'

const unique = (arr: any[]) => Array.from(new Set(arr))
Expand Down
1 change: 1 addition & 0 deletions src/runtime/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,4 @@ export { useRuntimeConfig } from './config'
export * from './cache'
export { useNitroApp } from './app'
export * from './plugin'
export * from './renderer'
46 changes: 46 additions & 0 deletions src/runtime/renderer.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
import { CompatibilityEvent, eventHandler } from 'h3'

export interface RenderResponse {
body: string,
statusCode: number,
statusMessage: string,
headers: Record<string, string>
}

export type RenderHandler = (event: CompatibilityEvent) => Partial<RenderResponse> | Promise<Partial<RenderResponse>>

export function defineRenderHandler (handler: RenderHandler) {
return eventHandler(async (event) => {
// TODO: Use serve-placeholder
if (event.req.url.endsWith('/favicon.ico')) {
event.res.setHeader('Content-Type', 'image/x-icon')
event.res.end('data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7')
return
}

const response = await handler(event)

// TODO: Warn if response is already handled

// TODO: Caching support

// Send headers
if (!event.res.headersSent && response.headers) {
for (const header in response.headers) {
event.res.setHeader(header, response.headers[header])
}
if (response.statusCode) {
event.res.statusCode = response.statusCode
}
if (response.statusMessage) {
event.res.statusMessage = response.statusMessage
}
}

// Send response body
if (!event.res.writableEnded) {
// TODO: Warn if body is not string
event.res.end(typeof response.body === 'string' ? response.body : JSON.stringify(response.body))
}
})
}

0 comments on commit 758b046

Please sign in to comment.