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.
Files changed (83) hide show
  1. package/dist/browser/client.js +1 -1
  2. package/dist/browser/client.js.map +1 -1
  3. package/dist/browser/inspector/client.js +1 -1
  4. package/dist/browser/inspector/client.js.map +1 -1
  5. package/dist/inspector.tar.gz +0 -0
  6. package/dist/tsup/{chunk-SSEP6DHP.cjs → chunk-5CI72Y5G.cjs} +152 -152
  7. package/dist/tsup/{chunk-SSEP6DHP.cjs.map → chunk-5CI72Y5G.cjs.map} +1 -1
  8. package/dist/tsup/{chunk-7K4CYDGD.js → chunk-7T4AIAQV.js} +10 -5
  9. package/dist/tsup/chunk-7T4AIAQV.js.map +1 -0
  10. package/dist/tsup/{chunk-T5YCUGVS.js → chunk-CIXKJYPF.js} +2 -2
  11. package/dist/tsup/{chunk-TPGXWFQT.cjs → chunk-DQFZ5S3X.cjs} +3 -3
  12. package/dist/tsup/{chunk-TPGXWFQT.cjs.map → chunk-DQFZ5S3X.cjs.map} +1 -1
  13. package/dist/tsup/{chunk-6LIBPELE.js → chunk-E2WWZFTQ.js} +2 -2
  14. package/dist/tsup/chunk-E2WWZFTQ.js.map +1 -0
  15. package/dist/tsup/{chunk-OMEPCQK2.js → chunk-KGR7K72J.js} +81 -84
  16. package/dist/tsup/chunk-KGR7K72J.js.map +1 -0
  17. package/dist/tsup/{chunk-F6JYU5IK.cjs → chunk-LBUMYRTK.cjs} +74 -74
  18. package/dist/tsup/{chunk-F6JYU5IK.cjs.map → chunk-LBUMYRTK.cjs.map} +1 -1
  19. package/dist/tsup/{chunk-TYLXNCA5.cjs → chunk-LICW4TVI.cjs} +97 -97
  20. package/dist/tsup/{chunk-TYLXNCA5.cjs.map → chunk-LICW4TVI.cjs.map} +1 -1
  21. package/dist/tsup/{chunk-AIYEYMX5.cjs → chunk-OV6UBV6G.cjs} +26 -21
  22. package/dist/tsup/chunk-OV6UBV6G.cjs.map +1 -0
  23. package/dist/tsup/{chunk-HIDX4C5Y.cjs → chunk-RYSCONN4.cjs} +3 -3
  24. package/dist/tsup/{chunk-HIDX4C5Y.cjs.map → chunk-RYSCONN4.cjs.map} +1 -1
  25. package/dist/tsup/{chunk-5ESWDTHJ.js → chunk-SHX2N2B4.js} +6 -6
  26. package/dist/tsup/{chunk-YQ4LDVD6.cjs → chunk-TO4U43RL.cjs} +234 -234
  27. package/dist/tsup/{chunk-YQ4LDVD6.cjs.map → chunk-TO4U43RL.cjs.map} +1 -1
  28. package/dist/tsup/{chunk-HAZL2EPK.cjs → chunk-UHDLODMO.cjs} +4 -4
  29. package/dist/tsup/{chunk-HAZL2EPK.cjs.map → chunk-UHDLODMO.cjs.map} +1 -1
  30. package/dist/tsup/{chunk-LW6KLR7A.cjs → chunk-UN5D22OI.cjs} +2 -2
  31. package/dist/tsup/chunk-UN5D22OI.cjs.map +1 -0
  32. package/dist/tsup/{chunk-MZ37VV3P.js → chunk-VSFWZWCC.js} +5 -5
  33. package/dist/tsup/{chunk-XWBAQO5H.cjs → chunk-WLLTFDMH.cjs} +108 -111
  34. package/dist/tsup/chunk-WLLTFDMH.cjs.map +1 -0
  35. package/dist/tsup/{chunk-M2T62AZQ.js → chunk-WUXPLV6G.js} +3 -3
  36. package/dist/tsup/{chunk-IVG73YCW.js → chunk-XYUY6WQB.js} +2 -2
  37. package/dist/tsup/{chunk-DIGBC2VI.js → chunk-YLYT7WSZ.js} +5 -5
  38. package/dist/tsup/{chunk-A6YIZWTK.js → chunk-ZMZNIOTG.js} +2 -2
  39. package/dist/tsup/client/mod.cjs +6 -6
  40. package/dist/tsup/client/mod.js +5 -5
  41. package/dist/tsup/common/log.cjs +2 -2
  42. package/dist/tsup/common/log.js +1 -1
  43. package/dist/tsup/common/websocket.cjs +3 -3
  44. package/dist/tsup/common/websocket.js +2 -2
  45. package/dist/tsup/context-7X-Dm6_f.d.cts +75 -0
  46. package/dist/tsup/context-x9zKhx5T.d.ts +75 -0
  47. package/dist/tsup/driver-helpers/mod.cjs +4 -4
  48. package/dist/tsup/driver-helpers/mod.js +3 -3
  49. package/dist/tsup/driver-test-suite/mod.cjs +60 -60
  50. package/dist/tsup/driver-test-suite/mod.js +10 -10
  51. package/dist/tsup/inspector/mod.cjs +3 -3
  52. package/dist/tsup/inspector/mod.js +2 -2
  53. package/dist/tsup/mod.cjs +8 -8
  54. package/dist/tsup/mod.d.cts +2 -0
  55. package/dist/tsup/mod.d.ts +2 -0
  56. package/dist/tsup/mod.js +7 -7
  57. package/dist/tsup/serve-test-suite/mod.cjs +99 -99
  58. package/dist/tsup/serve-test-suite/mod.js +10 -10
  59. package/dist/tsup/test/mod.cjs +10 -10
  60. package/dist/tsup/test/mod.js +6 -6
  61. package/dist/tsup/utils.cjs +2 -2
  62. package/dist/tsup/utils.js +1 -1
  63. package/dist/tsup/workflow/mod.cjs +5 -5
  64. package/dist/tsup/workflow/mod.d.cts +4 -62
  65. package/dist/tsup/workflow/mod.d.ts +4 -62
  66. package/dist/tsup/workflow/mod.js +4 -4
  67. package/package.json +6 -6
  68. package/src/mod.ts +6 -0
  69. package/src/workflow/context.ts +75 -15
  70. package/src/workflow/mod.ts +7 -1
  71. package/dist/tsup/chunk-6LIBPELE.js.map +0 -1
  72. package/dist/tsup/chunk-7K4CYDGD.js.map +0 -1
  73. package/dist/tsup/chunk-AIYEYMX5.cjs.map +0 -1
  74. package/dist/tsup/chunk-LW6KLR7A.cjs.map +0 -1
  75. package/dist/tsup/chunk-OMEPCQK2.js.map +0 -1
  76. package/dist/tsup/chunk-XWBAQO5H.cjs.map +0 -1
  77. /package/dist/tsup/{chunk-T5YCUGVS.js.map → chunk-CIXKJYPF.js.map} +0 -0
  78. /package/dist/tsup/{chunk-5ESWDTHJ.js.map → chunk-SHX2N2B4.js.map} +0 -0
  79. /package/dist/tsup/{chunk-MZ37VV3P.js.map → chunk-VSFWZWCC.js.map} +0 -0
  80. /package/dist/tsup/{chunk-M2T62AZQ.js.map → chunk-WUXPLV6G.js.map} +0 -0
  81. /package/dist/tsup/{chunk-IVG73YCW.js.map → chunk-XYUY6WQB.js.map} +0 -0
  82. /package/dist/tsup/{chunk-DIGBC2VI.js.map → chunk-YLYT7WSZ.js.map} +0 -0
  83. /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-7K4CYDGD.js";
