rivetkit 2.0.30 → 2.0.32

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.
Files changed (131) hide show
  1. package/dist/schemas/actor-persist/v1.ts +2 -2
  2. package/dist/schemas/actor-persist/v2.ts +2 -2
  3. package/dist/schemas/actor-persist/v3.ts +2 -2
  4. package/dist/schemas/client-protocol/v1.ts +2 -2
  5. package/dist/schemas/client-protocol/v2.ts +2 -2
  6. package/dist/schemas/file-system-driver/v1.ts +2 -2
  7. package/dist/schemas/file-system-driver/v2.ts +2 -2
  8. package/dist/schemas/file-system-driver/v3.ts +2 -2
  9. package/dist/tsup/actor/errors.cjs +4 -2
  10. package/dist/tsup/actor/errors.cjs.map +1 -1
  11. package/dist/tsup/actor/errors.d.cts +5 -2
  12. package/dist/tsup/actor/errors.d.ts +5 -2
  13. package/dist/tsup/actor/errors.js +5 -3
  14. package/dist/tsup/{chunk-46DWBVYE.cjs → chunk-24MVWG2B.cjs} +15 -15
  15. package/dist/tsup/{chunk-46DWBVYE.cjs.map → chunk-24MVWG2B.cjs.map} +1 -1
  16. package/dist/tsup/{chunk-DGSYEC34.js → chunk-2E6QYC2Y.js} +18 -18
  17. package/dist/tsup/chunk-2E6QYC2Y.js.map +1 -0
  18. package/dist/tsup/{chunk-23EJLAOV.cjs → chunk-3YT2J462.cjs} +8 -8
  19. package/dist/tsup/{chunk-23EJLAOV.cjs.map → chunk-3YT2J462.cjs.map} +1 -1
  20. package/dist/tsup/{chunk-GOC4GSPT.js → chunk-46RC64TZ.js} +119 -32
  21. package/dist/tsup/chunk-46RC64TZ.js.map +1 -0
  22. package/dist/tsup/{chunk-REMOXAIW.cjs → chunk-4WDHG57J.cjs} +21 -10
  23. package/dist/tsup/chunk-4WDHG57J.cjs.map +1 -0
  24. package/dist/tsup/{chunk-YBOQOQZB.js → chunk-5MD6ZIUI.js} +172 -115
  25. package/dist/tsup/chunk-5MD6ZIUI.js.map +1 -0
  26. package/dist/tsup/{chunk-ZUJRXXQC.cjs → chunk-GDXRMMOY.cjs} +372 -315
  27. package/dist/tsup/chunk-GDXRMMOY.cjs.map +1 -0
  28. package/dist/tsup/{chunk-MAQSR26X.cjs → chunk-I2OKFOBV.cjs} +16 -5
  29. package/dist/tsup/chunk-I2OKFOBV.cjs.map +1 -0
  30. package/dist/tsup/{chunk-3WG6PXWE.cjs → chunk-JFUFZNBY.cjs} +3 -3
  31. package/dist/tsup/{chunk-3WG6PXWE.cjs.map → chunk-JFUFZNBY.cjs.map} +1 -1
  32. package/dist/tsup/{chunk-DI7LJEYL.cjs → chunk-JXZMBI2W.cjs} +6 -6
  33. package/dist/tsup/{chunk-DI7LJEYL.cjs.map → chunk-JXZMBI2W.cjs.map} +1 -1
  34. package/dist/tsup/{chunk-VROCBPWT.cjs → chunk-KCP36F62.cjs} +10 -10
  35. package/dist/tsup/{chunk-VROCBPWT.cjs.map → chunk-KCP36F62.cjs.map} +1 -1
  36. package/dist/tsup/{chunk-Z33UBLLH.js → chunk-KSKIKS4Q.js} +9 -9
  37. package/dist/tsup/{chunk-Z33UBLLH.js.map → chunk-KSKIKS4Q.js.map} +1 -1
  38. package/dist/tsup/{chunk-NYQJHQHK.cjs → chunk-MJX33BZM.cjs} +283 -196
  39. package/dist/tsup/chunk-MJX33BZM.cjs.map +1 -0
  40. package/dist/tsup/{chunk-FVSTM7QK.cjs → chunk-MR3O2TFJ.cjs} +3 -3
  41. package/dist/tsup/{chunk-FVSTM7QK.cjs.map → chunk-MR3O2TFJ.cjs.map} +1 -1
  42. package/dist/tsup/{chunk-EOXUA7SX.js → chunk-OKZQC52X.js} +2 -2
  43. package/dist/tsup/{chunk-K2UD42XA.js → chunk-QCVN5ZWE.js} +2 -2
  44. package/dist/tsup/{chunk-DQH5K5TL.js → chunk-RQEUDCBR.js} +3 -3
  45. package/dist/tsup/{chunk-DQH5K5TL.js.map → chunk-RQEUDCBR.js.map} +1 -1
  46. package/dist/tsup/{chunk-HPIRVETT.js → chunk-RSSAT5PN.js} +3 -3
  47. package/dist/tsup/{chunk-HPIRVETT.js.map → chunk-RSSAT5PN.js.map} +1 -1
  48. package/dist/tsup/{chunk-F4CRQFYG.cjs → chunk-TEDQEGUV.cjs} +30 -30
  49. package/dist/tsup/chunk-TEDQEGUV.cjs.map +1 -0
  50. package/dist/tsup/{chunk-OI6FEIRD.js → chunk-TK7XXGVD.js} +15 -4
  51. package/dist/tsup/chunk-TK7XXGVD.js.map +1 -0
  52. package/dist/tsup/{chunk-SLAUR4QB.js → chunk-UMVOVPLU.js} +2 -2
  53. package/dist/tsup/{chunk-P2RZJPYI.js → chunk-V35I3JSW.js} +16 -5
  54. package/dist/tsup/chunk-V35I3JSW.js.map +1 -0
  55. package/dist/tsup/client/mod.cjs +11 -9
  56. package/dist/tsup/client/mod.cjs.map +1 -1
  57. package/dist/tsup/client/mod.d.cts +2 -2
  58. package/dist/tsup/client/mod.d.ts +2 -2
  59. package/dist/tsup/client/mod.js +10 -8
  60. package/dist/tsup/common/log.cjs +3 -3
  61. package/dist/tsup/common/log.js +2 -2
  62. package/dist/tsup/common/websocket.cjs +4 -4
  63. package/dist/tsup/common/websocket.js +3 -3
  64. package/dist/tsup/{config-Dj5nTCrh.d.cts → config-D6nMVDna.d.cts} +36 -1
  65. package/dist/tsup/{config-Cs3B9xN9.d.ts → config-DN0AurPi.d.ts} +36 -1
  66. package/dist/tsup/driver-helpers/mod.cjs +5 -5
  67. package/dist/tsup/driver-helpers/mod.d.cts +1 -1
  68. package/dist/tsup/driver-helpers/mod.d.ts +1 -1
  69. package/dist/tsup/driver-helpers/mod.js +4 -4
  70. package/dist/tsup/driver-test-suite/mod.cjs +172 -74
  71. package/dist/tsup/driver-test-suite/mod.cjs.map +1 -1
  72. package/dist/tsup/driver-test-suite/mod.d.cts +1 -1
  73. package/dist/tsup/driver-test-suite/mod.d.ts +1 -1
  74. package/dist/tsup/driver-test-suite/mod.js +113 -15
  75. package/dist/tsup/driver-test-suite/mod.js.map +1 -1
  76. package/dist/tsup/inspector/mod.cjs +6 -6
  77. package/dist/tsup/inspector/mod.d.cts +2 -2
  78. package/dist/tsup/inspector/mod.d.ts +2 -2
  79. package/dist/tsup/inspector/mod.js +5 -5
  80. package/dist/tsup/mod.cjs +10 -10
  81. package/dist/tsup/mod.cjs.map +1 -1
  82. package/dist/tsup/mod.d.cts +2 -2
  83. package/dist/tsup/mod.d.ts +2 -2
  84. package/dist/tsup/mod.js +9 -9
  85. package/dist/tsup/test/mod.cjs +12 -12
  86. package/dist/tsup/test/mod.d.cts +1 -1
  87. package/dist/tsup/test/mod.d.ts +1 -1
  88. package/dist/tsup/test/mod.js +11 -11
  89. package/dist/tsup/utils.cjs +5 -3
  90. package/dist/tsup/utils.cjs.map +1 -1
  91. package/dist/tsup/utils.d.cts +3 -1
  92. package/dist/tsup/utils.d.ts +3 -1
  93. package/dist/tsup/utils.js +4 -2
  94. package/package.json +3 -3
  95. package/src/actor/config.ts +3 -2
  96. package/src/actor/conn/drivers/websocket.ts +15 -0
  97. package/src/actor/errors.ts +14 -3
  98. package/src/actor/instance/event-manager.ts +7 -0
  99. package/src/actor/instance/state-manager.ts +1 -1
  100. package/src/actor/protocol/old.ts +1 -1
  101. package/src/actor/protocol/serde.ts +1 -1
  102. package/src/actor/router-endpoints.ts +13 -1
  103. package/src/actor/router-websocket-endpoints.ts +5 -0
  104. package/src/client/actor-conn.ts +196 -133
  105. package/src/client/config.ts +4 -1
  106. package/src/client/mod.ts +3 -1
  107. package/src/client/utils.ts +1 -1
  108. package/src/driver-test-suite/tests/action-features.ts +63 -0
  109. package/src/driver-test-suite/tests/actor-conn.ts +91 -0
  110. package/src/drivers/file-system/global-state.ts +4 -5
  111. package/src/drivers/file-system/manager.ts +12 -4
  112. package/src/engine-process/mod.ts +16 -10
  113. package/src/registry/run-config.ts +3 -0
  114. package/src/registry/serve.ts +96 -7
  115. package/src/schemas/actor-persist/versioned.ts +3 -4
  116. package/src/serde.ts +1 -1
  117. package/src/test/mod.ts +1 -1
  118. package/src/utils.ts +14 -0
  119. package/dist/tsup/chunk-DGSYEC34.js.map +0 -1
  120. package/dist/tsup/chunk-F4CRQFYG.cjs.map +0 -1
  121. package/dist/tsup/chunk-GOC4GSPT.js.map +0 -1
  122. package/dist/tsup/chunk-MAQSR26X.cjs.map +0 -1
  123. package/dist/tsup/chunk-NYQJHQHK.cjs.map +0 -1
  124. package/dist/tsup/chunk-OI6FEIRD.js.map +0 -1
  125. package/dist/tsup/chunk-P2RZJPYI.js.map +0 -1
  126. package/dist/tsup/chunk-REMOXAIW.cjs.map +0 -1
  127. package/dist/tsup/chunk-YBOQOQZB.js.map +0 -1
  128. package/dist/tsup/chunk-ZUJRXXQC.cjs.map +0 -1
  129. /package/dist/tsup/{chunk-EOXUA7SX.js.map → chunk-OKZQC52X.js.map} +0 -0
  130. /package/dist/tsup/{chunk-K2UD42XA.js.map → chunk-QCVN5ZWE.js.map} +0 -0
  131. /package/dist/tsup/{chunk-SLAUR4QB.js.map → chunk-UMVOVPLU.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/runner/work/rivet/rivet/rivetkit-typescript/packages/rivetkit/dist/tsup/chunk-23EJLAOV.cjs","../../src/actor/log.ts","../../src/actor/utils.ts","../../src/common/actor-router-consts.ts","../../src/serde.ts","../../src/actor/protocol/serde.ts"],"names":["assertUnreachable"],"mappings":"AAAA;AACE;AACA;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACA;ACLO,SAAS,oBAAA,CAAA,EAAuB;AACtC,EAAA,OAAO,yCAAA,eAAyB,CAAA;AACjC;ADOA;AACA;AEVO,SAASA,kBAAAA,CAAkB,CAAA,EAAiB;AAClD,EAAA,oBAAA,CAAqB,CAAA,CAAE,KAAA,CAAM;AAAA,IAC5B,GAAA,EAAK,aAAA;AAAA,IACL,KAAA,EAAO,CAAA,EAAA;AACA,IAAA;AACP,EAAA;AACgB,EAAA;AAClB;AA+Ba;AACZ,EAAA;AACO,IAAA;AACP,EAAA;AACD;AAEgB;AACT,EAAA;AACA,EAAA;AAGA,EAAA;AAEC,EAAA;AACN,IAAA;AACI,IAAA;AACH,MAAA;AACA,IAAA;AACC,EAAA;AACF,IAAA;AACA,EAAA;AACF;AAwBgB;AACT,EAAA;AACC,EAAA;AAEA,EAAA;AAIR;AAEgB;AACT,EAAA;AAEF,EAAA;AACK,EAAA;AACF,IAAA;AACN,IAAA;AACD,EAAA;AACO,EAAA;AACR;AAKgB;AACR,EAAA;AACR;AAKgB;AACL,EAAA;AACF,IAAA;AACR,EAAA;AACM,EAAA;AACF,EAAA;AACI,IAAA;AACR,EAAA;AACM,EAAA;AAEC,EAAA;AACR;AF5DY;AACA;AGlEC;AACA;AACA;AACA;AAGA;AAEA;AAGA;AAEA;AAEA;AAGA;AACA;AACA;AAIA;AACA;AACA;AACA;AACA;AAIA;AAOA;AACZ,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACD;AH+CY;AACA;AIrGA;AACL;AJuGK;AACA;AKxGH;AAaI;AAUA;AACZ,EAAA;AACS,EAAA;AACT,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AAEA,EAAA;AAQM,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACN,EAAA;AAEW,EAAA;AACH,IAAA;AACR,EAAA;AAEiB,EAAA;AACV,IAAA;AACF,IAAA;AACH,MAAA;AACM,IAAA;AACA,MAAA;AACL,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACD,MAAA;AACK,MAAA;AACL,MAAA;AACD,IAAA;AACD,EAAA;AACD;AA8CS;AACJ,EAAA;AACE,EAAA;AACG,EAAA;AACR,IAAA;AACD,EAAA;AACO,EAAA;AACR;AAES;AACF,EAAA;AACC,EAAA;AACR;AAeS;AAEJ,EAAA;AACI,IAAA;AACR,EAAA;AAGM,EAAA;AACA,EAAA;AACA,EAAA;AACG,EAAA;AACD,IAAA;AACR,EAAA;AACO,EAAA;AACR;AAES;AACD,EAAA;AACR;AAGgB;AACR,EAAA;AACF,IAAA;AACH,MAAA;AACD,IAAA;AACC,MAAA;AACD,IAAA;AACC,MAAA;AACD,IAAA;AAIC,IAAA;AAKA,MAAA;AACD,IAAA;AAEO,IAAA;AACP,EAAA;AACF;AAGgB;AACR,EAAA;AAGL,IAAA;AAMI,MAAA;AACH,QAAA;AACD,MAAA;AACC,QAAA;AACD,MAAA;AACC,QAAA;AACD,MAAA;AAGI,MAAA;AACH,QAAA;AACD,MAAA;AAGM,MAAA;AACL,QAAA;AACD,MAAA;AACD,IAAA;AAEO,IAAA;AACP,EAAA;AACF;ALbY;AACA;AIzMI;AAEX,EAAA;AACI,IAAA;AACR,EAAA;AAGI,EAAA;AACE,EAAA;AACG,EAAA;AACR,IAAA;AACD,EAAA;AACO,EAAA;AACR;AAYgB;AACX,EAAA;AACI,IAAA;AACR,EAAA;AACQ,IAAA;AACD,EAAA;AACN,IAAA;AACD,EAAA;AACD;AAcgB;AASX,EAAA;AACG,IAAA;AACA,IAAA;AACC,IAAA;AACR,EAAA;AACO,IAAA;AACA,IAAA;AACM,IAAA;AACb,EAAA;AACM,IAAA;AACE,MAAA;AACL,QAAA;AACD,MAAA;AACD,IAAA;AACI,IAAA;AACG,MAAA;AACP,IAAA;AACM,IAAA;AACC,IAAA;AACN,MAAA;AACA,MAAA;AACD,IAAA;AACM,EAAA;AACN,IAAA;AACD,EAAA;AACD;AAEgB;AAQX,EAAA;AACC,IAAA;AACA,IAAA;AACH,MAAA;AACM,IAAA;AACA,MAAA;AACA,MAAA;AACN,MAAA;AACD,IAAA;AACM,IAAA;AACC,IAAA;AACR,EAAA;AACC,IAAA;AACC,MAAA;AACA,MAAA;AACD,IAAA;AAEM,IAAA;AAEA,IAAA;AAEC,IAAA;AACR,EAAA;AACC,IAAA;AACC,MAAA;AACA,MAAA;AACD,IAAA;AACK,IAAA;AACE,MAAA;AACL,QAAA;AACD,MAAA;AACD,IAAA;AACM,IAAA;AAEC,IAAA;AACD,EAAA;AACN,IAAA;AACD,EAAA;AACD;AJ4JY;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"/home/runner/work/rivet/rivet/rivetkit-typescript/packages/rivetkit/dist/tsup/chunk-23EJLAOV.cjs","sourcesContent":[null,"import { getLogger } from \"@/common/log\";\n\n/** Prever to use ActorInstance.rlog child logger. This does not provide context in the log, should only be used as a last resort if you cannot pass the actor's child logger. */\nexport function loggerWithoutContext() {\n\treturn getLogger(\"actor-runtime\");\n}\n","import * as errors from \"./errors\";\nimport { loggerWithoutContext } from \"./log\";\n\nexport function assertUnreachable(x: never): never {\n\tloggerWithoutContext().error({\n\t\tmsg: \"unreachable\",\n\t\tvalue: `${x}`,\n\t\tstack: new Error().stack,\n\t});\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\t// Replace base64 chars that are not URL safe with URL-safe chars and strip padding\n\treturn btoa(String.fromCharCode(...array))\n\t\t.replace(/\\+/g, \"-\")\n\t\t.replace(/\\//g, \"_\")\n\t\t.replace(/=/g, \"\");\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\n/**\n * Checks if a path is an actor state path within the persisted actor data.\n */\nexport function isStatePath(path: string): boolean {\n\treturn path === \"state\" || path.startsWith(\"state.\");\n}\n\n/**\n * Checks if a path is a connection state path within the persisted actor data.\n */\nexport function isConnStatePath(path: string): boolean {\n\tif (!path.startsWith(\"connections.\")) {\n\t\treturn false;\n\t}\n\tconst stateIndex = path.indexOf(\".state\", 12); // Start after \"connections.\"\n\tif (stateIndex === -1) {\n\t\treturn false;\n\t}\n\tconst afterState = stateIndex + 6; // \".state\".length = 6\n\t// Check if \".state\" is followed by end of string or \".\"\n\treturn path.length === afterState || path[afterState] === \".\";\n}\n","// NOTE: This is in a separate file from the router since it needs to be shared between the client & the server. If this was in the router file, the client would end up importing the *entire* actor router and tree shaking would not work.\n\n// MARK: Paths\nexport const PATH_CONNECT = \"/connect\";\nexport const PATH_WEBSOCKET_BASE = \"/websocket\";\nexport const PATH_WEBSOCKET_PREFIX = \"/websocket/\";\nexport const PATH_INSPECTOR_CONNECT = \"/inspector/connect\";\n\n// MARK: Headers\nexport const HEADER_ACTOR_QUERY = \"x-rivet-query\";\n\nexport const HEADER_ENCODING = \"x-rivet-encoding\";\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-rivet-conn-params\";\n\nexport const HEADER_ACTOR_ID = \"x-rivet-actor\";\n\nexport const HEADER_RIVET_TOKEN = \"x-rivet-token\";\n\n// MARK: Manager Gateway Headers\nexport const HEADER_RIVET_TARGET = \"x-rivet-target\";\nexport const HEADER_RIVET_ACTOR = \"x-rivet-actor\";\nexport const HEADER_RIVET_NAMESPACE = \"x-rivet-namespace\";\n\n// MARK: WebSocket Protocol Prefixes\n/** Some servers (such as node-ws & Cloudflare) require explicitly match a certain WebSocket protocol. This gives us a static protocol to match against. */\nexport const WS_PROTOCOL_STANDARD = \"rivet\";\nexport const WS_PROTOCOL_TARGET = \"rivet_target.\";\nexport const WS_PROTOCOL_ACTOR = \"rivet_actor.\";\nexport const WS_PROTOCOL_ENCODING = \"rivet_encoding.\";\nexport const WS_PROTOCOL_CONN_PARAMS = \"rivet_conn_params.\";\nexport const WS_PROTOCOL_TOKEN = \"rivet_token.\";\n\n// MARK: WebSocket Inline Test Protocol Prefixes\nexport const WS_TEST_PROTOCOL_PATH = \"test_path.\";\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_RIVET_TARGET,\n\tHEADER_RIVET_ACTOR,\n\tHEADER_RIVET_NAMESPACE,\n\tHEADER_RIVET_TOKEN,\n];\n","import * as cbor from \"cbor-x\";\nimport invariant from \"invariant\";\nimport type { z } from \"zod\";\nimport { assertUnreachable } from \"@/common/utils\";\nimport type { VersionedDataHandler } from \"vbare\";\nimport type { Encoding } from \"@/mod\";\nimport { jsonParseCompat, jsonStringifyCompat } from \"./actor/protocol/serde\";\n\nexport function uint8ArrayToBase64(uint8Array: Uint8Array): string {\n\t// Check if Buffer is available (Node.js)\n\tif (typeof Buffer !== \"undefined\") {\n\t\treturn Buffer.from(uint8Array).toString(\"base64\");\n\t}\n\n\t// Browser environment - use btoa\n\tlet binary = \"\";\n\tconst len = uint8Array.byteLength;\n\tfor (let i = 0; i < len; i++) {\n\t\tbinary += String.fromCharCode(uint8Array[i]);\n\t}\n\treturn btoa(binary);\n}\n\nexport function encodingIsBinary(encoding: Encoding): boolean {\n\tif (encoding === \"json\") {\n\t\treturn false;\n\t} else if (encoding === \"cbor\" || encoding === \"bare\") {\n\t\treturn true;\n\t} else {\n\t\tassertUnreachable(encoding);\n\t}\n}\n\nexport function contentTypeForEncoding(encoding: Encoding): string {\n\tif (encoding === \"json\") {\n\t\treturn \"application/json\";\n\t} else if (encoding === \"cbor\" || encoding === \"bare\") {\n\t\treturn \"application/octet-stream\";\n\t} else {\n\t\tassertUnreachable(encoding);\n\t}\n}\n\nexport function wsBinaryTypeForEncoding(\n\tencoding: Encoding,\n): \"arraybuffer\" | \"blob\" {\n\tif (encoding === \"json\") {\n\t\treturn \"blob\";\n\t} else if (encoding === \"cbor\" || encoding === \"bare\") {\n\t\treturn \"arraybuffer\";\n\t} else {\n\t\tassertUnreachable(encoding);\n\t}\n}\n\nexport function serializeWithEncoding<TBare, TJson, T = TBare>(\n\tencoding: Encoding,\n\tvalue: T,\n\tversionedDataHandler: VersionedDataHandler<TBare> | undefined,\n\tversion: number | undefined,\n\tzodSchema: z.ZodType<TJson>,\n\ttoJson: (value: T) => TJson,\n\ttoBare: (value: T) => TBare,\n): Uint8Array | string {\n\tif (encoding === \"json\") {\n\t\tconst jsonValue = toJson(value);\n\t\tconst validated = zodSchema.parse(jsonValue);\n\t\treturn jsonStringifyCompat(validated);\n\t} else if (encoding === \"cbor\") {\n\t\tconst jsonValue = toJson(value);\n\t\tconst validated = zodSchema.parse(jsonValue);\n\t\treturn cbor.encode(validated);\n\t} else if (encoding === \"bare\") {\n\t\tif (!versionedDataHandler) {\n\t\t\tthrow new Error(\n\t\t\t\t\"VersionedDataHandler is required for 'bare' encoding\",\n\t\t\t);\n\t\t}\n\t\tif (version === undefined) {\n\t\t\tthrow new Error(\"version is required for 'bare' encoding\");\n\t\t}\n\t\tconst bareValue = toBare(value);\n\t\treturn versionedDataHandler.serializeWithEmbeddedVersion(\n\t\t\tbareValue,\n\t\t\tversion,\n\t\t);\n\t} else {\n\t\tassertUnreachable(encoding);\n\t}\n}\n\nexport function deserializeWithEncoding<TBare, TJson, T = TBare>(\n\tencoding: Encoding,\n\tbuffer: Uint8Array | string,\n\tversionedDataHandler: VersionedDataHandler<TBare> | undefined,\n\tzodSchema: z.ZodType<TJson>,\n\tfromJson: (value: TJson) => T,\n\tfromBare: (value: TBare) => T,\n): T {\n\tif (encoding === \"json\") {\n\t\tlet parsed: unknown;\n\t\tif (typeof buffer === \"string\") {\n\t\t\tparsed = jsonParseCompat(buffer);\n\t\t} else {\n\t\t\tconst decoder = new TextDecoder(\"utf-8\");\n\t\t\tconst jsonString = decoder.decode(buffer);\n\t\t\tparsed = jsonParseCompat(jsonString);\n\t\t}\n\t\tconst validated = zodSchema.parse(parsed);\n\t\treturn fromJson(validated);\n\t} else if (encoding === \"cbor\") {\n\t\tinvariant(\n\t\t\ttypeof buffer !== \"string\",\n\t\t\t\"buffer cannot be string for cbor encoding\",\n\t\t);\n\t\t// Decode CBOR to get JavaScript values (similar to JSON.parse)\n\t\tconst decoded: unknown = cbor.decode(buffer);\n\t\t// Validate with Zod schema (CBOR produces same structure as JSON)\n\t\tconst validated = zodSchema.parse(decoded);\n\t\t// CBOR decoding produces JS objects, use fromJson\n\t\treturn fromJson(validated);\n\t} else if (encoding === \"bare\") {\n\t\tinvariant(\n\t\t\ttypeof buffer !== \"string\",\n\t\t\t\"buffer cannot be string for bare encoding\",\n\t\t);\n\t\tif (!versionedDataHandler) {\n\t\t\tthrow new Error(\n\t\t\t\t\"VersionedDataHandler is required for 'bare' encoding\",\n\t\t\t);\n\t\t}\n\t\tconst bareValue =\n\t\t\tversionedDataHandler.deserializeWithEmbeddedVersion(buffer);\n\t\treturn fromBare(bareValue);\n\t} else {\n\t\tassertUnreachable(encoding);\n\t}\n}\n","import * as cbor from \"cbor-x\";\nimport { z } from \"zod\";\nimport * as errors from \"@/actor/errors\";\nimport type { VersionedDataHandler } from \"vbare\";\nimport { serializeWithEncoding } from \"@/serde\";\nimport { loggerWithoutContext } 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<TBare, TJson, T = TBare> {\n\t#data: T;\n\t#cache = new Map<Encoding, OutputData>();\n\t#versionedDataHandler: VersionedDataHandler<TBare>;\n\t#version: number;\n\t#zodSchema: z.ZodType<TJson>;\n\t#toJson: (value: T) => TJson;\n\t#toBare: (value: T) => TBare;\n\n\tconstructor(\n\t\tdata: T,\n\t\tversionedDataHandler: VersionedDataHandler<TBare>,\n\t\tversion: number,\n\t\tzodSchema: z.ZodType<TJson>,\n\t\ttoJson: (value: T) => TJson,\n\t\ttoBare: (value: T) => TBare,\n\t) {\n\t\tthis.#data = data;\n\t\tthis.#versionedDataHandler = versionedDataHandler;\n\t\tthis.#version = version;\n\t\tthis.#zodSchema = zodSchema;\n\t\tthis.#toJson = toJson;\n\t\tthis.#toBare = toBare;\n\t}\n\n\tpublic get rawData(): T {\n\t\treturn this.#data;\n\t}\n\n\tpublic serialize(encoding: Encoding): OutputData {\n\t\tconst cached = this.#cache.get(encoding);\n\t\tif (cached) {\n\t\t\treturn cached;\n\t\t} 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\tthis.#version,\n\t\t\t\tthis.#zodSchema,\n\t\t\t\tthis.#toJson,\n\t\t\t\tthis.#toBare,\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\nfunction base64DecodeToUint8Array(base64: string): Uint8Array {\n\t// Check if Buffer is available (Node.js)\n\tif (typeof Buffer !== \"undefined\") {\n\t\treturn new Uint8Array(Buffer.from(base64, \"base64\"));\n\t}\n\n\t// Browser environment - use atob\n\tconst binary = atob(base64);\n\tconst len = binary.length;\n\tconst bytes = new Uint8Array(len);\n\tfor (let i = 0; i < len; i++) {\n\t\tbytes[i] = binary.charCodeAt(i);\n\t}\n\treturn bytes;\n}\n\nfunction base64DecodeToArrayBuffer(base64: string): ArrayBuffer {\n\treturn base64DecodeToUint8Array(base64).buffer as ArrayBuffer;\n}\n\n/** Stringifies with compat for values that BARE & CBOR supports. */\nexport function jsonStringifyCompat(input: any): string {\n\treturn JSON.stringify(input, (_key, value) => {\n\t\tif (typeof value === \"bigint\") {\n\t\t\treturn [\"$BigInt\", value.toString()];\n\t\t} else if (value instanceof ArrayBuffer) {\n\t\t\treturn [\"$ArrayBuffer\", base64EncodeArrayBuffer(value)];\n\t\t} else if (value instanceof Uint8Array) {\n\t\t\treturn [\"$Uint8Array\", base64EncodeUint8Array(value)];\n\t\t}\n\n\t\t// Escape user arrays that start with $ by prepending another $\n\t\tif (\n\t\t\tArray.isArray(value) &&\n\t\t\tvalue.length === 2 &&\n\t\t\ttypeof value[0] === \"string\" &&\n\t\t\tvalue[0].startsWith(\"$\")\n\t\t) {\n\t\t\treturn [\"$\" + value[0], value[1]];\n\t\t}\n\n\t\treturn value;\n\t});\n}\n\n/** Parses JSON with compat for values that BARE & CBOR supports. */\nexport function jsonParseCompat(input: string): any {\n\treturn JSON.parse(input, (_key, value) => {\n\t\t// Handle arrays with $ prefix\n\t\tif (\n\t\t\tArray.isArray(value) &&\n\t\t\tvalue.length === 2 &&\n\t\t\ttypeof value[0] === \"string\" &&\n\t\t\tvalue[0].startsWith(\"$\")\n\t\t) {\n\t\t\t// Known special types\n\t\t\tif (value[0] === \"$BigInt\") {\n\t\t\t\treturn BigInt(value[1]);\n\t\t\t} else if (value[0] === \"$ArrayBuffer\") {\n\t\t\t\treturn base64DecodeToArrayBuffer(value[1]);\n\t\t\t} else if (value[0] === \"$Uint8Array\") {\n\t\t\t\treturn base64DecodeToUint8Array(value[1]);\n\t\t\t}\n\n\t\t\t// Unescape user arrays that started with $ ($$foo -> $foo)\n\t\t\tif (value[0].startsWith(\"$$\")) {\n\t\t\t\treturn [value[0].substring(1), value[1]];\n\t\t\t}\n\n\t\t\t// Unknown type starting with $ - this is an error\n\t\t\tthrow new Error(\n\t\t\t\t`Unknown JSON encoding type: ${value[0]}. This may indicate corrupted data or a version mismatch.`,\n\t\t\t);\n\t\t}\n\n\t\treturn value;\n\t});\n}\n"]}
