diff options
Diffstat (limited to 'benchmark/packages/timer/src')
-rw-r--r-- | benchmark/packages/timer/src/index.ts | 37 | ||||
-rw-r--r-- | benchmark/packages/timer/src/preview.ts | 36 | ||||
-rw-r--r-- | benchmark/packages/timer/src/server.ts | 18 |
3 files changed, 91 insertions, 0 deletions
diff --git a/benchmark/packages/timer/src/index.ts b/benchmark/packages/timer/src/index.ts new file mode 100644 index 000000000..f83a61c36 --- /dev/null +++ b/benchmark/packages/timer/src/index.ts @@ -0,0 +1,37 @@ +import type { AstroAdapter, AstroIntegration } from 'astro'; + +export function getAdapter(): AstroAdapter { + return { + name: '@benchmark/timer', + serverEntrypoint: '@benchmark/timer/server.js', + previewEntrypoint: '@benchmark/timer/preview.js', + exports: ['handler'], + supportedAstroFeatures: { + serverOutput: 'stable', + }, + }; +} + +export default function createIntegration(): AstroIntegration { + return { + name: '@benchmark/timer', + hooks: { + 'astro:config:setup': ({ updateConfig }) => { + updateConfig({ + vite: { + ssr: { + noExternal: ['@benchmark/timer'], + }, + }, + }); + }, + 'astro:config:done': ({ setAdapter, config }) => { + setAdapter(getAdapter()); + + if (config.output === 'static') { + console.warn(`[@benchmark/timer] \`output: "server"\` is required to use this adapter.`); + } + }, + }, + }; +} diff --git a/benchmark/packages/timer/src/preview.ts b/benchmark/packages/timer/src/preview.ts new file mode 100644 index 000000000..9659a26be --- /dev/null +++ b/benchmark/packages/timer/src/preview.ts @@ -0,0 +1,36 @@ +import { createServer } from 'node:http'; +import type { CreatePreviewServer } from 'astro'; +import enableDestroy from 'server-destroy'; + +const preview: CreatePreviewServer = async function ({ serverEntrypoint, host, port }) { + const ssrModule = await import(serverEntrypoint.toString()); + const ssrHandler = ssrModule.handler; + const server = createServer(ssrHandler); + server.listen(port, host); + enableDestroy(server); + + // biome-ignore lint/suspicious/noConsoleLog: allowed + console.log(`Preview server listening on http://${host}:${port}`); + + // Resolves once the server is closed + const closed = new Promise<void>((resolve, reject) => { + server.addListener('close', resolve); + server.addListener('error', reject); + }); + + return { + host, + port, + closed() { + return closed; + }, + server, + stop: async () => { + await new Promise((resolve, reject) => { + server.destroy((err) => (err ? reject(err) : resolve(undefined))); + }); + }, + }; +}; + +export { preview as default }; diff --git a/benchmark/packages/timer/src/server.ts b/benchmark/packages/timer/src/server.ts new file mode 100644 index 000000000..9905a627b --- /dev/null +++ b/benchmark/packages/timer/src/server.ts @@ -0,0 +1,18 @@ +import type { IncomingMessage, ServerResponse } from 'node:http'; +import type { SSRManifest } from 'astro'; +import { NodeApp, applyPolyfills } from 'astro/app/node'; + +applyPolyfills(); + +export function createExports(manifest: SSRManifest) { + const app = new NodeApp(manifest); + return { + handler: async (req: IncomingMessage, res: ServerResponse) => { + const start = performance.now(); + await app.render(req); + const end = performance.now(); + res.write(end - start + ''); + res.end(); + }, + }; +} |