4
+ } from "./chunk-7T4AIAQV.js";
5
5
  import {
6
6
  actor,
7
7
  queue
8
- } from "./chunk-5ESWDTHJ.js";
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-6LIBPELE.js";
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
- name: "counter",
439
- run: async (loopCtx) => {
440
- const actorLoopCtx = loopCtx;
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
- name: "queue",
477
- run: async (loopCtx) => {
478
- const actorLoopCtx = loopCtx;
479
- const [message] = await loopCtx.queue.next("queue-wait", {
480
- names: [WORKFLOW_QUEUE_NAME],
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
- name: "access",
528
- run: async (loopCtx) => {
529
- const actorLoopCtx = loopCtx;
530
- let outsideDbError = null;
531
- let outsideClientError = null;
532
- try {
533
- actorLoopCtx.db;
534
- } catch (error) {
535
- outsideDbError = error instanceof Error ? error.message : String(error);
536
- }
537
- try {
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
- name: "sleep",
572
- run: async (loopCtx) => {
573
- const actorLoopCtx = loopCtx;
574
- await loopCtx.step("tick", async () => {
575
- actorLoopCtx.state.ticks += 1;
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
- name: "wait-forever",
606
- run: async (loopCtx) => {
607
- await loopCtx.queue.next("wait-for-never", {
608
- names: ["never"]
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-OMEPCQK2.js.map
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":[]}