aboutsummaryrefslogtreecommitdiff
path: root/benchmark/packages
diff options
context:
space:
mode:
Diffstat (limited to 'benchmark/packages')
-rw-r--r--benchmark/packages/adapter/README.md3
-rw-r--r--benchmark/packages/adapter/package.json35
-rw-r--r--benchmark/packages/adapter/src/index.ts32
-rw-r--r--benchmark/packages/adapter/src/server.ts32
-rw-r--r--benchmark/packages/adapter/tsconfig.json7
-rw-r--r--benchmark/packages/timer/README.md3
-rw-r--r--benchmark/packages/timer/package.json36
-rw-r--r--benchmark/packages/timer/src/index.ts37
-rw-r--r--benchmark/packages/timer/src/preview.ts36
-rw-r--r--benchmark/packages/timer/src/server.ts18
-rw-r--r--benchmark/packages/timer/tsconfig.json7
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"
+ }
+}