1
+ {"version":3,"sources":["/home/runner/work/rivet/rivet/rivetkit-typescript/packages/rivetkit/dist/tsup/chunk-3YT2J462.cjs","../../src/actor/log.ts","../../src/actor/utils.ts","../../src/common/actor-router-consts.ts","../../src/serde.ts","../../src/actor/protocol/serde.ts"],"names":["assertUnreachable"],"mappings":"AAAA;AACE;AACA;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACA;ACLO,SAAS,oBAAA,CAAA,EAAuB;AACtC,EAAA,OAAO,yCAAA,eAAyB,CAAA;AACjC;ADOA;AACA;AEVO,SAASA,kBAAAA,CAAkB,CAAA,EAAiB;AAClD,EAAA,oBAAA,CAAqB,CAAA,CAAE,KAAA,CAAM;AAAA,IAC5B,GAAA,EAAK,aAAA;AAAA,IACL,KAAA,EAAO,CAAA,EAAA;AACA,IAAA;AACP,EAAA;AACgB,EAAA;AAClB;AA+Ba;AACZ,EAAA;AACO,IAAA;AACP,EAAA;AACD;AAEgB;AACT,EAAA;AACA,EAAA;AAGA,EAAA;AAEC,EAAA;AACN,IAAA;AACI,IAAA;AACH,MAAA;AACA,IAAA;AACC,EAAA;AACF,IAAA;AACA,EAAA;AACF;AAwBgB;AACT,EAAA;AACC,EAAA;AAEA,EAAA;AAIR;AAEgB;AACT,EAAA;AAEF,EAAA;AACK,EAAA;AACF,IAAA;AACN,IAAA;AACD,EAAA;AACO,EAAA;AACR;AAKgB;AACR,EAAA;AACR;AAKgB;AACL,EAAA;AACF,IAAA;AACR,EAAA;AACM,EAAA;AACF,EAAA;AACI,IAAA;AACR,EAAA;AACM,EAAA;AAEC,EAAA;AACR;AF5DY;AACA;AGlEC;AACA;AACA;AACA;AAGA;AAEA;AAGA;AAEA;AAEA;AAGA;AACA;AACA;AAIA;AACA;AACA;AACA;AACA;AAIA;AAOA;AACZ,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACD;AH+CY;AACA;AIrGA;AACL;AJuGK;AACA;AKvGH;AAYI;AAUA;AACZ,EAAA;AACS,EAAA;AACT,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AAEA,EAAA;AAQM,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACN,EAAA;AAEW,EAAA;AACH,IAAA;AACR,EAAA;AAEiB,EAAA;AACV,IAAA;AACF,IAAA;AACH,MAAA;AACM,IAAA;AACA,MAAA;AACL,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACD,MAAA;AACK,MAAA;AACL,MAAA;AACD,IAAA;AACD,EAAA;AACD;AA8CS;AACJ,EAAA;AACE,EAAA;AACG,EAAA;AACR,IAAA;AACD,EAAA;AACO,EAAA;AACR;AAES;AACF,EAAA;AACC,EAAA;AACR;AAeS;AAEJ,EAAA;AACI,IAAA;AACR,EAAA;AAGM,EAAA;AACA,EAAA;AACA,EAAA;AACG,EAAA;AACD,IAAA;AACR,EAAA;AACO,EAAA;AACR;AAES;AACD,EAAA;AACR;AAGgB;AACR,EAAA;AACF,IAAA;AACH,MAAA;AACD,IAAA;AACC,MAAA;AACD,IAAA;AACC,MAAA;AACD,IAAA;AAIC,IAAA;AAKA,MAAA;AACD,IAAA;AAEO,IAAA;AACP,EAAA;AACF;AAGgB;AACR,EAAA;AAGL,IAAA;AAMI,MAAA;AACH,QAAA;AACD,MAAA;AACC,QAAA;AACD,MAAA;AACC,QAAA;AACD,MAAA;AAGI,MAAA;AACH,QAAA;AACD,MAAA;AAGM,MAAA;AACL,QAAA;AACD,MAAA;AACD,IAAA;AAEO,IAAA;AACP,EAAA;AACF;ALbY;AACA;AIzMI;AAEX,EAAA;AACI,IAAA;AACR,EAAA;AAGI,EAAA;AACE,EAAA;AACG,EAAA;AACR,IAAA;AACD,EAAA;AACO,EAAA;AACR;AAYgB;AACX,EAAA;AACI,IAAA;AACR,EAAA;AACQ,IAAA;AACD,EAAA;AACN,IAAA;AACD,EAAA;AACD;AAcgB;AASX,EAAA;AACG,IAAA;AACA,IAAA;AACC,IAAA;AACR,EAAA;AACO,IAAA;AACA,IAAA;AACM,IAAA;AACb,EAAA;AACM,IAAA;AACE,MAAA;AACL,QAAA;AACD,MAAA;AACD,IAAA;AACI,IAAA;AACG,MAAA;AACP,IAAA;AACM,IAAA;AACC,IAAA;AACN,MAAA;AACA,MAAA;AACD,IAAA;AACM,EAAA;AACN,IAAA;AACD,EAAA;AACD;AAEgB;AAQX,EAAA;AACC,IAAA;AACA,IAAA;AACH,MAAA;AACM,IAAA;AACA,MAAA;AACA,MAAA;AACN,MAAA;AACD,IAAA;AACM,IAAA;AACC,IAAA;AACR,EAAA;AACC,IAAA;AACC,MAAA;AACA,MAAA;AACD,IAAA;AAEM,IAAA;AAEA,IAAA;AAEC,IAAA;AACR,EAAA;AACC,IAAA;AACC,MAAA;AACA,MAAA;AACD,IAAA;AACK,IAAA;AACE,MAAA;AACL,QAAA;AACD,MAAA;AACD,IAAA;AACM,IAAA;AAEC,IAAA;AACD,EAAA;AACN,IAAA;AACD,EAAA;AACD;AJ4JY;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"/home/runner/work/rivet/rivet/rivetkit-typescript/packages/rivetkit/dist/tsup/chunk-3YT2J462.cjs","sourcesContent":[null,"import { getLogger } from \"@/common/log\";\n\n/** Prever to use ActorInstance.rlog child logger. This does not provide context in the log, should only be used as a last resort if you cannot pass the actor's child logger. */\nexport function loggerWithoutContext() {\n\treturn getLogger(\"actor-runtime\");\n}\n","import * as errors from \"./errors\";\nimport { loggerWithoutContext } from \"./log\";\n\nexport function assertUnreachable(x: never): never {\n\tloggerWithoutContext().error({\n\t\tmsg: \"unreachable\",\n\t\tvalue: `${x}`,\n\t\tstack: new Error().stack,\n\t});\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\t// Replace base64 chars that are not URL safe with URL-safe chars and strip padding\n\treturn btoa(String.fromCharCode(...array))\n\t\t.replace(/\\+/g, \"-\")\n\t\t.replace(/\\//g, \"_\")\n\t\t.replace(/=/g, \"\");\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\n/**\n * Checks if a path is an actor state path within the persisted actor data.\n */\nexport function isStatePath(path: string): boolean {\n\treturn path === \"state\" || path.startsWith(\"state.\");\n}\n\n/**\n * Checks if a path is a connection state path within the persisted actor data.\n */\nexport function isConnStatePath(path: string): boolean {\n\tif (!path.startsWith(\"connections.\")) {\n\t\treturn false;\n\t}\n\tconst stateIndex = path.indexOf(\".state\", 12); // Start after \"connections.\"\n\tif (stateIndex === -1) {\n\t\treturn false;\n\t}\n\tconst afterState = stateIndex + 6; // \".state\".length = 6\n\t// Check if \".state\" is followed by end of string or \".\"\n\treturn path.length === afterState || path[afterState] === \".\";\n}\n","// NOTE: This is in a separate file from the router since it needs to be shared between the client & the server. If this was in the router file, the client would end up importing the *entire* actor router and tree shaking would not work.\n\n// MARK: Paths\nexport const PATH_CONNECT = \"/connect\";\nexport const PATH_WEBSOCKET_BASE = \"/websocket\";\nexport const PATH_WEBSOCKET_PREFIX = \"/websocket/\";\nexport const PATH_INSPECTOR_CONNECT = \"/inspector/connect\";\n\n// MARK: Headers\nexport const HEADER_ACTOR_QUERY = \"x-rivet-query\";\n\nexport const HEADER_ENCODING = \"x-rivet-encoding\";\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-rivet-conn-params\";\n\nexport const HEADER_ACTOR_ID = \"x-rivet-actor\";\n\nexport const HEADER_RIVET_TOKEN = \"x-rivet-token\";\n\n// MARK: Manager Gateway Headers\nexport const HEADER_RIVET_TARGET = \"x-rivet-target\";\nexport const HEADER_RIVET_ACTOR = \"x-rivet-actor\";\nexport const HEADER_RIVET_NAMESPACE = \"x-rivet-namespace\";\n\n// MARK: WebSocket Protocol Prefixes\n/** Some servers (such as node-ws & Cloudflare) require explicitly match a certain WebSocket protocol. This gives us a static protocol to match against. */\nexport const WS_PROTOCOL_STANDARD = \"rivet\";\nexport const WS_PROTOCOL_TARGET = \"rivet_target.\";\nexport const WS_PROTOCOL_ACTOR = \"rivet_actor.\";\nexport const WS_PROTOCOL_ENCODING = \"rivet_encoding.\";\nexport const WS_PROTOCOL_CONN_PARAMS = \"rivet_conn_params.\";\nexport const WS_PROTOCOL_TOKEN = \"rivet_token.\";\n\n// MARK: WebSocket Inline Test Protocol Prefixes\nexport const WS_TEST_PROTOCOL_PATH = \"test_path.\";\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_RIVET_TARGET,\n\tHEADER_RIVET_ACTOR,\n\tHEADER_RIVET_NAMESPACE,\n\tHEADER_RIVET_TOKEN,\n];\n","import * as cbor from \"cbor-x\";\nimport invariant from \"invariant\";\nimport type { VersionedDataHandler } from \"vbare\";\nimport type { z } from \"zod\";\nimport { assertUnreachable } from \"@/common/utils\";\nimport type { Encoding } from \"@/mod\";\nimport { jsonParseCompat, jsonStringifyCompat } from \"./actor/protocol/serde\";\n\nexport function uint8ArrayToBase64(uint8Array: Uint8Array): string {\n\t// Check if Buffer is available (Node.js)\n\tif (typeof Buffer !== \"undefined\") {\n\t\treturn Buffer.from(uint8Array).toString(\"base64\");\n\t}\n\n\t// Browser environment - use btoa\n\tlet binary = \"\";\n\tconst len = uint8Array.byteLength;\n\tfor (let i = 0; i < len; i++) {\n\t\tbinary += String.fromCharCode(uint8Array[i]);\n\t}\n\treturn btoa(binary);\n}\n\nexport function encodingIsBinary(encoding: Encoding): boolean {\n\tif (encoding === \"json\") {\n\t\treturn false;\n\t} else if (encoding === \"cbor\" || encoding === \"bare\") {\n\t\treturn true;\n\t} else {\n\t\tassertUnreachable(encoding);\n\t}\n}\n\nexport function contentTypeForEncoding(encoding: Encoding): string {\n\tif (encoding === \"json\") {\n\t\treturn \"application/json\";\n\t} else if (encoding === \"cbor\" || encoding === \"bare\") {\n\t\treturn \"application/octet-stream\";\n\t} else {\n\t\tassertUnreachable(encoding);\n\t}\n}\n\nexport function wsBinaryTypeForEncoding(\n\tencoding: Encoding,\n): \"arraybuffer\" | \"blob\" {\n\tif (encoding === \"json\") {\n\t\treturn \"blob\";\n\t} else if (encoding === \"cbor\" || encoding === \"bare\") {\n\t\treturn \"arraybuffer\";\n\t} else {\n\t\tassertUnreachable(encoding);\n\t}\n}\n\nexport function serializeWithEncoding<TBare, TJson, T = TBare>(\n\tencoding: Encoding,\n\tvalue: T,\n\tversionedDataHandler: VersionedDataHandler<TBare> | undefined,\n\tversion: number | undefined,\n\tzodSchema: z.ZodType<TJson>,\n\ttoJson: (value: T) => TJson,\n\ttoBare: (value: T) => TBare,\n): Uint8Array | string {\n\tif (encoding === \"json\") {\n\t\tconst jsonValue = toJson(value);\n\t\tconst validated = zodSchema.parse(jsonValue);\n\t\treturn jsonStringifyCompat(validated);\n\t} else if (encoding === \"cbor\") {\n\t\tconst jsonValue = toJson(value);\n\t\tconst validated = zodSchema.parse(jsonValue);\n\t\treturn cbor.encode(validated);\n\t} else if (encoding === \"bare\") {\n\t\tif (!versionedDataHandler) {\n\t\t\tthrow new Error(\n\t\t\t\t\"VersionedDataHandler is required for 'bare' encoding\",\n\t\t\t);\n\t\t}\n\t\tif (version === undefined) {\n\t\t\tthrow new Error(\"version is required for 'bare' encoding\");\n\t\t}\n\t\tconst bareValue = toBare(value);\n\t\treturn versionedDataHandler.serializeWithEmbeddedVersion(\n\t\t\tbareValue,\n\t\t\tversion,\n\t\t);\n\t} else {\n\t\tassertUnreachable(encoding);\n\t}\n}\n\nexport function deserializeWithEncoding<TBare, TJson, T = TBare>(\n\tencoding: Encoding,\n\tbuffer: Uint8Array | string,\n\tversionedDataHandler: VersionedDataHandler<TBare> | undefined,\n\tzodSchema: z.ZodType<TJson>,\n\tfromJson: (value: TJson) => T,\n\tfromBare: (value: TBare) => T,\n): T {\n\tif (encoding === \"json\") {\n\t\tlet parsed: unknown;\n\t\tif (typeof buffer === \"string\") {\n\t\t\tparsed = jsonParseCompat(buffer);\n\t\t} else {\n\t\t\tconst decoder = new TextDecoder(\"utf-8\");\n\t\t\tconst jsonString = decoder.decode(buffer);\n\t\t\tparsed = jsonParseCompat(jsonString);\n\t\t}\n\t\tconst validated = zodSchema.parse(parsed);\n\t\treturn fromJson(validated);\n\t} else if (encoding === \"cbor\") {\n\t\tinvariant(\n\t\t\ttypeof buffer !== \"string\",\n\t\t\t\"buffer cannot be string for cbor encoding\",\n\t\t);\n\t\t// Decode CBOR to get JavaScript values (similar to JSON.parse)\n\t\tconst decoded: unknown = cbor.decode(buffer);\n\t\t// Validate with Zod schema (CBOR produces same structure as JSON)\n\t\tconst validated = zodSchema.parse(decoded);\n\t\t// CBOR decoding produces JS objects, use fromJson\n\t\treturn fromJson(validated);\n\t} else if (encoding === \"bare\") {\n\t\tinvariant(\n\t\t\ttypeof buffer !== \"string\",\n\t\t\t\"buffer cannot be string for bare encoding\",\n\t\t);\n\t\tif (!versionedDataHandler) {\n\t\t\tthrow new Error(\n\t\t\t\t\"VersionedDataHandler is required for 'bare' encoding\",\n\t\t\t);\n\t\t}\n\t\tconst bareValue =\n\t\t\tversionedDataHandler.deserializeWithEmbeddedVersion(buffer);\n\t\treturn fromBare(bareValue);\n\t} else {\n\t\tassertUnreachable(encoding);\n\t}\n}\n","import * as cbor from \"cbor-x\";\nimport type { VersionedDataHandler } from \"vbare\";\nimport { z } from \"zod\";\nimport * as errors from \"@/actor/errors\";\nimport { serializeWithEncoding } from \"@/serde\";\nimport { loggerWithoutContext } 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<TBare, TJson, T = TBare> {\n\t#data: T;\n\t#cache = new Map<Encoding, OutputData>();\n\t#versionedDataHandler: VersionedDataHandler<TBare>;\n\t#version: number;\n\t#zodSchema: z.ZodType<TJson>;\n\t#toJson: (value: T) => TJson;\n\t#toBare: (value: T) => TBare;\n\n\tconstructor(\n\t\tdata: T,\n\t\tversionedDataHandler: VersionedDataHandler<TBare>,\n\t\tversion: number,\n\t\tzodSchema: z.ZodType<TJson>,\n\t\ttoJson: (value: T) => TJson,\n\t\ttoBare: (value: T) => TBare,\n\t) {\n\t\tthis.#data = data;\n\t\tthis.#versionedDataHandler = versionedDataHandler;\n\t\tthis.#version = version;\n\t\tthis.#zodSchema = zodSchema;\n\t\tthis.#toJson = toJson;\n\t\tthis.#toBare = toBare;\n\t}\n\n\tpublic get rawData(): T {\n\t\treturn this.#data;\n\t}\n\n\tpublic serialize(encoding: Encoding): OutputData {\n\t\tconst cached = this.#cache.get(encoding);\n\t\tif (cached) {\n\t\t\treturn cached;\n\t\t} 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\tthis.#version,\n\t\t\t\tthis.#zodSchema,\n\t\t\t\tthis.#toJson,\n\t\t\t\tthis.#toBare,\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\nfunction base64DecodeToUint8Array(base64: string): Uint8Array {\n\t// Check if Buffer is available (Node.js)\n\tif (typeof Buffer !== \"undefined\") {\n\t\treturn new Uint8Array(Buffer.from(base64, \"base64\"));\n\t}\n\n\t// Browser environment - use atob\n\tconst binary = atob(base64);\n\tconst len = binary.length;\n\tconst bytes = new Uint8Array(len);\n\tfor (let i = 0; i < len; i++) {\n\t\tbytes[i] = binary.charCodeAt(i);\n\t}\n\treturn bytes;\n}\n\nfunction base64DecodeToArrayBuffer(base64: string): ArrayBuffer {\n\treturn base64DecodeToUint8Array(base64).buffer as ArrayBuffer;\n}\n\n/** Stringifies with compat for values that BARE & CBOR supports. */\nexport function jsonStringifyCompat(input: any): string {\n\treturn JSON.stringify(input, (_key, value) => {\n\t\tif (typeof value === \"bigint\") {\n\t\t\treturn [\"$BigInt\", value.toString()];\n\t\t} else if (value instanceof ArrayBuffer) {\n\t\t\treturn [\"$ArrayBuffer\", base64EncodeArrayBuffer(value)];\n\t\t} else if (value instanceof Uint8Array) {\n\t\t\treturn [\"$Uint8Array\", base64EncodeUint8Array(value)];\n\t\t}\n\n\t\t// Escape user arrays that start with $ by prepending another $\n\t\tif (\n\t\t\tArray.isArray(value) &&\n\t\t\tvalue.length === 2 &&\n\t\t\ttypeof value[0] === \"string\" &&\n\t\t\tvalue[0].startsWith(\"$\")\n\t\t) {\n\t\t\treturn [\"$\" + value[0], value[1]];\n\t\t}\n\n\t\treturn value;\n\t});\n}\n\n/** Parses JSON with compat for values that BARE & CBOR supports. */\nexport function jsonParseCompat(input: string): any {\n\treturn JSON.parse(input, (_key, value) => {\n\t\t// Handle arrays with $ prefix\n\t\tif (\n\t\t\tArray.isArray(value) &&\n\t\t\tvalue.length === 2 &&\n\t\t\ttypeof value[0] === \"string\" &&\n\t\t\tvalue[0].startsWith(\"$\")\n\t\t) {\n\t\t\t// Known special types\n\t\t\tif (value[0] === \"$BigInt\") {\n\t\t\t\treturn BigInt(value[1]);\n\t\t\t} else if (value[0] === \"$ArrayBuffer\") {\n\t\t\t\treturn base64DecodeToArrayBuffer(value[1]);\n\t\t\t} else if (value[0] === \"$Uint8Array\") {\n\t\t\t\treturn base64DecodeToUint8Array(value[1]);\n\t\t\t}\n\n\t\t\t// Unescape user arrays that started with $ ($$foo -> $foo)\n\t\t\tif (value[0].startsWith(\"$$\")) {\n\t\t\t\treturn [value[0].substring(1), value[1]];\n\t\t\t}\n\n\t\t\t// Unknown type starting with $ - this is an error\n\t\t\tthrow new Error(\n\t\t\t\t`Unknown JSON encoding type: ${value[0]}. This may indicate corrupted data or a version mismatch.`,\n\t\t\t);\n\t\t}\n\n\t\treturn value;\n\t});\n}\n"]}
@@ -1,10 +1,3 @@
1
- import {
2
- configureInspectorAccessToken,
3
- getInspectorUrl,
4
- inspectorLogger,
5
- isInspectorEnabled,
6
- secureInspector
7
- } from "./chunk-SLAUR4QB.js";
8
1
  import {
9
2
  ActionContext,
10
3
  ActorDefinition,
@@ -29,16 +22,23 @@ import {
29
22
  parseMessage,
30
23
  serializeActorKey,
31
24
  updateRunnerConfig
32
- } from "./chunk-YBOQOQZB.js";
33
- import {
34
- CreateActorSchema
35
- } from "./chunk-EOXUA7SX.js";
25
+ } from "./chunk-5MD6ZIUI.js";
36
26
  import {
37
27
  ClientConfigSchema,
38
28
  KEYS,
39
29
  RunnerConfigSchema,
40
30
  getInitialActorKvState
41
- } from "./chunk-DGSYEC34.js";
31
+ } from "./chunk-2E6QYC2Y.js";
32
+ import {
33
+ configureInspectorAccessToken,
34
+ getInspectorUrl,
35
+ inspectorLogger,
36
+ isInspectorEnabled,
37
+ secureInspector
38
+ } from "./chunk-UMVOVPLU.js";
39
+ import {
40
+ CreateActorSchema
41
+ } from "./chunk-OKZQC52X.js";
42
42
  import {
43
43
  EncodingSchema,
44
44
  HEADER_ACTOR_ID,
@@ -60,7 +60,7 @@ import {
60
60
  generateRandomString,
61
61
  loggerWithoutContext,
62
62
  serializeWithEncoding
63
- } from "./chunk-HPIRVETT.js";
63
+ } from "./chunk-RSSAT5PN.js";
64
64
  import {
65
65
  VERSION,
66
66
  arrayBuffersEqual,
@@ -69,6 +69,7 @@ import {
69
69
  configureBaseLogger,
70
70
  configureDefaultLogger,
71
71
  deconstructError,
72
+ detectRuntime,
72
73
  getEnvUniversal,
73
74
  getLogger,
74
75
  noopNext,
@@ -76,18 +77,20 @@ import {
76
77
  promiseWithResolvers,
77
78
  setLongTimeout,
78
79
  stringifyError
79
- } from "./chunk-OI6FEIRD.js";
80
+ } from "./chunk-TK7XXGVD.js";
80
81
  import {
81
82
  ActorDuplicateKey,
82
83
  ActorStopping,
84
+ IncomingMessageTooLong,
83
85
  InvalidEncoding,
84
86
  InvalidParams,
85
87
  InvalidRequest,
86
88
  MissingActorHeader,
89
+ OutgoingMessageTooLong,
87
90
  Unsupported,
88
91
  UserError,
89
92
  WebSocketsNotEnabled
90
- } from "./chunk-P2RZJPYI.js";
93
+ } from "./chunk-V35I3JSW.js";
91
94
 
