import { AngularNodeAppEngine, createNodeRequestHandler, isMainModule, writeResponseToNodeResponse, } from '@angular/ssr/node'; import * as http from 'node:http'; /** * Manually import and register the Angular app engine manifest. * The Angular 21 builder generates angular-app-engine-manifest.mjs at build time * but does NOT automatically inject the import into server.mjs. * Without this, AngularNodeAppEngine fails with "Angular app engine manifest is not set" * and every SSR request returns 404. */ // @ts-ignore — generated at build time by @angular/build import engineManifest from './angular-app-engine-manifest.mjs'; import { ɵsetAngularAppEngineManifest } from '@angular/ssr'; ɵsetAngularAppEngineManifest(engineManifest); const appEngine = new AngularNodeAppEngine(); const requestHandler = createNodeRequestHandler(async (req, res, next) => { try { const response = await appEngine.handle(req); if (response) { await writeResponseToNodeResponse(response, res); } else { next(); } } catch (error) { next(error); } }); if (isMainModule(import.meta.url)) { console.log('Node.js SSR server ready'); const server = http.createServer(); server.on('request', async (req, res) => { try { await requestHandler(req, res, () => { res.statusCode = 404; res.end('Not Found'); }); } catch (error) { console.error('SSR error:', error); res.statusCode = 500; res.end('Internal server error'); } }); server.listen(4200, () => { console.log('SSR server listening on http://localhost:4200'); }); } export { requestHandler };