diff options
Diffstat (limited to 'packages/integrations/vercel/src/serverless/entrypoint.ts')
-rw-r--r-- | packages/integrations/vercel/src/serverless/entrypoint.ts | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/packages/integrations/vercel/src/serverless/entrypoint.ts b/packages/integrations/vercel/src/serverless/entrypoint.ts new file mode 100644 index 000000000..6ef7ccef9 --- /dev/null +++ b/packages/integrations/vercel/src/serverless/entrypoint.ts @@ -0,0 +1,34 @@ +import type { SSRManifest } from 'astro'; +import { App } from 'astro/app'; +import { polyfill } from '@astrojs/webapi'; +import type { IncomingMessage, ServerResponse } from 'node:http'; + +import { getRequest, setResponse } from './request-transform.js'; + +polyfill(globalThis, { + exclude: 'window document', +}); + +export const createExports = (manifest: SSRManifest) => { + const app = new App(manifest); + + const handler = async (req: IncomingMessage, res: ServerResponse) => { + let request: Request; + + try { + request = await getRequest(`https://${req.headers.host}`, req); + } catch (err: any) { + res.statusCode = err.status || 400; + return res.end(err.reason || 'Invalid request body'); + } + + if (!app.match(request)) { + res.statusCode = 404; + return res.end('Not found'); + } + + await setResponse(res, await app.render(request)); + }; + + return { default: handler }; +}; |