92
95
  // src/actor/config.ts
93
96
  import { z } from "zod";
@@ -179,10 +182,13 @@ function createRawRequestDriver() {
179
182
  }
180
183
 
181
184
  // src/actor/router-endpoints.ts
182
- async function handleAction(c, _runConfig, actorDriver, actionName, actorId) {
185
+ async function handleAction(c, runConfig, actorDriver, actionName, actorId) {
183
186
  const encoding = getRequestEncoding(c.req);
184
187
  const parameters = getRequestConnParams(c.req);
185
188
  const arrayBuffer = await c.req.arrayBuffer();
189
+ if (arrayBuffer.byteLength > runConfig.maxIncomingMessageSize) {
190
+ throw new IncomingMessageTooLong();
191
+ }
186
192
  const request = deserializeWithEncoding(
187
193
  encoding,
188
194
  new Uint8Array(arrayBuffer),
@@ -227,6 +233,10 @@ async function handleAction(c, _runConfig, actorDriver, actionName, actorId) {
227
233
  output: bufferToArrayBuffer(cbor.encode(value))
228
234
  })
229
235
  );
236
+ const messageSize = serialized instanceof Uint8Array ? serialized.byteLength : serialized.length;
237
+ if (messageSize > runConfig.maxOutgoingMessageSize) {
238
+ throw new OutgoingMessageTooLong();
239
+ }
230
240
  return c.body(serialized, 200, {
231
241
  "Content-Type": contentTypeForEncoding(encoding)
232
242
  });
@@ -435,7 +445,7 @@ function createRawWebSocketDriver(hibernatable, closePromise) {
435
445
  }
436
446
 
437
447
  // src/actor/conn/drivers/websocket.ts
438
- function createWebSocketDriver(hibernatable, encoding, closePromise) {
448
+ function createWebSocketDriver(hibernatable, encoding, closePromise, runConfig) {
439
449
  loggerWithoutContext().debug({
440
450
  msg: "createWebSocketDriver creating driver",
441
451
  hibernatable
@@ -470,6 +480,15 @@ function createWebSocketDriver(hibernatable, encoding, closePromise) {
470
480
  isArrayBuffer: serialized instanceof ArrayBuffer,
471
481
  dataLength: serialized.byteLength || serialized.length
472
482
  });
483
+ const messageSize = serialized.byteLength || serialized.length;
484
+ if (messageSize > runConfig.maxOutgoingMessageSize) {
485
+ actor2.rLog.error({
486
+ msg: "outgoing message exceeds maxOutgoingMessageSize",
487
+ messageSize,
488
+ maxOutgoingMessageSize: runConfig.maxOutgoingMessageSize
489
+ });
490
+ throw new OutgoingMessageTooLong();
491
+ }
473
492
  if (serialized instanceof Uint8Array) {
474
493
  const buffer = serialized.buffer.slice(
475
494
  serialized.byteOffset,
@@ -543,7 +562,8 @@ async function routeWebSocket(request, requestPath, requestHeaders, runConfig, a
543
562
  const { driver, setWebSocket } = createWebSocketDriver(
544
563
  isHibernatable ? { gatewayId, requestId } : void 0,
545
564
  encoding,
546
- closePromiseResolvers.promise
565
+ closePromiseResolvers.promise,
566
+ runConfig
547
567
  );
548
568
  handler = handleWebSocketConnect.bind(void 0, setWebSocket);
549
569
  connDriver = driver;
@@ -2038,7 +2058,7 @@ import invariant4 from "invariant";
2038
2058
  import { createVersionedDataHandler } from "vbare";
2039
2059
 
2040
2060
  // dist/schemas/file-system-driver/v1.ts
2041
- import * as bare from "@bare-ts/lib";
2061
+ import * as bare from "@rivetkit/bare-ts";
2042
2062
  var config = /* @__PURE__ */ bare.Config({});
2043
2063
  function read0(bc) {
2044
2064
  const len = bare.readUintSafe(bc);
@@ -2117,7 +2137,7 @@ function decodeActorAlarm(bytes) {
2117
2137
  }
2118
2138
 
2119
2139
  // dist/schemas/file-system-driver/v2.ts
2120
- import * as bare2 from "@bare-ts/lib";
2140
+ import * as bare2 from "@rivetkit/bare-ts";
2121
2141
  var config2 = /* @__PURE__ */ bare2.Config({});
2122
2142
  function readActorKvEntry(bc) {
2123
2143
  return {
@@ -2223,7 +2243,7 @@ function decodeActorAlarm2(bytes) {
2223
2243
  }
2224
2244
 
2225
2245
  // dist/schemas/file-system-driver/v3.ts
2226
- import * as bare3 from "@bare-ts/lib";
2246
+ import * as bare3 from "@rivetkit/bare-ts";
2227
2247
  var config3 = /* @__PURE__ */ bare3.Config({});
2228
2248
  function readActorKvEntry2(bc) {
2229
2249
  return {
@@ -3738,10 +3758,10 @@ async function ensureEngineProcess(options) {
3738
3758
  await downloadEngineBinaryIfNeeded(binaryPath, options.version, varDir);
3739
3759
  if (await isEngineRunning()) {
3740
3760
  try {
3741
- await waitForEngineHealth();
3761
+ const health = await waitForEngineHealth();
3742
3762
  logger5().debug({
3743
3763
  msg: "engine already running and healthy",
3744
- version: options.version
3764
+ version: health.version
3745
3765
  });
3746
3766
  return;
3747
3767
  } catch (error) {
@@ -3988,12 +4008,16 @@ async function waitForEngineHealth() {
3988
4008
  logger5().debug({ msg: "waiting for engine health check" });
3989
4009
  for (let i = 0; i < maxRetries; i++) {
3990
4010
  try {
3991
- const response = await fetch(`${ENGINE_ENDPOINT}/health`);
4011
+ const response = await fetch(`${ENGINE_ENDPOINT}/health`, {
4012
+ signal: AbortSignal.timeout(1e3)
4013
+ });
3992
4014
  if (response.ok) {
4015
+ const health = await response.json();
3993
4016
  logger5().debug({ msg: "engine health check passed" });
3994
- return;
4017
+ return health;
3995
4018
  }
3996
4019
  } catch (error) {
4020
+ logger5().debug({ msg: "engine health check failed", error });
3997
4021
  if (i === maxRetries - 1) {
3998
4022
  throw new Error(
3999
4023
  `engine health check failed after ${maxRetries} retries: ${error}`
@@ -5091,6 +5115,20 @@ function logger7() {
5091
5115
 
5092
5116
  // src/registry/serve.ts
5093
5117
  async function crossPlatformServe(runConfig, app) {
5118
+ const runtime = detectRuntime();
5119
+ logger7().debug({ msg: "detected runtime for serve", runtime });
5120
+ switch (runtime) {
5121
+ case "deno":
5122
+ return serveDeno(runConfig, app);
5123
+ case "bun":
5124
+ return serveBun(runConfig, app);
5125
+ case "node":
5126
+ return serveNode(runConfig, app);
5127
+ default:
5128
+ return serveNode(runConfig, app);
5129
+ }
5130
+ }
5131
+ async function serveNode(runConfig, app) {
5094
5132
  const nodeServerModule = "@hono/node-server";
5095
5133
  let serve;
5096
5134
  try {
@@ -5100,9 +5138,10 @@ async function crossPlatformServe(runConfig, app) {
5100
5138
  );
5101
5139
  serve = dep.serve;
5102
5140
  } catch (err) {
5103
- logger7().error(
5104
- "failed to import @hono/node-server. please run 'npm install @hono/node-server @hono/node-ws'"
5105
- );
5141
+ logger7().error({
5142
+ msg: "failed to import @hono/node-server. please run 'npm install @hono/node-server @hono/node-ws'",
5143
+ error: stringifyError(err)
5144
+ });
5106
5145
  process.exit(1);
5107
5146
  }
5108
5147
  const nodeWsModule = "@hono/node-ws";
@@ -5114,9 +5153,10 @@ async function crossPlatformServe(runConfig, app) {
5114
5153
  );
5115
5154
  createNodeWebSocket = dep.createNodeWebSocket;
5116
5155
  } catch (err) {
5117
- logger7().error(
5118
- "failed to import @hono/node-ws. please run 'npm install @hono/node-server @hono/node-ws'"
5119
- );
5156
+ logger7().error({
5157
+ msg: "failed to import @hono/node-ws. please run 'npm install @hono/node-server @hono/node-ws'",
5158
+ error: stringifyError(err)
5159
+ });
5120
5160
  process.exit(1);
5121
5161
  }
5122
5162
  const { injectWebSocket, upgradeWebSocket } = createNodeWebSocket({
@@ -5130,6 +5170,53 @@ async function crossPlatformServe(runConfig, app) {
5130
5170
  injectWebSocket(server);
5131
5171
  return { upgradeWebSocket };
5132
5172
  }
5173
+ async function serveDeno(runConfig, app) {
5174
+ const honoDenoModule = "hono/deno";
5175
+ let upgradeWebSocket;
5176
+ try {
5177
+ const dep = await import(
5178
+ /* webpackIgnore: true */
5179
+ honoDenoModule
5180
+ );
5181
+ upgradeWebSocket = dep.upgradeWebSocket;
5182
+ } catch (err) {
5183
+ logger7().error({
5184
+ msg: "failed to import hono/deno",
5185
+ error: stringifyError(err)
5186
+ });
5187
+ process.exit(1);
5188
+ }
5189
+ const port = runConfig.defaultServerPort;
5190
+ Deno.serve({ port }, app.fetch);
5191
+ logger7().info({ msg: "server listening", port });
5192
+ return { upgradeWebSocket };
5193
+ }
5194
+ async function serveBun(runConfig, app) {
5195
+ const honoBunModule = "hono/bun";
5196
+ let createBunWebSocket;
5197
+ try {
5198
+ const dep = await import(
5199
+ /* webpackIgnore: true */
5200
+ honoBunModule
5201
+ );
5202
+ createBunWebSocket = dep.createBunWebSocket;
5203
+ } catch (err) {
5204
+ logger7().error({
5205
+ msg: "failed to import hono/bun",
5206
+ error: stringifyError(err)
5207
+ });
5208
+ process.exit(1);
5209
+ }
5210
+ const { websocket, upgradeWebSocket } = createBunWebSocket();
5211
+ const port = runConfig.defaultServerPort;
5212
+ Bun.serve({
5213
+ fetch: app.fetch,
5214
+ port,
5215
+ websocket
5216
+ });
5217
+ logger7().info({ msg: "server listening", port });
5218
+ return { upgradeWebSocket };
5219
+ }
5133
5220
 
5134
5221
  // src/registry/mod.ts
5135
5222
  var Registry = class {
@@ -5364,4 +5451,4 @@ export {
5364
5451
  setup
5365
5452
  };
5366
5453
  //! These configs configs hold anything that's not platform-specific about running actors.
5367
- //# sourceMappingURL=chunk-GOC4GSPT.js.map
5454
+ //# sourceMappingURL=chunk-46RC64TZ.js.map