rivetkit 2.0.19 → 2.0.21

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 (169) hide show
  1. package/dist/tsup/actor/errors.cjs.map +1 -1
  2. package/dist/tsup/{chunk-UGLCR467.js → chunk-2POQCWMA.js} +481 -100
  3. package/dist/tsup/chunk-2POQCWMA.js.map +1 -0
  4. package/dist/tsup/{chunk-GBVUP7IH.js → chunk-3UIGKLZW.js} +6 -6
  5. package/dist/tsup/chunk-3UIGKLZW.js.map +1 -0
  6. package/dist/tsup/{chunk-NCVKAD3U.js → chunk-4OINFQBR.js} +3 -3
  7. package/dist/tsup/{chunk-2N5T57W5.cjs → chunk-65SAIRRY.cjs} +12 -12
  8. package/dist/tsup/chunk-65SAIRRY.cjs.map +1 -0
  9. package/dist/tsup/{chunk-SO6CSZPF.js → chunk-6G76WIWL.js} +2 -2
  10. package/dist/tsup/{chunk-SO6CSZPF.js.map → chunk-6G76WIWL.js.map} +1 -1
  11. package/dist/tsup/{chunk-UBS2ARYU.js → chunk-D2LS4X6E.js} +11 -5
  12. package/dist/tsup/chunk-D2LS4X6E.js.map +1 -0
  13. package/dist/tsup/{chunk-FO4Q36GQ.js → chunk-DYA34FHW.js} +2 -2
  14. package/dist/tsup/{chunk-7RKGZXDH.cjs → chunk-ELDFBXDV.cjs} +8 -4
  15. package/dist/tsup/chunk-ELDFBXDV.cjs.map +1 -0
  16. package/dist/tsup/{chunk-F4PHLUIT.cjs → chunk-FDJ3AVNB.cjs} +32 -26
  17. package/dist/tsup/chunk-FDJ3AVNB.cjs.map +1 -0
  18. package/dist/tsup/{chunk-U3PO7PEY.js → chunk-FUX6U6TL.js} +2 -2
  19. package/dist/tsup/chunk-FUX6U6TL.js.map +1 -0
  20. package/dist/tsup/{chunk-AYNDGM4A.cjs → chunk-HN7UXCYQ.cjs} +7 -7
  21. package/dist/tsup/chunk-HN7UXCYQ.cjs.map +1 -0
  22. package/dist/tsup/{chunk-6MI3RWWC.js → chunk-HUGSRAGL.js} +8 -4
  23. package/dist/tsup/chunk-HUGSRAGL.js.map +1 -0
  24. package/dist/tsup/{chunk-7BTAYSZC.cjs → chunk-JKOUXDK6.cjs} +16 -10
  25. package/dist/tsup/chunk-JKOUXDK6.cjs.map +1 -0
  26. package/dist/tsup/{chunk-EXP6CQEI.cjs → chunk-JTIBPF7N.cjs} +14 -14
  27. package/dist/tsup/chunk-JTIBPF7N.cjs.map +1 -0
  28. package/dist/tsup/chunk-KSRXX3Z4.cjs.map +1 -1
  29. package/dist/tsup/{chunk-RIK4JNIG.cjs → chunk-LMJHBF26.cjs} +454 -288
  30. package/dist/tsup/chunk-LMJHBF26.cjs.map +1 -0
  31. package/dist/tsup/{chunk-DGXMPCNI.cjs → chunk-LWGCMELP.cjs} +3 -3
  32. package/dist/tsup/chunk-LWGCMELP.cjs.map +1 -0
  33. package/dist/tsup/{chunk-ZB3DP5IR.cjs → chunk-M5BHNJHB.cjs} +630 -249
  34. package/dist/tsup/chunk-M5BHNJHB.cjs.map +1 -0
  35. package/dist/tsup/{chunk-J5PFJTK3.cjs → chunk-O4GUKGK4.cjs} +6 -6
  36. package/dist/tsup/chunk-O4GUKGK4.cjs.map +1 -0
  37. package/dist/tsup/{chunk-LWQDW6VP.js → chunk-RZZDFDB6.js} +13 -7
  38. package/dist/tsup/chunk-RZZDFDB6.js.map +1 -0
  39. package/dist/tsup/{chunk-DAZ2YBCM.js → chunk-VLR3TDHT.js} +2 -2
  40. package/dist/tsup/{chunk-DAAQFFK3.js → chunk-Y2QONT7B.js} +262 -96
  41. package/dist/tsup/chunk-Y2QONT7B.js.map +1 -0
  42. package/dist/tsup/{chunk-AXQWQIUS.cjs → chunk-ZNWE3XBT.cjs} +3 -3
  43. package/dist/tsup/chunk-ZNWE3XBT.cjs.map +1 -0
  44. package/dist/tsup/client/mod.cjs +9 -9
  45. package/dist/tsup/client/mod.cjs.map +1 -1
  46. package/dist/tsup/client/mod.d.cts +2 -2
  47. package/dist/tsup/client/mod.d.ts +2 -2
  48. package/dist/tsup/client/mod.js +8 -8
  49. package/dist/tsup/common/log.cjs +3 -3
  50. package/dist/tsup/common/log.cjs.map +1 -1
  51. package/dist/tsup/common/log.js +2 -2
  52. package/dist/tsup/common/websocket.cjs +4 -4
  53. package/dist/tsup/common/websocket.cjs.map +1 -1
  54. package/dist/tsup/common/websocket.js +3 -3
  55. package/dist/tsup/{conn-DAXlyhVg.d.ts → conn-Clu655RU.d.ts} +1 -0
  56. package/dist/tsup/{conn--6rFdSfD.d.cts → conn-lUvFLo_q.d.cts} +1 -0
  57. package/dist/tsup/driver-helpers/mod.cjs +5 -5
  58. package/dist/tsup/driver-helpers/mod.cjs.map +1 -1
  59. package/dist/tsup/driver-helpers/mod.d.cts +1 -1
  60. package/dist/tsup/driver-helpers/mod.d.ts +1 -1
  61. package/dist/tsup/driver-helpers/mod.js +4 -4
  62. package/dist/tsup/driver-test-suite/mod.cjs +603 -294
  63. package/dist/tsup/driver-test-suite/mod.cjs.map +1 -1
  64. package/dist/tsup/driver-test-suite/mod.d.cts +1 -1
  65. package/dist/tsup/driver-test-suite/mod.d.ts +1 -1
  66. package/dist/tsup/driver-test-suite/mod.js +574 -265
  67. package/dist/tsup/driver-test-suite/mod.js.map +1 -1
  68. package/dist/tsup/inspector/mod.cjs +6 -6
  69. package/dist/tsup/inspector/mod.cjs.map +1 -1
  70. package/dist/tsup/inspector/mod.d.cts +68 -7
  71. package/dist/tsup/inspector/mod.d.ts +68 -7
  72. package/dist/tsup/inspector/mod.js +5 -5
  73. package/dist/tsup/mod.cjs +10 -10
  74. package/dist/tsup/mod.cjs.map +1 -1
  75. package/dist/tsup/mod.d.cts +2 -2
  76. package/dist/tsup/mod.d.ts +2 -2
  77. package/dist/tsup/mod.js +9 -9
  78. package/dist/tsup/test/mod.cjs +11 -11
  79. package/dist/tsup/test/mod.cjs.map +1 -1
  80. package/dist/tsup/test/mod.d.cts +1 -1
  81. package/dist/tsup/test/mod.d.ts +1 -1
  82. package/dist/tsup/test/mod.js +10 -10
  83. package/dist/tsup/utils.cjs +2 -2
  84. package/dist/tsup/utils.cjs.map +1 -1
  85. package/dist/tsup/utils.js +1 -1
  86. package/package.json +4 -3
  87. package/src/actor/config.ts +108 -15
  88. package/src/actor/conn-drivers.ts +2 -1
  89. package/src/actor/instance.ts +119 -35
  90. package/src/actor/keys.test.ts +13 -4
  91. package/src/actor/protocol/old.ts +10 -3
  92. package/src/actor/router-endpoints.ts +26 -16
  93. package/src/actor/router.ts +41 -13
  94. package/src/actor/unstable-react.ts +1 -1
  95. package/src/client/actor-common.ts +3 -1
  96. package/src/client/actor-conn.ts +44 -12
  97. package/src/client/actor-handle.ts +4 -1
  98. package/src/client/client.ts +32 -18
  99. package/src/client/utils.ts +21 -8
  100. package/src/common/actor-router-consts.ts +2 -0
  101. package/src/common/inline-websocket-adapter2.ts +24 -6
  102. package/src/common/log.ts +6 -2
  103. package/src/common/logfmt.ts +3 -1
  104. package/src/common/router.ts +3 -1
  105. package/src/common/utils.ts +6 -2
  106. package/src/driver-helpers/utils.ts +4 -1
  107. package/src/driver-test-suite/mod.ts +15 -4
  108. package/src/driver-test-suite/test-inline-client-driver.ts +35 -13
  109. package/src/driver-test-suite/tests/action-features.ts +6 -2
  110. package/src/driver-test-suite/tests/actor-conn-state.ts +18 -8
  111. package/src/driver-test-suite/tests/actor-conn.ts +35 -13
  112. package/src/driver-test-suite/tests/actor-handle.ts +35 -15
  113. package/src/driver-test-suite/tests/actor-inline-client.ts +34 -23
  114. package/src/driver-test-suite/tests/actor-inspector.ts +241 -131
  115. package/src/driver-test-suite/tests/actor-reconnect.ts +14 -4
  116. package/src/driver-test-suite/tests/actor-schedule.ts +12 -3
  117. package/src/driver-test-suite/tests/actor-sleep.ts +6 -3
  118. package/src/driver-test-suite/tests/actor-vars.ts +6 -2
  119. package/src/driver-test-suite/tests/manager-driver.ts +16 -6
  120. package/src/driver-test-suite/tests/raw-http-request-properties.ts +64 -25
  121. package/src/driver-test-suite/tests/raw-http.ts +17 -5
  122. package/src/driver-test-suite/tests/raw-websocket.ts +36 -12
  123. package/src/driver-test-suite/tests/request-access.ts +18 -8
  124. package/src/drivers/engine/actor-driver.ts +46 -25
  125. package/src/drivers/engine/config.ts +2 -1
  126. package/src/drivers/file-system/global-state.ts +58 -16
  127. package/src/drivers/file-system/manager.ts +35 -12
  128. package/src/drivers/file-system/mod.ts +6 -1
  129. package/src/drivers/file-system/utils.ts +8 -2
  130. package/src/engine-process/mod.ts +15 -4
  131. package/src/inspector/actor.ts +63 -23
  132. package/src/inspector/config.ts +2 -1
  133. package/src/inspector/manager.ts +10 -3
  134. package/src/inspector/utils.ts +2 -1
  135. package/src/manager/driver.ts +4 -1
  136. package/src/manager/gateway.ts +278 -8
  137. package/src/manager/hono-websocket-adapter.ts +33 -10
  138. package/src/manager/router-schema.ts +4 -2
  139. package/src/manager/router.ts +78 -12
  140. package/src/manager-api/actors.ts +2 -0
  141. package/src/registry/mod.ts +31 -9
  142. package/src/registry/run-config.ts +3 -1
  143. package/src/remote-manager-driver/api-endpoints.ts +2 -2
  144. package/src/remote-manager-driver/mod.ts +22 -5
  145. package/src/remote-manager-driver/ws-proxy.ts +21 -5
  146. package/src/serde.ts +6 -2
  147. package/src/test/mod.ts +2 -1
  148. package/src/utils.ts +6 -2
  149. package/dist/tsup/chunk-2N5T57W5.cjs.map +0 -1
  150. package/dist/tsup/chunk-6MI3RWWC.js.map +0 -1
  151. package/dist/tsup/chunk-7BTAYSZC.cjs.map +0 -1
  152. package/dist/tsup/chunk-7RKGZXDH.cjs.map +0 -1
  153. package/dist/tsup/chunk-AXQWQIUS.cjs.map +0 -1
  154. package/dist/tsup/chunk-AYNDGM4A.cjs.map +0 -1
  155. package/dist/tsup/chunk-DAAQFFK3.js.map +0 -1
  156. package/dist/tsup/chunk-DGXMPCNI.cjs.map +0 -1
  157. package/dist/tsup/chunk-EXP6CQEI.cjs.map +0 -1
  158. package/dist/tsup/chunk-F4PHLUIT.cjs.map +0 -1
  159. package/dist/tsup/chunk-GBVUP7IH.js.map +0 -1
  160. package/dist/tsup/chunk-J5PFJTK3.cjs.map +0 -1
  161. package/dist/tsup/chunk-LWQDW6VP.js.map +0 -1
  162. package/dist/tsup/chunk-RIK4JNIG.cjs.map +0 -1
  163. package/dist/tsup/chunk-U3PO7PEY.js.map +0 -1
  164. package/dist/tsup/chunk-UBS2ARYU.js.map +0 -1
  165. package/dist/tsup/chunk-UGLCR467.js.map +0 -1
  166. package/dist/tsup/chunk-ZB3DP5IR.cjs.map +0 -1
  167. /package/dist/tsup/{chunk-NCVKAD3U.js.map → chunk-4OINFQBR.js.map} +0 -0
  168. /package/dist/tsup/{chunk-FO4Q36GQ.js.map → chunk-DYA34FHW.js.map} +0 -0
  169. /package/dist/tsup/{chunk-DAZ2YBCM.js.map → chunk-VLR3TDHT.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/driver-test-suite/mod.ts","../../../src/driver-test-suite/log.ts","../../../src/driver-test-suite/tests/action-features.ts","../../../src/driver-test-suite/utils.ts","../../../src/driver-test-suite/test-inline-client-driver.ts","../../../src/driver-test-suite/tests/actor-conn.ts","../../../src/driver-test-suite/tests/actor-conn-state.ts","../../../src/driver-test-suite/tests/actor-driver.ts","../../../src/driver-test-suite/tests/actor-schedule.ts","../../../src/driver-test-suite/tests/actor-sleep.ts","../../../fixtures/driver-test-suite/sleep.ts","../../../src/driver-test-suite/tests/actor-state.ts","../../../src/driver-test-suite/tests/actor-error-handling.ts","../../../src/driver-test-suite/tests/actor-handle.ts","../../../src/driver-test-suite/tests/actor-inline-client.ts","../../../src/driver-test-suite/tests/actor-inspector.ts","../../../src/driver-test-suite/tests/actor-metadata.ts","../../../src/driver-test-suite/tests/actor-onstatechange.ts","../../../src/driver-test-suite/tests/actor-reconnect.ts","../../../src/driver-test-suite/tests/actor-vars.ts","../../../src/driver-test-suite/tests/manager-driver.ts","../../../src/driver-test-suite/tests/raw-http.ts","../../../src/driver-test-suite/tests/raw-http-request-properties.ts","../../../src/driver-test-suite/tests/raw-websocket.ts","../../../src/driver-test-suite/tests/request-access.ts"],"sourcesContent":["import { serve as honoServe } from \"@hono/node-server\";\nimport { createNodeWebSocket, type NodeWebSocket } from \"@hono/node-ws\";\nimport { bundleRequire } from \"bundle-require\";\nimport invariant from \"invariant\";\nimport { describe } from \"vitest\";\nimport { ClientConfigSchema } from \"@/client/config\";\nimport type { Encoding, Transport } from \"@/client/mod\";\nimport { configureInspectorAccessToken } from \"@/inspector/utils\";\nimport { createManagerRouter } from \"@/manager/router\";\nimport {\n\tcreateClientWithDriver,\n\ttype DriverConfig,\n\ttype Registry,\n\ttype RunConfig,\n} from \"@/mod\";\nimport { RunnerConfigSchema } from \"@/registry/run-config\";\nimport { getPort } from \"@/test/mod\";\nimport { logger } from \"./log\";\nimport { runActionFeaturesTests } from \"./tests/action-features\";\nimport { runActorConnTests } from \"./tests/actor-conn\";\nimport { runActorConnStateTests } from \"./tests/actor-conn-state\";\nimport {\n\trunActorDriverTests,\n\trunActorDriverTestsWithTransport,\n} from \"./tests/actor-driver\";\nimport { runActorErrorHandlingTests } from \"./tests/actor-error-handling\";\nimport { runActorHandleTests } from \"./tests/actor-handle\";\nimport { runActorInlineClientTests } from \"./tests/actor-inline-client\";\nimport { runActorInspectorTests } from \"./tests/actor-inspector\";\nimport { runActorMetadataTests } from \"./tests/actor-metadata\";\nimport { runActorOnStateChangeTests } from \"./tests/actor-onstatechange\";\nimport { runActorReconnectTests } from \"./tests/actor-reconnect\";\nimport { runActorVarsTests } from \"./tests/actor-vars\";\nimport { runManagerDriverTests } from \"./tests/manager-driver\";\nimport { runRawHttpTests } from \"./tests/raw-http\";\nimport { runRawHttpRequestPropertiesTests } from \"./tests/raw-http-request-properties\";\nimport { runRawWebSocketTests } from \"./tests/raw-websocket\";\nimport { runRequestAccessTests } from \"./tests/request-access\";\n\nexport interface SkipTests {\n\tschedule?: boolean;\n\tsleep?: boolean;\n\tsse?: boolean;\n\tinline?: boolean;\n}\n\nexport interface DriverTestConfig {\n\t/** Deploys an registry and returns the connection endpoint. */\n\tstart(): Promise<DriverDeployOutput>;\n\n\t/**\n\t * If we're testing with an external system, we should use real timers\n\t * instead of Vitest's mocked timers.\n\t **/\n\tuseRealTimers?: boolean;\n\n\t/** Cloudflare Workers has some bugs with cleanup. */\n\tHACK_skipCleanupNet?: boolean;\n\n\tskip?: SkipTests;\n\n\ttransport?: Transport;\n\n\tencoding?: Encoding;\n\n\tclientType: ClientType;\n\n\tcleanup?: () => Promise<void>;\n}\n\n/**\n * The type of client to run the test with.\n *\n * The logic for HTTP vs inline is very different, so this helps validate all behavior matches.\n **/\ntype ClientType = \"http\" | \"inline\";\n\nexport interface DriverDeployOutput {\n\tendpoint: string;\n\tnamespace: string;\n\trunnerName: string;\n\n\t/** Cleans up the test. */\n\tcleanup(): Promise<void>;\n}\n\n/** Runs all Vitest tests against the provided drivers. */\nexport function runDriverTests(\n\tdriverTestConfigPartial: Omit<\n\t\tDriverTestConfig,\n\t\t\"clientType\" | \"transport\" | \"encoding\"\n\t>,\n) {\n\tconst clientTypes: ClientType[] = driverTestConfigPartial.skip?.inline\n\t\t? [\"http\"]\n\t\t: [\"http\", \"inline\"];\n\tfor (const clientType of clientTypes) {\n\t\tdescribe(`client type (${clientType})`, () => {\n\t\t\tconst encodings: Encoding[] = [\"bare\", \"cbor\", \"json\"];\n\n\t\t\tfor (const encoding of encodings) {\n\t\t\t\tdescribe(`encoding (${encoding})`, () => {\n\t\t\t\t\tconst driverTestConfig: DriverTestConfig = {\n\t\t\t\t\t\t...driverTestConfigPartial,\n\t\t\t\t\t\tclientType,\n\t\t\t\t\t\tencoding,\n\t\t\t\t\t};\n\n\t\t\t\t\trunActorDriverTests(driverTestConfig);\n\t\t\t\t\trunManagerDriverTests(driverTestConfig);\n\n\t\t\t\t\tconst transports: Transport[] = driverTestConfig.skip?.sse\n\t\t\t\t\t\t? [\"websocket\"]\n\t\t\t\t\t\t: [\"websocket\", \"sse\"];\n\t\t\t\t\tfor (const transport of transports) {\n\t\t\t\t\t\tdescribe(`transport (${transport})`, () => {\n\t\t\t\t\t\t\trunActorConnTests({\n\t\t\t\t\t\t\t\t...driverTestConfig,\n\t\t\t\t\t\t\t\ttransport,\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\trunActorConnStateTests({ ...driverTestConfig, transport });\n\n\t\t\t\t\t\t\trunActorReconnectTests({ ...driverTestConfig, transport });\n\n\t\t\t\t\t\t\trunRequestAccessTests({ ...driverTestConfig, transport });\n\n\t\t\t\t\t\t\trunActorDriverTestsWithTransport({\n\t\t\t\t\t\t\t\t...driverTestConfig,\n\t\t\t\t\t\t\t\ttransport,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\trunActorHandleTests(driverTestConfig);\n\n\t\t\t\t\trunActionFeaturesTests(driverTestConfig);\n\n\t\t\t\t\trunActorVarsTests(driverTestConfig);\n\n\t\t\t\t\trunActorMetadataTests(driverTestConfig);\n\n\t\t\t\t\trunActorOnStateChangeTests(driverTestConfig);\n\n\t\t\t\t\trunActorErrorHandlingTests(driverTestConfig);\n\n\t\t\t\t\trunActorInlineClientTests(driverTestConfig);\n\n\t\t\t\t\trunRawHttpTests(driverTestConfig);\n\n\t\t\t\t\trunRawHttpRequestPropertiesTests(driverTestConfig);\n\n\t\t\t\t\trunRawWebSocketTests(driverTestConfig);\n\n\t\t\t\t\t// TODO: re-expose this once we can have actor queries on the gateway\n\t\t\t\t\t// runRawHttpDirectRegistryTests(driverTestConfig);\n\n\t\t\t\t\t// TODO: re-expose this once we can have actor queries on the gateway\n\t\t\t\t\t// runRawWebSocketDirectRegistryTests(driverTestConfig);\n\n\t\t\t\t\trunActorInspectorTests(driverTestConfig);\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n}\n\n/**\n * Helper function to adapt the drivers to the Node.js runtime for tests.\n *\n * This is helpful for drivers that run in-process as opposed to drivers that rely on external tools.\n */\nexport async function createTestRuntime(\n\tregistryPath: string,\n\tdriverFactory: (registry: Registry<any>) => Promise<{\n\t\trivetEngine?: {\n\t\t\tendpoint: string;\n\t\t\tnamespace: string;\n\t\t\trunnerName: string;\n\t\t\ttoken: string;\n\t\t};\n\t\tdriver: DriverConfig;\n\t\tcleanup?: () => Promise<void>;\n\t}>,\n): Promise<DriverDeployOutput> {\n\tconst {\n\t\tmod: { registry },\n\t} = await bundleRequire<{ registry: Registry<any> }>({\n\t\tfilepath: registryPath,\n\t});\n\n\t// TODO: Find a cleaner way of flagging an registry as test mode (ideally not in the config itself)\n\t// Force enable test\n\tregistry.config.test.enabled = true;\n\n\t// Build drivers\n\tconst {\n\t\tdriver,\n\t\tcleanup: driverCleanup,\n\t\trivetEngine,\n\t} = await driverFactory(registry);\n\n\tif (rivetEngine) {\n\t\t// TODO: We don't need createTestRuntime fort his\n\t\t// Using external Rivet engine\n\n\t\tconst cleanup = async () => {\n\t\t\tawait driverCleanup?.();\n\t\t};\n\n\t\treturn {\n\t\t\tendpoint: rivetEngine.endpoint,\n\t\t\tnamespace: rivetEngine.namespace,\n\t\t\trunnerName: rivetEngine.runnerName,\n\t\t\tcleanup,\n\t\t};\n\t} else {\n\t\t// Start server for Rivet engine\n\n\t\t// Build driver config\n\t\t// biome-ignore lint/style/useConst: Assigned later\n\t\tlet upgradeWebSocket: any;\n\t\tconst config: RunConfig = RunnerConfigSchema.parse({\n\t\t\tdriver,\n\t\t\tgetUpgradeWebSocket: () => upgradeWebSocket!,\n\t\t\tinspector: {\n\t\t\t\tenabled: true,\n\t\t\t\ttoken: () => \"token\",\n\t\t\t},\n\t\t});\n\n\t\t// Create router\n\t\tconst managerDriver = driver.manager(registry.config, config);\n\t\tconst client = createClientWithDriver(\n\t\t\tmanagerDriver,\n\t\t\tClientConfigSchema.parse({}),\n\t\t);\n\t\tconfigureInspectorAccessToken(config, managerDriver);\n\t\tconst { router } = createManagerRouter(\n\t\t\tregistry.config,\n\t\t\tconfig,\n\t\t\tmanagerDriver,\n\t\t\tdriver,\n\t\t\tclient,\n\t\t);\n\n\t\t// Inject WebSocket\n\t\tconst nodeWebSocket = createNodeWebSocket({ app: router });\n\t\tupgradeWebSocket = nodeWebSocket.upgradeWebSocket;\n\n\t\t// Start server\n\t\tconst port = await getPort();\n\t\tconst server = honoServe({\n\t\t\tfetch: router.fetch,\n\t\t\thostname: \"127.0.0.1\",\n\t\t\tport,\n\t\t});\n\t\tinvariant(\n\t\t\tnodeWebSocket.injectWebSocket !== undefined,\n\t\t\t\"should have injectWebSocket\",\n\t\t);\n\t\tnodeWebSocket.injectWebSocket(server);\n\t\tconst serverEndpoint = `http://127.0.0.1:${port}`;\n\n\t\tlogger().info({ msg: \"test serer listening\", port });\n\n\t\t// Cleanup\n\t\tconst cleanup = async () => {\n\t\t\t// Stop server\n\t\t\tawait new Promise((resolve) => server.close(() => resolve(undefined)));\n\n\t\t\t// Extra cleanup\n\t\t\tawait driverCleanup?.();\n\t\t};\n\n\t\treturn {\n\t\t\tendpoint: serverEndpoint,\n\t\t\tnamespace: \"default\",\n\t\t\trunnerName: \"default\",\n\t\t\tcleanup,\n\t\t};\n\t}\n}\n","import { getLogger } from \"@/common/log\";\n\nexport function logger() {\n\treturn getLogger(\"test-suite\");\n}\n","import { describe, expect, test } from \"vitest\";\nimport type { ActorError } from \"@/client/errors\";\nimport type { DriverTestConfig } from \"../mod\";\nimport { setupDriverTest } from \"../utils\";\n\nexport function runActionFeaturesTests(driverTestConfig: DriverTestConfig) {\n\tdescribe(\"Action Features\", () => {\n\t\t// TODO: These do not work with fake timers\n\t\tdescribe(\"Action Timeouts\", () => {\n\t\t\tconst usesFakeTimers = !driverTestConfig.useRealTimers;\n\n\t\t\ttest(\"should timeout actions that exceed the configured timeout\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// The quick action should complete successfully\n\t\t\t\tconst quickResult = await client.shortTimeoutActor\n\t\t\t\t\t.getOrCreate()\n\t\t\t\t\t.quickAction();\n\t\t\t\texpect(quickResult).toBe(\"quick response\");\n\n\t\t\t\t// The slow action should throw a timeout error\n\t\t\t\tawait expect(\n\t\t\t\t\tclient.shortTimeoutActor.getOrCreate().slowAction(),\n\t\t\t\t).rejects.toThrow(\"Action timed out\");\n\t\t\t});\n\n\t\t\ttest(\"should respect the default timeout\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// This action should complete within the default timeout\n\t\t\t\tconst result = await client.defaultTimeoutActor\n\t\t\t\t\t.getOrCreate()\n\t\t\t\t\t.normalAction();\n\t\t\t\texpect(result).toBe(\"normal response\");\n\t\t\t});\n\n\t\t\ttest(\"non-promise action results should not be affected by timeout\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Synchronous action should not be affected by timeout\n\t\t\t\tconst result = await client.syncTimeoutActor.getOrCreate().syncAction();\n\t\t\t\texpect(result).toBe(\"sync response\");\n\t\t\t});\n\n\t\t\ttest(\"should allow configuring different timeouts for different actors\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// The short timeout actor should fail\n\t\t\t\tawait expect(\n\t\t\t\t\tclient.shortTimeoutActor.getOrCreate().slowAction(),\n\t\t\t\t).rejects.toThrow(\"Action timed out\");\n\n\t\t\t\t// The longer timeout actor should succeed\n\t\t\t\tconst result = await client.longTimeoutActor\n\t\t\t\t\t.getOrCreate()\n\t\t\t\t\t.delayedAction();\n\t\t\t\texpect(result).toBe(\"delayed response\");\n\t\t\t});\n\t\t});\n\n\t\tdescribe(\"Action Sync & Async\", () => {\n\t\t\ttest(\"should support synchronous actions\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\tconst instance = client.syncActionActor.getOrCreate();\n\n\t\t\t\t// Test increment action\n\t\t\t\tlet result = await instance.increment(5);\n\t\t\t\texpect(result).toBe(5);\n\n\t\t\t\tresult = await instance.increment(3);\n\t\t\t\texpect(result).toBe(8);\n\n\t\t\t\t// Test getInfo action\n\t\t\t\tconst info = await instance.getInfo();\n\t\t\t\texpect(info.currentValue).toBe(8);\n\t\t\t\texpect(typeof info.timestamp).toBe(\"number\");\n\n\t\t\t\t// Test reset action (void return)\n\t\t\t\tawait instance.reset();\n\t\t\t\tresult = await instance.increment(0);\n\t\t\t\texpect(result).toBe(0);\n\t\t\t});\n\n\t\t\ttest(\"should support asynchronous actions\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\tconst instance = client.asyncActionActor.getOrCreate();\n\n\t\t\t\t// Test delayed increment\n\t\t\t\tconst result = await instance.delayedIncrement(5);\n\t\t\t\texpect(result).toBe(5);\n\n\t\t\t\t// Test fetch data\n\t\t\t\tconst data = await instance.fetchData(\"test-123\");\n\t\t\t\texpect(data.id).toBe(\"test-123\");\n\t\t\t\texpect(typeof data.timestamp).toBe(\"number\");\n\n\t\t\t\t// Test successful async operation\n\t\t\t\tconst success = await instance.asyncWithError(false);\n\t\t\t\texpect(success).toBe(\"Success\");\n\n\t\t\t\t// Test error in async operation\n\t\t\t\ttry {\n\t\t\t\t\tawait instance.asyncWithError(true);\n\t\t\t\t\texpect.fail(\"did not error\");\n\t\t\t\t} catch (error) {\n\t\t\t\t\texpect((error as ActorError).message).toBe(\"Intentional error\");\n\t\t\t\t}\n\t\t\t});\n\n\t\t\ttest(\"should handle promises returned from actions correctly\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\tconst instance = client.promiseActor.getOrCreate();\n\n\t\t\t\t// Test resolved promise\n\t\t\t\tconst resolvedValue = await instance.resolvedPromise();\n\t\t\t\texpect(resolvedValue).toBe(\"resolved value\");\n\n\t\t\t\t// Test delayed promise\n\t\t\t\tconst delayedValue = await instance.delayedPromise();\n\t\t\t\texpect(delayedValue).toBe(\"delayed value\");\n\n\t\t\t\t// Test rejected promise\n\t\t\t\tawait expect(instance.rejectedPromise()).rejects.toThrow(\n\t\t\t\t\t\"promised rejection\",\n\t\t\t\t);\n\n\t\t\t\t// Check state was updated by the delayed promise\n\t\t\t\tconst results = await instance.getResults();\n\t\t\t\texpect(results).toContain(\"delayed\");\n\t\t\t});\n\t\t});\n\t});\n}\n","import invariant from \"invariant\";\nimport { type TestContext, vi } from \"vitest\";\nimport { assertUnreachable } from \"@/actor/utils\";\nimport { type Client, createClient } from \"@/client/mod\";\nimport { RunConfigSchema } from \"@/driver-helpers/mod\";\nimport { createClientWithDriver } from \"@/mod\";\nimport type { registry } from \"../../fixtures/driver-test-suite/registry\";\nimport type { DriverTestConfig } from \"./mod\";\nimport { createTestInlineClientDriver } from \"./test-inline-client-driver\";\n\nexport const FAKE_TIME = new Date(\"2024-01-01T00:00:00.000Z\");\n\n// Must use `TestContext` since global hooks do not work when running concurrently\nexport async function setupDriverTest(\n\tc: TestContext,\n\tdriverTestConfig: DriverTestConfig,\n): Promise<{\n\tclient: Client<typeof registry>;\n\tendpoint: string;\n}> {\n\tif (!driverTestConfig.useRealTimers) {\n\t\tvi.useFakeTimers();\n\t\tvi.setSystemTime(FAKE_TIME);\n\t}\n\n\t// Build drivers\n\tconst { endpoint, namespace, runnerName, cleanup } =\n\t\tawait driverTestConfig.start();\n\tc.onTestFinished(cleanup);\n\n\tlet client: Client<typeof registry>;\n\tif (driverTestConfig.clientType === \"http\") {\n\t\t// Create client\n\t\tclient = createClient<typeof registry>({\n\t\t\tendpoint,\n\t\t\tnamespace,\n\t\t\trunnerName,\n\t\t\ttransport: driverTestConfig.transport,\n\t\t\tencoding: driverTestConfig.encoding,\n\t\t});\n\t} else if (driverTestConfig.clientType === \"inline\") {\n\t\t// Use inline client from driver\n\t\tconst transport = driverTestConfig.transport ?? \"websocket\";\n\t\tconst encoding = driverTestConfig.encoding ?? \"bare\";\n\t\tconst managerDriver = createTestInlineClientDriver(\n\t\t\tendpoint,\n\t\t\tencoding,\n\t\t\ttransport,\n\t\t);\n\t\tconst runConfig = RunConfigSchema.parse({\n\t\t\ttransport: transport,\n\t\t\tencoding: encoding,\n\t\t});\n\t\tclient = createClientWithDriver(managerDriver, runConfig);\n\t} else {\n\t\tassertUnreachable(driverTestConfig.clientType);\n\t}\n\n\t// Cleanup client\n\tif (!driverTestConfig.HACK_skipCleanupNet) {\n\t\tc.onTestFinished(async () => await client.dispose());\n\t}\n\n\treturn {\n\t\tclient,\n\t\tendpoint,\n\t};\n}\n\nexport async function waitFor(\n\tdriverTestConfig: DriverTestConfig,\n\tms: number,\n): Promise<void> {\n\tif (driverTestConfig.useRealTimers) {\n\t\treturn new Promise((resolve) => setTimeout(resolve, ms));\n\t} else {\n\t\tvi.advanceTimersByTime(ms);\n\t\treturn Promise.resolve();\n\t}\n}\n","import * as cbor from \"cbor-x\";\nimport type { Context as HonoContext } from \"hono\";\nimport invariant from \"invariant\";\nimport type { WebSocket } from \"ws\";\nimport type { Encoding } from \"@/actor/protocol/serde\";\nimport { assertUnreachable } from \"@/actor/utils\";\nimport { ActorError as ClientActorError } from \"@/client/errors\";\nimport type { Transport } from \"@/client/mod\";\nimport {\n\tHEADER_ACTOR_QUERY,\n\tHEADER_CONN_PARAMS,\n\tHEADER_ENCODING,\n\tWS_PROTOCOL_ACTOR,\n\tWS_PROTOCOL_CONN_PARAMS,\n\tWS_PROTOCOL_ENCODING,\n\tWS_PROTOCOL_PATH,\n\tWS_PROTOCOL_TARGET,\n\tWS_PROTOCOL_TRANSPORT,\n} from \"@/common/actor-router-consts\";\nimport type { UniversalEventSource } from \"@/common/eventsource-interface\";\nimport type { DeconstructedError } from \"@/common/utils\";\nimport { importWebSocket } from \"@/common/websocket\";\nimport {\n\ttype ActorOutput,\n\ttype CreateInput,\n\ttype GetForIdInput,\n\ttype GetOrCreateWithKeyInput,\n\ttype GetWithKeyInput,\n\tHEADER_ACTOR_ID,\n\ttype ManagerDisplayInformation,\n\ttype ManagerDriver,\n} from \"@/driver-helpers/mod\";\nimport type { ActorQuery } from \"@/manager/protocol/query\";\nimport type { UniversalWebSocket } from \"@/mod\";\nimport type * as protocol from \"@/schemas/client-protocol/mod\";\nimport { logger } from \"./log\";\n\nexport interface TestInlineDriverCallRequest {\n\tencoding: Encoding;\n\ttransport: Transport;\n\tmethod: string;\n\targs: unknown[];\n}\n\nexport type TestInlineDriverCallResponse<T> =\n\t| {\n\t\t\tok: T;\n\t }\n\t| {\n\t\t\terr: DeconstructedError;\n\t };\n\n/**\n * Creates a client driver used for testing the inline client driver. This will send a request to the HTTP server which will then internally call the internal client and return the response.\n */\nexport function createTestInlineClientDriver(\n\tendpoint: string,\n\tencoding: Encoding,\n\ttransport: Transport,\n): ManagerDriver {\n\treturn {\n\t\tgetForId(input: GetForIdInput): Promise<ActorOutput | undefined> {\n\t\t\treturn makeInlineRequest(endpoint, encoding, transport, \"getForId\", [\n\t\t\t\tinput,\n\t\t\t]);\n\t\t},\n\t\tgetWithKey(input: GetWithKeyInput): Promise<ActorOutput | undefined> {\n\t\t\treturn makeInlineRequest(endpoint, encoding, transport, \"getWithKey\", [\n\t\t\t\tinput,\n\t\t\t]);\n\t\t},\n\t\tgetOrCreateWithKey(input: GetOrCreateWithKeyInput): Promise<ActorOutput> {\n\t\t\treturn makeInlineRequest(\n\t\t\t\tendpoint,\n\t\t\t\tencoding,\n\t\t\t\ttransport,\n\t\t\t\t\"getOrCreateWithKey\",\n\t\t\t\t[input],\n\t\t\t);\n\t\t},\n\t\tcreateActor(input: CreateInput): Promise<ActorOutput> {\n\t\t\treturn makeInlineRequest(endpoint, encoding, transport, \"createActor\", [\n\t\t\t\tinput,\n\t\t\t]);\n\t\t},\n\t\tasync sendRequest(\n\t\t\tactorId: string,\n\t\t\tactorRequest: Request,\n\t\t): Promise<Response> {\n\t\t\t// Normalize path to match other drivers\n\t\t\tconst oldUrl = new URL(actorRequest.url);\n\t\t\tconst normalizedPath = oldUrl.pathname.startsWith(\"/\")\n\t\t\t\t? oldUrl.pathname.slice(1)\n\t\t\t\t: oldUrl.pathname;\n\t\t\tconst pathWithQuery = normalizedPath + oldUrl.search;\n\n\t\t\tlogger().debug({\n\t\t\t\tmsg: \"sending raw http request via test inline driver\",\n\t\t\t\tactorId,\n\t\t\t\tencoding,\n\t\t\t\tpath: pathWithQuery,\n\t\t\t});\n\n\t\t\t// Use the dedicated raw HTTP endpoint\n\t\t\tconst url = `${endpoint}/.test/inline-driver/send-request/${pathWithQuery}`;\n\n\t\t\tlogger().debug({ msg: \"rewriting http url\", from: oldUrl, to: url });\n\n\t\t\t// Merge headers with our metadata\n\t\t\tconst headers = new Headers(actorRequest.headers);\n\t\t\theaders.set(HEADER_ACTOR_ID, actorId);\n\n\t\t\t// Forward the request directly\n\t\t\tconst response = await fetch(\n\t\t\t\tnew Request(url, {\n\t\t\t\t\tmethod: actorRequest.method,\n\t\t\t\t\theaders,\n\t\t\t\t\tbody: actorRequest.body,\n\t\t\t\t\tsignal: actorRequest.signal,\n\t\t\t\t\tduplex: \"half\",\n\t\t\t\t} as RequestInit),\n\t\t\t);\n\n\t\t\t// Check if it's an error response from our handler\n\t\t\tif (\n\t\t\t\t!response.ok &&\n\t\t\t\tresponse.headers.get(\"content-type\")?.includes(\"application/json\")\n\t\t\t) {\n\t\t\t\ttry {\n\t\t\t\t\t// Clone the response to avoid consuming the body\n\t\t\t\t\tconst clonedResponse = response.clone();\n\t\t\t\t\tconst errorData = (await clonedResponse.json()) as any;\n\t\t\t\t\tif (errorData.error) {\n\t\t\t\t\t\t// Handle both error formats:\n\t\t\t\t\t\t// 1. { error: { code, message, metadata } } - structured format\n\t\t\t\t\t\t// 2. { error: \"message\" } - simple string format (from custom onFetch handlers)\n\t\t\t\t\t\tif (typeof errorData.error === \"object\") {\n\t\t\t\t\t\t\tthrow new ClientActorError(\n\t\t\t\t\t\t\t\terrorData.error.code,\n\t\t\t\t\t\t\t\terrorData.error.message,\n\t\t\t\t\t\t\t\terrorData.error.metadata,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// For simple string errors, just return the response as-is\n\t\t\t\t\t\t// This allows custom onFetch handlers to return their own error formats\n\t\t\t\t\t}\n\t\t\t\t} catch (e) {\n\t\t\t\t\t// If it's not our error format, just return the response as-is\n\t\t\t\t\tif (!(e instanceof ClientActorError)) {\n\t\t\t\t\t\treturn response;\n\t\t\t\t\t}\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn response;\n\t\t},\n\t\tasync openWebSocket(\n\t\t\tpath: string,\n\t\t\tactorId: string,\n\t\t\tencoding: Encoding,\n\t\t\tparams: unknown,\n\t\t\tconnId?: string,\n\t\t\tconnToken?: string,\n\t\t): Promise<UniversalWebSocket> {\n\t\t\tconst WebSocket = await importWebSocket();\n\n\t\t\t// Normalize path to match other drivers\n\t\t\tconst normalizedPath = path.startsWith(\"/\") ? path.slice(1) : path;\n\n\t\t\t// Create WebSocket connection to the test endpoint\n\t\t\tconst wsUrl = new URL(\n\t\t\t\t`${endpoint}/.test/inline-driver/connect-websocket/ws`,\n\t\t\t);\n\n\t\t\tlogger().debug({\n\t\t\t\tmsg: \"creating websocket connection via test inline driver\",\n\t\t\t\turl: wsUrl.toString(),\n\t\t\t});\n\n\t\t\t// Convert http/https to ws/wss\n\t\t\tconst wsProtocol = wsUrl.protocol === \"https:\" ? \"wss:\" : \"ws:\";\n\t\t\tconst finalWsUrl = `${wsProtocol}//${wsUrl.host}${wsUrl.pathname}`;\n\n\t\t\tlogger().debug({ msg: \"connecting to websocket\", url: finalWsUrl });\n\n\t\t\t// Build protocols for the connection\n\t\t\tconst protocols: string[] = [];\n\t\t\tprotocols.push(`${WS_PROTOCOL_TARGET}actor`);\n\t\t\tprotocols.push(`${WS_PROTOCOL_ACTOR}${actorId}`);\n\t\t\tprotocols.push(`${WS_PROTOCOL_ENCODING}${encoding}`);\n\t\t\tprotocols.push(`${WS_PROTOCOL_TRANSPORT}${transport}`);\n\t\t\tprotocols.push(\n\t\t\t\t`${WS_PROTOCOL_PATH}${encodeURIComponent(normalizedPath)}`,\n\t\t\t);\n\t\t\tif (params !== undefined) {\n\t\t\t\tprotocols.push(\n\t\t\t\t\t`${WS_PROTOCOL_CONN_PARAMS}${encodeURIComponent(JSON.stringify(params))}`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Create and return the WebSocket\n\t\t\t// Node & browser WebSocket types are incompatible\n\t\t\tconst ws = new WebSocket(finalWsUrl, protocols) as any;\n\n\t\t\treturn ws;\n\t\t},\n\t\tasync proxyRequest(\n\t\t\tc: HonoContext,\n\t\t\tactorRequest: Request,\n\t\t\tactorId: string,\n\t\t): Promise<Response> {\n\t\t\treturn await this.sendRequest(actorId, actorRequest);\n\t\t},\n\t\tproxyWebSocket(\n\t\t\t_c: HonoContext,\n\t\t\t_path: string,\n\t\t\t_actorId: string,\n\t\t\t_encoding: Encoding,\n\t\t\t_params: unknown,\n\t\t): Promise<Response> {\n\t\t\tthrow \"UNIMPLEMENTED\";\n\t\t\t// const upgradeWebSocket = this.#runConfig.getUpgradeWebSocket?.();\n\t\t\t// invariant(upgradeWebSocket, \"missing getUpgradeWebSocket\");\n\t\t\t//\n\t\t\t// const wsHandler = this.openWebSocket(path, actorId, encoding, connParams);\n\t\t\t// return upgradeWebSocket(() => wsHandler)(c, noopNext());\n\t\t},\n\t\tdisplayInformation(): ManagerDisplayInformation {\n\t\t\treturn { name: \"Test Inline\", properties: {} };\n\t\t},\n\t\t// TODO:\n\t\tgetOrCreateInspectorAccessToken: () => \"\",\n\n\t\t// action: async <Args extends Array<unknown> = unknown[], Response = unknown>(\n\t\t// \t_c: HonoContext | undefined,\n\t\t// \tactorQuery: ActorQuery,\n\t\t// \tencoding: Encoding,\n\t\t// \tparams: unknown,\n\t\t// \tname: string,\n\t\t// \targs: Args,\n\t\t// ): Promise<Response> => {\n\t\t// \treturn makeInlineRequest<Response>(\n\t\t// \t\tendpoint,\n\t\t// \t\tencoding,\n\t\t// \t\ttransport,\n\t\t// \t\t\"action\",\n\t\t// \t\t[undefined, actorQuery, encoding, params, name, args],\n\t\t// \t);\n\t\t// },\n\t\t//\n\t\t// resolveActorId: async (\n\t\t// \t_c: HonoContext | undefined,\n\t\t// \tactorQuery: ActorQuery,\n\t\t// \tencodingKind: Encoding,\n\t\t// \tparams: unknown,\n\t\t// ): Promise<string> => {\n\t\t// \treturn makeInlineRequest<string>(\n\t\t// \t\tendpoint,\n\t\t// \t\tencodingKind,\n\t\t// \t\ttransport,\n\t\t// \t\t\"resolveActorId\",\n\t\t// \t\t[undefined, actorQuery, encodingKind, params],\n\t\t// \t);\n\t\t// },\n\t\t//\n\t\t// connectWebSocket: async (\n\t\t// \t_c: HonoContext | undefined,\n\t\t// \tactorQuery: ActorQuery,\n\t\t// \tencodingKind: Encoding,\n\t\t// \tparams: unknown,\n\t\t// ): Promise<WebSocket> => {\n\t\t// \tconst WebSocket = await importWebSocket();\n\t\t//\n\t\t// \tlogger().debug({\n\t\t// \t\tmsg: \"creating websocket connection via test inline driver\",\n\t\t// \t\tactorQuery,\n\t\t// \t\tencodingKind,\n\t\t// \t});\n\t\t//\n\t\t// \t// Create WebSocket connection to the test endpoint\n\t\t// \tconst wsUrl = new URL(\n\t\t// \t\t`${endpoint}/registry/.test/inline-driver/connect-websocket`,\n\t\t// \t);\n\t\t// \twsUrl.searchParams.set(\"actorQuery\", JSON.stringify(actorQuery));\n\t\t// \tif (params !== undefined)\n\t\t// \t\twsUrl.searchParams.set(\"params\", JSON.stringify(params));\n\t\t// \twsUrl.searchParams.set(\"encodingKind\", encodingKind);\n\t\t//\n\t\t// \t// Convert http/https to ws/wss\n\t\t// \tconst wsProtocol = wsUrl.protocol === \"https:\" ? \"wss:\" : \"ws:\";\n\t\t// \tconst finalWsUrl = `${wsProtocol}//${wsUrl.host}${wsUrl.pathname}${wsUrl.search}`;\n\t\t//\n\t\t// \tlogger().debug({ msg: \"connecting to websocket\", url: finalWsUrl });\n\t\t//\n\t\t// \t// Create and return the WebSocket\n\t\t// \t// Node & browser WebSocket types are incompatible\n\t\t// \tconst ws = new WebSocket(finalWsUrl, [\n\t\t// \t\t// HACK: See packages/drivers/cloudflare-workers/src/websocket.ts\n\t\t// \t\t\"rivetkit\",\n\t\t// \t]) as any;\n\t\t//\n\t\t// \treturn ws;\n\t\t// },\n\t\t//\n\t\t// connectSse: async (\n\t\t// \t_c: HonoContext | undefined,\n\t\t// \tactorQuery: ActorQuery,\n\t\t// \tencodingKind: Encoding,\n\t\t// \tparams: unknown,\n\t\t// ): Promise<UniversalEventSource> => {\n\t\t// \tlogger().debug({\n\t\t// \t\tmsg: \"creating sse connection via test inline driver\",\n\t\t// \t\tactorQuery,\n\t\t// \t\tencodingKind,\n\t\t// \t\tparams,\n\t\t// \t});\n\t\t//\n\t\t// \t// Dynamically import EventSource if needed\n\t\t// \tconst EventSourceImport = await import(\"eventsource\");\n\t\t// \t// Handle both ES modules (default) and CommonJS export patterns\n\t\t// \tconst EventSourceConstructor =\n\t\t// \t\t(EventSourceImport as any).default || EventSourceImport;\n\t\t//\n\t\t// \t// Encode parameters for the URL\n\t\t// \tconst actorQueryParam = encodeURIComponent(JSON.stringify(actorQuery));\n\t\t// \tconst encodingParam = encodeURIComponent(encodingKind);\n\t\t// \tconst paramsParam = params\n\t\t// \t\t? encodeURIComponent(JSON.stringify(params))\n\t\t// \t\t: null;\n\t\t//\n\t\t// \t// Create SSE connection URL\n\t\t// \tconst sseUrl = new URL(\n\t\t// \t\t`${endpoint}/registry/.test/inline-driver/connect-sse`,\n\t\t// \t);\n\t\t// \tsseUrl.searchParams.set(\"actorQueryRaw\", actorQueryParam);\n\t\t// \tsseUrl.searchParams.set(\"encodingKind\", encodingParam);\n\t\t// \tif (paramsParam) {\n\t\t// \t\tsseUrl.searchParams.set(\"params\", paramsParam);\n\t\t// \t}\n\t\t//\n\t\t// \tlogger().debug({ msg: \"connecting to sse\", url: sseUrl.toString() });\n\t\t//\n\t\t// \t// Create and return the EventSource\n\t\t// \tconst eventSource = new EventSourceConstructor(sseUrl.toString());\n\t\t//\n\t\t// \t// Wait for the connection to be established before returning\n\t\t// \tawait new Promise<void>((resolve, reject) => {\n\t\t// \t\teventSource.onopen = () => {\n\t\t// \t\t\tlogger().debug({ msg: \"sse connection established\" });\n\t\t// \t\t\tresolve();\n\t\t// \t\t};\n\t\t//\n\t\t// \t\teventSource.onerror = (event: Event) => {\n\t\t// \t\t\tlogger().error({ msg: \"sse connection failed\", event });\n\t\t// \t\t\treject(new Error(\"Failed to establish SSE connection\"));\n\t\t// \t\t};\n\t\t//\n\t\t// \t\t// Set a timeout in case the connection never establishes\n\t\t// \t\tsetTimeout(() => {\n\t\t// \t\t\tif (eventSource.readyState !== EventSourceConstructor.OPEN) {\n\t\t// \t\t\t\treject(new Error(\"SSE connection timed out\"));\n\t\t// \t\t\t}\n\t\t// \t\t}, 10000); // 10 second timeout\n\t\t// \t});\n\t\t//\n\t\t// \treturn eventSource as UniversalEventSource;\n\t\t// },\n\t\t//\n\t\t// sendHttpMessage: async (\n\t\t// \t_c: HonoContext | undefined,\n\t\t// \tactorId: string,\n\t\t// \tencoding: Encoding,\n\t\t// \tconnectionId: string,\n\t\t// \tconnectionToken: string,\n\t\t// \tmessage: protocol.ToServer,\n\t\t// ): Promise<void> => {\n\t\t// \tlogger().debug({\n\t\t// \t\tmsg: \"sending http message via test inline driver\",\n\t\t// \t\tactorId,\n\t\t// \t\tencoding,\n\t\t// \t\tconnectionId,\n\t\t// \t\ttransport,\n\t\t// \t});\n\t\t//\n\t\t// \tconst result = await fetch(\n\t\t// \t\t`${endpoint}/registry/.test/inline-driver/call`,\n\t\t// \t\t{\n\t\t// \t\t\tmethod: \"POST\",\n\t\t// \t\t\theaders: {\n\t\t// \t\t\t\t\"Content-Type\": \"application/json\",\n\t\t// \t\t\t},\n\t\t// \t\t\tbody: JSON.stringify({\n\t\t// \t\t\t\tencoding,\n\t\t// \t\t\t\ttransport,\n\t\t// \t\t\t\tmethod: \"sendHttpMessage\",\n\t\t// \t\t\t\targs: [\n\t\t// \t\t\t\t\tundefined,\n\t\t// \t\t\t\t\tactorId,\n\t\t// \t\t\t\t\tencoding,\n\t\t// \t\t\t\t\tconnectionId,\n\t\t// \t\t\t\t\tconnectionToken,\n\t\t// \t\t\t\t\tmessage,\n\t\t// \t\t\t\t],\n\t\t// \t\t\t} satisfies TestInlineDriverCallRequest),\n\t\t// \t\t},\n\t\t// \t);\n\t\t//\n\t\t// \tif (!result.ok) {\n\t\t// \t\tthrow new Error(`Failed to send HTTP message: ${result.statusText}`);\n\t\t// \t}\n\t\t//\n\t\t// \t// Discard response\n\t\t// \tawait result.body?.cancel();\n\t\t// },\n\t\t//\n\t\t// rawHttpRequest: async (\n\t\t// \t_c: HonoContext | undefined,\n\t\t// \tactorQuery: ActorQuery,\n\t\t// \tencoding: Encoding,\n\t\t// \tparams: unknown,\n\t\t// \tpath: string,\n\t\t// \tinit: RequestInit,\n\t\t// ): Promise<Response> => {\n\t\t// \t// Normalize path to match other drivers\n\t\t// \tconst normalizedPath = path.startsWith(\"/\") ? path.slice(1) : path;\n\t\t//\n\t\t// \tlogger().debug({\n\t\t// \t\tmsg: \"sending raw http request via test inline driver\",\n\t\t// \t\tactorQuery,\n\t\t// \t\tencoding,\n\t\t// \t\tpath: normalizedPath,\n\t\t// \t});\n\t\t//\n\t\t// \t// Use the dedicated raw HTTP endpoint\n\t\t// \tconst url = `${endpoint}/registry/.test/inline-driver/raw-http/${normalizedPath}`;\n\t\t//\n\t\t// \tlogger().debug({ msg: \"rewriting http url\", from: path, to: url });\n\t\t//\n\t\t// \t// Merge headers with our metadata\n\t\t// \tconst headers = new Headers(init.headers);\n\t\t// \theaders.set(HEADER_ACTOR_QUERY, JSON.stringify(actorQuery));\n\t\t// \theaders.set(HEADER_ENCODING, encoding);\n\t\t// \tif (params !== undefined) {\n\t\t// \t\theaders.set(HEADER_CONN_PARAMS, JSON.stringify(params));\n\t\t// \t}\n\t\t//\n\t\t// \t// Forward the request directly\n\t\t// \tconst response = await fetch(url, {\n\t\t// \t\t...init,\n\t\t// \t\theaders,\n\t\t// \t});\n\t\t//\n\t\t// \t// Check if it's an error response from our handler\n\t\t// \tif (\n\t\t// \t\t!response.ok &&\n\t\t// \t\tresponse.headers.get(\"content-type\")?.includes(\"application/json\")\n\t\t// \t) {\n\t\t// \t\ttry {\n\t\t// \t\t\t// Clone the response to avoid consuming the body\n\t\t// \t\t\tconst clonedResponse = response.clone();\n\t\t// \t\t\tconst errorData = (await clonedResponse.json()) as any;\n\t\t// \t\t\tif (errorData.error) {\n\t\t// \t\t\t\t// Handle both error formats:\n\t\t// \t\t\t\t// 1. { error: { code, message, metadata } } - structured format\n\t\t// \t\t\t\t// 2. { error: \"message\" } - simple string format (from custom onFetch handlers)\n\t\t// \t\t\t\tif (typeof errorData.error === \"object\") {\n\t\t// \t\t\t\t\tthrow new ClientActorError(\n\t\t// \t\t\t\t\t\terrorData.error.code,\n\t\t// \t\t\t\t\t\terrorData.error.message,\n\t\t// \t\t\t\t\t\terrorData.error.metadata,\n\t\t// \t\t\t\t\t);\n\t\t// \t\t\t\t}\n\t\t// \t\t\t\t// For simple string errors, just return the response as-is\n\t\t// \t\t\t\t// This allows custom onFetch handlers to return their own error formats\n\t\t// \t\t\t}\n\t\t// \t\t} catch (e) {\n\t\t// \t\t\t// If it's not our error format, just return the response as-is\n\t\t// \t\t\tif (!(e instanceof ClientActorError)) {\n\t\t// \t\t\t\treturn response;\n\t\t// \t\t\t}\n\t\t// \t\t\tthrow e;\n\t\t// \t\t}\n\t\t// \t}\n\t\t//\n\t\t// \treturn response;\n\t\t// },\n\t\t//\n\t\t// rawWebSocket: async (\n\t\t// \t_c: HonoContext | undefined,\n\t\t// \tactorQuery: ActorQuery,\n\t\t// \tencoding: Encoding,\n\t\t// \tparams: unknown,\n\t\t// \tpath: string,\n\t\t// \tprotocols: string | string[] | undefined,\n\t\t// ): Promise<WebSocket> => {\n\t\t// \tlogger().debug({ msg: \"test inline driver rawWebSocket called\" });\n\t\t// \tconst WebSocket = await importWebSocket();\n\t\t//\n\t\t// \t// Normalize path to match other drivers\n\t\t// \tconst normalizedPath = path.startsWith(\"/\") ? path.slice(1) : path;\n\t\t//\n\t\t// \tlogger().debug({\n\t\t// \t\tmsg: \"creating raw websocket connection via test inline driver\",\n\t\t// \t\tactorQuery,\n\t\t// \t\tencoding,\n\t\t// \t\tpath: normalizedPath,\n\t\t// \t\tprotocols,\n\t\t// \t});\n\t\t//\n\t\t// \t// Create WebSocket connection to the test endpoint\n\t\t// \tconst wsUrl = new URL(\n\t\t// \t\t`${endpoint}/registry/.test/inline-driver/raw-websocket`,\n\t\t// \t);\n\t\t// \twsUrl.searchParams.set(\"actorQuery\", JSON.stringify(actorQuery));\n\t\t// \tif (params !== undefined)\n\t\t// \t\twsUrl.searchParams.set(\"params\", JSON.stringify(params));\n\t\t// \twsUrl.searchParams.set(\"encodingKind\", encoding);\n\t\t// \twsUrl.searchParams.set(\"path\", normalizedPath);\n\t\t// \tif (protocols !== undefined)\n\t\t// \t\twsUrl.searchParams.set(\"protocols\", JSON.stringify(protocols));\n\t\t//\n\t\t// \t// Convert http/https to ws/wss\n\t\t// \tconst wsProtocol = wsUrl.protocol === \"https:\" ? \"wss:\" : \"ws:\";\n\t\t// \tconst finalWsUrl = `${wsProtocol}//${wsUrl.host}${wsUrl.pathname}${wsUrl.search}`;\n\t\t//\n\t\t// \tlogger().debug({ msg: \"connecting to raw websocket\", url: finalWsUrl });\n\t\t//\n\t\t// \tlogger().debug({\n\t\t// \t\tmsg: \"rewriting websocket url\",\n\t\t// \t\tfrom: path,\n\t\t// \t\tto: finalWsUrl,\n\t\t// \t});\n\t\t//\n\t\t// \t// Create and return the WebSocket\n\t\t// \t// Node & browser WebSocket types are incompatible\n\t\t// \tconst ws = new WebSocket(finalWsUrl, [\n\t\t// \t\t// HACK: See packages/drivers/cloudflare-workers/src/websocket.ts\n\t\t// \t\t\"rivetkit\",\n\t\t// \t]) as any;\n\t\t//\n\t\t// \tlogger().debug({\n\t\t// \t\tmsg: \"test inline driver created websocket\",\n\t\t// \t\treadyState: ws.readyState,\n\t\t// \t\turl: ws.url,\n\t\t// \t});\n\t\t//\n\t\t// \treturn ws;\n\t\t// },\n\t} satisfies ManagerDriver;\n}\n\nasync function makeInlineRequest<T>(\n\tendpoint: string,\n\tencoding: Encoding,\n\ttransport: Transport,\n\tmethod: string,\n\targs: unknown[],\n): Promise<T> {\n\tlogger().debug({\n\t\tmsg: \"sending inline request\",\n\t\tencoding,\n\t\ttransport,\n\t\tmethod,\n\t\targs,\n\t});\n\n\t// Call driver\n\tconst response = await fetch(`${endpoint}/.test/inline-driver/call`, {\n\t\tmethod: \"POST\",\n\t\theaders: {\n\t\t\t\"Content-Type\": \"application/json\",\n\t\t},\n\t\tbody: cbor.encode({\n\t\t\tencoding,\n\t\t\ttransport,\n\t\t\tmethod,\n\t\t\targs,\n\t\t} satisfies TestInlineDriverCallRequest),\n\t\tduplex: \"half\",\n\t} as RequestInit);\n\n\tif (!response.ok) {\n\t\tthrow new Error(`Failed to call inline ${method}: ${response.statusText}`);\n\t}\n\n\t// Parse response\n\tconst buffer = await response.arrayBuffer();\n\tconst callResponse: TestInlineDriverCallResponse<T> = cbor.decode(\n\t\tnew Uint8Array(buffer),\n\t);\n\n\t// Throw or OK\n\tif (\"ok\" in callResponse) {\n\t\treturn callResponse.ok;\n\t} else if (\"err\" in callResponse) {\n\t\tthrow new ClientActorError(\n\t\t\tcallResponse.err.group,\n\t\t\tcallResponse.err.code,\n\t\t\tcallResponse.err.message,\n\t\t\tcallResponse.err.metadata,\n\t\t);\n\t} else {\n\t\tassertUnreachable(callResponse);\n\t}\n}\n","import { describe, expect, test, vi } from \"vitest\";\nimport { SSE_PING_INTERVAL } from \"@/actor/router-endpoints\";\nimport type { DriverTestConfig } from \"../mod\";\nimport { FAKE_TIME, setupDriverTest, waitFor } from \"../utils\";\n\nexport function runActorConnTests(driverTestConfig: DriverTestConfig) {\n\tdescribe(\"Actor Connection Tests\", () => {\n\t\tdescribe(\"Connection Methods\", () => {\n\t\t\ttest(\"should connect using .get().connect()\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create actor\n\t\t\t\tawait client.counter.create([\"test-get\"]);\n\n\t\t\t\t// Get a handle and connect\n\t\t\t\tconst handle = client.counter.get([\"test-get\"]);\n\t\t\t\tconst connection = handle.connect();\n\n\t\t\t\t// Verify connection by performing an action\n\t\t\t\tconst count = await connection.increment(5);\n\t\t\t\texpect(count).toBe(5);\n\n\t\t\t\t// Clean up\n\t\t\t\tawait connection.dispose();\n\t\t\t});\n\n\t\t\ttest(\"should connect using .getForId().connect()\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create a actor first to get its ID\n\t\t\t\tconst handle = client.counter.getOrCreate([\"test-get-for-id\"]);\n\t\t\t\tawait handle.increment(3);\n\t\t\t\tconst actorId = await handle.resolve();\n\n\t\t\t\t// Get a new handle using the actor ID and connect\n\t\t\t\tconst idHandle = client.counter.getForId(actorId);\n\t\t\t\tconst connection = idHandle.connect();\n\n\t\t\t\t// Verify connection works and state is preserved\n\t\t\t\tconst count = await connection.getCount();\n\t\t\t\texpect(count).toBe(3);\n\n\t\t\t\t// Clean up\n\t\t\t\tawait connection.dispose();\n\t\t\t});\n\n\t\t\ttest(\"should connect using .getOrCreate().connect()\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Get or create actor and connect\n\t\t\t\tconst handle = client.counter.getOrCreate([\"test-get-or-create\"]);\n\t\t\t\tconst connection = handle.connect();\n\n\t\t\t\t// Verify connection works\n\t\t\t\tconst count = await connection.increment(7);\n\t\t\t\texpect(count).toBe(7);\n\n\t\t\t\t// Clean up\n\t\t\t\tawait connection.dispose();\n\t\t\t});\n\n\t\t\ttest(\"should connect using (await create()).connect()\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create actor and connect\n\t\t\t\tconst handle = await client.counter.create([\"test-create\"]);\n\t\t\t\tconst connection = handle.connect();\n\n\t\t\t\t// Verify connection works\n\t\t\t\tconst count = await connection.increment(9);\n\t\t\t\texpect(count).toBe(9);\n\n\t\t\t\t// Clean up\n\t\t\t\tawait connection.dispose();\n\t\t\t});\n\t\t});\n\n\t\tdescribe(\"Event Communication\", () => {\n\t\t\ttest(\"should mix RPC calls and WebSocket events\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create actor\n\t\t\t\tconst handle = client.counter.getOrCreate([\"test-mixed-rpc-ws\"]);\n\t\t\t\tconst connection = handle.connect();\n\n\t\t\t\t// Set up event listener\n\t\t\t\tconst receivedEvents: number[] = [];\n\t\t\t\tconnection.on(\"newCount\", (count: number) => {\n\t\t\t\t\treceivedEvents.push(count);\n\t\t\t\t});\n\n\t\t\t\t// TODO: There is a race condition with opening subscription and sending events on SSE, so we need to wait for a successful round trip on the event\n\t\t\t\tawait vi.waitFor(async () => {\n\t\t\t\t\t// Send one RPC call over the connection to ensure it's open\n\t\t\t\t\tawait connection.setCount(1);\n\t\t\t\t\texpect(receivedEvents).includes(1);\n\t\t\t\t});\n\n\t\t\t\t// Now use stateless RPC calls through the handle (no connection)\n\t\t\t\t// These should still trigger events that the connection receives\n\t\t\t\tawait handle.setCount(2);\n\t\t\t\tawait handle.setCount(3);\n\n\t\t\t\t// Wait for all events to be received\n\t\t\t\tawait vi.waitFor(() => {\n\t\t\t\t\texpect(receivedEvents).includes(2);\n\t\t\t\t\texpect(receivedEvents).includes(3);\n\t\t\t\t});\n\n\t\t\t\t// Clean up\n\t\t\t\tawait connection.dispose();\n\t\t\t});\n\n\t\t\ttest(\"should receive events via broadcast\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create actor and connect\n\t\t\t\tconst handle = client.counter.getOrCreate([\"test-broadcast\"]);\n\t\t\t\tconst connection = handle.connect();\n\n\t\t\t\t// Set up event listener\n\t\t\t\tconst receivedEvents: number[] = [];\n\t\t\t\tconnection.on(\"newCount\", (count: number) => {\n\t\t\t\t\treceivedEvents.push(count);\n\t\t\t\t});\n\n\t\t\t\t// HACK: Race condition between subscribing & sending events in SSE\n\t\t\t\t// Verify events were received\n\t\t\t\tawait vi.waitFor(\n\t\t\t\t\tasync () => {\n\t\t\t\t\t\tawait connection.setCount(5);\n\t\t\t\t\t\tawait connection.setCount(8);\n\t\t\t\t\t\texpect(receivedEvents).toContain(5);\n\t\t\t\t\t\texpect(receivedEvents).toContain(8);\n\t\t\t\t\t},\n\t\t\t\t\t{ timeout: 10_000 },\n\t\t\t\t);\n\n\t\t\t\t// Clean up\n\t\t\t\tawait connection.dispose();\n\t\t\t});\n\n\t\t\ttest(\"should handle one-time events with once()\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create actor and connect\n\t\t\t\tconst handle = client.counter.getOrCreate([\"test-once\"]);\n\t\t\t\tconst connection = handle.connect();\n\n\t\t\t\t// Set up one-time event listener\n\t\t\t\tconst receivedEvents: number[] = [];\n\t\t\t\tconnection.once(\"newCount\", (count: number) => {\n\t\t\t\t\treceivedEvents.push(count);\n\t\t\t\t});\n\n\t\t\t\t// Trigger multiple events, but should only receive the first one\n\t\t\t\tawait connection.increment(5);\n\t\t\t\tawait connection.increment(3);\n\n\t\t\t\t// Verify only the first event was received\n\t\t\t\tawait vi.waitFor(() => {\n\t\t\t\t\texpect(receivedEvents).toEqual([5]);\n\t\t\t\t\texpect(receivedEvents).not.toContain(8);\n\t\t\t\t});\n\n\t\t\t\t// Clean up\n\t\t\t\tawait connection.dispose();\n\t\t\t});\n\n\t\t\ttest(\"should unsubscribe from events\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create actor and connect\n\t\t\t\tconst handle = client.counter.getOrCreate([\"test-unsubscribe\"]);\n\t\t\t\tconst connection = handle.connect();\n\n\t\t\t\t// Set up event listener with unsubscribe\n\t\t\t\tconst receivedEvents: number[] = [];\n\t\t\t\tconst unsubscribe = connection.on(\"newCount\", (count: number) => {\n\t\t\t\t\treceivedEvents.push(count);\n\t\t\t\t});\n\n\t\t\t\t// TODO: SSE has race condition with subscriptions & publishing messages\n\t\t\t\t// Trigger first event\n\t\t\t\tawait vi.waitFor(async () => {\n\t\t\t\t\tawait connection.setCount(5);\n\t\t\t\t\texpect(receivedEvents).toEqual([5]);\n\t\t\t\t});\n\n\t\t\t\t// Unsubscribe\n\t\t\t\tunsubscribe();\n\n\t\t\t\t// Trigger second event, should not be received\n\t\t\t\tawait connection.setCount(8);\n\n\t\t\t\t// Verify only the first event was received\n\t\t\t\texpect(receivedEvents).not.toContain(8);\n\n\t\t\t\t// Clean up\n\t\t\t\tawait connection.dispose();\n\t\t\t});\n\t\t});\n\n\t\tdescribe(\"Connection Parameters\", () => {\n\t\t\ttest(\"should pass connection parameters\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create two connections with different params\n\t\t\t\tconst handle1 = client.counterWithParams.getOrCreate([\"test-params\"], {\n\t\t\t\t\tparams: { name: \"user1\" },\n\t\t\t\t});\n\t\t\t\tconst handle2 = client.counterWithParams.getOrCreate([\"test-params\"], {\n\t\t\t\t\tparams: { name: \"user2\" },\n\t\t\t\t});\n\n\t\t\t\tconst conn1 = handle1.connect();\n\t\t\t\tconst conn2 = handle2.connect();\n\n\t\t\t\t// HACK: Call an action to wait for the connections to be established\n\t\t\t\tawait conn1.getInitializers();\n\t\t\t\tawait conn2.getInitializers();\n\n\t\t\t\t// Get initializers to verify connection params were used\n\t\t\t\tconst initializers = await conn1.getInitializers();\n\n\t\t\t\t// Verify both connection names were recorded\n\t\t\t\texpect(initializers).toContain(\"user1\");\n\t\t\t\texpect(initializers).toContain(\"user2\");\n\n\t\t\t\t// Clean up\n\t\t\t\tawait conn1.dispose();\n\t\t\t\tawait conn2.dispose();\n\t\t\t});\n\t\t});\n\n\t\tdescribe(\"Lifecycle Hooks\", () => {\n\t\t\ttest.skipIf(\n\t\t\t\tdriverTestConfig.transport === \"sse\" &&\n\t\t\t\t\tdriverTestConfig.clientType === \"inline\",\n\t\t\t)(\"should trigger lifecycle hooks\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create and connect\n\t\t\t\tconst connHandle = client.counterWithLifecycle.getOrCreate(\n\t\t\t\t\t[\"test-lifecycle\"],\n\t\t\t\t\t{\n\t\t\t\t\t\tparams: { trackLifecycle: true },\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\tconst connection = connHandle.connect();\n\n\t\t\t\t// Verify lifecycle events were triggered\n\t\t\t\tconst events = await connection.getEvents();\n\t\t\t\texpect(events).toEqual([\"onStart\", \"onBeforeConnect\", \"onConnect\"]);\n\n\t\t\t\t// Disconnect should trigger onDisconnect\n\t\t\t\tawait connection.dispose();\n\n\t\t\t\tawait vi.waitFor(\n\t\t\t\t\tasync () => {\n\t\t\t\t\t\t// Reconnect to check if onDisconnect was called\n\t\t\t\t\t\tconst handle = client.counterWithLifecycle.getOrCreate([\n\t\t\t\t\t\t\t\"test-lifecycle\",\n\t\t\t\t\t\t]);\n\t\t\t\t\t\tconst finalEvents = await handle.getEvents();\n\t\t\t\t\t\texpect(finalEvents).toBeOneOf([\n\t\t\t\t\t\t\t// Still active\n\t\t\t\t\t\t\t[\"onStart\", \"onBeforeConnect\", \"onConnect\", \"onDisconnect\"],\n\t\t\t\t\t\t\t// Went to sleep and woke back up\n\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\t\"onStart\",\n\t\t\t\t\t\t\t\t\"onBeforeConnect\",\n\t\t\t\t\t\t\t\t\"onConnect\",\n\t\t\t\t\t\t\t\t\"onDisconnect\",\n\t\t\t\t\t\t\t\t\"onStart\",\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\t// NOTE: High timeout required for Cloudflare Workers\n\t\t\t\t\t{\n\t\t\t\t\t\ttimeout: 10_000,\n\t\t\t\t\t\tinterval: 100,\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t});\n\t\t});\n\t});\n}\n","import { describe, expect, test, vi } from \"vitest\";\nimport type { DriverTestConfig } from \"../mod\";\nimport { setupDriverTest } from \"../utils\";\n\nexport function runActorConnStateTests(driverTestConfig: DriverTestConfig) {\n\tdescribe(\"Actor Connection State Tests\", () => {\n\t\tdescribe(\"Connection State Initialization\", () => {\n\t\t\ttest(\"should retrieve connection state\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Connect to the actor\n\t\t\t\tconst connection = client.connStateActor.getOrCreate().connect();\n\n\t\t\t\t// Get the connection state\n\t\t\t\tconst connState = await connection.getConnectionState();\n\n\t\t\t\t// Verify the connection state structure\n\t\t\t\texpect(connState.id).toBeDefined();\n\t\t\t\texpect(connState.username).toBeDefined();\n\t\t\t\texpect(connState.role).toBeDefined();\n\t\t\t\texpect(connState.counter).toBeDefined();\n\t\t\t\texpect(connState.createdAt).toBeDefined();\n\n\t\t\t\t// Clean up\n\t\t\t\tawait connection.dispose();\n\t\t\t});\n\n\t\t\ttest(\"should initialize connection state with custom parameters\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Connect with custom parameters\n\t\t\t\tconst connection = client.connStateActor\n\t\t\t\t\t.getOrCreate([], {\n\t\t\t\t\t\tparams: {\n\t\t\t\t\t\t\tusername: \"testuser\",\n\t\t\t\t\t\t\trole: \"admin\",\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\t\t\t\t\t.connect();\n\n\t\t\t\t// Get the connection state\n\t\t\t\tconst connState = await connection.getConnectionState();\n\n\t\t\t\t// Verify the connection state was initialized with custom values\n\t\t\t\texpect(connState.username).toBe(\"testuser\");\n\t\t\t\texpect(connState.role).toBe(\"admin\");\n\n\t\t\t\t// Clean up\n\t\t\t\tawait connection.dispose();\n\t\t\t});\n\t\t});\n\n\t\tdescribe(\"Connection State Management\", () => {\n\t\t\ttest(\"should maintain unique state for each connection\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create multiple connections\n\t\t\t\tconst conn1 = client.connStateActor\n\t\t\t\t\t.getOrCreate([], {\n\t\t\t\t\t\tparams: { username: \"user1\" },\n\t\t\t\t\t})\n\t\t\t\t\t.connect();\n\n\t\t\t\tconst conn2 = client.connStateActor\n\t\t\t\t\t.getOrCreate([], {\n\t\t\t\t\t\tparams: { username: \"user2\" },\n\t\t\t\t\t})\n\t\t\t\t\t.connect();\n\n\t\t\t\t// Update connection state for each connection\n\t\t\t\tawait conn1.incrementConnCounter(5);\n\t\t\t\tawait conn2.incrementConnCounter(10);\n\n\t\t\t\t// Get state for each connection\n\t\t\t\tconst state1 = await conn1.getConnectionState();\n\t\t\t\tconst state2 = await conn2.getConnectionState();\n\n\t\t\t\t// Verify states are separate\n\t\t\t\texpect(state1.counter).toBe(5);\n\t\t\t\texpect(state2.counter).toBe(10);\n\t\t\t\texpect(state1.username).toBe(\"user1\");\n\t\t\t\texpect(state2.username).toBe(\"user2\");\n\n\t\t\t\t// Clean up\n\t\t\t\tawait conn1.dispose();\n\t\t\t\tawait conn2.dispose();\n\t\t\t});\n\n\t\t\ttest(\"should track connections in shared state\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create two connections\n\t\t\t\tconst handle = client.connStateActor.getOrCreate();\n\t\t\t\tconst conn1 = handle.connect();\n\t\t\t\tconst conn2 = handle.connect();\n\n\t\t\t\t// HACK: Wait for both connections to successfully connect by waiting for a round trip RPC\n\t\t\t\tawait conn1.getConnectionState();\n\t\t\t\tawait conn2.getConnectionState();\n\n\t\t\t\t// Get state1 for reference\n\t\t\t\tconst state1 = await conn1.getConnectionState();\n\n\t\t\t\t// Get connection IDs tracked by the actor\n\t\t\t\tconst connectionIds = await conn1.getConnectionIds();\n\n\t\t\t\t// There should be at least 2 connections tracked\n\t\t\t\texpect(connectionIds.length).toBeGreaterThanOrEqual(2);\n\n\t\t\t\t// Should include the ID of the first connection\n\t\t\t\texpect(connectionIds).toContain(state1.id);\n\n\t\t\t\t// Clean up\n\t\t\t\tawait conn1.dispose();\n\t\t\t\tawait conn2.dispose();\n\t\t\t});\n\n\t\t\ttest(\"should identify different connections in the same actor\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create two connections to the same actor\n\t\t\t\tconst handle = client.connStateActor.getOrCreate();\n\t\t\t\tconst conn1 = handle.connect();\n\t\t\t\tconst conn2 = handle.connect();\n\n\t\t\t\t// HACK: Wait for both connections to successfully connect by waiting for a round trip RPC\n\t\t\t\tawait conn1.getConnectionState();\n\t\t\t\tawait conn2.getConnectionState();\n\n\t\t\t\t// Get all connection states\n\t\t\t\tconst allStates = await conn1.getAllConnectionStates();\n\n\t\t\t\t// Should have at least 2 states\n\t\t\t\texpect(allStates.length).toBeGreaterThanOrEqual(2);\n\n\t\t\t\t// IDs should be unique\n\t\t\t\tconst ids = allStates.map((state) => state.id);\n\t\t\t\tconst uniqueIds = [...new Set(ids)];\n\t\t\t\texpect(uniqueIds.length).toBe(ids.length);\n\n\t\t\t\t// Clean up\n\t\t\t\tawait conn1.dispose();\n\t\t\t\tawait conn2.dispose();\n\t\t\t});\n\t\t});\n\n\t\tdescribe(\"Connection Lifecycle\", () => {\n\t\t\ttest.skipIf(\n\t\t\t\tdriverTestConfig.transport === \"sse\" &&\n\t\t\t\t\tdriverTestConfig.clientType === \"inline\",\n\t\t\t)(\"should track connection and disconnection events\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\tconst debugHandle = client.connStateActor.getOrCreate(undefined, {\n\t\t\t\t\tparams: { noCount: true },\n\t\t\t\t});\n\n\t\t\t\t// Create a connection\n\t\t\t\tconst conn = client.connStateActor.getOrCreate().connect();\n\n\t\t\t\t// Get the connection state\n\t\t\t\tconst connState = await conn.getConnectionState();\n\n\t\t\t\t// Verify the connection is tracked\n\t\t\t\tawait vi.waitFor(async () => {\n\t\t\t\t\tconst connectionIds = await debugHandle.getConnectionIds();\n\t\t\t\t\texpect(connectionIds).toContain(connState.id);\n\t\t\t\t});\n\n\t\t\t\t// Initial disconnection count\n\t\t\t\tawait vi.waitFor(async () => {\n\t\t\t\t\tconst disconnects = await debugHandle.getDisconnectionCount();\n\t\t\t\t\texpect(disconnects).toBe(0);\n\t\t\t\t});\n\n\t\t\t\t// Dispose the connection\n\t\t\t\tawait conn.dispose();\n\n\t\t\t\t// Validate conn count\n\t\t\t\tawait vi.waitFor(\n\t\t\t\t\tasync () => {\n\t\t\t\t\t\tconsole.log(\"disconnects before\");\n\t\t\t\t\t\tconst disconnects = await debugHandle.getDisconnectionCount();\n\t\t\t\t\t\tconsole.log(\"disconnects\", disconnects);\n\t\t\t\t\t\texpect(disconnects).toBe(1);\n\t\t\t\t\t},\n\t\t\t\t\t// SSE takes a long time to disconnect on CF Workers\n\t\t\t\t\t{\n\t\t\t\t\t\ttimeout: 10_000,\n\t\t\t\t\t\tinterval: 100,\n\t\t\t\t\t},\n\t\t\t\t);\n\n\t\t\t\t// Create a new connection to check the disconnection count\n\t\t\t\tconst newConn = client.connStateActor.getOrCreate().connect();\n\n\t\t\t\t// Verify the connection is tracked\n\t\t\t\tawait vi.waitFor(async () => {\n\t\t\t\t\tconst connectionIds = await debugHandle.getConnectionIds();\n\t\t\t\t\tconsole.log(\"conn ids\", connectionIds);\n\t\t\t\t\texpect(connectionIds.length).toBe(1);\n\t\t\t\t});\n\n\t\t\t\t// Clean up\n\t\t\t\tawait newConn.dispose();\n\n\t\t\t\t// Verify disconnection was tracked\n\t\t\t\tawait vi.waitFor(\n\t\t\t\t\tasync () => {\n\t\t\t\t\t\tconsole.log(\"A\");\n\t\t\t\t\t\tconst disconnects = await debugHandle.getDisconnectionCount();\n\t\t\t\t\t\tconsole.log(`B ${disconnects}`);\n\t\t\t\t\t\texpect(disconnects).toBe(2);\n\t\t\t\t\t},\n\t\t\t\t\t// SSE takes a long time to disconnect on CF Workers\n\t\t\t\t\t{\n\t\t\t\t\t\ttimeout: 10_000,\n\t\t\t\t\t\tinterval: 100,\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t});\n\n\t\t\ttest(\"should update connection state\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create a connection\n\t\t\t\tconst conn = client.connStateActor.getOrCreate().connect();\n\n\t\t\t\t// Get the initial state\n\t\t\t\tconst initialState = await conn.getConnectionState();\n\t\t\t\texpect(initialState.username).toBe(\"anonymous\");\n\n\t\t\t\t// Update the connection state\n\t\t\t\tconst updatedState = await conn.updateConnection({\n\t\t\t\t\tusername: \"newname\",\n\t\t\t\t\trole: \"moderator\",\n\t\t\t\t});\n\n\t\t\t\t// Verify the state was updated\n\t\t\t\texpect(updatedState.username).toBe(\"newname\");\n\t\t\t\texpect(updatedState.role).toBe(\"moderator\");\n\n\t\t\t\t// Get the state again to verify persistence\n\t\t\t\tconst latestState = await conn.getConnectionState();\n\t\t\t\texpect(latestState.username).toBe(\"newname\");\n\t\t\t\texpect(latestState.role).toBe(\"moderator\");\n\n\t\t\t\t// Clean up\n\t\t\t\tawait conn.dispose();\n\t\t\t});\n\t\t});\n\n\t\tdescribe(\"Connection Communication\", () => {\n\t\t\ttest(\"should send messages to specific connections\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create two connections\n\t\t\t\tconst handle = client.connStateActor.getOrCreate();\n\t\t\t\tconst conn1 = handle.connect();\n\t\t\t\tconst conn2 = handle.connect();\n\n\t\t\t\t// Get connection states\n\t\t\t\tconst state1 = await conn1.getConnectionState();\n\t\t\t\tconst state2 = await conn2.getConnectionState();\n\n\t\t\t\t// Set up event listener on second connection\n\t\t\t\tconst receivedMessages: any[] = [];\n\t\t\t\tconn2.on(\"directMessage\", (data) => {\n\t\t\t\t\treceivedMessages.push(data);\n\t\t\t\t});\n\n\t\t\t\t// TODO: SSE has race condition between subscrib eand publish message\n\t\t\t\tawait vi.waitFor(async () => {\n\t\t\t\t\t// Send message from first connection to second\n\t\t\t\t\tconst success = await conn1.sendToConnection(\n\t\t\t\t\t\tstate2.id,\n\t\t\t\t\t\t\"Hello from conn1\",\n\t\t\t\t\t);\n\t\t\t\t\texpect(success).toBe(true);\n\n\t\t\t\t\t// Verify message was received\n\t\t\t\t\texpect(receivedMessages.length).toBe(1);\n\t\t\t\t\texpect(receivedMessages[0].from).toBe(state1.id);\n\t\t\t\t\texpect(receivedMessages[0].message).toBe(\"Hello from conn1\");\n\t\t\t\t});\n\n\t\t\t\t// Clean up\n\t\t\t\tawait conn1.dispose();\n\t\t\t\tawait conn2.dispose();\n\t\t\t});\n\t\t});\n\t});\n}\n","import { describe } from \"vitest\";\nimport type { DriverTestConfig } from \"../mod\";\nimport { runActorScheduleTests } from \"./actor-schedule\";\nimport { runActorSleepTests } from \"./actor-sleep\";\nimport { runActorStateTests } from \"./actor-state\";\n\nexport function runActorDriverTests(driverTestConfig: DriverTestConfig) {\n\tdescribe(\"Actor Driver Tests\", () => {\n\t\t// Run state persistence tests\n\t\trunActorStateTests(driverTestConfig);\n\n\t\t// Run scheduled alarms tests\n\t\trunActorScheduleTests(driverTestConfig);\n\t});\n}\n\n/** Actor driver tests that need to be tested for all transport mechanisms. */\nexport function runActorDriverTestsWithTransport(\n\tdriverTestConfig: DriverTestConfig,\n) {\n\tdescribe(\"Actor Driver Tests\", () => {\n\t\t// Run actor sleep tests\n\t\trunActorSleepTests(driverTestConfig);\n\t});\n}\n","import { describe, expect, test } from \"vitest\";\nimport type { DriverTestConfig } from \"../mod\";\nimport { setupDriverTest, waitFor } from \"../utils\";\n\nexport function runActorScheduleTests(driverTestConfig: DriverTestConfig) {\n\tdescribe.skipIf(driverTestConfig.skip?.schedule)(\n\t\t\"Actor Schedule Tests\",\n\t\t() => {\n\t\t\t// See alarm + actor sleeping test in actor-sleep.ts\n\n\t\t\tdescribe(\"Scheduled Alarms\", () => {\n\t\t\t\ttest(\"executes c.schedule.at() with specific timestamp\", async (c) => {\n\t\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t\t// Create instance\n\t\t\t\t\tconst scheduled = client.scheduled.getOrCreate();\n\n\t\t\t\t\t// Schedule a task to run using timestamp\n\t\t\t\t\tconst timestamp = Date.now() + 250;\n\t\t\t\t\tawait scheduled.scheduleTaskAt(timestamp);\n\n\t\t\t\t\t// Wait for longer than the scheduled time\n\t\t\t\t\tawait waitFor(driverTestConfig, 500);\n\n\t\t\t\t\t// Verify the scheduled task ran\n\t\t\t\t\tconst lastRun = await scheduled.getLastRun();\n\t\t\t\t\tconst scheduledCount = await scheduled.getScheduledCount();\n\n\t\t\t\t\texpect(lastRun).toBeGreaterThan(0);\n\t\t\t\t\texpect(scheduledCount).toBe(1);\n\t\t\t\t});\n\n\t\t\t\ttest(\"executes c.schedule.after() with delay\", async (c) => {\n\t\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t\t// Create instance\n\t\t\t\t\tconst scheduled = client.scheduled.getOrCreate();\n\n\t\t\t\t\t// Schedule a task to run using delay\n\t\t\t\t\tawait scheduled.scheduleTaskAfter(250);\n\n\t\t\t\t\t// Wait for longer than the scheduled time\n\t\t\t\t\tawait waitFor(driverTestConfig, 500);\n\n\t\t\t\t\t// Verify the scheduled task ran\n\t\t\t\t\tconst lastRun = await scheduled.getLastRun();\n\t\t\t\t\tconst scheduledCount = await scheduled.getScheduledCount();\n\n\t\t\t\t\texpect(lastRun).toBeGreaterThan(0);\n\t\t\t\t\texpect(scheduledCount).toBe(1);\n\t\t\t\t});\n\n\t\t\t\ttest(\"multiple scheduled tasks execute in order\", async (c) => {\n\t\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t\t// Create instance\n\t\t\t\t\tconst scheduled = client.scheduled.getOrCreate();\n\n\t\t\t\t\t// Reset history to start fresh\n\t\t\t\t\tawait scheduled.clearHistory();\n\n\t\t\t\t\t// Schedule multiple tasks with different delays\n\t\t\t\t\tawait scheduled.scheduleTaskAfterWithId(\"first\", 250);\n\t\t\t\t\tawait scheduled.scheduleTaskAfterWithId(\"second\", 750);\n\t\t\t\t\tawait scheduled.scheduleTaskAfterWithId(\"third\", 1250);\n\n\t\t\t\t\t// Wait for first task only\n\t\t\t\t\tawait waitFor(driverTestConfig, 500);\n\t\t\t\t\tconst history1 = await scheduled.getTaskHistory();\n\t\t\t\t\texpect(history1).toEqual([\"first\"]);\n\n\t\t\t\t\t// Wait for second task\n\t\t\t\t\tawait waitFor(driverTestConfig, 500);\n\t\t\t\t\tconst history2 = await scheduled.getTaskHistory();\n\t\t\t\t\texpect(history2).toEqual([\"first\", \"second\"]);\n\n\t\t\t\t\t// Wait for third task\n\t\t\t\t\tawait waitFor(driverTestConfig, 500);\n\t\t\t\t\tconst history3 = await scheduled.getTaskHistory();\n\t\t\t\t\texpect(history3).toEqual([\"first\", \"second\", \"third\"]);\n\t\t\t\t});\n\t\t\t});\n\t\t},\n\t);\n}\n","import { describe, expect, test } from \"vitest\";\nimport { SLEEP_TIMEOUT } from \"../../../fixtures/driver-test-suite/sleep\";\nimport type { DriverTestConfig } from \"../mod\";\nimport { setupDriverTest, waitFor } from \"../utils\";\n\n// TODO: These tests are broken with fake timers because `_sleep` requires\n// background async promises that have a race condition with calling\n// `getCounts`\n//\n// To fix this, we need to imeplment some event system to be able to check for\n// when an actor has slept. OR we can expose an HTTP endpoint on the manager\n// for `.test` that checks if na actor is sleeping that we can poll.\nexport function runActorSleepTests(driverTestConfig: DriverTestConfig) {\n\tdescribe.skipIf(driverTestConfig.skip?.sleep)(\"Actor Sleep Tests\", () => {\n\t\ttest(\"actor sleep persists state\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t// Create actor\n\t\t\tconst sleepActor = client.sleep.getOrCreate();\n\n\t\t\t// Verify initial sleep count\n\t\t\t{\n\t\t\t\tconst { startCount, sleepCount } = await sleepActor.getCounts();\n\t\t\t\texpect(sleepCount).toBe(0);\n\t\t\t\texpect(startCount).toBe(1);\n\t\t\t}\n\n\t\t\t// Trigger sleep\n\t\t\tawait sleepActor.triggerSleep();\n\n\t\t\t// HACK: Wait for sleep to finish in background\n\t\t\tawait waitFor(driverTestConfig, 250);\n\n\t\t\t// Get sleep count after restore\n\t\t\t{\n\t\t\t\tconst { startCount, sleepCount } = await sleepActor.getCounts();\n\t\t\t\texpect(sleepCount).toBe(1);\n\t\t\t\texpect(startCount).toBe(2);\n\t\t\t}\n\t\t});\n\n\t\ttest(\"actor sleep persists state with connect\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t// Create actor with persistent connection\n\t\t\tconst sleepActor = client.sleep.getOrCreate().connect();\n\n\t\t\t// Verify initial sleep count\n\t\t\t{\n\t\t\t\tconst { startCount, sleepCount } = await sleepActor.getCounts();\n\t\t\t\texpect(sleepCount).toBe(0);\n\t\t\t\texpect(startCount).toBe(1);\n\t\t\t}\n\n\t\t\t// Trigger sleep\n\t\t\tawait sleepActor.triggerSleep();\n\n\t\t\t// Disconnect to allow reconnection\n\t\t\tawait sleepActor.dispose();\n\n\t\t\t// HACK: Wait for sleep to finish in background\n\t\t\tawait waitFor(driverTestConfig, SLEEP_TIMEOUT + 250);\n\n\t\t\t// Reconnect to get sleep count after restore\n\t\t\tconst sleepActor2 = client.sleep.getOrCreate();\n\t\t\t{\n\t\t\t\tconst { startCount, sleepCount } = await sleepActor2.getCounts();\n\t\t\t\texpect(sleepCount).toBe(1);\n\t\t\t\texpect(startCount).toBe(2);\n\t\t\t}\n\t\t});\n\n\t\ttest(\"actor automatically sleeps after timeout\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t// Create actor\n\t\t\tconst sleepActor = client.sleep.getOrCreate();\n\n\t\t\t// Verify initial sleep count\n\t\t\t{\n\t\t\t\tconst { startCount, sleepCount } = await sleepActor.getCounts();\n\t\t\t\texpect(sleepCount).toBe(0);\n\t\t\t\texpect(startCount).toBe(1);\n\t\t\t}\n\n\t\t\t// Wait for sleep\n\t\t\tawait waitFor(driverTestConfig, SLEEP_TIMEOUT + 250);\n\n\t\t\t// Get sleep count after restore\n\t\t\t{\n\t\t\t\tconst { startCount, sleepCount } = await sleepActor.getCounts();\n\t\t\t\texpect(sleepCount).toBe(1);\n\t\t\t\texpect(startCount).toBe(2);\n\t\t\t}\n\t\t});\n\n\t\ttest(\"actor automatically sleeps after timeout with connect\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t// Create actor with persistent connection\n\t\t\tconst sleepActor = client.sleep.getOrCreate().connect();\n\n\t\t\t// Verify initial sleep count\n\t\t\t{\n\t\t\t\tconst { startCount, sleepCount } = await sleepActor.getCounts();\n\t\t\t\texpect(sleepCount).toBe(0);\n\t\t\t\texpect(startCount).toBe(1);\n\t\t\t}\n\n\t\t\t// Disconnect to allow actor to sleep\n\t\t\tawait sleepActor.dispose();\n\n\t\t\t// Wait for sleep\n\t\t\tawait waitFor(driverTestConfig, SLEEP_TIMEOUT + 250);\n\n\t\t\t// Reconnect to get sleep count after restore\n\t\t\tconst sleepActor2 = client.sleep.getOrCreate();\n\t\t\t{\n\t\t\t\tconst { startCount, sleepCount } = await sleepActor2.getCounts();\n\t\t\t\texpect(sleepCount).toBe(1);\n\t\t\t\texpect(startCount).toBe(2);\n\t\t\t}\n\t\t});\n\n\t\ttest(\"rpc calls keep actor awake\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t// Create actor\n\t\t\tconst sleepActor = client.sleep.getOrCreate();\n\n\t\t\t// Verify initial state\n\t\t\t{\n\t\t\t\tconst { startCount, sleepCount } = await sleepActor.getCounts();\n\t\t\t\texpect(sleepCount).toBe(0);\n\t\t\t\texpect(startCount).toBe(1);\n\t\t\t}\n\n\t\t\t// Wait almost until sleep timeout, then make RPC call\n\t\t\tawait waitFor(driverTestConfig, SLEEP_TIMEOUT - 250);\n\n\t\t\t// RPC call should reset the sleep timer\n\t\t\t{\n\t\t\t\tconst { startCount, sleepCount } = await sleepActor.getCounts();\n\t\t\t\texpect(sleepCount).toBe(0); // Haven't slept yet\n\t\t\t\texpect(startCount).toBe(1); // Still the same instance\n\t\t\t}\n\n\t\t\t// Wait another partial timeout period - actor should still be awake\n\t\t\tawait waitFor(driverTestConfig, SLEEP_TIMEOUT - 250);\n\n\t\t\t// Actor should still be awake\n\t\t\t{\n\t\t\t\tconst { startCount, sleepCount } = await sleepActor.getCounts();\n\t\t\t\texpect(sleepCount).toBe(0); // Still haven't slept\n\t\t\t\texpect(startCount).toBe(1); // Still the same instance\n\t\t\t}\n\n\t\t\t// Now wait for full timeout without any RPC calls\n\t\t\tawait waitFor(driverTestConfig, SLEEP_TIMEOUT + 250);\n\n\t\t\t// Actor should have slept and restarted\n\t\t\t{\n\t\t\t\tconst { startCount, sleepCount } = await sleepActor.getCounts();\n\t\t\t\texpect(sleepCount).toBe(1); // Slept once\n\t\t\t\texpect(startCount).toBe(2); // New instance after sleep\n\t\t\t}\n\t\t});\n\n\t\ttest(\"alarms keep actor awake\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t// Create actor\n\t\t\tconst sleepActor = client.sleep.getOrCreate();\n\n\t\t\t// Verify initial state\n\t\t\t{\n\t\t\t\tconst { startCount, sleepCount } = await sleepActor.getCounts();\n\t\t\t\texpect(sleepCount).toBe(0);\n\t\t\t\texpect(startCount).toBe(1);\n\t\t\t}\n\n\t\t\t// Set an alarm to keep the actor awake\n\t\t\tawait sleepActor.setAlarm(SLEEP_TIMEOUT - 250);\n\n\t\t\t// Wait until after SLEEPT_IMEOUT to validate the actor did not sleep\n\t\t\tawait waitFor(driverTestConfig, SLEEP_TIMEOUT + 250);\n\n\t\t\t// Actor should not have slept\n\t\t\t{\n\t\t\t\tconst { startCount, sleepCount } = await sleepActor.getCounts();\n\t\t\t\texpect(sleepCount).toBe(0);\n\t\t\t\texpect(startCount).toBe(1);\n\t\t\t}\n\t\t});\n\n\t\ttest(\"alarms wake actors\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t// Create actor\n\t\t\tconst sleepActor = client.sleep.getOrCreate();\n\n\t\t\t// Verify initial state\n\t\t\t{\n\t\t\t\tconst { startCount, sleepCount } = await sleepActor.getCounts();\n\t\t\t\texpect(sleepCount).toBe(0);\n\t\t\t\texpect(startCount).toBe(1);\n\t\t\t}\n\n\t\t\t// Set an alarm to keep the actor awake\n\t\t\tawait sleepActor.setAlarm(SLEEP_TIMEOUT + 250);\n\n\t\t\t// Wait until after SLEEPT_IMEOUT to validate the actor did not sleep\n\t\t\tawait waitFor(driverTestConfig, SLEEP_TIMEOUT + 200);\n\n\t\t\t// Actor should not have slept\n\t\t\t{\n\t\t\t\tconst { startCount, sleepCount } = await sleepActor.getCounts();\n\t\t\t\texpect(sleepCount).toBe(1);\n\t\t\t\texpect(startCount).toBe(2);\n\t\t\t}\n\t\t});\n\n\t\ttest(\"long running rpcs keep actor awake\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t// Create actor\n\t\t\tconst sleepActor = client.sleepWithLongRpc.getOrCreate().connect();\n\n\t\t\t// Verify initial state\n\t\t\t{\n\t\t\t\tconst { startCount, sleepCount } = await sleepActor.getCounts();\n\t\t\t\texpect(sleepCount).toBe(0);\n\t\t\t\texpect(startCount).toBe(1);\n\t\t\t}\n\n\t\t\t// Start a long-running RPC that takes longer than the sleep timeout\n\t\t\tconst waitPromise = new Promise((resolve) =>\n\t\t\t\tsleepActor.once(\"waiting\", resolve),\n\t\t\t);\n\t\t\tconst longRunningPromise = sleepActor.longRunningRpc();\n\t\t\tawait waitPromise;\n\t\t\tawait waitFor(driverTestConfig, SLEEP_TIMEOUT + 250);\n\t\t\tawait sleepActor.finishLongRunningRpc();\n\t\t\tawait longRunningPromise;\n\n\t\t\t// Actor should still be the same instance (didn't sleep during RPC)\n\t\t\t{\n\t\t\t\tconst { startCount, sleepCount } = await sleepActor.getCounts();\n\t\t\t\texpect(sleepCount).toBe(0); // Hasn't slept\n\t\t\t\texpect(startCount).toBe(1); // Same instance\n\t\t\t}\n\t\t\tawait sleepActor.dispose();\n\n\t\t\t// Now wait for the sleep timeout\n\t\t\tawait waitFor(driverTestConfig, SLEEP_TIMEOUT + 250);\n\n\t\t\t// Actor should have slept after the timeout\n\t\t\tconst sleepActor2 = client.sleepWithLongRpc.getOrCreate();\n\t\t\t{\n\t\t\t\tconst { startCount, sleepCount } = await sleepActor2.getCounts();\n\t\t\t\texpect(sleepCount).toBe(1); // Slept once\n\t\t\t\texpect(startCount).toBe(2); // New instance after sleep\n\t\t\t}\n\t\t});\n\n\t\ttest(\"active raw websockets keep actor awake\", async (c) => {\n\t\t\tconst { client, endpoint: baseUrl } = await setupDriverTest(\n\t\t\t\tc,\n\t\t\t\tdriverTestConfig,\n\t\t\t);\n\n\t\t\t// Create actor\n\t\t\tconst sleepActor = client.sleepWithRawWebSocket.getOrCreate();\n\n\t\t\t// Verify initial state\n\t\t\t{\n\t\t\t\tconst { startCount, sleepCount } = await sleepActor.getCounts();\n\t\t\t\texpect(sleepCount).toBe(0);\n\t\t\t\texpect(startCount).toBe(1);\n\t\t\t}\n\n\t\t\t// Connect WebSocket\n\t\t\tconst ws = await sleepActor.websocket();\n\n\t\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\t\tws.onopen = () => resolve();\n\t\t\t\tws.onerror = reject;\n\t\t\t});\n\n\t\t\t// Wait for connection message\n\t\t\tawait new Promise<void>((resolve) => {\n\t\t\t\tws.onmessage = (event) => {\n\t\t\t\t\tconst data = JSON.parse(event.data);\n\t\t\t\t\tif (data.type === \"connected\") {\n\t\t\t\t\t\tresolve();\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t});\n\n\t\t\t// Wait longer than sleep timeout while keeping WebSocket connected\n\t\t\tawait waitFor(driverTestConfig, SLEEP_TIMEOUT + 250);\n\n\t\t\t// Send a message to check if actor is still alive\n\t\t\tws.send(JSON.stringify({ type: \"getCounts\" }));\n\n\t\t\tconst counts = await new Promise<any>((resolve) => {\n\t\t\t\tws.onmessage = (event) => {\n\t\t\t\t\tconst data = JSON.parse(event.data);\n\t\t\t\t\tif (data.type === \"counts\") {\n\t\t\t\t\t\tresolve(data);\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t});\n\n\t\t\t// Actor should still be the same instance (didn't sleep while WebSocket connected)\n\t\t\texpect(counts.sleepCount).toBe(0);\n\t\t\texpect(counts.startCount).toBe(1);\n\n\t\t\t// Close WebSocket\n\t\t\tws.close();\n\n\t\t\t// Wait for sleep timeout after WebSocket closed\n\t\t\tawait waitFor(driverTestConfig, SLEEP_TIMEOUT + 250);\n\n\t\t\t// Actor should have slept after WebSocket closed\n\t\t\t{\n\t\t\t\tconst { startCount, sleepCount } = await sleepActor.getCounts();\n\t\t\t\texpect(sleepCount).toBe(1); // Slept once\n\t\t\t\texpect(startCount).toBe(2); // New instance after sleep\n\t\t\t}\n\t\t});\n\n\t\ttest(\"active raw fetch requests keep actor awake\", async (c) => {\n\t\t\tconst { client, endpoint: baseUrl } = await setupDriverTest(\n\t\t\t\tc,\n\t\t\t\tdriverTestConfig,\n\t\t\t);\n\n\t\t\t// Create actor\n\t\t\tconst sleepActor = client.sleepWithRawHttp.getOrCreate();\n\n\t\t\t// Verify initial state\n\t\t\t{\n\t\t\t\tconst { startCount, sleepCount } = await sleepActor.getCounts();\n\t\t\t\texpect(sleepCount).toBe(0);\n\t\t\t\texpect(startCount).toBe(1);\n\t\t\t}\n\n\t\t\t// Start a long-running fetch request\n\t\t\tconst fetchDuration = SLEEP_TIMEOUT + 250;\n\t\t\tconst fetchPromise = sleepActor.fetch(\n\t\t\t\t`long-request?duration=${fetchDuration}`,\n\t\t\t);\n\n\t\t\t// Wait for the fetch to complete\n\t\t\tconst response = await fetchPromise;\n\t\t\tconst result = (await response.json()) as { completed: boolean };\n\t\t\texpect(result.completed).toBe(true);\n\t\t\t{\n\t\t\t\tconst { startCount, sleepCount, requestCount } =\n\t\t\t\t\tawait sleepActor.getCounts();\n\t\t\t\texpect(sleepCount).toBe(0);\n\t\t\t\texpect(startCount).toBe(1);\n\t\t\t\texpect(requestCount).toBe(1);\n\t\t\t}\n\n\t\t\t// Wait for sleep timeout\n\t\t\tawait waitFor(driverTestConfig, SLEEP_TIMEOUT + 250);\n\n\t\t\t// Actor should have slept after timeout\n\t\t\t{\n\t\t\t\tconst { startCount, sleepCount } = await sleepActor.getCounts();\n\t\t\t\texpect(sleepCount).toBe(1); // Slept once\n\t\t\t\texpect(startCount).toBe(2); // New instance after sleep\n\t\t\t}\n\t\t});\n\n\t\ttest(\"noSleep option disables sleeping\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t// Create actor with noSleep option\n\t\t\tconst sleepActor = client.sleepWithNoSleepOption.getOrCreate();\n\n\t\t\t// Verify initial state\n\t\t\t{\n\t\t\t\tconst { startCount, sleepCount } = await sleepActor.getCounts();\n\t\t\t\texpect(sleepCount).toBe(0);\n\t\t\t\texpect(startCount).toBe(1);\n\t\t\t}\n\n\t\t\t// Wait longer than sleep timeout\n\t\t\tawait waitFor(driverTestConfig, SLEEP_TIMEOUT + 250);\n\n\t\t\t// Actor should NOT have slept due to noSleep option\n\t\t\t{\n\t\t\t\tconst { startCount, sleepCount } = await sleepActor.getCounts();\n\t\t\t\texpect(sleepCount).toBe(0); // Never slept\n\t\t\t\texpect(startCount).toBe(1); // Still the same instance\n\t\t\t}\n\n\t\t\t// Wait even longer to be sure\n\t\t\tawait waitFor(driverTestConfig, SLEEP_TIMEOUT + 250);\n\n\t\t\t// Actor should still not have slept\n\t\t\t{\n\t\t\t\tconst { startCount, sleepCount } = await sleepActor.getCounts();\n\t\t\t\texpect(sleepCount).toBe(0); // Never slept\n\t\t\t\texpect(startCount).toBe(1); // Still the same instance\n\t\t\t}\n\t\t});\n\t});\n}\n","import { actor, type UniversalWebSocket } from \"rivetkit\";\nimport { promiseWithResolvers } from \"rivetkit/utils\";\n\nexport const SLEEP_TIMEOUT = 1000;\n\nexport const sleep = actor({\n\tstate: { startCount: 0, sleepCount: 0 },\n\tonStart: (c) => {\n\t\tc.state.startCount += 1;\n\t},\n\tonStop: (c) => {\n\t\tc.state.sleepCount += 1;\n\t},\n\tactions: {\n\t\ttriggerSleep: (c) => {\n\t\t\tc.sleep();\n\t\t},\n\t\tgetCounts: (c) => {\n\t\t\treturn { startCount: c.state.startCount, sleepCount: c.state.sleepCount };\n\t\t},\n\t\tsetAlarm: async (c, duration: number) => {\n\t\t\tawait c.schedule.after(duration, \"onAlarm\");\n\t\t},\n\t\tonAlarm: (c) => {\n\t\t\tc.log.info(\"alarm called\");\n\t\t},\n\t},\n\toptions: {\n\t\tsleepTimeout: SLEEP_TIMEOUT,\n\t},\n});\n\nexport const sleepWithLongRpc = actor({\n\tstate: { startCount: 0, sleepCount: 0 },\n\tcreateVars: () => ({}) as { longRunningResolve: PromiseWithResolvers<void> },\n\tonStart: (c) => {\n\t\tc.state.startCount += 1;\n\t},\n\tonStop: (c) => {\n\t\tc.state.sleepCount += 1;\n\t},\n\tactions: {\n\t\tgetCounts: (c) => {\n\t\t\treturn { startCount: c.state.startCount, sleepCount: c.state.sleepCount };\n\t\t},\n\t\tlongRunningRpc: async (c) => {\n\t\t\tc.log.info(\"starting long running rpc\");\n\t\t\tc.vars.longRunningResolve = promiseWithResolvers();\n\t\t\tc.broadcast(\"waiting\");\n\t\t\tawait c.vars.longRunningResolve.promise;\n\t\t\tc.log.info(\"finished long running rpc\");\n\t\t},\n\t\tfinishLongRunningRpc: (c) => c.vars.longRunningResolve?.resolve(),\n\t},\n\toptions: {\n\t\tsleepTimeout: SLEEP_TIMEOUT,\n\t},\n});\n\nexport const sleepWithRawHttp = actor({\n\tstate: { startCount: 0, sleepCount: 0, requestCount: 0 },\n\tonStart: (c) => {\n\t\tc.state.startCount += 1;\n\t},\n\tonStop: (c) => {\n\t\tc.state.sleepCount += 1;\n\t},\n\tonFetch: async (c, request) => {\n\t\tc.state.requestCount += 1;\n\t\tconst url = new URL(request.url);\n\n\t\tif (url.pathname === \"/long-request\") {\n\t\t\tconst duration = parseInt(url.searchParams.get(\"duration\") || \"1000\");\n\t\t\tc.log.info({ msg: \"starting long fetch request\", duration });\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, duration));\n\t\t\tc.log.info(\"finished long fetch request\");\n\t\t\treturn new Response(JSON.stringify({ completed: true }), {\n\t\t\t\theaders: { \"Content-Type\": \"application/json\" },\n\t\t\t});\n\t\t}\n\n\t\treturn new Response(\"Not Found\", { status: 404 });\n\t},\n\tactions: {\n\t\tgetCounts: (c) => {\n\t\t\treturn {\n\t\t\t\tstartCount: c.state.startCount,\n\t\t\t\tsleepCount: c.state.sleepCount,\n\t\t\t\trequestCount: c.state.requestCount,\n\t\t\t};\n\t\t},\n\t},\n\toptions: {\n\t\tsleepTimeout: SLEEP_TIMEOUT,\n\t},\n});\n\nexport const sleepWithRawWebSocket = actor({\n\tstate: { startCount: 0, sleepCount: 0, connectionCount: 0 },\n\tonStart: (c) => {\n\t\tc.state.startCount += 1;\n\t},\n\tonStop: (c) => {\n\t\tc.state.sleepCount += 1;\n\t},\n\tonWebSocket: (c, websocket: UniversalWebSocket, opts) => {\n\t\tc.state.connectionCount += 1;\n\t\tc.log.info({\n\t\t\tmsg: \"websocket connected\",\n\t\t\tconnectionCount: c.state.connectionCount,\n\t\t});\n\n\t\twebsocket.send(\n\t\t\tJSON.stringify({\n\t\t\t\ttype: \"connected\",\n\t\t\t\tconnectionCount: c.state.connectionCount,\n\t\t\t}),\n\t\t);\n\n\t\twebsocket.addEventListener(\"message\", (event: any) => {\n\t\t\tconst data = event.data;\n\t\t\tif (typeof data === \"string\") {\n\t\t\t\ttry {\n\t\t\t\t\tconst parsed = JSON.parse(data);\n\t\t\t\t\tif (parsed.type === \"getCounts\") {\n\t\t\t\t\t\twebsocket.send(\n\t\t\t\t\t\t\tJSON.stringify({\n\t\t\t\t\t\t\t\ttype: \"counts\",\n\t\t\t\t\t\t\t\tstartCount: c.state.startCount,\n\t\t\t\t\t\t\t\tsleepCount: c.state.sleepCount,\n\t\t\t\t\t\t\t\tconnectionCount: c.state.connectionCount,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t);\n\t\t\t\t\t} else if (parsed.type === \"keepAlive\") {\n\t\t\t\t\t\t// Just acknowledge to keep connection alive\n\t\t\t\t\t\twebsocket.send(JSON.stringify({ type: \"ack\" }));\n\t\t\t\t\t}\n\t\t\t\t} catch {\n\t\t\t\t\t// Echo non-JSON messages\n\t\t\t\t\twebsocket.send(data);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\twebsocket.addEventListener(\"close\", () => {\n\t\t\tc.state.connectionCount -= 1;\n\t\t\tc.log.info({\n\t\t\t\tmsg: \"websocket disconnected\",\n\t\t\t\tconnectionCount: c.state.connectionCount,\n\t\t\t});\n\t\t});\n\t},\n\tactions: {\n\t\tgetCounts: (c) => {\n\t\t\treturn {\n\t\t\t\tstartCount: c.state.startCount,\n\t\t\t\tsleepCount: c.state.sleepCount,\n\t\t\t\tconnectionCount: c.state.connectionCount,\n\t\t\t};\n\t\t},\n\t},\n\toptions: {\n\t\tsleepTimeout: SLEEP_TIMEOUT,\n\t},\n});\n\nexport const sleepWithNoSleepOption = actor({\n\tstate: { startCount: 0, sleepCount: 0 },\n\tonStart: (c) => {\n\t\tc.state.startCount += 1;\n\t},\n\tonStop: (c) => {\n\t\tc.state.sleepCount += 1;\n\t},\n\tactions: {\n\t\tgetCounts: (c) => {\n\t\t\treturn { startCount: c.state.startCount, sleepCount: c.state.sleepCount };\n\t\t},\n\t},\n\toptions: {\n\t\tsleepTimeout: SLEEP_TIMEOUT,\n\t\tnoSleep: true,\n\t},\n});\n","import { describe, expect, test } from \"vitest\";\nimport type { DriverTestConfig } from \"../mod\";\nimport { setupDriverTest } from \"../utils\";\n\nexport function runActorStateTests(driverTestConfig: DriverTestConfig) {\n\tdescribe(\"Actor State Tests\", () => {\n\t\tdescribe(\"State Persistence\", () => {\n\t\t\ttest(\"persists state between actor instances\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create instance and increment\n\t\t\t\tconst counterInstance = client.counter.getOrCreate();\n\t\t\t\tconst initialCount = await counterInstance.increment(5);\n\t\t\t\texpect(initialCount).toBe(5);\n\n\t\t\t\t// Get a fresh reference to the same actor and verify state persisted\n\t\t\t\tconst sameInstance = client.counter.getOrCreate();\n\t\t\t\tconst persistedCount = await sameInstance.increment(3);\n\t\t\t\texpect(persistedCount).toBe(8);\n\t\t\t});\n\n\t\t\ttest(\"restores state after actor disconnect/reconnect\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create actor and set initial state\n\t\t\t\tconst counterInstance = client.counter.getOrCreate();\n\t\t\t\tawait counterInstance.increment(5);\n\n\t\t\t\t// Reconnect to the same actor\n\t\t\t\tconst reconnectedInstance = client.counter.getOrCreate();\n\t\t\t\tconst persistedCount = await reconnectedInstance.increment(0);\n\t\t\t\texpect(persistedCount).toBe(5);\n\t\t\t});\n\n\t\t\ttest(\"maintains separate state for different actors\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create first counter with specific key\n\t\t\t\tconst counterA = client.counter.getOrCreate([\"counter-a\"]);\n\t\t\t\tawait counterA.increment(5);\n\n\t\t\t\t// Create second counter with different key\n\t\t\t\tconst counterB = client.counter.getOrCreate([\"counter-b\"]);\n\t\t\t\tawait counterB.increment(10);\n\n\t\t\t\t// Verify state is separate\n\t\t\t\tconst countA = await counterA.increment(0);\n\t\t\t\tconst countB = await counterB.increment(0);\n\t\t\t\texpect(countA).toBe(5);\n\t\t\t\texpect(countB).toBe(10);\n\t\t\t});\n\t\t});\n\t});\n}\n","import { describe, expect, test } from \"vitest\";\nimport {\n\tINTERNAL_ERROR_CODE,\n\tINTERNAL_ERROR_DESCRIPTION,\n} from \"@/actor/errors\";\nimport { assertUnreachable } from \"@/actor/utils\";\nimport type { DriverTestConfig } from \"../mod\";\nimport { setupDriverTest } from \"../utils\";\n\nexport function runActorErrorHandlingTests(driverTestConfig: DriverTestConfig) {\n\tdescribe(\"Actor Error Handling Tests\", () => {\n\t\tdescribe(\"UserError Handling\", () => {\n\t\t\ttest(\"should handle simple UserError with message\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Try to call an action that throws a simple UserError\n\t\t\t\tconst handle = client.errorHandlingActor.getOrCreate();\n\n\t\t\t\ttry {\n\t\t\t\t\tawait handle.throwSimpleError();\n\t\t\t\t\t// If we get here, the test should fail\n\t\t\t\t\texpect(true).toBe(false); // This should not be reached\n\t\t\t\t} catch (error: any) {\n\t\t\t\t\t// Verify the error properties\n\t\t\t\t\texpect(error.message).toBe(\"Simple error message\");\n\t\t\t\t\t// Default code is \"user_error\" when not specified\n\t\t\t\t\texpect(error.code).toBe(\"user_error\");\n\t\t\t\t\t// No metadata by default\n\t\t\t\t\texpect(error.metadata).toBeUndefined();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\ttest(\"should handle detailed UserError with code and metadata\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Try to call an action that throws a detailed UserError\n\t\t\t\tconst handle = client.errorHandlingActor.getOrCreate();\n\n\t\t\t\ttry {\n\t\t\t\t\tawait handle.throwDetailedError();\n\t\t\t\t\t// If we get here, the test should fail\n\t\t\t\t\texpect(true).toBe(false); // This should not be reached\n\t\t\t\t} catch (error: any) {\n\t\t\t\t\t// Verify the error properties\n\t\t\t\t\texpect(error.message).toBe(\"Detailed error message\");\n\t\t\t\t\texpect(error.code).toBe(\"detailed_error\");\n\t\t\t\t\texpect(error.metadata).toBeDefined();\n\t\t\t\t\texpect(error.metadata.reason).toBe(\"test\");\n\t\t\t\t\texpect(error.metadata.timestamp).toBeDefined();\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t\tdescribe(\"Internal Error Handling\", () => {\n\t\t\ttest(\"should convert internal errors to safe format\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Try to call an action that throws an internal error\n\t\t\t\tconst handle = client.errorHandlingActor.getOrCreate();\n\n\t\t\t\ttry {\n\t\t\t\t\tawait handle.throwInternalError();\n\t\t\t\t\t// If we get here, the test should fail\n\t\t\t\t\texpect(true).toBe(false); // This should not be reached\n\t\t\t\t} catch (error: any) {\n\t\t\t\t\t// Verify the error is converted to a safe format\n\t\t\t\t\texpect(error.code).toBe(INTERNAL_ERROR_CODE);\n\t\t\t\t\t// Original error details should not be exposed\n\t\t\t\t\texpect(error.message).toBe(INTERNAL_ERROR_DESCRIPTION);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t\t// TODO: Does not work with fake timers\n\t\tdescribe.skip(\"Action Timeout\", () => {\n\t\t\ttest(\"should handle action timeouts with custom duration\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Call an action that should time out\n\t\t\t\tconst handle = client.errorHandlingActor.getOrCreate();\n\n\t\t\t\t// This should throw a timeout error because errorHandlingActor has\n\t\t\t\t// a 500ms timeout and this action tries to run for much longer\n\t\t\t\tconst timeoutPromise = handle.timeoutAction();\n\n\t\t\t\ttry {\n\t\t\t\t\tawait timeoutPromise;\n\t\t\t\t\t// If we get here, the test failed - timeout didn't occur\n\t\t\t\t\texpect(true).toBe(false); // This should not be reached\n\t\t\t\t} catch (error: any) {\n\t\t\t\t\t// Verify it's a timeout error\n\t\t\t\t\texpect(error.message).toMatch(/timed out/i);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\ttest(\"should successfully run actions within timeout\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Call an action with a delay shorter than the timeout\n\t\t\t\tconst handle = client.errorHandlingActor.getOrCreate();\n\n\t\t\t\t// This should succeed because 200ms < 500ms timeout\n\t\t\t\tconst result = await handle.delayedAction(200);\n\t\t\t\texpect(result).toBe(\"Completed after 200ms\");\n\t\t\t});\n\n\t\t\ttest(\"should respect different timeouts for different actors\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// The following actors have different timeout settings:\n\t\t\t\t// customTimeoutActor: 200ms timeout\n\t\t\t\t// standardTimeoutActor: default timeout (much longer)\n\n\t\t\t\t// This should fail - 300ms delay with 200ms timeout\n\t\t\t\ttry {\n\t\t\t\t\tawait client.customTimeoutActor.getOrCreate().slowAction();\n\t\t\t\t\t// Should not reach here\n\t\t\t\t\texpect(true).toBe(false);\n\t\t\t\t} catch (error: any) {\n\t\t\t\t\texpect(error.message).toMatch(/timed out/i);\n\t\t\t\t}\n\n\t\t\t\t// This should succeed - 50ms delay with 200ms timeout\n\t\t\t\tconst quickResult = await client.customTimeoutActor\n\t\t\t\t\t.getOrCreate()\n\t\t\t\t\t.quickAction();\n\t\t\t\texpect(quickResult).toBe(\"Quick action completed\");\n\t\t\t});\n\t\t});\n\n\t\tdescribe(\"Error Recovery\", () => {\n\t\t\ttest(\"should continue working after errors\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\tconst handle = client.errorHandlingActor.getOrCreate();\n\n\t\t\t\t// Trigger an error\n\t\t\t\ttry {\n\t\t\t\t\tawait handle.throwSimpleError();\n\t\t\t\t} catch (error) {\n\t\t\t\t\t// Ignore error\n\t\t\t\t}\n\n\t\t\t\t// Actor should still work after error\n\t\t\t\tconst result = await handle.successfulAction();\n\t\t\t\texpect(result).toBe(\"success\");\n\t\t\t});\n\t\t});\n\t});\n}\n","import { describe, expect, test } from \"vitest\";\nimport type { ActorError } from \"@/client/mod\";\nimport type { DriverTestConfig } from \"../mod\";\nimport { setupDriverTest } from \"../utils\";\n\nexport function runActorHandleTests(driverTestConfig: DriverTestConfig) {\n\tdescribe(\"Actor Handle Tests\", () => {\n\t\tdescribe(\"Access Methods\", () => {\n\t\t\ttest(\"should use .get() to access a actor\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create actor first\n\t\t\t\tawait client.counter.create([\"test-get-handle\"]);\n\n\t\t\t\t// Access using get\n\t\t\t\tconst handle = client.counter.get([\"test-get-handle\"]);\n\n\t\t\t\t// Verify Action works\n\t\t\t\tconst count = await handle.increment(5);\n\t\t\t\texpect(count).toBe(5);\n\n\t\t\t\tconst retrievedCount = await handle.getCount();\n\t\t\t\texpect(retrievedCount).toBe(5);\n\t\t\t});\n\n\t\t\ttest(\"should use .getForId() to access a actor by ID\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create a actor first to get its ID\n\t\t\t\tconst handle = client.counter.getOrCreate([\"test-get-for-id-handle\"]);\n\t\t\t\tawait handle.increment(3);\n\t\t\t\tconst actorId = await handle.resolve();\n\n\t\t\t\t// Access using getForId\n\t\t\t\tconst idHandle = client.counter.getForId(actorId);\n\n\t\t\t\t// Verify Action works and state is preserved\n\t\t\t\tconst count = await idHandle.getCount();\n\t\t\t\texpect(count).toBe(3);\n\n\t\t\t\tconst newCount = await idHandle.increment(4);\n\t\t\t\texpect(newCount).toBe(7);\n\t\t\t});\n\n\t\t\ttest(\"should use .getOrCreate() to access or create a actor\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Access using getOrCreate - should create the actor\n\t\t\t\tconst handle = client.counter.getOrCreate([\n\t\t\t\t\t\"test-get-or-create-handle\",\n\t\t\t\t]);\n\n\t\t\t\t// Verify Action works\n\t\t\t\tconst count = await handle.increment(7);\n\t\t\t\texpect(count).toBe(7);\n\n\t\t\t\t// Get the same actor again - should retrieve existing actor\n\t\t\t\tconst sameHandle = client.counter.getOrCreate([\n\t\t\t\t\t\"test-get-or-create-handle\",\n\t\t\t\t]);\n\t\t\t\tconst retrievedCount = await sameHandle.getCount();\n\t\t\t\texpect(retrievedCount).toBe(7);\n\t\t\t});\n\n\t\t\ttest(\"should use (await create()) to create and return a handle\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create actor and get handle\n\t\t\t\tconst handle = await client.counter.create([\"test-create-handle\"]);\n\n\t\t\t\t// Verify Action works\n\t\t\t\tconst count = await handle.increment(9);\n\t\t\t\texpect(count).toBe(9);\n\n\t\t\t\tconst retrievedCount = await handle.getCount();\n\t\t\t\texpect(retrievedCount).toBe(9);\n\t\t\t});\n\n\t\t\ttest(\"errors when calling create twice with the same key\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\tconst key = [\"duplicate-create-handle\", crypto.randomUUID()];\n\n\t\t\t\t// First create should succeed\n\t\t\t\tawait client.counter.create(key);\n\n\t\t\t\t// Second create with same key should throw ActorAlreadyExists\n\t\t\t\ttry {\n\t\t\t\t\tawait client.counter.create(key);\n\t\t\t\t\texpect.fail(\"did not error on duplicate create\");\n\t\t\t\t} catch (err) {\n\t\t\t\t\texpect((err as ActorError).group).toBe(\"actor\");\n\t\t\t\t\texpect((err as ActorError).code).toBe(\"already_exists\");\n\t\t\t\t}\n\t\t\t});\n\n\t\t\ttest(\".get().resolve() errors for non-existent actor\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\tconst missingId = `nonexistent-${crypto.randomUUID()}`;\n\n\t\t\t\ttry {\n\t\t\t\t\tawait client.counter.get([missingId]).resolve();\n\t\t\t\t\texpect.fail(\"did not error for get().resolve() on missing actor\");\n\t\t\t\t} catch (err) {\n\t\t\t\t\texpect((err as ActorError).group).toBe(\"actor\");\n\t\t\t\t\texpect((err as ActorError).code).toBe(\"not_found\");\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t\tdescribe(\"Action Functionality\", () => {\n\t\t\ttest(\"should call actions directly on the handle\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\tconst handle = client.counter.getOrCreate([\"test-action-handle\"]);\n\n\t\t\t\t// Call multiple actions in sequence\n\t\t\t\tconst count1 = await handle.increment(3);\n\t\t\t\texpect(count1).toBe(3);\n\n\t\t\t\tconst count2 = await handle.increment(5);\n\t\t\t\texpect(count2).toBe(8);\n\n\t\t\t\tconst retrievedCount = await handle.getCount();\n\t\t\t\texpect(retrievedCount).toBe(8);\n\t\t\t});\n\n\t\t\ttest(\"should handle independent handles to the same actor\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create two handles to the same actor\n\t\t\t\tconst handle1 = client.counter.getOrCreate([\"test-multiple-handles\"]);\n\t\t\t\tconst handle2 = client.counter.get([\"test-multiple-handles\"]);\n\n\t\t\t\t// Call actions on both handles\n\t\t\t\tawait handle1.increment(3);\n\t\t\t\tconst count = await handle2.getCount();\n\n\t\t\t\t// Verify both handles access the same state\n\t\t\t\texpect(count).toBe(3);\n\n\t\t\t\tconst finalCount = await handle2.increment(4);\n\t\t\t\texpect(finalCount).toBe(7);\n\n\t\t\t\tconst checkCount = await handle1.getCount();\n\t\t\t\texpect(checkCount).toBe(7);\n\t\t\t});\n\n\t\t\ttest(\"should resolve a actor's ID\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\tconst handle = client.counter.getOrCreate([\"test-resolve-id\"]);\n\n\t\t\t\t// Call an action to ensure actor exists\n\t\t\t\tawait handle.increment(1);\n\n\t\t\t\t// Resolve the ID\n\t\t\t\tconst actorId = await handle.resolve();\n\n\t\t\t\t// Verify we got a valid ID (string)\n\t\t\t\texpect(typeof actorId).toBe(\"string\");\n\t\t\t\texpect(actorId).not.toBe(\"\");\n\n\t\t\t\t// Verify we can use this ID to get the actor\n\t\t\t\tconst idHandle = client.counter.getForId(actorId);\n\t\t\t\tconst count = await idHandle.getCount();\n\t\t\t\texpect(count).toBe(1);\n\t\t\t});\n\t\t});\n\n\t\tdescribe(\"Lifecycle Hooks\", () => {\n\t\t\ttest(\"should trigger lifecycle hooks on actor creation\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Get or create a new actor - this should trigger onStart\n\t\t\t\tconst handle = client.counterWithLifecycle.getOrCreate([\n\t\t\t\t\t\"test-lifecycle-handle\",\n\t\t\t\t]);\n\n\t\t\t\t// Verify onStart was triggered\n\t\t\t\tconst initialEvents = await handle.getEvents();\n\t\t\t\texpect(initialEvents).toContain(\"onStart\");\n\n\t\t\t\t// Create a separate handle to the same actor\n\t\t\t\tconst sameHandle = client.counterWithLifecycle.getOrCreate([\n\t\t\t\t\t\"test-lifecycle-handle\",\n\t\t\t\t]);\n\n\t\t\t\t// Verify events still include onStart but don't duplicate it\n\t\t\t\t// (onStart should only be called once when the actor is first created)\n\t\t\t\tconst events = await sameHandle.getEvents();\n\t\t\t\texpect(events).toContain(\"onStart\");\n\t\t\t\texpect(events.filter((e) => e === \"onStart\").length).toBe(1);\n\t\t\t});\n\n\t\t\ttest(\"should trigger lifecycle hooks for each Action call\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create a normal handle to view events\n\t\t\t\tconst viewHandle = client.counterWithLifecycle.getOrCreate([\n\t\t\t\t\t\"test-lifecycle-action\",\n\t\t\t\t]);\n\n\t\t\t\t// Initial state should only have onStart\n\t\t\t\tconst initialEvents = await viewHandle.getEvents();\n\t\t\t\texpect(initialEvents).toContain(\"onStart\");\n\t\t\t\texpect(initialEvents).not.toContain(\"onBeforeConnect\");\n\t\t\t\texpect(initialEvents).not.toContain(\"onConnect\");\n\t\t\t\texpect(initialEvents).not.toContain(\"onDisconnect\");\n\n\t\t\t\t// Create a handle with trackLifecycle enabled for testing Action calls\n\t\t\t\tconst trackingHandle = client.counterWithLifecycle.getOrCreate(\n\t\t\t\t\t[\"test-lifecycle-action\"],\n\t\t\t\t\t{ params: { trackLifecycle: true } },\n\t\t\t\t);\n\n\t\t\t\t// Make an Action call\n\t\t\t\tawait trackingHandle.increment(5);\n\n\t\t\t\t// Check that it triggered the lifecycle hooks\n\t\t\t\tconst eventsAfterAction = await viewHandle.getEvents();\n\n\t\t\t\t// Should have onBeforeConnect, onConnect, and onDisconnect for the Action call\n\t\t\t\texpect(eventsAfterAction).toContain(\"onBeforeConnect\");\n\t\t\t\texpect(eventsAfterAction).toContain(\"onConnect\");\n\t\t\t\texpect(eventsAfterAction).toContain(\"onDisconnect\");\n\n\t\t\t\t// Each should have count 1\n\t\t\t\texpect(\n\t\t\t\t\teventsAfterAction.filter((e) => e === \"onBeforeConnect\").length,\n\t\t\t\t).toBe(1);\n\t\t\t\texpect(eventsAfterAction.filter((e) => e === \"onConnect\").length).toBe(\n\t\t\t\t\t1,\n\t\t\t\t);\n\t\t\t\texpect(\n\t\t\t\t\teventsAfterAction.filter((e) => e === \"onDisconnect\").length,\n\t\t\t\t).toBe(1);\n\n\t\t\t\t// Make another Action call\n\t\t\t\tawait trackingHandle.increment(10);\n\n\t\t\t\t// Check that it triggered another set of lifecycle hooks\n\t\t\t\tconst eventsAfterSecondAction = await viewHandle.getEvents();\n\n\t\t\t\t// Each hook should now have count 2\n\t\t\t\texpect(\n\t\t\t\t\teventsAfterSecondAction.filter((e) => e === \"onBeforeConnect\").length,\n\t\t\t\t).toBe(2);\n\t\t\t\texpect(\n\t\t\t\t\teventsAfterSecondAction.filter((e) => e === \"onConnect\").length,\n\t\t\t\t).toBe(2);\n\t\t\t\texpect(\n\t\t\t\t\teventsAfterSecondAction.filter((e) => e === \"onDisconnect\").length,\n\t\t\t\t).toBe(2);\n\t\t\t});\n\n\t\t\ttest(\"should trigger lifecycle hooks for each Action call across multiple handles\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create a normal handle to view events\n\t\t\t\tconst viewHandle = client.counterWithLifecycle.getOrCreate([\n\t\t\t\t\t\"test-lifecycle-multi-handle\",\n\t\t\t\t]);\n\n\t\t\t\t// Create two tracking handles to the same actor\n\t\t\t\tconst trackingHandle1 = client.counterWithLifecycle.getOrCreate(\n\t\t\t\t\t[\"test-lifecycle-multi-handle\"],\n\t\t\t\t\t{ params: { trackLifecycle: true } },\n\t\t\t\t);\n\n\t\t\t\tconst trackingHandle2 = client.counterWithLifecycle.getOrCreate(\n\t\t\t\t\t[\"test-lifecycle-multi-handle\"],\n\t\t\t\t\t{ params: { trackLifecycle: true } },\n\t\t\t\t);\n\n\t\t\t\t// Make Action calls on both handles\n\t\t\t\tawait trackingHandle1.increment(5);\n\t\t\t\tawait trackingHandle2.increment(10);\n\n\t\t\t\t// Check lifecycle hooks\n\t\t\t\tconst events = await viewHandle.getEvents();\n\n\t\t\t\t// Should have 1 onStart, 2 each of onBeforeConnect, onConnect, and onDisconnect\n\t\t\t\texpect(events.filter((e) => e === \"onStart\").length).toBe(1);\n\t\t\t\texpect(events.filter((e) => e === \"onBeforeConnect\").length).toBe(2);\n\t\t\t\texpect(events.filter((e) => e === \"onConnect\").length).toBe(2);\n\t\t\t\texpect(events.filter((e) => e === \"onDisconnect\").length).toBe(2);\n\t\t\t});\n\t\t});\n\t});\n}\n","import { describe, expect, test } from \"vitest\";\nimport type { DriverTestConfig } from \"../mod\";\nimport { setupDriverTest } from \"../utils\";\n\nexport function runActorInlineClientTests(driverTestConfig: DriverTestConfig) {\n\tdescribe(\"Actor Inline Client Tests\", () => {\n\t\tdescribe(\"Stateless Client Calls\", () => {\n\t\t\ttest(\"should make stateless calls to other actors\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create the inline client actor\n\t\t\t\tconst inlineClientHandle = client.inlineClientActor.getOrCreate([\n\t\t\t\t\t\"inline-client-test\",\n\t\t\t\t]);\n\n\t\t\t\t// Test calling counter.increment via inline client\n\t\t\t\tconst result = await inlineClientHandle.callCounterIncrement(5);\n\t\t\t\texpect(result).toBe(5);\n\n\t\t\t\t// Verify the counter state was actually updated\n\t\t\t\tconst counterState = await inlineClientHandle.getCounterState();\n\t\t\t\texpect(counterState).toBe(5);\n\n\t\t\t\t// Check that messages were logged\n\t\t\t\tconst messages = await inlineClientHandle.getMessages();\n\t\t\t\texpect(messages).toHaveLength(2);\n\t\t\t\texpect(messages[0]).toContain(\"Called counter.increment(5), result: 5\");\n\t\t\t\texpect(messages[1]).toContain(\"Got counter state: 5\");\n\t\t\t});\n\n\t\t\ttest(\"should handle multiple stateless calls\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create the inline client actor\n\t\t\t\tconst inlineClientHandle = client.inlineClientActor.getOrCreate([\n\t\t\t\t\t\"inline-client-multi\",\n\t\t\t\t]);\n\n\t\t\t\t// Clear any existing messages\n\t\t\t\tawait inlineClientHandle.clearMessages();\n\n\t\t\t\t// Make multiple calls\n\t\t\t\tconst result1 = await inlineClientHandle.callCounterIncrement(3);\n\t\t\t\tconst result2 = await inlineClientHandle.callCounterIncrement(7);\n\t\t\t\tconst finalState = await inlineClientHandle.getCounterState();\n\n\t\t\t\texpect(result1).toBe(3);\n\t\t\t\texpect(result2).toBe(10); // 3 + 7\n\t\t\t\texpect(finalState).toBe(10);\n\n\t\t\t\t// Check messages\n\t\t\t\tconst messages = await inlineClientHandle.getMessages();\n\t\t\t\texpect(messages).toHaveLength(3);\n\t\t\t\texpect(messages[0]).toContain(\"Called counter.increment(3), result: 3\");\n\t\t\t\texpect(messages[1]).toContain(\n\t\t\t\t\t\"Called counter.increment(7), result: 10\",\n\t\t\t\t);\n\t\t\t\texpect(messages[2]).toContain(\"Got counter state: 10\");\n\t\t\t});\n\t\t});\n\n\t\tdescribe(\"Stateful Client Calls\", () => {\n\t\t\ttest(\"should connect to other actors and receive events\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create the inline client actor\n\t\t\t\tconst inlineClientHandle = client.inlineClientActor.getOrCreate([\n\t\t\t\t\t\"inline-client-stateful\",\n\t\t\t\t]);\n\n\t\t\t\t// Clear any existing messages\n\t\t\t\tawait inlineClientHandle.clearMessages();\n\n\t\t\t\t// Test stateful connection with events\n\t\t\t\tconst result = await inlineClientHandle.connectToCounterAndIncrement(4);\n\n\t\t\t\texpect(result.result1).toBe(4);\n\t\t\t\texpect(result.result2).toBe(12); // 4 + 8\n\t\t\t\texpect(result.events).toEqual([4, 12]); // Should have received both events\n\n\t\t\t\t// Check that message was logged\n\t\t\t\tconst messages = await inlineClientHandle.getMessages();\n\t\t\t\texpect(messages).toHaveLength(1);\n\t\t\t\texpect(messages[0]).toContain(\n\t\t\t\t\t\"Connected to counter, incremented by 4 and 8\",\n\t\t\t\t);\n\t\t\t\texpect(messages[0]).toContain(\"results: 4, 12\");\n\t\t\t\texpect(messages[0]).toContain(\"events: [4,12]\");\n\t\t\t});\n\n\t\t\ttest(\"should handle stateful connection independently\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create the inline client actor\n\t\t\t\tconst inlineClientHandle = client.inlineClientActor.getOrCreate([\n\t\t\t\t\t\"inline-client-independent\",\n\t\t\t\t]);\n\n\t\t\t\t// Clear any existing messages\n\t\t\t\tawait inlineClientHandle.clearMessages();\n\n\t\t\t\t// Test with different increment values\n\t\t\t\tconst result = await inlineClientHandle.connectToCounterAndIncrement(2);\n\n\t\t\t\texpect(result.result1).toBe(2);\n\t\t\t\texpect(result.result2).toBe(6); // 2 + 4\n\t\t\t\texpect(result.events).toEqual([2, 6]);\n\n\t\t\t\t// Verify the state is independent from previous tests\n\t\t\t\tconst messages = await inlineClientHandle.getMessages();\n\t\t\t\texpect(messages).toHaveLength(1);\n\t\t\t\texpect(messages[0]).toContain(\n\t\t\t\t\t\"Connected to counter, incremented by 2 and 4\",\n\t\t\t\t);\n\t\t\t});\n\t\t});\n\n\t\tdescribe(\"Mixed Client Usage\", () => {\n\t\t\ttest(\"should handle both stateless and stateful calls\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create the inline client actor\n\t\t\t\tconst inlineClientHandle = client.inlineClientActor.getOrCreate([\n\t\t\t\t\t\"inline-client-mixed\",\n\t\t\t\t]);\n\n\t\t\t\t// Clear any existing messages\n\t\t\t\tawait inlineClientHandle.clearMessages();\n\n\t\t\t\t// Start with stateless calls\n\t\t\t\tawait inlineClientHandle.callCounterIncrement(1);\n\t\t\t\tconst statelessResult = await inlineClientHandle.getCounterState();\n\t\t\t\texpect(statelessResult).toBe(1);\n\n\t\t\t\t// Then do stateful call\n\t\t\t\tconst statefulResult =\n\t\t\t\t\tawait inlineClientHandle.connectToCounterAndIncrement(3);\n\t\t\t\texpect(statefulResult.result1).toBe(3);\n\t\t\t\texpect(statefulResult.result2).toBe(9); // 3 + 6\n\n\t\t\t\t// Check all messages were logged\n\t\t\t\tconst messages = await inlineClientHandle.getMessages();\n\t\t\t\texpect(messages).toHaveLength(3);\n\t\t\t\texpect(messages[0]).toContain(\"Called counter.increment(1), result: 1\");\n\t\t\t\texpect(messages[1]).toContain(\"Got counter state: 1\");\n\t\t\t\texpect(messages[2]).toContain(\n\t\t\t\t\t\"Connected to counter, incremented by 3 and 6\",\n\t\t\t\t);\n\t\t\t});\n\t\t});\n\t});\n}\n","import { describe, expect, test } from \"vitest\";\nimport { HEADER_ACTOR_QUERY } from \"@/driver-helpers/mod\";\nimport {\n\tcreateActorInspectorClient,\n\tcreateManagerInspectorClient,\n} from \"@/inspector/mod\";\nimport type { ActorQuery } from \"@/mod\";\nimport type { DriverTestConfig } from \"../mod\";\nimport { setupDriverTest } from \"../utils\";\n\nexport function runActorInspectorTests(driverTestConfig: DriverTestConfig) {\n\t// TODO: Add back\n\tdescribe.skip(\"Actor Inspector Tests\", () => {\n\t\tdescribe(\"Manager Inspector\", () => {\n\t\t\ttest(\"should respond to ping\", async (c) => {\n\t\t\t\tconst { endpoint } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\tconst http = createManagerInspectorClient(`${endpoint}/inspect`, {\n\t\t\t\t\theaders: {\n\t\t\t\t\t\tAuthorization: `Bearer token`,\n\t\t\t\t\t},\n\t\t\t\t});\n\n\t\t\t\tconst response = await http.ping.$get();\n\t\t\t\texpect(response.status).toBe(200);\n\n\t\t\t\tconst data = await response.json();\n\t\t\t\texpect(data).toEqual({ message: \"pong\" });\n\t\t\t});\n\n\t\t\ttest(\"should get actors with pagination\", async (c) => {\n\t\t\t\tconst { client, endpoint } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create some actors first\n\t\t\t\tawait client.counter.create([\"test-actor-1\"]);\n\t\t\t\tawait client.counter.create([\"test-actor-2\"]);\n\n\t\t\t\tconst http = createManagerInspectorClient(`${endpoint}/inspect`, {\n\t\t\t\t\theaders: {\n\t\t\t\t\t\tAuthorization: `Bearer token`,\n\t\t\t\t\t},\n\t\t\t\t});\n\n\t\t\t\tconst response = await http.actors.$get({\n\t\t\t\t\tquery: { limit: \"1\" },\n\t\t\t\t});\n\t\t\t\texpect(response.status).toBe(200);\n\n\t\t\t\tconst data = await response.json();\n\t\t\t\texpect(data).toEqual(\n\t\t\t\t\texpect.arrayContaining([\n\t\t\t\t\t\texpect.objectContaining({ key: [\"test-actor-1\"] }),\n\t\t\t\t\t]),\n\t\t\t\t);\n\t\t\t\texpect(data.length).toBe(1);\n\t\t\t});\n\n\t\t\ttest(\"should get all actors with pagination\", async (c) => {\n\t\t\t\tconst { client, endpoint } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\tconst actorKey1 = [\"test-cursor-1\"];\n\t\t\t\tconst actorKey2 = [\"test-cursor-2\"];\n\n\t\t\t\t// Create some actors first\n\t\t\t\tawait client.counter.create(actorKey1);\n\t\t\t\tawait client.counter.create(actorKey2);\n\n\t\t\t\tconst http = createManagerInspectorClient(`${endpoint}/inspect`, {\n\t\t\t\t\theaders: {\n\t\t\t\t\t\tAuthorization: `Bearer token`,\n\t\t\t\t\t},\n\t\t\t\t});\n\n\t\t\t\tconst response = await http.actors.$get({\n\t\t\t\t\tquery: { limit: \"5\" },\n\t\t\t\t});\n\t\t\t\texpect(response.status).toBe(200);\n\n\t\t\t\tconst data = await response.json();\n\t\t\t\texpect(data).toEqual(\n\t\t\t\t\texpect.arrayContaining([\n\t\t\t\t\t\texpect.objectContaining({\n\t\t\t\t\t\t\tid: expect.any(String),\n\t\t\t\t\t\t\tkey: actorKey1,\n\t\t\t\t\t\t}),\n\t\t\t\t\t\texpect.objectContaining({\n\t\t\t\t\t\t\tid: expect.any(String),\n\t\t\t\t\t\t\tkey: actorKey2,\n\t\t\t\t\t\t}),\n\t\t\t\t\t]),\n\t\t\t\t);\n\t\t\t});\n\n\t\t\ttest(\"should handle invalid limit parameter\", async (c) => {\n\t\t\t\tconst { endpoint } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\tconst http = createManagerInspectorClient(`${endpoint}/inspect`, {\n\t\t\t\t\theaders: {\n\t\t\t\t\t\tAuthorization: `Bearer token`,\n\t\t\t\t\t},\n\t\t\t\t});\n\n\t\t\t\tconst response = await http.actors.$get({\n\t\t\t\t\tquery: { limit: \"0\" },\n\t\t\t\t});\n\t\t\t\texpect(response.status).toBe(400);\n\t\t\t});\n\n\t\t\ttest(\"should create a new actor\", async (c) => {\n\t\t\t\tconst { endpoint } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\tconst http = createManagerInspectorClient(`${endpoint}/inspect`, {\n\t\t\t\t\theaders: {\n\t\t\t\t\t\tAuthorization: `Bearer token`,\n\t\t\t\t\t},\n\t\t\t\t});\n\n\t\t\t\tconst response = await http.actors.$post({\n\t\t\t\t\tjson: {\n\t\t\t\t\t\tname: \"default\",\n\t\t\t\t\t\tkey: [\"test-create-actor\"],\n\t\t\t\t\t\tinput: {},\n\t\t\t\t\t},\n\t\t\t\t});\n\n\t\t\t\texpect(response.status).toBe(201);\n\t\t\t\tconst data = await response.json();\n\t\t\t\texpect(data).toEqual(\n\t\t\t\t\texpect.objectContaining({\n\t\t\t\t\t\tid: expect.any(String),\n\t\t\t\t\t\tname: \"default\",\n\t\t\t\t\t\tkey: [\"test-create-actor\"],\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t});\n\n\t\t\ttest(\"should get builds\", async (c) => {\n\t\t\t\tconst { endpoint } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\tconst http = createManagerInspectorClient(`${endpoint}/inspect`, {\n\t\t\t\t\theaders: {\n\t\t\t\t\t\tAuthorization: `Bearer token`,\n\t\t\t\t\t},\n\t\t\t\t});\n\n\t\t\t\tconst response = await http.builds.$get();\n\t\t\t\texpect(response.status).toBe(200);\n\n\t\t\t\tconst data = await response.json();\n\t\t\t\texpect(data).toEqual(\n\t\t\t\t\texpect.arrayContaining([\n\t\t\t\t\t\texpect.objectContaining({ name: expect.any(String) }),\n\t\t\t\t\t]),\n\t\t\t\t);\n\t\t\t});\n\n\t\t\ttest(\"should get actor by id\", async (c) => {\n\t\t\t\tconst { client, endpoint } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create an actor and get its ID\n\t\t\t\tconst handle = await client.counter.create([\"test-get-by-id\"]);\n\t\t\t\tconst actorId = await handle.resolve();\n\n\t\t\t\tconst http = createManagerInspectorClient(`${endpoint}/inspect`, {\n\t\t\t\t\theaders: {\n\t\t\t\t\t\tAuthorization: `Bearer token`,\n\t\t\t\t\t},\n\t\t\t\t});\n\n\t\t\t\tconst response = await http.actor[\":id\"].$get({\n\t\t\t\t\tparam: { id: actorId },\n\t\t\t\t});\n\t\t\t\texpect(response.status).toBe(200);\n\n\t\t\t\tconst data = await response.json();\n\t\t\t\texpect(data).toHaveProperty(\"id\", actorId);\n\t\t\t});\n\n\t\t\ttest(\"should return 404 for non-existent actor\", async (c) => {\n\t\t\t\tconst { endpoint } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\tconst http = createManagerInspectorClient(`${endpoint}/inspect`, {\n\t\t\t\t\theaders: {\n\t\t\t\t\t\tAuthorization: `Bearer token`,\n\t\t\t\t\t},\n\t\t\t\t});\n\n\t\t\t\tconst response = await http.actor[\":id\"].$get({\n\t\t\t\t\tparam: { id: \"non-existent-id\" },\n\t\t\t\t});\n\t\t\t\texpect(response.status).toBe(404);\n\n\t\t\t\tconst data = await response.json();\n\t\t\t\texpect(data).toEqual({ error: \"Actor not found\" });\n\t\t\t});\n\n\t\t\ttest(\"should get bootstrap data\", async (c) => {\n\t\t\t\tconst { client, endpoint } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create at least one actor to ensure bootstrap has data\n\t\t\t\t// Create an actor and get its ID\n\t\t\t\tconst handle = await client.counter.create([\"test-bootstrap\"]);\n\t\t\t\tawait handle.resolve();\n\n\t\t\t\tconst http = createManagerInspectorClient(`${endpoint}/inspect`, {\n\t\t\t\t\theaders: {\n\t\t\t\t\t\tAuthorization: `Bearer token`,\n\t\t\t\t\t},\n\t\t\t\t});\n\n\t\t\t\tconst response = await http.bootstrap.$get();\n\t\t\t\texpect(response.status).toBe(200);\n\n\t\t\t\tconst data = await response.json();\n\t\t\t\texpect(data.actors).toEqual(\n\t\t\t\t\texpect.arrayContaining([\n\t\t\t\t\t\texpect.objectContaining({\n\t\t\t\t\t\t\tkey: [\"test-bootstrap\"],\n\t\t\t\t\t\t\tname: \"counter\",\n\t\t\t\t\t\t}),\n\t\t\t\t\t]),\n\t\t\t\t);\n\t\t\t});\n\t\t});\n\n\t\tdescribe(\"Actor Inspector\", () => {\n\t\t\ttest(\"should handle actor not found\", async (c) => {\n\t\t\t\tconst { endpoint } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\tconst actorId = \"non-existing\";\n\n\t\t\t\tconst http = createActorInspectorClient(`${endpoint}/actors/inspect`, {\n\t\t\t\t\theaders: {\n\t\t\t\t\t\tAuthorization: `Bearer token`,\n\t\t\t\t\t\t[HEADER_ACTOR_QUERY]: JSON.stringify({\n\t\t\t\t\t\t\tgetForId: { name: \"counter\", actorId },\n\t\t\t\t\t\t} satisfies ActorQuery),\n\t\t\t\t\t},\n\t\t\t\t});\n\n\t\t\t\tconst response = await http.ping.$get();\n\t\t\t\texpect(response.ok).toBe(false);\n\t\t\t});\n\t\t\ttest(\"should respond to ping\", async (c) => {\n\t\t\t\tconst { client, endpoint } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\tconst handle = await client.counter.create([\"test-ping\"]);\n\t\t\t\tconst actorId = await handle.resolve();\n\n\t\t\t\tconst http = createActorInspectorClient(`${endpoint}/actors/inspect`, {\n\t\t\t\t\theaders: {\n\t\t\t\t\t\tAuthorization: `Bearer token`,\n\t\t\t\t\t\t[HEADER_ACTOR_QUERY]: JSON.stringify({\n\t\t\t\t\t\t\tgetForId: { name: \"counter\", actorId },\n\t\t\t\t\t\t} satisfies ActorQuery),\n\t\t\t\t\t},\n\t\t\t\t});\n\n\t\t\t\tconst response = await http.ping.$get();\n\t\t\t\texpect(response.status).toBe(200);\n\n\t\t\t\tconst data = await response.json();\n\t\t\t\texpect(data).toEqual({ message: \"pong\" });\n\t\t\t});\n\n\t\t\ttest(\"should get actor state\", async (c) => {\n\t\t\t\tconst { client, endpoint } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\tconst handle = await client.counter.create([\"test-state\"]);\n\t\t\t\tconst actorId = await handle.resolve();\n\n\t\t\t\t// Increment the counter to set some state\n\t\t\t\tawait handle.increment(5);\n\n\t\t\t\tconst http = createActorInspectorClient(`${endpoint}/actors/inspect`, {\n\t\t\t\t\theaders: {\n\t\t\t\t\t\tAuthorization: `Bearer token`,\n\t\t\t\t\t\t[HEADER_ACTOR_QUERY]: JSON.stringify({\n\t\t\t\t\t\t\tgetForId: { name: \"counter\", actorId },\n\t\t\t\t\t\t} satisfies ActorQuery),\n\t\t\t\t\t},\n\t\t\t\t});\n\n\t\t\t\tconst response = await http.state.$get();\n\t\t\t\texpect(response.status).toBe(200);\n\n\t\t\t\tconst data = await response.json();\n\t\t\t\texpect(data).toEqual({\n\t\t\t\t\tenabled: true,\n\t\t\t\t\tstate: expect.objectContaining({\n\t\t\t\t\t\tcount: 5,\n\t\t\t\t\t}),\n\t\t\t\t});\n\t\t\t});\n\n\t\t\ttest(\"should update actor state with replace\", async (c) => {\n\t\t\t\tconst { client, endpoint } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\tconst handle = await client.counter.create([\"test-state-replace\"]);\n\t\t\t\tconst actorId = await handle.resolve();\n\n\t\t\t\tconst http = createActorInspectorClient(`${endpoint}/actors/inspect`, {\n\t\t\t\t\theaders: {\n\t\t\t\t\t\tAuthorization: `Bearer token`,\n\t\t\t\t\t\t[HEADER_ACTOR_QUERY]: JSON.stringify({\n\t\t\t\t\t\t\tgetForId: { name: \"counter\", actorId },\n\t\t\t\t\t\t} satisfies ActorQuery),\n\t\t\t\t\t},\n\t\t\t\t});\n\n\t\t\t\t// Replace the entire state\n\t\t\t\tconst response = await http.state.$patch({\n\t\t\t\t\tjson: {\n\t\t\t\t\t\treplace: { count: 10 },\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\texpect(response.status).toBe(200);\n\n\t\t\t\tconst data = await response.json();\n\t\t\t\texpect(data).toEqual({\n\t\t\t\t\tenabled: true,\n\t\t\t\t\tstate: { count: 10 },\n\t\t\t\t});\n\t\t\t});\n\n\t\t\ttest(\"should update actor state with patch\", async (c) => {\n\t\t\t\tconst { client, endpoint } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\tconst handle = await client.counter.create([\"test-state-patch\"]);\n\t\t\t\tconst actorId = await handle.resolve();\n\n\t\t\t\t// Set initial state\n\t\t\t\tawait handle.increment(3);\n\n\t\t\t\tconst http = createActorInspectorClient(`${endpoint}/actors/inspect`, {\n\t\t\t\t\theaders: {\n\t\t\t\t\t\tAuthorization: `Bearer token`,\n\t\t\t\t\t\t[HEADER_ACTOR_QUERY]: JSON.stringify({\n\t\t\t\t\t\t\tgetForId: { name: \"counter\", actorId },\n\t\t\t\t\t\t} satisfies ActorQuery),\n\t\t\t\t\t},\n\t\t\t\t});\n\n\t\t\t\t// Patch the state\n\t\t\t\tconst response = await http.state.$patch({\n\t\t\t\t\tjson: {\n\t\t\t\t\t\tpatch: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\top: \"replace\",\n\t\t\t\t\t\t\t\tpath: \"/count\",\n\t\t\t\t\t\t\t\tvalue: 7,\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});\n\t\t\t\texpect(response.status).toBe(200);\n\n\t\t\t\tconst data = await response.json();\n\t\t\t\texpect(data).toEqual({\n\t\t\t\t\tenabled: true,\n\t\t\t\t\tstate: expect.objectContaining({\n\t\t\t\t\t\tcount: 7,\n\t\t\t\t\t}),\n\t\t\t\t});\n\t\t\t});\n\n\t\t\ttest(\"should get actor connections\", async (c) => {\n\t\t\t\tconst { client, endpoint } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\tconst handle = await client.counter.create([\"test-connections\"]);\n\t\t\t\tconst actorId = await handle.resolve();\n\t\t\t\thandle.connect();\n\t\t\t\tawait handle.increment(10);\n\n\t\t\t\tconst http = createActorInspectorClient(`${endpoint}/actors/inspect`, {\n\t\t\t\t\theaders: {\n\t\t\t\t\t\tAuthorization: `Bearer token`,\n\t\t\t\t\t\t[HEADER_ACTOR_QUERY]: JSON.stringify({\n\t\t\t\t\t\t\tgetForId: { name: \"counter\", actorId },\n\t\t\t\t\t\t} satisfies ActorQuery),\n\t\t\t\t\t},\n\t\t\t\t});\n\n\t\t\t\tconst response = await http.connections.$get();\n\t\t\t\texpect(response.status).toBe(200);\n\n\t\t\t\tconst data = await response.json();\n\t\t\t\texpect(data.connections).toEqual(\n\t\t\t\t\texpect.arrayContaining([\n\t\t\t\t\t\texpect.objectContaining({\n\t\t\t\t\t\t\tid: expect.any(String),\n\t\t\t\t\t\t}),\n\t\t\t\t\t]),\n\t\t\t\t);\n\t\t\t});\n\n\t\t\ttest(\"should get actor events\", async (c) => {\n\t\t\t\tconst { client, endpoint } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\tconst handle = await client.counter.create([\"test-events\"]);\n\t\t\t\tconst actorId = await handle.resolve();\n\n\t\t\t\thandle.connect();\n\t\t\t\tawait handle.increment(10);\n\n\t\t\t\tconst http = createActorInspectorClient(`${endpoint}/actors/inspect`, {\n\t\t\t\t\theaders: {\n\t\t\t\t\t\tAuthorization: `Bearer token`,\n\t\t\t\t\t\t[HEADER_ACTOR_QUERY]: JSON.stringify({\n\t\t\t\t\t\t\tgetForId: { name: \"counter\", actorId },\n\t\t\t\t\t\t} satisfies ActorQuery),\n\t\t\t\t\t},\n\t\t\t\t});\n\n\t\t\t\tconst response = await http.events.$get();\n\t\t\t\texpect(response.status).toBe(200);\n\n\t\t\t\tconst data = await response.json();\n\t\t\t\texpect(data.events).toEqual(\n\t\t\t\t\texpect.arrayContaining([\n\t\t\t\t\t\texpect.objectContaining({\n\t\t\t\t\t\t\ttype: \"broadcast\",\n\t\t\t\t\t\t\tid: expect.any(String),\n\t\t\t\t\t\t}),\n\t\t\t\t\t]),\n\t\t\t\t);\n\t\t\t});\n\n\t\t\ttest(\"should clear actor events\", async (c) => {\n\t\t\t\tconst { client, endpoint } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\tconst handle = await client.counter.create([\"test-events-clear\"]);\n\t\t\t\tconst actorId = await handle.resolve();\n\n\t\t\t\thandle.connect();\n\t\t\t\tawait handle.increment(10);\n\n\t\t\t\tconst http = createActorInspectorClient(`${endpoint}/actors/inspect`, {\n\t\t\t\t\theaders: {\n\t\t\t\t\t\tAuthorization: `Bearer token`,\n\t\t\t\t\t\t[HEADER_ACTOR_QUERY]: JSON.stringify({\n\t\t\t\t\t\t\tgetForId: { name: \"counter\", actorId },\n\t\t\t\t\t\t} satisfies ActorQuery),\n\t\t\t\t\t},\n\t\t\t\t});\n\n\t\t\t\t{\n\t\t\t\t\tconst response = await http.events.$get();\n\t\t\t\t\texpect(response.status).toBe(200);\n\n\t\t\t\t\tconst data = await response.json();\n\t\t\t\t\texpect(data.events).toEqual(\n\t\t\t\t\t\texpect.arrayContaining([\n\t\t\t\t\t\t\texpect.objectContaining({\n\t\t\t\t\t\t\t\ttype: \"broadcast\",\n\t\t\t\t\t\t\t\tid: expect.any(String),\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}\n\n\t\t\t\tconst response = await http.events.clear.$post();\n\t\t\t\texpect(response.status).toBe(200);\n\t\t\t});\n\n\t\t\ttest(\"should get actor rpcs\", async (c) => {\n\t\t\t\tconst { client, endpoint } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\tconst handle = await client.counter.create([\"test-rpcs\"]);\n\t\t\t\tconst actorId = await handle.resolve();\n\n\t\t\t\tconst http = createActorInspectorClient(`${endpoint}/actors/inspect`, {\n\t\t\t\t\theaders: {\n\t\t\t\t\t\tAuthorization: `Bearer token`,\n\t\t\t\t\t\t[HEADER_ACTOR_QUERY]: JSON.stringify({\n\t\t\t\t\t\t\tgetForId: { name: \"counter\", actorId },\n\t\t\t\t\t\t} satisfies ActorQuery),\n\t\t\t\t\t},\n\t\t\t\t});\n\n\t\t\t\tconst response = await http.rpcs.$get();\n\t\t\t\texpect(response.status).toBe(200);\n\n\t\t\t\tconst data = await response.json();\n\t\t\t\texpect(data).toEqual(\n\t\t\t\t\texpect.objectContaining({\n\t\t\t\t\t\trpcs: expect.arrayContaining([\"increment\", \"getCount\"]),\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t});\n\n\t\t\t// database is not officially supported yet\n\t\t\ttest.skip(\"should get actor database info\", async (c) => {\n\t\t\t\tconst { client, endpoint } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\tconst handle = await client.counter.create([\"test-db\"]);\n\t\t\t\tconst actorId = await handle.resolve();\n\n\t\t\t\tconst http = createActorInspectorClient(`${endpoint}/actors/inspect`, {\n\t\t\t\t\theaders: {\n\t\t\t\t\t\tAuthorization: `Bearer token`,\n\t\t\t\t\t\t[HEADER_ACTOR_QUERY]: JSON.stringify({\n\t\t\t\t\t\t\tgetForId: { name: \"counter\", actorId },\n\t\t\t\t\t\t} satisfies ActorQuery),\n\t\t\t\t\t},\n\t\t\t\t});\n\n\t\t\t\tconst response = await http.db.$get();\n\t\t\t\texpect(response.status).toBe(200);\n\n\t\t\t\tconst data = await response.json();\n\t\t\t\t// Database might be enabled or disabled depending on actor configuration\n\t\t\t\texpect(data).toHaveProperty(\"enabled\");\n\t\t\t\texpect(typeof data.enabled).toBe(\"boolean\");\n\n\t\t\t\tif (data.enabled) {\n\t\t\t\t\texpect(data).toHaveProperty(\"db\");\n\t\t\t\t\texpect(Array.isArray(data.db)).toBe(true);\n\t\t\t\t} else {\n\t\t\t\t\texpect(data.db).toBe(null);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\ttest.skip(\"should execute database query when database is enabled\", async (c) => {\n\t\t\t\tconst { client, endpoint } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\tconst handle = await client.counter.create([\"test-db-query\"]);\n\t\t\t\tconst actorId = await handle.resolve();\n\n\t\t\t\tconst http = createActorInspectorClient(`${endpoint}/actors/inspect`, {\n\t\t\t\t\theaders: {\n\t\t\t\t\t\tAuthorization: `Bearer token`,\n\t\t\t\t\t\t[HEADER_ACTOR_QUERY]: JSON.stringify({\n\t\t\t\t\t\t\tgetForId: { name: \"counter\", actorId },\n\t\t\t\t\t\t} satisfies ActorQuery),\n\t\t\t\t\t},\n\t\t\t\t});\n\n\t\t\t\t// First check if database is enabled\n\t\t\t\tconst dbInfoResponse = await http.db.$get();\n\t\t\t\tconst dbInfo = await dbInfoResponse.json();\n\n\t\t\t\tif (dbInfo.enabled) {\n\t\t\t\t\t// Execute a simple query\n\t\t\t\t\tconst queryResponse = await http.db.$post({\n\t\t\t\t\t\tjson: {\n\t\t\t\t\t\t\tquery: \"SELECT 1 as test\",\n\t\t\t\t\t\t\tparams: [],\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t\texpect(queryResponse.status).toBe(200);\n\n\t\t\t\t\tconst queryData = await queryResponse.json();\n\t\t\t\t\texpect(queryData).toHaveProperty(\"result\");\n\t\t\t\t} else {\n\t\t\t\t\t// If database is not enabled, the POST should return enabled: false\n\t\t\t\t\tconst queryResponse = await http.db.$post({\n\t\t\t\t\t\tjson: {\n\t\t\t\t\t\t\tquery: \"SELECT 1 as test\",\n\t\t\t\t\t\t\tparams: [],\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t\texpect(queryResponse.status).toBe(200);\n\n\t\t\t\t\tconst queryData = await queryResponse.json();\n\t\t\t\t\texpect(queryData).toEqual({ enabled: false });\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t});\n}\n","import { describe, expect, test } from \"vitest\";\nimport type { DriverTestConfig } from \"../mod\";\nimport { setupDriverTest } from \"../utils\";\n\nexport function runActorMetadataTests(driverTestConfig: DriverTestConfig) {\n\tdescribe(\"Actor Metadata Tests\", () => {\n\t\tdescribe(\"Actor Name\", () => {\n\t\t\ttest(\"should provide access to actor name\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Get the actor name\n\t\t\t\tconst handle = client.metadataActor.getOrCreate();\n\t\t\t\tconst actorName = await handle.getActorName();\n\n\t\t\t\t// Verify it matches the expected name\n\t\t\t\texpect(actorName).toBe(\"metadataActor\");\n\t\t\t});\n\n\t\t\ttest(\"should preserve actor name in state during onStart\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Get the stored actor name\n\t\t\t\tconst handle = client.metadataActor.getOrCreate();\n\t\t\t\tconst storedName = await handle.getStoredActorName();\n\n\t\t\t\t// Verify it was stored correctly\n\t\t\t\texpect(storedName).toBe(\"metadataActor\");\n\t\t\t});\n\t\t});\n\n\t\tdescribe(\"Actor Tags\", () => {\n\t\t\ttest(\"should provide access to tags\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create actor and set up test tags\n\t\t\t\tconst handle = client.metadataActor.getOrCreate();\n\t\t\t\tawait handle.setupTestTags({\n\t\t\t\t\tenv: \"test\",\n\t\t\t\t\tpurpose: \"metadata-test\",\n\t\t\t\t});\n\n\t\t\t\t// Get the tags\n\t\t\t\tconst tags = await handle.getTags();\n\n\t\t\t\t// Verify the tags are accessible\n\t\t\t\texpect(tags).toHaveProperty(\"env\");\n\t\t\t\texpect(tags.env).toBe(\"test\");\n\t\t\t\texpect(tags).toHaveProperty(\"purpose\");\n\t\t\t\texpect(tags.purpose).toBe(\"metadata-test\");\n\t\t\t});\n\n\t\t\ttest(\"should allow accessing individual tags\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create actor and set up test tags\n\t\t\t\tconst handle = client.metadataActor.getOrCreate();\n\t\t\t\tawait handle.setupTestTags({\n\t\t\t\t\tcategory: \"test-actor\",\n\t\t\t\t\tversion: \"1.0\",\n\t\t\t\t});\n\n\t\t\t\t// Get individual tags\n\t\t\t\tconst category = await handle.getTag(\"category\");\n\t\t\t\tconst version = await handle.getTag(\"version\");\n\t\t\t\tconst nonexistent = await handle.getTag(\"nonexistent\");\n\n\t\t\t\t// Verify the tag values\n\t\t\t\texpect(category).toBe(\"test-actor\");\n\t\t\t\texpect(version).toBe(\"1.0\");\n\t\t\t\texpect(nonexistent).toBeNull();\n\t\t\t});\n\t\t});\n\n\t\tdescribe(\"Metadata Structure\", () => {\n\t\t\ttest(\"should provide complete metadata object\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create actor and set up test metadata\n\t\t\t\tconst handle = client.metadataActor.getOrCreate();\n\t\t\t\tawait handle.setupTestTags({ type: \"metadata-test\" });\n\t\t\t\tawait handle.setupTestRegion(\"us-west-1\");\n\n\t\t\t\t// Get all metadata\n\t\t\t\tconst metadata = await handle.getMetadata();\n\n\t\t\t\t// Verify structure of metadata\n\t\t\t\texpect(metadata).toHaveProperty(\"name\");\n\t\t\t\texpect(metadata.name).toBe(\"metadataActor\");\n\n\t\t\t\texpect(metadata).toHaveProperty(\"tags\");\n\t\t\t\texpect(metadata.tags).toHaveProperty(\"type\");\n\t\t\t\texpect(metadata.tags.type).toBe(\"metadata-test\");\n\n\t\t\t\t// Region should be set to our test value\n\t\t\t\texpect(metadata).toHaveProperty(\"region\");\n\t\t\t\texpect(metadata.region).toBe(\"us-west-1\");\n\t\t\t});\n\t\t});\n\n\t\tdescribe(\"Region Information\", () => {\n\t\t\ttest(\"should retrieve region information\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create actor and set up test region\n\t\t\t\tconst handle = client.metadataActor.getOrCreate();\n\t\t\t\tawait handle.setupTestRegion(\"eu-central-1\");\n\n\t\t\t\t// Get the region\n\t\t\t\tconst region = await handle.getRegion();\n\n\t\t\t\t// Verify the region is set correctly\n\t\t\t\texpect(region).toBe(\"eu-central-1\");\n\t\t\t});\n\t\t});\n\t});\n}\n","import { describe, expect, test } from \"vitest\";\nimport type { DriverTestConfig } from \"@/driver-test-suite/mod\";\nimport { setupDriverTest } from \"@/driver-test-suite/utils\";\n\nexport function runActorOnStateChangeTests(driverTestConfig: DriverTestConfig) {\n\tdescribe(\"Actor onStateChange Tests\", () => {\n\t\ttest(\"triggers onStateChange when state is modified\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\tconst actor = client.onStateChangeActor.getOrCreate();\n\n\t\t\t// Modify state - should trigger onChange\n\t\t\tawait actor.setValue(10);\n\n\t\t\t// Check that onChange was called\n\t\t\tconst changeCount = await actor.getChangeCount();\n\t\t\texpect(changeCount).toBe(1);\n\t\t});\n\n\t\ttest(\"triggers onChange multiple times for multiple state changes\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\tconst actor = client.onStateChangeActor.getOrCreate();\n\n\t\t\t// Modify state multiple times\n\t\t\tawait actor.incrementMultiple(3);\n\n\t\t\t// Check that onChange was called for each modification\n\t\t\tconst changeCount = await actor.getChangeCount();\n\t\t\texpect(changeCount).toBe(3);\n\t\t});\n\n\t\ttest(\"does NOT trigger onChange for read-only actions\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\tconst actor = client.onStateChangeActor.getOrCreate();\n\n\t\t\t// Set initial value\n\t\t\tawait actor.setValue(5);\n\n\t\t\t// Read value without modifying - should NOT trigger onChange\n\t\t\tconst value = await actor.getValue();\n\t\t\texpect(value).toBe(5);\n\n\t\t\t// Check that onChange was NOT called\n\t\t\tconst changeCount = await actor.getChangeCount();\n\t\t\texpect(changeCount).toBe(1);\n\t\t});\n\n\t\ttest(\"does NOT trigger onChange for computed values\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\tconst actor = client.onStateChangeActor.getOrCreate();\n\n\t\t\t// Set initial value\n\t\t\tawait actor.setValue(3);\n\n\t\t\t// Check that onChange was called\n\t\t\t{\n\t\t\t\tconst changeCount = await actor.getChangeCount();\n\t\t\t\texpect(changeCount).toBe(1);\n\t\t\t}\n\n\t\t\t// Compute value without modifying state - should NOT trigger onChange\n\t\t\tconst doubled = await actor.getDoubled();\n\t\t\texpect(doubled).toBe(6);\n\n\t\t\t// Check that onChange was NOT called\n\t\t\t{\n\t\t\t\tconst changeCount = await actor.getChangeCount();\n\t\t\t\texpect(changeCount).toBe(1);\n\t\t\t}\n\t\t});\n\n\t\ttest(\"simple: connect, call action, dispose does NOT trigger onChange\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\tconst actor = client.onStateChangeActor.getOrCreate();\n\n\t\t\t// Connect to the actor\n\t\t\tconst connection = await actor.connect();\n\n\t\t\t// Call an action that doesn't modify state\n\t\t\tconst value = await connection.getValue();\n\t\t\texpect(value).toBe(0);\n\n\t\t\t// Dispose the connection\n\t\t\tawait connection.dispose();\n\n\t\t\t// Verify that onChange was NOT triggered\n\t\t\tconst changeCount = await actor.getChangeCount();\n\t\t\texpect(changeCount).toBe(0);\n\t\t});\n\t});\n}\n","import { describe, expect, test, vi } from \"vitest\";\nimport type { ActorConnRaw } from \"@/client/actor-conn\";\nimport type { DriverTestConfig } from \"../mod\";\nimport { setupDriverTest } from \"../utils\";\n\nexport function runActorReconnectTests(driverTestConfig: DriverTestConfig) {\n\tdescribe(\"Actor Reconnection Tests\", () => {\n\t\ttest(\"should reconnect and preserve connection state after non-clean disconnect\", async (c) => {\n\t\t\tconst { client, endpoint } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t// Create actor and connect\n\t\t\tconst handle = client.counterConn.getOrCreate([\"test-reconnect\"]);\n\t\t\tconst connection = handle.connect();\n\n\t\t\t// Set an initial count on the connection\n\t\t\tawait connection.increment(5);\n\n\t\t\t// Verify connection count is 1\n\t\t\tconst connCount1 = await connection.getConnectionCount();\n\t\t\texpect(connCount1).toBe(1);\n\n\t\t\t// Force disconnect (non-clean) - simulates network failure\n\t\t\tconst connRaw = connection as unknown as ActorConnRaw;\n\t\t\tawait forceUncleanDisconnect(\n\t\t\t\tendpoint,\n\t\t\t\tconnRaw.actorId!,\n\t\t\t\tconnRaw.connectionId!,\n\t\t\t);\n\n\t\t\t// Wait a bit for the disconnection to be processed\n\t\t\tawait vi.waitFor(\n\t\t\t\tasync () => {\n\t\t\t\t\tconst countAfterReconnect = await connection.getCount();\n\t\t\t\t\texpect(countAfterReconnect).toBe(5); // Should preserve the count\n\t\t\t\t},\n\t\t\t\t{ timeout: 5000, interval: 100 },\n\t\t\t);\n\n\t\t\t// Verify connection count is still 1 (same connection reconnected)\n\t\t\tconst connCount2 = await connection.getConnectionCount();\n\t\t\texpect(connCount2).toBe(1);\n\n\t\t\t// Verify we can still increment the counter\n\t\t\tconst newCount = await connection.getCount();\n\t\t\texpect(newCount).toBe(5);\n\n\t\t\t// Clean up\n\t\t\tawait connection.dispose();\n\t\t});\n\n\t\ttest(\"should not preserve connection state after clean disconnect\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t// Create actor and connect\n\t\t\tconst handle = client.counterConn.getOrCreate([\"test-clean-disconnect\"]);\n\t\t\tconst connection = handle.connect();\n\n\t\t\t// Set an initial count on the connection\n\t\t\tawait connection.increment(10);\n\n\t\t\t// Verify connection count is 1\n\t\t\tconst connCount1 = await connection.getConnectionCount();\n\t\t\texpect(connCount1).toBe(1);\n\n\t\t\t// Clean disconnect\n\t\t\tawait connection.dispose();\n\n\t\t\t// Wait a bit to ensure disconnection is processed\n\t\t\tawait vi.waitFor(\n\t\t\t\tasync () => {\n\t\t\t\t\t// Check that connection count is now 0\n\t\t\t\t\tconst handle2 = client.counterConn.get([\"test-clean-disconnect\"]);\n\t\t\t\t\tconst connCount = await handle2.getConnectionCount();\n\t\t\t\t\t// This counts the current action caller\n\t\t\t\t\texpect(connCount).toBe(1);\n\t\t\t\t},\n\t\t\t\t{ timeout: 5000 },\n\t\t\t);\n\n\t\t\t// Create a new connection\n\t\t\tconst connection2 = handle.connect();\n\n\t\t\t// The count should be reset since it's a new connection\n\t\t\tconst countNewConnection = await connection2.getCount();\n\t\t\texpect(countNewConnection).toBe(0); // Should be reset\n\n\t\t\t// Verify connection count is 1 again (new connection)\n\t\t\tconst connCount3 = await connection2.getConnectionCount();\n\t\t\texpect(connCount3).toBe(1);\n\n\t\t\t// Clean up\n\t\t\tawait connection2.dispose();\n\t\t});\n\n\t\ttest(\"should handle multiple non-clean disconnects and reconnects\", async (c) => {\n\t\t\tconst { client, endpoint } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t// Create actor and connect\n\t\t\tconst handle = client.counterConn.getOrCreate([\n\t\t\t\t\"test-multiple-reconnect\",\n\t\t\t]);\n\t\t\tconst connection = handle.connect();\n\n\t\t\t// Set an initial count\n\t\t\tawait connection.setCount(100);\n\n\t\t\t// Perform multiple disconnect-reconnect cycles\n\t\t\tfor (let i = 0; i < 3; i++) {\n\t\t\t\t// Increment before disconnect\n\t\t\t\tawait connection.increment(1);\n\n\t\t\t\t// Force disconnect\n\t\t\t\tconst connRaw = connection as unknown as ActorConnRaw;\n\t\t\t\tawait forceUncleanDisconnect(\n\t\t\t\t\tendpoint,\n\t\t\t\t\tconnRaw.actorId!,\n\t\t\t\t\tconnRaw.connectionId!,\n\t\t\t\t);\n\n\t\t\t\t// Wait for reconnection and verify state is preserved\n\t\t\t\tawait vi.waitFor(\n\t\t\t\t\tasync () => {\n\t\t\t\t\t\tconst countAfter = await connection.getCount();\n\t\t\t\t\t\texpect(countAfter).toBe(101 + i);\n\t\t\t\t\t},\n\t\t\t\t\t{ timeout: 5000 },\n\t\t\t\t);\n\n\t\t\t\t// Verify connection count remains 1\n\t\t\t\tconst connCount = await connection.getConnectionCount();\n\t\t\t\texpect(connCount).toBe(1);\n\t\t\t}\n\n\t\t\t// Final verification\n\t\t\tconst finalCount = await connection.getCount();\n\t\t\texpect(finalCount).toBe(103);\n\n\t\t\t// Clean up\n\t\t\tawait connection.dispose();\n\t\t});\n\t});\n}\n\nasync function forceUncleanDisconnect(\n\tendpoint: string,\n\tactorId: string,\n\tconnId: string,\n): Promise<void> {\n\tconst response = await fetch(\n\t\t`${endpoint}/.test/force-disconnect?actor=${actorId}&conn=${connId}`,\n\t\t{\n\t\t\tmethod: \"POST\",\n\t\t},\n\t);\n\n\tif (!response.ok) {\n\t\tconst text = await response.text();\n\t\tthrow new Error(`Failed to force disconnect: ${text}`);\n\t}\n}\n","import { describe, expect, test } from \"vitest\";\nimport type { DriverTestConfig } from \"../mod\";\nimport { setupDriverTest } from \"../utils\";\n\nexport function runActorVarsTests(driverTestConfig: DriverTestConfig) {\n\tdescribe(\"Actor Variables\", () => {\n\t\tdescribe(\"Static vars\", () => {\n\t\t\ttest(\"should provide access to static vars\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\tconst instance = client.staticVarActor.getOrCreate();\n\n\t\t\t\t// Test accessing vars\n\t\t\t\tconst result = await instance.getVars();\n\t\t\t\texpect(result).toEqual({ counter: 42, name: \"test-actor\" });\n\n\t\t\t\t// Test accessing specific var property\n\t\t\t\tconst name = await instance.getName();\n\t\t\t\texpect(name).toBe(\"test-actor\");\n\t\t\t});\n\t\t});\n\n\t\tdescribe(\"Deep cloning of static vars\", () => {\n\t\t\ttest(\"should deep clone static vars between actor instances\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create two separate instances\n\t\t\t\tconst instance1 = client.nestedVarActor.getOrCreate([\"instance1\"]);\n\t\t\t\tconst instance2 = client.nestedVarActor.getOrCreate([\"instance2\"]);\n\n\t\t\t\t// Modify vars in the first instance\n\t\t\t\tconst modifiedVars = await instance1.modifyNested();\n\t\t\t\texpect(modifiedVars.nested.value).toBe(\"modified\");\n\t\t\t\texpect(modifiedVars.nested.array).toContain(4);\n\t\t\t\texpect(modifiedVars.nested.obj.key).toBe(\"new-value\");\n\n\t\t\t\t// Check that the second instance still has the original values\n\t\t\t\tconst instance2Vars = await instance2.getVars();\n\t\t\t\texpect(instance2Vars.nested.value).toBe(\"original\");\n\t\t\t\texpect(instance2Vars.nested.array).toEqual([1, 2, 3]);\n\t\t\t\texpect(instance2Vars.nested.obj.key).toBe(\"value\");\n\t\t\t});\n\t\t});\n\n\t\tdescribe(\"createVars\", () => {\n\t\t\ttest(\"should support dynamic vars creation\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create an instance\n\t\t\t\tconst instance = client.dynamicVarActor.getOrCreate();\n\n\t\t\t\t// Test accessing dynamically created vars\n\t\t\t\tconst vars = await instance.getVars();\n\t\t\t\texpect(vars).toHaveProperty(\"random\");\n\t\t\t\texpect(vars).toHaveProperty(\"computed\");\n\t\t\t\texpect(typeof vars.random).toBe(\"number\");\n\t\t\t\texpect(typeof vars.computed).toBe(\"string\");\n\t\t\t\texpect(vars.computed).toMatch(/^Actor-\\d+$/);\n\t\t\t});\n\n\t\t\ttest(\"should create different vars for different instances\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create two separate instances\n\t\t\t\tconst instance1 = client.uniqueVarActor.getOrCreate([\"test1\"]);\n\t\t\t\tconst instance2 = client.uniqueVarActor.getOrCreate([\"test2\"]);\n\n\t\t\t\t// Get vars from both instances\n\t\t\t\tconst vars1 = await instance1.getVars();\n\t\t\t\tconst vars2 = await instance2.getVars();\n\n\t\t\t\t// Verify they have different values\n\t\t\t\texpect(vars1.id).not.toBe(vars2.id);\n\t\t\t});\n\t\t});\n\n\t\tdescribe(\"Driver Context\", () => {\n\t\t\ttest(\"should provide access to driver context\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create an instance\n\t\t\t\tconst instance = client.driverCtxActor.getOrCreate();\n\n\t\t\t\t// Test accessing driver context through vars\n\t\t\t\tconst vars = await instance.getVars();\n\n\t\t\t\t// Driver context might or might not be available depending on the driver\n\t\t\t\t// But the test should run without errors\n\t\t\t\texpect(vars).toHaveProperty(\"hasDriverCtx\");\n\t\t\t});\n\t\t});\n\t});\n}\n","import { describe, expect, test } from \"vitest\";\nimport type { ActorError } from \"@/client/mod\";\nimport type { DriverTestConfig } from \"../mod\";\nimport { setupDriverTest } from \"../utils\";\n\nexport function runManagerDriverTests(driverTestConfig: DriverTestConfig) {\n\tdescribe(\"Manager Driver Tests\", () => {\n\t\tdescribe(\"Client Connection Methods\", () => {\n\t\t\ttest(\"connect() - finds or creates a actor\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Basic connect() with no parameters creates a default actor\n\t\t\t\tconst counterA = client.counter.getOrCreate();\n\t\t\t\tawait counterA.increment(5);\n\n\t\t\t\t// Get the same actor again to verify state persisted\n\t\t\t\tconst counterAAgain = client.counter.getOrCreate();\n\t\t\t\tconst count = await counterAAgain.increment(0);\n\t\t\t\texpect(count).toBe(5);\n\n\t\t\t\t// Connect with key creates a new actor with specific parameters\n\t\t\t\tconst counterB = client.counter.getOrCreate([\"counter-b\", \"testing\"]);\n\n\t\t\t\tawait counterB.increment(10);\n\t\t\t\tconst countB = await counterB.increment(0);\n\t\t\t\texpect(countB).toBe(10);\n\t\t\t});\n\n\t\t\ttest(\"throws ActorAlreadyExists when creating duplicate actors\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create a unique actor with specific key\n\t\t\t\tconst uniqueKey = [\"duplicate-actor-test\", crypto.randomUUID()];\n\t\t\t\tconst counter = client.counter.getOrCreate(uniqueKey);\n\t\t\t\tawait counter.increment(5);\n\n\t\t\t\t// Expect duplicate actor\n\t\t\t\ttry {\n\t\t\t\t\tawait client.counter.create(uniqueKey);\n\t\t\t\t\texpect.fail(\"did not error on duplicate create\");\n\t\t\t\t} catch (err) {\n\t\t\t\t\texpect((err as ActorError).group).toBe(\"actor\");\n\t\t\t\t\texpect((err as ActorError).code).toBe(\"already_exists\");\n\t\t\t\t}\n\n\t\t\t\t// Verify the original actor still works and has its state\n\t\t\t\tconst count = await counter.increment(0);\n\t\t\t\texpect(count).toBe(5);\n\t\t\t});\n\t\t});\n\n\t\tdescribe(\"Connection Options\", () => {\n\t\t\ttest(\"get without create prevents actor creation\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Try to get a nonexistent actor with no create\n\t\t\t\tconst nonexistentId = `nonexistent-${crypto.randomUUID()}`;\n\n\t\t\t\t// Should fail when actor doesn't exist\n\t\t\t\ttry {\n\t\t\t\t\tawait client.counter.get([nonexistentId]).resolve();\n\t\t\t\t\texpect.fail(\"did not error for get\");\n\t\t\t\t} catch (err) {\n\t\t\t\t\texpect((err as ActorError).group).toBe(\"actor\");\n\t\t\t\t\texpect((err as ActorError).code).toBe(\"not_found\");\n\t\t\t\t}\n\n\t\t\t\t// Create the actor\n\t\t\t\tconst createdCounter = client.counter.getOrCreate(nonexistentId);\n\t\t\t\tawait createdCounter.increment(3);\n\n\t\t\t\t// Now no create should work since the actor exists\n\t\t\t\tconst retrievedCounter = client.counter.get(nonexistentId);\n\n\t\t\t\tconst count = await retrievedCounter.increment(0);\n\t\t\t\texpect(count).toBe(3);\n\t\t\t});\n\n\t\t\ttest(\"connection params are passed to actors\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create a actor with connection params\n\t\t\t\t// Note: In a real test we'd verify these are received by the actor,\n\t\t\t\t// but our simple counter actor doesn't use connection params.\n\t\t\t\t// This test just ensures the params are accepted by the driver.\n\t\t\t\tconst counter = client.counter.getOrCreate(undefined, {\n\t\t\t\t\tparams: {\n\t\t\t\t\t\tuserId: \"user-123\",\n\t\t\t\t\t\tauthToken: \"token-abc\",\n\t\t\t\t\t\tsettings: { increment: 5 },\n\t\t\t\t\t},\n\t\t\t\t});\n\n\t\t\t\tawait counter.increment(1);\n\t\t\t\tconst count = await counter.increment(0);\n\t\t\t\texpect(count).toBe(1);\n\t\t\t});\n\t\t});\n\n\t\tdescribe(\"Actor Creation & Retrieval\", () => {\n\t\t\ttest(\"creates and retrieves actors by ID\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create a unique ID for this test\n\t\t\t\tconst uniqueId = `test-counter-${crypto.randomUUID()}`;\n\n\t\t\t\t// Create actor with specific ID\n\t\t\t\tconst counter = client.counter.getOrCreate([uniqueId]);\n\t\t\t\tawait counter.increment(10);\n\n\t\t\t\t// Retrieve the same actor by ID and verify state\n\t\t\t\tconst retrievedCounter = client.counter.getOrCreate([uniqueId]);\n\t\t\t\tconst count = await retrievedCounter.increment(0); // Get current value\n\t\t\t\texpect(count).toBe(10);\n\t\t\t});\n\n\t\t\ttest(\"passes input to actor during creation\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Test data to pass as input\n\t\t\t\tconst testInput = {\n\t\t\t\t\tname: \"test-actor\",\n\t\t\t\t\tvalue: 42,\n\t\t\t\t\tnested: { foo: \"bar\" },\n\t\t\t\t};\n\n\t\t\t\t// Create actor with input\n\t\t\t\tconst actor = await client.inputActor.create(undefined, {\n\t\t\t\t\tinput: testInput,\n\t\t\t\t});\n\n\t\t\t\t// Verify both createState and onCreate received the input\n\t\t\t\tconst inputs = await actor.getInputs();\n\n\t\t\t\t// Input should be available in createState\n\t\t\t\texpect(inputs.initialInput).toEqual(testInput);\n\n\t\t\t\t// Input should also be available in onCreate lifecycle hook\n\t\t\t\texpect(inputs.onCreateInput).toEqual(testInput);\n\t\t\t});\n\n\t\t\ttest(\"input is undefined when not provided\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create actor without providing input\n\t\t\t\tconst actor = await client.inputActor.create();\n\n\t\t\t\t// Get inputs and verify they're undefined\n\t\t\t\tconst inputs = await actor.getInputs();\n\n\t\t\t\t// Should be undefined in createState\n\t\t\t\texpect(inputs.initialInput).toBeUndefined();\n\n\t\t\t\t// Should be undefined in onCreate lifecycle hook too\n\t\t\t\texpect(inputs.onCreateInput).toBeUndefined();\n\t\t\t});\n\n\t\t\ttest(\"getOrCreate passes input to actor during creation\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create a unique key for this test\n\t\t\t\tconst uniqueKey = [`input-test-${crypto.randomUUID()}`];\n\n\t\t\t\t// Test data to pass as input\n\t\t\t\tconst testInput = {\n\t\t\t\t\tname: \"getorcreate-test\",\n\t\t\t\t\tvalue: 100,\n\t\t\t\t\tnested: { baz: \"qux\" },\n\t\t\t\t};\n\n\t\t\t\t// Use getOrCreate with input\n\t\t\t\tconst actor = client.inputActor.getOrCreate(uniqueKey, {\n\t\t\t\t\tcreateWithInput: testInput,\n\t\t\t\t});\n\n\t\t\t\t// Verify both createState and onCreate received the input\n\t\t\t\tconst inputs = await actor.getInputs();\n\n\t\t\t\t// Input should be available in createState\n\t\t\t\texpect(inputs.initialInput).toEqual(testInput);\n\n\t\t\t\t// Input should also be available in onCreate lifecycle hook\n\t\t\t\texpect(inputs.onCreateInput).toEqual(testInput);\n\n\t\t\t\t// Verify that calling getOrCreate again with the same key\n\t\t\t\t// returns the existing actor and doesn't create a new one\n\t\t\t\tconst existingActor = client.inputActor.getOrCreate(uniqueKey);\n\t\t\t\tconst existingInputs = await existingActor.getInputs();\n\n\t\t\t\t// Should still have the original inputs\n\t\t\t\texpect(existingInputs.initialInput).toEqual(testInput);\n\t\t\t\texpect(existingInputs.onCreateInput).toEqual(testInput);\n\t\t\t});\n\n\t\t\t// TODO: Correctly test region for each provider\n\t\t\t//test(\"creates and retrieves actors with region\", async (c) => {\n\t\t\t//\tconst { client } = await setupDriverTest(c,\n\t\t\t//\t\tdriverTestConfig,\n\t\t\t//\t\tCOUNTER_APP_PATH\n\t\t\t//\t);\n\t\t\t//\n\t\t\t//\t// Create actor with a specific region\n\t\t\t//\tconst counter = client.counter.getOrCreate({\n\t\t\t//\t\tcreate: {\n\t\t\t//\t\t\tkey: [\"metadata-test\", \"testing\"],\n\t\t\t//\t\t\tregion: \"test-region\",\n\t\t\t//\t\t},\n\t\t\t//\t});\n\t\t\t//\n\t\t\t//\t// Set state to identify this specific instance\n\t\t\t//\tawait counter.increment(42);\n\t\t\t//\n\t\t\t//\t// Retrieve by ID (since metadata is not used for retrieval)\n\t\t\t//\tconst retrievedCounter = client.counter.getOrCreate([\"metadata-test\"]);\n\t\t\t//\n\t\t\t//\t// Verify it's the same instance\n\t\t\t//\tconst count = await retrievedCounter.increment(0);\n\t\t\t//\texpect(count).toBe(42);\n\t\t\t//});\n\t\t});\n\n\t\tdescribe(\"Key Matching\", () => {\n\t\t\ttest(\"matches actors only with exactly the same keys\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create actor with multiple keys\n\t\t\t\tconst originalCounter = client.counter.getOrCreate([\n\t\t\t\t\t\"counter-match\",\n\t\t\t\t\t\"test\",\n\t\t\t\t\t\"us-east\",\n\t\t\t\t]);\n\t\t\t\tawait originalCounter.increment(10);\n\n\t\t\t\t// Should match with exact same keys\n\t\t\t\tconst exactMatchCounter = client.counter.getOrCreate([\n\t\t\t\t\t\"counter-match\",\n\t\t\t\t\t\"test\",\n\t\t\t\t\t\"us-east\",\n\t\t\t\t]);\n\t\t\t\tconst exactMatchCount = await exactMatchCounter.increment(0);\n\t\t\t\texpect(exactMatchCount).toBe(10);\n\n\t\t\t\t// Should NOT match with subset of keys - should create new actor\n\t\t\t\tconst subsetMatchCounter = client.counter.getOrCreate([\n\t\t\t\t\t\"counter-match\",\n\t\t\t\t\t\"test\",\n\t\t\t\t]);\n\t\t\t\tconst subsetMatchCount = await subsetMatchCounter.increment(0);\n\t\t\t\texpect(subsetMatchCount).toBe(0); // Should be a new counter with 0\n\n\t\t\t\t// Should NOT match with just one key - should create new actor\n\t\t\t\tconst singleKeyCounter = client.counter.getOrCreate([\"counter-match\"]);\n\t\t\t\tconst singleKeyCount = await singleKeyCounter.increment(0);\n\t\t\t\texpect(singleKeyCount).toBe(0); // Should be a new counter with 0\n\t\t\t});\n\n\t\t\ttest(\"string key matches array with single string key\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create actor with string key\n\t\t\t\tconst stringKeyCounter = client.counter.getOrCreate(\"string-key-test\");\n\t\t\t\tawait stringKeyCounter.increment(7);\n\n\t\t\t\t// Should match with equivalent array key\n\t\t\t\tconst arrayKeyCounter = client.counter.getOrCreate([\"string-key-test\"]);\n\t\t\t\tconst count = await arrayKeyCounter.increment(0);\n\t\t\t\texpect(count).toBe(7);\n\t\t\t});\n\n\t\t\ttest(\"undefined key matches empty array key and no key\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create actor with undefined key\n\t\t\t\tconst undefinedKeyCounter = client.counter.getOrCreate(undefined);\n\t\t\t\tawait undefinedKeyCounter.increment(12);\n\n\t\t\t\t// Should match with empty array key\n\t\t\t\tconst emptyArrayKeyCounter = client.counter.getOrCreate([]);\n\t\t\t\tconst emptyArrayCount = await emptyArrayKeyCounter.increment(0);\n\t\t\t\texpect(emptyArrayCount).toBe(12);\n\n\t\t\t\t// Should match with no key\n\t\t\t\tconst noKeyCounter = client.counter.getOrCreate();\n\t\t\t\tconst noKeyCount = await noKeyCounter.increment(0);\n\t\t\t\texpect(noKeyCount).toBe(12);\n\t\t\t});\n\n\t\t\ttest(\"no keys does not match actors with keys\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create counter with keys\n\t\t\t\tconst keyedCounter = client.counter.getOrCreate([\n\t\t\t\t\t\"counter-with-keys\",\n\t\t\t\t\t\"special\",\n\t\t\t\t]);\n\t\t\t\tawait keyedCounter.increment(15);\n\n\t\t\t\t// Should not match when searching with no keys\n\t\t\t\tconst noKeysCounter = client.counter.getOrCreate();\n\t\t\t\tconst count = await noKeysCounter.increment(10);\n\t\t\t\texpect(count).toBe(10);\n\t\t\t});\n\n\t\t\ttest(\"actors with keys match actors with no keys\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create a counter with no keys\n\t\t\t\tconst noKeysCounter = client.counter.getOrCreate();\n\t\t\t\tawait noKeysCounter.increment(25);\n\n\t\t\t\t// Get counter with keys - should create a new one\n\t\t\t\tconst keyedCounter = client.counter.getOrCreate([\n\t\t\t\t\t\"new-counter\",\n\t\t\t\t\t\"prod\",\n\t\t\t\t]);\n\t\t\t\tconst keyedCount = await keyedCounter.increment(0);\n\n\t\t\t\t// Should be a new counter, not the one created above\n\t\t\t\texpect(keyedCount).toBe(0);\n\t\t\t});\n\t\t});\n\n\t\tdescribe(\"Multiple Actor Instances\", () => {\n\t\t\t// TODO: This test is flakey https://github.com/rivet-dev/rivetkit/issues/873\n\t\t\ttest(\"creates multiple actor instances of the same type\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create multiple instances with different IDs\n\t\t\t\tconst instance1 = client.counter.getOrCreate([\"multi-1\"]);\n\t\t\t\tconst instance2 = client.counter.getOrCreate([\"multi-2\"]);\n\t\t\t\tconst instance3 = client.counter.getOrCreate([\"multi-3\"]);\n\n\t\t\t\t// Set different states\n\t\t\t\tawait instance1.increment(1);\n\t\t\t\tawait instance2.increment(2);\n\t\t\t\tawait instance3.increment(3);\n\n\t\t\t\t// Retrieve all instances again\n\t\t\t\tconst retrieved1 = client.counter.getOrCreate([\"multi-1\"]);\n\t\t\t\tconst retrieved2 = client.counter.getOrCreate([\"multi-2\"]);\n\t\t\t\tconst retrieved3 = client.counter.getOrCreate([\"multi-3\"]);\n\n\t\t\t\t// Verify separate state\n\t\t\t\texpect(await retrieved1.increment(0)).toBe(1);\n\t\t\t\texpect(await retrieved2.increment(0)).toBe(2);\n\t\t\t\texpect(await retrieved3.increment(0)).toBe(3);\n\t\t\t});\n\n\t\t\ttest(\"handles default instance with no explicit ID\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Get default instance (no ID specified)\n\t\t\t\tconst defaultCounter = client.counter.getOrCreate();\n\n\t\t\t\t// Set state\n\t\t\t\tawait defaultCounter.increment(5);\n\n\t\t\t\t// Get default instance again\n\t\t\t\tconst sameDefaultCounter = client.counter.getOrCreate();\n\n\t\t\t\t// Verify state is maintained\n\t\t\t\tconst count = await sameDefaultCounter.increment(0);\n\t\t\t\texpect(count).toBe(5);\n\t\t\t});\n\t\t});\n\t});\n}\n","import { describe, expect, test } from \"vitest\";\nimport type { DriverTestConfig } from \"../mod\";\nimport { setupDriverTest } from \"../utils\";\n\nexport function runRawHttpTests(driverTestConfig: DriverTestConfig) {\n\tdescribe(\"raw http\", () => {\n\t\ttest(\"should handle raw HTTP GET requests\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\t\t\tconst actor = client.rawHttpActor.getOrCreate([\"test\"]);\n\n\t\t\t// Test the hello endpoint\n\t\t\tconst helloResponse = await actor.fetch(\"api/hello\");\n\t\t\texpect(helloResponse.ok).toBe(true);\n\t\t\tconst helloData = await helloResponse.json();\n\t\t\texpect(helloData).toEqual({ message: \"Hello from actor!\" });\n\t\t});\n\n\t\ttest(\"should handle raw HTTP POST requests with echo\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\t\t\tconst actor = client.rawHttpActor.getOrCreate([\"test\"]);\n\n\t\t\tconst testData = { test: \"data\", number: 123 };\n\t\t\tconst echoResponse = await actor.fetch(\"api/echo\", {\n\t\t\t\tmethod: \"POST\",\n\t\t\t\theaders: {\n\t\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t},\n\t\t\t\tbody: JSON.stringify(testData),\n\t\t\t});\n\n\t\t\texpect(echoResponse.ok).toBe(true);\n\t\t\tconst echoData = await echoResponse.json();\n\t\t\texpect(echoData).toEqual(testData);\n\t\t});\n\n\t\ttest(\"should track state across raw HTTP requests\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\t\t\tconst actor = client.rawHttpActor.getOrCreate([\"state-test\"]);\n\n\t\t\t// Make a few requests\n\t\t\tawait actor.fetch(\"api/hello\");\n\t\t\tawait actor.fetch(\"api/hello\");\n\t\t\tawait actor.fetch(\"api/state\");\n\n\t\t\t// Check the state endpoint\n\t\t\tconst stateResponse = await actor.fetch(\"api/state\");\n\t\t\texpect(stateResponse.ok).toBe(true);\n\t\t\tconst stateData = (await stateResponse.json()) as {\n\t\t\t\trequestCount: number;\n\t\t\t};\n\t\t\texpect(stateData.requestCount).toBe(4); // 4 total requests\n\t\t});\n\n\t\ttest(\"should pass headers correctly\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\t\t\tconst actor = client.rawHttpActor.getOrCreate([\"headers-test\"]);\n\n\t\t\tconst customHeaders = {\n\t\t\t\t\"X-Custom-Header\": \"test-value\",\n\t\t\t\t\"X-Another-Header\": \"another-value\",\n\t\t\t};\n\n\t\t\tconst response = await actor.fetch(\"api/headers\", {\n\t\t\t\theaders: customHeaders,\n\t\t\t});\n\n\t\t\texpect(response.ok).toBe(true);\n\t\t\tconst headers = (await response.json()) as Record<string, string>;\n\t\t\texpect(headers[\"x-custom-header\"]).toBe(\"test-value\");\n\t\t\texpect(headers[\"x-another-header\"]).toBe(\"another-value\");\n\t\t});\n\n\t\ttest(\"should return 404 for unhandled paths\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\t\t\tconst actor = client.rawHttpActor.getOrCreate([\"404-test\"]);\n\n\t\t\tconst response = await actor.fetch(\"api/nonexistent\");\n\t\t\texpect(response.ok).toBe(false);\n\t\t\texpect(response.status).toBe(404);\n\t\t});\n\n\t\ttest(\"should return 404 when no onFetch handler defined\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\t\t\tconst actor = client.rawHttpNoHandlerActor.getOrCreate([\"no-handler\"]);\n\n\t\t\tconst response = await actor.fetch(\"api/anything\");\n\t\t\texpect(response.ok).toBe(false);\n\t\t\texpect(response.status).toBe(404);\n\n\t\t\t// No actions available without onFetch handler\n\t\t});\n\n\t\ttest(\"should return 500 error when onFetch returns void\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\t\t\tconst actor = client.rawHttpVoidReturnActor.getOrCreate([\"void-return\"]);\n\n\t\t\tconst response = await actor.fetch(\"api/anything\");\n\t\t\texpect(response.ok).toBe(false);\n\t\t\texpect(response.status).toBe(500);\n\n\t\t\t// Check error message - response might be CBOR encoded\n\t\t\ttry {\n\t\t\t\tconst errorData = (await response.json()) as { message: string };\n\t\t\t\texpect(errorData.message).toContain(\n\t\t\t\t\t\"onFetch handler must return a Response\",\n\t\t\t\t);\n\t\t\t} catch {\n\t\t\t\t// If JSON parsing fails, just check that we got a 500 error\n\t\t\t\t// The error details are already validated by the status code\n\t\t\t}\n\n\t\t\t// No actions available when onFetch returns void\n\t\t});\n\n\t\ttest(\"should handle different HTTP methods\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\t\t\tconst actor = client.rawHttpActor.getOrCreate([\"methods-test\"]);\n\n\t\t\t// Test various HTTP methods\n\t\t\tconst methods = [\"GET\", \"POST\", \"PUT\", \"DELETE\", \"PATCH\"];\n\n\t\t\tfor (const method of methods) {\n\t\t\t\tconst response = await actor.fetch(\"api/echo\", {\n\t\t\t\t\tmethod,\n\t\t\t\t\tbody: [\"POST\", \"PUT\", \"PATCH\"].includes(method)\n\t\t\t\t\t\t? JSON.stringify({ method })\n\t\t\t\t\t\t: undefined,\n\t\t\t\t});\n\n\t\t\t\t// Echo endpoint only handles POST, others should fall through to 404\n\t\t\t\tif (method === \"POST\") {\n\t\t\t\t\texpect(response.ok).toBe(true);\n\t\t\t\t\tconst data = await response.json();\n\t\t\t\t\texpect(data).toEqual({ method });\n\t\t\t\t} else if (method === \"GET\") {\n\t\t\t\t\t// GET to echo should return 404\n\t\t\t\t\texpect(response.status).toBe(404);\n\t\t\t\t} else {\n\t\t\t\t\t// Other methods with body should also return 404\n\t\t\t\t\texpect(response.status).toBe(404);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\ttest(\"should handle binary data\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\t\t\tconst actor = client.rawHttpActor.getOrCreate([\"binary-test\"]);\n\n\t\t\t// Send binary data\n\t\t\tconst binaryData = new Uint8Array([1, 2, 3, 4, 5]);\n\t\t\tconst response = await actor.fetch(\"api/echo\", {\n\t\t\t\tmethod: \"POST\",\n\t\t\t\theaders: {\n\t\t\t\t\t\"Content-Type\": \"application/octet-stream\",\n\t\t\t\t},\n\t\t\t\tbody: binaryData,\n\t\t\t});\n\n\t\t\texpect(response.ok).toBe(true);\n\t\t\tconst responseBuffer = await response.arrayBuffer();\n\t\t\tconst responseArray = new Uint8Array(responseBuffer);\n\t\t\texpect(Array.from(responseArray)).toEqual([1, 2, 3, 4, 5]);\n\t\t});\n\n\t\ttest(\"should work with Hono router using createVars\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\t\t\tconst actor = client.rawHttpHonoActor.getOrCreate([\"hono-test\"]);\n\n\t\t\t// Test root endpoint\n\t\t\tconst rootResponse = await actor.fetch(\"/\");\n\t\t\texpect(rootResponse.ok).toBe(true);\n\t\t\tconst rootData = await rootResponse.json();\n\t\t\texpect(rootData).toEqual({ message: \"Welcome to Hono actor!\" });\n\n\t\t\t// Test GET all users\n\t\t\tconst usersResponse = await actor.fetch(\"/users\");\n\t\t\texpect(usersResponse.ok).toBe(true);\n\t\t\tconst users = await usersResponse.json();\n\t\t\texpect(users).toEqual([\n\t\t\t\t{ id: 1, name: \"Alice\" },\n\t\t\t\t{ id: 2, name: \"Bob\" },\n\t\t\t]);\n\n\t\t\t// Test GET single user\n\t\t\tconst userResponse = await actor.fetch(\"/users/1\");\n\t\t\texpect(userResponse.ok).toBe(true);\n\t\t\tconst user = await userResponse.json();\n\t\t\texpect(user).toEqual({ id: 1, name: \"Alice\" });\n\n\t\t\t// Test POST new user\n\t\t\tconst newUser = { name: \"Charlie\" };\n\t\t\tconst createResponse = await actor.fetch(\"/users\", {\n\t\t\t\tmethod: \"POST\",\n\t\t\t\theaders: { \"Content-Type\": \"application/json\" },\n\t\t\t\tbody: JSON.stringify(newUser),\n\t\t\t});\n\t\t\texpect(createResponse.ok).toBe(true);\n\t\t\texpect(createResponse.status).toBe(201);\n\t\t\tconst createdUser = await createResponse.json();\n\t\t\texpect(createdUser).toEqual({ id: 3, name: \"Charlie\" });\n\n\t\t\t// Test PUT update user\n\t\t\tconst updateData = { name: \"Alice Updated\" };\n\t\t\tconst updateResponse = await actor.fetch(\"/users/1\", {\n\t\t\t\tmethod: \"PUT\",\n\t\t\t\theaders: { \"Content-Type\": \"application/json\" },\n\t\t\t\tbody: JSON.stringify(updateData),\n\t\t\t});\n\t\t\texpect(updateResponse.ok).toBe(true);\n\t\t\tconst updatedUser = await updateResponse.json();\n\t\t\texpect(updatedUser).toEqual({ id: 1, name: \"Alice Updated\" });\n\n\t\t\t// Test DELETE user\n\t\t\tconst deleteResponse = await actor.fetch(\"/users/2\", {\n\t\t\t\tmethod: \"DELETE\",\n\t\t\t});\n\t\t\texpect(deleteResponse.ok).toBe(true);\n\t\t\tconst deleteResult = await deleteResponse.json();\n\t\t\texpect(deleteResult).toEqual({ message: \"User 2 deleted\" });\n\n\t\t\t// Test 404 for non-existent route\n\t\t\tconst notFoundResponse = await actor.fetch(\"/api/unknown\");\n\t\t\texpect(notFoundResponse.ok).toBe(false);\n\t\t\texpect(notFoundResponse.status).toBe(404);\n\n\t\t\t// No actions available on Hono actor\n\t\t});\n\n\t\ttest(\"should handle paths with and without leading slashes\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\t\t\tconst actor = client.rawHttpActor.getOrCreate([\"path-test\"]);\n\n\t\t\t// Test path without leading slash\n\t\t\tconst responseWithoutSlash = await actor.fetch(\"api/hello\");\n\t\t\texpect(responseWithoutSlash.ok).toBe(true);\n\t\t\tconst dataWithoutSlash = await responseWithoutSlash.json();\n\t\t\texpect(dataWithoutSlash).toEqual({ message: \"Hello from actor!\" });\n\n\t\t\t// Test path with leading slash\n\t\t\tconst responseWithSlash = await actor.fetch(\"/api/hello\");\n\t\t\texpect(responseWithSlash.ok).toBe(true);\n\t\t\tconst dataWithSlash = await responseWithSlash.json();\n\t\t\texpect(dataWithSlash).toEqual({ message: \"Hello from actor!\" });\n\n\t\t\t// Both should work the same way\n\t\t});\n\n\t\ttest(\"should not create double slashes in request URLs\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\t\t\t// Create a special actor that logs the request URL\n\t\t\tconst actor = client.rawHttpHonoActor.getOrCreate([\"url-test\"]);\n\n\t\t\t// Test with leading slash - this was causing double slashes\n\t\t\tconst response = await actor.fetch(\"/users\");\n\t\t\texpect(response.ok).toBe(true);\n\n\t\t\t// The Hono router should receive a clean path without double slashes\n\t\t\t// If there were double slashes, Hono would not match the route correctly\n\t\t\tconst data = await response.json();\n\t\t\texpect(data).toEqual([\n\t\t\t\t{ id: 1, name: \"Alice\" },\n\t\t\t\t{ id: 2, name: \"Bob\" },\n\t\t\t]);\n\t\t});\n\n\t\ttest(\"should handle forwarded requests correctly without double slashes\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\t\t\tconst actor = client.rawHttpHonoActor.getOrCreate([\"forward-test\"]);\n\n\t\t\t// Simulate what the example does - pass path as string and Request as init\n\t\t\tconst truncatedPath = \"/users\";\n\t\t\tconst url = new URL(truncatedPath, \"http://example.com\");\n\t\t\tconst newRequest = new Request(url, {\n\t\t\t\tmethod: \"GET\",\n\t\t\t});\n\n\t\t\t// This simulates calling actor.fetch(truncatedPath, newRequest)\n\t\t\t// which was causing double slashes in the example\n\t\t\tconst response = await actor.fetch(truncatedPath, newRequest as any);\n\t\t\texpect(response.ok).toBe(true);\n\t\t\tconst users = await response.json();\n\t\t\texpect(users).toEqual([\n\t\t\t\t{ id: 1, name: \"Alice\" },\n\t\t\t\t{ id: 2, name: \"Bob\" },\n\t\t\t]);\n\t\t});\n\n\t\ttest(\"example fix: should properly forward requests using just Request object\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\t\t\tconst actor = client.rawHttpHonoActor.getOrCreate([\"forward-fix\"]);\n\n\t\t\t// The correct way - just pass the Request object\n\t\t\tconst truncatedPath = \"/users/1\";\n\t\t\tconst url = new URL(truncatedPath, \"http://example.com\");\n\t\t\tconst newRequest = new Request(url, {\n\t\t\t\tmethod: \"GET\",\n\t\t\t});\n\n\t\t\t// Correct usage - just pass the Request\n\t\t\tconst response = await actor.fetch(newRequest);\n\t\t\texpect(response.ok).toBe(true);\n\t\t\tconst user = await response.json();\n\t\t\texpect(user).toEqual({ id: 1, name: \"Alice\" });\n\t\t});\n\n\t\ttest(\"should support standard fetch API with URL and Request objects\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\t\t\tconst actor = client.rawHttpActor.getOrCreate([\"fetch-api-test\"]);\n\n\t\t\t// Test with URL object\n\t\t\tconst url = new URL(\"/api/echo\", \"http://example.com\");\n\t\t\tconst urlResponse = await actor.fetch(url, {\n\t\t\t\tmethod: \"POST\",\n\t\t\t\theaders: { \"Content-Type\": \"application/json\" },\n\t\t\t\tbody: JSON.stringify({ from: \"URL object\" }),\n\t\t\t});\n\t\t\texpect(urlResponse.ok).toBe(true);\n\t\t\tconst urlData = await urlResponse.json();\n\t\t\texpect(urlData).toEqual({ from: \"URL object\" });\n\n\t\t\t// Test with Request object\n\t\t\tconst request = new Request(\"http://example.com/api/echo\", {\n\t\t\t\tmethod: \"POST\",\n\t\t\t\theaders: { \"Content-Type\": \"application/json\" },\n\t\t\t\tbody: JSON.stringify({ from: \"Request object\" }),\n\t\t\t});\n\t\t\tconst requestResponse = await actor.fetch(request);\n\t\t\texpect(requestResponse.ok).toBe(true);\n\t\t\tconst requestData = await requestResponse.json();\n\t\t\texpect(requestData).toEqual({ from: \"Request object\" });\n\n\t\t\t// Test with Request object and additional init params\n\t\t\tconst request2 = new Request(\"http://example.com/api/headers\", {\n\t\t\t\tmethod: \"GET\",\n\t\t\t\theaders: { \"X-Original\": \"request-header\" },\n\t\t\t});\n\t\t\tconst overrideResponse = await actor.fetch(request2, {\n\t\t\t\theaders: { \"X-Override\": \"init-header\" },\n\t\t\t});\n\t\t\texpect(overrideResponse.ok).toBe(true);\n\t\t\tconst headers = (await overrideResponse.json()) as Record<string, string>;\n\t\t\texpect(headers[\"x-override\"]).toBe(\"init-header\");\n\t\t\t// Original headers should be present too\n\t\t\texpect(headers[\"x-original\"]).toBe(\"request-header\");\n\t\t});\n\t});\n}\n","import { describe, expect, test } from \"vitest\";\nimport { z } from \"zod\";\nimport { registry } from \"../../../fixtures/driver-test-suite/registry\";\nimport type { DriverTestConfig } from \"../mod\";\nimport { setupDriverTest } from \"../utils\";\n\nexport function runRawHttpRequestPropertiesTests(\n\tdriverTestConfig: DriverTestConfig,\n) {\n\tdescribe(\"raw http request properties\", () => {\n\t\ttest(\"should pass all Request properties correctly to onFetch\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\t\t\tconst actor = client.rawHttpRequestPropertiesActor.getOrCreate([\"test\"]);\n\n\t\t\t// Test basic request properties\n\t\t\tconst response = await actor.fetch(\"test/path?foo=bar&baz=qux\", {\n\t\t\t\tmethod: \"POST\",\n\t\t\t\theaders: {\n\t\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t\t\"X-Custom-Header\": \"custom-value\",\n\t\t\t\t\tAuthorization: \"Bearer test-token\",\n\t\t\t\t},\n\t\t\t\tbody: JSON.stringify({ test: \"data\" }),\n\t\t\t});\n\n\t\t\texpect(response.ok).toBe(true);\n\t\t\tconst data = (await response.json()) as any;\n\n\t\t\t// Verify URL properties\n\t\t\texpect(data.url).toContain(\"/test/path?foo=bar&baz=qux\");\n\t\t\texpect(data.pathname).toBe(\"/test/path\");\n\t\t\texpect(data.search).toBe(\"?foo=bar&baz=qux\");\n\t\t\texpect(data.searchParams).toEqual({\n\t\t\t\tfoo: \"bar\",\n\t\t\t\tbaz: \"qux\",\n\t\t\t});\n\n\t\t\t// Verify method\n\t\t\texpect(data.method).toBe(\"POST\");\n\n\t\t\t// Verify headers\n\t\t\texpect(data.headers[\"content-type\"]).toBe(\"application/json\");\n\t\t\texpect(data.headers[\"x-custom-header\"]).toBe(\"custom-value\");\n\t\t\texpect(data.headers[\"authorization\"]).toBe(\"Bearer test-token\");\n\n\t\t\t// Verify body\n\t\t\texpect(data.body).toEqual({ test: \"data\" });\n\t\t});\n\n\t\ttest(\"should handle GET requests with no body\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\t\t\tconst actor = client.rawHttpRequestPropertiesActor.getOrCreate([\"test\"]);\n\n\t\t\tconst response = await actor.fetch(\"test/get\", {\n\t\t\t\tmethod: \"GET\",\n\t\t\t});\n\n\t\t\texpect(response.ok).toBe(true);\n\t\t\tconst data = (await response.json()) as any;\n\n\t\t\texpect(data.method).toBe(\"GET\");\n\t\t\texpect(data.body).toBeNull();\n\t\t});\n\n\t\ttest(\"should handle different content types\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\t\t\tconst actor = client.rawHttpRequestPropertiesActor.getOrCreate([\"test\"]);\n\n\t\t\t// Test form data\n\t\t\tconst formData = new URLSearchParams();\n\t\t\tformData.append(\"field1\", \"value1\");\n\t\t\tformData.append(\"field2\", \"value2\");\n\n\t\t\tconst formResponse = await actor.fetch(\"test/form\", {\n\t\t\t\tmethod: \"POST\",\n\t\t\t\theaders: {\n\t\t\t\t\t\"Content-Type\": \"application/x-www-form-urlencoded\",\n\t\t\t\t},\n\t\t\t\tbody: formData.toString(),\n\t\t\t});\n\n\t\t\texpect(formResponse.ok).toBe(true);\n\t\t\tconst formResult = (await formResponse.json()) as any;\n\t\t\texpect(formResult.headers[\"content-type\"]).toBe(\n\t\t\t\t\"application/x-www-form-urlencoded\",\n\t\t\t);\n\t\t\texpect(formResult.bodyText).toBe(\"field1=value1&field2=value2\");\n\n\t\t\t// Test plain text\n\t\t\tconst textResponse = await actor.fetch(\"test/text\", {\n\t\t\t\tmethod: \"POST\",\n\t\t\t\theaders: {\n\t\t\t\t\t\"Content-Type\": \"text/plain\",\n\t\t\t\t},\n\t\t\t\tbody: \"Hello, World!\",\n\t\t\t});\n\n\t\t\texpect(textResponse.ok).toBe(true);\n\t\t\tconst textResult = (await textResponse.json()) as any;\n\t\t\texpect(textResult.headers[\"content-type\"]).toBe(\"text/plain\");\n\t\t\texpect(textResult.bodyText).toBe(\"Hello, World!\");\n\t\t});\n\n\t\ttest(\"should preserve all header casing and values\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\t\t\tconst actor = client.rawHttpRequestPropertiesActor.getOrCreate([\"test\"]);\n\n\t\t\tconst response = await actor.fetch(\"test/headers\", {\n\t\t\t\theaders: {\n\t\t\t\t\tAccept: \"application/json\",\n\t\t\t\t\t\"Accept-Language\": \"en-US,en;q=0.9\",\n\t\t\t\t\t\"Cache-Control\": \"no-cache\",\n\t\t\t\t\t\"User-Agent\": \"RivetKit-Test/1.0\",\n\t\t\t\t\t\"X-Request-ID\": \"12345\",\n\t\t\t\t},\n\t\t\t});\n\n\t\t\texpect(response.ok).toBe(true);\n\t\t\tconst data = (await response.json()) as any;\n\n\t\t\t// Headers should be normalized to lowercase\n\t\t\texpect(data.headers[\"accept\"]).toBe(\"application/json\");\n\t\t\texpect(data.headers[\"accept-language\"]).toBe(\"en-US,en;q=0.9\");\n\t\t\texpect(data.headers[\"cache-control\"]).toBe(\"no-cache\");\n\t\t\t// User-Agent might be overwritten by the HTTP client, so just check it exists\n\t\t\texpect(data.headers[\"user-agent\"]).toBeTruthy();\n\t\t\texpect(data.headers[\"x-request-id\"]).toBe(\"12345\");\n\t\t});\n\n\t\ttest(\"should handle empty and special URL paths\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\t\t\tconst actor = client.rawHttpRequestPropertiesActor.getOrCreate([\"test\"]);\n\n\t\t\t// Test root path\n\t\t\tconst rootResponse = await actor.fetch(\"\");\n\t\t\texpect(rootResponse.ok).toBe(true);\n\t\t\tconst rootData = (await rootResponse.json()) as any;\n\t\t\texpect(rootData.pathname).toBe(\"/\");\n\n\t\t\t// Test path with special characters\n\t\t\tconst specialResponse = await actor.fetch(\n\t\t\t\t\"test/path%20with%20spaces/and%2Fslashes\",\n\t\t\t);\n\t\t\texpect(specialResponse.ok).toBe(true);\n\t\t\tconst specialData = (await specialResponse.json()) as any;\n\t\t\t// Note: The URL path may or may not be decoded depending on the HTTP client/server\n\t\t\t// Just verify it contains the expected segments\n\t\t\texpect(specialData.pathname).toMatch(/path.*with.*spaces.*and.*slashes/);\n\n\t\t\t// Test path with fragment (should be ignored in server-side)\n\t\t\tconst fragmentResponse = await actor.fetch(\"test/path#fragment\");\n\t\t\texpect(fragmentResponse.ok).toBe(true);\n\t\t\tconst fragmentData = (await fragmentResponse.json()) as any;\n\t\t\texpect(fragmentData.pathname).toBe(\"/test/path\");\n\t\t\texpect(fragmentData.hash).toBe(\"\"); // Fragments are not sent to server\n\t\t});\n\n\t\ttest(\"should handle request properties for all HTTP methods\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\t\t\tconst actor = client.rawHttpRequestPropertiesActor.getOrCreate([\"test\"]);\n\n\t\t\tconst methods = [\n\t\t\t\t\"GET\",\n\t\t\t\t\"POST\",\n\t\t\t\t\"PUT\",\n\t\t\t\t\"DELETE\",\n\t\t\t\t\"PATCH\",\n\t\t\t\t\"HEAD\",\n\t\t\t\t\"OPTIONS\",\n\t\t\t];\n\n\t\t\tfor (const method of methods) {\n\t\t\t\tconst response = await actor.fetch(`test/${method.toLowerCase()}`, {\n\t\t\t\t\tmethod,\n\t\t\t\t\t// Only include body for methods that support it\n\t\t\t\t\tbody: [\"POST\", \"PUT\", \"PATCH\"].includes(method)\n\t\t\t\t\t\t? JSON.stringify({ method })\n\t\t\t\t\t\t: undefined,\n\t\t\t\t});\n\n\t\t\t\t// HEAD responses have no body\n\t\t\t\tif (method === \"HEAD\") {\n\t\t\t\t\texpect(response.status).toBe(200);\n\t\t\t\t\tconst text = await response.text();\n\t\t\t\t\texpect(text).toBe(\"\");\n\t\t\t\t} else if (method === \"OPTIONS\") {\n\t\t\t\t\texpect(response.status).toBe(204);\n\t\t\t\t\tconst text = await response.text();\n\t\t\t\t\texpect(text).toBe(\"\");\n\t\t\t\t} else {\n\t\t\t\t\texpect(response.ok).toBe(true);\n\t\t\t\t\tconst data = (await response.json()) as any;\n\t\t\t\t\texpect(data.method).toBe(method);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\ttest(\"should handle complex query parameters\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\t\t\tconst actor = client.rawHttpRequestPropertiesActor.getOrCreate([\"test\"]);\n\n\t\t\t// Test multiple values for same key\n\t\t\tconst response = await actor.fetch(\n\t\t\t\t\"test?key=value1&key=value2&array[]=1&array[]=2&nested[prop]=val\",\n\t\t\t);\n\t\t\texpect(response.ok).toBe(true);\n\t\t\tconst data = (await response.json()) as any;\n\n\t\t\t// Note: URLSearchParams only keeps the last value for duplicate keys\n\t\t\texpect(data.searchParams.key).toBe(\"value2\");\n\t\t\texpect(data.searchParams[\"array[]\"]).toBe(\"2\");\n\t\t\texpect(data.searchParams[\"nested[prop]\"]).toBe(\"val\");\n\t\t});\n\n\t\ttest(\"should handle multipart form data\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\t\t\tconst actor = client.rawHttpRequestPropertiesActor.getOrCreate([\"test\"]);\n\n\t\t\t// Create multipart boundary\n\t\t\tconst boundary = \"----RivetKitBoundary\";\n\t\t\tconst body = [\n\t\t\t\t`------${boundary}`,\n\t\t\t\t'Content-Disposition: form-data; name=\"field1\"',\n\t\t\t\t\"\",\n\t\t\t\t\"value1\",\n\t\t\t\t`------${boundary}`,\n\t\t\t\t'Content-Disposition: form-data; name=\"field2\"',\n\t\t\t\t\"\",\n\t\t\t\t\"value2\",\n\t\t\t\t`------${boundary}--`,\n\t\t\t].join(\"\\r\\n\");\n\n\t\t\tconst response = await actor.fetch(\"test/multipart\", {\n\t\t\t\tmethod: \"POST\",\n\t\t\t\theaders: {\n\t\t\t\t\t\"Content-Type\": `multipart/form-data; boundary=----${boundary}`,\n\t\t\t\t},\n\t\t\t\tbody: body,\n\t\t\t});\n\n\t\t\texpect(response.ok).toBe(true);\n\t\t\tconst data = (await response.json()) as any;\n\t\t\texpect(data.headers[\"content-type\"]).toContain(\"multipart/form-data\");\n\t\t\texpect(data.bodyText).toContain(\"field1\");\n\t\t\texpect(data.bodyText).toContain(\"value1\");\n\t\t});\n\n\t\ttest(\"should handle very long URLs\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\t\t\tconst actor = client.rawHttpRequestPropertiesActor.getOrCreate([\"test\"]);\n\n\t\t\t// Create a very long query string\n\t\t\tconst longValue = \"x\".repeat(1000);\n\t\t\tconst response = await actor.fetch(`test/long?param=${longValue}`);\n\n\t\t\texpect(response.ok).toBe(true);\n\t\t\tconst data = (await response.json()) as any;\n\t\t\texpect(data.searchParams.param).toBe(longValue);\n\t\t\texpect(data.search.length).toBeGreaterThan(1000);\n\t\t});\n\n\t\ttest(\"should handle large request bodies\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\t\t\tconst actor = client.rawHttpRequestPropertiesActor.getOrCreate([\"test\"]);\n\n\t\t\t// Create a large JSON body (1MB+)\n\t\t\tconst largeArray = new Array(10000).fill({\n\t\t\t\tid: 1,\n\t\t\t\tname: \"Test\",\n\t\t\t\tdescription: \"This is a test object with some data\",\n\t\t\t});\n\n\t\t\tconst response = await actor.fetch(\"test/large\", {\n\t\t\t\tmethod: \"POST\",\n\t\t\t\theaders: {\n\t\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t},\n\t\t\t\tbody: JSON.stringify(largeArray),\n\t\t\t});\n\n\t\t\texpect(response.ok).toBe(true);\n\t\t\tconst data = (await response.json()) as any;\n\t\t\texpect(data.body).toHaveLength(10000);\n\t\t});\n\n\t\ttest(\"should handle missing content-type header\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\t\t\tconst actor = client.rawHttpRequestPropertiesActor.getOrCreate([\"test\"]);\n\n\t\t\tconst response = await actor.fetch(\"test/no-content-type\", {\n\t\t\t\tmethod: \"POST\",\n\t\t\t\tbody: \"plain text without content-type\",\n\t\t\t});\n\n\t\t\texpect(response.ok).toBe(true);\n\t\t\tconst data = (await response.json()) as any;\n\t\t\texpect(data.bodyText).toBe(\"plain text without content-type\");\n\t\t});\n\n\t\ttest(\"should handle empty request body\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\t\t\tconst actor = client.rawHttpRequestPropertiesActor.getOrCreate([\"test\"]);\n\n\t\t\tconst response = await actor.fetch(\"test/empty\", {\n\t\t\t\tmethod: \"POST\",\n\t\t\t\theaders: {\n\t\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t},\n\t\t\t\tbody: \"\",\n\t\t\t});\n\n\t\t\texpect(response.ok).toBe(true);\n\t\t\tconst data = (await response.json()) as any;\n\t\t\texpect(data.body).toBeNull();\n\t\t\texpect(data.bodyText).toBe(\"\");\n\t\t});\n\n\t\ttest(\"should handle custom HTTP methods\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\t\t\tconst actor = client.rawHttpRequestPropertiesActor.getOrCreate([\"test\"]);\n\n\t\t\t// Test a custom method (though most HTTP clients may not support this)\n\t\t\ttry {\n\t\t\t\tconst response = await actor.fetch(\"test/custom\", {\n\t\t\t\t\tmethod: \"CUSTOM\",\n\t\t\t\t});\n\n\t\t\t\t// If the request succeeds, verify the method\n\t\t\t\tif (response.ok) {\n\t\t\t\t\tconst data = (await response.json()) as any;\n\t\t\t\t\texpect(data.method).toBe(\"CUSTOM\");\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\t// Some HTTP clients may reject custom methods\n\t\t\t\t// This is expected behavior\n\t\t\t}\n\t\t});\n\n\t\ttest(\"should handle cookies in headers\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\t\t\tconst actor = client.rawHttpRequestPropertiesActor.getOrCreate([\"test\"]);\n\n\t\t\tconst response = await actor.fetch(\"test/cookies\", {\n\t\t\t\theaders: {\n\t\t\t\t\tCookie: \"session=abc123; user=test; preferences=dark_mode\",\n\t\t\t\t},\n\t\t\t});\n\n\t\t\texpect(response.ok).toBe(true);\n\t\t\tconst data = (await response.json()) as any;\n\t\t\texpect(data.headers.cookie).toBe(\n\t\t\t\t\"session=abc123; user=test; preferences=dark_mode\",\n\t\t\t);\n\t\t});\n\n\t\ttest(\"should handle URL encoding properly\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\t\t\tconst actor = client.rawHttpRequestPropertiesActor.getOrCreate([\"test\"]);\n\n\t\t\t// Test various encoded characters\n\t\t\tconst response = await actor.fetch(\n\t\t\t\t\"test/encoded?special=%20%21%40%23%24%25%5E%26&unicode=%E2%9C%93&email=test%40example.com\",\n\t\t\t);\n\n\t\t\texpect(response.ok).toBe(true);\n\t\t\tconst data = (await response.json()) as any;\n\n\t\t\t// Verify URL decoding\n\t\t\texpect(data.searchParams.special).toBe(\" !@#$%^&\");\n\t\t\texpect(data.searchParams.unicode).toBe(\"✓\");\n\t\t\texpect(data.searchParams.email).toBe(\"test@example.com\");\n\t\t});\n\n\t\ttest(\"should handle concurrent requests maintaining separate contexts\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\t\t\tconst actor = client.rawHttpRequestPropertiesActor.getOrCreate([\"test\"]);\n\n\t\t\t// Send multiple concurrent requests with different data\n\t\t\tconst requests = [\n\t\t\t\tactor.fetch(\"test/concurrent?id=1\", {\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\theaders: { \"Content-Type\": \"application/json\" },\n\t\t\t\t\tbody: JSON.stringify({ request: 1 }),\n\t\t\t\t}),\n\t\t\t\tactor.fetch(\"test/concurrent?id=2\", {\n\t\t\t\t\tmethod: \"PUT\",\n\t\t\t\t\theaders: { \"Content-Type\": \"application/json\" },\n\t\t\t\t\tbody: JSON.stringify({ request: 2 }),\n\t\t\t\t}),\n\t\t\t\tactor.fetch(\"test/concurrent?id=3\", {\n\t\t\t\t\tmethod: \"DELETE\",\n\t\t\t\t}),\n\t\t\t];\n\n\t\t\tconst responses = await Promise.all(requests);\n\t\t\tconst results = (await Promise.all(\n\t\t\t\tresponses.map((r) => r.json()),\n\t\t\t)) as any[];\n\n\t\t\t// Verify each request maintained its own context\n\t\t\texpect(results[0].searchParams.id).toBe(\"1\");\n\t\t\texpect(results[0].method).toBe(\"POST\");\n\t\t\texpect(results[0].body).toEqual({ request: 1 });\n\n\t\t\texpect(results[1].searchParams.id).toBe(\"2\");\n\t\t\texpect(results[1].method).toBe(\"PUT\");\n\t\t\texpect(results[1].body).toEqual({ request: 2 });\n\n\t\t\texpect(results[2].searchParams.id).toBe(\"3\");\n\t\t\texpect(results[2].method).toBe(\"DELETE\");\n\t\t\texpect(results[2].body).toBeNull();\n\t\t});\n\t});\n}\n","import { describe, expect, test } from \"vitest\";\nimport type { DriverTestConfig } from \"../mod\";\nimport { setupDriverTest } from \"../utils\";\n\nexport function runRawWebSocketTests(driverTestConfig: DriverTestConfig) {\n\tdescribe(\"raw websocket\", () => {\n\t\ttest(\"should establish raw WebSocket connection\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\t\t\tconst actor = client.rawWebSocketActor.getOrCreate([\"basic\"]);\n\n\t\t\tconst ws = await actor.websocket();\n\n\t\t\t// The WebSocket should already be open since openWebSocket waits for openPromise\n\t\t\t// But we still need to ensure any buffered events are processed\n\t\t\tawait new Promise<void>((resolve) => {\n\t\t\t\t// If already open, resolve immediately\n\t\t\t\tif (ws.readyState === WebSocket.OPEN) {\n\t\t\t\t\tresolve();\n\t\t\t\t} else {\n\t\t\t\t\t// Otherwise wait for open event\n\t\t\t\t\tws.addEventListener(\n\t\t\t\t\t\t\"open\",\n\t\t\t\t\t\t() => {\n\t\t\t\t\t\t\tresolve();\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{ once: true },\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Should receive welcome message\n\t\t\tconst welcomeMessage = await new Promise<any>((resolve, reject) => {\n\t\t\t\tws.addEventListener(\n\t\t\t\t\t\"message\",\n\t\t\t\t\t(event: any) => {\n\t\t\t\t\t\tresolve(JSON.parse(event.data as string));\n\t\t\t\t\t},\n\t\t\t\t\t{ once: true },\n\t\t\t\t);\n\t\t\t\tws.addEventListener(\"close\", reject);\n\t\t\t});\n\n\t\t\texpect(welcomeMessage.type).toBe(\"welcome\");\n\t\t\texpect(welcomeMessage.connectionCount).toBe(1);\n\n\t\t\tws.close();\n\t\t});\n\n\t\ttest(\"should echo messages\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\t\t\tconst actor = client.rawWebSocketActor.getOrCreate([\"echo\"]);\n\n\t\t\tconst ws = await actor.websocket();\n\n\t\t\t// Check if WebSocket is already open\n\t\t\tif (ws.readyState !== WebSocket.OPEN) {\n\t\t\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\t\t\tws.addEventListener(\"open\", () => resolve(), { once: true });\n\t\t\t\t\tws.addEventListener(\"close\", reject);\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Skip welcome message\n\t\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\t\tws.addEventListener(\"message\", () => resolve(), { once: true });\n\t\t\t\tws.addEventListener(\"close\", reject);\n\t\t\t});\n\n\t\t\t// Send and receive echo\n\t\t\tconst testMessage = { test: \"data\", timestamp: Date.now() };\n\t\t\tws.send(JSON.stringify(testMessage));\n\n\t\t\tconst echoMessage = await new Promise<any>((resolve, reject) => {\n\t\t\t\tws.addEventListener(\n\t\t\t\t\t\"message\",\n\t\t\t\t\t(event: any) => {\n\t\t\t\t\t\tresolve(JSON.parse(event.data as string));\n\t\t\t\t\t},\n\t\t\t\t\t{ once: true },\n\t\t\t\t);\n\t\t\t\tws.addEventListener(\"close\", reject);\n\t\t\t});\n\n\t\t\texpect(echoMessage).toEqual(testMessage);\n\n\t\t\tws.close();\n\t\t});\n\n\t\ttest(\"should handle ping/pong protocol\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\t\t\tconst actor = client.rawWebSocketActor.getOrCreate([\"ping\"]);\n\n\t\t\tconst ws = await actor.websocket();\n\n\t\t\t// Check if WebSocket is already open\n\t\t\tif (ws.readyState !== WebSocket.OPEN) {\n\t\t\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\t\t\tws.addEventListener(\"open\", () => resolve(), { once: true });\n\t\t\t\t\tws.addEventListener(\"close\", reject);\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Skip welcome message\n\t\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\t\tws.addEventListener(\"message\", () => resolve(), { once: true });\n\t\t\t\tws.addEventListener(\"close\", reject);\n\t\t\t});\n\n\t\t\t// Send ping\n\t\t\tws.send(JSON.stringify({ type: \"ping\" }));\n\n\t\t\tconst pongMessage = await new Promise<any>((resolve, reject) => {\n\t\t\t\tws.addEventListener(\"message\", (event: any) => {\n\t\t\t\t\tconst data = JSON.parse(event.data as string);\n\t\t\t\t\tif (data.type === \"pong\") {\n\t\t\t\t\t\tresolve(data);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tws.addEventListener(\"close\", reject);\n\t\t\t});\n\n\t\t\texpect(pongMessage.type).toBe(\"pong\");\n\t\t\texpect(pongMessage.timestamp).toBeDefined();\n\n\t\t\tws.close();\n\t\t});\n\n\t\ttest(\"should track stats across connections\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\t\t\tconst actor1 = client.rawWebSocketActor.getOrCreate([\"stats\"]);\n\n\t\t\t// Create first connection to ensure actor exists\n\t\t\tconst ws1 = await actor1.websocket();\n\t\t\tconst ws1MessagePromise = new Promise<void>((resolve, reject) => {\n\t\t\t\tws1.addEventListener(\"message\", () => resolve(), { once: true });\n\t\t\t\tws1.addEventListener(\"close\", reject);\n\t\t\t});\n\n\t\t\t// Wait for first connection to establish before getting the actor\n\t\t\tawait ws1MessagePromise;\n\n\t\t\t// Now get reference to same actor\n\t\t\tconst actor2 = client.rawWebSocketActor.get([\"stats\"]);\n\t\t\tconst ws2 = await actor2.websocket();\n\t\t\tconst ws2MessagePromise = new Promise<void>((resolve, reject) => {\n\t\t\t\tws2.addEventListener(\"message\", () => resolve(), { once: true });\n\t\t\t\tws2.addEventListener(\"close\", reject);\n\t\t\t});\n\n\t\t\t// Wait for welcome messages\n\t\t\tawait Promise.all([ws1MessagePromise, ws2MessagePromise]);\n\n\t\t\t// Send some messages\n\t\t\tconst pingPromise = new Promise<any>((resolve, reject) => {\n\t\t\t\tws2.addEventListener(\"message\", (event: any) => {\n\t\t\t\t\tconst data = JSON.parse(event.data as string);\n\t\t\t\t\tif (data.type === \"pong\") {\n\t\t\t\t\t\tresolve(undefined);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tws2.addEventListener(\"close\", reject);\n\t\t\t});\n\t\t\tws1.send(JSON.stringify({ data: \"test1\" }));\n\t\t\tws1.send(JSON.stringify({ data: \"test3\" }));\n\t\t\tws2.send(JSON.stringify({ type: \"ping\" }));\n\t\t\tawait pingPromise;\n\n\t\t\t// Get stats\n\t\t\tconst statsPromise = new Promise<any>((resolve, reject) => {\n\t\t\t\tws1.addEventListener(\"message\", (event: any) => {\n\t\t\t\t\tconst data = JSON.parse(event.data as string);\n\t\t\t\t\tif (data.type === \"stats\") {\n\t\t\t\t\t\tresolve(data);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tws1.addEventListener(\"close\", reject);\n\t\t\t});\n\t\t\tws1.send(JSON.stringify({ type: \"getStats\" }));\n\t\t\tconst stats = await statsPromise;\n\t\t\texpect(stats.connectionCount).toBe(2);\n\t\t\texpect(stats.messageCount).toBe(4);\n\n\t\t\t// Verify via action\n\t\t\tconst actionStats = await actor1.getStats();\n\t\t\texpect(actionStats.connectionCount).toBe(2);\n\t\t\texpect(actionStats.messageCount).toBe(4);\n\n\t\t\tws1.close();\n\t\t\tws2.close();\n\t\t});\n\n\t\ttest(\"should handle binary data\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\t\t\tconst actor = client.rawWebSocketBinaryActor.getOrCreate([\"binary\"]);\n\n\t\t\tconst ws = await actor.websocket();\n\n\t\t\t// Check if WebSocket is already open\n\t\t\tif (ws.readyState !== WebSocket.OPEN) {\n\t\t\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\t\t\tws.addEventListener(\"open\", () => resolve(), { once: true });\n\t\t\t\t\tws.addEventListener(\"close\", reject);\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Helper to receive and convert binary message\n\t\t\tconst receiveBinaryMessage = async (): Promise<Uint8Array> => {\n\t\t\t\tconst response = await new Promise<ArrayBuffer | Blob>(\n\t\t\t\t\t(resolve, reject) => {\n\t\t\t\t\t\tws.addEventListener(\n\t\t\t\t\t\t\t\"message\",\n\t\t\t\t\t\t\t(event: any) => {\n\t\t\t\t\t\t\t\tresolve(event.data);\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{ once: true },\n\t\t\t\t\t\t);\n\t\t\t\t\t\tws.addEventListener(\"close\", reject);\n\t\t\t\t\t},\n\t\t\t\t);\n\n\t\t\t\t// Convert Blob to ArrayBuffer if needed\n\t\t\t\tconst buffer =\n\t\t\t\t\tresponse instanceof Blob ? await response.arrayBuffer() : response;\n\n\t\t\t\treturn new Uint8Array(buffer);\n\t\t\t};\n\n\t\t\t// Test 1: Small binary data\n\t\t\tconst smallData = new Uint8Array([1, 2, 3, 4, 5]);\n\t\t\tws.send(smallData);\n\t\t\tconst smallReversed = await receiveBinaryMessage();\n\t\t\texpect(Array.from(smallReversed)).toEqual([5, 4, 3, 2, 1]);\n\n\t\t\t// Test 2: Large binary data (1KB)\n\t\t\tconst largeData = new Uint8Array(1024);\n\t\t\tfor (let i = 0; i < largeData.length; i++) {\n\t\t\t\tlargeData[i] = i % 256;\n\t\t\t}\n\t\t\tws.send(largeData);\n\t\t\tconst largeReversed = await receiveBinaryMessage();\n\n\t\t\t// Verify it's reversed correctly\n\t\t\tfor (let i = 0; i < largeData.length; i++) {\n\t\t\t\texpect(largeReversed[i]).toBe(largeData[largeData.length - 1 - i]);\n\t\t\t}\n\n\t\t\tws.close();\n\t\t});\n\n\t\ttest(\"should work with custom paths\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\t\t\tconst actor = client.rawWebSocketActor.getOrCreate([\"paths\"]);\n\n\t\t\tconst ws = await actor.websocket(\"custom/path\");\n\n\t\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\t\tws.addEventListener(\"open\", () => {\n\t\t\t\t\tresolve();\n\t\t\t\t});\n\t\t\t\tws.addEventListener(\"error\", reject);\n\t\t\t\tws.addEventListener(\"close\", reject);\n\t\t\t});\n\n\t\t\t// Should still work\n\t\t\tconst welcomeMessage = await new Promise<any>((resolve) => {\n\t\t\t\tws.addEventListener(\n\t\t\t\t\t\"message\",\n\t\t\t\t\t(event: any) => {\n\t\t\t\t\t\tresolve(JSON.parse(event.data as string));\n\t\t\t\t\t},\n\t\t\t\t\t{ once: true },\n\t\t\t\t);\n\t\t\t});\n\n\t\t\texpect(welcomeMessage.type).toBe(\"welcome\");\n\n\t\t\tws.close();\n\t\t});\n\n\t\ttest(\"should handle connection close properly\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\t\t\tconst actor = client.rawWebSocketActor.getOrCreate([\"close-test\"]);\n\n\t\t\tconst ws = await actor.websocket();\n\n\t\t\t// Check if WebSocket is already open\n\t\t\tif (ws.readyState !== WebSocket.OPEN) {\n\t\t\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\t\t\tws.addEventListener(\"open\", () => resolve(), { once: true });\n\t\t\t\t\tws.addEventListener(\"close\", reject);\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Get initial stats\n\t\t\tconst initialStats = await actor.getStats();\n\t\t\texpect(initialStats.connectionCount).toBe(1);\n\n\t\t\t// Wait for close event on client side\n\t\t\tconst closePromise = new Promise<void>((resolve) => {\n\t\t\t\tws.addEventListener(\"close\", () => resolve(), { once: true });\n\t\t\t});\n\n\t\t\t// Close connection\n\t\t\tws.close();\n\t\t\tawait closePromise;\n\n\t\t\t// Poll getStats until connection count is 0\n\t\t\tlet finalStats: any;\n\t\t\tfor (let i = 0; i < 20; i++) {\n\t\t\t\tfinalStats = await actor.getStats();\n\t\t\t\tif (finalStats.connectionCount === 0) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tawait new Promise((resolve) => setTimeout(resolve, 50));\n\t\t\t}\n\n\t\t\t// Check stats after close\n\t\t\texpect(finalStats?.connectionCount).toBe(0);\n\t\t});\n\n\t\ttest(\"should properly handle onWebSocket open and close events\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\t\t\tconst actor = client.rawWebSocketActor.getOrCreate([\"open-close-test\"]);\n\n\t\t\t// Create first connection\n\t\t\tconst ws1 = await actor.websocket();\n\n\t\t\t// Wait for open event\n\t\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\t\tws1.addEventListener(\"open\", () => resolve(), { once: true });\n\t\t\t\tws1.addEventListener(\"close\", reject);\n\t\t\t});\n\n\t\t\t// Wait for welcome message which confirms onWebSocket was called\n\t\t\tconst welcome1 = await new Promise<any>((resolve, reject) => {\n\t\t\t\tws1.addEventListener(\n\t\t\t\t\t\"message\",\n\t\t\t\t\t(event: any) => {\n\t\t\t\t\t\tresolve(JSON.parse(event.data as string));\n\t\t\t\t\t},\n\t\t\t\t\t{ once: true },\n\t\t\t\t);\n\t\t\t\tws1.addEventListener(\"close\", reject);\n\t\t\t});\n\n\t\t\texpect(welcome1.type).toBe(\"welcome\");\n\t\t\texpect(welcome1.connectionCount).toBe(1);\n\n\t\t\t// Create second connection to same actor\n\t\t\tconst ws2 = await actor.websocket();\n\n\t\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\t\tws2.addEventListener(\"open\", () => resolve(), { once: true });\n\t\t\t\tws2.addEventListener(\"close\", reject);\n\t\t\t});\n\n\t\t\tconst welcome2 = await new Promise<any>((resolve, reject) => {\n\t\t\t\tws2.addEventListener(\n\t\t\t\t\t\"message\",\n\t\t\t\t\t(event: any) => {\n\t\t\t\t\t\tresolve(JSON.parse(event.data as string));\n\t\t\t\t\t},\n\t\t\t\t\t{ once: true },\n\t\t\t\t);\n\t\t\t\tws2.addEventListener(\"close\", reject);\n\t\t\t});\n\n\t\t\texpect(welcome2.type).toBe(\"welcome\");\n\t\t\texpect(welcome2.connectionCount).toBe(2);\n\n\t\t\t// Verify stats\n\t\t\tconst midStats = await actor.getStats();\n\t\t\texpect(midStats.connectionCount).toBe(2);\n\n\t\t\t// Close first connection\n\t\t\tws1.close();\n\t\t\tawait new Promise<void>((resolve) => {\n\t\t\t\tws1.addEventListener(\"close\", () => resolve(), { once: true });\n\t\t\t});\n\n\t\t\t// Poll getStats until connection count decreases to 1\n\t\t\tlet afterFirstClose: any;\n\t\t\tfor (let i = 0; i < 20; i++) {\n\t\t\t\tafterFirstClose = await actor.getStats();\n\t\t\t\tif (afterFirstClose.connectionCount === 1) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tawait new Promise((resolve) => setTimeout(resolve, 50));\n\t\t\t}\n\n\t\t\t// Verify connection count decreased\n\t\t\texpect(afterFirstClose?.connectionCount).toBe(1);\n\n\t\t\t// Close second connection\n\t\t\tws2.close();\n\t\t\tawait new Promise<void>((resolve) => {\n\t\t\t\tws2.addEventListener(\"close\", () => resolve(), { once: true });\n\t\t\t});\n\n\t\t\t// Poll getStats until connection count is 0\n\t\t\tlet finalStats: any;\n\t\t\tfor (let i = 0; i < 20; i++) {\n\t\t\t\tfinalStats = await actor.getStats();\n\t\t\t\tif (finalStats.connectionCount === 0) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tawait new Promise((resolve) => setTimeout(resolve, 50));\n\t\t\t}\n\n\t\t\t// Verify final state\n\t\t\texpect(finalStats?.connectionCount).toBe(0);\n\t\t});\n\n\t\ttest(\"should handle query parameters in websocket paths\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\t\t\tconst actor = client.rawWebSocketActor.getOrCreate([\"query-params\"]);\n\n\t\t\t// Test WebSocket with query parameters\n\t\t\tconst ws = await actor.websocket(\"api/v1/stream?token=abc123&user=test\");\n\n\t\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\t\tws.addEventListener(\"open\", () => resolve(), { once: true });\n\t\t\t\tws.addEventListener(\"error\", reject);\n\t\t\t});\n\n\t\t\tconst requestInfoPromise = new Promise<any>((resolve, reject) => {\n\t\t\t\tws.addEventListener(\"message\", (event: any) => {\n\t\t\t\t\tconst data = JSON.parse(event.data as string);\n\t\t\t\t\tif (data.type === \"requestInfo\") {\n\t\t\t\t\t\tresolve(data);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tws.addEventListener(\"close\", reject);\n\t\t\t});\n\n\t\t\t// Send request to get the request info\n\t\t\tws.send(JSON.stringify({ type: \"getRequestInfo\" }));\n\n\t\t\tconst requestInfo = await requestInfoPromise;\n\n\t\t\t// Verify the path and query parameters were preserved\n\t\t\texpect(requestInfo.url).toContain(\"api/v1/stream\");\n\t\t\texpect(requestInfo.url).toContain(\"token=abc123\");\n\t\t\texpect(requestInfo.url).toContain(\"user=test\");\n\n\t\t\tws.close();\n\t\t});\n\t});\n}\n","import { describe, expect, test } from \"vitest\";\nimport type { DriverTestConfig } from \"../mod\";\nimport { setupDriverTest } from \"../utils\";\n\nexport function runRequestAccessTests(driverTestConfig: DriverTestConfig) {\n\tdescribe(\"Request Access in Lifecycle Hooks\", () => {\n\t\ttest(\"should have access to request object in onBeforeConnect and createConnState\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t// Create actor with request tracking enabled\n\t\t\tconst handle = client.requestAccessActor.getOrCreate([\"test-request\"], {\n\t\t\t\tparams: { trackRequest: true },\n\t\t\t});\n\t\t\tconst connection = handle.connect();\n\n\t\t\t// Get request info that was captured in onBeforeConnect\n\t\t\tconst requestInfo = await connection.getRequestInfo();\n\n\t\t\t// Verify request was accessible in HTTP mode, but not in inline mode\n\t\t\tif (driverTestConfig.clientType === \"http\") {\n\t\t\t\t// Check onBeforeConnect\n\t\t\t\texpect(requestInfo.onBeforeConnect.hasRequest).toBe(true);\n\t\t\t\texpect(requestInfo.onBeforeConnect.requestUrl).toBeDefined();\n\t\t\t\texpect(requestInfo.onBeforeConnect.requestMethod).toBeDefined();\n\t\t\t\texpect(requestInfo.onBeforeConnect.requestHeaders).toBeDefined();\n\n\t\t\t\t// Check createConnState\n\t\t\t\texpect(requestInfo.createConnState.hasRequest).toBe(true);\n\t\t\t\texpect(requestInfo.createConnState.requestUrl).toBeDefined();\n\t\t\t\texpect(requestInfo.createConnState.requestMethod).toBeDefined();\n\t\t\t\texpect(requestInfo.createConnState.requestHeaders).toBeDefined();\n\t\t\t} else {\n\t\t\t\t// Inline client may or may not have request object depending on the driver\n\t\t\t\t//\n\t\t\t\t// e.g.\n\t\t\t\t// - File system does not have a request for inline requests\n\t\t\t\t// - Rivet Engine proxies the request so it has access to the request object\n\t\t\t}\n\n\t\t\t// Clean up\n\t\t\tawait connection.dispose();\n\t\t});\n\n\t\ttest(\"should not have request when trackRequest is false\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t// Create actor without request tracking\n\t\t\tconst handle = client.requestAccessActor.getOrCreate(\n\t\t\t\t[\"test-no-request\"],\n\t\t\t\t{\n\t\t\t\t\tparams: { trackRequest: false },\n\t\t\t\t},\n\t\t\t);\n\t\t\tconst connection = handle.connect();\n\n\t\t\t// Get request info\n\t\t\tconst requestInfo = await connection.getRequestInfo();\n\n\t\t\t// Verify request was not tracked\n\t\t\texpect(requestInfo.onBeforeConnect.hasRequest).toBe(false);\n\t\t\texpect(requestInfo.onBeforeConnect.requestUrl).toBeNull();\n\t\t\texpect(requestInfo.onBeforeConnect.requestMethod).toBeNull();\n\t\t\texpect(\n\t\t\t\tObject.keys(requestInfo.onBeforeConnect.requestHeaders),\n\t\t\t).toHaveLength(0);\n\n\t\t\texpect(requestInfo.createConnState.hasRequest).toBe(false);\n\t\t\texpect(requestInfo.createConnState.requestUrl).toBeNull();\n\t\t\texpect(requestInfo.createConnState.requestMethod).toBeNull();\n\t\t\texpect(\n\t\t\t\tObject.keys(requestInfo.createConnState.requestHeaders),\n\t\t\t).toHaveLength(0);\n\n\t\t\t// Clean up\n\t\t\tawait connection.dispose();\n\t\t});\n\n\t\ttest(\"should capture request headers and method\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t// Create actor and connect with request tracking\n\t\t\tconst handle = client.requestAccessActor.getOrCreate([\"test-headers\"], {\n\t\t\t\tparams: { trackRequest: true },\n\t\t\t});\n\t\t\tconst connection = handle.connect();\n\n\t\t\t// Get request info\n\t\t\tconst requestInfo = await connection.getRequestInfo();\n\n\t\t\tif (driverTestConfig.clientType === \"http\") {\n\t\t\t\t// Verify request details were captured in both hooks\n\t\t\t\texpect(requestInfo.onBeforeConnect.hasRequest).toBe(true);\n\t\t\t\texpect(requestInfo.onBeforeConnect.requestMethod).toBeTruthy();\n\t\t\t\texpect(requestInfo.onBeforeConnect.requestUrl).toBeTruthy();\n\t\t\t\texpect(requestInfo.onBeforeConnect.requestHeaders).toBeTruthy();\n\t\t\t\texpect(typeof requestInfo.onBeforeConnect.requestHeaders).toBe(\n\t\t\t\t\t\"object\",\n\t\t\t\t);\n\n\t\t\t\texpect(requestInfo.createConnState.hasRequest).toBe(true);\n\t\t\t\texpect(requestInfo.createConnState.requestMethod).toBeTruthy();\n\t\t\t\texpect(requestInfo.createConnState.requestUrl).toBeTruthy();\n\t\t\t\texpect(requestInfo.createConnState.requestHeaders).toBeTruthy();\n\t\t\t\texpect(typeof requestInfo.createConnState.requestHeaders).toBe(\n\t\t\t\t\t\"object\",\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\t// Inline client may or may not have request object depending on the driver\n\t\t\t\t//\n\t\t\t\t// See \"should have access to request object in onBeforeConnect and createConnState\"\n\t\t\t}\n\n\t\t\t// Clean up\n\t\t\tawait connection.dispose();\n\t\t});\n\n\t\t// TODO: re-expose this once we can have actor queries on the gateway\n\t\t// test(\"should have access to request object in onFetch\", async (c) => {\n\t\t// \tconst { client, endpoint } = await setupDriverTest(c, driverTestConfig);\n\t\t//\n\t\t// \t// Create actor\n\t\t// \tconst handle = client.requestAccessActor.getOrCreate([\"test-fetch\"]);\n\t\t//\n\t\t// \t// Make a raw HTTP request to the actor\n\t\t// \tawait handle.resolve(); // Ensure actor is created\n\t\t//\n\t\t// \tconst actorQuery = {\n\t\t// \t\tgetOrCreateForKey: {\n\t\t// \t\t\tname: \"requestAccessActor\",\n\t\t// \t\t\tkey: [\"test-fetch\"],\n\t\t// \t\t},\n\t\t// \t};\n\t\t//\n\t\t// \tconst url = `${endpoint}/registry/actors/raw/http/test-path`;\n\t\t// \tconst response = await fetch(url, {\n\t\t// \t\tmethod: \"POST\",\n\t\t// \t\theaders: {\n\t\t// \t\t\t\"Content-Type\": \"application/json\",\n\t\t// \t\t\t\"X-Test-Header\": \"test-value\",\n\t\t// \t\t\t\"X-RivetKit-Query\": JSON.stringify(actorQuery),\n\t\t// \t\t},\n\t\t// \t\tbody: JSON.stringify({ test: \"data\" }),\n\t\t// \t});\n\t\t//\n\t\t// \tif (!response.ok) {\n\t\t// \t\tconst errorText = await response.text();\n\t\t// \t\tconsole.error(\n\t\t// \t\t\t`HTTP request failed: ${response.status} ${response.statusText}`,\n\t\t// \t\t\terrorText,\n\t\t// \t\t);\n\t\t// \t}\n\t\t//\n\t\t// \texpect(response.ok).toBe(true);\n\t\t// \tconst data = await response.json();\n\t\t//\n\t\t// \t// Verify request info from onFetch\n\t\t// \texpect((data as any).hasRequest).toBe(true);\n\t\t// \texpect((data as any).requestUrl).toContain(\"/test-path\");\n\t\t// \texpect((data as any).requestMethod).toBe(\"POST\");\n\t\t// \texpect((data as any).requestHeaders).toBeDefined();\n\t\t// \texpect((data as any).requestHeaders[\"content-type\"]).toBe(\n\t\t// \t\t\"application/json\",\n\t\t// \t);\n\t\t// \texpect((data as any).requestHeaders[\"x-test-header\"]).toBe(\"test-value\");\n\t\t// });\n\n\t\t// test(\"should have access to request object in onWebSocket\", async (c) => {\n\t\t// \tconst { client, endpoint } = await setupDriverTest(c, driverTestConfig);\n\t\t//\n\t\t// \t// Only test in environments that support WebSocket\n\t\t// \tif (typeof WebSocket !== \"undefined\") {\n\t\t// \t\t// Create actor\n\t\t// \t\tconst handle = client.requestAccessActor.getOrCreate([\n\t\t// \t\t\t\"test-websocket\",\n\t\t// \t\t]);\n\t\t// \t\tawait handle.resolve(); // Ensure actor is created\n\t\t//\n\t\t// \t\tconst actorQuery = {\n\t\t// \t\t\tgetOrCreateForKey: {\n\t\t// \t\t\t\tname: \"requestAccessActor\",\n\t\t// \t\t\t\tkey: [\"test-websocket\"],\n\t\t// \t\t\t},\n\t\t// \t\t};\n\t\t//\n\t\t// \t\t// Encode query as WebSocket subprotocol\n\t\t// \t\tconst queryProtocol = `query.${encodeURIComponent(JSON.stringify(actorQuery))}`;\n\t\t//\n\t\t// \t\t// Create raw WebSocket connection\n\t\t// \t\tconst wsUrl = endpoint\n\t\t// \t\t\t.replace(\"http://\", \"ws://\")\n\t\t// \t\t\t.replace(\"https://\", \"wss://\");\n\t\t// \t\tconst ws = new WebSocket(\n\t\t// \t\t\t`${wsUrl}/registry/actors/raw/websocket/test-path`,\n\t\t// \t\t\t[\n\t\t// \t\t\t\tqueryProtocol,\n\t\t// \t\t\t\t\"rivetkit\", // Required protocol\n\t\t// \t\t\t],\n\t\t// \t\t);\n\t\t//\n\t\t// \t\t// Wait for connection and first message\n\t\t// \t\tawait new Promise<void>((resolve, reject) => {\n\t\t// \t\t\tws.onopen = () => {\n\t\t// \t\t\t\t// Connection established\n\t\t// \t\t\t};\n\t\t//\n\t\t// \t\t\tws.onmessage = (event) => {\n\t\t// \t\t\t\ttry {\n\t\t// \t\t\t\t\tconst data = JSON.parse(event.data);\n\t\t//\n\t\t// \t\t\t\t\t// Verify request info from onWebSocket\n\t\t// \t\t\t\t\texpect(data.hasRequest).toBe(true);\n\t\t// \t\t\t\t\texpect(data.requestUrl).toContain(\"/test-path\");\n\t\t// \t\t\t\t\texpect(data.requestMethod).toBe(\"GET\");\n\t\t// \t\t\t\t\texpect(data.requestHeaders).toBeDefined();\n\t\t//\n\t\t// \t\t\t\t\tws.close();\n\t\t// \t\t\t\t\tresolve();\n\t\t// \t\t\t\t} catch (error) {\n\t\t// \t\t\t\t\treject(error);\n\t\t// \t\t\t\t}\n\t\t// \t\t\t};\n\t\t//\n\t\t// \t\t\tws.onerror = (error) => {\n\t\t// \t\t\t\treject(error);\n\t\t// \t\t\t};\n\t\t// \t\t});\n\t\t// \t}\n\t\t// });\n\t});\n}\n"],"mappings":"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","names":["describe","encoding","WebSocket","describe","expect","test","vi","describe","test","expect","vi","describe","expect","test","vi","describe","test","expect","vi","describe","describe","expect","test","describe","test","expect","describe","expect","test","describe","test","expect","describe","expect","test","describe","test","expect","describe","describe","expect","test","describe","test","expect","describe","expect","test","describe","test","expect","describe","expect","test","describe","test","expect","describe","expect","test","describe","test","expect","response","describe","expect","test","describe","test","expect","describe","expect","test","describe","test","actor","expect","describe","expect","test","vi","describe","test","expect","vi","describe","expect","test","describe","test","expect","describe","expect","test","describe","test","expect","actor","describe","expect","test","describe","test","actor","expect","describe","expect","test","describe","test","actor","expect","describe","expect","test","describe","test","actor","expect","describe","expect","test","describe","test","expect","describe","_a"]}
1
+ {"version":3,"sources":["../../../src/driver-test-suite/mod.ts","../../../src/driver-test-suite/log.ts","../../../src/driver-test-suite/tests/action-features.ts","../../../src/driver-test-suite/utils.ts","../../../src/driver-test-suite/test-inline-client-driver.ts","../../../src/driver-test-suite/tests/actor-conn.ts","../../../src/driver-test-suite/tests/actor-conn-state.ts","../../../src/driver-test-suite/tests/actor-driver.ts","../../../src/driver-test-suite/tests/actor-schedule.ts","../../../src/driver-test-suite/tests/actor-sleep.ts","../../../fixtures/driver-test-suite/sleep.ts","../../../src/driver-test-suite/tests/actor-state.ts","../../../src/driver-test-suite/tests/actor-error-handling.ts","../../../src/driver-test-suite/tests/actor-handle.ts","../../../src/driver-test-suite/tests/actor-inline-client.ts","../../../src/driver-test-suite/tests/actor-inspector.ts","../../../src/driver-test-suite/tests/actor-metadata.ts","../../../src/driver-test-suite/tests/actor-onstatechange.ts","../../../src/driver-test-suite/tests/actor-reconnect.ts","../../../src/driver-test-suite/tests/actor-vars.ts","../../../src/driver-test-suite/tests/manager-driver.ts","../../../src/driver-test-suite/tests/raw-http.ts","../../../src/driver-test-suite/tests/raw-http-request-properties.ts","../../../src/driver-test-suite/tests/raw-websocket.ts","../../../src/driver-test-suite/tests/request-access.ts"],"sourcesContent":["import { serve as honoServe } from \"@hono/node-server\";\nimport { createNodeWebSocket, type NodeWebSocket } from \"@hono/node-ws\";\nimport { bundleRequire } from \"bundle-require\";\nimport invariant from \"invariant\";\nimport { describe } from \"vitest\";\nimport { ClientConfigSchema } from \"@/client/config\";\nimport type { Encoding, Transport } from \"@/client/mod\";\nimport { configureInspectorAccessToken } from \"@/inspector/utils\";\nimport { createManagerRouter } from \"@/manager/router\";\nimport {\n\tcreateClientWithDriver,\n\ttype DriverConfig,\n\ttype Registry,\n\ttype RunConfig,\n} from \"@/mod\";\nimport { RunnerConfigSchema } from \"@/registry/run-config\";\nimport { getPort } from \"@/test/mod\";\nimport { logger } from \"./log\";\nimport { runActionFeaturesTests } from \"./tests/action-features\";\nimport { runActorConnTests } from \"./tests/actor-conn\";\nimport { runActorConnStateTests } from \"./tests/actor-conn-state\";\nimport {\n\trunActorDriverTests,\n\trunActorDriverTestsWithTransport,\n} from \"./tests/actor-driver\";\nimport { runActorErrorHandlingTests } from \"./tests/actor-error-handling\";\nimport { runActorHandleTests } from \"./tests/actor-handle\";\nimport { runActorInlineClientTests } from \"./tests/actor-inline-client\";\nimport { runActorInspectorTests } from \"./tests/actor-inspector\";\nimport { runActorMetadataTests } from \"./tests/actor-metadata\";\nimport { runActorOnStateChangeTests } from \"./tests/actor-onstatechange\";\nimport { runActorReconnectTests } from \"./tests/actor-reconnect\";\nimport { runActorVarsTests } from \"./tests/actor-vars\";\nimport { runManagerDriverTests } from \"./tests/manager-driver\";\nimport { runRawHttpTests } from \"./tests/raw-http\";\nimport { runRawHttpRequestPropertiesTests } from \"./tests/raw-http-request-properties\";\nimport { runRawWebSocketTests } from \"./tests/raw-websocket\";\nimport { runRequestAccessTests } from \"./tests/request-access\";\n\nexport interface SkipTests {\n\tschedule?: boolean;\n\tsleep?: boolean;\n\tsse?: boolean;\n\tinline?: boolean;\n}\n\nexport interface DriverTestConfig {\n\t/** Deploys an registry and returns the connection endpoint. */\n\tstart(): Promise<DriverDeployOutput>;\n\n\t/**\n\t * If we're testing with an external system, we should use real timers\n\t * instead of Vitest's mocked timers.\n\t **/\n\tuseRealTimers?: boolean;\n\n\t/** Cloudflare Workers has some bugs with cleanup. */\n\tHACK_skipCleanupNet?: boolean;\n\n\tskip?: SkipTests;\n\n\ttransport?: Transport;\n\n\tencoding?: Encoding;\n\n\tclientType: ClientType;\n\n\tcleanup?: () => Promise<void>;\n}\n\n/**\n * The type of client to run the test with.\n *\n * The logic for HTTP vs inline is very different, so this helps validate all behavior matches.\n **/\ntype ClientType = \"http\" | \"inline\";\n\nexport interface DriverDeployOutput {\n\tendpoint: string;\n\tnamespace: string;\n\trunnerName: string;\n\n\t/** Cleans up the test. */\n\tcleanup(): Promise<void>;\n}\n\n/** Runs all Vitest tests against the provided drivers. */\nexport function runDriverTests(\n\tdriverTestConfigPartial: Omit<\n\t\tDriverTestConfig,\n\t\t\"clientType\" | \"transport\" | \"encoding\"\n\t>,\n) {\n\tconst clientTypes: ClientType[] = driverTestConfigPartial.skip?.inline\n\t\t? [\"http\"]\n\t\t: [\"http\", \"inline\"];\n\tfor (const clientType of clientTypes) {\n\t\tdescribe(`client type (${clientType})`, () => {\n\t\t\tconst encodings: Encoding[] = [\"bare\", \"cbor\", \"json\"];\n\n\t\t\tfor (const encoding of encodings) {\n\t\t\t\tdescribe(`encoding (${encoding})`, () => {\n\t\t\t\t\tconst driverTestConfig: DriverTestConfig = {\n\t\t\t\t\t\t...driverTestConfigPartial,\n\t\t\t\t\t\tclientType,\n\t\t\t\t\t\tencoding,\n\t\t\t\t\t};\n\n\t\t\t\t\trunActorDriverTests(driverTestConfig);\n\t\t\t\t\trunManagerDriverTests(driverTestConfig);\n\n\t\t\t\t\tconst transports: Transport[] = driverTestConfig.skip?.sse\n\t\t\t\t\t\t? [\"websocket\"]\n\t\t\t\t\t\t: [\"websocket\", \"sse\"];\n\t\t\t\t\tfor (const transport of transports) {\n\t\t\t\t\t\tdescribe(`transport (${transport})`, () => {\n\t\t\t\t\t\t\trunActorConnTests({\n\t\t\t\t\t\t\t\t...driverTestConfig,\n\t\t\t\t\t\t\t\ttransport,\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\trunActorConnStateTests({\n\t\t\t\t\t\t\t\t...driverTestConfig,\n\t\t\t\t\t\t\t\ttransport,\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\trunActorReconnectTests({\n\t\t\t\t\t\t\t\t...driverTestConfig,\n\t\t\t\t\t\t\t\ttransport,\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\trunRequestAccessTests({\n\t\t\t\t\t\t\t\t...driverTestConfig,\n\t\t\t\t\t\t\t\ttransport,\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\trunActorDriverTestsWithTransport({\n\t\t\t\t\t\t\t\t...driverTestConfig,\n\t\t\t\t\t\t\t\ttransport,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\trunActorHandleTests(driverTestConfig);\n\n\t\t\t\t\trunActionFeaturesTests(driverTestConfig);\n\n\t\t\t\t\trunActorVarsTests(driverTestConfig);\n\n\t\t\t\t\trunActorMetadataTests(driverTestConfig);\n\n\t\t\t\t\trunActorOnStateChangeTests(driverTestConfig);\n\n\t\t\t\t\trunActorErrorHandlingTests(driverTestConfig);\n\n\t\t\t\t\trunActorInlineClientTests(driverTestConfig);\n\n\t\t\t\t\trunRawHttpTests(driverTestConfig);\n\n\t\t\t\t\trunRawHttpRequestPropertiesTests(driverTestConfig);\n\n\t\t\t\t\trunRawWebSocketTests(driverTestConfig);\n\n\t\t\t\t\t// TODO: re-expose this once we can have actor queries on the gateway\n\t\t\t\t\t// runRawHttpDirectRegistryTests(driverTestConfig);\n\n\t\t\t\t\t// TODO: re-expose this once we can have actor queries on the gateway\n\t\t\t\t\t// runRawWebSocketDirectRegistryTests(driverTestConfig);\n\n\t\t\t\t\trunActorInspectorTests(driverTestConfig);\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n}\n\n/**\n * Helper function to adapt the drivers to the Node.js runtime for tests.\n *\n * This is helpful for drivers that run in-process as opposed to drivers that rely on external tools.\n */\nexport async function createTestRuntime(\n\tregistryPath: string,\n\tdriverFactory: (registry: Registry<any>) => Promise<{\n\t\trivetEngine?: {\n\t\t\tendpoint: string;\n\t\t\tnamespace: string;\n\t\t\trunnerName: string;\n\t\t\ttoken: string;\n\t\t};\n\t\tdriver: DriverConfig;\n\t\tcleanup?: () => Promise<void>;\n\t}>,\n): Promise<DriverDeployOutput> {\n\tconst {\n\t\tmod: { registry },\n\t} = await bundleRequire<{ registry: Registry<any> }>({\n\t\tfilepath: registryPath,\n\t});\n\n\t// TODO: Find a cleaner way of flagging an registry as test mode (ideally not in the config itself)\n\t// Force enable test\n\tregistry.config.test.enabled = true;\n\n\t// Build drivers\n\tconst {\n\t\tdriver,\n\t\tcleanup: driverCleanup,\n\t\trivetEngine,\n\t} = await driverFactory(registry);\n\n\tif (rivetEngine) {\n\t\t// TODO: We don't need createTestRuntime fort his\n\t\t// Using external Rivet engine\n\n\t\tconst cleanup = async () => {\n\t\t\tawait driverCleanup?.();\n\t\t};\n\n\t\treturn {\n\t\t\tendpoint: rivetEngine.endpoint,\n\t\t\tnamespace: rivetEngine.namespace,\n\t\t\trunnerName: rivetEngine.runnerName,\n\t\t\tcleanup,\n\t\t};\n\t} else {\n\t\t// Start server for Rivet engine\n\n\t\t// Build driver config\n\t\t// biome-ignore lint/style/useConst: Assigned later\n\t\tlet upgradeWebSocket: any;\n\t\tconst config: RunConfig = RunnerConfigSchema.parse({\n\t\t\tdriver,\n\t\t\tgetUpgradeWebSocket: () => upgradeWebSocket!,\n\t\t\tinspector: {\n\t\t\t\tenabled: true,\n\t\t\t\ttoken: () => \"token\",\n\t\t\t},\n\t\t});\n\n\t\t// Create router\n\t\tconst managerDriver = driver.manager(registry.config, config);\n\t\tconst client = createClientWithDriver(\n\t\t\tmanagerDriver,\n\t\t\tClientConfigSchema.parse({}),\n\t\t);\n\t\tconfigureInspectorAccessToken(config, managerDriver);\n\t\tconst { router } = createManagerRouter(\n\t\t\tregistry.config,\n\t\t\tconfig,\n\t\t\tmanagerDriver,\n\t\t\tdriver,\n\t\t\tclient,\n\t\t);\n\n\t\t// Inject WebSocket\n\t\tconst nodeWebSocket = createNodeWebSocket({ app: router });\n\t\tupgradeWebSocket = nodeWebSocket.upgradeWebSocket;\n\n\t\t// Start server\n\t\tconst port = await getPort();\n\t\tconst server = honoServe({\n\t\t\tfetch: router.fetch,\n\t\t\thostname: \"127.0.0.1\",\n\t\t\tport,\n\t\t});\n\t\tinvariant(\n\t\t\tnodeWebSocket.injectWebSocket !== undefined,\n\t\t\t\"should have injectWebSocket\",\n\t\t);\n\t\tnodeWebSocket.injectWebSocket(server);\n\t\tconst serverEndpoint = `http://127.0.0.1:${port}`;\n\n\t\tlogger().info({ msg: \"test serer listening\", port });\n\n\t\t// Cleanup\n\t\tconst cleanup = async () => {\n\t\t\t// Stop server\n\t\t\tawait new Promise((resolve) =>\n\t\t\t\tserver.close(() => resolve(undefined)),\n\t\t\t);\n\n\t\t\t// Extra cleanup\n\t\t\tawait driverCleanup?.();\n\t\t};\n\n\t\treturn {\n\t\t\tendpoint: serverEndpoint,\n\t\t\tnamespace: \"default\",\n\t\t\trunnerName: \"default\",\n\t\t\tcleanup,\n\t\t};\n\t}\n}\n","import { getLogger } from \"@/common/log\";\n\nexport function logger() {\n\treturn getLogger(\"test-suite\");\n}\n","import { describe, expect, test } from \"vitest\";\nimport type { ActorError } from \"@/client/errors\";\nimport type { DriverTestConfig } from \"../mod\";\nimport { setupDriverTest } from \"../utils\";\n\nexport function runActionFeaturesTests(driverTestConfig: DriverTestConfig) {\n\tdescribe(\"Action Features\", () => {\n\t\t// TODO: These do not work with fake timers\n\t\tdescribe(\"Action Timeouts\", () => {\n\t\t\tconst usesFakeTimers = !driverTestConfig.useRealTimers;\n\n\t\t\ttest(\"should timeout actions that exceed the configured timeout\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// The quick action should complete successfully\n\t\t\t\tconst quickResult = await client.shortTimeoutActor\n\t\t\t\t\t.getOrCreate()\n\t\t\t\t\t.quickAction();\n\t\t\t\texpect(quickResult).toBe(\"quick response\");\n\n\t\t\t\t// The slow action should throw a timeout error\n\t\t\t\tawait expect(\n\t\t\t\t\tclient.shortTimeoutActor.getOrCreate().slowAction(),\n\t\t\t\t).rejects.toThrow(\"Action timed out\");\n\t\t\t});\n\n\t\t\ttest(\"should respect the default timeout\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// This action should complete within the default timeout\n\t\t\t\tconst result = await client.defaultTimeoutActor\n\t\t\t\t\t.getOrCreate()\n\t\t\t\t\t.normalAction();\n\t\t\t\texpect(result).toBe(\"normal response\");\n\t\t\t});\n\n\t\t\ttest(\"non-promise action results should not be affected by timeout\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Synchronous action should not be affected by timeout\n\t\t\t\tconst result = await client.syncTimeoutActor\n\t\t\t\t\t.getOrCreate()\n\t\t\t\t\t.syncAction();\n\t\t\t\texpect(result).toBe(\"sync response\");\n\t\t\t});\n\n\t\t\ttest(\"should allow configuring different timeouts for different actors\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// The short timeout actor should fail\n\t\t\t\tawait expect(\n\t\t\t\t\tclient.shortTimeoutActor.getOrCreate().slowAction(),\n\t\t\t\t).rejects.toThrow(\"Action timed out\");\n\n\t\t\t\t// The longer timeout actor should succeed\n\t\t\t\tconst result = await client.longTimeoutActor\n\t\t\t\t\t.getOrCreate()\n\t\t\t\t\t.delayedAction();\n\t\t\t\texpect(result).toBe(\"delayed response\");\n\t\t\t});\n\t\t});\n\n\t\tdescribe(\"Action Sync & Async\", () => {\n\t\t\ttest(\"should support synchronous actions\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\tconst instance = client.syncActionActor.getOrCreate();\n\n\t\t\t\t// Test increment action\n\t\t\t\tlet result = await instance.increment(5);\n\t\t\t\texpect(result).toBe(5);\n\n\t\t\t\tresult = await instance.increment(3);\n\t\t\t\texpect(result).toBe(8);\n\n\t\t\t\t// Test getInfo action\n\t\t\t\tconst info = await instance.getInfo();\n\t\t\t\texpect(info.currentValue).toBe(8);\n\t\t\t\texpect(typeof info.timestamp).toBe(\"number\");\n\n\t\t\t\t// Test reset action (void return)\n\t\t\t\tawait instance.reset();\n\t\t\t\tresult = await instance.increment(0);\n\t\t\t\texpect(result).toBe(0);\n\t\t\t});\n\n\t\t\ttest(\"should support asynchronous actions\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\tconst instance = client.asyncActionActor.getOrCreate();\n\n\t\t\t\t// Test delayed increment\n\t\t\t\tconst result = await instance.delayedIncrement(5);\n\t\t\t\texpect(result).toBe(5);\n\n\t\t\t\t// Test fetch data\n\t\t\t\tconst data = await instance.fetchData(\"test-123\");\n\t\t\t\texpect(data.id).toBe(\"test-123\");\n\t\t\t\texpect(typeof data.timestamp).toBe(\"number\");\n\n\t\t\t\t// Test successful async operation\n\t\t\t\tconst success = await instance.asyncWithError(false);\n\t\t\t\texpect(success).toBe(\"Success\");\n\n\t\t\t\t// Test error in async operation\n\t\t\t\ttry {\n\t\t\t\t\tawait instance.asyncWithError(true);\n\t\t\t\t\texpect.fail(\"did not error\");\n\t\t\t\t} catch (error) {\n\t\t\t\t\texpect((error as ActorError).message).toBe(\n\t\t\t\t\t\t\"Intentional error\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\ttest(\"should handle promises returned from actions correctly\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\tconst instance = client.promiseActor.getOrCreate();\n\n\t\t\t\t// Test resolved promise\n\t\t\t\tconst resolvedValue = await instance.resolvedPromise();\n\t\t\t\texpect(resolvedValue).toBe(\"resolved value\");\n\n\t\t\t\t// Test delayed promise\n\t\t\t\tconst delayedValue = await instance.delayedPromise();\n\t\t\t\texpect(delayedValue).toBe(\"delayed value\");\n\n\t\t\t\t// Test rejected promise\n\t\t\t\tawait expect(instance.rejectedPromise()).rejects.toThrow(\n\t\t\t\t\t\"promised rejection\",\n\t\t\t\t);\n\n\t\t\t\t// Check state was updated by the delayed promise\n\t\t\t\tconst results = await instance.getResults();\n\t\t\t\texpect(results).toContain(\"delayed\");\n\t\t\t});\n\t\t});\n\t});\n}\n","import invariant from \"invariant\";\nimport { type TestContext, vi } from \"vitest\";\nimport { assertUnreachable } from \"@/actor/utils\";\nimport { type Client, createClient } from \"@/client/mod\";\nimport { RunConfigSchema } from \"@/driver-helpers/mod\";\nimport { createClientWithDriver } from \"@/mod\";\nimport type { registry } from \"../../fixtures/driver-test-suite/registry\";\nimport type { DriverTestConfig } from \"./mod\";\nimport { createTestInlineClientDriver } from \"./test-inline-client-driver\";\n\nexport const FAKE_TIME = new Date(\"2024-01-01T00:00:00.000Z\");\n\n// Must use `TestContext` since global hooks do not work when running concurrently\nexport async function setupDriverTest(\n\tc: TestContext,\n\tdriverTestConfig: DriverTestConfig,\n): Promise<{\n\tclient: Client<typeof registry>;\n\tendpoint: string;\n}> {\n\tif (!driverTestConfig.useRealTimers) {\n\t\tvi.useFakeTimers();\n\t\tvi.setSystemTime(FAKE_TIME);\n\t}\n\n\t// Build drivers\n\tconst { endpoint, namespace, runnerName, cleanup } =\n\t\tawait driverTestConfig.start();\n\tc.onTestFinished(cleanup);\n\n\tlet client: Client<typeof registry>;\n\tif (driverTestConfig.clientType === \"http\") {\n\t\t// Create client\n\t\tclient = createClient<typeof registry>({\n\t\t\tendpoint,\n\t\t\tnamespace,\n\t\t\trunnerName,\n\t\t\ttransport: driverTestConfig.transport,\n\t\t\tencoding: driverTestConfig.encoding,\n\t\t});\n\t} else if (driverTestConfig.clientType === \"inline\") {\n\t\t// Use inline client from driver\n\t\tconst transport = driverTestConfig.transport ?? \"websocket\";\n\t\tconst encoding = driverTestConfig.encoding ?? \"bare\";\n\t\tconst managerDriver = createTestInlineClientDriver(\n\t\t\tendpoint,\n\t\t\tencoding,\n\t\t\ttransport,\n\t\t);\n\t\tconst runConfig = RunConfigSchema.parse({\n\t\t\ttransport: transport,\n\t\t\tencoding: encoding,\n\t\t});\n\t\tclient = createClientWithDriver(managerDriver, runConfig);\n\t} else {\n\t\tassertUnreachable(driverTestConfig.clientType);\n\t}\n\n\t// Cleanup client\n\tif (!driverTestConfig.HACK_skipCleanupNet) {\n\t\tc.onTestFinished(async () => await client.dispose());\n\t}\n\n\treturn {\n\t\tclient,\n\t\tendpoint,\n\t};\n}\n\nexport async function waitFor(\n\tdriverTestConfig: DriverTestConfig,\n\tms: number,\n): Promise<void> {\n\tif (driverTestConfig.useRealTimers) {\n\t\treturn new Promise((resolve) => setTimeout(resolve, ms));\n\t} else {\n\t\tvi.advanceTimersByTime(ms);\n\t\treturn Promise.resolve();\n\t}\n}\n","import * as cbor from \"cbor-x\";\nimport type { Context as HonoContext } from \"hono\";\nimport invariant from \"invariant\";\nimport type { WebSocket } from \"ws\";\nimport type { Encoding } from \"@/actor/protocol/serde\";\nimport { assertUnreachable } from \"@/actor/utils\";\nimport { ActorError as ClientActorError } from \"@/client/errors\";\nimport type { Transport } from \"@/client/mod\";\nimport {\n\tHEADER_ACTOR_QUERY,\n\tHEADER_CONN_PARAMS,\n\tHEADER_ENCODING,\n\tWS_PROTOCOL_ACTOR,\n\tWS_PROTOCOL_CONN_PARAMS,\n\tWS_PROTOCOL_ENCODING,\n\tWS_PROTOCOL_PATH,\n\tWS_PROTOCOL_TARGET,\n\tWS_PROTOCOL_TRANSPORT,\n} from \"@/common/actor-router-consts\";\nimport type { UniversalEventSource } from \"@/common/eventsource-interface\";\nimport type { DeconstructedError } from \"@/common/utils\";\nimport { importWebSocket } from \"@/common/websocket\";\nimport {\n\ttype ActorOutput,\n\ttype CreateInput,\n\ttype GetForIdInput,\n\ttype GetOrCreateWithKeyInput,\n\ttype GetWithKeyInput,\n\tHEADER_ACTOR_ID,\n\ttype ManagerDisplayInformation,\n\ttype ManagerDriver,\n} from \"@/driver-helpers/mod\";\nimport type { ActorQuery } from \"@/manager/protocol/query\";\nimport type { UniversalWebSocket } from \"@/mod\";\nimport type * as protocol from \"@/schemas/client-protocol/mod\";\nimport { logger } from \"./log\";\n\nexport interface TestInlineDriverCallRequest {\n\tencoding: Encoding;\n\ttransport: Transport;\n\tmethod: string;\n\targs: unknown[];\n}\n\nexport type TestInlineDriverCallResponse<T> =\n\t| {\n\t\t\tok: T;\n\t }\n\t| {\n\t\t\terr: DeconstructedError;\n\t };\n\n/**\n * Creates a client driver used for testing the inline client driver. This will send a request to the HTTP server which will then internally call the internal client and return the response.\n */\nexport function createTestInlineClientDriver(\n\tendpoint: string,\n\tencoding: Encoding,\n\ttransport: Transport,\n): ManagerDriver {\n\treturn {\n\t\tgetForId(input: GetForIdInput): Promise<ActorOutput | undefined> {\n\t\t\treturn makeInlineRequest(\n\t\t\t\tendpoint,\n\t\t\t\tencoding,\n\t\t\t\ttransport,\n\t\t\t\t\"getForId\",\n\t\t\t\t[input],\n\t\t\t);\n\t\t},\n\t\tgetWithKey(input: GetWithKeyInput): Promise<ActorOutput | undefined> {\n\t\t\treturn makeInlineRequest(\n\t\t\t\tendpoint,\n\t\t\t\tencoding,\n\t\t\t\ttransport,\n\t\t\t\t\"getWithKey\",\n\t\t\t\t[input],\n\t\t\t);\n\t\t},\n\t\tgetOrCreateWithKey(\n\t\t\tinput: GetOrCreateWithKeyInput,\n\t\t): Promise<ActorOutput> {\n\t\t\treturn makeInlineRequest(\n\t\t\t\tendpoint,\n\t\t\t\tencoding,\n\t\t\t\ttransport,\n\t\t\t\t\"getOrCreateWithKey\",\n\t\t\t\t[input],\n\t\t\t);\n\t\t},\n\t\tcreateActor(input: CreateInput): Promise<ActorOutput> {\n\t\t\treturn makeInlineRequest(\n\t\t\t\tendpoint,\n\t\t\t\tencoding,\n\t\t\t\ttransport,\n\t\t\t\t\"createActor\",\n\t\t\t\t[input],\n\t\t\t);\n\t\t},\n\t\tasync sendRequest(\n\t\t\tactorId: string,\n\t\t\tactorRequest: Request,\n\t\t): Promise<Response> {\n\t\t\t// Normalize path to match other drivers\n\t\t\tconst oldUrl = new URL(actorRequest.url);\n\t\t\tconst normalizedPath = oldUrl.pathname.startsWith(\"/\")\n\t\t\t\t? oldUrl.pathname.slice(1)\n\t\t\t\t: oldUrl.pathname;\n\t\t\tconst pathWithQuery = normalizedPath + oldUrl.search;\n\n\t\t\tlogger().debug({\n\t\t\t\tmsg: \"sending raw http request via test inline driver\",\n\t\t\t\tactorId,\n\t\t\t\tencoding,\n\t\t\t\tpath: pathWithQuery,\n\t\t\t});\n\n\t\t\t// Use the dedicated raw HTTP endpoint\n\t\t\tconst url = `${endpoint}/.test/inline-driver/send-request/${pathWithQuery}`;\n\n\t\t\tlogger().debug({\n\t\t\t\tmsg: \"rewriting http url\",\n\t\t\t\tfrom: oldUrl,\n\t\t\t\tto: url,\n\t\t\t});\n\n\t\t\t// Merge headers with our metadata\n\t\t\tconst headers = new Headers(actorRequest.headers);\n\t\t\theaders.set(HEADER_ACTOR_ID, actorId);\n\n\t\t\t// Forward the request directly\n\t\t\tconst response = await fetch(\n\t\t\t\tnew Request(url, {\n\t\t\t\t\tmethod: actorRequest.method,\n\t\t\t\t\theaders,\n\t\t\t\t\tbody: actorRequest.body,\n\t\t\t\t\tsignal: actorRequest.signal,\n\t\t\t\t\tduplex: \"half\",\n\t\t\t\t} as RequestInit),\n\t\t\t);\n\n\t\t\t// Check if it's an error response from our handler\n\t\t\tif (\n\t\t\t\t!response.ok &&\n\t\t\t\tresponse.headers\n\t\t\t\t\t.get(\"content-type\")\n\t\t\t\t\t?.includes(\"application/json\")\n\t\t\t) {\n\t\t\t\ttry {\n\t\t\t\t\t// Clone the response to avoid consuming the body\n\t\t\t\t\tconst clonedResponse = response.clone();\n\t\t\t\t\tconst errorData = (await clonedResponse.json()) as any;\n\t\t\t\t\tif (errorData.error) {\n\t\t\t\t\t\t// Handle both error formats:\n\t\t\t\t\t\t// 1. { error: { code, message, metadata } } - structured format\n\t\t\t\t\t\t// 2. { error: \"message\" } - simple string format (from custom onFetch handlers)\n\t\t\t\t\t\tif (typeof errorData.error === \"object\") {\n\t\t\t\t\t\t\tthrow new ClientActorError(\n\t\t\t\t\t\t\t\terrorData.error.code,\n\t\t\t\t\t\t\t\terrorData.error.message,\n\t\t\t\t\t\t\t\terrorData.error.metadata,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// For simple string errors, just return the response as-is\n\t\t\t\t\t\t// This allows custom onFetch handlers to return their own error formats\n\t\t\t\t\t}\n\t\t\t\t} catch (e) {\n\t\t\t\t\t// If it's not our error format, just return the response as-is\n\t\t\t\t\tif (!(e instanceof ClientActorError)) {\n\t\t\t\t\t\treturn response;\n\t\t\t\t\t}\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn response;\n\t\t},\n\t\tasync openWebSocket(\n\t\t\tpath: string,\n\t\t\tactorId: string,\n\t\t\tencoding: Encoding,\n\t\t\tparams: unknown,\n\t\t\tconnId?: string,\n\t\t\tconnToken?: string,\n\t\t): Promise<UniversalWebSocket> {\n\t\t\tconst WebSocket = await importWebSocket();\n\n\t\t\t// Normalize path to match other drivers\n\t\t\tconst normalizedPath = path.startsWith(\"/\") ? path.slice(1) : path;\n\n\t\t\t// Create WebSocket connection to the test endpoint\n\t\t\tconst wsUrl = new URL(\n\t\t\t\t`${endpoint}/.test/inline-driver/connect-websocket/ws`,\n\t\t\t);\n\n\t\t\tlogger().debug({\n\t\t\t\tmsg: \"creating websocket connection via test inline driver\",\n\t\t\t\turl: wsUrl.toString(),\n\t\t\t});\n\n\t\t\t// Convert http/https to ws/wss\n\t\t\tconst wsProtocol = wsUrl.protocol === \"https:\" ? \"wss:\" : \"ws:\";\n\t\t\tconst finalWsUrl = `${wsProtocol}//${wsUrl.host}${wsUrl.pathname}`;\n\n\t\t\tlogger().debug({ msg: \"connecting to websocket\", url: finalWsUrl });\n\n\t\t\t// Build protocols for the connection\n\t\t\tconst protocols: string[] = [];\n\t\t\tprotocols.push(`${WS_PROTOCOL_TARGET}actor`);\n\t\t\tprotocols.push(`${WS_PROTOCOL_ACTOR}${actorId}`);\n\t\t\tprotocols.push(`${WS_PROTOCOL_ENCODING}${encoding}`);\n\t\t\tprotocols.push(`${WS_PROTOCOL_TRANSPORT}${transport}`);\n\t\t\tprotocols.push(\n\t\t\t\t`${WS_PROTOCOL_PATH}${encodeURIComponent(normalizedPath)}`,\n\t\t\t);\n\t\t\tif (params !== undefined) {\n\t\t\t\tprotocols.push(\n\t\t\t\t\t`${WS_PROTOCOL_CONN_PARAMS}${encodeURIComponent(JSON.stringify(params))}`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Create and return the WebSocket\n\t\t\t// Node & browser WebSocket types are incompatible\n\t\t\tconst ws = new WebSocket(finalWsUrl, protocols) as any;\n\n\t\t\treturn ws;\n\t\t},\n\t\tasync proxyRequest(\n\t\t\tc: HonoContext,\n\t\t\tactorRequest: Request,\n\t\t\tactorId: string,\n\t\t): Promise<Response> {\n\t\t\treturn await this.sendRequest(actorId, actorRequest);\n\t\t},\n\t\tproxyWebSocket(\n\t\t\t_c: HonoContext,\n\t\t\t_path: string,\n\t\t\t_actorId: string,\n\t\t\t_encoding: Encoding,\n\t\t\t_params: unknown,\n\t\t): Promise<Response> {\n\t\t\tthrow \"UNIMPLEMENTED\";\n\t\t\t// const upgradeWebSocket = this.#runConfig.getUpgradeWebSocket?.();\n\t\t\t// invariant(upgradeWebSocket, \"missing getUpgradeWebSocket\");\n\t\t\t//\n\t\t\t// const wsHandler = this.openWebSocket(path, actorId, encoding, connParams);\n\t\t\t// return upgradeWebSocket(() => wsHandler)(c, noopNext());\n\t\t},\n\t\tdisplayInformation(): ManagerDisplayInformation {\n\t\t\treturn { name: \"Test Inline\", properties: {} };\n\t\t},\n\t\t// TODO:\n\t\tgetOrCreateInspectorAccessToken: () => \"\",\n\n\t\t// action: async <Args extends Array<unknown> = unknown[], Response = unknown>(\n\t\t// \t_c: HonoContext | undefined,\n\t\t// \tactorQuery: ActorQuery,\n\t\t// \tencoding: Encoding,\n\t\t// \tparams: unknown,\n\t\t// \tname: string,\n\t\t// \targs: Args,\n\t\t// ): Promise<Response> => {\n\t\t// \treturn makeInlineRequest<Response>(\n\t\t// \t\tendpoint,\n\t\t// \t\tencoding,\n\t\t// \t\ttransport,\n\t\t// \t\t\"action\",\n\t\t// \t\t[undefined, actorQuery, encoding, params, name, args],\n\t\t// \t);\n\t\t// },\n\t\t//\n\t\t// resolveActorId: async (\n\t\t// \t_c: HonoContext | undefined,\n\t\t// \tactorQuery: ActorQuery,\n\t\t// \tencodingKind: Encoding,\n\t\t// \tparams: unknown,\n\t\t// ): Promise<string> => {\n\t\t// \treturn makeInlineRequest<string>(\n\t\t// \t\tendpoint,\n\t\t// \t\tencodingKind,\n\t\t// \t\ttransport,\n\t\t// \t\t\"resolveActorId\",\n\t\t// \t\t[undefined, actorQuery, encodingKind, params],\n\t\t// \t);\n\t\t// },\n\t\t//\n\t\t// connectWebSocket: async (\n\t\t// \t_c: HonoContext | undefined,\n\t\t// \tactorQuery: ActorQuery,\n\t\t// \tencodingKind: Encoding,\n\t\t// \tparams: unknown,\n\t\t// ): Promise<WebSocket> => {\n\t\t// \tconst WebSocket = await importWebSocket();\n\t\t//\n\t\t// \tlogger().debug({\n\t\t// \t\tmsg: \"creating websocket connection via test inline driver\",\n\t\t// \t\tactorQuery,\n\t\t// \t\tencodingKind,\n\t\t// \t});\n\t\t//\n\t\t// \t// Create WebSocket connection to the test endpoint\n\t\t// \tconst wsUrl = new URL(\n\t\t// \t\t`${endpoint}/registry/.test/inline-driver/connect-websocket`,\n\t\t// \t);\n\t\t// \twsUrl.searchParams.set(\"actorQuery\", JSON.stringify(actorQuery));\n\t\t// \tif (params !== undefined)\n\t\t// \t\twsUrl.searchParams.set(\"params\", JSON.stringify(params));\n\t\t// \twsUrl.searchParams.set(\"encodingKind\", encodingKind);\n\t\t//\n\t\t// \t// Convert http/https to ws/wss\n\t\t// \tconst wsProtocol = wsUrl.protocol === \"https:\" ? \"wss:\" : \"ws:\";\n\t\t// \tconst finalWsUrl = `${wsProtocol}//${wsUrl.host}${wsUrl.pathname}${wsUrl.search}`;\n\t\t//\n\t\t// \tlogger().debug({ msg: \"connecting to websocket\", url: finalWsUrl });\n\t\t//\n\t\t// \t// Create and return the WebSocket\n\t\t// \t// Node & browser WebSocket types are incompatible\n\t\t// \tconst ws = new WebSocket(finalWsUrl, [\n\t\t// \t\t// HACK: See packages/drivers/cloudflare-workers/src/websocket.ts\n\t\t// \t\t\"rivetkit\",\n\t\t// \t]) as any;\n\t\t//\n\t\t// \treturn ws;\n\t\t// },\n\t\t//\n\t\t// connectSse: async (\n\t\t// \t_c: HonoContext | undefined,\n\t\t// \tactorQuery: ActorQuery,\n\t\t// \tencodingKind: Encoding,\n\t\t// \tparams: unknown,\n\t\t// ): Promise<UniversalEventSource> => {\n\t\t// \tlogger().debug({\n\t\t// \t\tmsg: \"creating sse connection via test inline driver\",\n\t\t// \t\tactorQuery,\n\t\t// \t\tencodingKind,\n\t\t// \t\tparams,\n\t\t// \t});\n\t\t//\n\t\t// \t// Dynamically import EventSource if needed\n\t\t// \tconst EventSourceImport = await import(\"eventsource\");\n\t\t// \t// Handle both ES modules (default) and CommonJS export patterns\n\t\t// \tconst EventSourceConstructor =\n\t\t// \t\t(EventSourceImport as any).default || EventSourceImport;\n\t\t//\n\t\t// \t// Encode parameters for the URL\n\t\t// \tconst actorQueryParam = encodeURIComponent(JSON.stringify(actorQuery));\n\t\t// \tconst encodingParam = encodeURIComponent(encodingKind);\n\t\t// \tconst paramsParam = params\n\t\t// \t\t? encodeURIComponent(JSON.stringify(params))\n\t\t// \t\t: null;\n\t\t//\n\t\t// \t// Create SSE connection URL\n\t\t// \tconst sseUrl = new URL(\n\t\t// \t\t`${endpoint}/registry/.test/inline-driver/connect-sse`,\n\t\t// \t);\n\t\t// \tsseUrl.searchParams.set(\"actorQueryRaw\", actorQueryParam);\n\t\t// \tsseUrl.searchParams.set(\"encodingKind\", encodingParam);\n\t\t// \tif (paramsParam) {\n\t\t// \t\tsseUrl.searchParams.set(\"params\", paramsParam);\n\t\t// \t}\n\t\t//\n\t\t// \tlogger().debug({ msg: \"connecting to sse\", url: sseUrl.toString() });\n\t\t//\n\t\t// \t// Create and return the EventSource\n\t\t// \tconst eventSource = new EventSourceConstructor(sseUrl.toString());\n\t\t//\n\t\t// \t// Wait for the connection to be established before returning\n\t\t// \tawait new Promise<void>((resolve, reject) => {\n\t\t// \t\teventSource.onopen = () => {\n\t\t// \t\t\tlogger().debug({ msg: \"sse connection established\" });\n\t\t// \t\t\tresolve();\n\t\t// \t\t};\n\t\t//\n\t\t// \t\teventSource.onerror = (event: Event) => {\n\t\t// \t\t\tlogger().error({ msg: \"sse connection failed\", event });\n\t\t// \t\t\treject(new Error(\"Failed to establish SSE connection\"));\n\t\t// \t\t};\n\t\t//\n\t\t// \t\t// Set a timeout in case the connection never establishes\n\t\t// \t\tsetTimeout(() => {\n\t\t// \t\t\tif (eventSource.readyState !== EventSourceConstructor.OPEN) {\n\t\t// \t\t\t\treject(new Error(\"SSE connection timed out\"));\n\t\t// \t\t\t}\n\t\t// \t\t}, 10000); // 10 second timeout\n\t\t// \t});\n\t\t//\n\t\t// \treturn eventSource as UniversalEventSource;\n\t\t// },\n\t\t//\n\t\t// sendHttpMessage: async (\n\t\t// \t_c: HonoContext | undefined,\n\t\t// \tactorId: string,\n\t\t// \tencoding: Encoding,\n\t\t// \tconnectionId: string,\n\t\t// \tconnectionToken: string,\n\t\t// \tmessage: protocol.ToServer,\n\t\t// ): Promise<void> => {\n\t\t// \tlogger().debug({\n\t\t// \t\tmsg: \"sending http message via test inline driver\",\n\t\t// \t\tactorId,\n\t\t// \t\tencoding,\n\t\t// \t\tconnectionId,\n\t\t// \t\ttransport,\n\t\t// \t});\n\t\t//\n\t\t// \tconst result = await fetch(\n\t\t// \t\t`${endpoint}/registry/.test/inline-driver/call`,\n\t\t// \t\t{\n\t\t// \t\t\tmethod: \"POST\",\n\t\t// \t\t\theaders: {\n\t\t// \t\t\t\t\"Content-Type\": \"application/json\",\n\t\t// \t\t\t},\n\t\t// \t\t\tbody: JSON.stringify({\n\t\t// \t\t\t\tencoding,\n\t\t// \t\t\t\ttransport,\n\t\t// \t\t\t\tmethod: \"sendHttpMessage\",\n\t\t// \t\t\t\targs: [\n\t\t// \t\t\t\t\tundefined,\n\t\t// \t\t\t\t\tactorId,\n\t\t// \t\t\t\t\tencoding,\n\t\t// \t\t\t\t\tconnectionId,\n\t\t// \t\t\t\t\tconnectionToken,\n\t\t// \t\t\t\t\tmessage,\n\t\t// \t\t\t\t],\n\t\t// \t\t\t} satisfies TestInlineDriverCallRequest),\n\t\t// \t\t},\n\t\t// \t);\n\t\t//\n\t\t// \tif (!result.ok) {\n\t\t// \t\tthrow new Error(`Failed to send HTTP message: ${result.statusText}`);\n\t\t// \t}\n\t\t//\n\t\t// \t// Discard response\n\t\t// \tawait result.body?.cancel();\n\t\t// },\n\t\t//\n\t\t// rawHttpRequest: async (\n\t\t// \t_c: HonoContext | undefined,\n\t\t// \tactorQuery: ActorQuery,\n\t\t// \tencoding: Encoding,\n\t\t// \tparams: unknown,\n\t\t// \tpath: string,\n\t\t// \tinit: RequestInit,\n\t\t// ): Promise<Response> => {\n\t\t// \t// Normalize path to match other drivers\n\t\t// \tconst normalizedPath = path.startsWith(\"/\") ? path.slice(1) : path;\n\t\t//\n\t\t// \tlogger().debug({\n\t\t// \t\tmsg: \"sending raw http request via test inline driver\",\n\t\t// \t\tactorQuery,\n\t\t// \t\tencoding,\n\t\t// \t\tpath: normalizedPath,\n\t\t// \t});\n\t\t//\n\t\t// \t// Use the dedicated raw HTTP endpoint\n\t\t// \tconst url = `${endpoint}/registry/.test/inline-driver/raw-http/${normalizedPath}`;\n\t\t//\n\t\t// \tlogger().debug({ msg: \"rewriting http url\", from: path, to: url });\n\t\t//\n\t\t// \t// Merge headers with our metadata\n\t\t// \tconst headers = new Headers(init.headers);\n\t\t// \theaders.set(HEADER_ACTOR_QUERY, JSON.stringify(actorQuery));\n\t\t// \theaders.set(HEADER_ENCODING, encoding);\n\t\t// \tif (params !== undefined) {\n\t\t// \t\theaders.set(HEADER_CONN_PARAMS, JSON.stringify(params));\n\t\t// \t}\n\t\t//\n\t\t// \t// Forward the request directly\n\t\t// \tconst response = await fetch(url, {\n\t\t// \t\t...init,\n\t\t// \t\theaders,\n\t\t// \t});\n\t\t//\n\t\t// \t// Check if it's an error response from our handler\n\t\t// \tif (\n\t\t// \t\t!response.ok &&\n\t\t// \t\tresponse.headers.get(\"content-type\")?.includes(\"application/json\")\n\t\t// \t) {\n\t\t// \t\ttry {\n\t\t// \t\t\t// Clone the response to avoid consuming the body\n\t\t// \t\t\tconst clonedResponse = response.clone();\n\t\t// \t\t\tconst errorData = (await clonedResponse.json()) as any;\n\t\t// \t\t\tif (errorData.error) {\n\t\t// \t\t\t\t// Handle both error formats:\n\t\t// \t\t\t\t// 1. { error: { code, message, metadata } } - structured format\n\t\t// \t\t\t\t// 2. { error: \"message\" } - simple string format (from custom onFetch handlers)\n\t\t// \t\t\t\tif (typeof errorData.error === \"object\") {\n\t\t// \t\t\t\t\tthrow new ClientActorError(\n\t\t// \t\t\t\t\t\terrorData.error.code,\n\t\t// \t\t\t\t\t\terrorData.error.message,\n\t\t// \t\t\t\t\t\terrorData.error.metadata,\n\t\t// \t\t\t\t\t);\n\t\t// \t\t\t\t}\n\t\t// \t\t\t\t// For simple string errors, just return the response as-is\n\t\t// \t\t\t\t// This allows custom onFetch handlers to return their own error formats\n\t\t// \t\t\t}\n\t\t// \t\t} catch (e) {\n\t\t// \t\t\t// If it's not our error format, just return the response as-is\n\t\t// \t\t\tif (!(e instanceof ClientActorError)) {\n\t\t// \t\t\t\treturn response;\n\t\t// \t\t\t}\n\t\t// \t\t\tthrow e;\n\t\t// \t\t}\n\t\t// \t}\n\t\t//\n\t\t// \treturn response;\n\t\t// },\n\t\t//\n\t\t// rawWebSocket: async (\n\t\t// \t_c: HonoContext | undefined,\n\t\t// \tactorQuery: ActorQuery,\n\t\t// \tencoding: Encoding,\n\t\t// \tparams: unknown,\n\t\t// \tpath: string,\n\t\t// \tprotocols: string | string[] | undefined,\n\t\t// ): Promise<WebSocket> => {\n\t\t// \tlogger().debug({ msg: \"test inline driver rawWebSocket called\" });\n\t\t// \tconst WebSocket = await importWebSocket();\n\t\t//\n\t\t// \t// Normalize path to match other drivers\n\t\t// \tconst normalizedPath = path.startsWith(\"/\") ? path.slice(1) : path;\n\t\t//\n\t\t// \tlogger().debug({\n\t\t// \t\tmsg: \"creating raw websocket connection via test inline driver\",\n\t\t// \t\tactorQuery,\n\t\t// \t\tencoding,\n\t\t// \t\tpath: normalizedPath,\n\t\t// \t\tprotocols,\n\t\t// \t});\n\t\t//\n\t\t// \t// Create WebSocket connection to the test endpoint\n\t\t// \tconst wsUrl = new URL(\n\t\t// \t\t`${endpoint}/registry/.test/inline-driver/raw-websocket`,\n\t\t// \t);\n\t\t// \twsUrl.searchParams.set(\"actorQuery\", JSON.stringify(actorQuery));\n\t\t// \tif (params !== undefined)\n\t\t// \t\twsUrl.searchParams.set(\"params\", JSON.stringify(params));\n\t\t// \twsUrl.searchParams.set(\"encodingKind\", encoding);\n\t\t// \twsUrl.searchParams.set(\"path\", normalizedPath);\n\t\t// \tif (protocols !== undefined)\n\t\t// \t\twsUrl.searchParams.set(\"protocols\", JSON.stringify(protocols));\n\t\t//\n\t\t// \t// Convert http/https to ws/wss\n\t\t// \tconst wsProtocol = wsUrl.protocol === \"https:\" ? \"wss:\" : \"ws:\";\n\t\t// \tconst finalWsUrl = `${wsProtocol}//${wsUrl.host}${wsUrl.pathname}${wsUrl.search}`;\n\t\t//\n\t\t// \tlogger().debug({ msg: \"connecting to raw websocket\", url: finalWsUrl });\n\t\t//\n\t\t// \tlogger().debug({\n\t\t// \t\tmsg: \"rewriting websocket url\",\n\t\t// \t\tfrom: path,\n\t\t// \t\tto: finalWsUrl,\n\t\t// \t});\n\t\t//\n\t\t// \t// Create and return the WebSocket\n\t\t// \t// Node & browser WebSocket types are incompatible\n\t\t// \tconst ws = new WebSocket(finalWsUrl, [\n\t\t// \t\t// HACK: See packages/drivers/cloudflare-workers/src/websocket.ts\n\t\t// \t\t\"rivetkit\",\n\t\t// \t]) as any;\n\t\t//\n\t\t// \tlogger().debug({\n\t\t// \t\tmsg: \"test inline driver created websocket\",\n\t\t// \t\treadyState: ws.readyState,\n\t\t// \t\turl: ws.url,\n\t\t// \t});\n\t\t//\n\t\t// \treturn ws;\n\t\t// },\n\t} satisfies ManagerDriver;\n}\n\nasync function makeInlineRequest<T>(\n\tendpoint: string,\n\tencoding: Encoding,\n\ttransport: Transport,\n\tmethod: string,\n\targs: unknown[],\n): Promise<T> {\n\tlogger().debug({\n\t\tmsg: \"sending inline request\",\n\t\tencoding,\n\t\ttransport,\n\t\tmethod,\n\t\targs,\n\t});\n\n\t// Call driver\n\tconst response = await fetch(`${endpoint}/.test/inline-driver/call`, {\n\t\tmethod: \"POST\",\n\t\theaders: {\n\t\t\t\"Content-Type\": \"application/json\",\n\t\t},\n\t\tbody: cbor.encode({\n\t\t\tencoding,\n\t\t\ttransport,\n\t\t\tmethod,\n\t\t\targs,\n\t\t} satisfies TestInlineDriverCallRequest),\n\t\tduplex: \"half\",\n\t} as RequestInit);\n\n\tif (!response.ok) {\n\t\tthrow new Error(\n\t\t\t`Failed to call inline ${method}: ${response.statusText}`,\n\t\t);\n\t}\n\n\t// Parse response\n\tconst buffer = await response.arrayBuffer();\n\tconst callResponse: TestInlineDriverCallResponse<T> = cbor.decode(\n\t\tnew Uint8Array(buffer),\n\t);\n\n\t// Throw or OK\n\tif (\"ok\" in callResponse) {\n\t\treturn callResponse.ok;\n\t} else if (\"err\" in callResponse) {\n\t\tthrow new ClientActorError(\n\t\t\tcallResponse.err.group,\n\t\t\tcallResponse.err.code,\n\t\t\tcallResponse.err.message,\n\t\t\tcallResponse.err.metadata,\n\t\t);\n\t} else {\n\t\tassertUnreachable(callResponse);\n\t}\n}\n","import { describe, expect, test, vi } from \"vitest\";\nimport { SSE_PING_INTERVAL } from \"@/actor/router-endpoints\";\nimport type { DriverTestConfig } from \"../mod\";\nimport { FAKE_TIME, setupDriverTest, waitFor } from \"../utils\";\n\nexport function runActorConnTests(driverTestConfig: DriverTestConfig) {\n\tdescribe(\"Actor Connection Tests\", () => {\n\t\tdescribe(\"Connection Methods\", () => {\n\t\t\ttest(\"should connect using .get().connect()\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create actor\n\t\t\t\tawait client.counter.create([\"test-get\"]);\n\n\t\t\t\t// Get a handle and connect\n\t\t\t\tconst handle = client.counter.get([\"test-get\"]);\n\t\t\t\tconst connection = handle.connect();\n\n\t\t\t\t// Verify connection by performing an action\n\t\t\t\tconst count = await connection.increment(5);\n\t\t\t\texpect(count).toBe(5);\n\n\t\t\t\t// Clean up\n\t\t\t\tawait connection.dispose();\n\t\t\t});\n\n\t\t\ttest(\"should connect using .getForId().connect()\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create a actor first to get its ID\n\t\t\t\tconst handle = client.counter.getOrCreate([\"test-get-for-id\"]);\n\t\t\t\tawait handle.increment(3);\n\t\t\t\tconst actorId = await handle.resolve();\n\n\t\t\t\t// Get a new handle using the actor ID and connect\n\t\t\t\tconst idHandle = client.counter.getForId(actorId);\n\t\t\t\tconst connection = idHandle.connect();\n\n\t\t\t\t// Verify connection works and state is preserved\n\t\t\t\tconst count = await connection.getCount();\n\t\t\t\texpect(count).toBe(3);\n\n\t\t\t\t// Clean up\n\t\t\t\tawait connection.dispose();\n\t\t\t});\n\n\t\t\ttest(\"should connect using .getOrCreate().connect()\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Get or create actor and connect\n\t\t\t\tconst handle = client.counter.getOrCreate([\n\t\t\t\t\t\"test-get-or-create\",\n\t\t\t\t]);\n\t\t\t\tconst connection = handle.connect();\n\n\t\t\t\t// Verify connection works\n\t\t\t\tconst count = await connection.increment(7);\n\t\t\t\texpect(count).toBe(7);\n\n\t\t\t\t// Clean up\n\t\t\t\tawait connection.dispose();\n\t\t\t});\n\n\t\t\ttest(\"should connect using (await create()).connect()\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create actor and connect\n\t\t\t\tconst handle = await client.counter.create([\"test-create\"]);\n\t\t\t\tconst connection = handle.connect();\n\n\t\t\t\t// Verify connection works\n\t\t\t\tconst count = await connection.increment(9);\n\t\t\t\texpect(count).toBe(9);\n\n\t\t\t\t// Clean up\n\t\t\t\tawait connection.dispose();\n\t\t\t});\n\t\t});\n\n\t\tdescribe(\"Event Communication\", () => {\n\t\t\ttest(\"should mix RPC calls and WebSocket events\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create actor\n\t\t\t\tconst handle = client.counter.getOrCreate([\n\t\t\t\t\t\"test-mixed-rpc-ws\",\n\t\t\t\t]);\n\t\t\t\tconst connection = handle.connect();\n\n\t\t\t\t// Set up event listener\n\t\t\t\tconst receivedEvents: number[] = [];\n\t\t\t\tconnection.on(\"newCount\", (count: number) => {\n\t\t\t\t\treceivedEvents.push(count);\n\t\t\t\t});\n\n\t\t\t\t// TODO: There is a race condition with opening subscription and sending events on SSE, so we need to wait for a successful round trip on the event\n\t\t\t\tawait vi.waitFor(async () => {\n\t\t\t\t\t// Send one RPC call over the connection to ensure it's open\n\t\t\t\t\tawait connection.setCount(1);\n\t\t\t\t\texpect(receivedEvents).includes(1);\n\t\t\t\t});\n\n\t\t\t\t// Now use stateless RPC calls through the handle (no connection)\n\t\t\t\t// These should still trigger events that the connection receives\n\t\t\t\tawait handle.setCount(2);\n\t\t\t\tawait handle.setCount(3);\n\n\t\t\t\t// Wait for all events to be received\n\t\t\t\tawait vi.waitFor(() => {\n\t\t\t\t\texpect(receivedEvents).includes(2);\n\t\t\t\t\texpect(receivedEvents).includes(3);\n\t\t\t\t});\n\n\t\t\t\t// Clean up\n\t\t\t\tawait connection.dispose();\n\t\t\t});\n\n\t\t\ttest(\"should receive events via broadcast\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create actor and connect\n\t\t\t\tconst handle = client.counter.getOrCreate([\"test-broadcast\"]);\n\t\t\t\tconst connection = handle.connect();\n\n\t\t\t\t// Set up event listener\n\t\t\t\tconst receivedEvents: number[] = [];\n\t\t\t\tconnection.on(\"newCount\", (count: number) => {\n\t\t\t\t\treceivedEvents.push(count);\n\t\t\t\t});\n\n\t\t\t\t// HACK: Race condition between subscribing & sending events in SSE\n\t\t\t\t// Verify events were received\n\t\t\t\tawait vi.waitFor(\n\t\t\t\t\tasync () => {\n\t\t\t\t\t\tawait connection.setCount(5);\n\t\t\t\t\t\tawait connection.setCount(8);\n\t\t\t\t\t\texpect(receivedEvents).toContain(5);\n\t\t\t\t\t\texpect(receivedEvents).toContain(8);\n\t\t\t\t\t},\n\t\t\t\t\t{ timeout: 10_000 },\n\t\t\t\t);\n\n\t\t\t\t// Clean up\n\t\t\t\tawait connection.dispose();\n\t\t\t});\n\n\t\t\ttest(\"should handle one-time events with once()\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create actor and connect\n\t\t\t\tconst handle = client.counter.getOrCreate([\"test-once\"]);\n\t\t\t\tconst connection = handle.connect();\n\n\t\t\t\t// Set up one-time event listener\n\t\t\t\tconst receivedEvents: number[] = [];\n\t\t\t\tconnection.once(\"newCount\", (count: number) => {\n\t\t\t\t\treceivedEvents.push(count);\n\t\t\t\t});\n\n\t\t\t\t// Trigger multiple events, but should only receive the first one\n\t\t\t\tawait connection.increment(5);\n\t\t\t\tawait connection.increment(3);\n\n\t\t\t\t// Verify only the first event was received\n\t\t\t\tawait vi.waitFor(() => {\n\t\t\t\t\texpect(receivedEvents).toEqual([5]);\n\t\t\t\t\texpect(receivedEvents).not.toContain(8);\n\t\t\t\t});\n\n\t\t\t\t// Clean up\n\t\t\t\tawait connection.dispose();\n\t\t\t});\n\n\t\t\ttest(\"should unsubscribe from events\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create actor and connect\n\t\t\t\tconst handle = client.counter.getOrCreate([\"test-unsubscribe\"]);\n\t\t\t\tconst connection = handle.connect();\n\n\t\t\t\t// Set up event listener with unsubscribe\n\t\t\t\tconst receivedEvents: number[] = [];\n\t\t\t\tconst unsubscribe = connection.on(\n\t\t\t\t\t\"newCount\",\n\t\t\t\t\t(count: number) => {\n\t\t\t\t\t\treceivedEvents.push(count);\n\t\t\t\t\t},\n\t\t\t\t);\n\n\t\t\t\t// TODO: SSE has race condition with subscriptions & publishing messages\n\t\t\t\t// Trigger first event\n\t\t\t\tawait vi.waitFor(async () => {\n\t\t\t\t\tawait connection.setCount(5);\n\t\t\t\t\texpect(receivedEvents).toEqual([5]);\n\t\t\t\t});\n\n\t\t\t\t// Unsubscribe\n\t\t\t\tunsubscribe();\n\n\t\t\t\t// Trigger second event, should not be received\n\t\t\t\tawait connection.setCount(8);\n\n\t\t\t\t// Verify only the first event was received\n\t\t\t\texpect(receivedEvents).not.toContain(8);\n\n\t\t\t\t// Clean up\n\t\t\t\tawait connection.dispose();\n\t\t\t});\n\t\t});\n\n\t\tdescribe(\"Connection Parameters\", () => {\n\t\t\ttest(\"should pass connection parameters\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create two connections with different params\n\t\t\t\tconst handle1 = client.counterWithParams.getOrCreate(\n\t\t\t\t\t[\"test-params\"],\n\t\t\t\t\t{\n\t\t\t\t\t\tparams: { name: \"user1\" },\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\tconst handle2 = client.counterWithParams.getOrCreate(\n\t\t\t\t\t[\"test-params\"],\n\t\t\t\t\t{\n\t\t\t\t\t\tparams: { name: \"user2\" },\n\t\t\t\t\t},\n\t\t\t\t);\n\n\t\t\t\tconst conn1 = handle1.connect();\n\t\t\t\tconst conn2 = handle2.connect();\n\n\t\t\t\t// HACK: Call an action to wait for the connections to be established\n\t\t\t\tawait conn1.getInitializers();\n\t\t\t\tawait conn2.getInitializers();\n\n\t\t\t\t// Get initializers to verify connection params were used\n\t\t\t\tconst initializers = await conn1.getInitializers();\n\n\t\t\t\t// Verify both connection names were recorded\n\t\t\t\texpect(initializers).toContain(\"user1\");\n\t\t\t\texpect(initializers).toContain(\"user2\");\n\n\t\t\t\t// Clean up\n\t\t\t\tawait conn1.dispose();\n\t\t\t\tawait conn2.dispose();\n\t\t\t});\n\t\t});\n\n\t\tdescribe(\"Lifecycle Hooks\", () => {\n\t\t\ttest.skipIf(\n\t\t\t\tdriverTestConfig.transport === \"sse\" &&\n\t\t\t\t\tdriverTestConfig.clientType === \"inline\",\n\t\t\t)(\"should trigger lifecycle hooks\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create and connect\n\t\t\t\tconst connHandle = client.counterWithLifecycle.getOrCreate(\n\t\t\t\t\t[\"test-lifecycle\"],\n\t\t\t\t\t{\n\t\t\t\t\t\tparams: { trackLifecycle: true },\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\tconst connection = connHandle.connect();\n\n\t\t\t\t// Verify lifecycle events were triggered\n\t\t\t\tconst events = await connection.getEvents();\n\t\t\t\texpect(events).toEqual([\n\t\t\t\t\t\"onStart\",\n\t\t\t\t\t\"onBeforeConnect\",\n\t\t\t\t\t\"onConnect\",\n\t\t\t\t]);\n\n\t\t\t\t// Disconnect should trigger onDisconnect\n\t\t\t\tawait connection.dispose();\n\n\t\t\t\tawait vi.waitFor(\n\t\t\t\t\tasync () => {\n\t\t\t\t\t\t// Reconnect to check if onDisconnect was called\n\t\t\t\t\t\tconst handle = client.counterWithLifecycle.getOrCreate([\n\t\t\t\t\t\t\t\"test-lifecycle\",\n\t\t\t\t\t\t]);\n\t\t\t\t\t\tconst finalEvents = await handle.getEvents();\n\t\t\t\t\t\texpect(finalEvents).toBeOneOf([\n\t\t\t\t\t\t\t// Still active\n\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\t\"onStart\",\n\t\t\t\t\t\t\t\t\"onBeforeConnect\",\n\t\t\t\t\t\t\t\t\"onConnect\",\n\t\t\t\t\t\t\t\t\"onDisconnect\",\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t// Went to sleep and woke back up\n\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\t\"onStart\",\n\t\t\t\t\t\t\t\t\"onBeforeConnect\",\n\t\t\t\t\t\t\t\t\"onConnect\",\n\t\t\t\t\t\t\t\t\"onDisconnect\",\n\t\t\t\t\t\t\t\t\"onStart\",\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\t// NOTE: High timeout required for Cloudflare Workers\n\t\t\t\t\t{\n\t\t\t\t\t\ttimeout: 10_000,\n\t\t\t\t\t\tinterval: 100,\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t});\n\t\t});\n\t});\n}\n","import { describe, expect, test, vi } from \"vitest\";\nimport type { DriverTestConfig } from \"../mod\";\nimport { setupDriverTest } from \"../utils\";\n\nexport function runActorConnStateTests(driverTestConfig: DriverTestConfig) {\n\tdescribe(\"Actor Connection State Tests\", () => {\n\t\tdescribe(\"Connection State Initialization\", () => {\n\t\t\ttest(\"should retrieve connection state\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Connect to the actor\n\t\t\t\tconst connection = client.connStateActor\n\t\t\t\t\t.getOrCreate()\n\t\t\t\t\t.connect();\n\n\t\t\t\t// Get the connection state\n\t\t\t\tconst connState = await connection.getConnectionState();\n\n\t\t\t\t// Verify the connection state structure\n\t\t\t\texpect(connState.id).toBeDefined();\n\t\t\t\texpect(connState.username).toBeDefined();\n\t\t\t\texpect(connState.role).toBeDefined();\n\t\t\t\texpect(connState.counter).toBeDefined();\n\t\t\t\texpect(connState.createdAt).toBeDefined();\n\n\t\t\t\t// Clean up\n\t\t\t\tawait connection.dispose();\n\t\t\t});\n\n\t\t\ttest(\"should initialize connection state with custom parameters\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Connect with custom parameters\n\t\t\t\tconst connection = client.connStateActor\n\t\t\t\t\t.getOrCreate([], {\n\t\t\t\t\t\tparams: {\n\t\t\t\t\t\t\tusername: \"testuser\",\n\t\t\t\t\t\t\trole: \"admin\",\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\t\t\t\t\t.connect();\n\n\t\t\t\t// Get the connection state\n\t\t\t\tconst connState = await connection.getConnectionState();\n\n\t\t\t\t// Verify the connection state was initialized with custom values\n\t\t\t\texpect(connState.username).toBe(\"testuser\");\n\t\t\t\texpect(connState.role).toBe(\"admin\");\n\n\t\t\t\t// Clean up\n\t\t\t\tawait connection.dispose();\n\t\t\t});\n\t\t});\n\n\t\tdescribe(\"Connection State Management\", () => {\n\t\t\ttest(\"should maintain unique state for each connection\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create multiple connections\n\t\t\t\tconst conn1 = client.connStateActor\n\t\t\t\t\t.getOrCreate([], {\n\t\t\t\t\t\tparams: { username: \"user1\" },\n\t\t\t\t\t})\n\t\t\t\t\t.connect();\n\n\t\t\t\tconst conn2 = client.connStateActor\n\t\t\t\t\t.getOrCreate([], {\n\t\t\t\t\t\tparams: { username: \"user2\" },\n\t\t\t\t\t})\n\t\t\t\t\t.connect();\n\n\t\t\t\t// Update connection state for each connection\n\t\t\t\tawait conn1.incrementConnCounter(5);\n\t\t\t\tawait conn2.incrementConnCounter(10);\n\n\t\t\t\t// Get state for each connection\n\t\t\t\tconst state1 = await conn1.getConnectionState();\n\t\t\t\tconst state2 = await conn2.getConnectionState();\n\n\t\t\t\t// Verify states are separate\n\t\t\t\texpect(state1.counter).toBe(5);\n\t\t\t\texpect(state2.counter).toBe(10);\n\t\t\t\texpect(state1.username).toBe(\"user1\");\n\t\t\t\texpect(state2.username).toBe(\"user2\");\n\n\t\t\t\t// Clean up\n\t\t\t\tawait conn1.dispose();\n\t\t\t\tawait conn2.dispose();\n\t\t\t});\n\n\t\t\ttest(\"should track connections in shared state\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create two connections\n\t\t\t\tconst handle = client.connStateActor.getOrCreate();\n\t\t\t\tconst conn1 = handle.connect();\n\t\t\t\tconst conn2 = handle.connect();\n\n\t\t\t\t// HACK: Wait for both connections to successfully connect by waiting for a round trip RPC\n\t\t\t\tawait conn1.getConnectionState();\n\t\t\t\tawait conn2.getConnectionState();\n\n\t\t\t\t// Get state1 for reference\n\t\t\t\tconst state1 = await conn1.getConnectionState();\n\n\t\t\t\t// Get connection IDs tracked by the actor\n\t\t\t\tconst connectionIds = await conn1.getConnectionIds();\n\n\t\t\t\t// There should be at least 2 connections tracked\n\t\t\t\texpect(connectionIds.length).toBeGreaterThanOrEqual(2);\n\n\t\t\t\t// Should include the ID of the first connection\n\t\t\t\texpect(connectionIds).toContain(state1.id);\n\n\t\t\t\t// Clean up\n\t\t\t\tawait conn1.dispose();\n\t\t\t\tawait conn2.dispose();\n\t\t\t});\n\n\t\t\ttest(\"should identify different connections in the same actor\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create two connections to the same actor\n\t\t\t\tconst handle = client.connStateActor.getOrCreate();\n\t\t\t\tconst conn1 = handle.connect();\n\t\t\t\tconst conn2 = handle.connect();\n\n\t\t\t\t// HACK: Wait for both connections to successfully connect by waiting for a round trip RPC\n\t\t\t\tawait conn1.getConnectionState();\n\t\t\t\tawait conn2.getConnectionState();\n\n\t\t\t\t// Get all connection states\n\t\t\t\tconst allStates = await conn1.getAllConnectionStates();\n\n\t\t\t\t// Should have at least 2 states\n\t\t\t\texpect(allStates.length).toBeGreaterThanOrEqual(2);\n\n\t\t\t\t// IDs should be unique\n\t\t\t\tconst ids = allStates.map((state) => state.id);\n\t\t\t\tconst uniqueIds = [...new Set(ids)];\n\t\t\t\texpect(uniqueIds.length).toBe(ids.length);\n\n\t\t\t\t// Clean up\n\t\t\t\tawait conn1.dispose();\n\t\t\t\tawait conn2.dispose();\n\t\t\t});\n\t\t});\n\n\t\tdescribe(\"Connection Lifecycle\", () => {\n\t\t\ttest.skipIf(\n\t\t\t\tdriverTestConfig.transport === \"sse\" &&\n\t\t\t\t\tdriverTestConfig.clientType === \"inline\",\n\t\t\t)(\"should track connection and disconnection events\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\tconst debugHandle = client.connStateActor.getOrCreate(\n\t\t\t\t\tundefined,\n\t\t\t\t\t{\n\t\t\t\t\t\tparams: { noCount: true },\n\t\t\t\t\t},\n\t\t\t\t);\n\n\t\t\t\t// Create a connection\n\t\t\t\tconst conn = client.connStateActor.getOrCreate().connect();\n\n\t\t\t\t// Get the connection state\n\t\t\t\tconst connState = await conn.getConnectionState();\n\n\t\t\t\t// Verify the connection is tracked\n\t\t\t\tawait vi.waitFor(async () => {\n\t\t\t\t\tconst connectionIds = await debugHandle.getConnectionIds();\n\t\t\t\t\texpect(connectionIds).toContain(connState.id);\n\t\t\t\t});\n\n\t\t\t\t// Initial disconnection count\n\t\t\t\tawait vi.waitFor(async () => {\n\t\t\t\t\tconst disconnects =\n\t\t\t\t\t\tawait debugHandle.getDisconnectionCount();\n\t\t\t\t\texpect(disconnects).toBe(0);\n\t\t\t\t});\n\n\t\t\t\t// Dispose the connection\n\t\t\t\tawait conn.dispose();\n\n\t\t\t\t// Validate conn count\n\t\t\t\tawait vi.waitFor(\n\t\t\t\t\tasync () => {\n\t\t\t\t\t\tconsole.log(\"disconnects before\");\n\t\t\t\t\t\tconst disconnects =\n\t\t\t\t\t\t\tawait debugHandle.getDisconnectionCount();\n\t\t\t\t\t\tconsole.log(\"disconnects\", disconnects);\n\t\t\t\t\t\texpect(disconnects).toBe(1);\n\t\t\t\t\t},\n\t\t\t\t\t// SSE takes a long time to disconnect on CF Workers\n\t\t\t\t\t{\n\t\t\t\t\t\ttimeout: 10_000,\n\t\t\t\t\t\tinterval: 100,\n\t\t\t\t\t},\n\t\t\t\t);\n\n\t\t\t\t// Create a new connection to check the disconnection count\n\t\t\t\tconst newConn = client.connStateActor.getOrCreate().connect();\n\n\t\t\t\t// Verify the connection is tracked\n\t\t\t\tawait vi.waitFor(async () => {\n\t\t\t\t\tconst connectionIds = await debugHandle.getConnectionIds();\n\t\t\t\t\tconsole.log(\"conn ids\", connectionIds);\n\t\t\t\t\texpect(connectionIds.length).toBe(1);\n\t\t\t\t});\n\n\t\t\t\t// Clean up\n\t\t\t\tawait newConn.dispose();\n\n\t\t\t\t// Verify disconnection was tracked\n\t\t\t\tawait vi.waitFor(\n\t\t\t\t\tasync () => {\n\t\t\t\t\t\tconsole.log(\"A\");\n\t\t\t\t\t\tconst disconnects =\n\t\t\t\t\t\t\tawait debugHandle.getDisconnectionCount();\n\t\t\t\t\t\tconsole.log(`B ${disconnects}`);\n\t\t\t\t\t\texpect(disconnects).toBe(2);\n\t\t\t\t\t},\n\t\t\t\t\t// SSE takes a long time to disconnect on CF Workers\n\t\t\t\t\t{\n\t\t\t\t\t\ttimeout: 10_000,\n\t\t\t\t\t\tinterval: 100,\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t});\n\n\t\t\ttest(\"should update connection state\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create a connection\n\t\t\t\tconst conn = client.connStateActor.getOrCreate().connect();\n\n\t\t\t\t// Get the initial state\n\t\t\t\tconst initialState = await conn.getConnectionState();\n\t\t\t\texpect(initialState.username).toBe(\"anonymous\");\n\n\t\t\t\t// Update the connection state\n\t\t\t\tconst updatedState = await conn.updateConnection({\n\t\t\t\t\tusername: \"newname\",\n\t\t\t\t\trole: \"moderator\",\n\t\t\t\t});\n\n\t\t\t\t// Verify the state was updated\n\t\t\t\texpect(updatedState.username).toBe(\"newname\");\n\t\t\t\texpect(updatedState.role).toBe(\"moderator\");\n\n\t\t\t\t// Get the state again to verify persistence\n\t\t\t\tconst latestState = await conn.getConnectionState();\n\t\t\t\texpect(latestState.username).toBe(\"newname\");\n\t\t\t\texpect(latestState.role).toBe(\"moderator\");\n\n\t\t\t\t// Clean up\n\t\t\t\tawait conn.dispose();\n\t\t\t});\n\t\t});\n\n\t\tdescribe(\"Connection Communication\", () => {\n\t\t\ttest(\"should send messages to specific connections\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create two connections\n\t\t\t\tconst handle = client.connStateActor.getOrCreate();\n\t\t\t\tconst conn1 = handle.connect();\n\t\t\t\tconst conn2 = handle.connect();\n\n\t\t\t\t// Get connection states\n\t\t\t\tconst state1 = await conn1.getConnectionState();\n\t\t\t\tconst state2 = await conn2.getConnectionState();\n\n\t\t\t\t// Set up event listener on second connection\n\t\t\t\tconst receivedMessages: any[] = [];\n\t\t\t\tconn2.on(\"directMessage\", (data) => {\n\t\t\t\t\treceivedMessages.push(data);\n\t\t\t\t});\n\n\t\t\t\t// TODO: SSE has race condition between subscrib eand publish message\n\t\t\t\tawait vi.waitFor(async () => {\n\t\t\t\t\t// Send message from first connection to second\n\t\t\t\t\tconst success = await conn1.sendToConnection(\n\t\t\t\t\t\tstate2.id,\n\t\t\t\t\t\t\"Hello from conn1\",\n\t\t\t\t\t);\n\t\t\t\t\texpect(success).toBe(true);\n\n\t\t\t\t\t// Verify message was received\n\t\t\t\t\texpect(receivedMessages.length).toBe(1);\n\t\t\t\t\texpect(receivedMessages[0].from).toBe(state1.id);\n\t\t\t\t\texpect(receivedMessages[0].message).toBe(\n\t\t\t\t\t\t\"Hello from conn1\",\n\t\t\t\t\t);\n\t\t\t\t});\n\n\t\t\t\t// Clean up\n\t\t\t\tawait conn1.dispose();\n\t\t\t\tawait conn2.dispose();\n\t\t\t});\n\t\t});\n\t});\n}\n","import { describe } from \"vitest\";\nimport type { DriverTestConfig } from \"../mod\";\nimport { runActorScheduleTests } from \"./actor-schedule\";\nimport { runActorSleepTests } from \"./actor-sleep\";\nimport { runActorStateTests } from \"./actor-state\";\n\nexport function runActorDriverTests(driverTestConfig: DriverTestConfig) {\n\tdescribe(\"Actor Driver Tests\", () => {\n\t\t// Run state persistence tests\n\t\trunActorStateTests(driverTestConfig);\n\n\t\t// Run scheduled alarms tests\n\t\trunActorScheduleTests(driverTestConfig);\n\t});\n}\n\n/** Actor driver tests that need to be tested for all transport mechanisms. */\nexport function runActorDriverTestsWithTransport(\n\tdriverTestConfig: DriverTestConfig,\n) {\n\tdescribe(\"Actor Driver Tests\", () => {\n\t\t// Run actor sleep tests\n\t\trunActorSleepTests(driverTestConfig);\n\t});\n}\n","import { describe, expect, test } from \"vitest\";\nimport type { DriverTestConfig } from \"../mod\";\nimport { setupDriverTest, waitFor } from \"../utils\";\n\nexport function runActorScheduleTests(driverTestConfig: DriverTestConfig) {\n\tdescribe.skipIf(driverTestConfig.skip?.schedule)(\n\t\t\"Actor Schedule Tests\",\n\t\t() => {\n\t\t\t// See alarm + actor sleeping test in actor-sleep.ts\n\n\t\t\tdescribe(\"Scheduled Alarms\", () => {\n\t\t\t\ttest(\"executes c.schedule.at() with specific timestamp\", async (c) => {\n\t\t\t\t\tconst { client } = await setupDriverTest(\n\t\t\t\t\t\tc,\n\t\t\t\t\t\tdriverTestConfig,\n\t\t\t\t\t);\n\n\t\t\t\t\t// Create instance\n\t\t\t\t\tconst scheduled = client.scheduled.getOrCreate();\n\n\t\t\t\t\t// Schedule a task to run using timestamp\n\t\t\t\t\tconst timestamp = Date.now() + 250;\n\t\t\t\t\tawait scheduled.scheduleTaskAt(timestamp);\n\n\t\t\t\t\t// Wait for longer than the scheduled time\n\t\t\t\t\tawait waitFor(driverTestConfig, 500);\n\n\t\t\t\t\t// Verify the scheduled task ran\n\t\t\t\t\tconst lastRun = await scheduled.getLastRun();\n\t\t\t\t\tconst scheduledCount = await scheduled.getScheduledCount();\n\n\t\t\t\t\texpect(lastRun).toBeGreaterThan(0);\n\t\t\t\t\texpect(scheduledCount).toBe(1);\n\t\t\t\t});\n\n\t\t\t\ttest(\"executes c.schedule.after() with delay\", async (c) => {\n\t\t\t\t\tconst { client } = await setupDriverTest(\n\t\t\t\t\t\tc,\n\t\t\t\t\t\tdriverTestConfig,\n\t\t\t\t\t);\n\n\t\t\t\t\t// Create instance\n\t\t\t\t\tconst scheduled = client.scheduled.getOrCreate();\n\n\t\t\t\t\t// Schedule a task to run using delay\n\t\t\t\t\tawait scheduled.scheduleTaskAfter(250);\n\n\t\t\t\t\t// Wait for longer than the scheduled time\n\t\t\t\t\tawait waitFor(driverTestConfig, 500);\n\n\t\t\t\t\t// Verify the scheduled task ran\n\t\t\t\t\tconst lastRun = await scheduled.getLastRun();\n\t\t\t\t\tconst scheduledCount = await scheduled.getScheduledCount();\n\n\t\t\t\t\texpect(lastRun).toBeGreaterThan(0);\n\t\t\t\t\texpect(scheduledCount).toBe(1);\n\t\t\t\t});\n\n\t\t\t\ttest(\"multiple scheduled tasks execute in order\", async (c) => {\n\t\t\t\t\tconst { client } = await setupDriverTest(\n\t\t\t\t\t\tc,\n\t\t\t\t\t\tdriverTestConfig,\n\t\t\t\t\t);\n\n\t\t\t\t\t// Create instance\n\t\t\t\t\tconst scheduled = client.scheduled.getOrCreate();\n\n\t\t\t\t\t// Reset history to start fresh\n\t\t\t\t\tawait scheduled.clearHistory();\n\n\t\t\t\t\t// Schedule multiple tasks with different delays\n\t\t\t\t\tawait scheduled.scheduleTaskAfterWithId(\"first\", 250);\n\t\t\t\t\tawait scheduled.scheduleTaskAfterWithId(\"second\", 750);\n\t\t\t\t\tawait scheduled.scheduleTaskAfterWithId(\"third\", 1250);\n\n\t\t\t\t\t// Wait for first task only\n\t\t\t\t\tawait waitFor(driverTestConfig, 500);\n\t\t\t\t\tconst history1 = await scheduled.getTaskHistory();\n\t\t\t\t\texpect(history1).toEqual([\"first\"]);\n\n\t\t\t\t\t// Wait for second task\n\t\t\t\t\tawait waitFor(driverTestConfig, 500);\n\t\t\t\t\tconst history2 = await scheduled.getTaskHistory();\n\t\t\t\t\texpect(history2).toEqual([\"first\", \"second\"]);\n\n\t\t\t\t\t// Wait for third task\n\t\t\t\t\tawait waitFor(driverTestConfig, 500);\n\t\t\t\t\tconst history3 = await scheduled.getTaskHistory();\n\t\t\t\t\texpect(history3).toEqual([\"first\", \"second\", \"third\"]);\n\t\t\t\t});\n\t\t\t});\n\t\t},\n\t);\n}\n","import { describe, expect, test } from \"vitest\";\nimport { SLEEP_TIMEOUT } from \"../../../fixtures/driver-test-suite/sleep\";\nimport type { DriverTestConfig } from \"../mod\";\nimport { setupDriverTest, waitFor } from \"../utils\";\n\n// TODO: These tests are broken with fake timers because `_sleep` requires\n// background async promises that have a race condition with calling\n// `getCounts`\n//\n// To fix this, we need to imeplment some event system to be able to check for\n// when an actor has slept. OR we can expose an HTTP endpoint on the manager\n// for `.test` that checks if na actor is sleeping that we can poll.\nexport function runActorSleepTests(driverTestConfig: DriverTestConfig) {\n\tdescribe.skipIf(driverTestConfig.skip?.sleep)(\"Actor Sleep Tests\", () => {\n\t\ttest(\"actor sleep persists state\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t// Create actor\n\t\t\tconst sleepActor = client.sleep.getOrCreate();\n\n\t\t\t// Verify initial sleep count\n\t\t\t{\n\t\t\t\tconst { startCount, sleepCount } = await sleepActor.getCounts();\n\t\t\t\texpect(sleepCount).toBe(0);\n\t\t\t\texpect(startCount).toBe(1);\n\t\t\t}\n\n\t\t\t// Trigger sleep\n\t\t\tawait sleepActor.triggerSleep();\n\n\t\t\t// HACK: Wait for sleep to finish in background\n\t\t\tawait waitFor(driverTestConfig, 250);\n\n\t\t\t// Get sleep count after restore\n\t\t\t{\n\t\t\t\tconst { startCount, sleepCount } = await sleepActor.getCounts();\n\t\t\t\texpect(sleepCount).toBe(1);\n\t\t\t\texpect(startCount).toBe(2);\n\t\t\t}\n\t\t});\n\n\t\ttest(\"actor sleep persists state with connect\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t// Create actor with persistent connection\n\t\t\tconst sleepActor = client.sleep.getOrCreate().connect();\n\n\t\t\t// Verify initial sleep count\n\t\t\t{\n\t\t\t\tconst { startCount, sleepCount } = await sleepActor.getCounts();\n\t\t\t\texpect(sleepCount).toBe(0);\n\t\t\t\texpect(startCount).toBe(1);\n\t\t\t}\n\n\t\t\t// Trigger sleep\n\t\t\tawait sleepActor.triggerSleep();\n\n\t\t\t// Disconnect to allow reconnection\n\t\t\tawait sleepActor.dispose();\n\n\t\t\t// HACK: Wait for sleep to finish in background\n\t\t\tawait waitFor(driverTestConfig, SLEEP_TIMEOUT + 250);\n\n\t\t\t// Reconnect to get sleep count after restore\n\t\t\tconst sleepActor2 = client.sleep.getOrCreate();\n\t\t\t{\n\t\t\t\tconst { startCount, sleepCount } =\n\t\t\t\t\tawait sleepActor2.getCounts();\n\t\t\t\texpect(sleepCount).toBe(1);\n\t\t\t\texpect(startCount).toBe(2);\n\t\t\t}\n\t\t});\n\n\t\ttest(\"actor automatically sleeps after timeout\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t// Create actor\n\t\t\tconst sleepActor = client.sleep.getOrCreate();\n\n\t\t\t// Verify initial sleep count\n\t\t\t{\n\t\t\t\tconst { startCount, sleepCount } = await sleepActor.getCounts();\n\t\t\t\texpect(sleepCount).toBe(0);\n\t\t\t\texpect(startCount).toBe(1);\n\t\t\t}\n\n\t\t\t// Wait for sleep\n\t\t\tawait waitFor(driverTestConfig, SLEEP_TIMEOUT + 250);\n\n\t\t\t// Get sleep count after restore\n\t\t\t{\n\t\t\t\tconst { startCount, sleepCount } = await sleepActor.getCounts();\n\t\t\t\texpect(sleepCount).toBe(1);\n\t\t\t\texpect(startCount).toBe(2);\n\t\t\t}\n\t\t});\n\n\t\ttest(\"actor automatically sleeps after timeout with connect\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t// Create actor with persistent connection\n\t\t\tconst sleepActor = client.sleep.getOrCreate().connect();\n\n\t\t\t// Verify initial sleep count\n\t\t\t{\n\t\t\t\tconst { startCount, sleepCount } = await sleepActor.getCounts();\n\t\t\t\texpect(sleepCount).toBe(0);\n\t\t\t\texpect(startCount).toBe(1);\n\t\t\t}\n\n\t\t\t// Disconnect to allow actor to sleep\n\t\t\tawait sleepActor.dispose();\n\n\t\t\t// Wait for sleep\n\t\t\tawait waitFor(driverTestConfig, SLEEP_TIMEOUT + 250);\n\n\t\t\t// Reconnect to get sleep count after restore\n\t\t\tconst sleepActor2 = client.sleep.getOrCreate();\n\t\t\t{\n\t\t\t\tconst { startCount, sleepCount } =\n\t\t\t\t\tawait sleepActor2.getCounts();\n\t\t\t\texpect(sleepCount).toBe(1);\n\t\t\t\texpect(startCount).toBe(2);\n\t\t\t}\n\t\t});\n\n\t\ttest(\"rpc calls keep actor awake\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t// Create actor\n\t\t\tconst sleepActor = client.sleep.getOrCreate();\n\n\t\t\t// Verify initial state\n\t\t\t{\n\t\t\t\tconst { startCount, sleepCount } = await sleepActor.getCounts();\n\t\t\t\texpect(sleepCount).toBe(0);\n\t\t\t\texpect(startCount).toBe(1);\n\t\t\t}\n\n\t\t\t// Wait almost until sleep timeout, then make RPC call\n\t\t\tawait waitFor(driverTestConfig, SLEEP_TIMEOUT - 250);\n\n\t\t\t// RPC call should reset the sleep timer\n\t\t\t{\n\t\t\t\tconst { startCount, sleepCount } = await sleepActor.getCounts();\n\t\t\t\texpect(sleepCount).toBe(0); // Haven't slept yet\n\t\t\t\texpect(startCount).toBe(1); // Still the same instance\n\t\t\t}\n\n\t\t\t// Wait another partial timeout period - actor should still be awake\n\t\t\tawait waitFor(driverTestConfig, SLEEP_TIMEOUT - 250);\n\n\t\t\t// Actor should still be awake\n\t\t\t{\n\t\t\t\tconst { startCount, sleepCount } = await sleepActor.getCounts();\n\t\t\t\texpect(sleepCount).toBe(0); // Still haven't slept\n\t\t\t\texpect(startCount).toBe(1); // Still the same instance\n\t\t\t}\n\n\t\t\t// Now wait for full timeout without any RPC calls\n\t\t\tawait waitFor(driverTestConfig, SLEEP_TIMEOUT + 250);\n\n\t\t\t// Actor should have slept and restarted\n\t\t\t{\n\t\t\t\tconst { startCount, sleepCount } = await sleepActor.getCounts();\n\t\t\t\texpect(sleepCount).toBe(1); // Slept once\n\t\t\t\texpect(startCount).toBe(2); // New instance after sleep\n\t\t\t}\n\t\t});\n\n\t\ttest(\"alarms keep actor awake\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t// Create actor\n\t\t\tconst sleepActor = client.sleep.getOrCreate();\n\n\t\t\t// Verify initial state\n\t\t\t{\n\t\t\t\tconst { startCount, sleepCount } = await sleepActor.getCounts();\n\t\t\t\texpect(sleepCount).toBe(0);\n\t\t\t\texpect(startCount).toBe(1);\n\t\t\t}\n\n\t\t\t// Set an alarm to keep the actor awake\n\t\t\tawait sleepActor.setAlarm(SLEEP_TIMEOUT - 250);\n\n\t\t\t// Wait until after SLEEPT_IMEOUT to validate the actor did not sleep\n\t\t\tawait waitFor(driverTestConfig, SLEEP_TIMEOUT + 250);\n\n\t\t\t// Actor should not have slept\n\t\t\t{\n\t\t\t\tconst { startCount, sleepCount } = await sleepActor.getCounts();\n\t\t\t\texpect(sleepCount).toBe(0);\n\t\t\t\texpect(startCount).toBe(1);\n\t\t\t}\n\t\t});\n\n\t\ttest(\"alarms wake actors\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t// Create actor\n\t\t\tconst sleepActor = client.sleep.getOrCreate();\n\n\t\t\t// Verify initial state\n\t\t\t{\n\t\t\t\tconst { startCount, sleepCount } = await sleepActor.getCounts();\n\t\t\t\texpect(sleepCount).toBe(0);\n\t\t\t\texpect(startCount).toBe(1);\n\t\t\t}\n\n\t\t\t// Set an alarm to keep the actor awake\n\t\t\tawait sleepActor.setAlarm(SLEEP_TIMEOUT + 250);\n\n\t\t\t// Wait until after SLEEPT_IMEOUT to validate the actor did not sleep\n\t\t\tawait waitFor(driverTestConfig, SLEEP_TIMEOUT + 200);\n\n\t\t\t// Actor should not have slept\n\t\t\t{\n\t\t\t\tconst { startCount, sleepCount } = await sleepActor.getCounts();\n\t\t\t\texpect(sleepCount).toBe(1);\n\t\t\t\texpect(startCount).toBe(2);\n\t\t\t}\n\t\t});\n\n\t\ttest(\"long running rpcs keep actor awake\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t// Create actor\n\t\t\tconst sleepActor = client.sleepWithLongRpc.getOrCreate().connect();\n\n\t\t\t// Verify initial state\n\t\t\t{\n\t\t\t\tconst { startCount, sleepCount } = await sleepActor.getCounts();\n\t\t\t\texpect(sleepCount).toBe(0);\n\t\t\t\texpect(startCount).toBe(1);\n\t\t\t}\n\n\t\t\t// Start a long-running RPC that takes longer than the sleep timeout\n\t\t\tconst waitPromise = new Promise((resolve) =>\n\t\t\t\tsleepActor.once(\"waiting\", resolve),\n\t\t\t);\n\t\t\tconst longRunningPromise = sleepActor.longRunningRpc();\n\t\t\tawait waitPromise;\n\t\t\tawait waitFor(driverTestConfig, SLEEP_TIMEOUT + 250);\n\t\t\tawait sleepActor.finishLongRunningRpc();\n\t\t\tawait longRunningPromise;\n\n\t\t\t// Actor should still be the same instance (didn't sleep during RPC)\n\t\t\t{\n\t\t\t\tconst { startCount, sleepCount } = await sleepActor.getCounts();\n\t\t\t\texpect(sleepCount).toBe(0); // Hasn't slept\n\t\t\t\texpect(startCount).toBe(1); // Same instance\n\t\t\t}\n\t\t\tawait sleepActor.dispose();\n\n\t\t\t// Now wait for the sleep timeout\n\t\t\tawait waitFor(driverTestConfig, SLEEP_TIMEOUT + 250);\n\n\t\t\t// Actor should have slept after the timeout\n\t\t\tconst sleepActor2 = client.sleepWithLongRpc.getOrCreate();\n\t\t\t{\n\t\t\t\tconst { startCount, sleepCount } =\n\t\t\t\t\tawait sleepActor2.getCounts();\n\t\t\t\texpect(sleepCount).toBe(1); // Slept once\n\t\t\t\texpect(startCount).toBe(2); // New instance after sleep\n\t\t\t}\n\t\t});\n\n\t\ttest(\"active raw websockets keep actor awake\", async (c) => {\n\t\t\tconst { client, endpoint: baseUrl } = await setupDriverTest(\n\t\t\t\tc,\n\t\t\t\tdriverTestConfig,\n\t\t\t);\n\n\t\t\t// Create actor\n\t\t\tconst sleepActor = client.sleepWithRawWebSocket.getOrCreate();\n\n\t\t\t// Verify initial state\n\t\t\t{\n\t\t\t\tconst { startCount, sleepCount } = await sleepActor.getCounts();\n\t\t\t\texpect(sleepCount).toBe(0);\n\t\t\t\texpect(startCount).toBe(1);\n\t\t\t}\n\n\t\t\t// Connect WebSocket\n\t\t\tconst ws = await sleepActor.websocket();\n\n\t\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\t\tws.onopen = () => resolve();\n\t\t\t\tws.onerror = reject;\n\t\t\t});\n\n\t\t\t// Wait for connection message\n\t\t\tawait new Promise<void>((resolve) => {\n\t\t\t\tws.onmessage = (event) => {\n\t\t\t\t\tconst data = JSON.parse(event.data);\n\t\t\t\t\tif (data.type === \"connected\") {\n\t\t\t\t\t\tresolve();\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t});\n\n\t\t\t// Wait longer than sleep timeout while keeping WebSocket connected\n\t\t\tawait waitFor(driverTestConfig, SLEEP_TIMEOUT + 250);\n\n\t\t\t// Send a message to check if actor is still alive\n\t\t\tws.send(JSON.stringify({ type: \"getCounts\" }));\n\n\t\t\tconst counts = await new Promise<any>((resolve) => {\n\t\t\t\tws.onmessage = (event) => {\n\t\t\t\t\tconst data = JSON.parse(event.data);\n\t\t\t\t\tif (data.type === \"counts\") {\n\t\t\t\t\t\tresolve(data);\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t});\n\n\t\t\t// Actor should still be the same instance (didn't sleep while WebSocket connected)\n\t\t\texpect(counts.sleepCount).toBe(0);\n\t\t\texpect(counts.startCount).toBe(1);\n\n\t\t\t// Close WebSocket\n\t\t\tws.close();\n\n\t\t\t// Wait for sleep timeout after WebSocket closed\n\t\t\tawait waitFor(driverTestConfig, SLEEP_TIMEOUT + 250);\n\n\t\t\t// Actor should have slept after WebSocket closed\n\t\t\t{\n\t\t\t\tconst { startCount, sleepCount } = await sleepActor.getCounts();\n\t\t\t\texpect(sleepCount).toBe(1); // Slept once\n\t\t\t\texpect(startCount).toBe(2); // New instance after sleep\n\t\t\t}\n\t\t});\n\n\t\ttest(\"active raw fetch requests keep actor awake\", async (c) => {\n\t\t\tconst { client, endpoint: baseUrl } = await setupDriverTest(\n\t\t\t\tc,\n\t\t\t\tdriverTestConfig,\n\t\t\t);\n\n\t\t\t// Create actor\n\t\t\tconst sleepActor = client.sleepWithRawHttp.getOrCreate();\n\n\t\t\t// Verify initial state\n\t\t\t{\n\t\t\t\tconst { startCount, sleepCount } = await sleepActor.getCounts();\n\t\t\t\texpect(sleepCount).toBe(0);\n\t\t\t\texpect(startCount).toBe(1);\n\t\t\t}\n\n\t\t\t// Start a long-running fetch request\n\t\t\tconst fetchDuration = SLEEP_TIMEOUT + 250;\n\t\t\tconst fetchPromise = sleepActor.fetch(\n\t\t\t\t`long-request?duration=${fetchDuration}`,\n\t\t\t);\n\n\t\t\t// Wait for the fetch to complete\n\t\t\tconst response = await fetchPromise;\n\t\t\tconst result = (await response.json()) as { completed: boolean };\n\t\t\texpect(result.completed).toBe(true);\n\t\t\t{\n\t\t\t\tconst { startCount, sleepCount, requestCount } =\n\t\t\t\t\tawait sleepActor.getCounts();\n\t\t\t\texpect(sleepCount).toBe(0);\n\t\t\t\texpect(startCount).toBe(1);\n\t\t\t\texpect(requestCount).toBe(1);\n\t\t\t}\n\n\t\t\t// Wait for sleep timeout\n\t\t\tawait waitFor(driverTestConfig, SLEEP_TIMEOUT + 250);\n\n\t\t\t// Actor should have slept after timeout\n\t\t\t{\n\t\t\t\tconst { startCount, sleepCount } = await sleepActor.getCounts();\n\t\t\t\texpect(sleepCount).toBe(1); // Slept once\n\t\t\t\texpect(startCount).toBe(2); // New instance after sleep\n\t\t\t}\n\t\t});\n\n\t\ttest(\"noSleep option disables sleeping\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t// Create actor with noSleep option\n\t\t\tconst sleepActor = client.sleepWithNoSleepOption.getOrCreate();\n\n\t\t\t// Verify initial state\n\t\t\t{\n\t\t\t\tconst { startCount, sleepCount } = await sleepActor.getCounts();\n\t\t\t\texpect(sleepCount).toBe(0);\n\t\t\t\texpect(startCount).toBe(1);\n\t\t\t}\n\n\t\t\t// Wait longer than sleep timeout\n\t\t\tawait waitFor(driverTestConfig, SLEEP_TIMEOUT + 250);\n\n\t\t\t// Actor should NOT have slept due to noSleep option\n\t\t\t{\n\t\t\t\tconst { startCount, sleepCount } = await sleepActor.getCounts();\n\t\t\t\texpect(sleepCount).toBe(0); // Never slept\n\t\t\t\texpect(startCount).toBe(1); // Still the same instance\n\t\t\t}\n\n\t\t\t// Wait even longer to be sure\n\t\t\tawait waitFor(driverTestConfig, SLEEP_TIMEOUT + 250);\n\n\t\t\t// Actor should still not have slept\n\t\t\t{\n\t\t\t\tconst { startCount, sleepCount } = await sleepActor.getCounts();\n\t\t\t\texpect(sleepCount).toBe(0); // Never slept\n\t\t\t\texpect(startCount).toBe(1); // Still the same instance\n\t\t\t}\n\t\t});\n\t});\n}\n","import { actor, type UniversalWebSocket } from \"rivetkit\";\nimport { promiseWithResolvers } from \"rivetkit/utils\";\n\nexport const SLEEP_TIMEOUT = 1000;\n\nexport const sleep = actor({\n\tstate: { startCount: 0, sleepCount: 0 },\n\tonStart: (c) => {\n\t\tc.state.startCount += 1;\n\t},\n\tonStop: (c) => {\n\t\tc.state.sleepCount += 1;\n\t},\n\tactions: {\n\t\ttriggerSleep: (c) => {\n\t\t\tc.sleep();\n\t\t},\n\t\tgetCounts: (c) => {\n\t\t\treturn {\n\t\t\t\tstartCount: c.state.startCount,\n\t\t\t\tsleepCount: c.state.sleepCount,\n\t\t\t};\n\t\t},\n\t\tsetAlarm: async (c, duration: number) => {\n\t\t\tawait c.schedule.after(duration, \"onAlarm\");\n\t\t},\n\t\tonAlarm: (c) => {\n\t\t\tc.log.info(\"alarm called\");\n\t\t},\n\t},\n\toptions: {\n\t\tsleepTimeout: SLEEP_TIMEOUT,\n\t},\n});\n\nexport const sleepWithLongRpc = actor({\n\tstate: { startCount: 0, sleepCount: 0 },\n\tcreateVars: () =>\n\t\t({}) as { longRunningResolve: PromiseWithResolvers<void> },\n\tonStart: (c) => {\n\t\tc.state.startCount += 1;\n\t},\n\tonStop: (c) => {\n\t\tc.state.sleepCount += 1;\n\t},\n\tactions: {\n\t\tgetCounts: (c) => {\n\t\t\treturn {\n\t\t\t\tstartCount: c.state.startCount,\n\t\t\t\tsleepCount: c.state.sleepCount,\n\t\t\t};\n\t\t},\n\t\tlongRunningRpc: async (c) => {\n\t\t\tc.log.info(\"starting long running rpc\");\n\t\t\tc.vars.longRunningResolve = promiseWithResolvers();\n\t\t\tc.broadcast(\"waiting\");\n\t\t\tawait c.vars.longRunningResolve.promise;\n\t\t\tc.log.info(\"finished long running rpc\");\n\t\t},\n\t\tfinishLongRunningRpc: (c) => c.vars.longRunningResolve?.resolve(),\n\t},\n\toptions: {\n\t\tsleepTimeout: SLEEP_TIMEOUT,\n\t},\n});\n\nexport const sleepWithRawHttp = actor({\n\tstate: { startCount: 0, sleepCount: 0, requestCount: 0 },\n\tonStart: (c) => {\n\t\tc.state.startCount += 1;\n\t},\n\tonStop: (c) => {\n\t\tc.state.sleepCount += 1;\n\t},\n\tonFetch: async (c, request) => {\n\t\tc.state.requestCount += 1;\n\t\tconst url = new URL(request.url);\n\n\t\tif (url.pathname === \"/long-request\") {\n\t\t\tconst duration = parseInt(\n\t\t\t\turl.searchParams.get(\"duration\") || \"1000\",\n\t\t\t);\n\t\t\tc.log.info({ msg: \"starting long fetch request\", duration });\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, duration));\n\t\t\tc.log.info(\"finished long fetch request\");\n\t\t\treturn new Response(JSON.stringify({ completed: true }), {\n\t\t\t\theaders: { \"Content-Type\": \"application/json\" },\n\t\t\t});\n\t\t}\n\n\t\treturn new Response(\"Not Found\", { status: 404 });\n\t},\n\tactions: {\n\t\tgetCounts: (c) => {\n\t\t\treturn {\n\t\t\t\tstartCount: c.state.startCount,\n\t\t\t\tsleepCount: c.state.sleepCount,\n\t\t\t\trequestCount: c.state.requestCount,\n\t\t\t};\n\t\t},\n\t},\n\toptions: {\n\t\tsleepTimeout: SLEEP_TIMEOUT,\n\t},\n});\n\nexport const sleepWithRawWebSocket = actor({\n\tstate: { startCount: 0, sleepCount: 0, connectionCount: 0 },\n\tonStart: (c) => {\n\t\tc.state.startCount += 1;\n\t},\n\tonStop: (c) => {\n\t\tc.state.sleepCount += 1;\n\t},\n\tonWebSocket: (c, websocket: UniversalWebSocket, opts) => {\n\t\tc.state.connectionCount += 1;\n\t\tc.log.info({\n\t\t\tmsg: \"websocket connected\",\n\t\t\tconnectionCount: c.state.connectionCount,\n\t\t});\n\n\t\twebsocket.send(\n\t\t\tJSON.stringify({\n\t\t\t\ttype: \"connected\",\n\t\t\t\tconnectionCount: c.state.connectionCount,\n\t\t\t}),\n\t\t);\n\n\t\twebsocket.addEventListener(\"message\", (event: any) => {\n\t\t\tconst data = event.data;\n\t\t\tif (typeof data === \"string\") {\n\t\t\t\ttry {\n\t\t\t\t\tconst parsed = JSON.parse(data);\n\t\t\t\t\tif (parsed.type === \"getCounts\") {\n\t\t\t\t\t\twebsocket.send(\n\t\t\t\t\t\t\tJSON.stringify({\n\t\t\t\t\t\t\t\ttype: \"counts\",\n\t\t\t\t\t\t\t\tstartCount: c.state.startCount,\n\t\t\t\t\t\t\t\tsleepCount: c.state.sleepCount,\n\t\t\t\t\t\t\t\tconnectionCount: c.state.connectionCount,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t);\n\t\t\t\t\t} else if (parsed.type === \"keepAlive\") {\n\t\t\t\t\t\t// Just acknowledge to keep connection alive\n\t\t\t\t\t\twebsocket.send(JSON.stringify({ type: \"ack\" }));\n\t\t\t\t\t}\n\t\t\t\t} catch {\n\t\t\t\t\t// Echo non-JSON messages\n\t\t\t\t\twebsocket.send(data);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\twebsocket.addEventListener(\"close\", () => {\n\t\t\tc.state.connectionCount -= 1;\n\t\t\tc.log.info({\n\t\t\t\tmsg: \"websocket disconnected\",\n\t\t\t\tconnectionCount: c.state.connectionCount,\n\t\t\t});\n\t\t});\n\t},\n\tactions: {\n\t\tgetCounts: (c) => {\n\t\t\treturn {\n\t\t\t\tstartCount: c.state.startCount,\n\t\t\t\tsleepCount: c.state.sleepCount,\n\t\t\t\tconnectionCount: c.state.connectionCount,\n\t\t\t};\n\t\t},\n\t},\n\toptions: {\n\t\tsleepTimeout: SLEEP_TIMEOUT,\n\t},\n});\n\nexport const sleepWithNoSleepOption = actor({\n\tstate: { startCount: 0, sleepCount: 0 },\n\tonStart: (c) => {\n\t\tc.state.startCount += 1;\n\t},\n\tonStop: (c) => {\n\t\tc.state.sleepCount += 1;\n\t},\n\tactions: {\n\t\tgetCounts: (c) => {\n\t\t\treturn {\n\t\t\t\tstartCount: c.state.startCount,\n\t\t\t\tsleepCount: c.state.sleepCount,\n\t\t\t};\n\t\t},\n\t},\n\toptions: {\n\t\tsleepTimeout: SLEEP_TIMEOUT,\n\t\tnoSleep: true,\n\t},\n});\n","import { describe, expect, test } from \"vitest\";\nimport type { DriverTestConfig } from \"../mod\";\nimport { setupDriverTest } from \"../utils\";\n\nexport function runActorStateTests(driverTestConfig: DriverTestConfig) {\n\tdescribe(\"Actor State Tests\", () => {\n\t\tdescribe(\"State Persistence\", () => {\n\t\t\ttest(\"persists state between actor instances\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create instance and increment\n\t\t\t\tconst counterInstance = client.counter.getOrCreate();\n\t\t\t\tconst initialCount = await counterInstance.increment(5);\n\t\t\t\texpect(initialCount).toBe(5);\n\n\t\t\t\t// Get a fresh reference to the same actor and verify state persisted\n\t\t\t\tconst sameInstance = client.counter.getOrCreate();\n\t\t\t\tconst persistedCount = await sameInstance.increment(3);\n\t\t\t\texpect(persistedCount).toBe(8);\n\t\t\t});\n\n\t\t\ttest(\"restores state after actor disconnect/reconnect\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create actor and set initial state\n\t\t\t\tconst counterInstance = client.counter.getOrCreate();\n\t\t\t\tawait counterInstance.increment(5);\n\n\t\t\t\t// Reconnect to the same actor\n\t\t\t\tconst reconnectedInstance = client.counter.getOrCreate();\n\t\t\t\tconst persistedCount = await reconnectedInstance.increment(0);\n\t\t\t\texpect(persistedCount).toBe(5);\n\t\t\t});\n\n\t\t\ttest(\"maintains separate state for different actors\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create first counter with specific key\n\t\t\t\tconst counterA = client.counter.getOrCreate([\"counter-a\"]);\n\t\t\t\tawait counterA.increment(5);\n\n\t\t\t\t// Create second counter with different key\n\t\t\t\tconst counterB = client.counter.getOrCreate([\"counter-b\"]);\n\t\t\t\tawait counterB.increment(10);\n\n\t\t\t\t// Verify state is separate\n\t\t\t\tconst countA = await counterA.increment(0);\n\t\t\t\tconst countB = await counterB.increment(0);\n\t\t\t\texpect(countA).toBe(5);\n\t\t\t\texpect(countB).toBe(10);\n\t\t\t});\n\t\t});\n\t});\n}\n","import { describe, expect, test } from \"vitest\";\nimport {\n\tINTERNAL_ERROR_CODE,\n\tINTERNAL_ERROR_DESCRIPTION,\n} from \"@/actor/errors\";\nimport { assertUnreachable } from \"@/actor/utils\";\nimport type { DriverTestConfig } from \"../mod\";\nimport { setupDriverTest } from \"../utils\";\n\nexport function runActorErrorHandlingTests(driverTestConfig: DriverTestConfig) {\n\tdescribe(\"Actor Error Handling Tests\", () => {\n\t\tdescribe(\"UserError Handling\", () => {\n\t\t\ttest(\"should handle simple UserError with message\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Try to call an action that throws a simple UserError\n\t\t\t\tconst handle = client.errorHandlingActor.getOrCreate();\n\n\t\t\t\ttry {\n\t\t\t\t\tawait handle.throwSimpleError();\n\t\t\t\t\t// If we get here, the test should fail\n\t\t\t\t\texpect(true).toBe(false); // This should not be reached\n\t\t\t\t} catch (error: any) {\n\t\t\t\t\t// Verify the error properties\n\t\t\t\t\texpect(error.message).toBe(\"Simple error message\");\n\t\t\t\t\t// Default code is \"user_error\" when not specified\n\t\t\t\t\texpect(error.code).toBe(\"user_error\");\n\t\t\t\t\t// No metadata by default\n\t\t\t\t\texpect(error.metadata).toBeUndefined();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\ttest(\"should handle detailed UserError with code and metadata\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Try to call an action that throws a detailed UserError\n\t\t\t\tconst handle = client.errorHandlingActor.getOrCreate();\n\n\t\t\t\ttry {\n\t\t\t\t\tawait handle.throwDetailedError();\n\t\t\t\t\t// If we get here, the test should fail\n\t\t\t\t\texpect(true).toBe(false); // This should not be reached\n\t\t\t\t} catch (error: any) {\n\t\t\t\t\t// Verify the error properties\n\t\t\t\t\texpect(error.message).toBe(\"Detailed error message\");\n\t\t\t\t\texpect(error.code).toBe(\"detailed_error\");\n\t\t\t\t\texpect(error.metadata).toBeDefined();\n\t\t\t\t\texpect(error.metadata.reason).toBe(\"test\");\n\t\t\t\t\texpect(error.metadata.timestamp).toBeDefined();\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t\tdescribe(\"Internal Error Handling\", () => {\n\t\t\ttest(\"should convert internal errors to safe format\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Try to call an action that throws an internal error\n\t\t\t\tconst handle = client.errorHandlingActor.getOrCreate();\n\n\t\t\t\ttry {\n\t\t\t\t\tawait handle.throwInternalError();\n\t\t\t\t\t// If we get here, the test should fail\n\t\t\t\t\texpect(true).toBe(false); // This should not be reached\n\t\t\t\t} catch (error: any) {\n\t\t\t\t\t// Verify the error is converted to a safe format\n\t\t\t\t\texpect(error.code).toBe(INTERNAL_ERROR_CODE);\n\t\t\t\t\t// Original error details should not be exposed\n\t\t\t\t\texpect(error.message).toBe(INTERNAL_ERROR_DESCRIPTION);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t\t// TODO: Does not work with fake timers\n\t\tdescribe.skip(\"Action Timeout\", () => {\n\t\t\ttest(\"should handle action timeouts with custom duration\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Call an action that should time out\n\t\t\t\tconst handle = client.errorHandlingActor.getOrCreate();\n\n\t\t\t\t// This should throw a timeout error because errorHandlingActor has\n\t\t\t\t// a 500ms timeout and this action tries to run for much longer\n\t\t\t\tconst timeoutPromise = handle.timeoutAction();\n\n\t\t\t\ttry {\n\t\t\t\t\tawait timeoutPromise;\n\t\t\t\t\t// If we get here, the test failed - timeout didn't occur\n\t\t\t\t\texpect(true).toBe(false); // This should not be reached\n\t\t\t\t} catch (error: any) {\n\t\t\t\t\t// Verify it's a timeout error\n\t\t\t\t\texpect(error.message).toMatch(/timed out/i);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\ttest(\"should successfully run actions within timeout\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Call an action with a delay shorter than the timeout\n\t\t\t\tconst handle = client.errorHandlingActor.getOrCreate();\n\n\t\t\t\t// This should succeed because 200ms < 500ms timeout\n\t\t\t\tconst result = await handle.delayedAction(200);\n\t\t\t\texpect(result).toBe(\"Completed after 200ms\");\n\t\t\t});\n\n\t\t\ttest(\"should respect different timeouts for different actors\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// The following actors have different timeout settings:\n\t\t\t\t// customTimeoutActor: 200ms timeout\n\t\t\t\t// standardTimeoutActor: default timeout (much longer)\n\n\t\t\t\t// This should fail - 300ms delay with 200ms timeout\n\t\t\t\ttry {\n\t\t\t\t\tawait client.customTimeoutActor.getOrCreate().slowAction();\n\t\t\t\t\t// Should not reach here\n\t\t\t\t\texpect(true).toBe(false);\n\t\t\t\t} catch (error: any) {\n\t\t\t\t\texpect(error.message).toMatch(/timed out/i);\n\t\t\t\t}\n\n\t\t\t\t// This should succeed - 50ms delay with 200ms timeout\n\t\t\t\tconst quickResult = await client.customTimeoutActor\n\t\t\t\t\t.getOrCreate()\n\t\t\t\t\t.quickAction();\n\t\t\t\texpect(quickResult).toBe(\"Quick action completed\");\n\t\t\t});\n\t\t});\n\n\t\tdescribe(\"Error Recovery\", () => {\n\t\t\ttest(\"should continue working after errors\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\tconst handle = client.errorHandlingActor.getOrCreate();\n\n\t\t\t\t// Trigger an error\n\t\t\t\ttry {\n\t\t\t\t\tawait handle.throwSimpleError();\n\t\t\t\t} catch (error) {\n\t\t\t\t\t// Ignore error\n\t\t\t\t}\n\n\t\t\t\t// Actor should still work after error\n\t\t\t\tconst result = await handle.successfulAction();\n\t\t\t\texpect(result).toBe(\"success\");\n\t\t\t});\n\t\t});\n\t});\n}\n","import { describe, expect, test } from \"vitest\";\nimport type { ActorError } from \"@/client/mod\";\nimport type { DriverTestConfig } from \"../mod\";\nimport { setupDriverTest } from \"../utils\";\n\nexport function runActorHandleTests(driverTestConfig: DriverTestConfig) {\n\tdescribe(\"Actor Handle Tests\", () => {\n\t\tdescribe(\"Access Methods\", () => {\n\t\t\ttest(\"should use .get() to access a actor\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create actor first\n\t\t\t\tawait client.counter.create([\"test-get-handle\"]);\n\n\t\t\t\t// Access using get\n\t\t\t\tconst handle = client.counter.get([\"test-get-handle\"]);\n\n\t\t\t\t// Verify Action works\n\t\t\t\tconst count = await handle.increment(5);\n\t\t\t\texpect(count).toBe(5);\n\n\t\t\t\tconst retrievedCount = await handle.getCount();\n\t\t\t\texpect(retrievedCount).toBe(5);\n\t\t\t});\n\n\t\t\ttest(\"should use .getForId() to access a actor by ID\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create a actor first to get its ID\n\t\t\t\tconst handle = client.counter.getOrCreate([\n\t\t\t\t\t\"test-get-for-id-handle\",\n\t\t\t\t]);\n\t\t\t\tawait handle.increment(3);\n\t\t\t\tconst actorId = await handle.resolve();\n\n\t\t\t\t// Access using getForId\n\t\t\t\tconst idHandle = client.counter.getForId(actorId);\n\n\t\t\t\t// Verify Action works and state is preserved\n\t\t\t\tconst count = await idHandle.getCount();\n\t\t\t\texpect(count).toBe(3);\n\n\t\t\t\tconst newCount = await idHandle.increment(4);\n\t\t\t\texpect(newCount).toBe(7);\n\t\t\t});\n\n\t\t\ttest(\"should use .getOrCreate() to access or create a actor\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Access using getOrCreate - should create the actor\n\t\t\t\tconst handle = client.counter.getOrCreate([\n\t\t\t\t\t\"test-get-or-create-handle\",\n\t\t\t\t]);\n\n\t\t\t\t// Verify Action works\n\t\t\t\tconst count = await handle.increment(7);\n\t\t\t\texpect(count).toBe(7);\n\n\t\t\t\t// Get the same actor again - should retrieve existing actor\n\t\t\t\tconst sameHandle = client.counter.getOrCreate([\n\t\t\t\t\t\"test-get-or-create-handle\",\n\t\t\t\t]);\n\t\t\t\tconst retrievedCount = await sameHandle.getCount();\n\t\t\t\texpect(retrievedCount).toBe(7);\n\t\t\t});\n\n\t\t\ttest(\"should use (await create()) to create and return a handle\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create actor and get handle\n\t\t\t\tconst handle = await client.counter.create([\n\t\t\t\t\t\"test-create-handle\",\n\t\t\t\t]);\n\n\t\t\t\t// Verify Action works\n\t\t\t\tconst count = await handle.increment(9);\n\t\t\t\texpect(count).toBe(9);\n\n\t\t\t\tconst retrievedCount = await handle.getCount();\n\t\t\t\texpect(retrievedCount).toBe(9);\n\t\t\t});\n\n\t\t\ttest(\"errors when calling create twice with the same key\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\tconst key = [\"duplicate-create-handle\", crypto.randomUUID()];\n\n\t\t\t\t// First create should succeed\n\t\t\t\tawait client.counter.create(key);\n\n\t\t\t\t// Second create with same key should throw ActorAlreadyExists\n\t\t\t\ttry {\n\t\t\t\t\tawait client.counter.create(key);\n\t\t\t\t\texpect.fail(\"did not error on duplicate create\");\n\t\t\t\t} catch (err) {\n\t\t\t\t\texpect((err as ActorError).group).toBe(\"actor\");\n\t\t\t\t\texpect((err as ActorError).code).toBe(\"already_exists\");\n\t\t\t\t}\n\t\t\t});\n\n\t\t\ttest(\".get().resolve() errors for non-existent actor\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\tconst missingId = `nonexistent-${crypto.randomUUID()}`;\n\n\t\t\t\ttry {\n\t\t\t\t\tawait client.counter.get([missingId]).resolve();\n\t\t\t\t\texpect.fail(\n\t\t\t\t\t\t\"did not error for get().resolve() on missing actor\",\n\t\t\t\t\t);\n\t\t\t\t} catch (err) {\n\t\t\t\t\texpect((err as ActorError).group).toBe(\"actor\");\n\t\t\t\t\texpect((err as ActorError).code).toBe(\"not_found\");\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t\tdescribe(\"Action Functionality\", () => {\n\t\t\ttest(\"should call actions directly on the handle\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\tconst handle = client.counter.getOrCreate([\n\t\t\t\t\t\"test-action-handle\",\n\t\t\t\t]);\n\n\t\t\t\t// Call multiple actions in sequence\n\t\t\t\tconst count1 = await handle.increment(3);\n\t\t\t\texpect(count1).toBe(3);\n\n\t\t\t\tconst count2 = await handle.increment(5);\n\t\t\t\texpect(count2).toBe(8);\n\n\t\t\t\tconst retrievedCount = await handle.getCount();\n\t\t\t\texpect(retrievedCount).toBe(8);\n\t\t\t});\n\n\t\t\ttest(\"should handle independent handles to the same actor\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create two handles to the same actor\n\t\t\t\tconst handle1 = client.counter.getOrCreate([\n\t\t\t\t\t\"test-multiple-handles\",\n\t\t\t\t]);\n\t\t\t\tconst handle2 = client.counter.get([\"test-multiple-handles\"]);\n\n\t\t\t\t// Call actions on both handles\n\t\t\t\tawait handle1.increment(3);\n\t\t\t\tconst count = await handle2.getCount();\n\n\t\t\t\t// Verify both handles access the same state\n\t\t\t\texpect(count).toBe(3);\n\n\t\t\t\tconst finalCount = await handle2.increment(4);\n\t\t\t\texpect(finalCount).toBe(7);\n\n\t\t\t\tconst checkCount = await handle1.getCount();\n\t\t\t\texpect(checkCount).toBe(7);\n\t\t\t});\n\n\t\t\ttest(\"should resolve a actor's ID\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\tconst handle = client.counter.getOrCreate([\"test-resolve-id\"]);\n\n\t\t\t\t// Call an action to ensure actor exists\n\t\t\t\tawait handle.increment(1);\n\n\t\t\t\t// Resolve the ID\n\t\t\t\tconst actorId = await handle.resolve();\n\n\t\t\t\t// Verify we got a valid ID (string)\n\t\t\t\texpect(typeof actorId).toBe(\"string\");\n\t\t\t\texpect(actorId).not.toBe(\"\");\n\n\t\t\t\t// Verify we can use this ID to get the actor\n\t\t\t\tconst idHandle = client.counter.getForId(actorId);\n\t\t\t\tconst count = await idHandle.getCount();\n\t\t\t\texpect(count).toBe(1);\n\t\t\t});\n\t\t});\n\n\t\tdescribe(\"Lifecycle Hooks\", () => {\n\t\t\ttest(\"should trigger lifecycle hooks on actor creation\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Get or create a new actor - this should trigger onStart\n\t\t\t\tconst handle = client.counterWithLifecycle.getOrCreate([\n\t\t\t\t\t\"test-lifecycle-handle\",\n\t\t\t\t]);\n\n\t\t\t\t// Verify onStart was triggered\n\t\t\t\tconst initialEvents = await handle.getEvents();\n\t\t\t\texpect(initialEvents).toContain(\"onStart\");\n\n\t\t\t\t// Create a separate handle to the same actor\n\t\t\t\tconst sameHandle = client.counterWithLifecycle.getOrCreate([\n\t\t\t\t\t\"test-lifecycle-handle\",\n\t\t\t\t]);\n\n\t\t\t\t// Verify events still include onStart but don't duplicate it\n\t\t\t\t// (onStart should only be called once when the actor is first created)\n\t\t\t\tconst events = await sameHandle.getEvents();\n\t\t\t\texpect(events).toContain(\"onStart\");\n\t\t\t\texpect(events.filter((e) => e === \"onStart\").length).toBe(1);\n\t\t\t});\n\n\t\t\ttest(\"should trigger lifecycle hooks for each Action call\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create a normal handle to view events\n\t\t\t\tconst viewHandle = client.counterWithLifecycle.getOrCreate([\n\t\t\t\t\t\"test-lifecycle-action\",\n\t\t\t\t]);\n\n\t\t\t\t// Initial state should only have onStart\n\t\t\t\tconst initialEvents = await viewHandle.getEvents();\n\t\t\t\texpect(initialEvents).toContain(\"onStart\");\n\t\t\t\texpect(initialEvents).not.toContain(\"onBeforeConnect\");\n\t\t\t\texpect(initialEvents).not.toContain(\"onConnect\");\n\t\t\t\texpect(initialEvents).not.toContain(\"onDisconnect\");\n\n\t\t\t\t// Create a handle with trackLifecycle enabled for testing Action calls\n\t\t\t\tconst trackingHandle = client.counterWithLifecycle.getOrCreate(\n\t\t\t\t\t[\"test-lifecycle-action\"],\n\t\t\t\t\t{ params: { trackLifecycle: true } },\n\t\t\t\t);\n\n\t\t\t\t// Make an Action call\n\t\t\t\tawait trackingHandle.increment(5);\n\n\t\t\t\t// Check that it triggered the lifecycle hooks\n\t\t\t\tconst eventsAfterAction = await viewHandle.getEvents();\n\n\t\t\t\t// Should have onBeforeConnect, onConnect, and onDisconnect for the Action call\n\t\t\t\texpect(eventsAfterAction).toContain(\"onBeforeConnect\");\n\t\t\t\texpect(eventsAfterAction).toContain(\"onConnect\");\n\t\t\t\texpect(eventsAfterAction).toContain(\"onDisconnect\");\n\n\t\t\t\t// Each should have count 1\n\t\t\t\texpect(\n\t\t\t\t\teventsAfterAction.filter((e) => e === \"onBeforeConnect\")\n\t\t\t\t\t\t.length,\n\t\t\t\t).toBe(1);\n\t\t\t\texpect(\n\t\t\t\t\teventsAfterAction.filter((e) => e === \"onConnect\").length,\n\t\t\t\t).toBe(1);\n\t\t\t\texpect(\n\t\t\t\t\teventsAfterAction.filter((e) => e === \"onDisconnect\")\n\t\t\t\t\t\t.length,\n\t\t\t\t).toBe(1);\n\n\t\t\t\t// Make another Action call\n\t\t\t\tawait trackingHandle.increment(10);\n\n\t\t\t\t// Check that it triggered another set of lifecycle hooks\n\t\t\t\tconst eventsAfterSecondAction = await viewHandle.getEvents();\n\n\t\t\t\t// Each hook should now have count 2\n\t\t\t\texpect(\n\t\t\t\t\teventsAfterSecondAction.filter(\n\t\t\t\t\t\t(e) => e === \"onBeforeConnect\",\n\t\t\t\t\t).length,\n\t\t\t\t).toBe(2);\n\t\t\t\texpect(\n\t\t\t\t\teventsAfterSecondAction.filter((e) => e === \"onConnect\")\n\t\t\t\t\t\t.length,\n\t\t\t\t).toBe(2);\n\t\t\t\texpect(\n\t\t\t\t\teventsAfterSecondAction.filter((e) => e === \"onDisconnect\")\n\t\t\t\t\t\t.length,\n\t\t\t\t).toBe(2);\n\t\t\t});\n\n\t\t\ttest(\"should trigger lifecycle hooks for each Action call across multiple handles\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create a normal handle to view events\n\t\t\t\tconst viewHandle = client.counterWithLifecycle.getOrCreate([\n\t\t\t\t\t\"test-lifecycle-multi-handle\",\n\t\t\t\t]);\n\n\t\t\t\t// Create two tracking handles to the same actor\n\t\t\t\tconst trackingHandle1 = client.counterWithLifecycle.getOrCreate(\n\t\t\t\t\t[\"test-lifecycle-multi-handle\"],\n\t\t\t\t\t{ params: { trackLifecycle: true } },\n\t\t\t\t);\n\n\t\t\t\tconst trackingHandle2 = client.counterWithLifecycle.getOrCreate(\n\t\t\t\t\t[\"test-lifecycle-multi-handle\"],\n\t\t\t\t\t{ params: { trackLifecycle: true } },\n\t\t\t\t);\n\n\t\t\t\t// Make Action calls on both handles\n\t\t\t\tawait trackingHandle1.increment(5);\n\t\t\t\tawait trackingHandle2.increment(10);\n\n\t\t\t\t// Check lifecycle hooks\n\t\t\t\tconst events = await viewHandle.getEvents();\n\n\t\t\t\t// Should have 1 onStart, 2 each of onBeforeConnect, onConnect, and onDisconnect\n\t\t\t\texpect(events.filter((e) => e === \"onStart\").length).toBe(1);\n\t\t\t\texpect(\n\t\t\t\t\tevents.filter((e) => e === \"onBeforeConnect\").length,\n\t\t\t\t).toBe(2);\n\t\t\t\texpect(events.filter((e) => e === \"onConnect\").length).toBe(2);\n\t\t\t\texpect(events.filter((e) => e === \"onDisconnect\").length).toBe(\n\t\t\t\t\t2,\n\t\t\t\t);\n\t\t\t});\n\t\t});\n\t});\n}\n","import { describe, expect, test } from \"vitest\";\nimport type { DriverTestConfig } from \"../mod\";\nimport { setupDriverTest } from \"../utils\";\n\nexport function runActorInlineClientTests(driverTestConfig: DriverTestConfig) {\n\tdescribe(\"Actor Inline Client Tests\", () => {\n\t\tdescribe(\"Stateless Client Calls\", () => {\n\t\t\ttest(\"should make stateless calls to other actors\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create the inline client actor\n\t\t\t\tconst inlineClientHandle = client.inlineClientActor.getOrCreate(\n\t\t\t\t\t[\"inline-client-test\"],\n\t\t\t\t);\n\n\t\t\t\t// Test calling counter.increment via inline client\n\t\t\t\tconst result = await inlineClientHandle.callCounterIncrement(5);\n\t\t\t\texpect(result).toBe(5);\n\n\t\t\t\t// Verify the counter state was actually updated\n\t\t\t\tconst counterState = await inlineClientHandle.getCounterState();\n\t\t\t\texpect(counterState).toBe(5);\n\n\t\t\t\t// Check that messages were logged\n\t\t\t\tconst messages = await inlineClientHandle.getMessages();\n\t\t\t\texpect(messages).toHaveLength(2);\n\t\t\t\texpect(messages[0]).toContain(\n\t\t\t\t\t\"Called counter.increment(5), result: 5\",\n\t\t\t\t);\n\t\t\t\texpect(messages[1]).toContain(\"Got counter state: 5\");\n\t\t\t});\n\n\t\t\ttest(\"should handle multiple stateless calls\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create the inline client actor\n\t\t\t\tconst inlineClientHandle = client.inlineClientActor.getOrCreate(\n\t\t\t\t\t[\"inline-client-multi\"],\n\t\t\t\t);\n\n\t\t\t\t// Clear any existing messages\n\t\t\t\tawait inlineClientHandle.clearMessages();\n\n\t\t\t\t// Make multiple calls\n\t\t\t\tconst result1 =\n\t\t\t\t\tawait inlineClientHandle.callCounterIncrement(3);\n\t\t\t\tconst result2 =\n\t\t\t\t\tawait inlineClientHandle.callCounterIncrement(7);\n\t\t\t\tconst finalState = await inlineClientHandle.getCounterState();\n\n\t\t\t\texpect(result1).toBe(3);\n\t\t\t\texpect(result2).toBe(10); // 3 + 7\n\t\t\t\texpect(finalState).toBe(10);\n\n\t\t\t\t// Check messages\n\t\t\t\tconst messages = await inlineClientHandle.getMessages();\n\t\t\t\texpect(messages).toHaveLength(3);\n\t\t\t\texpect(messages[0]).toContain(\n\t\t\t\t\t\"Called counter.increment(3), result: 3\",\n\t\t\t\t);\n\t\t\t\texpect(messages[1]).toContain(\n\t\t\t\t\t\"Called counter.increment(7), result: 10\",\n\t\t\t\t);\n\t\t\t\texpect(messages[2]).toContain(\"Got counter state: 10\");\n\t\t\t});\n\t\t});\n\n\t\tdescribe(\"Stateful Client Calls\", () => {\n\t\t\ttest(\"should connect to other actors and receive events\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create the inline client actor\n\t\t\t\tconst inlineClientHandle = client.inlineClientActor.getOrCreate(\n\t\t\t\t\t[\"inline-client-stateful\"],\n\t\t\t\t);\n\n\t\t\t\t// Clear any existing messages\n\t\t\t\tawait inlineClientHandle.clearMessages();\n\n\t\t\t\t// Test stateful connection with events\n\t\t\t\tconst result =\n\t\t\t\t\tawait inlineClientHandle.connectToCounterAndIncrement(4);\n\n\t\t\t\texpect(result.result1).toBe(4);\n\t\t\t\texpect(result.result2).toBe(12); // 4 + 8\n\t\t\t\texpect(result.events).toEqual([4, 12]); // Should have received both events\n\n\t\t\t\t// Check that message was logged\n\t\t\t\tconst messages = await inlineClientHandle.getMessages();\n\t\t\t\texpect(messages).toHaveLength(1);\n\t\t\t\texpect(messages[0]).toContain(\n\t\t\t\t\t\"Connected to counter, incremented by 4 and 8\",\n\t\t\t\t);\n\t\t\t\texpect(messages[0]).toContain(\"results: 4, 12\");\n\t\t\t\texpect(messages[0]).toContain(\"events: [4,12]\");\n\t\t\t});\n\n\t\t\ttest(\"should handle stateful connection independently\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create the inline client actor\n\t\t\t\tconst inlineClientHandle = client.inlineClientActor.getOrCreate(\n\t\t\t\t\t[\"inline-client-independent\"],\n\t\t\t\t);\n\n\t\t\t\t// Clear any existing messages\n\t\t\t\tawait inlineClientHandle.clearMessages();\n\n\t\t\t\t// Test with different increment values\n\t\t\t\tconst result =\n\t\t\t\t\tawait inlineClientHandle.connectToCounterAndIncrement(2);\n\n\t\t\t\texpect(result.result1).toBe(2);\n\t\t\t\texpect(result.result2).toBe(6); // 2 + 4\n\t\t\t\texpect(result.events).toEqual([2, 6]);\n\n\t\t\t\t// Verify the state is independent from previous tests\n\t\t\t\tconst messages = await inlineClientHandle.getMessages();\n\t\t\t\texpect(messages).toHaveLength(1);\n\t\t\t\texpect(messages[0]).toContain(\n\t\t\t\t\t\"Connected to counter, incremented by 2 and 4\",\n\t\t\t\t);\n\t\t\t});\n\t\t});\n\n\t\tdescribe(\"Mixed Client Usage\", () => {\n\t\t\ttest(\"should handle both stateless and stateful calls\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create the inline client actor\n\t\t\t\tconst inlineClientHandle = client.inlineClientActor.getOrCreate(\n\t\t\t\t\t[\"inline-client-mixed\"],\n\t\t\t\t);\n\n\t\t\t\t// Clear any existing messages\n\t\t\t\tawait inlineClientHandle.clearMessages();\n\n\t\t\t\t// Start with stateless calls\n\t\t\t\tawait inlineClientHandle.callCounterIncrement(1);\n\t\t\t\tconst statelessResult =\n\t\t\t\t\tawait inlineClientHandle.getCounterState();\n\t\t\t\texpect(statelessResult).toBe(1);\n\n\t\t\t\t// Then do stateful call\n\t\t\t\tconst statefulResult =\n\t\t\t\t\tawait inlineClientHandle.connectToCounterAndIncrement(3);\n\t\t\t\texpect(statefulResult.result1).toBe(3);\n\t\t\t\texpect(statefulResult.result2).toBe(9); // 3 + 6\n\n\t\t\t\t// Check all messages were logged\n\t\t\t\tconst messages = await inlineClientHandle.getMessages();\n\t\t\t\texpect(messages).toHaveLength(3);\n\t\t\t\texpect(messages[0]).toContain(\n\t\t\t\t\t\"Called counter.increment(1), result: 1\",\n\t\t\t\t);\n\t\t\t\texpect(messages[1]).toContain(\"Got counter state: 1\");\n\t\t\t\texpect(messages[2]).toContain(\n\t\t\t\t\t\"Connected to counter, incremented by 3 and 6\",\n\t\t\t\t);\n\t\t\t});\n\t\t});\n\t});\n}\n","import { describe, expect, test } from \"vitest\";\nimport { HEADER_ACTOR_QUERY } from \"@/driver-helpers/mod\";\nimport {\n\tcreateActorInspectorClient,\n\tcreateManagerInspectorClient,\n} from \"@/inspector/mod\";\nimport type { ActorQuery } from \"@/mod\";\nimport type { DriverTestConfig } from \"../mod\";\nimport { setupDriverTest } from \"../utils\";\n\nexport function runActorInspectorTests(driverTestConfig: DriverTestConfig) {\n\t// TODO: Add back\n\tdescribe.skip(\"Actor Inspector Tests\", () => {\n\t\tdescribe(\"Manager Inspector\", () => {\n\t\t\ttest(\"should respond to ping\", async (c) => {\n\t\t\t\tconst { endpoint } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\tconst http = createManagerInspectorClient(\n\t\t\t\t\t`${endpoint}/inspect`,\n\t\t\t\t\t{\n\t\t\t\t\t\theaders: {\n\t\t\t\t\t\t\tAuthorization: `Bearer token`,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t);\n\n\t\t\t\tconst response = await http.ping.$get();\n\t\t\t\texpect(response.status).toBe(200);\n\n\t\t\t\tconst data = await response.json();\n\t\t\t\texpect(data).toEqual({ message: \"pong\" });\n\t\t\t});\n\n\t\t\ttest(\"should get actors with pagination\", async (c) => {\n\t\t\t\tconst { client, endpoint } = await setupDriverTest(\n\t\t\t\t\tc,\n\t\t\t\t\tdriverTestConfig,\n\t\t\t\t);\n\n\t\t\t\t// Create some actors first\n\t\t\t\tawait client.counter.create([\"test-actor-1\"]);\n\t\t\t\tawait client.counter.create([\"test-actor-2\"]);\n\n\t\t\t\tconst http = createManagerInspectorClient(\n\t\t\t\t\t`${endpoint}/inspect`,\n\t\t\t\t\t{\n\t\t\t\t\t\theaders: {\n\t\t\t\t\t\t\tAuthorization: `Bearer token`,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t);\n\n\t\t\t\tconst response = await http.actors.$get({\n\t\t\t\t\tquery: { limit: \"1\" },\n\t\t\t\t});\n\t\t\t\texpect(response.status).toBe(200);\n\n\t\t\t\tconst data = await response.json();\n\t\t\t\texpect(data).toEqual(\n\t\t\t\t\texpect.arrayContaining([\n\t\t\t\t\t\texpect.objectContaining({ key: [\"test-actor-1\"] }),\n\t\t\t\t\t]),\n\t\t\t\t);\n\t\t\t\texpect(data.length).toBe(1);\n\t\t\t});\n\n\t\t\ttest(\"should get all actors with pagination\", async (c) => {\n\t\t\t\tconst { client, endpoint } = await setupDriverTest(\n\t\t\t\t\tc,\n\t\t\t\t\tdriverTestConfig,\n\t\t\t\t);\n\n\t\t\t\tconst actorKey1 = [\"test-cursor-1\"];\n\t\t\t\tconst actorKey2 = [\"test-cursor-2\"];\n\n\t\t\t\t// Create some actors first\n\t\t\t\tawait client.counter.create(actorKey1);\n\t\t\t\tawait client.counter.create(actorKey2);\n\n\t\t\t\tconst http = createManagerInspectorClient(\n\t\t\t\t\t`${endpoint}/inspect`,\n\t\t\t\t\t{\n\t\t\t\t\t\theaders: {\n\t\t\t\t\t\t\tAuthorization: `Bearer token`,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t);\n\n\t\t\t\tconst response = await http.actors.$get({\n\t\t\t\t\tquery: { limit: \"5\" },\n\t\t\t\t});\n\t\t\t\texpect(response.status).toBe(200);\n\n\t\t\t\tconst data = await response.json();\n\t\t\t\texpect(data).toEqual(\n\t\t\t\t\texpect.arrayContaining([\n\t\t\t\t\t\texpect.objectContaining({\n\t\t\t\t\t\t\tid: expect.any(String),\n\t\t\t\t\t\t\tkey: actorKey1,\n\t\t\t\t\t\t}),\n\t\t\t\t\t\texpect.objectContaining({\n\t\t\t\t\t\t\tid: expect.any(String),\n\t\t\t\t\t\t\tkey: actorKey2,\n\t\t\t\t\t\t}),\n\t\t\t\t\t]),\n\t\t\t\t);\n\t\t\t});\n\n\t\t\ttest(\"should handle invalid limit parameter\", async (c) => {\n\t\t\t\tconst { endpoint } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\tconst http = createManagerInspectorClient(\n\t\t\t\t\t`${endpoint}/inspect`,\n\t\t\t\t\t{\n\t\t\t\t\t\theaders: {\n\t\t\t\t\t\t\tAuthorization: `Bearer token`,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t);\n\n\t\t\t\tconst response = await http.actors.$get({\n\t\t\t\t\tquery: { limit: \"0\" },\n\t\t\t\t});\n\t\t\t\texpect(response.status).toBe(400);\n\t\t\t});\n\n\t\t\ttest(\"should create a new actor\", async (c) => {\n\t\t\t\tconst { endpoint } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\tconst http = createManagerInspectorClient(\n\t\t\t\t\t`${endpoint}/inspect`,\n\t\t\t\t\t{\n\t\t\t\t\t\theaders: {\n\t\t\t\t\t\t\tAuthorization: `Bearer token`,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t);\n\n\t\t\t\tconst response = await http.actors.$post({\n\t\t\t\t\tjson: {\n\t\t\t\t\t\tname: \"default\",\n\t\t\t\t\t\tkey: [\"test-create-actor\"],\n\t\t\t\t\t\tinput: {},\n\t\t\t\t\t},\n\t\t\t\t});\n\n\t\t\t\texpect(response.status).toBe(201);\n\t\t\t\tconst data = await response.json();\n\t\t\t\texpect(data).toEqual(\n\t\t\t\t\texpect.objectContaining({\n\t\t\t\t\t\tid: expect.any(String),\n\t\t\t\t\t\tname: \"default\",\n\t\t\t\t\t\tkey: [\"test-create-actor\"],\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t});\n\n\t\t\ttest(\"should get builds\", async (c) => {\n\t\t\t\tconst { endpoint } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\tconst http = createManagerInspectorClient(\n\t\t\t\t\t`${endpoint}/inspect`,\n\t\t\t\t\t{\n\t\t\t\t\t\theaders: {\n\t\t\t\t\t\t\tAuthorization: `Bearer token`,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t);\n\n\t\t\t\tconst response = await http.builds.$get();\n\t\t\t\texpect(response.status).toBe(200);\n\n\t\t\t\tconst data = await response.json();\n\t\t\t\texpect(data).toEqual(\n\t\t\t\t\texpect.arrayContaining([\n\t\t\t\t\t\texpect.objectContaining({ name: expect.any(String) }),\n\t\t\t\t\t]),\n\t\t\t\t);\n\t\t\t});\n\n\t\t\ttest(\"should get actor by id\", async (c) => {\n\t\t\t\tconst { client, endpoint } = await setupDriverTest(\n\t\t\t\t\tc,\n\t\t\t\t\tdriverTestConfig,\n\t\t\t\t);\n\n\t\t\t\t// Create an actor and get its ID\n\t\t\t\tconst handle = await client.counter.create([\"test-get-by-id\"]);\n\t\t\t\tconst actorId = await handle.resolve();\n\n\t\t\t\tconst http = createManagerInspectorClient(\n\t\t\t\t\t`${endpoint}/inspect`,\n\t\t\t\t\t{\n\t\t\t\t\t\theaders: {\n\t\t\t\t\t\t\tAuthorization: `Bearer token`,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t);\n\n\t\t\t\tconst response = await http.actor[\":id\"].$get({\n\t\t\t\t\tparam: { id: actorId },\n\t\t\t\t});\n\t\t\t\texpect(response.status).toBe(200);\n\n\t\t\t\tconst data = await response.json();\n\t\t\t\texpect(data).toHaveProperty(\"id\", actorId);\n\t\t\t});\n\n\t\t\ttest(\"should return 404 for non-existent actor\", async (c) => {\n\t\t\t\tconst { endpoint } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\tconst http = createManagerInspectorClient(\n\t\t\t\t\t`${endpoint}/inspect`,\n\t\t\t\t\t{\n\t\t\t\t\t\theaders: {\n\t\t\t\t\t\t\tAuthorization: `Bearer token`,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t);\n\n\t\t\t\tconst response = await http.actor[\":id\"].$get({\n\t\t\t\t\tparam: { id: \"non-existent-id\" },\n\t\t\t\t});\n\t\t\t\texpect(response.status).toBe(404);\n\n\t\t\t\tconst data = await response.json();\n\t\t\t\texpect(data).toEqual({ error: \"Actor not found\" });\n\t\t\t});\n\n\t\t\ttest(\"should get bootstrap data\", async (c) => {\n\t\t\t\tconst { client, endpoint } = await setupDriverTest(\n\t\t\t\t\tc,\n\t\t\t\t\tdriverTestConfig,\n\t\t\t\t);\n\n\t\t\t\t// Create at least one actor to ensure bootstrap has data\n\t\t\t\t// Create an actor and get its ID\n\t\t\t\tconst handle = await client.counter.create([\"test-bootstrap\"]);\n\t\t\t\tawait handle.resolve();\n\n\t\t\t\tconst http = createManagerInspectorClient(\n\t\t\t\t\t`${endpoint}/inspect`,\n\t\t\t\t\t{\n\t\t\t\t\t\theaders: {\n\t\t\t\t\t\t\tAuthorization: `Bearer token`,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t);\n\n\t\t\t\tconst response = await http.bootstrap.$get();\n\t\t\t\texpect(response.status).toBe(200);\n\n\t\t\t\tconst data = await response.json();\n\t\t\t\texpect(data.actors).toEqual(\n\t\t\t\t\texpect.arrayContaining([\n\t\t\t\t\t\texpect.objectContaining({\n\t\t\t\t\t\t\tkey: [\"test-bootstrap\"],\n\t\t\t\t\t\t\tname: \"counter\",\n\t\t\t\t\t\t}),\n\t\t\t\t\t]),\n\t\t\t\t);\n\t\t\t});\n\t\t});\n\n\t\tdescribe(\"Actor Inspector\", () => {\n\t\t\ttest(\"should handle actor not found\", async (c) => {\n\t\t\t\tconst { endpoint } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\tconst actorId = \"non-existing\";\n\n\t\t\t\tconst http = createActorInspectorClient(\n\t\t\t\t\t`${endpoint}/actors/inspect`,\n\t\t\t\t\t{\n\t\t\t\t\t\theaders: {\n\t\t\t\t\t\t\tAuthorization: `Bearer token`,\n\t\t\t\t\t\t\t[HEADER_ACTOR_QUERY]: JSON.stringify({\n\t\t\t\t\t\t\t\tgetForId: { name: \"counter\", actorId },\n\t\t\t\t\t\t\t} satisfies ActorQuery),\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t);\n\n\t\t\t\tconst response = await http.ping.$get();\n\t\t\t\texpect(response.ok).toBe(false);\n\t\t\t});\n\t\t\ttest(\"should respond to ping\", async (c) => {\n\t\t\t\tconst { client, endpoint } = await setupDriverTest(\n\t\t\t\t\tc,\n\t\t\t\t\tdriverTestConfig,\n\t\t\t\t);\n\n\t\t\t\tconst handle = await client.counter.create([\"test-ping\"]);\n\t\t\t\tconst actorId = await handle.resolve();\n\n\t\t\t\tconst http = createActorInspectorClient(\n\t\t\t\t\t`${endpoint}/actors/inspect`,\n\t\t\t\t\t{\n\t\t\t\t\t\theaders: {\n\t\t\t\t\t\t\tAuthorization: `Bearer token`,\n\t\t\t\t\t\t\t[HEADER_ACTOR_QUERY]: JSON.stringify({\n\t\t\t\t\t\t\t\tgetForId: { name: \"counter\", actorId },\n\t\t\t\t\t\t\t} satisfies ActorQuery),\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t);\n\n\t\t\t\tconst response = await http.ping.$get();\n\t\t\t\texpect(response.status).toBe(200);\n\n\t\t\t\tconst data = await response.json();\n\t\t\t\texpect(data).toEqual({ message: \"pong\" });\n\t\t\t});\n\n\t\t\ttest(\"should get actor state\", async (c) => {\n\t\t\t\tconst { client, endpoint } = await setupDriverTest(\n\t\t\t\t\tc,\n\t\t\t\t\tdriverTestConfig,\n\t\t\t\t);\n\n\t\t\t\tconst handle = await client.counter.create([\"test-state\"]);\n\t\t\t\tconst actorId = await handle.resolve();\n\n\t\t\t\t// Increment the counter to set some state\n\t\t\t\tawait handle.increment(5);\n\n\t\t\t\tconst http = createActorInspectorClient(\n\t\t\t\t\t`${endpoint}/actors/inspect`,\n\t\t\t\t\t{\n\t\t\t\t\t\theaders: {\n\t\t\t\t\t\t\tAuthorization: `Bearer token`,\n\t\t\t\t\t\t\t[HEADER_ACTOR_QUERY]: JSON.stringify({\n\t\t\t\t\t\t\t\tgetForId: { name: \"counter\", actorId },\n\t\t\t\t\t\t\t} satisfies ActorQuery),\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t);\n\n\t\t\t\tconst response = await http.state.$get();\n\t\t\t\texpect(response.status).toBe(200);\n\n\t\t\t\tconst data = await response.json();\n\t\t\t\texpect(data).toEqual({\n\t\t\t\t\tenabled: true,\n\t\t\t\t\tstate: expect.objectContaining({\n\t\t\t\t\t\tcount: 5,\n\t\t\t\t\t}),\n\t\t\t\t});\n\t\t\t});\n\n\t\t\ttest(\"should update actor state with replace\", async (c) => {\n\t\t\t\tconst { client, endpoint } = await setupDriverTest(\n\t\t\t\t\tc,\n\t\t\t\t\tdriverTestConfig,\n\t\t\t\t);\n\n\t\t\t\tconst handle = await client.counter.create([\n\t\t\t\t\t\"test-state-replace\",\n\t\t\t\t]);\n\t\t\t\tconst actorId = await handle.resolve();\n\n\t\t\t\tconst http = createActorInspectorClient(\n\t\t\t\t\t`${endpoint}/actors/inspect`,\n\t\t\t\t\t{\n\t\t\t\t\t\theaders: {\n\t\t\t\t\t\t\tAuthorization: `Bearer token`,\n\t\t\t\t\t\t\t[HEADER_ACTOR_QUERY]: JSON.stringify({\n\t\t\t\t\t\t\t\tgetForId: { name: \"counter\", actorId },\n\t\t\t\t\t\t\t} satisfies ActorQuery),\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t);\n\n\t\t\t\t// Replace the entire state\n\t\t\t\tconst response = await http.state.$patch({\n\t\t\t\t\tjson: {\n\t\t\t\t\t\treplace: { count: 10 },\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\texpect(response.status).toBe(200);\n\n\t\t\t\tconst data = await response.json();\n\t\t\t\texpect(data).toEqual({\n\t\t\t\t\tenabled: true,\n\t\t\t\t\tstate: { count: 10 },\n\t\t\t\t});\n\t\t\t});\n\n\t\t\ttest(\"should update actor state with patch\", async (c) => {\n\t\t\t\tconst { client, endpoint } = await setupDriverTest(\n\t\t\t\t\tc,\n\t\t\t\t\tdriverTestConfig,\n\t\t\t\t);\n\n\t\t\t\tconst handle = await client.counter.create([\n\t\t\t\t\t\"test-state-patch\",\n\t\t\t\t]);\n\t\t\t\tconst actorId = await handle.resolve();\n\n\t\t\t\t// Set initial state\n\t\t\t\tawait handle.increment(3);\n\n\t\t\t\tconst http = createActorInspectorClient(\n\t\t\t\t\t`${endpoint}/actors/inspect`,\n\t\t\t\t\t{\n\t\t\t\t\t\theaders: {\n\t\t\t\t\t\t\tAuthorization: `Bearer token`,\n\t\t\t\t\t\t\t[HEADER_ACTOR_QUERY]: JSON.stringify({\n\t\t\t\t\t\t\t\tgetForId: { name: \"counter\", actorId },\n\t\t\t\t\t\t\t} satisfies ActorQuery),\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t);\n\n\t\t\t\t// Patch the state\n\t\t\t\tconst response = await http.state.$patch({\n\t\t\t\t\tjson: {\n\t\t\t\t\t\tpatch: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\top: \"replace\",\n\t\t\t\t\t\t\t\tpath: \"/count\",\n\t\t\t\t\t\t\t\tvalue: 7,\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});\n\t\t\t\texpect(response.status).toBe(200);\n\n\t\t\t\tconst data = await response.json();\n\t\t\t\texpect(data).toEqual({\n\t\t\t\t\tenabled: true,\n\t\t\t\t\tstate: expect.objectContaining({\n\t\t\t\t\t\tcount: 7,\n\t\t\t\t\t}),\n\t\t\t\t});\n\t\t\t});\n\n\t\t\ttest(\"should get actor connections\", async (c) => {\n\t\t\t\tconst { client, endpoint } = await setupDriverTest(\n\t\t\t\t\tc,\n\t\t\t\t\tdriverTestConfig,\n\t\t\t\t);\n\n\t\t\t\tconst handle = await client.counter.create([\n\t\t\t\t\t\"test-connections\",\n\t\t\t\t]);\n\t\t\t\tconst actorId = await handle.resolve();\n\t\t\t\thandle.connect();\n\t\t\t\tawait handle.increment(10);\n\n\t\t\t\tconst http = createActorInspectorClient(\n\t\t\t\t\t`${endpoint}/actors/inspect`,\n\t\t\t\t\t{\n\t\t\t\t\t\theaders: {\n\t\t\t\t\t\t\tAuthorization: `Bearer token`,\n\t\t\t\t\t\t\t[HEADER_ACTOR_QUERY]: JSON.stringify({\n\t\t\t\t\t\t\t\tgetForId: { name: \"counter\", actorId },\n\t\t\t\t\t\t\t} satisfies ActorQuery),\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t);\n\n\t\t\t\tconst response = await http.connections.$get();\n\t\t\t\texpect(response.status).toBe(200);\n\n\t\t\t\tconst data = await response.json();\n\t\t\t\texpect(data.connections).toEqual(\n\t\t\t\t\texpect.arrayContaining([\n\t\t\t\t\t\texpect.objectContaining({\n\t\t\t\t\t\t\tid: expect.any(String),\n\t\t\t\t\t\t}),\n\t\t\t\t\t]),\n\t\t\t\t);\n\t\t\t});\n\n\t\t\ttest(\"should get actor events\", async (c) => {\n\t\t\t\tconst { client, endpoint } = await setupDriverTest(\n\t\t\t\t\tc,\n\t\t\t\t\tdriverTestConfig,\n\t\t\t\t);\n\n\t\t\t\tconst handle = await client.counter.create([\"test-events\"]);\n\t\t\t\tconst actorId = await handle.resolve();\n\n\t\t\t\thandle.connect();\n\t\t\t\tawait handle.increment(10);\n\n\t\t\t\tconst http = createActorInspectorClient(\n\t\t\t\t\t`${endpoint}/actors/inspect`,\n\t\t\t\t\t{\n\t\t\t\t\t\theaders: {\n\t\t\t\t\t\t\tAuthorization: `Bearer token`,\n\t\t\t\t\t\t\t[HEADER_ACTOR_QUERY]: JSON.stringify({\n\t\t\t\t\t\t\t\tgetForId: { name: \"counter\", actorId },\n\t\t\t\t\t\t\t} satisfies ActorQuery),\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t);\n\n\t\t\t\tconst response = await http.events.$get();\n\t\t\t\texpect(response.status).toBe(200);\n\n\t\t\t\tconst data = await response.json();\n\t\t\t\texpect(data.events).toEqual(\n\t\t\t\t\texpect.arrayContaining([\n\t\t\t\t\t\texpect.objectContaining({\n\t\t\t\t\t\t\ttype: \"broadcast\",\n\t\t\t\t\t\t\tid: expect.any(String),\n\t\t\t\t\t\t}),\n\t\t\t\t\t]),\n\t\t\t\t);\n\t\t\t});\n\n\t\t\ttest(\"should clear actor events\", async (c) => {\n\t\t\t\tconst { client, endpoint } = await setupDriverTest(\n\t\t\t\t\tc,\n\t\t\t\t\tdriverTestConfig,\n\t\t\t\t);\n\n\t\t\t\tconst handle = await client.counter.create([\n\t\t\t\t\t\"test-events-clear\",\n\t\t\t\t]);\n\t\t\t\tconst actorId = await handle.resolve();\n\n\t\t\t\thandle.connect();\n\t\t\t\tawait handle.increment(10);\n\n\t\t\t\tconst http = createActorInspectorClient(\n\t\t\t\t\t`${endpoint}/actors/inspect`,\n\t\t\t\t\t{\n\t\t\t\t\t\theaders: {\n\t\t\t\t\t\t\tAuthorization: `Bearer token`,\n\t\t\t\t\t\t\t[HEADER_ACTOR_QUERY]: JSON.stringify({\n\t\t\t\t\t\t\t\tgetForId: { name: \"counter\", actorId },\n\t\t\t\t\t\t\t} satisfies ActorQuery),\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t);\n\n\t\t\t\t{\n\t\t\t\t\tconst response = await http.events.$get();\n\t\t\t\t\texpect(response.status).toBe(200);\n\n\t\t\t\t\tconst data = await response.json();\n\t\t\t\t\texpect(data.events).toEqual(\n\t\t\t\t\t\texpect.arrayContaining([\n\t\t\t\t\t\t\texpect.objectContaining({\n\t\t\t\t\t\t\t\ttype: \"broadcast\",\n\t\t\t\t\t\t\t\tid: expect.any(String),\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}\n\n\t\t\t\tconst response = await http.events.clear.$post();\n\t\t\t\texpect(response.status).toBe(200);\n\t\t\t});\n\n\t\t\ttest(\"should get actor rpcs\", async (c) => {\n\t\t\t\tconst { client, endpoint } = await setupDriverTest(\n\t\t\t\t\tc,\n\t\t\t\t\tdriverTestConfig,\n\t\t\t\t);\n\n\t\t\t\tconst handle = await client.counter.create([\"test-rpcs\"]);\n\t\t\t\tconst actorId = await handle.resolve();\n\n\t\t\t\tconst http = createActorInspectorClient(\n\t\t\t\t\t`${endpoint}/actors/inspect`,\n\t\t\t\t\t{\n\t\t\t\t\t\theaders: {\n\t\t\t\t\t\t\tAuthorization: `Bearer token`,\n\t\t\t\t\t\t\t[HEADER_ACTOR_QUERY]: JSON.stringify({\n\t\t\t\t\t\t\t\tgetForId: { name: \"counter\", actorId },\n\t\t\t\t\t\t\t} satisfies ActorQuery),\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t);\n\n\t\t\t\tconst response = await http.rpcs.$get();\n\t\t\t\texpect(response.status).toBe(200);\n\n\t\t\t\tconst data = await response.json();\n\t\t\t\texpect(data).toEqual(\n\t\t\t\t\texpect.objectContaining({\n\t\t\t\t\t\trpcs: expect.arrayContaining([\"increment\", \"getCount\"]),\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t});\n\n\t\t\t// database is not officially supported yet\n\t\t\ttest.skip(\"should get actor database info\", async (c) => {\n\t\t\t\tconst { client, endpoint } = await setupDriverTest(\n\t\t\t\t\tc,\n\t\t\t\t\tdriverTestConfig,\n\t\t\t\t);\n\n\t\t\t\tconst handle = await client.counter.create([\"test-db\"]);\n\t\t\t\tconst actorId = await handle.resolve();\n\n\t\t\t\tconst http = createActorInspectorClient(\n\t\t\t\t\t`${endpoint}/actors/inspect`,\n\t\t\t\t\t{\n\t\t\t\t\t\theaders: {\n\t\t\t\t\t\t\tAuthorization: `Bearer token`,\n\t\t\t\t\t\t\t[HEADER_ACTOR_QUERY]: JSON.stringify({\n\t\t\t\t\t\t\t\tgetForId: { name: \"counter\", actorId },\n\t\t\t\t\t\t\t} satisfies ActorQuery),\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t);\n\n\t\t\t\tconst response = await http.db.$get();\n\t\t\t\texpect(response.status).toBe(200);\n\n\t\t\t\tconst data = await response.json();\n\t\t\t\t// Database might be enabled or disabled depending on actor configuration\n\t\t\t\texpect(data).toHaveProperty(\"enabled\");\n\t\t\t\texpect(typeof data.enabled).toBe(\"boolean\");\n\n\t\t\t\tif (data.enabled) {\n\t\t\t\t\texpect(data).toHaveProperty(\"db\");\n\t\t\t\t\texpect(Array.isArray(data.db)).toBe(true);\n\t\t\t\t} else {\n\t\t\t\t\texpect(data.db).toBe(null);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\ttest.skip(\"should execute database query when database is enabled\", async (c) => {\n\t\t\t\tconst { client, endpoint } = await setupDriverTest(\n\t\t\t\t\tc,\n\t\t\t\t\tdriverTestConfig,\n\t\t\t\t);\n\n\t\t\t\tconst handle = await client.counter.create([\"test-db-query\"]);\n\t\t\t\tconst actorId = await handle.resolve();\n\n\t\t\t\tconst http = createActorInspectorClient(\n\t\t\t\t\t`${endpoint}/actors/inspect`,\n\t\t\t\t\t{\n\t\t\t\t\t\theaders: {\n\t\t\t\t\t\t\tAuthorization: `Bearer token`,\n\t\t\t\t\t\t\t[HEADER_ACTOR_QUERY]: JSON.stringify({\n\t\t\t\t\t\t\t\tgetForId: { name: \"counter\", actorId },\n\t\t\t\t\t\t\t} satisfies ActorQuery),\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t);\n\n\t\t\t\t// First check if database is enabled\n\t\t\t\tconst dbInfoResponse = await http.db.$get();\n\t\t\t\tconst dbInfo = await dbInfoResponse.json();\n\n\t\t\t\tif (dbInfo.enabled) {\n\t\t\t\t\t// Execute a simple query\n\t\t\t\t\tconst queryResponse = await http.db.$post({\n\t\t\t\t\t\tjson: {\n\t\t\t\t\t\t\tquery: \"SELECT 1 as test\",\n\t\t\t\t\t\t\tparams: [],\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t\texpect(queryResponse.status).toBe(200);\n\n\t\t\t\t\tconst queryData = await queryResponse.json();\n\t\t\t\t\texpect(queryData).toHaveProperty(\"result\");\n\t\t\t\t} else {\n\t\t\t\t\t// If database is not enabled, the POST should return enabled: false\n\t\t\t\t\tconst queryResponse = await http.db.$post({\n\t\t\t\t\t\tjson: {\n\t\t\t\t\t\t\tquery: \"SELECT 1 as test\",\n\t\t\t\t\t\t\tparams: [],\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t\texpect(queryResponse.status).toBe(200);\n\n\t\t\t\t\tconst queryData = await queryResponse.json();\n\t\t\t\t\texpect(queryData).toEqual({ enabled: false });\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t});\n}\n","import { describe, expect, test } from \"vitest\";\nimport type { DriverTestConfig } from \"../mod\";\nimport { setupDriverTest } from \"../utils\";\n\nexport function runActorMetadataTests(driverTestConfig: DriverTestConfig) {\n\tdescribe(\"Actor Metadata Tests\", () => {\n\t\tdescribe(\"Actor Name\", () => {\n\t\t\ttest(\"should provide access to actor name\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Get the actor name\n\t\t\t\tconst handle = client.metadataActor.getOrCreate();\n\t\t\t\tconst actorName = await handle.getActorName();\n\n\t\t\t\t// Verify it matches the expected name\n\t\t\t\texpect(actorName).toBe(\"metadataActor\");\n\t\t\t});\n\n\t\t\ttest(\"should preserve actor name in state during onStart\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Get the stored actor name\n\t\t\t\tconst handle = client.metadataActor.getOrCreate();\n\t\t\t\tconst storedName = await handle.getStoredActorName();\n\n\t\t\t\t// Verify it was stored correctly\n\t\t\t\texpect(storedName).toBe(\"metadataActor\");\n\t\t\t});\n\t\t});\n\n\t\tdescribe(\"Actor Tags\", () => {\n\t\t\ttest(\"should provide access to tags\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create actor and set up test tags\n\t\t\t\tconst handle = client.metadataActor.getOrCreate();\n\t\t\t\tawait handle.setupTestTags({\n\t\t\t\t\tenv: \"test\",\n\t\t\t\t\tpurpose: \"metadata-test\",\n\t\t\t\t});\n\n\t\t\t\t// Get the tags\n\t\t\t\tconst tags = await handle.getTags();\n\n\t\t\t\t// Verify the tags are accessible\n\t\t\t\texpect(tags).toHaveProperty(\"env\");\n\t\t\t\texpect(tags.env).toBe(\"test\");\n\t\t\t\texpect(tags).toHaveProperty(\"purpose\");\n\t\t\t\texpect(tags.purpose).toBe(\"metadata-test\");\n\t\t\t});\n\n\t\t\ttest(\"should allow accessing individual tags\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create actor and set up test tags\n\t\t\t\tconst handle = client.metadataActor.getOrCreate();\n\t\t\t\tawait handle.setupTestTags({\n\t\t\t\t\tcategory: \"test-actor\",\n\t\t\t\t\tversion: \"1.0\",\n\t\t\t\t});\n\n\t\t\t\t// Get individual tags\n\t\t\t\tconst category = await handle.getTag(\"category\");\n\t\t\t\tconst version = await handle.getTag(\"version\");\n\t\t\t\tconst nonexistent = await handle.getTag(\"nonexistent\");\n\n\t\t\t\t// Verify the tag values\n\t\t\t\texpect(category).toBe(\"test-actor\");\n\t\t\t\texpect(version).toBe(\"1.0\");\n\t\t\t\texpect(nonexistent).toBeNull();\n\t\t\t});\n\t\t});\n\n\t\tdescribe(\"Metadata Structure\", () => {\n\t\t\ttest(\"should provide complete metadata object\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create actor and set up test metadata\n\t\t\t\tconst handle = client.metadataActor.getOrCreate();\n\t\t\t\tawait handle.setupTestTags({ type: \"metadata-test\" });\n\t\t\t\tawait handle.setupTestRegion(\"us-west-1\");\n\n\t\t\t\t// Get all metadata\n\t\t\t\tconst metadata = await handle.getMetadata();\n\n\t\t\t\t// Verify structure of metadata\n\t\t\t\texpect(metadata).toHaveProperty(\"name\");\n\t\t\t\texpect(metadata.name).toBe(\"metadataActor\");\n\n\t\t\t\texpect(metadata).toHaveProperty(\"tags\");\n\t\t\t\texpect(metadata.tags).toHaveProperty(\"type\");\n\t\t\t\texpect(metadata.tags.type).toBe(\"metadata-test\");\n\n\t\t\t\t// Region should be set to our test value\n\t\t\t\texpect(metadata).toHaveProperty(\"region\");\n\t\t\t\texpect(metadata.region).toBe(\"us-west-1\");\n\t\t\t});\n\t\t});\n\n\t\tdescribe(\"Region Information\", () => {\n\t\t\ttest(\"should retrieve region information\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create actor and set up test region\n\t\t\t\tconst handle = client.metadataActor.getOrCreate();\n\t\t\t\tawait handle.setupTestRegion(\"eu-central-1\");\n\n\t\t\t\t// Get the region\n\t\t\t\tconst region = await handle.getRegion();\n\n\t\t\t\t// Verify the region is set correctly\n\t\t\t\texpect(region).toBe(\"eu-central-1\");\n\t\t\t});\n\t\t});\n\t});\n}\n","import { describe, expect, test } from \"vitest\";\nimport type { DriverTestConfig } from \"@/driver-test-suite/mod\";\nimport { setupDriverTest } from \"@/driver-test-suite/utils\";\n\nexport function runActorOnStateChangeTests(driverTestConfig: DriverTestConfig) {\n\tdescribe(\"Actor onStateChange Tests\", () => {\n\t\ttest(\"triggers onStateChange when state is modified\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\tconst actor = client.onStateChangeActor.getOrCreate();\n\n\t\t\t// Modify state - should trigger onChange\n\t\t\tawait actor.setValue(10);\n\n\t\t\t// Check that onChange was called\n\t\t\tconst changeCount = await actor.getChangeCount();\n\t\t\texpect(changeCount).toBe(1);\n\t\t});\n\n\t\ttest(\"triggers onChange multiple times for multiple state changes\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\tconst actor = client.onStateChangeActor.getOrCreate();\n\n\t\t\t// Modify state multiple times\n\t\t\tawait actor.incrementMultiple(3);\n\n\t\t\t// Check that onChange was called for each modification\n\t\t\tconst changeCount = await actor.getChangeCount();\n\t\t\texpect(changeCount).toBe(3);\n\t\t});\n\n\t\ttest(\"does NOT trigger onChange for read-only actions\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\tconst actor = client.onStateChangeActor.getOrCreate();\n\n\t\t\t// Set initial value\n\t\t\tawait actor.setValue(5);\n\n\t\t\t// Read value without modifying - should NOT trigger onChange\n\t\t\tconst value = await actor.getValue();\n\t\t\texpect(value).toBe(5);\n\n\t\t\t// Check that onChange was NOT called\n\t\t\tconst changeCount = await actor.getChangeCount();\n\t\t\texpect(changeCount).toBe(1);\n\t\t});\n\n\t\ttest(\"does NOT trigger onChange for computed values\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\tconst actor = client.onStateChangeActor.getOrCreate();\n\n\t\t\t// Set initial value\n\t\t\tawait actor.setValue(3);\n\n\t\t\t// Check that onChange was called\n\t\t\t{\n\t\t\t\tconst changeCount = await actor.getChangeCount();\n\t\t\t\texpect(changeCount).toBe(1);\n\t\t\t}\n\n\t\t\t// Compute value without modifying state - should NOT trigger onChange\n\t\t\tconst doubled = await actor.getDoubled();\n\t\t\texpect(doubled).toBe(6);\n\n\t\t\t// Check that onChange was NOT called\n\t\t\t{\n\t\t\t\tconst changeCount = await actor.getChangeCount();\n\t\t\t\texpect(changeCount).toBe(1);\n\t\t\t}\n\t\t});\n\n\t\ttest(\"simple: connect, call action, dispose does NOT trigger onChange\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\tconst actor = client.onStateChangeActor.getOrCreate();\n\n\t\t\t// Connect to the actor\n\t\t\tconst connection = await actor.connect();\n\n\t\t\t// Call an action that doesn't modify state\n\t\t\tconst value = await connection.getValue();\n\t\t\texpect(value).toBe(0);\n\n\t\t\t// Dispose the connection\n\t\t\tawait connection.dispose();\n\n\t\t\t// Verify that onChange was NOT triggered\n\t\t\tconst changeCount = await actor.getChangeCount();\n\t\t\texpect(changeCount).toBe(0);\n\t\t});\n\t});\n}\n","import { describe, expect, test, vi } from \"vitest\";\nimport type { ActorConnRaw } from \"@/client/actor-conn\";\nimport type { DriverTestConfig } from \"../mod\";\nimport { setupDriverTest } from \"../utils\";\n\nexport function runActorReconnectTests(driverTestConfig: DriverTestConfig) {\n\tdescribe(\"Actor Reconnection Tests\", () => {\n\t\ttest(\"should reconnect and preserve connection state after non-clean disconnect\", async (c) => {\n\t\t\tconst { client, endpoint } = await setupDriverTest(\n\t\t\t\tc,\n\t\t\t\tdriverTestConfig,\n\t\t\t);\n\n\t\t\t// Create actor and connect\n\t\t\tconst handle = client.counterConn.getOrCreate([\"test-reconnect\"]);\n\t\t\tconst connection = handle.connect();\n\n\t\t\t// Set an initial count on the connection\n\t\t\tawait connection.increment(5);\n\n\t\t\t// Verify connection count is 1\n\t\t\tconst connCount1 = await connection.getConnectionCount();\n\t\t\texpect(connCount1).toBe(1);\n\n\t\t\t// Force disconnect (non-clean) - simulates network failure\n\t\t\tconst connRaw = connection as unknown as ActorConnRaw;\n\t\t\tawait forceUncleanDisconnect(\n\t\t\t\tendpoint,\n\t\t\t\tconnRaw.actorId!,\n\t\t\t\tconnRaw.connectionId!,\n\t\t\t);\n\n\t\t\t// Wait a bit for the disconnection to be processed\n\t\t\tawait vi.waitFor(\n\t\t\t\tasync () => {\n\t\t\t\t\tconst countAfterReconnect = await connection.getCount();\n\t\t\t\t\texpect(countAfterReconnect).toBe(5); // Should preserve the count\n\t\t\t\t},\n\t\t\t\t{ timeout: 5000, interval: 100 },\n\t\t\t);\n\n\t\t\t// Verify connection count is still 1 (same connection reconnected)\n\t\t\tconst connCount2 = await connection.getConnectionCount();\n\t\t\texpect(connCount2).toBe(1);\n\n\t\t\t// Verify we can still increment the counter\n\t\t\tconst newCount = await connection.getCount();\n\t\t\texpect(newCount).toBe(5);\n\n\t\t\t// Clean up\n\t\t\tawait connection.dispose();\n\t\t});\n\n\t\ttest(\"should not preserve connection state after clean disconnect\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t// Create actor and connect\n\t\t\tconst handle = client.counterConn.getOrCreate([\n\t\t\t\t\"test-clean-disconnect\",\n\t\t\t]);\n\t\t\tconst connection = handle.connect();\n\n\t\t\t// Set an initial count on the connection\n\t\t\tawait connection.increment(10);\n\n\t\t\t// Verify connection count is 1\n\t\t\tconst connCount1 = await connection.getConnectionCount();\n\t\t\texpect(connCount1).toBe(1);\n\n\t\t\t// Clean disconnect\n\t\t\tawait connection.dispose();\n\n\t\t\t// Wait a bit to ensure disconnection is processed\n\t\t\tawait vi.waitFor(\n\t\t\t\tasync () => {\n\t\t\t\t\t// Check that connection count is now 0\n\t\t\t\t\tconst handle2 = client.counterConn.get([\n\t\t\t\t\t\t\"test-clean-disconnect\",\n\t\t\t\t\t]);\n\t\t\t\t\tconst connCount = await handle2.getConnectionCount();\n\t\t\t\t\t// This counts the current action caller\n\t\t\t\t\texpect(connCount).toBe(1);\n\t\t\t\t},\n\t\t\t\t{ timeout: 5000 },\n\t\t\t);\n\n\t\t\t// Create a new connection\n\t\t\tconst connection2 = handle.connect();\n\n\t\t\t// The count should be reset since it's a new connection\n\t\t\tconst countNewConnection = await connection2.getCount();\n\t\t\texpect(countNewConnection).toBe(0); // Should be reset\n\n\t\t\t// Verify connection count is 1 again (new connection)\n\t\t\tconst connCount3 = await connection2.getConnectionCount();\n\t\t\texpect(connCount3).toBe(1);\n\n\t\t\t// Clean up\n\t\t\tawait connection2.dispose();\n\t\t});\n\n\t\ttest(\"should handle multiple non-clean disconnects and reconnects\", async (c) => {\n\t\t\tconst { client, endpoint } = await setupDriverTest(\n\t\t\t\tc,\n\t\t\t\tdriverTestConfig,\n\t\t\t);\n\n\t\t\t// Create actor and connect\n\t\t\tconst handle = client.counterConn.getOrCreate([\n\t\t\t\t\"test-multiple-reconnect\",\n\t\t\t]);\n\t\t\tconst connection = handle.connect();\n\n\t\t\t// Set an initial count\n\t\t\tawait connection.setCount(100);\n\n\t\t\t// Perform multiple disconnect-reconnect cycles\n\t\t\tfor (let i = 0; i < 3; i++) {\n\t\t\t\t// Increment before disconnect\n\t\t\t\tawait connection.increment(1);\n\n\t\t\t\t// Force disconnect\n\t\t\t\tconst connRaw = connection as unknown as ActorConnRaw;\n\t\t\t\tawait forceUncleanDisconnect(\n\t\t\t\t\tendpoint,\n\t\t\t\t\tconnRaw.actorId!,\n\t\t\t\t\tconnRaw.connectionId!,\n\t\t\t\t);\n\n\t\t\t\t// Wait for reconnection and verify state is preserved\n\t\t\t\tawait vi.waitFor(\n\t\t\t\t\tasync () => {\n\t\t\t\t\t\tconst countAfter = await connection.getCount();\n\t\t\t\t\t\texpect(countAfter).toBe(101 + i);\n\t\t\t\t\t},\n\t\t\t\t\t{ timeout: 5000 },\n\t\t\t\t);\n\n\t\t\t\t// Verify connection count remains 1\n\t\t\t\tconst connCount = await connection.getConnectionCount();\n\t\t\t\texpect(connCount).toBe(1);\n\t\t\t}\n\n\t\t\t// Final verification\n\t\t\tconst finalCount = await connection.getCount();\n\t\t\texpect(finalCount).toBe(103);\n\n\t\t\t// Clean up\n\t\t\tawait connection.dispose();\n\t\t});\n\t});\n}\n\nasync function forceUncleanDisconnect(\n\tendpoint: string,\n\tactorId: string,\n\tconnId: string,\n): Promise<void> {\n\tconst response = await fetch(\n\t\t`${endpoint}/.test/force-disconnect?actor=${actorId}&conn=${connId}`,\n\t\t{\n\t\t\tmethod: \"POST\",\n\t\t},\n\t);\n\n\tif (!response.ok) {\n\t\tconst text = await response.text();\n\t\tthrow new Error(`Failed to force disconnect: ${text}`);\n\t}\n}\n","import { describe, expect, test } from \"vitest\";\nimport type { DriverTestConfig } from \"../mod\";\nimport { setupDriverTest } from \"../utils\";\n\nexport function runActorVarsTests(driverTestConfig: DriverTestConfig) {\n\tdescribe(\"Actor Variables\", () => {\n\t\tdescribe(\"Static vars\", () => {\n\t\t\ttest(\"should provide access to static vars\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\tconst instance = client.staticVarActor.getOrCreate();\n\n\t\t\t\t// Test accessing vars\n\t\t\t\tconst result = await instance.getVars();\n\t\t\t\texpect(result).toEqual({ counter: 42, name: \"test-actor\" });\n\n\t\t\t\t// Test accessing specific var property\n\t\t\t\tconst name = await instance.getName();\n\t\t\t\texpect(name).toBe(\"test-actor\");\n\t\t\t});\n\t\t});\n\n\t\tdescribe(\"Deep cloning of static vars\", () => {\n\t\t\ttest(\"should deep clone static vars between actor instances\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create two separate instances\n\t\t\t\tconst instance1 = client.nestedVarActor.getOrCreate([\n\t\t\t\t\t\"instance1\",\n\t\t\t\t]);\n\t\t\t\tconst instance2 = client.nestedVarActor.getOrCreate([\n\t\t\t\t\t\"instance2\",\n\t\t\t\t]);\n\n\t\t\t\t// Modify vars in the first instance\n\t\t\t\tconst modifiedVars = await instance1.modifyNested();\n\t\t\t\texpect(modifiedVars.nested.value).toBe(\"modified\");\n\t\t\t\texpect(modifiedVars.nested.array).toContain(4);\n\t\t\t\texpect(modifiedVars.nested.obj.key).toBe(\"new-value\");\n\n\t\t\t\t// Check that the second instance still has the original values\n\t\t\t\tconst instance2Vars = await instance2.getVars();\n\t\t\t\texpect(instance2Vars.nested.value).toBe(\"original\");\n\t\t\t\texpect(instance2Vars.nested.array).toEqual([1, 2, 3]);\n\t\t\t\texpect(instance2Vars.nested.obj.key).toBe(\"value\");\n\t\t\t});\n\t\t});\n\n\t\tdescribe(\"createVars\", () => {\n\t\t\ttest(\"should support dynamic vars creation\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create an instance\n\t\t\t\tconst instance = client.dynamicVarActor.getOrCreate();\n\n\t\t\t\t// Test accessing dynamically created vars\n\t\t\t\tconst vars = await instance.getVars();\n\t\t\t\texpect(vars).toHaveProperty(\"random\");\n\t\t\t\texpect(vars).toHaveProperty(\"computed\");\n\t\t\t\texpect(typeof vars.random).toBe(\"number\");\n\t\t\t\texpect(typeof vars.computed).toBe(\"string\");\n\t\t\t\texpect(vars.computed).toMatch(/^Actor-\\d+$/);\n\t\t\t});\n\n\t\t\ttest(\"should create different vars for different instances\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create two separate instances\n\t\t\t\tconst instance1 = client.uniqueVarActor.getOrCreate([\"test1\"]);\n\t\t\t\tconst instance2 = client.uniqueVarActor.getOrCreate([\"test2\"]);\n\n\t\t\t\t// Get vars from both instances\n\t\t\t\tconst vars1 = await instance1.getVars();\n\t\t\t\tconst vars2 = await instance2.getVars();\n\n\t\t\t\t// Verify they have different values\n\t\t\t\texpect(vars1.id).not.toBe(vars2.id);\n\t\t\t});\n\t\t});\n\n\t\tdescribe(\"Driver Context\", () => {\n\t\t\ttest(\"should provide access to driver context\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create an instance\n\t\t\t\tconst instance = client.driverCtxActor.getOrCreate();\n\n\t\t\t\t// Test accessing driver context through vars\n\t\t\t\tconst vars = await instance.getVars();\n\n\t\t\t\t// Driver context might or might not be available depending on the driver\n\t\t\t\t// But the test should run without errors\n\t\t\t\texpect(vars).toHaveProperty(\"hasDriverCtx\");\n\t\t\t});\n\t\t});\n\t});\n}\n","import { describe, expect, test } from \"vitest\";\nimport type { ActorError } from \"@/client/mod\";\nimport type { DriverTestConfig } from \"../mod\";\nimport { setupDriverTest } from \"../utils\";\n\nexport function runManagerDriverTests(driverTestConfig: DriverTestConfig) {\n\tdescribe(\"Manager Driver Tests\", () => {\n\t\tdescribe(\"Client Connection Methods\", () => {\n\t\t\ttest(\"connect() - finds or creates a actor\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Basic connect() with no parameters creates a default actor\n\t\t\t\tconst counterA = client.counter.getOrCreate();\n\t\t\t\tawait counterA.increment(5);\n\n\t\t\t\t// Get the same actor again to verify state persisted\n\t\t\t\tconst counterAAgain = client.counter.getOrCreate();\n\t\t\t\tconst count = await counterAAgain.increment(0);\n\t\t\t\texpect(count).toBe(5);\n\n\t\t\t\t// Connect with key creates a new actor with specific parameters\n\t\t\t\tconst counterB = client.counter.getOrCreate([\n\t\t\t\t\t\"counter-b\",\n\t\t\t\t\t\"testing\",\n\t\t\t\t]);\n\n\t\t\t\tawait counterB.increment(10);\n\t\t\t\tconst countB = await counterB.increment(0);\n\t\t\t\texpect(countB).toBe(10);\n\t\t\t});\n\n\t\t\ttest(\"throws ActorAlreadyExists when creating duplicate actors\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create a unique actor with specific key\n\t\t\t\tconst uniqueKey = [\"duplicate-actor-test\", crypto.randomUUID()];\n\t\t\t\tconst counter = client.counter.getOrCreate(uniqueKey);\n\t\t\t\tawait counter.increment(5);\n\n\t\t\t\t// Expect duplicate actor\n\t\t\t\ttry {\n\t\t\t\t\tawait client.counter.create(uniqueKey);\n\t\t\t\t\texpect.fail(\"did not error on duplicate create\");\n\t\t\t\t} catch (err) {\n\t\t\t\t\texpect((err as ActorError).group).toBe(\"actor\");\n\t\t\t\t\texpect((err as ActorError).code).toBe(\"already_exists\");\n\t\t\t\t}\n\n\t\t\t\t// Verify the original actor still works and has its state\n\t\t\t\tconst count = await counter.increment(0);\n\t\t\t\texpect(count).toBe(5);\n\t\t\t});\n\t\t});\n\n\t\tdescribe(\"Connection Options\", () => {\n\t\t\ttest(\"get without create prevents actor creation\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Try to get a nonexistent actor with no create\n\t\t\t\tconst nonexistentId = `nonexistent-${crypto.randomUUID()}`;\n\n\t\t\t\t// Should fail when actor doesn't exist\n\t\t\t\ttry {\n\t\t\t\t\tawait client.counter.get([nonexistentId]).resolve();\n\t\t\t\t\texpect.fail(\"did not error for get\");\n\t\t\t\t} catch (err) {\n\t\t\t\t\texpect((err as ActorError).group).toBe(\"actor\");\n\t\t\t\t\texpect((err as ActorError).code).toBe(\"not_found\");\n\t\t\t\t}\n\n\t\t\t\t// Create the actor\n\t\t\t\tconst createdCounter =\n\t\t\t\t\tclient.counter.getOrCreate(nonexistentId);\n\t\t\t\tawait createdCounter.increment(3);\n\n\t\t\t\t// Now no create should work since the actor exists\n\t\t\t\tconst retrievedCounter = client.counter.get(nonexistentId);\n\n\t\t\t\tconst count = await retrievedCounter.increment(0);\n\t\t\t\texpect(count).toBe(3);\n\t\t\t});\n\n\t\t\ttest(\"connection params are passed to actors\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create a actor with connection params\n\t\t\t\t// Note: In a real test we'd verify these are received by the actor,\n\t\t\t\t// but our simple counter actor doesn't use connection params.\n\t\t\t\t// This test just ensures the params are accepted by the driver.\n\t\t\t\tconst counter = client.counter.getOrCreate(undefined, {\n\t\t\t\t\tparams: {\n\t\t\t\t\t\tuserId: \"user-123\",\n\t\t\t\t\t\tauthToken: \"token-abc\",\n\t\t\t\t\t\tsettings: { increment: 5 },\n\t\t\t\t\t},\n\t\t\t\t});\n\n\t\t\t\tawait counter.increment(1);\n\t\t\t\tconst count = await counter.increment(0);\n\t\t\t\texpect(count).toBe(1);\n\t\t\t});\n\t\t});\n\n\t\tdescribe(\"Actor Creation & Retrieval\", () => {\n\t\t\ttest(\"creates and retrieves actors by ID\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create a unique ID for this test\n\t\t\t\tconst uniqueId = `test-counter-${crypto.randomUUID()}`;\n\n\t\t\t\t// Create actor with specific ID\n\t\t\t\tconst counter = client.counter.getOrCreate([uniqueId]);\n\t\t\t\tawait counter.increment(10);\n\n\t\t\t\t// Retrieve the same actor by ID and verify state\n\t\t\t\tconst retrievedCounter = client.counter.getOrCreate([uniqueId]);\n\t\t\t\tconst count = await retrievedCounter.increment(0); // Get current value\n\t\t\t\texpect(count).toBe(10);\n\t\t\t});\n\n\t\t\ttest(\"passes input to actor during creation\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Test data to pass as input\n\t\t\t\tconst testInput = {\n\t\t\t\t\tname: \"test-actor\",\n\t\t\t\t\tvalue: 42,\n\t\t\t\t\tnested: { foo: \"bar\" },\n\t\t\t\t};\n\n\t\t\t\t// Create actor with input\n\t\t\t\tconst actor = await client.inputActor.create(undefined, {\n\t\t\t\t\tinput: testInput,\n\t\t\t\t});\n\n\t\t\t\t// Verify both createState and onCreate received the input\n\t\t\t\tconst inputs = await actor.getInputs();\n\n\t\t\t\t// Input should be available in createState\n\t\t\t\texpect(inputs.initialInput).toEqual(testInput);\n\n\t\t\t\t// Input should also be available in onCreate lifecycle hook\n\t\t\t\texpect(inputs.onCreateInput).toEqual(testInput);\n\t\t\t});\n\n\t\t\ttest(\"input is undefined when not provided\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create actor without providing input\n\t\t\t\tconst actor = await client.inputActor.create();\n\n\t\t\t\t// Get inputs and verify they're undefined\n\t\t\t\tconst inputs = await actor.getInputs();\n\n\t\t\t\t// Should be undefined in createState\n\t\t\t\texpect(inputs.initialInput).toBeUndefined();\n\n\t\t\t\t// Should be undefined in onCreate lifecycle hook too\n\t\t\t\texpect(inputs.onCreateInput).toBeUndefined();\n\t\t\t});\n\n\t\t\ttest(\"getOrCreate passes input to actor during creation\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create a unique key for this test\n\t\t\t\tconst uniqueKey = [`input-test-${crypto.randomUUID()}`];\n\n\t\t\t\t// Test data to pass as input\n\t\t\t\tconst testInput = {\n\t\t\t\t\tname: \"getorcreate-test\",\n\t\t\t\t\tvalue: 100,\n\t\t\t\t\tnested: { baz: \"qux\" },\n\t\t\t\t};\n\n\t\t\t\t// Use getOrCreate with input\n\t\t\t\tconst actor = client.inputActor.getOrCreate(uniqueKey, {\n\t\t\t\t\tcreateWithInput: testInput,\n\t\t\t\t});\n\n\t\t\t\t// Verify both createState and onCreate received the input\n\t\t\t\tconst inputs = await actor.getInputs();\n\n\t\t\t\t// Input should be available in createState\n\t\t\t\texpect(inputs.initialInput).toEqual(testInput);\n\n\t\t\t\t// Input should also be available in onCreate lifecycle hook\n\t\t\t\texpect(inputs.onCreateInput).toEqual(testInput);\n\n\t\t\t\t// Verify that calling getOrCreate again with the same key\n\t\t\t\t// returns the existing actor and doesn't create a new one\n\t\t\t\tconst existingActor = client.inputActor.getOrCreate(uniqueKey);\n\t\t\t\tconst existingInputs = await existingActor.getInputs();\n\n\t\t\t\t// Should still have the original inputs\n\t\t\t\texpect(existingInputs.initialInput).toEqual(testInput);\n\t\t\t\texpect(existingInputs.onCreateInput).toEqual(testInput);\n\t\t\t});\n\n\t\t\t// TODO: Correctly test region for each provider\n\t\t\t//test(\"creates and retrieves actors with region\", async (c) => {\n\t\t\t//\tconst { client } = await setupDriverTest(c,\n\t\t\t//\t\tdriverTestConfig,\n\t\t\t//\t\tCOUNTER_APP_PATH\n\t\t\t//\t);\n\t\t\t//\n\t\t\t//\t// Create actor with a specific region\n\t\t\t//\tconst counter = client.counter.getOrCreate({\n\t\t\t//\t\tcreate: {\n\t\t\t//\t\t\tkey: [\"metadata-test\", \"testing\"],\n\t\t\t//\t\t\tregion: \"test-region\",\n\t\t\t//\t\t},\n\t\t\t//\t});\n\t\t\t//\n\t\t\t//\t// Set state to identify this specific instance\n\t\t\t//\tawait counter.increment(42);\n\t\t\t//\n\t\t\t//\t// Retrieve by ID (since metadata is not used for retrieval)\n\t\t\t//\tconst retrievedCounter = client.counter.getOrCreate([\"metadata-test\"]);\n\t\t\t//\n\t\t\t//\t// Verify it's the same instance\n\t\t\t//\tconst count = await retrievedCounter.increment(0);\n\t\t\t//\texpect(count).toBe(42);\n\t\t\t//});\n\t\t});\n\n\t\tdescribe(\"Key Matching\", () => {\n\t\t\ttest(\"matches actors only with exactly the same keys\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create actor with multiple keys\n\t\t\t\tconst originalCounter = client.counter.getOrCreate([\n\t\t\t\t\t\"counter-match\",\n\t\t\t\t\t\"test\",\n\t\t\t\t\t\"us-east\",\n\t\t\t\t]);\n\t\t\t\tawait originalCounter.increment(10);\n\n\t\t\t\t// Should match with exact same keys\n\t\t\t\tconst exactMatchCounter = client.counter.getOrCreate([\n\t\t\t\t\t\"counter-match\",\n\t\t\t\t\t\"test\",\n\t\t\t\t\t\"us-east\",\n\t\t\t\t]);\n\t\t\t\tconst exactMatchCount = await exactMatchCounter.increment(0);\n\t\t\t\texpect(exactMatchCount).toBe(10);\n\n\t\t\t\t// Should NOT match with subset of keys - should create new actor\n\t\t\t\tconst subsetMatchCounter = client.counter.getOrCreate([\n\t\t\t\t\t\"counter-match\",\n\t\t\t\t\t\"test\",\n\t\t\t\t]);\n\t\t\t\tconst subsetMatchCount = await subsetMatchCounter.increment(0);\n\t\t\t\texpect(subsetMatchCount).toBe(0); // Should be a new counter with 0\n\n\t\t\t\t// Should NOT match with just one key - should create new actor\n\t\t\t\tconst singleKeyCounter = client.counter.getOrCreate([\n\t\t\t\t\t\"counter-match\",\n\t\t\t\t]);\n\t\t\t\tconst singleKeyCount = await singleKeyCounter.increment(0);\n\t\t\t\texpect(singleKeyCount).toBe(0); // Should be a new counter with 0\n\t\t\t});\n\n\t\t\ttest(\"string key matches array with single string key\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create actor with string key\n\t\t\t\tconst stringKeyCounter =\n\t\t\t\t\tclient.counter.getOrCreate(\"string-key-test\");\n\t\t\t\tawait stringKeyCounter.increment(7);\n\n\t\t\t\t// Should match with equivalent array key\n\t\t\t\tconst arrayKeyCounter = client.counter.getOrCreate([\n\t\t\t\t\t\"string-key-test\",\n\t\t\t\t]);\n\t\t\t\tconst count = await arrayKeyCounter.increment(0);\n\t\t\t\texpect(count).toBe(7);\n\t\t\t});\n\n\t\t\ttest(\"undefined key matches empty array key and no key\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create actor with undefined key\n\t\t\t\tconst undefinedKeyCounter =\n\t\t\t\t\tclient.counter.getOrCreate(undefined);\n\t\t\t\tawait undefinedKeyCounter.increment(12);\n\n\t\t\t\t// Should match with empty array key\n\t\t\t\tconst emptyArrayKeyCounter = client.counter.getOrCreate([]);\n\t\t\t\tconst emptyArrayCount = await emptyArrayKeyCounter.increment(0);\n\t\t\t\texpect(emptyArrayCount).toBe(12);\n\n\t\t\t\t// Should match with no key\n\t\t\t\tconst noKeyCounter = client.counter.getOrCreate();\n\t\t\t\tconst noKeyCount = await noKeyCounter.increment(0);\n\t\t\t\texpect(noKeyCount).toBe(12);\n\t\t\t});\n\n\t\t\ttest(\"no keys does not match actors with keys\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create counter with keys\n\t\t\t\tconst keyedCounter = client.counter.getOrCreate([\n\t\t\t\t\t\"counter-with-keys\",\n\t\t\t\t\t\"special\",\n\t\t\t\t]);\n\t\t\t\tawait keyedCounter.increment(15);\n\n\t\t\t\t// Should not match when searching with no keys\n\t\t\t\tconst noKeysCounter = client.counter.getOrCreate();\n\t\t\t\tconst count = await noKeysCounter.increment(10);\n\t\t\t\texpect(count).toBe(10);\n\t\t\t});\n\n\t\t\ttest(\"actors with keys match actors with no keys\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create a counter with no keys\n\t\t\t\tconst noKeysCounter = client.counter.getOrCreate();\n\t\t\t\tawait noKeysCounter.increment(25);\n\n\t\t\t\t// Get counter with keys - should create a new one\n\t\t\t\tconst keyedCounter = client.counter.getOrCreate([\n\t\t\t\t\t\"new-counter\",\n\t\t\t\t\t\"prod\",\n\t\t\t\t]);\n\t\t\t\tconst keyedCount = await keyedCounter.increment(0);\n\n\t\t\t\t// Should be a new counter, not the one created above\n\t\t\t\texpect(keyedCount).toBe(0);\n\t\t\t});\n\t\t});\n\n\t\tdescribe(\"Multiple Actor Instances\", () => {\n\t\t\t// TODO: This test is flakey https://github.com/rivet-dev/rivetkit/issues/873\n\t\t\ttest(\"creates multiple actor instances of the same type\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Create multiple instances with different IDs\n\t\t\t\tconst instance1 = client.counter.getOrCreate([\"multi-1\"]);\n\t\t\t\tconst instance2 = client.counter.getOrCreate([\"multi-2\"]);\n\t\t\t\tconst instance3 = client.counter.getOrCreate([\"multi-3\"]);\n\n\t\t\t\t// Set different states\n\t\t\t\tawait instance1.increment(1);\n\t\t\t\tawait instance2.increment(2);\n\t\t\t\tawait instance3.increment(3);\n\n\t\t\t\t// Retrieve all instances again\n\t\t\t\tconst retrieved1 = client.counter.getOrCreate([\"multi-1\"]);\n\t\t\t\tconst retrieved2 = client.counter.getOrCreate([\"multi-2\"]);\n\t\t\t\tconst retrieved3 = client.counter.getOrCreate([\"multi-3\"]);\n\n\t\t\t\t// Verify separate state\n\t\t\t\texpect(await retrieved1.increment(0)).toBe(1);\n\t\t\t\texpect(await retrieved2.increment(0)).toBe(2);\n\t\t\t\texpect(await retrieved3.increment(0)).toBe(3);\n\t\t\t});\n\n\t\t\ttest(\"handles default instance with no explicit ID\", async (c) => {\n\t\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t\t// Get default instance (no ID specified)\n\t\t\t\tconst defaultCounter = client.counter.getOrCreate();\n\n\t\t\t\t// Set state\n\t\t\t\tawait defaultCounter.increment(5);\n\n\t\t\t\t// Get default instance again\n\t\t\t\tconst sameDefaultCounter = client.counter.getOrCreate();\n\n\t\t\t\t// Verify state is maintained\n\t\t\t\tconst count = await sameDefaultCounter.increment(0);\n\t\t\t\texpect(count).toBe(5);\n\t\t\t});\n\t\t});\n\t});\n}\n","import { describe, expect, test } from \"vitest\";\nimport type { DriverTestConfig } from \"../mod\";\nimport { setupDriverTest } from \"../utils\";\n\nexport function runRawHttpTests(driverTestConfig: DriverTestConfig) {\n\tdescribe(\"raw http\", () => {\n\t\ttest(\"should handle raw HTTP GET requests\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\t\t\tconst actor = client.rawHttpActor.getOrCreate([\"test\"]);\n\n\t\t\t// Test the hello endpoint\n\t\t\tconst helloResponse = await actor.fetch(\"api/hello\");\n\t\t\texpect(helloResponse.ok).toBe(true);\n\t\t\tconst helloData = await helloResponse.json();\n\t\t\texpect(helloData).toEqual({ message: \"Hello from actor!\" });\n\t\t});\n\n\t\ttest(\"should handle raw HTTP POST requests with echo\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\t\t\tconst actor = client.rawHttpActor.getOrCreate([\"test\"]);\n\n\t\t\tconst testData = { test: \"data\", number: 123 };\n\t\t\tconst echoResponse = await actor.fetch(\"api/echo\", {\n\t\t\t\tmethod: \"POST\",\n\t\t\t\theaders: {\n\t\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t},\n\t\t\t\tbody: JSON.stringify(testData),\n\t\t\t});\n\n\t\t\texpect(echoResponse.ok).toBe(true);\n\t\t\tconst echoData = await echoResponse.json();\n\t\t\texpect(echoData).toEqual(testData);\n\t\t});\n\n\t\ttest(\"should track state across raw HTTP requests\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\t\t\tconst actor = client.rawHttpActor.getOrCreate([\"state-test\"]);\n\n\t\t\t// Make a few requests\n\t\t\tawait actor.fetch(\"api/hello\");\n\t\t\tawait actor.fetch(\"api/hello\");\n\t\t\tawait actor.fetch(\"api/state\");\n\n\t\t\t// Check the state endpoint\n\t\t\tconst stateResponse = await actor.fetch(\"api/state\");\n\t\t\texpect(stateResponse.ok).toBe(true);\n\t\t\tconst stateData = (await stateResponse.json()) as {\n\t\t\t\trequestCount: number;\n\t\t\t};\n\t\t\texpect(stateData.requestCount).toBe(4); // 4 total requests\n\t\t});\n\n\t\ttest(\"should pass headers correctly\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\t\t\tconst actor = client.rawHttpActor.getOrCreate([\"headers-test\"]);\n\n\t\t\tconst customHeaders = {\n\t\t\t\t\"X-Custom-Header\": \"test-value\",\n\t\t\t\t\"X-Another-Header\": \"another-value\",\n\t\t\t};\n\n\t\t\tconst response = await actor.fetch(\"api/headers\", {\n\t\t\t\theaders: customHeaders,\n\t\t\t});\n\n\t\t\texpect(response.ok).toBe(true);\n\t\t\tconst headers = (await response.json()) as Record<string, string>;\n\t\t\texpect(headers[\"x-custom-header\"]).toBe(\"test-value\");\n\t\t\texpect(headers[\"x-another-header\"]).toBe(\"another-value\");\n\t\t});\n\n\t\ttest(\"should return 404 for unhandled paths\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\t\t\tconst actor = client.rawHttpActor.getOrCreate([\"404-test\"]);\n\n\t\t\tconst response = await actor.fetch(\"api/nonexistent\");\n\t\t\texpect(response.ok).toBe(false);\n\t\t\texpect(response.status).toBe(404);\n\t\t});\n\n\t\ttest(\"should return 404 when no onFetch handler defined\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\t\t\tconst actor = client.rawHttpNoHandlerActor.getOrCreate([\n\t\t\t\t\"no-handler\",\n\t\t\t]);\n\n\t\t\tconst response = await actor.fetch(\"api/anything\");\n\t\t\texpect(response.ok).toBe(false);\n\t\t\texpect(response.status).toBe(404);\n\n\t\t\t// No actions available without onFetch handler\n\t\t});\n\n\t\ttest(\"should return 500 error when onFetch returns void\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\t\t\tconst actor = client.rawHttpVoidReturnActor.getOrCreate([\n\t\t\t\t\"void-return\",\n\t\t\t]);\n\n\t\t\tconst response = await actor.fetch(\"api/anything\");\n\t\t\texpect(response.ok).toBe(false);\n\t\t\texpect(response.status).toBe(500);\n\n\t\t\t// Check error message - response might be CBOR encoded\n\t\t\ttry {\n\t\t\t\tconst errorData = (await response.json()) as {\n\t\t\t\t\tmessage: string;\n\t\t\t\t};\n\t\t\t\texpect(errorData.message).toContain(\n\t\t\t\t\t\"onFetch handler must return a Response\",\n\t\t\t\t);\n\t\t\t} catch {\n\t\t\t\t// If JSON parsing fails, just check that we got a 500 error\n\t\t\t\t// The error details are already validated by the status code\n\t\t\t}\n\n\t\t\t// No actions available when onFetch returns void\n\t\t});\n\n\t\ttest(\"should handle different HTTP methods\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\t\t\tconst actor = client.rawHttpActor.getOrCreate([\"methods-test\"]);\n\n\t\t\t// Test various HTTP methods\n\t\t\tconst methods = [\"GET\", \"POST\", \"PUT\", \"DELETE\", \"PATCH\"];\n\n\t\t\tfor (const method of methods) {\n\t\t\t\tconst response = await actor.fetch(\"api/echo\", {\n\t\t\t\t\tmethod,\n\t\t\t\t\tbody: [\"POST\", \"PUT\", \"PATCH\"].includes(method)\n\t\t\t\t\t\t? JSON.stringify({ method })\n\t\t\t\t\t\t: undefined,\n\t\t\t\t});\n\n\t\t\t\t// Echo endpoint only handles POST, others should fall through to 404\n\t\t\t\tif (method === \"POST\") {\n\t\t\t\t\texpect(response.ok).toBe(true);\n\t\t\t\t\tconst data = await response.json();\n\t\t\t\t\texpect(data).toEqual({ method });\n\t\t\t\t} else if (method === \"GET\") {\n\t\t\t\t\t// GET to echo should return 404\n\t\t\t\t\texpect(response.status).toBe(404);\n\t\t\t\t} else {\n\t\t\t\t\t// Other methods with body should also return 404\n\t\t\t\t\texpect(response.status).toBe(404);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\ttest(\"should handle binary data\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\t\t\tconst actor = client.rawHttpActor.getOrCreate([\"binary-test\"]);\n\n\t\t\t// Send binary data\n\t\t\tconst binaryData = new Uint8Array([1, 2, 3, 4, 5]);\n\t\t\tconst response = await actor.fetch(\"api/echo\", {\n\t\t\t\tmethod: \"POST\",\n\t\t\t\theaders: {\n\t\t\t\t\t\"Content-Type\": \"application/octet-stream\",\n\t\t\t\t},\n\t\t\t\tbody: binaryData,\n\t\t\t});\n\n\t\t\texpect(response.ok).toBe(true);\n\t\t\tconst responseBuffer = await response.arrayBuffer();\n\t\t\tconst responseArray = new Uint8Array(responseBuffer);\n\t\t\texpect(Array.from(responseArray)).toEqual([1, 2, 3, 4, 5]);\n\t\t});\n\n\t\ttest(\"should work with Hono router using createVars\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\t\t\tconst actor = client.rawHttpHonoActor.getOrCreate([\"hono-test\"]);\n\n\t\t\t// Test root endpoint\n\t\t\tconst rootResponse = await actor.fetch(\"/\");\n\t\t\texpect(rootResponse.ok).toBe(true);\n\t\t\tconst rootData = await rootResponse.json();\n\t\t\texpect(rootData).toEqual({ message: \"Welcome to Hono actor!\" });\n\n\t\t\t// Test GET all users\n\t\t\tconst usersResponse = await actor.fetch(\"/users\");\n\t\t\texpect(usersResponse.ok).toBe(true);\n\t\t\tconst users = await usersResponse.json();\n\t\t\texpect(users).toEqual([\n\t\t\t\t{ id: 1, name: \"Alice\" },\n\t\t\t\t{ id: 2, name: \"Bob\" },\n\t\t\t]);\n\n\t\t\t// Test GET single user\n\t\t\tconst userResponse = await actor.fetch(\"/users/1\");\n\t\t\texpect(userResponse.ok).toBe(true);\n\t\t\tconst user = await userResponse.json();\n\t\t\texpect(user).toEqual({ id: 1, name: \"Alice\" });\n\n\t\t\t// Test POST new user\n\t\t\tconst newUser = { name: \"Charlie\" };\n\t\t\tconst createResponse = await actor.fetch(\"/users\", {\n\t\t\t\tmethod: \"POST\",\n\t\t\t\theaders: { \"Content-Type\": \"application/json\" },\n\t\t\t\tbody: JSON.stringify(newUser),\n\t\t\t});\n\t\t\texpect(createResponse.ok).toBe(true);\n\t\t\texpect(createResponse.status).toBe(201);\n\t\t\tconst createdUser = await createResponse.json();\n\t\t\texpect(createdUser).toEqual({ id: 3, name: \"Charlie\" });\n\n\t\t\t// Test PUT update user\n\t\t\tconst updateData = { name: \"Alice Updated\" };\n\t\t\tconst updateResponse = await actor.fetch(\"/users/1\", {\n\t\t\t\tmethod: \"PUT\",\n\t\t\t\theaders: { \"Content-Type\": \"application/json\" },\n\t\t\t\tbody: JSON.stringify(updateData),\n\t\t\t});\n\t\t\texpect(updateResponse.ok).toBe(true);\n\t\t\tconst updatedUser = await updateResponse.json();\n\t\t\texpect(updatedUser).toEqual({ id: 1, name: \"Alice Updated\" });\n\n\t\t\t// Test DELETE user\n\t\t\tconst deleteResponse = await actor.fetch(\"/users/2\", {\n\t\t\t\tmethod: \"DELETE\",\n\t\t\t});\n\t\t\texpect(deleteResponse.ok).toBe(true);\n\t\t\tconst deleteResult = await deleteResponse.json();\n\t\t\texpect(deleteResult).toEqual({ message: \"User 2 deleted\" });\n\n\t\t\t// Test 404 for non-existent route\n\t\t\tconst notFoundResponse = await actor.fetch(\"/api/unknown\");\n\t\t\texpect(notFoundResponse.ok).toBe(false);\n\t\t\texpect(notFoundResponse.status).toBe(404);\n\n\t\t\t// No actions available on Hono actor\n\t\t});\n\n\t\ttest(\"should handle paths with and without leading slashes\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\t\t\tconst actor = client.rawHttpActor.getOrCreate([\"path-test\"]);\n\n\t\t\t// Test path without leading slash\n\t\t\tconst responseWithoutSlash = await actor.fetch(\"api/hello\");\n\t\t\texpect(responseWithoutSlash.ok).toBe(true);\n\t\t\tconst dataWithoutSlash = await responseWithoutSlash.json();\n\t\t\texpect(dataWithoutSlash).toEqual({ message: \"Hello from actor!\" });\n\n\t\t\t// Test path with leading slash\n\t\t\tconst responseWithSlash = await actor.fetch(\"/api/hello\");\n\t\t\texpect(responseWithSlash.ok).toBe(true);\n\t\t\tconst dataWithSlash = await responseWithSlash.json();\n\t\t\texpect(dataWithSlash).toEqual({ message: \"Hello from actor!\" });\n\n\t\t\t// Both should work the same way\n\t\t});\n\n\t\ttest(\"should not create double slashes in request URLs\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\t\t\t// Create a special actor that logs the request URL\n\t\t\tconst actor = client.rawHttpHonoActor.getOrCreate([\"url-test\"]);\n\n\t\t\t// Test with leading slash - this was causing double slashes\n\t\t\tconst response = await actor.fetch(\"/users\");\n\t\t\texpect(response.ok).toBe(true);\n\n\t\t\t// The Hono router should receive a clean path without double slashes\n\t\t\t// If there were double slashes, Hono would not match the route correctly\n\t\t\tconst data = await response.json();\n\t\t\texpect(data).toEqual([\n\t\t\t\t{ id: 1, name: \"Alice\" },\n\t\t\t\t{ id: 2, name: \"Bob\" },\n\t\t\t]);\n\t\t});\n\n\t\ttest(\"should handle forwarded requests correctly without double slashes\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\t\t\tconst actor = client.rawHttpHonoActor.getOrCreate([\"forward-test\"]);\n\n\t\t\t// Simulate what the example does - pass path as string and Request as init\n\t\t\tconst truncatedPath = \"/users\";\n\t\t\tconst url = new URL(truncatedPath, \"http://example.com\");\n\t\t\tconst newRequest = new Request(url, {\n\t\t\t\tmethod: \"GET\",\n\t\t\t});\n\n\t\t\t// This simulates calling actor.fetch(truncatedPath, newRequest)\n\t\t\t// which was causing double slashes in the example\n\t\t\tconst response = await actor.fetch(\n\t\t\t\ttruncatedPath,\n\t\t\t\tnewRequest as any,\n\t\t\t);\n\t\t\texpect(response.ok).toBe(true);\n\t\t\tconst users = await response.json();\n\t\t\texpect(users).toEqual([\n\t\t\t\t{ id: 1, name: \"Alice\" },\n\t\t\t\t{ id: 2, name: \"Bob\" },\n\t\t\t]);\n\t\t});\n\n\t\ttest(\"example fix: should properly forward requests using just Request object\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\t\t\tconst actor = client.rawHttpHonoActor.getOrCreate([\"forward-fix\"]);\n\n\t\t\t// The correct way - just pass the Request object\n\t\t\tconst truncatedPath = \"/users/1\";\n\t\t\tconst url = new URL(truncatedPath, \"http://example.com\");\n\t\t\tconst newRequest = new Request(url, {\n\t\t\t\tmethod: \"GET\",\n\t\t\t});\n\n\t\t\t// Correct usage - just pass the Request\n\t\t\tconst response = await actor.fetch(newRequest);\n\t\t\texpect(response.ok).toBe(true);\n\t\t\tconst user = await response.json();\n\t\t\texpect(user).toEqual({ id: 1, name: \"Alice\" });\n\t\t});\n\n\t\ttest(\"should support standard fetch API with URL and Request objects\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\t\t\tconst actor = client.rawHttpActor.getOrCreate([\"fetch-api-test\"]);\n\n\t\t\t// Test with URL object\n\t\t\tconst url = new URL(\"/api/echo\", \"http://example.com\");\n\t\t\tconst urlResponse = await actor.fetch(url, {\n\t\t\t\tmethod: \"POST\",\n\t\t\t\theaders: { \"Content-Type\": \"application/json\" },\n\t\t\t\tbody: JSON.stringify({ from: \"URL object\" }),\n\t\t\t});\n\t\t\texpect(urlResponse.ok).toBe(true);\n\t\t\tconst urlData = await urlResponse.json();\n\t\t\texpect(urlData).toEqual({ from: \"URL object\" });\n\n\t\t\t// Test with Request object\n\t\t\tconst request = new Request(\"http://example.com/api/echo\", {\n\t\t\t\tmethod: \"POST\",\n\t\t\t\theaders: { \"Content-Type\": \"application/json\" },\n\t\t\t\tbody: JSON.stringify({ from: \"Request object\" }),\n\t\t\t});\n\t\t\tconst requestResponse = await actor.fetch(request);\n\t\t\texpect(requestResponse.ok).toBe(true);\n\t\t\tconst requestData = await requestResponse.json();\n\t\t\texpect(requestData).toEqual({ from: \"Request object\" });\n\n\t\t\t// Test with Request object and additional init params\n\t\t\tconst request2 = new Request(\"http://example.com/api/headers\", {\n\t\t\t\tmethod: \"GET\",\n\t\t\t\theaders: { \"X-Original\": \"request-header\" },\n\t\t\t});\n\t\t\tconst overrideResponse = await actor.fetch(request2, {\n\t\t\t\theaders: { \"X-Override\": \"init-header\" },\n\t\t\t});\n\t\t\texpect(overrideResponse.ok).toBe(true);\n\t\t\tconst headers = (await overrideResponse.json()) as Record<\n\t\t\t\tstring,\n\t\t\t\tstring\n\t\t\t>;\n\t\t\texpect(headers[\"x-override\"]).toBe(\"init-header\");\n\t\t\t// Original headers should be present too\n\t\t\texpect(headers[\"x-original\"]).toBe(\"request-header\");\n\t\t});\n\t});\n}\n","import { describe, expect, test } from \"vitest\";\nimport { z } from \"zod\";\nimport { registry } from \"../../../fixtures/driver-test-suite/registry\";\nimport type { DriverTestConfig } from \"../mod\";\nimport { setupDriverTest } from \"../utils\";\n\nexport function runRawHttpRequestPropertiesTests(\n\tdriverTestConfig: DriverTestConfig,\n) {\n\tdescribe(\"raw http request properties\", () => {\n\t\ttest(\"should pass all Request properties correctly to onFetch\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\t\t\tconst actor = client.rawHttpRequestPropertiesActor.getOrCreate([\n\t\t\t\t\"test\",\n\t\t\t]);\n\n\t\t\t// Test basic request properties\n\t\t\tconst response = await actor.fetch(\"test/path?foo=bar&baz=qux\", {\n\t\t\t\tmethod: \"POST\",\n\t\t\t\theaders: {\n\t\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t\t\"X-Custom-Header\": \"custom-value\",\n\t\t\t\t\tAuthorization: \"Bearer test-token\",\n\t\t\t\t},\n\t\t\t\tbody: JSON.stringify({ test: \"data\" }),\n\t\t\t});\n\n\t\t\texpect(response.ok).toBe(true);\n\t\t\tconst data = (await response.json()) as any;\n\n\t\t\t// Verify URL properties\n\t\t\texpect(data.url).toContain(\"/test/path?foo=bar&baz=qux\");\n\t\t\texpect(data.pathname).toBe(\"/test/path\");\n\t\t\texpect(data.search).toBe(\"?foo=bar&baz=qux\");\n\t\t\texpect(data.searchParams).toEqual({\n\t\t\t\tfoo: \"bar\",\n\t\t\t\tbaz: \"qux\",\n\t\t\t});\n\n\t\t\t// Verify method\n\t\t\texpect(data.method).toBe(\"POST\");\n\n\t\t\t// Verify headers\n\t\t\texpect(data.headers[\"content-type\"]).toBe(\"application/json\");\n\t\t\texpect(data.headers[\"x-custom-header\"]).toBe(\"custom-value\");\n\t\t\texpect(data.headers[\"authorization\"]).toBe(\"Bearer test-token\");\n\n\t\t\t// Verify body\n\t\t\texpect(data.body).toEqual({ test: \"data\" });\n\t\t});\n\n\t\ttest(\"should handle GET requests with no body\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\t\t\tconst actor = client.rawHttpRequestPropertiesActor.getOrCreate([\n\t\t\t\t\"test\",\n\t\t\t]);\n\n\t\t\tconst response = await actor.fetch(\"test/get\", {\n\t\t\t\tmethod: \"GET\",\n\t\t\t});\n\n\t\t\texpect(response.ok).toBe(true);\n\t\t\tconst data = (await response.json()) as any;\n\n\t\t\texpect(data.method).toBe(\"GET\");\n\t\t\texpect(data.body).toBeNull();\n\t\t});\n\n\t\ttest(\"should handle different content types\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\t\t\tconst actor = client.rawHttpRequestPropertiesActor.getOrCreate([\n\t\t\t\t\"test\",\n\t\t\t]);\n\n\t\t\t// Test form data\n\t\t\tconst formData = new URLSearchParams();\n\t\t\tformData.append(\"field1\", \"value1\");\n\t\t\tformData.append(\"field2\", \"value2\");\n\n\t\t\tconst formResponse = await actor.fetch(\"test/form\", {\n\t\t\t\tmethod: \"POST\",\n\t\t\t\theaders: {\n\t\t\t\t\t\"Content-Type\": \"application/x-www-form-urlencoded\",\n\t\t\t\t},\n\t\t\t\tbody: formData.toString(),\n\t\t\t});\n\n\t\t\texpect(formResponse.ok).toBe(true);\n\t\t\tconst formResult = (await formResponse.json()) as any;\n\t\t\texpect(formResult.headers[\"content-type\"]).toBe(\n\t\t\t\t\"application/x-www-form-urlencoded\",\n\t\t\t);\n\t\t\texpect(formResult.bodyText).toBe(\"field1=value1&field2=value2\");\n\n\t\t\t// Test plain text\n\t\t\tconst textResponse = await actor.fetch(\"test/text\", {\n\t\t\t\tmethod: \"POST\",\n\t\t\t\theaders: {\n\t\t\t\t\t\"Content-Type\": \"text/plain\",\n\t\t\t\t},\n\t\t\t\tbody: \"Hello, World!\",\n\t\t\t});\n\n\t\t\texpect(textResponse.ok).toBe(true);\n\t\t\tconst textResult = (await textResponse.json()) as any;\n\t\t\texpect(textResult.headers[\"content-type\"]).toBe(\"text/plain\");\n\t\t\texpect(textResult.bodyText).toBe(\"Hello, World!\");\n\t\t});\n\n\t\ttest(\"should preserve all header casing and values\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\t\t\tconst actor = client.rawHttpRequestPropertiesActor.getOrCreate([\n\t\t\t\t\"test\",\n\t\t\t]);\n\n\t\t\tconst response = await actor.fetch(\"test/headers\", {\n\t\t\t\theaders: {\n\t\t\t\t\tAccept: \"application/json\",\n\t\t\t\t\t\"Accept-Language\": \"en-US,en;q=0.9\",\n\t\t\t\t\t\"Cache-Control\": \"no-cache\",\n\t\t\t\t\t\"User-Agent\": \"RivetKit-Test/1.0\",\n\t\t\t\t\t\"X-Request-ID\": \"12345\",\n\t\t\t\t},\n\t\t\t});\n\n\t\t\texpect(response.ok).toBe(true);\n\t\t\tconst data = (await response.json()) as any;\n\n\t\t\t// Headers should be normalized to lowercase\n\t\t\texpect(data.headers[\"accept\"]).toBe(\"application/json\");\n\t\t\texpect(data.headers[\"accept-language\"]).toBe(\"en-US,en;q=0.9\");\n\t\t\texpect(data.headers[\"cache-control\"]).toBe(\"no-cache\");\n\t\t\t// User-Agent might be overwritten by the HTTP client, so just check it exists\n\t\t\texpect(data.headers[\"user-agent\"]).toBeTruthy();\n\t\t\texpect(data.headers[\"x-request-id\"]).toBe(\"12345\");\n\t\t});\n\n\t\ttest(\"should handle empty and special URL paths\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\t\t\tconst actor = client.rawHttpRequestPropertiesActor.getOrCreate([\n\t\t\t\t\"test\",\n\t\t\t]);\n\n\t\t\t// Test root path\n\t\t\tconst rootResponse = await actor.fetch(\"\");\n\t\t\texpect(rootResponse.ok).toBe(true);\n\t\t\tconst rootData = (await rootResponse.json()) as any;\n\t\t\texpect(rootData.pathname).toBe(\"/\");\n\n\t\t\t// Test path with special characters\n\t\t\tconst specialResponse = await actor.fetch(\n\t\t\t\t\"test/path%20with%20spaces/and%2Fslashes\",\n\t\t\t);\n\t\t\texpect(specialResponse.ok).toBe(true);\n\t\t\tconst specialData = (await specialResponse.json()) as any;\n\t\t\t// Note: The URL path may or may not be decoded depending on the HTTP client/server\n\t\t\t// Just verify it contains the expected segments\n\t\t\texpect(specialData.pathname).toMatch(\n\t\t\t\t/path.*with.*spaces.*and.*slashes/,\n\t\t\t);\n\n\t\t\t// Test path with fragment (should be ignored in server-side)\n\t\t\tconst fragmentResponse = await actor.fetch(\"test/path#fragment\");\n\t\t\texpect(fragmentResponse.ok).toBe(true);\n\t\t\tconst fragmentData = (await fragmentResponse.json()) as any;\n\t\t\texpect(fragmentData.pathname).toBe(\"/test/path\");\n\t\t\texpect(fragmentData.hash).toBe(\"\"); // Fragments are not sent to server\n\t\t});\n\n\t\ttest(\"should handle request properties for all HTTP methods\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\t\t\tconst actor = client.rawHttpRequestPropertiesActor.getOrCreate([\n\t\t\t\t\"test\",\n\t\t\t]);\n\n\t\t\tconst methods = [\n\t\t\t\t\"GET\",\n\t\t\t\t\"POST\",\n\t\t\t\t\"PUT\",\n\t\t\t\t\"DELETE\",\n\t\t\t\t\"PATCH\",\n\t\t\t\t\"HEAD\",\n\t\t\t\t\"OPTIONS\",\n\t\t\t];\n\n\t\t\tfor (const method of methods) {\n\t\t\t\tconst response = await actor.fetch(\n\t\t\t\t\t`test/${method.toLowerCase()}`,\n\t\t\t\t\t{\n\t\t\t\t\t\tmethod,\n\t\t\t\t\t\t// Only include body for methods that support it\n\t\t\t\t\t\tbody: [\"POST\", \"PUT\", \"PATCH\"].includes(method)\n\t\t\t\t\t\t\t? JSON.stringify({ method })\n\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t},\n\t\t\t\t);\n\n\t\t\t\t// HEAD responses have no body\n\t\t\t\tif (method === \"HEAD\") {\n\t\t\t\t\texpect(response.status).toBe(200);\n\t\t\t\t\tconst text = await response.text();\n\t\t\t\t\texpect(text).toBe(\"\");\n\t\t\t\t} else if (method === \"OPTIONS\") {\n\t\t\t\t\texpect(response.status).toBe(204);\n\t\t\t\t\tconst text = await response.text();\n\t\t\t\t\texpect(text).toBe(\"\");\n\t\t\t\t} else {\n\t\t\t\t\texpect(response.ok).toBe(true);\n\t\t\t\t\tconst data = (await response.json()) as any;\n\t\t\t\t\texpect(data.method).toBe(method);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\ttest(\"should handle complex query parameters\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\t\t\tconst actor = client.rawHttpRequestPropertiesActor.getOrCreate([\n\t\t\t\t\"test\",\n\t\t\t]);\n\n\t\t\t// Test multiple values for same key\n\t\t\tconst response = await actor.fetch(\n\t\t\t\t\"test?key=value1&key=value2&array[]=1&array[]=2&nested[prop]=val\",\n\t\t\t);\n\t\t\texpect(response.ok).toBe(true);\n\t\t\tconst data = (await response.json()) as any;\n\n\t\t\t// Note: URLSearchParams only keeps the last value for duplicate keys\n\t\t\texpect(data.searchParams.key).toBe(\"value2\");\n\t\t\texpect(data.searchParams[\"array[]\"]).toBe(\"2\");\n\t\t\texpect(data.searchParams[\"nested[prop]\"]).toBe(\"val\");\n\t\t});\n\n\t\ttest(\"should handle multipart form data\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\t\t\tconst actor = client.rawHttpRequestPropertiesActor.getOrCreate([\n\t\t\t\t\"test\",\n\t\t\t]);\n\n\t\t\t// Create multipart boundary\n\t\t\tconst boundary = \"----RivetKitBoundary\";\n\t\t\tconst body = [\n\t\t\t\t`------${boundary}`,\n\t\t\t\t'Content-Disposition: form-data; name=\"field1\"',\n\t\t\t\t\"\",\n\t\t\t\t\"value1\",\n\t\t\t\t`------${boundary}`,\n\t\t\t\t'Content-Disposition: form-data; name=\"field2\"',\n\t\t\t\t\"\",\n\t\t\t\t\"value2\",\n\t\t\t\t`------${boundary}--`,\n\t\t\t].join(\"\\r\\n\");\n\n\t\t\tconst response = await actor.fetch(\"test/multipart\", {\n\t\t\t\tmethod: \"POST\",\n\t\t\t\theaders: {\n\t\t\t\t\t\"Content-Type\": `multipart/form-data; boundary=----${boundary}`,\n\t\t\t\t},\n\t\t\t\tbody: body,\n\t\t\t});\n\n\t\t\texpect(response.ok).toBe(true);\n\t\t\tconst data = (await response.json()) as any;\n\t\t\texpect(data.headers[\"content-type\"]).toContain(\n\t\t\t\t\"multipart/form-data\",\n\t\t\t);\n\t\t\texpect(data.bodyText).toContain(\"field1\");\n\t\t\texpect(data.bodyText).toContain(\"value1\");\n\t\t});\n\n\t\ttest(\"should handle very long URLs\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\t\t\tconst actor = client.rawHttpRequestPropertiesActor.getOrCreate([\n\t\t\t\t\"test\",\n\t\t\t]);\n\n\t\t\t// Create a very long query string\n\t\t\tconst longValue = \"x\".repeat(1000);\n\t\t\tconst response = await actor.fetch(`test/long?param=${longValue}`);\n\n\t\t\texpect(response.ok).toBe(true);\n\t\t\tconst data = (await response.json()) as any;\n\t\t\texpect(data.searchParams.param).toBe(longValue);\n\t\t\texpect(data.search.length).toBeGreaterThan(1000);\n\t\t});\n\n\t\ttest(\"should handle large request bodies\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\t\t\tconst actor = client.rawHttpRequestPropertiesActor.getOrCreate([\n\t\t\t\t\"test\",\n\t\t\t]);\n\n\t\t\t// Create a large JSON body (1MB+)\n\t\t\tconst largeArray = new Array(10000).fill({\n\t\t\t\tid: 1,\n\t\t\t\tname: \"Test\",\n\t\t\t\tdescription: \"This is a test object with some data\",\n\t\t\t});\n\n\t\t\tconst response = await actor.fetch(\"test/large\", {\n\t\t\t\tmethod: \"POST\",\n\t\t\t\theaders: {\n\t\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t},\n\t\t\t\tbody: JSON.stringify(largeArray),\n\t\t\t});\n\n\t\t\texpect(response.ok).toBe(true);\n\t\t\tconst data = (await response.json()) as any;\n\t\t\texpect(data.body).toHaveLength(10000);\n\t\t});\n\n\t\ttest(\"should handle missing content-type header\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\t\t\tconst actor = client.rawHttpRequestPropertiesActor.getOrCreate([\n\t\t\t\t\"test\",\n\t\t\t]);\n\n\t\t\tconst response = await actor.fetch(\"test/no-content-type\", {\n\t\t\t\tmethod: \"POST\",\n\t\t\t\tbody: \"plain text without content-type\",\n\t\t\t});\n\n\t\t\texpect(response.ok).toBe(true);\n\t\t\tconst data = (await response.json()) as any;\n\t\t\texpect(data.bodyText).toBe(\"plain text without content-type\");\n\t\t});\n\n\t\ttest(\"should handle empty request body\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\t\t\tconst actor = client.rawHttpRequestPropertiesActor.getOrCreate([\n\t\t\t\t\"test\",\n\t\t\t]);\n\n\t\t\tconst response = await actor.fetch(\"test/empty\", {\n\t\t\t\tmethod: \"POST\",\n\t\t\t\theaders: {\n\t\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t},\n\t\t\t\tbody: \"\",\n\t\t\t});\n\n\t\t\texpect(response.ok).toBe(true);\n\t\t\tconst data = (await response.json()) as any;\n\t\t\texpect(data.body).toBeNull();\n\t\t\texpect(data.bodyText).toBe(\"\");\n\t\t});\n\n\t\ttest(\"should handle custom HTTP methods\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\t\t\tconst actor = client.rawHttpRequestPropertiesActor.getOrCreate([\n\t\t\t\t\"test\",\n\t\t\t]);\n\n\t\t\t// Test a custom method (though most HTTP clients may not support this)\n\t\t\ttry {\n\t\t\t\tconst response = await actor.fetch(\"test/custom\", {\n\t\t\t\t\tmethod: \"CUSTOM\",\n\t\t\t\t});\n\n\t\t\t\t// If the request succeeds, verify the method\n\t\t\t\tif (response.ok) {\n\t\t\t\t\tconst data = (await response.json()) as any;\n\t\t\t\t\texpect(data.method).toBe(\"CUSTOM\");\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\t// Some HTTP clients may reject custom methods\n\t\t\t\t// This is expected behavior\n\t\t\t}\n\t\t});\n\n\t\ttest(\"should handle cookies in headers\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\t\t\tconst actor = client.rawHttpRequestPropertiesActor.getOrCreate([\n\t\t\t\t\"test\",\n\t\t\t]);\n\n\t\t\tconst response = await actor.fetch(\"test/cookies\", {\n\t\t\t\theaders: {\n\t\t\t\t\tCookie: \"session=abc123; user=test; preferences=dark_mode\",\n\t\t\t\t},\n\t\t\t});\n\n\t\t\texpect(response.ok).toBe(true);\n\t\t\tconst data = (await response.json()) as any;\n\t\t\texpect(data.headers.cookie).toBe(\n\t\t\t\t\"session=abc123; user=test; preferences=dark_mode\",\n\t\t\t);\n\t\t});\n\n\t\ttest(\"should handle URL encoding properly\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\t\t\tconst actor = client.rawHttpRequestPropertiesActor.getOrCreate([\n\t\t\t\t\"test\",\n\t\t\t]);\n\n\t\t\t// Test various encoded characters\n\t\t\tconst response = await actor.fetch(\n\t\t\t\t\"test/encoded?special=%20%21%40%23%24%25%5E%26&unicode=%E2%9C%93&email=test%40example.com\",\n\t\t\t);\n\n\t\t\texpect(response.ok).toBe(true);\n\t\t\tconst data = (await response.json()) as any;\n\n\t\t\t// Verify URL decoding\n\t\t\texpect(data.searchParams.special).toBe(\" !@#$%^&\");\n\t\t\texpect(data.searchParams.unicode).toBe(\"✓\");\n\t\t\texpect(data.searchParams.email).toBe(\"test@example.com\");\n\t\t});\n\n\t\ttest(\"should handle concurrent requests maintaining separate contexts\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\t\t\tconst actor = client.rawHttpRequestPropertiesActor.getOrCreate([\n\t\t\t\t\"test\",\n\t\t\t]);\n\n\t\t\t// Send multiple concurrent requests with different data\n\t\t\tconst requests = [\n\t\t\t\tactor.fetch(\"test/concurrent?id=1\", {\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\theaders: { \"Content-Type\": \"application/json\" },\n\t\t\t\t\tbody: JSON.stringify({ request: 1 }),\n\t\t\t\t}),\n\t\t\t\tactor.fetch(\"test/concurrent?id=2\", {\n\t\t\t\t\tmethod: \"PUT\",\n\t\t\t\t\theaders: { \"Content-Type\": \"application/json\" },\n\t\t\t\t\tbody: JSON.stringify({ request: 2 }),\n\t\t\t\t}),\n\t\t\t\tactor.fetch(\"test/concurrent?id=3\", {\n\t\t\t\t\tmethod: \"DELETE\",\n\t\t\t\t}),\n\t\t\t];\n\n\t\t\tconst responses = await Promise.all(requests);\n\t\t\tconst results = (await Promise.all(\n\t\t\t\tresponses.map((r) => r.json()),\n\t\t\t)) as any[];\n\n\t\t\t// Verify each request maintained its own context\n\t\t\texpect(results[0].searchParams.id).toBe(\"1\");\n\t\t\texpect(results[0].method).toBe(\"POST\");\n\t\t\texpect(results[0].body).toEqual({ request: 1 });\n\n\t\t\texpect(results[1].searchParams.id).toBe(\"2\");\n\t\t\texpect(results[1].method).toBe(\"PUT\");\n\t\t\texpect(results[1].body).toEqual({ request: 2 });\n\n\t\t\texpect(results[2].searchParams.id).toBe(\"3\");\n\t\t\texpect(results[2].method).toBe(\"DELETE\");\n\t\t\texpect(results[2].body).toBeNull();\n\t\t});\n\t});\n}\n","import { describe, expect, test } from \"vitest\";\nimport type { DriverTestConfig } from \"../mod\";\nimport { setupDriverTest } from \"../utils\";\n\nexport function runRawWebSocketTests(driverTestConfig: DriverTestConfig) {\n\tdescribe(\"raw websocket\", () => {\n\t\ttest(\"should establish raw WebSocket connection\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\t\t\tconst actor = client.rawWebSocketActor.getOrCreate([\"basic\"]);\n\n\t\t\tconst ws = await actor.websocket();\n\n\t\t\t// The WebSocket should already be open since openWebSocket waits for openPromise\n\t\t\t// But we still need to ensure any buffered events are processed\n\t\t\tawait new Promise<void>((resolve) => {\n\t\t\t\t// If already open, resolve immediately\n\t\t\t\tif (ws.readyState === WebSocket.OPEN) {\n\t\t\t\t\tresolve();\n\t\t\t\t} else {\n\t\t\t\t\t// Otherwise wait for open event\n\t\t\t\t\tws.addEventListener(\n\t\t\t\t\t\t\"open\",\n\t\t\t\t\t\t() => {\n\t\t\t\t\t\t\tresolve();\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{ once: true },\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Should receive welcome message\n\t\t\tconst welcomeMessage = await new Promise<any>((resolve, reject) => {\n\t\t\t\tws.addEventListener(\n\t\t\t\t\t\"message\",\n\t\t\t\t\t(event: any) => {\n\t\t\t\t\t\tresolve(JSON.parse(event.data as string));\n\t\t\t\t\t},\n\t\t\t\t\t{ once: true },\n\t\t\t\t);\n\t\t\t\tws.addEventListener(\"close\", reject);\n\t\t\t});\n\n\t\t\texpect(welcomeMessage.type).toBe(\"welcome\");\n\t\t\texpect(welcomeMessage.connectionCount).toBe(1);\n\n\t\t\tws.close();\n\t\t});\n\n\t\ttest(\"should echo messages\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\t\t\tconst actor = client.rawWebSocketActor.getOrCreate([\"echo\"]);\n\n\t\t\tconst ws = await actor.websocket();\n\n\t\t\t// Check if WebSocket is already open\n\t\t\tif (ws.readyState !== WebSocket.OPEN) {\n\t\t\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\t\t\tws.addEventListener(\"open\", () => resolve(), {\n\t\t\t\t\t\tonce: true,\n\t\t\t\t\t});\n\t\t\t\t\tws.addEventListener(\"close\", reject);\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Skip welcome message\n\t\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\t\tws.addEventListener(\"message\", () => resolve(), { once: true });\n\t\t\t\tws.addEventListener(\"close\", reject);\n\t\t\t});\n\n\t\t\t// Send and receive echo\n\t\t\tconst testMessage = { test: \"data\", timestamp: Date.now() };\n\t\t\tws.send(JSON.stringify(testMessage));\n\n\t\t\tconst echoMessage = await new Promise<any>((resolve, reject) => {\n\t\t\t\tws.addEventListener(\n\t\t\t\t\t\"message\",\n\t\t\t\t\t(event: any) => {\n\t\t\t\t\t\tresolve(JSON.parse(event.data as string));\n\t\t\t\t\t},\n\t\t\t\t\t{ once: true },\n\t\t\t\t);\n\t\t\t\tws.addEventListener(\"close\", reject);\n\t\t\t});\n\n\t\t\texpect(echoMessage).toEqual(testMessage);\n\n\t\t\tws.close();\n\t\t});\n\n\t\ttest(\"should handle ping/pong protocol\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\t\t\tconst actor = client.rawWebSocketActor.getOrCreate([\"ping\"]);\n\n\t\t\tconst ws = await actor.websocket();\n\n\t\t\t// Check if WebSocket is already open\n\t\t\tif (ws.readyState !== WebSocket.OPEN) {\n\t\t\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\t\t\tws.addEventListener(\"open\", () => resolve(), {\n\t\t\t\t\t\tonce: true,\n\t\t\t\t\t});\n\t\t\t\t\tws.addEventListener(\"close\", reject);\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Skip welcome message\n\t\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\t\tws.addEventListener(\"message\", () => resolve(), { once: true });\n\t\t\t\tws.addEventListener(\"close\", reject);\n\t\t\t});\n\n\t\t\t// Send ping\n\t\t\tws.send(JSON.stringify({ type: \"ping\" }));\n\n\t\t\tconst pongMessage = await new Promise<any>((resolve, reject) => {\n\t\t\t\tws.addEventListener(\"message\", (event: any) => {\n\t\t\t\t\tconst data = JSON.parse(event.data as string);\n\t\t\t\t\tif (data.type === \"pong\") {\n\t\t\t\t\t\tresolve(data);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tws.addEventListener(\"close\", reject);\n\t\t\t});\n\n\t\t\texpect(pongMessage.type).toBe(\"pong\");\n\t\t\texpect(pongMessage.timestamp).toBeDefined();\n\n\t\t\tws.close();\n\t\t});\n\n\t\ttest(\"should track stats across connections\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\t\t\tconst actor1 = client.rawWebSocketActor.getOrCreate([\"stats\"]);\n\n\t\t\t// Create first connection to ensure actor exists\n\t\t\tconst ws1 = await actor1.websocket();\n\t\t\tconst ws1MessagePromise = new Promise<void>((resolve, reject) => {\n\t\t\t\tws1.addEventListener(\"message\", () => resolve(), {\n\t\t\t\t\tonce: true,\n\t\t\t\t});\n\t\t\t\tws1.addEventListener(\"close\", reject);\n\t\t\t});\n\n\t\t\t// Wait for first connection to establish before getting the actor\n\t\t\tawait ws1MessagePromise;\n\n\t\t\t// Now get reference to same actor\n\t\t\tconst actor2 = client.rawWebSocketActor.get([\"stats\"]);\n\t\t\tconst ws2 = await actor2.websocket();\n\t\t\tconst ws2MessagePromise = new Promise<void>((resolve, reject) => {\n\t\t\t\tws2.addEventListener(\"message\", () => resolve(), {\n\t\t\t\t\tonce: true,\n\t\t\t\t});\n\t\t\t\tws2.addEventListener(\"close\", reject);\n\t\t\t});\n\n\t\t\t// Wait for welcome messages\n\t\t\tawait Promise.all([ws1MessagePromise, ws2MessagePromise]);\n\n\t\t\t// Send some messages\n\t\t\tconst pingPromise = new Promise<any>((resolve, reject) => {\n\t\t\t\tws2.addEventListener(\"message\", (event: any) => {\n\t\t\t\t\tconst data = JSON.parse(event.data as string);\n\t\t\t\t\tif (data.type === \"pong\") {\n\t\t\t\t\t\tresolve(undefined);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tws2.addEventListener(\"close\", reject);\n\t\t\t});\n\t\t\tws1.send(JSON.stringify({ data: \"test1\" }));\n\t\t\tws1.send(JSON.stringify({ data: \"test3\" }));\n\t\t\tws2.send(JSON.stringify({ type: \"ping\" }));\n\t\t\tawait pingPromise;\n\n\t\t\t// Get stats\n\t\t\tconst statsPromise = new Promise<any>((resolve, reject) => {\n\t\t\t\tws1.addEventListener(\"message\", (event: any) => {\n\t\t\t\t\tconst data = JSON.parse(event.data as string);\n\t\t\t\t\tif (data.type === \"stats\") {\n\t\t\t\t\t\tresolve(data);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tws1.addEventListener(\"close\", reject);\n\t\t\t});\n\t\t\tws1.send(JSON.stringify({ type: \"getStats\" }));\n\t\t\tconst stats = await statsPromise;\n\t\t\texpect(stats.connectionCount).toBe(2);\n\t\t\texpect(stats.messageCount).toBe(4);\n\n\t\t\t// Verify via action\n\t\t\tconst actionStats = await actor1.getStats();\n\t\t\texpect(actionStats.connectionCount).toBe(2);\n\t\t\texpect(actionStats.messageCount).toBe(4);\n\n\t\t\tws1.close();\n\t\t\tws2.close();\n\t\t});\n\n\t\ttest(\"should handle binary data\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\t\t\tconst actor = client.rawWebSocketBinaryActor.getOrCreate([\n\t\t\t\t\"binary\",\n\t\t\t]);\n\n\t\t\tconst ws = await actor.websocket();\n\n\t\t\t// Check if WebSocket is already open\n\t\t\tif (ws.readyState !== WebSocket.OPEN) {\n\t\t\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\t\t\tws.addEventListener(\"open\", () => resolve(), {\n\t\t\t\t\t\tonce: true,\n\t\t\t\t\t});\n\t\t\t\t\tws.addEventListener(\"close\", reject);\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Helper to receive and convert binary message\n\t\t\tconst receiveBinaryMessage = async (): Promise<Uint8Array> => {\n\t\t\t\tconst response = await new Promise<ArrayBuffer | Blob>(\n\t\t\t\t\t(resolve, reject) => {\n\t\t\t\t\t\tws.addEventListener(\n\t\t\t\t\t\t\t\"message\",\n\t\t\t\t\t\t\t(event: any) => {\n\t\t\t\t\t\t\t\tresolve(event.data);\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{ once: true },\n\t\t\t\t\t\t);\n\t\t\t\t\t\tws.addEventListener(\"close\", reject);\n\t\t\t\t\t},\n\t\t\t\t);\n\n\t\t\t\t// Convert Blob to ArrayBuffer if needed\n\t\t\t\tconst buffer =\n\t\t\t\t\tresponse instanceof Blob\n\t\t\t\t\t\t? await response.arrayBuffer()\n\t\t\t\t\t\t: response;\n\n\t\t\t\treturn new Uint8Array(buffer);\n\t\t\t};\n\n\t\t\t// Test 1: Small binary data\n\t\t\tconst smallData = new Uint8Array([1, 2, 3, 4, 5]);\n\t\t\tws.send(smallData);\n\t\t\tconst smallReversed = await receiveBinaryMessage();\n\t\t\texpect(Array.from(smallReversed)).toEqual([5, 4, 3, 2, 1]);\n\n\t\t\t// Test 2: Large binary data (1KB)\n\t\t\tconst largeData = new Uint8Array(1024);\n\t\t\tfor (let i = 0; i < largeData.length; i++) {\n\t\t\t\tlargeData[i] = i % 256;\n\t\t\t}\n\t\t\tws.send(largeData);\n\t\t\tconst largeReversed = await receiveBinaryMessage();\n\n\t\t\t// Verify it's reversed correctly\n\t\t\tfor (let i = 0; i < largeData.length; i++) {\n\t\t\t\texpect(largeReversed[i]).toBe(\n\t\t\t\t\tlargeData[largeData.length - 1 - i],\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tws.close();\n\t\t});\n\n\t\ttest(\"should work with custom paths\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\t\t\tconst actor = client.rawWebSocketActor.getOrCreate([\"paths\"]);\n\n\t\t\tconst ws = await actor.websocket(\"custom/path\");\n\n\t\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\t\tws.addEventListener(\"open\", () => {\n\t\t\t\t\tresolve();\n\t\t\t\t});\n\t\t\t\tws.addEventListener(\"error\", reject);\n\t\t\t\tws.addEventListener(\"close\", reject);\n\t\t\t});\n\n\t\t\t// Should still work\n\t\t\tconst welcomeMessage = await new Promise<any>((resolve) => {\n\t\t\t\tws.addEventListener(\n\t\t\t\t\t\"message\",\n\t\t\t\t\t(event: any) => {\n\t\t\t\t\t\tresolve(JSON.parse(event.data as string));\n\t\t\t\t\t},\n\t\t\t\t\t{ once: true },\n\t\t\t\t);\n\t\t\t});\n\n\t\t\texpect(welcomeMessage.type).toBe(\"welcome\");\n\n\t\t\tws.close();\n\t\t});\n\n\t\ttest(\"should handle connection close properly\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\t\t\tconst actor = client.rawWebSocketActor.getOrCreate([\"close-test\"]);\n\n\t\t\tconst ws = await actor.websocket();\n\n\t\t\t// Check if WebSocket is already open\n\t\t\tif (ws.readyState !== WebSocket.OPEN) {\n\t\t\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\t\t\tws.addEventListener(\"open\", () => resolve(), {\n\t\t\t\t\t\tonce: true,\n\t\t\t\t\t});\n\t\t\t\t\tws.addEventListener(\"close\", reject);\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Get initial stats\n\t\t\tconst initialStats = await actor.getStats();\n\t\t\texpect(initialStats.connectionCount).toBe(1);\n\n\t\t\t// Wait for close event on client side\n\t\t\tconst closePromise = new Promise<void>((resolve) => {\n\t\t\t\tws.addEventListener(\"close\", () => resolve(), { once: true });\n\t\t\t});\n\n\t\t\t// Close connection\n\t\t\tws.close();\n\t\t\tawait closePromise;\n\n\t\t\t// Poll getStats until connection count is 0\n\t\t\tlet finalStats: any;\n\t\t\tfor (let i = 0; i < 20; i++) {\n\t\t\t\tfinalStats = await actor.getStats();\n\t\t\t\tif (finalStats.connectionCount === 0) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tawait new Promise((resolve) => setTimeout(resolve, 50));\n\t\t\t}\n\n\t\t\t// Check stats after close\n\t\t\texpect(finalStats?.connectionCount).toBe(0);\n\t\t});\n\n\t\ttest(\"should properly handle onWebSocket open and close events\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\t\t\tconst actor = client.rawWebSocketActor.getOrCreate([\n\t\t\t\t\"open-close-test\",\n\t\t\t]);\n\n\t\t\t// Create first connection\n\t\t\tconst ws1 = await actor.websocket();\n\n\t\t\t// Wait for open event\n\t\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\t\tws1.addEventListener(\"open\", () => resolve(), { once: true });\n\t\t\t\tws1.addEventListener(\"close\", reject);\n\t\t\t});\n\n\t\t\t// Wait for welcome message which confirms onWebSocket was called\n\t\t\tconst welcome1 = await new Promise<any>((resolve, reject) => {\n\t\t\t\tws1.addEventListener(\n\t\t\t\t\t\"message\",\n\t\t\t\t\t(event: any) => {\n\t\t\t\t\t\tresolve(JSON.parse(event.data as string));\n\t\t\t\t\t},\n\t\t\t\t\t{ once: true },\n\t\t\t\t);\n\t\t\t\tws1.addEventListener(\"close\", reject);\n\t\t\t});\n\n\t\t\texpect(welcome1.type).toBe(\"welcome\");\n\t\t\texpect(welcome1.connectionCount).toBe(1);\n\n\t\t\t// Create second connection to same actor\n\t\t\tconst ws2 = await actor.websocket();\n\n\t\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\t\tws2.addEventListener(\"open\", () => resolve(), { once: true });\n\t\t\t\tws2.addEventListener(\"close\", reject);\n\t\t\t});\n\n\t\t\tconst welcome2 = await new Promise<any>((resolve, reject) => {\n\t\t\t\tws2.addEventListener(\n\t\t\t\t\t\"message\",\n\t\t\t\t\t(event: any) => {\n\t\t\t\t\t\tresolve(JSON.parse(event.data as string));\n\t\t\t\t\t},\n\t\t\t\t\t{ once: true },\n\t\t\t\t);\n\t\t\t\tws2.addEventListener(\"close\", reject);\n\t\t\t});\n\n\t\t\texpect(welcome2.type).toBe(\"welcome\");\n\t\t\texpect(welcome2.connectionCount).toBe(2);\n\n\t\t\t// Verify stats\n\t\t\tconst midStats = await actor.getStats();\n\t\t\texpect(midStats.connectionCount).toBe(2);\n\n\t\t\t// Close first connection\n\t\t\tws1.close();\n\t\t\tawait new Promise<void>((resolve) => {\n\t\t\t\tws1.addEventListener(\"close\", () => resolve(), { once: true });\n\t\t\t});\n\n\t\t\t// Poll getStats until connection count decreases to 1\n\t\t\tlet afterFirstClose: any;\n\t\t\tfor (let i = 0; i < 20; i++) {\n\t\t\t\tafterFirstClose = await actor.getStats();\n\t\t\t\tif (afterFirstClose.connectionCount === 1) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tawait new Promise((resolve) => setTimeout(resolve, 50));\n\t\t\t}\n\n\t\t\t// Verify connection count decreased\n\t\t\texpect(afterFirstClose?.connectionCount).toBe(1);\n\n\t\t\t// Close second connection\n\t\t\tws2.close();\n\t\t\tawait new Promise<void>((resolve) => {\n\t\t\t\tws2.addEventListener(\"close\", () => resolve(), { once: true });\n\t\t\t});\n\n\t\t\t// Poll getStats until connection count is 0\n\t\t\tlet finalStats: any;\n\t\t\tfor (let i = 0; i < 20; i++) {\n\t\t\t\tfinalStats = await actor.getStats();\n\t\t\t\tif (finalStats.connectionCount === 0) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tawait new Promise((resolve) => setTimeout(resolve, 50));\n\t\t\t}\n\n\t\t\t// Verify final state\n\t\t\texpect(finalStats?.connectionCount).toBe(0);\n\t\t});\n\n\t\ttest(\"should handle query parameters in websocket paths\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\t\t\tconst actor = client.rawWebSocketActor.getOrCreate([\n\t\t\t\t\"query-params\",\n\t\t\t]);\n\n\t\t\t// Test WebSocket with query parameters\n\t\t\tconst ws = await actor.websocket(\n\t\t\t\t\"api/v1/stream?token=abc123&user=test\",\n\t\t\t);\n\n\t\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\t\tws.addEventListener(\"open\", () => resolve(), { once: true });\n\t\t\t\tws.addEventListener(\"error\", reject);\n\t\t\t});\n\n\t\t\tconst requestInfoPromise = new Promise<any>((resolve, reject) => {\n\t\t\t\tws.addEventListener(\"message\", (event: any) => {\n\t\t\t\t\tconst data = JSON.parse(event.data as string);\n\t\t\t\t\tif (data.type === \"requestInfo\") {\n\t\t\t\t\t\tresolve(data);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tws.addEventListener(\"close\", reject);\n\t\t\t});\n\n\t\t\t// Send request to get the request info\n\t\t\tws.send(JSON.stringify({ type: \"getRequestInfo\" }));\n\n\t\t\tconst requestInfo = await requestInfoPromise;\n\n\t\t\t// Verify the path and query parameters were preserved\n\t\t\texpect(requestInfo.url).toContain(\"api/v1/stream\");\n\t\t\texpect(requestInfo.url).toContain(\"token=abc123\");\n\t\t\texpect(requestInfo.url).toContain(\"user=test\");\n\n\t\t\tws.close();\n\t\t});\n\t});\n}\n","import { describe, expect, test } from \"vitest\";\nimport type { DriverTestConfig } from \"../mod\";\nimport { setupDriverTest } from \"../utils\";\n\nexport function runRequestAccessTests(driverTestConfig: DriverTestConfig) {\n\tdescribe(\"Request Access in Lifecycle Hooks\", () => {\n\t\ttest(\"should have access to request object in onBeforeConnect and createConnState\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t// Create actor with request tracking enabled\n\t\t\tconst handle = client.requestAccessActor.getOrCreate(\n\t\t\t\t[\"test-request\"],\n\t\t\t\t{\n\t\t\t\t\tparams: { trackRequest: true },\n\t\t\t\t},\n\t\t\t);\n\t\t\tconst connection = handle.connect();\n\n\t\t\t// Get request info that was captured in onBeforeConnect\n\t\t\tconst requestInfo = await connection.getRequestInfo();\n\n\t\t\t// Verify request was accessible in HTTP mode, but not in inline mode\n\t\t\tif (driverTestConfig.clientType === \"http\") {\n\t\t\t\t// Check onBeforeConnect\n\t\t\t\texpect(requestInfo.onBeforeConnect.hasRequest).toBe(true);\n\t\t\t\texpect(requestInfo.onBeforeConnect.requestUrl).toBeDefined();\n\t\t\t\texpect(requestInfo.onBeforeConnect.requestMethod).toBeDefined();\n\t\t\t\texpect(\n\t\t\t\t\trequestInfo.onBeforeConnect.requestHeaders,\n\t\t\t\t).toBeDefined();\n\n\t\t\t\t// Check createConnState\n\t\t\t\texpect(requestInfo.createConnState.hasRequest).toBe(true);\n\t\t\t\texpect(requestInfo.createConnState.requestUrl).toBeDefined();\n\t\t\t\texpect(requestInfo.createConnState.requestMethod).toBeDefined();\n\t\t\t\texpect(\n\t\t\t\t\trequestInfo.createConnState.requestHeaders,\n\t\t\t\t).toBeDefined();\n\t\t\t} else {\n\t\t\t\t// Inline client may or may not have request object depending on the driver\n\t\t\t\t//\n\t\t\t\t// e.g.\n\t\t\t\t// - File system does not have a request for inline requests\n\t\t\t\t// - Rivet Engine proxies the request so it has access to the request object\n\t\t\t}\n\n\t\t\t// Clean up\n\t\t\tawait connection.dispose();\n\t\t});\n\n\t\ttest(\"should not have request when trackRequest is false\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t// Create actor without request tracking\n\t\t\tconst handle = client.requestAccessActor.getOrCreate(\n\t\t\t\t[\"test-no-request\"],\n\t\t\t\t{\n\t\t\t\t\tparams: { trackRequest: false },\n\t\t\t\t},\n\t\t\t);\n\t\t\tconst connection = handle.connect();\n\n\t\t\t// Get request info\n\t\t\tconst requestInfo = await connection.getRequestInfo();\n\n\t\t\t// Verify request was not tracked\n\t\t\texpect(requestInfo.onBeforeConnect.hasRequest).toBe(false);\n\t\t\texpect(requestInfo.onBeforeConnect.requestUrl).toBeNull();\n\t\t\texpect(requestInfo.onBeforeConnect.requestMethod).toBeNull();\n\t\t\texpect(\n\t\t\t\tObject.keys(requestInfo.onBeforeConnect.requestHeaders),\n\t\t\t).toHaveLength(0);\n\n\t\t\texpect(requestInfo.createConnState.hasRequest).toBe(false);\n\t\t\texpect(requestInfo.createConnState.requestUrl).toBeNull();\n\t\t\texpect(requestInfo.createConnState.requestMethod).toBeNull();\n\t\t\texpect(\n\t\t\t\tObject.keys(requestInfo.createConnState.requestHeaders),\n\t\t\t).toHaveLength(0);\n\n\t\t\t// Clean up\n\t\t\tawait connection.dispose();\n\t\t});\n\n\t\ttest(\"should capture request headers and method\", async (c) => {\n\t\t\tconst { client } = await setupDriverTest(c, driverTestConfig);\n\n\t\t\t// Create actor and connect with request tracking\n\t\t\tconst handle = client.requestAccessActor.getOrCreate(\n\t\t\t\t[\"test-headers\"],\n\t\t\t\t{\n\t\t\t\t\tparams: { trackRequest: true },\n\t\t\t\t},\n\t\t\t);\n\t\t\tconst connection = handle.connect();\n\n\t\t\t// Get request info\n\t\t\tconst requestInfo = await connection.getRequestInfo();\n\n\t\t\tif (driverTestConfig.clientType === \"http\") {\n\t\t\t\t// Verify request details were captured in both hooks\n\t\t\t\texpect(requestInfo.onBeforeConnect.hasRequest).toBe(true);\n\t\t\t\texpect(requestInfo.onBeforeConnect.requestMethod).toBeTruthy();\n\t\t\t\texpect(requestInfo.onBeforeConnect.requestUrl).toBeTruthy();\n\t\t\t\texpect(requestInfo.onBeforeConnect.requestHeaders).toBeTruthy();\n\t\t\t\texpect(typeof requestInfo.onBeforeConnect.requestHeaders).toBe(\n\t\t\t\t\t\"object\",\n\t\t\t\t);\n\n\t\t\t\texpect(requestInfo.createConnState.hasRequest).toBe(true);\n\t\t\t\texpect(requestInfo.createConnState.requestMethod).toBeTruthy();\n\t\t\t\texpect(requestInfo.createConnState.requestUrl).toBeTruthy();\n\t\t\t\texpect(requestInfo.createConnState.requestHeaders).toBeTruthy();\n\t\t\t\texpect(typeof requestInfo.createConnState.requestHeaders).toBe(\n\t\t\t\t\t\"object\",\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\t// Inline client may or may not have request object depending on the driver\n\t\t\t\t//\n\t\t\t\t// See \"should have access to request object in onBeforeConnect and createConnState\"\n\t\t\t}\n\n\t\t\t// Clean up\n\t\t\tawait connection.dispose();\n\t\t});\n\n\t\t// TODO: re-expose this once we can have actor queries on the gateway\n\t\t// test(\"should have access to request object in onFetch\", async (c) => {\n\t\t// \tconst { client, endpoint } = await setupDriverTest(c, driverTestConfig);\n\t\t//\n\t\t// \t// Create actor\n\t\t// \tconst handle = client.requestAccessActor.getOrCreate([\"test-fetch\"]);\n\t\t//\n\t\t// \t// Make a raw HTTP request to the actor\n\t\t// \tawait handle.resolve(); // Ensure actor is created\n\t\t//\n\t\t// \tconst actorQuery = {\n\t\t// \t\tgetOrCreateForKey: {\n\t\t// \t\t\tname: \"requestAccessActor\",\n\t\t// \t\t\tkey: [\"test-fetch\"],\n\t\t// \t\t},\n\t\t// \t};\n\t\t//\n\t\t// \tconst url = `${endpoint}/registry/actors/raw/http/test-path`;\n\t\t// \tconst response = await fetch(url, {\n\t\t// \t\tmethod: \"POST\",\n\t\t// \t\theaders: {\n\t\t// \t\t\t\"Content-Type\": \"application/json\",\n\t\t// \t\t\t\"X-Test-Header\": \"test-value\",\n\t\t// \t\t\t\"X-RivetKit-Query\": JSON.stringify(actorQuery),\n\t\t// \t\t},\n\t\t// \t\tbody: JSON.stringify({ test: \"data\" }),\n\t\t// \t});\n\t\t//\n\t\t// \tif (!response.ok) {\n\t\t// \t\tconst errorText = await response.text();\n\t\t// \t\tconsole.error(\n\t\t// \t\t\t`HTTP request failed: ${response.status} ${response.statusText}`,\n\t\t// \t\t\terrorText,\n\t\t// \t\t);\n\t\t// \t}\n\t\t//\n\t\t// \texpect(response.ok).toBe(true);\n\t\t// \tconst data = await response.json();\n\t\t//\n\t\t// \t// Verify request info from onFetch\n\t\t// \texpect((data as any).hasRequest).toBe(true);\n\t\t// \texpect((data as any).requestUrl).toContain(\"/test-path\");\n\t\t// \texpect((data as any).requestMethod).toBe(\"POST\");\n\t\t// \texpect((data as any).requestHeaders).toBeDefined();\n\t\t// \texpect((data as any).requestHeaders[\"content-type\"]).toBe(\n\t\t// \t\t\"application/json\",\n\t\t// \t);\n\t\t// \texpect((data as any).requestHeaders[\"x-test-header\"]).toBe(\"test-value\");\n\t\t// });\n\n\t\t// test(\"should have access to request object in onWebSocket\", async (c) => {\n\t\t// \tconst { client, endpoint } = await setupDriverTest(c, driverTestConfig);\n\t\t//\n\t\t// \t// Only test in environments that support WebSocket\n\t\t// \tif (typeof WebSocket !== \"undefined\") {\n\t\t// \t\t// Create actor\n\t\t// \t\tconst handle = client.requestAccessActor.getOrCreate([\n\t\t// \t\t\t\"test-websocket\",\n\t\t// \t\t]);\n\t\t// \t\tawait handle.resolve(); // Ensure actor is created\n\t\t//\n\t\t// \t\tconst actorQuery = {\n\t\t// \t\t\tgetOrCreateForKey: {\n\t\t// \t\t\t\tname: \"requestAccessActor\",\n\t\t// \t\t\t\tkey: [\"test-websocket\"],\n\t\t// \t\t\t},\n\t\t// \t\t};\n\t\t//\n\t\t// \t\t// Encode query as WebSocket subprotocol\n\t\t// \t\tconst queryProtocol = `query.${encodeURIComponent(JSON.stringify(actorQuery))}`;\n\t\t//\n\t\t// \t\t// Create raw WebSocket connection\n\t\t// \t\tconst wsUrl = endpoint\n\t\t// \t\t\t.replace(\"http://\", \"ws://\")\n\t\t// \t\t\t.replace(\"https://\", \"wss://\");\n\t\t// \t\tconst ws = new WebSocket(\n\t\t// \t\t\t`${wsUrl}/registry/actors/raw/websocket/test-path`,\n\t\t// \t\t\t[\n\t\t// \t\t\t\tqueryProtocol,\n\t\t// \t\t\t\t\"rivetkit\", // Required protocol\n\t\t// \t\t\t],\n\t\t// \t\t);\n\t\t//\n\t\t// \t\t// Wait for connection and first message\n\t\t// \t\tawait new Promise<void>((resolve, reject) => {\n\t\t// \t\t\tws.onopen = () => {\n\t\t// \t\t\t\t// Connection established\n\t\t// \t\t\t};\n\t\t//\n\t\t// \t\t\tws.onmessage = (event) => {\n\t\t// \t\t\t\ttry {\n\t\t// \t\t\t\t\tconst data = JSON.parse(event.data);\n\t\t//\n\t\t// \t\t\t\t\t// Verify request info from onWebSocket\n\t\t// \t\t\t\t\texpect(data.hasRequest).toBe(true);\n\t\t// \t\t\t\t\texpect(data.requestUrl).toContain(\"/test-path\");\n\t\t// \t\t\t\t\texpect(data.requestMethod).toBe(\"GET\");\n\t\t// \t\t\t\t\texpect(data.requestHeaders).toBeDefined();\n\t\t//\n\t\t// \t\t\t\t\tws.close();\n\t\t// \t\t\t\t\tresolve();\n\t\t// \t\t\t\t} catch (error) {\n\t\t// \t\t\t\t\treject(error);\n\t\t// \t\t\t\t}\n\t\t// \t\t\t};\n\t\t//\n\t\t// \t\t\tws.onerror = (error) => {\n\t\t// \t\t\t\treject(error);\n\t\t// \t\t\t};\n\t\t// \t\t});\n\t\t// \t}\n\t\t// });\n\t});\n}\n"],"mappings":"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","names":["describe","encoding","WebSocket","describe","expect","test","vi","describe","test","expect","vi","describe","expect","test","vi","describe","test","expect","vi","describe","describe","expect","test","describe","test","expect","describe","expect","test","describe","test","expect","describe","expect","test","describe","test","expect","describe","describe","expect","test","describe","test","expect","describe","expect","test","describe","test","expect","describe","expect","test","describe","test","expect","describe","expect","test","describe","test","expect","response","describe","expect","test","describe","test","expect","describe","expect","test","describe","test","actor","expect","describe","expect","test","vi","describe","test","expect","vi","describe","expect","test","describe","test","expect","describe","expect","test","describe","test","expect","actor","describe","expect","test","describe","test","actor","expect","describe","expect","test","describe","test","actor","expect","describe","expect","test","describe","test","actor","expect","describe","expect","test","describe","test","expect","describe","_a"]}