@quenty/studio-bridge 0.21.1 → 0.22.0

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 (482) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/README.md +109 -17
  3. package/build-scripts/transform-add-session-attribute.lua +1 -0
  4. package/deploy.nevermore.json +10 -0
  5. package/dist/src/bridge/bridge-connection.d.ts +26 -2
  6. package/dist/src/bridge/bridge-connection.d.ts.map +1 -1
  7. package/dist/src/bridge/bridge-connection.js +159 -14
  8. package/dist/src/bridge/bridge-connection.js.map +1 -1
  9. package/dist/src/bridge/bridge-connection.test.js +81 -0
  10. package/dist/src/bridge/bridge-connection.test.js.map +1 -1
  11. package/dist/src/bridge/bridge-session.d.ts +35 -2
  12. package/dist/src/bridge/bridge-session.d.ts.map +1 -1
  13. package/dist/src/bridge/bridge-session.js +185 -28
  14. package/dist/src/bridge/bridge-session.js.map +1 -1
  15. package/dist/src/bridge/bridge-session.test.js +6 -4
  16. package/dist/src/bridge/bridge-session.test.js.map +1 -1
  17. package/dist/src/bridge/index.d.ts +1 -1
  18. package/dist/src/bridge/index.d.ts.map +1 -1
  19. package/dist/src/bridge/index.js.map +1 -1
  20. package/dist/src/bridge/internal/bridge-client.d.ts +4 -0
  21. package/dist/src/bridge/internal/bridge-client.d.ts.map +1 -1
  22. package/dist/src/bridge/internal/bridge-client.js +20 -7
  23. package/dist/src/bridge/internal/bridge-client.js.map +1 -1
  24. package/dist/src/bridge/internal/bridge-client.test.js +18 -0
  25. package/dist/src/bridge/internal/bridge-client.test.js.map +1 -1
  26. package/dist/src/bridge/internal/bridge-host.d.ts +13 -1
  27. package/dist/src/bridge/internal/bridge-host.d.ts.map +1 -1
  28. package/dist/src/bridge/internal/bridge-host.js +35 -0
  29. package/dist/src/bridge/internal/bridge-host.js.map +1 -1
  30. package/dist/src/bridge/internal/bridge-host.test.js +31 -0
  31. package/dist/src/bridge/internal/bridge-host.test.js.map +1 -1
  32. package/dist/src/bridge/internal/hand-off.d.ts.map +1 -1
  33. package/dist/src/bridge/internal/hand-off.js +4 -1
  34. package/dist/src/bridge/internal/hand-off.js.map +1 -1
  35. package/dist/src/bridge/internal/host-protocol.d.ts +8 -0
  36. package/dist/src/bridge/internal/host-protocol.d.ts.map +1 -1
  37. package/dist/src/bridge/internal/host-protocol.js +120 -13
  38. package/dist/src/bridge/internal/host-protocol.js.map +1 -1
  39. package/dist/src/bridge/internal/host-protocol.test.js +13 -0
  40. package/dist/src/bridge/internal/host-protocol.test.js.map +1 -1
  41. package/dist/src/bridge/internal/instance-state.d.ts +9 -0
  42. package/dist/src/bridge/internal/instance-state.d.ts.map +1 -0
  43. package/dist/src/bridge/internal/instance-state.js +28 -0
  44. package/dist/src/bridge/internal/instance-state.js.map +1 -0
  45. package/dist/src/bridge/internal/transport-client.d.ts.map +1 -1
  46. package/dist/src/bridge/internal/transport-client.js +2 -1
  47. package/dist/src/bridge/internal/transport-client.js.map +1 -1
  48. package/dist/src/bridge/internal/transport-server.d.ts.map +1 -1
  49. package/dist/src/bridge/internal/transport-server.js +5 -1
  50. package/dist/src/bridge/internal/transport-server.js.map +1 -1
  51. package/dist/src/bridge/types.d.ts +43 -4
  52. package/dist/src/bridge/types.d.ts.map +1 -1
  53. package/dist/src/bridge/types.js.map +1 -1
  54. package/dist/src/cli/adapters/cli-command-adapter-handler.test.js +24 -0
  55. package/dist/src/cli/adapters/cli-command-adapter-handler.test.js.map +1 -1
  56. package/dist/src/cli/adapters/cli-command-adapter.d.ts +6 -0
  57. package/dist/src/cli/adapters/cli-command-adapter.d.ts.map +1 -1
  58. package/dist/src/cli/adapters/cli-command-adapter.js +107 -11
  59. package/dist/src/cli/adapters/cli-command-adapter.js.map +1 -1
  60. package/dist/src/cli/adapters/group-builder.d.ts +3 -0
  61. package/dist/src/cli/adapters/group-builder.d.ts.map +1 -1
  62. package/dist/src/cli/adapters/group-builder.js +34 -15
  63. package/dist/src/cli/adapters/group-builder.js.map +1 -1
  64. package/dist/src/cli/adapters/group-builder.test.js +26 -2
  65. package/dist/src/cli/adapters/group-builder.test.js.map +1 -1
  66. package/dist/src/cli/adapters/help-formatter.d.ts.map +1 -1
  67. package/dist/src/cli/adapters/help-formatter.js +4 -3
  68. package/dist/src/cli/adapters/help-formatter.js.map +1 -1
  69. package/dist/src/cli/adapters/help-formatter.test.js +1 -1
  70. package/dist/src/cli/adapters/help-formatter.test.js.map +1 -1
  71. package/dist/src/cli/adapters/playtest-edit-guard.test.d.ts +2 -0
  72. package/dist/src/cli/adapters/playtest-edit-guard.test.d.ts.map +1 -0
  73. package/dist/src/cli/adapters/playtest-edit-guard.test.js +28 -0
  74. package/dist/src/cli/adapters/playtest-edit-guard.test.js.map +1 -0
  75. package/dist/src/cli/args/global-args.d.ts +1 -1
  76. package/dist/src/cli/args/global-args.d.ts.map +1 -1
  77. package/dist/src/cli/cli-output-context.d.ts +14 -0
  78. package/dist/src/cli/cli-output-context.d.ts.map +1 -0
  79. package/dist/src/cli/cli-output-context.js +39 -0
  80. package/dist/src/cli/cli-output-context.js.map +1 -0
  81. package/dist/src/cli/cli-output-context.test.d.ts +2 -0
  82. package/dist/src/cli/cli-output-context.test.d.ts.map +1 -0
  83. package/dist/src/cli/cli-output-context.test.js +38 -0
  84. package/dist/src/cli/cli-output-context.test.js.map +1 -0
  85. package/dist/src/cli/cli.js +40 -17
  86. package/dist/src/cli/cli.js.map +1 -1
  87. package/dist/src/cli/managed-studio-run.d.ts +21 -0
  88. package/dist/src/cli/managed-studio-run.d.ts.map +1 -0
  89. package/dist/src/cli/managed-studio-run.js +75 -0
  90. package/dist/src/cli/managed-studio-run.js.map +1 -0
  91. package/dist/src/cli/managed-studio-run.test.d.ts +2 -0
  92. package/dist/src/cli/managed-studio-run.test.d.ts.map +1 -0
  93. package/dist/src/cli/managed-studio-run.test.js +52 -0
  94. package/dist/src/cli/managed-studio-run.test.js.map +1 -0
  95. package/dist/src/cli/resolve-session.js +1 -1
  96. package/dist/src/cli/resolve-session.js.map +1 -1
  97. package/dist/src/cli/resolve-session.test.js +1 -1
  98. package/dist/src/cli/resolve-session.test.js.map +1 -1
  99. package/dist/src/cli/script-executor.d.ts +13 -1
  100. package/dist/src/cli/script-executor.d.ts.map +1 -1
  101. package/dist/src/cli/script-executor.js +77 -47
  102. package/dist/src/cli/script-executor.js.map +1 -1
  103. package/dist/src/commands/console/exec/exec.d.ts +17 -0
  104. package/dist/src/commands/console/exec/exec.d.ts.map +1 -1
  105. package/dist/src/commands/console/exec/exec.js +39 -7
  106. package/dist/src/commands/console/exec/exec.js.map +1 -1
  107. package/dist/src/commands/console/exec/exec.test.js +62 -3
  108. package/dist/src/commands/console/exec/exec.test.js.map +1 -1
  109. package/dist/src/commands/console/logs/logs.d.ts +30 -2
  110. package/dist/src/commands/console/logs/logs.d.ts.map +1 -1
  111. package/dist/src/commands/console/logs/logs.js +82 -7
  112. package/dist/src/commands/console/logs/logs.js.map +1 -1
  113. package/dist/src/commands/console/logs/logs.test.js +63 -4
  114. package/dist/src/commands/console/logs/logs.test.js.map +1 -1
  115. package/dist/src/commands/explorer/export/export.d.ts +19 -0
  116. package/dist/src/commands/explorer/export/export.d.ts.map +1 -0
  117. package/dist/src/commands/explorer/export/export.js +37 -0
  118. package/dist/src/commands/explorer/export/export.js.map +1 -0
  119. package/dist/src/commands/explorer/export/export.test.d.ts +2 -0
  120. package/dist/src/commands/explorer/export/export.test.d.ts.map +1 -0
  121. package/dist/src/commands/explorer/export/export.test.js +25 -0
  122. package/dist/src/commands/explorer/export/export.test.js.map +1 -0
  123. package/dist/src/commands/explorer/find/find.d.ts +28 -0
  124. package/dist/src/commands/explorer/find/find.d.ts.map +1 -0
  125. package/dist/src/commands/explorer/find/find.js +75 -0
  126. package/dist/src/commands/explorer/find/find.js.map +1 -0
  127. package/dist/src/commands/explorer/find/find.test.d.ts +2 -0
  128. package/dist/src/commands/explorer/find/find.test.d.ts.map +1 -0
  129. package/dist/src/commands/explorer/find/find.test.js +44 -0
  130. package/dist/src/commands/explorer/find/find.test.js.map +1 -0
  131. package/dist/src/commands/explorer/grep/grep.d.ts +24 -0
  132. package/dist/src/commands/explorer/grep/grep.d.ts.map +1 -0
  133. package/dist/src/commands/explorer/grep/grep.js +63 -0
  134. package/dist/src/commands/explorer/grep/grep.js.map +1 -0
  135. package/dist/src/commands/explorer/grep/grep.test.d.ts +2 -0
  136. package/dist/src/commands/explorer/grep/grep.test.d.ts.map +1 -0
  137. package/dist/src/commands/explorer/grep/grep.test.js +42 -0
  138. package/dist/src/commands/explorer/grep/grep.test.js.map +1 -0
  139. package/dist/src/commands/explorer/import/import.d.ts +21 -0
  140. package/dist/src/commands/explorer/import/import.d.ts.map +1 -0
  141. package/dist/src/commands/explorer/import/import.js +37 -0
  142. package/dist/src/commands/explorer/import/import.js.map +1 -0
  143. package/dist/src/commands/explorer/import/import.test.d.ts +2 -0
  144. package/dist/src/commands/explorer/import/import.test.d.ts.map +1 -0
  145. package/dist/src/commands/explorer/import/import.test.js +45 -0
  146. package/dist/src/commands/explorer/import/import.test.js.map +1 -0
  147. package/dist/src/commands/formatters.test.js +7 -1
  148. package/dist/src/commands/formatters.test.js.map +1 -1
  149. package/dist/src/commands/framework/action-loader.d.ts +5 -1
  150. package/dist/src/commands/framework/action-loader.d.ts.map +1 -1
  151. package/dist/src/commands/framework/action-loader.js +9 -2
  152. package/dist/src/commands/framework/action-loader.js.map +1 -1
  153. package/dist/src/commands/framework/action-loader.test.js +23 -0
  154. package/dist/src/commands/framework/action-loader.test.js.map +1 -1
  155. package/dist/src/commands/framework/arg-builder.d.ts +15 -2
  156. package/dist/src/commands/framework/arg-builder.d.ts.map +1 -1
  157. package/dist/src/commands/framework/arg-builder.js +22 -2
  158. package/dist/src/commands/framework/arg-builder.js.map +1 -1
  159. package/dist/src/commands/framework/define-command.d.ts +19 -3
  160. package/dist/src/commands/framework/define-command.d.ts.map +1 -1
  161. package/dist/src/commands/framework/define-command.js.map +1 -1
  162. package/dist/src/commands/framework/index.d.ts +1 -1
  163. package/dist/src/commands/framework/index.d.ts.map +1 -1
  164. package/dist/src/commands/framework/index.js.map +1 -1
  165. package/dist/src/commands/index.d.ts +11 -0
  166. package/dist/src/commands/index.d.ts.map +1 -1
  167. package/dist/src/commands/index.js +11 -0
  168. package/dist/src/commands/index.js.map +1 -1
  169. package/dist/src/commands/linux/inject-credentials/inject-credentials.d.ts.map +1 -1
  170. package/dist/src/commands/linux/inject-credentials/inject-credentials.js +1 -3
  171. package/dist/src/commands/linux/inject-credentials/inject-credentials.js.map +1 -1
  172. package/dist/src/commands/linux/setup/setup.d.ts.map +1 -1
  173. package/dist/src/commands/linux/setup/setup.js +1 -3
  174. package/dist/src/commands/linux/setup/setup.js.map +1 -1
  175. package/dist/src/commands/linux/status/status.d.ts +9 -1
  176. package/dist/src/commands/linux/status/status.d.ts.map +1 -1
  177. package/dist/src/commands/linux/status/status.js +66 -86
  178. package/dist/src/commands/linux/status/status.js.map +1 -1
  179. package/dist/src/commands/playtest/player/add/add.d.ts +17 -0
  180. package/dist/src/commands/playtest/player/add/add.d.ts.map +1 -0
  181. package/dist/src/commands/playtest/player/add/add.js +45 -0
  182. package/dist/src/commands/playtest/player/add/add.js.map +1 -0
  183. package/dist/src/commands/playtest/player/list/list.d.ts +13 -0
  184. package/dist/src/commands/playtest/player/list/list.d.ts.map +1 -0
  185. package/dist/src/commands/playtest/player/list/list.js +33 -0
  186. package/dist/src/commands/playtest/player/list/list.js.map +1 -0
  187. package/dist/src/commands/playtest/player/playtest-players.d.ts +36 -0
  188. package/dist/src/commands/playtest/player/playtest-players.d.ts.map +1 -0
  189. package/dist/src/commands/playtest/player/playtest-players.js +187 -0
  190. package/dist/src/commands/playtest/player/playtest-players.js.map +1 -0
  191. package/dist/src/commands/playtest/player/playtest-players.test.d.ts +2 -0
  192. package/dist/src/commands/playtest/player/playtest-players.test.d.ts.map +1 -0
  193. package/dist/src/commands/playtest/player/playtest-players.test.js +89 -0
  194. package/dist/src/commands/playtest/player/playtest-players.test.js.map +1 -0
  195. package/dist/src/commands/playtest/player/remove/remove.d.ts +17 -0
  196. package/dist/src/commands/playtest/player/remove/remove.d.ts.map +1 -0
  197. package/dist/src/commands/playtest/player/remove/remove.js +42 -0
  198. package/dist/src/commands/playtest/player/remove/remove.js.map +1 -0
  199. package/dist/src/commands/playtest/playtest-sessions.d.ts +49 -0
  200. package/dist/src/commands/playtest/playtest-sessions.d.ts.map +1 -0
  201. package/dist/src/commands/playtest/playtest-sessions.js +283 -0
  202. package/dist/src/commands/playtest/playtest-sessions.js.map +1 -0
  203. package/dist/src/commands/playtest/playtest-sessions.test.d.ts +2 -0
  204. package/dist/src/commands/playtest/playtest-sessions.test.d.ts.map +1 -0
  205. package/dist/src/commands/playtest/playtest-sessions.test.js +87 -0
  206. package/dist/src/commands/playtest/playtest-sessions.test.js.map +1 -0
  207. package/dist/src/commands/playtest/restart/restart.d.ts +23 -0
  208. package/dist/src/commands/playtest/restart/restart.d.ts.map +1 -0
  209. package/dist/src/commands/playtest/restart/restart.js +105 -0
  210. package/dist/src/commands/playtest/restart/restart.js.map +1 -0
  211. package/dist/src/commands/playtest/run/run.d.ts +47 -0
  212. package/dist/src/commands/playtest/run/run.d.ts.map +1 -0
  213. package/dist/src/commands/playtest/run/run.js +137 -0
  214. package/dist/src/commands/playtest/run/run.js.map +1 -0
  215. package/dist/src/commands/playtest/start/start.d.ts +42 -0
  216. package/dist/src/commands/playtest/start/start.d.ts.map +1 -0
  217. package/dist/src/commands/playtest/start/start.js +70 -0
  218. package/dist/src/commands/playtest/start/start.js.map +1 -0
  219. package/dist/src/commands/playtest/stop/stop.d.ts +15 -0
  220. package/dist/src/commands/playtest/stop/stop.d.ts.map +1 -0
  221. package/dist/src/commands/playtest/stop/stop.js +24 -0
  222. package/dist/src/commands/playtest/stop/stop.js.map +1 -0
  223. package/dist/src/commands/process/close/close.d.ts +19 -10
  224. package/dist/src/commands/process/close/close.d.ts.map +1 -1
  225. package/dist/src/commands/process/close/close.js +118 -15
  226. package/dist/src/commands/process/close/close.js.map +1 -1
  227. package/dist/src/commands/process/close/close.test.d.ts +2 -0
  228. package/dist/src/commands/process/close/close.test.d.ts.map +1 -0
  229. package/dist/src/commands/process/close/close.test.js +190 -0
  230. package/dist/src/commands/process/close/close.test.js.map +1 -0
  231. package/dist/src/commands/process/info/info.d.ts +45 -5
  232. package/dist/src/commands/process/info/info.d.ts.map +1 -1
  233. package/dist/src/commands/process/info/info.js +117 -13
  234. package/dist/src/commands/process/info/info.js.map +1 -1
  235. package/dist/src/commands/process/info/info.test.js +140 -38
  236. package/dist/src/commands/process/info/info.test.js.map +1 -1
  237. package/dist/src/commands/process/launch/launch.d.ts +11 -1
  238. package/dist/src/commands/process/launch/launch.d.ts.map +1 -1
  239. package/dist/src/commands/process/launch/launch.js +37 -7
  240. package/dist/src/commands/process/launch/launch.js.map +1 -1
  241. package/dist/src/commands/process/launch/launch.test.js +99 -20
  242. package/dist/src/commands/process/launch/launch.test.js.map +1 -1
  243. package/dist/src/commands/process/list/list.d.ts +2 -1
  244. package/dist/src/commands/process/list/list.d.ts.map +1 -1
  245. package/dist/src/commands/process/list/list.js +9 -6
  246. package/dist/src/commands/process/list/list.js.map +1 -1
  247. package/dist/src/commands/process/list/list.test.js +1 -0
  248. package/dist/src/commands/process/list/list.test.js.map +1 -1
  249. package/dist/src/commands/process/run/run.d.ts +9 -0
  250. package/dist/src/commands/process/run/run.d.ts.map +1 -1
  251. package/dist/src/commands/process/run/run.js +15 -5
  252. package/dist/src/commands/process/run/run.js.map +1 -1
  253. package/dist/src/commands/serve/serve.d.ts +2 -0
  254. package/dist/src/commands/serve/serve.d.ts.map +1 -1
  255. package/dist/src/commands/serve/serve.js +17 -4
  256. package/dist/src/commands/serve/serve.js.map +1 -1
  257. package/dist/src/commands/serve/serve.test.js +9 -2
  258. package/dist/src/commands/serve/serve.test.js.map +1 -1
  259. package/dist/src/commands/viewport/screenshot/screenshot.d.ts.map +1 -1
  260. package/dist/src/commands/viewport/screenshot/screenshot.js +4 -1
  261. package/dist/src/commands/viewport/screenshot/screenshot.js.map +1 -1
  262. package/dist/src/commands/viewport/screenshot/screenshot.test.js +5 -9
  263. package/dist/src/commands/viewport/screenshot/screenshot.test.js.map +1 -1
  264. package/dist/src/deploy/deploy-places.d.ts +39 -0
  265. package/dist/src/deploy/deploy-places.d.ts.map +1 -0
  266. package/dist/src/deploy/deploy-places.js +162 -0
  267. package/dist/src/deploy/deploy-places.js.map +1 -0
  268. package/dist/src/deploy/deploy-places.test.d.ts +2 -0
  269. package/dist/src/deploy/deploy-places.test.d.ts.map +1 -0
  270. package/dist/src/deploy/deploy-places.test.js +96 -0
  271. package/dist/src/deploy/deploy-places.test.js.map +1 -0
  272. package/dist/src/index.d.ts +2 -2
  273. package/dist/src/index.d.ts.map +1 -1
  274. package/dist/src/index.js +1 -1
  275. package/dist/src/index.js.map +1 -1
  276. package/dist/src/plugin/persistent-plugin-installer.d.ts.map +1 -1
  277. package/dist/src/plugin/persistent-plugin-installer.js +2 -1
  278. package/dist/src/plugin/persistent-plugin-installer.js.map +1 -1
  279. package/dist/src/plugin/persistent-plugin-installer.test.js +3 -0
  280. package/dist/src/plugin/persistent-plugin-installer.test.js.map +1 -1
  281. package/dist/src/plugin/plugin-build-version.d.ts +7 -0
  282. package/dist/src/plugin/plugin-build-version.d.ts.map +1 -0
  283. package/dist/src/plugin/plugin-build-version.js +42 -0
  284. package/dist/src/plugin/plugin-build-version.js.map +1 -0
  285. package/dist/src/plugin/plugin-build-version.test.d.ts +2 -0
  286. package/dist/src/plugin/plugin-build-version.test.d.ts.map +1 -0
  287. package/dist/src/plugin/plugin-build-version.test.js +41 -0
  288. package/dist/src/plugin/plugin-build-version.test.js.map +1 -0
  289. package/dist/src/plugin/plugin-injector.d.ts.map +1 -1
  290. package/dist/src/plugin/plugin-injector.js +7 -1
  291. package/dist/src/plugin/plugin-injector.js.map +1 -1
  292. package/dist/src/process/studio-process-closer.d.ts +35 -0
  293. package/dist/src/process/studio-process-closer.d.ts.map +1 -0
  294. package/dist/src/process/studio-process-closer.js +129 -0
  295. package/dist/src/process/studio-process-closer.js.map +1 -0
  296. package/dist/src/process/studio-process-closer.test.d.ts +2 -0
  297. package/dist/src/process/studio-process-closer.test.d.ts.map +1 -0
  298. package/dist/src/process/studio-process-closer.test.js +80 -0
  299. package/dist/src/process/studio-process-closer.test.js.map +1 -0
  300. package/dist/src/process/studio-settings.d.ts +14 -0
  301. package/dist/src/process/studio-settings.d.ts.map +1 -0
  302. package/dist/src/process/studio-settings.js +50 -0
  303. package/dist/src/process/studio-settings.js.map +1 -0
  304. package/dist/src/process/studio-settings.test.d.ts +2 -0
  305. package/dist/src/process/studio-settings.test.d.ts.map +1 -0
  306. package/dist/src/process/studio-settings.test.js +16 -0
  307. package/dist/src/process/studio-settings.test.js.map +1 -0
  308. package/dist/src/process/studio-window-state.d.ts +13 -0
  309. package/dist/src/process/studio-window-state.d.ts.map +1 -0
  310. package/dist/src/process/studio-window-state.js +48 -0
  311. package/dist/src/process/studio-window-state.js.map +1 -0
  312. package/dist/src/server/studio-bridge-server.d.ts +3 -1
  313. package/dist/src/server/studio-bridge-server.d.ts.map +1 -1
  314. package/dist/src/server/studio-bridge-server.js +12 -4
  315. package/dist/src/server/studio-bridge-server.js.map +1 -1
  316. package/dist/src/server/web-socket-protocol.d.ts +173 -6
  317. package/dist/src/server/web-socket-protocol.d.ts.map +1 -1
  318. package/dist/src/server/web-socket-protocol.js +244 -1
  319. package/dist/src/server/web-socket-protocol.js.map +1 -1
  320. package/dist/src/server/web-socket-protocol.test.js +48 -0
  321. package/dist/src/server/web-socket-protocol.test.js.map +1 -1
  322. package/dist/src/test/e2e/persistent-session.test.js +121 -0
  323. package/dist/src/test/e2e/persistent-session.test.js.map +1 -1
  324. package/dist/src/test/e2e/split-server.test.d.ts +3 -5
  325. package/dist/src/test/e2e/split-server.test.d.ts.map +1 -1
  326. package/dist/src/test/e2e/split-server.test.js +3 -5
  327. package/dist/src/test/e2e/split-server.test.js.map +1 -1
  328. package/dist/tsconfig.tsbuildinfo +1 -1
  329. package/docker/Dockerfile +3 -0
  330. package/package.json +8 -6
  331. package/src/bridge/bridge-connection.test.ts +126 -0
  332. package/src/bridge/bridge-connection.ts +217 -22
  333. package/src/bridge/bridge-session.test.ts +6 -4
  334. package/src/bridge/bridge-session.ts +273 -28
  335. package/src/bridge/index.ts +3 -0
  336. package/src/bridge/internal/bridge-client.test.ts +23 -0
  337. package/src/bridge/internal/bridge-client.ts +25 -7
  338. package/src/bridge/internal/bridge-host.test.ts +38 -0
  339. package/src/bridge/internal/bridge-host.ts +47 -0
  340. package/src/bridge/internal/hand-off.ts +4 -1
  341. package/src/bridge/internal/host-protocol.test.ts +15 -0
  342. package/src/bridge/internal/host-protocol.ts +148 -37
  343. package/src/bridge/internal/instance-state.ts +34 -0
  344. package/src/bridge/internal/transport-client.ts +2 -1
  345. package/src/bridge/internal/transport-server.ts +5 -1
  346. package/src/bridge/types.ts +47 -2
  347. package/src/cli/adapters/cli-command-adapter-handler.test.ts +28 -0
  348. package/src/cli/adapters/cli-command-adapter.ts +150 -18
  349. package/src/cli/adapters/group-builder.test.ts +34 -2
  350. package/src/cli/adapters/group-builder.ts +52 -20
  351. package/src/cli/adapters/help-formatter.test.ts +1 -1
  352. package/src/cli/adapters/help-formatter.ts +4 -3
  353. package/src/cli/adapters/playtest-edit-guard.test.ts +54 -0
  354. package/src/cli/args/global-args.ts +1 -1
  355. package/src/cli/cli-output-context.test.ts +55 -0
  356. package/src/cli/cli-output-context.ts +50 -0
  357. package/src/cli/cli.ts +49 -17
  358. package/src/cli/managed-studio-run.test.ts +71 -0
  359. package/src/cli/managed-studio-run.ts +135 -0
  360. package/src/cli/resolve-session.test.ts +1 -1
  361. package/src/cli/resolve-session.ts +1 -1
  362. package/src/cli/script-executor.ts +99 -51
  363. package/src/commands/console/exec/exec.test.ts +96 -3
  364. package/src/commands/console/exec/exec.ts +59 -6
  365. package/src/commands/console/exec/execute.lua +356 -240
  366. package/src/commands/console/exec/execute.spec.lua +286 -0
  367. package/src/commands/console/logs/logs.test.ts +76 -4
  368. package/src/commands/console/logs/logs.ts +132 -17
  369. package/src/commands/console/logs/query-logs.lua +85 -52
  370. package/src/commands/console/logs/query-logs.spec.lua +132 -0
  371. package/src/commands/explorer/export/export-instances.lua +108 -0
  372. package/src/commands/explorer/export/export-instances.spec.lua +87 -0
  373. package/src/commands/explorer/export/export.test.ts +27 -0
  374. package/src/commands/explorer/export/export.ts +60 -0
  375. package/src/commands/explorer/find/find-instances.lua +174 -0
  376. package/src/commands/explorer/find/find-instances.spec.lua +122 -0
  377. package/src/commands/explorer/find/find.test.ts +53 -0
  378. package/src/commands/explorer/find/find.ts +113 -0
  379. package/src/commands/explorer/grep/grep-scripts.lua +214 -0
  380. package/src/commands/explorer/grep/grep-scripts.spec.lua +130 -0
  381. package/src/commands/explorer/grep/grep.test.ts +45 -0
  382. package/src/commands/explorer/grep/grep.ts +93 -0
  383. package/src/commands/explorer/import/import-instances.lua +106 -0
  384. package/src/commands/explorer/import/import-instances.spec.lua +84 -0
  385. package/src/commands/explorer/import/import.test.ts +60 -0
  386. package/src/commands/explorer/import/import.ts +66 -0
  387. package/src/commands/explorer/query/query-data-model.lua +124 -152
  388. package/src/commands/explorer/query/query-data-model.spec.lua +150 -0
  389. package/src/commands/formatters.test.ts +7 -1
  390. package/src/commands/framework/action-loader.test.ts +28 -0
  391. package/src/commands/framework/action-loader.ts +10 -2
  392. package/src/commands/framework/arg-builder.ts +26 -3
  393. package/src/commands/framework/define-command.ts +32 -3
  394. package/src/commands/framework/index.ts +1 -0
  395. package/src/commands/index.ts +50 -0
  396. package/src/commands/linux/inject-credentials/inject-credentials.ts +1 -3
  397. package/src/commands/linux/setup/setup.ts +1 -3
  398. package/src/commands/linux/status/status.ts +105 -98
  399. package/src/commands/playtest/player/add/add.ts +85 -0
  400. package/src/commands/playtest/player/list/list.ts +57 -0
  401. package/src/commands/playtest/player/playtest-players.test.ts +146 -0
  402. package/src/commands/playtest/player/playtest-players.ts +270 -0
  403. package/src/commands/playtest/player/remove/remove.ts +78 -0
  404. package/src/commands/playtest/playtest-sessions.test.ts +143 -0
  405. package/src/commands/playtest/playtest-sessions.ts +417 -0
  406. package/src/commands/playtest/restart/restart.ts +199 -0
  407. package/src/commands/playtest/run/playtest-runner.luau +264 -0
  408. package/src/commands/playtest/run/playtest-runner.spec.lua +71 -0
  409. package/src/commands/playtest/run/run-playtest-script.lua +139 -0
  410. package/src/commands/playtest/run/run-playtest-script.spec.lua +43 -0
  411. package/src/commands/playtest/run/run.ts +239 -0
  412. package/src/commands/playtest/start/start-playtest.lua +108 -0
  413. package/src/commands/playtest/start/start.ts +138 -0
  414. package/src/commands/playtest/stop/end-playtest.lua +47 -0
  415. package/src/commands/playtest/stop/stop.ts +51 -0
  416. package/src/commands/process/close/close.test.ts +250 -0
  417. package/src/commands/process/close/close.ts +183 -17
  418. package/src/commands/process/info/info.test.ts +198 -44
  419. package/src/commands/process/info/info.ts +204 -15
  420. package/src/commands/process/info/query-state.lua +42 -29
  421. package/src/commands/process/info/query-state.spec.lua +39 -0
  422. package/src/commands/process/launch/launch.test.ts +138 -21
  423. package/src/commands/process/launch/launch.ts +69 -9
  424. package/src/commands/process/list/list.test.ts +1 -0
  425. package/src/commands/process/list/list.ts +14 -6
  426. package/src/commands/process/run/run.ts +26 -5
  427. package/src/commands/serve/serve.test.ts +17 -2
  428. package/src/commands/serve/serve.ts +25 -6
  429. package/src/commands/viewport/screenshot/capture-screenshot.lua +175 -182
  430. package/src/commands/viewport/screenshot/capture-screenshot.spec.lua +129 -0
  431. package/src/commands/viewport/screenshot/screenshot.test.ts +7 -10
  432. package/src/commands/viewport/screenshot/screenshot.ts +6 -1
  433. package/src/deploy/deploy-places.test.ts +127 -0
  434. package/src/deploy/deploy-places.ts +229 -0
  435. package/src/index.ts +11 -0
  436. package/src/plugin/persistent-plugin-installer.test.ts +4 -0
  437. package/src/plugin/persistent-plugin-installer.ts +2 -1
  438. package/src/plugin/plugin-build-version.test.ts +55 -0
  439. package/src/plugin/plugin-build-version.ts +53 -0
  440. package/src/plugin/plugin-injector.ts +7 -1
  441. package/src/process/studio-process-closer.test.ts +107 -0
  442. package/src/process/studio-process-closer.ts +187 -0
  443. package/src/process/studio-settings.test.ts +18 -0
  444. package/src/process/studio-settings.ts +61 -0
  445. package/src/process/studio-window-state.ts +65 -0
  446. package/src/server/studio-bridge-server.ts +15 -4
  447. package/src/server/web-socket-protocol.test.ts +55 -0
  448. package/src/server/web-socket-protocol.ts +468 -8
  449. package/src/test/e2e/persistent-session.test.ts +137 -0
  450. package/src/test/e2e/split-server.test.ts +3 -5
  451. package/templates/studio-bridge-plugin/default.project.json +3 -0
  452. package/templates/studio-bridge-plugin/src/Shared/ActionRouter.lua +208 -159
  453. package/templates/studio-bridge-plugin/src/Shared/ActionRouter.spec.lua +418 -0
  454. package/templates/studio-bridge-plugin/src/Shared/BuiltInActions.lua +94 -0
  455. package/templates/studio-bridge-plugin/src/Shared/BuiltInActions.spec.lua +166 -0
  456. package/templates/studio-bridge-plugin/src/Shared/DiscoveryStateMachine.lua +118 -137
  457. package/templates/studio-bridge-plugin/src/Shared/DiscoveryStateMachine.spec.lua +228 -0
  458. package/templates/studio-bridge-plugin/src/Shared/MessageBuffer.lua +80 -109
  459. package/templates/studio-bridge-plugin/src/Shared/MessageBuffer.spec.lua +116 -0
  460. package/templates/studio-bridge-plugin/src/Shared/StudioBridgeConnection.lua +233 -0
  461. package/templates/studio-bridge-plugin/src/Shared/StudioBridgeConnection.spec.lua +239 -0
  462. package/templates/studio-bridge-plugin/src/Shared/StudioBridgeLogUtils.lua +53 -0
  463. package/templates/studio-bridge-plugin/src/Shared/StudioBridgeLogUtils.spec.lua +27 -0
  464. package/templates/studio-bridge-plugin/src/Shared/StudioBridgeSessionUtils.lua +164 -0
  465. package/templates/studio-bridge-plugin/src/Shared/StudioBridgeSessionUtils.spec.lua +159 -0
  466. package/templates/studio-bridge-plugin/src/StudioBridgePlugin.server.lua +266 -368
  467. package/templates/studio-bridge-plugin/src/Vendor/png.lua +8 -2
  468. package/test/default.project.json +41 -0
  469. package/test/jest.config.lua +3 -0
  470. package/test/scripts/Server/ServerMain.server.lua +10 -0
  471. package/tsconfig.json +1 -0
  472. package/templates/studio-bridge-plugin/src/Shared/Protocol.lua +0 -132
  473. package/templates/studio-bridge-plugin-test/test/actions.test.lua +0 -580
  474. package/templates/studio-bridge-plugin-test/test/discovery.test.lua +0 -622
  475. package/templates/studio-bridge-plugin-test/test/execute-handler.test.lua +0 -517
  476. package/templates/studio-bridge-plugin-test/test/hash-lifecycle.test.lua +0 -814
  477. package/templates/studio-bridge-plugin-test/test/integration.test.lua +0 -1020
  478. package/templates/studio-bridge-plugin-test/test/new-actions.test.lua +0 -339
  479. package/templates/studio-bridge-plugin-test/test/plugin-entry.test.lua +0 -493
  480. package/templates/studio-bridge-plugin-test/test/protocol.test.lua +0 -506
  481. package/templates/studio-bridge-plugin-test/test/roblox-mocks.lua +0 -108
  482. package/templates/studio-bridge-plugin-test/test/test-runner.lua +0 -112
