@adonis-agora/durable 0.59.0 → 0.60.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 +24 -0
- package/dist/assets/spa/assets/index-70hGzOnT.css +1 -0
- package/dist/assets/spa/assets/index-BI1EANJO.js +16 -0
- package/dist/assets/spa/assets/index-BI1EANJO.js.map +1 -0
- package/dist/assets/spa/index.html +2 -2
- package/dist/providers/durable_provider.d.ts.map +1 -1
- package/dist/providers/durable_provider.js +3 -0
- package/dist/providers/durable_provider.js.map +1 -1
- package/dist/src/codec-state-store.d.ts +10 -1
- package/dist/src/codec-state-store.d.ts.map +1 -1
- package/dist/src/codec-state-store.js +25 -0
- package/dist/src/codec-state-store.js.map +1 -1
- package/dist/src/dashboard/index.d.ts +1 -1
- package/dist/src/dashboard/index.js +1 -1
- package/dist/src/define_config.d.ts +13 -0
- package/dist/src/define_config.d.ts.map +1 -1
- package/dist/src/define_config.js.map +1 -1
- package/dist/src/engine.d.ts +75 -1
- package/dist/src/engine.d.ts.map +1 -1
- package/dist/src/engine.js +510 -23
- package/dist/src/engine.js.map +1 -1
- package/dist/src/errors.d.ts.map +1 -1
- package/dist/src/errors.js +4 -0
- package/dist/src/errors.js.map +1 -1
- package/dist/src/index.d.ts +1 -1
- package/dist/src/index.js +1 -1
- package/dist/src/interfaces.d.ts +94 -1
- package/dist/src/interfaces.d.ts.map +1 -1
- package/dist/src/interfaces.js +11 -0
- package/dist/src/interfaces.js.map +1 -1
- package/dist/src/sticky-continuation.d.ts +141 -0
- package/dist/src/sticky-continuation.d.ts.map +1 -0
- package/dist/src/sticky-continuation.js +231 -0
- package/dist/src/sticky-continuation.js.map +1 -0
- package/dist/src/stores/factory.d.ts +6 -0
- package/dist/src/stores/factory.d.ts.map +1 -1
- package/dist/src/stores/factory.js +3 -0
- package/dist/src/stores/factory.js.map +1 -1
- package/dist/src/stores/lucid-pg-hot-path.d.ts +30 -0
- package/dist/src/stores/lucid-pg-hot-path.d.ts.map +1 -0
- package/dist/src/stores/lucid-pg-hot-path.js +67 -0
- package/dist/src/stores/lucid-pg-hot-path.js.map +1 -0
- package/dist/src/stores/lucid.d.ts +30 -1
- package/dist/src/stores/lucid.d.ts.map +1 -1
- package/dist/src/stores/lucid.js +456 -17
- package/dist/src/stores/lucid.js.map +1 -1
- package/dist/src/testing/in-memory-state-store.d.ts +12 -1
- package/dist/src/testing/in-memory-state-store.d.ts.map +1 -1
- package/dist/src/testing/in-memory-state-store.js +101 -1
- package/dist/src/testing/in-memory-state-store.js.map +1 -1
- package/dist/src/testing-kit/state-store-conformance.d.ts.map +1 -1
- package/dist/src/testing-kit/state-store-conformance.js +199 -0
- package/dist/src/testing-kit/state-store-conformance.js.map +1 -1
- package/dist/src/transport-pool.d.ts +10 -0
- package/dist/src/transport-pool.d.ts.map +1 -1
- package/dist/src/transport-pool.js +23 -2
- package/dist/src/transport-pool.js.map +1 -1
- package/dist/src/transports/bullmq/bullmq-transport.d.ts +41 -1
- package/dist/src/transports/bullmq/bullmq-transport.d.ts.map +1 -1
- package/dist/src/transports/bullmq/bullmq-transport.js +283 -5
- package/dist/src/transports/bullmq/bullmq-transport.js.map +1 -1
- package/dist/src/transports/bullmq/deps.d.ts +12 -1
- package/dist/src/transports/bullmq/deps.d.ts.map +1 -1
- package/dist/src/transports/bullmq/deps.js.map +1 -1
- package/dist/src/transports/bullmq/naming.d.ts +10 -0
- package/dist/src/transports/bullmq/naming.d.ts.map +1 -1
- package/dist/src/transports/bullmq/naming.js +16 -0
- package/dist/src/transports/bullmq/naming.js.map +1 -1
- package/dist/src/transports/db.d.ts +3 -1
- package/dist/src/transports/db.d.ts.map +1 -1
- package/dist/src/transports/db.js +4 -4
- package/dist/src/transports/db.js.map +1 -1
- package/dist/src/transports/queue.d.ts +3 -1
- package/dist/src/transports/queue.d.ts.map +1 -1
- package/dist/src/transports/queue.js +2 -2
- package/dist/src/transports/queue.js.map +1 -1
- package/dist/src/transports/worker-keys.d.ts +2 -1
- package/dist/src/transports/worker-keys.d.ts.map +1 -1
- package/dist/src/transports/worker-keys.js +3 -2
- package/dist/src/transports/worker-keys.js.map +1 -1
- package/dist/src/workflow-ctx.d.ts +7 -0
- package/dist/src/workflow-ctx.d.ts.map +1 -1
- package/dist/src/workflow-ctx.js +28 -1
- package/dist/src/workflow-ctx.js.map +1 -1
- package/package.json +3 -3
- package/dist/assets/spa/assets/index-Co0ef3-q.css +0 -1
- package/dist/assets/spa/assets/index-DmgfShPp.js +0 -16
- package/dist/assets/spa/assets/index-DmgfShPp.js.map +0 -1
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
import { WorkflowSuspended } from './errors.js';
|
|
2
|
+
export class StickyContinuation {
|
|
3
|
+
runId;
|
|
4
|
+
fn;
|
|
5
|
+
workflowVersion;
|
|
6
|
+
compensations;
|
|
7
|
+
replay;
|
|
8
|
+
onPoisoned;
|
|
9
|
+
/** The body's settled outcome, once it has one. */
|
|
10
|
+
outcome;
|
|
11
|
+
/** Primitives started by the body and not yet settled or parked. */
|
|
12
|
+
active = 0;
|
|
13
|
+
/** Bumped on every change, so a quiescence check can tell nothing happened in between. */
|
|
14
|
+
version = 0;
|
|
15
|
+
checkScheduled = false;
|
|
16
|
+
waiter;
|
|
17
|
+
parked = new Map();
|
|
18
|
+
/** A turn currently owns the body (holds the run's lease). */
|
|
19
|
+
attached = true;
|
|
20
|
+
/** The body called a primitive while detached, or one suspended the classic way: never reuse it. */
|
|
21
|
+
unusable = false;
|
|
22
|
+
/** The run row's `updatedAt` (epoch ms) this process wrote when the body last parked. */
|
|
23
|
+
stamp;
|
|
24
|
+
lastUsed = Date.now();
|
|
25
|
+
/**
|
|
26
|
+
* Parked steps' `completed` rows, as the instance that settled them read them back: the next turn
|
|
27
|
+
* takes them instead of reading them again. A completed row never changes, so the hint can only be
|
|
28
|
+
* missing, never stale.
|
|
29
|
+
*/
|
|
30
|
+
hints = new Map();
|
|
31
|
+
constructor(runId,
|
|
32
|
+
/** Identity of the registered body, so a re-registration is never resumed with an old one. */
|
|
33
|
+
fn, workflowVersion, compensations, replay, onPoisoned) {
|
|
34
|
+
this.runId = runId;
|
|
35
|
+
this.fn = fn;
|
|
36
|
+
this.workflowVersion = workflowVersion;
|
|
37
|
+
this.compensations = compensations;
|
|
38
|
+
this.replay = replay;
|
|
39
|
+
this.onPoisoned = onPoisoned;
|
|
40
|
+
}
|
|
41
|
+
/** Remember a parked step's settled row for the next turn (see {@link hints}). */
|
|
42
|
+
hint(cp) {
|
|
43
|
+
if (cp.status === 'completed' && this.parked.has(cp.seq))
|
|
44
|
+
this.hints.set(cp.seq, cp);
|
|
45
|
+
}
|
|
46
|
+
/** Start the body. `run` invokes it (inside the ambient workflow ctx). */
|
|
47
|
+
begin(run) {
|
|
48
|
+
let started;
|
|
49
|
+
try {
|
|
50
|
+
started = run();
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
started = Promise.reject(error);
|
|
54
|
+
}
|
|
55
|
+
started.then((value) => this.settle({ kind: 'returned', value }), (error) => this.settle({ kind: 'threw', error }));
|
|
56
|
+
}
|
|
57
|
+
settle(outcome) {
|
|
58
|
+
this.outcome = outcome;
|
|
59
|
+
this.changed();
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Called by every primitive the body starts. `false` refuses the call: the body is detached (no
|
|
63
|
+
* turn holds the lease), and this continuation is poisoned.
|
|
64
|
+
*/
|
|
65
|
+
enter() {
|
|
66
|
+
if (!this.attached) {
|
|
67
|
+
if (!this.unusable) {
|
|
68
|
+
this.unusable = true;
|
|
69
|
+
this.onPoisoned(this);
|
|
70
|
+
}
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
this.active += 1;
|
|
74
|
+
this.changed();
|
|
75
|
+
return true;
|
|
76
|
+
}
|
|
77
|
+
/** A primitive the body started settled. A classic suspension makes the body single-use. */
|
|
78
|
+
exit(error) {
|
|
79
|
+
this.active -= 1;
|
|
80
|
+
if (error instanceof WorkflowSuspended)
|
|
81
|
+
this.unusable = true;
|
|
82
|
+
this.changed();
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Park a dispatched call: it stops counting as active, and its promise settles when a later turn
|
|
86
|
+
* re-evaluates it to an outcome.
|
|
87
|
+
*/
|
|
88
|
+
park(seq, wakeAt, reevaluate) {
|
|
89
|
+
return new Promise((resolve, reject) => {
|
|
90
|
+
this.parked.set(seq, { seq, wakeAt, reevaluate, resolve, reject });
|
|
91
|
+
this.active -= 1;
|
|
92
|
+
this.changed();
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Re-evaluate every parked call (in position order) with its freshly read checkpoint. A call that
|
|
97
|
+
* has an outcome leaves the parked set and settles; one still waiting stays parked, with its new
|
|
98
|
+
* deadline. Run by a warm turn after it attached.
|
|
99
|
+
*/
|
|
100
|
+
async resumeParked(fresh) {
|
|
101
|
+
const calls = [...this.parked.values()].sort((a, b) => a.seq - b.seq);
|
|
102
|
+
for (const call of calls) {
|
|
103
|
+
try {
|
|
104
|
+
const value = await call.reevaluate(fresh.get(call.seq) ?? null);
|
|
105
|
+
this.parked.delete(call.seq);
|
|
106
|
+
this.active += 1; // balanced by the primitive's own exit once it settles
|
|
107
|
+
call.resolve(value);
|
|
108
|
+
}
|
|
109
|
+
catch (error) {
|
|
110
|
+
if (error instanceof WorkflowSuspended) {
|
|
111
|
+
call.wakeAt = error.wakeAt;
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
this.parked.delete(call.seq);
|
|
115
|
+
this.active += 1;
|
|
116
|
+
call.reject(error);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
this.changed();
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Wait for this turn's outcome: the body settled, or it is parked on at least one dispatched call
|
|
123
|
+
* with nothing else in flight. Quiescence is confirmed a macrotask later with nothing changed in
|
|
124
|
+
* between, so microtask continuations of the body (a `Promise.all` starting its next call) run
|
|
125
|
+
* first. Parking detaches the body.
|
|
126
|
+
*/
|
|
127
|
+
next() {
|
|
128
|
+
return new Promise((resolve) => {
|
|
129
|
+
this.waiter = resolve;
|
|
130
|
+
this.changed();
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
changed() {
|
|
134
|
+
this.version += 1;
|
|
135
|
+
const waiter = this.waiter;
|
|
136
|
+
if (!waiter)
|
|
137
|
+
return;
|
|
138
|
+
if (this.outcome) {
|
|
139
|
+
this.waiter = undefined;
|
|
140
|
+
waiter(this.outcome);
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
if (this.checkScheduled || this.parked.size === 0 || this.active > 0)
|
|
144
|
+
return;
|
|
145
|
+
this.checkScheduled = true;
|
|
146
|
+
const at = this.version;
|
|
147
|
+
setImmediate(() => {
|
|
148
|
+
this.checkScheduled = false;
|
|
149
|
+
if (this.waiter !== waiter)
|
|
150
|
+
return;
|
|
151
|
+
if (this.version !== at) {
|
|
152
|
+
this.changed();
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
if (this.outcome || this.parked.size === 0 || this.active > 0)
|
|
156
|
+
return;
|
|
157
|
+
this.waiter = undefined;
|
|
158
|
+
this.attached = false;
|
|
159
|
+
let wakeAt;
|
|
160
|
+
for (const call of this.parked.values()) {
|
|
161
|
+
if (call.wakeAt !== undefined)
|
|
162
|
+
wakeAt = Math.min(wakeAt ?? call.wakeAt, call.wakeAt);
|
|
163
|
+
}
|
|
164
|
+
waiter({ kind: 'parked', wakeAt, waitSeqs: [...this.parked.keys()] });
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* The per-process cache of parked continuations, by run id: bounded by count (least recently used
|
|
170
|
+
* out first) and by idle time. Taking an entry removes it, so a continuation is owned by at most one
|
|
171
|
+
* turn at a time.
|
|
172
|
+
*/
|
|
173
|
+
export class StickyCache {
|
|
174
|
+
maxEntries;
|
|
175
|
+
maxIdleMs;
|
|
176
|
+
entries = new Map();
|
|
177
|
+
hits = 0;
|
|
178
|
+
misses = 0;
|
|
179
|
+
constructor(maxEntries, maxIdleMs) {
|
|
180
|
+
this.maxEntries = maxEntries;
|
|
181
|
+
this.maxIdleMs = maxIdleMs;
|
|
182
|
+
}
|
|
183
|
+
get enabled() {
|
|
184
|
+
return this.maxEntries > 0;
|
|
185
|
+
}
|
|
186
|
+
get size() {
|
|
187
|
+
return this.entries.size;
|
|
188
|
+
}
|
|
189
|
+
put(c) {
|
|
190
|
+
if (!this.enabled || c.unusable)
|
|
191
|
+
return;
|
|
192
|
+
c.lastUsed = Date.now();
|
|
193
|
+
this.entries.delete(c.runId);
|
|
194
|
+
this.entries.set(c.runId, c);
|
|
195
|
+
this.prune(c.lastUsed);
|
|
196
|
+
}
|
|
197
|
+
take(runId) {
|
|
198
|
+
const c = this.entries.get(runId);
|
|
199
|
+
if (!c)
|
|
200
|
+
return undefined;
|
|
201
|
+
this.entries.delete(runId);
|
|
202
|
+
if (c.unusable || Date.now() - c.lastUsed > this.maxIdleMs)
|
|
203
|
+
return undefined;
|
|
204
|
+
return c;
|
|
205
|
+
}
|
|
206
|
+
/** The parked continuation of `runId`, left in place. */
|
|
207
|
+
peek(runId) {
|
|
208
|
+
return this.entries.get(runId);
|
|
209
|
+
}
|
|
210
|
+
has(runId) {
|
|
211
|
+
return this.entries.has(runId);
|
|
212
|
+
}
|
|
213
|
+
evict(runId) {
|
|
214
|
+
this.entries.delete(runId);
|
|
215
|
+
}
|
|
216
|
+
clear() {
|
|
217
|
+
this.entries.clear();
|
|
218
|
+
}
|
|
219
|
+
prune(now) {
|
|
220
|
+
while (this.entries.size > this.maxEntries) {
|
|
221
|
+
const oldest = this.entries.keys().next().value;
|
|
222
|
+
this.entries.delete(oldest);
|
|
223
|
+
}
|
|
224
|
+
for (const [runId, c] of this.entries) {
|
|
225
|
+
if (now - c.lastUsed <= this.maxIdleMs)
|
|
226
|
+
break;
|
|
227
|
+
this.entries.delete(runId);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
//# sourceMappingURL=sticky-continuation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sticky-continuation.js","sourceRoot":"","sources":["../../src/sticky-continuation.ts"],"names":[],"mappings":"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"}
|
|
@@ -22,6 +22,12 @@ export interface LucidStoreConfig {
|
|
|
22
22
|
* `'utf8mb4_unicode_ci'`) so a JOIN against them doesn't fail with `Illegal mix of collations`.
|
|
23
23
|
*/
|
|
24
24
|
collation?: string;
|
|
25
|
+
/**
|
|
26
|
+
* Postgres only: send the statements every workflow step runs as named prepared statements,
|
|
27
|
+
* parsed once per connection. Needs a direct connection or a pooler that supports protocol-level
|
|
28
|
+
* prepared statements (PgBouncer in transaction mode before 1.21 does not). Default off.
|
|
29
|
+
*/
|
|
30
|
+
preparedStatements?: boolean;
|
|
25
31
|
}
|
|
26
32
|
/**
|
|
27
33
|
* The store factory namespace used in `config/durable.ts`:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../../src/stores/factory.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAEjE;;;;GAIG;AACH,MAAM,MAAM,YAAY,GAAG,gBAAgB,CAAC;AAE5C;;;;GAIG;AACH,MAAM,MAAM,YAAY,GAAG,CAAC,GAAG,EAAE,YAAY,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtE,qDAAqD;AACrD,MAAM,WAAW,gBAAgB;IAC/B,mFAAmF;IACnF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../../src/stores/factory.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAEjE;;;;GAIG;AACH,MAAM,MAAM,YAAY,GAAG,gBAAgB,CAAC;AAE5C;;;;GAIG;AACH,MAAM,MAAM,YAAY,GAAG,CAAC,GAAG,EAAE,YAAY,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtE,qDAAqD;AACrD,MAAM,WAAW,gBAAgB;IAC/B,mFAAmF;IACnF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,MAAM;IACjB,4EAA4E;IAC5E,KAAK,UAAS,gBAAgB,GAAQ,YAAY;CAanD,CAAC"}
|
|
@@ -26,6 +26,9 @@ export const stores = {
|
|
|
26
26
|
return new LucidStateStore(db, {
|
|
27
27
|
...(config.connection !== undefined ? { connectionName: config.connection } : {}),
|
|
28
28
|
...(config.collation !== undefined ? { collation: config.collation } : {}),
|
|
29
|
+
...(config.preparedStatements !== undefined
|
|
30
|
+
? { preparedStatements: config.preparedStatements }
|
|
31
|
+
: {}),
|
|
29
32
|
});
|
|
30
33
|
};
|
|
31
34
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"factory.js","sourceRoot":"","sources":["../../../src/stores/factory.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"factory.js","sourceRoot":"","sources":["../../../src/stores/factory.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAmC9D;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,4EAA4E;IAC5E,KAAK,CAAC,MAAM,GAAqB,EAAE;QACjC,OAAO,KAAK,EAAE,GAAG,EAAE,EAAE;YACnB,MAAM,EAAE,GAAG,CAAC,MAAM,oBAAoB,CAAC,GAAG,CAAC,CAAa,CAAC;YACzD,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC;YACvD,OAAO,IAAI,eAAe,CAAC,EAAE,EAAE;gBAC7B,GAAG,CAAC,MAAM,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACjF,GAAG,CAAC,MAAM,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC1E,GAAG,CAAC,MAAM,CAAC,kBAAkB,KAAK,SAAS;oBACzC,CAAC,CAAC,EAAE,kBAAkB,EAAE,MAAM,CAAC,kBAAkB,EAAE;oBACnD,CAAC,CAAC,EAAE,CAAC;aACR,CAAC,CAAC;QACL,CAAC,CAAC;IACJ,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { QueryClientContract } from '@adonisjs/lucid/types/database';
|
|
2
|
+
export interface PgHotPathOptions {
|
|
3
|
+
/**
|
|
4
|
+
* Send the hot statements as NAMED prepared statements (parsed once per connection). Saves Postgres
|
|
5
|
+
* a parse per statement, but needs a direct connection or a pooler that supports protocol-level
|
|
6
|
+
* prepared statements (PgBouncer in transaction mode before 1.21 does not). Default off.
|
|
7
|
+
*/
|
|
8
|
+
preparedStatements?: boolean | undefined;
|
|
9
|
+
}
|
|
10
|
+
export declare class LucidPgHotPath {
|
|
11
|
+
private readonly knex;
|
|
12
|
+
private readonly prepared;
|
|
13
|
+
private constructor();
|
|
14
|
+
/** The hot path for `client`, or `undefined` when it is not Postgres or is being debugged. */
|
|
15
|
+
static for(client: QueryClientContract, options?: PgHotPathOptions): LucidPgHotPath | undefined;
|
|
16
|
+
/**
|
|
17
|
+
* Run one statement, written with `?` placeholders (the store's texts carry no other `?`);
|
|
18
|
+
* resolves its rows as the driver decoded them, and the affected-row count. The connection comes
|
|
19
|
+
* from the Knex client's own pool: inside a (global) transaction, that is the transaction's.
|
|
20
|
+
*/
|
|
21
|
+
run(sql: string, values: unknown[]): Promise<{
|
|
22
|
+
rows: Record<string, unknown>[];
|
|
23
|
+
count: number;
|
|
24
|
+
}>;
|
|
25
|
+
/** {@link run}'s rows. */
|
|
26
|
+
rows(text: string, values: unknown[]): Promise<Record<string, unknown>[]>;
|
|
27
|
+
}
|
|
28
|
+
/** A quoted identifier. */
|
|
29
|
+
export declare const quote: (name: string) => string;
|
|
30
|
+
//# sourceMappingURL=lucid-pg-hot-path.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lucid-pg-hot-path.d.ts","sourceRoot":"","sources":["../../../src/stores/lucid-pg-hot-path.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAsC1E,MAAM,WAAW,gBAAgB;IAC/B;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAC1C;AAYD,qBAAa,cAAc;IAEvB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAF3B,OAAO,eAGH;IAEJ,8FAA8F;IAC9F,MAAM,CAAC,GAAG,CACR,MAAM,EAAE,mBAAmB,EAC3B,OAAO,GAAE,gBAAqB,GAC7B,cAAc,GAAG,SAAS,CAK5B;IAED;;;;OAIG;IACG,GAAG,CACP,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,OAAO,EAAE,GAChB,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAY7D;IAED,0BAA0B;IACpB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,CAE9E;CACF;AAiBD,2BAA2B;AAC3B,eAAO,MAAM,KAAK,SAAU,MAAM,KAAG,MAAyC,CAAC"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/** A short stable hash, for statement names. */
|
|
2
|
+
function hash(text) {
|
|
3
|
+
let h = 2166136261;
|
|
4
|
+
for (let i = 0; i < text.length; i += 1) {
|
|
5
|
+
h ^= text.charCodeAt(i);
|
|
6
|
+
h = Math.imul(h, 16777619);
|
|
7
|
+
}
|
|
8
|
+
return (h >>> 0).toString(36);
|
|
9
|
+
}
|
|
10
|
+
export class LucidPgHotPath {
|
|
11
|
+
knex;
|
|
12
|
+
prepared;
|
|
13
|
+
constructor(knex, prepared) {
|
|
14
|
+
this.knex = knex;
|
|
15
|
+
this.prepared = prepared;
|
|
16
|
+
}
|
|
17
|
+
/** The hot path for `client`, or `undefined` when it is not Postgres or is being debugged. */
|
|
18
|
+
static for(client, options = {}) {
|
|
19
|
+
if (client.dialect.name !== 'postgres' || client.debug)
|
|
20
|
+
return undefined;
|
|
21
|
+
const knex = client.getWriteClient();
|
|
22
|
+
if (typeof knex?.client?.acquireConnection !== 'function')
|
|
23
|
+
return undefined;
|
|
24
|
+
return new LucidPgHotPath(knex, options.preparedStatements === true);
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Run one statement, written with `?` placeholders (the store's texts carry no other `?`);
|
|
28
|
+
* resolves its rows as the driver decoded them, and the affected-row count. The connection comes
|
|
29
|
+
* from the Knex client's own pool: inside a (global) transaction, that is the transaction's.
|
|
30
|
+
*/
|
|
31
|
+
async run(sql, values) {
|
|
32
|
+
const text = numbered(sql);
|
|
33
|
+
this.knex.emit?.('query', { method: 'raw', sql: text, bindings: values });
|
|
34
|
+
const config = { text, values };
|
|
35
|
+
if (this.prepared)
|
|
36
|
+
config.name = `durable_${hash(text)}`;
|
|
37
|
+
const connection = await this.knex.client.acquireConnection();
|
|
38
|
+
try {
|
|
39
|
+
const result = await connection.query(config);
|
|
40
|
+
return { rows: result.rows, count: result.rowCount ?? result.rows.length };
|
|
41
|
+
}
|
|
42
|
+
finally {
|
|
43
|
+
await this.knex.client.releaseConnection(connection);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/** {@link run}'s rows. */
|
|
47
|
+
async rows(text, values) {
|
|
48
|
+
return (await this.run(text, values)).rows;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/** Statement texts with `?` placeholders, numbered once (`$1`, `$2`, …). */
|
|
52
|
+
const numberedTexts = new Map();
|
|
53
|
+
function numbered(sql) {
|
|
54
|
+
let text = numberedTexts.get(sql);
|
|
55
|
+
if (text === undefined) {
|
|
56
|
+
let n = 0;
|
|
57
|
+
text = sql.replace(/\?/g, () => {
|
|
58
|
+
n += 1;
|
|
59
|
+
return `$${n}`;
|
|
60
|
+
});
|
|
61
|
+
numberedTexts.set(sql, text);
|
|
62
|
+
}
|
|
63
|
+
return text;
|
|
64
|
+
}
|
|
65
|
+
/** A quoted identifier. */
|
|
66
|
+
export const quote = (name) => `"${name.replace(/"/g, '""')}"`;
|
|
67
|
+
//# sourceMappingURL=lucid-pg-hot-path.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lucid-pg-hot-path.js","sourceRoot":"","sources":["../../../src/stores/lucid-pg-hot-path.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Database } from '@adonisjs/lucid/database';
|
|
2
|
-
import type { BufferedSignalRow, CheckpointQuery, CheckpointStat, ChildWait, RunFacetQuery, RunFacetRow, RunQuery, RunStatus, RunValueAxis, RunValueFacetOptions, RunValueFacetRow, ScheduleQuery, ScheduleRecord, SignalWaiter, StateStore, StepCheckpoint, StepSettlement, WorkflowRun } from '../interfaces.js';
|
|
2
|
+
import type { BufferedSignalRow, CheckpointQuery, CheckpointStat, ChildWait, RunFacetQuery, RunFacetRow, RunQuery, RunStatus, RunValueAxis, RunValueFacetOptions, RunValueFacetRow, ScheduleQuery, ScheduleRecord, SettledStepResult, SignalWaiter, StateStore, StepCheckpoint, StepResultSettlement, StepSettlement, WorkflowRun } from '../interfaces.js';
|
|
3
3
|
export interface LucidStateStoreOptions {
|
|
4
4
|
/**
|
|
5
5
|
* The Lucid connection name to use. Defaults to the connection's primary (the `Database` default).
|
|
@@ -20,6 +20,13 @@ export interface LucidStateStoreOptions {
|
|
|
20
20
|
* `CreateDurableTablesOptions.collation`). Ignored on other dialects.
|
|
21
21
|
*/
|
|
22
22
|
collation?: string | undefined;
|
|
23
|
+
/**
|
|
24
|
+
* Postgres: send the statements of a workflow's hot path (the ones every step runs) as NAMED
|
|
25
|
+
* prepared statements, parsed once per connection. Needs a direct connection or a pooler that
|
|
26
|
+
* supports protocol-level prepared statements (PgBouncer in transaction mode before 1.21 does not).
|
|
27
|
+
* Default off. Ignored on other dialects.
|
|
28
|
+
*/
|
|
29
|
+
preparedStatements?: boolean | undefined;
|
|
23
30
|
}
|
|
24
31
|
/**
|
|
25
32
|
* A production-grade, persistent `StateStore` backed by AdonisJS **Lucid** (Knex). Runs, checkpoints,
|
|
@@ -50,6 +57,12 @@ export declare class LucidStateStore implements StateStore {
|
|
|
50
57
|
private fenced;
|
|
51
58
|
/** The base query client (or a named connection's), used unless an explicit tx client is passed. */
|
|
52
59
|
private client;
|
|
60
|
+
/**
|
|
61
|
+
* The Postgres hot path (see `lucid-pg-hot-path.ts`): the statements a turn and a step result run
|
|
62
|
+
* on every step, as constant SQL. `undefined` on any other dialect, or with Lucid's `debug` on.
|
|
63
|
+
* Resolved per call, like {@link client}: under a global transaction it is the transaction's.
|
|
64
|
+
*/
|
|
65
|
+
private hot;
|
|
53
66
|
/** Idempotently provision the durable tables (called on boot when `autoSchema` is on). */
|
|
54
67
|
ensureSchema(): Promise<void>;
|
|
55
68
|
createRun(run: WorkflowRun): Promise<void>;
|
|
@@ -61,6 +74,11 @@ export declare class LucidStateStore implements StateStore {
|
|
|
61
74
|
private writeRun;
|
|
62
75
|
updateRun(runId: string, patch: Partial<WorkflowRun>): Promise<void>;
|
|
63
76
|
updateRunIf(runId: string, expectedStatuses: RunStatus[], patch: Partial<WorkflowRun>): Promise<boolean>;
|
|
77
|
+
/**
|
|
78
|
+
* The hot path for a run write of `patch`: one that needs no transaction (see {@link writeRun}),
|
|
79
|
+
* on a connection that takes it.
|
|
80
|
+
*/
|
|
81
|
+
private hotFor;
|
|
64
82
|
pullRunWakesIn(runIds: string[], wakeAt: number): Promise<void>;
|
|
65
83
|
/** Whether the runs table has `awaiting_decision_task_id`, probed once per store and cached. */
|
|
66
84
|
private decisionMarkerColumn;
|
|
@@ -86,6 +104,15 @@ export declare class LucidStateStore implements StateStore {
|
|
|
86
104
|
renewCheckpointLease(runId: string, seq: number, expectedWakeAt: number | undefined, wakeAt: number): Promise<boolean>;
|
|
87
105
|
saveCheckpointsIfPending(checkpoints: StepCheckpoint[]): Promise<boolean[]>;
|
|
88
106
|
settleCheckpointsIfPending(settlements: StepSettlement[]): Promise<boolean[]>;
|
|
107
|
+
settleResultsIfPending(results: StepResultSettlement[]): Promise<(SettledStepResult | null)[]>;
|
|
108
|
+
/**
|
|
109
|
+
* {@link settleResultsIfPending} on a dialect without `UPDATE … RETURNING` in one statement
|
|
110
|
+
* (MySQL, SQLite): the runs' statuses, the rows, then the settle (one conditional UPDATE for a
|
|
111
|
+
* single result, the batched transaction for several). The same three statements the engine's
|
|
112
|
+
* read-first path costs.
|
|
113
|
+
*/
|
|
114
|
+
private settleResultsPlain;
|
|
115
|
+
insertCheckpointIfAbsent(checkpoint: StepCheckpoint): Promise<boolean>;
|
|
89
116
|
/** Persist the latest worker heartbeat on the step's checkpoint row (see the interface doc).
|
|
90
117
|
* A targeted two-column UPDATE — never an upsert: a beat racing the checkpoint's own insert (or
|
|
91
118
|
* outliving a deleted run) matches zero rows and is a silent no-op, by design. */
|
|
@@ -100,8 +127,10 @@ export declare class LucidStateStore implements StateStore {
|
|
|
100
127
|
listIncompleteRuns(namespace?: string): Promise<WorkflowRun[]>;
|
|
101
128
|
listOrphanedRuns(nowMs: number, limit: number, namespace?: string, owner?: string): Promise<WorkflowRun[]>;
|
|
102
129
|
listPendingRuns(limit: number, namespace?: string): Promise<WorkflowRun[]>;
|
|
130
|
+
claimPendingRuns(limit: number, owner: string, leaseUntilMs: number, nowMs: number, namespace?: string): Promise<WorkflowRun[]>;
|
|
103
131
|
listDueTimers(nowMs: number, namespace?: string, limit?: number): Promise<WorkflowRun[]>;
|
|
104
132
|
tryLockRun(runId: string, owner: string, leaseUntilMs: number, nowMs: number): Promise<boolean>;
|
|
133
|
+
tryLockRunAndGet(runId: string, owner: string, leaseUntilMs: number, nowMs: number): Promise<WorkflowRun | null>;
|
|
105
134
|
releaseRunLock(runId: string, owner?: string): Promise<void>;
|
|
106
135
|
releaseRunLockUnlessWakeRequested(runId: string, owner: string): Promise<boolean>;
|
|
107
136
|
/** {@link hasWakeMarkerColumn} on the caller's transaction (a single-connection pool has no other). */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lucid.d.ts","sourceRoot":"","sources":["../../../src/stores/lucid.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAKzD,OAAO,KAAK,EAEV,iBAAiB,EAEjB,eAAe,EACf,cAAc,EACd,SAAS,EACT,aAAa,EACb,WAAW,EACX,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,oBAAoB,EACpB,gBAAgB,EAChB,aAAa,EACb,cAAc,EACd,YAAY,EACZ,UAAU,EACV,cAAc,EACd,cAAc,EACd,WAAW,EACZ,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"lucid.d.ts","sourceRoot":"","sources":["../../../src/stores/lucid.ts"],"names":[],"mappings":"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"}
|