@stacksjs/rpx
Version:
A modern and smart reverse proxy.
57 lines (56 loc) • 1.99 kB
TypeScript
import type { RegistryEntry } from './registry';
import type { SiteResolver } from './site-resolver';
/** A launched site process, abstracted so tests can inject a fake. */
export declare interface SiteProcessHandle {
pid: number
exited: Promise<number | null>
stop: (signal?: NodeJS.Signals) => void
}
/** A point-in-time view of one supervised site, for `rpx sites` / status. */
export declare interface SiteSnapshot {
host: string
dir: string
status: 'starting' | 'ready' | 'failed'
pid: number | null
ports: Record<string, number>
uptimeMs: number
idleMs: number
error?: string
}
export declare interface SiteSupervisorOptions {
resolver: SiteResolver
registryDir?: string
rpxDir?: string
verbose?: boolean
startupTimeoutMs?: number
pollIntervalMs?: number
reapIntervalMs?: number
restartDelayMs?: number
killGraceMs?: number
launcher?: SiteLauncher
probePort?: (port: number) => Promise<boolean>
pickPort?: (preferred: number) => Promise<number>
isHostRoutable?: (host: string) => boolean
onSiteActivating?: (host: string) => void
now?: () => number
writeEntry?: (entry: RegistryEntry, dir?: string, verbose?: boolean) => Promise<void>
removeEntry?: (id: string, dir?: string, verbose?: boolean) => Promise<void>
}
/** Spawn a site's dev command. Injected for tests; default spawns a shell. */
export type SiteLauncher = (spec: {
command: string
cwd: string
env: Record<string, string>
logPath: string
}) => SiteProcessHandle;
export type SiteRequestStatus = | { kind: 'unknown' }
| { kind: 'starting', host: string, sinceMs: number, source: 'config' | 'discovered', logTail: string }
| { kind: 'ready', host: string }
| { kind: 'failed', host: string, error: string, logTail: string }
export declare class SiteSupervisor {
constructor(opts: SiteSupervisorOptions);
onRequest(host: string): Promise<SiteRequestStatus>;
stop(host: string): Promise<void>;
list(): SiteSnapshot[];
stopAll(): Promise<void>;
}