@@ -1,580 +0,0 @@
1
- --[[
2
- Tests for ActionRouter and MessageBuffer.
3
-
4
- ActionRouter: dispatch, error handling, response type mapping, handler registration.
5
- MessageBuffer: ring buffer behavior, push, get, clear, capacity overflow.
6
- ]]
7
-
8
- local ActionRouter = require("../../studio-bridge-plugin/src/Shared/ActionRouter")
9
- local MessageBuffer = require("../../studio-bridge-plugin/src/Shared/MessageBuffer")
10
-
11
- -- ---------------------------------------------------------------------------
12
- -- Test helpers
13
- -- ---------------------------------------------------------------------------
14
-
15
- local function assertEqual(actual: any, expected: any, label: string?)
16
- if actual ~= expected then
17
- error(
18
- string.format(
19
- "%sexpected %s, got %s",
20
- if label then label .. ": " else "",
21
- tostring(expected),
22
- tostring(actual)
23
- )
24
- )
25
- end
26
- end
27
-
28
- local function assertNil(value: any, label: string?)
29
- if value ~= nil then
30
- error(string.format("%sexpected nil, got %s", if label then label .. ": " else "", tostring(value)))
31
- end
32
- end
33
-
34
- local function assertNotNil(value: any, label: string?)
35
- if value == nil then
36
- error(string.format("%sexpected non-nil value", if label then label .. ": " else ""))
37
- end
38
- end
39
-
40
- local function assertTrue(value: any, label: string?)
41
- if not value then
42
- error(string.format("%sexpected truthy value, got %s", if label then label .. ": " else "", tostring(value)))
43
- end
44
- end
45
-
46
- local function assertContains(str: string, substring: string, label: string?)
47
- if not string.find(str, substring, 1, true) then
48
- error(
49
- string.format(
50
- "%sexpected string to contain '%s', got '%s'",
51
- if label then label .. ": " else "",
52
- substring,
53
- str
54
- )
55
- )
56
- end
57
- end
58
-
59
- -- ---------------------------------------------------------------------------
60
- -- Tests
61
- -- ---------------------------------------------------------------------------
62
-
63
- local tests = {}
64
-
65
- -- ===========================================================================
66
- -- ActionRouter Tests
67
- -- ===========================================================================
68
-
69
- -- 1. Register handler, dispatch matching message, response returned
70
- table.insert(tests, {
71
- name = "ActionRouter: register and dispatch returns handler result",
72
- fn = function()
73
- local router = ActionRouter.new()
74
- router:setResponseType("queryState", "stateResult")
75
- router:register("queryState", function(payload, requestId, sessionId)
76
- return { state = "Edit", placeId = 123, placeName = "TestPlace", gameId = 456 }
77
- end)
78
-
79
- local response = router:dispatch({
80
- type = "queryState",
81
- sessionId = "sess-001",
82
- requestId = "req-001",
83
- payload = {},
84
- })
85
-
86
- assertNotNil(response, "response")
87
- assertEqual(response.type, "stateResult")
88
- assertEqual(response.sessionId, "sess-001")
89
- assertEqual(response.requestId, "req-001")
90
- assertEqual(response.payload.state, "Edit")
91
- assertEqual(response.payload.placeId, 123)
92
- end,
93
- })
94
-
95
- -- 2. Dispatch unknown message type returns UNKNOWN_REQUEST error
96
- table.insert(tests, {
97
- name = "ActionRouter: unknown message type returns UNKNOWN_REQUEST error",
98
- fn = function()
99
- local router = ActionRouter.new()
100
-
101
- local response = router:dispatch({
102
- type = "nonExistentAction",
103
- sessionId = "sess-002",
104
- requestId = "req-002",
105
- payload = {},
106
- })
107
-
108
- assertNotNil(response, "response")
109
- assertEqual(response.type, "error")
110
- assertEqual(response.payload.code, "UNKNOWN_REQUEST")
111
- assertContains(response.payload.message, "nonExistentAction")
112
- assertEqual(response.sessionId, "sess-002")
113
- assertEqual(response.requestId, "req-002")
114
- end,
115
- })
116
-
117
- -- 3. Handler that errors returns INTERNAL_ERROR
118
- table.insert(tests, {
119
- name = "ActionRouter: handler error returns INTERNAL_ERROR",
120
- fn = function()
121
- local router = ActionRouter.new()
122
- router:register("queryState", function(_payload, _requestId, _sessionId)
123
- error("something went wrong")
124
- end)
125
-
126
- local response = router:dispatch({
127
- type = "queryState",
128
- sessionId = "sess-003",
129
- requestId = "req-003",
130
- payload = {},
131
- })
132
-
133
- assertNotNil(response, "response")
134
- assertEqual(response.type, "error")
135
- assertEqual(response.payload.code, "INTERNAL_ERROR")
136
- assertContains(response.payload.message, "something went wrong")
137
- end,
138
- })
139
-
140
- -- 4. Response has correct response type (e.g. queryState -> stateResult)
141
- table.insert(tests, {
142
- name = "ActionRouter: response type mapping is correct for each action",
143
- fn = function()
144
- local router = ActionRouter.new()
145
- local typeMap = {
146
- { input = "execute", expected = "scriptComplete" },
147
- { input = "queryState", expected = "stateResult" },
148
- { input = "captureScreenshot", expected = "screenshotResult" },
149
- { input = "queryDataModel", expected = "dataModelResult" },
150
- { input = "queryLogs", expected = "logsResult" },
151
- { input = "subscribe", expected = "subscribeResult" },
152
- { input = "unsubscribe", expected = "unsubscribeResult" },
153
- }
154
-
155
- for _, mapping in typeMap do
156
- router:setResponseType(mapping.input, mapping.expected)
157
- router:register(mapping.input, function()
158
- return { ok = true }
159
- end)
160
- end
161
-
162
- for _, mapping in typeMap do
163
- local response = router:dispatch({
164
- type = mapping.input,
165
- sessionId = "sess-type",
166
- requestId = "req-type",
167
- payload = {},
168
- })
169
- assertNotNil(response, mapping.input .. " response")
170
- assertEqual(response.type, mapping.expected, mapping.input .. " -> " .. mapping.expected)
171
- end
172
- end,
173
- })
174
-
175
- -- 5. Response preserves sessionId and requestId
176
- table.insert(tests, {
177
- name = "ActionRouter: response preserves sessionId and requestId",
178
- fn = function()
179
- local router = ActionRouter.new()
180
- router:setResponseType("queryLogs", "logsResult")
181
- router:register("queryLogs", function()
182
- return { entries = {}, total = 0, bufferCapacity = 1000 }
183
- end)
184
-
185
- local response = router:dispatch({
186
- type = "queryLogs",
187
- sessionId = "my-session-xyz",
188
- requestId = "my-request-abc",
189
- payload = {},
190
- })
191
-
192
- assertNotNil(response)
193
- assertEqual(response.sessionId, "my-session-xyz")
194
- assertEqual(response.requestId, "my-request-abc")
195
- end,
196
- })
197
-
198
- -- 6. Handler returning nil generates no response
199
- table.insert(tests, {
200
- name = "ActionRouter: handler returning nil generates no response",
201
- fn = function()
202
- local router = ActionRouter.new()
203
- router:register("execute", function()
204
- return nil
205
- end)
206
-
207
- local response = router:dispatch({
208
- type = "execute",
209
- sessionId = "sess-nil",
210
- requestId = "req-nil",
211
- payload = { script = "print('hi')" },
212
- })
213
-
214
- assertNil(response, "response should be nil")
215
- end,
216
- })
217
-
218
- -- 7. Multiple handlers for different types
219
- table.insert(tests, {
220
- name = "ActionRouter: multiple handlers for different types work independently",
221
- fn = function()
222
- local router = ActionRouter.new()
223
- local stateCallCount = 0
224
- local logsCallCount = 0
225
-
226
- router:register("queryState", function()
227
- stateCallCount = stateCallCount + 1
228
- return { state = "Edit" }
229
- end)
230
-
231
- router:register("queryLogs", function()
232
- logsCallCount = logsCallCount + 1
233
- return { entries = {}, total = 0, bufferCapacity = 1000 }
234
- end)
235
-
236
- router:dispatch({
237
- type = "queryState",
238
- sessionId = "sess-multi",
239
- requestId = "req-1",
240
- payload = {},
241
- })
242
-
243
- router:dispatch({
244
- type = "queryLogs",
245
- sessionId = "sess-multi",
246
- requestId = "req-2",
247
- payload = {},
248
- })
249
-
250
- router:dispatch({
251
- type = "queryState",
252
- sessionId = "sess-multi",
253
- requestId = "req-3",
254
- payload = {},
255
- })
256
-
257
- assertEqual(stateCallCount, 2, "state handler called twice")
258
- assertEqual(logsCallCount, 1, "logs handler called once")
259
- end,
260
- })
261
-
262
- -- 8. Handler receives correct payload, requestId, sessionId arguments
263
- table.insert(tests, {
264
- name = "ActionRouter: handler receives correct arguments",
265
- fn = function()
266
- local router = ActionRouter.new()
267
- local receivedPayload, receivedRequestId, receivedSessionId
268
-
269
- router:register("queryDataModel", function(payload, requestId, sessionId)
270
- receivedPayload = payload
271
- receivedRequestId = requestId
272
- receivedSessionId = sessionId
273
- return { instance = {} }
274
- end)
275
-
276
- router:dispatch({
277
- type = "queryDataModel",
278
- sessionId = "sess-args",
279
- requestId = "req-args",
280
- payload = { path = "game.Workspace", depth = 2 },
281
- })
282
-
283
- assertNotNil(receivedPayload, "payload")
284
- assertEqual(receivedPayload.path, "game.Workspace")
285
- assertEqual(receivedPayload.depth, 2)
286
- assertEqual(receivedRequestId, "req-args")
287
- assertEqual(receivedSessionId, "sess-args")
288
- end,
289
- })
290
-
291
- -- ===========================================================================
292
- -- MessageBuffer Tests
293
- -- ===========================================================================
294
-
295
- -- 9. Push entries, get them back
296
- table.insert(tests, {
297
- name = "MessageBuffer: push entries and get them back",
298
- fn = function()
299
- local buf = MessageBuffer.new(100)
300
- buf:push({ level = "Print", body = "hello", timestamp = 1000 })
301
- buf:push({ level = "Warning", body = "careful", timestamp = 2000 })
302
- buf:push({ level = "Error", body = "oops", timestamp = 3000 })
303
-
304
- local result = buf:get()
305
- assertEqual(#result.entries, 3)
306
- assertEqual(result.total, 3)
307
- assertEqual(result.bufferCapacity, 100)
308
- assertEqual(result.entries[1].body, "hello")
309
- assertEqual(result.entries[2].body, "careful")
310
- assertEqual(result.entries[3].body, "oops")
311
- end,
312
- })
313
-
314
- -- 10. Buffer at capacity overwrites oldest
315
- table.insert(tests, {
316
- name = "MessageBuffer: at capacity overwrites oldest entries",
317
- fn = function()
318
- local buf = MessageBuffer.new(3)
319
- buf:push({ level = "Print", body = "a", timestamp = 1 })
320
- buf:push({ level = "Print", body = "b", timestamp = 2 })
321
- buf:push({ level = "Print", body = "c", timestamp = 3 })
322
- -- Buffer full: [a, b, c]
323
- buf:push({ level = "Print", body = "d", timestamp = 4 })
324
- -- Now oldest (a) overwritten: [d, b, c] but chronologically: b, c, d
325
-
326
- assertEqual(buf:size(), 3, "size stays at capacity")
327
- local result = buf:get()
328
- assertEqual(#result.entries, 3)
329
- assertEqual(result.entries[1].body, "b", "oldest remaining")
330
- assertEqual(result.entries[2].body, "c")
331
- assertEqual(result.entries[3].body, "d", "newest")
332
- end,
333
- })
334
-
335
- -- 11. get("tail", 5) returns 5 most recent
336
- table.insert(tests, {
337
- name = 'MessageBuffer: get("tail", 5) returns 5 most recent',
338
- fn = function()
339
- local buf = MessageBuffer.new(100)
340
- for i = 1, 20 do
341
- buf:push({ level = "Print", body = "msg-" .. tostring(i), timestamp = i * 100 })
342
- end
343
-
344
- local result = buf:get("tail", 5)
345
- assertEqual(#result.entries, 5)
346
- assertEqual(result.entries[1].body, "msg-16")
347
- assertEqual(result.entries[2].body, "msg-17")
348
- assertEqual(result.entries[3].body, "msg-18")
349
- assertEqual(result.entries[4].body, "msg-19")
350
- assertEqual(result.entries[5].body, "msg-20")
351
- assertEqual(result.total, 20)
352
- end,
353
- })
354
-
355
- -- 12. get("head", 5) returns 5 oldest
356
- table.insert(tests, {
357
- name = 'MessageBuffer: get("head", 5) returns 5 oldest',
358
- fn = function()
359
- local buf = MessageBuffer.new(100)
360
- for i = 1, 20 do
361
- buf:push({ level = "Print", body = "msg-" .. tostring(i), timestamp = i * 100 })
362
- end
363
-
364
- local result = buf:get("head", 5)
365
- assertEqual(#result.entries, 5)
366
- assertEqual(result.entries[1].body, "msg-1")
367
- assertEqual(result.entries[2].body, "msg-2")
368
- assertEqual(result.entries[3].body, "msg-3")
369
- assertEqual(result.entries[4].body, "msg-4")
370
- assertEqual(result.entries[5].body, "msg-5")
371
- end,
372
- })
373
-
374
- -- 13. clear() empties buffer
375
- table.insert(tests, {
376
- name = "MessageBuffer: clear() empties the buffer",
377
- fn = function()
378
- local buf = MessageBuffer.new(100)
379
- buf:push({ level = "Print", body = "a", timestamp = 1 })
380
- buf:push({ level = "Print", body = "b", timestamp = 2 })
381
- assertEqual(buf:size(), 2)
382
-
383
- buf:clear()
384
- assertEqual(buf:size(), 0)
385
-
386
- local result = buf:get()
387
- assertEqual(#result.entries, 0)
388
- assertEqual(result.total, 0)
389
- end,
390
- })
391
-
392
- -- 14. size() returns correct count
393
- table.insert(tests, {
394
- name = "MessageBuffer: size() returns correct count",
395
- fn = function()
396
- local buf = MessageBuffer.new(5)
397
- assertEqual(buf:size(), 0)
398
-
399
- buf:push({ level = "Print", body = "a", timestamp = 1 })
400
- assertEqual(buf:size(), 1)
401
-
402
- buf:push({ level = "Print", body = "b", timestamp = 2 })
403
- assertEqual(buf:size(), 2)
404
-
405
- -- Fill to capacity
406
- buf:push({ level = "Print", body = "c", timestamp = 3 })
407
- buf:push({ level = "Print", body = "d", timestamp = 4 })
408
- buf:push({ level = "Print", body = "e", timestamp = 5 })
409
- assertEqual(buf:size(), 5)
410
-
411
- -- Overflow
412
- buf:push({ level = "Print", body = "f", timestamp = 6 })
413
- assertEqual(buf:size(), 5, "size stays at capacity after overflow")
414
- end,
415
- })
416
-
417
- -- 15. Default direction is "tail"
418
- table.insert(tests, {
419
- name = 'MessageBuffer: default direction is "tail"',
420
- fn = function()
421
- local buf = MessageBuffer.new(100)
422
- for i = 1, 10 do
423
- buf:push({ level = "Print", body = "msg-" .. tostring(i), timestamp = i * 100 })
424
- end
425
-
426
- -- get() with no args should behave like get("tail")
427
- local defaultResult = buf:get()
428
- local tailResult = buf:get("tail")
429
-
430
- assertEqual(#defaultResult.entries, #tailResult.entries)
431
- for i = 1, #defaultResult.entries do
432
- assertEqual(defaultResult.entries[i].body, tailResult.entries[i].body)
433
- end
434
- end,
435
- })
436
-
437
- -- 16. Count larger than buffer size returns all entries
438
- table.insert(tests, {
439
- name = "MessageBuffer: count larger than buffer size returns all entries",
440
- fn = function()
441
- local buf = MessageBuffer.new(100)
442
- buf:push({ level = "Print", body = "a", timestamp = 1 })
443
- buf:push({ level = "Print", body = "b", timestamp = 2 })
444
- buf:push({ level = "Print", body = "c", timestamp = 3 })
445
-
446
- local resultTail = buf:get("tail", 100)
447
- assertEqual(#resultTail.entries, 3, "tail count > size returns all")
448
-
449
- local resultHead = buf:get("head", 100)
450
- assertEqual(#resultHead.entries, 3, "head count > size returns all")
451
- end,
452
- })
453
-
454
- -- 17. Ring buffer maintains correct order after multiple wraps
455
- table.insert(tests, {
456
- name = "MessageBuffer: correct order after multiple wraps around capacity",
457
- fn = function()
458
- local buf = MessageBuffer.new(3)
459
- -- Fill and overflow multiple times
460
- for i = 1, 10 do
461
- buf:push({ level = "Print", body = "msg-" .. tostring(i), timestamp = i * 100 })
462
- end
463
-
464
- -- Should contain the last 3: msg-8, msg-9, msg-10
465
- local result = buf:get()
466
- assertEqual(#result.entries, 3)
467
- assertEqual(result.entries[1].body, "msg-8")
468
- assertEqual(result.entries[2].body, "msg-9")
469
- assertEqual(result.entries[3].body, "msg-10")
470
- end,
471
- })
472
-
473
- -- 18. MessageBuffer default capacity is 1000
474
- table.insert(tests, {
475
- name = "MessageBuffer: default capacity is 1000",
476
- fn = function()
477
- local buf = MessageBuffer.new()
478
- local result = buf:get()
479
- assertEqual(result.bufferCapacity, 1000)
480
- end,
481
- })
482
-
483
- -- 19. get preserves entry fields correctly
484
- table.insert(tests, {
485
- name = "MessageBuffer: get preserves entry fields (level, body, timestamp)",
486
- fn = function()
487
- local buf = MessageBuffer.new(10)
488
- buf:push({ level = "Warning", body = "be careful", timestamp = 42000 })
489
-
490
- local result = buf:get()
491
- assertEqual(#result.entries, 1)
492
- assertEqual(result.entries[1].level, "Warning")
493
- assertEqual(result.entries[1].body, "be careful")
494
- assertEqual(result.entries[1].timestamp, 42000)
495
- end,
496
- })
497
-
498
- -- 20. ActionRouter: dispatch with nil requestId
499
- table.insert(tests, {
500
- name = "ActionRouter: dispatch with nil requestId still works",
501
- fn = function()
502
- local router = ActionRouter.new()
503
- router:setResponseType("execute", "scriptComplete")
504
- router:register("execute", function(payload, requestId, sessionId)
505
- return { success = true }
506
- end)
507
-
508
- local response = router:dispatch({
509
- type = "execute",
510
- sessionId = "sess-no-rid",
511
- payload = { script = "print('hi')" },
512
- })
513
-
514
- assertNotNil(response)
515
- assertEqual(response.type, "scriptComplete")
516
- assertEqual(response.sessionId, "sess-no-rid")
517
- -- requestId should be nil since we didn't provide one
518
- assertNil(response.requestId, "requestId should be nil")
519
- assertEqual(response.payload.success, true)
520
- end,
521
- })
522
-
523
- -- 21. MessageBuffer: head and tail on overflow buffer
524
- table.insert(tests, {
525
- name = "MessageBuffer: head and tail on overflow buffer return correct slices",
526
- fn = function()
527
- local buf = MessageBuffer.new(5)
528
- for i = 1, 8 do
529
- buf:push({ level = "Print", body = "m" .. tostring(i), timestamp = i })
530
- end
531
- -- Buffer contains: m4, m5, m6, m7, m8
532
-
533
- local head2 = buf:get("head", 2)
534
- assertEqual(#head2.entries, 2)
535
- assertEqual(head2.entries[1].body, "m4")
536
- assertEqual(head2.entries[2].body, "m5")
537
-
538
- local tail2 = buf:get("tail", 2)
539
- assertEqual(#tail2.entries, 2)
540
- assertEqual(tail2.entries[1].body, "m7")
541
- assertEqual(tail2.entries[2].body, "m8")
542
- end,
543
- })
544
-
545
- -- 22. ActionRouter: UNKNOWN_REQUEST for dispatch without any handlers
546
- table.insert(tests, {
547
- name = "ActionRouter: UNKNOWN_REQUEST when no handlers registered",
548
- fn = function()
549
- local router = ActionRouter.new()
550
- local response = router:dispatch({
551
- type = "queryState",
552
- sessionId = "sess-empty",
553
- requestId = "req-empty",
554
- payload = {},
555
- })
556
- assertNotNil(response)
557
- assertEqual(response.type, "error")
558
- assertEqual(response.payload.code, "UNKNOWN_REQUEST")
559
- end,
560
- })
561
-
562
- -- 23. MessageBuffer: push after clear works correctly
563
- table.insert(tests, {
564
- name = "MessageBuffer: push after clear works correctly",
565
- fn = function()
566
- local buf = MessageBuffer.new(5)
567
- buf:push({ level = "Print", body = "before", timestamp = 1 })
568
- buf:push({ level = "Print", body = "before2", timestamp = 2 })
569
- buf:clear()
570
- assertEqual(buf:size(), 0)
571
-
572
- buf:push({ level = "Print", body = "after", timestamp = 3 })
573
- assertEqual(buf:size(), 1)
574
- local result = buf:get()
575
- assertEqual(#result.entries, 1)
576
- assertEqual(result.entries[1].body, "after")
577
- end,
578
- })
579
-
580
- return tests