rivetkit 2.3.29 → 3.0.0-preview.1

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 (135) hide show
  1. package/dist/browser/client.d.ts +58 -9
  2. package/dist/browser/client.js +193 -20
  3. package/dist/browser/client.js.map +1 -1
  4. package/dist/browser/inspector/client.js +1 -2
  5. package/dist/browser/inspector/client.js.map +1 -1
  6. package/dist/tsup/{chunk-WHAUEDUT.cjs → chunk-3E2BPHQO.cjs} +10 -10
  7. package/dist/tsup/{chunk-WHAUEDUT.cjs.map → chunk-3E2BPHQO.cjs.map} +1 -1
  8. package/dist/tsup/{chunk-K7QBHEVI.js → chunk-3MMTF3QA.js} +185 -25
  9. package/dist/tsup/chunk-3MMTF3QA.js.map +1 -0
  10. package/dist/tsup/{chunk-WHA3XM3R.js → chunk-5OCN7VHH.js} +10 -11
  11. package/dist/tsup/chunk-5OCN7VHH.js.map +1 -0
  12. package/dist/tsup/{chunk-CRBPB6QI.cjs → chunk-6DDQSAAT.cjs} +7 -7
  13. package/dist/tsup/{chunk-CRBPB6QI.cjs.map → chunk-6DDQSAAT.cjs.map} +1 -1
  14. package/dist/tsup/{chunk-JI6GZ2C2.js → chunk-A2CF6PFH.js} +18 -1
  15. package/dist/tsup/chunk-A2CF6PFH.js.map +1 -0
  16. package/dist/tsup/{chunk-WSSI5L6L.cjs → chunk-CTQKKUZC.cjs} +326 -166
  17. package/dist/tsup/chunk-CTQKKUZC.cjs.map +1 -0
  18. package/dist/tsup/{chunk-IXJCAFAQ.js → chunk-DCDCHB5J.js} +2 -2
  19. package/dist/tsup/{chunk-SNFXCNXD.js → chunk-DQ6K3VVV.js} +3 -3
  20. package/dist/tsup/{chunk-RY6Z4RA5.js → chunk-H6W37YLT.js} +2 -2
  21. package/dist/tsup/{chunk-Q6GKUC22.cjs → chunk-HW2D5OFJ.cjs} +3 -3
  22. package/dist/tsup/{chunk-Q6GKUC22.cjs.map → chunk-HW2D5OFJ.cjs.map} +1 -1
  23. package/dist/tsup/{chunk-DTGPF6XY.cjs → chunk-IBEFA6CX.cjs} +10 -11
  24. package/dist/tsup/chunk-IBEFA6CX.cjs.map +1 -0
  25. package/dist/tsup/{chunk-56QW6V7F.cjs → chunk-JLBPBEWC.cjs} +3 -3
  26. package/dist/tsup/{chunk-56QW6V7F.cjs.map → chunk-JLBPBEWC.cjs.map} +1 -1
  27. package/dist/tsup/{chunk-JMUNIWKG.js → chunk-KQ2WQDYT.js} +2 -2
  28. package/dist/tsup/{chunk-MYWZCDML.cjs → chunk-RTWH3AX3.cjs} +19 -2
  29. package/dist/tsup/chunk-RTWH3AX3.cjs.map +1 -0
  30. package/dist/tsup/{chunk-U3KY2OGG.js → chunk-SJPPKBT3.js} +2 -2
  31. package/dist/tsup/{chunk-7TRYBX2R.js → chunk-TBJ4I3R3.js} +4 -4
  32. package/dist/tsup/{chunk-NK4D6G45.cjs → chunk-VCVV726P.cjs} +4 -4
  33. package/dist/tsup/{chunk-NK4D6G45.cjs.map → chunk-VCVV726P.cjs.map} +1 -1
  34. package/dist/tsup/{chunk-RDBXO2ND.cjs → chunk-XUO6G4H6.cjs} +3 -3
  35. package/dist/tsup/{chunk-RDBXO2ND.cjs.map → chunk-XUO6G4H6.cjs.map} +1 -1
  36. package/dist/tsup/client/mod.cjs +6 -6
  37. package/dist/tsup/client/mod.d.cts +15 -3
  38. package/dist/tsup/client/mod.d.ts +15 -3
  39. package/dist/tsup/client/mod.js +5 -5
  40. package/dist/tsup/common/log.cjs +2 -2
  41. package/dist/tsup/common/log.js +1 -1
  42. package/dist/tsup/common/websocket.cjs +3 -3
  43. package/dist/tsup/common/websocket.js +2 -2
  44. package/dist/tsup/{config-osdJqQwX.d.cts → config-8NgsxIcT.d.cts} +43 -12
  45. package/dist/tsup/{config-ey2I2zz5.d.cts → config-B2wlj9wx.d.cts} +7 -1
  46. package/dist/tsup/{config-ey2I2zz5.d.ts → config-B2wlj9wx.d.ts} +7 -1
  47. package/dist/tsup/{config-Cv6pjCt-.d.ts → config-DJ3KW-fe.d.ts} +43 -12
  48. package/dist/tsup/{context-CoVbKBuk.d.ts → context-BL8kUGjq.d.ts} +2 -2
  49. package/dist/tsup/{context-DpjrM7n7.d.cts → context-_RoE_YHL.d.cts} +2 -2
  50. package/dist/tsup/db/drizzle.cjs +2 -2
  51. package/dist/tsup/db/drizzle.d.cts +1 -1
  52. package/dist/tsup/db/drizzle.d.ts +1 -1
  53. package/dist/tsup/db/drizzle.js +1 -1
  54. package/dist/tsup/db/mod.cjs +3 -3
  55. package/dist/tsup/db/mod.d.cts +2 -2
  56. package/dist/tsup/db/mod.d.ts +2 -2
  57. package/dist/tsup/db/mod.js +2 -2
  58. package/dist/tsup/dynamic/mod.d.cts +2 -2
  59. package/dist/tsup/dynamic/mod.d.ts +2 -2
  60. package/dist/tsup/inspector/mod.cjs +5 -5
  61. package/dist/tsup/inspector/mod.js +4 -4
  62. package/dist/tsup/inspector/workflow.cjs +4 -4
  63. package/dist/tsup/inspector/workflow.js +3 -3
  64. package/dist/tsup/inspector-tab/mod.d.cts +3 -3
  65. package/dist/tsup/inspector-tab/mod.d.ts +3 -3
  66. package/dist/tsup/mod.cjs +254 -166
  67. package/dist/tsup/mod.cjs.map +1 -1
  68. package/dist/tsup/mod.d.cts +4 -4
  69. package/dist/tsup/mod.d.ts +4 -4
  70. package/dist/tsup/mod.js +168 -80
  71. package/dist/tsup/mod.js.map +1 -1
  72. package/dist/tsup/test/mod.cjs +7 -7
  73. package/dist/tsup/test/mod.d.cts +2 -2
  74. package/dist/tsup/test/mod.d.ts +2 -2
  75. package/dist/tsup/test/mod.js +5 -5
  76. package/dist/tsup/unstable/migrations.d.cts +1 -1
  77. package/dist/tsup/unstable/migrations.d.ts +1 -1
  78. package/dist/tsup/utils.cjs +2 -2
  79. package/dist/tsup/utils.js +1 -1
  80. package/dist/tsup/workflow/mod.cjs +17 -17
  81. package/dist/tsup/workflow/mod.d.cts +4 -4
  82. package/dist/tsup/workflow/mod.d.ts +4 -4
  83. package/dist/tsup/workflow/mod.js +5 -5
  84. package/package.json +9 -10
  85. package/src/actor/keys.ts +86 -0
  86. package/src/client/actor-conn.ts +92 -6
  87. package/src/client/actor-handle.ts +21 -3
  88. package/src/client/client.ts +6 -0
  89. package/src/client/config.ts +12 -1
  90. package/src/client/lifecycle-errors.ts +16 -1
  91. package/src/client/retry-budget.ts +78 -0
  92. package/src/client/utils.ts +13 -2
  93. package/src/common/database/config.ts +7 -1
  94. package/src/common/database/native-database.ts +17 -6
  95. package/src/common/router.ts +1 -1
  96. package/src/engine-api/actors.ts +3 -3
  97. package/src/engine-client/actor-websocket-client.ts +4 -2
  98. package/src/engine-client/api-endpoints.ts +44 -14
  99. package/src/engine-client/mod.ts +2 -2
  100. package/src/registry/config/envoy.ts +1 -1
  101. package/src/registry/config/index.ts +28 -31
  102. package/src/registry/index.ts +51 -19
  103. package/src/registry/napi-runtime.ts +3 -2
  104. package/src/registry/native.ts +126 -34
  105. package/src/registry/runtime.ts +27 -10
  106. package/src/registry/wasm-runtime.ts +6 -3
  107. package/src/utils/env-vars.ts +15 -10
  108. package/dist/tsup/chunk-DTGPF6XY.cjs.map +0 -1
  109. package/dist/tsup/chunk-JI6GZ2C2.js.map +0 -1
  110. package/dist/tsup/chunk-K7QBHEVI.js.map +0 -1
  111. package/dist/tsup/chunk-MYWZCDML.cjs.map +0 -1
  112. package/dist/tsup/chunk-WHA3XM3R.js.map +0 -1
  113. package/dist/tsup/chunk-WSSI5L6L.cjs.map +0 -1
  114. package/src/actor/config.test.ts +0 -78
  115. package/src/actor/keys.test.ts +0 -275
  116. package/src/actor/utils.test.ts +0 -48
  117. package/src/client/test.ts +0 -44
  118. package/src/client/token-provider.test.ts +0 -86
  119. package/src/common/database/mod.test.ts +0 -364
  120. package/src/common/database/native-database.test.ts +0 -220
  121. package/src/common/inline-websocket-adapter.test.ts +0 -51
  122. package/src/db/drizzle.test.ts +0 -164
  123. package/src/registry/config/index.test.ts +0 -25
  124. package/src/registry/run-handler-coordinator.test.ts +0 -252
  125. package/src/registry/runtime.test.ts +0 -124
  126. package/src/unstable/migrations.test.ts +0 -170
  127. package/src/utils/endpoint-parser.test.ts +0 -206
  128. package/src/utils.test.ts +0 -34
  129. package/src/workflow/driver.test.ts +0 -62
  130. /package/dist/tsup/{chunk-IXJCAFAQ.js.map → chunk-DCDCHB5J.js.map} +0 -0
  131. /package/dist/tsup/{chunk-SNFXCNXD.js.map → chunk-DQ6K3VVV.js.map} +0 -0
  132. /package/dist/tsup/{chunk-RY6Z4RA5.js.map → chunk-H6W37YLT.js.map} +0 -0
  133. /package/dist/tsup/{chunk-JMUNIWKG.js.map → chunk-KQ2WQDYT.js.map} +0 -0
  134. /package/dist/tsup/{chunk-U3KY2OGG.js.map → chunk-SJPPKBT3.js.map} +0 -0
  135. /package/dist/tsup/{chunk-7TRYBX2R.js.map → chunk-TBJ4I3R3.js.map} +0 -0
