@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.
- package/CHANGELOG.md +42 -0
- package/README.md +175 -161
- package/dist/PostgresListenerError.d.ts +10 -0
- package/dist/PostgresListenerError.d.ts.map +1 -0
- package/dist/PostgresListenerError.js +7 -0
- package/dist/PostgresListenerError.js.map +1 -0
- package/dist/SchemaComponent.d.ts +5 -5
- package/dist/SchemaComponent.d.ts.map +1 -1
- package/dist/SchemaComponent.js +1 -2
- package/dist/SchemaComponent.js.map +1 -1
- package/dist/WorkerRelease.d.ts +7 -8
- package/dist/WorkerRelease.d.ts.map +1 -1
- package/dist/WorkerRelease.js +10 -4
- package/dist/WorkerRelease.js.map +1 -1
- package/dist/adapters/makePostgresClient.d.ts +14 -0
- package/dist/adapters/makePostgresClient.d.ts.map +1 -0
- package/dist/adapters/makePostgresClient.js +63 -0
- package/dist/adapters/makePostgresClient.js.map +1 -0
- package/dist/adapters/postgresStream.d.ts +4 -0
- package/dist/adapters/postgresStream.d.ts.map +1 -0
- package/dist/adapters/postgresStream.js +20 -0
- package/dist/adapters/postgresStream.js.map +1 -0
- package/dist/assertPostgresMigrations.d.ts +1 -1
- package/dist/assertPostgresMigrations.d.ts.map +1 -1
- package/dist/assertPostgresMigrations.js.map +1 -1
- package/dist/coordinateWorkerRelease.d.ts +3 -3
- package/dist/coordinateWorkerRelease.d.ts.map +1 -1
- package/dist/coordinateWorkerRelease.js +14 -5
- package/dist/coordinateWorkerRelease.js.map +1 -1
- package/dist/databaseAddress.d.ts +4 -0
- package/dist/databaseAddress.d.ts.map +1 -0
- package/dist/databaseAddress.js +25 -0
- package/dist/databaseAddress.js.map +1 -0
- package/dist/internal/CommandRecovery.d.ts +3 -0
- package/dist/internal/CommandRecovery.d.ts.map +1 -0
- package/dist/internal/CommandRecovery.js +5 -0
- package/dist/internal/CommandRecovery.js.map +1 -0
- package/dist/listenForChanges.d.ts +3 -1
- package/dist/listenForChanges.d.ts.map +1 -1
- package/dist/listenForChanges.js +31 -34
- package/dist/listenForChanges.js.map +1 -1
- package/dist/migrations.d.ts +5 -4
- package/dist/migrations.d.ts.map +1 -1
- package/dist/migrations.js +7 -3
- package/dist/migrations.js.map +1 -1
- package/dist/notifyPayload.d.ts +1 -0
- package/dist/notifyPayload.d.ts.map +1 -1
- package/dist/notifyPayload.js +2 -0
- package/dist/notifyPayload.js.map +1 -1
- package/dist/pendingPostgresMigrations.d.ts +4 -3
- package/dist/pendingPostgresMigrations.d.ts.map +1 -1
- package/dist/pendingPostgresMigrations.js +8 -4
- package/dist/pendingPostgresMigrations.js.map +1 -1
- package/dist/postgresChanges.d.ts +3 -1
- package/dist/postgresChanges.d.ts.map +1 -1
- package/dist/postgresChanges.js +4 -2
- package/dist/postgresChanges.js.map +1 -1
- package/dist/postgresLayer.d.ts +11 -0
- package/dist/postgresLayer.d.ts.map +1 -0
- package/dist/postgresLayer.js +19 -0
- package/dist/postgresLayer.js.map +1 -0
- package/dist/postgresRelease.d.ts +9 -6
- package/dist/postgresRelease.d.ts.map +1 -1
- package/dist/postgresRelease.js +3 -3
- package/dist/postgresRelease.js.map +1 -1
- package/dist/releaseWorkers.d.ts +2 -2
- package/dist/releaseWorkers.d.ts.map +1 -1
- package/dist/releaseWorkers.js +3 -3
- package/dist/releaseWorkers.js.map +1 -1
- package/dist/testing.d.ts +2 -2
- package/dist/testing.d.ts.map +1 -1
- package/dist/testing.js +2 -2
- package/dist/testing.js.map +1 -1
- package/dist/transact.js +1 -1
- package/dist/transact.js.map +1 -1
- package/package.json +17 -11
- package/src/PostgresListenerError.ts +9 -0
- package/src/SchemaComponent.ts +6 -6
- package/src/WorkerRelease.ts +11 -9
- package/src/adapters/makePostgresClient.ts +72 -0
- package/src/adapters/postgresStream.ts +26 -0
- package/src/assertPostgresMigrations.ts +2 -2
- package/src/coordinateWorkerRelease.ts +31 -5
- package/src/databaseAddress.ts +25 -0
- package/src/internal/CommandRecovery.ts +5 -0
- package/src/listenForChanges.ts +41 -39
- package/src/migrations.ts +14 -7
- package/src/notifyPayload.ts +2 -0
- package/src/pendingPostgresMigrations.ts +16 -7
- package/src/postgresChanges.ts +10 -2
- package/src/postgresLayer.ts +27 -0
- package/src/postgresRelease.ts +9 -5
- package/src/releaseWorkers.ts +5 -3
- package/src/testing.ts +4 -8
- 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 {
|
|
3
|
-
export interface SchemaComponent<R = never> {
|
|
4
|
-
readonly apply: Effect.Effect<unknown,
|
|
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,
|
|
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,
|
|
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,
|
|
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"}
|
package/dist/SchemaComponent.js
CHANGED
|
@@ -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.
|
|
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;
|
|
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"}
|
package/dist/WorkerRelease.d.ts
CHANGED
|
@@ -1,14 +1,13 @@
|
|
|
1
|
-
import {
|
|
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
|
-
|
|
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,
|
|
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"}
|
package/dist/WorkerRelease.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
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:
|
|
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,
|
|
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,
|
|
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,
|
|
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
|
-
|
|
4
|
-
}, import("effect/
|
|
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;
|
|
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
|
-
|
|
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*
|
|
26
|
-
yield* poll;
|
|
27
|
-
yield*
|
|
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;
|
|
1
|
+
{"version":3,"file":"coordinateWorkerRelease.js","sourceRoot":"","sources":["../src/coordinateWorkerRelease.ts"],"names":[],"mappings":"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"}
|
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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,
|
|
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,
|
|
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"}
|
package/dist/listenForChanges.js
CHANGED
|
@@ -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
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
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*
|
|
32
|
-
const
|
|
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.
|
|
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.
|
|
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(
|
|
52
|
+
yield* Effect.andThen(send, Deferred.await(ack)).pipe(deadline);
|
|
61
53
|
}));
|
|
62
54
|
});
|
|
63
|
-
yield* Effect.raceFirst(listening, monitor)
|
|
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":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAiB,MAAM,
|
|
1
|
+
{"version":3,"file":"listenForChanges.js","sourceRoot":"","sources":["../src/listenForChanges.ts"],"names":[],"mappings":"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"}
|
package/dist/migrations.d.ts
CHANGED
|
@@ -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 |
|
|
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
|