@rotorsoft/act-pg 1.13.5 → 1.13.7
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/.tsbuildinfo +1 -1
- package/dist/@types/postgres-store.d.ts.map +1 -1
- package/dist/@types/utils.d.ts.map +1 -1
- package/dist/index.cjs +30 -8
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +30 -8
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"postgres-store.d.ts","sourceRoot":"","sources":["../../src/postgres-store.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,YAAY,EACZ,SAAS,EACT,SAAS,EACT,KAAK,EAEL,OAAO,EACP,cAAc,EACd,KAAK,EACL,iBAAiB,EACjB,YAAY,EACZ,kBAAkB,EAClB,MAAM,EACN,OAAO,EACP,KAAK,EACL,iBAAiB,EACjB,YAAY,EACZ,cAAc,EACd,WAAW,EACZ,MAAM,gBAAgB,CAAC;AAQxB,OAAO,EAEL,KAAK,UAAU,EAGhB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"postgres-store.d.ts","sourceRoot":"","sources":["../../src/postgres-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAkBA,eAAO,MAAM,WAAW,
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAkBA,eAAO,MAAM,WAAW,SAAU,MAAM,SAAS,MAAM,KAAG,MAAM,GAAG,IAKlE,CAAC"}
|
package/dist/index.cjs
CHANGED
|
@@ -53,10 +53,13 @@ var dateReviver = (_key, value) => {
|
|
|
53
53
|
var logger = (0, import_act.log)();
|
|
54
54
|
var SOURCE_METACHARACTER_CLASS = "[]^$.*+?()[{}|\\\\]";
|
|
55
55
|
var { Pool, types } = import_pg.default;
|
|
56
|
-
types.
|
|
57
|
-
|
|
58
|
-
(val) => JSON.parse(val, dateReviver)
|
|
59
|
-
|
|
56
|
+
var JSONB_OID = types.builtins.JSONB;
|
|
57
|
+
var scopedTypes = {
|
|
58
|
+
getTypeParser: ((oid, format) => oid === JSONB_OID ? (val) => JSON.parse(val, dateReviver) : types.getTypeParser(
|
|
59
|
+
oid,
|
|
60
|
+
format
|
|
61
|
+
))
|
|
62
|
+
};
|
|
60
63
|
var SAFE_IDENTIFIER = /^[a-zA-Z_][a-zA-Z0-9_]*$/;
|
|
61
64
|
var PG_UNIQUE_VIOLATION = "23505";
|
|
62
65
|
var NOTIFY_CHANNEL_PREFIX = "act_commit";
|
|
@@ -198,7 +201,7 @@ var PostgresStore = class {
|
|
|
198
201
|
pii_encryption: ___,
|
|
199
202
|
...poolConfig
|
|
200
203
|
} = this.config;
|
|
201
|
-
this._pool = new Pool(poolConfig);
|
|
204
|
+
this._pool = new Pool({ ...poolConfig, types: scopedTypes });
|
|
202
205
|
this._fqt = `"${this.config.schema}"."${this.config.table}"`;
|
|
203
206
|
this._fqs = `"${this.config.schema}"."${this.config.table}_streams"`;
|
|
204
207
|
this._channel = notify_channel(this.config.schema, this.config.table);
|
|
@@ -446,11 +449,11 @@ var PostgresStore = class {
|
|
|
446
449
|
query.stream_exact ? `stream = $${values.length}` : `stream ~ $${values.length}`
|
|
447
450
|
);
|
|
448
451
|
}
|
|
449
|
-
if (names
|
|
452
|
+
if (names !== void 0) {
|
|
450
453
|
values.push(names);
|
|
451
454
|
conditions.push(`name = ANY($${values.length})`);
|
|
452
455
|
}
|
|
453
|
-
if (before) {
|
|
456
|
+
if (before !== void 0) {
|
|
454
457
|
values.push(before);
|
|
455
458
|
conditions.push(`id<$${values.length}`);
|
|
456
459
|
}
|
|
@@ -605,6 +608,11 @@ var PostgresStore = class {
|
|
|
605
608
|
const { rows } = await client.query(
|
|
606
609
|
`
|
|
607
610
|
WITH
|
|
611
|
+
-- Plain read of the eligible frontier \u2014 no row lock here. A CTE
|
|
612
|
+
-- carrying FOR UPDATE never inlines, so locking it would materialize
|
|
613
|
+
-- and lock EVERY claimable stream for this transaction, starving
|
|
614
|
+
-- overlapping competing consumers. We only lock the small
|
|
615
|
+
-- lagging+leading candidate slice, down in the "locked" CTE.
|
|
608
616
|
available AS (
|
|
609
617
|
SELECT stream, source, at, priority, lane
|
|
610
618
|
FROM ${this._fqs} s
|
|
@@ -628,7 +636,6 @@ var PostgresStore = class {
|
|
|
628
636
|
)
|
|
629
637
|
LIMIT 1
|
|
630
638
|
))
|
|
631
|
-
FOR UPDATE SKIP LOCKED
|
|
632
639
|
),
|
|
633
640
|
-- Priority lanes (ACT-102): higher priority first, then
|
|
634
641
|
-- lagging-watermark order. With everyone at priority=0 the
|
|
@@ -650,6 +657,20 @@ var PostgresStore = class {
|
|
|
650
657
|
SELECT DISTINCT ON (stream) stream, source, at, lane, lagging
|
|
651
658
|
FROM (SELECT * FROM lag UNION ALL SELECT * FROM lead) t
|
|
652
659
|
ORDER BY stream, at
|
|
660
|
+
),
|
|
661
|
+
-- Lock ONLY the <= lagging+leading candidate rows. The
|
|
662
|
+
-- lease-eligibility predicate is re-asserted here under the lock so a
|
|
663
|
+
-- lease acquired by a competing worker between the unlocked read and
|
|
664
|
+
-- this lock is never stolen. Competing workers SKIP-LOCK just this
|
|
665
|
+
-- slice, not the whole frontier, and claim other eligible streams.
|
|
666
|
+
locked AS (
|
|
667
|
+
SELECT s2.stream
|
|
668
|
+
FROM ${this._fqs} s2
|
|
669
|
+
WHERE s2.stream IN (SELECT stream FROM combined)
|
|
670
|
+
AND s2.blocked = false
|
|
671
|
+
AND (s2.leased_by IS NULL OR s2.leased_until <= NOW())
|
|
672
|
+
AND (s2.deferred_at IS NULL OR s2.deferred_at <= NOW())
|
|
673
|
+
FOR UPDATE OF s2 SKIP LOCKED
|
|
653
674
|
)
|
|
654
675
|
UPDATE ${this._fqs} s
|
|
655
676
|
SET
|
|
@@ -658,6 +679,7 @@ var PostgresStore = class {
|
|
|
658
679
|
retry = s.retry + 1
|
|
659
680
|
FROM combined c
|
|
660
681
|
WHERE s.stream = c.stream
|
|
682
|
+
AND s.stream IN (SELECT stream FROM locked)
|
|
661
683
|
RETURNING s.stream, s.source, s.at, s.retry, c.lagging, s.lane
|
|
662
684
|
`,
|
|
663
685
|
params
|