@astroscope/node 1.2.0 → 1.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/server.js +5 -1
- package/dist/server.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -254,14 +254,14 @@ node({
|
|
|
254
254
|
// request logging at the native handler. Enabled by default in production;
|
|
255
255
|
// false disables it (the log proxy keeps working).
|
|
256
256
|
logging: {
|
|
257
|
-
exclude: [{ prefix: '/internal/' }], // replaces RECOMMENDED_EXCLUDES
|
|
257
|
+
exclude: [{ prefix: '/internal/' }], // replaces RECOMMENDED_EXCLUDES
|
|
258
258
|
extended: false, // query/headers/client address (may capture sensitive data)
|
|
259
259
|
dev: false, // also log requests in dev (astro narrates them already)
|
|
260
260
|
},
|
|
261
261
|
|
|
262
262
|
// platform telemetry. Enabled by default in production, off in dev; false disables.
|
|
263
263
|
telemetry: {
|
|
264
|
-
exclude: [{ prefix: '/internal/' }], // replaces RECOMMENDED_EXCLUDES
|
|
264
|
+
exclude: [{ prefix: '/internal/' }], // replaces RECOMMENDED_EXCLUDES
|
|
265
265
|
prometheus: { host: '0.0.0.0', port: 9464 }, // false disables the reader
|
|
266
266
|
dev: false, // start the SDK in dev too (once per process)
|
|
267
267
|
},
|
package/dist/index.d.ts
CHANGED
|
@@ -46,7 +46,7 @@ interface NodeHealthOptions {
|
|
|
46
46
|
interface NodeLoggingOptions {
|
|
47
47
|
/**
|
|
48
48
|
* Paths excluded from request logging. Replaces the default
|
|
49
|
-
* (`RECOMMENDED_EXCLUDES`
|
|
49
|
+
* (`RECOMMENDED_EXCLUDES`) entirely when provided.
|
|
50
50
|
*/
|
|
51
51
|
exclude?: ExcludePattern[] | undefined;
|
|
52
52
|
/**
|
|
@@ -77,7 +77,7 @@ interface NodePrometheusOptions {
|
|
|
77
77
|
interface NodeTelemetryOptions {
|
|
78
78
|
/**
|
|
79
79
|
* Paths excluded from request tracing and metrics. Replaces the default
|
|
80
|
-
* (`RECOMMENDED_EXCLUDES`
|
|
80
|
+
* (`RECOMMENDED_EXCLUDES`) entirely when provided.
|
|
81
81
|
*/
|
|
82
82
|
exclude?: ExcludePattern[] | undefined;
|
|
83
83
|
/**
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/types.ts","../src/integration/integration.ts","../src/platform/prepare.ts","../src/lifecycle/lifecycle.ts"],"mappings":";;;;;;UAEiB,eAAA;;;;;EAKf,KAAA;EALe;;;;AAYV;EAAL,KAAK;AAAA;;;;UAMU,gBAAA;EACf,IAAA;EACA,OAAA;EACA,KAAA;EACA,MAAA;AAAA;AAAA,UAGe,iBAAA;;;;;EAKf,IAAA;EAYQ;;AAAgB;AAG1B;EATE,IAAA;;;;;EAMA,KAAA,GAAQ,gBAAgB;AAAA;AAAA,UAGT,kBAAA;EAmBZ;AAGL;;;EAjBE,OAAA,GAAU,cAAc;EA4BpB;AAGN;;;;EAxBE,QAAA;EA6BU;;;;;EAtBV,GAAA;AAAA;AAAA,UAGe,qBAAA;;;;;EAKf,IAAA;EAqEmB;;;;EA/DnB,IAAI;AAAA;AAAA,UAGW,oBAAA;EA6Cf;;;;EAxCA,OAAA,GAAU,cAAA;EAuDD;;;;EAjDT,UAAA,GAAa,qBAAqB;EA8DnB;;;;ACzI+D;EDkF9E,GAAA;AAAA;AAAA,UAGe,WAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/types.ts","../src/integration/integration.ts","../src/platform/prepare.ts","../src/lifecycle/lifecycle.ts"],"mappings":";;;;;;UAEiB,eAAA;;;;;EAKf,KAAA;EALe;;;;AAYV;EAAL,KAAK;AAAA;;;;UAMU,gBAAA;EACf,IAAA;EACA,OAAA;EACA,KAAA;EACA,MAAA;AAAA;AAAA,UAGe,iBAAA;;;;;EAKf,IAAA;EAYQ;;AAAgB;AAG1B;EATE,IAAA;;;;;EAMA,KAAA,GAAQ,gBAAgB;AAAA;AAAA,UAGT,kBAAA;EAmBZ;AAGL;;;EAjBE,OAAA,GAAU,cAAc;EA4BpB;AAGN;;;;EAxBE,QAAA;EA6BU;;;;;EAtBV,GAAA;AAAA;AAAA,UAGe,qBAAA;;;;;EAKf,IAAA;EAqEmB;;;;EA/DnB,IAAI;AAAA;AAAA,UAGW,oBAAA;EA6Cf;;;;EAxCA,OAAA,GAAU,cAAA;EAuDD;;;;EAjDT,UAAA,GAAa,qBAAqB;EA8DnB;;;;ACzI+D;EDkF9E,GAAA;AAAA;AAAA,UAGe,WAAA;ECnCqB;;;;AAAmC;;;ED2CvE,IAAA,GAAO,eAAA;EE1GQ;;;;AACZ;;EFiHH,OAAA,GAAU,kBAAA;;AGrHZ;;;;;EH6HE,SAAA,GAAY,oBAAA;EG3H4B;;;;;EHkIxC,MAAA,GAAS,iBAAA;EGnI8B;;;;;;EH2IvC,IAAA;IAAS,OAAA,GAAU,cAAA;EAAA;;;;;EAMnB,aAAA;;;;;;EAOA,eAAA;AAAA;;;;;;AA9IK;AAMP;;iBCiDwB,IAAA,CAAK,OAAA,GAAS,WAAA,GAAmB,gBAAgB;;;UC/DxD,sBAAA;EACf,GAAG;AAAA;;;UCJY,UAAA;EACf,SAAA,KAAc,OAAA,EAAS,WAAA,KAAgB,OAAA;EACvC,UAAA,KAAe,OAAA,EAAS,WAAA,KAAgB,OAAA;AAAA"}
|
package/dist/index.js
CHANGED
|
@@ -2,7 +2,7 @@ import { n as setBootContext } from "./context-Bkg-FnnQ.js";
|
|
|
2
2
|
import { a as runShutdown, i as createRequestInstrumentation, o as runStartup, t as preparePlatform } from "./prepare-DQEf2Bnt.js";
|
|
3
3
|
import { n as dispatchNativeMount, t as clearNativeMounts } from "./native-mount-hhwWdLtL.js";
|
|
4
4
|
import { n as getCurrentGeneration, r as incrementGeneration, t as GEN_HEADER } from "./generation-Bp2IA0jf.js";
|
|
5
|
-
import {
|
|
5
|
+
import { r as RECOMMENDED_EXCLUDES } from "./excludes-pE23EbmQ.js";
|
|
6
6
|
import fs, { readFileSync } from "node:fs";
|
|
7
7
|
import path from "node:path";
|
|
8
8
|
import { fileURLToPath } from "node:url";
|
|
@@ -540,7 +540,7 @@ const SERVER_ENVIRONMENTS = [
|
|
|
540
540
|
"prerender",
|
|
541
541
|
"astro"
|
|
542
542
|
];
|
|
543
|
-
const DEFAULT_REQUEST_EXCLUDES = [...RECOMMENDED_EXCLUDES
|
|
543
|
+
const DEFAULT_REQUEST_EXCLUDES = [...RECOMMENDED_EXCLUDES];
|
|
544
544
|
function resolveHost(host) {
|
|
545
545
|
if (typeof host === "string") return host;
|
|
546
546
|
return host === true ? "0.0.0.0" : "localhost";
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../src/dev-mode/serialize-error.ts","../src/dev-mode/scheduler.ts","../src/dev-mode/vite-env.ts","../src/dev-mode/ignored.ts","../src/dev-mode/watch.ts","../src/dev-mode/machinery.ts","../src/excludes/serialize.ts","../src/tweaks/sourcemap.ts","../src/tweaks/strip-effects.ts","../src/integration/integration.ts"],"sourcesContent":["export function serializeError(error: unknown): string {\n if (error instanceof Error) {\n return error.stack ?? error.message;\n }\n\n return JSON.stringify(error);\n}\n","import path from 'node:path';\nimport type { ViteDevServer } from 'vite';\nimport { serializeError } from './serialize-error.js';\n\ntype Logger = { info(msg: string): void; error(msg: string): void };\n\nconst FULL_RELOAD_UNKNOWN = '<unknown>';\n\n/**\n * Coordinates dev-server restarts: debounces bursts, chains a follow-up if\n * changes arrive mid-restart (vite's `ssrImport` reads disk at import time,\n * so changes during a restart would otherwise be missed), and logs once per\n * restart with what triggered it.\n *\n * One instance per integration, shared across restart-induced configureServer\n * reruns — chain coordination would be lost if recreated each time.\n */\nexport class RestartScheduler {\n private _inFlight = false;\n private _pending = false;\n private _debounceTimer: ReturnType<typeof setTimeout> | undefined;\n private _pendingBootDeps = new Set<string>();\n private _pendingFullReloads = new Set<string>();\n // set while a restart chain is running. the gate probes it (`isRestartPending`)\n // to short-circuit requests, and awaits it (`waitForRestart`) on readiness.\n private _runPromise: Promise<void> | undefined;\n // set when a restart attempt fails\n private _lastFailure: { message: string } | undefined;\n\n constructor(\n private readonly debounceMs: number,\n private readonly logger: Logger,\n ) {}\n\n // true from the moment a change is queued until the restart completes — covers\n // the debounce window too, so requests don't slip past the gate before _run starts.\n isRestartPending(): boolean {\n return !!this._runPromise || !!this._debounceTimer || !!this._lastFailure;\n }\n\n getLastFailure(): { message: string } | undefined {\n return this._lastFailure;\n }\n\n recordFailure(message: string): void {\n this._lastFailure = { message };\n }\n\n clearFailure(): void {\n this._lastFailure = undefined;\n }\n\n schedule(server: ViteDevServer, changedPath: string): void {\n this._pendingBootDeps.add(changedPath);\n this._scheduleRun(server);\n }\n\n scheduleFullReload(server: ViteDevServer, triggeredBy?: string): void {\n this._pendingFullReloads.add(triggeredBy ?? FULL_RELOAD_UNKNOWN);\n this._scheduleRun(server);\n }\n\n /**\n * Resolves when no restart is running. Loops to handle back-to-back restarts\n * (e.g. one chain ends and a queued debounce timer immediately fires a new\n * one). Never rejects, so a failed restart still releases the gate — caller\n * proceeds against the broken state rather than hanging forever.\n */\n async waitForRestart(): Promise<void> {\n while (this._runPromise) {\n try {\n await this._runPromise;\n } catch {\n // restart failed — release anyway\n }\n }\n }\n\n private _scheduleRun(server: ViteDevServer): void {\n clearTimeout(this._debounceTimer);\n this._debounceTimer = setTimeout(() => {\n this._debounceTimer = undefined;\n void this._run(server);\n }, this.debounceMs);\n }\n\n private async _run(server: ViteDevServer): Promise<void> {\n if (this._inFlight) {\n // loop driving the in-flight restart will pick up the next iteration.\n this._pending = true;\n\n return;\n }\n\n this._inFlight = true;\n\n let resolveRun!: () => void;\n\n this._runPromise = new Promise<void>((resolve) => {\n resolveRun = resolve;\n });\n\n try {\n do {\n this._pending = false;\n\n const bootDeps = [...this._pendingBootDeps].sort();\n const fullReloads = [...this._pendingFullReloads].sort();\n\n this._pendingBootDeps.clear();\n this._pendingFullReloads.clear();\n\n if (bootDeps.length > 0 || fullReloads.length > 0) {\n this.logger.info(this._formatReason(server, bootDeps, fullReloads));\n }\n\n try {\n await server.restart();\n } catch (error) {\n this.logger.error(`error during dev server restart: ${serializeError(error)}`);\n }\n } while (this._pending);\n } finally {\n this._inFlight = false;\n this._runPromise = undefined;\n resolveRun();\n }\n }\n\n private _formatReason(server: ViteDevServer, bootDeps: string[], fullReloads: string[]): string {\n const root = server.config.root;\n const rel = (p: string): string => path.relative(root, p) || p;\n const parts: string[] = [];\n\n if (bootDeps.length === 1) {\n parts.push(`boot dep changed: ${rel(bootDeps[0]!)}`);\n } else if (bootDeps.length > 1) {\n parts.push(`boot deps changed (${bootDeps.length}): ${bootDeps.map(rel).join(', ')}`);\n }\n\n if (fullReloads.length > 0) {\n const named = fullReloads.filter((p) => p !== FULL_RELOAD_UNKNOWN);\n\n if (named.length === 0) {\n parts.push('vite SSR full-reload');\n } else {\n parts.push(`vite SSR full-reload (triggered by ${named.map(rel).join(', ')})`);\n }\n }\n\n return `${parts.join(' + ')} — restarting dev server`;\n }\n}\n","import type { DevEnvironment, ViteDevServer } from 'vite';\n\ntype RunnableEnv = DevEnvironment & { runner: { import: (id: string) => Promise<unknown> } };\n\n/**\n * duck-typed runnable-env check. avoids `isRunnableDevEnvironment` which relies on\n * `instanceof RunnableDevEnvironment` — that breaks when the consumer and vite host\n * resolve to different vite installs (e.g. linked packages outside the workspace).\n */\nfunction isRunnable(env: DevEnvironment | undefined): env is RunnableEnv {\n return (\n !!env &&\n typeof (env as { runner?: unknown }).runner === 'object' &&\n typeof (env as RunnableEnv).runner.import === 'function'\n );\n}\n\n/**\n * resolve a runnable dev environment — prefers `ssr`, falls back to `astro`.\n * astro 6 exposes a separate `astro` environment when `ssr` isn't runnable\n * (see astro/core/constants.ts ASTRO_VITE_ENVIRONMENT_NAMES).\n */\nfunction getRunnableEnv(server: ViteDevServer): RunnableEnv {\n const ssr = server.environments['ssr'];\n\n if (isRunnable(ssr)) return ssr;\n\n const astro = server.environments['astro'];\n\n if (isRunnable(astro)) return astro;\n\n const names = Object.keys(server.environments);\n\n throw new Error(`no runnable dev environment found — available: ${names.join(', ')}`);\n}\n\n/**\n * load a module via the Vite Environment API.\n */\nexport async function ssrImport<T = Record<string, unknown>>(server: ViteDevServer, moduleId: string): Promise<T> {\n return getRunnableEnv(server).runner.import(moduleId) as Promise<T>;\n}\n\n/**\n * return the env whose `hot` channel should receive astro-targeted events.\n * astro listens on the env that backs its middleware runner.\n */\nexport function getAstroHotEnv(server: ViteDevServer): DevEnvironment | undefined {\n const ssr = server.environments['ssr'];\n\n if (isRunnable(ssr)) return ssr;\n\n const astro = server.environments['astro'];\n\n if (isRunnable(astro)) return astro;\n\n return undefined;\n}\n","export const ignoredSuffixes = [\n // type definitions\n '.d.ts',\n '.d.mts',\n '.d.cts',\n // images\n '.png',\n '.jpg',\n '.jpeg',\n '.gif',\n '.svg',\n '.webp',\n '.avif',\n '.ico',\n // fonts\n '.woff',\n '.woff2',\n '.ttf',\n '.otf',\n '.eot',\n // other static assets\n '.pdf',\n '.mp3',\n '.mp4',\n '.webm',\n '.ogg',\n '.wav',\n // data/config that boot typically doesn't import\n '.json',\n '.yaml',\n '.yml',\n '.toml',\n '.md',\n '.mdx',\n '.txt',\n // styles (handled by Vite's CSS HMR)\n '.css',\n '.scss',\n '.sass',\n '.less',\n];\n","import type { EventEmitter } from 'node:events';\nimport { readFileSync } from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport type { HotPayload, ViteDevServer } from 'vite';\nimport { GEN_HEADER, getCurrentGeneration } from './generation.js';\nimport { ignoredSuffixes } from './ignored.js';\nimport type { RestartScheduler } from './scheduler.js';\nimport { getAstroHotEnv } from './vite-env.js';\n\nconst RESTART_HTML = readFileSync(fileURLToPath(new URL('./restart-page.html', import.meta.url)), 'utf8');\n\nexport function setupBootWatch(server: ViteDevServer, entries: string[], scheduler: RestartScheduler): void {\n const entryFilePaths = entries.map((entry) => path.resolve(server.config.root, entry));\n\n const runnableEnv = getAstroHotEnv(server);\n const bootModuleGraph = runnableEnv?.moduleGraph;\n\n const collectBootDependencies = (): Set<string> => {\n const deps = new Set<string>();\n const seen = new Set<string>();\n\n for (const entryFilePath of entryFilePaths) {\n const entryModules = bootModuleGraph?.getModulesByFile(entryFilePath);\n const entryModule = entryModules ? [...entryModules][0] : undefined;\n\n if (!entryModule) continue;\n\n const visit = (mod: typeof entryModule): void => {\n if (!mod?.file || seen.has(mod.file)) return;\n\n seen.add(mod.file);\n deps.add(mod.file);\n\n for (const imp of mod.importedModules) visit(imp);\n };\n\n visit(entryModule);\n }\n\n return deps;\n };\n\n const shouldIgnore = (filePath: string): boolean => {\n const p = filePath.toLowerCase();\n\n return ignoredSuffixes.some((suffix) => p.endsWith(suffix));\n };\n\n const onWatcherEvent = (changedPath: string): void => {\n if (shouldIgnore(changedPath)) return;\n\n const bootDeps = collectBootDependencies();\n\n if (!bootDeps.has(changedPath)) return;\n\n scheduler.schedule(server, changedPath);\n };\n\n server.watcher.on('change', onWatcherEvent);\n server.watcher.on('add', onWatcherEvent);\n server.watcher.on('unlink', onWatcherEvent);\n\n // ignore full-reloads emitted during server startup (dep optimization, port retries).\n let handleFullReloads = false;\n\n if (server.httpServer) {\n server.httpServer.once('listening', () => {\n handleFullReloads = true;\n });\n } else {\n // middleware mode — no httpServer, enable immediately\n handleFullReloads = true;\n }\n\n // SSR full-reloads come through the runnable env's hot channel and clear\n // its module runner's cache — onStartup needs to run again on a fresh server.\n const outsideEmitter = (runnableEnv?.hot as { api?: { outsideEmitter?: EventEmitter } } | undefined)?.api\n ?.outsideEmitter;\n\n if (outsideEmitter) {\n outsideEmitter.on('send', (payload: HotPayload) => {\n if (!handleFullReloads) return;\n if (payload.type !== 'full-reload') return;\n\n const triggeredBy = 'triggeredBy' in payload ? (payload.triggeredBy as string) : undefined;\n\n scheduler.scheduleFullReload(server, triggeredBy);\n });\n }\n}\n\nconst READINESS_PATH = '/__astroscope_boot_ready';\n\n/**\n * Gate requests: show 503 holding page during restart, readiness probe for the reload.\n */\nexport function installBootGate(\n server: Pick<ViteDevServer, 'middlewares'>,\n scheduler: Pick<RestartScheduler, 'waitForRestart' | 'isRestartPending' | 'getLastFailure'>,\n): void {\n const middlewares = server.middlewares as unknown as {\n stack: { route: string; handle: unknown }[];\n };\n\n // must be `stack.unshift`ed to land before astro's handler\n middlewares.stack.unshift({\n route: '',\n handle: (async (\n req: { url?: string },\n res: {\n writeHead: (status: number, headers: Record<string, string>) => void;\n end: (body?: string) => void;\n headersSent?: boolean;\n },\n next: (err?: unknown) => void,\n ) => {\n // readiness probe: holding page polls this. blocks until no restart is in\n // flight, then 204 on success / 503 + JSON error if last attempt failed.\n if (req.url === READINESS_PATH) {\n await scheduler.waitForRestart();\n\n if (res.headersSent) return;\n\n const failure = scheduler.getLastFailure();\n\n if (failure) {\n res.writeHead(503, { 'cache-control': 'no-store', 'content-type': 'application/json' });\n res.end(JSON.stringify({ error: failure.message }));\n\n return;\n }\n\n res.writeHead(204, { 'cache-control': 'no-store' });\n res.end();\n\n return;\n }\n\n if (isDevInternalPath(req.url)) {\n next();\n\n return;\n }\n\n // respond now; awaiting the restart would let vite destroy the socket mid-response.\n if (scheduler.isRestartPending()) {\n res.writeHead(503, {\n 'content-type': 'text/html; charset=utf-8',\n 'cache-control': 'no-store',\n 'retry-after': '1',\n });\n res.end(RESTART_HTML);\n\n return;\n }\n\n next();\n }) as never,\n });\n}\n\nfunction isDevInternalPath(url: string | undefined): boolean {\n if (!url) return false;\n\n return url.startsWith('/@') || url.startsWith('/__') || url.includes('/node_modules/');\n}\n\n/**\n * Stamp the current generation onto every incoming request so the runtime\n * Astro middleware can later detect whether the request belongs to a previous\n * (now torn-down) generation\n */\nexport function installGenStamp(server: Pick<ViteDevServer, 'middlewares'>): void {\n const middlewares = server.middlewares as unknown as {\n stack: { route: string; handle: unknown }[];\n };\n\n middlewares.stack.unshift({\n route: '',\n handle: ((req: { headers: Record<string, string> }, _res: unknown, next: () => void) => {\n req.headers[GEN_HEADER] = String(getCurrentGeneration());\n next();\n }) as never,\n });\n}\n","import type { AstroConfig } from 'astro';\nimport type { Plugin } from 'vite';\nimport { setBootContext } from '../lifecycle/context.js';\nimport { type BootModule, runShutdown, runStartup } from '../lifecycle/lifecycle.js';\nimport type { BootContext } from '../lifecycle/types.js';\nimport { clearNativeMounts } from '../server/native-mount.js';\nimport { incrementGeneration } from './generation.js';\nimport { RestartScheduler } from './scheduler.js';\nimport { serializeError } from './serialize-error.js';\nimport { ssrImport } from './vite-env.js';\nimport { installBootGate, installGenStamp, setupBootWatch } from './watch.js';\n\ninterface Logger {\n info(msg: string): void;\n warn(msg: string): void;\n error(msg: string): void;\n}\n\nexport interface DevMachineryOptions {\n /** boot file path relative to the project root; undefined = no boot module */\n entry: string | undefined;\n /** restart the dev server when watched dependencies change */\n watch: boolean;\n /** extra files (relative to the root) whose changes restart the dev server */\n watchEntries: string[];\n /** platform seams; runs each generation before the boot module starts */\n prepare: (importModule: <T = Record<string, unknown>>(id: string) => Promise<T>) => Promise<void>;\n logger: Logger;\n getConfig: () => AstroConfig | null;\n}\n\n/**\n * Resolve the default host and port from the Astro server config.\n * Falls back to `localhost:4321` when no config is provided.\n */\nfunction getServerDefaults(config: AstroConfig | null): { host: string; port: number } {\n return {\n host:\n typeof config?.server?.host === 'string'\n ? config.server.host\n : config?.server?.host === true\n ? '0.0.0.0'\n : 'localhost',\n port: config?.server?.port ?? 4321,\n };\n}\n\n/**\n * Build a dev-mode boot context from the running server's address,\n * falling back to Astro config defaults if the server isn't listening yet.\n */\nfunction resolveBootContext(\n server: { httpServer?: { address(): unknown } | null | undefined },\n config: AstroConfig | null,\n): BootContext {\n const addr = server.httpServer?.address();\n\n if (addr && typeof addr === 'object' && 'address' in addr && 'port' in addr) {\n const host =\n (addr as { address: string }).address === '::' || (addr as { address: string }).address === '0.0.0.0'\n ? 'localhost'\n : (addr as { address: string }).address;\n\n return { dev: true, host, port: (addr as { port: number }).port };\n }\n\n const { host, port } = getServerDefaults(config);\n\n return { dev: true, host, port };\n}\n\n/**\n * The dev-mode boot machinery: runs the platform seams and the boot lifecycle\n * per restart generation, restarts the dev server when watched dependencies\n * change, and gates requests behind a holding page during restarts.\n */\nexport function createDevMachinery(options: DevMachineryOptions): Plugin[] {\n const { entry, logger } = options;\n\n let hasStartupSucceededOnce = false;\n // run by the next configureServer before its startup so resources (ports,\n // sockets, locks) from the previous module are released first. idempotent.\n let priorShutdown: (() => Promise<void>) | undefined;\n // shared across restart-induced configureServer reruns\n const scheduler = options.watch ? new RestartScheduler(100, logger) : undefined;\n\n return [\n // gate plugin: enforce 'post' + returned-function so our `stack.unshift`\n // (in installBootGate / installGenStamp) lands at connect position 0,\n // ahead of astro's handler.\n {\n name: '@astroscope/node/dev-gate',\n enforce: 'post',\n\n configureServer(server) {\n if (!scheduler) return;\n\n return () => {\n // gen-stamp is unshifted last so it ends up at position 0:\n // every request gets a generation header before anything else,\n // including the gate's readiness probe.\n installBootGate(server, scheduler);\n installGenStamp(server);\n };\n },\n },\n\n // startup plugin: runs after all other configureServer hooks\n {\n name: '@astroscope/node/dev-startup',\n enforce: 'post',\n\n async configureServer(server) {\n incrementGeneration();\n\n // tear down the previous module first so its resources are released\n // before the new startup tries to claim them.\n if (priorShutdown) {\n await priorShutdown();\n priorShutdown = undefined;\n }\n\n const astroConfig = options.getConfig();\n const bootContext = resolveBootContext(server, astroConfig);\n let bootModule: BootModule | undefined;\n\n setBootContext(bootContext);\n\n try {\n await options.prepare((id) => ssrImport(server, id));\n\n bootModule = entry ? await ssrImport<BootModule>(server, `/${entry}`) : {};\n\n await runStartup(bootModule, bootContext);\n } catch (error) {\n logger.error(`Error running startup script: ${serializeError(error)}`);\n\n if (bootModule) {\n try {\n await runShutdown(bootModule, bootContext);\n } catch {\n // best-effort cleanup\n }\n }\n\n // restart failure: the gate can keep the holding\n // page up with an error message instead of dropping users onto a\n // half-broken old server.\n if (hasStartupSucceededOnce) {\n scheduler?.recordFailure(serializeError(error));\n\n throw error;\n }\n\n // initial failure: exit cleanly (mirrors the production server).\n process.exit(1);\n }\n\n hasStartupSucceededOnce = true;\n scheduler?.clearFailure();\n\n // capture so shutdown sees the same instance that started.\n const startedModule = bootModule;\n let shutdownDone = false;\n\n const shutdown = async (): Promise<void> => {\n if (shutdownDone) return;\n\n shutdownDone = true;\n\n try {\n await runShutdown(startedModule, resolveBootContext(server, options.getConfig()));\n } catch (error) {\n logger.error(`Error running shutdown script: ${serializeError(error)}`);\n }\n\n // the next generation's onStartup re-registers its mounts\n clearNativeMounts();\n };\n\n priorShutdown = shutdown;\n\n // sigint/sigterm path. also fires during restart but shutdown is idempotent.\n server.httpServer?.once('close', () => {\n void shutdown();\n });\n\n if (scheduler) {\n setupBootWatch(server, [...(entry ? [entry] : []), ...options.watchEntries], scheduler);\n }\n },\n },\n ];\n}\n","import type { ExcludePattern } from './excludes.js';\n\n/**\n * Serialize exclude patterns to JavaScript code for use in virtual modules.\n * Handles RegExp objects which JSON.stringify cannot serialize.\n */\nexport function serializeExcludePatterns(patterns: ExcludePattern[]): string {\n return `[${patterns.map((p) => ('pattern' in p ? `{ pattern: ${p.pattern.toString()} }` : JSON.stringify(p))).join(', ')}]`;\n}\n","import type { Plugin } from 'vite';\n\n/**\n * emit sourcemaps only for the SSR build. client bundles are left unmapped\n * so browsers can't fetch source via `//# sourceMappingURL=`.\n *\n * vite 7's `environments.ssr.build.sourcemap` looks cleaner but wholesale\n * replaces astro's SSR build defaults (including entry file naming), which\n * breaks the embedded dev boot machinery. using `isSsrBuild` keeps the\n * rest of astro's SSR config intact.\n */\nexport function ssrSourcemapPlugin(): Plugin {\n return {\n name: '@astroscope/node/tweaks/sourcemap',\n config(_config, { isSsrBuild }) {\n if (isSsrBuild) return { build: { sourcemap: true } };\n\n return {};\n },\n };\n}\n","import { Parser } from 'acorn';\nimport MagicString from 'magic-string';\nimport type { Plugin } from 'vite';\n\nconst HOOK_NAMES = new Set(['useEffect', 'useLayoutEffect', 'useInsertionEffect']);\nconst REACT_SOURCE = /^react(\\/.*)?$/;\nconst TRANSFORMABLE = /\\.(?:[mc]?[jt]sx?)$/;\nconst EMPTY_FN = '(()=>{})';\n\n/**\n * in SSR builds, react effect hooks never execute. emptying their callbacks\n * lets rolldown drop dead branches — including dynamic imports of client-only\n * libs (maplibre-gl, hls.js, etc.) — from the server bundle, which in turn\n * stops nft from tracing them at docker-image time.\n *\n * scope is deliberately narrow: first-party code only (no node_modules), only\n * in the SSR pass, and binding-aware (the React import must resolve to the\n * real react package). raw chunks where bundling has erased the binding are\n * left alone — that's NFT's domain, not ours.\n */\nexport function stripSsrEffectsPlugin(): Plugin {\n return {\n name: '@astroscope/node/tweaks/strip-effects',\n enforce: 'post',\n transform(code, id, options) {\n if (!options?.ssr) return null;\n if (id.includes('/node_modules/')) return null;\n\n const cleanId = id.split('?')[0] ?? id;\n\n if (!TRANSFORMABLE.test(cleanId)) return null;\n if (!code.includes('useEffect') && !code.includes('useLayoutEffect') && !code.includes('useInsertionEffect')) {\n return null;\n }\n\n let ast: any;\n\n try {\n ast = Parser.parse(code, {\n ecmaVersion: 'latest',\n sourceType: 'module',\n allowReturnOutsideFunction: true,\n allowAwaitOutsideFunction: true,\n allowImportExportEverywhere: true,\n allowHashBang: true,\n });\n } catch {\n return null;\n }\n\n const directHooks = new Set<string>();\n const namespaceHooks = new Set<string>();\n\n walk(ast, (node) => {\n if (node.type !== 'ImportDeclaration') return;\n\n const src = node.source?.value;\n\n if (typeof src !== 'string' || !REACT_SOURCE.test(src)) return;\n\n for (const spec of node.specifiers ?? []) {\n if (spec.type === 'ImportSpecifier') {\n const imported = spec.imported?.name ?? spec.imported?.value;\n\n if (HOOK_NAMES.has(imported)) directHooks.add(spec.local.name);\n } else if (spec.type === 'ImportDefaultSpecifier' || spec.type === 'ImportNamespaceSpecifier') {\n namespaceHooks.add(spec.local.name);\n }\n }\n });\n\n if (directHooks.size === 0 && namespaceHooks.size === 0) return null;\n\n const replacements: { start: number; end: number }[] = [];\n\n walk(ast, (node) => {\n if (node.type !== 'CallExpression' || !node.arguments?.length) return;\n\n const callee = node.callee;\n const isDirect = callee.type === 'Identifier' && directHooks.has(callee.name);\n const isMember =\n callee.type === 'MemberExpression' &&\n !callee.computed &&\n callee.object?.type === 'Identifier' &&\n namespaceHooks.has(callee.object.name) &&\n callee.property?.type === 'Identifier' &&\n HOOK_NAMES.has(callee.property.name);\n\n if (!isDirect && !isMember) return;\n\n const arg = node.arguments[0];\n\n replacements.push({ start: arg.start, end: arg.end });\n });\n\n if (replacements.length === 0) return null;\n\n const s = new MagicString(code);\n\n for (const { start, end } of replacements) {\n s.overwrite(start, end, EMPTY_FN);\n }\n\n return { code: s.toString(), map: s.generateMap({ hires: true }) };\n },\n };\n}\n\nfunction walk(node: any, visit: (n: any) => void): void {\n if (!node || typeof node !== 'object') return;\n\n if (typeof node.type === 'string') visit(node);\n\n for (const key of Object.keys(node)) {\n const v = node[key];\n\n if (Array.isArray(v)) for (const item of v) walk(item, visit);\n else if (v && typeof v === 'object') walk(v, visit);\n }\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport type { AstroConfig, AstroIntegration } from 'astro';\nimport { createDevMachinery } from '../dev-mode/machinery.js';\nimport { type ExcludePattern, RECOMMENDED_EXCLUDES, STATIC_EXCLUDES } from '../excludes/excludes.js';\nimport { serializeExcludePatterns } from '../excludes/serialize.js';\nimport { createRequestInstrumentation } from '../observability/instrument.js';\nimport { preparePlatform } from '../platform/prepare.js';\nimport { dispatchNativeMount } from '../server/native-mount.js';\nimport { ssrSourcemapPlugin } from '../tweaks/sourcemap.js';\nimport { stripSsrEffectsPlugin } from '../tweaks/strip-effects.js';\nimport type { NodeOptions, RuntimeOptions } from '../types.js';\n\nexport const CONFIG_VIRTUAL_MODULE_ID = 'virtual:@astroscope/node/config';\nexport const BOOT_VIRTUAL_MODULE_ID = 'virtual:@astroscope/node/boot';\nexport const CSRF_VIRTUAL_MODULE_ID = 'virtual:@astroscope/node/csrf';\nexport const CONFIG_ENTRY_VIRTUAL_MODULE_ID = 'virtual:@astroscope/node/config-entry';\nexport const INSTRUMENTATION_ENTRY_VIRTUAL_MODULE_ID = 'virtual:@astroscope/node/instrumentation-entry';\nexport const LOG_ENTRY_VIRTUAL_MODULE_ID = 'virtual:@astroscope/node/log-entry';\n\nconst RESOLVED_CONFIG_VIRTUAL_MODULE_ID = `\\0${CONFIG_VIRTUAL_MODULE_ID}`;\nconst RESOLVED_BOOT_VIRTUAL_MODULE_ID = `\\0${BOOT_VIRTUAL_MODULE_ID}`;\nconst RESOLVED_CSRF_VIRTUAL_MODULE_ID = `\\0${CSRF_VIRTUAL_MODULE_ID}`;\nconst RESOLVED_CONFIG_ENTRY_VIRTUAL_MODULE_ID = `\\0${CONFIG_ENTRY_VIRTUAL_MODULE_ID}`;\nconst RESOLVED_INSTRUMENTATION_ENTRY_VIRTUAL_MODULE_ID = `\\0${INSTRUMENTATION_ENTRY_VIRTUAL_MODULE_ID}`;\nconst RESOLVED_LOG_ENTRY_VIRTUAL_MODULE_ID = `\\0${LOG_ENTRY_VIRTUAL_MODULE_ID}`;\n\nconst SERVER_ENVIRONMENTS = ['ssr', 'prerender', 'astro'];\n\nconst DEFAULT_REQUEST_EXCLUDES: ExcludePattern[] = [...RECOMMENDED_EXCLUDES, ...STATIC_EXCLUDES];\n\nfunction resolveHost(host: string | boolean | undefined): string {\n if (typeof host === 'string') return host;\n\n return host === true ? '0.0.0.0' : 'localhost';\n}\n\nfunction resolveBootEntry(root: string, entry: string | undefined): string | undefined {\n if (entry) {\n const abs = path.resolve(root, entry);\n\n if (!fs.existsSync(abs)) {\n throw new Error(`[@astroscope/node] boot entry not found: ${entry}`);\n }\n\n return abs;\n }\n\n for (const candidate of ['src/boot/index.ts', 'src/boot.ts']) {\n const abs = path.resolve(root, candidate);\n\n if (fs.existsSync(abs)) return abs;\n }\n\n return undefined;\n}\n\nfunction resolveSeam(root: string, candidate: string): string | undefined {\n const abs = path.resolve(root, candidate);\n\n return fs.existsSync(abs) ? abs : undefined;\n}\n\n/**\n * Node adapter for Astro with a first-class server entrypoint: the boot\n * lifecycle, module warmup, health probes, request logging and telemetry run\n * as plain code around `server.listen()` instead of being injected into the\n * build output.\n */\nexport default function node(options: NodeOptions = {}): AstroIntegration {\n const bootOptions = options.boot ?? {};\n const healthOptions = options.health ?? {};\n const csrfOptions = options.csrf ?? {};\n const loggingOptions = options.logging ?? {};\n const telemetryOptions = options.telemetry ?? {};\n\n const loggingExclude = loggingOptions ? (loggingOptions.exclude ?? DEFAULT_REQUEST_EXCLUDES) : [];\n const telemetryExclude = telemetryOptions ? (telemetryOptions.exclude ?? DEFAULT_REQUEST_EXCLUDES) : [];\n\n let astroConfig: AstroConfig | null = null;\n let bootEntry: string | undefined;\n let configSeam: string | undefined;\n let instrumentationSeam: string | undefined;\n let logSeam: string | undefined;\n let isDev = false;\n\n return {\n name: '@astroscope/node',\n hooks: {\n 'astro:config:setup': ({ command, config, updateConfig, addMiddleware, logger }) => {\n isDev = command === 'dev';\n\n // route enrichment first so csrf-rejected requests still carry a route\n if (loggingOptions || telemetryOptions) {\n addMiddleware({ order: 'pre', entrypoint: '@astroscope/node/route-middleware' });\n }\n\n if (csrfOptions) {\n addMiddleware({ order: 'pre', entrypoint: '@astroscope/node/csrf-middleware' });\n }\n\n const root = fileURLToPath(config.root);\n const watch = bootOptions === false ? false : (bootOptions.watch ?? true);\n\n bootEntry = bootOptions === false ? undefined : resolveBootEntry(root, bootOptions.entry);\n configSeam = resolveSeam(root, 'src/config.ts');\n instrumentationSeam = resolveSeam(root, 'src/instrumentation.ts');\n logSeam = resolveSeam(root, 'src/log.ts');\n\n const relativeSeam = (abs: string | undefined) =>\n abs ? path.relative(root, abs).split(path.sep).join('/') : undefined;\n\n const devMachinery =\n command === 'dev' && bootOptions !== false\n ? createDevMachinery({\n entry: bootEntry ? path.relative(root, bootEntry) : undefined,\n watch,\n // instrumentation runs once per process — watching it would\n // restart generations that can't re-apply it\n watchEntries: [relativeSeam(configSeam), relativeSeam(logSeam)].filter(\n (entry): entry is string => !!entry,\n ),\n prepare: (importModule) =>\n preparePlatform({\n dev: true,\n telemetry:\n telemetryOptions && telemetryOptions.dev\n ? { prometheus: telemetryOptions.prometheus ?? {} }\n : false,\n seams: {\n ...(configSeam && { config: () => importModule(`/${relativeSeam(configSeam)}`) }),\n ...(instrumentationSeam && {\n instrumentation: () => importModule(`/${relativeSeam(instrumentationSeam)}`),\n }),\n ...(logSeam && { log: () => importModule(`/${relativeSeam(logSeam)}`) }),\n },\n }),\n logger,\n getConfig: () => astroConfig,\n })\n : [];\n\n if (command === 'dev' && bootOptions !== false && watch) {\n // catches errors thrown by stale (post-shutdown) requests so\n // they don't pollute the logs during dev-server restarts.\n addMiddleware({ entrypoint: '@astroscope/node/dev-middleware', order: 'pre' });\n }\n\n updateConfig({\n build: { redirects: false },\n // opinionated defaults: no trailing slashes, behind LB\n ...(config.trailingSlash === 'ignore' && { trailingSlash: 'never' as const }),\n security: {\n // assumed to run behind LB\n ...(!config.security.allowedDomains?.length && { allowedDomains: [{}] }),\n // the embedded csrf middleware replaces the built-in origin check\n ...(csrfOptions && { checkOrigin: false }),\n },\n image: {\n endpoint: {\n route: config.image.endpoint.route ?? '_image',\n entrypoint:\n config.image.endpoint.entrypoint ??\n (command === 'dev' ? 'astro/assets/endpoint/dev' : 'astro/assets/endpoint/node'),\n },\n },\n vite: {\n plugins: [\n ...devMachinery,\n ssrSourcemapPlugin(),\n stripSsrEffectsPlugin(),\n {\n name: '@astroscope/node',\n\n configEnvironment(environmentName: string) {\n if (SERVER_ENVIRONMENTS.includes(environmentName)) {\n return { resolve: { noExternal: ['@astroscope/node'] } };\n }\n },\n\n resolveId(id: string) {\n if (id === CONFIG_VIRTUAL_MODULE_ID) return RESOLVED_CONFIG_VIRTUAL_MODULE_ID;\n if (id === BOOT_VIRTUAL_MODULE_ID) return RESOLVED_BOOT_VIRTUAL_MODULE_ID;\n if (id === CSRF_VIRTUAL_MODULE_ID) return RESOLVED_CSRF_VIRTUAL_MODULE_ID;\n if (id === CONFIG_ENTRY_VIRTUAL_MODULE_ID) return RESOLVED_CONFIG_ENTRY_VIRTUAL_MODULE_ID;\n if (id === INSTRUMENTATION_ENTRY_VIRTUAL_MODULE_ID) {\n return RESOLVED_INSTRUMENTATION_ENTRY_VIRTUAL_MODULE_ID;\n }\n if (id === LOG_ENTRY_VIRTUAL_MODULE_ID) return RESOLVED_LOG_ENTRY_VIRTUAL_MODULE_ID;\n },\n\n load(id: string) {\n if (id === RESOLVED_CONFIG_VIRTUAL_MODULE_ID) {\n if (!astroConfig) throw new Error('[@astroscope/node] astro config not resolved yet');\n\n const runtimeOptions: Omit<RuntimeOptions, 'logging' | 'telemetry'> = {\n host: resolveHost(astroConfig.server.host),\n port: astroConfig.server.port ?? 4321,\n client: astroConfig.build.client.toString(),\n server: astroConfig.build.server.toString(),\n bodySizeLimit: options.bodySizeLimit ?? 1024 * 1024 * 1024,\n shutdownTimeout: options.shutdownTimeout ?? 10_000,\n health: healthOptions\n ? {\n ...(healthOptions.host !== undefined && { host: healthOptions.host }),\n ...(healthOptions.port !== undefined && { port: healthOptions.port }),\n ...(healthOptions.paths && { paths: healthOptions.paths }),\n }\n : false,\n };\n\n // exclude patterns may contain RegExp — serialized as code, not JSON\n const logging = loggingOptions\n ? `{ exclude: ${serializeExcludePatterns(loggingExclude)}, extended: ${JSON.stringify(\n loggingOptions.extended ?? false,\n )} }`\n : 'false';\n const telemetry = telemetryOptions\n ? `{ exclude: ${serializeExcludePatterns(telemetryExclude)}, prometheus: ${JSON.stringify(\n telemetryOptions.prometheus ?? {},\n )} }`\n : 'false';\n\n return `export const options = { ...${JSON.stringify(runtimeOptions)}, logging: ${logging}, telemetry: ${telemetry} };`;\n }\n\n if (id === RESOLVED_BOOT_VIRTUAL_MODULE_ID) {\n // re-export to avoid absolute path manifest leaks\n return bootEntry ? `export * from ${JSON.stringify(bootEntry)};` : 'export {};';\n }\n\n if (id === RESOLVED_CSRF_VIRTUAL_MODULE_ID) {\n return `export const excludePatterns = ${serializeExcludePatterns(csrfOptions ? (csrfOptions.exclude ?? []) : [])};`;\n }\n\n if (id === RESOLVED_CONFIG_ENTRY_VIRTUAL_MODULE_ID) {\n // side-effect import: @entwico/zod-conf validation runs at module load\n return configSeam ? `import ${JSON.stringify(configSeam)};\\nexport {};` : 'export {};';\n }\n\n if (id === RESOLVED_INSTRUMENTATION_ENTRY_VIRTUAL_MODULE_ID) {\n return instrumentationSeam ? `export * from ${JSON.stringify(instrumentationSeam)};` : 'export {};';\n }\n\n if (id === RESOLVED_LOG_ENTRY_VIRTUAL_MODULE_ID) {\n return logSeam\n ? `export { default } from ${JSON.stringify(logSeam)};`\n : 'export default undefined;';\n }\n },\n },\n ],\n },\n });\n },\n 'astro:server:setup': ({ server }) => {\n if (!isDev) return;\n\n const devLogging = loggingOptions && loggingOptions.dev;\n const devTelemetry = telemetryOptions && telemetryOptions.dev;\n\n const instrument =\n devLogging || devTelemetry\n ? createRequestInstrumentation({\n logging: devLogging ? { exclude: loggingExclude, extended: loggingOptions.extended ?? false } : false,\n telemetry: devTelemetry ? { exclude: telemetryExclude } : false,\n })\n : undefined;\n\n server.middlewares.use((req, res, next) => {\n const inner = (): void => {\n if (!dispatchNativeMount(req, res)) next();\n };\n\n if (instrument) {\n instrument(req, res, inner);\n } else {\n inner();\n }\n });\n },\n 'astro:config:done': ({ config, setAdapter }) => {\n astroConfig = config;\n\n setAdapter({\n name: '@astroscope/node',\n entrypointResolution: 'auto',\n serverEntrypoint: '@astroscope/node/server',\n previewEntrypoint: '@astroscope/node/preview',\n adapterFeatures: {\n buildOutput: 'server',\n middlewareMode: 'classic',\n },\n supportedAstroFeatures: {\n hybridOutput: 'stable',\n staticOutput: 'stable',\n serverOutput: 'stable',\n sharpImageService: 'stable',\n i18nDomains: 'experimental',\n envGetSecret: 'stable',\n },\n });\n },\n 'astro:build:done': async ({ logger }) => {\n if (!astroConfig) return;\n\n const { compressClientDir } = await import('../compress/compress.js');\n\n await compressClientDir(fileURLToPath(astroConfig.build.client), logger);\n },\n },\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../src/dev-mode/serialize-error.ts","../src/dev-mode/scheduler.ts","../src/dev-mode/vite-env.ts","../src/dev-mode/ignored.ts","../src/dev-mode/watch.ts","../src/dev-mode/machinery.ts","../src/excludes/serialize.ts","../src/tweaks/sourcemap.ts","../src/tweaks/strip-effects.ts","../src/integration/integration.ts"],"sourcesContent":["export function serializeError(error: unknown): string {\n if (error instanceof Error) {\n return error.stack ?? error.message;\n }\n\n return JSON.stringify(error);\n}\n","import path from 'node:path';\nimport type { ViteDevServer } from 'vite';\nimport { serializeError } from './serialize-error.js';\n\ntype Logger = { info(msg: string): void; error(msg: string): void };\n\nconst FULL_RELOAD_UNKNOWN = '<unknown>';\n\n/**\n * Coordinates dev-server restarts: debounces bursts, chains a follow-up if\n * changes arrive mid-restart (vite's `ssrImport` reads disk at import time,\n * so changes during a restart would otherwise be missed), and logs once per\n * restart with what triggered it.\n *\n * One instance per integration, shared across restart-induced configureServer\n * reruns — chain coordination would be lost if recreated each time.\n */\nexport class RestartScheduler {\n private _inFlight = false;\n private _pending = false;\n private _debounceTimer: ReturnType<typeof setTimeout> | undefined;\n private _pendingBootDeps = new Set<string>();\n private _pendingFullReloads = new Set<string>();\n // set while a restart chain is running. the gate probes it (`isRestartPending`)\n // to short-circuit requests, and awaits it (`waitForRestart`) on readiness.\n private _runPromise: Promise<void> | undefined;\n // set when a restart attempt fails\n private _lastFailure: { message: string } | undefined;\n\n constructor(\n private readonly debounceMs: number,\n private readonly logger: Logger,\n ) {}\n\n // true from the moment a change is queued until the restart completes — covers\n // the debounce window too, so requests don't slip past the gate before _run starts.\n isRestartPending(): boolean {\n return !!this._runPromise || !!this._debounceTimer || !!this._lastFailure;\n }\n\n getLastFailure(): { message: string } | undefined {\n return this._lastFailure;\n }\n\n recordFailure(message: string): void {\n this._lastFailure = { message };\n }\n\n clearFailure(): void {\n this._lastFailure = undefined;\n }\n\n schedule(server: ViteDevServer, changedPath: string): void {\n this._pendingBootDeps.add(changedPath);\n this._scheduleRun(server);\n }\n\n scheduleFullReload(server: ViteDevServer, triggeredBy?: string): void {\n this._pendingFullReloads.add(triggeredBy ?? FULL_RELOAD_UNKNOWN);\n this._scheduleRun(server);\n }\n\n /**\n * Resolves when no restart is running. Loops to handle back-to-back restarts\n * (e.g. one chain ends and a queued debounce timer immediately fires a new\n * one). Never rejects, so a failed restart still releases the gate — caller\n * proceeds against the broken state rather than hanging forever.\n */\n async waitForRestart(): Promise<void> {\n while (this._runPromise) {\n try {\n await this._runPromise;\n } catch {\n // restart failed — release anyway\n }\n }\n }\n\n private _scheduleRun(server: ViteDevServer): void {\n clearTimeout(this._debounceTimer);\n this._debounceTimer = setTimeout(() => {\n this._debounceTimer = undefined;\n void this._run(server);\n }, this.debounceMs);\n }\n\n private async _run(server: ViteDevServer): Promise<void> {\n if (this._inFlight) {\n // loop driving the in-flight restart will pick up the next iteration.\n this._pending = true;\n\n return;\n }\n\n this._inFlight = true;\n\n let resolveRun!: () => void;\n\n this._runPromise = new Promise<void>((resolve) => {\n resolveRun = resolve;\n });\n\n try {\n do {\n this._pending = false;\n\n const bootDeps = [...this._pendingBootDeps].sort();\n const fullReloads = [...this._pendingFullReloads].sort();\n\n this._pendingBootDeps.clear();\n this._pendingFullReloads.clear();\n\n if (bootDeps.length > 0 || fullReloads.length > 0) {\n this.logger.info(this._formatReason(server, bootDeps, fullReloads));\n }\n\n try {\n await server.restart();\n } catch (error) {\n this.logger.error(`error during dev server restart: ${serializeError(error)}`);\n }\n } while (this._pending);\n } finally {\n this._inFlight = false;\n this._runPromise = undefined;\n resolveRun();\n }\n }\n\n private _formatReason(server: ViteDevServer, bootDeps: string[], fullReloads: string[]): string {\n const root = server.config.root;\n const rel = (p: string): string => path.relative(root, p) || p;\n const parts: string[] = [];\n\n if (bootDeps.length === 1) {\n parts.push(`boot dep changed: ${rel(bootDeps[0]!)}`);\n } else if (bootDeps.length > 1) {\n parts.push(`boot deps changed (${bootDeps.length}): ${bootDeps.map(rel).join(', ')}`);\n }\n\n if (fullReloads.length > 0) {\n const named = fullReloads.filter((p) => p !== FULL_RELOAD_UNKNOWN);\n\n if (named.length === 0) {\n parts.push('vite SSR full-reload');\n } else {\n parts.push(`vite SSR full-reload (triggered by ${named.map(rel).join(', ')})`);\n }\n }\n\n return `${parts.join(' + ')} — restarting dev server`;\n }\n}\n","import type { DevEnvironment, ViteDevServer } from 'vite';\n\ntype RunnableEnv = DevEnvironment & { runner: { import: (id: string) => Promise<unknown> } };\n\n/**\n * duck-typed runnable-env check. avoids `isRunnableDevEnvironment` which relies on\n * `instanceof RunnableDevEnvironment` — that breaks when the consumer and vite host\n * resolve to different vite installs (e.g. linked packages outside the workspace).\n */\nfunction isRunnable(env: DevEnvironment | undefined): env is RunnableEnv {\n return (\n !!env &&\n typeof (env as { runner?: unknown }).runner === 'object' &&\n typeof (env as RunnableEnv).runner.import === 'function'\n );\n}\n\n/**\n * resolve a runnable dev environment — prefers `ssr`, falls back to `astro`.\n * astro 6 exposes a separate `astro` environment when `ssr` isn't runnable\n * (see astro/core/constants.ts ASTRO_VITE_ENVIRONMENT_NAMES).\n */\nfunction getRunnableEnv(server: ViteDevServer): RunnableEnv {\n const ssr = server.environments['ssr'];\n\n if (isRunnable(ssr)) return ssr;\n\n const astro = server.environments['astro'];\n\n if (isRunnable(astro)) return astro;\n\n const names = Object.keys(server.environments);\n\n throw new Error(`no runnable dev environment found — available: ${names.join(', ')}`);\n}\n\n/**\n * load a module via the Vite Environment API.\n */\nexport async function ssrImport<T = Record<string, unknown>>(server: ViteDevServer, moduleId: string): Promise<T> {\n return getRunnableEnv(server).runner.import(moduleId) as Promise<T>;\n}\n\n/**\n * return the env whose `hot` channel should receive astro-targeted events.\n * astro listens on the env that backs its middleware runner.\n */\nexport function getAstroHotEnv(server: ViteDevServer): DevEnvironment | undefined {\n const ssr = server.environments['ssr'];\n\n if (isRunnable(ssr)) return ssr;\n\n const astro = server.environments['astro'];\n\n if (isRunnable(astro)) return astro;\n\n return undefined;\n}\n","export const ignoredSuffixes = [\n // type definitions\n '.d.ts',\n '.d.mts',\n '.d.cts',\n // images\n '.png',\n '.jpg',\n '.jpeg',\n '.gif',\n '.svg',\n '.webp',\n '.avif',\n '.ico',\n // fonts\n '.woff',\n '.woff2',\n '.ttf',\n '.otf',\n '.eot',\n // other static assets\n '.pdf',\n '.mp3',\n '.mp4',\n '.webm',\n '.ogg',\n '.wav',\n // data/config that boot typically doesn't import\n '.json',\n '.yaml',\n '.yml',\n '.toml',\n '.md',\n '.mdx',\n '.txt',\n // styles (handled by Vite's CSS HMR)\n '.css',\n '.scss',\n '.sass',\n '.less',\n];\n","import type { EventEmitter } from 'node:events';\nimport { readFileSync } from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport type { HotPayload, ViteDevServer } from 'vite';\nimport { GEN_HEADER, getCurrentGeneration } from './generation.js';\nimport { ignoredSuffixes } from './ignored.js';\nimport type { RestartScheduler } from './scheduler.js';\nimport { getAstroHotEnv } from './vite-env.js';\n\nconst RESTART_HTML = readFileSync(fileURLToPath(new URL('./restart-page.html', import.meta.url)), 'utf8');\n\nexport function setupBootWatch(server: ViteDevServer, entries: string[], scheduler: RestartScheduler): void {\n const entryFilePaths = entries.map((entry) => path.resolve(server.config.root, entry));\n\n const runnableEnv = getAstroHotEnv(server);\n const bootModuleGraph = runnableEnv?.moduleGraph;\n\n const collectBootDependencies = (): Set<string> => {\n const deps = new Set<string>();\n const seen = new Set<string>();\n\n for (const entryFilePath of entryFilePaths) {\n const entryModules = bootModuleGraph?.getModulesByFile(entryFilePath);\n const entryModule = entryModules ? [...entryModules][0] : undefined;\n\n if (!entryModule) continue;\n\n const visit = (mod: typeof entryModule): void => {\n if (!mod?.file || seen.has(mod.file)) return;\n\n seen.add(mod.file);\n deps.add(mod.file);\n\n for (const imp of mod.importedModules) visit(imp);\n };\n\n visit(entryModule);\n }\n\n return deps;\n };\n\n const shouldIgnore = (filePath: string): boolean => {\n const p = filePath.toLowerCase();\n\n return ignoredSuffixes.some((suffix) => p.endsWith(suffix));\n };\n\n const onWatcherEvent = (changedPath: string): void => {\n if (shouldIgnore(changedPath)) return;\n\n const bootDeps = collectBootDependencies();\n\n if (!bootDeps.has(changedPath)) return;\n\n scheduler.schedule(server, changedPath);\n };\n\n server.watcher.on('change', onWatcherEvent);\n server.watcher.on('add', onWatcherEvent);\n server.watcher.on('unlink', onWatcherEvent);\n\n // ignore full-reloads emitted during server startup (dep optimization, port retries).\n let handleFullReloads = false;\n\n if (server.httpServer) {\n server.httpServer.once('listening', () => {\n handleFullReloads = true;\n });\n } else {\n // middleware mode — no httpServer, enable immediately\n handleFullReloads = true;\n }\n\n // SSR full-reloads come through the runnable env's hot channel and clear\n // its module runner's cache — onStartup needs to run again on a fresh server.\n const outsideEmitter = (runnableEnv?.hot as { api?: { outsideEmitter?: EventEmitter } } | undefined)?.api\n ?.outsideEmitter;\n\n if (outsideEmitter) {\n outsideEmitter.on('send', (payload: HotPayload) => {\n if (!handleFullReloads) return;\n if (payload.type !== 'full-reload') return;\n\n const triggeredBy = 'triggeredBy' in payload ? (payload.triggeredBy as string) : undefined;\n\n scheduler.scheduleFullReload(server, triggeredBy);\n });\n }\n}\n\nconst READINESS_PATH = '/__astroscope_boot_ready';\n\n/**\n * Gate requests: show 503 holding page during restart, readiness probe for the reload.\n */\nexport function installBootGate(\n server: Pick<ViteDevServer, 'middlewares'>,\n scheduler: Pick<RestartScheduler, 'waitForRestart' | 'isRestartPending' | 'getLastFailure'>,\n): void {\n const middlewares = server.middlewares as unknown as {\n stack: { route: string; handle: unknown }[];\n };\n\n // must be `stack.unshift`ed to land before astro's handler\n middlewares.stack.unshift({\n route: '',\n handle: (async (\n req: { url?: string },\n res: {\n writeHead: (status: number, headers: Record<string, string>) => void;\n end: (body?: string) => void;\n headersSent?: boolean;\n },\n next: (err?: unknown) => void,\n ) => {\n // readiness probe: holding page polls this. blocks until no restart is in\n // flight, then 204 on success / 503 + JSON error if last attempt failed.\n if (req.url === READINESS_PATH) {\n await scheduler.waitForRestart();\n\n if (res.headersSent) return;\n\n const failure = scheduler.getLastFailure();\n\n if (failure) {\n res.writeHead(503, { 'cache-control': 'no-store', 'content-type': 'application/json' });\n res.end(JSON.stringify({ error: failure.message }));\n\n return;\n }\n\n res.writeHead(204, { 'cache-control': 'no-store' });\n res.end();\n\n return;\n }\n\n if (isDevInternalPath(req.url)) {\n next();\n\n return;\n }\n\n // respond now; awaiting the restart would let vite destroy the socket mid-response.\n if (scheduler.isRestartPending()) {\n res.writeHead(503, {\n 'content-type': 'text/html; charset=utf-8',\n 'cache-control': 'no-store',\n 'retry-after': '1',\n });\n res.end(RESTART_HTML);\n\n return;\n }\n\n next();\n }) as never,\n });\n}\n\nfunction isDevInternalPath(url: string | undefined): boolean {\n if (!url) return false;\n\n return url.startsWith('/@') || url.startsWith('/__') || url.includes('/node_modules/');\n}\n\n/**\n * Stamp the current generation onto every incoming request so the runtime\n * Astro middleware can later detect whether the request belongs to a previous\n * (now torn-down) generation\n */\nexport function installGenStamp(server: Pick<ViteDevServer, 'middlewares'>): void {\n const middlewares = server.middlewares as unknown as {\n stack: { route: string; handle: unknown }[];\n };\n\n middlewares.stack.unshift({\n route: '',\n handle: ((req: { headers: Record<string, string> }, _res: unknown, next: () => void) => {\n req.headers[GEN_HEADER] = String(getCurrentGeneration());\n next();\n }) as never,\n });\n}\n","import type { AstroConfig } from 'astro';\nimport type { Plugin } from 'vite';\nimport { setBootContext } from '../lifecycle/context.js';\nimport { type BootModule, runShutdown, runStartup } from '../lifecycle/lifecycle.js';\nimport type { BootContext } from '../lifecycle/types.js';\nimport { clearNativeMounts } from '../server/native-mount.js';\nimport { incrementGeneration } from './generation.js';\nimport { RestartScheduler } from './scheduler.js';\nimport { serializeError } from './serialize-error.js';\nimport { ssrImport } from './vite-env.js';\nimport { installBootGate, installGenStamp, setupBootWatch } from './watch.js';\n\ninterface Logger {\n info(msg: string): void;\n warn(msg: string): void;\n error(msg: string): void;\n}\n\nexport interface DevMachineryOptions {\n /** boot file path relative to the project root; undefined = no boot module */\n entry: string | undefined;\n /** restart the dev server when watched dependencies change */\n watch: boolean;\n /** extra files (relative to the root) whose changes restart the dev server */\n watchEntries: string[];\n /** platform seams; runs each generation before the boot module starts */\n prepare: (importModule: <T = Record<string, unknown>>(id: string) => Promise<T>) => Promise<void>;\n logger: Logger;\n getConfig: () => AstroConfig | null;\n}\n\n/**\n * Resolve the default host and port from the Astro server config.\n * Falls back to `localhost:4321` when no config is provided.\n */\nfunction getServerDefaults(config: AstroConfig | null): { host: string; port: number } {\n return {\n host:\n typeof config?.server?.host === 'string'\n ? config.server.host\n : config?.server?.host === true\n ? '0.0.0.0'\n : 'localhost',\n port: config?.server?.port ?? 4321,\n };\n}\n\n/**\n * Build a dev-mode boot context from the running server's address,\n * falling back to Astro config defaults if the server isn't listening yet.\n */\nfunction resolveBootContext(\n server: { httpServer?: { address(): unknown } | null | undefined },\n config: AstroConfig | null,\n): BootContext {\n const addr = server.httpServer?.address();\n\n if (addr && typeof addr === 'object' && 'address' in addr && 'port' in addr) {\n const host =\n (addr as { address: string }).address === '::' || (addr as { address: string }).address === '0.0.0.0'\n ? 'localhost'\n : (addr as { address: string }).address;\n\n return { dev: true, host, port: (addr as { port: number }).port };\n }\n\n const { host, port } = getServerDefaults(config);\n\n return { dev: true, host, port };\n}\n\n/**\n * The dev-mode boot machinery: runs the platform seams and the boot lifecycle\n * per restart generation, restarts the dev server when watched dependencies\n * change, and gates requests behind a holding page during restarts.\n */\nexport function createDevMachinery(options: DevMachineryOptions): Plugin[] {\n const { entry, logger } = options;\n\n let hasStartupSucceededOnce = false;\n // run by the next configureServer before its startup so resources (ports,\n // sockets, locks) from the previous module are released first. idempotent.\n let priorShutdown: (() => Promise<void>) | undefined;\n // shared across restart-induced configureServer reruns\n const scheduler = options.watch ? new RestartScheduler(100, logger) : undefined;\n\n return [\n // gate plugin: enforce 'post' + returned-function so our `stack.unshift`\n // (in installBootGate / installGenStamp) lands at connect position 0,\n // ahead of astro's handler.\n {\n name: '@astroscope/node/dev-gate',\n enforce: 'post',\n\n configureServer(server) {\n if (!scheduler) return;\n\n return () => {\n // gen-stamp is unshifted last so it ends up at position 0:\n // every request gets a generation header before anything else,\n // including the gate's readiness probe.\n installBootGate(server, scheduler);\n installGenStamp(server);\n };\n },\n },\n\n // startup plugin: runs after all other configureServer hooks\n {\n name: '@astroscope/node/dev-startup',\n enforce: 'post',\n\n async configureServer(server) {\n incrementGeneration();\n\n // tear down the previous module first so its resources are released\n // before the new startup tries to claim them.\n if (priorShutdown) {\n await priorShutdown();\n priorShutdown = undefined;\n }\n\n const astroConfig = options.getConfig();\n const bootContext = resolveBootContext(server, astroConfig);\n let bootModule: BootModule | undefined;\n\n setBootContext(bootContext);\n\n try {\n await options.prepare((id) => ssrImport(server, id));\n\n bootModule = entry ? await ssrImport<BootModule>(server, `/${entry}`) : {};\n\n await runStartup(bootModule, bootContext);\n } catch (error) {\n logger.error(`Error running startup script: ${serializeError(error)}`);\n\n if (bootModule) {\n try {\n await runShutdown(bootModule, bootContext);\n } catch {\n // best-effort cleanup\n }\n }\n\n // restart failure: the gate can keep the holding\n // page up with an error message instead of dropping users onto a\n // half-broken old server.\n if (hasStartupSucceededOnce) {\n scheduler?.recordFailure(serializeError(error));\n\n throw error;\n }\n\n // initial failure: exit cleanly (mirrors the production server).\n process.exit(1);\n }\n\n hasStartupSucceededOnce = true;\n scheduler?.clearFailure();\n\n // capture so shutdown sees the same instance that started.\n const startedModule = bootModule;\n let shutdownDone = false;\n\n const shutdown = async (): Promise<void> => {\n if (shutdownDone) return;\n\n shutdownDone = true;\n\n try {\n await runShutdown(startedModule, resolveBootContext(server, options.getConfig()));\n } catch (error) {\n logger.error(`Error running shutdown script: ${serializeError(error)}`);\n }\n\n // the next generation's onStartup re-registers its mounts\n clearNativeMounts();\n };\n\n priorShutdown = shutdown;\n\n // sigint/sigterm path. also fires during restart but shutdown is idempotent.\n server.httpServer?.once('close', () => {\n void shutdown();\n });\n\n if (scheduler) {\n setupBootWatch(server, [...(entry ? [entry] : []), ...options.watchEntries], scheduler);\n }\n },\n },\n ];\n}\n","import type { ExcludePattern } from './excludes.js';\n\n/**\n * Serialize exclude patterns to JavaScript code for use in virtual modules.\n * Handles RegExp objects which JSON.stringify cannot serialize.\n */\nexport function serializeExcludePatterns(patterns: ExcludePattern[]): string {\n return `[${patterns.map((p) => ('pattern' in p ? `{ pattern: ${p.pattern.toString()} }` : JSON.stringify(p))).join(', ')}]`;\n}\n","import type { Plugin } from 'vite';\n\n/**\n * emit sourcemaps only for the SSR build. client bundles are left unmapped\n * so browsers can't fetch source via `//# sourceMappingURL=`.\n *\n * vite 7's `environments.ssr.build.sourcemap` looks cleaner but wholesale\n * replaces astro's SSR build defaults (including entry file naming), which\n * breaks the embedded dev boot machinery. using `isSsrBuild` keeps the\n * rest of astro's SSR config intact.\n */\nexport function ssrSourcemapPlugin(): Plugin {\n return {\n name: '@astroscope/node/tweaks/sourcemap',\n config(_config, { isSsrBuild }) {\n if (isSsrBuild) return { build: { sourcemap: true } };\n\n return {};\n },\n };\n}\n","import { Parser } from 'acorn';\nimport MagicString from 'magic-string';\nimport type { Plugin } from 'vite';\n\nconst HOOK_NAMES = new Set(['useEffect', 'useLayoutEffect', 'useInsertionEffect']);\nconst REACT_SOURCE = /^react(\\/.*)?$/;\nconst TRANSFORMABLE = /\\.(?:[mc]?[jt]sx?)$/;\nconst EMPTY_FN = '(()=>{})';\n\n/**\n * in SSR builds, react effect hooks never execute. emptying their callbacks\n * lets rolldown drop dead branches — including dynamic imports of client-only\n * libs (maplibre-gl, hls.js, etc.) — from the server bundle, which in turn\n * stops nft from tracing them at docker-image time.\n *\n * scope is deliberately narrow: first-party code only (no node_modules), only\n * in the SSR pass, and binding-aware (the React import must resolve to the\n * real react package). raw chunks where bundling has erased the binding are\n * left alone — that's NFT's domain, not ours.\n */\nexport function stripSsrEffectsPlugin(): Plugin {\n return {\n name: '@astroscope/node/tweaks/strip-effects',\n enforce: 'post',\n transform(code, id, options) {\n if (!options?.ssr) return null;\n if (id.includes('/node_modules/')) return null;\n\n const cleanId = id.split('?')[0] ?? id;\n\n if (!TRANSFORMABLE.test(cleanId)) return null;\n if (!code.includes('useEffect') && !code.includes('useLayoutEffect') && !code.includes('useInsertionEffect')) {\n return null;\n }\n\n let ast: any;\n\n try {\n ast = Parser.parse(code, {\n ecmaVersion: 'latest',\n sourceType: 'module',\n allowReturnOutsideFunction: true,\n allowAwaitOutsideFunction: true,\n allowImportExportEverywhere: true,\n allowHashBang: true,\n });\n } catch {\n return null;\n }\n\n const directHooks = new Set<string>();\n const namespaceHooks = new Set<string>();\n\n walk(ast, (node) => {\n if (node.type !== 'ImportDeclaration') return;\n\n const src = node.source?.value;\n\n if (typeof src !== 'string' || !REACT_SOURCE.test(src)) return;\n\n for (const spec of node.specifiers ?? []) {\n if (spec.type === 'ImportSpecifier') {\n const imported = spec.imported?.name ?? spec.imported?.value;\n\n if (HOOK_NAMES.has(imported)) directHooks.add(spec.local.name);\n } else if (spec.type === 'ImportDefaultSpecifier' || spec.type === 'ImportNamespaceSpecifier') {\n namespaceHooks.add(spec.local.name);\n }\n }\n });\n\n if (directHooks.size === 0 && namespaceHooks.size === 0) return null;\n\n const replacements: { start: number; end: number }[] = [];\n\n walk(ast, (node) => {\n if (node.type !== 'CallExpression' || !node.arguments?.length) return;\n\n const callee = node.callee;\n const isDirect = callee.type === 'Identifier' && directHooks.has(callee.name);\n const isMember =\n callee.type === 'MemberExpression' &&\n !callee.computed &&\n callee.object?.type === 'Identifier' &&\n namespaceHooks.has(callee.object.name) &&\n callee.property?.type === 'Identifier' &&\n HOOK_NAMES.has(callee.property.name);\n\n if (!isDirect && !isMember) return;\n\n const arg = node.arguments[0];\n\n replacements.push({ start: arg.start, end: arg.end });\n });\n\n if (replacements.length === 0) return null;\n\n const s = new MagicString(code);\n\n for (const { start, end } of replacements) {\n s.overwrite(start, end, EMPTY_FN);\n }\n\n return { code: s.toString(), map: s.generateMap({ hires: true }) };\n },\n };\n}\n\nfunction walk(node: any, visit: (n: any) => void): void {\n if (!node || typeof node !== 'object') return;\n\n if (typeof node.type === 'string') visit(node);\n\n for (const key of Object.keys(node)) {\n const v = node[key];\n\n if (Array.isArray(v)) for (const item of v) walk(item, visit);\n else if (v && typeof v === 'object') walk(v, visit);\n }\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport type { AstroConfig, AstroIntegration } from 'astro';\nimport { createDevMachinery } from '../dev-mode/machinery.js';\nimport { type ExcludePattern, RECOMMENDED_EXCLUDES } from '../excludes/excludes.js';\nimport { serializeExcludePatterns } from '../excludes/serialize.js';\nimport { createRequestInstrumentation } from '../observability/instrument.js';\nimport { preparePlatform } from '../platform/prepare.js';\nimport { dispatchNativeMount } from '../server/native-mount.js';\nimport { ssrSourcemapPlugin } from '../tweaks/sourcemap.js';\nimport { stripSsrEffectsPlugin } from '../tweaks/strip-effects.js';\nimport type { NodeOptions, RuntimeOptions } from '../types.js';\n\nexport const CONFIG_VIRTUAL_MODULE_ID = 'virtual:@astroscope/node/config';\nexport const BOOT_VIRTUAL_MODULE_ID = 'virtual:@astroscope/node/boot';\nexport const CSRF_VIRTUAL_MODULE_ID = 'virtual:@astroscope/node/csrf';\nexport const CONFIG_ENTRY_VIRTUAL_MODULE_ID = 'virtual:@astroscope/node/config-entry';\nexport const INSTRUMENTATION_ENTRY_VIRTUAL_MODULE_ID = 'virtual:@astroscope/node/instrumentation-entry';\nexport const LOG_ENTRY_VIRTUAL_MODULE_ID = 'virtual:@astroscope/node/log-entry';\n\nconst RESOLVED_CONFIG_VIRTUAL_MODULE_ID = `\\0${CONFIG_VIRTUAL_MODULE_ID}`;\nconst RESOLVED_BOOT_VIRTUAL_MODULE_ID = `\\0${BOOT_VIRTUAL_MODULE_ID}`;\nconst RESOLVED_CSRF_VIRTUAL_MODULE_ID = `\\0${CSRF_VIRTUAL_MODULE_ID}`;\nconst RESOLVED_CONFIG_ENTRY_VIRTUAL_MODULE_ID = `\\0${CONFIG_ENTRY_VIRTUAL_MODULE_ID}`;\nconst RESOLVED_INSTRUMENTATION_ENTRY_VIRTUAL_MODULE_ID = `\\0${INSTRUMENTATION_ENTRY_VIRTUAL_MODULE_ID}`;\nconst RESOLVED_LOG_ENTRY_VIRTUAL_MODULE_ID = `\\0${LOG_ENTRY_VIRTUAL_MODULE_ID}`;\n\nconst SERVER_ENVIRONMENTS = ['ssr', 'prerender', 'astro'];\nconst DEFAULT_REQUEST_EXCLUDES: ExcludePattern[] = [...RECOMMENDED_EXCLUDES];\n\nfunction resolveHost(host: string | boolean | undefined): string {\n if (typeof host === 'string') return host;\n\n return host === true ? '0.0.0.0' : 'localhost';\n}\n\nfunction resolveBootEntry(root: string, entry: string | undefined): string | undefined {\n if (entry) {\n const abs = path.resolve(root, entry);\n\n if (!fs.existsSync(abs)) {\n throw new Error(`[@astroscope/node] boot entry not found: ${entry}`);\n }\n\n return abs;\n }\n\n for (const candidate of ['src/boot/index.ts', 'src/boot.ts']) {\n const abs = path.resolve(root, candidate);\n\n if (fs.existsSync(abs)) return abs;\n }\n\n return undefined;\n}\n\nfunction resolveSeam(root: string, candidate: string): string | undefined {\n const abs = path.resolve(root, candidate);\n\n return fs.existsSync(abs) ? abs : undefined;\n}\n\n/**\n * Node adapter for Astro with a first-class server entrypoint: the boot\n * lifecycle, module warmup, health probes, request logging and telemetry run\n * as plain code around `server.listen()` instead of being injected into the\n * build output.\n */\nexport default function node(options: NodeOptions = {}): AstroIntegration {\n const bootOptions = options.boot ?? {};\n const healthOptions = options.health ?? {};\n const csrfOptions = options.csrf ?? {};\n const loggingOptions = options.logging ?? {};\n const telemetryOptions = options.telemetry ?? {};\n\n const loggingExclude = loggingOptions ? (loggingOptions.exclude ?? DEFAULT_REQUEST_EXCLUDES) : [];\n const telemetryExclude = telemetryOptions ? (telemetryOptions.exclude ?? DEFAULT_REQUEST_EXCLUDES) : [];\n\n let astroConfig: AstroConfig | null = null;\n let bootEntry: string | undefined;\n let configSeam: string | undefined;\n let instrumentationSeam: string | undefined;\n let logSeam: string | undefined;\n let isDev = false;\n\n return {\n name: '@astroscope/node',\n hooks: {\n 'astro:config:setup': ({ command, config, updateConfig, addMiddleware, logger }) => {\n isDev = command === 'dev';\n\n // route enrichment first so csrf-rejected requests still carry a route\n if (loggingOptions || telemetryOptions) {\n addMiddleware({ order: 'pre', entrypoint: '@astroscope/node/route-middleware' });\n }\n\n if (csrfOptions) {\n addMiddleware({ order: 'pre', entrypoint: '@astroscope/node/csrf-middleware' });\n }\n\n const root = fileURLToPath(config.root);\n const watch = bootOptions === false ? false : (bootOptions.watch ?? true);\n\n bootEntry = bootOptions === false ? undefined : resolveBootEntry(root, bootOptions.entry);\n configSeam = resolveSeam(root, 'src/config.ts');\n instrumentationSeam = resolveSeam(root, 'src/instrumentation.ts');\n logSeam = resolveSeam(root, 'src/log.ts');\n\n const relativeSeam = (abs: string | undefined) =>\n abs ? path.relative(root, abs).split(path.sep).join('/') : undefined;\n\n const devMachinery =\n command === 'dev' && bootOptions !== false\n ? createDevMachinery({\n entry: bootEntry ? path.relative(root, bootEntry) : undefined,\n watch,\n // instrumentation runs once per process — watching it would\n // restart generations that can't re-apply it\n watchEntries: [relativeSeam(configSeam), relativeSeam(logSeam)].filter(\n (entry): entry is string => !!entry,\n ),\n prepare: (importModule) =>\n preparePlatform({\n dev: true,\n telemetry:\n telemetryOptions && telemetryOptions.dev\n ? { prometheus: telemetryOptions.prometheus ?? {} }\n : false,\n seams: {\n ...(configSeam && { config: () => importModule(`/${relativeSeam(configSeam)}`) }),\n ...(instrumentationSeam && {\n instrumentation: () => importModule(`/${relativeSeam(instrumentationSeam)}`),\n }),\n ...(logSeam && { log: () => importModule(`/${relativeSeam(logSeam)}`) }),\n },\n }),\n logger,\n getConfig: () => astroConfig,\n })\n : [];\n\n if (command === 'dev' && bootOptions !== false && watch) {\n // catches errors thrown by stale (post-shutdown) requests so\n // they don't pollute the logs during dev-server restarts.\n addMiddleware({ entrypoint: '@astroscope/node/dev-middleware', order: 'pre' });\n }\n\n updateConfig({\n build: { redirects: false },\n // opinionated defaults: no trailing slashes, behind LB\n ...(config.trailingSlash === 'ignore' && { trailingSlash: 'never' as const }),\n security: {\n // assumed to run behind LB\n ...(!config.security.allowedDomains?.length && { allowedDomains: [{}] }),\n // the embedded csrf middleware replaces the built-in origin check\n ...(csrfOptions && { checkOrigin: false }),\n },\n image: {\n endpoint: {\n route: config.image.endpoint.route ?? '_image',\n entrypoint:\n config.image.endpoint.entrypoint ??\n (command === 'dev' ? 'astro/assets/endpoint/dev' : 'astro/assets/endpoint/node'),\n },\n },\n vite: {\n plugins: [\n ...devMachinery,\n ssrSourcemapPlugin(),\n stripSsrEffectsPlugin(),\n {\n name: '@astroscope/node',\n\n configEnvironment(environmentName: string) {\n if (SERVER_ENVIRONMENTS.includes(environmentName)) {\n return { resolve: { noExternal: ['@astroscope/node'] } };\n }\n },\n\n resolveId(id: string) {\n if (id === CONFIG_VIRTUAL_MODULE_ID) return RESOLVED_CONFIG_VIRTUAL_MODULE_ID;\n if (id === BOOT_VIRTUAL_MODULE_ID) return RESOLVED_BOOT_VIRTUAL_MODULE_ID;\n if (id === CSRF_VIRTUAL_MODULE_ID) return RESOLVED_CSRF_VIRTUAL_MODULE_ID;\n if (id === CONFIG_ENTRY_VIRTUAL_MODULE_ID) return RESOLVED_CONFIG_ENTRY_VIRTUAL_MODULE_ID;\n if (id === INSTRUMENTATION_ENTRY_VIRTUAL_MODULE_ID) {\n return RESOLVED_INSTRUMENTATION_ENTRY_VIRTUAL_MODULE_ID;\n }\n if (id === LOG_ENTRY_VIRTUAL_MODULE_ID) return RESOLVED_LOG_ENTRY_VIRTUAL_MODULE_ID;\n },\n\n load(id: string) {\n if (id === RESOLVED_CONFIG_VIRTUAL_MODULE_ID) {\n if (!astroConfig) throw new Error('[@astroscope/node] astro config not resolved yet');\n\n const runtimeOptions: Omit<RuntimeOptions, 'logging' | 'telemetry'> = {\n host: resolveHost(astroConfig.server.host),\n port: astroConfig.server.port ?? 4321,\n client: astroConfig.build.client.toString(),\n server: astroConfig.build.server.toString(),\n bodySizeLimit: options.bodySizeLimit ?? 1024 * 1024 * 1024,\n shutdownTimeout: options.shutdownTimeout ?? 10_000,\n health: healthOptions\n ? {\n ...(healthOptions.host !== undefined && { host: healthOptions.host }),\n ...(healthOptions.port !== undefined && { port: healthOptions.port }),\n ...(healthOptions.paths && { paths: healthOptions.paths }),\n }\n : false,\n };\n\n // exclude patterns may contain RegExp — serialized as code, not JSON\n const logging = loggingOptions\n ? `{ exclude: ${serializeExcludePatterns(loggingExclude)}, extended: ${JSON.stringify(\n loggingOptions.extended ?? false,\n )} }`\n : 'false';\n const telemetry = telemetryOptions\n ? `{ exclude: ${serializeExcludePatterns(telemetryExclude)}, prometheus: ${JSON.stringify(\n telemetryOptions.prometheus ?? {},\n )} }`\n : 'false';\n\n return `export const options = { ...${JSON.stringify(runtimeOptions)}, logging: ${logging}, telemetry: ${telemetry} };`;\n }\n\n if (id === RESOLVED_BOOT_VIRTUAL_MODULE_ID) {\n // re-export to avoid absolute path manifest leaks\n return bootEntry ? `export * from ${JSON.stringify(bootEntry)};` : 'export {};';\n }\n\n if (id === RESOLVED_CSRF_VIRTUAL_MODULE_ID) {\n return `export const excludePatterns = ${serializeExcludePatterns(csrfOptions ? (csrfOptions.exclude ?? []) : [])};`;\n }\n\n if (id === RESOLVED_CONFIG_ENTRY_VIRTUAL_MODULE_ID) {\n // side-effect import: @entwico/zod-conf validation runs at module load\n return configSeam ? `import ${JSON.stringify(configSeam)};\\nexport {};` : 'export {};';\n }\n\n if (id === RESOLVED_INSTRUMENTATION_ENTRY_VIRTUAL_MODULE_ID) {\n return instrumentationSeam ? `export * from ${JSON.stringify(instrumentationSeam)};` : 'export {};';\n }\n\n if (id === RESOLVED_LOG_ENTRY_VIRTUAL_MODULE_ID) {\n return logSeam\n ? `export { default } from ${JSON.stringify(logSeam)};`\n : 'export default undefined;';\n }\n },\n },\n ],\n },\n });\n },\n 'astro:server:setup': ({ server }) => {\n if (!isDev) return;\n\n const devLogging = loggingOptions && loggingOptions.dev;\n const devTelemetry = telemetryOptions && telemetryOptions.dev;\n\n const instrument =\n devLogging || devTelemetry\n ? createRequestInstrumentation({\n logging: devLogging ? { exclude: loggingExclude, extended: loggingOptions.extended ?? false } : false,\n telemetry: devTelemetry ? { exclude: telemetryExclude } : false,\n })\n : undefined;\n\n server.middlewares.use((req, res, next) => {\n const inner = (): void => {\n if (!dispatchNativeMount(req, res)) next();\n };\n\n if (instrument) {\n instrument(req, res, inner);\n } else {\n inner();\n }\n });\n },\n 'astro:config:done': ({ config, setAdapter }) => {\n astroConfig = config;\n\n setAdapter({\n name: '@astroscope/node',\n entrypointResolution: 'auto',\n serverEntrypoint: '@astroscope/node/server',\n previewEntrypoint: '@astroscope/node/preview',\n adapterFeatures: {\n buildOutput: 'server',\n middlewareMode: 'classic',\n },\n supportedAstroFeatures: {\n hybridOutput: 'stable',\n staticOutput: 'stable',\n serverOutput: 'stable',\n sharpImageService: 'stable',\n i18nDomains: 'experimental',\n envGetSecret: 'stable',\n },\n });\n },\n 'astro:build:done': async ({ logger }) => {\n if (!astroConfig) return;\n\n const { compressClientDir } = await import('../compress/compress.js');\n\n await compressClientDir(fileURLToPath(astroConfig.build.client), logger);\n },\n },\n };\n}\n"],"mappings":"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"}
|
package/dist/server.js
CHANGED
|
@@ -332,6 +332,10 @@ async function startServer(overrides) {
|
|
|
332
332
|
log.debug("health probes listening");
|
|
333
333
|
}
|
|
334
334
|
const startup = startLifecycleSpan("startup");
|
|
335
|
+
log.info({
|
|
336
|
+
host,
|
|
337
|
+
port
|
|
338
|
+
}, "starting");
|
|
335
339
|
let bootModule = {};
|
|
336
340
|
let bootMs = 0;
|
|
337
341
|
let warmupMs = 0;
|
|
@@ -431,7 +435,7 @@ async function startServer(overrides) {
|
|
|
431
435
|
});
|
|
432
436
|
const doStop = async () => {
|
|
433
437
|
if (health) probes.ready.disable();
|
|
434
|
-
log.info("
|
|
438
|
+
log.info("shutdown initiated");
|
|
435
439
|
const drainStartedAt = performance.now();
|
|
436
440
|
const shutdown = startLifecycleSpan("shutdown");
|
|
437
441
|
await withLifecycleSpan("drain", shutdown.context, async () => {
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","names":["healthServer","server"],"sources":["../src/observability/telemetry/lifecycle.ts","../src/server/client-dir.ts","../src/server/serve-app.ts","../src/server/serve-static.ts","../src/server/server.ts"],"sourcesContent":["import { type Context, type Span, SpanStatusCode, context, trace } from '@opentelemetry/api';\n\nconst LIB_NAME = '@astroscope/node';\n\n/**\n * Lifecycle spans (`startup` / `shutdown` with phase children). No-op when no\n * SDK is registered — `trace.getTracer` returns the no-op tracer.\n */\n\nexport function startLifecycleSpan(name: string, parent?: Context): { span: Span; context: Context } {\n const parentContext = parent ?? context.active();\n const span = trace.getTracer(LIB_NAME).startSpan(name, undefined, parentContext);\n\n return { span, context: trace.setSpan(parentContext, span) };\n}\n\nexport async function withLifecycleSpan<T>(name: string, parent: Context, fn: () => Promise<T> | T): Promise<T> {\n const { span, context: spanContext } = startLifecycleSpan(name, parent);\n\n try {\n const result = await context.with(spanContext, fn);\n\n span.setStatus({ code: SpanStatusCode.OK });\n\n return result;\n } catch (err) {\n span.setStatus({ code: SpanStatusCode.ERROR, message: err instanceof Error ? err.message : 'unknown error' });\n\n throw err;\n } finally {\n span.end();\n }\n}\n","import path from 'node:path';\nimport url from 'node:url';\n\n/**\n * Resolve the client directory at runtime relative to the built server entry.\n *\n * The build-time client/server URLs are only valid on the build machine; in a\n * container the deploy path differs. Walk up from `import.meta.url` of the\n * bundled server code until the server directory is found, then apply the\n * build-time server→client relative path.\n */\nexport function resolveClientDir(options: { client: string; server: string }, importMetaUrl: string): string {\n const clientPath = url.fileURLToPath(new URL(options.client));\n const serverPath = url.fileURLToPath(new URL(options.server));\n const rel = path.relative(serverPath, clientPath);\n const serverFolder = path.basename(serverPath);\n\n let serverEntryFolderURL = path.dirname(importMetaUrl);\n let previous = '';\n\n while (!serverEntryFolderURL.endsWith(serverFolder)) {\n if (serverEntryFolderURL === previous) {\n throw new Error(\n `[@astroscope/node] could not find the server directory \"${serverFolder}\" by walking up from \"${importMetaUrl}\"`,\n );\n }\n\n previous = serverEntryFolderURL;\n serverEntryFolderURL = path.dirname(serverEntryFolderURL);\n }\n\n const clientURL = new URL(rel.endsWith('/') ? rel : `${rel}/`, `${serverEntryFolderURL}/entry.mjs`);\n\n return url.fileURLToPath(clientURL);\n}\n","import { createReadStream } from 'node:fs';\nimport type { IncomingMessage, ServerResponse } from 'node:http';\nimport path from 'node:path';\nimport { Readable } from 'node:stream';\nimport type { BaseApp } from 'astro/app';\nimport { createRequestFromNodeRequest, writeResponse } from 'astro/app/node';\nimport { log } from '../observability/log/index.js';\nimport { getRequestRecord } from '../observability/log/store.js';\nimport type { RuntimeOptions } from '../types.js';\n\nasync function readFSErrorPage(client: string, status: number): Promise<Response | undefined> {\n const filePaths = [`${status}.html`, `${status}/index.html`];\n\n for (const filePath of filePaths) {\n const fullPath = path.join(client, filePath);\n let stream: ReturnType<typeof createReadStream> | undefined;\n\n try {\n stream = createReadStream(fullPath);\n\n await new Promise<void>((resolve, reject) => {\n stream!.once('open', () => resolve());\n stream!.once('error', reject);\n });\n\n return new Response(Readable.toWeb(stream) as ReadableStream, {\n headers: { 'Content-Type': 'text/html; charset=utf-8' },\n });\n } catch {\n stream?.destroy();\n }\n }\n\n return undefined;\n}\n\n/**\n * Render on-demand routes: node req → web Request → `app.render()` → node res.\n * Prerendered pages never reach this handler (the static handler serves them);\n * requests for them landing here render the 404 route.\n */\nexport function createAppHandler(app: BaseApp, options: RuntimeOptions, client: string) {\n process.on('unhandledRejection', (reason) => {\n const requestUrl = getRequestRecord()?.url;\n\n log.error(\n {\n ...(reason instanceof Error ? { err: reason } : { reason }),\n ...(requestUrl && { url: requestUrl }),\n },\n requestUrl ? 'unhandled rejection while rendering' : 'unhandled rejection',\n );\n });\n\n const prerenderedErrorPageFetch = async (url: string): Promise<Response> => {\n const { pathname } = new URL(url);\n\n for (const status of [404, 500]) {\n if (pathname.endsWith(`/${status}.html`) || pathname.endsWith(`/${status}/index.html`)) {\n const response = await readFSErrorPage(client, status);\n\n if (response) return response;\n }\n }\n\n return new Response(null, { status: 404 });\n };\n\n const bodySizeLimit =\n options.bodySizeLimit === 0 || options.bodySizeLimit === Number.POSITIVE_INFINITY\n ? undefined\n : options.bodySizeLimit;\n\n return async (req: IncomingMessage, res: ServerResponse): Promise<void> => {\n let request: Request;\n\n try {\n request = createRequestFromNodeRequest(req, {\n allowedDomains: app.getAllowedDomains?.() ?? [],\n ...(bodySizeLimit !== undefined && { bodySizeLimit }),\n port: options.port,\n });\n } catch (err) {\n log.error(err instanceof Error ? { err, url: req.url } : { reason: err, url: req.url }, 'could not render');\n\n res.statusCode = 500;\n res.end('Internal Server Error');\n\n return;\n }\n\n const routeData = app.match(request, true);\n\n const response =\n routeData && !(routeData.type === 'page' && routeData.prerender)\n ? await app.render(request, { addCookieHeader: true, routeData, prerenderedErrorPageFetch })\n : await app.render(request, { addCookieHeader: true, prerenderedErrorPageFetch });\n\n await writeResponse(response, res);\n };\n}\n","import fs from 'node:fs';\nimport type { IncomingMessage, ServerResponse } from 'node:http';\nimport path from 'node:path';\nimport type { BaseApp } from 'astro/app';\nimport send from 'send';\nimport { COMPRESSIBLE, MIME_TYPES } from './mime.js';\n\nconst VARIANTS = [\n { encoding: 'br', suffix: '.br' },\n { encoding: 'gzip', suffix: '.gz' },\n] as const;\n\nfunction negotiateVariant(\n req: IncomingMessage,\n client: string,\n pathname: string,\n): { pathname: string; encoding: string } | undefined {\n const accept = req.headers['accept-encoding'];\n\n if (typeof accept !== 'string') return undefined;\n\n for (const { encoding, suffix } of VARIANTS) {\n if (!accept.includes(encoding)) continue;\n\n if (fs.existsSync(path.join(client, `${pathname}${suffix}`))) {\n return { pathname: `${pathname}${suffix}`, encoding };\n }\n }\n\n return undefined;\n}\n\nfunction hasFileExtension(pathname: string): boolean {\n const last = pathname.split('/').pop();\n\n return !!last && last.includes('.');\n}\n\nfunction prependForwardSlash(pathname: string): string {\n return pathname.startsWith('/') ? pathname : `/${pathname}`;\n}\n\nfunction isDirectory(client: string, urlPath: string): boolean {\n const filePath = path.join(client, urlPath);\n const resolved = path.resolve(filePath);\n const resolvedClient = path.resolve(client);\n\n // path traversal guard\n if (resolved !== resolvedClient && !resolved.startsWith(resolvedClient + path.sep)) {\n return false;\n }\n\n try {\n return fs.lstatSync(filePath).isDirectory();\n } catch {\n return false;\n }\n}\n\n/**\n * Serve files from the client build directory, falling through to `ssr` when\n * no file matches. Handles trailing-slash redirects per the manifest config\n * and marks hashed assets as immutable.\n */\nexport function createStaticHandler(app: BaseApp, client: string) {\n return (req: IncomingMessage, res: ServerResponse, ssr: () => void): void => {\n if (!req.url) {\n ssr();\n\n return;\n }\n\n let fullUrl = req.url;\n\n if (fullUrl.includes('#')) {\n fullUrl = fullUrl.slice(0, fullUrl.indexOf('#'));\n }\n\n const [urlPath = '', urlQuery] = fullUrl.split('?');\n let fsPath = app.removeBase(urlPath);\n\n try {\n fsPath = decodeURI(fsPath);\n } catch {\n // fall through with the raw path; send() rejects malformed paths itself\n }\n\n const dir = isDirectory(client, fsPath);\n const hasSlash = urlPath.endsWith('/');\n let pathname = urlPath;\n\n switch (app.manifest.trailingSlash) {\n case 'never': {\n if (dir && urlPath !== '/' && hasSlash) {\n res.statusCode = 301;\n res.setHeader('Location', urlPath.slice(0, -1) + (urlQuery ? `?${urlQuery}` : ''));\n res.end();\n\n return;\n }\n\n if (dir && !hasSlash) {\n pathname = `${urlPath}/index.html`;\n }\n\n break;\n }\n case 'ignore': {\n if (dir && !hasSlash) {\n pathname = `${urlPath}/index.html`;\n }\n\n break;\n }\n case 'always': {\n if (!hasSlash && !hasFileExtension(urlPath) && !urlPath.startsWith('/_')) {\n res.statusCode = 301;\n res.setHeader('Location', `${urlPath}/${urlQuery ? `?${urlQuery}` : ''}`);\n res.end();\n\n return;\n }\n\n break;\n }\n }\n\n pathname = prependForwardSlash(app.removeBase(pathname));\n\n const normalizedPathname = path.posix.normalize(pathname);\n const compressible = COMPRESSIBLE.has(path.posix.extname(normalizedPathname));\n const variant = compressible ? negotiateVariant(req, client, normalizedPathname) : undefined;\n\n const stream = send(req, variant?.pathname ?? normalizedPathname, {\n root: client,\n dotfiles: normalizedPathname.startsWith('/.well-known/') ? 'allow' : 'deny',\n // with build.format 'file' or 'preserve', pages are output as `page.html`\n // instead of `page/index.html` — let send() try appending `.html`\n extensions: app.manifest.buildFormat === 'file' || app.manifest.buildFormat === 'preserve' ? ['html'] : [],\n });\n\n let forwardError = false;\n\n stream.on('error', (err: NodeJS.ErrnoException & { statusCode?: number }) => {\n if (forwardError) {\n const status = err.statusCode ?? 500;\n\n if (status >= 500) {\n console.error(err.toString());\n }\n\n res.writeHead(status);\n res.end(status >= 500 ? 'Internal server error' : '');\n\n return;\n }\n\n ssr();\n });\n\n stream.on('file', () => {\n forwardError = true;\n });\n\n // fires before the body and before conditional-GET handling, so these\n // headers also land on 304 responses\n stream.on('headers', (headersRes: ServerResponse) => {\n if (compressible) {\n headersRes.setHeader('Vary', 'Accept-Encoding');\n }\n\n if (variant) {\n headersRes.setHeader('Content-Encoding', variant.encoding);\n headersRes.setHeader(\n 'Content-Type',\n MIME_TYPES.get(path.posix.extname(normalizedPathname)) ?? 'application/octet-stream',\n );\n }\n\n if (normalizedPathname.startsWith(`/${app.manifest.assetsDir}/`)) {\n headersRes.setHeader('Cache-Control', 'public, max-age=31536000, immutable');\n }\n });\n\n stream.pipe(res);\n };\n}\n","import fs from 'node:fs';\nimport http from 'node:http';\nimport https from 'node:https';\nimport { checks, server as healthServer, probes } from '@entwico/health-probes';\nimport { SpanStatusCode } from '@opentelemetry/api';\nimport { createApp } from 'astro/app/entrypoint';\nimport { setGetEnv } from 'astro/env/setup';\n// @ts-expect-error virtual module provided by the integration\nimport { options } from 'virtual:@astroscope/node/config';\nimport { activateHealthChecks, deactivateHealthChecks } from '../health/store.js';\nimport { setBootContext } from '../lifecycle/context.js';\nimport { type BootModule, runShutdown, runStartup } from '../lifecycle/lifecycle.js';\nimport type { BootContext } from '../lifecycle/types.js';\nimport { createRequestInstrumentation } from '../observability/instrument.js';\nimport { dumpEarlyLogs } from '../observability/log/construct.js';\nimport { log } from '../observability/log/index.js';\nimport { startLifecycleSpan, withLifecycleSpan } from '../observability/telemetry/lifecycle.js';\nimport { shutdownTelemetry } from '../observability/telemetry/sdk.js';\nimport { preparePlatform } from '../platform/prepare.js';\nimport type { RuntimeOptions } from '../types.js';\nimport { resolveClientDir } from './client-dir.js';\nimport { clearNativeMounts, dispatchNativeMount } from './native-mount.js';\nimport { createAppHandler } from './serve-app.js';\nimport { createStaticHandler } from './serve-static.js';\n\nsetGetEnv((key) => process.env[key]);\n\nconst runtimeOptions = options as RuntimeOptions;\nconst app = createApp({ streaming: true });\n\nconst roundMs = (n: number) => Math.round(n * 100) / 100;\n\n/**\n * Pre-import every lazily loaded server module (pages, middleware, actions,\n * session driver) so the first request pays no import cost. Uses the\n * manifest's own loaders — exactly what the runtime calls per request.\n */\nasync function warmupModules(): Promise<void> {\n const loaders = [\n ...(app.manifest.pageMap?.values() ?? []),\n app.manifest.middleware,\n app.manifest.actions,\n app.manifest.sessionDriver,\n app.manifest.serverIslandMappings,\n ].filter((load) => load !== undefined);\n\n const results = await Promise.allSettled(loaders.map((load) => load()));\n\n for (const result of results) {\n if (result.status === 'rejected') {\n log.error(\n result.reason instanceof Error ? { err: result.reason } : { reason: result.reason },\n 'warmup import failed',\n );\n }\n }\n}\n\n/**\n * TLS tokens from `SERVER_CERT_PATH` / `SERVER_KEY_PATH` (same contract as\n * `@astrojs/node`). Read after env loading, so the paths may come from `.env`.\n */\nfunction loadTlsOptions(): { cert: Buffer; key: Buffer } | undefined {\n const certPath = process.env['SERVER_CERT_PATH'];\n const keyPath = process.env['SERVER_KEY_PATH'];\n\n if (!certPath && !keyPath) return undefined;\n\n if (!certPath || !keyPath) {\n throw new Error('SERVER_CERT_PATH and SERVER_KEY_PATH must both be set to serve HTTPS');\n }\n\n return { cert: fs.readFileSync(certPath), key: fs.readFileSync(keyPath) };\n}\n\nexport interface ServerHandle {\n host: string;\n port: number;\n stop(): Promise<void>;\n closed(): Promise<void>;\n}\n\nexport async function startServer(overrides?: {\n host?: string | undefined;\n port?: number | undefined;\n}): Promise<ServerHandle> {\n const startedAt = performance.now();\n const host = overrides?.host ?? process.env['HOST'] ?? runtimeOptions.host;\n const port = overrides?.port ?? (process.env['PORT'] ? Number(process.env['PORT']) : runtimeOptions.port);\n const context: BootContext = { dev: false, host, port };\n const health = runtimeOptions.health;\n\n setBootContext(context);\n\n try {\n await preparePlatform({\n dev: false,\n telemetry: runtimeOptions.telemetry ? { prometheus: runtimeOptions.telemetry.prometheus } : false,\n seams: {\n config: () => import('virtual:@astroscope/node/config-entry'),\n instrumentation: () => import('virtual:@astroscope/node/instrumentation-entry'),\n log: () => import('virtual:@astroscope/node/log-entry'),\n },\n });\n } catch (err) {\n // the logger never came up — no silent phase, dump the buffer and die\n dumpEarlyLogs();\n console.error(err);\n process.exit(1);\n }\n\n if (health) {\n healthServer.start({ ...health, host: health.host ?? process.env['HEALTH_HOST'] ?? '0.0.0.0' });\n probes.live.enable();\n activateHealthChecks(checks);\n log.debug('health probes listening');\n }\n\n const startup = startLifecycleSpan('startup');\n\n // the boot module graph may read config at import time, so it must only be\n // evaluated after preparePlatform() has loaded env and config\n let bootModule: BootModule = {};\n let bootMs = 0;\n let warmupMs = 0;\n\n // starts in parallel with the boot startup, awaited before listen\n const warmupStartedAt = performance.now();\n const warmupSpan = startLifecycleSpan('warmup', startup.context);\n const warmup = warmupModules().then(() => {\n warmupMs = roundMs(performance.now() - warmupStartedAt);\n warmupSpan.span.end();\n });\n\n const shutdownLifecycle = async (\n shutdownContext?: ReturnType<typeof startLifecycleSpan>['context'],\n ): Promise<void> => {\n try {\n if (shutdownContext) {\n await withLifecycleSpan('onShutdown', shutdownContext, () => runShutdown(bootModule, context));\n } else {\n await runShutdown(bootModule, context);\n }\n } catch (err) {\n log.error(err instanceof Error ? { err } : { reason: err }, 'shutdown failed');\n }\n\n clearNativeMounts();\n\n if (health) {\n deactivateHealthChecks();\n await healthServer.stop();\n }\n };\n\n const failStartup = async (err: unknown, message: string): Promise<never> => {\n log.error(err instanceof Error ? { err } : { reason: err }, message);\n startup.span.setStatus({ code: SpanStatusCode.ERROR, message });\n startup.span.end();\n\n await shutdownLifecycle();\n await shutdownTelemetry();\n process.exit(1);\n };\n\n try {\n const bootStartedAt = performance.now();\n\n // @ts-expect-error virtual module provided by the integration\n bootModule = (await import('virtual:@astroscope/node/boot')) as BootModule;\n\n await withLifecycleSpan('boot', startup.context, () => runStartup(bootModule, context));\n\n bootMs = roundMs(performance.now() - bootStartedAt);\n } catch (err) {\n await failStartup(err, 'startup failed');\n }\n\n await warmup;\n\n if (health) probes.startup.enable();\n\n const client = resolveClientDir(runtimeOptions, import.meta.url);\n const appHandler = createAppHandler(app, runtimeOptions, client);\n const staticHandler = createStaticHandler(app, client);\n const instrument = createRequestInstrumentation({\n logging: runtimeOptions.logging,\n telemetry: runtimeOptions.telemetry ? { exclude: runtimeOptions.telemetry.exclude } : false,\n });\n\n let tls: { cert: Buffer; key: Buffer } | undefined;\n\n try {\n tls = loadTlsOptions();\n } catch (err) {\n await failStartup(err, 'failed to load TLS options');\n }\n\n const listener: http.RequestListener = (req, res) => {\n try {\n decodeURI(req.url ?? '');\n } catch {\n res.writeHead(400);\n res.end('Bad request.');\n\n return;\n }\n\n instrument(req, res, () => {\n if (dispatchNativeMount(req, res)) return;\n\n staticHandler(req, res, () => void appHandler(req, res));\n });\n };\n\n const server = tls ? https.createServer(tls, listener) : http.createServer(listener);\n\n try {\n await withLifecycleSpan('listen', startup.context, () => {\n return new Promise<void>((resolve, reject) => {\n server.once('error', reject);\n server.listen(port, host, resolve);\n });\n });\n } catch (err) {\n await failStartup(err, `failed to listen on ${host}:${port}`);\n }\n\n if (health) probes.ready.enable();\n\n startup.span.setStatus({ code: SpanStatusCode.OK });\n startup.span.end();\n\n log.info(\n {\n host,\n port,\n ...(tls && { https: true }),\n health: !!health,\n bootMs,\n warmupMs,\n totalMs: roundMs(performance.now() - startedAt),\n },\n 'server ready',\n );\n\n let stopPromise: Promise<void> | undefined;\n let resolveClosed!: () => void;\n\n const closedPromise = new Promise<void>((resolve) => {\n resolveClosed = resolve;\n });\n\n const doStop = async (): Promise<void> => {\n if (health) probes.ready.disable();\n\n log.info('draining');\n\n const drainStartedAt = performance.now();\n const shutdown = startLifecycleSpan('shutdown');\n\n await withLifecycleSpan('drain', shutdown.context, async () => {\n const closed = new Promise<void>((resolve) => server.close(() => resolve()));\n\n server.closeIdleConnections();\n\n const forceTimer = setTimeout(() => server.closeAllConnections(), runtimeOptions.shutdownTimeout);\n\n await closed;\n\n clearTimeout(forceTimer);\n });\n\n const drainMs = roundMs(performance.now() - drainStartedAt);\n\n await shutdownLifecycle(shutdown.context);\n\n shutdown.span.end();\n\n log.info({ drainMs }, 'shutdown complete');\n\n await shutdownTelemetry();\n resolveClosed();\n };\n\n const stop = (): Promise<void> => (stopPromise ??= doStop());\n\n process.once('SIGTERM', () => void stop().then(() => process.exit(0)));\n process.once('SIGINT', () => void stop().then(() => process.exit(0)));\n\n return { host, port, stop, closed: () => closedPromise };\n}\n\nif (process.env['ASTROSCOPE_NODE_AUTOSTART'] !== 'disabled') {\n await startServer();\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"server.js","names":["healthServer","server"],"sources":["../src/observability/telemetry/lifecycle.ts","../src/server/client-dir.ts","../src/server/serve-app.ts","../src/server/serve-static.ts","../src/server/server.ts"],"sourcesContent":["import { type Context, type Span, SpanStatusCode, context, trace } from '@opentelemetry/api';\n\nconst LIB_NAME = '@astroscope/node';\n\n/**\n * Lifecycle spans (`startup` / `shutdown` with phase children). No-op when no\n * SDK is registered — `trace.getTracer` returns the no-op tracer.\n */\n\nexport function startLifecycleSpan(name: string, parent?: Context): { span: Span; context: Context } {\n const parentContext = parent ?? context.active();\n const span = trace.getTracer(LIB_NAME).startSpan(name, undefined, parentContext);\n\n return { span, context: trace.setSpan(parentContext, span) };\n}\n\nexport async function withLifecycleSpan<T>(name: string, parent: Context, fn: () => Promise<T> | T): Promise<T> {\n const { span, context: spanContext } = startLifecycleSpan(name, parent);\n\n try {\n const result = await context.with(spanContext, fn);\n\n span.setStatus({ code: SpanStatusCode.OK });\n\n return result;\n } catch (err) {\n span.setStatus({ code: SpanStatusCode.ERROR, message: err instanceof Error ? err.message : 'unknown error' });\n\n throw err;\n } finally {\n span.end();\n }\n}\n","import path from 'node:path';\nimport url from 'node:url';\n\n/**\n * Resolve the client directory at runtime relative to the built server entry.\n *\n * The build-time client/server URLs are only valid on the build machine; in a\n * container the deploy path differs. Walk up from `import.meta.url` of the\n * bundled server code until the server directory is found, then apply the\n * build-time server→client relative path.\n */\nexport function resolveClientDir(options: { client: string; server: string }, importMetaUrl: string): string {\n const clientPath = url.fileURLToPath(new URL(options.client));\n const serverPath = url.fileURLToPath(new URL(options.server));\n const rel = path.relative(serverPath, clientPath);\n const serverFolder = path.basename(serverPath);\n\n let serverEntryFolderURL = path.dirname(importMetaUrl);\n let previous = '';\n\n while (!serverEntryFolderURL.endsWith(serverFolder)) {\n if (serverEntryFolderURL === previous) {\n throw new Error(\n `[@astroscope/node] could not find the server directory \"${serverFolder}\" by walking up from \"${importMetaUrl}\"`,\n );\n }\n\n previous = serverEntryFolderURL;\n serverEntryFolderURL = path.dirname(serverEntryFolderURL);\n }\n\n const clientURL = new URL(rel.endsWith('/') ? rel : `${rel}/`, `${serverEntryFolderURL}/entry.mjs`);\n\n return url.fileURLToPath(clientURL);\n}\n","import { createReadStream } from 'node:fs';\nimport type { IncomingMessage, ServerResponse } from 'node:http';\nimport path from 'node:path';\nimport { Readable } from 'node:stream';\nimport type { BaseApp } from 'astro/app';\nimport { createRequestFromNodeRequest, writeResponse } from 'astro/app/node';\nimport { log } from '../observability/log/index.js';\nimport { getRequestRecord } from '../observability/log/store.js';\nimport type { RuntimeOptions } from '../types.js';\n\nasync function readFSErrorPage(client: string, status: number): Promise<Response | undefined> {\n const filePaths = [`${status}.html`, `${status}/index.html`];\n\n for (const filePath of filePaths) {\n const fullPath = path.join(client, filePath);\n let stream: ReturnType<typeof createReadStream> | undefined;\n\n try {\n stream = createReadStream(fullPath);\n\n await new Promise<void>((resolve, reject) => {\n stream!.once('open', () => resolve());\n stream!.once('error', reject);\n });\n\n return new Response(Readable.toWeb(stream) as ReadableStream, {\n headers: { 'Content-Type': 'text/html; charset=utf-8' },\n });\n } catch {\n stream?.destroy();\n }\n }\n\n return undefined;\n}\n\n/**\n * Render on-demand routes: node req → web Request → `app.render()` → node res.\n * Prerendered pages never reach this handler (the static handler serves them);\n * requests for them landing here render the 404 route.\n */\nexport function createAppHandler(app: BaseApp, options: RuntimeOptions, client: string) {\n process.on('unhandledRejection', (reason) => {\n const requestUrl = getRequestRecord()?.url;\n\n log.error(\n {\n ...(reason instanceof Error ? { err: reason } : { reason }),\n ...(requestUrl && { url: requestUrl }),\n },\n requestUrl ? 'unhandled rejection while rendering' : 'unhandled rejection',\n );\n });\n\n const prerenderedErrorPageFetch = async (url: string): Promise<Response> => {\n const { pathname } = new URL(url);\n\n for (const status of [404, 500]) {\n if (pathname.endsWith(`/${status}.html`) || pathname.endsWith(`/${status}/index.html`)) {\n const response = await readFSErrorPage(client, status);\n\n if (response) return response;\n }\n }\n\n return new Response(null, { status: 404 });\n };\n\n const bodySizeLimit =\n options.bodySizeLimit === 0 || options.bodySizeLimit === Number.POSITIVE_INFINITY\n ? undefined\n : options.bodySizeLimit;\n\n return async (req: IncomingMessage, res: ServerResponse): Promise<void> => {\n let request: Request;\n\n try {\n request = createRequestFromNodeRequest(req, {\n allowedDomains: app.getAllowedDomains?.() ?? [],\n ...(bodySizeLimit !== undefined && { bodySizeLimit }),\n port: options.port,\n });\n } catch (err) {\n log.error(err instanceof Error ? { err, url: req.url } : { reason: err, url: req.url }, 'could not render');\n\n res.statusCode = 500;\n res.end('Internal Server Error');\n\n return;\n }\n\n const routeData = app.match(request, true);\n\n const response =\n routeData && !(routeData.type === 'page' && routeData.prerender)\n ? await app.render(request, { addCookieHeader: true, routeData, prerenderedErrorPageFetch })\n : await app.render(request, { addCookieHeader: true, prerenderedErrorPageFetch });\n\n await writeResponse(response, res);\n };\n}\n","import fs from 'node:fs';\nimport type { IncomingMessage, ServerResponse } from 'node:http';\nimport path from 'node:path';\nimport type { BaseApp } from 'astro/app';\nimport send from 'send';\nimport { COMPRESSIBLE, MIME_TYPES } from './mime.js';\n\nconst VARIANTS = [\n { encoding: 'br', suffix: '.br' },\n { encoding: 'gzip', suffix: '.gz' },\n] as const;\n\nfunction negotiateVariant(\n req: IncomingMessage,\n client: string,\n pathname: string,\n): { pathname: string; encoding: string } | undefined {\n const accept = req.headers['accept-encoding'];\n\n if (typeof accept !== 'string') return undefined;\n\n for (const { encoding, suffix } of VARIANTS) {\n if (!accept.includes(encoding)) continue;\n\n if (fs.existsSync(path.join(client, `${pathname}${suffix}`))) {\n return { pathname: `${pathname}${suffix}`, encoding };\n }\n }\n\n return undefined;\n}\n\nfunction hasFileExtension(pathname: string): boolean {\n const last = pathname.split('/').pop();\n\n return !!last && last.includes('.');\n}\n\nfunction prependForwardSlash(pathname: string): string {\n return pathname.startsWith('/') ? pathname : `/${pathname}`;\n}\n\nfunction isDirectory(client: string, urlPath: string): boolean {\n const filePath = path.join(client, urlPath);\n const resolved = path.resolve(filePath);\n const resolvedClient = path.resolve(client);\n\n // path traversal guard\n if (resolved !== resolvedClient && !resolved.startsWith(resolvedClient + path.sep)) {\n return false;\n }\n\n try {\n return fs.lstatSync(filePath).isDirectory();\n } catch {\n return false;\n }\n}\n\n/**\n * Serve files from the client build directory, falling through to `ssr` when\n * no file matches. Handles trailing-slash redirects per the manifest config\n * and marks hashed assets as immutable.\n */\nexport function createStaticHandler(app: BaseApp, client: string) {\n return (req: IncomingMessage, res: ServerResponse, ssr: () => void): void => {\n if (!req.url) {\n ssr();\n\n return;\n }\n\n let fullUrl = req.url;\n\n if (fullUrl.includes('#')) {\n fullUrl = fullUrl.slice(0, fullUrl.indexOf('#'));\n }\n\n const [urlPath = '', urlQuery] = fullUrl.split('?');\n let fsPath = app.removeBase(urlPath);\n\n try {\n fsPath = decodeURI(fsPath);\n } catch {\n // fall through with the raw path; send() rejects malformed paths itself\n }\n\n const dir = isDirectory(client, fsPath);\n const hasSlash = urlPath.endsWith('/');\n let pathname = urlPath;\n\n switch (app.manifest.trailingSlash) {\n case 'never': {\n if (dir && urlPath !== '/' && hasSlash) {\n res.statusCode = 301;\n res.setHeader('Location', urlPath.slice(0, -1) + (urlQuery ? `?${urlQuery}` : ''));\n res.end();\n\n return;\n }\n\n if (dir && !hasSlash) {\n pathname = `${urlPath}/index.html`;\n }\n\n break;\n }\n case 'ignore': {\n if (dir && !hasSlash) {\n pathname = `${urlPath}/index.html`;\n }\n\n break;\n }\n case 'always': {\n if (!hasSlash && !hasFileExtension(urlPath) && !urlPath.startsWith('/_')) {\n res.statusCode = 301;\n res.setHeader('Location', `${urlPath}/${urlQuery ? `?${urlQuery}` : ''}`);\n res.end();\n\n return;\n }\n\n break;\n }\n }\n\n pathname = prependForwardSlash(app.removeBase(pathname));\n\n const normalizedPathname = path.posix.normalize(pathname);\n const compressible = COMPRESSIBLE.has(path.posix.extname(normalizedPathname));\n const variant = compressible ? negotiateVariant(req, client, normalizedPathname) : undefined;\n\n const stream = send(req, variant?.pathname ?? normalizedPathname, {\n root: client,\n dotfiles: normalizedPathname.startsWith('/.well-known/') ? 'allow' : 'deny',\n // with build.format 'file' or 'preserve', pages are output as `page.html`\n // instead of `page/index.html` — let send() try appending `.html`\n extensions: app.manifest.buildFormat === 'file' || app.manifest.buildFormat === 'preserve' ? ['html'] : [],\n });\n\n let forwardError = false;\n\n stream.on('error', (err: NodeJS.ErrnoException & { statusCode?: number }) => {\n if (forwardError) {\n const status = err.statusCode ?? 500;\n\n if (status >= 500) {\n console.error(err.toString());\n }\n\n res.writeHead(status);\n res.end(status >= 500 ? 'Internal server error' : '');\n\n return;\n }\n\n ssr();\n });\n\n stream.on('file', () => {\n forwardError = true;\n });\n\n // fires before the body and before conditional-GET handling, so these\n // headers also land on 304 responses\n stream.on('headers', (headersRes: ServerResponse) => {\n if (compressible) {\n headersRes.setHeader('Vary', 'Accept-Encoding');\n }\n\n if (variant) {\n headersRes.setHeader('Content-Encoding', variant.encoding);\n headersRes.setHeader(\n 'Content-Type',\n MIME_TYPES.get(path.posix.extname(normalizedPathname)) ?? 'application/octet-stream',\n );\n }\n\n if (normalizedPathname.startsWith(`/${app.manifest.assetsDir}/`)) {\n headersRes.setHeader('Cache-Control', 'public, max-age=31536000, immutable');\n }\n });\n\n stream.pipe(res);\n };\n}\n","import fs from 'node:fs';\nimport http from 'node:http';\nimport https from 'node:https';\nimport { checks, server as healthServer, probes } from '@entwico/health-probes';\nimport { SpanStatusCode } from '@opentelemetry/api';\nimport { createApp } from 'astro/app/entrypoint';\nimport { setGetEnv } from 'astro/env/setup';\n// @ts-expect-error virtual module provided by the integration\nimport { options } from 'virtual:@astroscope/node/config';\nimport { activateHealthChecks, deactivateHealthChecks } from '../health/store.js';\nimport { setBootContext } from '../lifecycle/context.js';\nimport { type BootModule, runShutdown, runStartup } from '../lifecycle/lifecycle.js';\nimport type { BootContext } from '../lifecycle/types.js';\nimport { createRequestInstrumentation } from '../observability/instrument.js';\nimport { dumpEarlyLogs } from '../observability/log/construct.js';\nimport { log } from '../observability/log/index.js';\nimport { startLifecycleSpan, withLifecycleSpan } from '../observability/telemetry/lifecycle.js';\nimport { shutdownTelemetry } from '../observability/telemetry/sdk.js';\nimport { preparePlatform } from '../platform/prepare.js';\nimport type { RuntimeOptions } from '../types.js';\nimport { resolveClientDir } from './client-dir.js';\nimport { clearNativeMounts, dispatchNativeMount } from './native-mount.js';\nimport { createAppHandler } from './serve-app.js';\nimport { createStaticHandler } from './serve-static.js';\n\nsetGetEnv((key) => process.env[key]);\n\nconst runtimeOptions = options as RuntimeOptions;\nconst app = createApp({ streaming: true });\n\nconst roundMs = (n: number) => Math.round(n * 100) / 100;\n\n/**\n * Pre-import every lazily loaded server module (pages, middleware, actions,\n * session driver) so the first request pays no import cost. Uses the\n * manifest's own loaders — exactly what the runtime calls per request.\n */\nasync function warmupModules(): Promise<void> {\n const loaders = [\n ...(app.manifest.pageMap?.values() ?? []),\n app.manifest.middleware,\n app.manifest.actions,\n app.manifest.sessionDriver,\n app.manifest.serverIslandMappings,\n ].filter((load) => load !== undefined);\n\n const results = await Promise.allSettled(loaders.map((load) => load()));\n\n for (const result of results) {\n if (result.status === 'rejected') {\n log.error(\n result.reason instanceof Error ? { err: result.reason } : { reason: result.reason },\n 'warmup import failed',\n );\n }\n }\n}\n\n/**\n * TLS tokens from `SERVER_CERT_PATH` / `SERVER_KEY_PATH` (same contract as\n * `@astrojs/node`). Read after env loading, so the paths may come from `.env`.\n */\nfunction loadTlsOptions(): { cert: Buffer; key: Buffer } | undefined {\n const certPath = process.env['SERVER_CERT_PATH'];\n const keyPath = process.env['SERVER_KEY_PATH'];\n\n if (!certPath && !keyPath) return undefined;\n\n if (!certPath || !keyPath) {\n throw new Error('SERVER_CERT_PATH and SERVER_KEY_PATH must both be set to serve HTTPS');\n }\n\n return { cert: fs.readFileSync(certPath), key: fs.readFileSync(keyPath) };\n}\n\nexport interface ServerHandle {\n host: string;\n port: number;\n stop(): Promise<void>;\n closed(): Promise<void>;\n}\n\nexport async function startServer(overrides?: {\n host?: string | undefined;\n port?: number | undefined;\n}): Promise<ServerHandle> {\n const startedAt = performance.now();\n const host = overrides?.host ?? process.env['HOST'] ?? runtimeOptions.host;\n const port = overrides?.port ?? (process.env['PORT'] ? Number(process.env['PORT']) : runtimeOptions.port);\n const context: BootContext = { dev: false, host, port };\n const health = runtimeOptions.health;\n\n setBootContext(context);\n\n try {\n await preparePlatform({\n dev: false,\n telemetry: runtimeOptions.telemetry ? { prometheus: runtimeOptions.telemetry.prometheus } : false,\n seams: {\n config: () => import('virtual:@astroscope/node/config-entry'),\n instrumentation: () => import('virtual:@astroscope/node/instrumentation-entry'),\n log: () => import('virtual:@astroscope/node/log-entry'),\n },\n });\n } catch (err) {\n // the logger never came up — no silent phase, dump the buffer and die\n dumpEarlyLogs();\n console.error(err);\n process.exit(1);\n }\n\n if (health) {\n healthServer.start({ ...health, host: health.host ?? process.env['HEALTH_HOST'] ?? '0.0.0.0' });\n probes.live.enable();\n activateHealthChecks(checks);\n log.debug('health probes listening');\n }\n\n const startup = startLifecycleSpan('startup');\n\n log.info({ host, port }, 'starting');\n\n // the boot module graph may read config at import time, so it must only be\n // evaluated after preparePlatform() has loaded env and config\n let bootModule: BootModule = {};\n let bootMs = 0;\n let warmupMs = 0;\n\n // starts in parallel with the boot startup, awaited before listen\n const warmupStartedAt = performance.now();\n const warmupSpan = startLifecycleSpan('warmup', startup.context);\n const warmup = warmupModules().then(() => {\n warmupMs = roundMs(performance.now() - warmupStartedAt);\n warmupSpan.span.end();\n });\n\n const shutdownLifecycle = async (\n shutdownContext?: ReturnType<typeof startLifecycleSpan>['context'],\n ): Promise<void> => {\n try {\n if (shutdownContext) {\n await withLifecycleSpan('onShutdown', shutdownContext, () => runShutdown(bootModule, context));\n } else {\n await runShutdown(bootModule, context);\n }\n } catch (err) {\n log.error(err instanceof Error ? { err } : { reason: err }, 'shutdown failed');\n }\n\n clearNativeMounts();\n\n if (health) {\n deactivateHealthChecks();\n await healthServer.stop();\n }\n };\n\n const failStartup = async (err: unknown, message: string): Promise<never> => {\n log.error(err instanceof Error ? { err } : { reason: err }, message);\n startup.span.setStatus({ code: SpanStatusCode.ERROR, message });\n startup.span.end();\n\n await shutdownLifecycle();\n await shutdownTelemetry();\n process.exit(1);\n };\n\n try {\n const bootStartedAt = performance.now();\n\n // @ts-expect-error virtual module provided by the integration\n bootModule = (await import('virtual:@astroscope/node/boot')) as BootModule;\n\n await withLifecycleSpan('boot', startup.context, () => runStartup(bootModule, context));\n\n bootMs = roundMs(performance.now() - bootStartedAt);\n } catch (err) {\n await failStartup(err, 'startup failed');\n }\n\n await warmup;\n\n if (health) probes.startup.enable();\n\n const client = resolveClientDir(runtimeOptions, import.meta.url);\n const appHandler = createAppHandler(app, runtimeOptions, client);\n const staticHandler = createStaticHandler(app, client);\n const instrument = createRequestInstrumentation({\n logging: runtimeOptions.logging,\n telemetry: runtimeOptions.telemetry ? { exclude: runtimeOptions.telemetry.exclude } : false,\n });\n\n let tls: { cert: Buffer; key: Buffer } | undefined;\n\n try {\n tls = loadTlsOptions();\n } catch (err) {\n await failStartup(err, 'failed to load TLS options');\n }\n\n const listener: http.RequestListener = (req, res) => {\n try {\n decodeURI(req.url ?? '');\n } catch {\n res.writeHead(400);\n res.end('Bad request.');\n\n return;\n }\n\n instrument(req, res, () => {\n if (dispatchNativeMount(req, res)) return;\n\n staticHandler(req, res, () => void appHandler(req, res));\n });\n };\n\n const server = tls ? https.createServer(tls, listener) : http.createServer(listener);\n\n try {\n await withLifecycleSpan('listen', startup.context, () => {\n return new Promise<void>((resolve, reject) => {\n server.once('error', reject);\n server.listen(port, host, resolve);\n });\n });\n } catch (err) {\n await failStartup(err, `failed to listen on ${host}:${port}`);\n }\n\n if (health) probes.ready.enable();\n\n startup.span.setStatus({ code: SpanStatusCode.OK });\n startup.span.end();\n\n log.info(\n {\n host,\n port,\n ...(tls && { https: true }),\n health: !!health,\n bootMs,\n warmupMs,\n totalMs: roundMs(performance.now() - startedAt),\n },\n 'server ready',\n );\n\n let stopPromise: Promise<void> | undefined;\n let resolveClosed!: () => void;\n\n const closedPromise = new Promise<void>((resolve) => {\n resolveClosed = resolve;\n });\n\n const doStop = async (): Promise<void> => {\n if (health) probes.ready.disable();\n\n log.info('shutdown initiated');\n\n const drainStartedAt = performance.now();\n const shutdown = startLifecycleSpan('shutdown');\n\n await withLifecycleSpan('drain', shutdown.context, async () => {\n const closed = new Promise<void>((resolve) => server.close(() => resolve()));\n\n server.closeIdleConnections();\n\n const forceTimer = setTimeout(() => server.closeAllConnections(), runtimeOptions.shutdownTimeout);\n\n await closed;\n\n clearTimeout(forceTimer);\n });\n\n const drainMs = roundMs(performance.now() - drainStartedAt);\n\n await shutdownLifecycle(shutdown.context);\n\n shutdown.span.end();\n\n log.info({ drainMs }, 'shutdown complete');\n\n await shutdownTelemetry();\n resolveClosed();\n };\n\n const stop = (): Promise<void> => (stopPromise ??= doStop());\n\n process.once('SIGTERM', () => void stop().then(() => process.exit(0)));\n process.once('SIGINT', () => void stop().then(() => process.exit(0)));\n\n return { host, port, stop, closed: () => closedPromise };\n}\n\nif (process.env['ASTROSCOPE_NODE_AUTOSTART'] !== 'disabled') {\n await startServer();\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@astroscope/node",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.2",
|
|
4
4
|
"description": "Opinionated, cloud-friendly Node adapter for Astro: boot lifecycle, health probes, request logging, telemetry, CSRF and static serving run as plain code around server.listen()",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|