pipework 0.22.0 → 0.23.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 CHANGED
@@ -1,5 +1,11 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.23.0
4
+
5
+ - **Fix: a worker whose claims are failing is now loud instead of silent.** The claim loop caught every error from `queue.claim()` with a bare `catch` and slept the poll interval, so expired credentials, schema drift, a poisoned claim query, and a lost SERIALIZABLE all looked exactly like an idle queue — no log line to grep for, nothing that moved. Each failing claim is now logged through the base logger with its Postgres SQLSTATE and a running count of consecutive failures; a successful claim clears the count. After `maxConsecutiveClaimFailures` (new `surface.worker()` option, default 10) the surface logs fatal, stops its claim loops, and sets a non-zero process exit code, so a worker that can never claim again dies instead of polling forever. A claim aborted by shutdown is not a failure and is not counted.
6
+
7
+ - **Fix: `pipe.serializable()` inside an open transaction is refused by name rather than silently weakened.** Postgres rejects `SET TRANSACTION ISOLATION LEVEL` on a transaction that has already run a query (25001), and a nested transaction is a savepoint that inherits the outer, weaker isolation level. Both cases now throw a pipework error naming the condition and pointing at the outermost transaction. This is what the exclusion claim needs: it requires SERIALIZABLE to avoid write skew, and it can no longer run at a weaker level — or fail with a bare 25001 on stderr — without saying so.
8
+
3
9
  ## 0.22.0
4
10
 
5
11
  - **New: `PIPEWORK_CONFIG` names the config file to load, for callers that deliberately set it.** A consumer's vitest fork had no way to learn its database URLs without importing the whole application graph through the real `pipework.config.ts` — measured at roughly 150x the cost of the template clones the run actually needed. Setting `PIPEWORK_CONFIG` points `discoverInstance` at a specific config file (resolved against the cwd when relative), so a test runner can hand its forks a slim test-only manifold while every non-test path still discovers the real config by walking up for `pipework.config.ts`. A variable naming a file that does not exist is a `ConfigError` quoting the variable and the resolved path — never a silent fall-through to discovery. Nothing in pipework sets or defaults it, so the lint resolver, `check`, and `generate` are untouched; with the variable unset, behavior is unchanged. The test fork consumes the variable: `discoverForTestFork` unsets it as soon as discovery succeeds, so a test that spawns another package's `pipework migrate` cannot inherit this fork's config and migrate the wrong package against the wrong manifold.
@@ -109,6 +109,8 @@ export interface WorkerSurfaceConfig {
109
109
  readonly listen?: boolean;
110
110
  readonly reaper?: ReaperConfig | boolean;
111
111
  readonly shutdownDeadlineMs?: number;
112
+ /** Consecutive failing claims that end the worker surface (fatal log, non-zero exit code). Default 10. */
113
+ readonly maxConsecutiveClaimFailures?: number;
112
114
  readonly timeouts?: Readonly<Record<number, number>>;
113
115
  }
