rivetkit 2.1.0-rc.1 → 2.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.
- package/dist/browser/client.js +1 -1
- package/dist/browser/client.js.map +1 -1
- package/dist/browser/inspector/client.js +1 -1
- package/dist/browser/inspector/client.js.map +1 -1
- package/dist/inspector.tar.gz +0 -0
- package/dist/tsup/{chunk-SSEP6DHP.cjs → chunk-5CI72Y5G.cjs} +152 -152
- package/dist/tsup/{chunk-SSEP6DHP.cjs.map → chunk-5CI72Y5G.cjs.map} +1 -1
- package/dist/tsup/{chunk-7K4CYDGD.js → chunk-7T4AIAQV.js} +10 -5
- package/dist/tsup/chunk-7T4AIAQV.js.map +1 -0
- package/dist/tsup/{chunk-T5YCUGVS.js → chunk-CIXKJYPF.js} +2 -2
- package/dist/tsup/{chunk-TPGXWFQT.cjs → chunk-DQFZ5S3X.cjs} +3 -3
- package/dist/tsup/{chunk-TPGXWFQT.cjs.map → chunk-DQFZ5S3X.cjs.map} +1 -1
- package/dist/tsup/{chunk-6LIBPELE.js → chunk-E2WWZFTQ.js} +2 -2
- package/dist/tsup/chunk-E2WWZFTQ.js.map +1 -0
- package/dist/tsup/{chunk-OMEPCQK2.js → chunk-KGR7K72J.js} +81 -84
- package/dist/tsup/chunk-KGR7K72J.js.map +1 -0
- package/dist/tsup/{chunk-F6JYU5IK.cjs → chunk-LBUMYRTK.cjs} +74 -74
- package/dist/tsup/{chunk-F6JYU5IK.cjs.map → chunk-LBUMYRTK.cjs.map} +1 -1
- package/dist/tsup/{chunk-TYLXNCA5.cjs → chunk-LICW4TVI.cjs} +97 -97
- package/dist/tsup/{chunk-TYLXNCA5.cjs.map → chunk-LICW4TVI.cjs.map} +1 -1
- package/dist/tsup/{chunk-AIYEYMX5.cjs → chunk-OV6UBV6G.cjs} +26 -21
- package/dist/tsup/chunk-OV6UBV6G.cjs.map +1 -0
- package/dist/tsup/{chunk-HIDX4C5Y.cjs → chunk-RYSCONN4.cjs} +3 -3
- package/dist/tsup/{chunk-HIDX4C5Y.cjs.map → chunk-RYSCONN4.cjs.map} +1 -1
- package/dist/tsup/{chunk-5ESWDTHJ.js → chunk-SHX2N2B4.js} +6 -6
- package/dist/tsup/{chunk-YQ4LDVD6.cjs → chunk-TO4U43RL.cjs} +234 -234
- package/dist/tsup/{chunk-YQ4LDVD6.cjs.map → chunk-TO4U43RL.cjs.map} +1 -1
- package/dist/tsup/{chunk-HAZL2EPK.cjs → chunk-UHDLODMO.cjs} +4 -4
- package/dist/tsup/{chunk-HAZL2EPK.cjs.map → chunk-UHDLODMO.cjs.map} +1 -1
- package/dist/tsup/{chunk-LW6KLR7A.cjs → chunk-UN5D22OI.cjs} +2 -2
- package/dist/tsup/chunk-UN5D22OI.cjs.map +1 -0
- package/dist/tsup/{chunk-MZ37VV3P.js → chunk-VSFWZWCC.js} +5 -5
- package/dist/tsup/{chunk-XWBAQO5H.cjs → chunk-WLLTFDMH.cjs} +108 -111
- package/dist/tsup/chunk-WLLTFDMH.cjs.map +1 -0
- package/dist/tsup/{chunk-M2T62AZQ.js → chunk-WUXPLV6G.js} +3 -3
- package/dist/tsup/{chunk-IVG73YCW.js → chunk-XYUY6WQB.js} +2 -2
- package/dist/tsup/{chunk-DIGBC2VI.js → chunk-YLYT7WSZ.js} +5 -5
- package/dist/tsup/{chunk-A6YIZWTK.js → chunk-ZMZNIOTG.js} +2 -2
- package/dist/tsup/client/mod.cjs +6 -6
- package/dist/tsup/client/mod.js +5 -5
- package/dist/tsup/common/log.cjs +2 -2
- package/dist/tsup/common/log.js +1 -1
- package/dist/tsup/common/websocket.cjs +3 -3
- package/dist/tsup/common/websocket.js +2 -2
- package/dist/tsup/context-7X-Dm6_f.d.cts +75 -0
- package/dist/tsup/context-x9zKhx5T.d.ts +75 -0
- package/dist/tsup/driver-helpers/mod.cjs +4 -4
- package/dist/tsup/driver-helpers/mod.js +3 -3
- package/dist/tsup/driver-test-suite/mod.cjs +60 -60
- package/dist/tsup/driver-test-suite/mod.js +10 -10
- package/dist/tsup/inspector/mod.cjs +3 -3
- package/dist/tsup/inspector/mod.js +2 -2
- package/dist/tsup/mod.cjs +8 -8
- package/dist/tsup/mod.d.cts +2 -0
- package/dist/tsup/mod.d.ts +2 -0
- package/dist/tsup/mod.js +7 -7
- package/dist/tsup/serve-test-suite/mod.cjs +99 -99
- package/dist/tsup/serve-test-suite/mod.js +10 -10
- package/dist/tsup/test/mod.cjs +10 -10
- package/dist/tsup/test/mod.js +6 -6
- package/dist/tsup/utils.cjs +2 -2
- package/dist/tsup/utils.js +1 -1
- package/dist/tsup/workflow/mod.cjs +5 -5
- package/dist/tsup/workflow/mod.d.cts +4 -62
- package/dist/tsup/workflow/mod.d.ts +4 -62
- package/dist/tsup/workflow/mod.js +4 -4
- package/package.json +6 -6
- package/src/mod.ts +6 -0
- package/src/workflow/context.ts +75 -15
- package/src/workflow/mod.ts +7 -1
- package/dist/tsup/chunk-6LIBPELE.js.map +0 -1
- package/dist/tsup/chunk-7K4CYDGD.js.map +0 -1
- package/dist/tsup/chunk-AIYEYMX5.cjs.map +0 -1
- package/dist/tsup/chunk-LW6KLR7A.cjs.map +0 -1
- package/dist/tsup/chunk-OMEPCQK2.js.map +0 -1
- package/dist/tsup/chunk-XWBAQO5H.cjs.map +0 -1
- /package/dist/tsup/{chunk-T5YCUGVS.js.map → chunk-CIXKJYPF.js.map} +0 -0
- /package/dist/tsup/{chunk-5ESWDTHJ.js.map → chunk-SHX2N2B4.js.map} +0 -0
- /package/dist/tsup/{chunk-MZ37VV3P.js.map → chunk-VSFWZWCC.js.map} +0 -0
- /package/dist/tsup/{chunk-M2T62AZQ.js.map → chunk-WUXPLV6G.js.map} +0 -0
- /package/dist/tsup/{chunk-IVG73YCW.js.map → chunk-XYUY6WQB.js.map} +0 -0
- /package/dist/tsup/{chunk-DIGBC2VI.js.map → chunk-YLYT7WSZ.js.map} +0 -0
- /package/dist/tsup/{chunk-A6YIZWTK.js.map → chunk-ZMZNIOTG.js.map} +0 -0
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
import {
|
|
2
2
|
WORKFLOW_GUARD_KV_KEY,
|
|
3
3
|
workflow
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-7T4AIAQV.js";
|
|
5
5
|
import {
|
|
6
6
|
actor,
|
|
7
7
|
queue
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-SHX2N2B4.js";
|
|
9
9
|
import {
|
|
10
10
|
db
|
|
11
11
|
} from "./chunk-KJSYAUOM.js";
|
|
12
12
|
import {
|
|
13
13
|
getLogger,
|
|
14
14
|
promiseWithResolvers
|
|
15
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-E2WWZFTQ.js";
|
|
16
16
|
|
|
17
17
|
// src/driver-test-suite/log.ts
|
|
18
18
|
function logger() {
|
|
@@ -434,21 +434,16 @@ var workflowCounterActor = actor({
|
|
|
434
434
|
history: []
|
|
435
435
|
},
|
|
436
436
|
run: workflow(async (ctx) => {
|
|
437
|
-
await ctx.loop({
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
try {
|
|
442
|
-
actorLoopCtx.state;
|
|
443
|
-
} catch {
|
|
444
|
-
}
|
|
445
|
-
await loopCtx.step("increment", async () => {
|
|
446
|
-
actorLoopCtx.state.runCount += 1;
|
|
447
|
-
actorLoopCtx.state.history.push(actorLoopCtx.state.runCount);
|
|
448
|
-
});
|
|
449
|
-
await loopCtx.sleep("idle", 25);
|
|
450
|
-
return Loop.continue(void 0);
|
|
437
|
+
await ctx.loop("counter", async (loopCtx) => {
|
|
438
|
+
try {
|
|
439
|
+
loopCtx.state;
|
|
440
|
+
} catch {
|
|
451
441
|
}
|
|
442
|
+
await loopCtx.step("increment", async () => {
|
|
443
|
+
incrementWorkflowCounter(loopCtx);
|
|
444
|
+
});
|
|
445
|
+
await loopCtx.sleep("idle", 25);
|
|
446
|
+
return Loop.continue(void 0);
|
|
452
447
|
});
|
|
453
448
|
}),
|
|
454
449
|
actions: {
|
|
@@ -472,24 +467,19 @@ var workflowQueueActor = actor({
|
|
|
472
467
|
[WORKFLOW_QUEUE_NAME]: queue()
|
|
473
468
|
},
|
|
474
469
|
run: workflow(async (ctx) => {
|
|
475
|
-
await ctx.loop({
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
completable: true
|
|
482
|
-
});
|
|
483
|
-
if (!message || !message.complete) {
|
|
484
|
-
return Loop.continue(void 0);
|
|
485
|
-
}
|
|
486
|
-
const complete = message.complete;
|
|
487
|
-
await loopCtx.step("store-message", async () => {
|
|
488
|
-
actorLoopCtx.state.received.push(message.body);
|
|
489
|
-
await complete({ echo: message.body });
|
|
490
|
-
});
|
|
470
|
+
await ctx.loop("queue", async (loopCtx) => {
|
|
471
|
+
const message = await loopCtx.queue.next("queue-wait", {
|
|
472
|
+
names: [WORKFLOW_QUEUE_NAME],
|
|
473
|
+
completable: true
|
|
474
|
+
});
|
|
475
|
+
if (!message.complete) {
|
|
491
476
|
return Loop.continue(void 0);
|
|
492
477
|
}
|
|
478
|
+
const complete = message.complete;
|
|
479
|
+
await loopCtx.step("store-message", async () => {
|
|
480
|
+
await storeWorkflowQueueMessage(loopCtx, message.body, complete);
|
|
481
|
+
});
|
|
482
|
+
return Loop.continue(void 0);
|
|
493
483
|
});
|
|
494
484
|
}),
|
|
495
485
|
actions: {
|
|
@@ -523,39 +513,28 @@ var workflowAccessActor = actor({
|
|
|
523
513
|
insideClientAvailable: false
|
|
524
514
|
},
|
|
525
515
|
run: workflow(async (ctx) => {
|
|
526
|
-
await ctx.loop({
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
actorLoopCtx.client();
|
|
539
|
-
} catch (error) {
|
|
540
|
-
outsideClientError = error instanceof Error ? error.message : String(error);
|
|
541
|
-
}
|
|
542
|
-
await loopCtx.step("access-step", async () => {
|
|
543
|
-
var _a;
|
|
544
|
-
await loopCtx.db.execute(
|
|
545
|
-
`INSERT INTO workflow_access_log (created_at) VALUES (${Date.now()})`
|
|
546
|
-
);
|
|
547
|
-
const counts = await loopCtx.db.execute(
|
|
548
|
-
`SELECT COUNT(*) as count FROM workflow_access_log`
|
|
549
|
-
);
|
|
550
|
-
const client = loopCtx.client();
|
|
551
|
-
loopCtx.state.outsideDbError = outsideDbError;
|
|
552
|
-
loopCtx.state.outsideClientError = outsideClientError;
|
|
553
|
-
loopCtx.state.insideDbCount = ((_a = counts[0]) == null ? void 0 : _a.count) ?? 0;
|
|
554
|
-
loopCtx.state.insideClientAvailable = typeof client.workflowQueueActor.getForId === "function";
|
|
555
|
-
});
|
|
556
|
-
await loopCtx.sleep("idle", 25);
|
|
557
|
-
return Loop.continue(void 0);
|
|
516
|
+
await ctx.loop("access", async (loopCtx) => {
|
|
517
|
+
let outsideDbError = null;
|
|
518
|
+
let outsideClientError = null;
|
|
519
|
+
try {
|
|
520
|
+
loopCtx.db;
|
|
521
|
+
} catch (error) {
|
|
522
|
+
outsideDbError = error instanceof Error ? error.message : String(error);
|
|
523
|
+
}
|
|
524
|
+
try {
|
|
525
|
+
loopCtx.client();
|
|
526
|
+
} catch (error) {
|
|
527
|
+
outsideClientError = error instanceof Error ? error.message : String(error);
|
|
558
528
|
}
|
|
529
|
+
await loopCtx.step("access-step", async () => {
|
|
530
|
+
await updateWorkflowAccessState(
|
|
531
|
+
loopCtx,
|
|
532
|
+
outsideDbError,
|
|
533
|
+
outsideClientError
|
|
534
|
+
);
|
|
535
|
+
});
|
|
536
|
+
await loopCtx.sleep("idle", 25);
|
|
537
|
+
return Loop.continue(void 0);
|
|
559
538
|
});
|
|
560
539
|
}),
|
|
561
540
|
actions: {
|
|
@@ -567,16 +546,12 @@ var workflowSleepActor = actor({
|
|
|
567
546
|
ticks: 0
|
|
568
547
|
},
|
|
569
548
|
run: workflow(async (ctx) => {
|
|
570
|
-
await ctx.loop({
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
});
|
|
577
|
-
await loopCtx.sleep("delay", 40);
|
|
578
|
-
return Loop.continue(void 0);
|
|
579
|
-
}
|
|
549
|
+
await ctx.loop("sleep", async (loopCtx) => {
|
|
550
|
+
await loopCtx.step("tick", async () => {
|
|
551
|
+
incrementWorkflowSleepTick(loopCtx);
|
|
552
|
+
});
|
|
553
|
+
await loopCtx.sleep("delay", 40);
|
|
554
|
+
return Loop.continue(void 0);
|
|
580
555
|
});
|
|
581
556
|
}),
|
|
582
557
|
actions: {
|
|
@@ -601,14 +576,11 @@ var workflowStopTeardownActor = actor({
|
|
|
601
576
|
c.state.sleepAts.push(Date.now());
|
|
602
577
|
},
|
|
603
578
|
run: workflow(async (ctx) => {
|
|
604
|
-
await ctx.loop({
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
});
|
|
610
|
-
return Loop.continue(void 0);
|
|
611
|
-
}
|
|
579
|
+
await ctx.loop("wait-forever", async (loopCtx) => {
|
|
580
|
+
await loopCtx.queue.next("wait-for-never", {
|
|
581
|
+
names: ["never"]
|
|
582
|
+
});
|
|
583
|
+
return Loop.continue(void 0);
|
|
612
584
|
});
|
|
613
585
|
}),
|
|
614
586
|
actions: {
|
|
@@ -622,6 +594,31 @@ var workflowStopTeardownActor = actor({
|
|
|
622
594
|
runStopTimeout: 2e3
|
|
623
595
|
}
|
|
624
596
|
});
|
|
597
|
+
function incrementWorkflowCounter(ctx) {
|
|
598
|
+
ctx.state.runCount += 1;
|
|
599
|
+
ctx.state.history.push(ctx.state.runCount);
|
|
600
|
+
}
|
|
601
|
+
async function storeWorkflowQueueMessage(ctx, body, complete) {
|
|
602
|
+
ctx.state.received.push(body);
|
|
603
|
+
await complete({ echo: body });
|
|
604
|
+
}
|
|
605
|
+
async function updateWorkflowAccessState(ctx, outsideDbError, outsideClientError) {
|
|
606
|
+
var _a;
|
|
607
|
+
await ctx.db.execute(
|
|
608
|
+
`INSERT INTO workflow_access_log (created_at) VALUES (${Date.now()})`
|
|
609
|
+
);
|
|
610
|
+
const counts = await ctx.db.execute(
|
|
611
|
+
`SELECT COUNT(*) as count FROM workflow_access_log`
|
|
612
|
+
);
|
|
613
|
+
const client = ctx.client();
|
|
614
|
+
ctx.state.outsideDbError = outsideDbError;
|
|
615
|
+
ctx.state.outsideClientError = outsideClientError;
|
|
616
|
+
ctx.state.insideDbCount = ((_a = counts[0]) == null ? void 0 : _a.count) ?? 0;
|
|
617
|
+
ctx.state.insideClientAvailable = typeof client.workflowQueueActor.getForId === "function";
|
|
618
|
+
}
|
|
619
|
+
function incrementWorkflowSleepTick(ctx) {
|
|
620
|
+
ctx.state.ticks += 1;
|
|
621
|
+
}
|
|
625
622
|
|
|
626
623
|
export {
|
|
627
624
|
logger,
|
|
@@ -646,4 +643,4 @@ export {
|
|
|
646
643
|
workflowSleepActor,
|
|
647
644
|
workflowStopTeardownActor
|
|
648
645
|
};
|
|
649
|
-
//# sourceMappingURL=chunk-
|
|
646
|
+
//# sourceMappingURL=chunk-KGR7K72J.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/driver-test-suite/log.ts","../../fixtures/driver-test-suite/hibernation.ts","../../fixtures/driver-test-suite/sleep.ts","../../fixtures/driver-test-suite/run.ts","../../fixtures/driver-test-suite/workflow.ts"],"sourcesContent":["import { getLogger } from \"@/common/log\";\n\nexport function logger() {\n\treturn getLogger(\"test-suite\");\n}\n","import { actor } from \"rivetkit\";\n\nexport const HIBERNATION_SLEEP_TIMEOUT = 500;\n\nexport type HibernationConnState = {\n\tcount: number;\n\tconnectCount: number;\n\tdisconnectCount: number;\n};\n\nexport const hibernationActor = actor({\n\tstate: {\n\t\tsleepCount: 0,\n\t\twakeCount: 0,\n\t},\n\tcreateConnState: (c): HibernationConnState => {\n\t\treturn {\n\t\t\tcount: 0,\n\t\t\tconnectCount: 0,\n\t\t\tdisconnectCount: 0,\n\t\t};\n\t},\n\tonWake: (c) => {\n\t\tc.state.wakeCount += 1;\n\t},\n\tonSleep: (c) => {\n\t\tc.state.sleepCount += 1;\n\t},\n\tonConnect: (c, conn) => {\n\t\tconn.state.connectCount += 1;\n\t},\n\tonDisconnect: (c, conn) => {\n\t\tconn.state.disconnectCount += 1;\n\t},\n\tactions: {\n\t\t// Basic RPC that returns a simple value\n\t\tping: (c) => {\n\t\t\treturn \"pong\";\n\t\t},\n\t\t// Increment the connection's count\n\t\tconnIncrement: (c) => {\n\t\t\tc.conn.state.count += 1;\n\t\t\treturn c.conn.state.count;\n\t\t},\n\t\t// Get the connection's count\n\t\tgetConnCount: (c) => {\n\t\t\treturn c.conn.state.count;\n\t\t},\n\t\t// Get the connection's lifecycle counts\n\t\tgetConnLifecycleCounts: (c) => {\n\t\t\treturn {\n\t\t\t\tconnectCount: c.conn.state.connectCount,\n\t\t\t\tdisconnectCount: c.conn.state.disconnectCount,\n\t\t\t};\n\t\t},\n\t\t// Get all connection IDs\n\t\tgetConnectionIds: (c) => {\n\t\t\treturn c.conns\n\t\t\t\t.entries()\n\t\t\t\t.map((x) => x[0])\n\t\t\t\t.toArray();\n\t\t},\n\t\t// Get actor sleep/wake counts\n\t\tgetActorCounts: (c) => {\n\t\t\treturn {\n\t\t\t\tsleepCount: c.state.sleepCount,\n\t\t\t\twakeCount: c.state.wakeCount,\n\t\t\t};\n\t\t},\n\t\t// Trigger sleep\n\t\ttriggerSleep: (c) => {\n\t\t\tc.sleep();\n\t\t},\n\t},\n\toptions: {\n\t\tsleepTimeout: HIBERNATION_SLEEP_TIMEOUT,\n\t},\n});\n","import { actor, type UniversalWebSocket } from \"rivetkit\";\nimport { promiseWithResolvers } from \"rivetkit/utils\";\n\nexport const SLEEP_TIMEOUT = 1000;\n\nexport const sleep = actor({\n\tstate: { startCount: 0, sleepCount: 0 },\n\tonWake: (c) => {\n\t\tc.state.startCount += 1;\n\t},\n\tonSleep: (c) => {\n\t\tc.state.sleepCount += 1;\n\t},\n\tactions: {\n\t\ttriggerSleep: (c) => {\n\t\t\tc.sleep();\n\t\t},\n\t\tgetCounts: (c) => {\n\t\t\treturn {\n\t\t\t\tstartCount: c.state.startCount,\n\t\t\t\tsleepCount: c.state.sleepCount,\n\t\t\t};\n\t\t},\n\t\tsetAlarm: async (c, duration: number) => {\n\t\t\tawait c.schedule.after(duration, \"onAlarm\");\n\t\t},\n\t\tonAlarm: (c) => {\n\t\t\tc.log.info(\"alarm called\");\n\t\t},\n\t},\n\toptions: {\n\t\tsleepTimeout: SLEEP_TIMEOUT,\n\t},\n});\n\nexport const sleepWithLongRpc = actor({\n\tstate: { startCount: 0, sleepCount: 0 },\n\tcreateVars: () =>\n\t\t({}) as { longRunningResolve: PromiseWithResolvers<void> },\n\tonWake: (c) => {\n\t\tc.state.startCount += 1;\n\t},\n\tonSleep: (c) => {\n\t\tc.state.sleepCount += 1;\n\t},\n\tactions: {\n\t\tgetCounts: (c) => {\n\t\t\treturn {\n\t\t\t\tstartCount: c.state.startCount,\n\t\t\t\tsleepCount: c.state.sleepCount,\n\t\t\t};\n\t\t},\n\t\tlongRunningRpc: async (c) => {\n\t\t\tc.log.info(\"starting long running rpc\");\n\t\t\tc.vars.longRunningResolve = promiseWithResolvers((reason) => c.log.warn({ msg: \"unhandled long running rpc rejection\", reason }));\n\t\t\tc.broadcast(\"waiting\");\n\t\t\tawait c.vars.longRunningResolve.promise;\n\t\t\tc.log.info(\"finished long running rpc\");\n\t\t},\n\t\tfinishLongRunningRpc: (c) => c.vars.longRunningResolve?.resolve(),\n\t},\n\toptions: {\n\t\tsleepTimeout: SLEEP_TIMEOUT,\n\t},\n});\n\nexport const sleepWithRawHttp = actor({\n\tstate: { startCount: 0, sleepCount: 0, requestCount: 0 },\n\tonWake: (c) => {\n\t\tc.state.startCount += 1;\n\t},\n\tonSleep: (c) => {\n\t\tc.state.sleepCount += 1;\n\t},\n\tonRequest: async (c, request) => {\n\t\tc.state.requestCount += 1;\n\t\tconst url = new URL(request.url);\n\n\t\tif (url.pathname === \"/long-request\") {\n\t\t\tconst duration = parseInt(\n\t\t\t\turl.searchParams.get(\"duration\") || \"1000\",\n\t\t\t);\n\t\t\tc.log.info({ msg: \"starting long fetch request\", duration });\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, duration));\n\t\t\tc.log.info(\"finished long fetch request\");\n\t\t\treturn new Response(JSON.stringify({ completed: true }), {\n\t\t\t\theaders: { \"Content-Type\": \"application/json\" },\n\t\t\t});\n\t\t}\n\n\t\treturn new Response(\"Not Found\", { status: 404 });\n\t},\n\tactions: {\n\t\tgetCounts: (c) => {\n\t\t\treturn {\n\t\t\t\tstartCount: c.state.startCount,\n\t\t\t\tsleepCount: c.state.sleepCount,\n\t\t\t\trequestCount: c.state.requestCount,\n\t\t\t};\n\t\t},\n\t},\n\toptions: {\n\t\tsleepTimeout: SLEEP_TIMEOUT,\n\t},\n});\n\nexport const sleepWithRawWebSocket = actor({\n\tstate: { startCount: 0, sleepCount: 0, connectionCount: 0 },\n\tonWake: (c) => {\n\t\tc.state.startCount += 1;\n\t},\n\tonSleep: (c) => {\n\t\tc.state.sleepCount += 1;\n\t},\n\tonWebSocket: (c, websocket: UniversalWebSocket) => {\n\t\tc.state.connectionCount += 1;\n\t\tc.log.info({\n\t\t\tmsg: \"websocket connected\",\n\t\t\tconnectionCount: c.state.connectionCount,\n\t\t});\n\n\t\twebsocket.send(\n\t\t\tJSON.stringify({\n\t\t\t\ttype: \"connected\",\n\t\t\t\tconnectionCount: c.state.connectionCount,\n\t\t\t}),\n\t\t);\n\n\t\twebsocket.addEventListener(\"message\", (event: any) => {\n\t\t\tconst data = event.data;\n\t\t\tif (typeof data === \"string\") {\n\t\t\t\ttry {\n\t\t\t\t\tconst parsed = JSON.parse(data);\n\t\t\t\t\tif (parsed.type === \"getCounts\") {\n\t\t\t\t\t\twebsocket.send(\n\t\t\t\t\t\t\tJSON.stringify({\n\t\t\t\t\t\t\t\ttype: \"counts\",\n\t\t\t\t\t\t\t\tstartCount: c.state.startCount,\n\t\t\t\t\t\t\t\tsleepCount: c.state.sleepCount,\n\t\t\t\t\t\t\t\tconnectionCount: c.state.connectionCount,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t);\n\t\t\t\t\t} else if (parsed.type === \"keepAlive\") {\n\t\t\t\t\t\t// Just acknowledge to keep connection alive\n\t\t\t\t\t\twebsocket.send(JSON.stringify({ type: \"ack\" }));\n\t\t\t\t\t}\n\t\t\t\t} catch {\n\t\t\t\t\t// Echo non-JSON messages\n\t\t\t\t\twebsocket.send(data);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\twebsocket.addEventListener(\"close\", () => {\n\t\t\tc.state.connectionCount -= 1;\n\t\t\tc.log.info({\n\t\t\t\tmsg: \"websocket disconnected\",\n\t\t\t\tconnectionCount: c.state.connectionCount,\n\t\t\t});\n\t\t});\n\t},\n\tactions: {\n\t\tgetCounts: (c) => {\n\t\t\treturn {\n\t\t\t\tstartCount: c.state.startCount,\n\t\t\t\tsleepCount: c.state.sleepCount,\n\t\t\t\tconnectionCount: c.state.connectionCount,\n\t\t\t};\n\t\t},\n\t},\n\toptions: {\n\t\tsleepTimeout: SLEEP_TIMEOUT,\n\t},\n});\n\nexport const sleepWithNoSleepOption = actor({\n\tstate: { startCount: 0, sleepCount: 0 },\n\tonWake: (c) => {\n\t\tc.state.startCount += 1;\n\t},\n\tonSleep: (c) => {\n\t\tc.state.sleepCount += 1;\n\t},\n\tactions: {\n\t\tgetCounts: (c) => {\n\t\t\treturn {\n\t\t\t\tstartCount: c.state.startCount,\n\t\t\t\tsleepCount: c.state.sleepCount,\n\t\t\t};\n\t\t},\n\t},\n\toptions: {\n\t\tsleepTimeout: SLEEP_TIMEOUT,\n\t\tnoSleep: true,\n\t},\n});\n","import { actor } from \"rivetkit\";\nimport type { registry } from \"./registry\";\n\nexport const RUN_SLEEP_TIMEOUT = 1000;\n\n// Actor that tracks tick counts and respects abort signal\nexport const runWithTicks = actor({\n\tstate: {\n\t\ttickCount: 0,\n\t\tlastTickAt: 0,\n\t\trunStarted: false,\n\t\trunExited: false,\n\t},\n\trun: async (c) => {\n\t\tc.state.runStarted = true;\n\t\tc.log.info(\"run handler started\");\n\n\t\twhile (!c.aborted) {\n\t\t\tc.state.tickCount += 1;\n\t\t\tc.state.lastTickAt = Date.now();\n\t\t\tc.log.info({ msg: \"tick\", tickCount: c.state.tickCount });\n\n\t\t\t// Wait 50ms between ticks, or exit early if aborted\n\t\t\tawait new Promise<void>((resolve) => {\n\t\t\t\tconst timeout = setTimeout(resolve, 50);\n\t\t\t\tc.abortSignal.addEventListener(\n\t\t\t\t\t\"abort\",\n\t\t\t\t\t() => {\n\t\t\t\t\t\tclearTimeout(timeout);\n\t\t\t\t\t\tresolve();\n\t\t\t\t\t},\n\t\t\t\t\t{ once: true },\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\n\t\tc.state.runExited = true;\n\t\tc.log.info(\"run handler exiting gracefully\");\n\t},\n\tactions: {\n\t\tgetState: (c) => ({\n\t\t\ttickCount: c.state.tickCount,\n\t\t\tlastTickAt: c.state.lastTickAt,\n\t\t\trunStarted: c.state.runStarted,\n\t\t\trunExited: c.state.runExited,\n\t\t}),\n\t},\n\toptions: {\n\t\tsleepTimeout: RUN_SLEEP_TIMEOUT,\n\t\trunStopTimeout: 1000,\n\t},\n});\n\n// Actor that consumes from a queue in the run handler\nexport const runWithQueueConsumer = actor({\n\tstate: {\n\t\tmessagesReceived: [] as Array<{ name: string; body: unknown }>,\n\t\trunStarted: false,\n\t\twakeCount: 0,\n\t},\n\tonWake: (c) => {\n\t\tc.state.wakeCount += 1;\n\t},\n\trun: async (c) => {\n\t\tc.state.runStarted = true;\n\t\tc.log.info(\"run handler started, waiting for messages\");\n\n\t\twhile (!c.aborted) {\n\t\t\tconst messages = await c.queue.next({ names: [\"messages\"] });\n\t\t\tconst message = messages[0];\n\t\t\tif (message) {\n\t\t\t\tc.log.info({ msg: \"received message\", body: message.body });\n\t\t\t\tc.state.messagesReceived.push({\n\t\t\t\t\tname: message.name,\n\t\t\t\t\tbody: message.body,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tc.log.info(\"run handler exiting gracefully\");\n\t},\n\tactions: {\n\t\tgetState: (c) => ({\n\t\t\tmessagesReceived: c.state.messagesReceived,\n\t\t\trunStarted: c.state.runStarted,\n\t\t\twakeCount: c.state.wakeCount,\n\t\t}),\n\t\tsendMessage: async (c, body: unknown) => {\n\t\t\tconst client = c.client<typeof registry>();\n\t\t\tconst handle = client.runWithQueueConsumer.getForId(c.actorId);\n\t\t\tawait handle.send(\"messages\", body);\n\t\t\treturn true;\n\t\t},\n\t},\n\toptions: {\n\t\tsleepTimeout: RUN_SLEEP_TIMEOUT,\n\t\trunStopTimeout: 1000,\n\t},\n});\n\n// Actor that exits the run handler after a short delay to test crash behavior\nexport const runWithEarlyExit = actor({\n\tstate: {\n\t\trunStarted: false,\n\t\tdestroyCalled: false,\n\t},\n\trun: async (c) => {\n\t\tc.state.runStarted = true;\n\t\tc.log.info(\"run handler started, will exit after delay\");\n\t\t// Wait a bit so we can observe the runStarted state before exit\n\t\tawait new Promise((resolve) => setTimeout(resolve, 200));\n\t\tc.log.info(\"run handler exiting early\");\n\t\t// Exit without respecting abort signal\n\t},\n\tonDestroy: (c) => {\n\t\tc.state.destroyCalled = true;\n\t},\n\tactions: {\n\t\tgetState: (c) => ({\n\t\t\trunStarted: c.state.runStarted,\n\t\t\tdestroyCalled: c.state.destroyCalled,\n\t\t}),\n\t},\n\toptions: {\n\t\tsleepTimeout: RUN_SLEEP_TIMEOUT,\n\t},\n});\n\n// Actor that throws an error in the run handler to test crash behavior\nexport const runWithError = actor({\n\tstate: {\n\t\trunStarted: false,\n\t\tdestroyCalled: false,\n\t},\n\trun: async (c) => {\n\t\tc.state.runStarted = true;\n\t\tc.log.info(\"run handler started, will throw error\");\n\t\tawait new Promise((resolve) => setTimeout(resolve, 200));\n\t\tthrow new Error(\"intentional error in run handler\");\n\t},\n\tonDestroy: (c) => {\n\t\tc.state.destroyCalled = true;\n\t},\n\tactions: {\n\t\tgetState: (c) => ({\n\t\t\trunStarted: c.state.runStarted,\n\t\t\tdestroyCalled: c.state.destroyCalled,\n\t\t}),\n\t},\n\toptions: {\n\t\tsleepTimeout: RUN_SLEEP_TIMEOUT,\n\t},\n});\n\n// Actor without a run handler for comparison\nexport const runWithoutHandler = actor({\n\tstate: {\n\t\twakeCount: 0,\n\t},\n\tonWake: (c) => {\n\t\tc.state.wakeCount += 1;\n\t},\n\tactions: {\n\t\tgetState: (c) => ({\n\t\t\twakeCount: c.state.wakeCount,\n\t\t}),\n\t},\n\toptions: {\n\t\tsleepTimeout: RUN_SLEEP_TIMEOUT,\n\t},\n});\n","import { Loop } from \"@rivetkit/workflow-engine\";\nimport { actor, queue } from \"@/actor/mod\";\nimport { db } from \"@/db/mod\";\nimport { WORKFLOW_GUARD_KV_KEY } from \"@/workflow/constants\";\nimport { type WorkflowLoopContextOf, workflow } from \"@/workflow/mod\";\nimport type { registry } from \"./registry\";\n\nconst WORKFLOW_QUEUE_NAME = \"workflow-default\";\n\nexport const workflowCounterActor = actor({\n\tstate: {\n\t\trunCount: 0,\n\t\tguardTriggered: false,\n\t\thistory: [] as number[],\n\t},\n\trun: workflow(async (ctx) => {\n\t\tawait ctx.loop(\"counter\", async (loopCtx) => {\n\t\t\t\ttry {\n\t\t\t\t\t// Accessing state outside a step should throw.\n\t\t\t\t\t// biome-ignore lint/style/noUnusedExpressions: intentionally checking accessor.\n\t\t\t\t\tloopCtx.state;\n\t\t\t\t} catch {}\n\n\t\t\t\tawait loopCtx.step(\"increment\", async () => {\n\t\t\t\t\tincrementWorkflowCounter(loopCtx);\n\t\t\t\t});\n\n\t\t\t\tawait loopCtx.sleep(\"idle\", 25);\n\t\t\t\treturn Loop.continue(undefined);\n\t\t\t});\n\t}),\n\tactions: {\n\t\tgetState: async (c) => {\n\t\t\tconst guardFlag = await c.kv.get(WORKFLOW_GUARD_KV_KEY);\n\t\t\tif (guardFlag === \"true\") {\n\t\t\t\tc.state.guardTriggered = true;\n\t\t\t}\n\t\t\treturn c.state;\n\t\t},\n\t},\n\toptions: {\n\t\tsleepTimeout: 50,\n\t},\n});\n\nexport const workflowQueueActor = actor({\n\tstate: {\n\t\treceived: [] as unknown[],\n\t},\n\tqueues: {\n\t\t[WORKFLOW_QUEUE_NAME]: queue<unknown, { echo: unknown }>(),\n\t},\n\trun: workflow(async (ctx) => {\n\t\tawait ctx.loop(\"queue\", async (loopCtx) => {\n\t\t\t\tconst message = await loopCtx.queue.next(\"queue-wait\", {\n\t\t\t\t\tnames: [WORKFLOW_QUEUE_NAME],\n\t\t\t\t\tcompletable: true,\n\t\t\t\t});\n\t\t\t\tif (!message.complete) {\n\t\t\t\t\treturn Loop.continue(undefined);\n\t\t\t\t}\n\t\t\t\tconst complete = message.complete;\n\t\t\t\tawait loopCtx.step(\"store-message\", async () => {\n\t\t\t\t\tawait storeWorkflowQueueMessage(loopCtx, message.body, complete);\n\t\t\t\t});\n\t\t\t\treturn Loop.continue(undefined);\n\t\t\t});\n\t}),\n\tactions: {\n\t\tgetMessages: (c) => c.state.received,\n\t\tsendAndWait: async (c, payload: unknown) => {\n\t\t\tconst client = c.client<typeof registry>();\n\t\t\tconst handle = client.workflowQueueActor.getForId(c.actorId);\n\t\t\treturn await handle.send(\n\t\t\t\tWORKFLOW_QUEUE_NAME,\n\t\t\t\tpayload,\n\t\t\t\t{ wait: true, timeout: 1_000 },\n\t\t\t);\n\t\t},\n\t},\n});\n\nexport const workflowAccessActor = actor({\n\tdb: db({\n\t\tonMigrate: async (rawDb) => {\n\t\t\tawait rawDb.execute(`\n\t\t\t\tCREATE TABLE IF NOT EXISTS workflow_access_log (\n\t\t\t\t\tid INTEGER PRIMARY KEY AUTOINCREMENT,\n\t\t\t\t\tcreated_at INTEGER NOT NULL\n\t\t\t\t)\n\t\t\t`);\n\t\t},\n\t}),\n\tstate: {\n\t\toutsideDbError: null as string | null,\n\t\toutsideClientError: null as string | null,\n\t\tinsideDbCount: 0,\n\t\tinsideClientAvailable: false,\n\t},\n\trun: workflow(async (ctx) => {\n\t\tawait ctx.loop(\"access\", async (loopCtx) => {\n\t\t\t\tlet outsideDbError: string | null = null;\n\t\t\t\tlet outsideClientError: string | null = null;\n\n\t\t\t\ttry {\n\t\t\t\t\t// Accessing db outside a step should throw.\n\t\t\t\t\t// biome-ignore lint/style/noUnusedExpressions: intentionally checking accessor.\n\t\t\t\t\tloopCtx.db;\n\t\t\t\t} catch (error) {\n\t\t\t\t\toutsideDbError =\n\t\t\t\t\t\terror instanceof Error ? error.message : String(error);\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tloopCtx.client<typeof registry>();\n\t\t\t\t} catch (error) {\n\t\t\t\t\toutsideClientError =\n\t\t\t\t\t\terror instanceof Error ? error.message : String(error);\n\t\t\t\t}\n\n\t\t\t\tawait loopCtx.step(\"access-step\", async () => {\n\t\t\t\t\tawait updateWorkflowAccessState(\n\t\t\t\t\t\tloopCtx,\n\t\t\t\t\t\toutsideDbError,\n\t\t\t\t\t\toutsideClientError,\n\t\t\t\t\t);\n\t\t\t\t});\n\n\t\t\t\tawait loopCtx.sleep(\"idle\", 25);\n\t\t\t\treturn Loop.continue(undefined);\n\t\t\t});\n\t}),\n\tactions: {\n\t\tgetState: (c) => c.state,\n\t},\n});\n\nexport const workflowSleepActor = actor({\n\tstate: {\n\t\tticks: 0,\n\t},\n\trun: workflow(async (ctx) => {\n\t\tawait ctx.loop(\"sleep\", async (loopCtx) => {\n\t\t\t\tawait loopCtx.step(\"tick\", async () => {\n\t\t\t\t\tincrementWorkflowSleepTick(loopCtx);\n\t\t\t\t});\n\t\t\t\tawait loopCtx.sleep(\"delay\", 40);\n\t\t\t\treturn Loop.continue(undefined);\n\t\t\t});\n\t}),\n\tactions: {\n\t\tgetState: (c) => c.state,\n\t},\n\toptions: {\n\t\tsleepTimeout: 50,\n\t},\n});\n\nexport const workflowStopTeardownActor = actor({\n\tstate: {\n\t\twakeAts: [] as number[],\n\t\tsleepAts: [] as number[],\n\t},\n\tqueues: {\n\t\tnever: queue<unknown>(),\n\t},\n\tonWake: (c) => {\n\t\tc.state.wakeAts.push(Date.now());\n\t},\n\tonSleep: (c) => {\n\t\tc.state.sleepAts.push(Date.now());\n\t},\n\trun: workflow(async (ctx) => {\n\t\tawait ctx.loop(\"wait-forever\", async (loopCtx) => {\n\t\t\t\tawait loopCtx.queue.next(\"wait-for-never\", {\n\t\t\t\t\tnames: [\"never\"],\n\t\t\t\t});\n\t\t\t\treturn Loop.continue(undefined);\n\t\t\t});\n\t}),\n\tactions: {\n\t\tgetTimeline: (c) => ({\n\t\t\twakeAts: [...c.state.wakeAts],\n\t\t\tsleepAts: [...c.state.sleepAts],\n\t\t}),\n\t},\n\toptions: {\n\t\tsleepTimeout: 75,\n\t\trunStopTimeout: 2_000,\n\t},\n});\n\nfunction incrementWorkflowCounter(\n\tctx: WorkflowLoopContextOf<typeof workflowCounterActor>,\n): void {\n\tctx.state.runCount += 1;\n\tctx.state.history.push(ctx.state.runCount);\n}\n\nasync function storeWorkflowQueueMessage(\n\tctx: WorkflowLoopContextOf<typeof workflowQueueActor>,\n\tbody: unknown,\n\tcomplete: (response: { echo: unknown }) => Promise<void>,\n): Promise<void> {\n\tctx.state.received.push(body);\n\tawait complete({ echo: body });\n}\n\nasync function updateWorkflowAccessState(\n\tctx: WorkflowLoopContextOf<typeof workflowAccessActor>,\n\toutsideDbError: string | null,\n\toutsideClientError: string | null,\n): Promise<void> {\n\tawait ctx.db.execute(\n\t\t`INSERT INTO workflow_access_log (created_at) VALUES (${Date.now()})`,\n\t);\n\tconst counts = await ctx.db.execute<{ count: number }>(\n\t\t`SELECT COUNT(*) as count FROM workflow_access_log`,\n\t);\n\tconst client = ctx.client<typeof registry>();\n\n\tctx.state.outsideDbError = outsideDbError;\n\tctx.state.outsideClientError = outsideClientError;\n\tctx.state.insideDbCount = counts[0]?.count ?? 0;\n\tctx.state.insideClientAvailable =\n\t\ttypeof client.workflowQueueActor.getForId === \"function\";\n}\n\nfunction incrementWorkflowSleepTick(\n\tctx: WorkflowLoopContextOf<typeof workflowSleepActor>,\n): void {\n\tctx.state.ticks += 1;\n}\n\nexport { WORKFLOW_QUEUE_NAME };\n"],"mappings":"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","names":[]}
|