@@ -1,13 +1,13 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
2
2
 
3
- var _chunkCRBPB6QIcjs = require('../chunk-CRBPB6QI.cjs');
3
+ var _chunk6DDQSAATcjs = require('../chunk-6DDQSAAT.cjs');
4
4
 
5
5
 
6
- var _chunkWSSI5L6Lcjs = require('../chunk-WSSI5L6L.cjs');
7
- require('../chunk-MYWZCDML.cjs');
8
- require('../chunk-Q6GKUC22.cjs');
6
+ var _chunkCTQKKUZCcjs = require('../chunk-CTQKKUZC.cjs');
7
+ require('../chunk-RTWH3AX3.cjs');
8
+ require('../chunk-HW2D5OFJ.cjs');
9
9
  require('../chunk-KVFIONKQ.cjs');
10
- require('../chunk-DTGPF6XY.cjs');
10
+ require('../chunk-IBEFA6CX.cjs');
11
11
  require('../chunk-MGI2VVF6.cjs');
12
12
 
13
13
  // src/test/ready.ts
@@ -36,8 +36,8 @@ async function setupTest(c, registry) {
36
36
  registry.config.noWelcome = true;
37
37
  registry.start();
38
38
  await waitForRegistryReady(registry);
39
- const client = _chunkCRBPB6QIcjs.createClient.call(void 0, {
40
- ..._chunkWSSI5L6Lcjs.convertRegistryConfigToClientConfig.call(void 0, registry.parseConfig()),
39
+ const client = _chunk6DDQSAATcjs.createClient.call(void 0, {
40
+ ..._chunkCTQKKUZCcjs.convertRegistryConfigToClientConfig.call(void 0, registry.parseConfig()),
41
41
  disableMetadataLookup: false
42
42
  });
43
43
  c.onTestFinished(async () => {
@@ -1,7 +1,7 @@
1
1
  import { TestContext } from 'vitest';
2
- import { aI as Registry, a6 as Client } from '../config-osdJqQwX.cjs';
2
+ import { aI as Registry, a6 as Client } from '../config-8NgsxIcT.cjs';
3
3
  import 'zod/v4';
4
- import '../config-ey2I2zz5.cjs';
4
+ import '../config-B2wlj9wx.cjs';
5
5
  import '@rivetkit/rivetkit-wasm';
6
6
  import 'zod';
7
7
  import 'pino';
@@ -1,7 +1,7 @@
1
1
  import { TestContext } from 'vitest';
2
- import { aI as Registry, a6 as Client } from '../config-Cv6pjCt-.js';
2
+ import { aI as Registry, a6 as Client } from '../config-DJ3KW-fe.js';
3
3
  import 'zod/v4';
4
- import '../config-ey2I2zz5.js';
4
+ import '../config-B2wlj9wx.js';
5
5
  import '@rivetkit/rivetkit-wasm';
6
6
  import 'zod';
7
7
  import 'pino';
@@ -1,13 +1,13 @@
1
1
  import {
2
2
  createClient
3
- } from "../chunk-SNFXCNXD.js";
3
+ } from "../chunk-DQ6K3VVV.js";
4
4
  import {
5
5
  convertRegistryConfigToClientConfig
6
- } from "../chunk-K7QBHEVI.js";
7
- import "../chunk-JI6GZ2C2.js";
8
- import "../chunk-IXJCAFAQ.js";
6
+ } from "../chunk-3MMTF3QA.js";
7
+ import "../chunk-A2CF6PFH.js";
8
+ import "../chunk-DCDCHB5J.js";
9
9
  import "../chunk-JTHHCZCZ.js";
10
- import "../chunk-WHA3XM3R.js";
10
+ import "../chunk-5OCN7VHH.js";
11
11
  import "../chunk-ZOVJDAOW.js";
12
12
 
13
13
  // src/test/ready.ts
@@ -1,4 +1,4 @@
1
- import { R as RawAccess } from '../config-ey2I2zz5.cjs';
1
+ import { R as RawAccess } from '../config-B2wlj9wx.cjs';
2
2
 
3
3
  declare const DEFAULT_MIGRATION_TABLE_NAME = "rivetkit_schema_version";
4
4
  type MigrationDatabase = Pick<RawAccess, "execute">;
@@ -1,4 +1,4 @@
1
- import { R as RawAccess } from '../config-ey2I2zz5.js';
1
+ import { R as RawAccess } from '../config-B2wlj9wx.js';
2
2
 
3
3
  declare const DEFAULT_MIGRATION_TABLE_NAME = "rivetkit_schema_version";
4
4
  type MigrationDatabase = Pick<RawAccess, "execute">;
@@ -19,7 +19,7 @@
19
19
 
20
20
 
21
21
 
22
- var _chunkDTGPF6XYcjs = require('./chunk-DTGPF6XY.cjs');
22
+ var _chunkIBEFA6CXcjs = require('./chunk-IBEFA6CX.cjs');
23
23
  require('./chunk-MGI2VVF6.cjs');
24
24
 
25
25
 
@@ -42,5 +42,5 @@ require('./chunk-MGI2VVF6.cjs');
42
42
 
43
43
 
44
44
 
45
- exports.EXTRA_ERROR_LOG = _chunkDTGPF6XYcjs.EXTRA_ERROR_LOG; exports.SinglePromiseQueue = _chunkDTGPF6XYcjs.SinglePromiseQueue; exports.VERSION = _chunkDTGPF6XYcjs.VERSION; exports.arrayBuffersEqual = _chunkDTGPF6XYcjs.arrayBuffersEqual; exports.assertUnreachable = _chunkDTGPF6XYcjs.assertUnreachable; exports.bufferToArrayBuffer = _chunkDTGPF6XYcjs.bufferToArrayBuffer; exports.combineUrlPath = _chunkDTGPF6XYcjs.combineUrlPath; exports.dbg = _chunkDTGPF6XYcjs.dbg; exports.detectRuntime = _chunkDTGPF6XYcjs.detectRuntime; exports.getEnvUniversal = _chunkDTGPF6XYcjs.getEnvUniversal; exports.httpUserAgent = _chunkDTGPF6XYcjs.httpUserAgent; exports.interval = _chunkDTGPF6XYcjs.interval; exports.joinSignals = _chunkDTGPF6XYcjs.joinSignals; exports.jsonParseCompat = _chunkDTGPF6XYcjs.jsonParseCompat; exports.jsonStringifyCompat = _chunkDTGPF6XYcjs.jsonStringifyCompat; exports.promiseWithResolvers = _chunkDTGPF6XYcjs.promiseWithResolvers; exports.setLongTimeout = _chunkDTGPF6XYcjs.setLongTimeout; exports.sleep = _chunkDTGPF6XYcjs.sleep; exports.stringifyError = _chunkDTGPF6XYcjs.stringifyError; exports.toUint8Array = _chunkDTGPF6XYcjs.toUint8Array;
45
+ exports.EXTRA_ERROR_LOG = _chunkIBEFA6CXcjs.EXTRA_ERROR_LOG; exports.SinglePromiseQueue = _chunkIBEFA6CXcjs.SinglePromiseQueue; exports.VERSION = _chunkIBEFA6CXcjs.VERSION; exports.arrayBuffersEqual = _chunkIBEFA6CXcjs.arrayBuffersEqual; exports.assertUnreachable = _chunkIBEFA6CXcjs.assertUnreachable; exports.bufferToArrayBuffer = _chunkIBEFA6CXcjs.bufferToArrayBuffer; exports.combineUrlPath = _chunkIBEFA6CXcjs.combineUrlPath; exports.dbg = _chunkIBEFA6CXcjs.dbg; exports.detectRuntime = _chunkIBEFA6CXcjs.detectRuntime; exports.getEnvUniversal = _chunkIBEFA6CXcjs.getEnvUniversal; exports.httpUserAgent = _chunkIBEFA6CXcjs.httpUserAgent; exports.interval = _chunkIBEFA6CXcjs.interval; exports.joinSignals = _chunkIBEFA6CXcjs.joinSignals; exports.jsonParseCompat = _chunkIBEFA6CXcjs.jsonParseCompat; exports.jsonStringifyCompat = _chunkIBEFA6CXcjs.jsonStringifyCompat; exports.promiseWithResolvers = _chunkIBEFA6CXcjs.promiseWithResolvers; exports.setLongTimeout = _chunkIBEFA6CXcjs.setLongTimeout; exports.sleep = _chunkIBEFA6CXcjs.sleep; exports.stringifyError = _chunkIBEFA6CXcjs.stringifyError; exports.toUint8Array = _chunkIBEFA6CXcjs.toUint8Array;
46
46
  //# sourceMappingURL=utils.cjs.map
@@ -19,7 +19,7 @@ import {
19
19
  sleep,
20
20
  stringifyError,
21
21
  toUint8Array
22
- } from "./chunk-WHA3XM3R.js";
22
+ } from "./chunk-5OCN7VHH.js";
23
23
  import "./chunk-ZOVJDAOW.js";
24
24
  export {
25
25
  EXTRA_ERROR_LOG,
@@ -1,8 +1,8 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } async function _asyncNullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return await rhsFn(); } } var _class; var _class2;
2
2
 
