@shivaedev/sql 0.24.0 → 0.26.0

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.
Files changed (95) hide show
  1. package/CHANGELOG.md +42 -0
  2. package/README.md +175 -161
  3. package/dist/PostgresListenerError.d.ts +10 -0
  4. package/dist/PostgresListenerError.d.ts.map +1 -0
  5. package/dist/PostgresListenerError.js +7 -0
  6. package/dist/PostgresListenerError.js.map +1 -0
  7. package/dist/SchemaComponent.d.ts +5 -5
  8. package/dist/SchemaComponent.d.ts.map +1 -1
  9. package/dist/SchemaComponent.js +1 -2
  10. package/dist/SchemaComponent.js.map +1 -1
  11. package/dist/WorkerRelease.d.ts +7 -8
  12. package/dist/WorkerRelease.d.ts.map +1 -1
  13. package/dist/WorkerRelease.js +10 -4
  14. package/dist/WorkerRelease.js.map +1 -1
  15. package/dist/adapters/makePostgresClient.d.ts +14 -0
  16. package/dist/adapters/makePostgresClient.d.ts.map +1 -0
  17. package/dist/adapters/makePostgresClient.js +63 -0
  18. package/dist/adapters/makePostgresClient.js.map +1 -0
  19. package/dist/adapters/postgresStream.d.ts +4 -0
  20. package/dist/adapters/postgresStream.d.ts.map +1 -0
  21. package/dist/adapters/postgresStream.js +20 -0
  22. package/dist/adapters/postgresStream.js.map +1 -0
  23. package/dist/assertPostgresMigrations.d.ts +1 -1
  24. package/dist/assertPostgresMigrations.d.ts.map +1 -1
  25. package/dist/assertPostgresMigrations.js.map +1 -1
  26. package/dist/coordinateWorkerRelease.d.ts +3 -3
  27. package/dist/coordinateWorkerRelease.d.ts.map +1 -1
  28. package/dist/coordinateWorkerRelease.js +14 -5
  29. package/dist/coordinateWorkerRelease.js.map +1 -1
  30. package/dist/databaseAddress.d.ts +4 -0
  31. package/dist/databaseAddress.d.ts.map +1 -0
  32. package/dist/databaseAddress.js +25 -0
  33. package/dist/databaseAddress.js.map +1 -0
  34. package/dist/internal/CommandRecovery.d.ts +3 -0
  35. package/dist/internal/CommandRecovery.d.ts.map +1 -0
  36. package/dist/internal/CommandRecovery.js +5 -0
  37. package/dist/internal/CommandRecovery.js.map +1 -0
  38. package/dist/listenForChanges.d.ts +3 -1
  39. package/dist/listenForChanges.d.ts.map +1 -1
  40. package/dist/listenForChanges.js +31 -34
  41. package/dist/listenForChanges.js.map +1 -1
  42. package/dist/migrations.d.ts +5 -4
  43. package/dist/migrations.d.ts.map +1 -1
  44. package/dist/migrations.js +7 -3
  45. package/dist/migrations.js.map +1 -1
  46. package/dist/notifyPayload.d.ts +1 -0
  47. package/dist/notifyPayload.d.ts.map +1 -1
  48. package/dist/notifyPayload.js +2 -0
  49. package/dist/notifyPayload.js.map +1 -1
  50. package/dist/pendingPostgresMigrations.d.ts +4 -3
  51. package/dist/pendingPostgresMigrations.d.ts.map +1 -1
  52. package/dist/pendingPostgresMigrations.js +8 -4
  53. package/dist/pendingPostgresMigrations.js.map +1 -1
  54. package/dist/postgresChanges.d.ts +3 -1
  55. package/dist/postgresChanges.d.ts.map +1 -1
  56. package/dist/postgresChanges.js +4 -2
  57. package/dist/postgresChanges.js.map +1 -1
  58. package/dist/postgresLayer.d.ts +11 -0
  59. package/dist/postgresLayer.d.ts.map +1 -0
  60. package/dist/postgresLayer.js +19 -0
  61. package/dist/postgresLayer.js.map +1 -0
  62. package/dist/postgresRelease.d.ts +9 -6
  63. package/dist/postgresRelease.d.ts.map +1 -1
  64. package/dist/postgresRelease.js +3 -3
  65. package/dist/postgresRelease.js.map +1 -1
  66. package/dist/releaseWorkers.d.ts +2 -2
  67. package/dist/releaseWorkers.d.ts.map +1 -1
  68. package/dist/releaseWorkers.js +3 -3
  69. package/dist/releaseWorkers.js.map +1 -1
  70. package/dist/testing.d.ts +2 -2
  71. package/dist/testing.d.ts.map +1 -1
  72. package/dist/testing.js +2 -2
  73. package/dist/testing.js.map +1 -1
  74. package/dist/transact.js +1 -1
  75. package/dist/transact.js.map +1 -1
  76. package/package.json +17 -11
  77. package/src/PostgresListenerError.ts +9 -0
  78. package/src/SchemaComponent.ts +6 -6
  79. package/src/WorkerRelease.ts +11 -9
  80. package/src/adapters/makePostgresClient.ts +72 -0
  81. package/src/adapters/postgresStream.ts +26 -0
  82. package/src/assertPostgresMigrations.ts +2 -2
  83. package/src/coordinateWorkerRelease.ts +31 -5
  84. package/src/databaseAddress.ts +25 -0
  85. package/src/internal/CommandRecovery.ts +5 -0
  86. package/src/listenForChanges.ts +41 -39
  87. package/src/migrations.ts +14 -7
  88. package/src/notifyPayload.ts +2 -0
  89. package/src/pendingPostgresMigrations.ts +16 -7
  90. package/src/postgresChanges.ts +10 -2
  91. package/src/postgresLayer.ts +27 -0
  92. package/src/postgresRelease.ts +9 -5
  93. package/src/releaseWorkers.ts +5 -3
  94. package/src/testing.ts +4 -8
  95. package/src/transact.ts +1 -1
