rivetkit 2.0.38 → 2.0.39

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 (93) hide show
  1. package/dist/tsup/{chunk-6WLJW57U.cjs → chunk-7E3RWMR6.cjs} +161 -115
  2. package/dist/tsup/chunk-7E3RWMR6.cjs.map +1 -0
  3. package/dist/tsup/{chunk-FA6FGAEC.js → chunk-BQ36VTSB.js} +74 -28
  4. package/dist/tsup/chunk-BQ36VTSB.js.map +1 -0
  5. package/dist/tsup/{chunk-GFKZZG2A.cjs → chunk-C64FV764.cjs} +3 -3
  6. package/dist/tsup/{chunk-GFKZZG2A.cjs.map → chunk-C64FV764.cjs.map} +1 -1
  7. package/dist/tsup/{chunk-4U45T5KW.js → chunk-CDK6DRO2.js} +2 -2
  8. package/dist/tsup/{chunk-4U45T5KW.js.map → chunk-CDK6DRO2.js.map} +1 -1
  9. package/dist/tsup/{chunk-IRTVRBJA.cjs → chunk-DY4H3ASE.cjs} +50 -46
  10. package/dist/tsup/chunk-DY4H3ASE.cjs.map +1 -0
  11. package/dist/tsup/{chunk-IWXMFQDT.cjs → chunk-KMYFL3OL.cjs} +264 -77
  12. package/dist/tsup/chunk-KMYFL3OL.cjs.map +1 -0
  13. package/dist/tsup/{chunk-FZQHTGQX.cjs → chunk-MZPYVTVG.cjs} +9 -9
  14. package/dist/tsup/{chunk-FZQHTGQX.cjs.map → chunk-MZPYVTVG.cjs.map} +1 -1
  15. package/dist/tsup/{chunk-K2RNF2ZR.js → chunk-OJZRCEIA.js} +5 -5
  16. package/dist/tsup/{chunk-WIZ4JGP6.js → chunk-PHCD25XO.js} +2 -2
  17. package/dist/tsup/{chunk-MIOU6BF3.js → chunk-PVKUXMOA.js} +209 -22
  18. package/dist/tsup/chunk-PVKUXMOA.js.map +1 -0
  19. package/dist/tsup/{chunk-UUEZVDRL.js → chunk-T7IPDBWH.js} +8 -4
  20. package/dist/tsup/{chunk-UUEZVDRL.js.map → chunk-T7IPDBWH.js.map} +1 -1
  21. package/dist/tsup/{chunk-LULP6HM2.cjs → chunk-UAX5E3EU.cjs} +311 -288
  22. package/dist/tsup/chunk-UAX5E3EU.cjs.map +1 -0
  23. package/dist/tsup/{chunk-O433HWWG.cjs → chunk-X72X7I7T.cjs} +2 -2
  24. package/dist/tsup/{chunk-O433HWWG.cjs.map → chunk-X72X7I7T.cjs.map} +1 -1
  25. package/dist/tsup/{chunk-EEL32AJM.js → chunk-XU74APB4.js} +72 -49
  26. package/dist/tsup/chunk-XU74APB4.js.map +1 -0
  27. package/dist/tsup/client/mod.cjs +5 -5
  28. package/dist/tsup/client/mod.d.cts +3 -3
  29. package/dist/tsup/client/mod.d.ts +3 -3
  30. package/dist/tsup/client/mod.js +4 -4
  31. package/dist/tsup/common/log.cjs +2 -2
  32. package/dist/tsup/common/log.js +1 -1
  33. package/dist/tsup/common/websocket.cjs +3 -3
  34. package/dist/tsup/common/websocket.js +2 -2
  35. package/dist/tsup/{config-CwJCQyP1.d.cts → config-BuBlMs6C.d.cts} +72 -5
  36. package/dist/tsup/{config-CbIHPGKl.d.ts → config-CBwo4ooA.d.ts} +72 -5
  37. package/dist/tsup/{driver-Lw_oORox.d.cts → driver-CPXmh8f8.d.cts} +1 -1
  38. package/dist/tsup/{driver-CMN823Lc.d.ts → driver-DxWa6HUO.d.ts} +1 -1
  39. package/dist/tsup/driver-helpers/mod.cjs +3 -3
  40. package/dist/tsup/driver-helpers/mod.d.cts +2 -2
  41. package/dist/tsup/driver-helpers/mod.d.ts +2 -2
  42. package/dist/tsup/driver-helpers/mod.js +2 -2
  43. package/dist/tsup/driver-test-suite/mod.cjs +81 -35
  44. package/dist/tsup/driver-test-suite/mod.cjs.map +1 -1
  45. package/dist/tsup/driver-test-suite/mod.d.cts +2 -2
  46. package/dist/tsup/driver-test-suite/mod.d.ts +2 -2
  47. package/dist/tsup/driver-test-suite/mod.js +407 -361
  48. package/dist/tsup/driver-test-suite/mod.js.map +1 -1
  49. package/dist/tsup/{kv-CTM8sCvx.d.cts → keys-Chhy4ylv.d.cts} +1 -0
  50. package/dist/tsup/{kv-CTM8sCvx.d.ts → keys-Chhy4ylv.d.ts} +1 -0
  51. package/dist/tsup/mod.cjs +9 -7
  52. package/dist/tsup/mod.cjs.map +1 -1
  53. package/dist/tsup/mod.d.cts +5 -5
  54. package/dist/tsup/mod.d.ts +5 -5
  55. package/dist/tsup/mod.js +8 -6
  56. package/dist/tsup/test/mod.cjs +7 -7
  57. package/dist/tsup/test/mod.d.cts +1 -1
  58. package/dist/tsup/test/mod.d.ts +1 -1
  59. package/dist/tsup/test/mod.js +6 -6
  60. package/dist/tsup/utils.cjs +2 -2
  61. package/dist/tsup/utils.js +1 -1
  62. package/package.json +2 -2
  63. package/src/actor/config.ts +183 -34
  64. package/src/actor/contexts/base/actor.ts +12 -0
  65. package/src/actor/instance/connection-manager.ts +1 -1
  66. package/src/actor/instance/keys.ts +29 -0
  67. package/src/actor/instance/kv.ts +240 -14
  68. package/src/actor/instance/mod.ts +5 -4
  69. package/src/actor/instance/state-manager.ts +1 -1
  70. package/src/actor/mod.ts +2 -1
  71. package/src/actor/router-websocket-endpoints.ts +2 -1
  72. package/src/client/actor-handle.ts +13 -3
  73. package/src/client/mod.ts +1 -1
  74. package/src/driver-helpers/utils.ts +1 -1
  75. package/src/driver-test-suite/mod.ts +3 -0
  76. package/src/driver-test-suite/test-inline-client-driver.ts +3 -0
  77. package/src/driver-test-suite/tests/actor-kv.ts +44 -0
  78. package/src/driver-test-suite/utils.ts +4 -0
  79. package/src/drivers/engine/actor-driver.ts +3 -3
  80. package/src/drivers/file-system/manager.ts +5 -0
  81. package/src/manager/driver.ts +7 -0
  82. package/src/remote-manager-driver/actor-http-client.ts +5 -3
  83. package/src/remote-manager-driver/actor-websocket-client.ts +18 -7
  84. package/src/remote-manager-driver/mod.ts +10 -0
  85. package/dist/tsup/chunk-6WLJW57U.cjs.map +0 -1
  86. package/dist/tsup/chunk-EEL32AJM.js.map +0 -1
  87. package/dist/tsup/chunk-FA6FGAEC.js.map +0 -1
  88. package/dist/tsup/chunk-IRTVRBJA.cjs.map +0 -1
  89. package/dist/tsup/chunk-IWXMFQDT.cjs.map +0 -1
  90. package/dist/tsup/chunk-LULP6HM2.cjs.map +0 -1
  91. package/dist/tsup/chunk-MIOU6BF3.js.map +0 -1
  92. /package/dist/tsup/{chunk-K2RNF2ZR.js.map → chunk-OJZRCEIA.js.map} +0 -0
  93. /package/dist/tsup/{chunk-WIZ4JGP6.js.map → chunk-PHCD25XO.js.map} +0 -0
