{"version":3,"file":"runtime.mjs","names":["#queue","#connection","#onRelease","#onDestroy","#closed","#connectionMutex","#closeWhileHoldingLease","#connected","#connectPromise","#cursorOpts","#preparedStatements","#delegate","#closed","#requireDelegate","#wrapConnection"],"sources":["../src/callback-to-promise.ts","../src/named-cursor.ts","../src/postgres-driver.ts","../src/exports/runtime.ts"],"sourcesContent":["/**\n * Wraps a Node-style callback function into a Promise.\n * Supports both (err) => void and (err, result) => void patterns.\n */\nexport function callbackToPromise(\n  fn: (callback: (err: Error | null | undefined) => void) => void,\n): Promise<void>;\nexport function callbackToPromise<T>(\n  fn: (callback: (err: Error | null | undefined, result: T) => void) => void,\n): Promise<T>;\nexport function callbackToPromise<T = void>(\n  fn: (callback: (err: Error | null | undefined, result?: T) => void) => void,\n): Promise<T> {\n  return new Promise<T>((resolve, reject) => {\n    fn((err, result) => {\n      if (err) {\n        reject(err);\n        return;\n      }\n      resolve(result as T);\n    });\n  });\n}\n","import type { BindConfig, Connection, QueryParse } from 'pg';\nimport Cursor from 'pg-cursor';\n\nlet nextNamedPortalId = 1;\n\nexport interface NamedCursorOptions<Row> {\n  readonly name: string;\n  readonly text: string;\n  readonly values: readonly unknown[];\n  readonly config?: ConstructorParameters<typeof Cursor<Row>>[2];\n}\n\n// `parsedStatements` is set on the Connection by pg.Client, not by Connection\n// itself, so it isn't declared on @types/pg's `Connection`.\ntype ConnectionWithStatementCache = Connection & {\n  readonly parsedStatements: Record<string, string>;\n};\n\n// pg-cursor's runtime instance shape. @types/pg-cursor only declares the\n// constructor + submit/read/close, so the fields pg-cursor sets on `this` and\n// its handlers consume have to be re-declared here.\ninterface CursorInstanceFields {\n  state: 'initialized' | 'submitted' | 'idle' | 'busy' | 'done' | 'error';\n  connection: Connection | null;\n  text: string;\n  values: ReadonlyArray<unknown> | null;\n  _portal: string;\n  _conf: { types?: { getTypeParser: (oid: number, format?: string) => unknown } };\n  _result: { _getTypeParser?: unknown };\n  _ifNoData: () => void;\n  _rowDescription: () => void;\n}\n\n/** Streaming cursor for a server-side named prepared statement. */\nexport class NamedCursor<Row = Record<string, unknown>> extends Cursor<Row> {\n  readonly name: string;\n\n  constructor(opts: NamedCursorOptions<Row>) {\n    super(opts.text, [...opts.values], opts.config);\n    this.name = opts.name;\n    // Cursor declares `submit` as a property, not a class method, so\n    // `override submit() {}` at the class level conflicts. Replace the\n    // field on this instance instead.\n    this.submit = this.submitNamed;\n  }\n\n  private submitNamed(connection: Connection): void {\n    const self = this as unknown as CursorInstanceFields;\n    const conn = connection as ConnectionWithStatementCache;\n\n    self.state = 'submitted';\n    self.connection = conn;\n    self._portal = `np_${nextNamedPortalId++}`;\n\n    if (!conn.parsedStatements[this.name]) {\n      // QueryParse types `types` as required; pg's runtime accepts an empty\n      // array (server infers parameter types).\n      const parseMessage: QueryParse = { text: self.text, name: this.name, types: [] };\n      conn.parse(parseMessage, true);\n    }\n\n    // pg-cursor's constructor pre-maps values via prepareValue, so the array\n    // here is already wire-ready; the cast bridges pg-cursor's loose `any[]`\n    // to BindConfig's stricter union.\n    const bindMessage: BindConfig = {\n      portal: self._portal,\n      statement: this.name,\n      values: (self.values ?? []) as BindConfig['values'],\n    };\n    conn.bind(bindMessage, true);\n\n    conn.describe({ type: 'P', name: self._portal }, true);\n    conn.flush();\n\n    if (self._conf.types) {\n      self._result._getTypeParser = self._conf.types.getTypeParser;\n    }\n\n    conn.once('noData', self._ifNoData);\n    conn.once('rowDescription', self._rowDescription);\n  }\n}\n","import type {\n  PreparedExecuteRequest,\n  SqlConnection,\n  SqlDriver,\n  SqlDriverState,\n  SqlExecuteRequest,\n  SqlExplainResult,\n  SqlQueryable,\n  SqlQueryResult,\n  SqlTransaction,\n} from '@prisma-next/sql-relational-core/ast';\nimport type {\n  Client,\n  QueryResult as PgQueryResult,\n  PoolClient,\n  Pool as PoolType,\n  QueryConfig,\n  QueryResultRow,\n} from 'pg';\nimport { Pool } from 'pg';\nimport Cursor from 'pg-cursor';\nimport { callbackToPromise } from './callback-to-promise';\nimport { NamedCursor } from './named-cursor';\nimport { isAlreadyConnectedError, isPostgresError, normalizePgError } from './normalize-error';\n\nexport type QueryResult<T extends QueryResultRow = QueryResultRow> = PgQueryResult<T>;\n\nexport type PostgresBinding =\n  | { readonly kind: 'url'; readonly url: string }\n  | { readonly kind: 'pgPool'; readonly pool: PoolType }\n  | { readonly kind: 'pgClient'; readonly client: Client };\n\nexport interface PostgresCursorOptions {\n  readonly batchSize?: number;\n  readonly disabled?: boolean;\n}\n\ninterface PostgresDriverOptions {\n  readonly connect: { client: Client } | { pool: PoolType };\n  readonly cursor?: PostgresCursorOptions | undefined;\n  /**\n   * Use server-side prepared statements for `executePrepared`. Default\n   * `true`. Set `false` when running behind a transaction-mode pooler that\n   * does not support session-scoped prepared statements (e.g. PgBouncer\n   * transaction mode).\n   */\n  readonly preparedStatements?: boolean | undefined;\n}\n\nexport type PostgresDriverCreateOptions = Omit<PostgresDriverOptions, 'connect'>;\n\nconst DEFAULT_BATCH_SIZE = 100;\nconst DEFAULT_PREPARED_STATEMENTS = true;\n\ntype CursorOptions =\n  | { readonly cursorDisabled: true }\n  | { readonly cursorBatchSize: number; readonly cursorDisabled: false };\n\ninterface HandleAllocator {\n  mint(): string;\n}\n\nfunction createHandleAllocator(): HandleAllocator {\n  // Driver-scoped so a single PreparedStatement reused across multiple\n  // Connections/Transactions of the same driver always sees one handle.\n  let next = 1;\n  return {\n    mint: () => `pn_${next++}`,\n  };\n}\n\ntype ConnectionOptions = CursorOptions & {\n  readonly preparedStatementsEnabled: boolean;\n  readonly handleAllocator: HandleAllocator;\n};\n\nfunction buildConnectionOptions(options: PostgresDriverOptions): ConnectionOptions {\n  const cursorOptions: CursorOptions = options.cursor?.disabled\n    ? { cursorDisabled: true }\n    : {\n        cursorBatchSize: options.cursor?.batchSize ?? DEFAULT_BATCH_SIZE,\n        cursorDisabled: false,\n      };\n  return {\n    ...cursorOptions,\n    preparedStatementsEnabled: options.preparedStatements ?? DEFAULT_PREPARED_STATEMENTS,\n    handleAllocator: createHandleAllocator(),\n  };\n}\n\nfunction isStalePreparedStatementError(error: unknown): boolean {\n  if (!(error instanceof Error)) {\n    return false;\n  }\n  const code = (error as { code?: string }).code;\n  // 26000 — invalid_sql_statement_name (server lost the named statement,\n  //         e.g. after DEALLOCATE ALL).\n  // 0A000 — cached plan invalidated by DDL (row shape changed).\n  return code === '26000' || code === '0A000';\n}\n\nclass AsyncMutex {\n  #queue = Promise.resolve();\n\n  async lock(): Promise<() => void> {\n    const previous = this.#queue;\n    let releaseLock: (() => void) | undefined;\n    this.#queue = new Promise<void>((resolve) => {\n      releaseLock = resolve;\n    });\n    await previous;\n    return () => {\n      releaseLock?.();\n      releaseLock = undefined;\n    };\n  }\n}\n\nabstract class PostgresQueryable<C extends PoolClient | Client = PoolClient | Client>\n  implements SqlQueryable\n{\n  abstract acquireClient(): Promise<C>;\n  abstract releaseClient(client: C): Promise<void>;\n\n  protected readonly options: ConnectionOptions;\n\n  constructor(options: ConnectionOptions) {\n    this.options = options;\n  }\n\n  async *execute<Row = Record<string, unknown>>(request: SqlExecuteRequest): AsyncIterable<Row> {\n    try {\n      yield* this.runQuery<Row>(request);\n    } catch (error) {\n      throw normalizePgError(error);\n    }\n  }\n\n  async *executePrepared<Row = Record<string, unknown>>(\n    request: PreparedExecuteRequest,\n  ): AsyncIterable<Row> {\n    if (!this.options.preparedStatementsEnabled) {\n      // Skip server-side prepare entirely; route as a regular ad-hoc execute.\n      yield* this.execute<Row>(request);\n      return;\n    }\n\n    let handle = request.handle.get();\n    if (handle === undefined) {\n      handle = this.options.handleAllocator.mint();\n      request.handle.set(handle);\n    }\n\n    yield* this.withStaleHandleRetry<Row>(request, handle as string, (h) =>\n      this.runQuery<Row>(request, h),\n    );\n  }\n\n  private async *withStaleHandleRetry<Row>(\n    request: PreparedExecuteRequest,\n    handle: string,\n    attempt: (handle: string) => AsyncIterable<Row>,\n  ): AsyncIterable<Row> {\n    let yielded = false;\n    try {\n      for await (const row of attempt(handle)) {\n        yielded = true;\n        yield row;\n      }\n      return;\n    } catch (error) {\n      // If a row was already yielded, the error came from mid-stream and a\n      // retry would re-yield prior rows to the consumer.\n      if (yielded || !isStalePreparedStatementError(error)) {\n        throw normalizePgError(error);\n      }\n      // pg's parsedStatements still records the old name; only a fresh name\n      // forces pg to re-Parse on this Client.\n      const retryHandle = this.options.handleAllocator.mint();\n      request.handle.set(retryHandle);\n      try {\n        yield* attempt(retryHandle);\n      } catch (retryError) {\n        throw normalizePgError(retryError);\n      }\n    }\n  }\n\n  // Errors propagate as raw pg errors so the caller can read SQLSTATE before\n  // normalising (the prepared-statement retry layer needs the original code).\n  private async *runQuery<Row>(request: SqlExecuteRequest, name?: string): AsyncIterable<Row> {\n    const client = await this.acquireClient();\n    try {\n      if (!this.options.cursorDisabled) {\n        try {\n          for await (const row of this.executeWithCursor(\n            client,\n            request.sql,\n            request.params,\n            this.options.cursorBatchSize,\n            name,\n          )) {\n            yield row as Row;\n          }\n          return;\n        } catch (cursorError) {\n          // Non-pg cursor-specific errors fall through to the buffered path;\n          // real pg errors propagate.\n          if (!(cursorError instanceof Error) || isPostgresError(cursorError)) {\n            throw cursorError;\n          }\n        }\n      }\n\n      for await (const row of this.executeBuffered(client, request.sql, request.params, name)) {\n        yield row as Row;\n      }\n    } finally {\n      await this.releaseClient(client);\n    }\n  }\n\n  async explain(request: SqlExecuteRequest): Promise<SqlExplainResult> {\n    // SQL is generated by Prisma Next planners (or validated raw paths), so\n    // EXPLAIN prefixing preserves the same statement semantics.\n    const text = `EXPLAIN (FORMAT JSON) ${request.sql}`;\n    const client = await this.acquireClient();\n    try {\n      const result = await client\n        .query(text, request.params as unknown[] | undefined)\n        .catch(rethrowNormalizedError);\n      return { rows: result.rows as ReadonlyArray<Record<string, unknown>> };\n    } finally {\n      await this.releaseClient(client);\n    }\n  }\n\n  async query<Row = Record<string, unknown>>(\n    sql: string,\n    params?: readonly unknown[],\n  ): Promise<SqlQueryResult<Row>> {\n    const client = await this.acquireClient();\n    try {\n      const result = await client\n        .query(sql, params as unknown[] | undefined)\n        .catch(rethrowNormalizedError);\n      return result as unknown as SqlQueryResult<Row>;\n    } finally {\n      await this.releaseClient(client);\n    }\n  }\n\n  private async *executeWithCursor(\n    client: PoolClient | Client,\n    sql: string,\n    params: readonly unknown[] | undefined,\n    cursorBatchSize: number,\n    name?: string,\n  ): AsyncIterable<Record<string, unknown>> {\n    const values = (params ?? []) as unknown[];\n    const cursor = client.query(\n      name === undefined ? new Cursor(sql, values) : new NamedCursor({ name, text: sql, values }),\n    );\n\n    try {\n      while (true) {\n        const rows = await readCursor(cursor, cursorBatchSize);\n        if (rows.length === 0) {\n          break;\n        }\n\n        for (const row of rows) {\n          yield row;\n        }\n      }\n    } finally {\n      await closeCursor(cursor);\n    }\n  }\n\n  private async *executeBuffered(\n    client: PoolClient | Client,\n    sql: string,\n    params: readonly unknown[] | undefined,\n    name?: string,\n  ): AsyncIterable<Record<string, unknown>> {\n    const config: QueryConfig = { name, text: sql, values: (params ?? []) as unknown[] };\n    const result = await client.query(config);\n    for (const row of result.rows as Record<string, unknown>[]) {\n      yield row;\n    }\n  }\n}\n\nclass PostgresConnectionImpl extends PostgresQueryable implements SqlConnection {\n  #connection: PoolClient | Client;\n  #onRelease: (() => void) | undefined;\n  #onDestroy: ((reason: unknown) => Promise<void> | void) | undefined;\n\n  constructor(\n    connection: PoolClient | Client,\n    options: ConnectionOptions,\n    onRelease?: () => void,\n    onDestroy?: (reason: unknown) => Promise<void> | void,\n  ) {\n    super(options);\n    this.#connection = connection;\n    this.#onRelease = onRelease;\n    this.#onDestroy = onDestroy;\n  }\n\n  override acquireClient(): Promise<PoolClient | Client> {\n    return Promise.resolve(this.#connection);\n  }\n\n  override releaseClient(_client: PoolClient | Client): Promise<void> {\n    return Promise.resolve();\n  }\n\n  async beginTransaction(): Promise<SqlTransaction> {\n    await this.#connection.query('BEGIN').catch(rethrowNormalizedError);\n    return new PostgresTransactionImpl(this.#connection, this.options);\n  }\n\n  async release(): Promise<void> {\n    const conn = this.#connection;\n    if ('release' in conn) {\n      conn.release();\n    }\n    const onRelease = this.#onRelease;\n    this.#onRelease = undefined;\n    this.#onDestroy = undefined;\n    onRelease?.();\n  }\n\n  async destroy(reason?: unknown): Promise<void> {\n    const onDestroy = this.#onDestroy;\n    const onRelease = this.#onRelease;\n    this.#onDestroy = undefined;\n    this.#onRelease = undefined;\n\n    const conn = this.#connection;\n    if ('release' in conn) {\n      // Pass a truthy Error to pg's PoolClient.release so the pool evicts the\n      // client instead of returning it for reuse. A connection that reaches\n      // destroy() is in an indeterminate state (failed rollback/commit, etc.)\n      // and must not be handed back to another caller. The Error value is\n      // surfaced on pg-pool's 'release' event as advisory context; pg-pool\n      // itself only uses its truthiness for the eviction decision.\n      const releaseArg: Error =\n        reason instanceof Error ? reason : new Error('Connection destroyed');\n      conn.release(releaseArg);\n    }\n\n    if (onDestroy) {\n      await onDestroy(reason);\n    } else {\n      onRelease?.();\n    }\n  }\n}\n\nclass PostgresTransactionImpl extends PostgresQueryable implements SqlTransaction {\n  #connection: PoolClient | Client;\n\n  constructor(connection: PoolClient | Client, options: ConnectionOptions) {\n    super(options);\n    this.#connection = connection;\n  }\n\n  override acquireClient(): Promise<PoolClient | Client> {\n    return Promise.resolve(this.#connection);\n  }\n\n  override releaseClient(_client: PoolClient | Client): Promise<void> {\n    return Promise.resolve();\n  }\n\n  async commit(): Promise<void> {\n    await this.#connection.query('COMMIT').catch(rethrowNormalizedError);\n  }\n\n  async rollback(): Promise<void> {\n    await this.#connection.query('ROLLBACK').catch(rethrowNormalizedError);\n  }\n}\n\nclass PostgresPoolDriverImpl\n  extends PostgresQueryable<PoolClient>\n  implements SqlDriver<PostgresBinding>\n{\n  private readonly pool: PoolType;\n  #closed = false;\n\n  constructor(options: PostgresDriverOptions & { connect: { pool: PoolType } }) {\n    super(buildConnectionOptions(options));\n    this.pool = options.connect.pool;\n  }\n\n  get state(): SqlDriverState {\n    return this.#closed ? 'closed' : 'connected';\n  }\n\n  // Bound drivers are created via createBoundDriverFromBinding with pool already\n  // configured; connect is intentionally no-op.\n  async connect(_binding: PostgresBinding): Promise<void> {}\n\n  async acquireConnection(): Promise<SqlConnection> {\n    const client = await this.acquireClient();\n    return new PostgresConnectionImpl(client, this.options);\n  }\n\n  async close(): Promise<void> {\n    if (this.#closed) {\n      return;\n    }\n    this.#closed = true;\n    await this.pool.end();\n  }\n\n  async acquireClient(): Promise<PoolClient> {\n    return this.pool.connect();\n  }\n\n  async releaseClient(client: PoolClient): Promise<void> {\n    client.release();\n  }\n}\n\nclass PostgresDirectDriverImpl\n  extends PostgresQueryable<Client>\n  implements SqlDriver<PostgresBinding>\n{\n  private readonly directClient: Client;\n  readonly #connectionMutex = new AsyncMutex();\n  #closed = false;\n  #connected = false;\n  #connectPromise: Promise<void> | undefined;\n\n  constructor(options: PostgresDriverOptions & { connect: { client: Client } }) {\n    super(buildConnectionOptions(options));\n    this.directClient = options.connect.client;\n  }\n\n  get state(): SqlDriverState {\n    return this.#closed ? 'closed' : 'connected';\n  }\n\n  // Bound drivers are created via createBoundDriverFromBinding with client already\n  // configured; connect is intentionally no-op.\n  async connect(_binding: PostgresBinding): Promise<void> {}\n\n  async acquireConnection(): Promise<SqlConnection> {\n    const releaseLease = await this.#connectionMutex.lock();\n    try {\n      const client = await this.acquireClient();\n      return new PostgresConnectionImpl(\n        client,\n        this.options,\n        releaseLease,\n        // A direct driver has a single underlying socket, so a destroyed\n        // connection means the driver itself is no longer usable. Tear down\n        // the driver while still holding the lease so that any\n        // acquireConnection() queued on #connectionMutex only observes the\n        // driver after .end() has completed and #closed is set — preventing\n        // a concurrent caller from reusing a socket that is already being\n        // closed. The lease is released in a finally so a failing .end()\n        // cannot leave the mutex permanently held.\n        async () => {\n          try {\n            await this.#closeWhileHoldingLease();\n          } finally {\n            releaseLease();\n          }\n        },\n      );\n    } catch (error) {\n      releaseLease();\n      throw error;\n    }\n  }\n\n  async close(): Promise<void> {\n    const releaseLease = await this.#connectionMutex.lock();\n    try {\n      await this.#closeWhileHoldingLease();\n    } finally {\n      releaseLease();\n    }\n  }\n\n  async #closeWhileHoldingLease(): Promise<void> {\n    if (this.#closed) {\n      return;\n    }\n    this.#closed = true;\n    await this.directClient.end();\n    this.#connected = false;\n  }\n\n  async acquireClient(): Promise<Client> {\n    if (this.#connected) {\n      return this.directClient;\n    }\n    if (this.#connectPromise !== undefined) {\n      await this.#connectPromise;\n      return this.directClient;\n    }\n\n    this.#connectPromise = (async () => {\n      try {\n        await this.directClient.connect();\n      } catch (error: unknown) {\n        if (!isAlreadyConnectedError(error)) {\n          throw error;\n        }\n      } finally {\n        this.#connectPromise = undefined;\n      }\n      this.#connected = true;\n    })();\n    await this.#connectPromise;\n\n    return this.directClient;\n  }\n\n  async releaseClient(_client: Client): Promise<void> {}\n}\n\nexport function createBoundDriverFromBinding(\n  binding: PostgresBinding,\n  cursorOpts: PostgresDriverCreateOptions['cursor'],\n  extraOpts?: Pick<PostgresDriverCreateOptions, 'preparedStatements'>,\n): SqlDriver<PostgresBinding> {\n  const preparedStatements = extraOpts?.preparedStatements;\n  switch (binding.kind) {\n    case 'url': {\n      const pool = new Pool({\n        connectionString: binding.url,\n        connectionTimeoutMillis: 20_000,\n        idleTimeoutMillis: 30_000,\n      });\n      return new PostgresPoolDriverImpl({\n        connect: { pool },\n        cursor: cursorOpts,\n        preparedStatements,\n      });\n    }\n    case 'pgPool':\n      return new PostgresPoolDriverImpl({\n        connect: { pool: binding.pool },\n        cursor: cursorOpts,\n        preparedStatements,\n      });\n    case 'pgClient':\n      return new PostgresDirectDriverImpl({\n        connect: { client: binding.client },\n        cursor: cursorOpts,\n        preparedStatements,\n      });\n  }\n}\n\nfunction readCursor<Row>(cursor: Cursor<Row>, size: number): Promise<Row[]> {\n  return callbackToPromise<Row[]>((cb) => {\n    cursor.read(size, (err, rows) => cb(err, rows));\n  });\n}\n\nfunction closeCursor(cursor: Cursor<unknown>): Promise<void> {\n  return callbackToPromise((cb) => cursor.close(cb));\n}\n\nfunction rethrowNormalizedError(error: unknown): never {\n  throw normalizePgError(error);\n}\n","import type {\n  RuntimeDriverDescriptor,\n  RuntimeDriverInstance,\n} from '@prisma-next/framework-components/execution';\nimport type {\n  PreparedExecuteRequest,\n  SqlConnection,\n  SqlDriver,\n  SqlExecuteRequest,\n  SqlExplainResult,\n  SqlQueryResult,\n} from '@prisma-next/sql-relational-core/ast';\nimport { postgresDriverDescriptorMeta } from '../core/descriptor-meta';\nimport {\n  createBoundDriverFromBinding,\n  type PostgresBinding,\n  type PostgresDriverCreateOptions,\n} from '../postgres-driver';\n\nexport type PostgresRuntimeDriver = RuntimeDriverInstance<'sql', 'postgres'> &\n  SqlDriver<PostgresBinding>;\n\nconst USE_BEFORE_CONNECT_MESSAGE =\n  'Postgres driver not connected. Call connect(binding) before acquireConnection or execute.';\nconst ALREADY_CONNECTED_MESSAGE =\n  'Postgres driver already connected. Call close() before reconnecting with a new binding.';\n\ninterface DriverRuntimeError extends Error {\n  readonly code: 'DRIVER.NOT_CONNECTED' | 'DRIVER.ALREADY_CONNECTED';\n  readonly category: 'RUNTIME';\n  readonly severity: 'error';\n  readonly details?: Record<string, unknown>;\n}\n\nfunction driverError(\n  code: DriverRuntimeError['code'],\n  message: string,\n  details?: Record<string, unknown>,\n): DriverRuntimeError {\n  const error = new Error(message) as DriverRuntimeError;\n  Object.defineProperty(error, 'name', {\n    value: 'RuntimeError',\n    configurable: true,\n  });\n  return Object.assign(error, {\n    code,\n    category: 'RUNTIME' as const,\n    severity: 'error' as const,\n    message,\n    details,\n  });\n}\n\nfunction unboundExecute<Row>(): AsyncIterable<Row> {\n  return {\n    [Symbol.asyncIterator]() {\n      return {\n        async next() {\n          throw driverError('DRIVER.NOT_CONNECTED', USE_BEFORE_CONNECT_MESSAGE);\n        },\n      };\n    },\n  };\n}\n\nclass PostgresUnboundDriverImpl implements PostgresRuntimeDriver {\n  readonly familyId = 'sql' as const;\n  readonly targetId = 'postgres' as const;\n\n  #delegate: SqlDriver<PostgresBinding> | null = null;\n  #closed = false;\n  #cursorOpts: PostgresDriverCreateOptions['cursor'];\n  #preparedStatements: PostgresDriverCreateOptions['preparedStatements'];\n\n  constructor(options?: PostgresDriverCreateOptions) {\n    this.#cursorOpts = options?.cursor;\n    this.#preparedStatements = options?.preparedStatements;\n  }\n\n  get state(): 'unbound' | 'connected' | 'closed' {\n    if (this.#delegate !== null) {\n      return 'connected';\n    }\n    if (this.#closed) {\n      return 'closed';\n    }\n    return 'unbound';\n  }\n\n  #requireDelegate(): SqlDriver<PostgresBinding> {\n    const delegate = this.#delegate;\n    if (delegate === null) {\n      throw driverError('DRIVER.NOT_CONNECTED', USE_BEFORE_CONNECT_MESSAGE);\n    }\n    return delegate;\n  }\n\n  async connect(binding: PostgresBinding): Promise<void> {\n    if (this.#delegate !== null) {\n      throw driverError('DRIVER.ALREADY_CONNECTED', ALREADY_CONNECTED_MESSAGE, {\n        bindingKind: binding.kind,\n      });\n    }\n    this.#delegate = createBoundDriverFromBinding(binding, this.#cursorOpts, {\n      preparedStatements: this.#preparedStatements,\n    });\n    this.#closed = false;\n  }\n\n  async acquireConnection(): Promise<SqlConnection> {\n    const delegate = this.#requireDelegate();\n    const connection = await delegate.acquireConnection();\n    return this.#wrapConnection(connection, delegate);\n  }\n\n  /**\n   * Wraps an acquired connection so that teardown paths which close the\n   * underlying delegate (notably `destroy()` on a pgClient binding, where\n   * the single socket means a destroyed connection invalidates the driver)\n   * also reset our own `#delegate` reference. Without this, a failed\n   * transaction rollback would leave the outer unbound wrapper reporting\n   * `connected` while routing subsequent work to an already-ended delegate.\n   */\n  #wrapConnection(connection: SqlConnection, delegate: SqlDriver<PostgresBinding>): SqlConnection {\n    const syncDelegateState = (): void => {\n      if (this.#delegate === delegate && delegate.state === 'closed') {\n        this.#delegate = null;\n        this.#closed = true;\n      }\n    };\n    const wrapped: SqlConnection = {\n      beginTransaction: connection.beginTransaction.bind(connection),\n      execute: connection.execute.bind(connection),\n      executePrepared: connection.executePrepared.bind(connection),\n      query: connection.query.bind(connection),\n      release: async () => {\n        try {\n          await connection.release();\n        } finally {\n          syncDelegateState();\n        }\n      },\n      destroy: async (reason?: unknown) => {\n        try {\n          await connection.destroy(reason);\n        } finally {\n          syncDelegateState();\n        }\n      },\n    };\n    if (connection.explain) {\n      wrapped.explain = connection.explain.bind(connection);\n    }\n    return wrapped;\n  }\n\n  async close(): Promise<void> {\n    const delegate = this.#delegate;\n    if (delegate !== null) {\n      this.#delegate = null;\n      await delegate.close();\n    }\n    this.#closed = true;\n  }\n\n  execute<Row = Record<string, unknown>>(request: SqlExecuteRequest): AsyncIterable<Row> {\n    const delegate = this.#delegate;\n    if (delegate === null) {\n      return unboundExecute<Row>();\n    }\n    return delegate.execute<Row>(request);\n  }\n\n  executePrepared<Row = Record<string, unknown>>(\n    request: PreparedExecuteRequest,\n  ): AsyncIterable<Row> {\n    const delegate = this.#delegate;\n    if (delegate === null) {\n      return unboundExecute<Row>();\n    }\n    return delegate.executePrepared<Row>(request);\n  }\n\n  async explain(request: SqlExecuteRequest): Promise<SqlExplainResult> {\n    const delegate = this.#requireDelegate();\n    const explain = delegate.explain;\n    if (explain === undefined) {\n      throw driverError('DRIVER.NOT_CONNECTED', USE_BEFORE_CONNECT_MESSAGE);\n    }\n    return explain.call(delegate, request);\n  }\n\n  async query<Row = Record<string, unknown>>(\n    sql: string,\n    params?: readonly unknown[],\n  ): Promise<SqlQueryResult<Row>> {\n    const delegate = this.#requireDelegate();\n    return delegate.query<Row>(sql, params);\n  }\n}\n\nconst postgresRuntimeDriverDescriptor: RuntimeDriverDescriptor<\n  'sql',\n  'postgres',\n  PostgresDriverCreateOptions,\n  PostgresRuntimeDriver\n> = {\n  ...postgresDriverDescriptorMeta,\n  create(options?: PostgresDriverCreateOptions): PostgresRuntimeDriver {\n    return new PostgresUnboundDriverImpl(options);\n  },\n};\n\nexport default postgresRuntimeDriverDescriptor;\nexport type {\n  PostgresBinding,\n  PostgresDriverCreateOptions,\n  QueryResult,\n} from '../postgres-driver';\n"],"mappings":"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"}