3
- var _chunkWHAUEDUTcjs = require('../chunk-WHAUEDUT.cjs');
4
- require('../chunk-RDBXO2ND.cjs');
5
- require('../chunk-NK4D6G45.cjs');
3
+ var _chunk3E2BPHQOcjs = require('../chunk-3E2BPHQO.cjs');
4
+ require('../chunk-XUO6G4H6.cjs');
5
+ require('../chunk-VCVV726P.cjs');
6
6
 
7
7
 
8
8
 
@@ -10,10 +10,10 @@ var _chunkHDVZ6YZGcjs = require('../chunk-HDVZ6YZG.cjs');
10
10
 
11
11
 
12
12
 
13
- var _chunkMYWZCDMLcjs = require('../chunk-MYWZCDML.cjs');
13
+ var _chunkRTWH3AX3cjs = require('../chunk-RTWH3AX3.cjs');
14
14
 
15
15
 
16
- var _chunkDTGPF6XYcjs = require('../chunk-DTGPF6XY.cjs');
16
+ var _chunkIBEFA6CXcjs = require('../chunk-IBEFA6CX.cjs');
17
17
 
18
18
 
19
19
 
@@ -355,7 +355,7 @@ var WorkflowContext = class _WorkflowContext {
355
355
  };
356
356
 
