@rotorsoft/act-pg 0.2.0 → 0.3.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/dist/index.js CHANGED
@@ -1,4 +1,321 @@
1
- /** @module act-pg */
2
- export * from "./config";
3
- export * from "./PostgresStore";
1
+ // src/config.ts
2
+ import { extend, config as target } from "@rotorsoft/act";
3
+ import { z } from "zod/v4";
4
+ var { PG_HOST, PG_USER, PG_PASSWORD, PG_DATABASE, PG_PORT } = process.env;
5
+ var config = extend(
6
+ {
7
+ pg: {
8
+ host: PG_HOST || "localhost",
9
+ user: PG_USER || "postgres",
10
+ password: PG_PASSWORD || "postgres",
11
+ database: PG_DATABASE || "postgres",
12
+ port: Number.parseInt(PG_PORT || "5431")
13
+ }
14
+ },
15
+ z.object({
16
+ pg: z.object({
17
+ host: z.string().min(1),
18
+ user: z.string().min(1),
19
+ password: z.string().min(1),
20
+ database: z.string().min(1),
21
+ port: z.number().int().min(1e3).max(65535)
22
+ })
23
+ }),
24
+ target()
25
+ );
26
+
27
+ // src/PostgresStore.ts
28
+ import { ConcurrencyError, SNAP_EVENT, logger } from "@rotorsoft/act";
29
+ import pg from "pg";
30
+
31
+ // src/seed.ts
32
+ var seed_store = (table) => `
33
+ -- events
34
+ CREATE TABLE IF NOT EXISTS public."${table}"
35
+ (
36
+ id serial PRIMARY KEY,
37
+ name varchar(100) COLLATE pg_catalog."default" NOT NULL,
38
+ data jsonb,
39
+ stream varchar(100) COLLATE pg_catalog."default" NOT NULL,
40
+ version int NOT NULL,
41
+ created timestamptz NOT NULL DEFAULT now(),
42
+ meta jsonb
43
+ ) TABLESPACE pg_default;
44
+
45
+ CREATE UNIQUE INDEX IF NOT EXISTS "${table}_stream_ix"
46
+ ON public."${table}" USING btree (stream COLLATE pg_catalog."default" ASC, version ASC)
47
+ TABLESPACE pg_default;
48
+
49
+ CREATE INDEX IF NOT EXISTS "${table}_name_ix"
50
+ ON public."${table}" USING btree (name COLLATE pg_catalog."default" ASC)
51
+ TABLESPACE pg_default;
52
+
53
+ CREATE INDEX IF NOT EXISTS "${table}_created_id_ix"
54
+ ON public."${table}" USING btree (created ASC, id ASC)
55
+ TABLESPACE pg_default;
56
+
57
+ CREATE INDEX IF NOT EXISTS "${table}_correlation_ix"
58
+ ON public."${table}" USING btree ((meta ->> 'correlation'::text) COLLATE pg_catalog."default" ASC NULLS LAST)
59
+ TABLESPACE pg_default;
60
+
61
+ -- streams
62
+ CREATE TABLE IF NOT EXISTS public."${table}_streams"
63
+ (
64
+ stream varchar(100) COLLATE pg_catalog."default" PRIMARY KEY,
65
+ at int not null default(-1),
66
+ retry smallint not null default(0),
67
+ blocked boolean not null default(false),
68
+ leased_at int,
69
+ leased_by uuid,
70
+ leased_until timestamptz
71
+ ) TABLESPACE pg_default;
72
+
73
+ -- supports order by { blocked, at } when fetching
74
+ CREATE INDEX IF NOT EXISTS "${table}_streams_fetch_ix"
75
+ ON public."${table}_streams" USING btree (blocked, at) TABLESPACE pg_default;
76
+ `;
77
+
78
+ // src/utils.ts
79
+ var ISO_8601 = /^(\d{4})-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])T([01][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])(\.\d+)?(Z|[+-][0-2][0-9]:[0-5][0-9])?$/;
80
+ var dateReviver = (key, value) => {
81
+ if (typeof value === "string" && ISO_8601.test(value)) {
82
+ return new Date(value);
83
+ }
84
+ return value;
85
+ };
86
+
87
+ // src/PostgresStore.ts
88
+ var { Pool, types } = pg;
89
+ types.setTypeParser(
90
+ types.builtins.JSONB,
91
+ (val) => JSON.parse(val, dateReviver)
92
+ );
93
+ var PostgresStore = class {
94
+ constructor(table, leaseMillis = 3e4) {
95
+ this.table = table;
96
+ this.leaseMillis = leaseMillis;
97
+ }
98
+ _pool = new Pool(config.pg);
99
+ async dispose() {
100
+ await this._pool.end();
101
+ }
102
+ async seed() {
103
+ const seed = seed_store(this.table);
104
+ await this._pool.query(seed);
105
+ }
106
+ async drop() {
107
+ await this._pool.query(`DROP TABLE IF EXISTS "${this.table}"`);
108
+ await this._pool.query(`DROP TABLE IF EXISTS "${this.table}_streams"`);
109
+ }
110
+ async query(callback, query, withSnaps = false) {
111
+ const {
112
+ stream,
113
+ names,
114
+ before,
115
+ after,
116
+ limit,
117
+ created_before,
118
+ created_after,
119
+ backward,
120
+ correlation
121
+ } = query || {};
122
+ let sql = `SELECT * FROM "${this.table}" WHERE`;
123
+ const values = [];
124
+ if (withSnaps)
125
+ sql = sql.concat(
126
+ ` id>=COALESCE((SELECT id
127
+ FROM "${this.table}"
128
+ WHERE stream='${stream}' AND name='${SNAP_EVENT}'
129
+ ORDER BY id DESC LIMIT 1), 0)
130
+ AND stream='${stream}'`
131
+ );
132
+ else if (query) {
133
+ if (typeof after !== "undefined") {
134
+ values.push(after);
135
+ sql = sql.concat(" id>$1");
136
+ } else sql = sql.concat(" id>-1");
137
+ if (stream) {
138
+ values.push(stream);
139
+ sql = sql.concat(` AND stream=$${values.length}`);
140
+ }
141
+ if (names && names.length) {
142
+ values.push(names);
143
+ sql = sql.concat(` AND name = ANY($${values.length})`);
144
+ }
145
+ if (before) {
146
+ values.push(before);
147
+ sql = sql.concat(` AND id<$${values.length}`);
148
+ }
149
+ if (created_after) {
150
+ values.push(created_after.toISOString());
151
+ sql = sql.concat(` AND created>$${values.length}`);
152
+ }
153
+ if (created_before) {
154
+ values.push(created_before.toISOString());
155
+ sql = sql.concat(` AND created<$${values.length}`);
156
+ }
157
+ if (correlation) {
158
+ values.push(correlation);
159
+ sql = sql.concat(` AND meta->>'correlation'=$${values.length}`);
160
+ }
161
+ }
162
+ sql = sql.concat(` ORDER BY id ${backward ? "DESC" : "ASC"}`);
163
+ if (limit) {
164
+ values.push(limit);
165
+ sql = sql.concat(` LIMIT $${values.length}`);
166
+ }
167
+ const result = await this._pool.query(sql, values);
168
+ for (const row of result.rows) callback(row);
169
+ return result.rowCount ?? 0;
170
+ }
171
+ async commit(stream, msgs, meta, expectedVersion) {
172
+ const client = await this._pool.connect();
173
+ let version = -1;
174
+ try {
175
+ await client.query("BEGIN");
176
+ const last = await client.query(
177
+ `SELECT version FROM "${this.table}" WHERE stream=$1 ORDER BY version DESC LIMIT 1`,
178
+ [stream]
179
+ );
180
+ version = last.rowCount ? last.rows[0].version : -1;
181
+ if (expectedVersion && version !== expectedVersion)
182
+ throw new ConcurrencyError(
183
+ version,
184
+ msgs,
185
+ expectedVersion
186
+ );
187
+ const committed = await Promise.all(
188
+ msgs.map(async ({ name, data }) => {
189
+ version++;
190
+ const sql = `
191
+ INSERT INTO "${this.table}"(name, data, stream, version, meta)
192
+ VALUES($1, $2, $3, $4, $5) RETURNING *`;
193
+ const vals = [name, data, stream, version, meta];
194
+ const { rows } = await client.query(sql, vals);
195
+ return rows.at(0);
196
+ })
197
+ );
198
+ await client.query(
199
+ `
200
+ NOTIFY "${this.table}", '${JSON.stringify({
201
+ operation: "INSERT",
202
+ id: committed[0].name,
203
+ position: committed[0].id
204
+ })}';
205
+ COMMIT;
206
+ `
207
+ ).catch((error) => {
208
+ logger.error(error);
209
+ throw new ConcurrencyError(
210
+ version,
211
+ msgs,
212
+ expectedVersion || -1
213
+ );
214
+ });
215
+ return committed;
216
+ } catch (error) {
217
+ await client.query("ROLLBACK").catch(() => {
218
+ });
219
+ throw error;
220
+ } finally {
221
+ client.release();
222
+ }
223
+ }
224
+ async fetch(limit) {
225
+ const { rows } = await this._pool.query(
226
+ `
227
+ SELECT stream, at
228
+ FROM "${this.table}_streams"
229
+ WHERE blocked=false
230
+ ORDER BY at ASC
231
+ LIMIT $1::integer
232
+ `,
233
+ [limit]
234
+ );
235
+ const after = rows.length ? rows.reduce((min, r) => Math.min(min, r.at), Number.MAX_SAFE_INTEGER) : -1;
236
+ const events = [];
237
+ await this.query((e) => events.push(e), { after, limit });
238
+ return { streams: rows.map(({ stream }) => stream), events };
239
+ }
240
+ async lease(leases) {
241
+ const { by, at } = leases.at(0);
242
+ const streams = leases.map(({ stream }) => stream);
243
+ const client = await this._pool.connect();
244
+ try {
245
+ await client.query("BEGIN");
246
+ await client.query(
247
+ `
248
+ INSERT INTO "${this.table}_streams" (stream)
249
+ SELECT UNNEST($1::text[])
250
+ ON CONFLICT (stream) DO NOTHING
251
+ `,
252
+ [streams]
253
+ );
254
+ const { rows } = await client.query(
255
+ `
256
+ WITH free AS (
257
+ SELECT * FROM "${this.table}_streams"
258
+ WHERE stream = ANY($1::text[]) AND (leased_by IS NULL OR leased_until <= NOW())
259
+ FOR UPDATE
260
+ )
261
+ UPDATE "${this.table}_streams" U
262
+ SET
263
+ leased_by = $2::uuid,
264
+ leased_at = $3::integer,
265
+ leased_until = NOW() + ($4::integer || ' milliseconds')::interval
266
+ FROM free
267
+ WHERE U.stream = free.stream
268
+ RETURNING U.stream, U.leased_at, U.retry
269
+ `,
270
+ [streams, by, at, this.leaseMillis]
271
+ );
272
+ await client.query("COMMIT");
273
+ return rows.map(({ stream, leased_at, retry }) => ({
274
+ stream,
275
+ by,
276
+ at: leased_at,
277
+ retry,
278
+ block: false
279
+ }));
280
+ } catch (error) {
281
+ await client.query("ROLLBACK").catch(() => {
282
+ });
283
+ throw error;
284
+ } finally {
285
+ client.release();
286
+ }
287
+ }
288
+ async ack(leases) {
289
+ const client = await this._pool.connect();
290
+ try {
291
+ await client.query("BEGIN");
292
+ for (const { stream, by, at, retry, block } of leases) {
293
+ await client.query(
294
+ `UPDATE "${this.table}_streams"
295
+ SET
296
+ at = $3::integer,
297
+ retry = $4::integer,
298
+ blocked = $5::boolean,
299
+ leased_by = NULL,
300
+ leased_at = NULL,
301
+ leased_until = NULL
302
+ WHERE
303
+ stream = $1::text
304
+ AND leased_by = $2::uuid`,
305
+ [stream, by, at, retry, block]
306
+ );
307
+ }
308
+ await client.query("COMMIT");
309
+ } catch {
310
+ await client.query("ROLLBACK").catch(() => {
311
+ });
312
+ } finally {
313
+ client.release();
314
+ }
315
+ }
316
+ };
317
+ export {
318
+ PostgresStore,
319
+ config
320
+ };
4
321
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,qBAAqB;AACrB,cAAc,UAAU,CAAC;AACzB,cAAc,iBAAiB,CAAC"}
1
+ {"version":3,"sources":["../src/config.ts","../src/PostgresStore.ts","../src/seed.ts","../src/utils.ts"],"sourcesContent":["import { extend, config as target } from \"@rotorsoft/act\";\nimport { z } from \"zod/v4\";\n\nconst { PG_HOST, PG_USER, PG_PASSWORD, PG_DATABASE, PG_PORT } = process.env;\n\nexport const config = extend(\n {\n pg: {\n host: PG_HOST || \"localhost\",\n user: PG_USER || \"postgres\",\n password: PG_PASSWORD || \"postgres\",\n database: PG_DATABASE || \"postgres\",\n port: Number.parseInt(PG_PORT || \"5431\"),\n },\n },\n z.object({\n pg: z.object({\n host: z.string().min(1),\n user: z.string().min(1),\n password: z.string().min(1),\n database: z.string().min(1),\n port: z.number().int().min(1000).max(65535),\n }),\n }),\n target()\n);\n","import type {\n Committed,\n EventMeta,\n Lease,\n Message,\n Query,\n Schemas,\n Store,\n} from \"@rotorsoft/act\";\nimport { ConcurrencyError, SNAP_EVENT, logger } from \"@rotorsoft/act\";\nimport pg from \"pg\";\nimport { config } from \"./config.js\";\nimport { seed_store } from \"./seed.js\";\nimport { dateReviver } from \"./utils.js\";\n\nconst { Pool, types } = pg;\ntypes.setTypeParser(types.builtins.JSONB, (val) =>\n JSON.parse(val, dateReviver)\n);\n\nexport class PostgresStore implements Store {\n private _pool = new Pool(config.pg);\n\n constructor(\n readonly table: string,\n readonly leaseMillis = 30_000\n ) {}\n async dispose() {\n await this._pool.end();\n }\n\n async seed() {\n const seed = seed_store(this.table);\n await this._pool.query(seed);\n }\n\n async drop() {\n await this._pool.query(`DROP TABLE IF EXISTS \"${this.table}\"`);\n await this._pool.query(`DROP TABLE IF EXISTS \"${this.table}_streams\"`);\n }\n\n async query<E extends Schemas>(\n callback: (event: Committed<E, keyof E>) => void,\n query?: Query,\n withSnaps = false\n ) {\n const {\n stream,\n names,\n before,\n after,\n limit,\n created_before,\n created_after,\n backward,\n correlation,\n } = query || {};\n\n let sql = `SELECT * FROM \"${this.table}\" WHERE`;\n const values: any[] = [];\n\n if (withSnaps)\n sql = sql.concat(\n ` id>=COALESCE((SELECT id\n FROM \"${this.table}\"\n WHERE stream='${stream}' AND name='${SNAP_EVENT}'\n ORDER BY id DESC LIMIT 1), 0)\n AND stream='${stream}'`\n );\n else if (query) {\n if (typeof after !== \"undefined\") {\n values.push(after);\n sql = sql.concat(\" id>$1\");\n } else sql = sql.concat(\" id>-1\");\n if (stream) {\n values.push(stream);\n sql = sql.concat(` AND stream=$${values.length}`);\n }\n if (names && names.length) {\n values.push(names);\n sql = sql.concat(` AND name = ANY($${values.length})`);\n }\n if (before) {\n values.push(before);\n sql = sql.concat(` AND id<$${values.length}`);\n }\n if (created_after) {\n values.push(created_after.toISOString());\n sql = sql.concat(` AND created>$${values.length}`);\n }\n if (created_before) {\n values.push(created_before.toISOString());\n sql = sql.concat(` AND created<$${values.length}`);\n }\n if (correlation) {\n values.push(correlation);\n sql = sql.concat(` AND meta->>'correlation'=$${values.length}`);\n }\n }\n sql = sql.concat(` ORDER BY id ${backward ? \"DESC\" : \"ASC\"}`);\n if (limit) {\n values.push(limit);\n sql = sql.concat(` LIMIT $${values.length}`);\n }\n\n const result = await this._pool.query<Committed<E, keyof E>>(sql, values);\n for (const row of result.rows) callback(row);\n\n return result.rowCount ?? 0;\n }\n\n async commit<E extends Schemas>(\n stream: string,\n msgs: Message<E, keyof E>[],\n meta: EventMeta,\n expectedVersion?: number\n ) {\n const client = await this._pool.connect();\n let version = -1;\n try {\n await client.query(\"BEGIN\");\n\n const last = await client.query<Committed<E, keyof E>>(\n `SELECT version FROM \"${this.table}\" WHERE stream=$1 ORDER BY version DESC LIMIT 1`,\n [stream]\n );\n version = last.rowCount ? last.rows[0].version : -1;\n if (expectedVersion && version !== expectedVersion)\n throw new ConcurrencyError(\n version,\n msgs as unknown as Message<Schemas, string>[],\n expectedVersion\n );\n\n const committed = await Promise.all(\n msgs.map(async ({ name, data }) => {\n version++;\n const sql = `\n INSERT INTO \"${this.table}\"(name, data, stream, version, meta) \n VALUES($1, $2, $3, $4, $5) RETURNING *`;\n const vals = [name, data, stream, version, meta];\n const { rows } = await client.query<Committed<E, keyof E>>(sql, vals);\n return rows.at(0)!;\n })\n );\n\n await client\n .query(\n `\n NOTIFY \"${this.table}\", '${JSON.stringify({\n operation: \"INSERT\",\n id: committed[0].name,\n position: committed[0].id,\n })}';\n COMMIT;\n `\n )\n .catch((error) => {\n logger.error(error);\n throw new ConcurrencyError(\n version,\n msgs as unknown as Message<Schemas, string>[],\n expectedVersion || -1\n );\n });\n return committed;\n } catch (error) {\n await client.query(\"ROLLBACK\").catch(() => {});\n throw error;\n } finally {\n client.release();\n }\n }\n\n async fetch<E extends Schemas>(limit: number) {\n const { rows } = await this._pool.query<{ stream: string; at: number }>(\n `\n SELECT stream, at\n FROM \"${this.table}_streams\"\n WHERE blocked=false\n ORDER BY at ASC\n LIMIT $1::integer\n `,\n [limit]\n );\n\n const after = rows.length\n ? rows.reduce((min, r) => Math.min(min, r.at), Number.MAX_SAFE_INTEGER)\n : -1;\n\n const events: Committed<E, keyof E>[] = [];\n await this.query<E>((e) => events.push(e), { after, limit });\n return { streams: rows.map(({ stream }) => stream), events };\n }\n\n async lease(leases: Lease[]) {\n const { by, at } = leases.at(0)!;\n const streams = leases.map(({ stream }) => stream);\n const client = await this._pool.connect();\n\n try {\n await client.query(\"BEGIN\");\n // insert new streams\n await client.query(\n `\n INSERT INTO \"${this.table}_streams\" (stream)\n SELECT UNNEST($1::text[])\n ON CONFLICT (stream) DO NOTHING\n `,\n [streams]\n );\n // set leases\n const { rows } = await client.query<{\n stream: string;\n leased_at: number;\n retry: number;\n }>(\n `\n WITH free AS (\n SELECT * FROM \"${this.table}_streams\" \n WHERE stream = ANY($1::text[]) AND (leased_by IS NULL OR leased_until <= NOW())\n FOR UPDATE\n )\n UPDATE \"${this.table}_streams\" U\n SET\n leased_by = $2::uuid,\n leased_at = $3::integer,\n leased_until = NOW() + ($4::integer || ' milliseconds')::interval\n FROM free\n WHERE U.stream = free.stream\n RETURNING U.stream, U.leased_at, U.retry\n `,\n [streams, by, at, this.leaseMillis]\n );\n await client.query(\"COMMIT\");\n\n return rows.map(({ stream, leased_at, retry }) => ({\n stream,\n by,\n at: leased_at,\n retry,\n block: false,\n }));\n } catch (error) {\n await client.query(\"ROLLBACK\").catch(() => {});\n throw error;\n } finally {\n client.release();\n }\n }\n\n async ack(leases: Lease[]) {\n const client = await this._pool.connect();\n\n try {\n await client.query(\"BEGIN\");\n for (const { stream, by, at, retry, block } of leases) {\n await client.query(\n `UPDATE \"${this.table}_streams\"\n SET\n at = $3::integer,\n retry = $4::integer,\n blocked = $5::boolean,\n leased_by = NULL,\n leased_at = NULL,\n leased_until = NULL\n WHERE\n stream = $1::text\n AND leased_by = $2::uuid`,\n [stream, by, at, retry, block]\n );\n }\n await client.query(\"COMMIT\");\n } catch {\n // leased_until fallback\n await client.query(\"ROLLBACK\").catch(() => {});\n } finally {\n client.release();\n }\n }\n}\n","export const seed_store = (table: string): string => `\n-- events\nCREATE TABLE IF NOT EXISTS public.\"${table}\"\n(\n\tid serial PRIMARY KEY,\n name varchar(100) COLLATE pg_catalog.\"default\" NOT NULL,\n data jsonb,\n stream varchar(100) COLLATE pg_catalog.\"default\" NOT NULL,\n version int NOT NULL,\n created timestamptz NOT NULL DEFAULT now(),\n meta jsonb\n) TABLESPACE pg_default;\n\nCREATE UNIQUE INDEX IF NOT EXISTS \"${table}_stream_ix\"\n ON public.\"${table}\" USING btree (stream COLLATE pg_catalog.\"default\" ASC, version ASC)\n TABLESPACE pg_default;\n\t\nCREATE INDEX IF NOT EXISTS \"${table}_name_ix\"\n ON public.\"${table}\" USING btree (name COLLATE pg_catalog.\"default\" ASC)\n TABLESPACE pg_default;\n \nCREATE INDEX IF NOT EXISTS \"${table}_created_id_ix\"\n ON public.\"${table}\" USING btree (created ASC, id ASC)\n TABLESPACE pg_default;\n\nCREATE INDEX IF NOT EXISTS \"${table}_correlation_ix\"\n ON public.\"${table}\" USING btree ((meta ->> 'correlation'::text) COLLATE pg_catalog.\"default\" ASC NULLS LAST)\n TABLESPACE pg_default;\n\n-- streams\nCREATE TABLE IF NOT EXISTS public.\"${table}_streams\"\n(\n stream varchar(100) COLLATE pg_catalog.\"default\" PRIMARY KEY,\n at int not null default(-1),\n retry smallint not null default(0),\n blocked boolean not null default(false),\n leased_at int,\n leased_by uuid,\n leased_until timestamptz\n) TABLESPACE pg_default;\n\n-- supports order by { blocked, at } when fetching\nCREATE INDEX IF NOT EXISTS \"${table}_streams_fetch_ix\"\n ON public.\"${table}_streams\" USING btree (blocked, at) TABLESPACE pg_default;\n`;\n","/**\n * Date reviver when parsing JSON strings with the following formats:\n * - YYYY-MM-DDTHH:MM:SS.sssZ\n * - YYYY-MM-DDTHH:MM:SS.sss+HH:MM\n * - YYYY-MM-DDTHH:MM:SS.sss-HH:MM\n */\nconst ISO_8601 =\n /^(\\d{4})-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])T([01][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])(\\.\\d+)?(Z|[+-][0-2][0-9]:[0-5][0-9])?$/;\nexport const dateReviver = (key: string, value: string): string | Date => {\n if (typeof value === \"string\" && ISO_8601.test(value)) {\n return new Date(value);\n }\n return value;\n};\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@rotorsoft/act-pg",
3
3
  "type": "module",
4
- "version": "0.2.0",
4
+ "version": "0.3.0",
5
5
  "description": "act pg adapters",
6
6
  "author": "rotorsoft",
7
7
  "license": "MIT",
@@ -13,22 +13,34 @@
13
13
  "files": [
14
14
  "dist"
15
15
  ],
16
+ "main": "./dist/index.cjs",
17
+ "module": "./dist/index.js",
18
+ "types": "./dist/@types/index.d.ts",
16
19
  "exports": {
17
20
  ".": {
18
- "default": "./dist/index.js",
19
- "devmode": "./src/index.ts"
21
+ "types": "./dist/@types/index.d.ts",
22
+ "import": "./dist/index.js",
23
+ "require": "./dist/index.cjs"
20
24
  }
21
25
  },
26
+ "sideEffects": false,
27
+ "engines": {
28
+ "node": ">=18"
29
+ },
30
+ "publishConfig": {
31
+ "access": "public"
32
+ },
22
33
  "dependencies": {
23
- "pg": "^8.16.0",
24
- "zod": "^3.25.64",
25
- "@rotorsoft/act": "0.3.0"
34
+ "pg": "^8.16.2",
35
+ "zod": "^3.25.67",
36
+ "@rotorsoft/act": "0.4.0"
26
37
  },
27
38
  "devDependencies": {
28
39
  "@types/pg": "^8.15.4"
29
40
  },
30
41
  "scripts": {
31
42
  "clean": "rm -rf dist",
32
- "build": "npx tsc --build"
43
+ "types": "tsc --build --emitDeclarationOnly",
44
+ "build": "pnpm clean && tsup && pnpm types"
33
45
  }
34
46
  }
@@ -1 +0,0 @@
1
- {"version":3,"file":"PostgresStore.d.ts","sourceRoot":"","sources":["../src/PostgresStore.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,SAAS,EACT,SAAS,EACT,KAAK,EACL,OAAO,EACP,KAAK,EACL,OAAO,EACP,KAAK,EACN,MAAM,gBAAgB,CAAC;AAYxB,qBAAa,aAAc,YAAW,KAAK;IAIvC,QAAQ,CAAC,KAAK,EAAE,MAAM;IACtB,QAAQ,CAAC,WAAW;IAJtB,OAAO,CAAC,KAAK,CAAuB;gBAGzB,KAAK,EAAE,MAAM,EACb,WAAW,SAAS;IAEzB,OAAO;IAIP,IAAI;IAKJ,IAAI;IAKJ,KAAK,CAAC,CAAC,SAAS,OAAO,EAC3B,QAAQ,EAAE,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,KAAK,IAAI,EAChD,KAAK,CAAC,EAAE,KAAK,EACb,SAAS,UAAQ;IAmEb,MAAM,CAAC,CAAC,SAAS,OAAO,EAC5B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,OAAO,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,EAC3B,IAAI,EAAE,SAAS,EACf,eAAe,CAAC,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;IA2DpB,KAAK,CAAC,CAAC,SAAS,OAAO,EAAE,KAAK,EAAE,MAAM;;;;IAqBtC,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE;;;;;;;IAwDrB,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE;CA6B1B"}
@@ -1,208 +0,0 @@
1
- import { ConcurrencyError, SNAP_EVENT, logger } from "@rotorsoft/act";
2
- import pg from "pg";
3
- import { config } from "./config";
4
- import { seed_store } from "./seed";
5
- import { dateReviver } from "./utils";
6
- const { Pool, types } = pg;
7
- types.setTypeParser(types.builtins.JSONB, (val) => JSON.parse(val, dateReviver));
8
- export class PostgresStore {
9
- table;
10
- leaseMillis;
11
- _pool = new Pool(config.pg);
12
- constructor(table, leaseMillis = 30_000) {
13
- this.table = table;
14
- this.leaseMillis = leaseMillis;
15
- }
16
- async dispose() {
17
- await this._pool.end();
18
- }
19
- async seed() {
20
- const seed = seed_store(this.table);
21
- await this._pool.query(seed);
22
- }
23
- async drop() {
24
- await this._pool.query(`DROP TABLE IF EXISTS "${this.table}"`);
25
- await this._pool.query(`DROP TABLE IF EXISTS "${this.table}_streams"`);
26
- }
27
- async query(callback, query, withSnaps = false) {
28
- const { stream, names, before, after, limit, created_before, created_after, backward, correlation, } = query || {};
29
- let sql = `SELECT * FROM "${this.table}" WHERE`;
30
- const values = [];
31
- if (withSnaps)
32
- sql = sql.concat(` id>=COALESCE((SELECT id
33
- FROM "${this.table}"
34
- WHERE stream='${stream}' AND name='${SNAP_EVENT}'
35
- ORDER BY id DESC LIMIT 1), 0)
36
- AND stream='${stream}'`);
37
- else if (query) {
38
- if (typeof after !== "undefined") {
39
- values.push(after);
40
- sql = sql.concat(" id>$1");
41
- }
42
- else
43
- sql = sql.concat(" id>-1");
44
- if (stream) {
45
- values.push(stream);
46
- sql = sql.concat(` AND stream=$${values.length}`);
47
- }
48
- if (names && names.length) {
49
- values.push(names);
50
- sql = sql.concat(` AND name = ANY($${values.length})`);
51
- }
52
- if (before) {
53
- values.push(before);
54
- sql = sql.concat(` AND id<$${values.length}`);
55
- }
56
- if (created_after) {
57
- values.push(created_after.toISOString());
58
- sql = sql.concat(` AND created>$${values.length}`);
59
- }
60
- if (created_before) {
61
- values.push(created_before.toISOString());
62
- sql = sql.concat(` AND created<$${values.length}`);
63
- }
64
- if (correlation) {
65
- values.push(correlation);
66
- sql = sql.concat(` AND meta->>'correlation'=$${values.length}`);
67
- }
68
- }
69
- sql = sql.concat(` ORDER BY id ${backward ? "DESC" : "ASC"}`);
70
- if (limit) {
71
- values.push(limit);
72
- sql = sql.concat(` LIMIT $${values.length}`);
73
- }
74
- const result = await this._pool.query(sql, values);
75
- for (const row of result.rows)
76
- callback(row);
77
- return result.rowCount ?? 0;
78
- }
79
- async commit(stream, msgs, meta, expectedVersion) {
80
- const client = await this._pool.connect();
81
- let version = -1;
82
- try {
83
- await client.query("BEGIN");
84
- const last = await client.query(`SELECT version FROM "${this.table}" WHERE stream=$1 ORDER BY version DESC LIMIT 1`, [stream]);
85
- version = last.rowCount ? last.rows[0].version : -1;
86
- if (expectedVersion && version !== expectedVersion)
87
- throw new ConcurrencyError(version, msgs, expectedVersion);
88
- const committed = await Promise.all(msgs.map(async ({ name, data }) => {
89
- version++;
90
- const sql = `
91
- INSERT INTO "${this.table}"(name, data, stream, version, meta)
92
- VALUES($1, $2, $3, $4, $5) RETURNING *`;
93
- const vals = [name, data, stream, version, meta];
94
- const { rows } = await client.query(sql, vals);
95
- return rows.at(0);
96
- }));
97
- await client
98
- .query(`
99
- NOTIFY "${this.table}", '${JSON.stringify({
100
- operation: "INSERT",
101
- id: committed[0].name,
102
- position: committed[0].id,
103
- })}';
104
- COMMIT;
105
- `)
106
- .catch((error) => {
107
- logger.error(error);
108
- throw new ConcurrencyError(version, msgs, expectedVersion || -1);
109
- });
110
- return committed;
111
- }
112
- catch (error) {
113
- await client.query("ROLLBACK").catch(() => { });
114
- throw error;
115
- }
116
- finally {
117
- client.release();
118
- }
119
- }
120
- async fetch(limit) {
121
- const { rows } = await this._pool.query(`
122
- SELECT stream, at
123
- FROM "${this.table}_streams"
124
- WHERE blocked=false
125
- ORDER BY at ASC
126
- LIMIT $1::integer
127
- `, [limit]);
128
- const after = rows.length
129
- ? rows.reduce((min, r) => Math.min(min, r.at), Number.MAX_SAFE_INTEGER)
130
- : -1;
131
- const events = [];
132
- await this.query((e) => events.push(e), { after, limit });
133
- return { streams: rows.map(({ stream }) => stream), events };
134
- }
135
- async lease(leases) {
136
- const { by, at } = leases.at(0);
137
- const streams = leases.map(({ stream }) => stream);
138
- const client = await this._pool.connect();
139
- try {
140
- await client.query("BEGIN");
141
- // insert new streams
142
- await client.query(`
143
- INSERT INTO "${this.table}_streams" (stream)
144
- SELECT UNNEST($1::text[])
145
- ON CONFLICT (stream) DO NOTHING
146
- `, [streams]);
147
- // set leases
148
- const { rows } = await client.query(`
149
- WITH free AS (
150
- SELECT * FROM "${this.table}_streams"
151
- WHERE stream = ANY($1::text[]) AND (leased_by IS NULL OR leased_until <= NOW())
152
- FOR UPDATE
153
- )
154
- UPDATE "${this.table}_streams" U
155
- SET
156
- leased_by = $2::uuid,
157
- leased_at = $3::integer,
158
- leased_until = NOW() + ($4::integer || ' milliseconds')::interval
159
- FROM free
160
- WHERE U.stream = free.stream
161
- RETURNING U.stream, U.leased_at, U.retry
162
- `, [streams, by, at, this.leaseMillis]);
163
- await client.query("COMMIT");
164
- return rows.map(({ stream, leased_at, retry }) => ({
165
- stream,
166
- by,
167
- at: leased_at,
168
- retry,
169
- block: false,
170
- }));
171
- }
172
- catch (error) {
173
- await client.query("ROLLBACK").catch(() => { });
174
- throw error;
175
- }
176
- finally {
177
- client.release();
178
- }
179
- }
180
- async ack(leases) {
181
- const client = await this._pool.connect();
182
- try {
183
- await client.query("BEGIN");
184
- for (const { stream, by, at, retry, block } of leases) {
185
- await client.query(`UPDATE "${this.table}_streams"
186
- SET
187
- at = $3::integer,
188
- retry = $4::integer,
189
- blocked = $5::boolean,
190
- leased_by = NULL,
191
- leased_at = NULL,
192
- leased_until = NULL
193
- WHERE
194
- stream = $1::text
195
- AND leased_by = $2::uuid`, [stream, by, at, retry, block]);
196
- }
197
- await client.query("COMMIT");
198
- }
199
- catch {
200
- // leased_until fallback
201
- await client.query("ROLLBACK").catch(() => { });
202
- }
203
- finally {
204
- client.release();
205
- }
206
- }
207
- }
208
- //# sourceMappingURL=PostgresStore.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"PostgresStore.js","sourceRoot":"","sources":["../src/PostgresStore.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;EAoBlB,CAAC"}
package/dist/config.js DELETED
@@ -1,21 +0,0 @@
1
- import { extend, config as target } from "@rotorsoft/act";
2
- import { z } from "zod/v4";
3
- const { PG_HOST, PG_USER, PG_PASSWORD, PG_DATABASE, PG_PORT } = process.env;
4
- export const config = extend({
5
- pg: {
6
- host: PG_HOST || "localhost",
7
- user: PG_USER || "postgres",
8
- password: PG_PASSWORD || "postgres",
9
- database: PG_DATABASE || "postgres",
10
- port: Number.parseInt(PG_PORT || "5432"),
11
- },
12
- }, z.object({
13
- pg: z.object({
14
- host: z.string().min(1),
15
- user: z.string().min(1),
16
- password: z.string().min(1),
17
- database: z.string().min(1),
18
- port: z.number().int().min(1000).max(65535),
19
- }),
20
- }), target());
21
- //# sourceMappingURL=config.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAE3B,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC;AAE5E,MAAM,CAAC,MAAM,MAAM,GAAG,MAAM,CAC1B;IACE,EAAE,EAAE;QACF,IAAI,EAAE,OAAO,IAAI,WAAW;QAC5B,IAAI,EAAE,OAAO,IAAI,UAAU;QAC3B,QAAQ,EAAE,WAAW,IAAI,UAAU;QACnC,QAAQ,EAAE,WAAW,IAAI,UAAU;QACnC,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,OAAO,IAAI,MAAM,CAAC;KACzC;CACF,EACD,CAAC,CAAC,MAAM,CAAC;IACP,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC;QACX,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QACvB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QACvB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3B,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC;KAC5C,CAAC;CACH,CAAC,EACF,MAAM,EAAE,CACT,CAAC"}
package/dist/index.d.ts DELETED
@@ -1,4 +0,0 @@
1
- /** @module act-pg */
2
- export * from "./config";
3
- export * from "./PostgresStore";
4
- //# sourceMappingURL=index.d.ts.map