@@ -0,0 +1,10 @@
1
+ declare const PostgresListenerError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
2
+ readonly _tag: "PostgresListenerError";
3
+ } & Readonly<A>;
4
+ export declare class PostgresListenerError extends PostgresListenerError_base<{
5
+ readonly connectionSetting: string;
6
+ }> {
7
+ get message(): string;
8
+ }
9
+ export {};
10
+ //# sourceMappingURL=PostgresListenerError.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PostgresListenerError.d.ts","sourceRoot":"","sources":["../src/PostgresListenerError.ts"],"names":[],"mappings":";;;AAEA,qBAAa,qBAAsB,SAAQ,2BAA0C;IACpF,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;CACnC,CAAC;IACD,IAAa,OAAO,WAEnB;CACD"}
@@ -0,0 +1,7 @@
1
+ import { Data } from "effect";
2
+ export class PostgresListenerError extends Data.TaggedError("PostgresListenerError") {
3
+ get message() {
4
+ return `PostgreSQL change listener heartbeat timed out without receiving its own notification. Set ${this.connectionSetting} to a direct or session-mode connection to the application database.`;
5
+ }
6
+ }
7
+ //# sourceMappingURL=PostgresListenerError.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PostgresListenerError.js","sourceRoot":"","sources":["../src/PostgresListenerError.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAE9B,MAAM,OAAO,qBAAsB,SAAQ,IAAI,CAAC,WAAW,CAAC,uBAAuB,CAEjF;IACD,IAAa,OAAO;QACnB,OAAO,8FAA8F,IAAI,CAAC,iBAAiB,sEAAsE,CAAC;IACnM,CAAC;CACD"}
@@ -1,9 +1,9 @@
1
1
  import { Effect } from "effect";
