diff options
Diffstat (limited to 'benchmark/packages')
-rw-r--r-- | benchmark/packages/adapter/README.md | 3 | ||||
-rw-r--r-- | benchmark/packages/adapter/package.json | 35 | ||||
-rw-r--r-- | benchmark/packages/adapter/src/index.ts | 32 | ||||
-rw-r--r-- | benchmark/packages/adapter/src/server.ts | 32 | ||||
-rw-r--r-- | benchmark/packages/adapter/tsconfig.json | 7 | ||||
-rw-r--r-- | benchmark/packages/timer/README.md | 3 | ||||
-rw-r--r-- | benchmark/packages/timer/package.json | 36 | ||||
-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 | ||||
-rw-r--r-- | benchmark/packages/timer/tsconfig.json | 7 |
11 files changed, 246 insertions, 0 deletions
diff --git a/benchmark/packages/adapter/README.md b/benchmark/packages/adapter/README.md new file mode 100644 index 000000000..5b8e33ed4 --- /dev/null +++ b/benchmark/packages/adapter/README.md @@ -0,0 +1,3 @@ +# @benchmark/timer + +Like `@astrojs/node`, but returns the rendered time in milliseconds for the page instead of the page content itself. This is used for internal benchmarks only. diff --git a/benchmark/packages/adapter/package.json b/benchmark/packages/adapter/package.json new file mode 100644 index 000000000..2bdb73ce9 --- /dev/null +++ b/benchmark/packages/adapter/package.json @@ -0,0 +1,35 @@ +{ + "name": "@benchmark/adapter", + "description": "Bench adapter", + "private": true, + "version": "0.0.0", + "type": "module", + "types": "./dist/index.d.ts", + "author": "withastro", + "license": "MIT", + "keywords": [ + "withastro", + "astro-adapter" + ], + "exports": { + ".": "./dist/index.js", + "./server.js": "./dist/server.js", + "./package.json": "./package.json" + }, + "scripts": { + "build": "astro-scripts build \"src/**/*.ts\" && tsc", + "build:ci": "astro-scripts build \"src/**/*.ts\"", + "dev": "astro-scripts dev \"src/**/*.ts\"" + }, + "dependencies": { + "server-destroy": "^1.0.1" + }, + "peerDependencies": { + "astro": "workspace:*" + }, + "devDependencies": { + "@types/server-destroy": "^1.0.4", + "astro": "workspace:*", + "astro-scripts": "workspace:*" + } +} diff --git a/benchmark/packages/adapter/src/index.ts b/benchmark/packages/adapter/src/index.ts new file mode 100644 index 000000000..0fc6d67f9 --- /dev/null +++ b/benchmark/packages/adapter/src/index.ts @@ -0,0 +1,32 @@ +import type { AstroIntegration } from 'astro'; + +export default function createIntegration(): AstroIntegration { + return { + name: '@benchmark/timer', + hooks: { + 'astro:config:setup': ({ updateConfig }) => { + updateConfig({ + vite: { + ssr: { + noExternal: ['@benchmark/timer'], + }, + }, + }); + }, + 'astro:config:done': ({ setAdapter }) => { + setAdapter({ + name: '@benchmark/adapter', + serverEntrypoint: '@benchmark/adapter/server.js', + exports: ['manifest', 'createApp'], + supportedAstroFeatures: { + serverOutput: 'stable', + envGetSecret: 'experimental', + staticOutput: 'stable', + hybridOutput: 'stable', + i18nDomains: 'stable', + }, + }); + }, + }, + }; +} diff --git a/benchmark/packages/adapter/src/server.ts b/benchmark/packages/adapter/src/server.ts new file mode 100644 index 000000000..10e212adb --- /dev/null +++ b/benchmark/packages/adapter/src/server.ts @@ -0,0 +1,32 @@ +import * as fs from 'node:fs'; +import type { SSRManifest } from 'astro'; +import { App } from 'astro/app'; +import { applyPolyfills } from 'astro/app/node'; + +applyPolyfills(); + +class MyApp extends App { + #manifest: SSRManifest | undefined; + constructor(manifest: SSRManifest, streaming = false) { + super(manifest, streaming); + this.#manifest = manifest; + } + + async render(request: Request) { + const url = new URL(request.url); + if (this.#manifest?.assets.has(url.pathname)) { + const filePath = new URL('../../client/' + this.removeBase(url.pathname), import.meta.url); + const data = await fs.promises.readFile(filePath); + return new Response(data); + } + + return super.render(request); + } +} + +export function createExports(manifest: SSRManifest) { + return { + manifest, + createApp: (streaming: boolean) => new MyApp(manifest, streaming), + }; +} diff --git a/benchmark/packages/adapter/tsconfig.json b/benchmark/packages/adapter/tsconfig.json new file mode 100644 index 000000000..1504b4b6d --- /dev/null +++ b/benchmark/packages/adapter/tsconfig.json @@ -0,0 +1,7 @@ +{ + "extends": "../../../tsconfig.base.json", + "include": ["src"], + "compilerOptions": { + "outDir": "./dist" + } +} diff --git a/benchmark/packages/timer/README.md b/benchmark/packages/timer/README.md new file mode 100644 index 000000000..5b8e33ed4 --- /dev/null +++ b/benchmark/packages/timer/README.md @@ -0,0 +1,3 @@ +# @benchmark/timer + +Like `@astrojs/node`, but returns the rendered time in milliseconds for the page instead of the page content itself. This is used for internal benchmarks only. diff --git a/benchmark/packages/timer/package.json b/benchmark/packages/timer/package.json new file mode 100644 index 000000000..7e3e2065b --- /dev/null +++ b/benchmark/packages/timer/package.json @@ -0,0 +1,36 @@ +{ + "name": "@benchmark/timer", + "description": "Preview server for benchmark", + "private": true, + "version": "0.0.0", + "type": "module", + "types": "./dist/index.d.ts", + "author": "withastro", + "license": "MIT", + "keywords": [ + "withastro", + "astro-adapter" + ], + "exports": { + ".": "./dist/index.js", + "./server.js": "./dist/server.js", + "./preview.js": "./dist/preview.js", + "./package.json": "./package.json" + }, + "scripts": { + "build": "astro-scripts build \"src/**/*.ts\" && tsc", + "build:ci": "astro-scripts build \"src/**/*.ts\"", + "dev": "astro-scripts dev \"src/**/*.ts\"" + }, + "dependencies": { + "server-destroy": "^1.0.1" + }, + "peerDependencies": { + "astro": "workspace:*" + }, + "devDependencies": { + "@types/server-destroy": "^1.0.4", + "astro": "workspace:*", + "astro-scripts": "workspace:*" + } +} 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(); + }, + }; +} diff --git a/benchmark/packages/timer/tsconfig.json b/benchmark/packages/timer/tsconfig.json new file mode 100644 index 000000000..1504b4b6d --- /dev/null +++ b/benchmark/packages/timer/tsconfig.json @@ -0,0 +1,7 @@ +{ + "extends": "../../../tsconfig.base.json", + "include": ["src"], + "compilerOptions": { + "outDir": "./dist" + } +} |