@quenty/studio-bridge 0.23.0 → 0.24.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 (231) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/README.md +36 -8
  3. package/dist/src/bridge/bridge-connection.d.ts.map +1 -1
  4. package/dist/src/bridge/bridge-connection.js +1 -0
  5. package/dist/src/bridge/bridge-connection.js.map +1 -1
  6. package/dist/src/bridge/bridge-session.d.ts +11 -16
  7. package/dist/src/bridge/bridge-session.d.ts.map +1 -1
  8. package/dist/src/bridge/bridge-session.js +37 -29
  9. package/dist/src/bridge/bridge-session.js.map +1 -1
  10. package/dist/src/bridge/bridge-session.test.js +35 -0
  11. package/dist/src/bridge/bridge-session.test.js.map +1 -1
  12. package/dist/src/bridge/internal/bridge-host.d.ts +2 -0
  13. package/dist/src/bridge/internal/bridge-host.d.ts.map +1 -1
  14. package/dist/src/bridge/internal/bridge-host.js +1 -0
  15. package/dist/src/bridge/internal/bridge-host.js.map +1 -1
  16. package/dist/src/bridge/internal/host-protocol.d.ts.map +1 -1
  17. package/dist/src/bridge/internal/host-protocol.js +23 -10
  18. package/dist/src/bridge/internal/host-protocol.js.map +1 -1
  19. package/dist/src/bridge/types.d.ts +5 -2
  20. package/dist/src/bridge/types.d.ts.map +1 -1
  21. package/dist/src/bridge/types.js.map +1 -1
  22. package/dist/src/commands/console/exec/exec.d.ts +13 -3
  23. package/dist/src/commands/console/exec/exec.d.ts.map +1 -1
  24. package/dist/src/commands/console/exec/exec.js +82 -7
  25. package/dist/src/commands/console/exec/exec.js.map +1 -1
  26. package/dist/src/commands/console/exec/exec.test.js +63 -1
  27. package/dist/src/commands/console/exec/exec.test.js.map +1 -1
  28. package/dist/src/commands/framework/action-loader.test.js +1 -1
  29. package/dist/src/commands/framework/action-loader.test.js.map +1 -1
  30. package/dist/src/commands/playtest/player/playtest-players.d.ts.map +1 -1
  31. package/dist/src/commands/playtest/player/playtest-players.js +15 -93
  32. package/dist/src/commands/playtest/player/playtest-players.js.map +1 -1
  33. package/dist/src/commands/playtest/player/playtest-players.test.js +34 -21
  34. package/dist/src/commands/playtest/player/playtest-players.test.js.map +1 -1
  35. package/dist/src/commands/playtest/playtest-sessions.d.ts +19 -3
  36. package/dist/src/commands/playtest/playtest-sessions.d.ts.map +1 -1
  37. package/dist/src/commands/playtest/playtest-sessions.js +54 -74
  38. package/dist/src/commands/playtest/playtest-sessions.js.map +1 -1
  39. package/dist/src/commands/playtest/playtest-sessions.test.js +74 -8
  40. package/dist/src/commands/playtest/playtest-sessions.test.js.map +1 -1
  41. package/dist/src/commands/playtest/run/run.d.ts +9 -7
  42. package/dist/src/commands/playtest/run/run.d.ts.map +1 -1
  43. package/dist/src/commands/playtest/run/run.js +33 -38
  44. package/dist/src/commands/playtest/run/run.js.map +1 -1
  45. package/dist/src/commands/process/close/close.d.ts +4 -0
  46. package/dist/src/commands/process/close/close.d.ts.map +1 -1
  47. package/dist/src/commands/process/close/close.js +54 -4
  48. package/dist/src/commands/process/close/close.js.map +1 -1
  49. package/dist/src/commands/process/close/close.test.js +36 -3
  50. package/dist/src/commands/process/close/close.test.js.map +1 -1
  51. package/dist/src/commands/process/info/info.d.ts +15 -2
  52. package/dist/src/commands/process/info/info.d.ts.map +1 -1
  53. package/dist/src/commands/process/info/info.js +44 -4
  54. package/dist/src/commands/process/info/info.js.map +1 -1
  55. package/dist/src/commands/process/info/info.test.js +48 -0
  56. package/dist/src/commands/process/info/info.test.js.map +1 -1
  57. package/dist/src/commands/process/launch/launch.d.ts.map +1 -1
  58. package/dist/src/commands/process/launch/launch.js +22 -3
  59. package/dist/src/commands/process/launch/launch.js.map +1 -1
  60. package/dist/src/commands/process/launch/launch.test.js +27 -5
  61. package/dist/src/commands/process/launch/launch.test.js.map +1 -1
  62. package/dist/src/commands/process/list/list.d.ts +49 -6
  63. package/dist/src/commands/process/list/list.d.ts.map +1 -1
  64. package/dist/src/commands/process/list/list.js +185 -18
  65. package/dist/src/commands/process/list/list.js.map +1 -1
  66. package/dist/src/commands/process/list/list.test.js +92 -1
  67. package/dist/src/commands/process/list/list.test.js.map +1 -1
  68. package/dist/src/commands/process/run/run.d.ts +1 -1
  69. package/dist/src/commands/process/run/run.d.ts.map +1 -1
  70. package/dist/src/commands/process/run/run.js +3 -3
  71. package/dist/src/commands/process/run/run.js.map +1 -1
  72. package/dist/src/docker/docker-delegator.js +1 -1
  73. package/dist/src/docker/docker-delegator.js.map +1 -1
  74. package/dist/src/docker/docker-delegator.test.js +1 -1
  75. package/dist/src/docker/docker-delegator.test.js.map +1 -1
  76. package/dist/src/plugin/playtest-bridge.d.ts +36 -0
  77. package/dist/src/plugin/playtest-bridge.d.ts.map +1 -0
  78. package/dist/src/plugin/playtest-bridge.js +65 -0
  79. package/dist/src/plugin/playtest-bridge.js.map +1 -0
  80. package/dist/src/plugin/playtest-bridge.test.d.ts +2 -0
  81. package/dist/src/plugin/playtest-bridge.test.d.ts.map +1 -0
  82. package/dist/src/plugin/playtest-bridge.test.js +35 -0
  83. package/dist/src/plugin/playtest-bridge.test.js.map +1 -0
  84. package/dist/src/process/studio-launch-registry.d.ts +14 -0
  85. package/dist/src/process/studio-launch-registry.d.ts.map +1 -0
  86. package/dist/src/process/studio-launch-registry.js +37 -0
  87. package/dist/src/process/studio-launch-registry.js.map +1 -0
  88. package/dist/src/process/studio-launch-registry.test.d.ts +2 -0
  89. package/dist/src/process/studio-launch-registry.test.d.ts.map +1 -0
  90. package/dist/src/process/studio-launch-registry.test.js +38 -0
  91. package/dist/src/process/studio-launch-registry.test.js.map +1 -0
  92. package/dist/src/process/studio-process-closer.d.ts +3 -1
  93. package/dist/src/process/studio-process-closer.d.ts.map +1 -1
  94. package/dist/src/process/studio-process-closer.js +29 -11
  95. package/dist/src/process/studio-process-closer.js.map +1 -1
  96. package/dist/src/process/studio-process-identity.d.ts +10 -0
  97. package/dist/src/process/studio-process-identity.d.ts.map +1 -0
  98. package/dist/src/process/studio-process-identity.js +63 -0
  99. package/dist/src/process/studio-process-identity.js.map +1 -0
  100. package/dist/src/process/studio-process-identity.test.d.ts +2 -0
  101. package/dist/src/process/studio-process-identity.test.d.ts.map +1 -0
  102. package/dist/src/process/studio-process-identity.test.js +30 -0
  103. package/dist/src/process/studio-process-identity.test.js.map +1 -0
  104. package/dist/src/roblox-mcp/index.d.ts +3 -0
  105. package/dist/src/roblox-mcp/index.d.ts.map +1 -0
  106. package/dist/src/roblox-mcp/index.js +3 -0
  107. package/dist/src/roblox-mcp/index.js.map +1 -0
  108. package/dist/src/roblox-mcp/mcp/mcp-stdio-client.d.ts +60 -0
  109. package/dist/src/roblox-mcp/mcp/mcp-stdio-client.d.ts.map +1 -0
  110. package/dist/src/roblox-mcp/mcp/mcp-stdio-client.js +171 -0
  111. package/dist/src/roblox-mcp/mcp/mcp-stdio-client.js.map +1 -0
  112. package/dist/src/roblox-mcp/mcp/mcp-stdio-client.test.d.ts +2 -0
  113. package/dist/src/roblox-mcp/mcp/mcp-stdio-client.test.d.ts.map +1 -0
  114. package/dist/src/roblox-mcp/mcp/mcp-stdio-client.test.js +104 -0
  115. package/dist/src/roblox-mcp/mcp/mcp-stdio-client.test.js.map +1 -0
  116. package/dist/src/roblox-mcp/mcp/repair-list-result.d.ts +2 -0
  117. package/dist/src/roblox-mcp/mcp/repair-list-result.d.ts.map +1 -0
  118. package/dist/src/roblox-mcp/mcp/repair-list-result.js +22 -0
  119. package/dist/src/roblox-mcp/mcp/repair-list-result.js.map +1 -0
  120. package/dist/src/roblox-mcp/mcp/repair-list-result.test.d.ts +2 -0
  121. package/dist/src/roblox-mcp/mcp/repair-list-result.test.d.ts.map +1 -0
  122. package/dist/src/roblox-mcp/mcp/repair-list-result.test.js +42 -0
  123. package/dist/src/roblox-mcp/mcp/repair-list-result.test.js.map +1 -0
  124. package/dist/src/roblox-mcp/roblox-studio-mcp.d.ts +34 -0
  125. package/dist/src/roblox-mcp/roblox-studio-mcp.d.ts.map +1 -0
  126. package/dist/src/roblox-mcp/roblox-studio-mcp.js +190 -0
  127. package/dist/src/roblox-mcp/roblox-studio-mcp.js.map +1 -0
  128. package/dist/src/roblox-mcp/roblox-studio-mcp.test.d.ts +2 -0
  129. package/dist/src/roblox-mcp/roblox-studio-mcp.test.d.ts.map +1 -0
  130. package/dist/src/roblox-mcp/roblox-studio-mcp.test.js +123 -0
  131. package/dist/src/roblox-mcp/roblox-studio-mcp.test.js.map +1 -0
  132. package/dist/src/roblox-mcp/studio/studio-session.d.ts +39 -0
  133. package/dist/src/roblox-mcp/studio/studio-session.d.ts.map +1 -0
  134. package/dist/src/roblox-mcp/studio/studio-session.js +175 -0
  135. package/dist/src/roblox-mcp/studio/studio-session.js.map +1 -0
  136. package/dist/src/roblox-mcp/studio/studio-session.test.d.ts +2 -0
  137. package/dist/src/roblox-mcp/studio/studio-session.test.d.ts.map +1 -0
  138. package/dist/src/roblox-mcp/studio/studio-session.test.js +213 -0
  139. package/dist/src/roblox-mcp/studio/studio-session.test.js.map +1 -0
  140. package/dist/src/roblox-mcp/studio-mcp-locator.d.ts +19 -0
  141. package/dist/src/roblox-mcp/studio-mcp-locator.d.ts.map +1 -0
  142. package/dist/src/roblox-mcp/studio-mcp-locator.js +121 -0
  143. package/dist/src/roblox-mcp/studio-mcp-locator.js.map +1 -0
  144. package/dist/src/roblox-mcp/studio-mcp-locator.test.d.ts +2 -0
  145. package/dist/src/roblox-mcp/studio-mcp-locator.test.d.ts.map +1 -0
  146. package/dist/src/roblox-mcp/studio-mcp-locator.test.js +107 -0
  147. package/dist/src/roblox-mcp/studio-mcp-locator.test.js.map +1 -0
  148. package/dist/src/roblox-mcp/studio-mcp-snapshot.d.ts +23 -0
  149. package/dist/src/roblox-mcp/studio-mcp-snapshot.d.ts.map +1 -0
  150. package/dist/src/roblox-mcp/studio-mcp-snapshot.js +65 -0
  151. package/dist/src/roblox-mcp/studio-mcp-snapshot.js.map +1 -0
  152. package/dist/src/roblox-mcp/studio-mcp-snapshot.test.d.ts +2 -0
  153. package/dist/src/roblox-mcp/studio-mcp-snapshot.test.d.ts.map +1 -0
  154. package/dist/src/roblox-mcp/studio-mcp-snapshot.test.js +81 -0
  155. package/dist/src/roblox-mcp/studio-mcp-snapshot.test.js.map +1 -0
  156. package/dist/src/roblox-mcp/test/fake-mcp-server.d.ts +27 -0
  157. package/dist/src/roblox-mcp/test/fake-mcp-server.d.ts.map +1 -0
  158. package/dist/src/roblox-mcp/test/fake-mcp-server.js +55 -0
  159. package/dist/src/roblox-mcp/test/fake-mcp-server.js.map +1 -0
  160. package/dist/src/server/web-socket-protocol.d.ts +50 -15
  161. package/dist/src/server/web-socket-protocol.d.ts.map +1 -1
  162. package/dist/src/server/web-socket-protocol.js +63 -13
  163. package/dist/src/server/web-socket-protocol.js.map +1 -1
  164. package/dist/tsconfig.tsbuildinfo +1 -1
  165. package/docs/playtest-bridge.md +21 -0
  166. package/package.json +2 -2
  167. package/src/bridge/bridge-connection.ts +1 -0
  168. package/src/bridge/bridge-session.test.ts +51 -0
  169. package/src/bridge/bridge-session.ts +66 -47
  170. package/src/bridge/internal/bridge-host.ts +3 -0
  171. package/src/bridge/internal/host-protocol.ts +22 -9
  172. package/src/bridge/types.ts +5 -0
  173. package/src/commands/console/exec/exec.test.ts +94 -0
  174. package/src/commands/console/exec/exec.ts +130 -16
  175. package/src/commands/console/exec/execute.lua +147 -5
  176. package/src/commands/console/exec/execute.spec.lua +22 -2
  177. package/src/commands/framework/action-loader.test.ts +1 -1
  178. package/src/commands/playtest/player/playtest-players.lua +127 -0
  179. package/src/commands/playtest/player/playtest-players.spec.lua +48 -0
  180. package/src/commands/playtest/player/playtest-players.test.ts +40 -21
  181. package/src/commands/playtest/player/playtest-players.ts +30 -110
  182. package/src/commands/playtest/playtest-sessions.test.ts +116 -14
  183. package/src/commands/playtest/playtest-sessions.ts +77 -88
  184. package/src/commands/playtest/run/run.ts +44 -58
  185. package/src/commands/playtest/start/start-playtest.lua +105 -6
  186. package/src/commands/process/close/close.test.ts +52 -3
  187. package/src/commands/process/close/close.ts +78 -4
  188. package/src/commands/process/info/info.test.ts +76 -0
  189. package/src/commands/process/info/info.ts +74 -6
  190. package/src/commands/process/launch/launch.test.ts +33 -5
  191. package/src/commands/process/launch/launch.ts +41 -3
  192. package/src/commands/process/list/list.test.ts +130 -1
  193. package/src/commands/process/list/list.ts +290 -22
  194. package/src/commands/process/run/run.ts +4 -4
  195. package/src/docker/docker-delegator.test.ts +1 -1
  196. package/src/docker/docker-delegator.ts +1 -1
  197. package/src/plugin/playtest-bridge.test.ts +53 -0
  198. package/src/plugin/playtest-bridge.ts +98 -0
  199. package/src/process/studio-launch-registry.test.ts +56 -0
  200. package/src/process/studio-launch-registry.ts +63 -0
  201. package/src/process/studio-process-closer.ts +36 -11
  202. package/src/process/studio-process-identity.test.ts +45 -0
  203. package/src/process/studio-process-identity.ts +90 -0
  204. package/src/roblox-mcp/index.ts +17 -0
  205. package/src/roblox-mcp/mcp/mcp-stdio-client.test.ts +148 -0
  206. package/src/roblox-mcp/mcp/mcp-stdio-client.ts +270 -0
  207. package/src/roblox-mcp/mcp/repair-list-result.test.ts +52 -0
  208. package/src/roblox-mcp/mcp/repair-list-result.ts +23 -0
  209. package/src/roblox-mcp/roblox-studio-mcp.test.ts +168 -0
  210. package/src/roblox-mcp/roblox-studio-mcp.ts +330 -0
  211. package/src/roblox-mcp/studio/studio-session.test.ts +284 -0
  212. package/src/roblox-mcp/studio/studio-session.ts +279 -0
  213. package/src/roblox-mcp/studio-mcp-locator.test.ts +186 -0
  214. package/src/roblox-mcp/studio-mcp-locator.ts +180 -0
  215. package/src/roblox-mcp/studio-mcp-snapshot.test.ts +113 -0
  216. package/src/roblox-mcp/studio-mcp-snapshot.ts +104 -0
  217. package/src/roblox-mcp/test/fake-mcp-server.ts +74 -0
  218. package/src/server/web-socket-protocol.ts +119 -29
  219. package/templates/studio-bridge-plugin/playtest/StudioBridgePlaytest.client.lua +32 -0
  220. package/templates/studio-bridge-plugin/playtest/StudioBridgePlaytest.server.lua +40 -0
  221. package/templates/studio-bridge-plugin/src/Shared/ActionRouter.lua +25 -3
  222. package/templates/studio-bridge-plugin/src/Shared/PrecompiledSources.lua +47 -0
  223. package/templates/studio-bridge-plugin/src/Shared/PrecompiledSources.spec.lua +57 -0
  224. package/templates/studio-bridge-plugin/src/Shared/StudioBridgeClient.lua +357 -0
  225. package/templates/studio-bridge-plugin/src/Shared/StudioBridgeSessionUtils.lua +29 -3
  226. package/templates/studio-bridge-plugin/src/Shared/StudioBridgeSessionUtils.spec.lua +35 -2
  227. package/templates/studio-bridge-plugin/src/StudioBridgePlugin.server.lua +16 -292
  228. package/src/commands/playtest/run/playtest-runner.luau +0 -264
  229. package/src/commands/playtest/run/playtest-runner.spec.lua +0 -71
  230. package/src/commands/playtest/run/run-playtest-script.lua +0 -139
  231. package/src/commands/playtest/run/run-playtest-script.spec.lua +0 -43
