@workflow/world-postgres 4.0.1-beta.2 → 4.1.0-beta.4

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.
Files changed (48) hide show
  1. package/README.md +33 -0
  2. package/bin/setup.js +12 -0
  3. package/dist/boss.d.ts +15 -0
  4. package/dist/boss.d.ts.map +1 -0
  5. package/dist/boss.js +18 -0
  6. package/dist/boss.js.map +1 -0
  7. package/dist/cli.d.ts +3 -0
  8. package/dist/cli.d.ts.map +1 -0
  9. package/dist/cli.js +44 -0
  10. package/dist/cli.js.map +1 -0
  11. package/dist/config.d.ts +6 -0
  12. package/dist/config.d.ts.map +1 -0
  13. package/dist/config.js +2 -0
  14. package/dist/config.js.map +1 -0
  15. package/dist/drizzle/index.d.ts +6 -0
  16. package/dist/drizzle/index.d.ts.map +1 -0
  17. package/dist/drizzle/index.js +7 -0
  18. package/dist/drizzle/index.js.map +1 -0
  19. package/dist/drizzle/schema.d.ts +594 -0
  20. package/dist/drizzle/schema.d.ts.map +1 -0
  21. package/dist/drizzle/schema.js +89 -0
  22. package/dist/drizzle/schema.js.map +1 -0
  23. package/dist/index.d.ts +8 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +40 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/queue.d.ts +17 -0
  28. package/dist/queue.d.ts.map +1 -0
  29. package/dist/queue.js +103 -0
  30. package/dist/queue.js.map +1 -0
  31. package/dist/storage.d.ts +7 -0
  32. package/dist/storage.d.ts.map +1 -0
  33. package/dist/storage.js +369 -0
  34. package/dist/storage.js.map +1 -0
  35. package/dist/streamer.d.ts +5 -0
  36. package/dist/streamer.d.ts.map +1 -0
  37. package/dist/streamer.js +157 -0
  38. package/dist/streamer.js.map +1 -0
  39. package/dist/util.d.ts +6 -0
  40. package/dist/util.d.ts.map +1 -0
  41. package/dist/util.js +20 -0
  42. package/dist/util.js.map +1 -0
  43. package/dist/zod.d.ts +3 -0
  44. package/dist/zod.d.ts.map +1 -0
  45. package/dist/zod.js +10 -0
  46. package/dist/zod.js.map +1 -0
  47. package/package.json +23 -8
  48. package/src/drizzle/migrations/0000_redundant_smasher.sql +80 -0
