diff options
author | 2022-03-24 07:26:25 -0400 | |
---|---|---|
committer | 2022-03-24 07:26:25 -0400 | |
commit | 5e52814d97a5723dbe7ebb32fbe040a7a4c0ea77 (patch) | |
tree | b4cd5790933ad9829159314191487462bd5e9d2e /packages/integrations/node/src | |
parent | 5c96145527f9480e7b7b16b599f4b2091e41aa6c (diff) | |
download | astro-5e52814d97a5723dbe7ebb32fbe040a7a4c0ea77.tar.gz astro-5e52814d97a5723dbe7ebb32fbe040a7a4c0ea77.tar.zst astro-5e52814d97a5723dbe7ebb32fbe040a7a4c0ea77.zip |
Adapters v0 (#2855)
* Adapter v0
* Finalizing adapters
* Update the lockfile
* Add the default adapter after config setup is called
* Create the default adapter in config:done
* Fix lint error
* Remove unused callConfigSetup
* remove unused export
* Use a test adapter to test SSR
* Adds a changeset
* Updated based on feedback
* Updated the lockfile
* Only throw if set to a different adapter
* Clean up outdated comments
* Move the adapter to an config option
* Make adapter optional
* Update the docs/changeset to reflect config API change
* Clarify regular Node usage
Diffstat (limited to 'packages/integrations/node/src')
-rw-r--r-- | packages/integrations/node/src/index.ts | 20 | ||||
-rw-r--r-- | packages/integrations/node/src/server.ts | 48 |
2 files changed, 68 insertions, 0 deletions
diff --git a/packages/integrations/node/src/index.ts b/packages/integrations/node/src/index.ts new file mode 100644 index 000000000..903d5b1cc --- /dev/null +++ b/packages/integrations/node/src/index.ts @@ -0,0 +1,20 @@ +import type { AstroAdapter, AstroIntegration } from 'astro'; + +export function getAdapter(): AstroAdapter { + return { + name: '@astrojs/node', + serverEntrypoint: '@astrojs/node/server.js', + exports: ['handler'], + }; +} + +export default function createIntegration(): AstroIntegration { + return { + name: '@astrojs/node', + hooks: { + 'astro:config:done': ({ setAdapter }) => { + setAdapter(getAdapter()); + } + } + }; +} diff --git a/packages/integrations/node/src/server.ts b/packages/integrations/node/src/server.ts new file mode 100644 index 000000000..791dc58b2 --- /dev/null +++ b/packages/integrations/node/src/server.ts @@ -0,0 +1,48 @@ +import type { SSRManifest } from 'astro'; +import type { IncomingMessage, ServerResponse } from 'http'; +import { NodeApp } from 'astro/app/node'; +import { polyfill } from '@astrojs/webapi'; + +polyfill(globalThis, { + exclude: 'window document' +}); + +export function createExports(manifest: SSRManifest) { + const app = new NodeApp(manifest, new URL(import.meta.url)); + return { + async handler(req: IncomingMessage, res: ServerResponse, next?: (err?: unknown) => void) { + const route = app.match(req); + + if(route) { + try { + const response = await app.render(req); + await writeWebResponse(res, response); + } catch(err: unknown) { + if(next) { + next(err); + } else { + throw err; + } + } + } else if(next) { + return next(); + } + } + } +} + +async function writeWebResponse(res: ServerResponse, webResponse: Response) { + const { status, headers, body } = webResponse; + res.writeHead(status, Object.fromEntries(headers.entries())); + if (body) { + const reader = body.getReader(); + while (true) { + const { done, value } = await reader.read(); + if (done) break; + if (value) { + res.write(value); + } + } + } + res.end(); +} |