@@ -5,12 +5,19 @@
5
5
  * each connects to the bridge as its own session. Those sessions can't be
6
6
  * matched to the Studio that started them by instance id, since unpublished
7
7
  * places give every DataModel its own. Instead, `startPlaytestAsync` passes a
8
- * playtest id as the StudioTestService test args, and each new session is
9
- * asked for it back through `GetTestArgs`.
8
+ * playtest id as the StudioTestService test args, and each session registers
9
+ * with it.
10
+ *
11
+ * The playtest's server session is the plugin when Studio loads user plugins
12
+ * into playtests. Otherwise the edit session plants the same client into the
13
+ * playtest as an ordinary Script (see plugin/playtest-bridge.ts). That one can
14
+ * only run code compiled when the playtest started: the actions, and the
15
+ * scripts `startPlaytestAsync` is given.
10
16
  */
11
17
  import { randomUUID } from 'crypto';
12
18
  import { ContextNotFoundError } from '../../bridge/index.js';
13
19
  import { getPluginBuildVersionAsync } from '../../plugin/plugin-build-version.js';
20
+ import { buildPlaytestBridgeAsync } from '../../plugin/playtest-bridge.js';
14
21
  import { tryReadLoadUserPluginsOnPlaytestAsync } from '../../process/studio-settings.js';