@@ -1,15 +1,15 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
2
2
 
3
- var _chunkIRTVRBJAcjs = require('./chunk-IRTVRBJA.cjs');
3
+ var _chunkDY4H3ASEcjs = require('./chunk-DY4H3ASE.cjs');
4
4
 
5
5
 
6
- var _chunkLULP6HM2cjs = require('./chunk-LULP6HM2.cjs');
6
+ var _chunkUAX5E3EUcjs = require('./chunk-UAX5E3EU.cjs');
7
7
 
8
8
 
9
- var _chunkIWXMFQDTcjs = require('./chunk-IWXMFQDT.cjs');
9
+ var _chunkKMYFL3OLcjs = require('./chunk-KMYFL3OL.cjs');
10
10
 
11
11
 
12
- var _chunkO433HWWGcjs = require('./chunk-O433HWWG.cjs');
12
+ var _chunkX72X7I7Tcjs = require('./chunk-X72X7I7T.cjs');
13
13
 
14
14
  // src/test/mod.ts
15
15
  var _net = require('net');
@@ -19,14 +19,14 @@ var _invariant = require('invariant'); var _invariant2 = _interopRequireDefault(
19
19
 
20
20
  // src/test/log.ts
21
21
  function logger() {
22
- return _chunkO433HWWGcjs.getLogger.call(void 0, "test");
22
+ return _chunkX72X7I7Tcjs.getLogger.call(void 0, "test");
23
23
  }
24
24
 
25
25
  // src/test/mod.ts
26
26
  async function setupTest(c, registry) {
27
27
  var _a;
28
28
  registry.config.test = { ...registry.config.test, enabled: true };
29
- const driver = await _chunkIRTVRBJAcjs.createFileSystemOrMemoryDriver.call(void 0,
29
+ const driver = await _chunkDY4H3ASEcjs.createFileSystemOrMemoryDriver.call(void 0,
30
30
  true,
31
31
  `/tmp/rivetkit-test-${crypto.randomUUID()}`
32
32
  );
@@ -39,7 +39,7 @@ async function setupTest(c, registry) {
39
39
  const parsedConfig = registry.parseConfig();
40
40
  const managerDriver = (_a = driver.manager) == null ? void 0 : _a.call(driver, parsedConfig);
41
41
  _invariant2.default.call(void 0, managerDriver, "missing manager driver");
42
- const { router } = _chunkIWXMFQDTcjs.buildManagerRouter.call(void 0,
42
+ const { router } = _chunkKMYFL3OLcjs.buildManagerRouter.call(void 0,
43
43
  parsedConfig,
44
44
  managerDriver,
45
45
  () => upgradeWebSocket
@@ -62,7 +62,7 @@ async function setupTest(c, registry) {
62
62
  c.onTestFinished(async () => {
63
63
  await new Promise((resolve) => server.close(() => resolve(void 0)));
64
64
  });
65
- const client = _chunkLULP6HM2cjs.createClient.call(void 0, {
65
+ const client = _chunkUAX5E3EUcjs.createClient.call(void 0, {
66
66
  endpoint,
67
67
  namespace: "default",
68
68
  runnerName: "default"
@@ -111,4 +111,4 @@ async function getPort() {
111
111
 
112
112
 
113
113
  exports.setupTest = setupTest; exports.getPort = getPort;
114
- //# sourceMappingURL=chunk-FZQHTGQX.cjs.map
114
+ //# sourceMappingURL=chunk-MZPYVTVG.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/runner/work/rivet/rivet/rivetkit-typescript/packages/rivetkit/dist/tsup/chunk-FZQHTGQX.cjs","../../src/test/mod.ts","../../src/test/log.ts"],"names":[],"mappings":"AAAA;AACE;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACA;ACbA,0BAA6B;AAC7B,+CAAmC;AACnC,uCAAoC;AACpC,4FAAsB;ADetB;AACA;AEjBO,SAAS,MAAA,CAAA,EAAS;AACxB,EAAA,OAAO,yCAAA,MAAgB,CAAA;AACxB;AFmBA;AACA;ACNA,MAAA,SAAsB,SAAA,CACrB,CAAA,EACA,QAAA,EAC8B;AArB/B,EAAA,IAAA,EAAA;AAuBC,EAAA,QAAA,CAAS,MAAA,CAAO,KAAA,EAAO,EAAE,GAAG,QAAA,CAAS,MAAA,CAAO,IAAA,EAAM,OAAA,EAAS,KAAK,CAAA;AAGhE,EAAA,MAAM,OAAA,EAAS,MAAM,8DAAA;AAAA,IACpB,IAAA;AAAA,IACA,CAAA,mBAAA,EAAsB,MAAA,CAAO,UAAA,CAAW,CAAC,CAAA;AAAA,EAAA;AAK1C,EAAA;AACA,EAAA;AACA,EAAA;AAA4B,IAAA;AAClB,IAAA;AACI,EAAA;AAId,EAAA;AACA,EAAA;AACA,EAAA;AAKA,EAAA;AAAmB,IAAA;AAClB,IAAA;AACA,IAAA;AACM,EAAA;AAIP,EAAA;AACA,EAAA;AAIA,EAAA;AACA,EAAA;AAAyB,IAAA;AACV,IAAA;AACJ,IAAA;AACV,EAAA;AAED,EAAA;AAAA,IAAA;AACmC,IAAA;AAClC,EAAA;AAED,EAAA;AACA,EAAA;AAEA,EAAA;AAGA,EAAA;AACC,IAAA;AAAqE,EAAA;AAItE,EAAA;AAA+B,IAAA;AAC9B,IAAA;AACW,IAAA;AACC,EAAA;AAEb,EAAA;AAEA,EAAA;AACD;AAEA;AAEC,EAAA;AACA,EAAA;AACA,EAAA;AAGA,EAAA;AACA,EAAA;AAEA,EAAA;AACC,IAAA;AAEC,MAAA;AACC,QAAA;AAEA,QAAA;AACC,UAAA;AACC,YAAA;AAA0C,UAAA;AAE1C,YAAA;AAAU,UAAA;AACX,QAAA;AAGD,QAAA;AACC,UAAA;AAAc,QAAA;AAGf,QAAA;AAAkB,MAAA;AAInB,MAAA;AACC,QAAA;AAA4B,MAAA;AAG7B,MAAA;AAAO,IAAA;AAGP,MAAA;AACA,MAAA;AACC,QAAA;AAAA,MAAA;AAED,MAAA;AAAqB,IAAA;AACtB,EAAA;AAGD,EAAA;AACD;AD/BA;AACA;AACA;AACA;AACA","file":"/home/runner/work/rivet/rivet/rivetkit-typescript/packages/rivetkit/dist/tsup/chunk-FZQHTGQX.cjs","sourcesContent":[null,"import { createServer } from \"node:net\";\nimport { serve as honoServe } from \"@hono/node-server\";\nimport { createNodeWebSocket } from \"@hono/node-ws\";\nimport invariant from \"invariant\";\nimport { type TestContext, vi } from \"vitest\";\nimport { ClientConfigSchema } from \"@/client/config\";\nimport { type Client, createClient } from \"@/client/mod\";\nimport { createFileSystemOrMemoryDriver } from \"@/drivers/file-system/mod\";\nimport { createClientWithDriver, type Registry } from \"@/mod\";\nimport { RegistryConfig, RegistryConfigSchema } from \"@/registry/config\";\nimport { buildManagerRouter } from \"@/manager/router\";\nimport { logger } from \"./log\";\n\nexport interface SetupTestResult<A extends Registry<any>> {\n\tclient: Client<A>;\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\t// Force enable test mode\n\tregistry.config.test = { ...registry.config.test, enabled: true };\n\n\t// Create driver\n\tconst driver = await createFileSystemOrMemoryDriver(\n\t\ttrue,\n\t\t`/tmp/rivetkit-test-${crypto.randomUUID()}`,\n\t);\n\n\t// Build driver config\n\t// biome-ignore lint/style/useConst: Assigned later\n\tlet upgradeWebSocket: any;\n\tregistry.config.driver = driver;\n\tregistry.config.inspector = {\n\t\tenabled: true,\n\t\ttoken: () => \"token\",\n\t};\n\n\t// Create router\n\tconst parsedConfig = registry.parseConfig();\n\tconst managerDriver = driver.manager?.(parsedConfig);\n\tinvariant(managerDriver, \"missing manager driver\");\n\t// const internalClient = createClientWithDriver(\n\t// \tmanagerDriver,\n\t// \tClientConfigSchema.parse({}),\n\t// );\n\tconst { router } = buildManagerRouter(\n\t\tparsedConfig,\n\t\tmanagerDriver,\n\t\t() => upgradeWebSocket!,\n\t);\n\n\t// Inject WebSocket\n\tconst nodeWebSocket = createNodeWebSocket({ app: router });\n\tupgradeWebSocket = nodeWebSocket.upgradeWebSocket;\n\n\t// TODO: I think this whole function is fucked, we should probably switch to calling registry.serve() directly\n\t// Start server\n\tconst port = await getPort();\n\tconst server = honoServe({\n\t\tfetch: router.fetch,\n\t\thostname: \"127.0.0.1\",\n\t\tport,\n\t});\n\tinvariant(\n\t\tnodeWebSocket.injectWebSocket !== undefined,\n\t\t\"should have injectWebSocket\",\n\t);\n\tnodeWebSocket.injectWebSocket(server);\n\tconst endpoint = `http://127.0.0.1:${port}`;\n\n\tlogger().info({ msg: \"test server listening\", port });\n\n\t// Cleanup on test finish\n\tc.onTestFinished(async () => {\n\t\tawait new Promise((resolve) => server.close(() => resolve(undefined)));\n\t});\n\n\t// Create client\n\tconst client = createClient<A>({\n\t\tendpoint,\n\t\tnamespace: \"default\",\n\t\trunnerName: \"default\",\n\t});\n\tc.onTestFinished(async () => await client.dispose());\n\n\treturn { client };\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 { getLogger } from \"@/common/log\";\n\nexport function logger() {\n\treturn getLogger(\"test\");\n}\n"]}
1
+ {"version":3,"sources":["/home/runner/work/rivet/rivet/rivetkit-typescript/packages/rivetkit/dist/tsup/chunk-MZPYVTVG.cjs","../../src/test/mod.ts","../../src/test/log.ts"],"names":[],"mappings":"AAAA;AACE;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACA;ACbA,0BAA6B;AAC7B,+CAAmC;AACnC,uCAAoC;AACpC,4FAAsB;ADetB;AACA;AEjBO,SAAS,MAAA,CAAA,EAAS;AACxB,EAAA,OAAO,yCAAA,MAAgB,CAAA;AACxB;AFmBA;AACA;ACNA,MAAA,SAAsB,SAAA,CACrB,CAAA,EACA,QAAA,EAC8B;AArB/B,EAAA,IAAA,EAAA;AAuBC,EAAA,QAAA,CAAS,MAAA,CAAO,KAAA,EAAO,EAAE,GAAG,QAAA,CAAS,MAAA,CAAO,IAAA,EAAM,OAAA,EAAS,KAAK,CAAA;AAGhE,EAAA,MAAM,OAAA,EAAS,MAAM,8DAAA;AAAA,IACpB,IAAA;AAAA,IACA,CAAA,mBAAA,EAAsB,MAAA,CAAO,UAAA,CAAW,CAAC,CAAA;AAAA,EAAA;AAK1C,EAAA;AACA,EAAA;AACA,EAAA;AAA4B,IAAA;AAClB,IAAA;AACI,EAAA;AAId,EAAA;AACA,EAAA;AACA,EAAA;AAKA,EAAA;AAAmB,IAAA;AAClB,IAAA;AACA,IAAA;AACM,EAAA;AAIP,EAAA;AACA,EAAA;AAIA,EAAA;AACA,EAAA;AAAyB,IAAA;AACV,IAAA;AACJ,IAAA;AACV,EAAA;AAED,EAAA;AAAA,IAAA;AACmC,IAAA;AAClC,EAAA;AAED,EAAA;AACA,EAAA;AAEA,EAAA;AAGA,EAAA;AACC,IAAA;AAAqE,EAAA;AAItE,EAAA;AAA+B,IAAA;AAC9B,IAAA;AACW,IAAA;AACC,EAAA;AAEb,EAAA;AAEA,EAAA;AACD;AAEA;AAEC,EAAA;AACA,EAAA;AACA,EAAA;AAGA,EAAA;AACA,EAAA;AAEA,EAAA;AACC,IAAA;AAEC,MAAA;AACC,QAAA;AAEA,QAAA;AACC,UAAA;AACC,YAAA;AAA0C,UAAA;AAE1C,YAAA;AAAU,UAAA;AACX,QAAA;AAGD,QAAA;AACC,UAAA;AAAc,QAAA;AAGf,QAAA;AAAkB,MAAA;AAInB,MAAA;AACC,QAAA;AAA4B,MAAA;AAG7B,MAAA;AAAO,IAAA;AAGP,MAAA;AACA,MAAA;AACC,QAAA;AAAA,MAAA;AAED,MAAA;AAAqB,IAAA;AACtB,EAAA;AAGD,EAAA;AACD;AD/BA;AACA;AACA;AACA;AACA","file":"/home/runner/work/rivet/rivet/rivetkit-typescript/packages/rivetkit/dist/tsup/chunk-MZPYVTVG.cjs","sourcesContent":[null,"import { createServer } from \"node:net\";\nimport { serve as honoServe } from \"@hono/node-server\";\nimport { createNodeWebSocket } from \"@hono/node-ws\";\nimport invariant from \"invariant\";\nimport { type TestContext, vi } from \"vitest\";\nimport { ClientConfigSchema } from \"@/client/config\";\nimport { type Client, createClient } from \"@/client/mod\";\nimport { createFileSystemOrMemoryDriver } from \"@/drivers/file-system/mod\";\nimport { createClientWithDriver, type Registry } from \"@/mod\";\nimport { RegistryConfig, RegistryConfigSchema } from \"@/registry/config\";\nimport { buildManagerRouter } from \"@/manager/router\";\nimport { logger } from \"./log\";\n\nexport interface SetupTestResult<A extends Registry<any>> {\n\tclient: Client<A>;\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\t// Force enable test mode\n\tregistry.config.test = { ...registry.config.test, enabled: true };\n\n\t// Create driver\n\tconst driver = await createFileSystemOrMemoryDriver(\n\t\ttrue,\n\t\t`/tmp/rivetkit-test-${crypto.randomUUID()}`,\n\t);\n\n\t// Build driver config\n\t// biome-ignore lint/style/useConst: Assigned later\n\tlet upgradeWebSocket: any;\n\tregistry.config.driver = driver;\n\tregistry.config.inspector = {\n\t\tenabled: true,\n\t\ttoken: () => \"token\",\n\t};\n\n\t// Create router\n\tconst parsedConfig = registry.parseConfig();\n\tconst managerDriver = driver.manager?.(parsedConfig);\n\tinvariant(managerDriver, \"missing manager driver\");\n\t// const internalClient = createClientWithDriver(\n\t// \tmanagerDriver,\n\t// \tClientConfigSchema.parse({}),\n\t// );\n\tconst { router } = buildManagerRouter(\n\t\tparsedConfig,\n\t\tmanagerDriver,\n\t\t() => upgradeWebSocket!,\n\t);\n\n\t// Inject WebSocket\n\tconst nodeWebSocket = createNodeWebSocket({ app: router });\n\tupgradeWebSocket = nodeWebSocket.upgradeWebSocket;\n\n\t// TODO: I think this whole function is fucked, we should probably switch to calling registry.serve() directly\n\t// Start server\n\tconst port = await getPort();\n\tconst server = honoServe({\n\t\tfetch: router.fetch,\n\t\thostname: \"127.0.0.1\",\n\t\tport,\n\t});\n\tinvariant(\n\t\tnodeWebSocket.injectWebSocket !== undefined,\n\t\t\"should have injectWebSocket\",\n\t);\n\tnodeWebSocket.injectWebSocket(server);\n\tconst endpoint = `http://127.0.0.1:${port}`;\n\n\tlogger().info({ msg: \"test server listening\", port });\n\n\t// Cleanup on test finish\n\tc.onTestFinished(async () => {\n\t\tawait new Promise((resolve) => server.close(() => resolve(undefined)));\n\t});\n\n\t// Create client\n\tconst client = createClient<A>({\n\t\tendpoint,\n\t\tnamespace: \"default\",\n\t\trunnerName: \"default\",\n\t});\n\tc.onTestFinished(async () => await client.dispose());\n\n\treturn { client };\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 { getLogger } from \"@/common/log\";\n\nexport function logger() {\n\treturn getLogger(\"test\");\n}\n"]}
@@ -1,15 +1,15 @@
1
1
  import {
2
2
  createFileSystemOrMemoryDriver
3
- } from "./chunk-UUEZVDRL.js";
3
+ } from "./chunk-T7IPDBWH.js";
4
4
  import {
5
5
  createClient
6
- } from "./chunk-EEL32AJM.js";
6
+ } from "./chunk-XU74APB4.js";
7
7
  import {
8
8
  buildManagerRouter
9
- } from "./chunk-MIOU6BF3.js";
9
+ } from "./chunk-PVKUXMOA.js";
10
10
  import {
11
11
  getLogger
12
- } from "./chunk-4U45T5KW.js";
12
+ } from "./chunk-CDK6DRO2.js";
13
13
 
14
14
  // src/test/mod.ts
15
15
  import { createServer } from "net";
@@ -111,4 +111,4 @@ export {
111
111
  setupTest,
112
112
  getPort
113
113
  };
114
- //# sourceMappingURL=chunk-K2RNF2ZR.js.map
114
+ //# sourceMappingURL=chunk-OJZRCEIA.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  getLogger
3
- } from "./chunk-4U45T5KW.js";
3
+ } from "./chunk-CDK6DRO2.js";
4
4
 
5
5
  // src/client/log.ts
6
6
  function logger() {
@@ -46,4 +46,4 @@ export {
46
46
  logger,
47
47
  importWebSocket
48
48
  };
49
- //# sourceMappingURL=chunk-WIZ4JGP6.js.map
49
+ //# sourceMappingURL=chunk-PHCD25XO.js.map
@@ -31,7 +31,7 @@ import {
31
31
  noopNext,
32
32
  promiseWithResolvers,
33
33
  stringifyError
34
- } from "./chunk-4U45T5KW.js";
34
+ } from "./chunk-CDK6DRO2.js";
35
35
  import {
36
36
  ConnStateNotEnabled,
37
37
  Forbidden,
@@ -152,12 +152,215 @@ import * as cbor3 from "cbor-x";
152
152
  // src/actor/router-endpoints.ts
153
153
  import * as cbor2 from "cbor-x";
154
154
 
155
+ // src/actor/instance/keys.ts
156
+ var KEYS = {
157
+ PERSIST_DATA: Uint8Array.from([1]),
158
+ CONN_PREFIX: Uint8Array.from([2]),
159
+ // Prefix for connection keys
160
+ INSPECTOR_TOKEN: Uint8Array.from([3]),
161
+ // Inspector token key
162
+ KV: Uint8Array.from([4])
163
+ // Prefix for user-facing KV storage
164
+ };
165
+ function makePrefixedKey(key) {
166
+ const prefixed = new Uint8Array(KEYS.KV.length + key.length);
167
+ prefixed.set(KEYS.KV, 0);
168
+ prefixed.set(key, KEYS.KV.length);
169
+ return prefixed;
170
+ }
171
+ function removePrefixFromKey(prefixedKey) {
172
+ return prefixedKey.slice(KEYS.KV.length);
173
+ }
174
+ function makeConnKey(connId) {
175
+ const encoder = new TextEncoder();
176
+ const connIdBytes = encoder.encode(connId);
177
+ const key = new Uint8Array(KEYS.CONN_PREFIX.length + connIdBytes.length);
178
+ key.set(KEYS.CONN_PREFIX, 0);
179
+ key.set(connIdBytes, KEYS.CONN_PREFIX.length);
180
+ return key;
181
+ }
182
+
183
+ // src/actor/instance/kv.ts
184
+ var textEncoder = new TextEncoder();
185
+ var textDecoder = new TextDecoder();
186
+ function encodeKey(key, keyType) {
187
+ if (key instanceof Uint8Array) {
188
+ return key;
189
+ }
190
+ const resolvedKeyType = keyType ?? "text";
191
+ if (resolvedKeyType === "binary") {
192
+ throw new TypeError("Expected a Uint8Array when keyType is binary");
193
+ }
194
+ return textEncoder.encode(key);
195
+ }
196
+ function decodeKey(key, keyType) {
197
+ const resolvedKeyType = keyType ?? "text";
198
+ switch (resolvedKeyType) {
199
+ case "text":
200
+ return textDecoder.decode(key);
201
+ case "binary":
202
+ return key;
203
+ default:
204
+ throw new TypeError("Invalid kv key type");
205
+ }
206
+ }
207
+ function resolveValueType(value) {
208
+ if (typeof value === "string") {
209
+ return "text";
210
+ }
211
+ if (value instanceof Uint8Array) {
212
+ return "binary";
213
+ }
214
+ if (value instanceof ArrayBuffer) {
215
+ return "arrayBuffer";
216
+ }
217
+ throw new TypeError("Invalid kv value");
218
+ }
219
+ function encodeValue(value, options) {
220
+ const type = (options == null ? void 0 : options.type) ?? resolveValueType(value);
221
+ switch (type) {
222
+ case "text":
223
+ if (typeof value !== "string") {
224
+ throw new TypeError("Expected a string when type is text");
225
+ }
226
+ return textEncoder.encode(value);
227
+ case "arrayBuffer":
228
+ if (!(value instanceof ArrayBuffer)) {
229
+ throw new TypeError("Expected an ArrayBuffer when type is arrayBuffer");
230
+ }
231
+ return new Uint8Array(value);
232
+ case "binary":
233
+ if (!(value instanceof Uint8Array)) {
234
+ throw new TypeError("Expected a Uint8Array when type is binary");
235
+ }
236
+ return value;
237
+ default:
238
+ throw new TypeError("Invalid kv value type");
239
+ }
240
+ }
241
+ function decodeValue(value, options) {
242
+ const type = (options == null ? void 0 : options.type) ?? "text";
243
+ switch (type) {
244
+ case "text":
245
+ return textDecoder.decode(value);
246
+ case "arrayBuffer": {
247
+ const copy = new Uint8Array(value.byteLength);
248
+ copy.set(value);
249
+ return copy.buffer;
250
+ }
251
+ case "binary":
252
+ return value;
253
+ default:
254
+ throw new TypeError("Invalid kv value type");
255
+ }
256
+ }
257
+ var ActorKv = class {
258
+ #driver;
259
+ #actorId;
260
+ constructor(driver, actorId) {
261
+ this.#driver = driver;
262
+ this.#actorId = actorId;
263
+ }
264
+ /**
265
+ * Get a single value by key.
266
+ */
267
+ async get(key, options) {
268
+ const results = await this.#driver.kvBatchGet(this.#actorId, [
269
+ makePrefixedKey(encodeKey(key))
270
+ ]);
271
+ const result = results[0];
272
+ if (!result) {
273
+ return null;
274
+ }
275
+ return decodeValue(result, options);
276
+ }
277
+ /**
278
+ * Get multiple values by keys.
279
+ */
280
+ async getBatch(keys, options) {
281
+ const prefixedKeys = keys.map(
282
+ (key) => makePrefixedKey(encodeKey(key))
283
+ );
284
+ const results = await this.#driver.kvBatchGet(
285
+ this.#actorId,
286
+ prefixedKeys
287
+ );
288
+ return results.map(
289
+ (result) => result ? decodeValue(result, options) : null
290
+ );
291
+ }
292
+ /**
293
+ * Put a single key-value pair.
294
+ */
295
+ async put(key, value, options) {
296
+ await this.#driver.kvBatchPut(this.#actorId, [
297
+ [makePrefixedKey(encodeKey(key)), encodeValue(value, options)]
298
+ ]);
299
+ }
300
+ /**
301
+ * Put multiple key-value pairs.
302
+ */
303
+ async putBatch(entries, options) {
304
+ const prefixedEntries = entries.map(
305
+ ([key, value]) => [
306
+ makePrefixedKey(encodeKey(key)),
307
+ encodeValue(value, options)
308
+ ]
309
+ );
310
+ await this.#driver.kvBatchPut(this.#actorId, prefixedEntries);
311
+ }
312
+ /**
313
+ * Delete a single key.
314
+ */
315
+ async delete(key) {
316
+ await this.#driver.kvBatchDelete(this.#actorId, [
317
+ makePrefixedKey(encodeKey(key))
318
+ ]);
319
+ }
320
+ /**
321
+ * Delete multiple keys.
322
+ */
323
+ async deleteBatch(keys) {
324
+ const prefixedKeys = keys.map(
325
+ (key) => makePrefixedKey(encodeKey(key))
326
+ );
327
+ await this.#driver.kvBatchDelete(this.#actorId, prefixedKeys);
328
+ }
329
+ /**
330
+ * List all keys with a given prefix.
331
+ * Returns key-value pairs where keys have the user prefix removed.
332
+ */
333
+ async list(prefix, options) {
334
+ const prefixedPrefix = makePrefixedKey(
335
+ encodeKey(prefix, options == null ? void 0 : options.keyType)
336
+ );
337
+ const results = await this.#driver.kvListPrefix(
338
+ this.#actorId,
339
+ prefixedPrefix
340
+ );
341
+ return results.map(([key, value]) => [
342
+ decodeKey(removePrefixFromKey(key), options == null ? void 0 : options.keyType),
343
+ decodeValue(value, options)
344
+ ]);
345
+ }
346
+ };
347
+
155
348
  // src/actor/contexts/base/actor.ts
