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.
- package/dist/browser/client.d.ts +58 -9
- package/dist/browser/client.js +193 -20
- package/dist/browser/client.js.map +1 -1
- package/dist/browser/inspector/client.js +1 -2
- package/dist/browser/inspector/client.js.map +1 -1
- package/dist/tsup/{chunk-WHAUEDUT.cjs → chunk-3E2BPHQO.cjs} +10 -10
- package/dist/tsup/{chunk-WHAUEDUT.cjs.map → chunk-3E2BPHQO.cjs.map} +1 -1
- package/dist/tsup/{chunk-K7QBHEVI.js → chunk-3MMTF3QA.js} +185 -25
- package/dist/tsup/chunk-3MMTF3QA.js.map +1 -0
- package/dist/tsup/{chunk-WHA3XM3R.js → chunk-5OCN7VHH.js} +10 -11
- package/dist/tsup/chunk-5OCN7VHH.js.map +1 -0
- package/dist/tsup/{chunk-CRBPB6QI.cjs → chunk-6DDQSAAT.cjs} +7 -7
- package/dist/tsup/{chunk-CRBPB6QI.cjs.map → chunk-6DDQSAAT.cjs.map} +1 -1
- package/dist/tsup/{chunk-JI6GZ2C2.js → chunk-A2CF6PFH.js} +18 -1
- package/dist/tsup/chunk-A2CF6PFH.js.map +1 -0
- package/dist/tsup/{chunk-WSSI5L6L.cjs → chunk-CTQKKUZC.cjs} +326 -166
- package/dist/tsup/chunk-CTQKKUZC.cjs.map +1 -0
- package/dist/tsup/{chunk-IXJCAFAQ.js → chunk-DCDCHB5J.js} +2 -2
- package/dist/tsup/{chunk-SNFXCNXD.js → chunk-DQ6K3VVV.js} +3 -3
- package/dist/tsup/{chunk-RY6Z4RA5.js → chunk-H6W37YLT.js} +2 -2
- package/dist/tsup/{chunk-Q6GKUC22.cjs → chunk-HW2D5OFJ.cjs} +3 -3
- package/dist/tsup/{chunk-Q6GKUC22.cjs.map → chunk-HW2D5OFJ.cjs.map} +1 -1
- package/dist/tsup/{chunk-DTGPF6XY.cjs → chunk-IBEFA6CX.cjs} +10 -11
- package/dist/tsup/chunk-IBEFA6CX.cjs.map +1 -0
- package/dist/tsup/{chunk-56QW6V7F.cjs → chunk-JLBPBEWC.cjs} +3 -3
- package/dist/tsup/{chunk-56QW6V7F.cjs.map → chunk-JLBPBEWC.cjs.map} +1 -1
- package/dist/tsup/{chunk-JMUNIWKG.js → chunk-KQ2WQDYT.js} +2 -2
- package/dist/tsup/{chunk-MYWZCDML.cjs → chunk-RTWH3AX3.cjs} +19 -2
- package/dist/tsup/chunk-RTWH3AX3.cjs.map +1 -0
- package/dist/tsup/{chunk-U3KY2OGG.js → chunk-SJPPKBT3.js} +2 -2
- package/dist/tsup/{chunk-7TRYBX2R.js → chunk-TBJ4I3R3.js} +4 -4
- package/dist/tsup/{chunk-NK4D6G45.cjs → chunk-VCVV726P.cjs} +4 -4
- package/dist/tsup/{chunk-NK4D6G45.cjs.map → chunk-VCVV726P.cjs.map} +1 -1
- package/dist/tsup/{chunk-RDBXO2ND.cjs → chunk-XUO6G4H6.cjs} +3 -3
- package/dist/tsup/{chunk-RDBXO2ND.cjs.map → chunk-XUO6G4H6.cjs.map} +1 -1
- package/dist/tsup/client/mod.cjs +6 -6
- package/dist/tsup/client/mod.d.cts +15 -3
- package/dist/tsup/client/mod.d.ts +15 -3
- 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/{config-osdJqQwX.d.cts → config-8NgsxIcT.d.cts} +43 -12
- package/dist/tsup/{config-ey2I2zz5.d.cts → config-B2wlj9wx.d.cts} +7 -1
- package/dist/tsup/{config-ey2I2zz5.d.ts → config-B2wlj9wx.d.ts} +7 -1
- package/dist/tsup/{config-Cv6pjCt-.d.ts → config-DJ3KW-fe.d.ts} +43 -12
- package/dist/tsup/{context-CoVbKBuk.d.ts → context-BL8kUGjq.d.ts} +2 -2
- package/dist/tsup/{context-DpjrM7n7.d.cts → context-_RoE_YHL.d.cts} +2 -2
- package/dist/tsup/db/drizzle.cjs +2 -2
- package/dist/tsup/db/drizzle.d.cts +1 -1
- package/dist/tsup/db/drizzle.d.ts +1 -1
- package/dist/tsup/db/drizzle.js +1 -1
- package/dist/tsup/db/mod.cjs +3 -3
- package/dist/tsup/db/mod.d.cts +2 -2
- package/dist/tsup/db/mod.d.ts +2 -2
- package/dist/tsup/db/mod.js +2 -2
- package/dist/tsup/dynamic/mod.d.cts +2 -2
- package/dist/tsup/dynamic/mod.d.ts +2 -2
- package/dist/tsup/inspector/mod.cjs +5 -5
- package/dist/tsup/inspector/mod.js +4 -4
- package/dist/tsup/inspector/workflow.cjs +4 -4
- package/dist/tsup/inspector/workflow.js +3 -3
- package/dist/tsup/inspector-tab/mod.d.cts +3 -3
- package/dist/tsup/inspector-tab/mod.d.ts +3 -3
- package/dist/tsup/mod.cjs +254 -166
- package/dist/tsup/mod.cjs.map +1 -1
- package/dist/tsup/mod.d.cts +4 -4
- package/dist/tsup/mod.d.ts +4 -4
- package/dist/tsup/mod.js +168 -80
- package/dist/tsup/mod.js.map +1 -1
- package/dist/tsup/test/mod.cjs +7 -7
- package/dist/tsup/test/mod.d.cts +2 -2
- package/dist/tsup/test/mod.d.ts +2 -2
- package/dist/tsup/test/mod.js +5 -5
- package/dist/tsup/unstable/migrations.d.cts +1 -1
- package/dist/tsup/unstable/migrations.d.ts +1 -1
- package/dist/tsup/utils.cjs +2 -2
- package/dist/tsup/utils.js +1 -1
- package/dist/tsup/workflow/mod.cjs +17 -17
- package/dist/tsup/workflow/mod.d.cts +4 -4
- package/dist/tsup/workflow/mod.d.ts +4 -4
- package/dist/tsup/workflow/mod.js +5 -5
- package/package.json +9 -10
- package/src/actor/keys.ts +86 -0
- package/src/client/actor-conn.ts +92 -6
- package/src/client/actor-handle.ts +21 -3
- package/src/client/client.ts +6 -0
- package/src/client/config.ts +12 -1
- package/src/client/lifecycle-errors.ts +16 -1
- package/src/client/retry-budget.ts +78 -0
- package/src/client/utils.ts +13 -2
- package/src/common/database/config.ts +7 -1
- package/src/common/database/native-database.ts +17 -6
- package/src/common/router.ts +1 -1
- package/src/engine-api/actors.ts +3 -3
- package/src/engine-client/actor-websocket-client.ts +4 -2
- package/src/engine-client/api-endpoints.ts +44 -14
- package/src/engine-client/mod.ts +2 -2
- package/src/registry/config/envoy.ts +1 -1
- package/src/registry/config/index.ts +28 -31
- package/src/registry/index.ts +51 -19
- package/src/registry/napi-runtime.ts +3 -2
- package/src/registry/native.ts +126 -34
- package/src/registry/runtime.ts +27 -10
- package/src/registry/wasm-runtime.ts +6 -3
- package/src/utils/env-vars.ts +15 -10
- package/dist/tsup/chunk-DTGPF6XY.cjs.map +0 -1
- package/dist/tsup/chunk-JI6GZ2C2.js.map +0 -1
- package/dist/tsup/chunk-K7QBHEVI.js.map +0 -1
- package/dist/tsup/chunk-MYWZCDML.cjs.map +0 -1
- package/dist/tsup/chunk-WHA3XM3R.js.map +0 -1
- package/dist/tsup/chunk-WSSI5L6L.cjs.map +0 -1
- package/src/actor/config.test.ts +0 -78
- package/src/actor/keys.test.ts +0 -275
- package/src/actor/utils.test.ts +0 -48
- package/src/client/test.ts +0 -44
- package/src/client/token-provider.test.ts +0 -86
- package/src/common/database/mod.test.ts +0 -364
- package/src/common/database/native-database.test.ts +0 -220
- package/src/common/inline-websocket-adapter.test.ts +0 -51
- package/src/db/drizzle.test.ts +0 -164
- package/src/registry/config/index.test.ts +0 -25
- package/src/registry/run-handler-coordinator.test.ts +0 -252
- package/src/registry/runtime.test.ts +0 -124
- package/src/unstable/migrations.test.ts +0 -170
- package/src/utils/endpoint-parser.test.ts +0 -206
- package/src/utils.test.ts +0 -34
- package/src/workflow/driver.test.ts +0 -62
- /package/dist/tsup/{chunk-IXJCAFAQ.js.map → chunk-DCDCHB5J.js.map} +0 -0
- /package/dist/tsup/{chunk-SNFXCNXD.js.map → chunk-DQ6K3VVV.js.map} +0 -0
- /package/dist/tsup/{chunk-RY6Z4RA5.js.map → chunk-H6W37YLT.js.map} +0 -0
- /package/dist/tsup/{chunk-JMUNIWKG.js.map → chunk-KQ2WQDYT.js.map} +0 -0
- /package/dist/tsup/{chunk-U3KY2OGG.js.map → chunk-SJPPKBT3.js.map} +0 -0
- /package/dist/tsup/{chunk-7TRYBX2R.js.map → chunk-TBJ4I3R3.js.map} +0 -0
package/dist/tsup/test/mod.cjs
CHANGED
|
@@ -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
|
|
3
|
+
var _chunk6DDQSAATcjs = require('../chunk-6DDQSAAT.cjs');
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
var
|
|
7
|
-
require('../chunk-
|
|
8
|
-
require('../chunk-
|
|
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-
|
|
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 =
|
|
40
|
-
...
|
|
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 () => {
|
package/dist/tsup/test/mod.d.cts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { TestContext } from 'vitest';
|
|
2
|
-
import { aI as Registry, a6 as Client } from '../config-
|
|
2
|
+
import { aI as Registry, a6 as Client } from '../config-8NgsxIcT.cjs';
|
|
3
3
|
import 'zod/v4';
|
|
4
|
-
import '../config-
|
|
4
|
+
import '../config-B2wlj9wx.cjs';
|
|
5
5
|
import '@rivetkit/rivetkit-wasm';
|
|
6
6
|
import 'zod';
|
|
7
7
|
import 'pino';
|
package/dist/tsup/test/mod.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { TestContext } from 'vitest';
|
|
2
|
-
import { aI as Registry, a6 as Client } from '../config-
|
|
2
|
+
import { aI as Registry, a6 as Client } from '../config-DJ3KW-fe.js';
|
|
3
3
|
import 'zod/v4';
|
|
4
|
-
import '../config-
|
|
4
|
+
import '../config-B2wlj9wx.js';
|
|
5
5
|
import '@rivetkit/rivetkit-wasm';
|
|
6
6
|
import 'zod';
|
|
7
7
|
import 'pino';
|
package/dist/tsup/test/mod.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import {
|
|
2
2
|
createClient
|
|
3
|
-
} from "../chunk-
|
|
3
|
+
} from "../chunk-DQ6K3VVV.js";
|
|
4
4
|
import {
|
|
5
5
|
convertRegistryConfigToClientConfig
|
|
6
|
-
} from "../chunk-
|
|
7
|
-
import "../chunk-
|
|
8
|
-
import "../chunk-
|
|
6
|
+
} from "../chunk-3MMTF3QA.js";
|
|
7
|
+
import "../chunk-A2CF6PFH.js";
|
|
8
|
+
import "../chunk-DCDCHB5J.js";
|
|
9
9
|
import "../chunk-JTHHCZCZ.js";
|
|
10
|
-
import "../chunk-
|
|
10
|
+
import "../chunk-5OCN7VHH.js";
|
|
11
11
|
import "../chunk-ZOVJDAOW.js";
|
|
12
12
|
|
|
13
13
|
// src/test/ready.ts
|
package/dist/tsup/utils.cjs
CHANGED
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
|
|
20
20
|
|
|
21
21
|
|
|
22
|
-
var
|
|
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 =
|
|
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
|
package/dist/tsup/utils.js
CHANGED
|
@@ -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
|
|
4
|
-
require('../chunk-
|
|
5
|
-
require('../chunk-
|
|
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
|
|
13
|
+
var _chunkRTWH3AX3cjs = require('../chunk-RTWH3AX3.cjs');
|
|
14
14
|
|
|
15
15
|
|
|
16
|
-
var
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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) =>
|
|
434
|
+
await this.deleteRawKeys(keys.map((key) => _chunkRTWH3AX3cjs.makeWorkflowKey.call(void 0, key)));
|
|
435
435
|
}
|
|
436
436
|
async deletePrefix(prefix) {
|
|
437
|
-
const start =
|
|
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 =
|
|
454
|
-
const prefixedEnd =
|
|
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 =
|
|
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
|
-
|
|
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 =
|
|
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:
|
|
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:
|
|
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-
|
|
4
|
-
import { A as AnyDatabaseProvider } from '../config-
|
|
5
|
-
import { d as WorkflowContext } from '../context-
|
|
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-
|
|
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-
|
|
4
|
-
import { A as AnyDatabaseProvider } from '../config-
|
|
5
|
-
import { d as WorkflowContext } from '../context-
|
|
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-
|
|
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-
|
|
4
|
-
import "../chunk-
|
|
5
|
-
import "../chunk-
|
|
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-
|
|
13
|
+
} from "../chunk-A2CF6PFH.js";
|
|
14
14
|
import {
|
|
15
15
|
stringifyError
|
|
16
|
-
} from "../chunk-
|
|
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": "
|
|
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": "
|
|
216
|
-
"@rivetkit/engine-cli": "
|
|
217
|
-
"@rivetkit/engine-envoy-protocol": "
|
|
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": "
|
|
220
|
-
"@rivetkit/rivetkit-wasm": "
|
|
221
|
-
"@rivetkit/traces": "
|
|
222
|
-
"@rivetkit/virtual-websocket": "
|
|
223
|
-
"@rivetkit/workflow-engine": "
|
|
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);
|
package/src/client/actor-conn.ts
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1043
|
+
closeOptions,
|
|
958
1044
|
);
|
|
959
1045
|
}
|
|
960
1046
|
|