@shivaedev/effect-prisma 0.9.1 → 0.9.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.9.2 - 2026-10-17
4
+
5
+ ### Fixed
6
+
7
+ - A PostgreSQL connection lost while sending `BEGIN` fails the transaction with its original typed connection failure without crashing the process.
8
+
3
9
  ## 0.9.1 - 2026-10-17
4
10
 
5
11
  ### Fixed
package/README.md CHANGED
@@ -251,9 +251,7 @@ pnpm add --save-dev @effect/vitest@4.0.4 vitest@5.0.3
251
251
 
252
252
  The Vitest dependencies are needed only for `testing/vitest.ts`. Use Node.js 24 or newer and compatible versions of the package's Effect and Prisma Next dependencies.
253
253
 
254
- The application owns its Prisma Next CLI/configuration, initialized schema and
255
- migration workflow. This package does not apply schema changes. Emit that
256
- application's contract, then normalize its PostgreSQL declaration:
254
+ The application owns its Prisma Next CLI/configuration, initialized schema and migration workflow. This package does not apply schema changes. Emit that application's contract, then normalize its PostgreSQL declaration:
257
255
 
258
256
  ```sh
259
257
  prisma-next contract emit
@@ -1 +1 @@
1
- {"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../src/database.ts"],"names":[],"mappings":"AAAA,OAAiB,EAAuB,KAAK,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACxG,OAAO,EAAE,KAAK,KAAK,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,KAAK,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,qBAAqB,EAAiB,MAAM,mBAAmB,CAAC;AAI7H,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,MAAM,WAAW,oBAAqB,SAAQ,mBAAmB;IAChE,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;CACjD;AAED,KAAK,sBAAsB,CAAC,SAAS,SAAS,cAAc,IACzD;IACA,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC;IAC7B,QAAQ,CAAC,YAAY,CAAC,EAAE,KAAK,CAAC;CAC7B,GACD;IACA,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC;CACzB,CAAC;AAEL,MAAM,WAAW,kBAAkB,CAAC,SAAS,SAAS,cAAc,EAAE,WAAW,SAAS,MAAM,CAC/F,SAAQ,qBAAqB,CAAC,SAAS,EAAE,WAAW,CAAC;IACrD,QAAQ,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,oBAAoB,KAAK,KAAK,CAAC,KAAK,CAAC,kBAAkB,CAAC,SAAS,EAAE,WAAW,CAAC,EAAE,WAAW,CAAC,CAAC;CACxH;AAkBD,eAAO,MAAM,YAAY,GACvB,KAAK,CAAC,SAAS,SAAS,cAAc,QACtC,KAAK,CAAC,WAAW,SAAS,MAAM,cACpB,yBAAyB,CAAC,WAAW,CAAC,WACzC,sBAAsB,CAAC,SAAS,CAAC,KACxC,kBAAkB,CAAC,SAAS,EAAE,WAAW,CAgC3C,CAAC"}
1
+ {"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../src/database.ts"],"names":[],"mappings":"AAAA,OAAiB,EAAuB,KAAK,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACxG,OAAO,EAAE,KAAK,KAAK,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,KAAK,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,qBAAqB,EAAiB,MAAM,mBAAmB,CAAC;AAI7H,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAG5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,MAAM,WAAW,oBAAqB,SAAQ,mBAAmB;IAChE,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;CACjD;AAED,KAAK,sBAAsB,CAAC,SAAS,SAAS,cAAc,IACzD;IACA,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC;IAC7B,QAAQ,CAAC,YAAY,CAAC,EAAE,KAAK,CAAC;CAC7B,GACD;IACA,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC;CACzB,CAAC;AAEL,MAAM,WAAW,kBAAkB,CAAC,SAAS,SAAS,cAAc,EAAE,WAAW,SAAS,MAAM,CAC/F,SAAQ,qBAAqB,CAAC,SAAS,EAAE,WAAW,CAAC;IACrD,QAAQ,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,oBAAoB,KAAK,KAAK,CAAC,KAAK,CAAC,kBAAkB,CAAC,SAAS,EAAE,WAAW,CAAC,EAAE,WAAW,CAAC,CAAC;CACxH;AAkBD,eAAO,MAAM,YAAY,GACvB,KAAK,CAAC,SAAS,SAAS,cAAc,QACtC,KAAK,CAAC,WAAW,SAAS,MAAM,cACpB,yBAAyB,CAAC,WAAW,CAAC,WACzC,sBAAsB,CAAC,SAAS,CAAC,KACxC,kBAAkB,CAAC,SAAS,EAAE,WAAW,CA0C3C,CAAC"}
package/dist/database.js CHANGED
@@ -3,6 +3,7 @@ import { Redacted } from "effect";
3
3
  import { acquireConnectedClient } from "#internal/client-lifecycle.ts";
4
4
  import { namespaceModels } from "#internal/database-facade.ts";
5
5
  import { makeSqlDatabase } from "#internal/database-factory.ts";
6
+ import { makePostgresPool } from "#internal/makePostgresPool.ts";
6
7
  import { fromPrismaPromise } from "#internal/promise.ts";
7
8
  function clientOptions({ url, extensions, middleware, poolOptions, verifyMarker }) {
8
9
  return {
@@ -28,8 +29,18 @@ export const makeDatabase = () => (identifier, options) => {
28
29
  ...forwarded,
29
30
  contract: options.contract,
30
31
  });
31
- return fromPrismaPromise(() => acquireConnectedClient(client, () => ({
32
- client,
32
+ const pool = makePostgresPool(forwarded.url, layerOptions.poolOptions);
33
+ let closing;
34
+ const ownedClient = {
35
+ ...client,
36
+ close: () => {
37
+ closing ??= client.close().finally(() => pool.end());
38
+ return closing;
39
+ },
40
+ connect: () => client.connect({ pg: pool }),
41
+ };
42
+ return fromPrismaPromise(() => acquireConnectedClient(ownedClient, () => ({
43
+ client: ownedClient,
33
44
  identity: {},
34
45
  liveness: {
35
46
  closedCode: "RUNTIME.DATABASE_CLOSED",
@@ -1 +1 @@
1
- {"version":3,"file":"database.js","sourceRoot":"","sources":["../src/database.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,EAAE,EAAiD,MAAM,+BAA+B,CAAC;AACxG,OAAO,EAAc,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAEhE,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAsBzD,SAAS,aAAa,CAAC,EAAE,GAAG,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAwB;IACtG,OAAO;QACN,GAAG,EAAE,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC;QACxD,GAAG,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC;QACnD,GAAG,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC;QACnD,GAAG,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC;QACrD,GAAG,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC;KACvD,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CACrB,MAA2D;IAE3D,OAAO,eAAe,CAAqB,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;AACzE,CAAC;AAED,MAAM,CAAC,MAAM,YAAY,GACxB,GAA2C,EAAE,CAC7C,CACC,UAAkD,EAClD,OAA0C,EACG,EAAE;IAG/C,OAAO,eAAe,CAA+C,UAAU,EAAE,CAAC,YAAY,EAAE,EAAE;QACjG,MAAM,SAAS,GAAG,aAAa,CAAC,YAAY,CAAC,CAAC;QAC9C,MAAM,MAAM,GACX,OAAO,CAAC,QAAQ,KAAK,SAAS;YAC7B,CAAC,CAAC,QAAQ,CAAY;gBACpB,GAAG,SAAS;gBACZ,YAAY,EAAE,OAAO,CAAC,YAAY;aAClC,CAAC;YACH,CAAC,CAAC,QAAQ,CAAY;gBACpB,GAAG,SAAS;gBACZ,QAAQ,EAAE,OAAO,CAAC,QAAQ;aAC1B,CAAC,CAAC;QAEN,OAAO,iBAAiB,CAAC,GAAG,EAAE,CAC7B,sBAAsB,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;YACrC,MAAM;YACN,QAAQ,EAAE,EAAE;YACZ,QAAQ,EAAE;gBACT,UAAU,EAAE,yBAAyB;gBACrC,IAAI,EAAE,IAAI;aACV;YACD,IAAI,EAAE,MAAM;YACZ,MAAM,EAAE,aAAa,CAAoB,MAAM,CAAC;YAChD,cAAc,EAAE,SAAS;YACzB,mBAAmB,EAAE,SAAS;YAC9B,oBAAoB,EAAE,SAAS;SAC/B,CAAC,CAAC,CACH,CAAC;IACH,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC"}
1
+ {"version":3,"file":"database.js","sourceRoot":"","sources":["../src/database.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { PostgresOptionsBase } from "@prisma-next/postgres/runtime";
2
+ import { Pool } from "pg";
3
+ export declare function makePostgresPool(url: string, options: PostgresOptionsBase["poolOptions"]): Pool;
4
+ //# sourceMappingURL=makePostgresPool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"makePostgresPool.d.ts","sourceRoot":"","sources":["../../src/internal/makePostgresPool.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAAU,IAAI,EAAmB,MAAM,IAAI,CAAC;AAQnD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,mBAAmB,CAAC,aAAa,CAAC,GAAG,IAAI,CAiB/F"}
@@ -0,0 +1,25 @@
1
+ import { Client, Pool } from "pg";
2
+ function closeFailedClient(client) {
3
+ if (client instanceof Client) {
4
+ void client.end();
5
+ }
6
+ }
7
+ export function makePostgresPool(url, options) {
8
+ const pool = new Pool({
9
+ connectionString: url.trim(),
10
+ connectionTimeoutMillis: options?.connectionTimeoutMillis ?? 20_000,
11
+ idleTimeoutMillis: options?.idleTimeoutMillis ?? 30_000,
12
+ });
13
+ pool.on("connect", (client) => {
14
+ client.on("error", () => {
15
+ // pg rejects pending queries with the original error before emitting it.
16
+ // Close the failed socket; Prisma Next still owns rejection and release.
17
+ closeFailedClient(client);
18
+ });
19
+ });
20
+ pool.on("error", (_error, client) => {
21
+ closeFailedClient(client);
22
+ });
23
+ return pool;
24
+ }
25
+ //# sourceMappingURL=makePostgresPool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"makePostgresPool.js","sourceRoot":"","sources":["../../src/internal/makePostgresPool.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,IAAI,EAAmB,MAAM,IAAI,CAAC;AAEnD,SAAS,iBAAiB,CAAC,MAAkB;IAC5C,IAAI,MAAM,YAAY,MAAM,EAAE,CAAC;QAC9B,KAAK,MAAM,CAAC,GAAG,EAAE,CAAC;IACnB,CAAC;AACF,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,GAAW,EAAE,OAA2C;IACxF,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC;QACrB,gBAAgB,EAAE,GAAG,CAAC,IAAI,EAAE;QAC5B,uBAAuB,EAAE,OAAO,EAAE,uBAAuB,IAAI,MAAM;QACnE,iBAAiB,EAAE,OAAO,EAAE,iBAAiB,IAAI,MAAM;KACvD,CAAC,CAAC;IACH,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,MAAM,EAAE,EAAE;QAC7B,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YACvB,yEAAyE;YACzE,yEAAyE;YACzE,iBAAiB,CAAC,MAAM,CAAC,CAAC;QAC3B,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IACH,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE;QACnC,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;IACH,OAAO,IAAI,CAAC;AACb,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@shivaedev/effect-prisma",
3
- "version": "0.9.1",
3
+ "version": "0.9.2",
4
4
  "description": "Effect-native PostgreSQL queries and transactions for Prisma Next",
5
5
  "homepage": "https://github.com/ShivaeDev/platform/tree/main/packages/effect-prisma#readme",
6
6
  "bugs": {
@@ -53,7 +53,8 @@
53
53
  "@prisma-next/sql-relational-core": "0.16.0",
54
54
  "@prisma-next/sql-runtime": "0.16.0",
55
55
  "@prisma-next/sqlite": "0.16.0",
56
- "@shivaedev/effect-test": "0.5.0"
56
+ "@shivaedev/effect-test": "0.5.0",
57
+ "pg": "8.23.0"
57
58
  },
58
59
  "devDependencies": {
59
60
  "@effect/vitest": "4.0.4",
@@ -62,8 +63,8 @@
62
63
  "@prisma-next/cli": "0.16.0",
63
64
  "@prisma-next/target-postgres": "0.16.0",
64
65
  "@prisma-next/target-sqlite": "0.16.0",
65
- "@shivaedev/quality": "0.22.0",
66
- "@types/node": "24.19.1",
66
+ "@shivaedev/quality": "0.23.0",
67
+ "@types/node": "24.19.2",
67
68
  "@types/pg": "8.20.0",
68
69
  "@typescript/native": "npm:typescript@7.0.2",
69
70
  "effect": "4.0.4",
package/src/database.ts CHANGED
@@ -5,6 +5,7 @@ import { acquireConnectedClient } from "#internal/client-lifecycle.ts";
5
5
  import { namespaceModels } from "#internal/database-facade.ts";
6
6
  import { makeSqlDatabase } from "#internal/database-factory.ts";
7
7
  import type { AnySqlContract } from "#internal/executor.ts";
8
+ import { makePostgresPool } from "#internal/makePostgresPool.ts";
8
9
  import { fromPrismaPromise } from "#internal/promise.ts";
9
10
  import type { PrismaError } from "./error.ts";
10
11
 
@@ -63,10 +64,20 @@ export const makeDatabase =
63
64
  ...forwarded,
64
65
  contract: options.contract,
65
66
  });
67
+ const pool = makePostgresPool(forwarded.url, layerOptions.poolOptions);
68
+ let closing: Promise<void> | undefined;
69
+ const ownedClient = {
70
+ ...client,
71
+ close: () => {
72
+ closing ??= client.close().finally(() => pool.end());
73
+ return closing;
74
+ },
75
+ connect: () => client.connect({ pg: pool }),
76
+ };
66
77
 
67
78
  return fromPrismaPromise(() =>
68
- acquireConnectedClient(client, () => ({
69
- client,
79
+ acquireConnectedClient(ownedClient, () => ({
80
+ client: ownedClient,
70
81
  identity: {},
71
82
  liveness: {
72
83
  closedCode: "RUNTIME.DATABASE_CLOSED",
@@ -0,0 +1,27 @@
1
+ import type { PostgresOptionsBase } from "@prisma-next/postgres/runtime";
2
+ import { Client, Pool, type PoolClient } from "pg";
3
+
4
+ function closeFailedClient(client: PoolClient): void {
5
+ if (client instanceof Client) {
6
+ void client.end();
7
+ }
8
+ }
9
+
10
+ export function makePostgresPool(url: string, options: PostgresOptionsBase["poolOptions"]): Pool {
11
+ const pool = new Pool({
12
+ connectionString: url.trim(),
13
+ connectionTimeoutMillis: options?.connectionTimeoutMillis ?? 20_000,
14
+ idleTimeoutMillis: options?.idleTimeoutMillis ?? 30_000,
15
+ });
16
+ pool.on("connect", (client) => {
17
+ client.on("error", () => {
18
+ // pg rejects pending queries with the original error before emitting it.
19
+ // Close the failed socket; Prisma Next still owns rejection and release.
20
+ closeFailedClient(client);
21
+ });
22
+ });
23
+ pool.on("error", (_error, client) => {
24
+ closeFailedClient(client);
25
+ });
26
+ return pool;
27
+ }