rivetkit 2.0.3 → 2.0.4
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/README.md +11 -0
- package/dist/schemas/actor-persist/v1.ts +21 -24
- package/dist/schemas/client-protocol/v1.ts +6 -0
- package/dist/tsup/actor/errors.cjs +10 -2
- package/dist/tsup/actor/errors.cjs.map +1 -1
- package/dist/tsup/actor/errors.d.cts +17 -4
- package/dist/tsup/actor/errors.d.ts +17 -4
- package/dist/tsup/actor/errors.js +11 -3
- package/dist/tsup/{chunk-6PDXBYI5.js → chunk-3F2YSRJL.js} +8 -23
- package/dist/tsup/chunk-3F2YSRJL.js.map +1 -0
- package/dist/tsup/chunk-4CXBCT26.cjs +250 -0
- package/dist/tsup/chunk-4CXBCT26.cjs.map +1 -0
- package/dist/tsup/chunk-4R73YDN3.cjs +20 -0
- package/dist/tsup/chunk-4R73YDN3.cjs.map +1 -0
- package/dist/tsup/{chunk-OGAPU3UG.cjs → chunk-6LJT3QRL.cjs} +39 -25
- package/dist/tsup/chunk-6LJT3QRL.cjs.map +1 -0
- package/dist/tsup/{chunk-6WKQDDUD.cjs → chunk-GICQ3YCU.cjs} +143 -141
- package/dist/tsup/chunk-GICQ3YCU.cjs.map +1 -0
- package/dist/tsup/{chunk-FLMTTN27.js → chunk-H26RP6GD.js} +15 -8
- package/dist/tsup/chunk-H26RP6GD.js.map +1 -0
- package/dist/tsup/chunk-HI3HWJRC.js +20 -0
- package/dist/tsup/chunk-HI3HWJRC.js.map +1 -0
- package/dist/tsup/{chunk-4NSUQZ2H.js → chunk-HLLF4B4Q.js} +116 -114
- package/dist/tsup/chunk-HLLF4B4Q.js.map +1 -0
- package/dist/tsup/{chunk-FCCPJNMA.cjs → chunk-IH6CKNDW.cjs} +12 -27
- package/dist/tsup/chunk-IH6CKNDW.cjs.map +1 -0
- package/dist/tsup/chunk-LV2S3OU3.js +250 -0
- package/dist/tsup/chunk-LV2S3OU3.js.map +1 -0
- package/dist/tsup/{chunk-R2OPSKIV.cjs → chunk-LWNKVZG5.cjs} +20 -13
- package/dist/tsup/chunk-LWNKVZG5.cjs.map +1 -0
- package/dist/tsup/{chunk-INGJP237.js → chunk-NFU2BBT5.js} +102 -43
- package/dist/tsup/chunk-NFU2BBT5.js.map +1 -0
- package/dist/tsup/{chunk-3H7O2A7I.js → chunk-PQY7KKTL.js} +33 -19
- package/dist/tsup/chunk-PQY7KKTL.js.map +1 -0
- package/dist/tsup/{chunk-PO4VLDWA.js → chunk-QK72M5JB.js} +3 -5
- package/dist/tsup/chunk-QK72M5JB.js.map +1 -0
- package/dist/tsup/{chunk-TZJKSBUQ.cjs → chunk-QNNXFOQV.cjs} +3 -5
- package/dist/tsup/chunk-QNNXFOQV.cjs.map +1 -0
- package/dist/tsup/{chunk-GIR3AFFI.cjs → chunk-SBHHJ6QS.cjs} +102 -43
- package/dist/tsup/chunk-SBHHJ6QS.cjs.map +1 -0
- package/dist/tsup/chunk-TQ62L3X7.js +325 -0
- package/dist/tsup/chunk-TQ62L3X7.js.map +1 -0
- package/dist/tsup/chunk-VO7ZRVVD.cjs +6293 -0
- package/dist/tsup/chunk-VO7ZRVVD.cjs.map +1 -0
- package/dist/tsup/chunk-WHBPJNGW.cjs +325 -0
- package/dist/tsup/chunk-WHBPJNGW.cjs.map +1 -0
- package/dist/tsup/chunk-XJQHKJ4P.js +6293 -0
- package/dist/tsup/chunk-XJQHKJ4P.js.map +1 -0
- package/dist/tsup/client/mod.cjs +10 -10
- package/dist/tsup/client/mod.d.cts +7 -13
- package/dist/tsup/client/mod.d.ts +7 -13
- package/dist/tsup/client/mod.js +9 -9
- package/dist/tsup/common/log.cjs +12 -4
- package/dist/tsup/common/log.cjs.map +1 -1
- package/dist/tsup/common/log.d.cts +23 -17
- package/dist/tsup/common/log.d.ts +23 -17
- package/dist/tsup/common/log.js +15 -7
- package/dist/tsup/common/websocket.cjs +5 -5
- package/dist/tsup/common/websocket.js +4 -4
- package/dist/tsup/{common-CpqORuCq.d.cts → common-CXCe7s6i.d.cts} +2 -2
- package/dist/tsup/{common-CpqORuCq.d.ts → common-CXCe7s6i.d.ts} +2 -2
- package/dist/tsup/{connection-BwUMoe6n.d.ts → connection-BI-6UIBJ.d.ts} +196 -226
- package/dist/tsup/{connection-BR_Ve4ku.d.cts → connection-Dyd4NLGW.d.cts} +196 -226
- package/dist/tsup/driver-helpers/mod.cjs +6 -9
- package/dist/tsup/driver-helpers/mod.cjs.map +1 -1
- package/dist/tsup/driver-helpers/mod.d.cts +5 -6
- package/dist/tsup/driver-helpers/mod.d.ts +5 -6
- package/dist/tsup/driver-helpers/mod.js +6 -9
- package/dist/tsup/driver-test-suite/mod.cjs +155 -1363
- package/dist/tsup/driver-test-suite/mod.cjs.map +1 -1
- package/dist/tsup/driver-test-suite/mod.d.cts +11 -5
- package/dist/tsup/driver-test-suite/mod.d.ts +11 -5
- package/dist/tsup/driver-test-suite/mod.js +876 -2084
- package/dist/tsup/driver-test-suite/mod.js.map +1 -1
- package/dist/tsup/inspector/mod.cjs +6 -8
- package/dist/tsup/inspector/mod.cjs.map +1 -1
- package/dist/tsup/inspector/mod.d.cts +3 -3
- package/dist/tsup/inspector/mod.d.ts +3 -3
- package/dist/tsup/inspector/mod.js +8 -10
- package/dist/tsup/mod.cjs +9 -15
- package/dist/tsup/mod.cjs.map +1 -1
- package/dist/tsup/mod.d.cts +47 -42
- package/dist/tsup/mod.d.ts +47 -42
- package/dist/tsup/mod.js +10 -16
- package/dist/tsup/{router-endpoints-DAbqVFx2.d.ts → router-endpoints-BTe_Rsdn.d.cts} +2 -3
- package/dist/tsup/{router-endpoints-AYkXG8Tl.d.cts → router-endpoints-CBSrKHmo.d.ts} +2 -3
- package/dist/tsup/test/mod.cjs +10 -14
- package/dist/tsup/test/mod.cjs.map +1 -1
- package/dist/tsup/test/mod.d.cts +4 -5
- package/dist/tsup/test/mod.d.ts +4 -5
- package/dist/tsup/test/mod.js +9 -13
- package/dist/tsup/{utils-CT0cv4jd.d.ts → utils-fwx3o3K9.d.cts} +1 -0
- package/dist/tsup/{utils-CT0cv4jd.d.cts → utils-fwx3o3K9.d.ts} +1 -0
- 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/package.json +4 -4
- package/src/actor/action.ts +1 -5
- package/src/actor/config.ts +27 -295
- package/src/actor/connection.ts +9 -12
- package/src/actor/context.ts +1 -4
- package/src/actor/definition.ts +7 -11
- package/src/actor/errors.ts +97 -35
- package/src/actor/generic-conn-driver.ts +28 -16
- package/src/actor/instance.ts +177 -133
- package/src/actor/log.ts +4 -13
- package/src/actor/mod.ts +0 -5
- package/src/actor/protocol/old.ts +42 -26
- package/src/actor/protocol/serde.ts +1 -1
- package/src/actor/router-endpoints.ts +41 -38
- package/src/actor/router.ts +20 -18
- package/src/actor/unstable-react.ts +1 -1
- package/src/actor/utils.ts +6 -2
- package/src/client/actor-common.ts +1 -1
- package/src/client/actor-conn.ts +152 -91
- package/src/client/actor-handle.ts +85 -25
- package/src/client/actor-query.ts +65 -0
- package/src/client/client.ts +29 -98
- package/src/client/config.ts +44 -0
- package/src/client/errors.ts +1 -0
- package/src/client/log.ts +2 -4
- package/src/client/mod.ts +16 -12
- package/src/client/raw-utils.ts +82 -25
- package/src/client/utils.ts +5 -3
- package/src/common/fake-event-source.ts +10 -9
- package/src/common/inline-websocket-adapter2.ts +39 -30
- package/src/common/log.ts +176 -101
- package/src/common/logfmt.ts +21 -30
- package/src/common/router.ts +12 -19
- package/src/common/utils.ts +27 -13
- package/src/common/websocket.ts +0 -1
- package/src/driver-helpers/mod.ts +1 -1
- package/src/driver-test-suite/log.ts +1 -3
- package/src/driver-test-suite/mod.ts +86 -60
- package/src/driver-test-suite/tests/actor-handle.ts +33 -0
- package/src/driver-test-suite/tests/manager-driver.ts +5 -3
- package/src/driver-test-suite/tests/raw-http-direct-registry.ts +227 -226
- package/src/driver-test-suite/tests/raw-websocket-direct-registry.ts +393 -392
- package/src/driver-test-suite/tests/request-access.ts +112 -126
- package/src/driver-test-suite/utils.ts +13 -10
- package/src/drivers/default.ts +7 -4
- package/src/drivers/engine/actor-driver.ts +22 -13
- package/src/drivers/engine/config.ts +2 -10
- package/src/drivers/engine/kv.ts +1 -1
- package/src/drivers/engine/log.ts +1 -3
- package/src/drivers/engine/mod.ts +2 -3
- package/src/drivers/file-system/actor.ts +1 -1
- package/src/drivers/file-system/global-state.ts +33 -20
- package/src/drivers/file-system/log.ts +1 -3
- package/src/drivers/file-system/manager.ts +31 -8
- package/src/inspector/config.ts +9 -4
- package/src/inspector/log.ts +1 -1
- package/src/inspector/manager.ts +2 -2
- package/src/inspector/utils.ts +1 -1
- package/src/manager/driver.ts +10 -2
- package/src/manager/hono-websocket-adapter.ts +21 -12
- package/src/manager/log.ts +2 -4
- package/src/manager/mod.ts +1 -1
- package/src/manager/router.ts +277 -1657
- package/src/manager-api/routes/actors-create.ts +16 -0
- package/src/manager-api/routes/actors-delete.ts +4 -0
- package/src/manager-api/routes/actors-get-by-id.ts +7 -0
- package/src/manager-api/routes/actors-get-or-create-by-id.ts +29 -0
- package/src/manager-api/routes/actors-get.ts +7 -0
- package/src/manager-api/routes/common.ts +18 -0
- package/src/mod.ts +0 -2
- package/src/registry/config.ts +1 -1
- package/src/registry/log.ts +2 -4
- package/src/registry/mod.ts +57 -24
- package/src/registry/run-config.ts +31 -33
- package/src/registry/serve.ts +4 -5
- package/src/remote-manager-driver/actor-http-client.ts +72 -0
- package/src/remote-manager-driver/actor-websocket-client.ts +63 -0
- package/src/remote-manager-driver/api-endpoints.ts +79 -0
- package/src/remote-manager-driver/api-utils.ts +43 -0
- package/src/remote-manager-driver/log.ts +5 -0
- package/src/remote-manager-driver/mod.ts +274 -0
- package/src/{drivers/engine → remote-manager-driver}/ws-proxy.ts +24 -14
- package/src/serde.ts +8 -2
- package/src/test/log.ts +1 -3
- package/src/test/mod.ts +17 -16
- package/dist/tsup/chunk-2CRLFV6Z.cjs +0 -202
- package/dist/tsup/chunk-2CRLFV6Z.cjs.map +0 -1
- package/dist/tsup/chunk-3H7O2A7I.js.map +0 -1
- package/dist/tsup/chunk-42I3OZ3Q.js +0 -15
- package/dist/tsup/chunk-42I3OZ3Q.js.map +0 -1
- package/dist/tsup/chunk-4NSUQZ2H.js.map +0 -1
- package/dist/tsup/chunk-6PDXBYI5.js.map +0 -1
- package/dist/tsup/chunk-6WKQDDUD.cjs.map +0 -1
- package/dist/tsup/chunk-CTBOSFUH.cjs +0 -116
- package/dist/tsup/chunk-CTBOSFUH.cjs.map +0 -1
- package/dist/tsup/chunk-EGVZZFE2.js +0 -2857
- package/dist/tsup/chunk-EGVZZFE2.js.map +0 -1
- package/dist/tsup/chunk-FCCPJNMA.cjs.map +0 -1
- package/dist/tsup/chunk-FLMTTN27.js.map +0 -1
- package/dist/tsup/chunk-GIR3AFFI.cjs.map +0 -1
- package/dist/tsup/chunk-INGJP237.js.map +0 -1
- package/dist/tsup/chunk-KJCJLKRM.js +0 -116
- package/dist/tsup/chunk-KJCJLKRM.js.map +0 -1
- package/dist/tsup/chunk-KUPQZYUQ.cjs +0 -15
- package/dist/tsup/chunk-KUPQZYUQ.cjs.map +0 -1
- package/dist/tsup/chunk-O2MBYIXO.cjs +0 -2857
- package/dist/tsup/chunk-O2MBYIXO.cjs.map +0 -1
- package/dist/tsup/chunk-OGAPU3UG.cjs.map +0 -1
- package/dist/tsup/chunk-OV6AYD4S.js +0 -4406
- package/dist/tsup/chunk-OV6AYD4S.js.map +0 -1
- package/dist/tsup/chunk-PO4VLDWA.js.map +0 -1
- package/dist/tsup/chunk-R2OPSKIV.cjs.map +0 -1
- package/dist/tsup/chunk-TZJKSBUQ.cjs.map +0 -1
- package/dist/tsup/chunk-UBUC5C3G.cjs +0 -189
- package/dist/tsup/chunk-UBUC5C3G.cjs.map +0 -1
- package/dist/tsup/chunk-UIM22YJL.cjs +0 -4406
- package/dist/tsup/chunk-UIM22YJL.cjs.map +0 -1
- package/dist/tsup/chunk-URVFQMYI.cjs +0 -230
- package/dist/tsup/chunk-URVFQMYI.cjs.map +0 -1
- package/dist/tsup/chunk-UVUPOS46.js +0 -230
- package/dist/tsup/chunk-UVUPOS46.js.map +0 -1
- package/dist/tsup/chunk-VRRHBNJC.js +0 -189
- package/dist/tsup/chunk-VRRHBNJC.js.map +0 -1
- package/dist/tsup/chunk-XFSS33EQ.js +0 -202
- package/dist/tsup/chunk-XFSS33EQ.js.map +0 -1
- package/src/client/http-client-driver.ts +0 -326
- package/src/driver-test-suite/test-inline-client-driver.ts +0 -402
- package/src/driver-test-suite/tests/actor-auth.ts +0 -591
- package/src/drivers/engine/api-endpoints.ts +0 -128
- package/src/drivers/engine/api-utils.ts +0 -70
- package/src/drivers/engine/manager-driver.ts +0 -391
- package/src/inline-client-driver/log.ts +0 -7
- package/src/inline-client-driver/mod.ts +0 -385
- package/src/manager/auth.ts +0 -121
- /package/src/{drivers/engine → actor}/keys.test.ts +0 -0
- /package/src/{drivers/engine → actor}/keys.ts +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/nathan/rivetkit/packages/rivetkit/dist/tsup/chunk-2CRLFV6Z.cjs","../../src/common/log-levels.ts","../../src/common/logfmt.ts","../../src/common/log.ts"],"names":[],"mappings":"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","file":"/Users/nathan/rivetkit/packages/rivetkit/dist/tsup/chunk-2CRLFV6Z.cjs","sourcesContent":[null,"export type LogLevel =\n\t| \"TRACE\"\n\t| \"DEBUG\"\n\t| \"INFO\"\n\t| \"WARN\"\n\t| \"ERROR\"\n\t| \"CRITICAL\";\n\nexport const LogLevels: Record<LogLevel, LevelIndex> = {\n\tTRACE: 0,\n\tDEBUG: 1,\n\tINFO: 2,\n\tWARN: 3,\n\tERROR: 4,\n\tCRITICAL: 5,\n} as const;\n\nexport const LevelNameMap: Record<number, LogLevel> = {\n\t0: \"TRACE\",\n\t1: \"DEBUG\",\n\t2: \"INFO\",\n\t3: \"WARN\",\n\t4: \"ERROR\",\n\t5: \"CRITICAL\",\n};\n\nexport type LevelIndex = number;\n","import { type LogLevel, LogLevels } from \"./log-levels\";\n\nexport type LogEntry = [string, LogValue];\nexport type LogValue = string | number | bigint | boolean | null | undefined;\n\nconst LOG_LEVEL_COLORS: Record<number, string> = {\n\t[LogLevels.CRITICAL]: \"\\x1b[31m\", // Red\n\t[LogLevels.ERROR]: \"\\x1b[31m\", // Red\n\t[LogLevels.WARN]: \"\\x1b[33m\", // Yellow\n\t[LogLevels.INFO]: \"\\x1b[32m\", // Green\n\t[LogLevels.DEBUG]: \"\\x1b[36m\", // Cyan\n\t[LogLevels.TRACE]: \"\\x1b[36m\", // Cyan\n};\n\nconst RESET_COLOR = \"\\x1b[0m\";\n\n/**\n * Serializes logfmt line using orderer parameters.\n *\n * We use varargs because it's ordered & it has less overhead than an object.\n *\n * ## Styling Methodology\n *\n * The three things you need to know for every log line is the level, the\n * message, and who called it. These properties are highlighted in different colros\n * and sorted in th eorder that you usually read them.\n *\n * Once you've found a log line you care about, then you want to find the\n * property you need to see. The property names are bolded and the default color\n * while the rest of the data is dim. This lets you scan to find the property\n * name quickly then look closer to read the data associated with the\n * property.\n */\nexport function stringify(...data: LogEntry[]) {\n\tlet line = \"\";\n\n\tfor (let i = 0; i < data.length; i++) {\n\t\tconst [key, valueRaw] = data[i];\n\n\t\tlet isNull = false;\n\t\tlet valueString: string;\n\t\tif (valueRaw == null) {\n\t\t\tisNull = true;\n\t\t\tvalueString = \"\";\n\t\t} else {\n\t\t\tvalueString = valueRaw.toString();\n\t\t}\n\n\t\t// Clip value unless specifically the error message\n\t\tif (valueString.length > 512 && key !== \"msg\" && key !== \"error\")\n\t\t\tvalueString = `${valueString.slice(0, 512)}...`;\n\n\t\tconst needsQuoting =\n\t\t\tvalueString.indexOf(\" \") > -1 || valueString.indexOf(\"=\") > -1;\n\t\tconst needsEscaping =\n\t\t\tvalueString.indexOf('\"') > -1 || valueString.indexOf(\"\\\\\") > -1;\n\n\t\tvalueString = valueString.replace(/\\n/g, \"\\\\n\");\n\t\tif (needsEscaping) valueString = valueString.replace(/[\"\\\\]/g, \"\\\\$&\");\n\t\tif (needsQuoting || needsEscaping) valueString = `\"${valueString}\"`;\n\t\tif (valueString === \"\" && !isNull) valueString = '\"\"';\n\n\t\tif (LOGGER_CONFIG.enableColor) {\n\t\t\t// With color\n\n\t\t\t// Special message colors\n\t\t\tlet color = \"\\x1b[2m\";\n\t\t\tif (key === \"level\") {\n\t\t\t\tconst level = LogLevels[valueString as LogLevel];\n\t\t\t\tconst levelColor = LOG_LEVEL_COLORS[level];\n\t\t\t\tif (levelColor) {\n\t\t\t\t\tcolor = levelColor;\n\t\t\t\t}\n\t\t\t} else if (key === \"msg\") {\n\t\t\t\tcolor = \"\\x1b[32m\";\n\t\t\t} else if (key === \"trace\") {\n\t\t\t\tcolor = \"\\x1b[34m\";\n\t\t\t}\n\n\t\t\t// Format line\n\t\t\tline += `\\x1b[0m\\x1b[1m${key}\\x1b[0m\\x1b[2m=\\x1b[0m${color}${valueString}${RESET_COLOR}`;\n\t\t} else {\n\t\t\t// No color\n\t\t\tline += `${key}=${valueString}`;\n\t\t}\n\n\t\tif (i !== data.length - 1) {\n\t\t\tline += \" \";\n\t\t}\n\t}\n\n\treturn line;\n}\n\nexport function formatTimestamp(date: Date): string {\n\tconst year = date.getUTCFullYear();\n\tconst month = String(date.getUTCMonth() + 1).padStart(2, \"0\");\n\tconst day = String(date.getUTCDate()).padStart(2, \"0\");\n\tconst hours = String(date.getUTCHours()).padStart(2, \"0\");\n\tconst minutes = String(date.getUTCMinutes()).padStart(2, \"0\");\n\tconst seconds = String(date.getUTCSeconds()).padStart(2, \"0\");\n\tconst milliseconds = String(date.getUTCMilliseconds()).padStart(3, \"0\");\n\n\treturn `${year}-${month}-${day}T${hours}:${minutes}:${seconds}.${milliseconds}Z`;\n}\n\nexport function castToLogValue(v: unknown): LogValue {\n\tif (\n\t\ttypeof v === \"string\" ||\n\t\ttypeof v === \"number\" ||\n\t\ttypeof v === \"bigint\" ||\n\t\ttypeof v === \"boolean\" ||\n\t\tv === null ||\n\t\tv === undefined\n\t) {\n\t\treturn v;\n\t}\n\tif (v instanceof Error) {\n\t\t//args.push(...errorToLogEntries(k, v));\n\t\treturn String(v);\n\t}\n\ttry {\n\t\treturn JSON.stringify(v);\n\t} catch {\n\t\treturn \"[cannot stringify]\";\n\t}\n}\n\n// MARK: Config\ninterface GlobalLoggerConfig {\n\tenableColor: boolean;\n\tenableSpreadObject: boolean;\n\tenableErrorStack: boolean;\n}\n\nexport const LOGGER_CONFIG: GlobalLoggerConfig = {\n\tenableColor: false,\n\tenableSpreadObject: false,\n\tenableErrorStack: false,\n};\n\n// MARK: Utils\n/**\n * Converts an object in to an easier to read KV of entries.\n */\nexport function spreadObjectToLogEntries(\n\tbase: string,\n\tdata: unknown,\n): LogEntry[] {\n\tif (\n\t\tLOGGER_CONFIG.enableSpreadObject &&\n\t\ttypeof data === \"object\" &&\n\t\t!Array.isArray(data) &&\n\t\tdata !== null &&\n\t\tObject.keys(data).length !== 0 &&\n\t\tObject.keys(data).length < 16\n\t) {\n\t\tconst logData: LogEntry[] = [];\n\t\tfor (const key in data) {\n\t\t\t// logData.push([`${base}.${key}`, JSON.stringify((data as any)[key])]);\n\n\t\t\tlogData.push(\n\t\t\t\t...spreadObjectToLogEntries(\n\t\t\t\t\t`${base}.${key}`,\n\t\t\t\t\t// biome-ignore lint/suspicious/noExplicitAny: FIXME\n\t\t\t\t\t(data as any)[key],\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t\treturn logData;\n\t}\n\n\treturn [[base, JSON.stringify(data)]];\n}\n\nexport function errorToLogEntries(base: string, error: unknown): LogEntry[] {\n\tif (error instanceof Error) {\n\t\treturn [\n\t\t\t//[`${base}.name`, error.name],\n\t\t\t[`${base}.message`, error.message],\n\t\t\t...(LOGGER_CONFIG.enableErrorStack && error.stack\n\t\t\t\t? [[`${base}.stack`, formatStackTrace(error.stack)] as LogEntry]\n\t\t\t\t: []),\n\t\t\t...(error.cause ? errorToLogEntries(`${base}.cause`, error.cause) : []),\n\t\t];\n\t}\n\treturn [[base, `${error}`]];\n}\n\n// export function errorToLogEntries(base: string, error: unknown): LogEntry[] {\n// \tif (error instanceof RuntimeError) {\n// \t\treturn [\n// \t\t\t[`${base}.code`, error.code],\n// \t\t\t[`${base}.description`, error.errorConfig?.description],\n// \t\t\t[`${base}.module`, error.moduleName],\n// \t\t\t...(error.trace ? [[`${base}.trace`, stringifyTrace(error.trace)] as LogEntry] : []),\n// \t\t\t...(LOGGER_CONFIG.enableErrorStack && error.stack\n// \t\t\t\t? [[`${base}.stack`, formatStackTrace(error.stack)] as LogEntry]\n// \t\t\t\t: []),\n// \t\t\t...(error.meta ? [[`${base}.meta`, JSON.stringify(error.meta)] as LogEntry] : []),\n// \t\t\t...(error.cause ? errorToLogEntries(`${base}.cause`, error.cause) : []),\n// \t\t];\n// \t} else if (error instanceof Error) {\n// \t\treturn [\n// \t\t\t[`${base}.name`, error.name],\n// \t\t\t[`${base}.message`, error.message],\n// \t\t\t...(LOGGER_CONFIG.enableErrorStack && error.stack\n// \t\t\t\t? [[`${base}.stack`, formatStackTrace(error.stack)] as LogEntry]\n// \t\t\t\t: []),\n// \t\t\t...(error.cause ? errorToLogEntries(`${base}.cause`, error.cause) : []),\n// \t\t];\n// \t} else {\n// \t\treturn [\n// \t\t\t[base, `${error}`],\n// \t\t];\n// \t}\n// }\n\n/**\n * Formats a JS stack trace in to a legible one-liner.\n */\nfunction formatStackTrace(stackTrace: string): string {\n\tconst regex = /at (.+?)$/gm;\n\tconst matches = [...stackTrace.matchAll(regex)];\n\t// Reverse array since the stack goes from top level -> bottom level\n\tmatches.reverse();\n\treturn matches.map((match) => match[1].trim()).join(\" > \");\n}\n","import { getEnvUniversal } from \"@/utils\";\nimport {\n\ttype LevelIndex,\n\tLevelNameMap,\n\ttype LogLevel,\n\tLogLevels,\n} from \"./log-levels\";\nimport {\n\tcastToLogValue,\n\tformatTimestamp,\n\ttype LogEntry,\n\tstringify,\n} from \"./logfmt\";\n\ninterface LogRecord {\n\targs: unknown[];\n\tdatetime: Date;\n\tlevel: number;\n\tlevelName: string;\n\tloggerName: string;\n\tmsg: string;\n}\n\nexport class Logger {\n\tname: string;\n\tlevel: LogLevel;\n\n\tconstructor(name: string, level: LogLevel) {\n\t\tthis.name = name;\n\t\tthis.level = level;\n\t}\n\n\tlog(level: LevelIndex, message: string, ...args: unknown[]): void {\n\t\tconst record: LogRecord = {\n\t\t\tmsg: message,\n\t\t\targs,\n\t\t\tlevel,\n\t\t\tloggerName: this.name,\n\t\t\tdatetime: new Date(),\n\t\t\tlevelName: LevelNameMap[level],\n\t\t};\n\n\t\tif (this.#shouldLog(level)) {\n\t\t\tthis.#logRecord(record);\n\t\t}\n\t}\n\n\t#shouldLog(level: LevelIndex): boolean {\n\t\treturn level >= LogLevels[this.level];\n\t}\n\n\t#logRecord(record: LogRecord): void {\n\t\tconsole.log(formatter(record));\n\t}\n\n\ttrace(message: string, ...args: unknown[]): void {\n\t\tthis.log(LogLevels.TRACE, message, ...args);\n\t}\n\n\tdebug(message: string, ...args: unknown[]): void {\n\t\tthis.log(LogLevels.DEBUG, message, ...args);\n\t}\n\n\tinfo(message: string, ...args: unknown[]): void {\n\t\tthis.log(LogLevels.INFO, message, ...args);\n\t}\n\n\twarn(message: string, ...args: unknown[]): void {\n\t\tthis.log(LogLevels.WARN, message, ...args);\n\t}\n\n\terror(message: string, ...args: unknown[]): void {\n\t\tthis.log(LogLevels.ERROR, message, ...args);\n\t}\n\n\tcritical(message: string, ...args: unknown[]): void {\n\t\tthis.log(LogLevels.CRITICAL, message, ...args);\n\t}\n}\n\nconst loggers: Record<string, Logger> = {};\n\nexport function getLogger(name = \"default\"): Logger {\n\tconst defaultLogLevelEnv: LogLevel | undefined = getEnvUniversal(\n\t\t\"_LOG_LEVEL\",\n\t) as LogLevel | undefined;\n\n\tconst defaultLogLevel: LogLevel = defaultLogLevelEnv ?? \"INFO\";\n\tif (!loggers[name]) {\n\t\tloggers[name] = new Logger(name, defaultLogLevel);\n\t}\n\treturn loggers[name];\n}\n\nfunction formatter(log: LogRecord): string {\n\tconst args: LogEntry[] = [];\n\tfor (let i = 0; i < log.args.length; i++) {\n\t\tconst logArg = log.args[i];\n\t\tif (logArg && typeof logArg === \"object\") {\n\t\t\t// Spread object\n\t\t\tfor (const k in logArg) {\n\t\t\t\t// biome-ignore lint/suspicious/noExplicitAny: Unknown type\n\t\t\t\tconst v = (logArg as any)[k];\n\n\t\t\t\tpushArg(k, v, args);\n\t\t\t}\n\t\t} else {\n\t\t\tpushArg(`arg${i}`, logArg, args);\n\t\t}\n\t}\n\n\tconst logTs = getEnvUniversal(\"_LOG_TIMESTAMP\") === \"1\";\n\tconst logTarget = getEnvUniversal(\"_LOG_TARGET\") === \"1\";\n\n\treturn stringify(\n\t\t...(logTs ? [[\"ts\", formatTimestamp(new Date())] as LogEntry] : []),\n\t\t[\"level\", LevelNameMap[log.level]],\n\t\t...(logTarget ? [[\"target\", log.loggerName] as LogEntry] : []),\n\t\t[\"msg\", log.msg],\n\t\t...args,\n\t);\n}\n\nfunction pushArg(k: string, v: unknown, args: LogEntry[]) {\n\targs.push([k, castToLogValue(v)]);\n}\n\n// function getEnv(name: string): string | undefined {\n// \tif (typeof window !== \"undefined\" && window.localStorage) {\n// \t\treturn window.localStorage.getItem(name) || undefined;\n// \t}\n// \treturn undefined;\n// \t// TODO(ACTR-9): Add back env config once node compat layer works\n// \t//return crossGetEnv(name);\n// }\n\nexport function setupLogging() {\n\t// Do nothing for now\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/common/utils.ts","../../package.json","../../src/utils.ts"],"sourcesContent":["import type { Next } from \"hono\";\nimport type { ContentfulStatusCode } from \"hono/utils/http-status\";\nimport * as errors from \"@/actor/errors\";\nimport { getEnvUniversal } from \"@/utils\";\nimport type { Logger } from \"./log\";\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\" ? value.length : JSON.stringify(value).length;\n\t\tsize += key.length + valueSize;\n\n\t\tif (size > maxSize) {\n\t\t\tthrow new Error(`JSON object exceeds size limit of ${maxSize} bytes.`);\n\t\t}\n\n\t\treturn value;\n\t}\n\n\treturn JSON.stringify(obj, replacer);\n}\n\n// TODO: Instead of doing this, use a temp var for state and attempt to write\n// it. Roll back state if fails to serialize.\n\n/**\n * Check if a value is CBOR serializable.\n * Optionally pass an onInvalid callback to receive the path to invalid values.\n *\n * For a complete list of supported CBOR tags, see:\n * https://github.com/kriszyp/cbor-x/blob/cc1cf9df8ba72288c7842af1dd374d73e34cdbc1/README.md#list-of-supported-tags-for-decoding\n */\nexport function isCborSerializable(\n\tvalue: unknown,\n\tonInvalid?: (path: string) => void,\n\tcurrentPath = \"\",\n): boolean {\n\t// Handle primitive types directly\n\tif (value === null || value === undefined) {\n\t\treturn true;\n\t}\n\n\tif (typeof value === \"number\") {\n\t\tif (!Number.isFinite(value)) {\n\t\t\tonInvalid?.(currentPath);\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t}\n\n\tif (typeof value === \"boolean\" || typeof value === \"string\") {\n\t\treturn true;\n\t}\n\n\t// Handle BigInt (CBOR tags 2 and 3)\n\tif (typeof value === \"bigint\") {\n\t\treturn true;\n\t}\n\n\t// Handle Date objects (CBOR tags 0 and 1)\n\tif (value instanceof Date) {\n\t\treturn true;\n\t}\n\n\t// Handle typed arrays (CBOR tags 64-82)\n\tif (\n\t\tvalue instanceof Uint8Array ||\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\t\treturn true;\n\t}\n\n\t// Handle Map (CBOR tag 259)\n\tif (value instanceof Map) {\n\t\tfor (const [key, val] of value.entries()) {\n\t\t\tconst keyPath = currentPath\n\t\t\t\t? `${currentPath}.key(${String(key)})`\n\t\t\t\t: `key(${String(key)})`;\n\t\t\tconst valPath = currentPath\n\t\t\t\t? `${currentPath}.value(${String(key)})`\n\t\t\t\t: `value(${String(key)})`;\n\t\t\tif (\n\t\t\t\t!isCborSerializable(key, onInvalid, keyPath) ||\n\t\t\t\t!isCborSerializable(val, onInvalid, valPath)\n\t\t\t) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\n\t// Handle Set (CBOR tag 258)\n\tif (value instanceof Set) {\n\t\tlet index = 0;\n\t\tfor (const item of value.values()) {\n\t\t\tconst itemPath = currentPath\n\t\t\t\t? `${currentPath}.set[${index}]`\n\t\t\t\t: `set[${index}]`;\n\t\t\tif (!isCborSerializable(item, onInvalid, itemPath)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tindex++;\n\t\t}\n\t\treturn true;\n\t}\n\n\t// Handle RegExp (CBOR tag 27)\n\tif (value instanceof RegExp) {\n\t\treturn true;\n\t}\n\n\t// Handle Error objects (CBOR tag 27)\n\tif (value instanceof Error) {\n\t\treturn true;\n\t}\n\n\t// Handle arrays\n\tif (Array.isArray(value)) {\n\t\tfor (let i = 0; i < value.length; i++) {\n\t\t\tconst itemPath = currentPath ? `${currentPath}[${i}]` : `[${i}]`;\n\t\t\tif (!isCborSerializable(value[i], onInvalid, itemPath)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\n\t// Handle plain objects and records (CBOR tags 105, 51, 57344-57599)\n\tif (typeof value === \"object\") {\n\t\t// Allow plain objects and objects with prototypes (for records and named objects)\n\t\tconst proto = Object.getPrototypeOf(value);\n\t\tif (proto !== null && proto !== Object.prototype) {\n\t\t\t// Check if it's a known serializable object type\n\t\t\tconst protoConstructor = value.constructor;\n\t\t\tif (protoConstructor && typeof protoConstructor.name === \"string\") {\n\t\t\t\t// Allow objects with named constructors (records, named objects)\n\t\t\t\t// This includes user-defined classes and built-in objects\n\t\t\t\t// that CBOR can serialize with tag 27 or record tags\n\t\t\t}\n\t\t}\n\n\t\t// Check all properties recursively\n\t\tfor (const key in value) {\n\t\t\tconst propPath = currentPath ? `${currentPath}.${key}` : key;\n\t\t\tif (\n\t\t\t\t!isCborSerializable(\n\t\t\t\t\tvalue[key as keyof typeof value],\n\t\t\t\t\tonInvalid,\n\t\t\t\t\tpropPath,\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\n\t// Not serializable\n\tonInvalid?.(currentPath);\n\treturn false;\n}\n\nexport interface DeconstructedError {\n\t__type: \"ActorError\";\n\tstatusCode: ContentfulStatusCode;\n\tpublic: boolean;\n\tcode: string;\n\tmessage: string;\n\tmetadata?: unknown;\n}\n\n/** Deconstructs error in to components that are used to build responses. */\nexport function deconstructError(\n\terror: unknown,\n\tlogger: Logger,\n\textraLog: Record<string, 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\t//\n\t// We log the error here instead of after generating the code & message because we need to log the original error, not the masked internal error.\n\tlet statusCode: ContentfulStatusCode;\n\tlet public_: boolean;\n\tlet code: string;\n\tlet message: string;\n\tlet metadata: unknown;\n\tif (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\tcode = error.code;\n\t\tmessage = getErrorMessage(error);\n\t\tmetadata = error.metadata;\n\n\t\tlogger.info(\"public error\", {\n\t\t\tcode,\n\t\t\tmessage,\n\t\t\tissues: \"https://github.com/rivet-gg/rivetkit/issues\",\n\t\t\tsupport: \"https://rivet.gg/discord\",\n\t\t\t...extraLog,\n\t\t});\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\tcode = error.code;\n\t\t\tmessage = getErrorMessage(error);\n\t\t\tmetadata = error.metadata;\n\n\t\t\tlogger.info(\"internal error\", {\n\t\t\t\tcode,\n\t\t\t\tmessage,\n\t\t\t\tissues: \"https://github.com/rivet-gg/rivetkit/issues\",\n\t\t\t\tsupport: \"https://rivet.gg/discord\",\n\t\t\t\t...extraLog,\n\t\t\t});\n\t\t} else {\n\t\t\tstatusCode = 500;\n\t\t\tpublic_ = false;\n\t\t\tcode = errors.INTERNAL_ERROR_CODE;\n\t\t\tmessage = getErrorMessage(error);\n\n\t\t\tlogger.info(\"internal error\", {\n\t\t\t\tcode,\n\t\t\t\tmessage,\n\t\t\t\tissues: \"https://github.com/rivet-gg/rivetkit/issues\",\n\t\t\t\tsupport: \"https://rivet.gg/discord\",\n\t\t\t\t...extraLog,\n\t\t\t});\n\t\t}\n\t} else {\n\t\tstatusCode = 500;\n\t\tpublic_ = false;\n\t\tcode = errors.INTERNAL_ERROR_CODE;\n\t\tmessage = errors.INTERNAL_ERROR_DESCRIPTION;\n\t\tmetadata = {\n\t\t\t//url: `https://hub.rivet.gg/projects/${actorMetadata.project.slug}/environments/${actorMetadata.environment.slug}/actors?actorId=${actorMetadata.actor.id}`,\n\t\t} satisfies errors.InternalErrorMetadata;\n\n\t\tlogger.warn(\"internal error\", {\n\t\t\terror: getErrorMessage(error),\n\t\t\tstack: (error as Error)?.stack,\n\t\t\tissues: \"https://github.com/rivet-gg/rivetkit/issues\",\n\t\t\tsupport: \"https://rivet.gg/discord\",\n\t\t\t...extraLog,\n\t\t});\n\t}\n\n\treturn {\n\t\t__type: \"ActorError\",\n\t\tstatusCode,\n\t\tpublic: public_,\n\t\tcode,\n\t\tmessage,\n\t\tmetadata,\n\t};\n}\n\nexport function stringifyError(error: unknown): string {\n\tif (error instanceof Error) {\n\t\tif (\n\t\t\ttypeof process !== \"undefined\" &&\n\t\t\tgetEnvUniversal(\"_RIVETKIT_ERROR_STACK\") === \"1\"\n\t\t) {\n\t\t\treturn `${error.name}: ${error.message}${error.stack ? `\\n${error.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 \"name\": \"rivetkit\",\n \"version\": \"2.0.3\",\n \"license\": \"Apache-2.0\",\n \"keywords\": [\n \"rivetkit\",\n \"stateful\",\n \"serverless\",\n \"actors\",\n \"agents\",\n \"realtime\",\n \"websocket\",\n \"actors\",\n \"framework\"\n ],\n \"files\": [\n \"dist\",\n \"src\",\n \"deno.json\",\n \"bun.json\",\n \"package.json\"\n ],\n \"type\": \"module\",\n \"exports\": {\n \".\": {\n \"import\": {\n \"types\": \"./dist/tsup/mod.d.ts\",\n \"default\": \"./dist/tsup/mod.js\"\n },\n \"require\": {\n \"types\": \"./dist/tsup/mod.d.cts\",\n \"default\": \"./dist/tsup/mod.cjs\"\n }\n },\n \"./client\": {\n \"import\": {\n \"types\": \"./dist/tsup/client/mod.d.ts\",\n \"default\": \"./dist/tsup/client/mod.js\"\n },\n \"require\": {\n \"types\": \"./dist/tsup/client/mod.d.cts\",\n \"default\": \"./dist/tsup/client/mod.cjs\"\n }\n },\n \"./log\": {\n \"import\": {\n \"types\": \"./dist/tsup/common/log.d.ts\",\n \"default\": \"./dist/tsup/common/log.js\"\n },\n \"require\": {\n \"types\": \"./dist/tsup/common/log.d.cts\",\n \"default\": \"./dist/tsup/common/log.cjs\"\n }\n },\n \"./errors\": {\n \"import\": {\n \"types\": \"./dist/tsup/actor/errors.d.ts\",\n \"default\": \"./dist/tsup/actor/errors.js\"\n },\n \"require\": {\n \"types\": \"./dist/tsup/actor/errors.d.cts\",\n \"default\": \"./dist/tsup/actor/errors.cjs\"\n }\n },\n \"./utils\": {\n \"import\": {\n \"types\": \"./dist/tsup/utils.d.ts\",\n \"default\": \"./dist/tsup/utils.js\"\n },\n \"require\": {\n \"types\": \"./dist/tsup/utils.d.cts\",\n \"default\": \"./dist/tsup/utils.cjs\"\n }\n },\n \"./driver-helpers\": {\n \"import\": {\n \"types\": \"./dist/tsup/driver-helpers/mod.d.ts\",\n \"default\": \"./dist/tsup/driver-helpers/mod.js\"\n },\n \"require\": {\n \"types\": \"./dist/tsup/driver-helpers/mod.d.cts\",\n \"default\": \"./dist/tsup/driver-helpers/mod.cjs\"\n }\n },\n \"./driver-helpers/websocket\": {\n \"import\": {\n \"types\": \"./dist/tsup/common/websocket.d.ts\",\n \"default\": \"./dist/tsup/common/websocket.js\"\n },\n \"require\": {\n \"types\": \"./dist/tsup/common/websocket.d.cts\",\n \"default\": \"./dist/tsup/common/websocket.cjs\"\n }\n },\n \"./driver-test-suite\": {\n \"import\": {\n \"types\": \"./dist/tsup/driver-test-suite/mod.d.ts\",\n \"default\": \"./dist/tsup/driver-test-suite/mod.js\"\n },\n \"require\": {\n \"types\": \"./dist/tsup/driver-test-suite/mod.d.cts\",\n \"default\": \"./dist/tsup/driver-test-suite/mod.cjs\"\n }\n },\n \"./topologies/coordinate\": {\n \"import\": {\n \"types\": \"./dist/tsup/topologies/coordinate/mod.d.ts\",\n \"default\": \"./dist/tsup/topologies/coordinate/mod.js\"\n },\n \"require\": {\n \"types\": \"./dist/tsup/topologies/coordinate/mod.d.cts\",\n \"default\": \"./dist/tsup/topologies/coordinate/mod.cjs\"\n }\n },\n \"./topologies/partition\": {\n \"import\": {\n \"types\": \"./dist/tsup/topologies/partition/mod.d.ts\",\n \"default\": \"./dist/tsup/topologies/partition/mod.js\"\n },\n \"require\": {\n \"types\": \"./dist/tsup/topologies/partition/mod.d.cts\",\n \"default\": \"./dist/tsup/topologies/partition/mod.cjs\"\n }\n },\n \"./test\": {\n \"import\": {\n \"types\": \"./dist/tsup/test/mod.d.ts\",\n \"default\": \"./dist/tsup/test/mod.js\"\n },\n \"require\": {\n \"types\": \"./dist/tsup/test/mod.d.cts\",\n \"default\": \"./dist/tsup/test/mod.cjs\"\n }\n },\n \"./inspector\": {\n \"import\": {\n \"types\": \"./dist/tsup/inspector/mod.d.ts\",\n \"default\": \"./dist/tsup/inspector/mod.js\"\n },\n \"require\": {\n \"types\": \"./dist/tsup/inspector/mod.d.cts\",\n \"default\": \"./dist/tsup/inspector/mod.cjs\"\n }\n }\n },\n \"engines\": {\n \"node\": \">=22.0.0\"\n },\n \"sideEffects\": false,\n \"scripts\": {\n \"dev\": \"pnpm build --watch\",\n \"build\": \"tsup src/mod.ts src/client/mod.ts src/common/log.ts src/common/websocket.ts src/actor/errors.ts src/topologies/coordinate/mod.ts src/topologies/partition/mod.ts src/utils.ts src/driver-helpers/mod.ts src/driver-test-suite/mod.ts src/test/mod.ts src/inspector/mod.ts\",\n \"build:schema\": \"./scripts/compile-bare.ts compile schemas/client-protocol/v1.bare -o dist/schemas/client-protocol/v1.ts && ./scripts/compile-bare.ts compile schemas/file-system-driver/v1.bare -o dist/schemas/file-system-driver/v1.ts && ./scripts/compile-bare.ts compile schemas/actor-persist/v1.bare -o dist/schemas/actor-persist/v1.ts\",\n \"check-types\": \"tsc --noEmit\",\n \"test\": \"vitest run\",\n \"test:watch\": \"vitest\",\n \"dump-openapi\": \"tsx scripts/dump-openapi.ts\"\n },\n \"dependencies\": {\n \"@bare-ts/lib\": \"~0.3.0\",\n \"@hono/standard-validator\": \"^0.1.3\",\n \"@hono/zod-openapi\": \"^0.19.10\",\n \"@rivetkit/engine-runner\": \"https://pkg.pr.new/rivet-gg/engine/@rivetkit/engine-runner@664a377\",\n \"@rivetkit/fast-json-patch\": \"^3.1.2\",\n \"cbor-x\": \"^1.6.0\",\n \"hono\": \"^4.7.0\",\n \"invariant\": \"^2.2.4\",\n \"nanoevents\": \"^9.1.0\",\n \"on-change\": \"^5.0.1\",\n \"p-retry\": \"^6.2.1\",\n \"zod\": \"^3.25.76\"\n },\n \"devDependencies\": {\n \"@bare-ts/tools\": \"^0.13.0\",\n \"@hono/node-server\": \"^1.18.2\",\n \"@hono/node-ws\": \"^1.1.1\",\n \"@rivet-gg/actor-core\": \"^25.1.0\",\n \"@types/invariant\": \"^2\",\n \"@types/node\": \"^22.13.1\",\n \"@types/ws\": \"^8\",\n \"@vitest/ui\": \"3.1.1\",\n \"bundle-require\": \"^5.1.0\",\n \"eventsource\": \"^3.0.5\",\n \"tsup\": \"^8.4.0\",\n \"tsx\": \"^4.19.4\",\n \"typescript\": \"^5.7.3\",\n \"vitest\": \"^3.1.1\",\n \"ws\": \"^8.18.1\"\n },\n \"peerDependencies\": {\n \"@hono/node-server\": \"^1.14.0\",\n \"@hono/node-ws\": \"^1.1.1\",\n \"eventsource\": \"^3.0.5\",\n \"ws\": \"^8.0.0\"\n },\n \"peerDependenciesMeta\": {\n \"@hono/node-server\": {\n \"optional\": true\n },\n \"@hono/node-ws\": {\n \"optional\": true\n },\n \"eventsource\": {\n \"optional\": true\n },\n \"ws\": {\n \"optional\": true\n }\n },\n \"stableVersion\": \"0.8.0\"\n}\n","export { stringifyError } from \"@/common/utils\";\nexport { assertUnreachable } from \"./common/utils\";\n\nimport type { Context as HonoContext, Handler as HonoHandler } from \"hono\";\n\nimport pkgJson from \"../package.json\" with { type: \"json\" };\n\nexport const VERSION = pkgJson.version;\n\nlet _userAgent: string | undefined;\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 = typeof 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 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\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 */\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(data.byteOffset, data.byteOffset + data.byteLength),\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\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?: 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 = Promise.withResolvers<void>();\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} catch {\n\t\t\t\t\t// Swallow errors: callers only await cycle completion, not success\n\t\t\t\t}\n\n\t\t\t\t// Notify all waiters for this cycle\n\t\t\t\tresolver?.resolve();\n\t\t\t}\n\t\t} finally {\n\t\t\tthis.runningDrainLoop = undefined;\n\t\t}\n\t}\n}\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"],"mappings":"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","names":[]}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
// src/inspector/protocol/actor.ts
|
|
2
|
-
import { hc } from "hono/client";
|
|
3
|
-
var client = hc("");
|
|
4
|
-
var createActorInspectorClient = (...args) => hc(...args);
|
|
5
|
-
|
|
6
|
-
// src/inspector/protocol/manager.ts
|
|
7
|
-
import { hc as hc2 } from "hono/client";
|
|
8
|
-
var client2 = hc2("");
|
|
9
|
-
var createManagerInspectorClient = (...args) => hc2(...args);
|
|
10
|
-
|
|
11
|
-
export {
|
|
12
|
-
createActorInspectorClient,
|
|
13
|
-
createManagerInspectorClient
|
|
14
|
-
};
|
|
15
|
-
//# sourceMappingURL=chunk-42I3OZ3Q.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/inspector/protocol/actor.ts","../../src/inspector/protocol/manager.ts"],"sourcesContent":["import { hc } from \"hono/client\";\nimport type { createActorInspectorRouter } from \"../actor\";\n\ntype ActorInspectorRouter = ReturnType<typeof createActorInspectorRouter>;\nconst client = hc<ActorInspectorRouter>(\"\");\nexport type ActorInspectorClient = typeof client;\n\nexport const createActorInspectorClient = (\n\t...args: Parameters<typeof hc>\n): ActorInspectorClient => hc<ActorInspectorRouter>(...args);\n","import { hc } from \"hono/client\";\nimport type { createManagerInspectorRouter } from \"../manager\";\n\ntype ManagerInspectorRouter = ReturnType<typeof createManagerInspectorRouter>;\nconst client = hc<ManagerInspectorRouter>(\"\");\nexport type ManagerInspectorClient = typeof client;\n\nexport const createManagerInspectorClient = (\n\t...args: Parameters<typeof hc>\n): ManagerInspectorClient => hc<ManagerInspectorRouter>(...args);\n"],"mappings":";AAAA,SAAS,UAAU;AAInB,IAAM,SAAS,GAAyB,EAAE;AAGnC,IAAM,6BAA6B,IACtC,SACuB,GAAyB,GAAG,IAAI;;;ACT3D,SAAS,MAAAA,WAAU;AAInB,IAAMC,UAASD,IAA2B,EAAE;AAGrC,IAAM,+BAA+B,IACxC,SACyBA,IAA2B,GAAG,IAAI;","names":["hc","client"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/actor/connection.ts","../../src/common/versioned-data.ts","../schemas/client-protocol/v1.ts","../../src/schemas/client-protocol/versioned.ts","../../src/actor/log.ts","../../src/actor/protocol/serde.ts","../../src/serde.ts","../../src/actor/utils.ts","../../src/actor/router-endpoints.ts","../../src/actor/action.ts","../../src/manager/log.ts","../../src/manager/hono-websocket-adapter.ts","../../src/actor/protocol/old.ts"],"sourcesContent":["import * as cbor from \"cbor-x\";\nimport type * as protocol from \"@/schemas/client-protocol/mod\";\nimport { TO_CLIENT_VERSIONED } from \"@/schemas/client-protocol/versioned\";\nimport { bufferToArrayBuffer } from \"@/utils\";\nimport type { AnyDatabaseProvider } from \"./database\";\nimport { type ConnDriver, ConnectionReadyState } from \"./driver\";\nimport * as errors from \"./errors\";\nimport type { ActorInstance } from \"./instance\";\nimport { logger } from \"./log\";\nimport type { PersistedConn } from \"./persisted\";\nimport { CachedSerializer } from \"./protocol/serde\";\nimport { generateSecureToken } from \"./utils\";\n\nexport function generateConnId(): string {\n\treturn crypto.randomUUID();\n}\n\nexport function generateConnToken(): string {\n\treturn generateSecureToken(32);\n}\n\nexport type ConnId = string;\n\nexport type AnyConn = Conn<any, any, any, any, any, any, any>;\n\nexport const CONNECTION_DRIVER_WEBSOCKET = \"webSocket\";\nexport const CONNECTION_DRIVER_SSE = \"sse\";\nexport const CONNECTION_DRIVER_HTTP = \"http\";\n\nexport type ConnectionDriver =\n\t| typeof CONNECTION_DRIVER_WEBSOCKET\n\t| typeof CONNECTION_DRIVER_SSE\n\t| typeof CONNECTION_DRIVER_HTTP;\n\nexport type ConnectionStatus = \"connected\" | \"reconnecting\";\n\nexport const CONNECTION_CHECK_LIVENESS_SYMBOL = Symbol(\"checkLiveness\");\n\n/**\n * Represents a client connection to a actor.\n *\n * Manages connection-specific data and controls the connection lifecycle.\n *\n * @see {@link https://rivet.gg/docs/connections|Connection Documentation}\n */\nexport class Conn<S, CP, CS, V, I, AD, DB extends AnyDatabaseProvider> {\n\tsubscriptions: Set<string> = new Set<string>();\n\n\t#stateEnabled: boolean;\n\n\t// TODO: Remove this cyclical reference\n\t#actor: ActorInstance<S, CP, CS, V, I, AD, DB>;\n\n\t#status: ConnectionStatus = \"connected\";\n\n\t/**\n\t * The proxied state that notifies of changes automatically.\n\t *\n\t * Any data that should be stored indefinitely should be held within this object.\n\t */\n\t__persist: PersistedConn<CP, CS>;\n\n\t/**\n\t * Driver used to manage realtime connection communication.\n\t *\n\t * @protected\n\t */\n\t#driver: ConnDriver;\n\n\tpublic get params(): CP {\n\t\treturn this.__persist.params;\n\t}\n\n\tpublic get auth(): AD {\n\t\treturn this.__persist.authData as AD;\n\t}\n\n\tpublic get driver(): ConnectionDriver {\n\t\treturn this.__persist.connDriver as ConnectionDriver;\n\t}\n\n\tpublic get _stateEnabled() {\n\t\treturn this.#stateEnabled;\n\t}\n\n\t/**\n\t * Gets the current state of the connection.\n\t *\n\t * Throws an error if the state is not enabled.\n\t */\n\tpublic get state(): CS {\n\t\tthis.#validateStateEnabled();\n\t\tif (!this.__persist.state) throw new Error(\"state should exists\");\n\t\treturn this.__persist.state;\n\t}\n\n\t/**\n\t * Sets the state of the connection.\n\t *\n\t * Throws an error if the state is not enabled.\n\t */\n\tpublic set state(value: CS) {\n\t\tthis.#validateStateEnabled();\n\t\tthis.__persist.state = value;\n\t}\n\n\t/**\n\t * Unique identifier for the connection.\n\t */\n\tpublic get id(): ConnId {\n\t\treturn this.__persist.connId;\n\t}\n\n\t/**\n\t * Token used to authenticate this request.\n\t */\n\tpublic get _token(): string {\n\t\treturn this.__persist.token;\n\t}\n\n\t/**\n\t * Status of the connection.\n\t */\n\tpublic get status(): ConnectionStatus {\n\t\treturn this.#status;\n\t}\n\n\t/**\n\t * Timestamp of the last time the connection was seen, i.e. the last time the connection was active and checked for liveness.\n\t */\n\tpublic get lastSeen(): number {\n\t\treturn this.__persist.lastSeen;\n\t}\n\n\t/**\n\t * Initializes a new instance of the Connection class.\n\t *\n\t * This should only be constructed by {@link Actor}.\n\t *\n\t * @protected\n\t */\n\tpublic constructor(\n\t\tactor: ActorInstance<S, CP, CS, V, I, AD, DB>,\n\t\tpersist: PersistedConn<CP, CS>,\n\t\tdriver: ConnDriver,\n\t\tstateEnabled: boolean,\n\t) {\n\t\tthis.#actor = actor;\n\t\tthis.__persist = persist;\n\t\tthis.#driver = driver;\n\t\tthis.#stateEnabled = stateEnabled;\n\t}\n\n\t#validateStateEnabled() {\n\t\tif (!this.#stateEnabled) {\n\t\t\tthrow new errors.ConnStateNotEnabled();\n\t\t}\n\t}\n\n\t/**\n\t * Sends a WebSocket message to the client.\n\t *\n\t * @param message - The message to send.\n\t *\n\t * @protected\n\t */\n\tpublic _sendMessage(message: CachedSerializer<protocol.ToClient>) {\n\t\tthis.#driver.sendMessage?.(\n\t\t\tthis.#actor,\n\t\t\tthis,\n\t\t\tthis.__persist.connDriverState,\n\t\t\tmessage,\n\t\t);\n\t}\n\n\t/**\n\t * Sends an event with arguments to the client.\n\t *\n\t * @param eventName - The name of the event.\n\t * @param args - The arguments for the event.\n\t * @see {@link https://rivet.gg/docs/events|Events Documentation}\n\t */\n\tpublic send(eventName: string, ...args: unknown[]) {\n\t\tthis.#actor.inspector.emitter.emit(\"eventFired\", {\n\t\t\ttype: \"event\",\n\t\t\teventName,\n\t\t\targs,\n\t\t\tconnId: this.id,\n\t\t});\n\t\tthis._sendMessage(\n\t\t\tnew CachedSerializer<protocol.ToClient>(\n\t\t\t\t{\n\t\t\t\t\tbody: {\n\t\t\t\t\t\ttag: \"Event\",\n\t\t\t\t\t\tval: {\n\t\t\t\t\t\t\tname: eventName,\n\t\t\t\t\t\t\targs: bufferToArrayBuffer(cbor.encode(args)),\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tTO_CLIENT_VERSIONED,\n\t\t\t),\n\t\t);\n\t}\n\n\t/**\n\t * Disconnects the client with an optional reason.\n\t *\n\t * @param reason - The reason for disconnection.\n\t */\n\tpublic async disconnect(reason?: string) {\n\t\tthis.#status = \"reconnecting\";\n\t\tawait this.#driver.disconnect(\n\t\t\tthis.#actor,\n\t\t\tthis,\n\t\t\tthis.__persist.connDriverState,\n\t\t\treason,\n\t\t);\n\t}\n\n\t/**\n\t * This method checks the connection's liveness by querying the driver for its ready state.\n\t * If the connection is not closed, it updates the last liveness timestamp and returns `true`.\n\t * Otherwise, it returns `false`.\n\t * @internal\n\t */\n\t[CONNECTION_CHECK_LIVENESS_SYMBOL]() {\n\t\tconst readyState = this.#driver.getConnectionReadyState(this.#actor, this);\n\n\t\tconst isConnectionClosed =\n\t\t\treadyState === ConnectionReadyState.CLOSED ||\n\t\t\treadyState === ConnectionReadyState.CLOSING ||\n\t\t\treadyState === undefined;\n\n\t\tconst newLastSeen = Date.now();\n\t\tconst newStatus = isConnectionClosed ? \"reconnecting\" : \"connected\";\n\n\t\tlogger().debug(\"liveness probe for connection\", {\n\t\t\tconnId: this.id,\n\t\t\tactorId: this.#actor.id,\n\t\t\treadyState,\n\n\t\t\tstatus: this.#status,\n\t\t\tnewStatus,\n\n\t\t\tlastSeen: this.__persist.lastSeen,\n\t\t\tcurrentTs: newLastSeen,\n\t\t});\n\n\t\tif (!isConnectionClosed) {\n\t\t\tthis.__persist.lastSeen = newLastSeen;\n\t\t}\n\n\t\tthis.#status = newStatus;\n\t\treturn {\n\t\t\tstatus: this.#status,\n\t\t\tlastSeen: this.__persist.lastSeen,\n\t\t};\n\t}\n}\n","export interface VersionedData<T> {\n\tversion: number;\n\tdata: T;\n}\n\nexport type MigrationFn<TFrom, TTo> = (data: TFrom) => TTo;\n\nexport interface VersionedDataConfig<T> {\n\tcurrentVersion: number;\n\tmigrations: Map<number, MigrationFn<any, any>>;\n\tserializeVersion: (data: T) => Uint8Array;\n\tdeserializeVersion: (bytes: Uint8Array) => T;\n}\n\nexport class VersionedDataHandler<T> {\n\tconstructor(private config: VersionedDataConfig<T>) {}\n\n\tserializeWithEmbeddedVersion(data: T): Uint8Array {\n\t\tconst versioned: VersionedData<Uint8Array> = {\n\t\t\tversion: this.config.currentVersion,\n\t\t\tdata: this.config.serializeVersion(data),\n\t\t};\n\n\t\treturn this.embedVersion(versioned);\n\t}\n\n\tdeserializeWithEmbeddedVersion(bytes: Uint8Array): T {\n\t\tconst versioned = this.extractVersion(bytes);\n\t\treturn this.deserialize(versioned.data, versioned.version);\n\t}\n\n\tserialize(data: T, version: number): Uint8Array {\n\t\treturn this.config.serializeVersion(data);\n\t}\n\n\tdeserialize(bytes: Uint8Array, version: number): T {\n\t\tif (version === this.config.currentVersion) {\n\t\t\treturn this.config.deserializeVersion(bytes);\n\t\t}\n\n\t\tif (version > this.config.currentVersion) {\n\t\t\tthrow new Error(\n\t\t\t\t`Cannot decode data from version ${version}, current version is ${this.config.currentVersion}`,\n\t\t\t);\n\t\t}\n\n\t\tlet currentData: any = this.config.deserializeVersion(bytes);\n\t\tlet currentVersion = version;\n\n\t\twhile (currentVersion < this.config.currentVersion) {\n\t\t\tconst migration = this.config.migrations.get(currentVersion);\n\t\t\tif (!migration) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`No migration found from version ${currentVersion} to ${currentVersion + 1}`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tcurrentData = migration(currentData);\n\t\t\tcurrentVersion++;\n\t\t}\n\n\t\treturn currentData;\n\t}\n\n\tprivate embedVersion(data: VersionedData<Uint8Array>): Uint8Array {\n\t\tconst versionBytes = new Uint8Array(4);\n\t\tnew DataView(versionBytes.buffer).setUint32(0, data.version, true);\n\n\t\tconst result = new Uint8Array(versionBytes.length + data.data.length);\n\t\tresult.set(versionBytes);\n\t\tresult.set(data.data, versionBytes.length);\n\n\t\treturn result;\n\t}\n\n\tprivate extractVersion(bytes: Uint8Array): VersionedData<Uint8Array> {\n\t\tif (bytes.length < 4) {\n\t\t\tthrow new Error(\"Invalid versioned data: too short\");\n\t\t}\n\n\t\tconst version = new DataView(bytes.buffer, bytes.byteOffset).getUint32(\n\t\t\t0,\n\t\t\ttrue,\n\t\t);\n\t\tconst data = bytes.slice(4);\n\n\t\treturn { version, data };\n\t}\n}\n\nexport function createVersionedDataHandler<T>(\n\tconfig: VersionedDataConfig<T>,\n): VersionedDataHandler<T> {\n\treturn new VersionedDataHandler(config);\n}\n","import * as bare from \"@bare-ts/lib\"\n\nconst config = /* @__PURE__ */ bare.Config({})\n\nexport type uint = bigint\n\nexport type Init = {\n readonly actorId: string,\n readonly connectionId: string,\n readonly connectionToken: string,\n}\n\nexport function readInit(bc: bare.ByteCursor): Init {\n return {\n actorId: bare.readString(bc),\n connectionId: bare.readString(bc),\n connectionToken: bare.readString(bc),\n }\n}\n\nexport function writeInit(bc: bare.ByteCursor, x: Init): void {\n bare.writeString(bc, x.actorId)\n bare.writeString(bc, x.connectionId)\n bare.writeString(bc, x.connectionToken)\n}\n\nfunction read0(bc: bare.ByteCursor): ArrayBuffer | null {\n return bare.readBool(bc)\n ? bare.readData(bc)\n : null\n}\n\nfunction write0(bc: bare.ByteCursor, x: ArrayBuffer | null): void {\n bare.writeBool(bc, x !== null)\n if (x !== null) {\n bare.writeData(bc, x)\n }\n}\n\nfunction read1(bc: bare.ByteCursor): uint | null {\n return bare.readBool(bc)\n ? bare.readUint(bc)\n : null\n}\n\nfunction write1(bc: bare.ByteCursor, x: uint | null): void {\n bare.writeBool(bc, x !== null)\n if (x !== null) {\n bare.writeUint(bc, x)\n }\n}\n\nexport type Error = {\n readonly code: string,\n readonly message: string,\n readonly metadata: ArrayBuffer | null,\n readonly actionId: uint | null,\n}\n\nexport function readError(bc: bare.ByteCursor): Error {\n return {\n code: bare.readString(bc),\n message: bare.readString(bc),\n metadata: read0(bc),\n actionId: read1(bc),\n }\n}\n\nexport function writeError(bc: bare.ByteCursor, x: Error): void {\n bare.writeString(bc, x.code)\n bare.writeString(bc, x.message)\n write0(bc, x.metadata)\n write1(bc, x.actionId)\n}\n\nexport type ActionResponse = {\n readonly id: uint,\n readonly output: ArrayBuffer,\n}\n\nexport function readActionResponse(bc: bare.ByteCursor): ActionResponse {\n return {\n id: bare.readUint(bc),\n output: bare.readData(bc),\n }\n}\n\nexport function writeActionResponse(bc: bare.ByteCursor, x: ActionResponse): void {\n bare.writeUint(bc, x.id)\n bare.writeData(bc, x.output)\n}\n\nexport type Event = {\n readonly name: string,\n readonly args: ArrayBuffer,\n}\n\nexport function readEvent(bc: bare.ByteCursor): Event {\n return {\n name: bare.readString(bc),\n args: bare.readData(bc),\n }\n}\n\nexport function writeEvent(bc: bare.ByteCursor, x: Event): void {\n bare.writeString(bc, x.name)\n bare.writeData(bc, x.args)\n}\n\nexport type ToClientBody =\n | { readonly tag: \"Init\", readonly val: Init }\n | { readonly tag: \"Error\", readonly val: Error }\n | { readonly tag: \"ActionResponse\", readonly val: ActionResponse }\n | { readonly tag: \"Event\", readonly val: Event }\n\nexport function readToClientBody(bc: bare.ByteCursor): ToClientBody {\n const offset = bc.offset\n const tag = bare.readU8(bc)\n switch (tag) {\n case 0:\n return { tag: \"Init\", val: readInit(bc) }\n case 1:\n return { tag: \"Error\", val: readError(bc) }\n case 2:\n return { tag: \"ActionResponse\", val: readActionResponse(bc) }\n case 3:\n return { tag: \"Event\", val: readEvent(bc) }\n default: {\n bc.offset = offset\n throw new bare.BareError(offset, \"invalid tag\")\n }\n }\n}\n\nexport function writeToClientBody(bc: bare.ByteCursor, x: ToClientBody): void {\n switch (x.tag) {\n case \"Init\": {\n bare.writeU8(bc, 0)\n writeInit(bc, x.val)\n break\n }\n case \"Error\": {\n bare.writeU8(bc, 1)\n writeError(bc, x.val)\n break\n }\n case \"ActionResponse\": {\n bare.writeU8(bc, 2)\n writeActionResponse(bc, x.val)\n break\n }\n case \"Event\": {\n bare.writeU8(bc, 3)\n writeEvent(bc, x.val)\n break\n }\n }\n}\n\nexport type ToClient = {\n readonly body: ToClientBody,\n}\n\nexport function readToClient(bc: bare.ByteCursor): ToClient {\n return {\n body: readToClientBody(bc),\n }\n}\n\nexport function writeToClient(bc: bare.ByteCursor, x: ToClient): void {\n writeToClientBody(bc, x.body)\n}\n\nexport function encodeToClient(x: ToClient): Uint8Array {\n const bc = new bare.ByteCursor(\n new Uint8Array(config.initialBufferLength),\n config\n )\n writeToClient(bc, x)\n return new Uint8Array(bc.view.buffer, bc.view.byteOffset, bc.offset)\n}\n\nexport function decodeToClient(bytes: Uint8Array): ToClient {\n const bc = new bare.ByteCursor(bytes, config)\n const result = readToClient(bc)\n if (bc.offset < bc.view.byteLength) {\n throw new bare.BareError(bc.offset, \"remaining bytes\")\n }\n return result\n}\n\nexport type ActionRequest = {\n readonly id: uint,\n readonly name: string,\n readonly args: ArrayBuffer,\n}\n\nexport function readActionRequest(bc: bare.ByteCursor): ActionRequest {\n return {\n id: bare.readUint(bc),\n name: bare.readString(bc),\n args: bare.readData(bc),\n }\n}\n\nexport function writeActionRequest(bc: bare.ByteCursor, x: ActionRequest): void {\n bare.writeUint(bc, x.id)\n bare.writeString(bc, x.name)\n bare.writeData(bc, x.args)\n}\n\nexport type SubscriptionRequest = {\n readonly eventName: string,\n readonly subscribe: boolean,\n}\n\nexport function readSubscriptionRequest(bc: bare.ByteCursor): SubscriptionRequest {\n return {\n eventName: bare.readString(bc),\n subscribe: bare.readBool(bc),\n }\n}\n\nexport function writeSubscriptionRequest(bc: bare.ByteCursor, x: SubscriptionRequest): void {\n bare.writeString(bc, x.eventName)\n bare.writeBool(bc, x.subscribe)\n}\n\nexport type ToServerBody =\n | { readonly tag: \"ActionRequest\", readonly val: ActionRequest }\n | { readonly tag: \"SubscriptionRequest\", readonly val: SubscriptionRequest }\n\nexport function readToServerBody(bc: bare.ByteCursor): ToServerBody {\n const offset = bc.offset\n const tag = bare.readU8(bc)\n switch (tag) {\n case 0:\n return { tag: \"ActionRequest\", val: readActionRequest(bc) }\n case 1:\n return { tag: \"SubscriptionRequest\", val: readSubscriptionRequest(bc) }\n default: {\n bc.offset = offset\n throw new bare.BareError(offset, \"invalid tag\")\n }\n }\n}\n\nexport function writeToServerBody(bc: bare.ByteCursor, x: ToServerBody): void {\n switch (x.tag) {\n case \"ActionRequest\": {\n bare.writeU8(bc, 0)\n writeActionRequest(bc, x.val)\n break\n }\n case \"SubscriptionRequest\": {\n bare.writeU8(bc, 1)\n writeSubscriptionRequest(bc, x.val)\n break\n }\n }\n}\n\nexport type ToServer = {\n readonly body: ToServerBody,\n}\n\nexport function readToServer(bc: bare.ByteCursor): ToServer {\n return {\n body: readToServerBody(bc),\n }\n}\n\nexport function writeToServer(bc: bare.ByteCursor, x: ToServer): void {\n writeToServerBody(bc, x.body)\n}\n\nexport function encodeToServer(x: ToServer): Uint8Array {\n const bc = new bare.ByteCursor(\n new Uint8Array(config.initialBufferLength),\n config\n )\n writeToServer(bc, x)\n return new Uint8Array(bc.view.buffer, bc.view.byteOffset, bc.offset)\n}\n\nexport function decodeToServer(bytes: Uint8Array): ToServer {\n const bc = new bare.ByteCursor(bytes, config)\n const result = readToServer(bc)\n if (bc.offset < bc.view.byteLength) {\n throw new bare.BareError(bc.offset, \"remaining bytes\")\n }\n return result\n}\n\nexport type HttpActionRequest = {\n readonly args: ArrayBuffer,\n}\n\nexport function readHttpActionRequest(bc: bare.ByteCursor): HttpActionRequest {\n return {\n args: bare.readData(bc),\n }\n}\n\nexport function writeHttpActionRequest(bc: bare.ByteCursor, x: HttpActionRequest): void {\n bare.writeData(bc, x.args)\n}\n\nexport function encodeHttpActionRequest(x: HttpActionRequest): Uint8Array {\n const bc = new bare.ByteCursor(\n new Uint8Array(config.initialBufferLength),\n config\n )\n writeHttpActionRequest(bc, x)\n return new Uint8Array(bc.view.buffer, bc.view.byteOffset, bc.offset)\n}\n\nexport function decodeHttpActionRequest(bytes: Uint8Array): HttpActionRequest {\n const bc = new bare.ByteCursor(bytes, config)\n const result = readHttpActionRequest(bc)\n if (bc.offset < bc.view.byteLength) {\n throw new bare.BareError(bc.offset, \"remaining bytes\")\n }\n return result\n}\n\nexport type HttpActionResponse = {\n readonly output: ArrayBuffer,\n}\n\nexport function readHttpActionResponse(bc: bare.ByteCursor): HttpActionResponse {\n return {\n output: bare.readData(bc),\n }\n}\n\nexport function writeHttpActionResponse(bc: bare.ByteCursor, x: HttpActionResponse): void {\n bare.writeData(bc, x.output)\n}\n\nexport function encodeHttpActionResponse(x: HttpActionResponse): Uint8Array {\n const bc = new bare.ByteCursor(\n new Uint8Array(config.initialBufferLength),\n config\n )\n writeHttpActionResponse(bc, x)\n return new Uint8Array(bc.view.buffer, bc.view.byteOffset, bc.offset)\n}\n\nexport function decodeHttpActionResponse(bytes: Uint8Array): HttpActionResponse {\n const bc = new bare.ByteCursor(bytes, config)\n const result = readHttpActionResponse(bc)\n if (bc.offset < bc.view.byteLength) {\n throw new bare.BareError(bc.offset, \"remaining bytes\")\n }\n return result\n}\n\nexport type HttpResponseError = {\n readonly code: string,\n readonly message: string,\n readonly metadata: ArrayBuffer | null,\n}\n\nexport function readHttpResponseError(bc: bare.ByteCursor): HttpResponseError {\n return {\n code: bare.readString(bc),\n message: bare.readString(bc),\n metadata: read0(bc),\n }\n}\n\nexport function writeHttpResponseError(bc: bare.ByteCursor, x: HttpResponseError): void {\n bare.writeString(bc, x.code)\n bare.writeString(bc, x.message)\n write0(bc, x.metadata)\n}\n\nexport function encodeHttpResponseError(x: HttpResponseError): Uint8Array {\n const bc = new bare.ByteCursor(\n new Uint8Array(config.initialBufferLength),\n config\n )\n writeHttpResponseError(bc, x)\n return new Uint8Array(bc.view.buffer, bc.view.byteOffset, bc.offset)\n}\n\nexport function decodeHttpResponseError(bytes: Uint8Array): HttpResponseError {\n const bc = new bare.ByteCursor(bytes, config)\n const result = readHttpResponseError(bc)\n if (bc.offset < bc.view.byteLength) {\n throw new bare.BareError(bc.offset, \"remaining bytes\")\n }\n return result\n}\n\nexport type HttpResolveRequest = null\n\nexport type HttpResolveResponse = {\n readonly actorId: string,\n}\n\nexport function readHttpResolveResponse(bc: bare.ByteCursor): HttpResolveResponse {\n return {\n actorId: bare.readString(bc),\n }\n}\n\nexport function writeHttpResolveResponse(bc: bare.ByteCursor, x: HttpResolveResponse): void {\n bare.writeString(bc, x.actorId)\n}\n\nexport function encodeHttpResolveResponse(x: HttpResolveResponse): Uint8Array {\n const bc = new bare.ByteCursor(\n new Uint8Array(config.initialBufferLength),\n config\n )\n writeHttpResolveResponse(bc, x)\n return new Uint8Array(bc.view.buffer, bc.view.byteOffset, bc.offset)\n}\n\nexport function decodeHttpResolveResponse(bytes: Uint8Array): HttpResolveResponse {\n const bc = new bare.ByteCursor(bytes, config)\n const result = readHttpResolveResponse(bc)\n if (bc.offset < bc.view.byteLength) {\n throw new bare.BareError(bc.offset, \"remaining bytes\")\n }\n return result\n}\n","import {\n\tcreateVersionedDataHandler,\n\ttype MigrationFn,\n} from \"@/common/versioned-data\";\nimport * as v1 from \"../../../dist/schemas/client-protocol/v1\";\n\nexport const CURRENT_VERSION = 1;\n\nconst migrations = new Map<number, MigrationFn<any, any>>();\n\nexport const TO_SERVER_VERSIONED = createVersionedDataHandler<v1.ToServer>({\n\tcurrentVersion: CURRENT_VERSION,\n\tmigrations,\n\tserializeVersion: (data) => v1.encodeToServer(data),\n\tdeserializeVersion: (bytes) => v1.decodeToServer(bytes),\n});\n\nexport const TO_CLIENT_VERSIONED = createVersionedDataHandler<v1.ToClient>({\n\tcurrentVersion: CURRENT_VERSION,\n\tmigrations,\n\tserializeVersion: (data) => v1.encodeToClient(data),\n\tdeserializeVersion: (bytes) => v1.decodeToClient(bytes),\n});\n\nexport const HTTP_ACTION_REQUEST_VERSIONED =\n\tcreateVersionedDataHandler<v1.HttpActionRequest>({\n\t\tcurrentVersion: CURRENT_VERSION,\n\t\tmigrations,\n\t\tserializeVersion: (data) => v1.encodeHttpActionRequest(data),\n\t\tdeserializeVersion: (bytes) => v1.decodeHttpActionRequest(bytes),\n\t});\n\nexport const HTTP_ACTION_RESPONSE_VERSIONED =\n\tcreateVersionedDataHandler<v1.HttpActionResponse>({\n\t\tcurrentVersion: CURRENT_VERSION,\n\t\tmigrations,\n\t\tserializeVersion: (data) => v1.encodeHttpActionResponse(data),\n\t\tdeserializeVersion: (bytes) => v1.decodeHttpActionResponse(bytes),\n\t});\n\nexport const HTTP_RESPONSE_ERROR_VERSIONED =\n\tcreateVersionedDataHandler<v1.HttpResponseError>({\n\t\tcurrentVersion: CURRENT_VERSION,\n\t\tmigrations,\n\t\tserializeVersion: (data) => v1.encodeHttpResponseError(data),\n\t\tdeserializeVersion: (bytes) => v1.decodeHttpResponseError(bytes),\n\t});\n\nexport const HTTP_RESOLVE_REQUEST_VERSIONED =\n\tcreateVersionedDataHandler<v1.HttpResolveRequest>({\n\t\tcurrentVersion: CURRENT_VERSION,\n\t\tmigrations,\n\t\tserializeVersion: (_) => new Uint8Array(),\n\t\tdeserializeVersion: (bytes) => null,\n\t});\n\nexport const HTTP_RESOLVE_RESPONSE_VERSIONED =\n\tcreateVersionedDataHandler<v1.HttpResolveResponse>({\n\t\tcurrentVersion: CURRENT_VERSION,\n\t\tmigrations,\n\t\tserializeVersion: (data) => v1.encodeHttpResolveResponse(data),\n\t\tdeserializeVersion: (bytes) => v1.decodeHttpResolveResponse(bytes),\n\t});\n","import { getLogger } from \"@/common//log\";\n\n/** Logger for this library. */\nexport const RUNTIME_LOGGER_NAME = \"actor-runtime\";\n\n/** Logger used for logs from the actor instance itself. */\nexport const ACTOR_LOGGER_NAME = \"actor\";\n\nexport function logger() {\n\treturn getLogger(RUNTIME_LOGGER_NAME);\n}\n\nexport function instanceLogger() {\n\treturn getLogger(ACTOR_LOGGER_NAME);\n}\n","import * as cbor from \"cbor-x\";\nimport { z } from \"zod\";\nimport * as errors from \"@/actor/errors\";\nimport type { VersionedDataHandler } from \"@/common/versioned-data\";\nimport { serializeWithEncoding } from \"@/serde\";\nimport { logger } from \"../log\";\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\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<T> {\n\t#data: T;\n\t#cache = new Map<Encoding, OutputData>();\n\t#versionedDataHandler: VersionedDataHandler<T>;\n\n\tconstructor(data: T, versionedDataHandler: VersionedDataHandler<T>) {\n\t\tthis.#data = data;\n\t\tthis.#versionedDataHandler = versionedDataHandler;\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} else {\n\t\t\tconst serialized = serializeWithEncoding(\n\t\t\t\tencoding,\n\t\t\t\tthis.#data,\n\t\t\t\tthis.#versionedDataHandler,\n\t\t\t);\n\t\t\tthis.#cache.set(encoding, serialized);\n\t\t\treturn serialized;\n\t\t}\n\t}\n}\n\n///**\n// * Use `CachedSerializer` if serializing the same data repeatedly.\n// */\n//export function serialize<T>(value: T, encoding: Encoding): OutputData {\n//\tif (encoding === \"json\") {\n//\t\treturn JSON.stringify(value);\n//\t} else if (encoding === \"cbor\") {\n//\t\t// TODO: Remove this hack, but cbor-x can't handle anything extra in data structures\n//\t\tconst cleanValue = JSON.parse(JSON.stringify(value));\n//\t\treturn cbor.encode(cleanValue);\n//\t} else {\n//\t\tassertUnreachable(encoding);\n//\t}\n//}\n//\n//export async function deserialize(data: InputData, encoding: Encoding) {\n//\tif (encoding === \"json\") {\n//\t\tif (typeof data !== \"string\") {\n//\t\t\tlogger().warn(\"received non-string for json parse\");\n//\t\t\tthrow new errors.MalformedMessage();\n//\t\t} else {\n//\t\t\treturn JSON.parse(data);\n//\t\t}\n//\t} else if (encoding === \"cbor\") {\n//\t\tif (data instanceof Blob) {\n//\t\t\tconst arrayBuffer = await data.arrayBuffer();\n//\t\t\treturn cbor.decode(new Uint8Array(arrayBuffer));\n//\t\t} else if (data instanceof Uint8Array) {\n//\t\t\treturn cbor.decode(data);\n//\t\t} else if (\n//\t\t\tdata instanceof ArrayBuffer ||\n//\t\t\tdata instanceof SharedArrayBuffer\n//\t\t) {\n//\t\t\treturn cbor.decode(new Uint8Array(data));\n//\t\t} else {\n//\t\t\tlogger().warn(\"received non-binary type for cbor parse\");\n//\t\t\tthrow new errors.MalformedMessage();\n//\t\t}\n//\t} else {\n//\t\tassertUnreachable(encoding);\n//\t}\n//}\n\n// TODO: Encode base 128\nfunction base64EncodeUint8Array(uint8Array: Uint8Array): string {\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\nfunction base64EncodeArrayBuffer(arrayBuffer: ArrayBuffer): string {\n\tconst uint8Array = new Uint8Array(arrayBuffer);\n\treturn base64EncodeUint8Array(uint8Array);\n}\n\n/** Converts data that was encoded to a string. Some formats (like SSE) don't support raw binary data. */\nexport function encodeDataToString(message: OutputData): string {\n\tif (typeof message === \"string\") {\n\t\treturn message;\n\t} else if (message instanceof ArrayBuffer) {\n\t\treturn base64EncodeArrayBuffer(message);\n\t} else if (message instanceof Uint8Array) {\n\t\treturn base64EncodeUint8Array(message);\n\t} else {\n\t\tassertUnreachable(message);\n\t}\n}\n\n/** Stringifies with compat for values that BARE & CBOR supports. */\nexport function jsonStringifyCompat(input: any): string {\n\treturn JSON.stringify(input, (_key, value) =>\n\t\ttypeof value === \"bigint\" ? value.toString() : value,\n\t);\n}\n","import * as cbor from \"cbor-x\";\nimport invariant from \"invariant\";\nimport { assertUnreachable } from \"@/common/utils\";\nimport type { VersionedDataHandler } from \"@/common/versioned-data\";\nimport type { Encoding } from \"@/mod\";\nimport { jsonStringifyCompat } from \"./actor/protocol/serde\";\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 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<T>(\n\tencoding: Encoding,\n\tvalue: T,\n\tversionedDataHandler: VersionedDataHandler<T>,\n): Uint8Array | string {\n\tif (encoding === \"json\") {\n\t\treturn jsonStringifyCompat(value);\n\t} else if (encoding === \"cbor\") {\n\t\treturn cbor.encode(value);\n\t} else if (encoding === \"bare\") {\n\t\treturn versionedDataHandler.serializeWithEmbeddedVersion(value);\n\t} else {\n\t\tassertUnreachable(encoding);\n\t}\n}\n\nexport function deserializeWithEncoding<T>(\n\tencoding: Encoding,\n\tbuffer: Uint8Array | string,\n\tversionedDataHandler: VersionedDataHandler<T>,\n): T {\n\tif (encoding === \"json\") {\n\t\tif (typeof buffer === \"string\") {\n\t\t\treturn JSON.parse(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\treturn JSON.parse(jsonString);\n\t\t}\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\treturn cbor.decode(buffer);\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\treturn versionedDataHandler.deserializeWithEmbeddedVersion(buffer);\n\t} else {\n\t\tassertUnreachable(encoding);\n\t}\n}\n","import * as errors from \"./errors\";\nimport { logger } from \"./log\";\n\nexport function assertUnreachable(x: never): never {\n\tlogger().error(\"unreachable\", { value: `${x}`, stack: new Error().stack });\n\tthrow new errors.Unreachable(x);\n}\n\nexport const throttle = <\n\t// biome-ignore lint/suspicious/noExplicitAny: we want to allow any function\n\tFn extends (...args: any) => any,\n>(\n\tfn: Fn,\n\tdelay: number,\n) => {\n\tlet lastRan = false;\n\tlet lastArgs: Parameters<Fn> | null = null;\n\n\treturn (...args: Parameters<Fn>) => {\n\t\tif (!lastRan) {\n\t\t\tfn.apply(this, args);\n\t\t\tlastRan = true;\n\t\t\tconst timer = () =>\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tlastRan = false;\n\t\t\t\t\tif (lastArgs) {\n\t\t\t\t\t\tfn.apply(this, lastArgs);\n\t\t\t\t\t\tlastRan = true;\n\t\t\t\t\t\tlastArgs = null;\n\t\t\t\t\t\ttimer();\n\t\t\t\t\t}\n\t\t\t\t}, delay);\n\t\t\ttimer();\n\t\t} else lastArgs = args;\n\t};\n};\n\nexport class DeadlineError extends Error {\n\tconstructor() {\n\t\tsuper(\"Promise did not complete before deadline.\");\n\t}\n}\n\nexport function deadline<T>(promise: Promise<T>, timeout: number): Promise<T> {\n\tconst controller = new AbortController();\n\tconst signal = controller.signal;\n\n\t// Set a timeout to abort the operation\n\tconst timeoutId = setTimeout(() => controller.abort(), timeout);\n\n\treturn Promise.race<T>([\n\t\tpromise,\n\t\tnew Promise<T>((_, reject) => {\n\t\t\tsignal.addEventListener(\"abort\", () => reject(new DeadlineError()));\n\t\t}),\n\t]).finally(() => {\n\t\tclearTimeout(timeoutId);\n\t});\n}\n\nexport class Lock<T> {\n\tprivate _locked = false;\n\tprivate _waiting: Array<() => void> = [];\n\n\tconstructor(private _value: T) {}\n\n\tasync lock(fn: (value: T) => Promise<void>): Promise<void> {\n\t\tif (this._locked) {\n\t\t\tawait new Promise<void>((resolve) => this._waiting.push(resolve));\n\t\t}\n\t\tthis._locked = true;\n\n\t\ttry {\n\t\t\tawait fn(this._value);\n\t\t} finally {\n\t\t\tthis._locked = false;\n\t\t\tconst next = this._waiting.shift();\n\t\t\tif (next) next();\n\t\t}\n\t}\n}\n\nexport function generateSecureToken(length = 32) {\n\tconst array = new Uint8Array(length);\n\tcrypto.getRandomValues(array);\n\treturn btoa(String.fromCharCode(...array));\n}\n\nexport function generateRandomString(length = 32) {\n\tconst characters =\n\t\t\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\";\n\tlet result = \"\";\n\tfor (let i = 0; i < length; i++) {\n\t\tconst randomIndex = Math.floor(Math.random() * characters.length);\n\t\tresult += characters[randomIndex];\n\t}\n\treturn result;\n}\n","import * as cbor from \"cbor-x\";\nimport type { Context as HonoContext, HonoRequest } from \"hono\";\nimport { type SSEStreamingApi, streamSSE } from \"hono/streaming\";\nimport type { WSContext } from \"hono/ws\";\nimport { ActionContext } from \"@/actor/action\";\nimport type { AnyConn } from \"@/actor/connection\";\nimport {\n\tCONNECTION_DRIVER_HTTP,\n\tCONNECTION_DRIVER_SSE,\n\tCONNECTION_DRIVER_WEBSOCKET,\n\tgenerateConnId,\n\tgenerateConnToken,\n} from \"@/actor/connection\";\nimport * as errors from \"@/actor/errors\";\nimport type { AnyActorInstance } from \"@/actor/instance\";\nimport type { InputData } from \"@/actor/protocol/serde\";\nimport { type Encoding, EncodingSchema } from \"@/actor/protocol/serde\";\nimport type { UpgradeWebSocketArgs } from \"@/common/inline-websocket-adapter2\";\nimport { deconstructError, stringifyError } from \"@/common/utils\";\nimport type { UniversalWebSocket } from \"@/common/websocket-interface\";\nimport { HonoWebSocketAdapter } from \"@/manager/hono-websocket-adapter\";\nimport type { RunConfig } from \"@/registry/run-config\";\nimport type * as protocol from \"@/schemas/client-protocol/mod\";\nimport {\n\tHTTP_ACTION_REQUEST_VERSIONED,\n\tHTTP_ACTION_RESPONSE_VERSIONED,\n\tTO_SERVER_VERSIONED,\n} from \"@/schemas/client-protocol/versioned\";\nimport {\n\tcontentTypeForEncoding,\n\tdeserializeWithEncoding,\n\tserializeWithEncoding,\n} from \"@/serde\";\nimport { bufferToArrayBuffer } from \"@/utils\";\nimport type { ActorDriver } from \"./driver\";\nimport type {\n\tGenericHttpDriverState,\n\tGenericSseDriverState,\n\tGenericWebSocketDriverState,\n} from \"./generic-conn-driver\";\nimport { logger } from \"./log\";\nimport { parseMessage } from \"./protocol/old\";\n\nexport interface ConnectWebSocketOpts {\n\treq?: HonoRequest;\n\tencoding: Encoding;\n\tactorId: string;\n\tparams: unknown;\n\tauthData: unknown;\n}\n\nexport interface ConnectWebSocketOutput {\n\tonOpen: (ws: WSContext) => void;\n\tonMessage: (message: protocol.ToServer) => void;\n\tonClose: () => void;\n}\n\nexport interface ConnectSseOpts {\n\treq?: HonoRequest;\n\tencoding: Encoding;\n\tparams: unknown;\n\tactorId: string;\n\tauthData: unknown;\n}\n\nexport interface ConnectSseOutput {\n\tonOpen: (stream: SSEStreamingApi) => void;\n\tonClose: () => Promise<void>;\n}\n\nexport interface ActionOpts {\n\treq?: HonoRequest;\n\tparams: unknown;\n\tactionName: string;\n\tactionArgs: unknown[];\n\tactorId: string;\n\tauthData: unknown;\n}\n\nexport interface ActionOutput {\n\toutput: unknown;\n}\n\nexport interface ConnsMessageOpts {\n\treq?: HonoRequest;\n\tconnId: string;\n\tconnToken: string;\n\tmessage: protocol.ToServer;\n\tactorId: string;\n}\n\nexport interface FetchOpts {\n\trequest: Request;\n\tactorId: string;\n\tauthData: unknown;\n}\n\nexport interface WebSocketOpts {\n\trequest: Request;\n\twebsocket: UniversalWebSocket;\n\tactorId: string;\n\tauthData: unknown;\n}\n\n/**\n * Creates a WebSocket connection handler\n */\nexport async function handleWebSocketConnect(\n\treq: Request | undefined,\n\trunConfig: RunConfig,\n\tactorDriver: ActorDriver,\n\tactorId: string,\n\tencoding: Encoding,\n\tparameters: unknown,\n\tauthData: unknown,\n): Promise<UpgradeWebSocketArgs> {\n\tconst exposeInternalError = req ? getRequestExposeInternalError(req) : false;\n\n\t// Setup promise for the init handlers since all other behavior depends on this\n\tconst {\n\t\tpromise: handlersPromise,\n\t\tresolve: handlersResolve,\n\t\treject: handlersReject,\n\t} = Promise.withResolvers<{\n\t\tconn: AnyConn;\n\t\tactor: AnyActorInstance;\n\t\tconnId: string;\n\t}>();\n\n\t// Pre-load the actor to catch errors early\n\tlet actor: AnyActorInstance;\n\ttry {\n\t\tactor = await actorDriver.loadActor(actorId);\n\t} catch (error) {\n\t\t// Return handler that immediately closes with error\n\t\treturn {\n\t\t\tonOpen: (_evt: any, ws: WSContext) => {\n\t\t\t\tconst { code } = deconstructError(\n\t\t\t\t\terror,\n\t\t\t\t\tlogger(),\n\t\t\t\t\t{\n\t\t\t\t\t\twsEvent: \"open\",\n\t\t\t\t\t},\n\t\t\t\t\texposeInternalError,\n\t\t\t\t);\n\t\t\t\tws.close(1011, code);\n\t\t\t},\n\t\t\tonMessage: (_evt: { data: any }, ws: WSContext) => {\n\t\t\t\tws.close(1011, \"Actor not loaded\");\n\t\t\t},\n\t\t\tonClose: (_event: any, _ws: WSContext) => {},\n\t\t\tonError: (_error: unknown) => {},\n\t\t};\n\t}\n\n\treturn {\n\t\tonOpen: (_evt: any, ws: WSContext) => {\n\t\t\tlogger().debug(\"websocket open\");\n\n\t\t\t// Run async operations in background\n\t\t\t(async () => {\n\t\t\t\ttry {\n\t\t\t\t\tconst connId = generateConnId();\n\t\t\t\t\tconst connToken = generateConnToken();\n\t\t\t\t\tconst connState = await actor.prepareConn(parameters, req);\n\n\t\t\t\t\t// Save socket\n\t\t\t\t\tconst connGlobalState =\n\t\t\t\t\t\tactorDriver.getGenericConnGlobalState(actorId);\n\t\t\t\t\tconnGlobalState.websockets.set(connId, ws);\n\t\t\t\t\tlogger().debug(\"registered websocket for conn\", {\n\t\t\t\t\t\tactorId,\n\t\t\t\t\t\ttotalCount: connGlobalState.websockets.size,\n\t\t\t\t\t});\n\n\t\t\t\t\t// Create connection\n\t\t\t\t\tconst conn = await actor.createConn(\n\t\t\t\t\t\tconnId,\n\t\t\t\t\t\tconnToken,\n\t\t\t\t\t\tparameters,\n\t\t\t\t\t\tconnState,\n\t\t\t\t\t\tCONNECTION_DRIVER_WEBSOCKET,\n\t\t\t\t\t\t{ encoding } satisfies GenericWebSocketDriverState,\n\t\t\t\t\t\tauthData,\n\t\t\t\t\t);\n\n\t\t\t\t\t// Unblock other handlers\n\t\t\t\t\thandlersResolve({ conn, actor, connId });\n\t\t\t\t} catch (error) {\n\t\t\t\t\thandlersReject(error);\n\n\t\t\t\t\tconst { code } = deconstructError(\n\t\t\t\t\t\terror,\n\t\t\t\t\t\tlogger(),\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\twsEvent: \"open\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\texposeInternalError,\n\t\t\t\t\t);\n\t\t\t\t\tws.close(1011, code);\n\t\t\t\t}\n\t\t\t})();\n\t\t},\n\t\tonMessage: (evt: { data: any }, ws: WSContext) => {\n\t\t\t// Handle message asynchronously\n\t\t\thandlersPromise\n\t\t\t\t.then(({ conn, actor }) => {\n\t\t\t\t\tlogger().debug(\"received message\");\n\n\t\t\t\t\tconst value = evt.data.valueOf() as InputData;\n\t\t\t\t\tparseMessage(value, {\n\t\t\t\t\t\tencoding: encoding,\n\t\t\t\t\t\tmaxIncomingMessageSize: runConfig.maxIncomingMessageSize,\n\t\t\t\t\t})\n\t\t\t\t\t\t.then((message) => {\n\t\t\t\t\t\t\tactor.processMessage(message, conn).catch((error) => {\n\t\t\t\t\t\t\t\tconst { code } = deconstructError(\n\t\t\t\t\t\t\t\t\terror,\n\t\t\t\t\t\t\t\t\tlogger(),\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\twsEvent: \"message\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\texposeInternalError,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tws.close(1011, code);\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.catch((error) => {\n\t\t\t\t\t\t\tconst { code } = deconstructError(\n\t\t\t\t\t\t\t\terror,\n\t\t\t\t\t\t\t\tlogger(),\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\twsEvent: \"message\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\texposeInternalError,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tws.close(1011, code);\n\t\t\t\t\t\t});\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tconst { code } = deconstructError(\n\t\t\t\t\t\terror,\n\t\t\t\t\t\tlogger(),\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\twsEvent: \"message\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\texposeInternalError,\n\t\t\t\t\t);\n\t\t\t\t\tws.close(1011, code);\n\t\t\t\t});\n\t\t},\n\t\tonClose: (\n\t\t\tevent: {\n\t\t\t\twasClean: boolean;\n\t\t\t\tcode: number;\n\t\t\t\treason: string;\n\t\t\t},\n\t\t\tws: WSContext,\n\t\t) => {\n\t\t\tif (event.wasClean) {\n\t\t\t\tlogger().info(\"websocket closed\", {\n\t\t\t\t\tcode: event.code,\n\t\t\t\t\treason: event.reason,\n\t\t\t\t\twasClean: event.wasClean,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tlogger().warn(\"websocket closed\", {\n\t\t\t\t\tcode: event.code,\n\t\t\t\t\treason: event.reason,\n\t\t\t\t\twasClean: event.wasClean,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// HACK: Close socket in order to fix bug with Cloudflare leaving WS in closing state\n\t\t\t// https://github.com/cloudflare/workerd/issues/2569\n\t\t\tws.close(1000, \"hack_force_close\");\n\n\t\t\t// Handle cleanup asynchronously\n\t\t\thandlersPromise\n\t\t\t\t.then(({ conn, actor, connId }) => {\n\t\t\t\t\tconst connGlobalState =\n\t\t\t\t\t\tactorDriver.getGenericConnGlobalState(actorId);\n\t\t\t\t\tconst didDelete = connGlobalState.websockets.delete(connId);\n\t\t\t\t\tif (didDelete) {\n\t\t\t\t\t\tlogger().info(\"removing websocket for conn\", {\n\t\t\t\t\t\t\ttotalCount: connGlobalState.websockets.size,\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlogger().warn(\"websocket does not exist for conn\", {\n\t\t\t\t\t\t\tactorId,\n\t\t\t\t\t\t\ttotalCount: connGlobalState.websockets.size,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tactor.__removeConn(conn);\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tdeconstructError(\n\t\t\t\t\t\terror,\n\t\t\t\t\t\tlogger(),\n\t\t\t\t\t\t{ wsEvent: \"close\" },\n\t\t\t\t\t\texposeInternalError,\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t},\n\t\tonError: (_error: unknown) => {\n\t\t\ttry {\n\t\t\t\t// Actors don't need to know about this, since it's abstracted away\n\t\t\t\tlogger().warn(\"websocket error\");\n\t\t\t} catch (error) {\n\t\t\t\tdeconstructError(\n\t\t\t\t\terror,\n\t\t\t\t\tlogger(),\n\t\t\t\t\t{ wsEvent: \"error\" },\n\t\t\t\t\texposeInternalError,\n\t\t\t\t);\n\t\t\t}\n\t\t},\n\t};\n}\n\n/**\n * Creates an SSE connection handler\n */\nexport async function handleSseConnect(\n\tc: HonoContext,\n\t_runConfig: RunConfig,\n\tactorDriver: ActorDriver,\n\tactorId: string,\n\tauthData: unknown,\n) {\n\tconst encoding = getRequestEncoding(c.req);\n\tconst parameters = getRequestConnParams(c.req);\n\n\t// Return the main handler with all async work inside\n\treturn streamSSE(c, async (stream) => {\n\t\tlet actor: AnyActorInstance | undefined;\n\t\tlet connId: string | undefined;\n\t\tlet connToken: string | undefined;\n\t\tlet connState: unknown;\n\t\tlet conn: AnyConn | undefined;\n\n\t\ttry {\n\t\t\t// Do all async work inside the handler\n\t\t\tactor = await actorDriver.loadActor(actorId);\n\t\t\tconnId = generateConnId();\n\t\t\tconnToken = generateConnToken();\n\t\t\tconnState = await actor.prepareConn(parameters, c.req.raw);\n\n\t\t\tlogger().debug(\"sse open\");\n\n\t\t\t// Save stream\n\t\t\tactorDriver\n\t\t\t\t.getGenericConnGlobalState(actorId)\n\t\t\t\t.sseStreams.set(connId, stream);\n\n\t\t\t// Create connection\n\t\t\tconn = await actor.createConn(\n\t\t\t\tconnId,\n\t\t\t\tconnToken,\n\t\t\t\tparameters,\n\t\t\t\tconnState,\n\t\t\t\tCONNECTION_DRIVER_SSE,\n\t\t\t\t{ encoding } satisfies GenericSseDriverState,\n\t\t\t\tauthData,\n\t\t\t);\n\n\t\t\t// Wait for close\n\t\t\tconst abortResolver = Promise.withResolvers();\n\n\t\t\t// Handle stream abort (when client closes the connection)\n\t\t\tstream.onAbort(async () => {\n\t\t\t\ttry {\n\t\t\t\t\tlogger().debug(\"sse stream aborted\");\n\n\t\t\t\t\t// Cleanup\n\t\t\t\t\tif (connId) {\n\t\t\t\t\t\tactorDriver\n\t\t\t\t\t\t\t.getGenericConnGlobalState(actorId)\n\t\t\t\t\t\t\t.sseStreams.delete(connId);\n\t\t\t\t\t}\n\t\t\t\t\tif (conn && actor) {\n\t\t\t\t\t\tactor.__removeConn(conn);\n\t\t\t\t\t}\n\n\t\t\t\t\tabortResolver.resolve(undefined);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tlogger().error(\"error closing sse connection\", { error });\n\t\t\t\t\tabortResolver.resolve(undefined);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// HACK: Will throw if not configured\n\t\t\ttry {\n\t\t\t\tc.executionCtx.waitUntil(abortResolver.promise);\n\t\t\t} catch {}\n\n\t\t\t// Wait until connection aborted\n\t\t\tawait abortResolver.promise;\n\t\t} catch (error) {\n\t\t\tlogger().error(\"error in sse connection\", { error });\n\n\t\t\t// Cleanup on error\n\t\t\tif (connId !== undefined) {\n\t\t\t\tactorDriver\n\t\t\t\t\t.getGenericConnGlobalState(actorId)\n\t\t\t\t\t.sseStreams.delete(connId);\n\t\t\t}\n\t\t\tif (conn && actor !== undefined) {\n\t\t\t\tactor.__removeConn(conn);\n\t\t\t}\n\n\t\t\t// Close the stream on error\n\t\t\tstream.close();\n\t\t}\n\t});\n}\n\n/**\n * Creates an action handler\n */\nexport async function handleAction(\n\tc: HonoContext,\n\t_runConfig: RunConfig,\n\tactorDriver: ActorDriver,\n\tactionName: string,\n\tactorId: string,\n\tauthData: unknown,\n) {\n\tconst encoding = getRequestEncoding(c.req);\n\tconst parameters = getRequestConnParams(c.req);\n\n\tlogger().debug(\"handling action\", { actionName, encoding });\n\n\t// Validate incoming request\n\tconst arrayBuffer = await c.req.arrayBuffer();\n\tconst request = deserializeWithEncoding(\n\t\tencoding,\n\t\tnew Uint8Array(arrayBuffer),\n\t\tHTTP_ACTION_REQUEST_VERSIONED,\n\t);\n\tconst actionArgs = cbor.decode(new Uint8Array(request.args));\n\n\t// Invoke the action\n\tlet actor: AnyActorInstance | undefined;\n\tlet conn: AnyConn | undefined;\n\tlet output: unknown | undefined;\n\ttry {\n\t\tactor = await actorDriver.loadActor(actorId);\n\n\t\t// Create conn\n\t\tconst connState = await actor.prepareConn(parameters, c.req.raw);\n\t\tconn = await actor.createConn(\n\t\t\tgenerateConnId(),\n\t\t\tgenerateConnToken(),\n\t\t\tparameters,\n\t\t\tconnState,\n\t\t\tCONNECTION_DRIVER_HTTP,\n\t\t\t{} satisfies GenericHttpDriverState,\n\t\t\tauthData,\n\t\t);\n\n\t\t// Call action\n\t\tconst ctx = new ActionContext(actor.actorContext!, conn!);\n\t\toutput = await actor.executeAction(ctx, actionName, actionArgs);\n\t} finally {\n\t\tif (conn) {\n\t\t\tactor?.__removeConn(conn);\n\t\t}\n\t}\n\n\t// Send response\n\tconst responseData: protocol.HttpActionResponse = {\n\t\toutput: bufferToArrayBuffer(cbor.encode(output)),\n\t};\n\tconst serialized = serializeWithEncoding(\n\t\tencoding,\n\t\tresponseData,\n\t\tHTTP_ACTION_RESPONSE_VERSIONED,\n\t);\n\treturn c.body(serialized as Uint8Array, 200, {\n\t\t\"Content-Type\": contentTypeForEncoding(encoding),\n\t});\n}\n\n/**\n * Create a connection message handler\n */\nexport async function handleConnectionMessage(\n\tc: HonoContext,\n\t_runConfig: RunConfig,\n\tactorDriver: ActorDriver,\n\tconnId: string,\n\tconnToken: string,\n\tactorId: string,\n) {\n\tconst encoding = getRequestEncoding(c.req);\n\n\t// Validate incoming request\n\tconst arrayBuffer = await c.req.arrayBuffer();\n\tconst message = deserializeWithEncoding(\n\t\tencoding,\n\t\tnew Uint8Array(arrayBuffer),\n\t\tTO_SERVER_VERSIONED,\n\t);\n\n\tconst actor = await actorDriver.loadActor(actorId);\n\n\t// Find connection\n\tconst conn = actor.conns.get(connId);\n\tif (!conn) {\n\t\tthrow new errors.ConnNotFound(connId);\n\t}\n\n\t// Authenticate connection\n\tif (conn._token !== connToken) {\n\t\tthrow new errors.IncorrectConnToken();\n\t}\n\n\t// Process message\n\tawait actor.processMessage(message, conn);\n\n\treturn c.json({});\n}\n\nexport async function handleRawWebSocketHandler(\n\treq: Request | undefined,\n\tpath: string,\n\tactorDriver: ActorDriver,\n\tactorId: string,\n\tauthData: unknown,\n): Promise<UpgradeWebSocketArgs> {\n\tconst actor = await actorDriver.loadActor(actorId);\n\n\t// Return WebSocket event handlers\n\treturn {\n\t\tonOpen: (_evt: any, ws: any) => {\n\t\t\t// Wrap the Hono WebSocket in our adapter\n\t\t\tconst adapter = new HonoWebSocketAdapter(ws);\n\n\t\t\t// Store adapter reference on the WebSocket for event handlers\n\t\t\t(ws as any).__adapter = adapter;\n\n\t\t\t// Extract the path after prefix and preserve query parameters\n\t\t\t// Use URL API for cleaner parsing\n\t\t\tconst url = new URL(path, \"http://actor\");\n\t\t\tconst pathname = url.pathname.replace(/^\\/raw\\/websocket/, \"\") || \"/\";\n\t\t\tconst normalizedPath = pathname + url.search;\n\n\t\t\tlet newRequest: Request;\n\t\t\tif (req) {\n\t\t\t\tnewRequest = new Request(`http://actor${normalizedPath}`, req);\n\t\t\t} else {\n\t\t\t\tnewRequest = new Request(`http://actor${normalizedPath}`, {\n\t\t\t\t\tmethod: \"GET\",\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tlogger().debug(\"rewriting websocket url\", {\n\t\t\t\tfrom: path,\n\t\t\t\tto: newRequest.url,\n\t\t\t});\n\n\t\t\t// Call the actor's onWebSocket handler with the adapted WebSocket\n\t\t\tactor.handleWebSocket(adapter, {\n\t\t\t\trequest: newRequest,\n\t\t\t\tauth: authData,\n\t\t\t});\n\t\t},\n\t\tonMessage: (event: any, ws: any) => {\n\t\t\t// Find the adapter for this WebSocket\n\t\t\tconst adapter = (ws as any).__adapter;\n\t\t\tif (adapter) {\n\t\t\t\tadapter._handleMessage(event);\n\t\t\t}\n\t\t},\n\t\tonClose: (evt: any, ws: any) => {\n\t\t\t// Find the adapter for this WebSocket\n\t\t\tconst adapter = (ws as any).__adapter;\n\t\t\tif (adapter) {\n\t\t\t\tadapter._handleClose(evt?.code || 1006, evt?.reason || \"\");\n\t\t\t}\n\t\t},\n\t\tonError: (error: any, ws: any) => {\n\t\t\t// Find the adapter for this WebSocket\n\t\t\tconst adapter = (ws as any).__adapter;\n\t\t\tif (adapter) {\n\t\t\t\tadapter._handleError(error);\n\t\t\t}\n\t\t},\n\t};\n}\n\n// Helper to get the connection encoding from a request\nexport function getRequestEncoding(req: HonoRequest): Encoding {\n\tconst encodingParam = req.header(HEADER_ENCODING);\n\tif (!encodingParam) {\n\t\tthrow new errors.InvalidEncoding(\"undefined\");\n\t}\n\n\tconst result = EncodingSchema.safeParse(encodingParam);\n\tif (!result.success) {\n\t\tthrow new errors.InvalidEncoding(encodingParam as string);\n\t}\n\n\treturn result.data;\n}\n\nexport function getRequestExposeInternalError(req: Request): boolean {\n\tconst param = req.headers.get(HEADER_EXPOSE_INTERNAL_ERROR);\n\tif (!param) {\n\t\treturn false;\n\t}\n\n\treturn param === \"true\";\n}\n\nexport function getRequestQuery(c: HonoContext): unknown {\n\t// Get query parameters for actor lookup\n\tconst queryParam = c.req.header(HEADER_ACTOR_QUERY);\n\tif (!queryParam) {\n\t\tlogger().error(\"missing query parameter\");\n\t\tthrow new errors.InvalidRequest(\"missing query\");\n\t}\n\n\t// Parse the query JSON and validate with schema\n\ttry {\n\t\tconst parsed = JSON.parse(queryParam);\n\t\treturn parsed;\n\t} catch (error) {\n\t\tlogger().error(\"invalid query json\", { error });\n\t\tthrow new errors.InvalidQueryJSON(error);\n\t}\n}\n\nexport const HEADER_ACTOR_QUERY = \"X-RivetKit-Query\";\n\nexport const HEADER_ENCODING = \"X-RivetKit-Encoding\";\n\n// Internal header\nexport const HEADER_EXPOSE_INTERNAL_ERROR = \"X-RivetKit-Expose-Internal-Error\";\n\n// IMPORTANT: Params must be in headers or in an E2EE part of the request (i.e. NOT the URL or query string) in order to ensure that tokens can be securely passed in params.\nexport const HEADER_CONN_PARAMS = \"X-RivetKit-Conn-Params\";\n\n// Internal header\nexport const HEADER_AUTH_DATA = \"X-RivetKit-Auth-Data\";\n\nexport const HEADER_ACTOR_ID = \"X-RivetKit-Actor\";\n\nexport const HEADER_CONN_ID = \"X-RivetKit-Conn\";\n\nexport const HEADER_CONN_TOKEN = \"X-RivetKit-Conn-Token\";\n\n/**\n * Headers that publics can send from public clients.\n *\n * Used for CORS.\n **/\nexport const ALLOWED_PUBLIC_HEADERS = [\n\t\"Content-Type\",\n\t\"User-Agent\",\n\tHEADER_ACTOR_QUERY,\n\tHEADER_ENCODING,\n\tHEADER_CONN_PARAMS,\n\tHEADER_ACTOR_ID,\n\tHEADER_CONN_ID,\n\tHEADER_CONN_TOKEN,\n];\n\n// Helper to get connection parameters for the request\nexport function getRequestConnParams(req: HonoRequest): unknown {\n\tconst paramsParam = req.header(HEADER_CONN_PARAMS);\n\tif (!paramsParam) {\n\t\treturn null;\n\t}\n\n\ttry {\n\t\treturn JSON.parse(paramsParam);\n\t} catch (err) {\n\t\tthrow new errors.InvalidParams(\n\t\t\t`Invalid params JSON: ${stringifyError(err)}`,\n\t\t);\n\t}\n}\n","import type { ActorKey } from \"@/actor/mod\";\nimport type { Client } from \"@/client/client\";\nimport type { Logger } from \"@/common/log\";\nimport type { Registry } from \"@/registry/mod\";\nimport type { Conn, ConnId } from \"./connection\";\nimport type { ActorContext } from \"./context\";\nimport type { AnyDatabaseProvider, InferDatabaseClient } from \"./database\";\nimport type { SaveStateOptions } from \"./instance\";\nimport type { Schedule } from \"./schedule\";\n\n/**\n * Context for a remote procedure call.\n *\n * @typeParam A Actor this action belongs to\n */\nexport class ActionContext<\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTAuthData,\n\tTDatabase extends AnyDatabaseProvider,\n> {\n\t#actorContext: ActorContext<\n\t\tTState,\n\t\tTConnParams,\n\t\tTConnState,\n\t\tTVars,\n\t\tTInput,\n\t\tTAuthData,\n\t\tTDatabase\n\t>;\n\n\t/**\n\t * Should not be called directly.\n\t *\n\t * @param actorContext - The actor context\n\t * @param conn - The connection associated with the action\n\t */\n\tconstructor(\n\t\tactorContext: ActorContext<\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTAuthData,\n\t\t\tTDatabase\n\t\t>,\n\t\tpublic readonly conn: Conn<\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTAuthData,\n\t\t\tTDatabase\n\t\t>,\n\t) {\n\t\tthis.#actorContext = actorContext;\n\t}\n\n\t/**\n\t * Get the actor state\n\t */\n\tget state(): TState {\n\t\treturn this.#actorContext.state;\n\t}\n\n\t/**\n\t * Get the actor variables\n\t */\n\tget vars(): TVars {\n\t\treturn this.#actorContext.vars;\n\t}\n\n\t/**\n\t * Broadcasts an event to all connected clients.\n\t */\n\tbroadcast(name: string, ...args: any[]): void {\n\t\tthis.#actorContext.broadcast(name, ...args);\n\t}\n\n\t/**\n\t * Gets the logger instance.\n\t */\n\tget log(): Logger {\n\t\treturn this.#actorContext.log;\n\t}\n\n\t/**\n\t * Gets actor ID.\n\t */\n\tget actorId(): string {\n\t\treturn this.#actorContext.actorId;\n\t}\n\n\t/**\n\t * Gets the actor name.\n\t */\n\tget name(): string {\n\t\treturn this.#actorContext.name;\n\t}\n\n\t/**\n\t * Gets the actor key.\n\t */\n\tget key(): ActorKey {\n\t\treturn this.#actorContext.key;\n\t}\n\n\t/**\n\t * Gets the region.\n\t */\n\tget region(): string {\n\t\treturn this.#actorContext.region;\n\t}\n\n\t/**\n\t * Gets the scheduler.\n\t */\n\tget schedule(): Schedule {\n\t\treturn this.#actorContext.schedule;\n\t}\n\n\t/**\n\t * Gets the map of connections.\n\t */\n\tget conns(): Map<\n\t\tConnId,\n\t\tConn<TState, TConnParams, TConnState, TVars, TInput, TAuthData, TDatabase>\n\t> {\n\t\treturn this.#actorContext.conns;\n\t}\n\n\t/**\n\t * Returns the client for the given registry.\n\t */\n\tclient<R extends Registry<any>>(): Client<R> {\n\t\treturn this.#actorContext.client<R>();\n\t}\n\n\t/**\n\t * @experimental\n\t */\n\tget db(): InferDatabaseClient<TDatabase> {\n\t\treturn this.#actorContext.db;\n\t}\n\n\t/**\n\t * Forces the state to get saved.\n\t */\n\tasync saveState(opts: SaveStateOptions): Promise<void> {\n\t\treturn this.#actorContext.saveState(opts);\n\t}\n\n\t/**\n\t * Prevents the actor from sleeping until promise is complete.\n\t */\n\twaitUntil(promise: Promise<void>): void {\n\t\tthis.#actorContext.waitUntil(promise);\n\t}\n\n\t/**\n\t * AbortSignal that fires when the actor is stopping.\n\t */\n\tget abortSignal(): AbortSignal {\n\t\treturn this.#actorContext.abortSignal;\n\t}\n\n\t/**\n\t * Forces the actor to sleep.\n\t *\n\t * Not supported on all drivers.\n\t *\n\t * @experimental\n\t */\n\tsleep() {\n\t\tthis.#actorContext.sleep();\n\t}\n}\n","import { getLogger } from \"@/common//log\";\n\nexport const LOGGER_NAME = \"actor-manager\";\n\nexport function logger() {\n\treturn getLogger(LOGGER_NAME);\n}\n","import type { WSContext } from \"hono/ws\";\nimport type {\n\tRivetCloseEvent,\n\tRivetEvent,\n\tRivetMessageEvent,\n\tUniversalWebSocket,\n} from \"@/common/websocket-interface\";\nimport { logger } from \"./log\";\n\n/**\n * HonoWebSocketAdapter provides a WebSocket-like interface over WSContext\n * for raw WebSocket handling in actors\n */\nexport class HonoWebSocketAdapter implements UniversalWebSocket {\n\t// WebSocket readyState values\n\treadonly CONNECTING = 0 as const;\n\treadonly OPEN = 1 as const;\n\treadonly CLOSING = 2 as const;\n\treadonly CLOSED = 3 as const;\n\n\t#ws: WSContext;\n\t#readyState: 0 | 1 | 2 | 3 = 1; // Start as OPEN since WSContext is already connected\n\t#eventListeners: Map<string, Set<(event: any) => void>> = new Map();\n\t#closeCode?: number;\n\t#closeReason?: string;\n\n\tconstructor(ws: WSContext) {\n\t\tthis.#ws = ws;\n\n\t\t// The WSContext is already open when we receive it\n\t\tthis.#readyState = this.OPEN;\n\n\t\t// Immediately fire the open event\n\t\tsetTimeout(() => {\n\t\t\tthis.#fireEvent(\"open\", { type: \"open\", target: this });\n\t\t}, 0);\n\t}\n\n\tget readyState(): 0 | 1 | 2 | 3 {\n\t\treturn this.#readyState;\n\t}\n\n\tget binaryType(): \"arraybuffer\" | \"blob\" {\n\t\treturn \"arraybuffer\";\n\t}\n\n\tset binaryType(value: \"arraybuffer\" | \"blob\") {\n\t\t// Ignored for now - always use arraybuffer\n\t}\n\n\tget bufferedAmount(): number {\n\t\treturn 0; // Not tracked in WSContext\n\t}\n\n\tget extensions(): string {\n\t\treturn \"\"; // Not available in WSContext\n\t}\n\n\tget protocol(): string {\n\t\treturn \"\"; // Not available in WSContext\n\t}\n\n\tget url(): string {\n\t\treturn \"\"; // Not available in WSContext\n\t}\n\n\tsend(data: string | ArrayBufferLike | Blob | ArrayBufferView): void {\n\t\tif (this.readyState !== this.OPEN) {\n\t\t\tthrow new Error(\"WebSocket is not open\");\n\t\t}\n\n\t\ttry {\n\t\t\tlogger().debug(\"bridge sending data\", {\n\t\t\t\tdataType: typeof data,\n\t\t\t\tisString: typeof data === \"string\",\n\t\t\t\tisArrayBuffer: data instanceof ArrayBuffer,\n\t\t\t\tdataStr:\n\t\t\t\t\ttypeof data === \"string\" ? data.substring(0, 100) : \"<non-string>\",\n\t\t\t});\n\n\t\t\tif (typeof data === \"string\") {\n\t\t\t\t(this.#ws as any).send(data);\n\t\t\t} else if (data instanceof ArrayBuffer) {\n\t\t\t\t(this.#ws as any).send(data);\n\t\t\t} else if (ArrayBuffer.isView(data)) {\n\t\t\t\t// Convert ArrayBufferView to ArrayBuffer\n\t\t\t\tconst buffer = data.buffer.slice(\n\t\t\t\t\tdata.byteOffset,\n\t\t\t\t\tdata.byteOffset + data.byteLength,\n\t\t\t\t);\n\t\t\t\t// Check if it's a SharedArrayBuffer and convert to ArrayBuffer\n\t\t\t\tif (buffer instanceof SharedArrayBuffer) {\n\t\t\t\t\tconst arrayBuffer = new ArrayBuffer(buffer.byteLength);\n\t\t\t\t\tnew Uint8Array(arrayBuffer).set(new Uint8Array(buffer));\n\t\t\t\t\t(this.#ws as any).send(arrayBuffer);\n\t\t\t\t} else {\n\t\t\t\t\t(this.#ws as any).send(buffer);\n\t\t\t\t}\n\t\t\t} else if (data instanceof Blob) {\n\t\t\t\t// Convert Blob to ArrayBuffer\n\t\t\t\tdata\n\t\t\t\t\t.arrayBuffer()\n\t\t\t\t\t.then((buffer) => {\n\t\t\t\t\t\t(this.#ws as any).send(buffer);\n\t\t\t\t\t})\n\t\t\t\t\t.catch((error) => {\n\t\t\t\t\t\tlogger().error(\"failed to convert blob to arraybuffer\", { error });\n\t\t\t\t\t\tthis.#fireEvent(\"error\", { type: \"error\", target: this, error });\n\t\t\t\t\t});\n\t\t\t} else {\n\t\t\t\t// Try to convert to string as a fallback\n\t\t\t\tlogger().warn(\"unsupported data type, converting to string\", {\n\t\t\t\t\tdataType: typeof data,\n\t\t\t\t\tdata,\n\t\t\t\t});\n\t\t\t\t(this.#ws as any).send(String(data));\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tlogger().error(\"error sending websocket data\", { error });\n\t\t\tthis.#fireEvent(\"error\", { type: \"error\", target: this, error });\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tclose(code = 1000, reason = \"\"): void {\n\t\tif (this.readyState === this.CLOSING || this.readyState === this.CLOSED) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.#readyState = this.CLOSING;\n\t\tthis.#closeCode = code;\n\t\tthis.#closeReason = reason;\n\n\t\ttry {\n\t\t\t(this.#ws as any).close(code, reason);\n\n\t\t\t// Update state and fire close event\n\t\t\tthis.#readyState = this.CLOSED;\n\t\t\tthis.#fireEvent(\"close\", {\n\t\t\t\ttype: \"close\",\n\t\t\t\ttarget: this,\n\t\t\t\tcode,\n\t\t\t\treason,\n\t\t\t\twasClean: code === 1000,\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tlogger().error(\"error closing websocket\", { error });\n\t\t\tthis.#readyState = this.CLOSED;\n\t\t\tthis.#fireEvent(\"close\", {\n\t\t\t\ttype: \"close\",\n\t\t\t\ttarget: this,\n\t\t\t\tcode: 1006,\n\t\t\t\treason: \"Abnormal closure\",\n\t\t\t\twasClean: false,\n\t\t\t});\n\t\t}\n\t}\n\n\taddEventListener(type: string, listener: (event: any) => void): void {\n\t\tif (!this.#eventListeners.has(type)) {\n\t\t\tthis.#eventListeners.set(type, new Set());\n\t\t}\n\t\tthis.#eventListeners.get(type)!.add(listener);\n\t}\n\n\tremoveEventListener(type: string, listener: (event: any) => void): void {\n\t\tconst listeners = this.#eventListeners.get(type);\n\t\tif (listeners) {\n\t\t\tlisteners.delete(listener);\n\t\t}\n\t}\n\n\tdispatchEvent(event: RivetEvent): boolean {\n\t\tconst listeners = this.#eventListeners.get(event.type);\n\t\tif (listeners) {\n\t\t\tfor (const listener of listeners) {\n\t\t\t\ttry {\n\t\t\t\t\tlistener(event);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tlogger().error(`error in ${event.type} event listener`, { error });\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\n\t// Internal method to handle incoming messages from WSContext\n\t_handleMessage(data: any): void {\n\t\t// Hono may pass either raw data or a MessageEvent-like object\n\t\tlet messageData: string | ArrayBuffer | ArrayBufferView;\n\n\t\tif (typeof data === \"string\") {\n\t\t\tmessageData = data;\n\t\t} else if (data instanceof ArrayBuffer || ArrayBuffer.isView(data)) {\n\t\t\tmessageData = data;\n\t\t} else if (data && typeof data === \"object\" && \"data\" in data) {\n\t\t\t// Handle MessageEvent-like objects\n\t\t\tmessageData = data.data;\n\t\t} else {\n\t\t\t// Fallback - shouldn't happen in normal operation\n\t\t\tmessageData = String(data);\n\t\t}\n\n\t\tlogger().debug(\"bridge handling message\", {\n\t\t\tdataType: typeof messageData,\n\t\t\tisArrayBuffer: messageData instanceof ArrayBuffer,\n\t\t\tdataStr: typeof messageData === \"string\" ? messageData : \"<binary>\",\n\t\t});\n\n\t\tthis.#fireEvent(\"message\", {\n\t\t\ttype: \"message\",\n\t\t\ttarget: this,\n\t\t\tdata: messageData,\n\t\t});\n\t}\n\n\t// Internal method to handle close from WSContext\n\t_handleClose(code: number, reason: string): void {\n\t\t// HACK: Close socket in order to fix bug with Cloudflare leaving WS in closing state\n\t\t// https://github.com/cloudflare/workerd/issues/2569\n\t\t(this.#ws as any).close(1000, \"hack_force_close\");\n\n\t\tif (this.readyState === this.CLOSED) return;\n\n\t\tthis.#readyState = this.CLOSED;\n\t\tthis.#closeCode = code;\n\t\tthis.#closeReason = reason;\n\n\t\tthis.#fireEvent(\"close\", {\n\t\t\ttype: \"close\",\n\t\t\ttarget: this,\n\t\t\tcode,\n\t\t\treason,\n\t\t\twasClean: code === 1000,\n\t\t});\n\t}\n\n\t// Internal method to handle errors from WSContext\n\t_handleError(error: any): void {\n\t\tthis.#fireEvent(\"error\", {\n\t\t\ttype: \"error\",\n\t\t\ttarget: this,\n\t\t\terror,\n\t\t});\n\t}\n\n\t#fireEvent(type: string, event: any): void {\n\t\tconst listeners = this.#eventListeners.get(type);\n\t\tif (listeners) {\n\t\t\tfor (const listener of listeners) {\n\t\t\t\ttry {\n\t\t\t\t\tlistener(event);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tlogger().error(`error in ${type} event listener`, { error });\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Also check for on* properties\n\t\tswitch (type) {\n\t\t\tcase \"open\":\n\t\t\t\tif (this.#onopen) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tthis.#onopen(event);\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tlogger().error(\"error in onopen handler\", { error });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"close\":\n\t\t\t\tif (this.#onclose) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tthis.#onclose(event);\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tlogger().error(\"error in onclose handler\", { error });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"error\":\n\t\t\t\tif (this.#onerror) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tthis.#onerror(event);\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tlogger().error(\"error in onerror handler\", { error });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"message\":\n\t\t\t\tif (this.#onmessage) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tthis.#onmessage(event);\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tlogger().error(\"error in onmessage handler\", { error });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Event handler properties with getters/setters\n\t#onopen: ((event: RivetEvent) => void) | null = null;\n\t#onclose: ((event: RivetCloseEvent) => void) | null = null;\n\t#onerror: ((event: RivetEvent) => void) | null = null;\n\t#onmessage: ((event: RivetMessageEvent) => void) | null = null;\n\n\tget onopen(): ((event: RivetEvent) => void) | null {\n\t\treturn this.#onopen;\n\t}\n\tset onopen(handler: ((event: RivetEvent) => void) | null) {\n\t\tthis.#onopen = handler;\n\t}\n\n\tget onclose(): ((event: RivetCloseEvent) => void) | null {\n\t\treturn this.#onclose;\n\t}\n\tset onclose(handler: ((event: RivetCloseEvent) => void) | null) {\n\t\tthis.#onclose = handler;\n\t}\n\n\tget onerror(): ((event: RivetEvent) => void) | null {\n\t\treturn this.#onerror;\n\t}\n\tset onerror(handler: ((event: RivetEvent) => void) | null) {\n\t\tthis.#onerror = handler;\n\t}\n\n\tget onmessage(): ((event: RivetMessageEvent) => void) | null {\n\t\treturn this.#onmessage;\n\t}\n\tset onmessage(handler: ((event: RivetMessageEvent) => void) | null) {\n\t\tthis.#onmessage = handler;\n\t}\n}\n","import * as cbor from \"cbor-x\";\nimport { z } from \"zod\";\nimport type { AnyDatabaseProvider } from \"@/actor/database\";\nimport * as errors from \"@/actor/errors\";\nimport {\n\tCachedSerializer,\n\ttype Encoding,\n\ttype InputData,\n} from \"@/actor/protocol/serde\";\nimport { deconstructError } from \"@/common/utils\";\nimport type * as protocol from \"@/schemas/client-protocol/mod\";\nimport {\n\tTO_CLIENT_VERSIONED,\n\tTO_SERVER_VERSIONED,\n} from \"@/schemas/client-protocol/versioned\";\nimport { deserializeWithEncoding } from \"@/serde\";\nimport { assertUnreachable, bufferToArrayBuffer } from \"../../utils\";\nimport { ActionContext } from \"../action\";\nimport type { Conn } from \"../connection\";\nimport type { ActorInstance } from \"../instance\";\nimport { logger } from \"../log\";\n\nexport const TransportSchema = z.enum([\"websocket\", \"sse\"]);\n\n/**\n * Transport mechanism used to communicate between client & actor.\n */\nexport type Transport = z.infer<typeof TransportSchema>;\n\ninterface MessageEventOpts {\n\tencoding: Encoding;\n\tmaxIncomingMessageSize: number;\n}\n\nfunction getValueLength(value: InputData): number {\n\tif (typeof value === \"string\") {\n\t\treturn value.length;\n\t} else if (value instanceof Blob) {\n\t\treturn value.size;\n\t} else if (\n\t\tvalue instanceof ArrayBuffer ||\n\t\tvalue instanceof SharedArrayBuffer ||\n\t\tvalue instanceof Uint8Array\n\t) {\n\t\treturn value.byteLength;\n\t} else {\n\t\tassertUnreachable(value);\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} else if (data instanceof Blob) {\n\t\tconst arrayBuffer = await data.arrayBuffer();\n\t\treturn new Uint8Array(arrayBuffer);\n\t} else if (data instanceof Uint8Array) {\n\t\treturn data;\n\t} else if (data instanceof ArrayBuffer || data instanceof SharedArrayBuffer) {\n\t\treturn new Uint8Array(data);\n\t} else {\n\t\tthrow new errors.MalformedMessage();\n\t}\n}\n\nexport async function parseMessage(\n\tvalue: InputData,\n\topts: MessageEventOpts,\n): Promise<protocol.ToServer> {\n\t// Validate value length\n\tconst length = getValueLength(value);\n\tif (length > opts.maxIncomingMessageSize) {\n\t\tthrow new errors.MessageTooLong();\n\t}\n\n\t// Parse & validate message\n\tconst buffer = await inputDataToBuffer(value);\n\treturn deserializeWithEncoding(opts.encoding, buffer, TO_SERVER_VERSIONED);\n}\n\nexport interface ProcessMessageHandler<\n\tS,\n\tCP,\n\tCS,\n\tV,\n\tI,\n\tAD,\n\tDB extends AnyDatabaseProvider,\n> {\n\tonExecuteAction?: (\n\t\tctx: ActionContext<S, CP, CS, V, I, AD, DB>,\n\t\tname: string,\n\t\targs: unknown[],\n\t) => Promise<unknown>;\n\tonSubscribe?: (\n\t\teventName: string,\n\t\tconn: Conn<S, CP, CS, V, I, AD, DB>,\n\t) => Promise<void>;\n\tonUnsubscribe?: (\n\t\teventName: string,\n\t\tconn: Conn<S, CP, CS, V, I, AD, DB>,\n\t) => Promise<void>;\n}\n\nexport async function processMessage<\n\tS,\n\tCP,\n\tCS,\n\tV,\n\tI,\n\tAD,\n\tDB extends AnyDatabaseProvider,\n>(\n\tmessage: protocol.ToServer,\n\tactor: ActorInstance<S, CP, CS, V, I, AD, DB>,\n\tconn: Conn<S, CP, CS, V, I, AD, DB>,\n\thandler: ProcessMessageHandler<S, CP, CS, V, I, AD, DB>,\n) {\n\tlet actionId: bigint | undefined;\n\tlet actionName: string | undefined;\n\n\ttry {\n\t\tif (message.body.tag === \"ActionRequest\") {\n\t\t\t// Action request\n\n\t\t\tif (handler.onExecuteAction === undefined) {\n\t\t\t\tthrow new errors.Unsupported(\"Action\");\n\t\t\t}\n\n\t\t\tconst { id, name, args: argsRaw } = message.body.val;\n\t\t\tactionId = id;\n\t\t\tactionName = name;\n\t\t\tconst args = cbor.decode(new Uint8Array(argsRaw));\n\n\t\t\tlogger().debug(\"processing action request\", {\n\t\t\t\tactionId: id,\n\t\t\t\tactionName: name,\n\t\t\t});\n\n\t\t\tconst ctx = new ActionContext<S, CP, CS, V, I, AD, DB>(\n\t\t\t\tactor.actorContext,\n\t\t\t\tconn,\n\t\t\t);\n\n\t\t\t// Process the action request and wait for the result\n\t\t\t// This will wait for async actions to complete\n\t\t\tconst output = await handler.onExecuteAction(ctx, name, args);\n\n\t\t\tlogger().debug(\"sending action response\", {\n\t\t\t\tactionId: id,\n\t\t\t\tactionName: name,\n\t\t\t\toutputType: typeof output,\n\t\t\t\tisPromise: output instanceof Promise,\n\t\t\t});\n\n\t\t\t// Send the response back to the client\n\t\t\tconn._sendMessage(\n\t\t\t\tnew CachedSerializer<protocol.ToClient>(\n\t\t\t\t\t{\n\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\ttag: \"ActionResponse\",\n\t\t\t\t\t\t\tval: {\n\t\t\t\t\t\t\t\tid: id,\n\t\t\t\t\t\t\t\toutput: bufferToArrayBuffer(cbor.encode(output)),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tTO_CLIENT_VERSIONED,\n\t\t\t\t),\n\t\t\t);\n\n\t\t\tlogger().debug(\"action response sent\", { id, name: name });\n\t\t} else if (message.body.tag === \"SubscriptionRequest\") {\n\t\t\t// Subscription request\n\n\t\t\tif (\n\t\t\t\thandler.onSubscribe === undefined ||\n\t\t\t\thandler.onUnsubscribe === undefined\n\t\t\t) {\n\t\t\t\tthrow new errors.Unsupported(\"Subscriptions\");\n\t\t\t}\n\n\t\t\tconst { eventName, subscribe } = message.body.val;\n\t\t\tlogger().debug(\"processing subscription request\", {\n\t\t\t\teventName,\n\t\t\t\tsubscribe,\n\t\t\t});\n\n\t\t\tif (subscribe) {\n\t\t\t\tawait handler.onSubscribe(eventName, conn);\n\t\t\t} else {\n\t\t\t\tawait handler.onUnsubscribe(eventName, conn);\n\t\t\t}\n\n\t\t\tlogger().debug(\"subscription request completed\", {\n\t\t\t\teventName,\n\t\t\t\tsubscribe,\n\t\t\t});\n\t\t} else {\n\t\t\tassertUnreachable(message.body);\n\t\t}\n\t} catch (error) {\n\t\tconst { code, message, metadata } = deconstructError(error, logger(), {\n\t\t\tconnectionId: conn.id,\n\t\t\tactionId,\n\t\t\tactionName,\n\t\t});\n\n\t\tlogger().debug(\"sending error response\", {\n\t\t\tactionId,\n\t\t\tactionName,\n\t\t\tcode,\n\t\t\tmessage,\n\t\t});\n\n\t\t// Build response\n\t\tconn._sendMessage(\n\t\t\tnew CachedSerializer<protocol.ToClient>(\n\t\t\t\t{\n\t\t\t\t\tbody: {\n\t\t\t\t\t\ttag: \"Error\",\n\t\t\t\t\t\tval: {\n\t\t\t\t\t\t\tcode,\n\t\t\t\t\t\t\tmessage,\n\t\t\t\t\t\t\tmetadata: bufferToArrayBuffer(cbor.encode(metadata)),\n\t\t\t\t\t\t\tactionId: actionId ?? null,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tTO_CLIENT_VERSIONED,\n\t\t\t),\n\t\t);\n\n\t\tlogger().debug(\"error response sent\", { actionId, actionName });\n\t}\n}\n\n///**\n// * Use `CachedSerializer` if serializing the same data repeatedly.\n// */\n//export function serialize<T>(value: T, encoding: Encoding): OutputData {\n//\tif (encoding === \"json\") {\n//\t\treturn JSON.stringify(value);\n//\t} else if (encoding === \"cbor\") {\n//\t\t// TODO: Remove this hack, but cbor-x can't handle anything extra in data structures\n//\t\tconst cleanValue = JSON.parse(JSON.stringify(value));\n//\t\treturn cbor.encode(cleanValue);\n//\t} else {\n//\t\tassertUnreachable(encoding);\n//\t}\n//}\n//\n//export async function deserialize(data: InputData, encoding: Encoding) {\n//\tif (encoding === \"json\") {\n//\t\tif (typeof data !== \"string\") {\n//\t\t\tlogger().warn(\"received non-string for json parse\");\n//\t\t\tthrow new errors.MalformedMessage();\n//\t\t} else {\n//\t\t\treturn JSON.parse(data);\n//\t\t}\n//\t} else if (encoding === \"cbor\") {\n//\t\tif (data instanceof Blob) {\n//\t\t\tconst arrayBuffer = await data.arrayBuffer();\n//\t\t\treturn cbor.decode(new Uint8Array(arrayBuffer));\n//\t\t} else if (data instanceof Uint8Array) {\n//\t\t\treturn cbor.decode(data);\n//\t\t} else if (\n//\t\t\tdata instanceof ArrayBuffer ||\n//\t\t\tdata instanceof SharedArrayBuffer\n//\t\t) {\n//\t\t\treturn cbor.decode(new Uint8Array(data));\n//\t\t} else {\n//\t\t\tlogger().warn(\"received non-binary type for cbor parse\");\n//\t\t\tthrow new errors.MalformedMessage();\n//\t\t}\n//\t} else {\n//\t\tassertUnreachable(encoding);\n//\t}\n//}\n"],"mappings":"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","names":["cbor","config","assertUnreachable","assertUnreachable","cbor","logger","logger","cbor","z","z","message","actor"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/test/mod.ts","../../src/test/config.ts","../../src/test/log.ts"],"sourcesContent":["import { createServer } from \"node:net\";\nimport { serve as honoServe, type ServerType } from \"@hono/node-server\";\nimport { createNodeWebSocket } from \"@hono/node-ws\";\nimport { type TestContext, vi } from \"vitest\";\nimport { type Client, createClient } from \"@/client/mod\";\nimport { chooseDefaultDriver } from \"@/drivers/default\";\nimport { createFileSystemOrMemoryDriver } from \"@/drivers/file-system/mod\";\nimport { createInlineClientDriver } from \"@/inline-client-driver/mod\";\nimport { getInspectorUrl } from \"@/inspector/utils\";\nimport { createManagerRouter } from \"@/manager/router\";\nimport type { Registry } from \"@/registry/mod\";\nimport { RunConfigSchema } from \"@/registry/run-config\";\nimport { ConfigSchema, type InputConfig } from \"./config\";\nimport { logger } from \"./log\";\n\nfunction serve(registry: Registry<any>, inputConfig?: InputConfig): ServerType {\n\t// Configure default configuration\n\tinputConfig ??= {};\n\n\tconst config = ConfigSchema.parse(inputConfig);\n\n\tlet upgradeWebSocket: any;\n\tif (!config.getUpgradeWebSocket) {\n\t\tconfig.getUpgradeWebSocket = () => upgradeWebSocket!;\n\t}\n\n\t// Create router\n\tconst runConfig = RunConfigSchema.parse(inputConfig);\n\tconst driver = inputConfig.driver ?? createFileSystemOrMemoryDriver(false);\n\tconst managerDriver = driver.manager(registry.config, config);\n\tconst inlineClientDriver = createInlineClientDriver(managerDriver);\n\tconst { router } = createManagerRouter(\n\t\tregistry.config,\n\t\trunConfig,\n\t\tinlineClientDriver,\n\t\tmanagerDriver,\n\t\tfalse,\n\t);\n\n\t// Inject WebSocket\n\tconst nodeWebSocket = createNodeWebSocket({ app: router });\n\tupgradeWebSocket = nodeWebSocket.upgradeWebSocket;\n\n\tconst server = honoServe({\n\t\tfetch: router.fetch,\n\t\thostname: config.hostname,\n\t\tport: config.port,\n\t});\n\tnodeWebSocket.injectWebSocket(server);\n\n\tlogger().info(\"rivetkit started\", {\n\t\thostname: config.hostname,\n\t\tport: config.port,\n\t\tdefinitions: Object.keys(registry.config.use).length,\n\t});\n\n\treturn server;\n}\n\nexport interface SetupTestResult<A extends Registry<any>> {\n\tclient: Client<A>;\n\tmockDriver: {\n\t\tactorDriver: {\n\t\t\tsetCreateVarsContext: (ctx: any) => void;\n\t\t};\n\t};\n}\n\n// Must use `TestContext` since global hooks do not work when running concurrently\nexport async function setupTest<A extends Registry<any>>(\n\tc: TestContext,\n\tregistry: A,\n): Promise<SetupTestResult<A>> {\n\tvi.useFakeTimers();\n\n\t// Set up mock driver for testing createVars context\n\tconst mockDriverContext: any = {};\n\tconst setDriverContextFn = (ctx: any) => {\n\t\tmockDriverContext.current = ctx;\n\t};\n\n\t// We don't need to modify the driver context anymore since we're testing with the actual context\n\n\t// Start server with a random port\n\tconst port = await getPort();\n\tconst server = serve(registry, { port });\n\tc.onTestFinished(\n\t\tasync () => await new Promise((resolve) => server.close(() => resolve())),\n\t);\n\n\t// Create client\n\tconst client = createClient<A>(`http://127.0.0.1:${port}`);\n\tc.onTestFinished(async () => await client.dispose());\n\n\treturn {\n\t\tclient,\n\t\tmockDriver: {\n\t\t\tactorDriver: {\n\t\t\t\tsetCreateVarsContext: setDriverContextFn,\n\t\t\t},\n\t\t},\n\t};\n}\n\nexport async function getPort(): Promise<number> {\n\t// Pick random port between 10000 and 65535 (avoiding well-known and registered ports)\n\tconst MIN_PORT = 10000;\n\tconst MAX_PORT = 65535;\n\tconst getRandomPort = () =>\n\t\tMath.floor(Math.random() * (MAX_PORT - MIN_PORT + 1)) + MIN_PORT;\n\n\tlet port = getRandomPort();\n\tlet maxAttempts = 10;\n\n\twhile (maxAttempts > 0) {\n\t\ttry {\n\t\t\t// Try to create a server on the port to check if it's available\n\t\t\tconst server = await new Promise<any>((resolve, reject) => {\n\t\t\t\tconst server = createServer();\n\n\t\t\t\tserver.once(\"error\", (err: Error & { code?: string }) => {\n\t\t\t\t\tif (err.code === \"EADDRINUSE\") {\n\t\t\t\t\t\treject(new Error(`Port ${port} is in use`));\n\t\t\t\t\t} else {\n\t\t\t\t\t\treject(err);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tserver.once(\"listening\", () => {\n\t\t\t\t\tresolve(server);\n\t\t\t\t});\n\n\t\t\t\tserver.listen(port);\n\t\t\t});\n\n\t\t\t// Close the server since we're just checking availability\n\t\t\tawait new Promise<void>((resolve) => {\n\t\t\t\tserver.close(() => resolve());\n\t\t\t});\n\n\t\t\treturn port;\n\t\t} catch (err) {\n\t\t\t// If port is in use, try a different one\n\t\t\tmaxAttempts--;\n\t\t\tif (maxAttempts <= 0) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tport = getRandomPort();\n\t\t}\n\t}\n\n\tthrow new Error(\"Could not find an available port after multiple attempts\");\n}\n","import { z } from \"zod\";\nimport { RunConfigSchema } from \"@/registry/run-config\";\n\nexport const ConfigSchema = RunConfigSchema.removeDefault()\n\t.extend({\n\t\thostname: z\n\t\t\t.string()\n\t\t\t.optional()\n\t\t\t.default(process.env.HOSTNAME ?? \"127.0.0.1\"),\n\t\tport: z\n\t\t\t.number()\n\t\t\t.optional()\n\t\t\t.default(Number.parseInt(process.env.PORT ?? \"8080\")),\n\t})\n\t.default({});\nexport type InputConfig = z.input<typeof ConfigSchema>;\n","import { getLogger } from \"@/common/log\";\n\nexport const LOGGER_NAME = \"nodejs\";\n\nexport function logger() {\n\treturn getLogger(LOGGER_NAME);\n}\n"],"mappings":"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","names":["server"]}
|