357
357
  // src/workflow/driver.ts
358
- var WORKFLOW_STORAGE_PREFIX = _chunkMYWZCDMLcjs.workflowStoragePrefix.call(void 0, );
358
+ var WORKFLOW_STORAGE_PREFIX = _chunkRTWH3AX3cjs.workflowStoragePrefix.call(void 0, );
359
359
  var WORKFLOW_SQLITE_MAX_BATCH_ROWS = 128;
360
360
  var WORKFLOW_SQLITE_MAX_BATCH_BYTES = 512 * 1024;
361
361
  function stripWorkflowKey(prefixed) {
@@ -412,7 +412,7 @@ var WorkflowStorage = class {
412
412
  }
413
413
  async get(key) {
414
414
  var _a;
415
- const prefixed = _chunkMYWZCDMLcjs.makeWorkflowKey.call(void 0, key);
415
+ const prefixed = _chunkRTWH3AX3cjs.makeWorkflowKey.call(void 0, key);
416
416
  const rows = await this.#db.execute(
417
417
  "SELECT value FROM _rivet_wf_kv WHERE key = ?",
418
418
  prefixed
@@ -423,7 +423,7 @@ var WorkflowStorage = class {
423
423
  await this.batch([{ key, value }]);
424
424
  }
425
425
  async delete(key) {
426
- const prefixed = _chunkMYWZCDMLcjs.makeWorkflowKey.call(void 0, key);
426
+ const prefixed = _chunkRTWH3AX3cjs.makeWorkflowKey.call(void 0, key);
427
427
  await this.#db.execute(
428
428
  "DELETE FROM _rivet_wf_kv WHERE key = ?",
429
429
  prefixed
@@ -431,10 +431,10 @@ var WorkflowStorage = class {
431
431
  }
432
432
  async batchDelete(keys) {
433
433
  if (keys.length === 0) return;
434
- await this.deleteRawKeys(keys.map((key) => _chunkMYWZCDMLcjs.makeWorkflowKey.call(void 0, key)));
434
+ await this.deleteRawKeys(keys.map((key) => _chunkRTWH3AX3cjs.makeWorkflowKey.call(void 0, key)));
435
435
  }
436
436
  async deletePrefix(prefix) {
437
- const start = _chunkMYWZCDMLcjs.makeWorkflowKey.call(void 0, prefix);
437
+ const start = _chunkRTWH3AX3cjs.makeWorkflowKey.call(void 0, prefix);
438
438
  const end = computeUpperBound(start);
439
439
  if (end) {
440
440
  await this.#db.execute(
@@ -450,8 +450,8 @@ var WorkflowStorage = class {
450
450
  );
451
451
  }
452
452
  async deleteRange(start, end) {
453
- const prefixedStart = _chunkMYWZCDMLcjs.makeWorkflowKey.call(void 0, start);
454
- const prefixedEnd = _chunkMYWZCDMLcjs.makeWorkflowKey.call(void 0, end);
453
+ const prefixedStart = _chunkRTWH3AX3cjs.makeWorkflowKey.call(void 0, start);
454
+ const prefixedEnd = _chunkRTWH3AX3cjs.makeWorkflowKey.call(void 0, end);
455
455
  await this.#db.execute(
456
456
  "DELETE FROM _rivet_wf_kv WHERE key >= ? AND key < ?",
457
457
  prefixedStart,
@@ -459,7 +459,7 @@ var WorkflowStorage = class {
459
459
  );
460
460
  }
461
461
  async list(prefix) {
462
- const prefixed = _chunkMYWZCDMLcjs.makeWorkflowKey.call(void 0, prefix);
462
+ const prefixed = _chunkRTWH3AX3cjs.makeWorkflowKey.call(void 0, prefix);
463
463
  const entries = await this.listRaw(prefixed);
464
464
  return entries.filter(([key]) => keyStartsWith(key, prefixed)).map(([key, value]) => ({
465
465
  key: stripWorkflowKey(key),
@@ -473,7 +473,7 @@ var WorkflowStorage = class {
473
473
  for (const { key, value } of chunk) {
474
474
  await tx.execute(
475
475
  "INSERT INTO _rivet_wf_kv (key, value) VALUES (?, ?) ON CONFLICT(key) DO UPDATE SET value = excluded.value",
476
- _chunkMYWZCDMLcjs.makeWorkflowKey.call(void 0, key),
476
+ _chunkRTWH3AX3cjs.makeWorkflowKey.call(void 0, key),
477
477
  value
478
478
  );
479
479
  }
@@ -743,7 +743,7 @@ function workflow(fn, options = {}) {
743
743
  function getWorkflowInspector(actorId) {
744
744
  let workflowInspector = workflowInspectors.get(actorId);
745
745
  if (!workflowInspector) {
746
- workflowInspector = _chunkWHAUEDUTcjs.createWorkflowInspectorAdapter.call(void 0, );
746
+ workflowInspector = _chunk3E2BPHQOcjs.createWorkflowInspectorAdapter.call(void 0, );
747
747
  workflowInspectors.set(actorId, workflowInspector);
748
748
  }
749
749
  return workflowInspector;
@@ -816,13 +816,13 @@ function workflow(fn, options = {}) {
816
816
  if (shouldRethrowWorkflowError(error)) {
817
817
  runCtx.log.error({
818
818
  msg: "workflow run failed",
819
- error: _chunkDTGPF6XYcjs.stringifyError.call(void 0, error)
819
+ error: _chunkIBEFA6CXcjs.stringifyError.call(void 0, error)
820
820
  });
821
821
  throw error;
822
822
  }
823
823
  runCtx.log.warn({
824
824
  msg: "workflow failed and will sleep until woken",
825
- error: _chunkDTGPF6XYcjs.stringifyError.call(void 0, error)
825
+ error: _chunkIBEFA6CXcjs.stringifyError.call(void 0, error)
826
826
  });
827
827
  } finally {
828
828
  runCtx.abortSignal.removeEventListener("abort", onAbort);
@@ -1,9 +1,9 @@
1
1
  import { WorkflowErrorEvent } from '@rivetkit/workflow-engine';
2
2
  export { Loop, TryBlockCatchKind, TryBlockConfig, TryBlockFailure, TryBlockResult, TryStepCatchKind, TryStepConfig, TryStepFailure, TryStepResult, WorkflowError, WorkflowErrorEvent } from '@rivetkit/workflow-engine';
3
- import { E as EventSchemaConfig, Q as QueueSchemaConfig, h as RunContext } from '../config-osdJqQwX.cjs';
4
- import { A as AnyDatabaseProvider } from '../config-ey2I2zz5.cjs';
5
- import { d as WorkflowContext } from '../context-DpjrM7n7.cjs';
6
- export { e as WorkflowBranchConfig, W as WorkflowBranchContextOf, a as WorkflowContextOf, f as WorkflowLoopConfig, b as WorkflowLoopContextOf, g as WorkflowStepConfig, h as WorkflowStepContext, c as WorkflowStepContextOf, i as WorkflowTryConfig, j as WorkflowTryStepConfig } from '../context-DpjrM7n7.cjs';
3
+ import { E as EventSchemaConfig, Q as QueueSchemaConfig, h as RunContext } from '../config-8NgsxIcT.cjs';
4
+ import { A as AnyDatabaseProvider } from '../config-B2wlj9wx.cjs';
5
+ import { d as WorkflowContext } from '../context-_RoE_YHL.cjs';
6
+ export { e as WorkflowBranchConfig, W as WorkflowBranchContextOf, a as WorkflowContextOf, f as WorkflowLoopConfig, b as WorkflowLoopContextOf, g as WorkflowStepConfig, h as WorkflowStepContext, c as WorkflowStepContextOf, i as WorkflowTryConfig, j as WorkflowTryStepConfig } from '../context-_RoE_YHL.cjs';
7
7
  import 'zod/v4';
8
8
  import '@rivetkit/rivetkit-wasm';
9
9
  import 'zod';
@@ -1,9 +1,9 @@
1
1
  import { WorkflowErrorEvent } from '@rivetkit/workflow-engine';
2
2
  export { Loop, TryBlockCatchKind, TryBlockConfig, TryBlockFailure, TryBlockResult, TryStepCatchKind, TryStepConfig, TryStepFailure, TryStepResult, WorkflowError, WorkflowErrorEvent } from '@rivetkit/workflow-engine';
3
- import { E as EventSchemaConfig, Q as QueueSchemaConfig, h as RunContext } from '../config-Cv6pjCt-.js';
4
- import { A as AnyDatabaseProvider } from '../config-ey2I2zz5.js';
5
- import { d as WorkflowContext } from '../context-CoVbKBuk.js';
6
- export { e as WorkflowBranchConfig, W as WorkflowBranchContextOf, a as WorkflowContextOf, f as WorkflowLoopConfig, b as WorkflowLoopContextOf, g as WorkflowStepConfig, h as WorkflowStepContext, c as WorkflowStepContextOf, i as WorkflowTryConfig, j as WorkflowTryStepConfig } from '../context-CoVbKBuk.js';
3
+ import { E as EventSchemaConfig, Q as QueueSchemaConfig, h as RunContext } from '../config-DJ3KW-fe.js';
4
+ import { A as AnyDatabaseProvider } from '../config-B2wlj9wx.js';
5
+ import { d as WorkflowContext } from '../context-BL8kUGjq.js';
6
+ export { e as WorkflowBranchConfig, W as WorkflowBranchContextOf, a as WorkflowContextOf, f as WorkflowLoopConfig, b as WorkflowLoopContextOf, g as WorkflowStepConfig, h as WorkflowStepContext, c as WorkflowStepContextOf, i as WorkflowTryConfig, j as WorkflowTryStepConfig } from '../context-BL8kUGjq.js';
7
7
  import 'zod/v4';
8
8
  import '@rivetkit/rivetkit-wasm';
9
9
  import 'zod';
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  createWorkflowInspectorAdapter
3
- } from "../chunk-7TRYBX2R.js";
4
- import "../chunk-U3KY2OGG.js";
5
- import "../chunk-JMUNIWKG.js";
3
+ } from "../chunk-TBJ4I3R3.js";
4
+ import "../chunk-SJPPKBT3.js";
5
+ import "../chunk-KQ2WQDYT.js";
6
6
  import {
7
7
  ACTOR_CONTEXT_INTERNAL_SYMBOL,
8
8
  defineRunHandler
@@ -10,10 +10,10 @@ import {
10
10
  import {
11
11
  makeWorkflowKey,
12
12
  workflowStoragePrefix
13
- } from "../chunk-JI6GZ2C2.js";
13
+ } from "../chunk-A2CF6PFH.js";
14
14
  import {
15
15
  stringifyError
16
- } from "../chunk-WHA3XM3R.js";
16
+ } from "../chunk-5OCN7VHH.js";
17
17
  import {
18
18
  RivetError,
19
19
  isActorAbortedError
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rivetkit",
3
- "version": "2.3.29",
3
+ "version": "3.0.0-preview.1",
4
4
  "description": "Lightweight libraries for building stateful actors on edge platforms",
5
5
  "license": "Apache-2.0",
6
6
  "keywords": [
@@ -210,17 +210,16 @@
210
210
  "dependencies": {
211
211
  "@hono/zod-openapi": "^1.1.5",
212
212
  "@opentelemetry/api": "^1.1.0",
213
- "@rivet-dev/services": "^0.2.3",
214
213
  "@rivetkit/bare-ts": "^0.6.2",
215
- "@rivetkit/engine-api-full": "2.3.29",
216
- "@rivetkit/engine-cli": "2.3.29",
217
- "@rivetkit/engine-envoy-protocol": "2.3.29",
214
+ "@rivetkit/engine-api-full": "3.0.0-preview.1",
215
+ "@rivetkit/engine-cli": "3.0.0-preview.1",
216
+ "@rivetkit/engine-envoy-protocol": "3.0.0-preview.1",
218
217
  "@rivetkit/on-change": "6.0.1",
219
- "@rivetkit/rivetkit-napi": "2.3.29",
220
- "@rivetkit/rivetkit-wasm": "2.3.29",
221
- "@rivetkit/traces": "2.3.29",
222
- "@rivetkit/virtual-websocket": "2.3.29",
223
- "@rivetkit/workflow-engine": "2.3.29",
218
+ "@rivetkit/rivetkit-napi": "3.0.0-preview.1",
219
+ "@rivetkit/rivetkit-wasm": "3.0.0-preview.1",
220
+ "@rivetkit/traces": "3.0.0-preview.1",
221
+ "@rivetkit/virtual-websocket": "3.0.0-preview.1",
222
+ "@rivetkit/workflow-engine": "3.0.0-preview.1",
224
223
  "cbor-x": "^1.6.0",
225
224
  "drizzle-orm": "0.45.2",
226
225
  "hono": "^4.7.0",
package/src/actor/keys.ts CHANGED
@@ -60,6 +60,8 @@ const TRACES_STORAGE_PREFIX = concatPrefix(
60
60
  STORAGE_VERSION_BYTES.TRACES,
61
61
  );
62
62
 
63
+ // The slash key form the actor REST API and the actor runtime use. The engine translates it to
64
+ // the canonical form (`encodeActorKey`) at those boundaries.
63
65
  export function serializeActorKey(key: ActorKey): string {
64
66
  // Use a special marker for empty key arrays
65
67
  if (key.length === 0) {
@@ -145,6 +147,90 @@ export function deserializeActorKey(keyString: string | undefined): ActorKey {
145
147
  return parts;
146
148
  }
147
149
 
150
+ // The canonical actor key: parts joined with `,`, with `\` and `,` escaped by a backslash, an
151
+ // empty part written as `\0`, and the empty key as the empty string. The engine hashes, stores
152
+ // and compares only canonical keys, and the gateway's `rvt-key` carries one. The Rust twin is
153
+ // `rivetkit_shared_types::actor_key`; both run the vectors in
154
+ // `rivetkit-rust/packages/shared-types/tests/fixtures/actor_key_vectors.json`.
155
+ const CANONICAL_SEPARATOR = ",";
156
+ const CANONICAL_EMPTY_PART = "\\0";
157
+
158
+ /** Encodes `key` in the canonical form. */
159
+ export function encodeActorKey(key: ActorKey): string {
160
+ return key
161
+ .map((part) => {
162
+ if (part === "") {
163
+ return CANONICAL_EMPTY_PART;
164
+ }
165
+ return part.replace(/\\/g, "\\\\").replace(/,/g, "\\,");
166
+ })
167
+ .join(CANONICAL_SEPARATOR);
168
+ }
169
+
170
+ /**
171
+ * Decodes a canonical key, or an unescaped `rvt-key` value from an earlier client. Only `\\` and
172
+ * `\,` are escapes; any other backslash is literal, and a part written as exactly `\0` is empty.
173
+ */
174
+ export function decodeActorKey(key: string): ActorKey {
175
+ if (key === "") {
176
+ return [];
177
+ }
178
+
179
+ const parts: string[] = [];
180
+ let raw = "";
181
+ let current = "";
182
+ const finishPart = () => {
183
+ parts.push(raw === CANONICAL_EMPTY_PART ? "" : current);
184
+ raw = "";
185
+ current = "";
186
+ };
187
+ for (let i = 0; i < key.length; i++) {
188
+ const char = key[i];
189
+ if (char === CANONICAL_SEPARATOR) {
190
+ finishPart();
191
+ continue;
192
+ }
193
+
194
+ raw += char;
195
+ if (char !== "\\") {
196
+ current += char;
197
+ continue;
198
+ }
199
+
200
+ const next = key[i + 1];
201
+ if (next === "\\" || next === CANONICAL_SEPARATOR) {
202
+ raw += next;
203
+ current += next;
204
+ i++;
205
+ } else {
206
+ current += char;
207
+ }
208
+ }
209
+ finishPart();
210
+ return parts;
211
+ }
212
+
213
+ /**
214
+ * The gateway's `rvt-key` query value for `key`: the canonical key, or `undefined` when the
215
+ * parameter is omitted, as it is for the empty key.
216
+ */
217
+ export function actorKeyToGatewayQuery(key: ActorKey): string | undefined {
218
+ if (key.length === 0) {
219
+ return undefined;
220
+ }
221
+ return encodeActorKey(key);
222
+ }
223
+
224
+ /** Reads the gateway's `rvt-key` query value. A missing value is the empty key. */
225
+ export function actorKeyFromGatewayQuery(
226
+ rvtKey: string | null | undefined,
227
+ ): ActorKey {
228
+ if (rvtKey === undefined || rvtKey === null) {
229
+ return [];
230
+ }
231
+ return decodeActorKey(rvtKey);
232
+ }
233
+
148
234
  export function makePrefixedKey(key: Uint8Array): Uint8Array {
149
235
  const prefixed = new Uint8Array(KEYS.KV.length + key.length);
150
236
  prefixed.set(KEYS.KV, 0);
@@ -50,6 +50,7 @@ import {
50
50
  import { ACTOR_CONNS_SYMBOL, type ClientRaw } from "./client";
51
51
  import * as errors from "./errors";
52
52
  import { isRetryableLifecycleReconnectSignal } from "./lifecycle-errors";
53
+ import { retryAfterMs } from "./retry-budget";
53
54
  import { logger } from "./log";
54
55
  import { isInvalidToken } from "./token-provider";
55
56
  import { outboundTelemetryHeaders } from "./outbound-telemetry";
@@ -104,6 +105,21 @@ interface EventSubscriptions<Args extends Array<unknown>> {
104
105
  */
105
106
  export type EventUnsubscribe = () => void;
106
107
 
108
+ /**
109
+ * How long a connection attempt may wait for the actor's Init before it is abandoned and
110
+ * retried. Longer than the engine's own WebSocket open deadline (15 s by default), so an engine
111
+ * that answers with a typed close wins, while a socket that never settles is still retried.
112
+ */
113
+ const CONNECT_TIMEOUT_MS = 20_000;
114
+
115
+ function isConnectionOpenTimeout(error: unknown): boolean {
116
+ return (
117
+ error instanceof errors.ActorError &&
118
+ error.group === "client" &&
119
+ error.code === "connection_open_timeout"
120
+ );
121
+ }
122
+
107
123
  /**
108
124
  * A function that handles connection errors.
109
125
  *
@@ -182,6 +198,8 @@ export class ActorConnRaw {
182
198
 
183
199
  /** Promise used to indicate the socket has connected successfully. This will be rejected if the connection fails. */
184
200
  #onOpenPromise?: ReturnType<typeof promiseWithResolvers<undefined>>;
201
+ /** Sockets given up on by the connect timeout. Their late events are ignored. */
202
+ #abandonedSockets = new WeakSet<UniversalWebSocket>();
185
203
 
186
204
  #websocket?: UniversalWebSocket;
187
205
  #authRetryAvailable = true;
@@ -457,12 +475,17 @@ export class ActorConnRaw {
457
475
  minTimeout: 250,
458
476
  maxTimeout: 30_000,
459
477
 
460
- onFailedAttempt: (error) => {
478
+ onFailedAttempt: async (error) => {
461
479
  logger().warn({
462
480
  msg: "failed to reconnect",
463
481
  attempt: error.attemptNumber,
464
482
  error: stringifyError(error),
465
483
  });
484
+ // A close that carried the service's retry hint waits at least that long.
485
+ const hintMs = retryAfterMs(error);
486
+ if (hintMs !== undefined) {
487
+ await new Promise((resolve) => setTimeout(resolve, hintMs));
488
+ }
466
489
  },
467
490
 
468
491
  // Cancel retry if aborted
@@ -498,7 +521,7 @@ export class ActorConnRaw {
498
521
  await this.#connectWebSocket();
499
522
 
500
523
  // Wait for result
501
- await this.#onOpenPromise.promise;
524
+ await this.#waitForOpen(this.#onOpenPromise.promise);
502
525
  } catch (error) {
503
526
  if (this.#shouldRetryConnectionOpenError(error)) {
504
527
  throw error;
@@ -529,10 +552,65 @@ export class ActorConnRaw {
529
552
  }
530
553
  }
531
554
 
555
+ /**
556
+ * Waits for the actor's Init on the current socket, up to {@link CONNECT_TIMEOUT_MS}. A socket
557
+ * can stay connecting with no open, error or close event, as when the engine holds the
558
+ * upgrade or a refused connect reports only an error. On timeout the socket is abandoned
559
+ * and closed, and the retryable `client.connection_open_timeout` starts the next attempt.
560
+ */
561
+ async #waitForOpen(open: Promise<undefined>) {
562
+ let timer: ReturnType<typeof setTimeout> | undefined;
563
+ const timedOut = new Promise<never>((_, reject) => {
564
+ timer = setTimeout(() => {
565
+ reject(
566
+ new errors.ActorError(
567
+ "client",
568
+ "connection_open_timeout",
569
+ `Connection did not open within ${CONNECT_TIMEOUT_MS} ms`,
570
+ ),
571
+ );
572
+ }, CONNECT_TIMEOUT_MS);
573
+ });
574
+ try {
575
+ await Promise.race([open, timedOut]);
576
+ } catch (error) {
577
+ if (isConnectionOpenTimeout(error)) {
578
+ this.#abandonCurrentSocket();
579
+ }
580
+ throw error;
581
+ } finally {
582
+ clearTimeout(timer);
583
+ }
584
+ }
585
+
586
+ #abandonCurrentSocket() {
587
+ const ws = this.#websocket;
588
+ if (!ws) return;
589
+ this.#websocket = undefined;
590
+ this.#abandonedSockets.add(ws);
591
+ logger().warn({
592
+ msg: "connection did not open in time, retrying",
593
+ connId: this.#connId,
594
+ readyState: ws.readyState,
595
+ timeoutMs: CONNECT_TIMEOUT_MS,
596
+ });
597
+ try {
598
+ ws.close(1000, "Connect timeout");
599
+ } catch (err) {
600
+ logger().debug({
601
+ msg: "failed to close abandoned websocket",
602
+ error: stringifyError(err),
603
+ });
604
+ }
605
+ }
606
+
532
607
  #shouldRetryConnectionOpenError(error: unknown): boolean {
533
608
  if (error instanceof errors.ActorConnDisposed) {
534
609
  return false;
535
610
  }
611
+ if (isConnectionOpenTimeout(error)) {
612
+ return true;
613
+ }
536
614
  if (
537
615
  error instanceof errors.ActorError &&
538
616
  isInvalidToken(error.group, error.code) &&
@@ -614,12 +692,14 @@ export class ActorConnRaw {
614
692
  });
615
693
  this.#websocket = ws;
616
694
  ws.addEventListener("open", () => {
695
+ if (this.#abandonedSockets.has(ws)) return;
617
696
  logger().debug({
618
697
  msg: "client websocket open",
619
698
  connId: this.#connId,
620
699
  });
621
700
  });
622
701
  ws.addEventListener("message", async (ev: { data: ConnMessage }) => {
702
+ if (this.#abandonedSockets.has(ws)) return;
623
703
  try {
624
704
  await this.#handleOnMessage(ev.data);
625
705
  } catch (err) {
@@ -630,6 +710,7 @@ export class ActorConnRaw {
630
710
  }
631
711
  });
632
712
  ws.addEventListener("close", async (ev: Event | CloseEventLike) => {
713
+ if (this.#abandonedSockets.has(ws)) return;
633
714
  try {
634
715
  await this.#handleOnClose(ev);
635
716
  } catch (err) {
@@ -640,6 +721,7 @@ export class ActorConnRaw {
640
721
  }
641
722
  });
642
723
  ws.addEventListener("error", () => {
724
+ if (this.#abandonedSockets.has(ws)) return;
643
725
  try {
644
726
  this.#handleOnError();
645
727
  } catch (err) {
@@ -894,7 +976,11 @@ export class ActorConnRaw {
894
976
  const parsed = parseWebSocketCloseReason(reason);
895
977
 
896
978
  if (parsed) {
897
- const { group, code, rayId } = parsed;
979
+ const { group, code, rayId, retryAfterMs } = parsed;
980
+ const closeOptions =
981
+ retryAfterMs === undefined
982
+ ? { rayId }
983
+ : { rayId, metadata: { retry_after_ms: retryAfterMs } };
898
984
  if (
899
985
  isInvalidToken(group, code) &&
900
986
  closeEvent.code === 1008 &&
@@ -923,7 +1009,7 @@ export class ActorConnRaw {
923
1009
  group,
924
1010
  code,
925
1011
  `Connection closed: ${reason}`,
926
- { rayId },
1012
+ closeOptions,
927
1013
  ),
928
1014
  );
929
1015
  return;
@@ -946,7 +1032,7 @@ export class ActorConnRaw {
946
1032
  group,
947
1033
  code,
948
1034
  `Connection closed: ${reason}`,
949
- { rayId },
1035
+ closeOptions,
950
1036
  );
951
1037
  }
952
1038
  } else {
@@ -954,7 +1040,7 @@ export class ActorConnRaw {
954
1040
  group,
955
1041
  code,
956
1042
  `Connection closed: ${reason}`,
957
- { rayId },
1043
+ closeOptions,
958
1044
  );
959
1045
  }
960
1046