rivetkit 2.3.0-rc.10 → 2.3.0-rc.11
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 +105 -56
- package/dist/browser/client.js +128 -87
- package/dist/browser/client.js.map +1 -1
- package/dist/browser/inspector/client.js +40 -20
- package/dist/browser/inspector/client.js.map +1 -1
- package/dist/tsup/actor/errors.cjs +2 -2
- package/dist/tsup/actor/errors.js +1 -1
- package/dist/tsup/agent-os/index.cjs +2103 -2090
- package/dist/tsup/agent-os/index.cjs.map +1 -1
- package/dist/tsup/agent-os/index.d.cts +106 -66
- package/dist/tsup/agent-os/index.d.ts +106 -66
- package/dist/tsup/agent-os/index.js +2102 -2089
- package/dist/tsup/agent-os/index.js.map +1 -1
- package/dist/tsup/{chunk-4K3MV2MW.cjs → chunk-2NXFKPRB.cjs} +10 -10
- package/dist/tsup/chunk-2NXFKPRB.cjs.map +1 -0
- package/dist/tsup/{chunk-6BI2MS3S.js → chunk-3P2JUHWJ.js} +2 -2
- package/dist/tsup/{chunk-KU6VKVEK.js → chunk-4FP4FFB5.js} +18 -6
- package/dist/tsup/chunk-4FP4FFB5.js.map +1 -0
- package/dist/tsup/{chunk-KIWH5H3K.js → chunk-BRP62GZC.js} +3 -3
- package/dist/tsup/chunk-BRP62GZC.js.map +1 -0
- package/dist/tsup/{chunk-G34LIR7S.js → chunk-GRFBV2U7.js} +22 -7
- package/dist/tsup/chunk-GRFBV2U7.js.map +1 -0
- package/dist/tsup/{chunk-PWFGP2US.cjs → chunk-GX6W4MW3.cjs} +138 -24
- package/dist/tsup/chunk-GX6W4MW3.cjs.map +1 -0
- package/dist/tsup/{chunk-3YY5S6TV.js → chunk-HXUEHHJF.js} +2 -2
- package/dist/tsup/chunk-HXUEHHJF.js.map +1 -0
- package/dist/tsup/{chunk-PCBNKI2J.js → chunk-JZ7TWV65.js} +1 -1
- package/dist/tsup/chunk-JZ7TWV65.js.map +1 -0
- package/dist/tsup/{chunk-QAZLM4WT.cjs → chunk-KORQB2IR.cjs} +3 -3
- package/dist/tsup/{chunk-QAZLM4WT.cjs.map → chunk-KORQB2IR.cjs.map} +1 -1
- package/dist/tsup/{chunk-BM3EOY7M.js → chunk-KRC4L3YB.js} +134 -20
- package/dist/tsup/chunk-KRC4L3YB.js.map +1 -0
- package/dist/tsup/{chunk-G5RULGYQ.cjs → chunk-LNP7Q6I6.cjs} +24 -9
- package/dist/tsup/chunk-LNP7Q6I6.cjs.map +1 -0
- package/dist/tsup/{chunk-Z4C3W2CQ.cjs → chunk-LW5HNCWD.cjs} +3 -3
- package/dist/tsup/{chunk-Z4C3W2CQ.cjs.map → chunk-LW5HNCWD.cjs.map} +1 -1
- package/dist/tsup/{chunk-J5P6S2LC.cjs → chunk-RDBGKI66.cjs} +25 -13
- package/dist/tsup/chunk-RDBGKI66.cjs.map +1 -0
- package/dist/tsup/{chunk-T6YVRM4K.js → chunk-T3VCJ4PV.js} +3 -1
- package/dist/tsup/chunk-T3VCJ4PV.js.map +1 -0
- package/dist/tsup/{chunk-WU2O2KIE.js → chunk-TTLUIDVH.js} +61 -77
- package/dist/tsup/chunk-TTLUIDVH.js.map +1 -0
- package/dist/tsup/{chunk-LD5YASJU.cjs → chunk-VE2X4KMG.cjs} +2 -2
- package/dist/tsup/{chunk-LD5YASJU.cjs.map → chunk-VE2X4KMG.cjs.map} +1 -1
- package/dist/tsup/{chunk-XV52XUWU.js → chunk-WXYWDLJY.js} +4 -4
- package/dist/tsup/chunk-WXYWDLJY.js.map +1 -0
- package/dist/tsup/{chunk-WQ4HNA4W.cjs → chunk-XCDCURZ4.cjs} +4 -2
- package/dist/tsup/chunk-XCDCURZ4.cjs.map +1 -0
- package/dist/tsup/{chunk-TE4VCDNY.cjs → chunk-XG25CGSW.cjs} +217 -233
- package/dist/tsup/chunk-XG25CGSW.cjs.map +1 -0
- package/dist/tsup/{chunk-3LGP4JSO.cjs → chunk-Y3JBOFBG.cjs} +8 -8
- package/dist/tsup/{chunk-3LGP4JSO.cjs.map → chunk-Y3JBOFBG.cjs.map} +1 -1
- package/dist/tsup/{chunk-CMYS77J6.js → chunk-YRQ4F5CD.js} +3 -3
- package/dist/tsup/{chunk-2NDZ7JCR.cjs → chunk-ZA7FLHKH.cjs} +1 -1
- package/dist/tsup/chunk-ZA7FLHKH.cjs.map +1 -0
- package/dist/tsup/client/mod.cjs +9 -9
- package/dist/tsup/client/mod.d.cts +4 -4
- package/dist/tsup/client/mod.d.ts +4 -4
- package/dist/tsup/client/mod.js +8 -8
- package/dist/tsup/common/log.cjs +3 -3
- package/dist/tsup/common/log.js +2 -2
- package/dist/tsup/common/websocket.cjs +4 -4
- package/dist/tsup/common/websocket.js +3 -3
- package/dist/tsup/{config-Ca8dN4cS.d.cts → config-CTwe3WwC.d.cts} +69 -19
- package/dist/tsup/{config-CxjGYf4K.d.cts → config-D49x8NpL.d.cts} +1 -2
- package/dist/tsup/{config-CxjGYf4K.d.ts → config-D49x8NpL.d.ts} +1 -2
- package/dist/tsup/{config-0Ta55UV0.d.ts → config-De5UVu0V.d.ts} +69 -19
- package/dist/tsup/{context-B_IWbWne.d.ts → context-DPHISlUi.d.ts} +8 -8
- package/dist/tsup/{context-CUrQ9MHc.d.cts → context-Dmj477Uh.d.cts} +8 -8
- package/dist/tsup/db/drizzle.cjs +3 -3
- 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 +2 -2
- package/dist/tsup/db/mod.d.cts +2 -2
- package/dist/tsup/db/mod.d.ts +2 -2
- package/dist/tsup/db/mod.js +1 -1
- package/dist/tsup/dynamic/mod.cjs +24 -0
- package/dist/tsup/dynamic/mod.cjs.map +1 -0
- package/dist/tsup/dynamic/mod.d.cts +37 -0
- package/dist/tsup/dynamic/mod.d.ts +37 -0
- package/dist/tsup/dynamic/mod.js +24 -0
- package/dist/tsup/dynamic/mod.js.map +1 -0
- package/dist/tsup/inspector/mod.cjs +6 -6
- package/dist/tsup/inspector/mod.js +5 -5
- package/dist/tsup/mod.cjs +501 -315
- 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 +405 -219
- package/dist/tsup/mod.js.map +1 -1
- package/dist/tsup/test/mod.cjs +21 -18
- package/dist/tsup/test/mod.cjs.map +1 -1
- package/dist/tsup/test/mod.d.cts +3 -3
- package/dist/tsup/test/mod.d.ts +3 -3
- package/dist/tsup/test/mod.js +18 -15
- package/dist/tsup/test/mod.js.map +1 -1
- package/dist/tsup/utils.cjs +3 -3
- package/dist/tsup/utils.d.cts +1 -1
- package/dist/tsup/utils.d.ts +1 -1
- package/dist/tsup/utils.js +2 -2
- package/dist/tsup/workflow/mod.cjs +307 -282
- package/dist/tsup/workflow/mod.cjs.map +1 -1
- package/dist/tsup/workflow/mod.d.cts +5 -5
- package/dist/tsup/workflow/mod.d.ts +5 -5
- package/dist/tsup/workflow/mod.js +501 -476
- package/dist/tsup/workflow/mod.js.map +1 -1
- package/package.json +22 -11
- package/src/actor/config.ts +48 -41
- package/src/actor/contexts/index.ts +7 -2
- package/src/actor/definition.ts +11 -14
- package/src/actor/driver.ts +3 -3
- package/src/actor/errors.ts +9 -3
- package/src/actor/instance/mod.ts +22 -30
- package/src/actor/keys.ts +1 -1
- package/src/actor/mod.ts +20 -20
- package/src/actor/schema.ts +2 -2
- package/src/agent-os/actor/index.ts +38 -18
- package/src/agent-os/actor/preview.ts +1 -2
- package/src/agent-os/actor/session.ts +2 -2
- package/src/agent-os/config.ts +1 -1
- package/src/agent-os/fs/database-vfs.ts +1 -1
- package/src/agent-os/index.ts +16 -15
- package/src/client/actor-common.ts +90 -54
- package/src/client/actor-conn.ts +8 -36
- package/src/client/actor-handle.ts +67 -50
- package/src/client/actor-query.ts +5 -5
- package/src/client/errors.ts +1 -1
- package/src/client/lifecycle-errors.ts +2 -4
- package/src/client/query.ts +1 -1
- package/src/client/queue.ts +8 -3
- package/src/client/raw-utils.ts +8 -6
- package/src/client/resolve-gateway-target.ts +1 -1
- package/src/client/utils.ts +2 -7
- package/src/common/actor-websocket.ts +3 -1
- package/src/common/bare/actor-persist/v1.ts +205 -163
- package/src/common/bare/actor-persist/v2.ts +265 -213
- package/src/common/bare/actor-persist/v3.ts +176 -172
- package/src/common/bare/actor-persist/v4.ts +254 -253
- package/src/common/bare/transport/v1.ts +659 -543
- package/src/common/client-protocol-versioned.ts +66 -64
- package/src/common/database/config.ts +2 -8
- package/src/common/database/native-database.ts +1 -1
- package/src/common/database/shared.ts +1 -0
- package/src/common/encoding.ts +250 -16
- package/src/common/eventsource.ts +1 -1
- package/src/common/inline-websocket-adapter.ts +14 -13
- package/src/common/log.ts +1 -0
- package/src/common/router.ts +13 -17
- package/src/common/utils.ts +0 -149
- package/src/common/websocket-interface.ts +1 -1
- package/src/db/mod.ts +1 -1
- package/src/drivers/engine/actor-driver.ts +63 -72
- package/src/dynamic/instance.ts +32 -0
- package/src/dynamic/internal.ts +50 -0
- package/src/dynamic/isolate-runtime.ts +66 -0
- package/src/dynamic/mod.ts +32 -0
- package/src/engine-client/actor-http-client.ts +1 -1
- package/src/engine-client/actor-websocket-client.ts +6 -5
- package/src/engine-client/api-endpoints.ts +47 -2
- package/src/engine-client/api-utils.ts +2 -2
- package/src/engine-client/driver.ts +1 -1
- package/src/engine-client/mod.ts +6 -3
- package/src/engine-client/ws-proxy.ts +4 -4
- package/src/inspector/client.browser.ts +5 -11
- package/src/inspector/mod.ts +1 -3
- package/src/registry/config/envoy.ts +1 -2
- package/src/registry/config/index.ts +7 -7
- package/src/registry/index.ts +70 -71
- package/src/registry/napi-runtime.ts +7 -2
- package/src/registry/native-validation.ts +10 -12
- package/src/registry/native.ts +179 -153
- package/src/registry/process-metrics.ts +238 -0
- package/src/registry/runtime.ts +1 -3
- package/src/registry/wasm-runtime.ts +3 -2
- package/src/registry/write-through-proxy.ts +40 -0
- package/src/serde.ts +2 -2
- package/src/serverless/configure.ts +18 -7
- package/src/test/mod.ts +11 -8
- package/src/utils/endpoint-parser.ts +1 -1
- package/src/utils/router.ts +1 -1
- package/src/utils/serve.ts +4 -5
- package/src/utils.ts +1 -2
- package/src/workflow/context.ts +61 -33
- package/src/workflow/driver.ts +4 -6
- package/src/workflow/inspector.ts +4 -3
- package/src/workflow/mod.ts +15 -17
- package/dist/tsup/chunk-2NDZ7JCR.cjs.map +0 -1
- package/dist/tsup/chunk-3YY5S6TV.js.map +0 -1
- package/dist/tsup/chunk-4K3MV2MW.cjs.map +0 -1
- package/dist/tsup/chunk-BM3EOY7M.js.map +0 -1
- package/dist/tsup/chunk-G34LIR7S.js.map +0 -1
- package/dist/tsup/chunk-G5RULGYQ.cjs.map +0 -1
- package/dist/tsup/chunk-J5P6S2LC.cjs.map +0 -1
- package/dist/tsup/chunk-KIWH5H3K.js.map +0 -1
- package/dist/tsup/chunk-KU6VKVEK.js.map +0 -1
- package/dist/tsup/chunk-PCBNKI2J.js.map +0 -1
- package/dist/tsup/chunk-PWFGP2US.cjs.map +0 -1
- package/dist/tsup/chunk-T6YVRM4K.js.map +0 -1
- package/dist/tsup/chunk-TE4VCDNY.cjs.map +0 -1
- package/dist/tsup/chunk-WQ4HNA4W.cjs.map +0 -1
- package/dist/tsup/chunk-WU2O2KIE.js.map +0 -1
- package/dist/tsup/chunk-XV52XUWU.js.map +0 -1
- /package/dist/tsup/{chunk-6BI2MS3S.js.map → chunk-3P2JUHWJ.js.map} +0 -0
- /package/dist/tsup/{chunk-CMYS77J6.js.map → chunk-YRQ4F5CD.js.map} +0 -0
package/dist/tsup/mod.js
CHANGED
|
@@ -2,13 +2,14 @@ import {
|
|
|
2
2
|
ACTOR_CONTEXT_INTERNAL_SYMBOL,
|
|
3
3
|
ActorConfigSchema,
|
|
4
4
|
CONN_STATE_MANAGER_SYMBOL,
|
|
5
|
+
RAW_STATE_SYMBOL,
|
|
5
6
|
getRunFunction,
|
|
6
7
|
getRunInspectorConfig,
|
|
7
8
|
getRunMetadata
|
|
8
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-T3VCJ4PV.js";
|
|
9
10
|
import {
|
|
10
11
|
decodeWorkflowHistoryTransport
|
|
11
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-GRFBV2U7.js";
|
|
12
13
|
import {
|
|
13
14
|
ALLOWED_PUBLIC_HEADERS,
|
|
14
15
|
HEADER_CONN_PARAMS,
|
|
@@ -18,7 +19,7 @@ import {
|
|
|
18
19
|
getDatacenters,
|
|
19
20
|
tryParseEndpoint,
|
|
20
21
|
updateRunnerConfig
|
|
21
|
-
} from "./chunk-
|
|
22
|
+
} from "./chunk-TTLUIDVH.js";
|
|
22
23
|
import {
|
|
23
24
|
KEYS,
|
|
24
25
|
makePrefixedKey,
|
|
@@ -26,18 +27,19 @@ import {
|
|
|
26
27
|
queueMetadataKey,
|
|
27
28
|
removePrefixFromKey,
|
|
28
29
|
workflowStoragePrefix
|
|
29
|
-
} from "./chunk-
|
|
30
|
+
} from "./chunk-HXUEHHJF.js";
|
|
30
31
|
import {
|
|
32
|
+
assertJsonCompatValue,
|
|
31
33
|
decodeCborCompat,
|
|
32
|
-
decodeCborJsonCompat,
|
|
33
34
|
encodeCborCompat
|
|
34
|
-
} from "./chunk-
|
|
35
|
-
import "./chunk-
|
|
36
|
-
import "./chunk-
|
|
35
|
+
} from "./chunk-KRC4L3YB.js";
|
|
36
|
+
import "./chunk-JZ7TWV65.js";
|
|
37
|
+
import "./chunk-3P2JUHWJ.js";
|
|
37
38
|
import {
|
|
38
39
|
LogLevelSchema,
|
|
39
40
|
VERSION,
|
|
40
41
|
deconstructError,
|
|
42
|
+
detectRuntime,
|
|
41
43
|
getEnvUniversal,
|
|
42
44
|
getLogger,
|
|
43
45
|
getNodeEnv,
|
|
@@ -57,7 +59,7 @@ import {
|
|
|
57
59
|
noopNext,
|
|
58
60
|
stringifyError,
|
|
59
61
|
toUint8Array
|
|
60
|
-
} from "./chunk-
|
|
62
|
+
} from "./chunk-4FP4FFB5.js";
|
|
61
63
|
import {
|
|
62
64
|
INTERNAL_ERROR_CODE,
|
|
63
65
|
RivetError,
|
|
@@ -68,7 +70,7 @@ import {
|
|
|
68
70
|
isRivetErrorLike,
|
|
69
71
|
toRivetError,
|
|
70
72
|
unsupportedFeature
|
|
71
|
-
} from "./chunk-
|
|
73
|
+
} from "./chunk-BRP62GZC.js";
|
|
72
74
|
|
|
73
75
|
// src/actor/log.ts
|
|
74
76
|
function loggerWithoutContext() {
|
|
@@ -140,7 +142,7 @@ function hasSchemaConfigKey(schemas, key) {
|
|
|
140
142
|
if (!schemas) {
|
|
141
143
|
return false;
|
|
142
144
|
}
|
|
143
|
-
return Object.
|
|
145
|
+
return Object.hasOwn(schemas, key);
|
|
144
146
|
}
|
|
145
147
|
function getEventCanSubscribe(schemas, key) {
|
|
146
148
|
const schema = schemas == null ? void 0 : schemas[key];
|
|
@@ -201,8 +203,8 @@ function validateSchemaSync(schemas, key, data) {
|
|
|
201
203
|
}
|
|
202
204
|
|
|
203
205
|
// src/common/inline-websocket-adapter.ts
|
|
204
|
-
import { WSContext } from "hono/ws";
|
|
205
206
|
import { VirtualWebSocket } from "@rivetkit/virtual-websocket";
|
|
207
|
+
import { WSContext } from "hono/ws";
|
|
206
208
|
function logger() {
|
|
207
209
|
return getLogger("inline-websocket-adapter");
|
|
208
210
|
}
|
|
@@ -314,24 +316,24 @@ var InlineWebSocketAdapter = class {
|
|
|
314
316
|
this.#close(1011, "Internal error during initialization");
|
|
315
317
|
}
|
|
316
318
|
}
|
|
317
|
-
#handleError(
|
|
318
|
-
console.error("INLINE_WEBSOCKET_ADAPTER_ERROR",
|
|
319
|
+
#handleError(error) {
|
|
320
|
+
console.error("INLINE_WEBSOCKET_ADAPTER_ERROR", error);
|
|
319
321
|
logger().error({
|
|
320
322
|
msg: "error in websocket",
|
|
321
|
-
error
|
|
322
|
-
errorMessage:
|
|
323
|
-
stack:
|
|
323
|
+
error,
|
|
324
|
+
errorMessage: error instanceof Error ? error.message : String(error),
|
|
325
|
+
stack: error instanceof Error ? error.stack : void 0
|
|
324
326
|
});
|
|
325
327
|
try {
|
|
326
|
-
this.#handler.onError(
|
|
327
|
-
} catch (
|
|
328
|
+
this.#handler.onError(error, this.#wsContext);
|
|
329
|
+
} catch (error2) {
|
|
328
330
|
logger().error({
|
|
329
331
|
msg: "error in onError handler",
|
|
330
|
-
error:
|
|
332
|
+
error: error2
|
|
331
333
|
});
|
|
332
334
|
}
|
|
333
|
-
this.#clientWs.triggerError(
|
|
334
|
-
this.#actorWs.triggerError(
|
|
335
|
+
this.#clientWs.triggerError(error);
|
|
336
|
+
this.#actorWs.triggerError(error);
|
|
335
337
|
}
|
|
336
338
|
#close(code, reason) {
|
|
337
339
|
if (this.#readyState === 3 || this.#readyState === 2) {
|
|
@@ -344,8 +346,8 @@ var InlineWebSocketAdapter = class {
|
|
|
344
346
|
{ code, reason, wasClean: true },
|
|
345
347
|
this.#wsContext
|
|
346
348
|
);
|
|
347
|
-
} catch (
|
|
348
|
-
logger().error({ msg: "error closing websocket", error
|
|
349
|
+
} catch (error) {
|
|
350
|
+
logger().error({ msg: "error closing websocket", error });
|
|
349
351
|
} finally {
|
|
350
352
|
this.#readyState = 3;
|
|
351
353
|
this.#clientWs.triggerClose(code, reason);
|
|
@@ -354,6 +356,9 @@ var InlineWebSocketAdapter = class {
|
|
|
354
356
|
}
|
|
355
357
|
};
|
|
356
358
|
|
|
359
|
+
// src/registry/index.ts
|
|
360
|
+
import { Hono } from "hono";
|
|
361
|
+
|
|
357
362
|
// src/common/engine.ts
|
|
358
363
|
var ENGINE_PORT = 6420;
|
|
359
364
|
var ENGINE_ENDPOINT = `http://127.0.0.1:${ENGINE_PORT}`;
|
|
@@ -371,10 +376,13 @@ function sleep(ms) {
|
|
|
371
376
|
}
|
|
372
377
|
function configureTimeoutMs() {
|
|
373
378
|
const value = process.env.RIVET_SERVERLESS_CONFIGURE_TIMEOUT_MS;
|
|
374
|
-
if (value === void 0 || value === "")
|
|
379
|
+
if (value === void 0 || value === "")
|
|
380
|
+
return DEFAULT_CONFIGURE_TIMEOUT_MS;
|
|
375
381
|
const parsed = Number(value);
|
|
376
382
|
if (!Number.isFinite(parsed) || parsed < 0) {
|
|
377
|
-
throw new Error(
|
|
383
|
+
throw new Error(
|
|
384
|
+
"RIVET_SERVERLESS_CONFIGURE_TIMEOUT_MS must be a finite non-negative number"
|
|
385
|
+
);
|
|
378
386
|
}
|
|
379
387
|
return parsed;
|
|
380
388
|
}
|
|
@@ -388,13 +396,19 @@ async function configureServerlessPool(config) {
|
|
|
388
396
|
attempts += 1;
|
|
389
397
|
try {
|
|
390
398
|
if (!config.namespace) {
|
|
391
|
-
throw new Error(
|
|
399
|
+
throw new Error(
|
|
400
|
+
"namespace is required for serverless configuration"
|
|
401
|
+
);
|
|
392
402
|
}
|
|
393
403
|
if (!config.endpoint) {
|
|
394
|
-
throw new Error(
|
|
404
|
+
throw new Error(
|
|
405
|
+
"endpoint is required for serverless configuration"
|
|
406
|
+
);
|
|
395
407
|
}
|
|
396
408
|
if (!config.configurePool) {
|
|
397
|
-
throw new Error(
|
|
409
|
+
throw new Error(
|
|
410
|
+
"configurePool is required for serverless configuration"
|
|
411
|
+
);
|
|
398
412
|
}
|
|
399
413
|
const customConfig = config.configurePool;
|
|
400
414
|
const clientConfig = convertRegistryConfigToClientConfig(config);
|
|
@@ -450,6 +464,145 @@ async function configureServerlessPool(config) {
|
|
|
450
464
|
throw lastError;
|
|
451
465
|
}
|
|
452
466
|
|
|
467
|
+
// src/utils/serve.ts
|
|
468
|
+
import getPort from "get-port";
|
|
469
|
+
var serveStaticLoaderPromises = {};
|
|
470
|
+
async function crossPlatformServe(config, httpPort, app, runtime = detectRuntime()) {
|
|
471
|
+
logger2().debug({ msg: "detected runtime for serve", runtime });
|
|
472
|
+
switch (runtime) {
|
|
473
|
+
case "deno":
|
|
474
|
+
return serveDeno(config, httpPort, app);
|
|
475
|
+
case "bun":
|
|
476
|
+
return serveBun(config, httpPort, app);
|
|
477
|
+
case "node":
|
|
478
|
+
return serveNode(config, httpPort, app);
|
|
479
|
+
default:
|
|
480
|
+
return serveNode(config, httpPort, app);
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
async function loadRuntimeServeStatic(runtime) {
|
|
484
|
+
if (!serveStaticLoaderPromises[runtime]) {
|
|
485
|
+
if (runtime === "node") {
|
|
486
|
+
const nodeServeStaticModule = "@hono/node-server/serve-static";
|
|
487
|
+
serveStaticLoaderPromises[runtime] = import(
|
|
488
|
+
/* webpackIgnore: true */
|
|
489
|
+
nodeServeStaticModule
|
|
490
|
+
).then((x) => x.serveStatic);
|
|
491
|
+
} else if (runtime === "bun") {
|
|
492
|
+
const bunModule = "hono/bun";
|
|
493
|
+
serveStaticLoaderPromises[runtime] = import(
|
|
494
|
+
/* webpackIgnore: true */
|
|
495
|
+
bunModule
|
|
496
|
+
).then((x) => x.serveStatic);
|
|
497
|
+
} else if (runtime === "deno") {
|
|
498
|
+
const denoModule = "hono/deno";
|
|
499
|
+
serveStaticLoaderPromises[runtime] = import(
|
|
500
|
+
/* webpackIgnore: true */
|
|
501
|
+
denoModule
|
|
502
|
+
).then((x) => x.serveStatic);
|
|
503
|
+
} else {
|
|
504
|
+
throw new Error(`unsupported runtime: ${runtime}`);
|
|
505
|
+
}
|
|
506
|
+
}
|
|
507
|
+
return await serveStaticLoaderPromises[runtime];
|
|
508
|
+
}
|
|
509
|
+
async function serveNode(config, httpPort, app) {
|
|
510
|
+
const nodeServerModule = "@hono/node-server";
|
|
511
|
+
let serve;
|
|
512
|
+
try {
|
|
513
|
+
const dep = await import(
|
|
514
|
+
/* webpackIgnore: true */
|
|
515
|
+
nodeServerModule
|
|
516
|
+
);
|
|
517
|
+
serve = dep.serve;
|
|
518
|
+
} catch (err) {
|
|
519
|
+
logger2().error({
|
|
520
|
+
msg: "failed to import @hono/node-server. please run 'npm install @hono/node-server @hono/node-ws'",
|
|
521
|
+
error: stringifyError(err)
|
|
522
|
+
});
|
|
523
|
+
process.exit(1);
|
|
524
|
+
}
|
|
525
|
+
const nodeWsModule = "@hono/node-ws";
|
|
526
|
+
let createNodeWebSocket;
|
|
527
|
+
try {
|
|
528
|
+
const dep = await import(
|
|
529
|
+
/* webpackIgnore: true */
|
|
530
|
+
nodeWsModule
|
|
531
|
+
);
|
|
532
|
+
createNodeWebSocket = dep.createNodeWebSocket;
|
|
533
|
+
} catch (err) {
|
|
534
|
+
logger2().error({
|
|
535
|
+
msg: "failed to import @hono/node-ws. please run 'npm install @hono/node-server @hono/node-ws'",
|
|
536
|
+
error: stringifyError(err)
|
|
537
|
+
});
|
|
538
|
+
process.exit(1);
|
|
539
|
+
}
|
|
540
|
+
const { injectWebSocket, upgradeWebSocket } = createNodeWebSocket({
|
|
541
|
+
app
|
|
542
|
+
});
|
|
543
|
+
const port = httpPort;
|
|
544
|
+
const hostname = config.httpHost;
|
|
545
|
+
const server = serve(
|
|
546
|
+
{ fetch: app.fetch, port, hostname },
|
|
547
|
+
() => logger2().info({ msg: "server listening", port, hostname })
|
|
548
|
+
);
|
|
549
|
+
injectWebSocket(server);
|
|
550
|
+
const closeServer = () => {
|
|
551
|
+
server.close();
|
|
552
|
+
};
|
|
553
|
+
return { upgradeWebSocket, closeServer };
|
|
554
|
+
}
|
|
555
|
+
async function serveDeno(config, httpPort, app) {
|
|
556
|
+
const honoDenoModule = "hono/deno";
|
|
557
|
+
let upgradeWebSocket;
|
|
558
|
+
try {
|
|
559
|
+
const dep = await import(
|
|
560
|
+
/* webpackIgnore: true */
|
|
561
|
+
honoDenoModule
|
|
562
|
+
);
|
|
563
|
+
upgradeWebSocket = dep.upgradeWebSocket;
|
|
564
|
+
} catch (err) {
|
|
565
|
+
logger2().error({
|
|
566
|
+
msg: "failed to import hono/deno",
|
|
567
|
+
error: stringifyError(err)
|
|
568
|
+
});
|
|
569
|
+
process.exit(1);
|
|
570
|
+
}
|
|
571
|
+
const port = httpPort;
|
|
572
|
+
const hostname = config.httpHost;
|
|
573
|
+
Deno.serve({ port, hostname }, app.fetch);
|
|
574
|
+
logger2().info({ msg: "server listening", port, hostname });
|
|
575
|
+
return { upgradeWebSocket };
|
|
576
|
+
}
|
|
577
|
+
async function serveBun(config, httpPort, app) {
|
|
578
|
+
const honoBunModule = "hono/bun";
|
|
579
|
+
let createBunWebSocket;
|
|
580
|
+
try {
|
|
581
|
+
const dep = await import(
|
|
582
|
+
/* webpackIgnore: true */
|
|
583
|
+
honoBunModule
|
|
584
|
+
);
|
|
585
|
+
createBunWebSocket = dep.createBunWebSocket;
|
|
586
|
+
} catch (err) {
|
|
587
|
+
logger2().error({
|
|
588
|
+
msg: "failed to import hono/bun",
|
|
589
|
+
error: stringifyError(err)
|
|
590
|
+
});
|
|
591
|
+
process.exit(1);
|
|
592
|
+
}
|
|
593
|
+
const { websocket, upgradeWebSocket } = createBunWebSocket();
|
|
594
|
+
const port = httpPort;
|
|
595
|
+
const hostname = config.httpHost;
|
|
596
|
+
Bun.serve({
|
|
597
|
+
fetch: app.fetch,
|
|
598
|
+
port,
|
|
599
|
+
hostname,
|
|
600
|
+
websocket
|
|
601
|
+
});
|
|
602
|
+
logger2().info({ msg: "server listening", port, hostname });
|
|
603
|
+
return { upgradeWebSocket };
|
|
604
|
+
}
|
|
605
|
+
|
|
453
606
|
// src/registry/config/index.ts
|
|
454
607
|
import { z as z3 } from "zod";
|
|
455
608
|
|
|
@@ -700,12 +853,12 @@ var RegistryConfigSchema = z3.object({
|
|
|
700
853
|
shutdown: z3.object({
|
|
701
854
|
/**
|
|
702
855
|
* Wait this many milliseconds for the serve promise to resolve
|
|
703
|
-
* after calling `CoreRegistry::shutdown()`. Defaults to
|
|
704
|
-
*
|
|
856
|
+
* after calling `CoreRegistry::shutdown()`. Defaults to 30s,
|
|
857
|
+
* matching Kubernetes `terminationGracePeriodSeconds`.
|
|
705
858
|
*
|
|
706
|
-
* Must be
|
|
859
|
+
* Must be long enough for rivetkit-core to drain the envoy.
|
|
707
860
|
*/
|
|
708
|
-
gracePeriodMs: z3.number().int().min(1e3).optional(),
|
|
861
|
+
gracePeriodMs: z3.number().int().min(1e3).optional().default(3e4),
|
|
709
862
|
/**
|
|
710
863
|
* If true, rivetkit will not install SIGINT/SIGTERM handlers.
|
|
711
864
|
* Use when the host application owns signal policy and will
|
|
@@ -713,6 +866,7 @@ var RegistryConfigSchema = z3.object({
|
|
|
713
866
|
*/
|
|
714
867
|
disableSignalHandlers: z3.boolean().optional().default(false)
|
|
715
868
|
}).optional().default(() => ({
|
|
869
|
+
gracePeriodMs: 3e4,
|
|
716
870
|
disableSignalHandlers: false
|
|
717
871
|
}))
|
|
718
872
|
}).transform((config, ctx) => {
|
|
@@ -1535,8 +1689,12 @@ var NapiCoreRuntime = class {
|
|
|
1535
1689
|
)
|
|
1536
1690
|
);
|
|
1537
1691
|
}
|
|
1538
|
-
async actorQueueWaitForNamesAvailable(ctx, names, options) {
|
|
1539
|
-
await asNativeActorContext(ctx).queue().waitForNamesAvailable(
|
|
1692
|
+
async actorQueueWaitForNamesAvailable(ctx, names, options, signal) {
|
|
1693
|
+
await asNativeActorContext(ctx).queue().waitForNamesAvailable(
|
|
1694
|
+
names,
|
|
1695
|
+
options,
|
|
1696
|
+
signal ? asNativeCancellationToken(signal) : signal
|
|
1697
|
+
);
|
|
1540
1698
|
}
|
|
1541
1699
|
async actorQueueEnqueueAndWait(ctx, name, body, options, signal) {
|
|
1542
1700
|
return await asNativeActorContext(ctx).queue().enqueueAndWait(
|
|
@@ -1670,20 +1828,18 @@ function validateQueueComplete(schemas, name, response) {
|
|
|
1670
1828
|
response
|
|
1671
1829
|
);
|
|
1672
1830
|
if (!result.success) {
|
|
1673
|
-
throw validationError(
|
|
1831
|
+
throw validationError(
|
|
1832
|
+
`queue \`${name}\` completion response`,
|
|
1833
|
+
result.issues
|
|
1834
|
+
);
|
|
1674
1835
|
}
|
|
1675
1836
|
return result.data;
|
|
1676
1837
|
}
|
|
1677
1838
|
function validationError(target, issues) {
|
|
1678
|
-
return new RivetError(
|
|
1679
|
-
|
|
1680
|
-
|
|
1681
|
-
|
|
1682
|
-
{
|
|
1683
|
-
public: true,
|
|
1684
|
-
metadata: { issues }
|
|
1685
|
-
}
|
|
1686
|
-
);
|
|
1839
|
+
return new RivetError("actor", "validation_error", `Invalid ${target}`, {
|
|
1840
|
+
public: true,
|
|
1841
|
+
metadata: { issues }
|
|
1842
|
+
});
|
|
1687
1843
|
}
|
|
1688
1844
|
|
|
1689
1845
|
// src/registry/wasm-runtime.ts
|
|
@@ -2154,9 +2310,9 @@ var WasmCoreRuntime = class {
|
|
|
2154
2310
|
)
|
|
2155
2311
|
);
|
|
2156
2312
|
}
|
|
2157
|
-
async actorQueueWaitForNamesAvailable(ctx, names, options) {
|
|
2313
|
+
async actorQueueWaitForNamesAvailable(ctx, names, options, signal) {
|
|
2158
2314
|
const queue2 = childHandle(asWasmActorContext(ctx), "queue");
|
|
2159
|
-
await callHandleAsync(queue2, "waitForNamesAvailable", names, options);
|
|
2315
|
+
await callHandleAsync(queue2, "waitForNamesAvailable", names, options, signal);
|
|
2160
2316
|
}
|
|
2161
2317
|
async actorQueueEnqueueAndWait(ctx, name, body, options, signal) {
|
|
2162
2318
|
const queue2 = childHandle(asWasmActorContext(ctx), "queue");
|
|
@@ -2248,6 +2404,29 @@ async function loadWasmRuntime(config) {
|
|
|
2248
2404
|
};
|
|
2249
2405
|
}
|
|
2250
2406
|
|
|
2407
|
+
// src/registry/write-through-proxy.ts
|
|
2408
|
+
import onChange from "@rivetkit/on-change";
|
|
2409
|
+
function createWriteThroughProxy(value, commit, beforeChange) {
|
|
2410
|
+
if (!value || typeof value !== "object") {
|
|
2411
|
+
return value;
|
|
2412
|
+
}
|
|
2413
|
+
return onChange(
|
|
2414
|
+
value,
|
|
2415
|
+
() => {
|
|
2416
|
+
commit(value);
|
|
2417
|
+
},
|
|
2418
|
+
{
|
|
2419
|
+
// Rejection is throw-based: beforeChange throws to prevent the
|
|
2420
|
+
// mutation. We always return true so on-change applies the change
|
|
2421
|
+
// if beforeChange did not throw.
|
|
2422
|
+
onValidate(_path, newValue) {
|
|
2423
|
+
beforeChange == null ? void 0 : beforeChange(newValue);
|
|
2424
|
+
return true;
|
|
2425
|
+
}
|
|
2426
|
+
}
|
|
2427
|
+
);
|
|
2428
|
+
}
|
|
2429
|
+
|
|
2251
2430
|
// src/registry/native.ts
|
|
2252
2431
|
var textEncoder = new TextEncoder();
|
|
2253
2432
|
var textDecoder = new TextDecoder();
|
|
@@ -2401,6 +2580,14 @@ function databaseNotConfiguredError() {
|
|
|
2401
2580
|
{ public: true }
|
|
2402
2581
|
);
|
|
2403
2582
|
}
|
|
2583
|
+
function databaseClientNotReadyError() {
|
|
2584
|
+
return new RivetError(
|
|
2585
|
+
"actor",
|
|
2586
|
+
"database_client_not_ready",
|
|
2587
|
+
"actor database client was not initialized before user code ran. this is an internal lifecycle error; the migration callback should have pre-warmed the client. file an issue if you can reproduce.",
|
|
2588
|
+
{ public: true }
|
|
2589
|
+
);
|
|
2590
|
+
}
|
|
2404
2591
|
function stateNotEnabledError() {
|
|
2405
2592
|
return new RivetError(
|
|
2406
2593
|
"actor",
|
|
@@ -2558,7 +2745,7 @@ function decodeValue(value) {
|
|
|
2558
2745
|
if (!value || value.length === 0) {
|
|
2559
2746
|
return void 0;
|
|
2560
2747
|
}
|
|
2561
|
-
return
|
|
2748
|
+
return decodeCborCompat(value);
|
|
2562
2749
|
}
|
|
2563
2750
|
function encodeValue(value) {
|
|
2564
2751
|
return encodeCborCompat(value);
|
|
@@ -2618,12 +2805,6 @@ function callNativeSync(invoke) {
|
|
|
2618
2805
|
throw normalizeNativeBridgeError(error);
|
|
2619
2806
|
}
|
|
2620
2807
|
}
|
|
2621
|
-
function actorAbortedError() {
|
|
2622
|
-
return Object.assign(new Error("Actor aborted"), {
|
|
2623
|
-
group: "actor",
|
|
2624
|
-
code: "aborted"
|
|
2625
|
-
});
|
|
2626
|
-
}
|
|
2627
2808
|
function isClosedTaskRegistrationError(error) {
|
|
2628
2809
|
const metadata = error instanceof RivetError ? error.metadata : void 0;
|
|
2629
2810
|
const metadataError = metadata && typeof metadata === "object" && "error" in metadata ? metadata.error : void 0;
|
|
@@ -2756,7 +2937,7 @@ function serializeWorkflowHistoryForJson(data) {
|
|
|
2756
2937
|
return null;
|
|
2757
2938
|
}
|
|
2758
2939
|
const history = decodeWorkflowHistoryTransport(data);
|
|
2759
|
-
return {
|
|
2940
|
+
return jsonSafe({
|
|
2760
2941
|
nameRegistry: [...history.nameRegistry],
|
|
2761
2942
|
entries: history.entries.map((entry) => ({
|
|
2762
2943
|
id: entry.id,
|
|
@@ -2780,7 +2961,7 @@ function serializeWorkflowHistoryForJson(data) {
|
|
|
2780
2961
|
]
|
|
2781
2962
|
)
|
|
2782
2963
|
)
|
|
2783
|
-
};
|
|
2964
|
+
});
|
|
2784
2965
|
}
|
|
2785
2966
|
function toHttpJsonCompatible(value) {
|
|
2786
2967
|
return JSON.parse(
|
|
@@ -2833,44 +3014,6 @@ function decodeArgs(value) {
|
|
|
2833
3014
|
const decoded = decodeValue(value);
|
|
2834
3015
|
return Array.isArray(decoded) ? decoded : decoded === void 0 ? [] : [decoded];
|
|
2835
3016
|
}
|
|
2836
|
-
function createWriteThroughProxy(value, commit, beforeChange) {
|
|
2837
|
-
if (!value || typeof value !== "object") {
|
|
2838
|
-
return value;
|
|
2839
|
-
}
|
|
2840
|
-
const proxies = /* @__PURE__ */ new WeakMap();
|
|
2841
|
-
const wrap = (target) => {
|
|
2842
|
-
const cached = proxies.get(target);
|
|
2843
|
-
if (cached) {
|
|
2844
|
-
return cached;
|
|
2845
|
-
}
|
|
2846
|
-
const proxy = new Proxy(target, {
|
|
2847
|
-
get(innerTarget, property, receiver) {
|
|
2848
|
-
const result = Reflect.get(innerTarget, property, receiver);
|
|
2849
|
-
return result && typeof result === "object" ? wrap(result) : result;
|
|
2850
|
-
},
|
|
2851
|
-
set(innerTarget, property, nextValue, receiver) {
|
|
2852
|
-
beforeChange == null ? void 0 : beforeChange();
|
|
2853
|
-
const updated = Reflect.set(
|
|
2854
|
-
innerTarget,
|
|
2855
|
-
property,
|
|
2856
|
-
nextValue,
|
|
2857
|
-
receiver
|
|
2858
|
-
);
|
|
2859
|
-
commit(value);
|
|
2860
|
-
return updated;
|
|
2861
|
-
},
|
|
2862
|
-
deleteProperty(innerTarget, property) {
|
|
2863
|
-
beforeChange == null ? void 0 : beforeChange();
|
|
2864
|
-
const updated = Reflect.deleteProperty(innerTarget, property);
|
|
2865
|
-
commit(value);
|
|
2866
|
-
return updated;
|
|
2867
|
-
}
|
|
2868
|
-
});
|
|
2869
|
-
proxies.set(target, proxy);
|
|
2870
|
-
return proxy;
|
|
2871
|
-
};
|
|
2872
|
-
return wrap(value);
|
|
2873
|
-
}
|
|
2874
3017
|
function buildRequest(init) {
|
|
2875
3018
|
const url = init.uri.startsWith("http") ? init.uri : new URL(init.uri, "http://127.0.0.1").toString();
|
|
2876
3019
|
const body = init.body && init.body.length > 0 ? runtimeBytesToArrayBuffer(init.body) : void 0;
|
|
@@ -2923,13 +3066,23 @@ var NativeConnAdapter = class {
|
|
|
2923
3066
|
decodeValue(this.#runtime.connParams(this.#conn))
|
|
2924
3067
|
);
|
|
2925
3068
|
}
|
|
3069
|
+
[RAW_STATE_SYMBOL]() {
|
|
3070
|
+
return this.#readState();
|
|
3071
|
+
}
|
|
2926
3072
|
get state() {
|
|
2927
3073
|
const nextState = this.#readState();
|
|
2928
|
-
return createWriteThroughProxy(
|
|
2929
|
-
|
|
2930
|
-
|
|
3074
|
+
return createWriteThroughProxy(
|
|
3075
|
+
nextState,
|
|
3076
|
+
(nextValue) => {
|
|
3077
|
+
this.#writeState(nextValue, { writeNative: true });
|
|
3078
|
+
},
|
|
3079
|
+
(newValue) => {
|
|
3080
|
+
assertJsonCompatValue(newValue);
|
|
3081
|
+
}
|
|
3082
|
+
);
|
|
2931
3083
|
}
|
|
2932
3084
|
set state(value) {
|
|
3085
|
+
assertJsonCompatValue(value);
|
|
2933
3086
|
this.#writeState(value, { writeNative: true });
|
|
2934
3087
|
}
|
|
2935
3088
|
initializeState(value) {
|
|
@@ -3281,44 +3434,23 @@ var NativeQueueAdapter = class {
|
|
|
3281
3434
|
}
|
|
3282
3435
|
}
|
|
3283
3436
|
async waitForNamesAvailable(names, options) {
|
|
3284
|
-
|
|
3437
|
+
const { token, cleanup } = await createCancellationTokenHandle(
|
|
3438
|
+
this.#runtime,
|
|
3439
|
+
options == null ? void 0 : options.signal
|
|
3440
|
+
);
|
|
3441
|
+
try {
|
|
3285
3442
|
await callNative(
|
|
3286
3443
|
() => this.#runtime.actorQueueWaitForNamesAvailable(
|
|
3287
3444
|
this.#ctx,
|
|
3288
3445
|
[...names],
|
|
3289
3446
|
{
|
|
3290
3447
|
timeoutMs: options == null ? void 0 : options.timeout
|
|
3291
|
-
}
|
|
3448
|
+
},
|
|
3449
|
+
token
|
|
3292
3450
|
)
|
|
3293
3451
|
);
|
|
3294
|
-
|
|
3295
|
-
|
|
3296
|
-
const deadline = options.timeout === void 0 ? void 0 : Date.now() + options.timeout;
|
|
3297
|
-
for (; ; ) {
|
|
3298
|
-
if (options.signal.aborted) {
|
|
3299
|
-
throw actorAbortedError();
|
|
3300
|
-
}
|
|
3301
|
-
const remainingTimeout = deadline === void 0 ? void 0 : Math.max(0, deadline - Date.now());
|
|
3302
|
-
const sliceTimeout = remainingTimeout === void 0 ? 100 : Math.min(remainingTimeout, 100);
|
|
3303
|
-
try {
|
|
3304
|
-
await callNative(
|
|
3305
|
-
() => this.#runtime.actorQueueWaitForNamesAvailable(
|
|
3306
|
-
this.#ctx,
|
|
3307
|
-
[...names],
|
|
3308
|
-
{
|
|
3309
|
-
timeoutMs: sliceTimeout
|
|
3310
|
-
}
|
|
3311
|
-
)
|
|
3312
|
-
);
|
|
3313
|
-
return;
|
|
3314
|
-
} catch (error) {
|
|
3315
|
-
if (error.group === "queue" && error.code === "timed_out") {
|
|
3316
|
-
if (remainingTimeout === void 0 || remainingTimeout > 100) {
|
|
3317
|
-
continue;
|
|
3318
|
-
}
|
|
3319
|
-
}
|
|
3320
|
-
throw error;
|
|
3321
|
-
}
|
|
3452
|
+
} finally {
|
|
3453
|
+
cleanup == null ? void 0 : cleanup();
|
|
3322
3454
|
}
|
|
3323
3455
|
}
|
|
3324
3456
|
async enqueueAndWait(name, body, options) {
|
|
@@ -3753,6 +3885,68 @@ var TrackedWebSocketHandleAdapter = class {
|
|
|
3753
3885
|
return typeof value === "object" && value !== null && "then" in value && typeof value.then === "function";
|
|
3754
3886
|
}
|
|
3755
3887
|
};
|
|
3888
|
+
var NativeConnectionMap = class {
|
|
3889
|
+
#runtime;
|
|
3890
|
+
#ctx;
|
|
3891
|
+
#schemas;
|
|
3892
|
+
constructor(runtime, ctx, schemas) {
|
|
3893
|
+
this.#runtime = runtime;
|
|
3894
|
+
this.#ctx = ctx;
|
|
3895
|
+
this.#schemas = schemas;
|
|
3896
|
+
}
|
|
3897
|
+
#connToAdapter(conn) {
|
|
3898
|
+
return new NativeConnAdapter(
|
|
3899
|
+
this.#runtime,
|
|
3900
|
+
conn,
|
|
3901
|
+
this.#schemas,
|
|
3902
|
+
this.#ctx,
|
|
3903
|
+
(connId) => callNativeSync(
|
|
3904
|
+
() => this.#runtime.actorQueueHibernationRemoval(
|
|
3905
|
+
this.#ctx,
|
|
3906
|
+
connId
|
|
3907
|
+
)
|
|
3908
|
+
)
|
|
3909
|
+
);
|
|
3910
|
+
}
|
|
3911
|
+
get size() {
|
|
3912
|
+
return callNativeSync(() => this.#runtime.actorConns(this.#ctx)).length;
|
|
3913
|
+
}
|
|
3914
|
+
get(key) {
|
|
3915
|
+
const conns = callNativeSync(() => this.#runtime.actorConns(this.#ctx));
|
|
3916
|
+
const conn = conns.find((c) => this.#runtime.connId(c) === key);
|
|
3917
|
+
if (!conn) return void 0;
|
|
3918
|
+
return this.#connToAdapter(conn);
|
|
3919
|
+
}
|
|
3920
|
+
has(key) {
|
|
3921
|
+
const conns = callNativeSync(() => this.#runtime.actorConns(this.#ctx));
|
|
3922
|
+
return conns.some((c) => this.#runtime.connId(c) === key);
|
|
3923
|
+
}
|
|
3924
|
+
keys() {
|
|
3925
|
+
const conns = callNativeSync(() => this.#runtime.actorConns(this.#ctx));
|
|
3926
|
+
return conns.map((c) => this.#runtime.connId(c))[Symbol.iterator]();
|
|
3927
|
+
}
|
|
3928
|
+
values() {
|
|
3929
|
+
const conns = callNativeSync(() => this.#runtime.actorConns(this.#ctx));
|
|
3930
|
+
return conns.map((c) => this.#connToAdapter(c))[Symbol.iterator]();
|
|
3931
|
+
}
|
|
3932
|
+
entries() {
|
|
3933
|
+
const conns = callNativeSync(() => this.#runtime.actorConns(this.#ctx));
|
|
3934
|
+
return conns.map(
|
|
3935
|
+
(c) => [this.#runtime.connId(c), this.#connToAdapter(c)]
|
|
3936
|
+
)[Symbol.iterator]();
|
|
3937
|
+
}
|
|
3938
|
+
forEach(callback, thisArg) {
|
|
3939
|
+
const conns = callNativeSync(() => this.#runtime.actorConns(this.#ctx));
|
|
3940
|
+
for (const conn of conns) {
|
|
3941
|
+
const id = this.#runtime.connId(conn);
|
|
3942
|
+
callback.call(thisArg, this.#connToAdapter(conn), id, this);
|
|
3943
|
+
}
|
|
3944
|
+
}
|
|
3945
|
+
[Symbol.iterator]() {
|
|
3946
|
+
return this.entries();
|
|
3947
|
+
}
|
|
3948
|
+
[Symbol.toStringTag] = "NativeConnectionMap";
|
|
3949
|
+
};
|
|
3756
3950
|
var ActorContextHandleAdapter = class {
|
|
3757
3951
|
#runtime;
|
|
3758
3952
|
#ctx;
|
|
@@ -3761,9 +3955,9 @@ var ActorContextHandleAdapter = class {
|
|
|
3761
3955
|
#abortSignalCleanup;
|
|
3762
3956
|
#client;
|
|
3763
3957
|
#clientFactory;
|
|
3958
|
+
#connMap;
|
|
3764
3959
|
#databaseProvider;
|
|
3765
3960
|
#db;
|
|
3766
|
-
#dbProxy;
|
|
3767
3961
|
#dispatchCancelToken;
|
|
3768
3962
|
#kv;
|
|
3769
3963
|
#queue;
|
|
@@ -3806,30 +4000,22 @@ var ActorContextHandleAdapter = class {
|
|
|
3806
4000
|
if (!this.#databaseProvider) {
|
|
3807
4001
|
throw databaseNotConfiguredError();
|
|
3808
4002
|
}
|
|
3809
|
-
if (
|
|
3810
|
-
this.#
|
|
3811
|
-
|
|
3812
|
-
|
|
3813
|
-
|
|
3814
|
-
|
|
3815
|
-
|
|
3816
|
-
|
|
3817
|
-
|
|
3818
|
-
|
|
3819
|
-
|
|
3820
|
-
|
|
3821
|
-
|
|
3822
|
-
|
|
3823
|
-
if (typeof value !== "function") {
|
|
3824
|
-
return value;
|
|
3825
|
-
}
|
|
3826
|
-
return await value.apply(client, args);
|
|
3827
|
-
};
|
|
3828
|
-
}
|
|
3829
|
-
}
|
|
3830
|
-
);
|
|
4003
|
+
if (this.#db) {
|
|
4004
|
+
return this.#db;
|
|
4005
|
+
}
|
|
4006
|
+
const runtimeState = getNativeRuntimeState(this.#runtime, this.#ctx);
|
|
4007
|
+
const cachedClient = runtimeState.databaseClient;
|
|
4008
|
+
if (cachedClient) {
|
|
4009
|
+
this.#db = cachedClient.client;
|
|
4010
|
+
return this.#db;
|
|
4011
|
+
}
|
|
4012
|
+
throw databaseClientNotReadyError();
|
|
4013
|
+
}
|
|
4014
|
+
[RAW_STATE_SYMBOL]() {
|
|
4015
|
+
if (!this.#stateEnabled) {
|
|
4016
|
+
throw stateNotEnabledError();
|
|
3831
4017
|
}
|
|
3832
|
-
return this.#
|
|
4018
|
+
return this.#readState();
|
|
3833
4019
|
}
|
|
3834
4020
|
get state() {
|
|
3835
4021
|
if (!this.#stateEnabled) {
|
|
@@ -3844,8 +4030,9 @@ var ActorContextHandleAdapter = class {
|
|
|
3844
4030
|
(nextValue) => {
|
|
3845
4031
|
this.#writeState(nextValue, { scheduleSave: true });
|
|
3846
4032
|
},
|
|
3847
|
-
() => {
|
|
4033
|
+
(newValue) => {
|
|
3848
4034
|
this.#assertCanMutateState();
|
|
4035
|
+
assertJsonCompatValue(newValue);
|
|
3849
4036
|
}
|
|
3850
4037
|
);
|
|
3851
4038
|
}
|
|
@@ -3856,6 +4043,7 @@ var ActorContextHandleAdapter = class {
|
|
|
3856
4043
|
throw stateNotEnabledError();
|
|
3857
4044
|
}
|
|
3858
4045
|
this.#assertCanMutateState();
|
|
4046
|
+
assertJsonCompatValue(value);
|
|
3859
4047
|
this.#writeState(value, { scheduleSave: true });
|
|
3860
4048
|
}
|
|
3861
4049
|
initializeState(value) {
|
|
@@ -3912,25 +4100,14 @@ var ActorContextHandleAdapter = class {
|
|
|
3912
4100
|
return callNativeSync(() => this.#runtime.actorRegion(this.#ctx));
|
|
3913
4101
|
}
|
|
3914
4102
|
get conns() {
|
|
3915
|
-
|
|
3916
|
-
|
|
3917
|
-
|
|
3918
|
-
|
|
3919
|
-
|
|
3920
|
-
|
|
3921
|
-
|
|
3922
|
-
|
|
3923
|
-
this.#ctx,
|
|
3924
|
-
(connId) => callNativeSync(
|
|
3925
|
-
() => this.#runtime.actorQueueHibernationRemoval(
|
|
3926
|
-
this.#ctx,
|
|
3927
|
-
connId
|
|
3928
|
-
)
|
|
3929
|
-
)
|
|
3930
|
-
)
|
|
3931
|
-
]
|
|
3932
|
-
)
|
|
3933
|
-
);
|
|
4103
|
+
if (!this.#connMap) {
|
|
4104
|
+
this.#connMap = new NativeConnectionMap(
|
|
4105
|
+
this.#runtime,
|
|
4106
|
+
this.#ctx,
|
|
4107
|
+
this.#schemas
|
|
4108
|
+
);
|
|
4109
|
+
}
|
|
4110
|
+
return this.#connMap;
|
|
3934
4111
|
}
|
|
3935
4112
|
get log() {
|
|
3936
4113
|
return logger2();
|
|
@@ -4687,6 +4864,10 @@ function buildNativeFactory(runtime, registryConfig, definition) {
|
|
|
4687
4864
|
isWorkflowEnabled: getNativeWorkflowInspector(ctx) !== void 0
|
|
4688
4865
|
});
|
|
4689
4866
|
} catch (error) {
|
|
4867
|
+
logger2().error({
|
|
4868
|
+
msg: "error replaying workflow history",
|
|
4869
|
+
error
|
|
4870
|
+
});
|
|
4690
4871
|
return errorResponse(error);
|
|
4691
4872
|
}
|
|
4692
4873
|
}
|
|
@@ -4838,6 +5019,10 @@ function buildNativeFactory(runtime, registryConfig, definition) {
|
|
|
4838
5019
|
);
|
|
4839
5020
|
return jsonResponse({ output });
|
|
4840
5021
|
} catch (error) {
|
|
5022
|
+
logger2().error({
|
|
5023
|
+
msg: "Error handling inspector action request",
|
|
5024
|
+
error
|
|
5025
|
+
});
|
|
4841
5026
|
return errorResponse(error);
|
|
4842
5027
|
}
|
|
4843
5028
|
}
|
|
@@ -4851,6 +5036,10 @@ function buildNativeFactory(runtime, registryConfig, definition) {
|
|
|
4851
5036
|
{ status: 404 }
|
|
4852
5037
|
);
|
|
4853
5038
|
} catch (error) {
|
|
5039
|
+
logger2().error({
|
|
5040
|
+
msg: "Error handling inspector request",
|
|
5041
|
+
error
|
|
5042
|
+
});
|
|
4854
5043
|
return errorResponse(error);
|
|
4855
5044
|
} finally {
|
|
4856
5045
|
await actorCtx.dispose();
|
|
@@ -5472,20 +5661,6 @@ async function buildConfiguredRegistry(config) {
|
|
|
5472
5661
|
}
|
|
5473
5662
|
|
|
5474
5663
|
// src/registry/index.ts
|
|
5475
|
-
function signalExitCode(signal) {
|
|
5476
|
-
switch (signal) {
|
|
5477
|
-
case "SIGINT":
|
|
5478
|
-
return 130;
|
|
5479
|
-
case "SIGTERM":
|
|
5480
|
-
return 143;
|
|
5481
|
-
}
|
|
5482
|
-
}
|
|
5483
|
-
function finishShutdownSignal(signal) {
|
|
5484
|
-
if (process.pid === 1) {
|
|
5485
|
-
process.exit(signalExitCode(signal));
|
|
5486
|
-
}
|
|
5487
|
-
process.kill(process.pid, signal);
|
|
5488
|
-
}
|
|
5489
5664
|
var Registry = class {
|
|
5490
5665
|
#config;
|
|
5491
5666
|
routes;
|
|
@@ -5514,12 +5689,12 @@ var Registry = class {
|
|
|
5514
5689
|
#ensureServerlessPoolConfigured(config) {
|
|
5515
5690
|
if (!config.configurePool) return void 0;
|
|
5516
5691
|
if (!this.#configureServerlessPoolPromise) {
|
|
5517
|
-
this.#configureServerlessPoolPromise = configureServerlessPool(
|
|
5518
|
-
|
|
5519
|
-
|
|
5520
|
-
|
|
5521
|
-
|
|
5522
|
-
);
|
|
5692
|
+
this.#configureServerlessPoolPromise = configureServerlessPool(
|
|
5693
|
+
config
|
|
5694
|
+
).catch((error) => {
|
|
5695
|
+
this.#configureServerlessPoolPromise = void 0;
|
|
5696
|
+
throw error;
|
|
5697
|
+
});
|
|
5523
5698
|
this.#configureServerlessPoolPromise.catch(() => {
|
|
5524
5699
|
});
|
|
5525
5700
|
}
|
|
@@ -5555,7 +5730,7 @@ var Registry = class {
|
|
|
5555
5730
|
if (isStartRequest) {
|
|
5556
5731
|
try {
|
|
5557
5732
|
await this.#ensureServerlessPoolConfigured(config);
|
|
5558
|
-
} catch (
|
|
5733
|
+
} catch (_error) {
|
|
5559
5734
|
return new Response(
|
|
5560
5735
|
JSON.stringify({
|
|
5561
5736
|
group: "guard",
|
|
@@ -5669,7 +5844,7 @@ var Registry = class {
|
|
|
5669
5844
|
if (isMetadataRequest && !isEngineMetadataRequest) {
|
|
5670
5845
|
try {
|
|
5671
5846
|
await this.#ensureServerlessPoolConfigured(config);
|
|
5672
|
-
} catch (
|
|
5847
|
+
} catch (_error) {
|
|
5673
5848
|
return new Response(
|
|
5674
5849
|
JSON.stringify({
|
|
5675
5850
|
group: "guard",
|
|
@@ -5702,6 +5877,33 @@ var Registry = class {
|
|
|
5702
5877
|
fetch: (request) => this.handler(request)
|
|
5703
5878
|
};
|
|
5704
5879
|
}
|
|
5880
|
+
/**
|
|
5881
|
+
* Starts an HTTP server that dispatches every request through the
|
|
5882
|
+
* serverless handler. Uses `crossPlatformServe` to pick the right
|
|
5883
|
+
* runtime (Node, Bun, Deno).
|
|
5884
|
+
*
|
|
5885
|
+
* @param opts.port Port to listen on. Defaults to 3000.
|
|
5886
|
+
* @param opts.publicDir If set, serves static files from this directory
|
|
5887
|
+
* before falling through to the registry handler.
|
|
5888
|
+
*
|
|
5889
|
+
* @example
|
|
5890
|
+
* ```ts
|
|
5891
|
+
* await registry.listen();
|
|
5892
|
+
* await registry.listen({ port: 8080, publicDir: "./public" });
|
|
5893
|
+
* ```
|
|
5894
|
+
*/
|
|
5895
|
+
async listen(opts = {}) {
|
|
5896
|
+
const port = opts.port ?? 3e3;
|
|
5897
|
+
const config = this.parseConfig();
|
|
5898
|
+
const runtime = detectRuntime();
|
|
5899
|
+
const app = new Hono();
|
|
5900
|
+
if (opts.publicDir) {
|
|
5901
|
+
const serveStatic = await loadRuntimeServeStatic(runtime);
|
|
5902
|
+
app.use("*", serveStatic({ root: opts.publicDir }));
|
|
5903
|
+
}
|
|
5904
|
+
app.all("*", (c) => this.handler(c.req.raw));
|
|
5905
|
+
await crossPlatformServe(config, port, app, runtime);
|
|
5906
|
+
}
|
|
5705
5907
|
/**
|
|
5706
5908
|
* Returns a health response suitable for mounting in a user-owned router.
|
|
5707
5909
|
*/
|
|
@@ -5795,8 +5997,8 @@ var Registry = class {
|
|
|
5795
5997
|
this.#runtimeServeConfiguredPromise = configuredRegistryPromise;
|
|
5796
5998
|
this.#runtimeServePromise = configuredRegistryPromise.then(async ({ runtime, registry, serveConfig }) => {
|
|
5797
5999
|
await runtime.serveRegistry(registry, serveConfig);
|
|
5798
|
-
}).catch((
|
|
5799
|
-
logger2().warn({
|
|
6000
|
+
}).catch((error) => {
|
|
6001
|
+
logger2().warn({ error }, "runtime registry serve errored");
|
|
5800
6002
|
});
|
|
5801
6003
|
this.#installSignalHandlers(config, configuredRegistryPromise);
|
|
5802
6004
|
}
|
|
@@ -5827,29 +6029,29 @@ var Registry = class {
|
|
|
5827
6029
|
#onShutdownSignal(signal, config, configuredRegistryPromise) {
|
|
5828
6030
|
if (this.#shutdownInFlight !== null) {
|
|
5829
6031
|
this.#removeSignalHandlers();
|
|
5830
|
-
|
|
6032
|
+
process.kill(process.pid, signal);
|
|
5831
6033
|
return;
|
|
5832
6034
|
}
|
|
5833
6035
|
this.#shutdownInFlight = this.#runShutdown(
|
|
5834
6036
|
signal,
|
|
5835
6037
|
config,
|
|
5836
6038
|
configuredRegistryPromise
|
|
5837
|
-
).catch((
|
|
5838
|
-
logger2().warn({
|
|
6039
|
+
).catch((error) => {
|
|
6040
|
+
logger2().warn({ error }, "shutdown error");
|
|
5839
6041
|
});
|
|
5840
6042
|
}
|
|
5841
6043
|
async #runShutdown(signal, config, configuredRegistryPromise) {
|
|
5842
6044
|
var _a;
|
|
5843
|
-
const gracePeriodMs = ((_a = config.shutdown) == null ? void 0 : _a.gracePeriodMs) ??
|
|
6045
|
+
const gracePeriodMs = ((_a = config.shutdown) == null ? void 0 : _a.gracePeriodMs) ?? 3e4;
|
|
5844
6046
|
const drain = async () => {
|
|
5845
6047
|
const registries = [
|
|
5846
6048
|
(async () => {
|
|
5847
6049
|
try {
|
|
5848
6050
|
const { runtime, registry } = await configuredRegistryPromise;
|
|
5849
6051
|
await runtime.shutdownRegistry(registry);
|
|
5850
|
-
} catch (
|
|
6052
|
+
} catch (error) {
|
|
5851
6053
|
logger2().warn(
|
|
5852
|
-
{
|
|
6054
|
+
{ error },
|
|
5853
6055
|
"runtime registry shutdown errored (mode A)"
|
|
5854
6056
|
);
|
|
5855
6057
|
}
|
|
@@ -5864,7 +6066,7 @@ var Registry = class {
|
|
|
5864
6066
|
await runtime.shutdownRegistry(registry);
|
|
5865
6067
|
} catch (err) {
|
|
5866
6068
|
logger2().warn(
|
|
5867
|
-
{ err },
|
|
6069
|
+
{ error: err },
|
|
5868
6070
|
"runtime registry shutdown errored (mode B)"
|
|
5869
6071
|
);
|
|
5870
6072
|
}
|
|
@@ -5887,23 +6089,7 @@ var Registry = class {
|
|
|
5887
6089
|
)
|
|
5888
6090
|
]);
|
|
5889
6091
|
this.#removeSignalHandlers();
|
|
5890
|
-
|
|
5891
|
-
}
|
|
5892
|
-
async #actorStopThresholdMs(configuredRegistryPromise) {
|
|
5893
|
-
var _a;
|
|
5894
|
-
try {
|
|
5895
|
-
const { runtime, registry } = await configuredRegistryPromise;
|
|
5896
|
-
const thresholdMs = await ((_a = runtime.registryActorStopThresholdMs) == null ? void 0 : _a.call(runtime, registry));
|
|
5897
|
-
if (thresholdMs !== void 0 && Number.isFinite(thresholdMs) && thresholdMs > 0) {
|
|
5898
|
-
return thresholdMs;
|
|
5899
|
-
}
|
|
5900
|
-
} catch (err) {
|
|
5901
|
-
logger2().warn(
|
|
5902
|
-
{ err },
|
|
5903
|
-
"failed to read actor stop threshold for shutdown grace"
|
|
5904
|
-
);
|
|
5905
|
-
}
|
|
5906
|
-
return void 0;
|
|
6092
|
+
process.kill(process.pid, signal);
|
|
5907
6093
|
}
|
|
5908
6094
|
#removeSignalHandlers() {
|
|
5909
6095
|
for (const [signal, handler] of Object.entries(
|