{"version":3,"sources":["../../src/router/index.ts","../../src/router/MeshRouterServer.ts","../../src/drain/ActiveConnectionTracker.ts","../../src/router/InstanceRegistry.ts","../../src/state/MeshStateStore.ts","../../src/core/errors.ts","../../src/utils/fs.ts","../../src/utils/time.ts","../../src/registry/RegistryRecordTools.ts","../../src/registry/FileMeshRegistry.ts","../../src/registry/RegistrationSigner.ts","../../src/registry/redis/SimpleRedisClient.ts","../../src/registry/redis/RedisMeshRegistry.ts","../../src/registry/RegistryFactory.ts","../../src/router/LoadBalancer.ts","../../src/router/ProxyHeaders.ts","../../src/router/RouteMatcher.ts","../../src/router/CookieSigner.ts","../../src/router/StickySession.ts","../../src/observability/RouterMetrics.ts","../../src/utils/origin.ts"],"sourcesContent":["export { MeshRouterServer } from './MeshRouterServer.js'\nexport { RouteMatcher } from './RouteMatcher.js'\nexport { InstanceRegistry } from './InstanceRegistry.js'\nexport { LoadBalancer } from './LoadBalancer.js'\nexport { StickySession } from './StickySession.js'\nexport { CookieSigner } from './CookieSigner.js'\nexport type { StickyCookiePayload } from './CookieSigner.js'\nexport type { MeshRouteMatch, MeshTargetNode, MeshProxyResult, MeshRouterRequestContext } from './types.js'\n","import http, { type IncomingMessage, type ServerResponse } from 'node:http'\nimport https, { type ServerOptions as HttpsServerOptions } from 'node:https'\nimport net from 'node:net'\nimport fs from 'node:fs'\nimport { randomUUID } from 'node:crypto'\nimport type { MeshConnectionCounters, NormalizedMeshConfig } from '../core/types.js'\nimport { ActiveConnectionTracker, type ActiveConnectionSnapshot } from '../drain/ActiveConnectionTracker.js'\nimport { InstanceRegistry } from './InstanceRegistry.js'\nimport { LoadBalancer } from './LoadBalancer.js'\nimport { ProxyHeaders } from './ProxyHeaders.js'\nimport { RouteMatcher } from './RouteMatcher.js'\nimport { StickySession } from './StickySession.js'\nimport { RouterMetrics } from '../observability/RouterMetrics.js'\nimport { formatOrigin } from '../utils/origin.js'\n\nexport interface MeshRouterServerOptions {\n  readonly config: NormalizedMeshConfig\n  readonly log?: (line: string) => void\n}\n\nexport interface MeshRouterDrainResult {\n  readonly idle: boolean\n  readonly snapshot: ActiveConnectionSnapshot\n}\n\nexport class MeshRouterServer {\n  private readonly servers: http.Server[]\n  private readonly registry: InstanceRegistry\n  private readonly matcher = new RouteMatcher()\n  private readonly headers = new ProxyHeaders()\n  private readonly balancer: LoadBalancer\n  private readonly tracker = new ActiveConnectionTracker()\n  private readonly metrics = new RouterMetrics()\n  private readonly instanceService = new Map<string, string>()\n  private closed = false\n  private draining = false\n\n  public constructor(private readonly options: MeshRouterServerOptions) {\n    this.registry = new InstanceRegistry(options.config)\n    this.balancer = new LoadBalancer(new StickySession({\n      cookieName: options.config.router.cookieName,\n      secret: options.config.router.secret,\n      secure: options.config.router.secureCookies\n    }))\n    this.servers = this.createServers()\n  }\n\n  public async listen(): Promise<void> {\n    const primaryPort = this.options.config.router.port\n    const additionalPorts = this.options.config.router.tls.enabled\n      ? this.options.config.router.tls.additionalPorts\n      : []\n    const ports = [primaryPort, ...additionalPorts]\n\n    for (let index = 0; index < ports.length; index += 1) {\n      const port = ports[index]!\n      const isPrimary = index === 0\n      const server = this.servers[index]!\n      try {\n        await this.listenServer(server, port)\n        this.log(`mesh router listening on ${formatOrigin(this.protocolFor(server), this.options.config.router.host, port)}`)\n      } catch (error) {\n        if (isPrimary) throw error\n        this.log(`mesh router could not listen on ${formatOrigin(this.protocolFor(server), this.options.config.router.host, port)} (${(error as NodeJS.ErrnoException).code ?? (error as Error).message}); continuing with primary listener`)\n      }\n    }\n  }\n\n  public connectionSnapshot(): ActiveConnectionSnapshot {\n    return this.tracker.snapshot()\n  }\n\n  public async close(): Promise<void> {\n    await this.drainAndClose({\n      drainTimeoutMs: this.options.config.router.drainTimeoutMs,\n      socketDrainTimeoutMs: this.options.config.router.socketDrainTimeoutMs\n    })\n  }\n\n  public async drainAndClose(options: { readonly drainTimeoutMs?: number; readonly socketDrainTimeoutMs?: number } = {}): Promise<MeshRouterDrainResult> {\n    if (this.closed) return { idle: true, snapshot: this.tracker.snapshot() }\n    this.closed = true\n    this.draining = true\n\n    await Promise.all(this.servers.map(server => new Promise<void>(resolve => server.close(() => resolve()))))\n    const drainTimeoutMs = options.drainTimeoutMs ?? this.options.config.router.drainTimeoutMs\n    const socketDrainTimeoutMs = options.socketDrainTimeoutMs ?? this.options.config.router.socketDrainTimeoutMs\n    const httpIdle = await this.tracker.waitForIdle(drainTimeoutMs)\n\n    if (!httpIdle && socketDrainTimeoutMs >= 0) {\n      this.tracker.destroySockets()\n      await this.tracker.waitForIdle(socketDrainTimeoutMs)\n    }\n\n    const snapshot = this.tracker.snapshot()\n    this.log(`router drained: idle=${snapshot.total.total === 0} active=${snapshot.total.total}`)\n    return { idle: snapshot.total.total === 0, snapshot }\n  }\n\n  private async handle(req: IncomingMessage, res: ServerResponse): Promise<void> {\n    const requestId = randomUUID().slice(0, 8)\n    const forwardedProto = this.protocolForSocket(req.socket)\n    try {\n      const url = new URL(req.url ?? '/', `${forwardedProto}://${req.headers.host ?? 'localhost'}`)\n      if (this.handleManagement(url, req, res)) return\n      if (this.draining) {\n        this.respond(res, 503, { error: 'mesh_router_draining', requestId })\n        return\n      }\n\n      const routed = await this.selectTarget(url.pathname, req)\n      if (!routed) {\n        this.metrics.recordNoTarget()\n        this.respond(res, 503, { error: 'mesh_no_target', requestId })\n        return\n      }\n\n      const { instance, service, target, setCookie } = routed\n      this.metrics.recordProxy(service)\n      if (setCookie) res.setHeader('Set-Cookie', setCookie)\n      this.balancer.begin(instance.id)\n      const endTracked = this.tracker.beginHttp(instance.id)\n      await this.proxyHttp(req, res, target, requestId, instance.serviceType, forwardedProto)\n        .finally(() => {\n          endTracked()\n          this.balancer.end(instance.id)\n        })\n    } catch (error) {\n      this.metrics.recordError()\n      this.respond(res, 502, { error: 'mesh_proxy_error', message: (error as Error).message, requestId })\n    }\n  }\n\n  private async handleUpgrade(req: IncomingMessage, socket: net.Socket, head: Buffer): Promise<void> {\n    if (this.draining) {\n      socket.write('HTTP/1.1 503 Service Unavailable\\r\\nConnection: close\\r\\n\\r\\n')\n      socket.destroy()\n      return\n    }\n\n    try {\n      const forwardedProto = this.protocolForSocket(req.socket)\n      const url = new URL(req.url ?? '/', `${forwardedProto}://${req.headers.host ?? 'localhost'}`)\n      const routed = await this.selectTarget(url.pathname, req)\n      if (!routed) {\n        this.metrics.recordNoTarget()\n        socket.write('HTTP/1.1 503 Service Unavailable\\r\\nConnection: close\\r\\n\\r\\n')\n        socket.destroy()\n        return\n      }\n      const { instance, service, target } = routed\n      this.metrics.recordUpgrade(service)\n      this.balancer.begin(instance.id)\n      const targetSocket = net.connect(Number(target.port || 80), target.hostname, () => {\n        const path = `${target.pathname}${target.search}`\n        const proxiedHeaders = this.headers.build(req.headers, target, req.socket.remoteAddress, {\n          serviceType: instance.serviceType,\n          meshCookieName: this.options.config.router.cookieName,\n          forwardedProto,\n        })\n        targetSocket.write(`${req.method ?? 'GET'} ${path} HTTP/${req.httpVersion}\\r\\n`)\n        for (const [key, value] of Object.entries(proxiedHeaders)) {\n          if (key.toLowerCase() === 'host') continue\n          if (Array.isArray(value)) {\n            for (const item of value) targetSocket.write(`${key}: ${item}\\r\\n`)\n          } else if (value !== undefined) {\n            targetSocket.write(`${key}: ${value}\\r\\n`)\n          }\n        }\n        targetSocket.write(`host: ${target.host}\\r\\n`)\n        if (req.headers.connection) targetSocket.write(`connection: ${req.headers.connection}\\r\\n`)\n        if (req.headers.upgrade) targetSocket.write(`upgrade: ${req.headers.upgrade}\\r\\n`)\n        targetSocket.write(`x-forwarded-host: ${req.headers.host ?? ''}\\r\\n`)\n        targetSocket.write(`x-forwarded-proto: ${forwardedProto}\\r\\n`)\n        targetSocket.write('\\r\\n')\n        if (head.length) targetSocket.write(head)\n        targetSocket.pipe(socket)\n        socket.pipe(targetSocket)\n      })\n      const endTracked = this.tracker.trackSocket(instance.id, socket, targetSocket)\n      let closed = false\n      const close = (): void => {\n        if (closed) return\n        closed = true\n        endTracked()\n        this.balancer.end(instance.id)\n      }\n      socket.once('close', close)\n      targetSocket.once('close', close)\n      targetSocket.once('error', () => socket.destroy())\n      socket.once('error', () => targetSocket.destroy())\n    } catch {\n      this.metrics.recordError()\n      socket.write('HTTP/1.1 502 Bad Gateway\\r\\nConnection: close\\r\\n\\r\\n')\n      socket.destroy()\n    }\n  }\n\n  private async selectTarget(pathname: string, req: IncomingMessage): Promise<{ instance: import('../core/types.js').MeshInstanceRecord; service: string; target: URL; setCookie?: string } | null> {\n    const routable = await this.registry.listRoutable()\n    const match = this.matcher.match(pathname, routable)\n    if (!match) return null\n\n    const service = this.options.config.services.get(match.service)\n    if (!service) return null\n    const healthy = await this.registry.listHealthyByService(match.service)\n    const selection = this.balancer.select(match.service, service.strategy, healthy, req.headers)\n    if (!selection || !selection.instance.url) return null\n    const target = new URL(req.url ?? '/', selection.instance.url)\n    this.instanceService.set(selection.instance.id, match.service)\n    return { instance: selection.instance, service: match.service, target, ...(selection.setCookie ? { setCookie: selection.setCookie } : {}) }\n  }\n\n  private handleManagement(url: URL, req: IncomingMessage, res: ServerResponse): boolean {\n    if (!this.options.config.observability.enabled) return false\n    if (req.method !== 'GET') return false\n    const base = this.options.config.observability.path\n    if (url.pathname !== base && !url.pathname.startsWith(`${base}/`)) return false\n\n    if (url.pathname === base || url.pathname === `${base}/health`) {\n      this.respond(res, 200, { ok: true, app: this.options.config.app, generatedAt: new Date().toISOString(), draining: this.draining })\n      return true\n    }\n\n    if (url.pathname === `${base}/metrics`) {\n      this.respond(res, 200, this.metrics.snapshot(this.tracker.snapshot().total, this.activeByService(), this.draining) as unknown as Record<string, unknown>)\n      return true\n    }\n\n    if (url.pathname === `${base}/routes`) {\n      this.respond(res, 200, { routes: this.routePlan() })\n      return true\n    }\n\n    this.respond(res, 404, { error: 'mesh_management_not_found' })\n    return true\n  }\n\n  private activeByService(): ReadonlyMap<string, MeshConnectionCounters> {\n    const byService = new Map<string, MeshConnectionCounters>()\n    const snapshot = this.tracker.snapshot()\n    for (const [instanceId, counters] of Object.entries(snapshot.byInstance)) {\n      const service = this.instanceService.get(instanceId) ?? instanceId.split('-')[0] ?? 'unknown'\n      const existing = byService.get(service) ?? { http: 0, sockets: 0, total: 0 }\n      byService.set(service, {\n        http: existing.http + counters.http,\n        sockets: existing.sockets + counters.sockets,\n        total: existing.total + counters.total\n      })\n    }\n    return byService\n  }\n\n  private routePlan(): readonly Record<string, unknown>[] {\n    const routes: Record<string, unknown>[] = []\n    for (const service of this.options.config.services.values()) {\n      for (const route of service.routes) routes.push({ service: service.name, route, strategy: service.strategy })\n    }\n    routes.sort((a, b) => String(b.route).length - String(a.route).length || String(a.service).localeCompare(String(b.service)))\n    return routes\n  }\n\n\n  private async proxyHttp(\n    req: IncomingMessage,\n    res: ServerResponse,\n    target: URL,\n    requestId: string,\n    serviceType: import('../core/types.js').MeshServiceType,\n    forwardedProto: 'http' | 'https'\n  ): Promise<void> {\n    await new Promise<void>((resolve, reject) => {\n      const proxyReq = http.request(target, {\n        method: req.method,\n        headers: this.headers.build(req.headers, target, req.socket.remoteAddress, {\n          serviceType,\n          meshCookieName: this.options.config.router.cookieName,\n          forwardedProto,\n        }),\n        timeout: this.options.config.router.requestTimeoutMs\n      }, proxyRes => {\n        res.statusCode = proxyRes.statusCode ?? 502\n        res.statusMessage = proxyRes.statusMessage ?? res.statusMessage\n        for (const [key, value] of Object.entries(proxyRes.headers)) {\n          if (value !== undefined) res.setHeader(key, value)\n        }\n        res.setHeader('x-mesh-request-id', requestId)\n        proxyRes.pipe(res)\n        proxyRes.once('end', resolve)\n      })\n\n      proxyReq.once('timeout', () => {\n        proxyReq.destroy(new Error('Target request timed out.'))\n      })\n      proxyReq.once('error', reject)\n      req.pipe(proxyReq)\n    })\n  }\n\n  private createServers(): http.Server[] {\n    const requestHandler = (req: IncomingMessage, res: ServerResponse) => void this.handle(req, res)\n    const upgradeHandler = (req: IncomingMessage, socket: net.Socket, head: Buffer) => void this.handleUpgrade(req, socket, head)\n    const createHttpServer = () => {\n      const server = http.createServer(requestHandler)\n      server.on('upgrade', upgradeHandler)\n      return server\n    }\n    if (!this.options.config.router.tls.enabled) return [createHttpServer()]\n\n    const httpsOptions = this.httpsOptions()\n    return [createHttpServerForTls(httpsOptions, requestHandler, upgradeHandler), ...this.options.config.router.tls.additionalPorts.map(() => createHttpServerForTls(httpsOptions, requestHandler, upgradeHandler))]\n  }\n\n  private httpsOptions(): HttpsServerOptions {\n    const tls = this.options.config.router.tls\n    return {\n      cert: fs.readFileSync(tls.certPath!, 'utf8'),\n      key: fs.readFileSync(tls.keyPath!, 'utf8'),\n      ...(tls.caPath ? { ca: fs.readFileSync(tls.caPath, 'utf8') } : {}),\n      ...(tls.passphraseEnv ? { passphrase: process.env[tls.passphraseEnv] ?? '' } : {}),\n      ...(tls.minVersion ? { minVersion: tls.minVersion } : {}),\n    }\n  }\n\n  private async listenServer(server: http.Server, port: number): Promise<void> {\n    await new Promise<void>((resolve, reject) => {\n      server.once('error', reject)\n      server.listen(port, this.options.config.router.host, () => {\n        server.off('error', reject)\n        resolve()\n      })\n    })\n  }\n\n  private protocolFor(server: http.Server): 'http' | 'https' {\n    return server instanceof https.Server ? 'https' : 'http'\n  }\n\n  private protocolForSocket(socket: IncomingMessage['socket']): 'http' | 'https' {\n    return 'encrypted' in socket && Boolean((socket as IncomingMessage['socket'] & { encrypted?: boolean }).encrypted)\n      ? 'https'\n      : 'http'\n  }\n\n  private respond(res: ServerResponse, statusCode: number, body: Record<string, unknown>): void {\n    res.statusCode = statusCode\n    res.setHeader('content-type', 'application/json; charset=utf-8')\n    res.end(`${JSON.stringify(body)}\\n`)\n  }\n\n  private log(line: string): void {\n    this.options.log?.(`[router] ${line}`)\n  }\n}\n\nfunction createHttpServerForTls(\n  options: HttpsServerOptions,\n  requestHandler: (req: IncomingMessage, res: ServerResponse) => void,\n  upgradeHandler: (req: IncomingMessage, socket: net.Socket, head: Buffer) => void\n): http.Server {\n  const server = https.createServer(options, requestHandler)\n  server.on('upgrade', upgradeHandler)\n  return server\n}\n","import net from 'node:net'\nimport type { MeshConnectionCounters } from '../core/types.js'\n\nexport interface ActiveConnectionSnapshot {\n  readonly total: MeshConnectionCounters\n  readonly byInstance: Readonly<Record<string, MeshConnectionCounters>>\n}\n\nexport class ActiveConnectionTracker {\n  private readonly http = new Map<string, number>()\n  private readonly sockets = new Map<string, Set<net.Socket>>()\n  private readonly waiters = new Set<() => void>()\n\n  public beginHttp(instanceId: string): () => void {\n    this.http.set(instanceId, (this.http.get(instanceId) ?? 0) + 1)\n    let ended = false\n    return () => {\n      if (ended) return\n      ended = true\n      this.http.set(instanceId, Math.max(0, (this.http.get(instanceId) ?? 0) - 1))\n      this.notifyIfIdle()\n    }\n  }\n\n  public trackSocket(instanceId: string, ...tracked: net.Socket[]): () => void {\n    let set = this.sockets.get(instanceId)\n    if (!set) {\n      set = new Set()\n      this.sockets.set(instanceId, set)\n    }\n    for (const socket of tracked) set.add(socket)\n\n    let ended = false\n    const done = (): void => {\n      if (ended) return\n      ended = true\n      const current = this.sockets.get(instanceId)\n      if (current) {\n        for (const socket of tracked) current.delete(socket)\n        if (current.size === 0) this.sockets.delete(instanceId)\n      }\n      this.notifyIfIdle()\n    }\n\n    for (const socket of tracked) {\n      socket.once('close', done)\n      socket.once('error', done)\n    }\n\n    return done\n  }\n\n  public snapshot(): ActiveConnectionSnapshot {\n    const ids = new Set([...this.http.keys(), ...this.sockets.keys()])\n    const byInstance: Record<string, MeshConnectionCounters> = {}\n    let totalHttp = 0\n    let totalSockets = 0\n\n    for (const id of ids) {\n      const http = this.http.get(id) ?? 0\n      const sockets = this.sockets.get(id)?.size ?? 0\n      byInstance[id] = { http, sockets, total: http + sockets }\n      totalHttp += http\n      totalSockets += sockets\n    }\n\n    return {\n      total: { http: totalHttp, sockets: totalSockets, total: totalHttp + totalSockets },\n      byInstance\n    }\n  }\n\n  public isIdle(): boolean {\n    return this.snapshot().total.total === 0\n  }\n\n  public async waitForIdle(timeoutMs: number): Promise<boolean> {\n    if (this.isIdle()) return true\n    if (timeoutMs <= 0) return false\n\n    return await new Promise<boolean>(resolve => {\n      const timeout = setTimeout(() => {\n        this.waiters.delete(done)\n        resolve(false)\n      }, timeoutMs)\n      timeout.unref?.()\n\n      const done = (): void => {\n        clearTimeout(timeout)\n        this.waiters.delete(done)\n        resolve(true)\n      }\n\n      this.waiters.add(done)\n    })\n  }\n\n  public destroySockets(): void {\n    for (const set of this.sockets.values()) {\n      for (const socket of set) socket.destroy()\n    }\n    this.notifyIfIdle()\n  }\n\n  private notifyIfIdle(): void {\n    if (!this.isIdle()) return\n    for (const waiter of Array.from(this.waiters)) waiter()\n  }\n}\n","import http from 'node:http'\nimport type { MeshInstanceRecord, NormalizedMeshConfig } from '../core/types.js'\nimport { RegistryFactory } from '../registry/RegistryFactory.js'\nimport { RegistryRecordTools } from '../registry/RegistryRecordTools.js'\nimport type { MeshRegistry } from '../registry/types.js'\n\nexport class InstanceRegistry {\n  private readonly registry: MeshRegistry\n  private readonly healthCache = new Map<string, { healthy: boolean; checkedAt: number }>()\n\n  public constructor(private readonly config: NormalizedMeshConfig) {\n    this.registry = new RegistryFactory().create(config)\n  }\n\n  public async listRoutable(): Promise<readonly MeshInstanceRecord[]> {\n    const records = await this.registry.list()\n    return records.filter(instance => RegistryRecordTools.isRoutable(instance))\n  }\n\n  public async listHealthyByService(service: string): Promise<readonly MeshInstanceRecord[]> {\n    const instances = (await this.listRoutable()).filter(instance => instance.service === service)\n    const serviceConfig = this.config.services.get(service)\n    if (!serviceConfig?.healthPath) return instances\n\n    const results = await Promise.all(instances.map(async instance => ({\n      instance,\n      healthy: await this.checkHttpHealth(instance, serviceConfig.healthPath!)\n    })))\n    return results.filter(result => result.healthy).map(result => result.instance)\n  }\n\n  private async checkHttpHealth(instance: MeshInstanceRecord, healthPath: string): Promise<boolean> {\n    if (!instance.url) return false\n    const cache = this.healthCache.get(instance.id)\n    const now = Date.now()\n    if (cache && now - cache.checkedAt < 1_000) return cache.healthy\n\n    const target = new URL(healthPath, instance.url)\n    const healthy = await new Promise<boolean>(resolve => {\n      const req = http.request(target, { method: 'GET', timeout: 1_000 }, res => {\n        res.resume()\n        resolve((res.statusCode ?? 500) >= 200 && (res.statusCode ?? 500) < 500)\n      })\n      req.on('timeout', () => {\n        req.destroy()\n        resolve(false)\n      })\n      req.on('error', () => resolve(false))\n      req.end()\n    })\n    this.healthCache.set(instance.id, { healthy, checkedAt: now })\n    return healthy\n  }\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport { MeshStateError } from '../core/errors.js'\nimport type { MeshInstanceRecord, MeshStateFile } from '../core/types.js'\nimport { atomicWriteJson, ensureDir, pathExists } from '../utils/fs.js'\nimport { nowIso } from '../utils/time.js'\n\nexport class MeshStateStore {\n  public constructor(\n    private readonly app: string,\n    private readonly stateDir: string\n  ) {}\n\n  public get statePath(): string {\n    return path.join(this.stateDir, 'state.json')\n  }\n\n  public async read(): Promise<MeshStateFile> {\n    if (!(await pathExists(this.statePath))) {\n      return this.empty()\n    }\n    try {\n      const text = await fs.promises.readFile(this.statePath, 'utf8')\n      const parsed = this.parseState(text)\n      if (parsed.version !== 1) throw new MeshStateError(`Unsupported mesh state version: ${String(parsed.version)}`)\n      return parsed\n    } catch (error) {\n      if (error instanceof SyntaxError) {\n        const recovered = await this.recoverCorruptedState()\n        if (recovered) return recovered\n      }\n      if (error instanceof MeshStateError) throw error\n      throw new MeshStateError(`Failed to read mesh state: ${(error as Error).message}`)\n    }\n  }\n\n  public async write(instances: readonly MeshInstanceRecord[]): Promise<void> {\n    await ensureDir(this.stateDir)\n    await atomicWriteJson(this.statePath, {\n      version: 1,\n      app: this.app,\n      updatedAt: nowIso(),\n      instances\n    } satisfies MeshStateFile)\n  }\n\n  public async upsert(instance: MeshInstanceRecord): Promise<void> {\n    const state = await this.read()\n    const others = state.instances.filter(item => item.id !== instance.id)\n    await this.write([...others, instance])\n  }\n\n  public async update(instanceId: string, patch: Partial<MeshInstanceRecord>): Promise<MeshInstanceRecord> {\n    const state = await this.read()\n    const current = state.instances.find(item => item.id === instanceId)\n    if (!current) throw new MeshStateError(`Instance not found in state: ${instanceId}`)\n    const next = { ...current, ...patch } as MeshInstanceRecord\n    await this.write(state.instances.map(item => item.id === instanceId ? next : item))\n    return next\n  }\n\n  public async remove(instanceIds: readonly string[]): Promise<void> {\n    const set = new Set(instanceIds)\n    const state = await this.read()\n    await this.write(state.instances.filter(instance => !set.has(instance.id)))\n  }\n\n  public empty(): MeshStateFile {\n    return {\n      version: 1,\n      app: this.app,\n      updatedAt: nowIso(),\n      instances: []\n    }\n  }\n\n  private parseState(text: string): MeshStateFile {\n    return JSON.parse(text) as MeshStateFile\n  }\n\n  private async recoverCorruptedState(): Promise<MeshStateFile | null> {\n    const text = await fs.promises.readFile(this.statePath, 'utf8')\n    const prefix = this.extractRootJsonPrefix(text)\n    if (!prefix) return null\n\n    try {\n      const parsed = this.parseState(prefix)\n      if (parsed.version !== 1) throw new MeshStateError(`Unsupported mesh state version: ${String(parsed.version)}`)\n      await atomicWriteJson(this.statePath, parsed)\n      return parsed\n    } catch {\n      return null\n    }\n  }\n\n  private extractRootJsonPrefix(text: string): string | null {\n    const start = text.search(/\\s*[{[]/)\n    if (start < 0) return null\n\n    let depth = 0\n    let inString = false\n    let escaped = false\n\n    for (let index = start; index < text.length; index += 1) {\n      const char = text[index]\n\n      if (inString) {\n        if (escaped) {\n          escaped = false\n          continue\n        }\n        if (char === '\\\\') {\n          escaped = true\n          continue\n        }\n        if (char === '\"') inString = false\n        continue\n      }\n\n      if (char === '\"') {\n        inString = true\n        continue\n      }\n\n      if (char === '{' || char === '[') {\n        depth += 1\n        continue\n      }\n\n      if (char === '}' || char === ']') {\n        depth -= 1\n        if (depth === 0) {\n          return text.slice(start, index + 1)\n        }\n      }\n    }\n\n    return null\n  }\n}\n","export class MeshError extends Error {\n  public constructor(message: string) {\n    super(message)\n    this.name = new.target.name\n  }\n}\n\nexport class MeshConfigError extends MeshError {}\nexport class MeshStateError extends MeshError {}\nexport class MeshProcessError extends MeshError {}\nexport class MeshIdResolutionError extends MeshError {}\n","import fs from 'node:fs'\nimport path from 'node:path'\n\nexport async function ensureDir(dir: string): Promise<void> {\n  await fs.promises.mkdir(dir, { recursive: true })\n}\n\nexport async function pathExists(filePath: string): Promise<boolean> {\n  try {\n    await fs.promises.access(filePath)\n    return true\n  } catch {\n    return false\n  }\n}\n\nexport async function atomicWriteJson(filePath: string, value: unknown): Promise<void> {\n  await ensureDir(path.dirname(filePath))\n  const tempPath = `${filePath}.${process.pid}.${Date.now()}.tmp`\n  await fs.promises.writeFile(tempPath, `${JSON.stringify(value, null, 2)}\\n`, 'utf8')\n  await fs.promises.rename(tempPath, filePath)\n}\n","export function nowIso(): string {\n  return new Date().toISOString()\n}\n\nexport function formatDurationSince(iso: string): string {\n  const started = new Date(iso).getTime()\n  const diff = Math.max(0, Date.now() - started)\n  const seconds = Math.floor(diff / 1000)\n  if (seconds < 60) return `${seconds}s`\n  const minutes = Math.floor(seconds / 60)\n  if (minutes < 60) return `${minutes}m`\n  const hours = Math.floor(minutes / 60)\n  if (hours < 24) return `${hours}h`\n  const days = Math.floor(hours / 24)\n  return `${days}d`\n}\n\nexport async function sleep(ms: number): Promise<void> {\n  if (ms <= 0) return\n  await new Promise<void>(resolve => setTimeout(resolve, ms))\n}\n","import type { MeshInstanceRecord, MeshInstanceStatus } from '../core/types.js'\n\nexport class RegistryRecordTools {\n  public static touch(instance: MeshInstanceRecord, ttlMs: number, now = Date.now()): MeshInstanceRecord {\n    return {\n      ...instance,\n      status: instance.status === 'expired' ? 'running' : instance.status,\n      lastSeenAt: new Date(now).toISOString(),\n      expiresAt: new Date(now + ttlMs).toISOString()\n    }\n  }\n\n  public static markExpired(instance: MeshInstanceRecord, now = Date.now()): MeshInstanceRecord {\n    if (!this.isExpired(instance, now)) return instance\n    return { ...instance, status: 'expired' as MeshInstanceStatus }\n  }\n\n  public static isExpired(instance: MeshInstanceRecord, now = Date.now()): boolean {\n    if (!instance.expiresAt) return false\n    return new Date(instance.expiresAt).getTime() <= now\n  }\n\n  public static isRoutable(instance: MeshInstanceRecord, now = Date.now()): boolean {\n    return instance.status === 'running'\n      && instance.url !== null\n      && instance.serviceType !== 'worker'\n      && instance.serviceType !== 'router'\n      && !this.isExpired(instance, now)\n  }\n}\n","import type { MeshInstanceRecord } from '../core/types.js'\nimport { MeshStateStore } from '../state/MeshStateStore.js'\nimport type { MeshRegistry, MeshRegistryHeartbeatOptions, MeshRegistryListOptions, MeshRegistryRegisterOptions } from './types.js'\nimport { RegistryRecordTools } from './RegistryRecordTools.js'\n\nexport class FileMeshRegistry implements MeshRegistry {\n  public readonly kind = 'file'\n  private readonly store: MeshStateStore\n\n  public constructor(app: string, stateDir: string) {\n    this.store = new MeshStateStore(app, stateDir)\n  }\n\n  public async register(instance: MeshInstanceRecord, options: MeshRegistryRegisterOptions = {}): Promise<MeshInstanceRecord> {\n    const record = options.ttlMs ? RegistryRecordTools.touch(instance, options.ttlMs) : instance\n    await this.store.upsert(record)\n    return record\n  }\n\n  public async heartbeat(instanceId: string, options: MeshRegistryHeartbeatOptions = {}): Promise<MeshInstanceRecord | null> {\n    const current = await this.get(instanceId)\n    if (!current) return null\n    const patched = { ...current, ...(options.patch ?? {}) } as MeshInstanceRecord\n    const next = options.ttlMs ? RegistryRecordTools.touch(patched, options.ttlMs) : patched\n    await this.store.upsert(next)\n    return next\n  }\n\n  public async list(options: MeshRegistryListOptions = {}): Promise<readonly MeshInstanceRecord[]> {\n    const state = await this.store.read()\n    const refreshed = state.instances.map(instance => RegistryRecordTools.markExpired(instance))\n    if (refreshed.some((instance, index) => instance !== state.instances[index])) {\n      await this.store.write(refreshed)\n    }\n    return refreshed.filter(instance => {\n      if (options.service && instance.service !== options.service) return false\n      if (!options.includeExpired && instance.status === 'expired') return false\n      return true\n    })\n  }\n\n  public async get(instanceId: string): Promise<MeshInstanceRecord | null> {\n    const state = await this.store.read()\n    return state.instances.find(instance => instance.id === instanceId) ?? null\n  }\n\n  public async markDraining(instanceId: string): Promise<MeshInstanceRecord | null> {\n    const current = await this.get(instanceId)\n    if (!current) return null\n    const next = { ...current, status: 'draining' as const }\n    await this.store.upsert(next)\n    return next\n  }\n\n  public async unregister(instanceId: string): Promise<void> {\n    await this.store.remove([instanceId])\n  }\n}\n","import crypto from 'node:crypto'\nimport type { MeshInstanceRecord } from '../core/types.js'\n\nexport interface RegistrationSignaturePayload {\n  readonly app: string\n  readonly id: string\n  readonly service: string\n  readonly serviceType: string\n  readonly url: string | null\n  readonly pid: number | null\n  readonly issuedAt: string\n}\n\nexport class RegistrationSigner {\n  public constructor(\n    private readonly app: string,\n    private readonly secret: string\n  ) {}\n\n  public sign(instance: MeshInstanceRecord, issuedAt = new Date().toISOString()): string {\n    return this.hmac(this.payload(instance, issuedAt))\n  }\n\n  public attach(instance: MeshInstanceRecord, issuedAt = new Date().toISOString()): MeshInstanceRecord {\n    const signature = this.sign(instance, issuedAt)\n    return {\n      ...instance,\n      metadata: {\n        ...(instance.metadata ?? {}),\n        registration: {\n          app: this.app,\n          issuedAt,\n          signature\n        }\n      }\n    }\n  }\n\n  public verify(instance: MeshInstanceRecord): boolean {\n    const registration = this.registration(instance)\n    if (!registration) return false\n    const expected = this.sign(instance, registration.issuedAt)\n    return this.safeEqual(expected, registration.signature)\n  }\n\n  private payload(instance: MeshInstanceRecord, issuedAt: string): RegistrationSignaturePayload {\n    return {\n      app: this.app,\n      id: instance.id,\n      service: instance.service,\n      serviceType: instance.serviceType,\n      url: instance.url,\n      pid: instance.pid,\n      issuedAt\n    }\n  }\n\n  private hmac(payload: RegistrationSignaturePayload): string {\n    return crypto.createHmac('sha256', this.secret).update(JSON.stringify(payload)).digest('base64url')\n  }\n\n  private registration(instance: MeshInstanceRecord): { issuedAt: string; signature: string } | null {\n    const value = instance.metadata?.registration\n    if (!value || typeof value !== 'object') return null\n    const record = value as Record<string, unknown>\n    if (record.app !== this.app || typeof record.issuedAt !== 'string' || typeof record.signature !== 'string') return null\n    return { issuedAt: record.issuedAt, signature: record.signature }\n  }\n\n  private safeEqual(a: string, b: string): boolean {\n    const left = Buffer.from(a)\n    const right = Buffer.from(b)\n    return left.length === right.length && crypto.timingSafeEqual(left, right)\n  }\n}\n","import net from 'node:net'\nimport tls from 'node:tls'\n\nexport type RedisCommandArg = string | number\n\nexport interface SimpleRedisClientOptions {\n  readonly url: string\n  readonly connectTimeoutMs?: number\n}\n\nexport class SimpleRedisClient {\n  private readonly url: URL\n  private readonly timeoutMs: number\n\n  public constructor(options: SimpleRedisClientOptions) {\n    this.url = new URL(options.url)\n    this.timeoutMs = options.connectTimeoutMs ?? 5_000\n  }\n\n  public async command(args: readonly RedisCommandArg[]): Promise<unknown> {\n    const socket = await this.connect()\n    try {\n      const reader = new RespReader(socket)\n      socket.write(this.encode(args))\n      return await reader.read()\n    } finally {\n      socket.end()\n    }\n  }\n\n  private async connect(): Promise<net.Socket> {\n    const port = Number(this.url.port || (this.url.protocol === 'rediss:' ? 6380 : 6379))\n    const host = this.url.hostname || '127.0.0.1'\n    const socket = this.url.protocol === 'rediss:' ? tls.connect({ port, host }) : net.connect({ port, host })\n\n    await new Promise<void>((resolve, reject) => {\n      const timer = setTimeout(() => {\n        socket.destroy(new Error('Redis connection timed out.'))\n      }, this.timeoutMs)\n      socket.once('connect', () => {\n        clearTimeout(timer)\n        resolve()\n      })\n      socket.once('error', error => {\n        clearTimeout(timer)\n        reject(error)\n      })\n    })\n\n    if (this.url.password) {\n      if (this.url.username) await this.commandOnSocket(socket, ['AUTH', decodeURIComponent(this.url.username), decodeURIComponent(this.url.password)])\n      else await this.commandOnSocket(socket, ['AUTH', decodeURIComponent(this.url.password)])\n    }\n\n    const db = this.url.pathname.replace(/^\\//, '')\n    if (db) await this.commandOnSocket(socket, ['SELECT', db])\n    return socket\n  }\n\n  private async commandOnSocket(socket: net.Socket, args: readonly RedisCommandArg[]): Promise<unknown> {\n    const reader = new RespReader(socket)\n    socket.write(this.encode(args))\n    return reader.read()\n  }\n\n  private encode(args: readonly RedisCommandArg[]): string {\n    return `*${args.length}\\r\\n${args.map(arg => {\n      const value = String(arg)\n      return `$${Buffer.byteLength(value)}\\r\\n${value}\\r\\n`\n    }).join('')}`\n  }\n}\n\nclass RespReader {\n  private buffer = Buffer.alloc(0)\n  private waiters: Array<() => void> = []\n\n  public constructor(private readonly socket: net.Socket) {\n    socket.on('data', chunk => {\n      this.buffer = Buffer.concat([this.buffer, chunk])\n      for (const waiter of this.waiters.splice(0)) waiter()\n    })\n  }\n\n  public async read(): Promise<unknown> {\n    while (true) {\n      const parsed = this.tryParse(0)\n      if (parsed) {\n        this.buffer = this.buffer.subarray(parsed.offset)\n        if (parsed.value instanceof RedisError) throw parsed.value\n        return parsed.value\n      }\n      await new Promise<void>((resolve, reject) => {\n        const onError = (error: Error): void => {\n          cleanup()\n          reject(error)\n        }\n        const onClose = (): void => {\n          cleanup()\n          reject(new Error('Redis socket closed before response.'))\n        }\n        const wake = (): void => {\n          cleanup()\n          resolve()\n        }\n        const cleanup = (): void => {\n          this.socket.off('error', onError)\n          this.socket.off('close', onClose)\n          const index = this.waiters.indexOf(wake)\n          if (index >= 0) this.waiters.splice(index, 1)\n        }\n        this.socket.once('error', onError)\n        this.socket.once('close', onClose)\n        this.waiters.push(wake)\n      })\n    }\n  }\n\n  private tryParse(offset: number): { value: unknown; offset: number } | null {\n    if (offset >= this.buffer.length) return null\n    const type = String.fromCharCode(this.buffer[offset]!)\n    const line = this.readLine(offset + 1)\n    if (!line) return null\n\n    if (type === '+') return { value: line.text, offset: line.offset }\n    if (type === '-') return { value: new RedisError(line.text), offset: line.offset }\n    if (type === ':') return { value: Number(line.text), offset: line.offset }\n    if (type === '$') {\n      const length = Number(line.text)\n      if (length === -1) return { value: null, offset: line.offset }\n      const end = line.offset + length\n      if (this.buffer.length < end + 2) return null\n      return { value: this.buffer.subarray(line.offset, end).toString('utf8'), offset: end + 2 }\n    }\n    if (type === '*') {\n      const count = Number(line.text)\n      if (count === -1) return { value: null, offset: line.offset }\n      const values: unknown[] = []\n      let current = line.offset\n      for (let index = 0; index < count; index += 1) {\n        const item = this.tryParse(current)\n        if (!item) return null\n        values.push(item.value)\n        current = item.offset\n      }\n      return { value: values, offset: current }\n    }\n    return null\n  }\n\n  private readLine(offset: number): { text: string; offset: number } | null {\n    const end = this.buffer.indexOf('\\r\\n', offset)\n    if (end < 0) return null\n    return { text: this.buffer.subarray(offset, end).toString('utf8'), offset: end + 2 }\n  }\n}\n\nclass RedisError extends Error {\n  public constructor(message: string) {\n    super(message)\n    this.name = 'RedisError'\n  }\n}\n","import type { MeshInstanceRecord } from '../../core/types.js'\nimport type { MeshRegistry, MeshRegistryHeartbeatOptions, MeshRegistryListOptions, MeshRegistryRegisterOptions } from '../types.js'\nimport { RegistryRecordTools } from '../RegistryRecordTools.js'\nimport { RegistrationSigner } from '../RegistrationSigner.js'\nimport { SimpleRedisClient, type SimpleRedisClientOptions } from './SimpleRedisClient.js'\n\nexport interface RedisMeshRegistryOptions extends SimpleRedisClientOptions {\n  readonly app: string\n  readonly secret?: string\n  readonly keyPrefix?: string\n  readonly requireSignature?: boolean\n}\n\nexport class RedisMeshRegistry implements MeshRegistry {\n  public readonly kind = 'redis'\n  private readonly client: SimpleRedisClient\n  private readonly prefix: string\n  private readonly signer: RegistrationSigner | undefined\n  private readonly requireSignature: boolean\n\n  public constructor(private readonly options: RedisMeshRegistryOptions) {\n    this.client = new SimpleRedisClient(options)\n    this.prefix = options.keyPrefix ?? `mesh:${options.app}`\n    this.signer = options.secret ? new RegistrationSigner(options.app, options.secret) : undefined\n    this.requireSignature = options.requireSignature ?? Boolean(options.secret)\n  }\n\n  public async register(instance: MeshInstanceRecord, options: MeshRegistryRegisterOptions = {}): Promise<MeshInstanceRecord> {\n    const ttlMs = options.ttlMs ?? 15_000\n    const touched = RegistryRecordTools.touch(instance, ttlMs)\n    const signed = this.signer ? this.signer.attach(touched) : touched\n    await this.client.command(['SADD', this.indexKey(), signed.id])\n    await this.client.command(['SET', this.instanceKey(signed.id), JSON.stringify(signed), 'PX', ttlMs])\n    return signed\n  }\n\n  public async heartbeat(instanceId: string, options: MeshRegistryHeartbeatOptions = {}): Promise<MeshInstanceRecord | null> {\n    const current = await this.get(instanceId)\n    if (!current) return null\n    const ttlMs = options.ttlMs ?? this.remainingTtl(current) ?? 15_000\n    const patched = { ...current, ...(options.patch ?? {}) } as MeshInstanceRecord\n    const touched = RegistryRecordTools.touch(patched, ttlMs)\n    const signed = this.signer ? this.signer.attach(touched) : touched\n    await this.client.command(['SET', this.instanceKey(instanceId), JSON.stringify(signed), 'PX', ttlMs])\n    return signed\n  }\n\n  public async list(options: MeshRegistryListOptions = {}): Promise<readonly MeshInstanceRecord[]> {\n    const ids = await this.ids()\n    const items = await Promise.all(ids.map(id => this.get(id)))\n    const now = Date.now()\n    const alive: MeshInstanceRecord[] = []\n    const staleIds: string[] = []\n\n    for (let index = 0; index < ids.length; index += 1) {\n      const id = ids[index]!\n      const item = items[index]\n      if (!item) {\n        staleIds.push(id)\n        continue\n      }\n      const refreshed = RegistryRecordTools.markExpired(item, now)\n      if (options.service && refreshed.service !== options.service) continue\n      if (!options.includeExpired && refreshed.status === 'expired') continue\n      alive.push(refreshed)\n    }\n\n    if (staleIds.length > 0) await this.client.command(['SREM', this.indexKey(), ...staleIds])\n    return alive\n  }\n\n  public async get(instanceId: string): Promise<MeshInstanceRecord | null> {\n    const raw = await this.client.command(['GET', this.instanceKey(instanceId)])\n    if (typeof raw !== 'string') return null\n    const parsed = JSON.parse(raw) as MeshInstanceRecord\n    if (this.requireSignature && (!this.signer || !this.signer.verify(parsed))) return null\n    return parsed\n  }\n\n  public async markDraining(instanceId: string): Promise<MeshInstanceRecord | null> {\n    const current = await this.get(instanceId)\n    if (!current) return null\n    return this.heartbeat(instanceId, { patch: { status: 'draining' } })\n  }\n\n  public async unregister(instanceId: string): Promise<void> {\n    await this.client.command(['DEL', this.instanceKey(instanceId)])\n    await this.client.command(['SREM', this.indexKey(), instanceId])\n  }\n\n  private async ids(): Promise<readonly string[]> {\n    const value = await this.client.command(['SMEMBERS', this.indexKey()])\n    return Array.isArray(value) ? value.filter((item): item is string => typeof item === 'string') : []\n  }\n\n  private remainingTtl(instance: MeshInstanceRecord): number | null {\n    if (!instance.expiresAt) return null\n    return Math.max(1_000, new Date(instance.expiresAt).getTime() - Date.now())\n  }\n\n  private indexKey(): string {\n    return `${this.prefix}:instances`\n  }\n\n  private instanceKey(id: string): string {\n    return `${this.prefix}:instance:${id}`\n  }\n}\n","import { FileMeshRegistry } from './FileMeshRegistry.js'\nimport type { MeshRegistry } from './types.js'\nimport type { NormalizedMeshConfig } from '../core/types.js'\nimport { RedisMeshRegistry } from './redis/RedisMeshRegistry.js'\n\nexport class RegistryFactory {\n  public create(config: NormalizedMeshConfig): MeshRegistry {\n    if (config.registry.type === 'file') {\n      return new FileMeshRegistry(config.app, config.runtime.stateDir)\n    }\n    return new RedisMeshRegistry({\n      app: config.app,\n      url: config.registry.url,\n      ...(config.registry.keyPrefix !== undefined ? { keyPrefix: config.registry.keyPrefix } : {}),\n      ...(config.registry.secret !== undefined ? { secret: config.registry.secret } : {}),\n      requireSignature: config.registry.requireSignature,\n      connectTimeoutMs: config.registry.connectTimeoutMs\n    })\n  }\n}\n","import type { IncomingHttpHeaders } from 'node:http'\nimport type { MeshInstanceRecord, MeshServiceStrategy } from '../core/types.js'\nimport { StickySession } from './StickySession.js'\n\nexport interface LoadBalancerSelection {\n  readonly instance: MeshInstanceRecord\n  readonly setCookie?: string\n}\n\nexport class LoadBalancer {\n  private readonly cursors = new Map<string, number>()\n  private readonly active = new Map<string, number>()\n\n  public constructor(private readonly sticky: StickySession) {}\n\n  public select(\n    service: string,\n    strategy: MeshServiceStrategy,\n    instances: readonly MeshInstanceRecord[],\n    headers: IncomingHttpHeaders\n  ): LoadBalancerSelection | null {\n    if (instances.length === 0) return null\n\n    if (strategy === 'session-affinity') {\n      const cookie = this.sticky.read(headers, service)\n      const stickyTarget = cookie ? instances.find(instance => instance.id === cookie.nodeId) : undefined\n      if (stickyTarget) return { instance: stickyTarget }\n      const instance = this.roundRobin(service, instances)\n      return { instance, setCookie: this.sticky.createHeader(service, instance.id) }\n    }\n\n    if (strategy === 'least-connections') {\n      return { instance: this.leastConnections(instances) }\n    }\n\n    return { instance: this.roundRobin(service, instances) }\n  }\n\n  public begin(instanceId: string): void {\n    this.active.set(instanceId, (this.active.get(instanceId) ?? 0) + 1)\n  }\n\n  public end(instanceId: string): void {\n    this.active.set(instanceId, Math.max(0, (this.active.get(instanceId) ?? 0) - 1))\n  }\n\n  private roundRobin(service: string, instances: readonly MeshInstanceRecord[]): MeshInstanceRecord {\n    const cursor = this.cursors.get(service) ?? 0\n    const instance = instances[cursor % instances.length]!\n    this.cursors.set(service, cursor + 1)\n    return instance\n  }\n\n  private leastConnections(instances: readonly MeshInstanceRecord[]): MeshInstanceRecord {\n    return [...instances].sort((a, b) => (this.active.get(a.id) ?? 0) - (this.active.get(b.id) ?? 0))[0]!\n  }\n}\n","import type { IncomingHttpHeaders } from 'node:http'\nimport type { MeshServiceType } from '../core/types.js'\n\nconst HOP_BY_HOP = new Set([\n  'connection',\n  'keep-alive',\n  'proxy-authenticate',\n  'proxy-authorization',\n  'te',\n  'trailer',\n  'transfer-encoding',\n  'upgrade'\n])\n\nexport class ProxyHeaders {\n  public build(\n    headers: IncomingHttpHeaders,\n    target: URL,\n    remoteAddress?: string,\n    options: { serviceType?: MeshServiceType; meshCookieName?: string; forwardedProto?: 'http' | 'https' } = {}\n  ): IncomingHttpHeaders {\n    const next: IncomingHttpHeaders = {}\n    for (const [key, value] of Object.entries(headers)) {\n      if (HOP_BY_HOP.has(key.toLowerCase())) continue\n      next[key] = value\n    }\n\n    if (options.serviceType === 'frontend') {\n      delete next.cookie\n    } else if (typeof next.cookie === 'string' && options.meshCookieName) {\n      const sanitized = this.stripCookie(next.cookie, options.meshCookieName)\n      if (sanitized) next.cookie = sanitized\n      else delete next.cookie\n    }\n\n    next.host = target.host\n    next['x-forwarded-host'] = headers.host\n    next['x-forwarded-proto'] = options.forwardedProto ?? 'http'\n    if (remoteAddress) {\n      const current = headers['x-forwarded-for']\n      next['x-forwarded-for'] = current ? `${String(current)}, ${remoteAddress}` : remoteAddress\n    }\n    return next\n  }\n\n  private stripCookie(cookieHeader: string, cookieName: string): string {\n    return cookieHeader\n      .split(';')\n      .map(part => part.trim())\n      .filter(Boolean)\n      .filter(part => !part.startsWith(`${cookieName}=`))\n      .join('; ')\n  }\n}\n","import type { MeshInstanceRecord } from '../core/types.js'\nimport type { MeshRouteMatch } from './types.js'\n\ninterface RouteCandidate {\n  readonly service: string\n  readonly route: string\n}\n\nexport class RouteMatcher {\n  public match(pathname: string, instances: readonly MeshInstanceRecord[]): MeshRouteMatch | null {\n    const routes = [...this.collectRoutes(instances)]\n    routes.sort((a, b) => this.score(b.route) - this.score(a.route) || a.route.localeCompare(b.route))\n    for (const route of routes) {\n      if (this.matches(pathname, route.route)) {\n        return { service: route.service, route: route.route, pathname }\n      }\n    }\n    return null\n  }\n\n  public collectRoutes(instances: readonly MeshInstanceRecord[]): readonly RouteCandidate[] {\n    const seen = new Set<string>()\n    const routes: RouteCandidate[] = []\n    for (const instance of instances) {\n      const metadata = instance.metadata ?? {}\n      const rawRoutes = Array.isArray(metadata.routes) ? metadata.routes : []\n      for (const item of rawRoutes) {\n        if (typeof item !== 'string') continue\n        const route = this.normalizeRoute(item)\n        const key = `${instance.service}:${route}`\n        if (seen.has(key)) continue\n        seen.add(key)\n        routes.push({ service: instance.service, route })\n      }\n    }\n    return routes\n  }\n\n  private matches(pathname: string, route: string): boolean {\n    const path = this.normalizeRoute(pathname)\n    if (route === '/') return true\n    if (!route.includes(':') && !route.includes('*')) return path === route || path.startsWith(`${route}/`)\n    return this.matchesPatternPrefix(path, route)\n  }\n\n  private matchesPatternPrefix(pathname: string, pattern: string): boolean {\n    const pathSegments = this.segments(pathname)\n    const routeSegments = this.segments(pattern)\n    if (routeSegments.length > pathSegments.length) return false\n    for (let index = 0; index < routeSegments.length; index += 1) {\n      const route = routeSegments[index]!\n      const path = pathSegments[index]!\n      if (route === '*') return true\n      if (route.startsWith(':')) {\n        if (!path) return false\n        continue\n      }\n      if (route !== path) return false\n    }\n    return true\n  }\n\n  private normalizeRoute(route: string): string {\n    if (route === '/') return '/'\n    return `/${route.replace(/^\\/+|\\/+$/g, '')}`\n  }\n\n  private segments(route: string): readonly string[] {\n    return route.split('/').filter(Boolean)\n  }\n\n  private score(route: string): number {\n    if (route === '/') return 0\n    return this.segments(route).reduce((score, segment) => {\n      if (segment === '*') return score + 1\n      if (segment.startsWith(':')) return score + 5\n      return score + 20 + segment.length\n    }, route.length)\n  }\n}\n","import crypto from 'node:crypto'\n\nexport interface StickyCookiePayload {\n  readonly service: string\n  readonly nodeId: string\n  readonly exp: number\n}\n\nexport class CookieSigner {\n  public constructor(private readonly secret: string) {\n    if (!secret || secret.length < 8) {\n      throw new Error('Mesh router secret must be at least 8 characters long.')\n    }\n  }\n\n  public sign(payload: StickyCookiePayload): string {\n    const body = Buffer.from(JSON.stringify(payload), 'utf8').toString('base64url')\n    const signature = this.hmac(body)\n    return `${body}.${signature}`\n  }\n\n  public verify(value: string | undefined, expectedService?: string): StickyCookiePayload | null {\n    if (!value) return null\n    const [body, signature] = value.split('.')\n    if (!body || !signature) return null\n    if (!this.safeEqual(signature, this.hmac(body))) return null\n\n    try {\n      const decoded = JSON.parse(Buffer.from(body, 'base64url').toString('utf8')) as Partial<StickyCookiePayload>\n      if (!decoded.service || !decoded.nodeId || typeof decoded.exp !== 'number') return null\n      if (decoded.exp < Math.floor(Date.now() / 1000)) return null\n      if (expectedService && decoded.service !== expectedService) return null\n      return { service: decoded.service, nodeId: decoded.nodeId, exp: decoded.exp }\n    } catch {\n      return null\n    }\n  }\n\n  private hmac(value: string): string {\n    return crypto.createHmac('sha256', this.secret).update(value).digest('base64url')\n  }\n\n  private safeEqual(left: string, right: string): boolean {\n    const a = Buffer.from(left)\n    const b = Buffer.from(right)\n    return a.length === b.length && crypto.timingSafeEqual(a, b)\n  }\n}\n","import type { IncomingHttpHeaders } from 'node:http'\nimport { CookieSigner, type StickyCookiePayload } from './CookieSigner.js'\n\nexport interface StickySessionOptions {\n  readonly cookieName: string\n  readonly secret: string\n  readonly ttlSeconds?: number\n  readonly secure?: boolean\n}\n\nexport class StickySession {\n  private readonly signer: CookieSigner\n  private readonly ttlSeconds: number\n\n  public constructor(private readonly options: StickySessionOptions) {\n    this.signer = new CookieSigner(options.secret)\n    this.ttlSeconds = options.ttlSeconds ?? 60 * 60 * 24 * 14\n  }\n\n  public read(headers: IncomingHttpHeaders, service: string): StickyCookiePayload | null {\n    const cookie = headers.cookie\n    const value = this.parseCookies(cookie)[this.options.cookieName]\n    return this.signer.verify(value, service)\n  }\n\n  public createHeader(service: string, nodeId: string): string {\n    const payload: StickyCookiePayload = {\n      service,\n      nodeId,\n      exp: Math.floor(Date.now() / 1000) + this.ttlSeconds\n    }\n    const parts = [\n      `${this.options.cookieName}=${this.signer.sign(payload)}`,\n      'Path=/',\n      'HttpOnly',\n      'SameSite=Lax'\n    ]\n    if (this.options.secure) parts.push('Secure')\n    return parts.join('; ')\n  }\n\n  private parseCookies(cookieHeader: string | undefined): Record<string, string> {\n    const cookies: Record<string, string> = {}\n    if (!cookieHeader) return cookies\n    for (const part of cookieHeader.split(';')) {\n      const index = part.indexOf('=')\n      if (index < 0) continue\n      const key = part.slice(0, index).trim()\n      const value = part.slice(index + 1).trim()\n      if (key) cookies[key] = value\n    }\n    return cookies\n  }\n}\n","import type { MeshConnectionCounters } from '../core/types.js'\nimport type { MeshRouterMetricsSnapshot, MeshRouterServiceStats } from './types.js'\n\ninterface MutableServiceStats {\n  service: string\n  requests: number\n  upgrades: number\n  errors: number\n}\n\nexport class RouterMetrics {\n  private readonly startedAt = new Date()\n  private requestsTotal = 0\n  private proxiedTotal = 0\n  private noTargetTotal = 0\n  private errorsTotal = 0\n  private upgradesTotal = 0\n  private readonly services = new Map<string, MutableServiceStats>()\n\n  public recordProxy(service: string): void {\n    this.requestsTotal += 1\n    this.proxiedTotal += 1\n    this.service(service).requests += 1\n  }\n\n  public recordUpgrade(service: string): void {\n    this.requestsTotal += 1\n    this.proxiedTotal += 1\n    this.upgradesTotal += 1\n    const stats = this.service(service)\n    stats.requests += 1\n    stats.upgrades += 1\n  }\n\n  public recordNoTarget(): void {\n    this.requestsTotal += 1\n    this.noTargetTotal += 1\n  }\n\n  public recordError(service?: string): void {\n    this.errorsTotal += 1\n    if (service) this.service(service).errors += 1\n  }\n\n  public snapshot(active: MeshConnectionCounters, serviceActive: ReadonlyMap<string, MeshConnectionCounters>, draining: boolean): MeshRouterMetricsSnapshot {\n    const services: MeshRouterServiceStats[] = []\n    for (const stats of this.services.values()) {\n      services.push({\n        service: stats.service,\n        requests: stats.requests,\n        upgrades: stats.upgrades,\n        errors: stats.errors,\n        active: serviceActive.get(stats.service) ?? { http: 0, sockets: 0, total: 0 }\n      })\n    }\n    services.sort((a, b) => a.service.localeCompare(b.service))\n    return {\n      router: {\n        startedAt: this.startedAt.toISOString(),\n        uptimeMs: Date.now() - this.startedAt.getTime(),\n        draining\n      },\n      requests: {\n        total: this.requestsTotal,\n        proxied: this.proxiedTotal,\n        noTarget: this.noTargetTotal,\n        errors: this.errorsTotal,\n        upgrades: this.upgradesTotal\n      },\n      active,\n      services\n    }\n  }\n\n  private service(service: string): MutableServiceStats {\n    const existing = this.services.get(service)\n    if (existing) return existing\n    const created: MutableServiceStats = { service, requests: 0, upgrades: 0, errors: 0 }\n    this.services.set(service, created)\n    return created\n  }\n}\n","export function formatOrigin(protocol: 'http' | 'https', host: string, port: number): string {\n  const defaultPort = protocol === 'https' ? 443 : 80\n  return port === defaultPort ? `${protocol}://${host}` : `${protocol}://${host}:${port}`\n}\n"],"mappings":"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","names":["import_node_http","import_node_net","import_node_fs","import_node_crypto","http","import_node_fs","import_node_path","fs","path","path","fs","crypto","tls","net","http","instance","path","import_node_crypto","crypto","net","path","http","tls","fs","https"]}