diff --git a/.github/frameworks.json b/.github/frameworks.json index ca33af7f..77291e23 100644 --- a/.github/frameworks.json +++ b/.github/frameworks.json @@ -71,7 +71,7 @@ "focusedFramework": false, "starter": { "package": "starter-mastro", - "buildScript": "generate", + "buildScript": "build", "buildOutputDir": "generated", "measurements": [ { @@ -94,7 +94,17 @@ "package": "app-mastro", "buildScript": "build", "buildOutputDir": "generated", - "measurements": [] + "measurements": [ + { + "type": "ssrRequestThroughput" + }, + { + "type": "serverSideRendered" + }, + { + "type": "ssrLoad" + } + ] } }, { diff --git a/packages/app-mastro/handlers/detail.ts b/packages/app-mastro/handlers/detail.ts new file mode 100644 index 00000000..3a8ee038 --- /dev/null +++ b/packages/app-mastro/handlers/detail.ts @@ -0,0 +1,7 @@ +import { getParams, html, htmlToResponse } from '@mastrojs/mastro' + +export const GET = (request: Request) => { + const { id } = getParams(request) + + return htmlToResponse(html`

${id}

`) +} diff --git a/packages/app-mastro/server.ts b/packages/app-mastro/server.ts index 42913ac7..5ebc9522 100644 --- a/packages/app-mastro/server.ts +++ b/packages/app-mastro/server.ts @@ -1,6 +1,7 @@ import * as http from 'node:http' import { createRequestListener } from '@remix-run/node-fetch-server' import { Mastro } from '@mastrojs/mastro/server-programmatic' +import { GET as getDetail } from './handlers/detail.ts' import { GET as getHome } from './handlers/home.ts' // This is using Mastro's programmatic (Express-like) router @@ -10,9 +11,13 @@ import { GET as getHome } from './handlers/home.ts' export const handler = new Mastro() .get('/', getHome) + .get('/ssr-throughput', getHome) + .get('/server-side-rendered', getHome) + .get('/server-side-rendered/:id', getDetail) .createHandler() -const port = 8000 +const host = process.env.HOST ?? '127.0.0.1' +const port = Number.parseInt(process.env.PORT ?? '8000', 10) if (import.meta.main) { const server = http.createServer(createRequestListener(handler)) @@ -21,7 +26,7 @@ if (import.meta.main) { console.error(e) }) - server.listen(port, () => { - console.log(`Server running at http://localhost:${port}`) + server.listen(port, host, () => { + console.log(`Server running at http://${host}:${port}`) }) } diff --git a/packages/stats-generator/src/serve/mastro.ts b/packages/stats-generator/src/serve/mastro.ts new file mode 100644 index 00000000..0fe2fd88 --- /dev/null +++ b/packages/stats-generator/src/serve/mastro.ts @@ -0,0 +1,17 @@ +import { join } from 'node:path' +import { + getHost, + getPort, + parseAppDir, + spawnProductionServer, +} from './common.ts' + +const appDir = parseAppDir() +const HOST = getHost() +const PORT = getPort(8000) +const entryPath = join(appDir, 'server.ts') + +spawnProductionServer([entryPath], appDir, { + HOST, + PORT: String(PORT), +}) diff --git a/packages/stats-generator/src/serverSideRendered/index.ts b/packages/stats-generator/src/serverSideRendered/index.ts index 21b436b7..e7f311d7 100644 --- a/packages/stats-generator/src/serverSideRendered/index.ts +++ b/packages/stats-generator/src/serverSideRendered/index.ts @@ -23,6 +23,12 @@ const SERVER_SIDE_RENDERED_FRAMEWORKS: ServerSideRenderedFrameworkConfig[] = [ package: 'app-astro', serveScript: 'astro.ts', }, + { + name: 'mastro-server-side-rendered', + displayName: 'Mastro Server Side Rendered', + package: 'app-mastro', + serveScript: 'mastro.ts', + }, { name: 'next-server-side-rendered', displayName: 'Next.js Server Side Rendered', diff --git a/packages/stats-generator/src/ssrLoad/index.ts b/packages/stats-generator/src/ssrLoad/index.ts index e1ccd4fe..da83166f 100644 --- a/packages/stats-generator/src/ssrLoad/index.ts +++ b/packages/stats-generator/src/ssrLoad/index.ts @@ -30,6 +30,12 @@ const SSR_LOAD_FRAMEWORKS: SSRLoadFrameworkConfig[] = [ package: 'app-astro', serveScript: 'astro.ts', }, + { + name: 'mastro-ssr-load', + displayName: 'Mastro SSR Load', + package: 'app-mastro', + serveScript: 'mastro.ts', + }, { name: 'next-ssr-load', displayName: 'Next.js SSR Load', diff --git a/packages/stats-generator/src/ssrRequestThroughput/handlers/mastro.ts b/packages/stats-generator/src/ssrRequestThroughput/handlers/mastro.ts index 7f7f7f7e..4dfd5cc9 100644 --- a/packages/stats-generator/src/ssrRequestThroughput/handlers/mastro.ts +++ b/packages/stats-generator/src/ssrRequestThroughput/handlers/mastro.ts @@ -7,5 +7,12 @@ export async function buildMastroHandler(): Promise { const entryPath = join(packagesDir, 'app-mastro', 'server.ts') const entryUrl = pathToFileURL(entryPath).href const { handler } = await import(entryUrl) - return { type: 'web', handler } + return { + type: 'web', + handler: (request) => { + const url = new URL(request.url) + url.hostname = '127.0.0.1' + return handler(new Request(url, request)) + }, + } } diff --git a/packages/stats-generator/src/ssrRequestThroughput/index.ts b/packages/stats-generator/src/ssrRequestThroughput/index.ts index 237a36d4..ac071ed3 100644 --- a/packages/stats-generator/src/ssrRequestThroughput/index.ts +++ b/packages/stats-generator/src/ssrRequestThroughput/index.ts @@ -1,6 +1,7 @@ import { runBenchmark } from './run-benchmark.ts' import { buildAstroHandler } from './handlers/astro.ts' import { buildBaselineHtmlHandler } from './handlers/baseline-html.ts' +import { buildMastroHandler } from './handlers/mastro.ts' import { buildNuxtHandler } from './handlers/nuxt.ts' import { buildSvelteKitHandler } from './handlers/sveltekit.ts' import { buildNextJSHandler } from './handlers/nextjs.ts' @@ -34,6 +35,12 @@ const SSR_REQUEST_THROUGHPUT_FRAMEWORKS: SSRRequestThroughputFrameworkConfig[] = package: 'app-astro', buildHandler: buildAstroHandler, }, + { + name: 'mastro-ssr-request-throughput', + displayName: 'Mastro SSR Request Handler Throughput', + package: 'app-mastro', + buildHandler: buildMastroHandler, + }, { name: 'nuxt-ssr-request-throughput', displayName: 'Nuxt SSR Request Handler Throughput',