{"version":3,"sources":["../../src/events/unix-socket-pubsub.ts"],"names":["PubSub","unlink","mkdir","dirname","net","open","stat","randomUUID"],"mappings":"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","file":"index.cjs","sourcesContent":["import { randomUUID } from 'node:crypto';\nimport { mkdir, open, stat, unlink } from 'node:fs/promises';\nimport type { FileHandle } from 'node:fs/promises';\nimport net from 'node:net';\nimport { dirname } from 'node:path';\n\nimport { PubSub } from './pubsub';\nimport type { PubSubDeliveryMode } from './pubsub';\nimport type { Event, EventCallback, SubscribeOptions } from './types';\n\ntype ClientFrame =\n  | { type: 'subscribe'; topic: string }\n  | { type: 'unsubscribe'; topic: string }\n  | { type: 'publish'; topic: string; event: Omit<Event, 'id' | 'createdAt'> }\n  | { type: 'ack'; id?: string }\n  | { type: 'nack'; id?: string };\n\ntype ServerFrame = { type: 'event'; topic: string; event: Event } | { type: 'subscribed'; topic: string };\n\ntype UnixSocketPubSubOptions = {\n  maxRemoteClientQueuedBytes?: number;\n};\n\ntype BrokerClient = {\n  socket: net.Socket;\n  subscriptions: Set<string>;\n  writeChain: Promise<void>;\n  queuedBytes: number;\n};\n\ntype SubscribeWaiter = {\n  resolve: () => void;\n  reject: (error: Error) => void;\n};\n\nconst DEFAULT_MAX_REMOTE_CLIENT_QUEUED_BYTES = 64 * 1024 * 1024;\n\nfunction serializeFrame(frame: ClientFrame | ServerFrame): string {\n  return `${JSON.stringify(frame)}\\n`;\n}\n\nfunction writeSerializedFrame(socket: net.Socket, serializedFrame: string): Promise<void> {\n  return new Promise((resolve, reject) => {\n    let writeCompleted = false;\n    let drainCompleted = true;\n    let settled = false;\n\n    const cleanup = () => {\n      socket.off('error', onError);\n      socket.off('close', onClose);\n      socket.off('drain', onDrain);\n    };\n    const settle = (error?: Error) => {\n      if (settled) return;\n      settled = true;\n      cleanup();\n      if (error) {\n        reject(error);\n        return;\n      }\n      resolve();\n    };\n    const maybeResolve = () => {\n      if (writeCompleted && drainCompleted) {\n        settle();\n      }\n    };\n    const onError = (error: Error) => settle(error);\n    const onClose = () => settle(new Error('UnixSocketPubSub socket closed before write completed'));\n    const onDrain = () => {\n      drainCompleted = true;\n      maybeResolve();\n    };\n\n    socket.once('error', onError);\n    socket.once('close', onClose);\n    let drained: boolean;\n    try {\n      drained = socket.write(serializedFrame, error => {\n        if (error) {\n          settle(error);\n          return;\n        }\n        writeCompleted = true;\n        maybeResolve();\n      });\n    } catch (error) {\n      settle(error as Error);\n      return;\n    }\n    if (!drained) {\n      drainCompleted = false;\n      socket.once('drain', onDrain);\n    }\n  });\n}\n\nfunction writeFrame(socket: net.Socket, frame: ClientFrame | ServerFrame): Promise<void> {\n  return writeSerializedFrame(socket, serializeFrame(frame));\n}\n\nfunction nextTick(): Promise<void> {\n  return new Promise(resolve => setImmediate(resolve));\n}\n\nfunction readFrames(socket: net.Socket, onFrame: (frame: any) => void) {\n  let buffer = '';\n  socket.setEncoding('utf8');\n  socket.on('data', chunk => {\n    buffer += chunk;\n    while (true) {\n      const newlineIndex = buffer.indexOf('\\n');\n      if (newlineIndex === -1) break;\n      const line = buffer.slice(0, newlineIndex);\n      buffer = buffer.slice(newlineIndex + 1);\n      if (!line.trim()) continue;\n      try {\n        onFrame(JSON.parse(line));\n      } catch {\n        // Ignore malformed frames. The transport is local IPC and callers can retry.\n      }\n    }\n  });\n}\n\nexport class UnixSocketPubSub extends PubSub {\n  readonly socketPath: string;\n  #server?: net.Server;\n  #clientSocket?: net.Socket;\n  #isBroker = false;\n  #closed = false;\n  #starting?: Promise<void>;\n  #callbacks = new Map<string, Set<EventCallback>>();\n  #subscribeWaiters = new Map<string, SubscribeWaiter[]>();\n  #brokerClients = new Map<net.Socket, BrokerClient>();\n  #pendingWrites = new Set<Promise<void>>();\n  #recovering?: Promise<void>;\n  #maxRemoteClientQueuedBytes: number;\n\n  constructor(socketPath: string, options: UnixSocketPubSubOptions = {}) {\n    super();\n    this.socketPath = socketPath;\n    this.#maxRemoteClientQueuedBytes = options.maxRemoteClientQueuedBytes ?? DEFAULT_MAX_REMOTE_CLIENT_QUEUED_BYTES;\n  }\n\n  override get supportedModes(): ReadonlyArray<PubSubDeliveryMode> {\n    return ['push'];\n  }\n\n  get isBroker(): boolean {\n    return this.#isBroker;\n  }\n\n  /** Number of remote clients currently connected to this broker. Always 0 for non-broker instances. */\n  get remoteClientCount(): number {\n    return this.#isBroker ? this.#brokerClients.size : 0;\n  }\n\n  async publish(topic: string, event: Omit<Event, 'id' | 'createdAt'>): Promise<void> {\n    await this.#ensureStarted();\n    if (this.#isBroker) {\n      await this.#publishFromBroker(topic, event);\n      return;\n    }\n\n    const socket = this.#clientSocket;\n    if (!socket || socket.destroyed) {\n      await this.#ensureStarted(true);\n    }\n    await this.#sendToBroker({ type: 'publish', topic, event });\n  }\n\n  async subscribe(topic: string, cb: EventCallback, options?: SubscribeOptions): Promise<void> {\n    if (options?.group) {\n      throw new Error('UnixSocketPubSub does not support grouped subscriptions yet');\n    }\n\n    const callbacks = this.#callbacks.get(topic) ?? new Set<EventCallback>();\n    const hadCallback = callbacks.has(cb);\n    const wasConnected = Boolean(this.#clientSocket && !this.#clientSocket.destroyed);\n    callbacks.add(cb);\n    this.#callbacks.set(topic, callbacks);\n\n    try {\n      await this.#ensureStarted();\n      if (!this.#isBroker && !hadCallback && wasConnected) {\n        await this.#sendSubscribeToBroker(topic);\n      }\n    } catch (error) {\n      if (!hadCallback) {\n        callbacks.delete(cb);\n        if (callbacks.size === 0) {\n          this.#callbacks.delete(topic);\n        }\n      }\n      throw error;\n    }\n  }\n\n  async unsubscribe(topic: string, cb: EventCallback): Promise<void> {\n    const callbacks = this.#callbacks.get(topic);\n    callbacks?.delete(cb);\n    if (callbacks?.size === 0) {\n      this.#callbacks.delete(topic);\n      if (!this.#isBroker && this.#clientSocket && !this.#clientSocket.destroyed) {\n        await this.#sendToBroker({ type: 'unsubscribe', topic });\n        await nextTick();\n      }\n    }\n  }\n\n  async flush(): Promise<void> {\n    await Promise.allSettled([...this.#pendingWrites]);\n  }\n\n  async close(): Promise<void> {\n    this.#closed = true;\n    this.#callbacks.clear();\n\n    this.#clientSocket?.destroy();\n    this.#clientSocket = undefined;\n    this.#rejectSubscribeWaiters(new Error('UnixSocketPubSub is closed'));\n\n    for (const client of [...this.#brokerClients.values()]) {\n      this.#removeBrokerClient(client);\n    }\n\n    if (this.#server) {\n      await new Promise<void>(resolve => this.#server?.close(() => resolve()));\n      this.#server = undefined;\n    }\n\n    if (this.#isBroker) {\n      await unlink(this.socketPath).catch(() => {});\n    }\n    this.#isBroker = false;\n  }\n\n  async #ensureStarted(forceReconnect = false): Promise<void> {\n    if (this.#closed) {\n      throw new Error('UnixSocketPubSub is closed');\n    }\n    if (!forceReconnect && (this.#isBroker || (this.#clientSocket && !this.#clientSocket.destroyed))) {\n      return;\n    }\n    if (this.#starting) {\n      return this.#starting;\n    }\n\n    this.#starting = this.#start(forceReconnect).finally(() => {\n      this.#starting = undefined;\n    });\n    return this.#starting;\n  }\n\n  async #start(forceReconnect: boolean): Promise<void> {\n    if (forceReconnect) {\n      this.#clientSocket?.destroy();\n      this.#clientSocket = undefined;\n      this.#isBroker = false;\n    }\n\n    this.#throwIfClosed();\n    await mkdir(dirname(this.socketPath), { recursive: true });\n    this.#throwIfClosed();\n\n    try {\n      await this.#listen();\n      this.#throwIfClosed();\n      this.#isBroker = true;\n      return;\n    } catch (error) {\n      if (this.#closed) {\n        await this.close();\n        throw new Error('UnixSocketPubSub is closed');\n      }\n      const code = (error as NodeJS.ErrnoException).code;\n      if (code !== 'EADDRINUSE') throw error;\n    }\n\n    try {\n      await this.#connectClient();\n      this.#throwIfClosed();\n    } catch (error) {\n      if (this.#closed) {\n        await this.close();\n        throw new Error('UnixSocketPubSub is closed');\n      }\n      const code = (error as NodeJS.ErrnoException).code;\n      if (code === 'ECONNREFUSED' || code === 'ENOENT' || code === 'ENOTSOCK') {\n        this.#throwIfClosed();\n        await this.#electBroker();\n        return;\n      }\n      throw error;\n    }\n  }\n\n  #throwIfClosed() {\n    if (this.#closed) {\n      throw new Error('UnixSocketPubSub is closed');\n    }\n  }\n\n  #listen(): Promise<void> {\n    return new Promise((resolve, reject) => {\n      const server = net.createServer(socket => this.#handleBrokerClient(socket));\n      const onError = (error: Error) => {\n        server.off('listening', onListening);\n        reject(error);\n      };\n      const onListening = () => {\n        server.off('error', onError);\n        this.#server = server;\n        resolve();\n      };\n\n      server.once('error', onError);\n      server.once('listening', onListening);\n      server.listen(this.socketPath);\n    });\n  }\n\n  #connectClient(): Promise<void> {\n    return new Promise((resolve, reject) => {\n      const socket = net.createConnection(this.socketPath);\n      const onError = (error: Error) => {\n        socket.off('connect', onConnect);\n        reject(error);\n      };\n      const onConnect = () => {\n        socket.off('error', onError);\n        this.#clientSocket = socket;\n        this.#isBroker = false;\n        readFrames(socket, frame => this.#handleServerFrame(frame));\n        socket.on('close', () =>\n          this.#handleClientDisconnect(socket, new Error('UnixSocketPubSub broker connection closed')),\n        );\n        socket.on('error', error => this.#handleClientDisconnect(socket, error));\n        void this.#resubscribeClient().then(resolve, reject);\n      };\n\n      socket.once('error', onError);\n      socket.once('connect', onConnect);\n    });\n  }\n\n  async #resubscribeClient() {\n    for (const topic of this.#callbacks.keys()) {\n      await this.#sendSubscribeToBroker(topic);\n    }\n  }\n\n  #handleClientDisconnect(socket: net.Socket, error: Error) {\n    if (this.#clientSocket !== socket) return;\n    this.#clientSocket = undefined;\n    this.#rejectSubscribeWaiters(error);\n    if (!this.#closed) {\n      void this.#recoverClientConnection();\n    }\n  }\n\n  async #recoverClientConnection(): Promise<void> {\n    if (this.#recovering) return this.#recovering;\n    this.#recovering = this.#recoverClientConnectionLoop().finally(() => {\n      this.#recovering = undefined;\n    });\n    return this.#recovering;\n  }\n\n  async #recoverClientConnectionLoop(): Promise<void> {\n    while (!this.#closed && !this.#isBroker && !(this.#clientSocket && !this.#clientSocket.destroyed)) {\n      try {\n        await this.#ensureStarted(true);\n        return;\n      } catch {\n        if (this.#closed) return;\n        await new Promise(resolve => setTimeout(resolve, 10));\n      }\n    }\n  }\n\n  /**\n   * Serializes broker election across processes using an exclusive lock file.\n   * Only the lock winner unlinks the stale socket and listens; losers wait\n   * then connect as clients to the newly elected broker.\n   */\n  async #electBroker(): Promise<void> {\n    const lockPath = this.socketPath + '.elect';\n    let lockFd: FileHandle | undefined;\n    try {\n      lockFd = await open(lockPath, 'wx');\n    } catch (e) {\n      if ((e as NodeJS.ErrnoException).code === 'EEXIST') {\n        if (await this.#isElectionLockStale(lockPath)) {\n          await unlink(lockPath).catch(() => {});\n          throw new Error('Stale broker election lock removed');\n        }\n        await new Promise(resolve => setTimeout(resolve, 150));\n        try {\n          await this.#connectClient();\n          this.#throwIfClosed();\n          return;\n        } catch {\n          throw new Error('Broker election in progress by another process');\n        }\n      }\n      throw e;\n    }\n\n    try {\n      // Re-check: a previous election round may have installed a broker\n      // between our initial connectClient() and acquiring this lock.\n      try {\n        await this.#connectClient();\n        this.#throwIfClosed();\n        return;\n      } catch {\n        // Still no live broker — proceed with election.\n      }\n      await unlink(this.socketPath).catch(() => {});\n      this.#throwIfClosed();\n      await this.#listen();\n      this.#throwIfClosed();\n      this.#isBroker = true;\n    } finally {\n      await lockFd.close().catch(() => {});\n      await unlink(lockPath).catch(() => {});\n    }\n  }\n\n  async #isElectionLockStale(lockPath: string): Promise<boolean> {\n    try {\n      const lockStat = await stat(lockPath);\n      return Date.now() - lockStat.mtimeMs > 2000;\n    } catch {\n      return true;\n    }\n  }\n\n  async #sendSubscribeToBroker(topic: string): Promise<void> {\n    let waiter: SubscribeWaiter | undefined;\n    const subscribed = new Promise<void>((resolve, reject) => {\n      waiter = { resolve, reject };\n      const waiters = this.#subscribeWaiters.get(topic) ?? [];\n      waiters.push(waiter);\n      this.#subscribeWaiters.set(topic, waiters);\n    });\n    try {\n      await this.#sendToBroker({ type: 'subscribe', topic });\n    } catch (error) {\n      this.#removeSubscribeWaiter(topic, waiter);\n      throw error;\n    }\n    await subscribed;\n  }\n\n  #removeSubscribeWaiter(topic: string, waiter: SubscribeWaiter | undefined) {\n    if (!waiter) return;\n    const waiters = this.#subscribeWaiters.get(topic);\n    if (!waiters) return;\n    const nextWaiters = waiters.filter(item => item !== waiter);\n    if (nextWaiters.length === 0) {\n      this.#subscribeWaiters.delete(topic);\n      return;\n    }\n    this.#subscribeWaiters.set(topic, nextWaiters);\n  }\n\n  #settleSubscribeWaiters(topic: string, error?: Error) {\n    const waiters = this.#subscribeWaiters.get(topic);\n    this.#subscribeWaiters.delete(topic);\n    if (error) {\n      waiters?.forEach(waiter => waiter.reject(error));\n      return;\n    }\n    waiters?.forEach(waiter => waiter.resolve());\n  }\n\n  #rejectSubscribeWaiters(error: Error) {\n    for (const topic of this.#subscribeWaiters.keys()) {\n      this.#settleSubscribeWaiters(topic, error);\n    }\n  }\n\n  #handleBrokerClient(socket: net.Socket) {\n    const client: BrokerClient = {\n      socket,\n      subscriptions: new Set(),\n      writeChain: Promise.resolve(),\n      queuedBytes: 0,\n    };\n    this.#brokerClients.set(socket, client);\n    readFrames(socket, frame => {\n      const clientFrame = frame as ClientFrame;\n      if (clientFrame.type === 'subscribe') {\n        client.subscriptions.add(clientFrame.topic);\n        this.#enqueueBrokerClientWrite(client, { type: 'subscribed', topic: clientFrame.topic });\n      } else if (clientFrame.type === 'unsubscribe') {\n        client.subscriptions.delete(clientFrame.topic);\n      } else if (clientFrame.type === 'publish') {\n        void this.#publishFromBroker(clientFrame.topic, clientFrame.event);\n      }\n    });\n    socket.on('close', () => this.#removeBrokerClient(client));\n    socket.on('error', () => this.#removeBrokerClient(client));\n  }\n\n  #enqueueBrokerClientWrite(client: BrokerClient, frame: ServerFrame) {\n    if (this.#brokerClients.get(client.socket) !== client || client.socket.destroyed) return;\n\n    const serializedFrame = serializeFrame(frame);\n    const queuedBytes = Buffer.byteLength(serializedFrame);\n    if (client.queuedBytes + queuedBytes > this.#maxRemoteClientQueuedBytes) {\n      this.#removeBrokerClient(client);\n      return;\n    }\n\n    client.queuedBytes += queuedBytes;\n\n    const write = client.writeChain\n      .catch(() => {})\n      .then(async () => {\n        if (this.#brokerClients.get(client.socket) !== client || client.socket.destroyed) return;\n        await writeSerializedFrame(client.socket, serializedFrame);\n      })\n      .catch(() => {\n        this.#removeBrokerClient(client);\n      })\n      .finally(() => {\n        client.queuedBytes = Math.max(0, client.queuedBytes - queuedBytes);\n      });\n\n    client.writeChain = write;\n    this.#pendingWrites.add(write);\n    void write.finally(() => this.#pendingWrites.delete(write));\n  }\n\n  #removeBrokerClient(client: BrokerClient) {\n    if (this.#brokerClients.get(client.socket) !== client) return;\n    this.#brokerClients.delete(client.socket);\n    client.subscriptions.clear();\n    client.queuedBytes = 0;\n    client.writeChain = Promise.resolve();\n    if (!client.socket.destroyed) {\n      client.socket.destroy();\n    }\n  }\n\n  #handleServerFrame(frame: ServerFrame) {\n    if (frame.type === 'subscribed') {\n      this.#settleSubscribeWaiters(frame.topic);\n      return;\n    }\n    if (frame.type !== 'event') return;\n    const event = {\n      ...frame.event,\n      createdAt: new Date(frame.event.createdAt),\n    };\n    this.#deliverLocal(frame.topic, event);\n  }\n\n  async #publishFromBroker(topic: string, event: Omit<Event, 'id' | 'createdAt'>) {\n    const brokerEvent: Event = {\n      ...event,\n      id: randomUUID(),\n      createdAt: new Date(),\n      deliveryAttempt: 1,\n    };\n\n    this.#deliverLocal(topic, brokerEvent);\n\n    // Skip serialization entirely when no remote clients could receive the event.\n    if (this.#brokerClients.size === 0) return;\n\n    let frame: ServerFrame | undefined;\n    for (const client of this.#brokerClients.values()) {\n      if (!client.subscriptions.has(topic) || client.socket.destroyed) continue;\n      // Lazily build the frame only when we know at least one client needs it.\n      frame ??= { type: 'event', topic, event: brokerEvent };\n      this.#enqueueBrokerClientWrite(client, frame);\n    }\n  }\n\n  #deliverLocal(topic: string, event: Event) {\n    const callbacks = this.#callbacks.get(topic);\n    if (!callbacks) return;\n    for (const cb of callbacks) {\n      try {\n        const result = (cb as (event: Event, ack: () => Promise<void>, nack: () => Promise<void>) => unknown)(\n          event,\n          async () => {},\n          async () => {},\n        );\n        if (result && typeof (result as Promise<void>).catch === 'function') {\n          void (result as Promise<void>).catch(() => {});\n        }\n      } catch {\n        // Ignore subscriber failures so one callback cannot poison topic delivery.\n      }\n    }\n  }\n\n  async #sendToBroker(frame: ClientFrame) {\n    try {\n      await this.#sendToActiveBroker(frame);\n    } catch (error) {\n      if (this.#closed) throw error;\n      const failedSocket = this.#clientSocket;\n      this.#clientSocket = undefined;\n      failedSocket?.destroy();\n      await this.#ensureStarted(true);\n      await this.#sendToActiveBroker(frame);\n    }\n  }\n\n  async #sendToActiveBroker(frame: ClientFrame) {\n    const socket = this.#clientSocket;\n    if (!socket || socket.destroyed) {\n      await this.#ensureStarted(true);\n    }\n    if (this.#isBroker) {\n      await this.#handlePromotedBrokerFrame(frame);\n      return;\n    }\n    const activeSocket = this.#clientSocket;\n    if (!activeSocket || activeSocket.destroyed) {\n      throw new Error('UnixSocketPubSub is not connected to a broker');\n    }\n    await writeFrame(activeSocket, frame);\n  }\n\n  async #handlePromotedBrokerFrame(frame: ClientFrame) {\n    if (frame.type === 'subscribe') {\n      this.#settleSubscribeWaiters(frame.topic);\n    } else if (frame.type === 'publish') {\n      await this.#publishFromBroker(frame.topic, frame.event);\n    }\n  }\n}\n"]}