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',