rivetkit 2.3.30 → 3.0.0-preview.2
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-P2PHHJMH.cjs → chunk-25MUHNWE.cjs} +326 -166
- package/dist/tsup/chunk-25MUHNWE.cjs.map +1 -0
- package/dist/tsup/{chunk-5SN6GAYX.cjs → chunk-3SPYZMME.cjs} +3 -3
- package/dist/tsup/{chunk-5SN6GAYX.cjs.map → chunk-3SPYZMME.cjs.map} +1 -1
- package/dist/tsup/{chunk-4SNS3PYZ.js → chunk-3URL73AV.js} +2 -2
- package/dist/tsup/{chunk-EKAQ7HG2.js → chunk-442XBCAF.js} +3 -3
- package/dist/tsup/{chunk-CORYIKDC.js → chunk-5F7FWAJI.js} +10 -11
- package/dist/tsup/chunk-5F7FWAJI.js.map +1 -0
- package/dist/tsup/{chunk-I472KTIC.js → chunk-6IGGYL2C.js} +185 -25
- package/dist/tsup/chunk-6IGGYL2C.js.map +1 -0
- package/dist/tsup/{chunk-JI6GZ2C2.js → chunk-A2CF6PFH.js} +18 -1
- package/dist/tsup/chunk-A2CF6PFH.js.map +1 -0
- package/dist/tsup/{chunk-OUB7SGSA.js → chunk-ANNVZW6B.js} +2 -2
- package/dist/tsup/{chunk-ZIIQQHC3.cjs → chunk-BCG7PTBS.cjs} +4 -4
- package/dist/tsup/{chunk-ZIIQQHC3.cjs.map → chunk-BCG7PTBS.cjs.map} +1 -1
- package/dist/tsup/{chunk-OJFVABRH.cjs → chunk-CJ3MX5MI.cjs} +7 -7
- package/dist/tsup/{chunk-OJFVABRH.cjs.map → chunk-CJ3MX5MI.cjs.map} +1 -1
- package/dist/tsup/{chunk-GEUBEODU.cjs → chunk-EPPV7WB2.cjs} +3 -3
- package/dist/tsup/{chunk-GEUBEODU.cjs.map → chunk-EPPV7WB2.cjs.map} +1 -1
- package/dist/tsup/{chunk-MXV26ZBB.js → chunk-OLZ4KAFL.js} +4 -4
- package/dist/tsup/{chunk-5UUOECX2.cjs → chunk-QDRZMCX5.cjs} +10 -10
- package/dist/tsup/{chunk-5UUOECX2.cjs.map → chunk-QDRZMCX5.cjs.map} +1 -1
- package/dist/tsup/{chunk-MYWZCDML.cjs → chunk-RTWH3AX3.cjs} +19 -2
- package/dist/tsup/chunk-RTWH3AX3.cjs.map +1 -0
- package/dist/tsup/{chunk-H3SGQEHZ.js → chunk-WGKL7HMH.js} +2 -2
- package/dist/tsup/{chunk-6LOYTFPZ.js → chunk-WGQHG26S.js} +2 -2
- package/dist/tsup/{chunk-2BIRGEIU.cjs → chunk-XSOHGU4G.cjs} +10 -11
- package/dist/tsup/chunk-XSOHGU4G.cjs.map +1 -0
- package/dist/tsup/{chunk-ABPZG7QV.cjs → chunk-YZVVID47.cjs} +3 -3
- package/dist/tsup/{chunk-ABPZG7QV.cjs.map → chunk-YZVVID47.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.ts → config-B2wlj9wx.d.cts} +7 -1
- package/dist/tsup/{config-ey2I2zz5.d.cts → 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-2BIRGEIU.cjs.map +0 -1
- package/dist/tsup/chunk-CORYIKDC.js.map +0 -1
- package/dist/tsup/chunk-I472KTIC.js.map +0 -1
- package/dist/tsup/chunk-JI6GZ2C2.js.map +0 -1
- package/dist/tsup/chunk-MYWZCDML.cjs.map +0 -1
- package/dist/tsup/chunk-P2PHHJMH.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-4SNS3PYZ.js.map → chunk-3URL73AV.js.map} +0 -0
- /package/dist/tsup/{chunk-EKAQ7HG2.js.map → chunk-442XBCAF.js.map} +0 -0
- /package/dist/tsup/{chunk-OUB7SGSA.js.map → chunk-ANNVZW6B.js.map} +0 -0
- /package/dist/tsup/{chunk-MXV26ZBB.js.map → chunk-OLZ4KAFL.js.map} +0 -0
- /package/dist/tsup/{chunk-H3SGQEHZ.js.map → chunk-WGKL7HMH.js.map} +0 -0
- /package/dist/tsup/{chunk-6LOYTFPZ.js.map → chunk-WGQHG26S.js.map} +0 -0
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
import {
|
|
2
|
+
actorKeyToGatewayQuery,
|
|
2
3
|
deserializeActorKey,
|
|
3
4
|
serializeActorKey
|
|
4
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-A2CF6PFH.js";
|
|
5
6
|
import {
|
|
6
7
|
AsyncMutex
|
|
7
8
|
} from "./chunk-JTHHCZCZ.js";
|
|
8
9
|
import {
|
|
9
10
|
importWebSocket,
|
|
10
11
|
logger
|
|
11
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-WGKL7HMH.js";
|
|
12
13
|
import {
|
|
13
14
|
EncodingSchema,
|
|
14
15
|
assertUnreachable,
|
|
@@ -35,7 +36,7 @@ import {
|
|
|
35
36
|
serializeWithEncoding,
|
|
36
37
|
stringifyError,
|
|
37
38
|
uint8ArrayToBase64
|
|
38
|
-
} from "./chunk-
|
|
39
|
+
} from "./chunk-5F7FWAJI.js";
|
|
39
40
|
import {
|
|
40
41
|
INTERNAL_ERROR_CODE,
|
|
41
42
|
RivetError,
|
|
@@ -2176,6 +2177,56 @@ function readRequestBody(request) {
|
|
|
2176
2177
|
).arrayBuffer();
|
|
2177
2178
|
}
|
|
2178
2179
|
|
|
2180
|
+
// src/client/retry-budget.ts
|
|
2181
|
+
var DEFAULT_PERCENT = 10;
|
|
2182
|
+
var DEFAULT_MAX_TOKENS = 100;
|
|
2183
|
+
var RetryBudget = class {
|
|
2184
|
+
#tokens;
|
|
2185
|
+
#maxTokens;
|
|
2186
|
+
#deposit;
|
|
2187
|
+
constructor(options = {}) {
|
|
2188
|
+
const percent = options.percent ?? DEFAULT_PERCENT;
|
|
2189
|
+
const maxTokens = options.maxTokens ?? DEFAULT_MAX_TOKENS;
|
|
2190
|
+
if (!(percent >= 0 && percent <= 100)) {
|
|
2191
|
+
throw new Error("retryBudget.percent must be in 0..=100");
|
|
2192
|
+
}
|
|
2193
|
+
if (!(maxTokens >= 0)) {
|
|
2194
|
+
throw new Error("retryBudget.maxTokens must be at least 0");
|
|
2195
|
+
}
|
|
2196
|
+
this.#maxTokens = maxTokens;
|
|
2197
|
+
this.#tokens = maxTokens;
|
|
2198
|
+
this.#deposit = percent / 100;
|
|
2199
|
+
}
|
|
2200
|
+
/** Credits one request sent. */
|
|
2201
|
+
deposit() {
|
|
2202
|
+
this.#tokens = Math.min(this.#maxTokens, this.#tokens + this.#deposit);
|
|
2203
|
+
}
|
|
2204
|
+
/** Spends one token. Returns `false` when the budget is spent. */
|
|
2205
|
+
tryWithdraw() {
|
|
2206
|
+
if (this.#tokens + 1e-9 < 1) {
|
|
2207
|
+
return false;
|
|
2208
|
+
}
|
|
2209
|
+
this.#tokens = Math.max(0, this.#tokens - 1);
|
|
2210
|
+
return true;
|
|
2211
|
+
}
|
|
2212
|
+
};
|
|
2213
|
+
function retryAfterMs(error) {
|
|
2214
|
+
if (!(error instanceof RivetError)) {
|
|
2215
|
+
return void 0;
|
|
2216
|
+
}
|
|
2217
|
+
const metadata = error.metadata;
|
|
2218
|
+
if (metadata === null || typeof metadata !== "object") {
|
|
2219
|
+
return void 0;
|
|
2220
|
+
}
|
|
2221
|
+
const hint = metadata.retry_after_ms;
|
|
2222
|
+
return typeof hint === "number" && hint >= 0 ? hint : void 0;
|
|
2223
|
+
}
|
|
2224
|
+
function retryDelayMs(attempt, opts) {
|
|
2225
|
+
const backoff = Math.min(opts.initialDelayMs * 2 ** attempt, opts.maxDelayMs);
|
|
2226
|
+
const jittered = backoff / 2 + Math.random() * (backoff / 2);
|
|
2227
|
+
return Math.max(jittered, opts.hintMs ?? 0);
|
|
2228
|
+
}
|
|
2229
|
+
|
|
2179
2230
|
// src/client/lifecycle-errors.ts
|
|
2180
2231
|
function* walkErrorChain(error, maxDepth = 8) {
|
|
2181
2232
|
let current = error;
|
|
@@ -2351,9 +2402,11 @@ async function waitWithSignal(ms, signal) {
|
|
|
2351
2402
|
});
|
|
2352
2403
|
}
|
|
2353
2404
|
async function retryOnLifecycleBoundary(run, opts) {
|
|
2405
|
+
var _a;
|
|
2354
2406
|
const maxAttempts = (opts == null ? void 0 : opts.maxAttempts) ?? 5;
|
|
2355
2407
|
const initialDelayMs = (opts == null ? void 0 : opts.initialDelayMs) ?? 25;
|
|
2356
2408
|
const maxDelayMs = (opts == null ? void 0 : opts.maxDelayMs) ?? 200;
|
|
2409
|
+
(_a = opts == null ? void 0 : opts.budget) == null ? void 0 : _a.deposit();
|
|
2357
2410
|
let lastError;
|
|
2358
2411
|
for (let attempt = 0; attempt < maxAttempts; attempt += 1) {
|
|
2359
2412
|
throwIfAborted(opts == null ? void 0 : opts.signal);
|
|
@@ -2367,7 +2420,14 @@ async function retryOnLifecycleBoundary(run, opts) {
|
|
|
2367
2420
|
if (attempt === maxAttempts - 1) {
|
|
2368
2421
|
break;
|
|
2369
2422
|
}
|
|
2370
|
-
|
|
2423
|
+
if ((opts == null ? void 0 : opts.budget) && !opts.budget.tryWithdraw()) {
|
|
2424
|
+
break;
|
|
2425
|
+
}
|
|
2426
|
+
const delayMs = retryDelayMs(attempt, {
|
|
2427
|
+
initialDelayMs,
|
|
2428
|
+
maxDelayMs,
|
|
2429
|
+
hintMs: retryAfterMs(error)
|
|
2430
|
+
});
|
|
2371
2431
|
await waitWithSignal(delayMs, opts == null ? void 0 : opts.signal);
|
|
2372
2432
|
}
|
|
2373
2433
|
}
|
|
@@ -2460,17 +2520,22 @@ function addOutboundTelemetryHeaders(headers, telemetry) {
|
|
|
2460
2520
|
|
|
2461
2521
|
// src/client/utils.ts
|
|
2462
2522
|
import invariant from "invariant";
|
|
2523
|
+
var RETRY_AFTER_SUFFIX = /^retry_after_ms=(\d+)$/;
|
|
2463
2524
|
function parseWebSocketCloseReason(reason) {
|
|
2464
|
-
const [mainPart,
|
|
2525
|
+
const [mainPart, suffix] = reason.split("#");
|
|
2465
2526
|
const [group, code] = mainPart.split(".");
|
|
2466
2527
|
if (!group || !code) {
|
|
2467
2528
|
logger().warn({ msg: "failed to parse close reason", reason });
|
|
2468
2529
|
return void 0;
|
|
2469
2530
|
}
|
|
2531
|
+
const retryAfter = suffix == null ? void 0 : suffix.match(RETRY_AFTER_SUFFIX);
|
|
2532
|
+
if (retryAfter) {
|
|
2533
|
+
return { group, code, retryAfterMs: Number(retryAfter[1]) };
|
|
2534
|
+
}
|
|
2470
2535
|
return {
|
|
2471
2536
|
group,
|
|
2472
2537
|
code,
|
|
2473
|
-
rayId
|
|
2538
|
+
rayId: suffix
|
|
2474
2539
|
};
|
|
2475
2540
|
}
|
|
2476
2541
|
function messageLength(message) {
|
|
@@ -2868,6 +2933,7 @@ var ActorHandleRaw = class {
|
|
|
2868
2933
|
#queueSendMutex = new AsyncMutex();
|
|
2869
2934
|
#currentActorInvocation;
|
|
2870
2935
|
#startCallSpan;
|
|
2936
|
+
#retryBudget;
|
|
2871
2937
|
/**
|
|
2872
2938
|
* Do not call this directly.
|
|
2873
2939
|
*
|
|
@@ -2875,7 +2941,7 @@ var ActorHandleRaw = class {
|
|
|
2875
2941
|
*
|
|
2876
2942
|
* @protected
|
|
2877
2943
|
*/
|
|
2878
|
-
constructor(client, driver, params, getParams, encoding, actorResolutionState, gatewayOptions = {}, signal, currentActorInvocation, startCallSpan) {
|
|
2944
|
+
constructor(client, driver, params, getParams, encoding, actorResolutionState, gatewayOptions = {}, signal, currentActorInvocation, startCallSpan, retryBudget = new RetryBudget()) {
|
|
2879
2945
|
this.#client = client;
|
|
2880
2946
|
this.#driver = driver;
|
|
2881
2947
|
this.#encoding = encoding;
|
|
@@ -2886,6 +2952,7 @@ var ActorHandleRaw = class {
|
|
|
2886
2952
|
this.#signal = signal;
|
|
2887
2953
|
this.#currentActorInvocation = currentActorInvocation;
|
|
2888
2954
|
this.#startCallSpan = startCallSpan;
|
|
2955
|
+
this.#retryBudget = retryBudget;
|
|
2889
2956
|
}
|
|
2890
2957
|
async #resolveConnectionParams() {
|
|
2891
2958
|
if (this.#getParams) {
|
|
@@ -2902,6 +2969,7 @@ var ActorHandleRaw = class {
|
|
|
2902
2969
|
let useQueryTarget = isDynamicActorQuery(
|
|
2903
2970
|
this.#actorResolutionState
|
|
2904
2971
|
);
|
|
2972
|
+
this.#retryBudget.deposit();
|
|
2905
2973
|
for (let attempt = 0; attempt < maxAttempts; attempt++) {
|
|
2906
2974
|
let actorId;
|
|
2907
2975
|
try {
|
|
@@ -2938,8 +3006,17 @@ var ActorHandleRaw = class {
|
|
|
2938
3006
|
metadata,
|
|
2939
3007
|
attempt,
|
|
2940
3008
|
maxAttempts
|
|
2941
|
-
)) {
|
|
2942
|
-
await
|
|
3009
|
+
) && this.#retryBudget.tryWithdraw()) {
|
|
3010
|
+
await new Promise(
|
|
3011
|
+
(resolve) => setTimeout(
|
|
3012
|
+
resolve,
|
|
3013
|
+
retryDelayMs(attempt, {
|
|
3014
|
+
initialDelayMs: 25,
|
|
3015
|
+
maxDelayMs: 1e3,
|
|
3016
|
+
hintMs: retryAfterMs(err)
|
|
3017
|
+
})
|
|
3018
|
+
)
|
|
3019
|
+
);
|
|
2943
3020
|
continue;
|
|
2944
3021
|
}
|
|
2945
3022
|
if (await this.#shouldRetrySchedulingError(
|
|
@@ -3016,7 +3093,10 @@ var ActorHandleRaw = class {
|
|
|
3016
3093
|
if (opts.name === "destroy") {
|
|
3017
3094
|
return await run();
|
|
3018
3095
|
}
|
|
3019
|
-
return await retryOnLifecycleBoundary(run, {
|
|
3096
|
+
return await retryOnLifecycleBoundary(run, {
|
|
3097
|
+
signal,
|
|
3098
|
+
budget: this.#retryBudget
|
|
3099
|
+
});
|
|
3020
3100
|
};
|
|
3021
3101
|
if (!call) {
|
|
3022
3102
|
return await send();
|
|
@@ -3558,6 +3638,7 @@ var ClientRaw = class {
|
|
|
3558
3638
|
#gatewayOptions;
|
|
3559
3639
|
#currentActorInvocation;
|
|
3560
3640
|
#startCallSpan;
|
|
3641
|
+
#retryBudget;
|
|
3561
3642
|
/**
|
|
3562
3643
|
* Creates an instance of Client.
|
|
3563
3644
|
*/
|
|
@@ -3570,6 +3651,7 @@ var ClientRaw = class {
|
|
|
3570
3651
|
this.#gatewayOptions = options.gateway ?? {};
|
|
3571
3652
|
this.#currentActorInvocation = options.currentActorInvocation;
|
|
3572
3653
|
this.#startCallSpan = options.startCallSpan;
|
|
3654
|
+
this.#retryBudget = new RetryBudget(options.retryBudget);
|
|
3573
3655
|
}
|
|
3574
3656
|
/**
|
|
3575
3657
|
* Gets a stateless handle to a actor by its ID.
|
|
@@ -3727,7 +3809,8 @@ var ClientRaw = class {
|
|
|
3727
3809
|
this.#gatewayOptions,
|
|
3728
3810
|
signal,
|
|
3729
3811
|
this.#currentActorInvocation,
|
|
3730
|
-
this.#startCallSpan
|
|
3812
|
+
this.#startCallSpan,
|
|
3813
|
+
this.#retryBudget
|
|
3731
3814
|
);
|
|
3732
3815
|
}
|
|
3733
3816
|
[CREATE_ACTOR_CONN_PROXY](conn) {
|
|
@@ -3927,6 +4010,10 @@ function jwtExpiration(token) {
|
|
|
3927
4010
|
}
|
|
3928
4011
|
|
|
3929
4012
|
// src/client/actor-conn.ts
|
|
4013
|
+
var CONNECT_TIMEOUT_MS = 2e4;
|
|
4014
|
+
function isConnectionOpenTimeout(error) {
|
|
4015
|
+
return error instanceof RivetError && error.group === "client" && error.code === "connection_open_timeout";
|
|
4016
|
+
}
|
|
3930
4017
|
var CONNECT_SYMBOL = /* @__PURE__ */ Symbol("connect");
|
|
3931
4018
|
var ActorConnRaw = class {
|
|
3932
4019
|
#disposed = false;
|
|
@@ -3954,6 +4041,8 @@ var ActorConnRaw = class {
|
|
|
3954
4041
|
#keepNodeAliveInterval;
|
|
3955
4042
|
/** Promise used to indicate the socket has connected successfully. This will be rejected if the connection fails. */
|
|
3956
4043
|
#onOpenPromise;
|
|
4044
|
+
/** Sockets given up on by the connect timeout. Their late events are ignored. */
|
|
4045
|
+
#abandonedSockets = /* @__PURE__ */ new WeakSet();
|
|
3957
4046
|
#websocket;
|
|
3958
4047
|
#authRetryAvailable = true;
|
|
3959
4048
|
#client;
|
|
@@ -4144,12 +4233,16 @@ var ActorConnRaw = class {
|
|
|
4144
4233
|
forever: true,
|
|
4145
4234
|
minTimeout: 250,
|
|
4146
4235
|
maxTimeout: 3e4,
|
|
4147
|
-
onFailedAttempt: (error) => {
|
|
4236
|
+
onFailedAttempt: async (error) => {
|
|
4148
4237
|
logger().warn({
|
|
4149
4238
|
msg: "failed to reconnect",
|
|
4150
4239
|
attempt: error.attemptNumber,
|
|
4151
4240
|
error: stringifyError(error)
|
|
4152
4241
|
});
|
|
4242
|
+
const hintMs = retryAfterMs(error);
|
|
4243
|
+
if (hintMs !== void 0) {
|
|
4244
|
+
await new Promise((resolve) => setTimeout(resolve, hintMs));
|
|
4245
|
+
}
|
|
4153
4246
|
},
|
|
4154
4247
|
// Cancel retry if aborted
|
|
4155
4248
|
signal: this.#abortController.signal
|
|
@@ -4175,7 +4268,7 @@ var ActorConnRaw = class {
|
|
|
4175
4268
|
})
|
|
4176
4269
|
);
|
|
4177
4270
|
await this.#connectWebSocket();
|
|
4178
|
-
await this.#onOpenPromise.promise;
|
|
4271
|
+
await this.#waitForOpen(this.#onOpenPromise.promise);
|
|
4179
4272
|
} catch (error) {
|
|
4180
4273
|
if (this.#shouldRetryConnectionOpenError(error)) {
|
|
4181
4274
|
throw error;
|
|
@@ -4197,10 +4290,63 @@ var ActorConnRaw = class {
|
|
|
4197
4290
|
this.#onOpenPromise = void 0;
|
|
4198
4291
|
}
|
|
4199
4292
|
}
|
|
4293
|
+
/**
|
|
4294
|
+
* Waits for the actor's Init on the current socket, up to {@link CONNECT_TIMEOUT_MS}. A socket
|
|
4295
|
+
* can stay connecting with no open, error or close event, as when the engine holds the
|
|
4296
|
+
* upgrade or a refused connect reports only an error. On timeout the socket is abandoned
|
|
4297
|
+
* and closed, and the retryable `client.connection_open_timeout` starts the next attempt.
|
|
4298
|
+
*/
|
|
4299
|
+
async #waitForOpen(open) {
|
|
4300
|
+
let timer;
|
|
4301
|
+
const timedOut = new Promise((_, reject) => {
|
|
4302
|
+
timer = setTimeout(() => {
|
|
4303
|
+
reject(
|
|
4304
|
+
new RivetError(
|
|
4305
|
+
"client",
|
|
4306
|
+
"connection_open_timeout",
|
|
4307
|
+
`Connection did not open within ${CONNECT_TIMEOUT_MS} ms`
|
|
4308
|
+
)
|
|
4309
|
+
);
|
|
4310
|
+
}, CONNECT_TIMEOUT_MS);
|
|
4311
|
+
});
|
|
4312
|
+
try {
|
|
4313
|
+
await Promise.race([open, timedOut]);
|
|
4314
|
+
} catch (error) {
|
|
4315
|
+
if (isConnectionOpenTimeout(error)) {
|
|
4316
|
+
this.#abandonCurrentSocket();
|
|
4317
|
+
}
|
|
4318
|
+
throw error;
|
|
4319
|
+
} finally {
|
|
4320
|
+
clearTimeout(timer);
|
|
4321
|
+
}
|
|
4322
|
+
}
|
|
4323
|
+
#abandonCurrentSocket() {
|
|
4324
|
+
const ws = this.#websocket;
|
|
4325
|
+
if (!ws) return;
|
|
4326
|
+
this.#websocket = void 0;
|
|
4327
|
+
this.#abandonedSockets.add(ws);
|
|
4328
|
+
logger().warn({
|
|
4329
|
+
msg: "connection did not open in time, retrying",
|
|
4330
|
+
connId: this.#connId,
|
|
4331
|
+
readyState: ws.readyState,
|
|
4332
|
+
timeoutMs: CONNECT_TIMEOUT_MS
|
|
4333
|
+
});
|
|
4334
|
+
try {
|
|
4335
|
+
ws.close(1e3, "Connect timeout");
|
|
4336
|
+
} catch (err) {
|
|
4337
|
+
logger().debug({
|
|
4338
|
+
msg: "failed to close abandoned websocket",
|
|
4339
|
+
error: stringifyError(err)
|
|
4340
|
+
});
|
|
4341
|
+
}
|
|
4342
|
+
}
|
|
4200
4343
|
#shouldRetryConnectionOpenError(error) {
|
|
4201
4344
|
if (error instanceof ActorConnDisposed) {
|
|
4202
4345
|
return false;
|
|
4203
4346
|
}
|
|
4347
|
+
if (isConnectionOpenTimeout(error)) {
|
|
4348
|
+
return true;
|
|
4349
|
+
}
|
|
4204
4350
|
if (error instanceof RivetError && isInvalidToken(error.group, error.code) && this.#driver.refreshAuthToken && this.#authRetryAvailable) {
|
|
4205
4351
|
this.#authRetryAvailable = false;
|
|
4206
4352
|
return true;
|
|
@@ -4260,12 +4406,14 @@ var ActorConnRaw = class {
|
|
|
4260
4406
|
});
|
|
4261
4407
|
this.#websocket = ws;
|
|
4262
4408
|
ws.addEventListener("open", () => {
|
|
4409
|
+
if (this.#abandonedSockets.has(ws)) return;
|
|
4263
4410
|
logger().debug({
|
|
4264
4411
|
msg: "client websocket open",
|
|
4265
4412
|
connId: this.#connId
|
|
4266
4413
|
});
|
|
4267
4414
|
});
|
|
4268
4415
|
ws.addEventListener("message", async (ev) => {
|
|
4416
|
+
if (this.#abandonedSockets.has(ws)) return;
|
|
4269
4417
|
try {
|
|
4270
4418
|
await this.#handleOnMessage(ev.data);
|
|
4271
4419
|
} catch (err) {
|
|
@@ -4276,6 +4424,7 @@ var ActorConnRaw = class {
|
|
|
4276
4424
|
}
|
|
4277
4425
|
});
|
|
4278
4426
|
ws.addEventListener("close", async (ev) => {
|
|
4427
|
+
if (this.#abandonedSockets.has(ws)) return;
|
|
4279
4428
|
try {
|
|
4280
4429
|
await this.#handleOnClose(ev);
|
|
4281
4430
|
} catch (err) {
|
|
@@ -4286,6 +4435,7 @@ var ActorConnRaw = class {
|
|
|
4286
4435
|
}
|
|
4287
4436
|
});
|
|
4288
4437
|
ws.addEventListener("error", () => {
|
|
4438
|
+
if (this.#abandonedSockets.has(ws)) return;
|
|
4289
4439
|
try {
|
|
4290
4440
|
this.#handleOnError();
|
|
4291
4441
|
} catch (err) {
|
|
@@ -4494,7 +4644,8 @@ var ActorConnRaw = class {
|
|
|
4494
4644
|
const reason = closeEvent.reason || "";
|
|
4495
4645
|
const parsed = parseWebSocketCloseReason(reason);
|
|
4496
4646
|
if (parsed) {
|
|
4497
|
-
const { group, code, rayId } = parsed;
|
|
4647
|
+
const { group, code, rayId, retryAfterMs: retryAfterMs2 } = parsed;
|
|
4648
|
+
const closeOptions = retryAfterMs2 === void 0 ? { rayId } : { rayId, metadata: { retry_after_ms: retryAfterMs2 } };
|
|
4498
4649
|
if (isInvalidToken(group, code) && closeEvent.code === 1008 && failedSocket) {
|
|
4499
4650
|
try {
|
|
4500
4651
|
if (!await ((_b = (_a = this.#driver).refreshAuthToken) == null ? void 0 : _b.call(
|
|
@@ -4517,7 +4668,7 @@ var ActorConnRaw = class {
|
|
|
4517
4668
|
group,
|
|
4518
4669
|
code,
|
|
4519
4670
|
`Connection closed: ${reason}`,
|
|
4520
|
-
|
|
4671
|
+
closeOptions
|
|
4521
4672
|
)
|
|
4522
4673
|
);
|
|
4523
4674
|
return;
|
|
@@ -4538,7 +4689,7 @@ var ActorConnRaw = class {
|
|
|
4538
4689
|
group,
|
|
4539
4690
|
code,
|
|
4540
4691
|
`Connection closed: ${reason}`,
|
|
4541
|
-
|
|
4692
|
+
closeOptions
|
|
4542
4693
|
);
|
|
4543
4694
|
}
|
|
4544
4695
|
} else {
|
|
@@ -4546,7 +4697,7 @@ var ActorConnRaw = class {
|
|
|
4546
4697
|
group,
|
|
4547
4698
|
code,
|
|
4548
4699
|
`Connection closed: ${reason}`,
|
|
4549
|
-
|
|
4700
|
+
closeOptions
|
|
4550
4701
|
);
|
|
4551
4702
|
}
|
|
4552
4703
|
this.#invalidateActorIfStale(group, code);
|
|
@@ -5164,6 +5315,14 @@ var ClientConfigSchemaBase = z2.object({
|
|
|
5164
5315
|
// This is required in the client config in order to support
|
|
5165
5316
|
// `proxyWebSocket`
|
|
5166
5317
|
getUpgradeWebSocket: z2.custom().optional(),
|
|
5318
|
+
/**
|
|
5319
|
+
* Bounds retries of refused requests: `percent` retries per 100 requests (default 10), with
|
|
5320
|
+
* up to `maxTokens` banked for bursts (default 100). A refusal past the budget is thrown.
|
|
5321
|
+
*/
|
|
5322
|
+
retryBudget: z2.object({
|
|
5323
|
+
percent: z2.number().min(0).max(100).optional(),
|
|
5324
|
+
maxTokens: z2.number().int().min(0).optional()
|
|
5325
|
+
}).optional(),
|
|
5167
5326
|
/** Replaces global fetch for actor HTTP gateway requests. */
|
|
5168
5327
|
fetch: z2.custom().optional(),
|
|
5169
5328
|
/** Whether to automatically perform health checks when the client is created. */
|
|
@@ -5206,7 +5365,7 @@ function convertRegistryConfigToClientConfig(config) {
|
|
|
5206
5365
|
token: config.token,
|
|
5207
5366
|
getToken: void 0,
|
|
5208
5367
|
namespace: config.namespace,
|
|
5209
|
-
poolName: config.
|
|
5368
|
+
poolName: config.node.poolName,
|
|
5210
5369
|
headers: config.headers,
|
|
5211
5370
|
gateway: { skipReadyWait: false },
|
|
5212
5371
|
encoding: "bare",
|
|
@@ -5533,8 +5692,9 @@ function buildActorQueryGatewayUrl(endpoint, namespace, query, token, path = "",
|
|
|
5533
5692
|
return combineUrlPath(endpoint, gatewayPath);
|
|
5534
5693
|
}
|
|
5535
5694
|
function pushKeyQueryParams(params, key) {
|
|
5536
|
-
|
|
5537
|
-
|
|
5695
|
+
const rvtKey = actorKeyToGatewayQuery(key);
|
|
5696
|
+
if (rvtKey !== void 0) {
|
|
5697
|
+
params.append("rvt-key", rvtKey);
|
|
5538
5698
|
}
|
|
5539
5699
|
}
|
|
5540
5700
|
function pushInputQueryParam(params, input, maxInputSize) {
|
|
@@ -5716,8 +5876,8 @@ async function updateRunnerConfig(config, runnerName, request) {
|
|
|
5716
5876
|
return apiCall(
|
|
5717
5877
|
config,
|
|
5718
5878
|
"PUT",
|
|
5719
|
-
`/
|
|
5720
|
-
request
|
|
5879
|
+
`/pools/${encodeURIComponent(runnerName)}`,
|
|
5880
|
+
Object.values(request.datacenters)[0]
|
|
5721
5881
|
);
|
|
5722
5882
|
}
|
|
5723
5883
|
|
|
@@ -6050,7 +6210,7 @@ var RemoteEngineControlClient = class {
|
|
|
6050
6210
|
datacenter: region,
|
|
6051
6211
|
name,
|
|
6052
6212
|
key: serializeActorKey(key),
|
|
6053
|
-
|
|
6213
|
+
pool: poolName ?? this.#config.poolName,
|
|
6054
6214
|
input: actorInput ? uint8ArrayToBase64(
|
|
6055
6215
|
encodeCborCompat(actorInput)
|
|
6056
6216
|
) : void 0,
|
|
@@ -6103,7 +6263,7 @@ var RemoteEngineControlClient = class {
|
|
|
6103
6263
|
(config) => createActor(config, {
|
|
6104
6264
|
datacenter: region,
|
|
6105
6265
|
name,
|
|
6106
|
-
|
|
6266
|
+
pool: poolName ?? this.#config.poolName,
|
|
6107
6267
|
key: serializeActorKey(key),
|
|
6108
6268
|
input: input ? uint8ArrayToBase64(
|
|
6109
6269
|
encodeCborCompat(input)
|
|
@@ -6369,4 +6529,4 @@ export {
|
|
|
6369
6529
|
updateRunnerConfig,
|
|
6370
6530
|
RemoteEngineControlClient
|
|
6371
6531
|
};
|
|
6372
|
-
//# sourceMappingURL=chunk-
|
|
6532
|
+
//# sourceMappingURL=chunk-6IGGYL2C.js.map
|