{"_id":"@deltic/async-pg-kysely","_rev":"4-995dd5a397f734b90d044566e6efdcb6","name":"@deltic/async-pg-kysely","dist-tags":{"latest":"0.1.3"},"versions":{"0.1.0":{"name":"@deltic/async-pg-kysely","version":"0.1.0","keywords":["kysely","pg","pool","async","postgres","query-builder"],"author":{"url":"https://frankdejonge.nl","name":"Frank de Jonge"},"license":"ISC","_id":"@deltic/async-pg-kysely@0.1.0","maintainers":[{"name":"frankdejonge","email":"info@frankdejonge.nl"}],"homepage":"https://github.com/deltic-oss/deltic#readme","bugs":{"url":"https://github.com/deltic-oss/deltic/issues"},"dist":{"shasum":"2d24ff9f50221fad776c27d67697c20452af5ad3","tarball":"https://registry.npmjs.org/@deltic/async-pg-kysely/-/async-pg-kysely-0.1.0.tgz","fileCount":24,"integrity":"sha512-0n09YsOjxtfLCr68qWM/tG3/FTDOuHu3H96r4iLUeEEIGBMzARAmIDszp2BAtqskKlaJO+CDPpB2/MjGeaIOLA==","signatures":[{"sig":"MEUCIGAK0UIDCoBg4yYJhivyVuKF4YAtCr1ct6BpNQqxpr6vAiEAxLzRJCYOuQhJzgsd2Ko7wG52wgqQT3mKEWK7oML9ics=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":62342},"type":"module","_from":"file:deltic-async-pg-kysely-0.1.0.tgz","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs","module-sync":"./dist/index.js"}},"scripts":{},"_npmUser":{"name":"frankdejonge","email":"info@frankdejonge.nl"},"_resolved":"/private/var/folders/cf/f1s7n7kd3938zynwcqk8_2z00000gn/T/f7ad4387f6728e97f181ecaadad6ed85/deltic-async-pg-kysely-0.1.0.tgz","_integrity":"sha512-0n09YsOjxtfLCr68qWM/tG3/FTDOuHu3H96r4iLUeEEIGBMzARAmIDszp2BAtqskKlaJO+CDPpB2/MjGeaIOLA==","repository":{"url":"git+https://github.com/deltic-oss/deltic.git","type":"git","directory":"packages/async-pg-kysely"},"_npmVersion":"11.6.0","description":"Kysely query builder integration with @deltic/async-pg-pool","directories":{},"_nodeVersion":"24.8.0","dependencies":{"kysely":"^0.28.0","@deltic/async-pg-pool":"^0.2.0","@deltic/error-standard":"^0.1.1"},"_hasShrinkwrap":false,"devDependencies":{"pg":"^8.16.3","@types/pg":"^8.15.6","pg-cursor":"^2.18.0","@types/pg-cursor":"^2.7.2"},"peerDependencies":{"pg":"^8.16.3","pg-cursor":"^2.18.0","@deltic/async-pg-pool":"^0.2.0"},"peerDependenciesMeta":{"pg-cursor":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/async-pg-kysely_0.1.0_1774450021215_0.5698089524804852","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@deltic/async-pg-kysely","version":"0.1.1","keywords":["kysely","pg","pool","async","postgres","query-builder"],"author":{"url":"https://frankdejonge.nl","name":"Frank de Jonge"},"license":"ISC","_id":"@deltic/async-pg-kysely@0.1.1","maintainers":[{"name":"frankdejonge","email":"info@frankdejonge.nl"}],"homepage":"https://github.com/deltic-oss/deltic#readme","bugs":{"url":"https://github.com/deltic-oss/deltic/issues"},"dist":{"shasum":"e38641a63d86703b7a7ea17ae840846cc7021bd9","tarball":"https://registry.npmjs.org/@deltic/async-pg-kysely/-/async-pg-kysely-0.1.1.tgz","fileCount":24,"integrity":"sha512-yfrMNSF3kGonYDY3+fUx4Dx8sk94/whBYkGG5OMZ+FYF9BhB1Ro7OoCiOKlbQsYT2dPUuzrqKPU6DKybtBLU2Q==","signatures":[{"sig":"MEUCIAIs5XAkXUUXyBSSe57Q/i5PrXxmsTfLe58jqh9dZV6NAiEA/znhiuOtxk4ybnN7yMKTi7OW19T6vxBxAeftxrqqu7w=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":62523},"type":"module","_from":"file:deltic-async-pg-kysely-0.1.1.tgz","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs","module-sync":"./dist/index.mjs"}},"scripts":{},"_npmUser":{"name":"frankdejonge","email":"info@frankdejonge.nl"},"_resolved":"/private/var/folders/cf/f1s7n7kd3938zynwcqk8_2z00000gn/T/0c47e3d9ad229e9cdb7e9a8bbbb3c516/deltic-async-pg-kysely-0.1.1.tgz","_integrity":"sha512-yfrMNSF3kGonYDY3+fUx4Dx8sk94/whBYkGG5OMZ+FYF9BhB1Ro7OoCiOKlbQsYT2dPUuzrqKPU6DKybtBLU2Q==","repository":{"url":"git+https://github.com/deltic-oss/deltic.git","type":"git","directory":"packages/async-pg-kysely"},"_npmVersion":"11.6.0","description":"Kysely query builder integration with @deltic/async-pg-pool","directories":{},"_nodeVersion":"24.8.0","dependencies":{"kysely":"^0.28.0","@deltic/async-pg-pool":"^0.2.1","@deltic/error-standard":"^0.1.2"},"_hasShrinkwrap":false,"devDependencies":{"pg":"^8.16.3","@types/pg":"^8.15.6","pg-cursor":"^2.18.0","@types/pg-cursor":"^2.7.2"},"peerDependencies":{"pg":"^8.16.3","pg-cursor":"^2.18.0","@deltic/async-pg-pool":"^0.2.1"},"peerDependenciesMeta":{"pg-cursor":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/async-pg-kysely_0.1.1_1774454221213_0.5114064632447795","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@deltic/async-pg-kysely","version":"0.1.2","keywords":["kysely","pg","pool","async","postgres","query-builder"],"author":{"url":"https://frankdejonge.nl","name":"Frank de Jonge"},"license":"ISC","_id":"@deltic/async-pg-kysely@0.1.2","maintainers":[{"name":"frankdejonge","email":"info@frankdejonge.nl"}],"homepage":"https://github.com/deltic-oss/deltic#readme","bugs":{"url":"https://github.com/deltic-oss/deltic/issues"},"dist":{"shasum":"1a5af71c984ab0e8b902f9bdae88236c962b16ba","tarball":"https://registry.npmjs.org/@deltic/async-pg-kysely/-/async-pg-kysely-0.1.2.tgz","fileCount":24,"integrity":"sha512-kfKlpEM/saMFBs2IERGppklwnBHaOtdrVH4Zac5eJGJEFHBfMor/KNdxhWEyWTcbMu9cRRwLJflJwr0ksmkr1g==","signatures":[{"sig":"MEUCIQCcpYddYAtezQ3jmb+njB0mbWRrhqpoZIVDoVIxmAIbWQIgYmnBcX4RI0wW5r12HtzEorGwSyB7Wwce287ZpHeZhyc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":62703},"type":"module","_from":"file:deltic-async-pg-kysely-0.1.2.tgz","exports":{".":{"types":"./dist/index.d.mts","import":"./dist/index.mjs","require":"./dist/index.cjs","module-sync":"./dist/index.mjs"}},"scripts":{},"_npmUser":{"name":"frankdejonge","email":"info@frankdejonge.nl"},"_resolved":"/private/var/folders/cf/f1s7n7kd3938zynwcqk8_2z00000gn/T/4541a5c0e76c70c13b6600e472922d94/deltic-async-pg-kysely-0.1.2.tgz","_integrity":"sha512-kfKlpEM/saMFBs2IERGppklwnBHaOtdrVH4Zac5eJGJEFHBfMor/KNdxhWEyWTcbMu9cRRwLJflJwr0ksmkr1g==","repository":{"url":"git+https://github.com/deltic-oss/deltic.git","type":"git","directory":"packages/async-pg-kysely"},"_npmVersion":"11.6.0","description":"Kysely query builder integration with @deltic/async-pg-pool","directories":{},"_nodeVersion":"24.8.0","dependencies":{"kysely":"^0.28.0","@deltic/async-pg-pool":"^0.2.2","@deltic/error-standard":"^0.1.3"},"_hasShrinkwrap":false,"devDependencies":{"pg":"^8.16.3","@types/pg":"^8.15.6","pg-cursor":"^2.18.0","@types/pg-cursor":"^2.7.2"},"peerDependencies":{"pg":"^8.16.3","pg-cursor":"^2.18.0","@deltic/async-pg-pool":"^0.2.2"},"peerDependenciesMeta":{"pg-cursor":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/async-pg-kysely_0.1.2_1774454588062_0.09291607611066977","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@deltic/async-pg-kysely","type":"module","version":"0.1.3","description":"Kysely query builder integration with @deltic/async-pg-pool","exports":{".":{"import":"./dist/index.mjs","require":"./dist/index.cjs","module-sync":"./dist/index.mjs","types":"./dist/index.d.mts"}},"keywords":["kysely","pg","pool","async","postgres","query-builder"],"author":{"name":"Frank de Jonge","url":"https://frankdejonge.nl"},"license":"ISC","dependencies":{"kysely":"^0.28.15","@deltic/async-pg-pool":"^0.2.4","@deltic/error-standard":"^0.1.3"},"peerDependencies":{"pg":"^8.16.3","pg-cursor":"^2.18.0","@deltic/async-pg-pool":"^0.2.4"},"peerDependenciesMeta":{"pg-cursor":{"optional":true}},"devDependencies":{"@types/pg":"^8.20.0","@types/pg-cursor":"^2.7.2","pg":"^8.20.0","pg-cursor":"^2.19.0"},"repository":{"type":"git","url":"git+https://github.com/deltic-oss/deltic.git","directory":"packages/async-pg-kysely"},"scripts":{},"_id":"@deltic/async-pg-kysely@0.1.3","bugs":{"url":"https://github.com/deltic-oss/deltic/issues"},"homepage":"https://github.com/deltic-oss/deltic#readme","_integrity":"sha512-kzTYAm+jT/07YD3H1/3225TFxDybBygMypC2X29fZF6taxdMqLzmGjabvAU5rtBksElhyTs9PoDHqgQJpSZg3w==","_resolved":"/private/var/folders/cf/f1s7n7kd3938zynwcqk8_2z00000gn/T/925d1e0427843edc55720c151e95862a/deltic-async-pg-kysely-0.1.3.tgz","_from":"file:deltic-async-pg-kysely-0.1.3.tgz","_nodeVersion":"24.8.0","_npmVersion":"11.6.0","dist":{"integrity":"sha512-kzTYAm+jT/07YD3H1/3225TFxDybBygMypC2X29fZF6taxdMqLzmGjabvAU5rtBksElhyTs9PoDHqgQJpSZg3w==","shasum":"b518cad85e1cd58b09db1511fd2e15d6943cb09d","tarball":"https://registry.npmjs.org/@deltic/async-pg-kysely/-/async-pg-kysely-0.1.3.tgz","fileCount":24,"unpackedSize":64031,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIEvFljbMSX3I/dJTYvKUINeoCnJpVqor7wcA2EYcMdRxAiEAvg9DSqdqYfFVRJviiZzk/ytiBZd1GKQ4iYyNN0l85j4="}]},"_npmUser":{"name":"frankdejonge","email":"info@frankdejonge.nl"},"directories":{},"maintainers":[{"name":"frankdejonge","email":"info@frankdejonge.nl"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/async-pg-kysely_0.1.3_1777881503266_0.8052294057470644"},"_hasShrinkwrap":false}},"time":{"created":"2026-03-25T14:47:01.083Z","modified":"2026-05-04T07:58:23.552Z","0.1.0":"2026-03-25T14:47:01.357Z","0.1.1":"2026-03-25T15:57:01.369Z","0.1.2":"2026-03-25T16:03:08.197Z","0.1.3":"2026-05-04T07:58:23.428Z"},"bugs":{"url":"https://github.com/deltic-oss/deltic/issues"},"author":{"name":"Frank de Jonge","url":"https://frankdejonge.nl"},"license":"ISC","homepage":"https://github.com/deltic-oss/deltic#readme","keywords":["kysely","pg","pool","async","postgres","query-builder"],"repository":{"type":"git","url":"git+https://github.com/deltic-oss/deltic.git","directory":"packages/async-pg-kysely"},"description":"Kysely query builder integration with @deltic/async-pg-pool","maintainers":[{"name":"frankdejonge","email":"info@frankdejonge.nl"}],"readme":"# @deltic/async-pg-kysely\n\nKysely query builder integration with `@deltic/async-pg-pool`, decoupling transaction management from Kysely so it can be shared across query builders and infrastructure.\n\n## Why?\n\nKysely has solid transaction support, including `AsyncLocalStorage`-based implicit transactions via plugins. However, Kysely's transactions are Kysely-scoped — everything that participates must go through Kysely's `db.transaction()` callback.\n\nIn systems where multiple components need to share a transaction — an event store writing through one query builder, a projection updating through another, an outbox persisting through a third — tying the transaction lifecycle to any single tool becomes a bottleneck. You'd need to pass Kysely's transaction object into code that may not use Kysely at all.\n\n`@deltic/async-pg-kysely` solves this by externalizing connection and transaction management to `AsyncPgPool`. Kysely becomes a query building layer only, while the pool owns the connection lifecycle. This means:\n\n- **Decoupled transactions** — The transaction is managed at the pool level, not by Kysely. Any code using the same `AsyncPgPool` participates in the same transaction, regardless of which query builder it uses.\n- **Cross-ORM consistency** — Kysely, Knex, and Drizzle queries can share a single transaction through the same pool, without any of them knowing about each other.\n- **Connection lifecycle hooks** — `AsyncPgPool` provides hooks for connection setup/teardown (e.g., setting `app.tenant_id` for row-level security), applied uniformly to all query builders.\n\nYou keep Kysely's full type-safe API — the only thing that changes is who manages connections and transactions:\n\n```typescript\nconst provider = new AsyncKyselyConnectionProvider<DB>(asyncPool);\n\n// Queries — connections managed by AsyncPgPool\nconst users = await provider.connection()\n    .selectFrom('users')\n    .selectAll()\n    .execute();\n\n// Transactions — managed by the provider, not by Kysely\nawait provider.runInTransaction(async () => {\n    await provider.connection()\n        .insertInto('users')\n        .values({name: 'Frank'})\n        .execute();\n    await provider.connection()\n        .insertInto('audit')\n        .values({action: 'user_created'})\n        .execute();\n});\n```\n\n## Installation\n\n```bash\nnpm install @deltic/async-pg-kysely @deltic/async-pg-pool kysely pg\n```\n\nFor streaming query support, also install `pg-cursor`:\n\n```bash\nnpm install pg-cursor\n```\n\n## Quick Start\n\n```typescript\nimport {Pool} from 'pg';\nimport {AsyncPgPool} from '@deltic/async-pg-pool';\nimport {AsyncKyselyConnectionProvider} from '@deltic/async-pg-kysely';\n\ninterface DB {\n    users: {\n        id: Generated<number>;\n        name: string;\n        email: string | null;\n        active: Generated<boolean>;\n    };\n}\n\n// Create the connection stack\nconst pgPool = new Pool({connectionString: 'postgresql://...'});\nconst asyncPool = new AsyncPgPool(pgPool);\nconst provider = new AsyncKyselyConnectionProvider<DB>(asyncPool);\n\n// Query with lazy connection resolution\nconst users = await provider.connection()\n    .selectFrom('users')\n    .selectAll()\n    .where('active', '=', true)\n    .execute();\n```\n\n## Usage\n\n### Basic Queries\n\n```typescript\n// SELECT\nconst users = await provider.connection()\n    .selectFrom('users')\n    .selectAll()\n    .where('active', '=', true)\n    .execute();\n\n// SELECT specific columns\nconst names = await provider.connection()\n    .selectFrom('users')\n    .select(['name', 'email'])\n    .execute();\n\n// INSERT with returning\nconst newUser = await provider.connection()\n    .insertInto('users')\n    .values({name: 'Alice', email: 'alice@example.com'})\n    .returningAll()\n    .executeTakeFirstOrThrow();\n\n// UPDATE\nawait provider.connection()\n    .updateTable('users')\n    .set({lastLogin: new Date()})\n    .where('id', '=', userId)\n    .execute();\n\n// DELETE\nawait provider.connection()\n    .deleteFrom('users')\n    .where('id', '=', userId)\n    .execute();\n```\n\n### Raw SQL\n\n```typescript\nimport {sql} from 'kysely';\n\nconst result = await sql<{name: string; age: number}>`\n    SELECT name, age FROM users WHERE age > ${21}\n`.execute(provider.connection());\n```\n\n### Streaming Queries\n\nFor large result sets, you can stream rows instead of loading everything into memory. This requires `pg-cursor`:\n\n```typescript\nimport Cursor from 'pg-cursor';\n\nconst provider = new AsyncKyselyConnectionProvider<DB>(asyncPool, {\n    cursor: Cursor,\n});\n\nfor await (const row of provider.connection()\n    .selectFrom('events')\n    .selectAll()\n    .where('created_at', '>', cutoffDate)\n    .stream(100)) {\n    processEvent(row);\n}\n```\n\nThe `chunkSize` argument (100 above) controls how many rows are fetched from the database at a time via PostgreSQL cursors. Kysely's `.stream()` yields individual rows regardless of chunk size.\n\nIf `cursor` is not configured and `.stream()` is called, a clear error is thrown.\n\n### Transactions\n\nTransactions acquire a dedicated connection for their duration:\n\n```typescript\nconst trx = await provider.begin();\n\ntry {\n    await trx\n        .updateTable('accounts')\n        .set((eb) => ({balance: eb('balance', '-', amount)}))\n        .where('id', '=', fromAccountId)\n        .execute();\n\n    await trx\n        .updateTable('accounts')\n        .set((eb) => ({balance: eb('balance', '+', amount)}))\n        .where('id', '=', toAccountId)\n        .execute();\n\n    await trx\n        .insertInto('transfers')\n        .values({fromAccount: fromAccountId, toAccount: toAccountId, amount})\n        .execute();\n\n    await provider.commit(trx);\n} catch (error) {\n    await provider.rollback(trx);\n    throw error;\n}\n```\n\n#### Using `runInTransaction`\n\nFor simpler transaction handling with automatic commit/rollback:\n\n```typescript\nconst user = await provider.runInTransaction(async () => {\n    const user = await provider.connection()\n        .insertInto('users')\n        .values({name: 'Bob'})\n        .returningAll()\n        .executeTakeFirstOrThrow();\n\n    await provider.connection()\n        .insertInto('audit_log')\n        .values({action: 'user_created', userId: user.id})\n        .execute();\n\n    return user;\n});\n```\n\nIf the function throws, the transaction is automatically rolled back. Nested calls to `runInTransaction` reuse the existing transaction.\n\n#### Custom Isolation Levels\n\n```typescript\nconst trx = await provider.begin('BEGIN ISOLATION LEVEL SERIALIZABLE');\n// ... your queries\nawait provider.commit(trx);\n```\n\n### Using `connection()` Inside Transactions\n\nThe `connection()` method is transaction-aware. When a transaction is active, queries executed through `connection()` automatically use the transaction connection via `AsyncPgPool`:\n\n```typescript\nawait provider.runInTransaction(async () => {\n    // Both queries run on the same transaction connection\n    await provider.connection()\n        .insertInto('users')\n        .values({name: 'Frank'})\n        .execute();\n    await provider.connection()\n        .insertInto('audit')\n        .values({action: 'user_created'})\n        .execute();\n});\n```\n\nThis means modules that use `provider.connection()` internally don't need to know whether they're running inside a transaction or not.\n\n### Cross-Query-Builder Transactions\n\nThis is the primary reason this package exists. Because `@deltic/async-pg-kysely`, `@deltic/async-pg-drizzle`, and `@deltic/async-pg-knex` all delegate connection management to the same `AsyncPgPool`, they participate in the same transaction without knowing about each other:\n\n```typescript\nconst kyselyDb = new AsyncKyselyConnectionProvider<DB>(asyncPool);\nconst knexDb = new AsyncKnexConnectionProvider(asyncPool);\n\nawait asyncPool.runInTransaction(async () => {\n    // Kysely query — uses the shared transaction connection\n    await kyselyDb.connection()\n        .insertInto('users')\n        .values({name: 'Frank'})\n        .execute();\n\n    // Knex query — same transaction, same connection\n    await knexDb.connection()('audit_log')\n        .insert({action: 'user_created'});\n});\n```\n\n## API Reference\n\n### `AsyncKyselyConnectionProvider<DB>`\n\n#### Constructor\n\n```typescript\nnew AsyncKyselyConnectionProvider<DB>(pool: AsyncPgPool, options?: {\n    plugins?: KyselyPlugin[];\n    log?: LogConfig;\n    cursor?: PostgresCursorConstructor;\n})\n```\n\n- `plugins` — Kysely plugins to install (e.g., `CamelCasePlugin`)\n- `log` — Kysely's query logging configuration\n- `cursor` — A `pg-cursor` constructor to enable streaming queries via `.stream()`\n\n#### Methods\n\n| Method | Description |\n|--------|-------------|\n| `connection()` | Returns a `Kysely<DB>` instance for building queries |\n| `begin(query?)` | Begins a transaction, returns a `Kysely<DB>` bound to it |\n| `commit(trx)` | Commits a transaction |\n| `rollback(trx, error?)` | Rolls back a transaction |\n| `withTransaction()` | Returns the current transaction instance (throws if none) |\n| `inTransaction()` | Returns `true` if currently in a transaction |\n| `runInTransaction(fn)` | Runs a function in a transaction with auto commit/rollback |\n| `destroy()` | Destroys the Kysely instance (call on shutdown) |\n\n### Kysely's Transaction Methods Are Blocked\n\nAll `Kysely<DB>` instances created by this provider have Kysely's built-in `db.transaction()` and `db.startTransaction()` overridden to throw `KyselyTransactionsNotSupported`. The driver's `beginTransaction`, `commitTransaction`, and `rollbackTransaction` methods also throw. This prevents Kysely from issuing `BEGIN`/`COMMIT`/`ROLLBACK` on the pool-managed connection, which would corrupt `AsyncPgPool`'s transaction state.\n\nUse the provider's `begin()`/`commit()`/`rollback()` or `runInTransaction()` instead.\n\n## How It Works\n\nUnder the hood, the provider creates a custom Kysely `Dialect` with a custom `Driver` implementation backed by `AsyncPgPool`:\n\n1. **`connection()`** returns a Kysely instance whose driver resolves connections via `pool.primary()`\n2. **When a query executes**, the driver calls `pool.primary()` to get the current connection (respecting transaction context)\n3. **The query runs** on the resolved connection via `connection.query()`\n4. **The connection is released** back to the pool (unless in a transaction)\n\n**Transactions** work differently: `begin()` creates a new Kysely instance with an inline dialect that always returns the same dedicated connection. All queries on that instance execute on the transaction connection until commit or rollback.\n\n### Architecture\n\nThe package provides three main building blocks:\n\n- **`AsyncPgDialect`** — A Kysely `Dialect` that reuses Kysely's `PostgresQueryCompiler`, `PostgresAdapter`, and `PostgresIntrospector` while providing a custom driver\n- **`AsyncPgDriver`** — A Kysely `Driver` that routes `acquireConnection`/`releaseConnection` through `AsyncPgPool`\n- **`AsyncPgConnection`** — A Kysely `DatabaseConnection` that wraps a pg client and translates between pg's query result format and Kysely's `QueryResult`\n\n### Integration with AsyncPgPool Features\n\nBecause connections flow through `AsyncPgPool`, you get all its features:\n\n```typescript\nconst asyncPool = new AsyncPgPool(pgPool, {\n    // Run on every connection claim\n    onClaim: client => client.query(`SET app.tenant_id = '${tenantId}'`),\n    // Run on every connection release\n    onRelease: 'RESET app.tenant_id',\n    // Keep connections warm\n    keepConnections: 2,\n    maxIdleMs: 5000,\n});\n\nconst provider = new AsyncKyselyConnectionProvider<DB>(asyncPool);\n\n// Queries automatically get tenant_id set\nconst users = await provider.connection()\n    .selectFrom('users')\n    .selectAll()\n    .execute();\n```\n\n## License\n\nISC\n","readmeFilename":"README.md"}