@dudousxd/nestjs-durable-store-prisma 0.1.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.
@@ -0,0 +1,2 @@
1
+ export * from './prisma-state-store';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./prisma-state-store"), exports);
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,uDAAqC"}
@@ -0,0 +1,76 @@
1
+ import type { RunQuery, SignalWaiter, StateStore, StepCheckpoint, WorkflowRun } from '@dudousxd/nestjs-durable-core';
2
+ interface RunRow {
3
+ id: string;
4
+ workflow: string;
5
+ workflowVersion: string;
6
+ status: string;
7
+ input: unknown;
8
+ output: unknown;
9
+ error: unknown;
10
+ wakeAt: bigint | null;
11
+ lockedBy: string | null;
12
+ lockedUntil: Date | null;
13
+ createdAt: Date;
14
+ updatedAt: Date;
15
+ }
16
+ interface CheckpointRow {
17
+ runId: string;
18
+ seq: number;
19
+ name: string;
20
+ kind: string;
21
+ stepId: string;
22
+ status: string;
23
+ output: unknown;
24
+ error: unknown;
25
+ attempts: number;
26
+ workerGroup: string | null;
27
+ wakeAt: bigint | null;
28
+ startedAt: Date;
29
+ finishedAt: Date;
30
+ }
31
+ interface WaiterRow {
32
+ token: string;
33
+ runId: string;
34
+ seq: number;
35
+ }
36
+ type Args = any;
37
+ interface Delegate<Row> {
38
+ create(args: Args): Promise<Row>;
39
+ findUnique(args: Args): Promise<Row | null>;
40
+ findMany(args?: Args): Promise<Row[]>;
41
+ update(args: Args): Promise<Row>;
42
+ updateMany(args: Args): Promise<{
43
+ count: number;
44
+ }>;
45
+ upsert(args: Args): Promise<Row>;
46
+ delete(args: Args): Promise<Row>;
47
+ }
48
+ export interface DurablePrismaClient {
49
+ durableWorkflowRun: Delegate<RunRow>;
50
+ durableStepCheckpoint: Delegate<CheckpointRow>;
51
+ durableSignalWaiter: Delegate<WaiterRow>;
52
+ }
53
+ /**
54
+ * Prisma-backed `StateStore`. Pass your `PrismaClient` after adding the models from
55
+ * `prisma/schema.prisma` to your schema. JSON columns carry the run/step payloads directly;
56
+ * `wakeAt` is a `BigInt` (epoch ms).
57
+ */
58
+ export declare class PrismaStateStore implements StateStore {
59
+ private readonly db;
60
+ constructor(db: DurablePrismaClient);
61
+ createRun(run: WorkflowRun): Promise<void>;
62
+ updateRun(runId: string, patch: Partial<WorkflowRun>): Promise<void>;
63
+ getRun(runId: string): Promise<WorkflowRun | null>;
64
+ getCheckpoint(runId: string, seq: number): Promise<StepCheckpoint | null>;
65
+ saveCheckpoint(checkpoint: StepCheckpoint): Promise<void>;
66
+ listIncompleteRuns(): Promise<WorkflowRun[]>;
67
+ listDueTimers(nowMs: number): Promise<WorkflowRun[]>;
68
+ tryLockRun(runId: string, owner: string, leaseUntilMs: number, nowMs: number): Promise<boolean>;
69
+ releaseRunLock(runId: string): Promise<void>;
70
+ listRuns(query: RunQuery): Promise<WorkflowRun[]>;
71
+ listCheckpoints(runId: string): Promise<StepCheckpoint[]>;
72
+ putSignalWaiter(waiter: SignalWaiter): Promise<void>;
73
+ takeSignalWaiter(token: string): Promise<SignalWaiter | null>;
74
+ }
75
+ export {};
76
+ //# sourceMappingURL=prisma-state-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prisma-state-store.d.ts","sourceRoot":"","sources":["../src/prisma-state-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,QAAQ,EACR,YAAY,EACZ,UAAU,EACV,cAAc,EAEd,WAAW,EACZ,MAAM,+BAA+B,CAAC;AAQvC,UAAU,MAAM;IACd,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,WAAW,EAAE,IAAI,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;CACjB;AAED,UAAU,aAAa;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,EAAE,IAAI,CAAC;IAChB,UAAU,EAAE,IAAI,CAAC;CAClB;AAED,UAAU,SAAS;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb;AAGD,KAAK,IAAI,GAAG,GAAG,CAAC;AAEhB,UAAU,QAAQ,CAAC,GAAG;IACpB,MAAM,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IACjC,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;IAC5C,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACtC,MAAM,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IACjC,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACnD,MAAM,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IACjC,MAAM,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,mBAAmB;IAClC,kBAAkB,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IACrC,qBAAqB,EAAE,QAAQ,CAAC,aAAa,CAAC,CAAC;IAC/C,mBAAmB,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC;CAC1C;AAED;;;;GAIG;AACH,qBAAa,gBAAiB,YAAW,UAAU;IACrC,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,mBAAmB;IAE9C,SAAS,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAI1C,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAIpE,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAKlD,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAOzE,cAAc,CAAC,UAAU,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IASzD,kBAAkB,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IAK5C,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAOpD,UAAU,CACd,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,OAAO,CAAC;IAWb,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAO5C,QAAQ,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAajD,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAQzD,eAAe,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAQpD,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;CAMpE"}
@@ -0,0 +1,184 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PrismaStateStore = void 0;
4
+ /**
5
+ * Prisma-backed `StateStore`. Pass your `PrismaClient` after adding the models from
6
+ * `prisma/schema.prisma` to your schema. JSON columns carry the run/step payloads directly;
7
+ * `wakeAt` is a `BigInt` (epoch ms).
8
+ */
9
+ class PrismaStateStore {
10
+ db;
11
+ constructor(db) {
12
+ this.db = db;
13
+ }
14
+ async createRun(run) {
15
+ await this.db.durableWorkflowRun.create({ data: toRunData(run) });
16
+ }
17
+ async updateRun(runId, patch) {
18
+ await this.db.durableWorkflowRun.update({ where: { id: runId }, data: toRunPatch(patch) });
19
+ }
20
+ async getRun(runId) {
21
+ const row = await this.db.durableWorkflowRun.findUnique({ where: { id: runId } });
22
+ return row ? fromRunRow(row) : null;
23
+ }
24
+ async getCheckpoint(runId, seq) {
25
+ const row = await this.db.durableStepCheckpoint.findUnique({
26
+ where: { runId_seq: { runId, seq } },
27
+ });
28
+ return row ? fromCheckpointRow(row) : null;
29
+ }
30
+ async saveCheckpoint(checkpoint) {
31
+ const data = toCheckpointData(checkpoint);
32
+ await this.db.durableStepCheckpoint.upsert({
33
+ where: { runId_seq: { runId: checkpoint.runId, seq: checkpoint.seq } },
34
+ create: data,
35
+ update: data,
36
+ });
37
+ }
38
+ async listIncompleteRuns() {
39
+ const rows = await this.db.durableWorkflowRun.findMany({ where: { status: 'running' } });
40
+ return rows.map(fromRunRow);
41
+ }
42
+ async listDueTimers(nowMs) {
43
+ const rows = await this.db.durableWorkflowRun.findMany({
44
+ where: { status: 'suspended', wakeAt: { not: null, lte: BigInt(nowMs) } },
45
+ });
46
+ return rows.map(fromRunRow);
47
+ }
48
+ async tryLockRun(runId, owner, leaseUntilMs, nowMs) {
49
+ const result = await this.db.durableWorkflowRun.updateMany({
50
+ where: {
51
+ id: runId,
52
+ OR: [{ lockedUntil: null }, { lockedUntil: { lte: new Date(nowMs) } }],
53
+ },
54
+ data: { lockedBy: owner, lockedUntil: new Date(leaseUntilMs) },
55
+ });
56
+ return result.count === 1;
57
+ }
58
+ async releaseRunLock(runId) {
59
+ await this.db.durableWorkflowRun.update({
60
+ where: { id: runId },
61
+ data: { lockedBy: null, lockedUntil: null },
62
+ });
63
+ }
64
+ async listRuns(query) {
65
+ const where = {};
66
+ if (query.workflow)
67
+ where.workflow = query.workflow;
68
+ if (query.status)
69
+ where.status = query.status;
70
+ const rows = await this.db.durableWorkflowRun.findMany({
71
+ where,
72
+ take: query.limit,
73
+ skip: query.offset,
74
+ orderBy: { createdAt: 'asc' },
75
+ });
76
+ return rows.map(fromRunRow);
77
+ }
78
+ async listCheckpoints(runId) {
79
+ const rows = await this.db.durableStepCheckpoint.findMany({
80
+ where: { runId },
81
+ orderBy: { seq: 'asc' },
82
+ });
83
+ return rows.map(fromCheckpointRow);
84
+ }
85
+ async putSignalWaiter(waiter) {
86
+ await this.db.durableSignalWaiter.upsert({
87
+ where: { token: waiter.token },
88
+ create: { ...waiter },
89
+ update: { runId: waiter.runId, seq: waiter.seq },
90
+ });
91
+ }
92
+ async takeSignalWaiter(token) {
93
+ const row = await this.db.durableSignalWaiter.findUnique({ where: { token } });
94
+ if (!row)
95
+ return null;
96
+ await this.db.durableSignalWaiter.delete({ where: { token } });
97
+ return { token: row.token, runId: row.runId, seq: row.seq };
98
+ }
99
+ }
100
+ exports.PrismaStateStore = PrismaStateStore;
101
+ const bigOrNull = (n) => (n == null ? null : BigInt(n));
102
+ const numOrUndef = (n) => (n == null ? undefined : Number(n));
103
+ const jsonOrNull = (v) => v ?? null;
104
+ function toRunData(run) {
105
+ return {
106
+ id: run.id,
107
+ workflow: run.workflow,
108
+ workflowVersion: run.workflowVersion,
109
+ status: run.status,
110
+ input: jsonOrNull(run.input),
111
+ output: jsonOrNull(run.output),
112
+ error: jsonOrNull(run.error),
113
+ wakeAt: bigOrNull(run.wakeAt),
114
+ lockedBy: run.lockedBy ?? null,
115
+ lockedUntil: run.lockedUntil == null ? null : new Date(run.lockedUntil),
116
+ createdAt: run.createdAt,
117
+ updatedAt: run.updatedAt,
118
+ };
119
+ }
120
+ function toRunPatch(patch) {
121
+ const data = {};
122
+ if (patch.status !== undefined)
123
+ data.status = patch.status;
124
+ if (patch.output !== undefined)
125
+ data.output = jsonOrNull(patch.output);
126
+ if (patch.error !== undefined)
127
+ data.error = jsonOrNull(patch.error);
128
+ if (patch.wakeAt !== undefined)
129
+ data.wakeAt = bigOrNull(patch.wakeAt);
130
+ if (patch.updatedAt !== undefined)
131
+ data.updatedAt = patch.updatedAt;
132
+ return data;
133
+ }
134
+ function fromRunRow(row) {
135
+ return {
136
+ id: row.id,
137
+ workflow: row.workflow,
138
+ workflowVersion: row.workflowVersion,
139
+ status: row.status,
140
+ input: row.input ?? undefined,
141
+ output: row.output ?? undefined,
142
+ error: (row.error ?? undefined),
143
+ wakeAt: numOrUndef(row.wakeAt),
144
+ lockedBy: row.lockedBy ?? undefined,
145
+ lockedUntil: row.lockedUntil == null ? undefined : row.lockedUntil.getTime(),
146
+ createdAt: row.createdAt,
147
+ updatedAt: row.updatedAt,
148
+ };
149
+ }
150
+ function toCheckpointData(cp) {
151
+ return {
152
+ runId: cp.runId,
153
+ seq: cp.seq,
154
+ name: cp.name,
155
+ kind: cp.kind,
156
+ stepId: cp.stepId,
157
+ status: cp.status,
158
+ output: jsonOrNull(cp.output),
159
+ error: jsonOrNull(cp.error),
160
+ attempts: cp.attempts,
161
+ workerGroup: cp.workerGroup ?? null,
162
+ wakeAt: bigOrNull(cp.wakeAt),
163
+ startedAt: cp.startedAt,
164
+ finishedAt: cp.finishedAt,
165
+ };
166
+ }
167
+ function fromCheckpointRow(row) {
168
+ return {
169
+ runId: row.runId,
170
+ seq: row.seq,
171
+ name: row.name,
172
+ kind: row.kind,
173
+ stepId: row.stepId,
174
+ status: row.status,
175
+ output: row.output ?? undefined,
176
+ error: (row.error ?? undefined),
177
+ attempts: row.attempts,
178
+ workerGroup: row.workerGroup ?? undefined,
179
+ wakeAt: numOrUndef(row.wakeAt),
180
+ startedAt: row.startedAt,
181
+ finishedAt: row.finishedAt,
182
+ };
183
+ }
184
+ //# sourceMappingURL=prisma-state-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prisma-state-store.js","sourceRoot":"","sources":["../src/prisma-state-store.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,34 @@
1
+ {
2
+ "name": "@dudousxd/nestjs-durable-store-prisma",
3
+ "version": "0.1.0",
4
+ "description": "Prisma adapter for the nestjs-durable StateStore",
5
+ "license": "MIT",
6
+ "author": "Davide Carvalho",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "https://github.com/DavideCarvalho/nestjs-durable.git",
10
+ "directory": "packages/store-prisma"
11
+ },
12
+ "type": "commonjs",
13
+ "main": "dist/index.js",
14
+ "types": "dist/index.d.ts",
15
+ "files": [
16
+ "dist",
17
+ "prisma/schema.prisma"
18
+ ],
19
+ "peerDependencies": {
20
+ "@dudousxd/nestjs-durable-core": ">=0.1.0 <1.0.0",
21
+ "@prisma/client": "^5.0.0 || ^6.0.0 || ^7.0.0"
22
+ },
23
+ "devDependencies": {
24
+ "@prisma/client": "6.19.3",
25
+ "prisma": "6.19.3",
26
+ "typescript": "5.9.3",
27
+ "@dudousxd/nestjs-durable-core": "^0.1.0"
28
+ },
29
+ "scripts": {
30
+ "build": "tsc -p tsconfig.json",
31
+ "typecheck": "tsc -p tsconfig.json --noEmit",
32
+ "prisma:generate": "prisma generate --schema prisma/test.prisma"
33
+ }
34
+ }
@@ -0,0 +1,47 @@
1
+ // Add these three models to your own schema.prisma, then `prisma generate` and pass your
2
+ // PrismaClient to `new PrismaStateStore(prisma)`. The adapter only ever touches these tables.
3
+
4
+ model DurableWorkflowRun {
5
+ id String @id
6
+ workflow String
7
+ workflowVersion String
8
+ status String
9
+ input Json?
10
+ output Json?
11
+ error Json?
12
+ wakeAt BigInt?
13
+ lockedBy String?
14
+ lockedUntil DateTime?
15
+ createdAt DateTime
16
+ updatedAt DateTime
17
+
18
+ @@index([status, wakeAt])
19
+ @@map("durable_workflow_runs")
20
+ }
21
+
22
+ model DurableStepCheckpoint {
23
+ runId String
24
+ seq Int
25
+ name String
26
+ kind String
27
+ stepId String
28
+ status String
29
+ output Json?
30
+ error Json?
31
+ attempts Int
32
+ workerGroup String?
33
+ wakeAt BigInt?
34
+ startedAt DateTime
35
+ finishedAt DateTime
36
+
37
+ @@id([runId, seq])
38
+ @@map("durable_step_checkpoints")
39
+ }
40
+
41
+ model DurableSignalWaiter {
42
+ token String @id
43
+ runId String
44
+ seq Int
45
+
46
+ @@map("durable_signal_waiters")
47
+ }