114
116
  export interface ReaperConfig {
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/core/surface/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/core/surface/types.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../../src/core/surface/worker.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAiB,mBAAmB,EAAkB,MAAM,YAAY,CAAA;AAWpG,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,mBAAmB,GAAG,cAAc,CA4K/E"}
1
+ {"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../../src/core/surface/worker.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAiB,mBAAmB,EAAkB,MAAM,YAAY,CAAA;AAYpG,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,mBAAmB,GAAG,cAAc,CAsM/E"}
@@ -4,6 +4,7 @@ import { createQueue } from '../../async/jobs/queue.js';
4
4
  import { abortableDelay } from '../../async/jobs/abortable-delay.js';
5
5
  import { executeJob } from '../../async/jobs/execute.js';
6
6
  import { getBaseLogger } from '../logging/index.js';
7
+ import { pgErrorCode } from '../../data/db/serializable.js';
7
8
  import { sql } from '../../data/db/sql.js';
8
9
  export function createWorkerSurface(config) {
9
10
  const databases = collectWorkerDatabases(config);
@@ -44,17 +45,23 @@ export function createWorkerSurface(config) {
44
45
  const pollIntervalMs = config.pollIntervalMs ?? 1000;
45
46
  const shutdownDeadlineMs = config.shutdownDeadlineMs ?? 30_000;
46
47
  const priorityTimeouts = config.timeouts ?? {};
48
+ const maxConsecutiveClaimFailures = config.maxConsecutiveClaimFailures ?? 10;
47
49
  const shouldRun = { value: true };
48
50
  // claim() retries transient conflicts until clean (unbounded), so
49
51
  // shouldRun alone cannot end a loop stuck under contention — the abort
50
52
  // signal is what makes shutdown observable inside claim and the sleeps.
51
53
  const shutdown = new AbortController();
52
54
  let inFlight = 0;
55
+ // A claim that throws is never a quiet queue: it is logged with its
56
+ // Postgres code and counted. A successful claim clears the count; enough
57
+ // consecutive failures end the surface rather than let it poll forever.
58
+ let consecutiveClaimFailures = 0;
53
59
  const claimLoop = async () => {
54
60
  const workerId = randomUUID();
55
61
  while (shouldRun.value) {
56
62
  try {
57
63
  const claimed = await queue.claim(db, workerId, shutdown.signal);
64
+ consecutiveClaimFailures = 0;
58
65
  if (claimed === null) {
59
66
  await abortableDelay(pollIntervalMs, shutdown.signal);
60
67
  continue;
@@ -88,7 +95,18 @@ export function createWorkerSurface(config) {
88
95
  inFlight--;
89
96
  }
90
97
  }
91
- catch {
98
+ catch (err) {
99
+ if (shutdown.signal.aborted)
100
+ return;
101
+ consecutiveClaimFailures++;
102
+ logger.error({ err, pgCode: pgErrorCode(err), consecutiveFailures: consecutiveClaimFailures, maxConsecutiveClaimFailures }, 'Job claim failed');
103
+ if (consecutiveClaimFailures >= maxConsecutiveClaimFailures) {
104
+ logger.fatal({ err, pgCode: pgErrorCode(err), consecutiveFailures: consecutiveClaimFailures }, `Worker surface stopping: ${String(consecutiveClaimFailures)} consecutive claim failures`);
105
+ shouldRun.value = false;
106
+ shutdown.abort();
107
+ process.exitCode = 1;
108
+ return;
109
+ }
92
110
  await abortableDelay(pollIntervalMs, shutdown.signal);
93
111
  }
94
112
  }
@@ -1 +1 @@
1
- {"version":3,"file":"worker.js","sourceRoot":"","sources":["../../../src/core/surface/worker.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"worker.js","sourceRoot":"","sources":["../../../src/core/surface/worker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAGxC,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAA;AAEpE,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAA;AAExD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAA;AAC3D,OAAO,EAAE,GAAG,EAAE,MAAM,sBAAsB,CAAA;AAE1C,MAAM,UAAU,mBAAmB,CAAC,MAA2B;IAC7D,MAAM,SAAS,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAA;IAChD,MAAM,QAAQ,GAAG,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IAC7C,mBAAmB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IAChC,MAAM,IAAI,GAA2B,EAAE,CAAA;IACvC,4EAA4E;IAC5E,6EAA6E;IAC7E,4EAA4E;IAC5E,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IAEvC,MAAM,OAAO,GAAmB;QAC9B,IAAI,EAAE,QAAQ;QACd,QAAQ,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,IAAI,EAAE;QAErD,YAAY,CAAC,CAAyB;YACpC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;YACtB,OAAO,OAAO,CAAA;QAChB,CAAC;QAED,KAAK,CAAC,KAAK,CAAC,OAAuB;YACjC,MAAM,MAAM,GAAG,aAAa,EAAE,CAAA;YAC9B,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,IAAI,OAAO,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAA;YACtE,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;YAChD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAA;YAC/C,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAA;YAEvB,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,CAAA,UAAU,CAAC,CAAA;YAE/B,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;gBAC3B,MAAM,OAAO,GAAG,IAA0I,CAAA;gBAC1J,MAAM,YAAY,GAAiB;oBACjC,KAAK,CAAC,MAAM,CAAC,OAAe,EAAE,EAA6B;wBACzD,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC,CAAA;wBACpD,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAA;oBAC3C,CAAC;iBACF,CAAA;gBACD,MAAM,KAAK,CAAC,aAAa,CAAC,YAAY,CAAC,CAAA;gBACvC,MAAM,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAA;YACxD,CAAC;YAED,MAAM,QAAQ,GAAG,kBAAkB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;YAChD,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,IAAI,CAAC,CAAA;YAC3C,MAAM,cAAc,GAAG,MAAM,CAAC,cAAc,IAAI,IAAI,CAAA;YACpD,MAAM,kBAAkB,GAAG,MAAM,CAAC,kBAAkB,IAAI,MAAM,CAAA;YAC9D,MAAM,gBAAgB,GAAG,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAA;YAE9C,MAAM,2BAA2B,GAAG,MAAM,CAAC,2BAA2B,IAAI,EAAE,CAAA;YAE5E,MAAM,SAAS,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,CAAA;YACjC,kEAAkE;YAClE,uEAAuE;YACvE,wEAAwE;YACxE,MAAM,QAAQ,GAAG,IAAI,eAAe,EAAE,CAAA;YACtC,IAAI,QAAQ,GAAG,CAAC,CAAA;YAChB,oEAAoE;YACpE,yEAAyE;YACzE,wEAAwE;YACxE,IAAI,wBAAwB,GAAG,CAAC,CAAA;YAEhC,MAAM,SAAS,GAAG,KAAK,IAAI,EAAE;gBAC3B,MAAM,QAAQ,GAAG,UAAU,EAAE,CAAA;gBAC7B,OAAO,SAAS,CAAC,KAAK,EAAE,CAAC;oBACvB,IAAI,CAAC;wBACH,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,EAAE,EAAE,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAA;wBAChE,wBAAwB,GAAG,CAAC,CAAA;wBAC5B,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;4BACrB,MAAM,cAAc,CAAC,cAAc,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAA;4BACrD,SAAQ;wBACV,CAAC;wBAED,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;wBAE1C,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;4BAC1B,MAAM,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,IAAI,KAAK,CACxC,kDAAkD,OAAO,CAAC,IAAI,QAAQ;gCACtE,uBAAuB,CAAC,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;gCAC1D,mEAAmE,CACpE,CAAC,CAAA;4BACF,SAAQ;wBACV,CAAC;wBAED,QAAQ,EAAE,CAAA;wBACV,MAAM,iBAAiB,GAAG,WAAW,CAAC,GAAG,EAAE;4BACzC,KAAK,KAAK,CAAC,SAAS,CAAC,EAAE,EAAE,OAAO,CAAC,EAAE,CAAC,CAAA;wBACtC,CAAC,EAAE,MAAM,CAAC,CAAA;wBAEV,IAAI,CAAC;4BACH,MAAM,SAAS,GAAG,sBAAsB,CAAC,OAAO,EAAE,OAAO,EAAE,gBAAgB,CAAC,CAAA;4BAC5E,MAAM,MAAM,GAAG,MAAM,kBAAkB,CACrC,GAAG,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE;gCACxB,QAAQ,EAAE,OAA8B;gCACxC,KAAK,EAAE,OAAO,CAAC,EAAE;gCACjB,OAAO,EAAE,OAAO,CAAC,IAAI;gCACrB,KAAK,EAAE,OAAO,CAAC,OAAO;6BACvB,CAAC,EACF,SAAS,EACT,OAAO,CAAC,IAAI,EACZ,OAAO,CAAC,EAAE,CACX,CAAA;4BACD,MAAM,KAAK,CAAC,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,CAAA;wBAC9C,CAAC;wBAAC,OAAO,GAAG,EAAE,CAAC;4BACb,MAAM,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,GAAG,CAAC,CAAA;wBACvC,CAAC;gCAAS,CAAC;4BACT,aAAa,CAAC,iBAAiB,CAAC,CAAA;4BAChC,QAAQ,EAAE,CAAA;wBACZ,CAAC;oBACH,CAAC;oBAAC,OAAO,GAAG,EAAE,CAAC;wBACb,IAAI,QAAQ,CAAC,MAAM,CAAC,OAAO;4BAAE,OAAM;wBAEnC,wBAAwB,EAAE,CAAA;wBAC1B,MAAM,CAAC,KAAK,CACV,EAAE,GAAG,EAAE,MAAM,EAAE,WAAW,CAAC,GAAG,CAAC,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,2BAA2B,EAAE,EAC7G,kBAAkB,CACnB,CAAA;wBAED,IAAI,wBAAwB,IAAI,2BAA2B,EAAE,CAAC;4BAC5D,MAAM,CAAC,KAAK,CACV,EAAE,GAAG,EAAE,MAAM,EAAE,WAAW,CAAC,GAAG,CAAC,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,EAChF,4BAA4B,MAAM,CAAC,wBAAwB,CAAC,6BAA6B,CAC1F,CAAA;4BACD,SAAS,CAAC,KAAK,GAAG,KAAK,CAAA;4BACvB,QAAQ,CAAC,KAAK,EAAE,CAAA;4BAChB,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAA;4BACpB,OAAM;wBACR,CAAC;wBAED,MAAM,cAAc,CAAC,cAAc,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAA;oBACvD,CAAC;gBACH,CAAC;YACH,CAAC,CAAA;YAED,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,GAAG,EAAE,CAAC,SAAS,EAAE,CAAC,CAAA;YAEtE,IAAI,WAAW,GAA0C,IAAI,CAAA;YAC7D,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;gBAC3D,MAAM,gBAAgB,GAAG,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ;oBACxD,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC;oBACtC,CAAC,CAAC,MAAM,CAAA;gBACV,WAAW,GAAG,WAAW,CAAC,GAAG,EAAE;oBAC7B,KAAK,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE;wBACjC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;4BACd,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,UAAU,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,CAAA;wBACxE,CAAC;oBACH,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;wBACf,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,eAAe,CAAC,CAAA;oBACxC,CAAC,CAAC,CAAA;gBACJ,CAAC,EAAE,gBAAgB,CAAC,CAAA;gBACpB,WAAW,CAAC,KAAK,EAAE,CAAA;YACrB,CAAC;YAED,OAAO;gBACL,IAAI,EAAE,QAAQ;gBAEd,KAAK,CAAC,IAAI;oBACR,MAAM,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,kBAAkB,EAAE,EAAE,yBAAyB,CAAC,CAAA;oBACpF,SAAS,CAAC,KAAK,GAAG,KAAK,CAAA;oBACvB,QAAQ,CAAC,KAAK,EAAE,CAAA;oBAEhB,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;wBACzB,aAAa,CAAC,WAAW,CAAC,CAAA;wBAC1B,WAAW,GAAG,IAAI,CAAA;oBACpB,CAAC;oBAED,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;wBAC3B,MAAM,KAAK,CAAC,YAAY,EAAE,CAAA;oBAC5B,CAAC;oBAED,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,kBAAkB,CAAA;oBAEhD,8DAA8D;oBAC9D,mEAAmE;oBACnE,iEAAiE;oBACjE,0CAA0C;oBAC1C,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAA;oBACxC,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC;wBACrC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC,OAAO,IAAI,CAAA,CAAC,CAAC,CAAC;wBAC3E,cAAc,CAAC,kBAAkB,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC;qBACxE,CAAC,CAAA;oBACF,IAAI,CAAC,WAAW,EAAE,CAAC;wBACjB,MAAM,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAA;oBACtE,CAAC;oBAED,OAAO,QAAQ,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;wBAC7C,MAAM,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,4BAA4B,CAAC,CAAA;wBAC3F,MAAM,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;oBAC5D,CAAC;oBAED,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;wBACjB,MAAM,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,EAAE,+CAA+C,CAAC,CAAA;oBAC5E,CAAC;yBAAM,CAAC;wBACN,MAAM,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAA;oBAC/C,CAAC;gBACH,CAAC;aACF,CAAA;QACH,CAAC;KACF,CAAA;IAED,OAAO,OAAO,CAAA;AAChB,CAAC;AAED,SAAS,kBAAkB,CACzB,IAA0D;IAE1D,MAAM,KAAK,GAAG,IAAI,GAAG,EAAqD,CAAA;IAC1E,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,OAAO,CAAA;QAChC,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAChC,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;QACzB,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED,SAAS,mBAAmB,CAAC,IAA0D;IACrF,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAA;IAC9B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;YACjD,MAAM,IAAI,KAAK,CACb,wGAAwG;gBACxG,cAAc;gBACd,oEAAoE,CACrE,CAAA;QACH,CAAC;QACD,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CACb,kCAAkC,GAAG,CAAC,IAAI,CAAC,OAAO,0BAA0B;gBAC5E,iFAAiF;gBACjF,sCAAsC,CACvC,CAAA;QACH,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IAC5B,CAAC;AACH,CAAC;AAED,SAAS,sBAAsB,CAAC,MAA2B;IACzD,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAA;IAC7B,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QAClC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;IAC1B,CAAC;SAAM,CAAC;QACN,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;IACrB,CAAC;IACD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QAC9B,KAAK,MAAM,EAAE,IAAI,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACpC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACb,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,GAAG,CAAC,CAAA;AACjB,CAAC;AAED,SAAS,eAAe,CAAC,IAA0D;IACjF,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACrB,IAAI,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;YACvC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QAC5B,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED,SAAS,sBAAsB,CAC7B,OAAsC,EACtC,OAAkD,EAClD,gBAAkD;IAElD,MAAM,YAAY,GAAG,gBAAgB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;IACvD,IAAI,YAAY,KAAK,SAAS;QAAE,OAAO,YAAY,CAAA;IACnD,OAAO,OAAO,CAAC,IAAI,CAAC,UAAU,IAAI,SAAS,CAAA;AAC7C,CAAC;AAED,KAAK,UAAU,kBAAkB,CAC/B,EAAoB,EACpB,SAA6B,EAC7B,OAAe,EACf,KAAa;IAEb,IAAI,SAAS,KAAK,SAAS;QAAE,OAAO,EAAE,EAAE,CAAA;IAExC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC;QAChC,EAAE,EAAE;QACJ,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;YAC/B,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC5B,MAAM,CAAC,IAAI,KAAK,CACd,mBAAmB,OAAO,MAAM,KAAK,qBAAqB,SAAS,SAAS;oBAC5E,qEAAqE;oBACrE,qEAAqE,CACtE,CAAC,CAAA;YACJ,CAAC,EAAE,SAAS,CAAC,CAAA;YACb,KAAK,CAAC,KAAK,EAAE,CAAA;QACf,CAAC,CAAC;KACH,CAAC,CAAA;IAEF,OAAO,MAAM,CAAA;AACf,CAAC"}
@@ -4,6 +4,8 @@ export interface SerializableOptions {
4
4
  readonly maxAttempts?: number;
5
5
  readonly backoffMs?: number;
6
6
  }
7
+ /** The Postgres SQLSTATE carried by an error (or by its cause), or undefined for a non-Postgres error. */
8
+ export declare function pgErrorCode(err: unknown): unknown;
7
9
  /** True for Postgres serialization failures (40001) and deadlocks (40P01) — errors a retry can resolve. */
8
10
  export declare function isTransientConcurrencyError(err: unknown): boolean;
9
11
  /** Runs `fn` in a SERIALIZABLE transaction, retrying on serialization failures (40001) and deadlocks (40P01) with exponential backoff. */
@@ -1 +1 @@
1
- {"version":3,"file":"serializable.d.ts","sourceRoot":"","sources":["../../../src/data/db/serializable.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,YAAY,CAAA;AAEpC,yIAAyI;AACzI,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAC5B;AAYD,2GAA2G;AAC3G,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAGjE;AAED,0IAA0I;AAC1I,wBAAsB,YAAY,CAAC,CAAC,EAClC,EAAE,EAAE,EAAE,EACN,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,KAAK,OAAO,CAAC,CAAC,CAAC,EAC1B,OAAO,CAAC,EAAE,mBAAmB,GAC5B,OAAO,CAAC,CAAC,CAAC,CA6BZ"}
1
+ {"version":3,"file":"serializable.d.ts","sourceRoot":"","sources":["../../../src/data/db/serializable.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,YAAY,CAAA;AAEpC,yIAAyI;AACzI,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAC5B;AAMD,0GAA0G;AAC1G,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAKjD;AAED,2GAA2G;AAC3G,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAGjE;AAqBD,0IAA0I;AAC1I,wBAAsB,YAAY,CAAC,CAAC,EAClC,EAAE,EAAE,EAAE,EACN,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,KAAK,OAAO,CAAC,CAAC,CAAC,EAC1B,OAAO,CAAC,EAAE,mBAAmB,GAC5B,OAAO,CAAC,CAAC,CAAC,CAgCZ"}
@@ -1,19 +1,35 @@
1
1
  const PG_SERIALIZATION_FAILURE = '40001';
2
2
  const PG_DEADLOCK_DETECTED = '40P01';
3
- function extractPgCode(err) {
3
+ const PG_SET_TRANSACTION_AFTER_QUERY = '25001';
4
+ /** The Postgres SQLSTATE carried by an error (or by its cause), or undefined for a non-Postgres error. */
5
+ export function pgErrorCode(err) {
4
6
  if (typeof err !== 'object' || err === null)
5
7
  return undefined;
6
8
  if ('code' in err)
7
9
  return err.code;
8
10
  if ('cause' in err)
9
- return extractPgCode(err.cause);
11
+ return pgErrorCode(err.cause);
10
12
  return undefined;
11
13
  }
12
14
  /** True for Postgres serialization failures (40001) and deadlocks (40P01) — errors a retry can resolve. */
13
15
  export function isTransientConcurrencyError(err) {
14
- const code = extractPgCode(err);
16
+ const code = pgErrorCode(err);
15
17
  return code === PG_SERIALIZATION_FAILURE || code === PG_DEADLOCK_DETECTED;
16
18
  }
19
+ // Only a postgres.js transaction client exposes savepoint(), so its presence
20
+ // on the session's client means this db already sits inside an open
21
+ // transaction — a drizzle transaction object included.
22
+ function insideTransaction(db) {
23
+ const session = db.session;
24
+ return typeof session?.client?.savepoint === 'function';
25
+ }
26
+ function nestedSerializableError(cause) {
27
+ return new Error('[pipework] serializable() cannot run inside an open transaction.\n\n' +
28
+ ' Postgres refuses to raise the isolation level of a transaction that has\n' +
29
+ ' already run a query (25001), and a nested transaction is a savepoint that\n' +
30
+ ' inherits the outer, weaker level. Open the SERIALIZABLE transaction at the\n' +
31
+ ' outermost level instead of inside another one.\n', cause !== undefined ? { cause } : undefined);
32
+ }
17
33
  /** Runs `fn` in a SERIALIZABLE transaction, retrying on serialization failures (40001) and deadlocks (40P01) with exponential backoff. */
18
34
  export async function serializable(db, fn, options) {
19
35
  const maxAttempts = options?.maxAttempts ?? 3;
@@ -23,6 +39,8 @@ export async function serializable(db, fn, options) {
23
39
  ' pipe.serializable(db, fn) — default 3 attempts\n' +
24
40
  ' pipe.serializable(db, fn, { maxAttempts: 5 }) — custom attempts\n');
25
41
  }
42
+ if (insideTransaction(db))
43
+ throw nestedSerializableError();
26
44
  let lastError;
27
45
  for (let attempt = 0; attempt < maxAttempts; attempt++) {
28
46
  if (attempt > 0) {
@@ -33,6 +51,8 @@ export async function serializable(db, fn, options) {
33
51
  return await db.transaction(fn, { isolationLevel: 'serializable' });
34
52
  }
35
53
  catch (err) {
54
+ if (pgErrorCode(err) === PG_SET_TRANSACTION_AFTER_QUERY)
55
+ throw nestedSerializableError(err);
36
56
  if (isTransientConcurrencyError(err) && attempt < maxAttempts - 1) {
37
57
  lastError = err;
38
58
  continue;
@@ -1 +1 @@
1
- {"version":3,"file":"serializable.js","sourceRoot":"","sources":["../../../src/data/db/serializable.ts"],"names":[],"mappings":"AAQA,MAAM,wBAAwB,GAAG,OAAO,CAAA;AACxC,MAAM,oBAAoB,GAAG,OAAO,CAAA;AAEpC,SAAS,aAAa,CAAC,GAAY;IACjC,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,SAAS,CAAA;IAC7D,IAAI,MAAM,IAAI,GAAG;QAAE,OAAQ,GAAyB,CAAC,IAAI,CAAA;IACzD,IAAI,OAAO,IAAI,GAAG;QAAE,OAAO,aAAa,CAAE,GAA0B,CAAC,KAAK,CAAC,CAAA;IAC3E,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,2GAA2G;AAC3G,MAAM,UAAU,2BAA2B,CAAC,GAAY;IACtD,MAAM,IAAI,GAAG,aAAa,CAAC,GAAG,CAAC,CAAA;IAC/B,OAAO,IAAI,KAAK,wBAAwB,IAAI,IAAI,KAAK,oBAAoB,CAAA;AAC3E,CAAC;AAED,0IAA0I;AAC1I,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,EAAM,EACN,EAA0B,EAC1B,OAA6B;IAE7B,MAAM,WAAW,GAAG,OAAO,EAAE,WAAW,IAAI,CAAC,CAAA;IAC7C,MAAM,SAAS,GAAG,OAAO,EAAE,SAAS,IAAI,EAAE,CAAA;IAE1C,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CACb,0DAA0D;YAC1D,wEAAwE;YACxE,qEAAqE,CACtE,CAAA;IACH,CAAC;IAED,IAAI,SAAkB,CAAA;IACtB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,WAAW,EAAE,OAAO,EAAE,EAAE,CAAC;QACvD,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;YAChB,MAAM,IAAI,OAAO,CAAO,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,SAAS,GAAG,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;QACzF,CAAC;QACD,IAAI,CAAC;YACH,wJAAwJ;YACxJ,OAAO,MAAO,EAAU,CAAC,WAAW,CAAC,EAAE,EAAE,EAAE,cAAc,EAAE,cAAc,EAAE,CAAC,CAAA;QAC9E,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,2BAA2B,CAAC,GAAG,CAAC,IAAI,OAAO,GAAG,WAAW,GAAG,CAAC,EAAE,CAAC;gBAClE,SAAS,GAAG,GAAG,CAAA;gBACf,SAAQ;YACV,CAAC;YACD,MAAM,GAAG,CAAA;QACX,CAAC;IACH,CAAC;IACD,MAAM,SAAS,CAAA;AACjB,CAAC"}
1
+ {"version":3,"file":"serializable.js","sourceRoot":"","sources":["../../../src/data/db/serializable.ts"],"names":[],"mappings":"AAQA,MAAM,wBAAwB,GAAG,OAAO,CAAA;AACxC,MAAM,oBAAoB,GAAG,OAAO,CAAA;AACpC,MAAM,8BAA8B,GAAG,OAAO,CAAA;AAE9C,0GAA0G;AAC1G,MAAM,UAAU,WAAW,CAAC,GAAY;IACtC,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,SAAS,CAAA;IAC7D,IAAI,MAAM,IAAI,GAAG;QAAE,OAAQ,GAAyB,CAAC,IAAI,CAAA;IACzD,IAAI,OAAO,IAAI,GAAG;QAAE,OAAO,WAAW,CAAE,GAA0B,CAAC,KAAK,CAAC,CAAA;IACzE,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,2GAA2G;AAC3G,MAAM,UAAU,2BAA2B,CAAC,GAAY;IACtD,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,CAAA;IAC7B,OAAO,IAAI,KAAK,wBAAwB,IAAI,IAAI,KAAK,oBAAoB,CAAA;AAC3E,CAAC;AAED,6EAA6E;AAC7E,oEAAoE;AACpE,uDAAuD;AACvD,SAAS,iBAAiB,CAAC,EAAW;IACpC,MAAM,OAAO,GAAI,EAAyD,CAAC,OAAO,CAAA;IAClF,OAAO,OAAO,OAAO,EAAE,MAAM,EAAE,SAAS,KAAK,UAAU,CAAA;AACzD,CAAC;AAED,SAAS,uBAAuB,CAAC,KAAe;IAC9C,OAAO,IAAI,KAAK,CACd,sEAAsE;QACtE,6EAA6E;QAC7E,+EAA+E;QAC/E,gFAAgF;QAChF,oDAAoD,EACpD,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAC5C,CAAA;AACH,CAAC;AAED,0IAA0I;AAC1I,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,EAAM,EACN,EAA0B,EAC1B,OAA6B;IAE7B,MAAM,WAAW,GAAG,OAAO,EAAE,WAAW,IAAI,CAAC,CAAA;IAC7C,MAAM,SAAS,GAAG,OAAO,EAAE,SAAS,IAAI,EAAE,CAAA;IAE1C,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CACb,0DAA0D;YAC1D,wEAAwE;YACxE,qEAAqE,CACtE,CAAA;IACH,CAAC;IAED,IAAI,iBAAiB,CAAC,EAAE,CAAC;QAAE,MAAM,uBAAuB,EAAE,CAAA;IAE1D,IAAI,SAAkB,CAAA;IACtB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,WAAW,EAAE,OAAO,EAAE,EAAE,CAAC;QACvD,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;YAChB,MAAM,IAAI,OAAO,CAAO,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,SAAS,GAAG,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;QACzF,CAAC;QACD,IAAI,CAAC;YACH,wJAAwJ;YACxJ,OAAO,MAAO,EAAU,CAAC,WAAW,CAAC,EAAE,EAAE,EAAE,cAAc,EAAE,cAAc,EAAE,CAAC,CAAA;QAC9E,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,WAAW,CAAC,GAAG,CAAC,KAAK,8BAA8B;gBAAE,MAAM,uBAAuB,CAAC,GAAG,CAAC,CAAA;YAC3F,IAAI,2BAA2B,CAAC,GAAG,CAAC,IAAI,OAAO,GAAG,WAAW,GAAG,CAAC,EAAE,CAAC;gBAClE,SAAS,GAAG,GAAG,CAAA;gBACf,SAAQ;YACV,CAAC;YACD,MAAM,GAAG,CAAA;QACX,CAAC;IACH,CAAC;IACD,MAAM,SAAS,CAAA;AACjB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pipework",
3
- "version": "0.22.0",
3
+ "version": "0.23.0",
4
4
  "description": "TypeScript framework for multi-tenant SaaS applications. PostgreSQL-only.",
5
5
  "type": "module",
6
6
  "license": "MIT",