2
- import { Migrator, type SqlClient } from "effect/sql";
3
- export interface SchemaComponent<R = never> {
4
- readonly apply: Effect.Effect<unknown, unknown, R | SqlClient.SqlClient>;
2
+ import type { SqlClient } from "effect/sql";
3
+ export interface SchemaComponent<R = never, E = unknown> {
4
+ readonly apply: Effect.Effect<unknown, E, R | SqlClient.SqlClient>;
5
5
  readonly name: string;
6
- readonly pending: Effect.Effect<string | undefined, unknown, R | SqlClient.SqlClient>;
6
+ readonly pending: Effect.Effect<string | undefined, E, R | SqlClient.SqlClient>;
7
7
  }
8
- export declare function runSchemaComponent<A, R>(name: string, effect: Effect.Effect<A, unknown, R>): Effect.Effect<A, Migrator.MigrationError, R>;
8
+ export declare function runSchemaComponent<A, E, R>(name: string, effect: Effect.Effect<A, E, R>): Effect.Effect<A, E, R>;
9
9
  //# sourceMappingURL=SchemaComponent.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"SchemaComponent.d.ts","sourceRoot":"","sources":["../src/SchemaComponent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,QAAQ,EAAE,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAEtD,MAAM,WAAW,eAAe,CAAC,CAAC,GAAG,KAAK;IACzC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC;IACzE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,SAAS,EAAE,OAAO,EAAE,CAAC,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC;CACtF;AAED,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,gDAE1F"}
1
+ {"version":3,"file":"SchemaComponent.d.ts","sourceRoot":"","sources":["../src/SchemaComponent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,MAAM,WAAW,eAAe,CAAC,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,OAAO;IACtD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC;IACnE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,SAAS,EAAE,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC;CAChF;AAED,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,0BAEvF"}
@@ -1,6 +1,5 @@
1
1
  import { Effect } from "effect";
2
- import { Migrator } from "effect/sql";
3
2
  export function runSchemaComponent(name, effect) {
4
- return effect.pipe(Effect.mapError((cause) => new Migrator.MigrationError({ cause, kind: "Failed", message: `Schema component ${name} failed.` })));
3
+ return effect.pipe(Effect.tapCause((cause) => Effect.logError(`Schema component ${name} failed.`, cause)));
5
4
  }
6
5
  //# sourceMappingURL=SchemaComponent.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SchemaComponent.js","sourceRoot":"","sources":["../src/SchemaComponent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,QAAQ,EAAkB,MAAM,YAAY,CAAC;AAQtD,MAAM,UAAU,kBAAkB,CAAO,IAAY,EAAE,MAAoC;IAC1F,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,QAAQ,CAAC,cAAc,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,oBAAoB,IAAI,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC;AACrJ,CAAC"}
1
+ {"version":3,"file":"SchemaComponent.js","sourceRoot":"","sources":["../src/SchemaComponent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAShC,MAAM,UAAU,kBAAkB,CAAU,IAAY,EAAE,MAA8B;IACvF,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,oBAAoB,IAAI,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;AAC5G,CAAC"}
@@ -1,14 +1,13 @@
1
- import { Context, Effect, type Scope } from "effect";
2
- declare const WorkerRelease_base: Context.ServiceClass<WorkerRelease, "@shivaedev/sql/WorkerRelease", {
3
- readonly register: <E>(control: (active: boolean) => Effect.Effect<void, E>) => Effect.Effect<void, E, Scope.Scope>;
4
- }>;
5
- export declare class WorkerRelease extends WorkerRelease_base {
6
- }
1
+ import { Effect } from "effect";
7
2
  export declare const makeWorkerRelease: () => Effect.Effect<{
8
3
  service: {
9
- readonly register: <E>(control: (active: boolean) => Effect.Effect<void, E>) => Effect.Effect<void, E, Scope.Scope>;
4
+ register: <E>(control: (active: boolean) => Effect.Effect<void, E>) => Effect.Effect<void, E, import("effect/Scope").Scope>;
10
5
  };
11
6
  setActive: (next: boolean) => Effect.Effect<void, unknown, never>;
12
7
  }, never, never>;
13
- export {};
8
+ export declare const WorkerRelease: import("effect/Context").Service<"@shivaedev/sql/WorkerRelease", Readonly<{
9
+ readonly register: <E>(control: (active: boolean) => Effect.Effect<void, E>) => Effect.Effect<void, E, import("effect/Scope").Scope>;
10
+ }>> & {
11
+ readonly layer: import("effect/Layer").Layer<"@shivaedev/sql/WorkerRelease", never, never>;
12
+ };
14
13
  //# sourceMappingURL=WorkerRelease.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"WorkerRelease.d.ts","sourceRoot":"","sources":["../src/WorkerRelease.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,KAAK,EAAa,MAAM,QAAQ,CAAC;;uBAK3C,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC;;AAHrH,qBAAa,aAAc,SAAQ,kBAKA;CAAG;AAEtC,eAAO,MAAM,iBAAiB;;2BAJT,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC;;sBAqBjG,OAAO;gBAWzB,CAAC"}
1
+ {"version":3,"file":"WorkerRelease.d.ts","sourceRoot":"","sources":["../src/WorkerRelease.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAa,MAAM,QAAQ,CAAC;AAI3C,eAAO,MAAM,iBAAiB;;mBAKX,CAAC,WAAW,CAAC,MAAM,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;;sBAYtD,OAAO;gBAWzB,CAAC;AAEH,eAAO,MAAM,aAAa;wBAzBP,CAAC,WAAW,CAAC,MAAM,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;;;CA8BxE,CAAC"}
@@ -1,6 +1,6 @@
1
- import { Context, Effect, Semaphore } from "effect";
2
- export class WorkerRelease extends Context.Service()("@shivaedev/sql/WorkerRelease") {
3
- }
1
+ import { Effect, Semaphore } from "effect";
2
+ import { defineService } from "@shivaedev/service/defineService.ts";
3
+ import { genericMethod } from "@shivaedev/service/genericMethod.ts";
4
4
  export const makeWorkerRelease = Effect.fn("EffectSql.makeWorkerRelease")(function* () {
5
5
  const mutex = Semaphore.makeUnsafe(1);
6
6
  const controls = new Set();
@@ -17,7 +17,7 @@ export const makeWorkerRelease = Effect.fn("EffectSql.makeWorkerRelease")(functi
17
17
  return Effect.acquireRelease(locked(attach), () => locked(detach));
18
18
  }
19
19
  return {
20
- service: WorkerRelease.of({ register }),
20
+ service: { register },
21
21
  setActive: (next) => locked(Effect.gen(function* () {
22
22
  if (next === active) {
23
23
  return;
@@ -27,4 +27,10 @@ export const makeWorkerRelease = Effect.fn("EffectSql.makeWorkerRelease")(functi
27
27
  })).pipe(Effect.uninterruptible),
28
28
  };
29
29
  });
30
+ export const WorkerRelease = defineService({
31
+ id: "@shivaedev/sql/WorkerRelease",
32
+ initialize: makeWorkerRelease(),
33
+ methods: ({ service }) => ({ register: genericMethod(service.register) }),
34
+ requires: [],
35
+ });
30
36
  //# sourceMappingURL=WorkerRelease.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"WorkerRelease.js","sourceRoot":"","sources":["../src/WorkerRelease.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAc,SAAS,EAAE,MAAM,QAAQ,CAAC;AAEhE,MAAM,OAAO,aAAc,SAAQ,OAAO,CAAC,OAAO,EAK/C,CAAC,8BAA8B,CAAC;CAAG;AAEtC,MAAM,CAAC,MAAM,iBAAiB,GAAG,MAAM,CAAC,EAAE,CAAC,6BAA6B,CAAC,CAAC,QAAQ,CAAC;IAClF,MAAM,KAAK,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IACtC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAqD,CAAC;IAC9E,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,MAAM,MAAM,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IACpC,SAAS,QAAQ,CAAI,OAAoD;QACxE,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YAClC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACtB,KAAK,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACxB,CAAC,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;YAC/B,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;QACH,OAAO,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IACpE,CAAC;IACD,OAAO;QACN,OAAO,EAAE,aAAa,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC;QACvC,SAAS,EAAE,CAAC,IAAa,EAAE,EAAE,CAC5B,MAAM,CACL,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YACnB,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;gBACrB,OAAO;YACR,CAAC;YACD,MAAM,GAAG,IAAI,CAAC;YACd,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5G,CAAC,CAAC,CACF,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC;KAC/B,CAAC;AACH,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"WorkerRelease.js","sourceRoot":"","sources":["../src/WorkerRelease.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AAEpE,MAAM,CAAC,MAAM,iBAAiB,GAAG,MAAM,CAAC,EAAE,CAAC,6BAA6B,CAAC,CAAC,QAAQ,CAAC;IAClF,MAAM,KAAK,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IACtC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAqD,CAAC;IAC9E,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,MAAM,MAAM,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IACpC,SAAS,QAAQ,CAAI,OAAoD;QACxE,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YAClC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACtB,KAAK,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACxB,CAAC,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;YAC/B,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;QACH,OAAO,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IACpE,CAAC;IACD,OAAO;QACN,OAAO,EAAE,EAAE,QAAQ,EAAE;QACrB,SAAS,EAAE,CAAC,IAAa,EAAE,EAAE,CAC5B,MAAM,CACL,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YACnB,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;gBACrB,OAAO;YACR,CAAC;YACD,MAAM,GAAG,IAAI,CAAC;YACd,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5G,CAAC,CAAC,CACF,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC;KAC/B,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,aAAa,GAAG,aAAa,CAAC;IAC1C,EAAE,EAAE,8BAA8B;IAClC,UAAU,EAAE,iBAAiB,EAAE;IAC/B,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,aAAa,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;IACzE,QAAQ,EAAE,EAAE;CACZ,CAAC,CAAC"}
@@ -0,0 +1,14 @@
1
+ import * as PgClient from "@effect/sql-pg/PgClient";
2
+ import type * as PgConnection from "@effect/sql-pg/PgConnection";
3
+ import * as PgPool from "@effect/sql-pg/PgPool";
4
+ import { Effect } from "effect";
5
+ import { SqlClient, Statement } from "effect/sql";
6
+ import { SqlError } from "effect/sql/SqlError";
7
+ export declare const makePostgresClient: (config: PgClient.PgClientConfig<never>) => Effect.Effect<SqlClient.SqlClient & {
8
+ "~@effect/sql-pg/PgClient": "~@effect/sql-pg/PgClient";
9
+ config: PgClient.PgClientConfig<never>;
10
+ json: (value: unknown) => Statement.Fragment;
11
+ listen: (channel: string) => Effect.Effect<import("effect/Queue").Dequeue<PgConnection.Notification, SqlError>, SqlError, import("effect/Scope").Scope>;
12
+ notify: (channel: string, payload: string) => Effect.Effect<void, SqlError, never>;
13
+ }, never, PgPool.PgPool | import("effect/reactivity/Reactivity").Reactivity>;
14
+ //# sourceMappingURL=makePostgresClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"makePostgresClient.d.ts","sourceRoot":"","sources":["../../src/adapters/makePostgresClient.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,yBAAyB,CAAC;AACpD,OAAO,KAAK,KAAK,YAAY,MAAM,6BAA6B,CAAC;AACjE,OAAO,KAAK,MAAM,MAAM,uBAAuB,CAAC;AAChD,OAAO,EAAE,MAAM,EAAqB,MAAM,QAAQ,CAAC;AACnD,OAAO,EAAE,SAAS,EAAsB,SAAS,EAAE,MAAM,YAAY,CAAC;AACtE,OAAO,EAAE,QAAQ,EAAgB,MAAM,qBAAqB,CAAC;AAI7D,eAAO,MAAM,kBAAkB;;;kBAuBf,OAAO;sBACH,MAAM;sBACN,MAAM,WAAW,MAAM;4EAGzC,CAAC"}
@@ -0,0 +1,63 @@
1
+ import * as PgClient from "@effect/sql-pg/PgClient";
2
+ import * as PgPool from "@effect/sql-pg/PgPool";
3
+ import { Effect, Predicate, Stream } from "effect";
4
+ import { SqlClient, Statement } from "effect/sql";
5
+ import { SqlError, UnknownError } from "effect/sql/SqlError";
6
+ const json = Statement.custom("PgJson");
7
+ export const makePostgresClient = Effect.fn("Sql.makePostgresClient")(function* (config) {
8
+ const pool = yield* PgPool.PgPool;
9
+ const acquirer = Effect.map(pool.get, postgresConnection);
10
+ const client = yield* SqlClient.make({
11
+ acquirer,
12
+ borrower: (use) => pool.use((connection) => use(postgresConnection(connection))),
13
+ commit,
14
+ compiler: PgClient.makeCompiler(config.transformQueryNames),
15
+ driver: "pg",
16
+ prepareTransactionControls: true,
17
+ releaseSavepoint: (name) => `RELEASE SAVEPOINT ${name}`,
18
+ spanAttributes: [
19
+ ["db.system.name", "postgresql"],
20
+ ["db.namespace", config.database ?? config.username ?? "postgres"],
21
+ ["server.address", config.host ?? "localhost"],
22
+ ["server.port", config.port ?? 5432],
23
+ ],
24
+ transactionAcquirer: Effect.map(pool.reserve, postgresConnection),
25
+ transformRows: config.transformResultNames === undefined ? undefined : Statement.defaultTransforms(config.transformResultNames).array,
26
+ });
27
+ return Object.assign(client, {
28
+ [PgClient.TypeId]: PgClient.TypeId,
29
+ config,
30
+ json: (value) => Statement.fragment([json(value)]),
31
+ listen: (channel) => Effect.flatMap(pool.reserve, (connection) => connection.listen(channel)),
32
+ notify: (channel, payload) => pool.use((connection) => connection.query("SELECT pg_notify($1, $2)", [channel, payload])).pipe(Effect.asVoid),
33
+ });
34
+ });
35
+ function postgresConnection(connection) {
36
+ function execute(sql, params, transformRows, prepare = true) {
37
+ const rows = Effect.map(connection.query(sql, params, prepare), (result) => result.rows);
38
+ return transformRows === undefined ? rows : Effect.map(rows, transformRows);
39
+ }
40
+ return {
41
+ execute,
42
+ executeRaw: (sql, params) => connection.query(sql, params),
43
+ executeStream: (sql, params, transformRows) => {
44
+ const stream = connection.stream(sql, params);
45
+ return transformRows === undefined ? stream : Stream.mapArray(stream, (rows) => [transformRows(rows)]).pipe(Stream.flattenIterable);
46
+ },
47
+ executeUnprepared: (sql, params, transformRows) => execute(sql, params, transformRows, false),
48
+ executeValues: (sql, params) => connection.queryValues(sql, params),
49
+ executeValuesUnprepared: (sql, params) => connection.queryValues(sql, params, false),
50
+ };
51
+ }
52
+ function commit(connection) {
53
+ return Effect.flatMap(connection.executeRaw("COMMIT", []), (result) => Predicate.hasProperty(result, "command") && result.command === "ROLLBACK"
54
+ ? Effect.fail(new SqlError({
55
+ reason: new UnknownError({
56
+ cause: new Error("COMMIT rolled back an aborted transaction"),
57
+ message: "PgClient: COMMIT rolled back an aborted transaction",
58
+ operation: "commit",
59
+ }),
60
+ }))
61
+ : Effect.void);
62
+ }
63
+ //# sourceMappingURL=makePostgresClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"makePostgresClient.js","sourceRoot":"","sources":["../../src/adapters/makePostgresClient.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { PgPoolConfig } from "@effect/sql-pg/PgClient";
2
+ import { Effect, Redacted } from "effect";
3
+ export declare const postgresStream: (url: Redacted.Redacted<string>, address: Pick<PgPoolConfig<never>, "host" | "port">) => Effect.Effect<() => import("net").Socket, never, import("effect/Scope").Scope>;
4
+ //# sourceMappingURL=postgresStream.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgresStream.d.ts","sourceRoot":"","sources":["../../src/adapters/postgresStream.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAE1C,eAAO,MAAM,cAAc,yKAqBzB,CAAC"}
@@ -0,0 +1,20 @@
1
+ import { createConnection } from "node:net";
2
+ import { Effect, Redacted } from "effect";
3
+ export const postgresStream = Effect.fn("Sql.postgresStream")(function* (url, address) {
4
+ const disconnected = new Set();
5
+ // Native pool shutdown sends Terminate without waiting for its sockets to close.
6
+ yield* Effect.addFinalizer(() => Effect.promise(() => Promise.all([...disconnected])));
7
+ return () => {
8
+ const target = new URL(Redacted.value(url));
9
+ const host = address.host ?? target.searchParams.getAll("host").at(-1) ?? (decodeURIComponent(target.hostname) || "localhost");
10
+ const port = address.port ?? 5432;
11
+ const socket = createConnection(host.startsWith("/") ? { path: `${host}/.s.PGSQL.${port}` } : { host, noDelay: true, port });
12
+ const closed = new Promise((resolve) => socket.once("close", () => {
13
+ disconnected.delete(closed);
14
+ resolve();
15
+ }));
16
+ disconnected.add(closed);
17
+ return socket;
18
+ };
19
+ });
20
+ //# sourceMappingURL=postgresStream.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgresStream.js","sourceRoot":"","sources":["../../src/adapters/postgresStream.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAE5C,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAE1C,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,CAAC,EAAE,CAAC,oBAAoB,CAAC,CAAC,QAAQ,CAAC,EACtE,GAA8B,EAC9B,OAA4C;IAE5C,MAAM,YAAY,GAAG,IAAI,GAAG,EAAiB,CAAC;IAC9C,iFAAiF;IACjF,KAAK,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;IACvF,OAAO,GAAG,EAAE;QACX,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;QAC5C,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,WAAW,CAAC,CAAC;QAC/H,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC;QAClC,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,IAAI,aAAa,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7H,MAAM,MAAM,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAC5C,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE;YACzB,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAC5B,OAAO,EAAE,CAAC;QACX,CAAC,CAAC,CACF,CAAC;QACF,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACzB,OAAO,MAAM,CAAC;IACf,CAAC,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -2,6 +2,6 @@ import { Effect } from "effect";
2
2
  import { Migrator } from "effect/sql";
3
3
  import type { PostgresMigrationOptions } from "./migrations.ts";
4
4
  import { type PendingPostgresMigrations } from "./pendingPostgresMigrations.ts";
5
- export declare const assertPostgresMigrations: <R>(options: Pick<PostgresMigrationOptions<R>, "components" | "loader" | "release" | "table">) => Effect.Effect<undefined, Migrator.MigrationError | import("effect/sql/SqlError").SqlError, R | import("effect/sql/SqlClient").SqlClient>;
5
+ export declare const assertPostgresMigrations: <R, E = never>(options: Pick<PostgresMigrationOptions<R, E>, "components" | "loader" | "release" | "table">) => Effect.Effect<undefined, E | Migrator.MigrationError | import("effect/Schema").SchemaError | import("effect/sql/SqlError").SqlError, R | import("effect/sql/SqlClient").SqlClient>;
6
6
  export declare function postgresMigrationError(pending: PendingPostgresMigrations): Migrator.MigrationError;
7
7
  //# sourceMappingURL=assertPostgresMigrations.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"assertPostgresMigrations.d.ts","sourceRoot":"","sources":["../src/assertPostgresMigrations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAChE,OAAO,EAAE,KAAK,yBAAyB,EAA6B,MAAM,gCAAgC,CAAC;AAE3G,eAAO,MAAM,wBAAwB,GAA8D,CAAC,wOAOlG,CAAC;AAEH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,yBAAyB,2BASxE"}
1
+ {"version":3,"file":"assertPostgresMigrations.d.ts","sourceRoot":"","sources":["../src/assertPostgresMigrations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAChE,OAAO,EAAE,KAAK,yBAAyB,EAA6B,MAAM,gCAAgC,CAAC;AAE3G,eAAO,MAAM,wBAAwB,GAA8D,CAAC,EAAE,CAAC,6RAOrG,CAAC;AAEH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,yBAAyB,2BASxE"}
@@ -1 +1 @@
1
- {"version":3,"file":"assertPostgresMigrations.js","sourceRoot":"","sources":["../src/assertPostgresMigrations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,OAAO,EAAkC,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAE3G,MAAM,CAAC,MAAM,wBAAwB,GAAG,MAAM,CAAC,EAAE,CAAC,oCAAoC,CAAC,CAAC,QAAQ,CAAC,EAChG,OAAyF;IAEzF,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,yBAAyB,CAAC,OAAO,CAAC,CAAC;IAC1D,IAAI,OAAO,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpE,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC,CAAC;IAC5D,CAAC;AACF,CAAC,CAAC,CAAC;AAEH,MAAM,UAAU,sBAAsB,CAAC,OAAkC;IACxE,MAAM,OAAO,GAAG;QACf,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,aAAa,EAAE,KAAK,IAAI,GAAG,CAAC;QACxE,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,aAAa,IAAI,KAAK,MAAM,EAAE,CAAC;KAC/E,CAAC;IACF,OAAO,IAAI,QAAQ,CAAC,cAAc,CAAC;QAClC,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE,wCAAwC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,yCAAyC;KAC5G,CAAC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"assertPostgresMigrations.js","sourceRoot":"","sources":["../src/assertPostgresMigrations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,OAAO,EAAkC,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAE3G,MAAM,CAAC,MAAM,wBAAwB,GAAG,MAAM,CAAC,EAAE,CAAC,oCAAoC,CAAC,CAAC,QAAQ,CAAC,EAChG,OAA4F;IAE5F,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,yBAAyB,CAAC,OAAO,CAAC,CAAC;IAC1D,IAAI,OAAO,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpE,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC,CAAC;IAC5D,CAAC;AACF,CAAC,CAAC,CAAC;AAEH,MAAM,UAAU,sBAAsB,CAAC,OAAkC;IACxE,MAAM,OAAO,GAAG;QACf,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,aAAa,EAAE,KAAK,IAAI,GAAG,CAAC;QACxE,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,aAAa,IAAI,KAAK,MAAM,EAAE,CAAC;KAC/E,CAAC;IACF,OAAO,IAAI,QAAQ,CAAC,cAAc,CAAC;QAClC,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE,wCAAwC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,yCAAyC;KAC5G,CAAC,CAAC;AACJ,CAAC"}
@@ -1,5 +1,5 @@
1
- import { Duration, Effect } from "effect";
1
+ import { Duration, Effect, Scope } from "effect";
2
2
  export declare const coordinateWorkerRelease: (release: string, pollInterval?: Duration.Input | undefined, table?: any) => Effect.Effect<{
3
- readonly register: <E>(control: (active: boolean) => Effect.Effect<void, E>) => Effect.Effect<void, E, import("effect/Scope").Scope>;
4
- }, import("effect/sql/SqlError").SqlError, import("effect/Scope").Scope | import("effect/sql/SqlClient").SqlClient>;
3
+ register: <E>(control: (active: boolean) => Effect.Effect<void, E>) => Effect.Effect<void, E, Scope.Scope>;
4
+ }, import("effect/Schema").SchemaError | import("effect/sql/SqlError").SqlError, Scope.Scope | import("effect/sql/SqlClient").SqlClient>;
5
5
  //# sourceMappingURL=coordinateWorkerRelease.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"coordinateWorkerRelease.d.ts","sourceRoot":"","sources":["../src/coordinateWorkerRelease.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAK1C,eAAO,MAAM,uBAAuB;;mHA2BlC,CAAC"}
1
+ {"version":3,"file":"coordinateWorkerRelease.d.ts","sourceRoot":"","sources":["../src/coordinateWorkerRelease.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAkB,KAAK,EAAE,MAAM,QAAQ,CAAC;AAMjE,eAAO,MAAM,uBAAuB;;wIAoDlC,CAAC"}
@@ -1,9 +1,12 @@
1
- import { Duration, Effect } from "effect";
1
+ import { Duration, Effect, Exit, Schedule, Scope } from "effect";
2
+ import { isSqlError } from "effect/sql/SqlError";
2
3
  import { readPostgresRelease } from "./postgresRelease.js";
3
4
  import { releaseWorkers } from "./releaseWorkers.js";
4
5
  import { makeWorkerRelease } from "./WorkerRelease.js";
5
6
  export const coordinateWorkerRelease = Effect.fn("EffectSql.coordinateWorkerRelease")(function* (release, pollInterval = "1 second", table = "effect_sql_migrations") {
6
7
  const gate = yield* makeWorkerRelease();
8
+ const scope = yield* Scope.fork(yield* Effect.scope);
9
+ const retries = Schedule.spaced(Duration.toMillis(pollInterval) / 4).pipe(Schedule.upTo({ times: 3 }));
7
10
  const rows = yield* releaseWorkers(release, Duration.toMillis(pollInterval) * 5, table);
8
11
  let claimed = false;
9
12
  const poll = Effect.gen(function* () {
@@ -20,11 +23,17 @@ export const coordinateWorkerRelease = Effect.fn("EffectSql.coordinateWorkerRele
20
23
  }
21
24
  }
22
25
  });
23
- yield* Effect.addFinalizer(() => rows.remove.pipe(Effect.orDie));
26
+ function tick(name, effect) {
27
+ return effect.pipe(Effect.tapCause((cause) => Effect.logWarning(`Worker release ${name} failed`, cause)), Effect.retry({ schedule: retries, while: isSqlError }));
28
+ }
29
+ function loop(name, effect) {
30
+ return Effect.forever(Effect.sleep(pollInterval).pipe(Effect.andThen(tick(name, effect)))).pipe(Effect.catchCause((cause) => Effect.logError(`Worker release ${name} stopped; closing worker scope`, cause).pipe(Effect.andThen(Scope.close(scope, Exit.failCause(cause))))), Scope.provide(scope), Effect.forkIn(scope));
31
+ }
32
+ yield* Scope.addFinalizer(scope, rows.remove.pipe(Effect.tapCause((cause) => Effect.logError("Worker release cleanup failed", cause)), Effect.orDie));
24
33
  // Heartbeats continue while offWork waits for active jobs to finish.
25
- yield* Effect.forever(Effect.sleep(pollInterval).pipe(Effect.andThen(rows.heartbeat))).pipe(Effect.orDie, Effect.forkScoped);
26
- yield* poll;
27
- yield* Effect.forever(Effect.sleep(pollInterval).pipe(Effect.andThen(poll))).pipe(Effect.orDie, Effect.forkScoped);
34
+ yield* loop("heartbeat", rows.heartbeat);
35
+ yield* tick("poll", poll).pipe(Scope.provide(scope));
36
+ yield* loop("poll", poll);
28
37
  return gate.service;
29
38
  });
30
39
  //# sourceMappingURL=coordinateWorkerRelease.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"coordinateWorkerRelease.js","sourceRoot":"","sources":["../src/coordinateWorkerRelease.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC1C,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEvD,MAAM,CAAC,MAAM,uBAAuB,GAAG,MAAM,CAAC,EAAE,CAAC,mCAAmC,CAAC,CAAC,QAAQ,CAAC,EAC9F,OAAe,EACf,YAAY,GAAmB,UAAU,EACzC,KAAK,GAAG,uBAAuB;IAE/B,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,iBAAiB,EAAE,CAAC;IACxC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,cAAc,CAAC,OAAO,EAAE,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;IACxF,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAChC,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;QAChD,IAAI,KAAK,EAAE,OAAO,KAAK,OAAO,EAAE,CAAC;YAChC,KAAK,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAChD,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;YACnB,OAAO,GAAG,KAAK,CAAC;QACjB,CAAC;aAAM,IAAI,CAAC,OAAO,EAAE,CAAC;YACrB,OAAO,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;YAC5B,IAAI,OAAO,EAAE,CAAC;gBACb,KAAK,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAChD,CAAC;QACF,CAAC;IACF,CAAC,CAAC,CAAC;IACH,KAAK,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACjE,qEAAqE;IACrE,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;IAC7H,KAAK,CAAC,CAAC,IAAI,CAAC;IACZ,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;IACnH,OAAO,IAAI,CAAC,OAAO,CAAC;AACrB,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"coordinateWorkerRelease.js","sourceRoot":"","sources":["../src/coordinateWorkerRelease.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEvD,MAAM,CAAC,MAAM,uBAAuB,GAAG,MAAM,CAAC,EAAE,CAAC,mCAAmC,CAAC,CAAC,QAAQ,CAAC,EAC9F,OAAe,EACf,YAAY,GAAmB,UAAU,EACzC,KAAK,GAAG,uBAAuB;IAE/B,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,iBAAiB,EAAE,CAAC;IACxC,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACrD,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACvG,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,cAAc,CAAC,OAAO,EAAE,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;IACxF,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAChC,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;QAChD,IAAI,KAAK,EAAE,OAAO,KAAK,OAAO,EAAE,CAAC;YAChC,KAAK,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAChD,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;YACnB,OAAO,GAAG,KAAK,CAAC;QACjB,CAAC;aAAM,IAAI,CAAC,OAAO,EAAE,CAAC;YACrB,OAAO,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;YAC5B,IAAI,OAAO,EAAE,CAAC;gBACb,KAAK,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAChD,CAAC;QACF,CAAC;IACF,CAAC,CAAC,CAAC;IACH,SAAS,IAAI,CAAU,IAAY,EAAE,MAA8B;QAClE,OAAO,MAAM,CAAC,IAAI,CACjB,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,kBAAkB,IAAI,SAAS,EAAE,KAAK,CAAC,CAAC,EACrF,MAAM,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CACtD,CAAC;IACH,CAAC;IACD,SAAS,IAAI,CAAO,IAAY,EAAE,MAAoC;QACrE,OAAO,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAC9F,MAAM,CAAC,UAAU,CAAC,CAAC,KAAK,EAAE,EAAE,CAC3B,MAAM,CAAC,QAAQ,CAAC,kBAAkB,IAAI,gCAAgC,EAAE,KAAK,CAAC,CAAC,IAAI,CAClF,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CACzD,CACD,EACD,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EACpB,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CACpB,CAAC;IACH,CAAC;IACD,KAAK,CAAC,CAAC,KAAK,CAAC,YAAY,CACxB,KAAK,EACL,IAAI,CAAC,MAAM,CAAC,IAAI,CACf,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,+BAA+B,EAAE,KAAK,CAAC,CAAC,EACnF,MAAM,CAAC,KAAK,CACZ,CACD,CAAC;IACF,qEAAqE;IACrE,KAAK,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IACzC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;IACrD,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC1B,OAAO,IAAI,CAAC,OAAO,CAAC;AACrB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { PgPoolConfig } from "@effect/sql-pg/PgClient";
2
+ import { Redacted } from "effect";
3
+ export declare function databaseAddress(value: Redacted.Redacted<string>): Pick<PgPoolConfig, "host" | "port">;
4
+ //# sourceMappingURL=databaseAddress.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"databaseAddress.d.ts","sourceRoot":"","sources":["../src/databaseAddress.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAElC,wBAAgB,eAAe,CAAC,KAAK,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAAC,CAqBrG"}
@@ -0,0 +1,25 @@
1
+ import { Redacted } from "effect";
2
+ export function databaseAddress(value) {
3
+ try {
4
+ const url = new URL(Redacted.value(value));
5
+ if (url.protocol !== "postgres:" && url.protocol !== "postgresql:") {
6
+ return {};
7
+ }
8
+ const hostname = url.hostname.startsWith("[") ? url.hostname.slice(1, -1) : decodeURIComponent(url.hostname);
9
+ // PgConnection applies query parameters in order, after the authority.
10
+ const host = url.searchParams.getAll("host").at(-1) ?? hostname;
11
+ const rawPort = url.searchParams.getAll("port").at(-1) ?? url.port;
12
+ const port = rawPort === "" ? undefined : Number(rawPort);
13
+ if (host.includes(",") || (port !== undefined && (!Number.isInteger(port) || port < 1 || port > 65_535))) {
14
+ return {};
15
+ }
16
+ return {
17
+ ...(host === "" && !url.searchParams.has("host") ? {} : { host }),
18
+ ...(port === undefined ? {} : { port }),
19
+ };
20
+ }
21
+ catch {
22
+ return {};
23
+ }
24
+ }
25
+ //# sourceMappingURL=databaseAddress.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"databaseAddress.js","sourceRoot":"","sources":["../src/databaseAddress.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAElC,MAAM,UAAU,eAAe,CAAC,KAAgC;IAC/D,IAAI,CAAC;QACJ,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;QAC3C,IAAI,GAAG,CAAC,QAAQ,KAAK,WAAW,IAAI,GAAG,CAAC,QAAQ,KAAK,aAAa,EAAE,CAAC;YACpE,OAAO,EAAE,CAAC;QACX,CAAC;QACD,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC7G,uEAAuE;QACvE,MAAM,IAAI,GAAG,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC;QAChE,MAAM,OAAO,GAAG,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC;QACnE,MAAM,IAAI,GAAG,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC1D,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,MAAM,CAAC,CAAC,EAAE,CAAC;YAC1G,OAAO,EAAE,CAAC;QACX,CAAC;QACD,OAAO;YACN,GAAG,CAAC,IAAI,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;YACjE,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;SACvC,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,EAAE,CAAC;IACX,CAAC;AACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Context, Effect } from "effect";
2
+ export declare const CommandRecovery: Context.Reference<Effect.Effect<void, never, never>>;
3
+ //# sourceMappingURL=CommandRecovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CommandRecovery.d.ts","sourceRoot":"","sources":["../../src/internal/CommandRecovery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEzC,eAAO,MAAM,eAAe,sDAE1B,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { Context, Effect } from "effect";
2
+ export const CommandRecovery = Context.Reference("@shivaedev/sql/CommandRecovery", {
3
+ defaultValue: () => Effect.void,
4
+ });
5
+ //# sourceMappingURL=CommandRecovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CommandRecovery.js","sourceRoot":"","sources":["../../src/internal/CommandRecovery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEzC,MAAM,CAAC,MAAM,eAAe,GAAG,OAAO,CAAC,SAAS,CAAsB,gCAAgC,EAAE;IACvG,YAAY,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI;CAC/B,CAAC,CAAC"}
@@ -1,5 +1,7 @@
1
1
  import { Effect, Scope } from "effect";
2
2
  import * as Reactivity from "effect/reactivity/Reactivity";
3
+ import type { SqlError } from "effect/sql/SqlError";
4
+ import { PostgresListenerError } from "./PostgresListenerError.ts";
3
5
  import type { PostgresChangesOptions } from "./postgresChanges.ts";
4
- export declare const listenForChanges: (options: PostgresChangesOptions) => Effect.Effect<void, never, Reactivity.Reactivity | Scope.Scope>;
6
+ export declare const listenForChanges: (options: PostgresChangesOptions) => Effect.Effect<void, PostgresListenerError | SqlError, Reactivity.Reactivity | Scope.Scope>;
5
7
  //# sourceMappingURL=listenForChanges.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"listenForChanges.d.ts","sourceRoot":"","sources":["../src/listenForChanges.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkC,MAAM,EAAoB,KAAK,EAAE,MAAM,QAAQ,CAAC;AACzF,OAAO,KAAK,UAAU,MAAM,8BAA8B,CAAC;AAE3D,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAuBnE,eAAO,MAAM,gBAAgB,sGAsE3B,CAAC"}
1
+ {"version":3,"file":"listenForChanges.d.ts","sourceRoot":"","sources":["../src/listenForChanges.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkC,MAAM,EAAiB,KAAK,EAAE,MAAM,QAAQ,CAAC;AACtF,OAAO,KAAK,UAAU,MAAM,8BAA8B,CAAC;AAC3D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AASnE,eAAO,MAAM,gBAAgB,iIAoF3B,CAAC"}
@@ -1,52 +1,44 @@
1
- import { Clock, Deferred, Effect, Queue, Scope } from "effect";
1
+ import { Clock, Deferred, Effect, Queue, Random, Scope } from "effect";
2
2
  import * as Reactivity from "effect/reactivity/Reactivity";
3
- import { decodeKeys } from "./notifyPayload.js";
4
- function closeListener(scope, outcome, timeout) {
5
- return Effect.suspend(() => {
6
- function bounded(finalizer) {
7
- return (exit) => finalizer(exit).pipe(Effect.interruptible, Effect.timeoutOption(timeout), Effect.asVoid);
8
- }
9
- // Bound each finalizer so a stalled UNLISTEN cannot prevent the native connection release that follows it.
10
- if (scope.state._tag === "Open") {
11
- const state = scope.state;
12
- if (state.finalizer !== undefined) {
13
- state.finalizer = bounded(state.finalizer);
14
- }
15
- if (state.finalizers !== undefined) {
16
- for (const [key, finalizer] of state.finalizers) {
17
- state.finalizers.set(key, bounded(finalizer));
18
- }
19
- }
20
- }
21
- return Scope.closeUnsafe(scope, outcome) ?? Effect.void;
22
- });
3
+ import { decodeKeys, resyncPayload } from "./notifyPayload.js";
4
+ import { PostgresListenerError } from "./PostgresListenerError.js";
5
+ function listenerScope(timeout) {
6
+ // Release the native connection alongside listener cleanup, even when a listener finalizer stalls.
7
+ return Effect.acquireRelease(Scope.make("parallel"), (scope, exit) => Effect.suspend(() => Scope.closeUnsafe(scope, exit) ?? Effect.void).pipe(Effect.interruptible, Effect.timeoutOption(timeout), Effect.asVoid));
23
8
  }
24
9
  export const listenForChanges = Effect.fn("PostgresChanges.listenForChanges")(function* (options) {
25
10
  const ready = yield* Deferred.make();
26
11
  const reactivity = yield* Reactivity.Reactivity;
27
12
  const { client, channel, resync } = options;
28
13
  const timeout = options.heartbeatTimeout ?? "10 seconds";
14
+ function deadline(effect) {
15
+ return effect.pipe(Effect.timeoutOrElse({
16
+ duration: timeout,
17
+ orElse: () => Effect.fail(new PostgresListenerError({ connectionSetting: options.connectionSetting ?? "client" })),
18
+ }));
19
+ }
29
20
  let lostAt;
30
21
  const attempt = Effect.scoped(Effect.gen(function* () {
31
- const scope = yield* Effect.acquireRelease(Scope.make(), (listenerScope, exit) => closeListener(listenerScope, exit, timeout));
32
- const token = JSON.stringify({ heartbeat: crypto.randomUUID() });
22
+ const scope = yield* listenerScope(timeout);
23
+ const notifications = yield* (options.listenerClient ?? client).listen(channel).pipe(Scope.provide(scope), deadline);
24
+ const token = JSON.stringify({ heartbeat: `${yield* Random.nextInt}:${yield* Random.nextInt}` });
33
25
  let ack = yield* Deferred.make();
34
26
  function receive(payload) {
35
27
  if (payload === token) {
36
28
  return Effect.asVoid(Deferred.succeed(ack, undefined));
37
29
  }
30
+ if (payload === resyncPayload) {
31
+ return Effect.asVoid(resync);
32
+ }
38
33
  if (!payload.startsWith("[")) {
39
34
  return Effect.void;
40
35
  }
41
36
  return decodeKeys(payload).pipe(Effect.flatMap((keys) => Effect.sync(() => reactivity.invalidateUnsafe(keys))), Effect.catchCause(() => resync));
42
37
  }
43
- const listening = Effect.gen(function* () {
44
- const notifications = yield* client.listen(channel).pipe(Scope.provide(scope));
45
- yield* Effect.forever(Effect.flatMap(Queue.takeAll(notifications), (batch) => Effect.forEach(batch, (notification) => receive(notification.payload), { discard: true })));
46
- });
38
+ const listening = Effect.forever(Effect.flatMap(Queue.takeAll(notifications), (batch) => Effect.forEach(batch, (notification) => receive(notification.payload), { discard: true })));
47
39
  const send = Effect.asVoid(client `select pg_notify(${channel}, ${token})`);
48
40
  const monitor = Effect.gen(function* () {
49
- yield* Effect.raceFirst(Deferred.await(ack), Effect.forever(Effect.andThen(send, Effect.sleep("50 millis")))).pipe(Effect.timeout(timeout));
41
+ yield* Effect.andThen(send, Deferred.await(ack)).pipe(deadline);
50
42
  const streamCount = yield* resync;
51
43
  if (lostAt !== undefined) {
52
44
  const downtimeMs = (yield* Clock.currentTimeMillis) - lostAt;
@@ -57,18 +49,23 @@ export const listenForChanges = Effect.fn("PostgresChanges.listenForChanges")(fu
57
49
  yield* Effect.forever(Effect.gen(function* () {
58
50
  yield* Effect.sleep(options.heartbeatInterval ?? "5 seconds");
59
51
  ack = yield* Deferred.make();
60
- yield* Effect.andThen(send, Deferred.await(ack)).pipe(Effect.timeout(timeout));
52
+ yield* Effect.andThen(send, Deferred.await(ack)).pipe(deadline);
61
53
  }));
62
54
  });
63
- yield* Effect.raceFirst(listening, monitor).pipe(Effect.onExit(() => resync));
64
- }));
65
- yield* Effect.forever(attempt.pipe(Effect.catchCause(() => Effect.gen(function* () {
55
+ yield* Effect.raceFirst(listening, monitor);
56
+ }).pipe(Effect.onExit(() => resync)));
57
+ yield* Effect.forever(attempt.pipe(Effect.catchCause((cause) => Effect.gen(function* () {
58
+ if (!(yield* Deferred.isDone(ready))) {
59
+ yield* Effect.logError("PostgreSQL change listener startup failed", cause);
60
+ yield* Deferred.failCause(ready, cause);
61
+ return;
62
+ }
66
63
  if (lostAt !== undefined) {
67
- yield* Effect.logDebug("PostgreSQL change listener reconnect failed; retrying");
64
+ yield* Effect.logDebug("PostgreSQL change listener reconnect failed; retrying", cause);
68
65
  return;
69
66
  }
70
67
  lostAt = yield* Clock.currentTimeMillis;
71
- yield* Effect.logWarning("PostgreSQL change listener lost; resynchronizing live streams");
68
+ yield* Effect.logWarning("PostgreSQL change listener lost; resynchronizing live streams", cause);
72
69
  })), Effect.andThen(Effect.sleep(options.retryDelay ?? "1 second")))).pipe(Effect.forkScoped);
73
70
  yield* Deferred.await(ready);
74
71
  });
@@ -1 +1 @@
1
- {"version":3,"file":"listenForChanges.js","sourceRoot":"","sources":["../src/listenForChanges.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"listenForChanges.js","sourceRoot":"","sources":["../src/listenForChanges.ts"],"names":[],"mappings":"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"}
@@ -1,12 +1,13 @@
1
- import { Duration, Effect } from "effect";
1
+ import { Duration, Effect, Schema } from "effect";
2
2
  import { Migrator, SqlClient } from "effect/sql";
3
+ import type { SqlError } from "effect/sql/SqlError";
3
4
  import { type SchemaComponent } from "./SchemaComponent.ts";
4
- export interface PostgresMigrationOptions<R> {
5
- readonly components?: readonly SchemaComponent<R>[];
5
+ export interface PostgresMigrationOptions<R, E = never> {
6
+ readonly components?: readonly SchemaComponent<R, E>[];
6
7
  readonly loader: Migrator.Loader<R>;
7
8
  readonly lockTimeout: Duration.Input;
8
9
  readonly release?: string;
9
10
  readonly table?: string;
10
11
  }
11
- export declare const migratePostgres: <R>(args_0: PostgresMigrationOptions<R>) => Effect.Effect<readonly (readonly [id: number, name: string])[], Migrator.MigrationError | import("effect/sql/SqlError").SqlError, R | SqlClient.SqlClient>;
12
+ export declare const migratePostgres: <R, E = never>(args_0: PostgresMigrationOptions<R, E>) => Effect.Effect<readonly (readonly [id: number, name: string])[], E | Migrator.MigrationError | Schema.SchemaError | SqlError, R | SqlClient.SqlClient>;
12
13
  //# sourceMappingURL=migrations.d.ts.map