@@ -0,0 +1,157 @@
1
+ import { EventEmitter } from 'node:events';
2
+ import { and, eq } from 'drizzle-orm';
3
+ import { monotonicFactory } from 'ulid';
4
+ import * as z from 'zod';
5
+ import { Schema } from './drizzle/index.js';
6
+ import { Mutex } from './util.js';
7
+ const StreamPublishMessage = z.object({
8
+ streamId: z.string(),
9
+ chunkId: z.templateLiteral(['chnk_', z.string()]),
10
+ });
11
+ class Rc {
12
+ resource;
13
+ refCount = 0;
14
+ constructor(resource) {
15
+ this.resource = resource;
16
+ }
17
+ acquire() {
18
+ this.refCount++;
19
+ return {
20
+ ...this.resource,
21
+ [Symbol.dispose]: () => {
22
+ this.release();
23
+ },
24
+ };
25
+ }
26
+ release() {
27
+ this.refCount--;
28
+ if (this.refCount <= 0) {
29
+ this.resource.drop();
30
+ }
31
+ }
32
+ }
33
+ export function createStreamer(postgres, drizzle) {
34
+ const ulid = monotonicFactory();
35
+ const events = new EventEmitter();
36
+ const { streams } = Schema;
37
+ const genChunkId = () => `chnk_${ulid()}`;
38
+ const mutexes = new Map();
39
+ const getMutex = (key) => {
40
+ let mutex = mutexes.get(key);
41
+ if (!mutex) {
42
+ mutex = new Rc({
43
+ mutex: new Mutex(),
44
+ drop: () => mutexes.delete(key),
45
+ });
46
+ mutexes.set(key, mutex);
47
+ }
48
+ return mutex.acquire();
49
+ };
50
+ const STREAM_TOPIC = 'workflow_event_chunk';
51
+ postgres.listen(STREAM_TOPIC, async (msg) => {
52
+ const parsed = await Promise.resolve(msg)
53
+ .then(JSON.parse)
54
+ .then(StreamPublishMessage.parse);
55
+ const key = `strm:${parsed.streamId}`;
56
+ if (!events.listenerCount(key)) {
57
+ return;
58
+ }
59
+ const resource = getMutex(key);
60
+ await resource.mutex.andThen(async () => {
61
+ const [value] = await drizzle
62
+ .select({ eof: streams.eof, data: streams.chunkData })
63
+ .from(streams)
64
+ .where(and(eq(streams.streamId, parsed.streamId), eq(streams.chunkId, parsed.chunkId)))
65
+ .limit(1);
66
+ if (!value)
67
+ return;
68
+ const { data, eof } = value;
69
+ events.emit(key, { id: parsed.chunkId, data, eof });
70
+ });
71
+ });
72
+ return {
73
+ async writeToStream(name, chunk) {
74
+ const chunkId = genChunkId();
75
+ await drizzle.insert(streams).values({
76
+ chunkId,
77
+ streamId: name,
78
+ chunkData: !Buffer.isBuffer(chunk) ? Buffer.from(chunk) : chunk,
79
+ eof: false,
80
+ });
81
+ postgres.notify(STREAM_TOPIC, JSON.stringify(StreamPublishMessage.encode({
82
+ chunkId,
83
+ streamId: name,
84
+ })));
85
+ },
86
+ async closeStream(name) {
87
+ const chunkId = genChunkId();
88
+ await drizzle.insert(streams).values({
89
+ chunkId,
90
+ streamId: name,
91
+ chunkData: Buffer.from([]),
92
+ eof: true,
93
+ });
94
+ postgres.notify('workflow_event_chunk', JSON.stringify(StreamPublishMessage.encode({
95
+ streamId: name,
96
+ chunkId,
97
+ })));
98
+ },
99
+ async readFromStream(name, startIndex) {
100
+ const cleanups = [];
101
+ return new ReadableStream({
102
+ async start(controller) {
103
+ // an empty string is always < than any string,
104
+ // so `'' < ulid()` and `ulid() < ulid()` (maintaining order)
105
+ let lastChunkId = '';
106
+ let offset = startIndex ?? 0;
107
+ let buffer = [];
108
+ function enqueue(msg) {
109
+ if (lastChunkId >= msg.id) {
110
+ // already sent or out of order
111
+ return;
112
+ }
113
+ if (offset > 0) {
114
+ offset--;
115
+ return;
116
+ }
117
+ if (msg.data.byteLength) {
118
+ controller.enqueue(new Uint8Array(msg.data));
119
+ }
120
+ if (msg.eof) {
121
+ controller.close();
122
+ }
123
+ lastChunkId = msg.id;
124
+ }
125
+ function onData(data) {
126
+ if (buffer) {
127
+ buffer.push(data);
128
+ return;
129
+ }
130
+ enqueue(data);
131
+ }
132
+ events.on(`strm:${name}`, onData);
133
+ cleanups.push(() => {
134
+ events.off(`strm:${name}`, onData);
135
+ });
136
+ const chunks = await drizzle
137
+ .select({
138
+ id: streams.chunkId,
139
+ eof: streams.eof,
140
+ data: streams.chunkData,
141
+ })
142
+ .from(streams)
143
+ .where(and(eq(streams.streamId, name)))
144
+ .orderBy(streams.chunkId);
145
+ for (const chunk of [...chunks, ...(buffer ?? [])]) {
146
+ enqueue(chunk);
147
+ }
148
+ buffer = null;
149
+ },
150
+ cancel() {
151
+ cleanups.forEach((fn) => fn());
152
+ },
153
+ });
154
+ },
155
+ };
156
+ }
157
+ //# sourceMappingURL=streamer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"streamer.js","sourceRoot":"","sources":["../src/streamer.ts"],"names":[],"mappings":"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"}
package/dist/util.d.ts ADDED
@@ -0,0 +1,6 @@
1
+ export declare class Mutex {
2
+ promise: Promise<unknown>;
3
+ andThen<T>(fn: () => Promise<T> | T): Promise<T>;
4
+ }
5
+ export declare function compact<T extends object>(obj: T): { [key in keyof T]: null extends T[key] ? NonNullable<T[key]> | undefined : T[key]; };
6
+ //# sourceMappingURL=util.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAAA,qBAAa,KAAK;IAChB,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAqB;IAC9C,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;CAOjD;AAED,wBAAgB,OAAO,CAAC,CAAC,SAAS,MAAM,EAAE,GAAG,EAAE,CAAC,MAE3C,GAAG,gFAYP"}
package/dist/util.js ADDED
@@ -0,0 +1,20 @@
1
+ export class Mutex {
2
+ promise = Promise.resolve();
3
+ andThen(fn) {
4
+ this.promise = this.promise.then(() => fn(), () => fn());
5
+ return this.promise;
6
+ }
7
+ }
8
+ export function compact(obj) {
9
+ const value = {};
10
+ for (const key in obj) {
11
+ if (obj[key] !== null) {
12
+ value[key] = obj[key];
13
+ }
14
+ else {
15
+ value[key] = undefined;
16
+ }
17
+ }
18
+ return value;
19
+ }
20
+ //# sourceMappingURL=util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,KAAK;IAChB,OAAO,GAAqB,OAAO,CAAC,OAAO,EAAE,CAAC;IAC9C,OAAO,CAAI,EAAwB;QACjC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAC9B,GAAG,EAAE,CAAC,EAAE,EAAE,EACV,GAAG,EAAE,CAAC,EAAE,EAAE,CACX,CAAC;QACF,OAAO,IAAI,CAAC,OAAqB,CAAC;IACpC,CAAC;CACF;AAED,MAAM,UAAU,OAAO,CAAmB,GAAM;IAC9C,MAAM,KAAK,GAAG,EAIb,CAAC;IACF,KAAK,MAAM,GAAG,IAAI,GAAG,EAAE,CAAC;QACtB,IAAI,GAAG,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;YACtB,KAAK,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,CAAQ,CAAC;QAC/B,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,GAAG,CAAC,GAAG,SAAgB,CAAC;QAChC,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
package/dist/zod.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ import * as z from 'zod';
2
+ export declare const Base64Buffer: z.ZodCodec<z.ZodBase64, z.ZodCustom<Buffer<ArrayBufferLike>, Buffer<ArrayBufferLike>>>;
3
+ //# sourceMappingURL=zod.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zod.d.ts","sourceRoot":"","sources":["../src/zod.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAEzB,eAAO,MAAM,YAAY,wFAOvB,CAAC"}
package/dist/zod.js ADDED
@@ -0,0 +1,10 @@
1
+ import * as z from 'zod';
2
+ export const Base64Buffer = z.codec(z.base64(), z.instanceof(Buffer), {
3
+ decode(b64) {
4
+ return Buffer.from(b64, 'base64');
5
+ },
6
+ encode(buf) {
7
+ return buf.toString('base64');
8
+ },
9
+ });
10
+ //# sourceMappingURL=zod.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zod.js","sourceRoot":"","sources":["../src/zod.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAEzB,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE;IACpE,MAAM,CAAC,GAAG;QACR,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACpC,CAAC;IACD,MAAM,CAAC,GAAG;QACR,OAAO,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAChC,CAAC;CACF,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,11 +1,16 @@
1
1
  {
2
2
  "name": "@workflow/world-postgres",
3
- "version": "4.0.1-beta.2",
3
+ "version": "4.1.0-beta.4",
4
4
  "description": "A reference World implementation based on PostgreSQL",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
7
+ "bin": {
8
+ "workflow-postgres-setup": "./bin/setup.js"
9
+ },
7
10
  "files": [
8
- "dist"
11
+ "dist",
12
+ "bin",
13
+ "src/drizzle/migrations"
9
14
  ],
10
15
  "publishConfig": {
11
16
  "access": "public"
@@ -20,27 +25,37 @@
20
25
  ".": {
21
26
  "types": "./dist/index.d.ts",
22
27
  "default": "./dist/index.js"
23
- }
28
+ },
29
+ "./schema": {
30
+ "types": "./dist/drizzle/schema.d.ts",
31
+ "default": "./dist/drizzle/schema.js"
32
+ },
33
+ "./cli": {
34
+ "types": "./dist/cli.d.ts",
35
+ "default": "./dist/cli.js"
36
+ },
37
+ "./migrations/*.sql": "./src/drizzle/migrations/*.sql"
24
38
  },