156
349
  var ActorContext = class {
157
350
  #actor;
351
+ #kv;
158
352
  constructor(actor) {
159
353
  this.#actor = actor;
160
354
  }
355
+ /**
356
+ * Gets the KV storage interface.
357
+ */
358
+ get kv() {
359
+ if (!this.#kv) {
360
+ this.#kv = new ActorKv(this.#actor.driver, this.#actor.id);
361
+ }
362
+ return this.#kv;
363
+ }
161
364
  /**
162
365
  * Get the actor state
163
366
  *
@@ -3338,7 +3541,7 @@ function parseWebSocketProtocols(protocols) {
3338
3541
  }
3339
3542
  }
3340
3543
  }
3341
- const encoding = EncodingSchema.parse(encodingRaw);
3544
+ const encoding = EncodingSchema.parse(encodingRaw ?? "json");
3342
3545
  const connParams = connParamsRaw ? JSON.parse(connParamsRaw) : void 0;
3343
3546
  return { encoding, connParams };
3344
3547
  }
@@ -4200,23 +4403,6 @@ function createApiActor(actor) {
4200
4403
  // src/driver-helpers/utils.ts
4201
4404
  import * as cbor7 from "cbor-x";
4202
4405
 
4203
- // src/actor/instance/kv.ts
4204
- var KEYS = {
4205
- PERSIST_DATA: Uint8Array.from([1]),
4206
- CONN_PREFIX: Uint8Array.from([2]),
4207
- // Prefix for connection keys
4208
- INSPECTOR_TOKEN: Uint8Array.from([3])
4209
- // Inspector token key
4210
- };
4211
- function makeConnKey(connId) {
4212
- const encoder = new TextEncoder();
4213
- const connIdBytes = encoder.encode(connId);
4214
- const key = new Uint8Array(KEYS.CONN_PREFIX.length + connIdBytes.length);
4215
- key.set(KEYS.CONN_PREFIX, 0);
4216
- key.set(connIdBytes, KEYS.CONN_PREFIX.length);
4217
- return key;
4218
- }
4219
-
4220
4406
  // src/schemas/actor-persist/versioned.ts
4221
4407
  import { createVersionedDataHandler as createVersionedDataHandler2 } from "vbare";
4222
4408
 
@@ -4936,6 +5122,9 @@ export {
4936
5122
  CONN_STATE_MANAGER_SYMBOL,
4937
5123
  CONN_SEND_MESSAGE_SYMBOL,
4938
5124
  Conn,
5125
+ KEYS,
5126
+ makeConnKey,
5127
+ ActorKv,
4939
5128
  ActorContext,
4940
5129
  ActionContext,
4941
5130
  CURRENT_VERSION2,
@@ -4951,8 +5140,6 @@ export {
4951
5140
  getValueLength,
4952
5141
  inputDataToBuffer,
4953
5142
  processMessage,
4954
- KEYS,
4955
- makeConnKey,
4956
5143
  PATH_CONNECT,
4957
5144
  PATH_WEBSOCKET_BASE,
4958
5145
  PATH_WEBSOCKET_PREFIX,
@@ -4999,4 +5186,4 @@ export {
4999
5186
  buildManagerRouter,
5000
5187
  getInitialActorKvState
5001
5188
  };
5002
- //# sourceMappingURL=chunk-MIOU6BF3.js.map
5189
+ //# sourceMappingURL=chunk-PVKUXMOA.js.map