rivetkit 2.3.12-rc.4 → 2.3.12
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 +17 -4
- package/dist/browser/client.js +32 -24
- package/dist/browser/client.js.map +1 -1
- package/dist/browser/inspector/client.js +2 -1
- 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 +3 -19
- package/dist/tsup/agent-os/index.cjs.map +1 -1
- package/dist/tsup/agent-os/index.d.cts +17 -4
- package/dist/tsup/agent-os/index.d.ts +17 -4
- package/dist/tsup/agent-os/index.js +3 -19
- package/dist/tsup/agent-os/index.js.map +1 -1
- package/dist/tsup/{chunk-SPJORZMM.cjs → chunk-2JSYYH6P.cjs} +1 -1
- package/dist/tsup/chunk-2JSYYH6P.cjs.map +1 -0
- package/dist/tsup/{chunk-IAH47VDZ.cjs → chunk-4KGXFC6M.cjs} +2 -19
- package/dist/tsup/chunk-4KGXFC6M.cjs.map +1 -0
- package/dist/tsup/{chunk-DLQSZ6Q7.js → chunk-6W5VGLFT.js} +2 -19
- package/dist/tsup/chunk-6W5VGLFT.js.map +1 -0
- package/dist/tsup/{chunk-JIOLC5I2.cjs → chunk-AN7WO7BM.cjs} +3 -3
- package/dist/tsup/{chunk-JIOLC5I2.cjs.map → chunk-AN7WO7BM.cjs.map} +1 -1
- package/dist/tsup/{chunk-AF2VKCFA.js → chunk-EBXARMGI.js} +2 -2
- package/dist/tsup/{chunk-4LRWLBTR.cjs → chunk-FGQABMXZ.cjs} +3 -3
- package/dist/tsup/{chunk-4LRWLBTR.cjs.map → chunk-FGQABMXZ.cjs.map} +1 -1
- package/dist/tsup/{chunk-BQ7YJ3PG.js → chunk-GEN4NHXM.js} +2 -2
- package/dist/tsup/{chunk-NVMHEG5J.js → chunk-JYTXOMM7.js} +2 -2
- package/dist/tsup/{chunk-NKLM6C5A.cjs → chunk-MEF7RVQ7.cjs} +10 -10
- package/dist/tsup/{chunk-NKLM6C5A.cjs.map → chunk-MEF7RVQ7.cjs.map} +1 -1
- package/dist/tsup/{chunk-64DT44V2.js → chunk-MF42PRF2.js} +9 -3
- package/dist/tsup/chunk-MF42PRF2.js.map +1 -0
- package/dist/tsup/{chunk-IXBD7BXC.js → chunk-OUQUIBVW.js} +1 -1
- package/dist/tsup/chunk-OUQUIBVW.js.map +1 -0
- package/dist/tsup/{chunk-S3GXVCIM.cjs → chunk-PW2VSGUR.cjs} +4 -4
- package/dist/tsup/{chunk-S3GXVCIM.cjs.map → chunk-PW2VSGUR.cjs.map} +1 -1
- package/dist/tsup/{chunk-GMBCKV6C.js → chunk-RBXJWAJB.js} +3 -3
- package/dist/tsup/{chunk-XDYECGCT.cjs → chunk-SSPTEGTX.cjs} +7 -7
- package/dist/tsup/{chunk-XDYECGCT.cjs.map → chunk-SSPTEGTX.cjs.map} +1 -1
- package/dist/tsup/{chunk-ARFTQ5HY.cjs → chunk-TAG6UEL5.cjs} +17 -11
- package/dist/tsup/chunk-TAG6UEL5.cjs.map +1 -0
- package/dist/tsup/{chunk-OCXHNHGQ.cjs → chunk-TXUHVBKH.cjs} +3 -3
- package/dist/tsup/{chunk-OCXHNHGQ.cjs.map → chunk-TXUHVBKH.cjs.map} +1 -1
- package/dist/tsup/{chunk-F7G5WHOD.cjs → chunk-TZPNSOG2.cjs} +203 -195
- package/dist/tsup/chunk-TZPNSOG2.cjs.map +1 -0
- package/dist/tsup/{chunk-O74736N5.js → chunk-VOYNLY57.js} +41 -33
- package/dist/tsup/chunk-VOYNLY57.js.map +1 -0
- package/dist/tsup/{chunk-3CBQIP37.js → chunk-XUODFCRJ.js} +4 -4
- package/dist/tsup/{chunk-P5JJG4KY.js → chunk-ZIPXAVKR.js} +2 -2
- package/dist/tsup/client/mod.cjs +6 -6
- package/dist/tsup/client/mod.d.cts +2 -2
- package/dist/tsup/client/mod.d.ts +2 -2
- package/dist/tsup/client/mod.js +5 -5
- 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-DzaddF-j.d.ts → config-BGTanB_3.d.ts} +19 -10
- package/dist/tsup/{config-VxDc6yMu.d.cts → config-NHz6oMb9.d.cts} +19 -10
- package/dist/tsup/{context-Cn8CIrOR.d.cts → context-DB8zG_Ib.d.cts} +1 -1
- package/dist/tsup/{context-B6HYokje.d.ts → context-SHomdVV8.d.ts} +1 -1
- package/dist/tsup/db/drizzle.cjs +3 -3
- package/dist/tsup/db/drizzle.js +2 -2
- package/dist/tsup/db/mod.cjs +4 -4
- package/dist/tsup/db/mod.js +3 -3
- package/dist/tsup/dynamic/mod.cjs +2 -2
- package/dist/tsup/dynamic/mod.d.cts +1 -1
- package/dist/tsup/dynamic/mod.d.ts +1 -1
- package/dist/tsup/dynamic/mod.js +1 -1
- package/dist/tsup/inspector/mod.cjs +6 -6
- package/dist/tsup/inspector/mod.js +5 -5
- package/dist/tsup/inspector/workflow.cjs +5 -5
- package/dist/tsup/inspector/workflow.js +4 -4
- package/dist/tsup/inspector-tab/mod.cjs +2 -2
- package/dist/tsup/inspector-tab/mod.d.cts +2 -2
- package/dist/tsup/inspector-tab/mod.d.ts +2 -2
- package/dist/tsup/inspector-tab/mod.js +1 -1
- package/dist/tsup/mod.cjs +444 -199
- package/dist/tsup/mod.cjs.map +1 -1
- package/dist/tsup/mod.d.cts +3 -3
- package/dist/tsup/mod.d.ts +3 -3
- package/dist/tsup/mod.js +323 -78
- package/dist/tsup/mod.js.map +1 -1
- package/dist/tsup/test/mod.cjs +7 -7
- package/dist/tsup/test/mod.d.cts +1 -1
- package/dist/tsup/test/mod.d.ts +1 -1
- package/dist/tsup/test/mod.js +5 -5
- package/dist/tsup/utils.cjs +3 -3
- package/dist/tsup/utils.js +2 -2
- package/dist/tsup/workflow/mod.cjs +14 -14
- package/dist/tsup/workflow/mod.d.cts +3 -3
- package/dist/tsup/workflow/mod.d.ts +3 -3
- package/dist/tsup/workflow/mod.js +6 -6
- package/package.json +9 -8
- package/src/actor/config.test.ts +0 -8
- package/src/actor/config.ts +1 -24
- package/src/actor/errors.ts +2 -1
- package/src/client/actor-handle.ts +10 -3
- package/src/client/raw-utils.ts +8 -0
- package/src/common/actor-router-consts.ts +2 -0
- package/src/engine-client/actor-http-client.ts +6 -22
- package/src/engine-client/mod.ts +1 -1
- package/src/registry/config/index.ts +27 -1
- package/src/registry/index.ts +48 -14
- package/src/registry/napi-runtime.ts +32 -5
- package/src/registry/native-http.ts +225 -0
- package/src/registry/native.ts +130 -65
- package/src/registry/runtime.ts +30 -3
- package/src/utils/env-vars.ts +4 -0
- package/dist/tsup/chunk-64DT44V2.js.map +0 -1
- package/dist/tsup/chunk-ARFTQ5HY.cjs.map +0 -1
- package/dist/tsup/chunk-DLQSZ6Q7.js.map +0 -1
- package/dist/tsup/chunk-F7G5WHOD.cjs.map +0 -1
- package/dist/tsup/chunk-IAH47VDZ.cjs.map +0 -1
- package/dist/tsup/chunk-IXBD7BXC.js.map +0 -1
- package/dist/tsup/chunk-O74736N5.js.map +0 -1
- package/dist/tsup/chunk-SPJORZMM.cjs.map +0 -1
- /package/dist/tsup/{chunk-AF2VKCFA.js.map → chunk-EBXARMGI.js.map} +0 -0
- /package/dist/tsup/{chunk-BQ7YJ3PG.js.map → chunk-GEN4NHXM.js.map} +0 -0
- /package/dist/tsup/{chunk-NVMHEG5J.js.map → chunk-JYTXOMM7.js.map} +0 -0
- /package/dist/tsup/{chunk-GMBCKV6C.js.map → chunk-RBXJWAJB.js.map} +0 -0
- /package/dist/tsup/{chunk-3CBQIP37.js.map → chunk-XUODFCRJ.js.map} +0 -0
- /package/dist/tsup/{chunk-P5JJG4KY.js.map → chunk-ZIPXAVKR.js.map} +0 -0
package/src/registry/native.ts
CHANGED
|
@@ -57,7 +57,7 @@ import {
|
|
|
57
57
|
} from "@/common/database/mod";
|
|
58
58
|
import { wrapJsNativeDatabase } from "@/common/database/native-database";
|
|
59
59
|
import { assertJsonCompatValue, type JsonCompatValue } from "@/common/encoding";
|
|
60
|
-
import { isResponseLike
|
|
60
|
+
import { isResponseLike } from "@/common/fetch-like";
|
|
61
61
|
import {
|
|
62
62
|
decodeWorkflowHistoryTransport,
|
|
63
63
|
type WorkflowHistoryBytes,
|
|
@@ -85,6 +85,13 @@ import {
|
|
|
85
85
|
} from "@/utils/node";
|
|
86
86
|
import { logger } from "./log";
|
|
87
87
|
import { loadNapiRuntime } from "./napi-runtime";
|
|
88
|
+
import {
|
|
89
|
+
buildNativeHttpRequest,
|
|
90
|
+
cancelNativeHttpRequestBody,
|
|
91
|
+
convertNativeHttpResponse,
|
|
92
|
+
type NativeHttpRequestBodyStream,
|
|
93
|
+
type NativeHttpResponseBodyStream,
|
|
94
|
+
} from "./native-http";
|
|
88
95
|
import {
|
|
89
96
|
type NativeValidationConfig,
|
|
90
97
|
validateActionArgs,
|
|
@@ -105,7 +112,6 @@ import type {
|
|
|
105
112
|
RuntimeBytes,
|
|
106
113
|
RuntimeCronFire,
|
|
107
114
|
RuntimeCronJobInfo,
|
|
108
|
-
RuntimeHttpResponse,
|
|
109
115
|
RuntimeInspectorTabEntry,
|
|
110
116
|
RuntimeQueueMessage,
|
|
111
117
|
RuntimeScheduledEventInfo,
|
|
@@ -746,6 +752,12 @@ async function loadEngineCli(): Promise<typeof import("@rivetkit/engine-cli")> {
|
|
|
746
752
|
return import(["@rivetkit", "engine-cli"].join("/"));
|
|
747
753
|
}
|
|
748
754
|
|
|
755
|
+
async function loadServices(): Promise<typeof import("@rivet-dev/services")> {
|
|
756
|
+
// Keep the native binary opaque to edge bundlers for the same reason as
|
|
757
|
+
// engine-cli above.
|
|
758
|
+
return import(["@rivet-dev", "services"].join("/"));
|
|
759
|
+
}
|
|
760
|
+
|
|
749
761
|
function decodeValue<T>(value?: RuntimeBytes | null): T {
|
|
750
762
|
if (!value || value.length === 0) {
|
|
751
763
|
return undefined as T;
|
|
@@ -1250,38 +1262,6 @@ function decodeArgs(value?: RuntimeBytes | null): unknown[] {
|
|
|
1250
1262
|
return normalizeArgs(decoded);
|
|
1251
1263
|
}
|
|
1252
1264
|
|
|
1253
|
-
function buildRequest(init: {
|
|
1254
|
-
method: string;
|
|
1255
|
-
uri: string;
|
|
1256
|
-
headers?: Record<string, string>;
|
|
1257
|
-
body?: RuntimeBytes;
|
|
1258
|
-
}): Request {
|
|
1259
|
-
const url = init.uri.startsWith("http")
|
|
1260
|
-
? init.uri
|
|
1261
|
-
: new URL(init.uri, "http://127.0.0.1").toString();
|
|
1262
|
-
const body =
|
|
1263
|
-
init.body && init.body.length > 0
|
|
1264
|
-
? runtimeBytesToArrayBuffer(init.body)
|
|
1265
|
-
: undefined;
|
|
1266
|
-
return new Request(url, {
|
|
1267
|
-
method: init.method,
|
|
1268
|
-
headers: init.headers,
|
|
1269
|
-
body,
|
|
1270
|
-
});
|
|
1271
|
-
}
|
|
1272
|
-
|
|
1273
|
-
async function toRuntimeHttpResponse(
|
|
1274
|
-
response: ResponseLike,
|
|
1275
|
-
): Promise<RuntimeHttpResponse> {
|
|
1276
|
-
const headers = Object.fromEntries(response.headers.entries());
|
|
1277
|
-
const body = new Uint8Array(await response.arrayBuffer());
|
|
1278
|
-
return {
|
|
1279
|
-
status: response.status,
|
|
1280
|
-
headers,
|
|
1281
|
-
body,
|
|
1282
|
-
};
|
|
1283
|
-
}
|
|
1284
|
-
|
|
1285
1265
|
function toActorKey(
|
|
1286
1266
|
segments: Array<{
|
|
1287
1267
|
kind: string;
|
|
@@ -3828,7 +3808,6 @@ function buildActorConfig(
|
|
|
3828
3808
|
return {
|
|
3829
3809
|
name: options.name as string | undefined,
|
|
3830
3810
|
icon: options.icon as string | undefined,
|
|
3831
|
-
maxActions: options.maxActions as number | undefined,
|
|
3832
3811
|
hasDatabase: true,
|
|
3833
3812
|
remoteSqlite: usesRemoteSqlite,
|
|
3834
3813
|
sqliteProfiling,
|
|
@@ -4069,19 +4048,22 @@ export function buildNativeFactory(
|
|
|
4069
4048
|
);
|
|
4070
4049
|
const maybeHandleNativeInspectorRequest = async (
|
|
4071
4050
|
ctx: ActorContextHandle,
|
|
4072
|
-
|
|
4051
|
+
rawRequest: {
|
|
4073
4052
|
method: string;
|
|
4074
4053
|
uri: string;
|
|
4075
4054
|
headers?: Record<string, string>;
|
|
4076
4055
|
body?: RuntimeBytes;
|
|
4077
4056
|
},
|
|
4078
|
-
jsRequest: Request,
|
|
4079
4057
|
): Promise<Response | undefined> => {
|
|
4080
|
-
const
|
|
4058
|
+
const rawUrl = rawRequest.uri.startsWith("http")
|
|
4059
|
+
? rawRequest.uri
|
|
4060
|
+
: new URL(rawRequest.uri, "http://127.0.0.1").toString();
|
|
4061
|
+
const url = new URL(rawUrl);
|
|
4081
4062
|
if (!url.pathname.startsWith("/inspector/")) {
|
|
4082
4063
|
return undefined;
|
|
4083
4064
|
}
|
|
4084
4065
|
|
|
4066
|
+
const jsRequest = buildNativeHttpRequest(rawRequest);
|
|
4085
4067
|
const jsonResponse = (body: unknown, init?: ResponseInit) =>
|
|
4086
4068
|
new Response(JSON.stringify(body), {
|
|
4087
4069
|
status: init?.status ?? 200,
|
|
@@ -4773,7 +4755,9 @@ export function buildNativeFactory(
|
|
|
4773
4755
|
);
|
|
4774
4756
|
const actorCtx = makeActorCtx(
|
|
4775
4757
|
ctx,
|
|
4776
|
-
request
|
|
4758
|
+
request
|
|
4759
|
+
? buildNativeHttpRequest(request)
|
|
4760
|
+
: undefined,
|
|
4777
4761
|
);
|
|
4778
4762
|
try {
|
|
4779
4763
|
await config.onBeforeConnect(
|
|
@@ -4810,7 +4794,9 @@ export function buildNativeFactory(
|
|
|
4810
4794
|
unwrapTsfnPayload(error, payload);
|
|
4811
4795
|
const actorCtx = makeActorCtx(
|
|
4812
4796
|
ctx,
|
|
4813
|
-
request
|
|
4797
|
+
request
|
|
4798
|
+
? buildNativeHttpRequest(request)
|
|
4799
|
+
: undefined,
|
|
4814
4800
|
);
|
|
4815
4801
|
const connAdapter = new NativeConnAdapter(
|
|
4816
4802
|
runtime,
|
|
@@ -4866,7 +4852,9 @@ export function buildNativeFactory(
|
|
|
4866
4852
|
);
|
|
4867
4853
|
const actorCtx = makeActorCtx(
|
|
4868
4854
|
ctx,
|
|
4869
|
-
request
|
|
4855
|
+
request
|
|
4856
|
+
? buildNativeHttpRequest(request)
|
|
4857
|
+
: undefined,
|
|
4870
4858
|
);
|
|
4871
4859
|
const connAdapter = new NativeConnAdapter(
|
|
4872
4860
|
runtime,
|
|
@@ -5018,38 +5006,63 @@ export function buildNativeFactory(
|
|
|
5018
5006
|
uri: string;
|
|
5019
5007
|
headers?: Record<string, string>;
|
|
5020
5008
|
body?: RuntimeBytes;
|
|
5009
|
+
bodyStream?: NativeHttpRequestBodyStream;
|
|
5021
5010
|
};
|
|
5022
5011
|
cancelToken?: CancellationTokenHandle;
|
|
5012
|
+
responseBodyStream?: NativeHttpResponseBodyStream;
|
|
5023
5013
|
},
|
|
5024
5014
|
) => {
|
|
5025
5015
|
try {
|
|
5026
|
-
const { ctx, request, cancelToken } =
|
|
5027
|
-
error,
|
|
5028
|
-
payload,
|
|
5029
|
-
);
|
|
5030
|
-
const jsRequest = buildRequest(request);
|
|
5016
|
+
const { ctx, request, cancelToken, responseBodyStream } =
|
|
5017
|
+
unwrapTsfnPayload(error, payload);
|
|
5031
5018
|
const inspectorResponse =
|
|
5032
|
-
await maybeHandleNativeInspectorRequest(
|
|
5033
|
-
ctx,
|
|
5034
|
-
request,
|
|
5035
|
-
jsRequest,
|
|
5036
|
-
);
|
|
5019
|
+
await maybeHandleNativeInspectorRequest(ctx, request);
|
|
5037
5020
|
if (inspectorResponse) {
|
|
5038
|
-
|
|
5021
|
+
await cancelNativeHttpRequestBody(request.bodyStream);
|
|
5022
|
+
return (
|
|
5023
|
+
await convertNativeHttpResponse(
|
|
5024
|
+
inspectorResponse,
|
|
5025
|
+
responseBodyStream,
|
|
5026
|
+
)
|
|
5027
|
+
).response;
|
|
5039
5028
|
}
|
|
5040
5029
|
|
|
5041
5030
|
if (typeof config.onRequest !== "function") {
|
|
5042
|
-
|
|
5043
|
-
|
|
5044
|
-
|
|
5031
|
+
await cancelNativeHttpRequestBody(request.bodyStream);
|
|
5032
|
+
return (
|
|
5033
|
+
await convertNativeHttpResponse(
|
|
5034
|
+
new Response(null, { status: 404 }),
|
|
5035
|
+
responseBodyStream,
|
|
5036
|
+
)
|
|
5037
|
+
).response;
|
|
5045
5038
|
}
|
|
5046
5039
|
|
|
5040
|
+
const requestAbortController = new AbortController();
|
|
5041
|
+
const handlerRequest = buildNativeHttpRequest({
|
|
5042
|
+
...request,
|
|
5043
|
+
abortController: requestAbortController,
|
|
5044
|
+
});
|
|
5047
5045
|
const rawConnParams =
|
|
5048
|
-
|
|
5046
|
+
handlerRequest.headers.get(HEADER_CONN_PARAMS);
|
|
5049
5047
|
let requestCtx:
|
|
5050
5048
|
| ReturnType<typeof withConnContext>
|
|
5051
5049
|
| undefined;
|
|
5052
5050
|
let conn: ConnHandle | undefined;
|
|
5051
|
+
let removeRequestAbortListener: (() => void) | undefined;
|
|
5052
|
+
let cleanupDeferredToBody = false;
|
|
5053
|
+
let cleanedUp = false;
|
|
5054
|
+
const cleanupRequest = async () => {
|
|
5055
|
+
if (cleanedUp) return;
|
|
5056
|
+
cleanedUp = true;
|
|
5057
|
+
removeRequestAbortListener?.();
|
|
5058
|
+
try {
|
|
5059
|
+
await requestCtx?.dispose();
|
|
5060
|
+
} finally {
|
|
5061
|
+
if (conn) {
|
|
5062
|
+
await runtime.connDisconnect(conn);
|
|
5063
|
+
}
|
|
5064
|
+
}
|
|
5065
|
+
};
|
|
5053
5066
|
try {
|
|
5054
5067
|
const connParams = validateConnParams(
|
|
5055
5068
|
schemaConfig.connParamsSchema,
|
|
@@ -5067,23 +5080,62 @@ export function buildNativeFactory(
|
|
|
5067
5080
|
requestCtx = makeConnCtx(
|
|
5068
5081
|
ctx,
|
|
5069
5082
|
conn,
|
|
5070
|
-
|
|
5083
|
+
handlerRequest,
|
|
5071
5084
|
cancelToken,
|
|
5072
5085
|
);
|
|
5086
|
+
const ctxAbortSignal = requestCtx.abortSignal;
|
|
5087
|
+
const abortRequest = () =>
|
|
5088
|
+
requestAbortController.abort(ctxAbortSignal.reason);
|
|
5089
|
+
if (ctxAbortSignal.aborted) {
|
|
5090
|
+
abortRequest();
|
|
5091
|
+
} else {
|
|
5092
|
+
ctxAbortSignal.addEventListener(
|
|
5093
|
+
"abort",
|
|
5094
|
+
abortRequest,
|
|
5095
|
+
{ once: true },
|
|
5096
|
+
);
|
|
5097
|
+
removeRequestAbortListener = () =>
|
|
5098
|
+
ctxAbortSignal.removeEventListener(
|
|
5099
|
+
"abort",
|
|
5100
|
+
abortRequest,
|
|
5101
|
+
);
|
|
5102
|
+
}
|
|
5073
5103
|
const response = await config.onRequest(
|
|
5074
5104
|
requestCtx,
|
|
5075
|
-
|
|
5105
|
+
handlerRequest,
|
|
5076
5106
|
);
|
|
5077
5107
|
if (!isResponseLike(response)) {
|
|
5078
5108
|
throw new Error(
|
|
5079
5109
|
"onRequest handler must return a Response",
|
|
5080
5110
|
);
|
|
5081
5111
|
}
|
|
5082
|
-
|
|
5112
|
+
const conversion = await convertNativeHttpResponse(
|
|
5113
|
+
response,
|
|
5114
|
+
responseBodyStream,
|
|
5115
|
+
);
|
|
5116
|
+
if (conversion.bodyCompletion) {
|
|
5117
|
+
cleanupDeferredToBody = true;
|
|
5118
|
+
void conversion.bodyCompletion
|
|
5119
|
+
.then(cleanupRequest)
|
|
5120
|
+
.catch((cleanupError) => {
|
|
5121
|
+
logger().error({
|
|
5122
|
+
msg: "failed to clean up native streaming http request",
|
|
5123
|
+
error: cleanupError,
|
|
5124
|
+
});
|
|
5125
|
+
});
|
|
5126
|
+
}
|
|
5127
|
+
return conversion.response;
|
|
5083
5128
|
} finally {
|
|
5084
|
-
|
|
5085
|
-
|
|
5086
|
-
|
|
5129
|
+
try {
|
|
5130
|
+
// Handler completion ends upload ownership even when
|
|
5131
|
+
// the Web Request body is locked or partly consumed.
|
|
5132
|
+
await cancelNativeHttpRequestBody(
|
|
5133
|
+
request.bodyStream,
|
|
5134
|
+
);
|
|
5135
|
+
} finally {
|
|
5136
|
+
if (!cleanupDeferredToBody) {
|
|
5137
|
+
await cleanupRequest();
|
|
5138
|
+
}
|
|
5087
5139
|
}
|
|
5088
5140
|
}
|
|
5089
5141
|
} catch (error) {
|
|
@@ -5115,7 +5167,7 @@ export function buildNativeFactory(
|
|
|
5115
5167
|
const { ctx, conn, ws, request } =
|
|
5116
5168
|
unwrapTsfnPayload(error, payload);
|
|
5117
5169
|
const jsRequest = request
|
|
5118
|
-
?
|
|
5170
|
+
? buildNativeHttpRequest(request)
|
|
5119
5171
|
: undefined;
|
|
5120
5172
|
const actorCtx = makeConnCtx(ctx, conn, jsRequest);
|
|
5121
5173
|
try {
|
|
@@ -5282,7 +5334,7 @@ export function buildNativeFactory(
|
|
|
5282
5334
|
timeoutMs,
|
|
5283
5335
|
cancelToken,
|
|
5284
5336
|
} = unwrapTsfnPayload(error, payload);
|
|
5285
|
-
const jsRequest =
|
|
5337
|
+
const jsRequest = buildNativeHttpRequest(request);
|
|
5286
5338
|
const actorCtx = withConnContext(
|
|
5287
5339
|
runtime,
|
|
5288
5340
|
ctx,
|
|
@@ -5381,6 +5433,7 @@ export function buildNativeFactory(
|
|
|
5381
5433
|
|
|
5382
5434
|
export async function buildServeConfig(
|
|
5383
5435
|
config: RegistryConfig,
|
|
5436
|
+
resolveServicesBinary = true,
|
|
5384
5437
|
): Promise<RuntimeServeConfig> {
|
|
5385
5438
|
if (!config.endpoint) {
|
|
5386
5439
|
throw nativeEndpointNotConfiguredError();
|
|
@@ -5392,6 +5445,7 @@ export async function buildServeConfig(
|
|
|
5392
5445
|
token: config.token,
|
|
5393
5446
|
namespace: config.namespace,
|
|
5394
5447
|
poolName: config.envoy.poolName,
|
|
5448
|
+
startServices: resolveServicesBinary && config.startServices,
|
|
5395
5449
|
handleInspectorHttpInRuntime: true,
|
|
5396
5450
|
serverlessBasePath: config.serverless.basePath,
|
|
5397
5451
|
serverlessPackageVersion: VERSION,
|
|
@@ -5423,6 +5477,17 @@ export async function buildServeConfig(
|
|
|
5423
5477
|
error: stringifyError(error),
|
|
5424
5478
|
});
|
|
5425
5479
|
}
|
|
5480
|
+
if (resolveServicesBinary && config.startServices) {
|
|
5481
|
+
try {
|
|
5482
|
+
const { getServicesPath } = await loadServices();
|
|
5483
|
+
serveConfig.servicesBinaryPath = getServicesPath();
|
|
5484
|
+
} catch (error) {
|
|
5485
|
+
logger().warn({
|
|
5486
|
+
msg: "could not resolve the Services binary; a local engine will fail with services.binary_unavailable — set RIVET_RUN_SERVICES=0 to disable Services or RIVET_SERVICES_BINARY to a local rivet-services binary",
|
|
5487
|
+
error: stringifyError(error),
|
|
5488
|
+
});
|
|
5489
|
+
}
|
|
5490
|
+
}
|
|
5426
5491
|
serveConfig.engineHost = config.engineHost;
|
|
5427
5492
|
serveConfig.enginePort = config.enginePort;
|
|
5428
5493
|
if (config.test?.enabled) {
|
|
@@ -5468,7 +5533,7 @@ export async function buildRegistryWithRuntime(
|
|
|
5468
5533
|
return {
|
|
5469
5534
|
runtime,
|
|
5470
5535
|
registry,
|
|
5471
|
-
serveConfig: await buildServeConfig(config),
|
|
5536
|
+
serveConfig: await buildServeConfig(config, runtime.kind === "napi"),
|
|
5472
5537
|
};
|
|
5473
5538
|
}
|
|
5474
5539
|
|
package/src/registry/runtime.ts
CHANGED
|
@@ -40,6 +40,14 @@ export interface RuntimeHttpResponse {
|
|
|
40
40
|
status?: number;
|
|
41
41
|
headers?: Record<string, string>;
|
|
42
42
|
body?: RuntimeBytes;
|
|
43
|
+
stream?: boolean;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export interface RuntimeHttpResponseBodyStream {
|
|
47
|
+
cancelled(): Promise<void>;
|
|
48
|
+
write(chunk: Uint8Array): Promise<void>;
|
|
49
|
+
end(): Promise<void>;
|
|
50
|
+
error(message: string): Promise<void>;
|
|
43
51
|
}
|
|
44
52
|
|
|
45
53
|
export interface RuntimeStateDeltaPayload {
|
|
@@ -279,7 +287,6 @@ export interface RuntimeSqlTransactionDatabase {
|
|
|
279
287
|
export interface RuntimeActorConfig {
|
|
280
288
|
name?: string;
|
|
281
289
|
icon?: string;
|
|
282
|
-
maxActions?: number;
|
|
283
290
|
hasDatabase?: boolean;
|
|
284
291
|
remoteSqlite?: boolean;
|
|
285
292
|
sqliteProfiling?: SqliteProfilingOptions;
|
|
@@ -336,6 +343,8 @@ export interface RuntimeServeConfig {
|
|
|
336
343
|
namespace: string;
|
|
337
344
|
poolName: string;
|
|
338
345
|
engineBinaryPath?: string;
|
|
346
|
+
startServices?: boolean;
|
|
347
|
+
servicesBinaryPath?: string;
|
|
339
348
|
engineHost?: string;
|
|
340
349
|
enginePort?: number;
|
|
341
350
|
handleInspectorHttpInRuntime?: boolean;
|
|
@@ -363,14 +372,20 @@ export interface RuntimeServerlessRequest {
|
|
|
363
372
|
body: RuntimeBytes;
|
|
364
373
|
}
|
|
365
374
|
|
|
375
|
+
export interface RuntimeApplicationRequest extends RuntimeServerlessRequest {
|
|
376
|
+
cancelToken?: CancellationTokenHandle;
|
|
377
|
+
}
|
|
378
|
+
|
|
366
379
|
export interface RuntimeApplicationResponse {
|
|
367
380
|
status: number;
|
|
368
381
|
headers: Record<string, string>;
|
|
369
|
-
body
|
|
382
|
+
body?: RuntimeBytes;
|
|
383
|
+
stream?: boolean;
|
|
370
384
|
}
|
|
371
385
|
|
|
372
386
|
export type RuntimeApplicationFetch = (
|
|
373
|
-
request:
|
|
387
|
+
request: RuntimeApplicationRequest,
|
|
388
|
+
responseBodyStream?: RuntimeHttpResponseBodyStream,
|
|
374
389
|
) => Promise<RuntimeApplicationResponse>;
|
|
375
390
|
|
|
376
391
|
export interface RuntimeApplicationListenerConfig
|
|
@@ -791,6 +806,7 @@ export async function buildServeConfig(
|
|
|
791
806
|
config: RegistryConfig,
|
|
792
807
|
loadEnginePath: () => Promise<string>,
|
|
793
808
|
version: string,
|
|
809
|
+
loadServicesPath: () => Promise<string>,
|
|
794
810
|
): Promise<RuntimeServeConfig> {
|
|
795
811
|
if (!config.endpoint) {
|
|
796
812
|
throw new Error("registry endpoint is required");
|
|
@@ -802,6 +818,7 @@ export async function buildServeConfig(
|
|
|
802
818
|
token: config.token,
|
|
803
819
|
namespace: config.namespace,
|
|
804
820
|
poolName: config.envoy.poolName,
|
|
821
|
+
startServices: config.startServices,
|
|
805
822
|
handleInspectorHttpInRuntime: true,
|
|
806
823
|
serverlessBasePath: config.serverless.basePath,
|
|
807
824
|
serverlessPackageVersion: version,
|
|
@@ -829,6 +846,16 @@ export async function buildServeConfig(
|
|
|
829
846
|
error: stringifyError(error),
|
|
830
847
|
});
|
|
831
848
|
}
|
|
849
|
+
if (config.startServices) {
|
|
850
|
+
try {
|
|
851
|
+
serveConfig.servicesBinaryPath = await loadServicesPath();
|
|
852
|
+
} catch (error) {
|
|
853
|
+
logger().warn({
|
|
854
|
+
msg: "could not resolve the Services binary; a local Engine will fail with services.binary_unavailable — set RIVET_RUN_SERVICES=0 to disable Services or RIVET_SERVICES_BINARY to a local rivet-services binary",
|
|
855
|
+
error: stringifyError(error),
|
|
856
|
+
});
|
|
857
|
+
}
|
|
858
|
+
}
|
|
832
859
|
serveConfig.engineHost = config.engineHost;
|
|
833
860
|
serveConfig.enginePort = config.enginePort;
|
|
834
861
|
if (config.test?.enabled) {
|
package/src/utils/env-vars.ts
CHANGED
|
@@ -30,6 +30,10 @@ export const getRivetRunEnginePort = (): number | undefined => {
|
|
|
30
30
|
};
|
|
31
31
|
export const getRivetRunEngineVersion = (): string | undefined =>
|
|
32
32
|
getEnvUniversal("RIVET_RUN_ENGINE_VERSION");
|
|
33
|
+
export const getRivetRunServices = (): boolean | undefined => {
|
|
34
|
+
const value = getEnvUniversal("RIVET_RUN_SERVICES");
|
|
35
|
+
return value === undefined ? undefined : value === "1";
|
|
36
|
+
};
|
|
33
37
|
export const getRivetEnvoyKind = (): string | undefined =>
|
|
34
38
|
getEnvUniversal("RIVET_ENVOY_KIND");
|
|
35
39
|
export const getRivetEnvoyVersion = (): number | undefined => {
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utils/env-vars.ts","../../src/common/utils.ts","../../package.json","../../src/common/log.ts","../../src/common/encoding.ts","../../src/serde.ts","../../src/utils.ts"],"sourcesContent":["// This file consolidates all environment variables that affect RivetKit's behavior.\n//\n// IMPORTANT: When adding or modifying environment variables here, also update the\n// documentation at: website/src/content/docs/general/environment-variables.mdx\n\nimport { getEnvUniversal } from \"@/utils\";\n\n// Rivet configuration\nexport const getRivetEngine = (): string | undefined =>\n\tgetEnvUniversal(\"RIVET_ENGINE\");\nexport const getRivetEndpoint = (): string | undefined =>\n\tgetEnvUniversal(\"RIVET_ENDPOINT\");\nexport const getRivetToken = (): string | undefined =>\n\tgetEnvUniversal(\"RIVET_TOKEN\");\nexport const getRivetNamespace = (): string | undefined =>\n\tgetEnvUniversal(\"RIVET_NAMESPACE\");\nexport const getRivetPool = (): string | undefined =>\n\tgetEnvUniversal(\"RIVET_POOL\");\nexport const getRivetTotalSlots = (): number | undefined => {\n\tconst value = getEnvUniversal(\"RIVET_TOTAL_SLOTS\");\n\treturn value !== undefined ? parseInt(value, 10) : undefined;\n};\nexport const getRivetRunEngine = (): boolean =>\n\tgetEnvUniversal(\"RIVET_RUN_ENGINE\") === \"1\";\nexport const getRivetRunEngineHost = (): string | undefined =>\n\tgetEnvUniversal(\"RIVET_RUN_ENGINE_HOST\");\nexport const getRivetRunEnginePort = (): number | undefined => {\n\tconst value = getEnvUniversal(\"RIVET_RUN_ENGINE_PORT\");\n\treturn value !== undefined ? parseInt(value, 10) : undefined;\n};\nexport const getRivetRunEngineVersion = (): string | undefined =>\n\tgetEnvUniversal(\"RIVET_RUN_ENGINE_VERSION\");\nexport const getRivetEnvoyKind = (): string | undefined =>\n\tgetEnvUniversal(\"RIVET_ENVOY_KIND\");\nexport const getRivetEnvoyVersion = (): number | undefined => {\n\tconst value = getEnvUniversal(\"RIVET_ENVOY_VERSION\");\n\treturn value !== undefined ? parseInt(value, 10) : undefined;\n};\nexport const getRivetPublicEndpoint = (): string | undefined =>\n\tgetEnvUniversal(\"RIVET_PUBLIC_ENDPOINT\");\nexport const getRivetPublicToken = (): string | undefined =>\n\tgetEnvUniversal(\"RIVET_PUBLIC_TOKEN\");\n// There is no RIVET_PUBLIC_NAMESPACE because the frontend and backend cannot\n// use different namespaces\n\n// RivetKit configuration\nexport const getRivetkitInspectorDisable = (): boolean =>\n\tgetEnvUniversal(\"RIVET_INSPECTOR_DISABLE\") === \"1\";\nexport const getRivetkitStoragePath = (): string | undefined =>\n\tgetEnvUniversal(\"RIVETKIT_STORAGE_PATH\");\nexport const getRivetkitRuntime = (): string | undefined =>\n\tgetEnvUniversal(\"RIVETKIT_RUNTIME\");\nexport type RuntimeMode = \"envoy\" | \"serverless\";\n\nexport const getRivetkitRuntimeMode = (): RuntimeMode => {\n\tconst value = getEnvUniversal(\"RIVETKIT_RUNTIME_MODE\");\n\tif (value === undefined) return \"envoy\";\n\tif (value === \"envoy\" || value === \"serverless\") return value;\n\tthrow new Error(\n\t\t`RIVETKIT_RUNTIME_MODE env var must be \"envoy\" or \"serverless\"; got \"${value}\"`,\n\t);\n};\n\nexport const getRivetkitPublicDir = (): string | undefined => {\n\tconst value = getEnvUniversal(\"RIVETKIT_PUBLIC_DIR\");\n\treturn value === undefined || value === \"\" ? undefined : value;\n};\n\nexport function parsePortEnv(raw: string | undefined): number | undefined {\n\tif (raw === undefined || raw === \"\") return undefined;\n\tconst parsed = Number.parseInt(raw, 10);\n\tif (\n\t\t!Number.isFinite(parsed) ||\n\t\tparsed < 1 ||\n\t\tparsed > 65535 ||\n\t\tString(parsed) !== raw.trim()\n\t) {\n\t\tthrow new Error(\n\t\t\t`RIVET_PORT env var must be an integer between 1 and 65535; got \"${raw}\"`,\n\t\t);\n\t}\n\treturn parsed;\n}\n\n// Logging configuration\n// DEPRECATED: LOG_LEVEL will be removed in a future version\nexport const getLogLevel = (): string | undefined =>\n\tgetEnvUniversal(\"RIVET_LOG_LEVEL\") ?? getEnvUniversal(\"LOG_LEVEL\");\nexport const getLogTarget = (): boolean =>\n\tgetEnvUniversal(\"RIVET_LOG_TARGET\") === \"1\";\nexport const getLogTimestamp = (): boolean =>\n\tgetEnvUniversal(\"RIVET_LOG_TIMESTAMP\") === \"1\";\nexport const getLogMessage = (): boolean =>\n\tgetEnvUniversal(\"RIVET_LOG_MESSAGE\") === \"1\";\nexport const getLogErrorStack = (): boolean =>\n\tgetEnvUniversal(\"RIVET_LOG_ERROR_STACK\") === \"1\";\nexport const getLogHeaders = (): boolean =>\n\tgetEnvUniversal(\"RIVET_LOG_HEADERS\") === \"1\";\n\n// Environment configuration\nexport const getNodeEnv = (): string | undefined => getEnvUniversal(\"NODE_ENV\");\nexport const getNextPhase = (): string | undefined =>\n\tgetEnvUniversal(\"NEXT_PHASE\");\nexport const isDev = (): boolean => getNodeEnv() !== \"production\";\n\n// Experimental\n/**\n * Enables experimental OTel tracing for Rivet Actors.\n *\n * When disabled, actors use an in-memory no-op traces implementation.\n */\nexport const getRivetExperimentalOtel = (): boolean =>\n\tgetEnvUniversal(\"RIVET_EXPERIMENTAL_OTEL\") === \"1\";\n","import type { Next } from \"hono\";\nimport type { ContentfulStatusCode } from \"hono/utils/http-status\";\nimport * as errors from \"@/actor/errors\";\nimport { getLogErrorStack } from \"@/utils/env-vars\";\n\nexport function assertUnreachable(x: never): never {\n\tthrow new Error(`Unreachable case: ${x}`);\n}\n\n/**\n * Safely stringifies an object, ensuring that the stringified object is under a certain size.\n * @param obj any object to stringify\n * @param maxSize maximum size of the stringified object in bytes\n * @returns stringified object\n */\nexport function safeStringify(obj: unknown, maxSize: number) {\n\tlet size = 0;\n\n\tfunction replacer(key: string, value: unknown) {\n\t\tif (value === null || value === undefined) return value;\n\t\tconst valueSize =\n\t\t\ttypeof value === \"string\"\n\t\t\t\t? value.length\n\t\t\t\t: JSON.stringify(value).length;\n\t\tsize += key.length + valueSize;\n\n\t\tif (size > maxSize) {\n\t\t\tthrow new Error(\n\t\t\t\t`JSON object exceeds size limit of ${maxSize} bytes.`,\n\t\t\t);\n\t\t}\n\n\t\treturn value;\n\t}\n\n\treturn JSON.stringify(obj, replacer);\n}\n\nexport interface DeconstructedError {\n\t__type: \"ActorError\";\n\tstatusCode: ContentfulStatusCode;\n\tpublic: boolean;\n\tgroup: string;\n\tcode: string;\n\tmessage: string;\n\tmetadata?: unknown;\n\trayId?: string;\n\tactor?: errors.ActorSpecifier;\n}\n\nfunction isCanonicalStructuredRivetError(\n\terror: unknown,\n): error is errors.RivetErrorLike {\n\treturn (\n\t\terror instanceof errors.RivetError ||\n\t\t(typeof error === \"object\" &&\n\t\t\terror !== null &&\n\t\t\t\"__type\" in error &&\n\t\t\terror.__type === \"RivetError\" &&\n\t\t\t\"group\" in error &&\n\t\t\ttypeof error.group === \"string\" &&\n\t\t\t\"code\" in error &&\n\t\t\ttypeof error.code === \"string\" &&\n\t\t\t\"message\" in error &&\n\t\t\ttypeof error.message === \"string\")\n\t);\n}\n\n/**\n * Deconstructs errors into response fields. Bridge callback errors that cross\n * into rivetkit-core are sanitized there; this only classifies JS-local errors.\n */\nexport function deconstructError(\n\terror: unknown,\n\texposeInternalError = false,\n): DeconstructedError {\n\t// Build response error information. Only return errors if flagged as public in order to prevent leaking internal behavior.\n\tlet statusCode: ContentfulStatusCode;\n\tlet public_: boolean;\n\tlet group: string;\n\tlet code: string;\n\tlet message: string;\n\tlet metadata: unknown;\n\tlet rayId: string | undefined;\n\tlet actor: errors.ActorSpecifier | undefined;\n\t// Structured errors from core or from pre-built `RivetError` instances are canonical.\n\t// Only unstructured errors go through the classifier below.\n\tif (isCanonicalStructuredRivetError(error)) {\n\t\tstatusCode = (\n\t\t\ttypeof error.statusCode === \"number\"\n\t\t\t\t? error.statusCode\n\t\t\t\t: error.public\n\t\t\t\t\t? 400\n\t\t\t\t\t: 500\n\t\t) as ContentfulStatusCode;\n\t\tpublic_ = error.public ?? false;\n\t\tgroup = error.group;\n\t\tcode = error.code;\n\t\tmessage = error.message;\n\t\tmetadata = error.metadata;\n\t\trayId = error.rayId;\n\t\tactor = error.actor;\n\t} else if (errors.ActorError.isActorError(error) && error.public) {\n\t\t// Check if error has statusCode (could be ActorError instance or DeconstructedError)\n\t\tstatusCode = (\n\t\t\t\"statusCode\" in error && error.statusCode ? error.statusCode : 400\n\t\t) as ContentfulStatusCode;\n\t\tpublic_ = true;\n\t\tgroup = error.group;\n\t\tcode = error.code;\n\t\tmessage = getErrorMessage(error);\n\t\tmetadata = error.metadata;\n\t\trayId = error.rayId;\n\t\tactor = error.actor;\n\t} else if (exposeInternalError) {\n\t\tif (errors.ActorError.isActorError(error)) {\n\t\t\tstatusCode = 500;\n\t\t\tpublic_ = false;\n\t\t\tgroup = error.group;\n\t\t\tcode = error.code;\n\t\t\tmessage = getErrorMessage(error);\n\t\t\tmetadata = error.metadata;\n\t\t\trayId = error.rayId;\n\t\t\tactor = error.actor;\n\t\t} else {\n\t\t\tstatusCode = 500;\n\t\t\tpublic_ = false;\n\t\t\tgroup = \"rivetkit\";\n\t\t\tcode = errors.INTERNAL_ERROR_CODE;\n\t\t\tmessage = getErrorMessage(error);\n\t\t}\n\t} else {\n\t\tstatusCode = 500;\n\t\tpublic_ = false;\n\t\tgroup = \"rivetkit\";\n\t\tcode = errors.INTERNAL_ERROR_CODE;\n\t\tmessage = errors.INTERNAL_ERROR_DESCRIPTION;\n\t\tif (errors.ActorError.isActorError(error)) {\n\t\t\tactor = error.actor;\n\t\t}\n\t\tmetadata = {\n\t\t\t//url: `https://dashboard.rivet.dev/projects/${actorMetadata.project.slug}/environments/${actorMetadata.environment.slug}/actors?actorId=${actorMetadata.actor.id}`,\n\t\t} satisfies errors.InternalErrorMetadata;\n\t}\n\n\treturn {\n\t\t__type: \"ActorError\",\n\t\tstatusCode,\n\t\tpublic: public_,\n\t\tgroup,\n\t\tcode,\n\t\tmessage,\n\t\tmetadata,\n\t\trayId,\n\t\tactor,\n\t};\n}\n\nexport function stringifyError(error: unknown): string {\n\tif (error instanceof Error) {\n\t\tif (typeof process !== \"undefined\" && getLogErrorStack()) {\n\t\t\tlet stack: string | undefined;\n\t\t\ttry {\n\t\t\t\tstack = error.stack;\n\t\t\t} catch {\n\t\t\t\tstack = undefined;\n\t\t\t}\n\t\t\treturn `${error.name}: ${error.message}${stack ? `\\n${stack}` : \"\"}`;\n\t\t} else {\n\t\t\treturn `${error.name}: ${error.message}`;\n\t\t}\n\t} else if (typeof error === \"string\") {\n\t\treturn error;\n\t} else if (typeof error === \"object\" && error !== null) {\n\t\ttry {\n\t\t\treturn `${JSON.stringify(error)}`;\n\t\t} catch {\n\t\t\treturn \"[cannot stringify error]\";\n\t\t}\n\t} else {\n\t\treturn `Unknown error: ${getErrorMessage(error)}`;\n\t}\n}\n\nfunction getErrorMessage(err: unknown): string {\n\tif (\n\t\terr &&\n\t\ttypeof err === \"object\" &&\n\t\t\"message\" in err &&\n\t\ttypeof err.message === \"string\"\n\t) {\n\t\treturn err.message;\n\t} else {\n\t\treturn String(err);\n\t}\n}\n\n/** Generates a `Next` handler to pass to middleware in order to be able to call arbitrary middleware. */\nexport function noopNext(): Next {\n\treturn async () => {};\n}\n","{\n\t\"name\": \"rivetkit\",\n\t\"version\": \"2.3.12-rc.4\",\n\t\"description\": \"Lightweight libraries for building stateful actors on edge platforms\",\n\t\"license\": \"Apache-2.0\",\n\t\"keywords\": [\n\t\t\"rivetkit\",\n\t\t\"stateful\",\n\t\t\"serverless\",\n\t\t\"actors\",\n\t\t\"agents\",\n\t\t\"realtime\",\n\t\t\"websocket\",\n\t\t\"actors\",\n\t\t\"framework\"\n\t],\n\t\"files\": [\n\t\t\"dist\",\n\t\t\"schemas\",\n\t\t\"src\",\n\t\t\"package.json\"\n\t],\n\t\"type\": \"module\",\n\t\"exports\": {\n\t\t\".\": {\n\t\t\t\"import\": {\n\t\t\t\t\"types\": \"./dist/tsup/mod.d.ts\",\n\t\t\t\t\"default\": \"./dist/tsup/mod.js\"\n\t\t\t},\n\t\t\t\"require\": {\n\t\t\t\t\"types\": \"./dist/tsup/mod.d.cts\",\n\t\t\t\t\"default\": \"./dist/tsup/mod.cjs\"\n\t\t\t}\n\t\t},\n\t\t\"./workflow\": {\n\t\t\t\"import\": {\n\t\t\t\t\"types\": \"./dist/tsup/workflow/mod.d.ts\",\n\t\t\t\t\"default\": \"./dist/tsup/workflow/mod.js\"\n\t\t\t},\n\t\t\t\"require\": {\n\t\t\t\t\"types\": \"./dist/tsup/workflow/mod.d.cts\",\n\t\t\t\t\"default\": \"./dist/tsup/workflow/mod.cjs\"\n\t\t\t}\n\t\t},\n\t\t\"./test\": {\n\t\t\t\"import\": {\n\t\t\t\t\"types\": \"./dist/tsup/test/mod.d.ts\",\n\t\t\t\t\"default\": \"./dist/tsup/test/mod.js\"\n\t\t\t},\n\t\t\t\"require\": {\n\t\t\t\t\"types\": \"./dist/tsup/test/mod.d.cts\",\n\t\t\t\t\"default\": \"./dist/tsup/test/mod.cjs\"\n\t\t\t}\n\t\t},\n\t\t\"./db\": {\n\t\t\t\"import\": {\n\t\t\t\t\"types\": \"./dist/tsup/db/mod.d.ts\",\n\t\t\t\t\"default\": \"./dist/tsup/db/mod.js\"\n\t\t\t},\n\t\t\t\"require\": {\n\t\t\t\t\"types\": \"./dist/tsup/db/mod.d.cts\",\n\t\t\t\t\"default\": \"./dist/tsup/db/mod.cjs\"\n\t\t\t}\n\t\t},\n\t\t\"./db/drizzle\": {\n\t\t\t\"import\": {\n\t\t\t\t\"types\": \"./dist/tsup/db/drizzle.d.ts\",\n\t\t\t\t\"default\": \"./dist/tsup/db/drizzle.js\"\n\t\t\t},\n\t\t\t\"require\": {\n\t\t\t\t\"types\": \"./dist/tsup/db/drizzle.d.cts\",\n\t\t\t\t\"default\": \"./dist/tsup/db/drizzle.cjs\"\n\t\t\t}\n\t\t},\n\t\t\"./unstable/migrations\": {\n\t\t\t\"import\": {\n\t\t\t\t\"types\": \"./dist/tsup/unstable/migrations.d.ts\",\n\t\t\t\t\"default\": \"./dist/tsup/unstable/migrations.js\"\n\t\t\t},\n\t\t\t\"require\": {\n\t\t\t\t\"types\": \"./dist/tsup/unstable/migrations.d.cts\",\n\t\t\t\t\"default\": \"./dist/tsup/unstable/migrations.cjs\"\n\t\t\t}\n\t\t},\n\t\t\"./dynamic\": {\n\t\t\t\"import\": {\n\t\t\t\t\"types\": \"./dist/tsup/dynamic/mod.d.ts\",\n\t\t\t\t\"default\": \"./dist/tsup/dynamic/mod.js\"\n\t\t\t},\n\t\t\t\"require\": {\n\t\t\t\t\"types\": \"./dist/tsup/dynamic/mod.d.cts\",\n\t\t\t\t\"default\": \"./dist/tsup/dynamic/mod.cjs\"\n\t\t\t}\n\t\t},\n\t\t\"./client\": {\n\t\t\t\"import\": {\n\t\t\t\t\"browser\": {\n\t\t\t\t\t\"types\": \"./dist/browser/client.d.ts\",\n\t\t\t\t\t\"default\": \"./dist/browser/client.js\"\n\t\t\t\t},\n\t\t\t\t\"types\": \"./dist/tsup/client/mod.d.ts\",\n\t\t\t\t\"default\": \"./dist/tsup/client/mod.js\"\n\t\t\t},\n\t\t\t\"require\": {\n\t\t\t\t\"types\": \"./dist/tsup/client/mod.d.cts\",\n\t\t\t\t\"default\": \"./dist/tsup/client/mod.cjs\"\n\t\t\t}\n\t\t},\n\t\t\"./log\": {\n\t\t\t\"import\": {\n\t\t\t\t\"types\": \"./dist/tsup/common/log.d.ts\",\n\t\t\t\t\"default\": \"./dist/tsup/common/log.js\"\n\t\t\t},\n\t\t\t\"require\": {\n\t\t\t\t\"types\": \"./dist/tsup/common/log.d.cts\",\n\t\t\t\t\"default\": \"./dist/tsup/common/log.cjs\"\n\t\t\t}\n\t\t},\n\t\t\"./errors\": {\n\t\t\t\"import\": {\n\t\t\t\t\"types\": \"./dist/tsup/actor/errors.d.ts\",\n\t\t\t\t\"default\": \"./dist/tsup/actor/errors.js\"\n\t\t\t},\n\t\t\t\"require\": {\n\t\t\t\t\"types\": \"./dist/tsup/actor/errors.d.cts\",\n\t\t\t\t\"default\": \"./dist/tsup/actor/errors.cjs\"\n\t\t\t}\n\t\t},\n\t\t\"./inspector\": {\n\t\t\t\"import\": {\n\t\t\t\t\"types\": \"./dist/tsup/inspector/mod.d.ts\",\n\t\t\t\t\"default\": \"./dist/tsup/inspector/mod.js\"\n\t\t\t},\n\t\t\t\"require\": {\n\t\t\t\t\"types\": \"./dist/tsup/inspector/mod.d.cts\",\n\t\t\t\t\"default\": \"./dist/tsup/inspector/mod.cjs\"\n\t\t\t}\n\t\t},\n\t\t\"./experimental/inspector/workflow\": {\n\t\t\t\"import\": {\n\t\t\t\t\"types\": \"./dist/tsup/inspector/workflow.d.ts\",\n\t\t\t\t\"default\": \"./dist/tsup/inspector/workflow.js\"\n\t\t\t},\n\t\t\t\"require\": {\n\t\t\t\t\"types\": \"./dist/tsup/inspector/workflow.d.cts\",\n\t\t\t\t\"default\": \"./dist/tsup/inspector/workflow.cjs\"\n\t\t\t}\n\t\t},\n\t\t\"./inspector-tab\": {\n\t\t\t\"import\": {\n\t\t\t\t\"types\": \"./dist/tsup/inspector-tab/mod.d.ts\",\n\t\t\t\t\"default\": \"./dist/tsup/inspector-tab/mod.js\"\n\t\t\t},\n\t\t\t\"require\": {\n\t\t\t\t\"types\": \"./dist/tsup/inspector-tab/mod.d.cts\",\n\t\t\t\t\"default\": \"./dist/tsup/inspector-tab/mod.cjs\"\n\t\t\t}\n\t\t},\n\t\t\"./inspector/client\": {\n\t\t\t\"import\": {\n\t\t\t\t\"types\": \"./dist/browser/inspector/client.d.ts\",\n\t\t\t\t\"default\": \"./dist/browser/inspector/client.js\"\n\t\t\t}\n\t\t},\n\t\t\"./utils\": {\n\t\t\t\"import\": {\n\t\t\t\t\"types\": \"./dist/tsup/utils.d.ts\",\n\t\t\t\t\"default\": \"./dist/tsup/utils.js\"\n\t\t\t},\n\t\t\t\"require\": {\n\t\t\t\t\"types\": \"./dist/tsup/utils.d.cts\",\n\t\t\t\t\"default\": \"./dist/tsup/utils.cjs\"\n\t\t\t}\n\t\t},\n\t\t\"./agent-os\": {\n\t\t\t\"import\": {\n\t\t\t\t\"types\": \"./dist/tsup/agent-os/index.d.ts\",\n\t\t\t\t\"default\": \"./dist/tsup/agent-os/index.js\"\n\t\t\t},\n\t\t\t\"require\": {\n\t\t\t\t\"types\": \"./dist/tsup/agent-os/index.d.cts\",\n\t\t\t\t\"default\": \"./dist/tsup/agent-os/index.cjs\"\n\t\t\t}\n\t\t}\n\t},\n\t\"engines\": {\n\t\t\"node\": \">=22.0.0\"\n\t},\n\t\"sideEffects\": [\n\t\t\"./dist/tsup/chunk-*.js\",\n\t\t\"./dist/tsup/chunk-*.cjs\"\n\t],\n\t\"scripts\": {\n\t\t\"build\": \"tsup src/mod.ts src/client/mod.ts src/common/log.ts src/common/websocket.ts src/actor/errors.ts src/utils.ts src/workflow/mod.ts src/test/mod.ts src/inspector/mod.ts src/inspector/workflow.ts src/inspector-tab/mod.ts src/db/mod.ts src/db/drizzle.ts src/dynamic/mod.ts src/unstable/migrations.ts && tsup src/agent-os/index.ts --no-clean --out-dir dist/tsup/agent-os && node scripts/check-built-commonjs.mjs\",\n\t\t\"build:browser\": \"tsup --config tsup.browser.config.ts\",\n\t\t\"check-types\": \"tsc --noEmit\",\n\t\t\"lint\": \"biome check . && pnpm run check:test-skips && pnpm run check:wait-for-comments\",\n\t\t\"lint:fix\": \"biome check --write .\",\n\t\t\"check:test-skips\": \"tsx scripts/check-annotated-skips.ts\",\n\t\t\"check:wait-for-comments\": \"tsx scripts/check-wait-for-comments.ts\",\n\t\t\"format\": \"biome format .\",\n\t\t\"format:write\": \"biome format --write .\",\n\t\t\"test\": \"vitest run\",\n\t\t\"test:platforms\": \"pnpm run build && RIVETKIT_INCLUDE_PLATFORM_TESTS=1 vitest run tests/platforms --passWithNoTests\",\n\t\t\"test:watch\": \"vitest\",\n\t\t\"dump-asyncapi\": \"tsx scripts/dump-asyncapi.ts\",\n\t\t\"registry-config-schema-gen\": \"tsx scripts/registry-config-schema-gen.ts\",\n\t\t\"actor-config-schema-gen\": \"tsx scripts/actor-config-schema-gen.ts\"\n\t},\n\t\"dependencies\": {\n\t\t\"@hono/zod-openapi\": \"^1.1.5\",\n\t\t\"@rivet-dev/agent-os-core\": \"^0.1.1\",\n\t\t\"@rivetkit/bare-ts\": \"^0.6.2\",\n\t\t\"@rivetkit/engine-cli\": \"workspace:*\",\n\t\t\"@rivetkit/engine-envoy-protocol\": \"workspace:*\",\n\t\t\"@rivetkit/on-change\": \"6.0.1\",\n\t\t\"@rivetkit/rivetkit-napi\": \"workspace:*\",\n\t\t\"@rivetkit/rivetkit-wasm\": \"workspace:*\",\n\t\t\"@rivetkit/traces\": \"workspace:*\",\n\t\t\"@rivetkit/virtual-websocket\": \"workspace:*\",\n\t\t\"@rivetkit/workflow-engine\": \"workspace:*\",\n\t\t\"cbor-x\": \"^1.6.0\",\n\t\t\"drizzle-orm\": \"^0.44.2\",\n\t\t\"hono\": \"^4.7.0\",\n\t\t\"invariant\": \"^2.2.4\",\n\t\t\"p-retry\": \"^6.2.1\",\n\t\t\"pino\": \"^9.5.0\",\n\t\t\"uuid\": \"^12.0.0\",\n\t\t\"vbare\": \"^0.0.4\",\n\t\t\"zod\": \"^4.1.0\"\n\t},\n\t\"devDependencies\": {\n\t\t\"@biomejs/biome\": \"^2.3\",\n\t\t\"@copilotkit/llmock\": \"^1.6.0\",\n\t\t\"@hono/node-server\": \"^1.18.2\",\n\t\t\"@hono/node-ws\": \"^1.1.1\",\n\t\t\"@rivet-dev/agent-os-common\": \"*\",\n\t\t\"@rivet-dev/agent-os-pi\": \"^0.1.1\",\n\t\t\"@standard-schema/spec\": \"^1.0.0\",\n\t\t\"@types/invariant\": \"^2\",\n\t\t\"@types/node\": \"^22.13.1\",\n\t\t\"eventsource\": \"^4.0.0\",\n\t\t\"get-port\": \"^7.1.0\",\n\t\t\"tsup\": \"^8.4.0\",\n\t\t\"tsx\": \"^4.19.4\",\n\t\t\"typescript\": \"^5.7.3\",\n\t\t\"vite-tsconfig-paths\": \"^5.1.4\",\n\t\t\"vitest\": \"^3.1.1\",\n\t\t\"ws\": \"^8.18.1\"\n\t},\n\t\"peerDependencies\": {\n\t\t\"drizzle-kit\": \"^0.31.2\",\n\t\t\"eventsource\": \"^4.0.0\",\n\t\t\"ws\": \"^8.0.0\"\n\t},\n\t\"peerDependenciesMeta\": {\n\t\t\"drizzle-kit\": {\n\t\t\t\"optional\": true\n\t\t},\n\t\t\"eventsource\": {\n\t\t\t\"optional\": true\n\t\t},\n\t\t\"ws\": {\n\t\t\t\"optional\": true\n\t\t}\n\t},\n\t\"stableVersion\": \"0.8.0\"\n}\n","import {\n\ttype DestinationStream,\n\ttype LevelWithSilent,\n\ttype Logger,\n\tpino,\n\tstdTimeFunctions,\n} from \"pino\";\nimport { z } from \"zod/v4\";\nimport { getLogLevel, getLogTarget, getLogTimestamp } from \"@/utils/env-vars\";\n\nexport type { Logger } from \"pino\";\n\nlet baseLogger: Logger | undefined;\nlet configuredLogLevel: LogLevel | undefined;\n\n/** Cache of child loggers by logger name. */\nconst loggerCache = new Map<string, Logger>();\n\nexport const LogLevelSchema = z.enum([\n\t\"trace\",\n\t\"debug\",\n\t\"info\",\n\t\"warn\",\n\t\"error\",\n\t\"fatal\",\n\t\"silent\",\n]);\n\nexport type LogLevel = z.infer<typeof LogLevelSchema>;\n\nexport function getPinoLevel(logLevel?: LogLevel): LevelWithSilent {\n\t// Priority: provided > configured > env > default\n\tif (logLevel) {\n\t\treturn logLevel;\n\t}\n\n\tif (configuredLogLevel) {\n\t\treturn configuredLogLevel;\n\t}\n\n\tconst raw = (getLogLevel() || \"warn\").toString().toLowerCase();\n\n\tconst parsed = LogLevelSchema.safeParse(raw);\n\tif (parsed.success) {\n\t\treturn parsed.data;\n\t}\n\n\t// Default to info if invalid\n\treturn \"info\";\n}\n\nexport function getIncludeTarget(): boolean {\n\treturn getLogTarget();\n}\n\n/**\n * Configure a custom base logger.\n */\nexport function configureBaseLogger(logger: Logger): void {\n\tbaseLogger = logger;\n\tloggerCache.clear();\n}\n\n/**\n * Create the default logger with optional log level.\n */\nexport function makeDefaultLogger(logLevel?: LogLevel): Logger {\n\treturn pino(\n\t\t{\n\t\t\tlevel: getPinoLevel(logLevel),\n\t\t\tmessageKey: \"msg\",\n\t\t\t// Do not include pid/hostname in output\n\t\t\tbase: {},\n\t\t\terrorKey: \"error\",\n\t\t\t// Keep the numeric level so the logfmt sink can match Pino's levels.\n\t\t\tformatters: {\n\t\t\t\tlevel(_label: string, number: number) {\n\t\t\t\t\treturn { level: number };\n\t\t\t\t},\n\t\t\t},\n\t\t\ttimestamp: getLogTimestamp() ? stdTimeFunctions.epochTime : false,\n\t\t},\n\t\tcreateLogfmtDestination(),\n\t);\n}\n\n/**\n * Configure the default logger with optional log level.\n */\nexport function configureDefaultLogger(logLevel?: LogLevel) {\n\t// Store the configured log level\n\tif (logLevel) {\n\t\tconfiguredLogLevel = logLevel;\n\t}\n\n\tbaseLogger = makeDefaultLogger(logLevel);\n\tloggerCache.clear();\n}\n\n/**\n * Get or initialize the base logger.\n */\nexport function getBaseLogger(): Logger {\n\tif (!baseLogger) {\n\t\tconfigureDefaultLogger();\n\t}\n\treturn baseLogger!;\n}\n\n/**\n * Returns a child logger with `target` bound for the given name.\n */\nexport function getLogger(name = \"default\"): Logger {\n\t// Check cache first\n\tconst cached = loggerCache.get(name);\n\tif (cached) {\n\t\treturn cached;\n\t}\n\n\t// Create\n\tconst base = getBaseLogger();\n\n\t// Add target to log if enabled\n\tconst child = getIncludeTarget() ? base.child({ target: name }) : base;\n\n\t// Cache the logger\n\tloggerCache.set(name, child);\n\n\treturn child;\n}\n\nconst PINO_LEVEL_LABELS: Record<number, string> = {\n\t10: \"trace\",\n\t20: \"debug\",\n\t30: \"info\",\n\t40: \"warn\",\n\t50: \"error\",\n\t60: \"fatal\",\n};\n\nfunction createLogfmtDestination(): DestinationStream {\n\treturn {\n\t\twrite(msg: string): void {\n\t\t\tconst line = formatLogfmtLine(msg);\n\t\t\tif (typeof process !== \"undefined\" && process.stdout?.write) {\n\t\t\t\tprocess.stdout.write(`${line}\\n`);\n\t\t\t} else {\n\t\t\t\tconsole.log(line);\n\t\t\t}\n\t\t},\n\t};\n}\n\nfunction formatLogfmtLine(raw: string): string {\n\tlet data: Record<string, unknown>;\n\ttry {\n\t\tdata = JSON.parse(raw);\n\t} catch {\n\t\treturn raw.trimEnd();\n\t}\n\n\tconst parts: string[] = [];\n\tappendLogfmtEntry(parts, \"level\", formatPinoLevel(data.level));\n\n\tif (data.time !== undefined) {\n\t\tappendLogfmtEntry(parts, \"ts\", data.time);\n\t}\n\n\tfor (const [key, value] of Object.entries(data)) {\n\t\tif (key === \"level\" || key === \"time\") {\n\t\t\tcontinue;\n\t\t}\n\t\tappendLogfmtEntry(parts, key, value);\n\t}\n\n\treturn parts.join(\" \");\n}\n\nfunction formatPinoLevel(level: unknown): string {\n\tif (typeof level === \"number\") {\n\t\treturn PINO_LEVEL_LABELS[level] ?? level.toString();\n\t}\n\n\tif (typeof level === \"string\") {\n\t\treturn level.toLowerCase();\n\t}\n\n\treturn \"info\";\n}\n\nfunction appendLogfmtEntry(parts: string[], key: string, value: unknown): void {\n\tconst safeKey = key.replace(/[\\s=\"]/g, \"\");\n\tif (safeKey.length === 0) {\n\t\treturn;\n\t}\n\n\tparts.push(`${safeKey}=${formatLogfmtValue(value)}`);\n}\n\nfunction formatLogfmtValue(value: unknown): string {\n\tif (typeof value === \"number\" || typeof value === \"boolean\") {\n\t\treturn String(value);\n\t}\n\n\tif (value === null || value === undefined) {\n\t\treturn \"null\";\n\t}\n\n\tif (typeof value === \"string\") {\n\t\treturn quoteLogfmtString(value);\n\t}\n\n\treturn quoteLogfmtString(JSON.stringify(value));\n}\n\nfunction quoteLogfmtString(value: string): string {\n\tif (!/[\\s=\"]/.test(value)) {\n\t\treturn value;\n\t}\n\n\treturn `\"${value.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"').replace(/\\n/g, \"\\\\n\")}\"`;\n}\n","import type { VersionedDataHandler } from \"vbare\";\nimport { z } from \"zod/v4\";\nimport { serializeWithEncoding } from \"@/serde\";\nimport { assertUnreachable } from \"./utils\";\n\n/** Data that can be deserialized. */\nexport type InputData = string | Buffer | Blob | ArrayBufferLike | Uint8Array;\n\n/** Data that's been serialized. */\nexport type OutputData = string | Uint8Array;\n\nconst JSON_COMPAT_BIGINT = \"$BigInt\";\nconst JSON_COMPAT_ARRAY_BUFFER = \"$ArrayBuffer\";\nconst JSON_COMPAT_UINT8_ARRAY = \"$Uint8Array\";\nconst JSON_COMPAT_UNDEFINED = \"$Undefined\";\nconst JSON_COMPAT_SET = \"$Set\";\n\n/**\n * Types that cbor-x encodes natively without any compat transforms.\n */\nexport type CborSerializable =\n\t| string\n\t| number\n\t| boolean\n\t| null\n\t| undefined\n\t| bigint\n\t| Date\n\t| RegExp\n\t| Error\n\t| ArrayBuffer\n\t| Uint8Array\n\t| Uint8ClampedArray\n\t| Uint16Array\n\t| Uint32Array\n\t| BigUint64Array\n\t| Int8Array\n\t| Int16Array\n\t| Int32Array\n\t| BigInt64Array\n\t| Float32Array\n\t| Float64Array\n\t| CborSerializable[]\n\t| Map<CborSerializable, CborSerializable>\n\t| { [key: string]: CborSerializable };\n\n/**\n * User-facing serializable type. Extends CborSerializable with Set (encoded\n * as a `$Set` tagged array by the JSON compat layer).\n */\nexport type JsonCompatValue =\n\t| CborSerializable\n\t| Set<JsonCompatValue>\n\t| JsonCompatValue[]\n\t| Map<JsonCompatValue, JsonCompatValue>\n\t| { [key: string]: JsonCompatValue };\n\nfunction isTypedArray(value: unknown): boolean {\n\treturn (\n\t\tvalue instanceof Uint8ClampedArray ||\n\t\tvalue instanceof Uint16Array ||\n\t\tvalue instanceof Uint32Array ||\n\t\tvalue instanceof BigUint64Array ||\n\t\tvalue instanceof Int8Array ||\n\t\tvalue instanceof Int16Array ||\n\t\tvalue instanceof Int32Array ||\n\t\tvalue instanceof BigInt64Array ||\n\t\tvalue instanceof Float32Array ||\n\t\tvalue instanceof Float64Array\n\t);\n}\n\n/**\n * Recursively validates that a value is CBOR serializable. Throws TypeError\n * with a descriptive message for non-serializable values.\n */\nexport function assertJsonCompatValue(\n\tvalue: unknown,\n\tpath = \"\",\n): asserts value is JsonCompatValue {\n\tif (\n\t\tvalue === null ||\n\t\tvalue === undefined ||\n\t\ttypeof value === \"string\" ||\n\t\ttypeof value === \"number\" ||\n\t\ttypeof value === \"boolean\" ||\n\t\ttypeof value === \"bigint\"\n\t) {\n\t\treturn;\n\t}\n\n\tif (typeof value === \"function\") {\n\t\tthrow new TypeError(\n\t\t\t`Value at ${path || \"root\"} is a function and is not CBOR serializable`,\n\t\t);\n\t}\n\n\tif (typeof value === \"symbol\") {\n\t\tthrow new TypeError(\n\t\t\t`Value at ${path || \"root\"} is a symbol and is not CBOR serializable`,\n\t\t);\n\t}\n\n\tif (\n\t\tvalue instanceof Date ||\n\t\tvalue instanceof RegExp ||\n\t\tvalue instanceof Error ||\n\t\tvalue instanceof ArrayBuffer ||\n\t\tvalue instanceof Uint8Array ||\n\t\tisTypedArray(value)\n\t) {\n\t\treturn;\n\t}\n\n\tif (value instanceof WeakMap) {\n\t\tthrow new TypeError(\n\t\t\t`Value at ${path || \"root\"} is a WeakMap and is not CBOR serializable`,\n\t\t);\n\t}\n\n\tif (value instanceof WeakSet) {\n\t\tthrow new TypeError(\n\t\t\t`Value at ${path || \"root\"} is a WeakSet and is not CBOR serializable`,\n\t\t);\n\t}\n\n\tif (value instanceof WeakRef) {\n\t\tthrow new TypeError(\n\t\t\t`Value at ${path || \"root\"} is a WeakRef and is not CBOR serializable`,\n\t\t);\n\t}\n\n\tif (value instanceof Promise) {\n\t\tthrow new TypeError(\n\t\t\t`Value at ${path || \"root\"} is a Promise and is not CBOR serializable`,\n\t\t);\n\t}\n\n\tif (value instanceof Map) {\n\t\tfor (const [k, v] of value.entries()) {\n\t\t\tassertJsonCompatValue(k, `${path || \"root\"}.key(${String(k)})`);\n\t\t\tassertJsonCompatValue(v, `${path || \"root\"}.value(${String(k)})`);\n\t\t}\n\t\treturn;\n\t}\n\n\tif (value instanceof Set) {\n\t\tlet index = 0;\n\t\tfor (const item of value.values()) {\n\t\t\tassertJsonCompatValue(item, `${path || \"root\"}.set[${index}]`);\n\t\t\tindex++;\n\t\t}\n\t\treturn;\n\t}\n\n\tif (Array.isArray(value)) {\n\t\tfor (let i = 0; i < value.length; i++) {\n\t\t\tassertJsonCompatValue(value[i], `${path || \"root\"}[${i}]`);\n\t\t}\n\t\treturn;\n\t}\n\n\tif (isPlainObject(value)) {\n\t\tfor (const key in value) {\n\t\t\tassertJsonCompatValue(\n\t\t\t\tvalue[key as keyof typeof value],\n\t\t\t\tpath ? `${path}.${key}` : key,\n\t\t\t);\n\t\t}\n\t\treturn;\n\t}\n\n\tconst typeName =\n\t\ttypeof value === \"object\" && value !== null\n\t\t\t? (value.constructor?.name ?? typeof value)\n\t\t\t: typeof value;\n\tthrow new TypeError(\n\t\t`Value at ${path || \"root\"} of type \"${typeName}\" is not CBOR serializable`,\n\t);\n}\n\nexport const EncodingSchema = z.enum([\"json\", \"cbor\", \"bare\"]);\n\n/**\n * Encoding used to communicate between the client & actor.\n */\nexport type Encoding = z.infer<typeof EncodingSchema>;\n\n/**\n * Helper class that helps serialize data without re-serializing for the same encoding.\n */\nexport class CachedSerializer<TBare, TJson, T = TBare> {\n\t#data: T;\n\t#cache = new Map<Encoding, OutputData>();\n\t#versionedDataHandler: VersionedDataHandler<TBare>;\n\t#version: number;\n\t#zodSchema: z.ZodType<TJson>;\n\t#toJson: (value: T) => TJson;\n\t#toBare: (value: T) => TBare;\n\n\tconstructor(\n\t\tdata: T,\n\t\tversionedDataHandler: VersionedDataHandler<TBare>,\n\t\tversion: number,\n\t\tzodSchema: z.ZodType<TJson>,\n\t\ttoJson: (value: T) => TJson,\n\t\ttoBare: (value: T) => TBare,\n\t) {\n\t\tthis.#data = data;\n\t\tthis.#versionedDataHandler = versionedDataHandler;\n\t\tthis.#version = version;\n\t\tthis.#zodSchema = zodSchema;\n\t\tthis.#toJson = toJson;\n\t\tthis.#toBare = toBare;\n\t}\n\n\tpublic get rawData(): T {\n\t\treturn this.#data;\n\t}\n\n\tpublic serialize(encoding: Encoding): OutputData {\n\t\tconst cached = this.#cache.get(encoding);\n\t\tif (cached) {\n\t\t\treturn cached;\n\t\t}\n\n\t\tconst serialized = serializeWithEncoding(\n\t\t\tencoding,\n\t\t\tthis.#data,\n\t\t\tthis.#versionedDataHandler,\n\t\t\tthis.#version,\n\t\t\tthis.#zodSchema,\n\t\t\tthis.#toJson,\n\t\t\tthis.#toBare,\n\t\t);\n\t\tthis.#cache.set(encoding, serialized);\n\t\treturn serialized;\n\t}\n}\n\nexport async function inputDataToBuffer(\n\tdata: InputData,\n): Promise<Uint8Array | string> {\n\tif (typeof data === \"string\") {\n\t\treturn data;\n\t}\n\tif (data instanceof Blob) {\n\t\treturn new Uint8Array(await data.arrayBuffer());\n\t}\n\tif (data instanceof Uint8Array) {\n\t\treturn data;\n\t}\n\tif (data instanceof ArrayBuffer || data instanceof SharedArrayBuffer) {\n\t\treturn new Uint8Array(data);\n\t}\n\tthrow new Error(\"Malformed message\");\n}\n\nfunction base64EncodeUint8Array(uint8Array: Uint8Array): string {\n\tlet binary = \"\";\n\tfor (const value of uint8Array) {\n\t\tbinary += String.fromCharCode(value);\n\t}\n\treturn btoa(binary);\n}\n\nfunction base64EncodeArrayBuffer(arrayBuffer: ArrayBuffer): string {\n\treturn base64EncodeUint8Array(new Uint8Array(arrayBuffer));\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n\tif (value === null || typeof value !== \"object\") {\n\t\treturn false;\n\t}\n\n\tconst proto = Object.getPrototypeOf(value);\n\treturn proto === Object.prototype || proto === null;\n}\n\nexport function encodeJsonCompatValue(input: JsonCompatValue): unknown {\n\t// Primitives\n\tif (input === null) {\n\t\treturn input;\n\t}\n\tif (input === undefined) {\n\t\treturn [JSON_COMPAT_UNDEFINED, 0];\n\t}\n\tif (\n\t\ttypeof input === \"string\" ||\n\t\ttypeof input === \"number\" ||\n\t\ttypeof input === \"boolean\"\n\t) {\n\t\treturn input;\n\t}\n\tif (typeof input === \"bigint\") {\n\t\treturn [JSON_COMPAT_BIGINT, input.toString()];\n\t}\n\n\t// Binary types with custom encoding\n\tif (input instanceof ArrayBuffer) {\n\t\treturn [JSON_COMPAT_ARRAY_BUFFER, base64EncodeArrayBuffer(input)];\n\t}\n\tif (input instanceof Uint8Array) {\n\t\treturn [JSON_COMPAT_UINT8_ARRAY, base64EncodeUint8Array(input)];\n\t}\n\n\t// TypedArrays pass through for cbor-x native handling\n\tif (isTypedArray(input)) {\n\t\treturn input;\n\t}\n\n\t// Date, RegExp, and Error pass through for cbor-x native handling\n\tif (\n\t\tinput instanceof Date ||\n\t\tinput instanceof RegExp ||\n\t\tinput instanceof Error\n\t) {\n\t\treturn input;\n\t}\n\n\t// Set uses custom tag encoding\n\tif (input instanceof Set) {\n\t\tconst encoded = [...input.values()].map((v) =>\n\t\t\tencodeJsonCompatValue(v as JsonCompatValue),\n\t\t);\n\t\treturn [JSON_COMPAT_SET, encoded];\n\t}\n\n\t// Map recurses into keys and values\n\tif (input instanceof Map) {\n\t\tconst encoded = new Map<unknown, unknown>();\n\t\tfor (const [k, v] of input.entries()) {\n\t\t\tencoded.set(\n\t\t\t\tencodeJsonCompatValue(k as JsonCompatValue),\n\t\t\t\tencodeJsonCompatValue(v as JsonCompatValue),\n\t\t\t);\n\t\t}\n\t\treturn encoded;\n\t}\n\n\t// Arrays\n\tif (Array.isArray(input)) {\n\t\tconst encoded = input.map((value) =>\n\t\t\tencodeJsonCompatValue(value as JsonCompatValue),\n\t\t);\n\t\tif (\n\t\t\tencoded.length === 2 &&\n\t\t\ttypeof encoded[0] === \"string\" &&\n\t\t\t(encoded[0] as string).startsWith(\"$\")\n\t\t) {\n\t\t\treturn [`$${encoded[0]}`, encoded[1]];\n\t\t}\n\t\treturn encoded;\n\t}\n\n\t// Plain objects\n\tif (isPlainObject(input)) {\n\t\tconst encoded: Record<string, unknown> = {};\n\t\tfor (const [key, value] of Object.entries(input)) {\n\t\t\tencoded[key] = encodeJsonCompatValue(value as JsonCompatValue);\n\t\t}\n\t\treturn encoded;\n\t}\n\n\t// Not serializable\n\tconst typeName =\n\t\ttypeof input === \"object\" && input !== null\n\t\t\t? ((input as object).constructor?.name ?? typeof input)\n\t\t\t: typeof input;\n\tthrow new TypeError(`Value of type \"${typeName}\" is not CBOR serializable`);\n}\n\nexport interface JsonCompatReviveOptions {\n\tcoerceSafeIntegerBigInts?: boolean;\n}\n\nexport function reviveJsonCompatValue(\n\tinput: any,\n\toptions: JsonCompatReviveOptions = {},\n): any {\n\tif (typeof input === \"bigint\") {\n\t\tif (\n\t\t\toptions.coerceSafeIntegerBigInts &&\n\t\t\tinput >= BigInt(Number.MIN_SAFE_INTEGER) &&\n\t\t\tinput <= BigInt(Number.MAX_SAFE_INTEGER)\n\t\t) {\n\t\t\treturn Number(input);\n\t\t}\n\t\treturn input;\n\t}\n\tif (input instanceof Map) {\n\t\tconst revived = new Map();\n\t\tfor (const [k, v] of input.entries()) {\n\t\t\trevived.set(\n\t\t\t\treviveJsonCompatValue(k, options),\n\t\t\t\treviveJsonCompatValue(v, options),\n\t\t\t);\n\t\t}\n\t\treturn revived;\n\t}\n\tif (Array.isArray(input)) {\n\t\tif (\n\t\t\tinput.length === 2 &&\n\t\t\ttypeof input[0] === \"string\" &&\n\t\t\tinput[0].startsWith(\"$\")\n\t\t) {\n\t\t\tif (input[0] === JSON_COMPAT_BIGINT) {\n\t\t\t\treturn BigInt(input[1]);\n\t\t\t}\n\t\t\tif (input[0] === JSON_COMPAT_ARRAY_BUFFER) {\n\t\t\t\treturn base64DecodeToArrayBuffer(input[1]);\n\t\t\t}\n\t\t\tif (input[0] === JSON_COMPAT_UINT8_ARRAY) {\n\t\t\t\treturn base64DecodeToUint8Array(input[1]);\n\t\t\t}\n\t\t\tif (input[0] === JSON_COMPAT_UNDEFINED) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\tif (input[0] === JSON_COMPAT_SET) {\n\t\t\t\tconst items = (input[1] as unknown[]).map((v) =>\n\t\t\t\t\treviveJsonCompatValue(v, options),\n\t\t\t\t);\n\t\t\t\treturn new Set(items);\n\t\t\t}\n\t\t\tif (input[0].startsWith(\"$$\")) {\n\t\t\t\treturn [\n\t\t\t\t\tinput[0].substring(1),\n\t\t\t\t\treviveJsonCompatValue(input[1], options),\n\t\t\t\t];\n\t\t\t}\n\t\t\tthrow new Error(\n\t\t\t\t`Unknown JSON encoding type: ${input[0]}. This may indicate corrupted data or a version mismatch.`,\n\t\t\t);\n\t\t}\n\t\treturn input.map((value) => reviveJsonCompatValue(value, options));\n\t}\n\tif (isPlainObject(input)) {\n\t\tconst decoded: Record<string, unknown> = {};\n\t\tfor (const [key, value] of Object.entries(input)) {\n\t\t\tdecoded[key] = reviveJsonCompatValue(value, options);\n\t\t}\n\t\treturn decoded;\n\t}\n\treturn input;\n}\n\n/** Converts data that was encoded to a string. Some formats do not support raw binary data. */\nexport function encodeDataToString(message: OutputData): string {\n\tif (typeof message === \"string\") {\n\t\treturn message;\n\t}\n\tif (message instanceof Uint8Array) {\n\t\treturn base64EncodeUint8Array(message);\n\t}\n\tassertUnreachable(message);\n}\n\nfunction base64DecodeToUint8Array(base64: string): Uint8Array {\n\tif (typeof Buffer !== \"undefined\") {\n\t\treturn new Uint8Array(Buffer.from(base64, \"base64\"));\n\t}\n\n\tconst binary = atob(base64);\n\tconst bytes = new Uint8Array(binary.length);\n\tfor (let i = 0; i < binary.length; i++) {\n\t\tbytes[i] = binary.charCodeAt(i);\n\t}\n\treturn bytes;\n}\n\nfunction base64DecodeToArrayBuffer(base64: string): ArrayBuffer {\n\treturn base64DecodeToUint8Array(base64).buffer as ArrayBuffer;\n}\n\n/** Stringifies with compat for values that BARE & CBOR supports. */\nexport function jsonStringifyCompat(\n\tinput: any,\n\tspace?: string | number,\n): string {\n\treturn JSON.stringify(\n\t\tinput,\n\t\t(_key, value) => {\n\t\t\tif (typeof value === \"bigint\") {\n\t\t\t\treturn [JSON_COMPAT_BIGINT, value.toString()];\n\t\t\t}\n\t\t\tif (value instanceof ArrayBuffer) {\n\t\t\t\treturn [\n\t\t\t\t\tJSON_COMPAT_ARRAY_BUFFER,\n\t\t\t\t\tbase64EncodeArrayBuffer(value),\n\t\t\t\t];\n\t\t\t}\n\t\t\tif (value instanceof Uint8Array) {\n\t\t\t\treturn [JSON_COMPAT_UINT8_ARRAY, base64EncodeUint8Array(value)];\n\t\t\t}\n\t\t\tif (\n\t\t\t\tArray.isArray(value) &&\n\t\t\t\tvalue.length === 2 &&\n\t\t\t\ttypeof value[0] === \"string\" &&\n\t\t\t\tvalue[0].startsWith(\"$\")\n\t\t\t) {\n\t\t\t\treturn [`$${value[0]}`, value[1]];\n\t\t\t}\n\t\t\treturn value;\n\t\t},\n\t\tspace,\n\t);\n}\n\n/** Parses JSON with compat for values that BARE & CBOR supports. */\nexport function jsonParseCompat(input: string): any {\n\treturn reviveJsonCompatValue(JSON.parse(input));\n}\n","import * as cbor from \"cbor-x\";\nimport invariant from \"invariant\";\nimport type { VersionedDataHandler } from \"vbare\";\nimport type { z } from \"zod/v4\";\nimport type { Encoding, JsonCompatValue } from \"@/common/encoding\";\nimport { assertUnreachable } from \"@/common/utils\";\nimport {\n\tencodeJsonCompatValue,\n\tjsonParseCompat,\n\tjsonStringifyCompat,\n\treviveJsonCompatValue,\n} from \"./common/encoding\";\n\nexport function uint8ArrayToBase64(uint8Array: Uint8Array): string {\n\t// Check if Buffer is available (Node.js)\n\tif (typeof Buffer !== \"undefined\") {\n\t\treturn Buffer.from(uint8Array).toString(\"base64\");\n\t}\n\n\t// Browser environment - use btoa\n\tlet binary = \"\";\n\tconst len = uint8Array.byteLength;\n\tfor (let i = 0; i < len; i++) {\n\t\tbinary += String.fromCharCode(uint8Array[i]);\n\t}\n\treturn btoa(binary);\n}\n\nexport function encodingIsBinary(encoding: Encoding): boolean {\n\tif (encoding === \"json\") {\n\t\treturn false;\n\t} else if (encoding === \"cbor\" || encoding === \"bare\") {\n\t\treturn true;\n\t} else {\n\t\tassertUnreachable(encoding);\n\t}\n}\n\nexport function contentTypeForEncoding(encoding: Encoding): string {\n\tif (encoding === \"json\") {\n\t\treturn \"application/json\";\n\t} else if (encoding === \"cbor\" || encoding === \"bare\") {\n\t\treturn \"application/octet-stream\";\n\t} else {\n\t\tassertUnreachable(encoding);\n\t}\n}\n\nexport function encodeCborCompat(value: JsonCompatValue): Uint8Array {\n\treturn cbor.encode(encodeJsonCompatValue(value));\n}\n\nexport function decodeCborCompat<T>(buffer: Uint8Array): T {\n\treturn reviveJsonCompatValue(cbor.decode(buffer)) as T;\n}\n\nexport function decodeCborJsonCompat<T>(buffer: Uint8Array): T {\n\treturn reviveJsonCompatValue(cbor.decode(buffer), {\n\t\tcoerceSafeIntegerBigInts: true,\n\t}) as T;\n}\n\nexport function wsBinaryTypeForEncoding(\n\tencoding: Encoding,\n): \"arraybuffer\" | \"blob\" {\n\tif (encoding === \"json\") {\n\t\treturn \"blob\";\n\t} else if (encoding === \"cbor\" || encoding === \"bare\") {\n\t\treturn \"arraybuffer\";\n\t} else {\n\t\tassertUnreachable(encoding);\n\t}\n}\n\nexport function serializeWithEncoding<TBare, TJson, T = TBare>(\n\tencoding: Encoding,\n\tvalue: T,\n\tversionedDataHandler: VersionedDataHandler<TBare> | undefined,\n\tversion: number | undefined,\n\tzodSchema: z.ZodType<TJson>,\n\ttoJson: (value: T) => TJson,\n\ttoBare: (value: T) => TBare,\n): Uint8Array | string {\n\tif (encoding === \"json\") {\n\t\tconst jsonValue = toJson(value);\n\t\tconst validated = zodSchema.parse(jsonValue);\n\t\treturn jsonStringifyCompat(validated);\n\t} else if (encoding === \"cbor\") {\n\t\tconst jsonValue = toJson(value);\n\t\tconst validated = zodSchema.parse(jsonValue);\n\t\treturn cbor.encode(validated);\n\t} else if (encoding === \"bare\") {\n\t\tif (!versionedDataHandler) {\n\t\t\tthrow new Error(\n\t\t\t\t\"VersionedDataHandler is required for 'bare' encoding\",\n\t\t\t);\n\t\t}\n\t\tif (version === undefined) {\n\t\t\tthrow new Error(\"version is required for 'bare' encoding\");\n\t\t}\n\t\tconst bareValue = toBare(value);\n\t\treturn versionedDataHandler.serializeWithEmbeddedVersion(\n\t\t\tbareValue,\n\t\t\tversion,\n\t\t);\n\t} else {\n\t\tassertUnreachable(encoding);\n\t}\n}\n\nexport function deserializeWithEncoding<TBare, TJson, T = TBare>(\n\tencoding: Encoding,\n\tbuffer: Uint8Array | string,\n\tversionedDataHandler: VersionedDataHandler<TBare> | undefined,\n\tzodSchema: z.ZodType<TJson>,\n\tfromJson: (value: TJson) => T,\n\tfromBare: (value: TBare) => T,\n): T {\n\tif (encoding === \"json\") {\n\t\tlet parsed: unknown;\n\t\tif (typeof buffer === \"string\") {\n\t\t\tparsed = jsonParseCompat(buffer);\n\t\t} else {\n\t\t\tconst decoder = new TextDecoder(\"utf-8\");\n\t\t\tconst jsonString = decoder.decode(buffer);\n\t\t\tparsed = jsonParseCompat(jsonString);\n\t\t}\n\t\tconst validated = zodSchema.parse(parsed);\n\t\treturn fromJson(validated);\n\t} else if (encoding === \"cbor\") {\n\t\tinvariant(\n\t\t\ttypeof buffer !== \"string\",\n\t\t\t\"buffer cannot be string for cbor encoding\",\n\t\t);\n\t\t// Decode CBOR to get JavaScript values (similar to JSON.parse)\n\t\tconst decoded = decodeCborCompat(buffer);\n\t\t// Validate with Zod schema (CBOR produces same structure as JSON)\n\t\tconst validated = zodSchema.parse(decoded);\n\t\t// CBOR decoding produces JS objects, use fromJson\n\t\treturn fromJson(validated);\n\t} else if (encoding === \"bare\") {\n\t\tinvariant(\n\t\t\ttypeof buffer !== \"string\",\n\t\t\t\"buffer cannot be string for bare encoding\",\n\t\t);\n\t\tif (!versionedDataHandler) {\n\t\t\tthrow new Error(\n\t\t\t\t\"VersionedDataHandler is required for 'bare' encoding\",\n\t\t\t);\n\t\t}\n\t\tconst bareValue =\n\t\t\tversionedDataHandler.deserializeWithEmbeddedVersion(buffer);\n\t\treturn fromBare(bareValue);\n\t} else {\n\t\tassertUnreachable(encoding);\n\t}\n}\n","import type { Context as HonoContext, Handler as HonoHandler } from \"hono\";\nimport { stringifyError } from \"@/common/utils\";\nimport pkgJson from \"../package.json\" with { type: \"json\" };\nimport { getLogger } from \"./common/log\";\nimport { assertUnreachable } from \"./common/utils\";\n\n/** @experimental */\nexport { stringifyError };\n\n/** @experimental */\nexport { assertUnreachable };\n\n/** @experimental */\nexport { jsonParseCompat, jsonStringifyCompat } from \"./common/encoding\";\n\n/**\n * Joins multiple abort signals into one.\n *\n * The returned signal aborts when the first input signal aborts.\n * Uses `AbortSignal.any(...)` when available, with a runtime fallback.\n *\n * @experimental\n */\nexport function joinSignals(\n\t...signals: Array<AbortSignal | undefined | null>\n): AbortSignal {\n\tconst validSignals = signals.filter(\n\t\t(signal): signal is AbortSignal => signal != null,\n\t);\n\n\tif (validSignals.length === 0) {\n\t\treturn new AbortController().signal;\n\t}\n\n\tif (validSignals.length === 1) {\n\t\treturn validSignals[0];\n\t}\n\n\tconst signalAny = (\n\t\tAbortSignal as typeof AbortSignal & {\n\t\t\tany?: (signals: AbortSignal[]) => AbortSignal;\n\t\t}\n\t).any;\n\tif (typeof signalAny === \"function\") {\n\t\treturn signalAny(validSignals);\n\t}\n\n\tconst controller = new AbortController();\n\tconst cleanups: Array<() => void> = [];\n\n\tconst abortWithSignal = (signal: AbortSignal) => {\n\t\tif (controller.signal.aborted) {\n\t\t\treturn;\n\t\t}\n\n\t\tfor (const cleanup of cleanups) {\n\t\t\tcleanup();\n\t\t}\n\n\t\tconst reason = (signal as AbortSignal & { reason?: unknown }).reason;\n\t\tcontroller.abort(reason);\n\t};\n\n\tfor (const signal of validSignals) {\n\t\tif (signal.aborted) {\n\t\t\tabortWithSignal(signal);\n\t\t\tbreak;\n\t\t}\n\n\t\tconst onAbort = () => abortWithSignal(signal);\n\t\tsignal.addEventListener(\"abort\", onAbort, { once: true });\n\t\tcleanups.push(() => signal.removeEventListener(\"abort\", onAbort));\n\t}\n\n\treturn controller.signal;\n}\n\n/**\n * Returns a promise that resolves after the given number of milliseconds.\n *\n * @experimental\n */\nexport function sleep(ms: number): Promise<void> {\n\treturn new Promise<void>((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Creates a fixed-rate interval tick function that can be awaited in a loop.\n *\n * @example\n * const tick = interval(100);\n * while (!c.aborted) {\n * await tick();\n * if (c.aborted) break;\n * // ... game logic\n * }\n *\n * @experimental\n */\nexport function interval(ms: number): () => Promise<void> {\n\treturn () => sleep(ms);\n}\n\nexport const VERSION = pkgJson.version;\n\nlet _userAgent: string | undefined;\n\nfunction logger() {\n\treturn getLogger(\"utils\");\n}\n\n/**\n * Builds the HTTP user agent used by this library.\n *\n * @experimental\n */\nexport function httpUserAgent(): string {\n\t// Return cached value if already initialized\n\tif (_userAgent !== undefined) {\n\t\treturn _userAgent;\n\t}\n\n\t// Library\n\tlet userAgent = `RivetKit/${VERSION}`;\n\n\t// Navigator\n\tconst navigatorObj =\n\t\ttypeof navigator !== \"undefined\" ? navigator : undefined;\n\tif (navigatorObj?.userAgent) userAgent += ` ${navigatorObj.userAgent}`;\n\n\t_userAgent = userAgent;\n\n\treturn userAgent;\n}\n\nexport type UpgradeWebSocket = (\n\tcreateEvents: (c: HonoContext) => any,\n) => HonoHandler;\n\nexport type GetUpgradeWebSocket = () => UpgradeWebSocket;\n\n/**\n * Reads an environment variable from Deno or Node runtimes.\n *\n * @experimental\n */\nexport function getEnvUniversal(key: string): string | undefined {\n\tif (typeof Deno !== \"undefined\") {\n\t\treturn Deno.env.get(key);\n\t} else if (typeof process !== \"undefined\") {\n\t\t// Do this after Deno since `process` is sometimes polyfilled\n\t\treturn process.env[key];\n\t}\n}\n\n/**\n * Traces a debug value and returns it.\n *\n * @experimental\n */\nexport function dbg<T>(x: T): T {\n\tconsole.trace(`=== DEBUG ===\\n${x}`);\n\treturn x;\n}\n\n/**\n * Converts various ArrayBuffer-like types to Uint8Array.\n * Handles ArrayBuffer, ArrayBufferView (including typed arrays), and passes through existing Uint8Array.\n *\n * @param data - The ArrayBuffer or ArrayBufferView to convert\n * @returns A Uint8Array view of the data\n *\n * @experimental\n */\nexport function toUint8Array(data: ArrayBuffer | ArrayBufferView): Uint8Array {\n\tif (data instanceof Uint8Array) {\n\t\treturn data;\n\t} else if (data instanceof ArrayBuffer) {\n\t\treturn new Uint8Array(data);\n\t} else if (ArrayBuffer.isView(data)) {\n\t\t// Handle other ArrayBufferView types (Int8Array, Uint16Array, DataView, etc.)\n\t\treturn new Uint8Array(\n\t\t\tdata.buffer.slice(\n\t\t\t\tdata.byteOffset,\n\t\t\t\tdata.byteOffset + data.byteLength,\n\t\t\t),\n\t\t);\n\t} else {\n\t\tthrow new TypeError(\"Input must be ArrayBuffer or ArrayBufferView\");\n\t}\n}\n\n// Long timeouts\n//\n// JavaScript timers use a signed 32-bit integer for delays, so values above 2^31-1 (~24.8 days)\n// are not reliable and may fire immediately or overflow.\n//\n// https://developer.mozilla.org/en-US/docs/Web/API/Window/setTimeout#maximum_delay_value\nconst TIMEOUT_MAX = 2147483647; // 2^31-1\n\nexport type LongTimeoutHandle = { abort: () => void };\n\n/**\n * Polyfill for Promise.withResolvers().\n *\n * This is specifically for Cloudflare Workers. Their implementation of Promise.withResolvers does not work correctly.\n *\n * @experimental\n */\nexport function promiseWithResolvers<T>(onReject: (reason?: any) => void): {\n\tpromise: Promise<T>;\n\tresolve: (value: T | PromiseLike<T>) => void;\n\treject: (reason?: any) => void;\n} {\n\tlet resolve!: (value: T | PromiseLike<T>) => void;\n\tlet reject!: (reason?: any) => void;\n\tconst promise = new Promise<T>((res, rej) => {\n\t\tresolve = res;\n\t\treject = rej;\n\t});\n\tpromise.catch(onReject);\n\treturn { promise, resolve, reject };\n}\n\n/**\n * Sets a timeout that supports delays larger than the JavaScript timer limit.\n *\n * @experimental\n */\nexport function setLongTimeout(\n\tlistener: () => void,\n\tafter: number,\n): LongTimeoutHandle {\n\tlet timeout: ReturnType<typeof setTimeout> | undefined;\n\n\tfunction start(remaining: number) {\n\t\tif (remaining <= TIMEOUT_MAX) {\n\t\t\ttimeout = setTimeout(listener, remaining);\n\t\t} else {\n\t\t\ttimeout = setTimeout(() => {\n\t\t\t\tstart(remaining - TIMEOUT_MAX);\n\t\t\t}, TIMEOUT_MAX);\n\t\t}\n\t}\n\n\tstart(after);\n\n\treturn {\n\t\tabort: () => {\n\t\t\tif (timeout !== undefined) clearTimeout(timeout);\n\t\t},\n\t};\n}\n\n/**\n * A tiny utility that coalesces/enqueues async operations so only the latest\n * queued task runs per cycle, while callers receive a promise that resolves\n * when the task for the cycle they joined has completed.\n */\nexport class SinglePromiseQueue {\n\t/** Next operation to execute in the queue. If attempting to enqueue another op, it will override the existing op. */\n\t#queuedOp?: () => Promise<void>;\n\n\t/** The currently running promise of #drainLoop. Do not await this, instead await `pending` to await the current cycle. */\n\trunningDrainLoop?: Promise<void>;\n\n\t/** Pending resolver fro the currently queued entry. */\n\t#pending?: ReturnType<typeof promiseWithResolvers<void>>;\n\n\t/** Queue the next operation and return a promise that resolves when it flushes. */\n\tenqueue(op: () => Promise<void>): Promise<void> {\n\t\t// Replace any previously queued operation with the latest one\n\t\tthis.#queuedOp = op;\n\n\t\t// Ensure a shared resolver exists for all callers in this cycle\n\t\tif (!this.#pending) {\n\t\t\tthis.#pending = promiseWithResolvers<void>((reason) =>\n\t\t\t\tlogger().warn({\n\t\t\t\t\tmsg: \"unhandled single promise queue rejection\",\n\t\t\t\t\treason,\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\n\t\tconst waitForThisCycle = this.#pending.promise;\n\n\t\t// Start runner if not already running\n\t\tif (!this.runningDrainLoop) {\n\t\t\tthis.runningDrainLoop = this.#drainLoop();\n\t\t}\n\n\t\treturn waitForThisCycle;\n\t}\n\n\t/** Drain queued operations sequentially until there is nothing left. */\n\tasync #drainLoop(): Promise<void> {\n\t\ttry {\n\t\t\twhile (this.#queuedOp) {\n\t\t\t\t// Capture current cycle resolver then reset for the next cycle\n\t\t\t\tconst resolver = this.#pending;\n\t\t\t\tthis.#pending = undefined;\n\n\t\t\t\t// Capture and clear the currently queued operation\n\t\t\t\tconst op = this.#queuedOp;\n\t\t\t\tthis.#queuedOp = undefined;\n\n\t\t\t\ttry {\n\t\t\t\t\tawait op();\n\t\t\t\t\t// Notify all waiters for this cycle\n\t\t\t\t\tresolver?.resolve();\n\t\t\t\t} catch (err) {\n\t\t\t\t\tlogger().error({\n\t\t\t\t\t\tmsg: \"error in SinglePromiseQueue drain loop\",\n\t\t\t\t\t\terror: stringifyError(err),\n\t\t\t\t\t});\n\t\t\t\t\t// Reject all waiters for this cycle\n\t\t\t\t\tresolver?.reject(err);\n\t\t\t\t}\n\t\t\t}\n\t\t} finally {\n\t\t\tthis.runningDrainLoop = undefined;\n\t\t}\n\t}\n}\n\n/**\n * Converts a Buffer or Uint8Array into an ArrayBuffer view.\n *\n * @experimental\n */\nexport function bufferToArrayBuffer(buf: Buffer | Uint8Array): ArrayBuffer {\n\treturn buf.buffer.slice(\n\t\tbuf.byteOffset,\n\t\tbuf.byteOffset + buf.byteLength,\n\t) as ArrayBuffer;\n}\n\n/**\n * Properly combines a base URL endpoint with a path, preserving any base path in the endpoint.\n *\n * @example\n * combineUrlPath(\"http://localhost:8787/rivet\", \"/actors/action\")\n * // Returns: \"http://localhost:8787/rivet/actors/action\"\n *\n * @example\n * combineUrlPath(\"http://localhost:8787/rivet\", \"/actors?type=foo\", { namespace: \"test\" })\n * // Returns: \"http://localhost:8787/rivet/actors?type=foo&namespace=test\"\n *\n * @param endpoint The base URL endpoint that may contain a path component\n * @param path The path to append to the endpoint (may include query parameters)\n * @param queryParams Optional additional query parameters to append\n * @returns The properly combined URL string\n *\n * @experimental\n */\nexport function combineUrlPath(\n\tendpoint: string,\n\tpath: string,\n\tqueryParams?: Record<string, string | undefined>,\n): string {\n\tconst baseUrl = new URL(endpoint);\n\n\t// Extract path and query from the provided path\n\tconst pathParts = path.split(\"?\");\n\tconst pathOnly = pathParts[0];\n\tconst existingQuery = pathParts[1] || \"\";\n\n\t// Remove trailing slash from base path and ensure path starts with /\n\tconst basePath = baseUrl.pathname.replace(/\\/$/, \"\");\n\tconst cleanPath = pathOnly.startsWith(\"/\") ? pathOnly : `/${pathOnly}`;\n\t// Combine paths and remove any double slashes\n\tconst fullPath = (basePath + cleanPath).replace(/\\/\\//g, \"/\");\n\n\t// Build query string\n\tconst queryParts: string[] = [];\n\tif (existingQuery) {\n\t\tqueryParts.push(existingQuery);\n\t}\n\tif (queryParams) {\n\t\tfor (const [key, value] of Object.entries(queryParams)) {\n\t\t\tif (value !== undefined) {\n\t\t\t\tqueryParts.push(\n\t\t\t\t\t`${encodeURIComponent(key)}=${encodeURIComponent(value)}`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tconst fullQuery = queryParts.length > 0 ? `?${queryParts.join(\"&\")}` : \"\";\n\treturn `${baseUrl.protocol}//${baseUrl.host}${fullPath}${fullQuery}`;\n}\n\n/**\n * Compares two ArrayBuffer values by byte content.\n *\n * @experimental\n */\nexport function arrayBuffersEqual(\n\tbuf1: ArrayBuffer,\n\tbuf2: ArrayBuffer,\n): boolean {\n\tif (buf1.byteLength !== buf2.byteLength) return false;\n\n\tconst view1 = new Uint8Array(buf1);\n\tconst view2 = new Uint8Array(buf2);\n\n\tfor (let i = 0; i < view1.length; i++) {\n\t\tif (view1[i] !== view2[i]) return false;\n\t}\n\treturn true;\n}\n\nexport const EXTRA_ERROR_LOG = {\n\tissues: \"https://github.com/rivet-dev/rivet/issues\",\n\tsupport: \"https://rivet.dev/discord\",\n\tversion: VERSION,\n};\n\nexport type Runtime = \"deno\" | \"bun\" | \"node\";\n\n/**\n * Detects the current JavaScript runtime from the user agent.\n *\n * @experimental\n */\nexport function detectRuntime(): Runtime {\n\tconst userAgent =\n\t\ttypeof navigator !== \"undefined\" ? navigator.userAgent : \"\";\n\tif (userAgent.includes(\"Deno\")) {\n\t\treturn \"deno\";\n\t}\n\tif (userAgent.includes(\"Bun\")) {\n\t\treturn \"bun\";\n\t}\n\treturn \"node\";\n}\n\nexport type DeepReadonly<T> = {\n\treadonly [K in keyof T]: T[K] extends object ? DeepReadonly<T[K]> : T[K];\n};\n\nexport type DeepMutable<T> = {\n\t-readonly [K in keyof T]: T[K] extends object ? DeepMutable<T[K]> : T[K];\n};\n"],"mappings":"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","names":["logger","z","z"]}
|