25
39
  "dependencies": {
26
40
  "@vercel/queue": "0.0.0-alpha.23",
41
+ "dotenv": "^16.4.5",
27
42
  "drizzle-orm": "^0.31.2",
28
43
  "pg-boss": "^11.0.7",
29
44
  "postgres": "^3.4.7",
30
45
  "ulid": "^3.0.1",
31
46
  "zod": "4.1.11",
32
- "@workflow/errors": "4.0.1-beta.1",
33
- "@workflow/world": "4.0.1-beta.2",
34
- "@workflow/world-local": "4.0.1-beta.2"
47
+ "@workflow/world": "4.0.1-beta.3",
48
+ "@workflow/errors": "4.0.1-beta.2",
49
+ "@workflow/world-local": "4.0.1-beta.3"
35
50
  },
36
51
  "devDependencies": {
37
52
  "@testcontainers/postgresql": "^11.7.1",
38
53
  "@types/node": "24.6.2",
39
54
  "drizzle-kit": "^0.22.7",
40
55
  "vitest": "^3.2.4",
56
+ "@workflow/errors": "4.0.1-beta.2",
41
57
  "@workflow/tsconfig": "4.0.1-beta.0",
42
- "@workflow/errors": "4.0.1-beta.1",
43
- "@workflow/world-testing": "4.0.1-beta.3"
58
+ "@workflow/world-testing": "4.0.1-beta.7"
44
59
  },
