Files
2026-05-24 21:58:23 -07:00

51 lines
1.7 KiB
TypeScript

import { Request, RequestHandler, Response } from 'express'
import { PRODUCTION } from '../constants'
import { createHash } from 'crypto'
import processView from './processView'
import Log from './logger'
// Renders a View from Disk and Serves it with Caching Enabled
export async function Static(path: string): Promise<RequestHandler> {
if (PRODUCTION) {
Log('INFO', 'static', `Pre-Render: '${path}'`)
const content = await processView(path, {})
const length = Buffer.byteLength(content)
const hash = createHash('md5').update(content).digest('hex')
return function (req: Request, res: Response) {
if (req.headers['if-none-match'] === hash) {
res.status(304).end()
return
}
res.setHeader('Content-Type', 'text/html')
res.setHeader('Content-Length', length)
res.setHeader('ETag', hash)
res.end(content)
}
} else {
return async function (req: Request, res: Response) {
Log('INFO', 'static', `Render: '${path}'`)
processView(path, {})
.then(html => res.send(html))
.catch(err => res
.status(500)
.end('Caught Rendering Error! Check Console for more details.\n' + String(err))
)
}
}
}
// Redirect to Another Location
export function Redirect(location: string) {
return function (req: Request, res: Response) {
res.redirect(location)
}
}
// Return a Response Code with an Empty Body
export function Empty(status: number) {
return function (req: Request, res: Response) {
res.status(status).end()
}
}