{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type { PGlite } from '@electric-sql/pglite'\nimport { type Server, type Socket, createServer } from 'net'\n\n// Connection queue timeout in milliseconds\nexport const CONNECTION_QUEUE_TIMEOUT = 60000 // 60 seconds\nexport const SSL_REQUEST_CODE = 80877103\nexport const SSL_REQUEST_LENGTH = 8\nexport const CANCEL_REQUEST_CODE = 80877102\nexport const CANCEL_REQUEST_LENGTH = 16\n\n/**\n * Represents a queued query waiting for PGlite access\n */\ninterface QueuedQuery {\n  handlerId: number\n  message: Uint8Array\n  resolve: (resultSize: number) => void\n  reject: (error: Error) => void\n  timestamp: number\n  onData: (data: Uint8Array) => void\n}\n\n/**\n * Global query queue manager\n * Ensures only one query executes at a time in PGlite\n */\nclass QueryQueueManager {\n  private queue: QueuedQuery[] = []\n  private processing = false\n  private db: PGlite\n  private debug: boolean\n  private lastHandlerId: null | number = null\n\n  constructor(db: PGlite, debug = false) {\n    this.db = db\n    this.debug = debug\n  }\n\n  private log(message: string, ...args: any[]): void {\n    if (this.debug) {\n      console.log(`[QueryQueueManager] ${message}`, ...args)\n    }\n  }\n\n  async enqueue(\n    handlerId: number,\n    message: Uint8Array,\n    onData: (data: Uint8Array) => void,\n  ): Promise<number> {\n    return new Promise((resolve, reject) => {\n      const query: QueuedQuery = {\n        handlerId,\n        message,\n        resolve,\n        reject,\n        timestamp: Date.now(),\n        onData,\n      }\n\n      this.queue.push(query)\n      this.log(\n        `enqueued query from handler #${handlerId}, queue size: ${this.queue.length}`,\n      )\n\n      // Process queue if not already processing\n      if (!this.processing) {\n        this.processQueue()\n      }\n    })\n  }\n\n  private async processQueue(): Promise<void> {\n    if (this.processing || this.queue.length === 0) {\n      return\n    }\n\n    this.processing = true\n\n    while (this.queue.length > 0) {\n      let query\n\n      if (this.db.isInTransaction() && this.lastHandlerId) {\n        const i = this.queue.findIndex(\n          (q) => q.handlerId === this.lastHandlerId,\n        )\n        if (i === -1) {\n          // we didn't find any other query from the same client!\n          this.log(\n            `transaction started, but no query from the same handler id found in queue`,\n            this.lastHandlerId,\n          )\n          query = null\n        } else {\n          query = this.queue.splice(i, 1)[0]\n        }\n      } else {\n        query = this.queue.shift()\n      }\n      if (!query) break\n\n      const waitTime = Date.now() - query.timestamp\n      this.log(\n        `processing query from handler #${query.handlerId} (waited ${waitTime}ms)`,\n      )\n\n      let result = 0\n      try {\n        // Execute the query with exclusive access to PGlite\n        await this.db.runExclusive(async () => {\n          return await this.db.execProtocolRawStream(query.message, {\n            onRawData: (data) => {\n              result += data.length\n              query.onData(data)\n            },\n          })\n        })\n      } catch (error) {\n        this.log(`query from handler #${query.handlerId} failed:`, error)\n        query.reject(error as Error)\n        return\n      }\n\n      this.log(\n        `query from handler #${query.handlerId} completed, ${result} bytes`,\n      )\n      this.lastHandlerId = query.handlerId\n      query.resolve(result)\n    }\n\n    this.processing = false\n    this.log(`queue processing complete, queue length is`, this.queue.length)\n  }\n\n  getQueueLength(): number {\n    return this.queue.length\n  }\n\n  clearQueueForHandler(handlerId: number): void {\n    const before = this.queue.length\n    this.queue = this.queue.filter((q) => {\n      if (q.handlerId === handlerId) {\n        q.reject(new Error('Handler disconnected'))\n        return false\n      }\n      return true\n    })\n    const removed = before - this.queue.length\n    if (removed > 0) {\n      this.log(`cleared ${removed} queries for handler #${handlerId}`)\n    }\n  }\n\n  async clearTransactionIfNeeded(handlerId: number): Promise<void> {\n    if (this.db.isInTransaction() && this.lastHandlerId === handlerId) {\n      await this.db.exec('ROLLBACK')\n      this.lastHandlerId = null\n      await this.processQueue()\n    }\n  }\n}\n\n/**\n * Options for creating a PGLiteSocketHandler\n */\nexport interface PGLiteSocketHandlerOptions {\n  /** The query queue manager */\n  queryQueue: QueryQueueManager\n  /** Whether to close the socket when detached (default: false) */\n  closeOnDetach?: boolean\n  /** Print the incoming and outgoing data to the console in hex and ascii */\n  inspect?: boolean\n  /** Enable debug logging of method calls */\n  debug?: boolean\n  /** Idle timeout in ms (0 to disable, default: 0) */\n  idleTimeout?: number\n}\n\n/**\n * Handler for a single socket connection to PGlite\n * Each connection can remain open and send multiple queries\n */\nexport class PGLiteSocketHandler extends EventTarget {\n  private queryQueue: QueryQueueManager\n  private socket: Socket | null = null\n  private active = false\n  private closeOnDetach: boolean\n  private inspect: boolean\n  private debug: boolean\n  private readonly id: number\n  private messageBuffer: Buffer = Buffer.alloc(0)\n  private idleTimer?: NodeJS.Timeout\n  private idleTimeout: number\n  private lastActivityTime: number = Date.now()\n\n  // Static counter for generating unique handler IDs\n  private static nextHandlerId = 1\n\n  constructor(options: PGLiteSocketHandlerOptions) {\n    super()\n    this.queryQueue = options.queryQueue\n    this.closeOnDetach = options.closeOnDetach ?? false\n    this.inspect = options.inspect ?? false\n    this.debug = options.debug ?? false\n    this.idleTimeout = options.idleTimeout ?? 0\n    this.id = PGLiteSocketHandler.nextHandlerId++\n\n    this.log('constructor: created new handler')\n  }\n\n  public get handlerId(): number {\n    return this.id\n  }\n\n  private log(message: string, ...args: any[]): void {\n    if (this.debug) {\n      console.log(`[PGLiteSocketHandler#${this.id}] ${message}`, ...args)\n    }\n  }\n\n  public async attach(socket: Socket): Promise<PGLiteSocketHandler> {\n    this.log(\n      `attach: attaching socket from ${socket.remoteAddress}:${socket.remotePort}`,\n    )\n\n    if (this.socket) {\n      throw new Error('Socket already attached')\n    }\n\n    this.socket = socket\n    this.active = true\n    this.lastActivityTime = Date.now()\n\n    // Set up socket options\n    socket.setNoDelay(true)\n\n    // Set up idle timeout if configured\n    if (this.idleTimeout > 0) {\n      this.resetIdleTimer()\n    }\n\n    // Setup event handlers\n    this.log(`attach: setting up socket event handlers`)\n\n    socket.on('data', (data) => {\n      this.lastActivityTime = Date.now()\n      this.resetIdleTimer()\n\n      setImmediate(async () => {\n        try {\n          await this.handleData(data)\n        } catch (err) {\n          this.log('socket on data error: ', err)\n          this.handleError(err as Error)\n        }\n      })\n    })\n\n    socket.on('error', (err) => {\n      setImmediate(() => this.handleError(err))\n    })\n\n    socket.on('close', () => {\n      setImmediate(() => this.handleClose())\n    })\n\n    this.log(`attach: socket handler ready`)\n    return this\n  }\n\n  private resetIdleTimer(): void {\n    if (this.idleTimeout <= 0) return\n\n    if (this.idleTimer) {\n      clearTimeout(this.idleTimer)\n    }\n\n    this.idleTimer = setTimeout(() => {\n      const idleTime = Date.now() - this.lastActivityTime\n      this.log(`idle timeout after ${idleTime}ms`)\n      this.handleError(new Error('Idle timeout'))\n    }, this.idleTimeout)\n  }\n\n  public async detach(close?: boolean): Promise<PGLiteSocketHandler> {\n    this.log(`detach: detaching socket, close=${close ?? this.closeOnDetach}`)\n\n    if (this.idleTimer) {\n      clearTimeout(this.idleTimer)\n      this.idleTimer = undefined\n    }\n\n    // Clear any pending queries for this handler\n    this.queryQueue.clearQueueForHandler(this.id)\n\n    await this.queryQueue.clearTransactionIfNeeded(this.id)\n\n    if (!this.socket) {\n      this.log(`detach: no socket attached, nothing to do`)\n      return this\n    }\n\n    // Remove all listeners\n    this.socket.removeAllListeners('data')\n    this.socket.removeAllListeners('error')\n    this.socket.removeAllListeners('close')\n\n    // Close the socket if requested\n    if (close ?? this.closeOnDetach) {\n      if (this.socket.writable) {\n        this.log(`detach: closing socket`)\n        try {\n          this.socket.end()\n          this.socket.destroy()\n        } catch (err) {\n          this.log(`detach: error closing socket:`, err)\n        }\n      }\n    }\n\n    this.socket = null\n    this.active = false\n    this.messageBuffer = Buffer.alloc(0)\n\n    this.log(`detach: handler cleaned up`)\n    return this\n  }\n\n  public get isAttached(): boolean {\n    return this.socket !== null\n  }\n\n  private handleSslRequest(): boolean {\n    if (this.messageBuffer.length < SSL_REQUEST_LENGTH) {\n      return false\n    }\n\n    const len = this.messageBuffer.readInt32BE(0)\n    const code = this.messageBuffer.readInt32BE(4)\n\n    if (len === SSL_REQUEST_LENGTH && code === SSL_REQUEST_CODE) {\n      if (this.socket?.writable) {\n        this.socket.write(Buffer.from('N'))\n      }\n      this.messageBuffer = this.messageBuffer.slice(SSL_REQUEST_LENGTH)\n      return true\n    }\n\n    return false\n  }\n\n  // CancelRequest arrives on its own connection during startup, before any\n  // typed message. PGlite has no backend process to signal, so we consume the\n  // message and silently drop it (the wire protocol expects no response).\n  private handleCancelRequest(): boolean {\n    if (this.messageBuffer.length < CANCEL_REQUEST_LENGTH) {\n      return false\n    }\n\n    const len = this.messageBuffer.readInt32BE(0)\n    const code = this.messageBuffer.readInt32BE(4)\n\n    if (len === CANCEL_REQUEST_LENGTH && code === CANCEL_REQUEST_CODE) {\n      this.messageBuffer = this.messageBuffer.slice(CANCEL_REQUEST_LENGTH)\n      this.log('handleData: CancelRequest received, ignoring (not supported)')\n      return true\n    }\n\n    return false\n  }\n\n  private async handleData(data: Buffer): Promise<number> {\n    if (!this.socket || !this.active) {\n      this.log(`handleData: no active socket, ignoring data`)\n      return 0\n    }\n\n    this.log(`handleData: received ${data.length} bytes`)\n\n    // Append to buffer for message reassembly\n    this.messageBuffer = Buffer.concat([this.messageBuffer, data])\n\n    // Print the incoming data to the console\n    this.inspectData('incoming', data)\n\n    try {\n      let totalProcessed = 0\n\n      while (this.messageBuffer.length > 0) {\n        if (this.handleSslRequest()) {\n          continue\n        }\n\n        if (this.handleCancelRequest()) {\n          continue\n        }\n\n        // Determine message length\n        let messageLength = 0\n        let isComplete = false\n\n        // Handle startup message (no type byte, just length)\n        if (this.messageBuffer.length >= 4) {\n          const firstInt = this.messageBuffer.readInt32BE(0)\n\n          if (this.messageBuffer.length >= 8) {\n            const secondInt = this.messageBuffer.readInt32BE(4)\n            // PostgreSQL 3.0 protocol version\n            if (secondInt === 196608 || secondInt === 0x00030000) {\n              messageLength = firstInt\n              isComplete = this.messageBuffer.length >= messageLength\n            }\n          }\n\n          // Regular message (type byte + length)\n          if (!isComplete && this.messageBuffer.length >= 5) {\n            const msgLength = this.messageBuffer.readInt32BE(1)\n            messageLength = 1 + msgLength\n            isComplete = this.messageBuffer.length >= messageLength\n          }\n        }\n\n        if (!isComplete || messageLength === 0) {\n          this.log(\n            `handleData: incomplete message, buffering ${this.messageBuffer.length} bytes`,\n          )\n          break\n        }\n\n        // Extract and process complete message\n        const message = this.messageBuffer.slice(0, messageLength)\n        this.messageBuffer = this.messageBuffer.slice(messageLength)\n\n        this.log(`handleData: processing message of ${message.length} bytes`)\n\n        // Check if socket is still active before processing\n        if (!this.active || !this.socket) {\n          this.log(`handleData: socket no longer active, stopping processing`)\n          break\n        }\n\n        let socketWriteError: any = undefined\n        // Queue the query for execution\n        // This allows multiple connections to queue queries simultaneously\n        await this.queryQueue.enqueue(\n          this.id,\n          new Uint8Array(message),\n          (data) => {\n            this.log(`handleData: received ${data.length} bytes from PGlite`)\n\n            // Print the outgoing data to the console\n            this.inspectData('outgoing', data)\n\n            // Send response if available\n            if (\n              data.length > 0 &&\n              this.socket &&\n              this.socket.writable &&\n              this.active\n            ) {\n              // await new Promise<number>((resolve, reject) => {\n              this.log(`handleData: writing response to socket`)\n              if (this.socket?.writable) {\n                this.socket.write(Buffer.from(data), (err?: any) => {\n                  if (err) {\n                    this.log(`handleData: error writing to socket:`, err)\n                    socketWriteError = err\n                  } else {\n                    this.log(`handleData: socket sent: ${data.length} bytes`)\n                  }\n                })\n              } else {\n                this.log(`handleData: socket no longer writable`)\n              }\n            }\n            totalProcessed += data.length\n          },\n        )\n        if (socketWriteError) throw socketWriteError\n      }\n\n      // Emit data event with byte sizes\n      this.dispatchEvent(\n        new CustomEvent('data', {\n          detail: { incoming: data.length, outgoing: totalProcessed },\n        }),\n      )\n\n      return totalProcessed\n    } catch (err) {\n      this.log(`handleData: error processing data:`, err)\n      throw err\n    }\n  }\n\n  private handleError(err: Error): void {\n    if (!this.active) {\n      this.log(`handleError: handler not active, ignoring error`)\n      return\n    }\n\n    // ECONNRESET is expected behavior when clients disconnect\n    if (err.message?.includes('ECONNRESET')) {\n      this.log(\n        `handleError: client disconnected (ECONNRESET) - normal behavior`,\n      )\n    } else if (err.message?.includes('Idle timeout')) {\n      this.log(`handleError: connection idle timeout`)\n    } else {\n      this.log(`handleError:`, err)\n    }\n\n    this.active = false\n\n    // Emit error event\n    this.dispatchEvent(new CustomEvent('error', { detail: err }))\n\n    // Clean up\n    this.detach(true)\n  }\n\n  private handleClose(): void {\n    this.log(`handleClose: socket closed`)\n    this.active = false\n    this.dispatchEvent(new CustomEvent('close'))\n    this.detach(false)\n  }\n\n  private inspectData(\n    direction: 'incoming' | 'outgoing',\n    data: Buffer | Uint8Array,\n  ): void {\n    if (!this.inspect) return\n    console.log('-'.repeat(75))\n    if (direction === 'incoming') {\n      console.log('-> incoming', data.length, 'bytes')\n    } else {\n      console.log('<- outgoing', data.length, 'bytes')\n    }\n\n    for (let offset = 0; offset < data.length; offset += 16) {\n      const chunkSize = Math.min(16, data.length - offset)\n\n      let hexPart = ''\n      for (let i = 0; i < 16; i++) {\n        if (i < chunkSize) {\n          const byte = data[offset + i]\n          hexPart += byte.toString(16).padStart(2, '0') + ' '\n        } else {\n          hexPart += '   '\n        }\n      }\n\n      let asciiPart = ''\n      for (let i = 0; i < chunkSize; i++) {\n        const byte = data[offset + i]\n        asciiPart += byte >= 32 && byte <= 126 ? String.fromCharCode(byte) : '.'\n      }\n\n      console.log(\n        `${offset.toString(16).padStart(8, '0')}  ${hexPart} ${asciiPart}`,\n      )\n    }\n  }\n}\n\n/**\n * Options for creating a PGLiteSocketServer\n */\nexport interface PGLiteSocketServerOptions {\n  /** The PGlite database instance */\n  db: PGlite\n  /** The port to listen on (default: 5432) */\n  port?: number\n  /** The host to bind to (default: 127.0.0.1) */\n  host?: string\n  /** Unix socket path to bind to (default: undefined) */\n  path?: string\n  /** Print the incoming and outgoing data to the console in hex and ascii */\n  inspect?: boolean\n  /** Enable debug logging of method calls */\n  debug?: boolean\n  /** Idle timeout in ms (0 to disable, default: 0) */\n  idleTimeout?: number\n  /** Maximum concurrent connections (default: 1) */\n  maxConnections?: number\n}\n\n/**\n * PGLite Socket Server with support for multiple concurrent connections\n * Connections remain open and queries are queued at the query level\n */\nexport class PGLiteSocketServer extends EventTarget {\n  readonly db: PGlite\n  private server: Server | null = null\n  private port?: number\n  private host?: string\n  private path?: string\n  private active = false\n  private inspect: boolean\n  private debug: boolean\n  private idleTimeout: number\n  private maxConnections: number\n  private handlers: Set<PGLiteSocketHandler> = new Set()\n  private queryQueue: QueryQueueManager\n\n  constructor(options: PGLiteSocketServerOptions) {\n    super()\n    this.db = options.db\n    if (options.path) {\n      this.path = options.path\n    } else {\n      if (typeof options.port === 'number') {\n        // Keep port undefined on port 0, will be set by the OS when we start the server.\n        this.port = options.port ?? options.port\n      } else {\n        this.port = 5432\n      }\n      this.host = options.host || '127.0.0.1'\n    }\n    this.inspect = options.inspect ?? false\n    this.debug = options.debug ?? false\n    this.idleTimeout = options.idleTimeout ?? 0\n    this.maxConnections = options.maxConnections ?? 1\n\n    // Create the shared query queue\n    this.queryQueue = new QueryQueueManager(this.db, this.debug)\n\n    this.log(`constructor: created server on ${this.getServerConn()}`)\n    this.log(`constructor: max connections: ${this.maxConnections}`)\n    if (this.idleTimeout > 0) {\n      this.log(`constructor: idle timeout: ${this.idleTimeout}ms`)\n    }\n  }\n\n  private log(message: string, ...args: any[]): void {\n    if (this.debug) {\n      console.log(`[PGLiteSocketServer] ${message}`, ...args)\n    }\n  }\n\n  public async start(): Promise<void> {\n    this.log(`start: starting server on ${this.getServerConn()}`)\n\n    if (this.server) {\n      throw new Error('Socket server already started')\n    }\n\n    // Ensure PGlite is ready before accepting connections\n    await this.db.waitReady\n\n    this.active = true\n    this.server = createServer((socket) => {\n      setImmediate(() => this.handleConnection(socket))\n    })\n\n    this.server.maxConnections = this.maxConnections\n\n    return new Promise<void>((resolve, reject) => {\n      if (!this.server) return reject(new Error('Server not initialized'))\n\n      let listening = false\n\n      this.server.on('error', (err) => {\n        this.log(`start: server error:`, err)\n        this.dispatchEvent(new CustomEvent('error', { detail: err }))\n        if (!listening) {\n          reject(err)\n        }\n      })\n\n      if (this.path) {\n        this.server.listen(this.path, () => {\n          listening = true\n          this.log(`start: server listening on ${this.getServerConn()}`)\n          this.dispatchEvent(\n            new CustomEvent('listening', {\n              detail: { path: this.path },\n            }),\n          )\n          resolve()\n        })\n      } else {\n        const server = this.server\n        server.listen(this.port, this.host, () => {\n          listening = true\n          const address = server.address()\n          // We are not using pipes, so return type should be AddressInfo\n          if (address === null || typeof address !== 'object') {\n            throw Error('Expected address info')\n          }\n          // Assign the new port number\n          this.port = address.port\n          this.log(`start: server listening on ${this.getServerConn()}`)\n          this.dispatchEvent(\n            new CustomEvent('listening', {\n              detail: { port: this.port, host: this.host },\n            }),\n          )\n          resolve()\n        })\n      }\n    })\n  }\n\n  public getServerConn(): string {\n    if (this.path) return this.path\n    return `${this.host}:${this.port}`\n  }\n\n  public async stop(): Promise<void> {\n    this.log(`stop: stopping server`)\n\n    this.active = false\n\n    // Detach all handlers\n    this.log(`stop: detaching ${this.handlers.size} handlers`)\n    for (const handler of this.handlers) {\n      handler.detach(true)\n    }\n    this.handlers.clear()\n\n    if (!this.server) {\n      this.log(`stop: server not running, nothing to do`)\n      return Promise.resolve()\n    }\n\n    return new Promise<void>((resolve) => {\n      if (!this.server) return resolve()\n\n      this.server.close(() => {\n        this.log(`stop: server closed`)\n        this.server = null\n        this.dispatchEvent(new CustomEvent('close'))\n        resolve()\n      })\n    })\n  }\n\n  private async handleConnection(socket: Socket): Promise<void> {\n    const clientInfo = {\n      clientAddress: socket.remoteAddress || 'unknown',\n      clientPort: socket.remotePort || 0,\n    }\n\n    this.log(\n      `handleConnection: new connection from ${clientInfo.clientAddress}:${clientInfo.clientPort}`,\n    )\n    this.log(\n      `handleConnection: active connections: ${this.handlers.size}, queued queries: ${this.queryQueue.getQueueLength()}`,\n    )\n\n    if (!this.active) {\n      this.log(`handleConnection: server not active, closing connection`)\n      try {\n        socket.end()\n      } catch (err) {\n        this.log(`handleConnection: error closing socket:`, err)\n      }\n      return\n    }\n\n    // Check connection limit\n    if (this.handlers.size >= this.maxConnections) {\n      this.log(`handleConnection: max connections reached, rejecting`)\n      socket.write(Buffer.from('Too many connections\\n'))\n      socket.end()\n      return\n    }\n\n    // Create a new handler for this connection\n    const handler = new PGLiteSocketHandler({\n      queryQueue: this.queryQueue,\n      closeOnDetach: true,\n      inspect: this.inspect,\n      debug: this.debug,\n      idleTimeout: this.idleTimeout,\n    })\n\n    // Track this handler\n    this.handlers.add(handler)\n\n    // Handle errors\n    handler.addEventListener('error', (event) => {\n      const error = (event as CustomEvent<Error>).detail\n\n      if (error?.message?.includes('ECONNRESET')) {\n        this.log(\n          `handler #${handler.handlerId}: client disconnected (ECONNRESET)`,\n        )\n      } else if (error?.message?.includes('Idle timeout')) {\n        this.log(`handler #${handler.handlerId}: idle timeout`)\n      } else {\n        this.log(`handler #${handler.handlerId}: error:`, error)\n      }\n    })\n\n    // Handle close event\n    handler.addEventListener('close', () => {\n      this.log(`handler #${handler.handlerId}: closed`)\n      this.handlers.delete(handler)\n      this.log(`handleConnection: active connections: ${this.handlers.size}`)\n    })\n\n    try {\n      await handler.attach(socket)\n      this.dispatchEvent(new CustomEvent('connection', { detail: clientInfo }))\n    } catch (err) {\n      this.log(`handleConnection: error attaching socket:`, err)\n      this.handlers.delete(handler)\n      this.dispatchEvent(new CustomEvent('error', { detail: err }))\n      try {\n        socket.end()\n      } catch (closeErr) {\n        this.log(`handleConnection: error closing socket:`, closeErr)\n      }\n    }\n  }\n\n  public getStats() {\n    return {\n      activeConnections: this.handlers.size,\n      queuedQueries: this.queryQueue.getQueueLength(),\n      maxConnections: this.maxConnections,\n    }\n  }\n}\n"],"mappings":"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","names":["src_exports","__export","CANCEL_REQUEST_CODE","CANCEL_REQUEST_LENGTH","CONNECTION_QUEUE_TIMEOUT","PGLiteSocketHandler","PGLiteSocketServer","SSL_REQUEST_CODE","SSL_REQUEST_LENGTH","__toCommonJS","import_net","CONNECTION_QUEUE_TIMEOUT","SSL_REQUEST_CODE","SSL_REQUEST_LENGTH","CANCEL_REQUEST_CODE","CANCEL_REQUEST_LENGTH","QueryQueueManager","db","debug","message","args","handlerId","onData","resolve","reject","query","i","q","waitTime","result","data","error","before","removed","_PGLiteSocketHandler","options","socket","err","idleTime","close","len","code","totalProcessed","messageLength","isComplete","firstInt","secondInt","socketWriteError","direction","offset","chunkSize","hexPart","byte","asciiPart","PGLiteSocketHandler","PGLiteSocketServer","listening","server","address","handler","clientInfo","event","closeErr"]}