{"version":3,"sources":["../../../src/registry/redis/index.ts","../../../src/registry/RegistryRecordTools.ts","../../../src/registry/RegistrationSigner.ts","../../../src/registry/redis/SimpleRedisClient.ts","../../../src/registry/redis/RedisMeshRegistry.ts"],"sourcesContent":["export { RedisMeshRegistry, type RedisMeshRegistryOptions } from './RedisMeshRegistry.js'\nexport { SimpleRedisClient, type SimpleRedisClientOptions } from './SimpleRedisClient.js'\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 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"],"mappings":"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","names":["crypto","tls","net"]}