45
60
  "keywords": [],
46
61
  "author": "",
@@ -0,0 +1,80 @@
1
+ DO $$ BEGIN
2
+ CREATE TYPE "public"."step_status" AS ENUM('pending', 'running', 'completed', 'failed', 'cancelled');
3
+ EXCEPTION
4
+ WHEN duplicate_object THEN null;
5
+ END $$;
6
+ --> statement-breakpoint
7
+ DO $$ BEGIN
8
+ CREATE TYPE "public"."status" AS ENUM('pending', 'running', 'completed', 'failed', 'paused', 'cancelled');
9
+ EXCEPTION
10
+ WHEN duplicate_object THEN null;
11
+ END $$;
12
+ --> statement-breakpoint
13
+ CREATE TABLE IF NOT EXISTS "workflow_events" (
14
+ "id" varchar PRIMARY KEY NOT NULL,
15
+ "type" varchar NOT NULL,
16
+ "correlation_id" varchar,
17
+ "created_at" timestamp DEFAULT now() NOT NULL,
18
+ "run_id" varchar NOT NULL,
19
+ "payload" jsonb
20
+ );
21
+ --> statement-breakpoint
22
+ CREATE TABLE IF NOT EXISTS "workflow_hooks" (
23
+ "run_id" varchar NOT NULL,
24
+ "hook_id" varchar PRIMARY KEY NOT NULL,
25
+ "token" varchar NOT NULL,
26
+ "owner_id" varchar NOT NULL,
27
+ "project_id" varchar NOT NULL,
28
+ "environment" varchar NOT NULL,
29
+ "created_at" timestamp DEFAULT now() NOT NULL,
30
+ "metadata" jsonb
31
+ );
32
+ --> statement-breakpoint
33
+ CREATE TABLE IF NOT EXISTS "workflow_runs" (
34
+ "id" varchar PRIMARY KEY NOT NULL,
35
+ "output" jsonb,
36
+ "deployment_id" varchar NOT NULL,
37
+ "status" "status" NOT NULL,
38
+ "name" varchar NOT NULL,
39
+ "execution_context" jsonb,
40
+ "input" jsonb NOT NULL,
41
+ "error" text,
42
+ "error_code" varchar,
43
+ "created_at" timestamp DEFAULT now() NOT NULL,
44
+ "updated_at" timestamp DEFAULT now() NOT NULL,
45
+ "completed_at" timestamp,
46
+ "started_at" timestamp
47
+ );
48
+ --> statement-breakpoint
49
+ CREATE TABLE IF NOT EXISTS "workflow_steps" (
50
+ "run_id" varchar NOT NULL,
51
+ "step_id" varchar PRIMARY KEY NOT NULL,
52
+ "step_name" varchar NOT NULL,
53
+ "status" "step_status" NOT NULL,
54
+ "input" jsonb NOT NULL,
55
+ "output" jsonb,
56
+ "error" text,
57
+ "error_code" varchar,
58
+ "attempt" integer NOT NULL,
59
+ "started_at" timestamp,
60
+ "completed_at" timestamp,
61
+ "created_at" timestamp DEFAULT now() NOT NULL,
62
+ "updated_at" timestamp DEFAULT now() NOT NULL
63
+ );
64
+ --> statement-breakpoint
65
+ CREATE TABLE IF NOT EXISTS "workflow_stream_chunks" (
66
+ "id" varchar NOT NULL,
67
+ "stream_id" varchar NOT NULL,
68
+ "data" "bytea" NOT NULL,
69
+ "created_at" timestamp DEFAULT now() NOT NULL,
70
+ "eof" boolean NOT NULL,
71
+ CONSTRAINT "workflow_stream_chunks_stream_id_id_pk" PRIMARY KEY("stream_id","id")
72
+ );
73
+ --> statement-breakpoint
74
+ CREATE INDEX IF NOT EXISTS "workflow_events_run_id_index" ON "workflow_events" USING btree ("run_id");--> statement-breakpoint
75
+ CREATE INDEX IF NOT EXISTS "workflow_hooks_run_id_index" ON "workflow_hooks" USING btree ("run_id");--> statement-breakpoint
76
+ CREATE INDEX IF NOT EXISTS "workflow_hooks_token_index" ON "workflow_hooks" USING btree ("token");--> statement-breakpoint
77
+ CREATE INDEX IF NOT EXISTS "workflow_runs_name_index" ON "workflow_runs" USING btree ("name");--> statement-breakpoint
78
+ CREATE INDEX IF NOT EXISTS "workflow_runs_status_index" ON "workflow_runs" USING btree ("status");--> statement-breakpoint
79
+ CREATE INDEX IF NOT EXISTS "workflow_steps_run_id_index" ON "workflow_steps" USING btree ("run_id");--> statement-breakpoint
80
+ CREATE INDEX IF NOT EXISTS "workflow_steps_status_index" ON "workflow_steps" USING btree ("status");