15
22
  /** How long a started playtest may run before its pending start request is dropped. */
16
23
  const PLAYTEST_MAX_DURATION_MS = 24 * 60 * 60 * 1000;
@@ -18,14 +25,7 @@ const SESSION_WAIT_TIMEOUT_MS = 30_000;
18
25
  /** Each player of a multiplayer test boots its own Studio process. */
19
26
  const MULTIPLAYER_SESSION_WAIT_TIMEOUT_MS = 90_000;
20
27
  const SESSION_CLOSE_TIMEOUT_MS = 10_000;
21
- const READ_RETRY_DELAY_MS = 1_000;
22
- const PLAYTEST_PLUGINS_OFF_MESSAGE = `Studio's "Load user plugins on playtest" setting is off, so the studio-bridge plugin doesn't load into playtests and their sessions can't connect. Turn it on in Studio Settings, or run a script in a playtest's server with 'studio-bridge playtest run', which works without it.`;
23
- const READ_PLAYTEST_ID_SCRIPT = [
24
- 'local ok, args = pcall(function()',
25
- '\treturn game:GetService("StudioTestService"):GetTestArgs()',
26
- 'end)',
27
- 'return if ok and type(args) == "table" then args.studioBridgePlaytestId else nil',
28
- ].join('\n');
28
+ const PLAYTEST_PLUGINS_OFF_MESSAGE = `Studio's "Load user plugins on playtest" setting is off, so the studio-bridge plugin doesn't load into a playtest's client. A playtest started with 'studio-bridge playtest start' gets a planted client session instead, which runs only code compiled when it started; turn the setting on to run any code.`;
29
29
  /** The sessions a playtest opens, by mode. Run mode has no player, so no client. */
