@dudousxd/nestjs-durable-store-prisma 0.6.0 → 0.8.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.
@@ -1,4 +1,4 @@
1
- // Add these three models to your own schema.prisma, then `prisma generate` and pass your
1
+ // Add these models to your own schema.prisma, then `prisma generate` and pass your
2
2
  // PrismaClient to `new PrismaStateStore(prisma)`. The adapter only ever touches these tables.
3
3
 
4
4
  model DurableWorkflowRun {
@@ -18,11 +18,31 @@ model DurableWorkflowRun {
18
18
  createdAt DateTime
19
19
  updatedAt DateTime
20
20
 
21
+ attributes DurableRunAttribute[]
22
+
21
23
  @@index([status, wakeAt])
22
24
  @@index([workflow, status])
23
25
  @@map("durable_workflow_runs")
24
26
  }
25
27
 
28
+ // Normalized search-attribute side-table: one row per (run, key), so range/equality predicates push
29
+ // DOWN into SQL via a relation (`some`) filter — EXISTS on this table — instead of a coarse scan +
30
+ // in-process filter. Maintained on every createRun/updateRun. Numbers land in `numValue`, strings/
31
+ // booleans in `strValue` (booleans as "true"/"false"); see core normalizeAttributeRows.
32
+ model DurableRunAttribute {
33
+ runId String
34
+ key String
35
+ strValue String?
36
+ numValue Float?
37
+
38
+ run DurableWorkflowRun @relation(fields: [runId], references: [id], onDelete: Cascade)
39
+
40
+ @@id([runId, key])
41
+ @@index([key, numValue])
42
+ @@index([key, strValue])
43
+ @@map("durable_run_attributes")
44
+ }
45
+
26
46
  model DurableStepCheckpoint {
27
47
  runId String
28
48
  seq Int
@@ -52,3 +72,12 @@ model DurableSignalWaiter {
52
72
 
53
73
  @@map("durable_signal_waiters")
54
74
  }
75
+
76
+ model DurableBufferedSignal {
77
+ id BigInt @id @default(autoincrement())
78
+ token String
79
+ payload Json?
80
+
81
+ @@index([token])
82
+ @@map("durable_buffered_signals")
83
+ }
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"prisma-state-store.d.ts","sourceRoot":"","sources":["../src/prisma-state-store.ts"],"names":[],"mappings":"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"}
@@ -1,229 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.PrismaStateStore = void 0;
4
- const nestjs_durable_core_1 = require("@dudousxd/nestjs-durable-core");
5
- /**
6
- * Prisma-backed `StateStore`. Pass your `PrismaClient` after adding the models from
7
- * `prisma/schema.prisma` to your schema. JSON columns carry the run/step payloads directly;
8
- * `wakeAt` is a `BigInt` (epoch ms).
9
- */
10
- class PrismaStateStore {
11
- db;
12
- constructor(db) {
13
- this.db = db;
14
- }
15
- async createRun(run) {
16
- await this.db.durableWorkflowRun.create({ data: toRunData(run) });
17
- }
18
- async updateRun(runId, patch) {
19
- await this.db.durableWorkflowRun.update({ where: { id: runId }, data: toRunPatch(patch) });
20
- }
21
- async getRun(runId) {
22
- const row = await this.db.durableWorkflowRun.findUnique({ where: { id: runId } });
23
- return row ? fromRunRow(row) : null;
24
- }
25
- async getCheckpoint(runId, seq) {
26
- const row = await this.db.durableStepCheckpoint.findUnique({
27
- where: { runId_seq: { runId, seq } },
28
- });
29
- return row ? fromCheckpointRow(row) : null;
30
- }
31
- async saveCheckpoint(checkpoint) {
32
- const data = toCheckpointData(checkpoint);
33
- await this.db.durableStepCheckpoint.upsert({
34
- where: { runId_seq: { runId: checkpoint.runId, seq: checkpoint.seq } },
35
- create: data,
36
- update: data,
37
- });
38
- }
39
- async listIncompleteRuns() {
40
- const rows = await this.db.durableWorkflowRun.findMany({ where: { status: 'running' } });
41
- return rows.map(fromRunRow);
42
- }
43
- async listPendingRuns(limit) {
44
- const rows = await this.db.durableWorkflowRun.findMany({
45
- where: { status: 'pending' },
46
- orderBy: { createdAt: 'asc' }, // FIFO dispatch
47
- take: limit,
48
- });
49
- return rows.map(fromRunRow);
50
- }
51
- async listDueTimers(nowMs) {
52
- const rows = await this.db.durableWorkflowRun.findMany({
53
- where: { status: 'suspended', wakeAt: { not: null, lte: BigInt(nowMs) } },
54
- });
55
- return rows.map(fromRunRow);
56
- }
57
- async tryLockRun(runId, owner, leaseUntilMs, nowMs) {
58
- const result = await this.db.durableWorkflowRun.updateMany({
59
- where: {
60
- id: runId,
61
- OR: [{ lockedUntil: null }, { lockedUntil: { lte: new Date(nowMs) } }],
62
- },
63
- data: { lockedBy: owner, lockedUntil: new Date(leaseUntilMs) },
64
- });
65
- return result.count === 1;
66
- }
67
- async releaseRunLock(runId) {
68
- await this.db.durableWorkflowRun.update({
69
- where: { id: runId },
70
- data: { lockedBy: null, lockedUntil: null },
71
- });
72
- }
73
- async renewRunLock(runId, owner, leaseUntilMs) {
74
- const result = await this.db.durableWorkflowRun.updateMany({
75
- where: { id: runId, lockedBy: owner },
76
- data: { lockedUntil: new Date(leaseUntilMs) },
77
- });
78
- return result.count === 1;
79
- }
80
- async listRuns(query) {
81
- const where = {};
82
- if (query.workflow)
83
- where.workflow = query.workflow;
84
- if (query.status)
85
- where.status = query.status;
86
- if (query.tag)
87
- where.tags = { array_contains: query.tag };
88
- const orderBy = { createdAt: 'desc' }; // newest first — recent runs on top in the dashboard
89
- // Typed/range attribute predicates aren't portable SQL — fetch coarse rows, filter + paginate
90
- // in-process. Without attributes, the DB paginates.
91
- if (query.attributes?.length) {
92
- const rows = await this.db.durableWorkflowRun.findMany({ where, orderBy });
93
- return (0, nestjs_durable_core_1.applyAttributeQuery)(rows.map(fromRunRow), query);
94
- }
95
- const rows = await this.db.durableWorkflowRun.findMany({
96
- where,
97
- take: query.limit,
98
- skip: query.offset,
99
- orderBy,
100
- });
101
- return rows.map(fromRunRow);
102
- }
103
- async listCheckpoints(runId) {
104
- const rows = await this.db.durableStepCheckpoint.findMany({
105
- where: { runId },
106
- orderBy: { seq: 'asc' },
107
- });
108
- return rows.map(fromCheckpointRow);
109
- }
110
- async putSignalWaiter(waiter) {
111
- await this.db.durableSignalWaiter.upsert({
112
- where: { token: waiter.token },
113
- create: { ...waiter },
114
- update: { runId: waiter.runId, seq: waiter.seq },
115
- });
116
- }
117
- async takeSignalWaiter(token) {
118
- const row = await this.db.durableSignalWaiter.findUnique({ where: { token } });
119
- if (!row)
120
- return null;
121
- await this.db.durableSignalWaiter.delete({ where: { token } });
122
- return { token: row.token, runId: row.runId, seq: row.seq };
123
- }
124
- async listSignalWaiters(prefix) {
125
- const rows = await this.db.durableSignalWaiter.findMany({
126
- where: { token: { startsWith: prefix } },
127
- });
128
- return rows.map((r) => ({ token: r.token, runId: r.runId, seq: r.seq }));
129
- }
130
- }
131
- exports.PrismaStateStore = PrismaStateStore;
132
- const bigOrNull = (n) => (n == null ? null : BigInt(n));
133
- const numOrUndef = (n) => (n == null ? undefined : Number(n));
134
- const jsonOrNull = (v) => v ?? null;
135
- function toRunData(run) {
136
- return {
137
- id: run.id,
138
- workflow: run.workflow,
139
- workflowVersion: run.workflowVersion,
140
- status: run.status,
141
- input: jsonOrNull(run.input),
142
- output: jsonOrNull(run.output),
143
- error: jsonOrNull(run.error),
144
- wakeAt: bigOrNull(run.wakeAt),
145
- lockedBy: run.lockedBy ?? null,
146
- lockedUntil: run.lockedUntil == null ? null : new Date(run.lockedUntil),
147
- recoveryAttempts: run.recoveryAttempts ?? null,
148
- tags: jsonOrNull(run.tags),
149
- searchAttributes: jsonOrNull(run.searchAttributes),
150
- createdAt: run.createdAt,
151
- updatedAt: run.updatedAt,
152
- };
153
- }
154
- function toRunPatch(patch) {
155
- const data = {};
156
- if (patch.status !== undefined)
157
- data.status = patch.status;
158
- if (patch.output !== undefined)
159
- data.output = jsonOrNull(patch.output);
160
- if (patch.error !== undefined)
161
- data.error = jsonOrNull(patch.error);
162
- if (patch.wakeAt !== undefined)
163
- data.wakeAt = bigOrNull(patch.wakeAt);
164
- if (patch.recoveryAttempts !== undefined)
165
- data.recoveryAttempts = patch.recoveryAttempts ?? null;
166
- if (patch.updatedAt !== undefined)
167
- data.updatedAt = patch.updatedAt;
168
- return data;
169
- }
170
- function fromRunRow(row) {
171
- return {
172
- id: row.id,
173
- workflow: row.workflow,
174
- workflowVersion: row.workflowVersion,
175
- status: row.status,
176
- input: row.input ?? undefined,
177
- output: row.output ?? undefined,
178
- error: (row.error ?? undefined),
179
- wakeAt: numOrUndef(row.wakeAt),
180
- lockedBy: row.lockedBy ?? undefined,
181
- lockedUntil: row.lockedUntil == null ? undefined : row.lockedUntil.getTime(),
182
- recoveryAttempts: row.recoveryAttempts ?? undefined,
183
- tags: row.tags ?? undefined,
184
- searchAttributes: row.searchAttributes ?? undefined,
185
- createdAt: row.createdAt,
186
- updatedAt: row.updatedAt,
187
- };
188
- }
189
- function toCheckpointData(cp) {
190
- return {
191
- runId: cp.runId,
192
- seq: cp.seq,
193
- name: cp.name,
194
- kind: cp.kind,
195
- stepId: cp.stepId,
196
- status: cp.status,
197
- input: jsonOrNull(cp.input),
198
- output: jsonOrNull(cp.output),
199
- error: jsonOrNull(cp.error),
200
- events: jsonOrNull(cp.events),
201
- attempts: cp.attempts,
202
- workerGroup: cp.workerGroup ?? null,
203
- wakeAt: bigOrNull(cp.wakeAt),
204
- enqueuedAt: cp.enqueuedAt,
205
- startedAt: cp.startedAt,
206
- finishedAt: cp.finishedAt,
207
- };
208
- }
209
- function fromCheckpointRow(row) {
210
- return {
211
- runId: row.runId,
212
- seq: row.seq,
213
- name: row.name,
214
- kind: row.kind,
215
- stepId: row.stepId,
216
- status: row.status,
217
- input: row.input ?? undefined,
218
- output: row.output ?? undefined,
219
- error: (row.error ?? undefined),
220
- events: (row.events ?? undefined),
221
- attempts: row.attempts,
222
- workerGroup: row.workerGroup ?? undefined,
223
- wakeAt: numOrUndef(row.wakeAt),
224
- enqueuedAt: row.enqueuedAt ?? row.startedAt,
225
- startedAt: row.startedAt,
226
- finishedAt: row.finishedAt,
227
- };
228
- }
229
- //# sourceMappingURL=prisma-state-store.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"prisma-state-store.js","sourceRoot":"","sources":["../src/prisma-state-store.ts"],"names":[],"mappings":"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"}