serve-app.ts — astro Source File
Architecture documentation for serve-app.ts, a typescript file in the astro codebase. 3 imports, 0 dependents.
Entity Profile
Dependency Diagram
graph LR 5b6342d4_34c1_b338_e76a_caf786fff1fb["serve-app.ts"] b384cf30_390d_6db6_4724_be96d46e50ef["./types.js"] 5b6342d4_34c1_b338_e76a_caf786fff1fb --> b384cf30_390d_6db6_4724_be96d46e50ef b35cdf63_1afd_c7e2_0559_5ec3b1f12084["node:async_hooks"] 5b6342d4_34c1_b338_e76a_caf786fff1fb --> b35cdf63_1afd_c7e2_0559_5ec3b1f12084 8d666858_ab9a_2697_4536_5cb6ce038643["node"] 5b6342d4_34c1_b338_e76a_caf786fff1fb --> 8d666858_ab9a_2697_4536_5cb6ce038643 style 5b6342d4_34c1_b338_e76a_caf786fff1fb fill:#6366f1,stroke:#818cf8,color:#fff
Relationship Graph
Source Code
import { AsyncLocalStorage } from 'node:async_hooks';
import { NodeApp } from 'astro/app/node';
import type { Options, RequestHandler } from './types.js';
/**
* Creates a Node.js http listener for on-demand rendered pages, compatible with http.createServer and Connect middleware.
* If the next callback is provided, it will be called if the request does not have a matching route.
* Intended to be used in both standalone and middleware mode.
*/
export function createAppHandler(app: NodeApp, options: Options): RequestHandler {
/**
* Keep track of the current request path using AsyncLocalStorage.
* Used to log unhandled rejections with a helpful message.
*/
const als = new AsyncLocalStorage<string>();
const logger = app.getAdapterLogger();
process.on('unhandledRejection', (reason) => {
const requestUrl = als.getStore();
logger.error(`Unhandled rejection while rendering ${requestUrl}`);
console.error(reason);
});
const originUrl = options.experimentalErrorPageHost
? new URL(options.experimentalErrorPageHost)
: undefined;
const prerenderedErrorPageFetch = originUrl
? (url: string) => {
const errorPageUrl = new URL(url);
errorPageUrl.protocol = originUrl.protocol;
errorPageUrl.host = originUrl.host;
return fetch(errorPageUrl);
}
: undefined;
return async (req, res, next, locals) => {
let request: Request;
try {
request = NodeApp.createRequest(req, {
allowedDomains: app.getAllowedDomains?.() ?? [],
});
} catch (err) {
logger.error(`Could not render ${req.url}`);
console.error(err);
res.statusCode = 500;
res.end('Internal Server Error');
return;
}
// Redirects are considered prerendered routes in static mode, but we want to
// handle them dynamically, so prerendered routes are included here.
const routeData = app.match(request, true);
// But we still want to skip prerendered pages.
if (routeData && !(routeData.type === 'page' && routeData.prerender)) {
const response = await als.run(request.url, () =>
app.render(request, {
addCookieHeader: true,
locals,
routeData,
prerenderedErrorPageFetch,
}),
);
await NodeApp.writeResponse(response, res);
} else if (next) {
return next();
} else {
const response = await app.render(req, { addCookieHeader: true, prerenderedErrorPageFetch });
await NodeApp.writeResponse(response, res);
}
};
}
Domain
Subdomains
Functions
Dependencies
- ./types.js
- node
- node:async_hooks
Source
Frequently Asked Questions
What does serve-app.ts do?
serve-app.ts is a source file in the astro codebase, written in typescript. It belongs to the CoreAstro domain, CoreMiddleware subdomain.
What functions are defined in serve-app.ts?
serve-app.ts defines 1 function(s): createAppHandler.
What does serve-app.ts depend on?
serve-app.ts imports 3 module(s): ./types.js, node, node:async_hooks.
Where is serve-app.ts in the architecture?
serve-app.ts is located at packages/integrations/node/src/serve-app.ts (domain: CoreAstro, subdomain: CoreMiddleware, directory: packages/integrations/node/src).
Analyze Your Own Codebase
Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.
Try Supermodel Free