30
30
  export function getPlaytestContexts(mode) {
31
31
  return mode === 'play' ? ['server', 'client'] : ['server'];
@@ -36,25 +36,37 @@ export function getPlaytestContexts(mode) {
36
36
  * player. Rejects if Studio refuses to start it, e.g. because a playtest is
37
37
  * already running.
38
38
  */
39
- export async function startPlaytestAsync(connection, editSession, mode, players) {
39
+ export async function startPlaytestAsync(connection, editSession, mode, players, options = {}) {
40
40
  if (editSession.context !== 'edit') {
41
41
  throw new Error(`Playtests start from an edit session, but '${editSession.info.sessionId}' is a ${editSession.context} session`);
42
42
  }
43
- if (await isPlaytestPluginsOffAsync(connection)) {
44
- throw new Error(PLAYTEST_PLUGINS_OFF_MESSAGE);
45
- }
43
+ const pluginsOnPlaytest = await tryReadPlaytestPluginsAsync(connection);
46
44
  if (players !== undefined) {
47
- await assertCanStartMultiplayerAsync(editSession, mode, players);
45
+ assertValidMultiplayer(mode, players);
48
46
  }
47
+ // Plugin sessions in the playtest register with its id, which older plugins leave out
48
+ if (pluginsOnPlaytest !== false) {
49
+ await assertCurrentPluginAsync(editSession);
50
+ }
51
+ // A server plugin, when Studio does load one, stands down for a planted bridge
52
+ const bridge = pluginsOnPlaytest === true
53
+ ? undefined
54
+ : await buildPlaytestBridgeAsync(options.scripts, {
55
+ withClient: pluginsOnPlaytest === false &&
56
+ mode === 'play' &&
57
+ !options.serverOnly,
58
+ });
49
59
  const playtestId = randomUUID();
50
60
  const ended = editSession
51
- .runPlaytestAsync(mode, playtestId, connection.port, PLAYTEST_MAX_DURATION_MS, players)
61
+ .runPlaytestAsync(mode, playtestId, connection.port, PLAYTEST_MAX_DURATION_MS, players, bridge)
52
62
  .catch((err) => ({
53
63
  playtestId,
54
64
  success: false,
55
65
  error: err instanceof Error ? err.message : String(err),
56
66
  }));
57
- const clientCount = players ?? (mode === 'play' ? 1 : 0);
67
+ const clientCount = options.serverOnly
68
+ ? 0
69
+ : players ?? (mode === 'play' ? 1 : 0);
58
70
  const waitTimeoutMs = players !== undefined
59
71
  ? MULTIPLAYER_SESSION_WAIT_TIMEOUT_MS
60
72
  : SESSION_WAIT_TIMEOUT_MS;
@@ -94,22 +106,23 @@ export async function startPlaytestAsync(connection, editSession, mode, players)
94
106
  const waited = `its ${missing.join(' and ')} session${missing.length > 1 || clientCount - clients.length > 1 ? 's' : ''} did not connect within ${waitTimeoutMs / 1000}s`;
95
107
  // Without its server session the playtest can't be ended from here
96
108
  if (!server?.isConnected) {
97
- throw new Error(`Playtest started, but ${waited}, so stop it in Studio. Play sessions only connect with Studio's "Load user plugins on playtest" setting on.`);
109
+ throw new Error(`Playtest started, but ${waited}, so stop it in Studio.`);
98
110
  }
99
111
  await endPlaytestAsync(connection, server);
100
112
  throw new Error(`Playtest started, but ${waited}, so it was stopped.`);
101
113
  }
102
- async function assertCanStartMultiplayerAsync(editSession, mode, players) {
114
+ function assertValidMultiplayer(mode, players) {
103
115
  if (!Number.isInteger(players) || players < 1) {
104
116
  throw new Error(`--players must be a whole number of at least 1, not ${players}`);
105
117
  }
106
118
  if (mode !== 'play') {
107
119
  throw new Error('A multiplayer test runs in play mode');
108
120
  }
109
- // Older plugins give every client the same session id, so all but one drop off
121
+ }
122
+ async function assertCurrentPluginAsync(editSession) {
110
123
  const expected = await getPluginBuildVersionAsync();
111
124
  if (editSession.info.pluginVersion !== expected) {
112
- throw new Error(`Multiplayer tests need the current studio-bridge plugin, but '${editSession.info.placeName}' has an older one. Run 'studio-bridge plugin install' first.`);
125
+ throw new Error(`Playtests with plugin sessions need the current studio-bridge plugin, but '${editSession.info.placeName}' has an older one. Run 'studio-bridge plugin install' first.`);
113
126
  }
114
127
  }
115
128
  /**
@@ -163,16 +176,18 @@ export async function explainMissingPlaytestContextAsync(connection, err) {
163
176
  return new Error(await explainNoPlaytestAsync(connection, studio, err.context));
164
177
  }
165
178
  /**
166
- * Whether this machine's Studio has "Load user plugins on playtest" off. A
167
- * remote Studio's settings aren't on this machine, so they count as unknown.
179
+ * Whether this machine's Studio has "Load user plugins on playtest" on. A
180
+ * remote Studio's settings aren't on this machine, so they are unknown.
168
181
  */
169
- async function isPlaytestPluginsOffAsync(connection) {
170
- return (!connection.isRemote &&
171
- (await tryReadLoadUserPluginsOnPlaytestAsync()) === false);
182
+ async function tryReadPlaytestPluginsAsync(connection) {
183
+ return connection.isRemote
184
+ ? undefined
185
+ : await tryReadLoadUserPluginsOnPlaytestAsync();
172
186
  }
173
187
  async function explainNoPlaytestAsync(connection, studio, context) {
174
188
  const of = studio ? ` of ${studio}` : '';
175
- if (await isPlaytestPluginsOffAsync(connection)) {
189
+ if (context === 'client' &&
190
+ (await tryReadPlaytestPluginsAsync(connection)) === false) {
176
191
  return `No playtest${of} is connected. ${PLAYTEST_PLUGINS_OFF_MESSAGE}`;
177
192
  }
178
193
  const missing = context ? `, so there is no ${context} session` : '';
@@ -190,37 +205,26 @@ export async function endPlaytestAsync(connection, serverSession) {
190
205
  async function waitForPlaytestSessionsAsync(connection, playtestId, clientCount, timeoutMs, signal) {
191
206
  return new Promise((resolve) => {
192
207
  const found = { clients: [] };
193
- const checked = new Set();
194
208
  const cleanup = () => {
195
209
  clearTimeout(timer);
196
210
  connection.off('session-connected', onSession);
197
211
  signal.removeEventListener('abort', cleanup);
198
212
  };
199
213
  const onSession = (session) => {
200
- const { sessionId } = session.info;
201
- if (session.context === 'edit' || checked.has(sessionId)) {
214
+ if (session.info.playtestId !== playtestId) {
202
215
  return;
203
216
  }
204
- checked.add(sessionId);
205
- void readPlaytestIdAsync(connection, sessionId, signal).then((read) => {
206
- if (signal.aborted || !read)
207
- return;
208
- if (read.id !== playtestId) {
209
- // The last playtest's session can linger under the same id; read its replacement too
210
- checked.delete(sessionId);
211
- return;
212
- }
213
- if (read.session.context === 'server') {
214
- found.server = read.session;
215
- }
216
- else {
217
- found.clients.push(read.session);
218
- }
219
- if (found.server && found.clients.length >= clientCount) {
220
- cleanup();
221
- resolve(found);
222
- }
223
- });
217
+ if (session.context === 'server') {
218
+ found.server = session;
219
+ }
220
+ else if (session.context === 'client' &&
221
+ !found.clients.some((c) => c.info.sessionId === session.info.sessionId)) {
222
+ found.clients.push(session);
223
+ }
224
+ if (found.server && found.clients.length >= clientCount) {
225
+ cleanup();
226
+ resolve(found);
227
+ }
224
228
  };
225
229
  // Resolves with whichever sessions connected; the caller reports the rest
226
230
  const timer = setTimeout(() => {
@@ -236,30 +240,6 @@ async function waitForPlaytestSessionsAsync(connection, playtestId, clientCount,
236
240
  }
237
241
  });
238
242
  }
239
- /**
240
- * Reads the playtest id a session was started under, retrying while the read
241
- * fails: a playtest's DataModels are slow to answer while their Studio boots,
242
- * and a session that reconnects is read again under the same id.
243
- */
244
- async function readPlaytestIdAsync(connection, sessionId, signal) {
245
- while (!signal.aborted) {
246
- const session = connection.getSession(sessionId);
247
- if (session) {
248
- try {
249
- const result = await session.execAsync(READ_PLAYTEST_ID_SCRIPT, 5_000);
250
- if (result.success) {
251
- const value = result.returnValues?.[0];
252
- return { session, id: typeof value === 'string' ? value : undefined };
253
- }
254
- }
255
- catch {
256
- // Retried below
257
- }
258
- }
259
- await new Promise((resolve) => setTimeout(resolve, READ_RETRY_DELAY_MS));
260
- }
261
- return undefined;
262
- }
263
243
  async function waitForSessionCloseAsync(connection, sessionId) {
264
244
  return new Promise((resolve, reject) => {
265
245
  if (!connection.getSession(sessionId)) {
@@ -1 +1 @@
1
- {"version":3,"file":"playtest-sessions.js","sourceRoot":"","sources":["../../../../src/commands/playtest/playtest-sessions.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"playtest-sessions.js","sourceRoot":"","sources":["../../../../src/commands/playtest/playtest-sessions.ts"],"names":[],"mappings":"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"}
@@ -8,6 +8,14 @@ const settings = vi.hoisted(() => ({
8
8
  vi.mock('../../process/studio-settings.js', () => ({
9
9
  tryReadLoadUserPluginsOnPlaytestAsync: async () => settings.loadUserPluginsOnPlaytest,
10
10
  }));
11
+ vi.mock('../../plugin/playtest-bridge.js', () => ({
12
+ buildPlaytestBridgeAsync: async (scripts, options) => ({
13
+ entrySource: 'entry',
14
+ ...(options?.withClient ? { clientEntrySource: 'client entry' } : {}),
15
+ modules: {},
16
+ precompiled: scripts ?? [],
17
+ }),
18
+ }));
11
19
  import { ContextNotFoundError } from '../../bridge/index.js';
12
20
  import { explainMissingPlaytestContextAsync, resolvePlaytestServerSessionAsync, startPlaytestAsync, } from './playtest-sessions.js';
13
21
  beforeEach(() => {
@@ -42,16 +50,10 @@ describe('startPlaytestAsync multiplayer checks', () => {
42
50
  });
43
51
  });
44
52
  describe('with "Load user plugins on playtest" off', () => {
45
- it('refuses to start a playtest whose sessions could never connect', async () => {
46
- settings.loadUserPluginsOnPlaytest = false;
47
- const editSession = createEditSession('current');
48
- await expect(startPlaytestAsync({}, editSession, 'play')).rejects.toThrow(`Studio's "Load user plugins on playtest" setting is off`);
49
- expect(editSession.runPlaytestAsync).not.toHaveBeenCalled();
50
- });
51
- it('names the setting when no server session is connected', async () => {
53
+ it('does not blame the setting for a missing server session, which is planted', async () => {
52
54
  settings.loadUserPluginsOnPlaytest = false;
53
55
  const connection = { listSessions: () => [] };
54
- await expect(resolvePlaytestServerSessionAsync(connection)).rejects.toThrow(`No playtest is connected. Studio's "Load user plugins on playtest" setting is off`);
56
+ await expect(resolvePlaytestServerSessionAsync(connection)).rejects.toThrow("No playtest is running. Start one with 'studio-bridge playtest start'.");
55
57
  });
56
58
  it("ignores this machine's setting when Studio is remote", async () => {
57
59
  settings.loadUserPluginsOnPlaytest = false;
@@ -84,4 +86,68 @@ describe('explainMissingPlaytestContextAsync', () => {
84
86
  expect(await explainMissingPlaytestContextAsync(connection, original)).toBe(original);
85
87
  });
86
88
  });
89
+ describe('planting the server session', () => {
90
+ function createConnection() {
91
+ return {
92
+ port: 38741,
93
+ isRemote: false,
94
+ listSessions: () => [],
95
+ getSession: () => undefined,
96
+ on: vi.fn(),
97
+ off: vi.fn(),
98
+ };
99
+ }
100
+ // The start fails at once, so the test sees what it was asked to start
101
+ function createFailingEditSession(pluginVersion) {
102
+ const editSession = createEditSession(pluginVersion);
103
+ editSession.runPlaytestAsync.mockResolvedValue({
104
+ playtestId: 'p',
105
+ success: false,
106
+ error: 'refused',
107
+ });
108
+ return editSession;
109
+ }
110
+ it('plants a bridge with the scripts to run when the setting is off', async () => {
111
+ settings.loadUserPluginsOnPlaytest = false;
112
+ const editSession = createFailingEditSession('old');
113
+ await expect(startPlaytestAsync(createConnection(), editSession, 'run', undefined, {
114
+ scripts: ['return 1'],
115
+ })).rejects.toThrow('Playtest failed to start: refused');
116
+ const bridge = editSession.runPlaytestAsync.mock.calls[0][5];
117
+ expect(bridge.precompiled).toEqual(['return 1']);
118
+ });
119
+ it('plants a client bridge too for a play mode playtest when the setting is off', async () => {
120
+ settings.loadUserPluginsOnPlaytest = false;
121
+ const editSession = createFailingEditSession('old');
122
+ await expect(startPlaytestAsync(createConnection(), editSession, 'play')).rejects.toThrow('Playtest failed to start: refused');
123
+ expect(editSession.runPlaytestAsync.mock.calls[0][5].clientEntrySource).toContain('client entry');
124
+ });
125
+ it('plants no client bridge in run mode, or when the setting is unknown', async () => {
126
+ settings.loadUserPluginsOnPlaytest = false;
127
+ const runMode = createFailingEditSession('old');
128
+ await expect(startPlaytestAsync(createConnection(), runMode, 'run')).rejects.toThrow('refused');
129
+ expect(runMode.runPlaytestAsync.mock.calls[0][5].clientEntrySource).toBeUndefined();
130
+ settings.loadUserPluginsOnPlaytest = undefined;
131
+ const unknown = createFailingEditSession('current');
132
+ await expect(startPlaytestAsync(createConnection(), unknown, 'play')).rejects.toThrow('refused');
133
+ expect(unknown.runPlaytestAsync.mock.calls[0][5].clientEntrySource).toBeUndefined();
134
+ });
135
+ it('plants a bridge when the setting is unknown', async () => {
136
+ const editSession = createFailingEditSession('current');
137
+ await expect(startPlaytestAsync(createConnection(), editSession, 'run')).rejects.toThrow('refused');
138
+ expect(editSession.runPlaytestAsync.mock.calls[0][5]).toBeDefined();
139
+ });
140
+ it('leaves the server to the plugin when the setting is on', async () => {
141
+ settings.loadUserPluginsOnPlaytest = true;
142
+ const editSession = createFailingEditSession('current');
143
+ await expect(startPlaytestAsync(createConnection(), editSession, 'run')).rejects.toThrow('refused');
144
+ expect(editSession.runPlaytestAsync.mock.calls[0][5]).toBeUndefined();
145
+ });
146
+ it('needs the current plugin when plugin sessions will connect', async () => {
147
+ settings.loadUserPluginsOnPlaytest = true;
148
+ const editSession = createFailingEditSession('old');
149
+ await expect(startPlaytestAsync(createConnection(), editSession, 'run')).rejects.toThrow("Run 'studio-bridge plugin install' first");
150
+ expect(editSession.runPlaytestAsync).not.toHaveBeenCalled();
151
+ });
152
+ });
87
153
  //# sourceMappingURL=playtest-sessions.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"playtest-sessions.test.js","sourceRoot":"","sources":["../../../../src/commands/playtest/playtest-sessions.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"playtest-sessions.test.js","sourceRoot":"","sources":["../../../../src/commands/playtest/playtest-sessions.test.ts"],"names":[],"mappings":"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"}
@@ -5,10 +5,10 @@
5
5
  * `--context client`. Its output and return values come back the same way as
6
6
  * `console exec`.
7
7
  *
8
- * In the server, the edit session plants a runner script in the playtest
9
- * (playtest-runner.luau), so this works even when Studio does not load user
10
- * plugins into playtests. The client has no such path: it needs the
11
- * playtest's client session, so it needs that Studio setting on.
8
+ * Both run through the playtest's sessions. The server session works even
9
+ * when Studio does not load user plugins into playtests, since the edit
10
+ * session then plants it, with this code compiled ahead of time (see
11
+ * playtest-sessions.ts). The client session needs that Studio setting on.
12
12
  */
13
13
  import type { BridgeConnection, PlaytestMode, SessionContext } from '../../../bridge/index.js';
14
14
  import type { SerializedReturnValue } from '../../../server/web-socket-protocol.js';
@@ -22,11 +22,12 @@ export interface PlaytestRunOptions {
22
22
  timeout?: number;
23
23
  /** Passed to the script as `...`. */
24
24
  args?: string[];
25
+ /** Passed to the script as buffers in `...`, before `args`. */
26
+ inputs?: Buffer[];
25
27
  }
26
28
  export interface PlaytestRunResult {
27
29
  success: boolean;
28
- /** Absent when the script ran through the planted runner. */
29
- playtestId?: string;
30
+ playtestId: string;
30
31
  output: string[];
31
32
  error?: string;
32
33
  returnValues?: SerializedReturnValue[];
@@ -38,8 +39,9 @@ interface PlaytestRunArgs {
38
39
  code?: string;
39
40
  file?: string;
40
41
  mode?: PlaytestMode;
41
- timeout?: number;
42
+ scriptTimeout?: number;
42
43
  scriptArgs?: string[];
44
+ input?: string[];
43
45
  }
44
46
  export declare function playtestRunHandlerAsync(connection: BridgeConnection, options: PlaytestRunOptions): Promise<PlaytestRunResult>;
45
47
  export declare const playtestRunCommand: import("../../framework/define-command.js").CommandDefinition<PlaytestRunArgs, PlaytestRunResult>;
@@ -1 +1 @@
1
- {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../../../src/commands/playtest/run/run.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAYH,OAAO,KAAK,EACV,gBAAgB,EAGhB,YAAY,EACZ,cAAc,EACf,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,wCAAwC,CAAC;AAOpF,MAAM,WAAW,kBAAkB;IACjC,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,YAAY,CAAC;IACnB,8CAA8C;IAC9C,OAAO,EAAE,cAAc,CAAC;IACxB,yDAAyD;IACzD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,qCAAqC;IACrC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAKD,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,6DAA6D;IAC7D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,qBAAqB,EAAE,CAAC;IACvC,qEAAqE;IACrE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,UAAU,eAAe;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,wBAAsB,uBAAuB,CAC3C,UAAU,EAAE,gBAAgB,EAC5B,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,iBAAiB,CAAC,CAgD5B;AA4DD,eAAO,MAAM,kBAAkB,mGAuD7B,CAAC"}
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../../../src/commands/playtest/run/run.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAWH,OAAO,KAAK,EACV,gBAAgB,EAEhB,YAAY,EACZ,cAAc,EACf,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,wCAAwC,CAAC;AAOpF,MAAM,WAAW,kBAAkB;IACjC,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,YAAY,CAAC;IACnB,8CAA8C;IAC9C,OAAO,EAAE,cAAc,CAAC;IACxB,yDAAyD;IACzD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,qCAAqC;IACrC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,+DAA+D;IAC/D,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAID,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,qBAAqB,EAAE,CAAC;IACvC,qEAAqE;IACrE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,UAAU,eAAe;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,wBAAsB,uBAAuB,CAC3C,UAAU,EAAE,gBAAgB,EAC5B,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,iBAAiB,CAAC,CAsD5B;AAmCD,eAAO,MAAM,kBAAkB,mGA6D7B,CAAC"}
@@ -5,40 +5,42 @@
5
5
  * `--context client`. Its output and return values come back the same way as
6
6
  * `console exec`.
7
7
  *
8
- * In the server, the edit session plants a runner script in the playtest
9
- * (playtest-runner.luau), so this works even when Studio does not load user
10
- * plugins into playtests. The client has no such path: it needs the
11
- * playtest's client session, so it needs that Studio setting on.
8
+ * Both run through the playtest's sessions. The server session works even
9
+ * when Studio does not load user plugins into playtests, since the edit
10
+ * session then plants it, with this code compiled ahead of time (see
11
+ * playtest-sessions.ts). The client session needs that Studio setting on.
12
12
  */
13
- import * as fs from 'fs/promises';
14
- import { resolvePackagePath } from '@quenty/nevermore-template-helpers';
15
13
  import { defineCommand } from '../../framework/define-command.js';
16
14
  import { arg } from '../../framework/arg-builder.js';
17
15
  import { resolveScriptContentAsync } from '../../../cli/resolve-script-content.js';
18
- import { execHandlerAsync, formatExecText, } from '../../console/exec/exec.js';
16
+ import { execHandlerAsync, formatExecText, INPUT_ARG_DESCRIPTION, readInputFilesAsync, } from '../../console/exec/exec.js';
19
17
  import { endPlaytestAsync, getPlaytestContexts, startPlaytestAsync, } from '../playtest-sessions.js';
20
- /** Matches `console exec`'s default execution timeout. */
21
- const DEFAULT_TIMEOUT_MS = 120_000;
18
+ const PLAYER_JOIN_TIMEOUT_MS = 30_000;
22
19
  export async function playtestRunHandlerAsync(connection, options) {
23
20
  if (!getPlaytestContexts(options.mode).includes(options.context)) {
24
21
  throw new Error(`A ${options.mode} mode playtest has no ${options.context} session to run code in`);
25
22
  }
26
23
  const editSession = await connection.resolveSessionAsync(options.target, 'edit');
27
- if (options.context === 'server') {
28
- return runWithPlantedRunnerAsync(editSession, options);
29
- }
30
- const playtest = await startPlaytestAsync(connection, editSession, options.mode);
24
+ const playtest = await startPlaytestAsync(connection, editSession, options.mode, undefined, {
25
+ scripts: [options.scriptContent],
26
+ serverOnly: options.context === 'server',
27
+ });
31
28
  let result;
32
29
  try {
33
30
  const session = playtest.sessions[options.context];
34
31
  if (!session) {
35
32
  throw new Error(`Playtest has no ${options.context} session`);
36
33
  }
34
+ // In play mode the server's code expects the player, who joins a moment later
35
+ if (options.mode === 'play' && options.context === 'server') {
36
+ await waitForPlayerAsync(session);
37
+ }
37
38
  result = {
38
39
  ...(await execHandlerAsync(session, {
39
40
  scriptContent: options.scriptContent,
40
41
  timeout: options.timeout,
41
42
  args: options.args,
43
+ inputs: options.inputs,
42
44
  })),
43
45
  playtestId: playtest.playtestId,
44
46
  };
@@ -51,28 +53,15 @@ export async function playtestRunHandlerAsync(connection, options) {
51
53
  const stopError = await tryEndPlaytestAsync(connection, playtest.sessions.server);
52
54
  return stopError ? { ...result, stopError } : result;
53
55
  }
54
- async function runWithPlantedRunnerAsync(editSession, options) {
55
- const runnerSource = await fs.readFile(resolvePackagePath(import.meta.url, 'src', 'commands', 'playtest', 'run', 'playtest-runner.luau'), 'utf-8');
56
- const result = await editSession.runPlaytestScriptAsync({
57
- mode: options.mode,
58
- script: options.scriptContent,
59
- runnerSource,
60
- timeoutSec: (options.timeout ?? DEFAULT_TIMEOUT_MS) / 1000,
61
- args: options.args,
62
- });
63
- return toCommandResult(result);
64
- }
65
- /** Shapes a bridge ExecResult the way `console exec` reports it. */
66
- function toCommandResult(result) {
67
- return {
68
- success: result.success,
69
- output: result.output.map((entry) => entry.body),
70
- error: result.error,
71
- returnValues: result.returnValues,
72
- summary: result.success
73
- ? 'Script executed successfully'
74
- : `Script failed: ${result.error}`,
75
- };
56
+ async function waitForPlayerAsync(serverSession) {
57
+ const deadline = Date.now() + PLAYER_JOIN_TIMEOUT_MS;
58
+ while (Date.now() < deadline) {
59
+ const { players } = await serverSession.playtestPlayersAsync({ op: 'list' }, PLAYER_JOIN_TIMEOUT_MS);
60
+ if (players.length > 0)
61
+ return;
62
+ await new Promise((resolve) => setTimeout(resolve, 250));
63
+ }
64
+ throw new Error(`No player joined the playtest within ${PLAYER_JOIN_TIMEOUT_MS / 1000}s`);
76
65
  }
77
66
  /** Ends the playtest, returning why it could not instead of throwing. */
78
67
  async function tryEndPlaytestAsync(connection, serverSession) {
@@ -109,10 +98,14 @@ export const playtestRunCommand = defineCommand({
109
98
  choices: ['play', 'run'],
110
99
  default: 'play',
111
100
  }),
112
- timeout: arg.option({
113
- description: 'Execution timeout in milliseconds',
101
+ scriptTimeout: arg.option({
102
+ description: 'Cancel the script after this many milliseconds',
114
103
  type: 'number',
115
104
  }),
105
+ input: arg.option({
106
+ description: INPUT_ARG_DESCRIPTION,
107
+ array: true,
108
+ }),
116
109
  scriptArgs: arg.passthrough({
117
110
  description: 'Arguments after --, passed to the script as ... (all strings)',
118
111
  }),
@@ -124,13 +117,15 @@ export const playtestRunCommand = defineCommand({
124
117
  },
125
118
  handler: async (connection, args, targeting) => {
126
119
  const { scriptContent } = await resolveScriptContentAsync(args);
120
+ const inputs = await readInputFilesAsync(args.input);
127
121
  return playtestRunHandlerAsync(connection, {
128
122
  scriptContent,
129
123
  mode: args.mode ?? 'play',
130
124
  context: targeting.context ?? 'server',
131
125
  target: targeting.target,
132
- timeout: args.timeout,
126
+ timeout: args.scriptTimeout,
133
127
  args: args.scriptArgs,
128
+ inputs,
134
129
  });
135
130
  },
136
131
  });
@@ -1 +1 @@
1
- {"version":3,"file":"run.js","sourceRoot":"","sources":["../../../../../src/commands/playtest/run/run.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../../../../src/commands/playtest/run/run.ts"],"names":[],"mappings":"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"}
@@ -9,6 +9,7 @@ export interface ProcessCloseResult {
9
9
  /** The `deploy.nevermore.json` target whose Studio was closed, if one was named. */
10
10
  deployTarget?: string;
11
11
  pid?: number;
12
+ pids?: number[];
12
13
  summary: string;
13
14
  }
14
15
  export interface ProcessCloseOptions {
@@ -17,6 +18,8 @@ export interface ProcessCloseOptions {
17
18
  }
18
19
  interface ProcessCloseArgs {
19
20
  deployTarget?: string;
21
+ all?: boolean;
22
+ askToSave?: boolean;
20
23
  force?: boolean;
21
24
  pid?: number;
22
25
  }
@@ -26,6 +29,7 @@ export declare function processCloseHandlerAsync(session: BridgeSession, options
26
29
  * `deploy.nevermore.json`: a connected one, or else one launched with it.
27
30
  */
28
31
  export declare function closeDeployTargetAsync(connection: BridgeConnection, deployTarget: string, options?: ProcessCloseOptions, cwd?: string): Promise<ProcessCloseResult>;
32
+ export declare function closeAllStudiosAsync(options?: Pick<ProcessCloseOptions, 'force'>): Promise<ProcessCloseResult>;
29
33
  export declare const processCloseCommand: import("../../framework/define-command.js").CommandDefinition<ProcessCloseArgs, ProcessCloseResult>;
30
34
  export {};
31
35
  //# sourceMappingURL=close.d.ts.map