@quenty/studio-bridge 0.21.1 → 0.22.1
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.
- package/CHANGELOG.md +10 -0
- package/README.md +109 -17
- package/build-scripts/transform-add-session-attribute.lua +1 -0
- package/deploy.nevermore.json +10 -0
- package/dist/src/bridge/bridge-connection.d.ts +26 -2
- package/dist/src/bridge/bridge-connection.d.ts.map +1 -1
- package/dist/src/bridge/bridge-connection.js +159 -14
- package/dist/src/bridge/bridge-connection.js.map +1 -1
- package/dist/src/bridge/bridge-connection.test.js +81 -0
- package/dist/src/bridge/bridge-connection.test.js.map +1 -1
- package/dist/src/bridge/bridge-session.d.ts +35 -2
- package/dist/src/bridge/bridge-session.d.ts.map +1 -1
- package/dist/src/bridge/bridge-session.js +185 -28
- package/dist/src/bridge/bridge-session.js.map +1 -1
- package/dist/src/bridge/bridge-session.test.js +6 -4
- package/dist/src/bridge/bridge-session.test.js.map +1 -1
- package/dist/src/bridge/index.d.ts +1 -1
- package/dist/src/bridge/index.d.ts.map +1 -1
- package/dist/src/bridge/index.js.map +1 -1
- package/dist/src/bridge/internal/bridge-client.d.ts +4 -0
- package/dist/src/bridge/internal/bridge-client.d.ts.map +1 -1
- package/dist/src/bridge/internal/bridge-client.js +20 -7
- package/dist/src/bridge/internal/bridge-client.js.map +1 -1
- package/dist/src/bridge/internal/bridge-client.test.js +18 -0
- package/dist/src/bridge/internal/bridge-client.test.js.map +1 -1
- package/dist/src/bridge/internal/bridge-host.d.ts +13 -1
- package/dist/src/bridge/internal/bridge-host.d.ts.map +1 -1
- package/dist/src/bridge/internal/bridge-host.js +35 -0
- package/dist/src/bridge/internal/bridge-host.js.map +1 -1
- package/dist/src/bridge/internal/bridge-host.test.js +31 -0
- package/dist/src/bridge/internal/bridge-host.test.js.map +1 -1
- package/dist/src/bridge/internal/hand-off.d.ts.map +1 -1
- package/dist/src/bridge/internal/hand-off.js +4 -1
- package/dist/src/bridge/internal/hand-off.js.map +1 -1
- package/dist/src/bridge/internal/host-protocol.d.ts +8 -0
- package/dist/src/bridge/internal/host-protocol.d.ts.map +1 -1
- package/dist/src/bridge/internal/host-protocol.js +120 -13
- package/dist/src/bridge/internal/host-protocol.js.map +1 -1
- package/dist/src/bridge/internal/host-protocol.test.js +13 -0
- package/dist/src/bridge/internal/host-protocol.test.js.map +1 -1
- package/dist/src/bridge/internal/instance-state.d.ts +9 -0
- package/dist/src/bridge/internal/instance-state.d.ts.map +1 -0
- package/dist/src/bridge/internal/instance-state.js +28 -0
- package/dist/src/bridge/internal/instance-state.js.map +1 -0
- package/dist/src/bridge/internal/transport-client.d.ts.map +1 -1
- package/dist/src/bridge/internal/transport-client.js +2 -1
- package/dist/src/bridge/internal/transport-client.js.map +1 -1
- package/dist/src/bridge/internal/transport-server.d.ts.map +1 -1
- package/dist/src/bridge/internal/transport-server.js +5 -1
- package/dist/src/bridge/internal/transport-server.js.map +1 -1
- package/dist/src/bridge/types.d.ts +43 -4
- package/dist/src/bridge/types.d.ts.map +1 -1
- package/dist/src/bridge/types.js.map +1 -1
- package/dist/src/cli/adapters/cli-command-adapter-handler.test.js +24 -0
- package/dist/src/cli/adapters/cli-command-adapter-handler.test.js.map +1 -1
- package/dist/src/cli/adapters/cli-command-adapter.d.ts +6 -0
- package/dist/src/cli/adapters/cli-command-adapter.d.ts.map +1 -1
- package/dist/src/cli/adapters/cli-command-adapter.js +107 -11
- package/dist/src/cli/adapters/cli-command-adapter.js.map +1 -1
- package/dist/src/cli/adapters/group-builder.d.ts +3 -0
- package/dist/src/cli/adapters/group-builder.d.ts.map +1 -1
- package/dist/src/cli/adapters/group-builder.js +34 -15
- package/dist/src/cli/adapters/group-builder.js.map +1 -1
- package/dist/src/cli/adapters/group-builder.test.js +26 -2
- package/dist/src/cli/adapters/group-builder.test.js.map +1 -1
- package/dist/src/cli/adapters/help-formatter.d.ts.map +1 -1
- package/dist/src/cli/adapters/help-formatter.js +4 -3
- package/dist/src/cli/adapters/help-formatter.js.map +1 -1
- package/dist/src/cli/adapters/help-formatter.test.js +1 -1
- package/dist/src/cli/adapters/help-formatter.test.js.map +1 -1
- package/dist/src/cli/adapters/playtest-edit-guard.test.d.ts +2 -0
- package/dist/src/cli/adapters/playtest-edit-guard.test.d.ts.map +1 -0
- package/dist/src/cli/adapters/playtest-edit-guard.test.js +28 -0
- package/dist/src/cli/adapters/playtest-edit-guard.test.js.map +1 -0
- package/dist/src/cli/args/global-args.d.ts +1 -1
- package/dist/src/cli/args/global-args.d.ts.map +1 -1
- package/dist/src/cli/cli-output-context.d.ts +14 -0
- package/dist/src/cli/cli-output-context.d.ts.map +1 -0
- package/dist/src/cli/cli-output-context.js +39 -0
- package/dist/src/cli/cli-output-context.js.map +1 -0
- package/dist/src/cli/cli-output-context.test.d.ts +2 -0
- package/dist/src/cli/cli-output-context.test.d.ts.map +1 -0
- package/dist/src/cli/cli-output-context.test.js +38 -0
- package/dist/src/cli/cli-output-context.test.js.map +1 -0
- package/dist/src/cli/cli.js +40 -17
- package/dist/src/cli/cli.js.map +1 -1
- package/dist/src/cli/managed-studio-run.d.ts +21 -0
- package/dist/src/cli/managed-studio-run.d.ts.map +1 -0
- package/dist/src/cli/managed-studio-run.js +75 -0
- package/dist/src/cli/managed-studio-run.js.map +1 -0
- package/dist/src/cli/managed-studio-run.test.d.ts +2 -0
- package/dist/src/cli/managed-studio-run.test.d.ts.map +1 -0
- package/dist/src/cli/managed-studio-run.test.js +52 -0
- package/dist/src/cli/managed-studio-run.test.js.map +1 -0
- package/dist/src/cli/resolve-session.js +1 -1
- package/dist/src/cli/resolve-session.js.map +1 -1
- package/dist/src/cli/resolve-session.test.js +1 -1
- package/dist/src/cli/resolve-session.test.js.map +1 -1
- package/dist/src/cli/script-executor.d.ts +13 -1
- package/dist/src/cli/script-executor.d.ts.map +1 -1
- package/dist/src/cli/script-executor.js +77 -47
- package/dist/src/cli/script-executor.js.map +1 -1
- package/dist/src/commands/console/exec/exec.d.ts +17 -0
- package/dist/src/commands/console/exec/exec.d.ts.map +1 -1
- package/dist/src/commands/console/exec/exec.js +39 -7
- package/dist/src/commands/console/exec/exec.js.map +1 -1
- package/dist/src/commands/console/exec/exec.test.js +62 -3
- package/dist/src/commands/console/exec/exec.test.js.map +1 -1
- package/dist/src/commands/console/logs/logs.d.ts +30 -2
- package/dist/src/commands/console/logs/logs.d.ts.map +1 -1
- package/dist/src/commands/console/logs/logs.js +82 -7
- package/dist/src/commands/console/logs/logs.js.map +1 -1
- package/dist/src/commands/console/logs/logs.test.js +63 -4
- package/dist/src/commands/console/logs/logs.test.js.map +1 -1
- package/dist/src/commands/explorer/export/export.d.ts +19 -0
- package/dist/src/commands/explorer/export/export.d.ts.map +1 -0
- package/dist/src/commands/explorer/export/export.js +37 -0
- package/dist/src/commands/explorer/export/export.js.map +1 -0
- package/dist/src/commands/explorer/export/export.test.d.ts +2 -0
- package/dist/src/commands/explorer/export/export.test.d.ts.map +1 -0
- package/dist/src/commands/explorer/export/export.test.js +25 -0
- package/dist/src/commands/explorer/export/export.test.js.map +1 -0
- package/dist/src/commands/explorer/find/find.d.ts +28 -0
- package/dist/src/commands/explorer/find/find.d.ts.map +1 -0
- package/dist/src/commands/explorer/find/find.js +75 -0
- package/dist/src/commands/explorer/find/find.js.map +1 -0
- package/dist/src/commands/explorer/find/find.test.d.ts +2 -0
- package/dist/src/commands/explorer/find/find.test.d.ts.map +1 -0
- package/dist/src/commands/explorer/find/find.test.js +44 -0
- package/dist/src/commands/explorer/find/find.test.js.map +1 -0
- package/dist/src/commands/explorer/grep/grep.d.ts +24 -0
- package/dist/src/commands/explorer/grep/grep.d.ts.map +1 -0
- package/dist/src/commands/explorer/grep/grep.js +63 -0
- package/dist/src/commands/explorer/grep/grep.js.map +1 -0
- package/dist/src/commands/explorer/grep/grep.test.d.ts +2 -0
- package/dist/src/commands/explorer/grep/grep.test.d.ts.map +1 -0
- package/dist/src/commands/explorer/grep/grep.test.js +42 -0
- package/dist/src/commands/explorer/grep/grep.test.js.map +1 -0
- package/dist/src/commands/explorer/import/import.d.ts +21 -0
- package/dist/src/commands/explorer/import/import.d.ts.map +1 -0
- package/dist/src/commands/explorer/import/import.js +37 -0
- package/dist/src/commands/explorer/import/import.js.map +1 -0
- package/dist/src/commands/explorer/import/import.test.d.ts +2 -0
- package/dist/src/commands/explorer/import/import.test.d.ts.map +1 -0
- package/dist/src/commands/explorer/import/import.test.js +45 -0
- package/dist/src/commands/explorer/import/import.test.js.map +1 -0
- package/dist/src/commands/formatters.test.js +7 -1
- package/dist/src/commands/formatters.test.js.map +1 -1
- package/dist/src/commands/framework/action-loader.d.ts +5 -1
- package/dist/src/commands/framework/action-loader.d.ts.map +1 -1
- package/dist/src/commands/framework/action-loader.js +9 -2
- package/dist/src/commands/framework/action-loader.js.map +1 -1
- package/dist/src/commands/framework/action-loader.test.js +23 -0
- package/dist/src/commands/framework/action-loader.test.js.map +1 -1
- package/dist/src/commands/framework/arg-builder.d.ts +15 -2
- package/dist/src/commands/framework/arg-builder.d.ts.map +1 -1
- package/dist/src/commands/framework/arg-builder.js +22 -2
- package/dist/src/commands/framework/arg-builder.js.map +1 -1
- package/dist/src/commands/framework/define-command.d.ts +19 -3
- package/dist/src/commands/framework/define-command.d.ts.map +1 -1
- package/dist/src/commands/framework/define-command.js.map +1 -1
- package/dist/src/commands/framework/index.d.ts +1 -1
- package/dist/src/commands/framework/index.d.ts.map +1 -1
- package/dist/src/commands/framework/index.js.map +1 -1
- package/dist/src/commands/index.d.ts +11 -0
- package/dist/src/commands/index.d.ts.map +1 -1
- package/dist/src/commands/index.js +11 -0
- package/dist/src/commands/index.js.map +1 -1
- package/dist/src/commands/linux/inject-credentials/inject-credentials.d.ts.map +1 -1
- package/dist/src/commands/linux/inject-credentials/inject-credentials.js +1 -3
- package/dist/src/commands/linux/inject-credentials/inject-credentials.js.map +1 -1
- package/dist/src/commands/linux/setup/setup.d.ts.map +1 -1
- package/dist/src/commands/linux/setup/setup.js +1 -3
- package/dist/src/commands/linux/setup/setup.js.map +1 -1
- package/dist/src/commands/linux/status/status.d.ts +9 -1
- package/dist/src/commands/linux/status/status.d.ts.map +1 -1
- package/dist/src/commands/linux/status/status.js +66 -86
- package/dist/src/commands/linux/status/status.js.map +1 -1
- package/dist/src/commands/playtest/player/add/add.d.ts +17 -0
- package/dist/src/commands/playtest/player/add/add.d.ts.map +1 -0
- package/dist/src/commands/playtest/player/add/add.js +45 -0
- package/dist/src/commands/playtest/player/add/add.js.map +1 -0
- package/dist/src/commands/playtest/player/list/list.d.ts +13 -0
- package/dist/src/commands/playtest/player/list/list.d.ts.map +1 -0
- package/dist/src/commands/playtest/player/list/list.js +33 -0
- package/dist/src/commands/playtest/player/list/list.js.map +1 -0
- package/dist/src/commands/playtest/player/playtest-players.d.ts +36 -0
- package/dist/src/commands/playtest/player/playtest-players.d.ts.map +1 -0
- package/dist/src/commands/playtest/player/playtest-players.js +187 -0
- package/dist/src/commands/playtest/player/playtest-players.js.map +1 -0
- package/dist/src/commands/playtest/player/playtest-players.test.d.ts +2 -0
- package/dist/src/commands/playtest/player/playtest-players.test.d.ts.map +1 -0
- package/dist/src/commands/playtest/player/playtest-players.test.js +89 -0
- package/dist/src/commands/playtest/player/playtest-players.test.js.map +1 -0
- package/dist/src/commands/playtest/player/remove/remove.d.ts +17 -0
- package/dist/src/commands/playtest/player/remove/remove.d.ts.map +1 -0
- package/dist/src/commands/playtest/player/remove/remove.js +42 -0
- package/dist/src/commands/playtest/player/remove/remove.js.map +1 -0
- package/dist/src/commands/playtest/playtest-sessions.d.ts +49 -0
- package/dist/src/commands/playtest/playtest-sessions.d.ts.map +1 -0
- package/dist/src/commands/playtest/playtest-sessions.js +283 -0
- package/dist/src/commands/playtest/playtest-sessions.js.map +1 -0
- package/dist/src/commands/playtest/playtest-sessions.test.d.ts +2 -0
- package/dist/src/commands/playtest/playtest-sessions.test.d.ts.map +1 -0
- package/dist/src/commands/playtest/playtest-sessions.test.js +87 -0
- package/dist/src/commands/playtest/playtest-sessions.test.js.map +1 -0
- package/dist/src/commands/playtest/restart/restart.d.ts +23 -0
- package/dist/src/commands/playtest/restart/restart.d.ts.map +1 -0
- package/dist/src/commands/playtest/restart/restart.js +105 -0
- package/dist/src/commands/playtest/restart/restart.js.map +1 -0
- package/dist/src/commands/playtest/run/run.d.ts +47 -0
- package/dist/src/commands/playtest/run/run.d.ts.map +1 -0
- package/dist/src/commands/playtest/run/run.js +137 -0
- package/dist/src/commands/playtest/run/run.js.map +1 -0
- package/dist/src/commands/playtest/start/start.d.ts +42 -0
- package/dist/src/commands/playtest/start/start.d.ts.map +1 -0
- package/dist/src/commands/playtest/start/start.js +70 -0
- package/dist/src/commands/playtest/start/start.js.map +1 -0
- package/dist/src/commands/playtest/stop/stop.d.ts +15 -0
- package/dist/src/commands/playtest/stop/stop.d.ts.map +1 -0
- package/dist/src/commands/playtest/stop/stop.js +24 -0
- package/dist/src/commands/playtest/stop/stop.js.map +1 -0
- package/dist/src/commands/process/close/close.d.ts +19 -10
- package/dist/src/commands/process/close/close.d.ts.map +1 -1
- package/dist/src/commands/process/close/close.js +118 -15
- package/dist/src/commands/process/close/close.js.map +1 -1
- package/dist/src/commands/process/close/close.test.d.ts +2 -0
- package/dist/src/commands/process/close/close.test.d.ts.map +1 -0
- package/dist/src/commands/process/close/close.test.js +190 -0
- package/dist/src/commands/process/close/close.test.js.map +1 -0
- package/dist/src/commands/process/info/info.d.ts +45 -5
- package/dist/src/commands/process/info/info.d.ts.map +1 -1
- package/dist/src/commands/process/info/info.js +117 -13
- package/dist/src/commands/process/info/info.js.map +1 -1
- package/dist/src/commands/process/info/info.test.js +140 -38
- package/dist/src/commands/process/info/info.test.js.map +1 -1
- package/dist/src/commands/process/launch/launch.d.ts +11 -1
- package/dist/src/commands/process/launch/launch.d.ts.map +1 -1
- package/dist/src/commands/process/launch/launch.js +37 -7
- package/dist/src/commands/process/launch/launch.js.map +1 -1
- package/dist/src/commands/process/launch/launch.test.js +99 -20
- package/dist/src/commands/process/launch/launch.test.js.map +1 -1
- package/dist/src/commands/process/list/list.d.ts +2 -1
- package/dist/src/commands/process/list/list.d.ts.map +1 -1
- package/dist/src/commands/process/list/list.js +9 -6
- package/dist/src/commands/process/list/list.js.map +1 -1
- package/dist/src/commands/process/list/list.test.js +1 -0
- package/dist/src/commands/process/list/list.test.js.map +1 -1
- package/dist/src/commands/process/run/run.d.ts +9 -0
- package/dist/src/commands/process/run/run.d.ts.map +1 -1
- package/dist/src/commands/process/run/run.js +15 -5
- package/dist/src/commands/process/run/run.js.map +1 -1
- package/dist/src/commands/serve/serve.d.ts +2 -0
- package/dist/src/commands/serve/serve.d.ts.map +1 -1
- package/dist/src/commands/serve/serve.js +17 -4
- package/dist/src/commands/serve/serve.js.map +1 -1
- package/dist/src/commands/serve/serve.test.js +9 -2
- package/dist/src/commands/serve/serve.test.js.map +1 -1
- package/dist/src/commands/viewport/screenshot/screenshot.d.ts.map +1 -1
- package/dist/src/commands/viewport/screenshot/screenshot.js +4 -1
- package/dist/src/commands/viewport/screenshot/screenshot.js.map +1 -1
- package/dist/src/commands/viewport/screenshot/screenshot.test.js +5 -9
- package/dist/src/commands/viewport/screenshot/screenshot.test.js.map +1 -1
- package/dist/src/deploy/deploy-places.d.ts +39 -0
- package/dist/src/deploy/deploy-places.d.ts.map +1 -0
- package/dist/src/deploy/deploy-places.js +162 -0
- package/dist/src/deploy/deploy-places.js.map +1 -0
- package/dist/src/deploy/deploy-places.test.d.ts +2 -0
- package/dist/src/deploy/deploy-places.test.d.ts.map +1 -0
- package/dist/src/deploy/deploy-places.test.js +96 -0
- package/dist/src/deploy/deploy-places.test.js.map +1 -0
- package/dist/src/index.d.ts +2 -2
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +1 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/plugin/persistent-plugin-installer.d.ts.map +1 -1
- package/dist/src/plugin/persistent-plugin-installer.js +2 -1
- package/dist/src/plugin/persistent-plugin-installer.js.map +1 -1
- package/dist/src/plugin/persistent-plugin-installer.test.js +3 -0
- package/dist/src/plugin/persistent-plugin-installer.test.js.map +1 -1
- package/dist/src/plugin/plugin-build-version.d.ts +7 -0
- package/dist/src/plugin/plugin-build-version.d.ts.map +1 -0
- package/dist/src/plugin/plugin-build-version.js +42 -0
- package/dist/src/plugin/plugin-build-version.js.map +1 -0
- package/dist/src/plugin/plugin-build-version.test.d.ts +2 -0
- package/dist/src/plugin/plugin-build-version.test.d.ts.map +1 -0
- package/dist/src/plugin/plugin-build-version.test.js +41 -0
- package/dist/src/plugin/plugin-build-version.test.js.map +1 -0
- package/dist/src/plugin/plugin-injector.d.ts.map +1 -1
- package/dist/src/plugin/plugin-injector.js +7 -1
- package/dist/src/plugin/plugin-injector.js.map +1 -1
- package/dist/src/process/studio-process-closer.d.ts +35 -0
- package/dist/src/process/studio-process-closer.d.ts.map +1 -0
- package/dist/src/process/studio-process-closer.js +129 -0
- package/dist/src/process/studio-process-closer.js.map +1 -0
- package/dist/src/process/studio-process-closer.test.d.ts +2 -0
- package/dist/src/process/studio-process-closer.test.d.ts.map +1 -0
- package/dist/src/process/studio-process-closer.test.js +80 -0
- package/dist/src/process/studio-process-closer.test.js.map +1 -0
- package/dist/src/process/studio-settings.d.ts +14 -0
- package/dist/src/process/studio-settings.d.ts.map +1 -0
- package/dist/src/process/studio-settings.js +50 -0
- package/dist/src/process/studio-settings.js.map +1 -0
- package/dist/src/process/studio-settings.test.d.ts +2 -0
- package/dist/src/process/studio-settings.test.d.ts.map +1 -0
- package/dist/src/process/studio-settings.test.js +16 -0
- package/dist/src/process/studio-settings.test.js.map +1 -0
- package/dist/src/process/studio-window-state.d.ts +13 -0
- package/dist/src/process/studio-window-state.d.ts.map +1 -0
- package/dist/src/process/studio-window-state.js +48 -0
- package/dist/src/process/studio-window-state.js.map +1 -0
- package/dist/src/server/studio-bridge-server.d.ts +3 -1
- package/dist/src/server/studio-bridge-server.d.ts.map +1 -1
- package/dist/src/server/studio-bridge-server.js +12 -4
- package/dist/src/server/studio-bridge-server.js.map +1 -1
- package/dist/src/server/web-socket-protocol.d.ts +173 -6
- package/dist/src/server/web-socket-protocol.d.ts.map +1 -1
- package/dist/src/server/web-socket-protocol.js +244 -1
- package/dist/src/server/web-socket-protocol.js.map +1 -1
- package/dist/src/server/web-socket-protocol.test.js +48 -0
- package/dist/src/server/web-socket-protocol.test.js.map +1 -1
- package/dist/src/test/e2e/persistent-session.test.js +121 -0
- package/dist/src/test/e2e/persistent-session.test.js.map +1 -1
- package/dist/src/test/e2e/split-server.test.d.ts +3 -5
- package/dist/src/test/e2e/split-server.test.d.ts.map +1 -1
- package/dist/src/test/e2e/split-server.test.js +3 -5
- package/dist/src/test/e2e/split-server.test.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/docker/Dockerfile +3 -0
- package/package.json +8 -6
- package/src/bridge/bridge-connection.test.ts +126 -0
- package/src/bridge/bridge-connection.ts +217 -22
- package/src/bridge/bridge-session.test.ts +6 -4
- package/src/bridge/bridge-session.ts +273 -28
- package/src/bridge/index.ts +3 -0
- package/src/bridge/internal/bridge-client.test.ts +23 -0
- package/src/bridge/internal/bridge-client.ts +25 -7
- package/src/bridge/internal/bridge-host.test.ts +38 -0
- package/src/bridge/internal/bridge-host.ts +47 -0
- package/src/bridge/internal/hand-off.ts +4 -1
- package/src/bridge/internal/host-protocol.test.ts +15 -0
- package/src/bridge/internal/host-protocol.ts +148 -37
- package/src/bridge/internal/instance-state.ts +34 -0
- package/src/bridge/internal/transport-client.ts +2 -1
- package/src/bridge/internal/transport-server.ts +5 -1
- package/src/bridge/types.ts +47 -2
- package/src/cli/adapters/cli-command-adapter-handler.test.ts +28 -0
- package/src/cli/adapters/cli-command-adapter.ts +150 -18
- package/src/cli/adapters/group-builder.test.ts +34 -2
- package/src/cli/adapters/group-builder.ts +52 -20
- package/src/cli/adapters/help-formatter.test.ts +1 -1
- package/src/cli/adapters/help-formatter.ts +4 -3
- package/src/cli/adapters/playtest-edit-guard.test.ts +54 -0
- package/src/cli/args/global-args.ts +1 -1
- package/src/cli/cli-output-context.test.ts +55 -0
- package/src/cli/cli-output-context.ts +50 -0
- package/src/cli/cli.ts +49 -17
- package/src/cli/managed-studio-run.test.ts +71 -0
- package/src/cli/managed-studio-run.ts +135 -0
- package/src/cli/resolve-session.test.ts +1 -1
- package/src/cli/resolve-session.ts +1 -1
- package/src/cli/script-executor.ts +99 -51
- package/src/commands/console/exec/exec.test.ts +96 -3
- package/src/commands/console/exec/exec.ts +59 -6
- package/src/commands/console/exec/execute.lua +356 -240
- package/src/commands/console/exec/execute.spec.lua +286 -0
- package/src/commands/console/logs/logs.test.ts +76 -4
- package/src/commands/console/logs/logs.ts +132 -17
- package/src/commands/console/logs/query-logs.lua +85 -52
- package/src/commands/console/logs/query-logs.spec.lua +132 -0
- package/src/commands/explorer/export/export-instances.lua +108 -0
- package/src/commands/explorer/export/export-instances.spec.lua +87 -0
- package/src/commands/explorer/export/export.test.ts +27 -0
- package/src/commands/explorer/export/export.ts +60 -0
- package/src/commands/explorer/find/find-instances.lua +174 -0
- package/src/commands/explorer/find/find-instances.spec.lua +122 -0
- package/src/commands/explorer/find/find.test.ts +53 -0
- package/src/commands/explorer/find/find.ts +113 -0
- package/src/commands/explorer/grep/grep-scripts.lua +214 -0
- package/src/commands/explorer/grep/grep-scripts.spec.lua +130 -0
- package/src/commands/explorer/grep/grep.test.ts +45 -0
- package/src/commands/explorer/grep/grep.ts +93 -0
- package/src/commands/explorer/import/import-instances.lua +106 -0
- package/src/commands/explorer/import/import-instances.spec.lua +84 -0
- package/src/commands/explorer/import/import.test.ts +60 -0
- package/src/commands/explorer/import/import.ts +66 -0
- package/src/commands/explorer/query/query-data-model.lua +124 -152
- package/src/commands/explorer/query/query-data-model.spec.lua +150 -0
- package/src/commands/formatters.test.ts +7 -1
- package/src/commands/framework/action-loader.test.ts +28 -0
- package/src/commands/framework/action-loader.ts +10 -2
- package/src/commands/framework/arg-builder.ts +26 -3
- package/src/commands/framework/define-command.ts +32 -3
- package/src/commands/framework/index.ts +1 -0
- package/src/commands/index.ts +50 -0
- package/src/commands/linux/inject-credentials/inject-credentials.ts +1 -3
- package/src/commands/linux/setup/setup.ts +1 -3
- package/src/commands/linux/status/status.ts +105 -98
- package/src/commands/playtest/player/add/add.ts +85 -0
- package/src/commands/playtest/player/list/list.ts +57 -0
- package/src/commands/playtest/player/playtest-players.test.ts +146 -0
- package/src/commands/playtest/player/playtest-players.ts +270 -0
- package/src/commands/playtest/player/remove/remove.ts +78 -0
- package/src/commands/playtest/playtest-sessions.test.ts +143 -0
- package/src/commands/playtest/playtest-sessions.ts +417 -0
- package/src/commands/playtest/restart/restart.ts +199 -0
- package/src/commands/playtest/run/playtest-runner.luau +264 -0
- package/src/commands/playtest/run/playtest-runner.spec.lua +71 -0
- package/src/commands/playtest/run/run-playtest-script.lua +139 -0
- package/src/commands/playtest/run/run-playtest-script.spec.lua +43 -0
- package/src/commands/playtest/run/run.ts +239 -0
- package/src/commands/playtest/start/start-playtest.lua +108 -0
- package/src/commands/playtest/start/start.ts +138 -0
- package/src/commands/playtest/stop/end-playtest.lua +47 -0
- package/src/commands/playtest/stop/stop.ts +51 -0
- package/src/commands/process/close/close.test.ts +250 -0
- package/src/commands/process/close/close.ts +183 -17
- package/src/commands/process/info/info.test.ts +198 -44
- package/src/commands/process/info/info.ts +204 -15
- package/src/commands/process/info/query-state.lua +42 -29
- package/src/commands/process/info/query-state.spec.lua +39 -0
- package/src/commands/process/launch/launch.test.ts +138 -21
- package/src/commands/process/launch/launch.ts +69 -9
- package/src/commands/process/list/list.test.ts +1 -0
- package/src/commands/process/list/list.ts +14 -6
- package/src/commands/process/run/run.ts +26 -5
- package/src/commands/serve/serve.test.ts +17 -2
- package/src/commands/serve/serve.ts +25 -6
- package/src/commands/viewport/screenshot/capture-screenshot.lua +175 -182
- package/src/commands/viewport/screenshot/capture-screenshot.spec.lua +129 -0
- package/src/commands/viewport/screenshot/screenshot.test.ts +7 -10
- package/src/commands/viewport/screenshot/screenshot.ts +6 -1
- package/src/deploy/deploy-places.test.ts +127 -0
- package/src/deploy/deploy-places.ts +229 -0
- package/src/index.ts +11 -0
- package/src/plugin/persistent-plugin-installer.test.ts +4 -0
- package/src/plugin/persistent-plugin-installer.ts +2 -1
- package/src/plugin/plugin-build-version.test.ts +55 -0
- package/src/plugin/plugin-build-version.ts +53 -0
- package/src/plugin/plugin-injector.ts +7 -1
- package/src/process/studio-process-closer.test.ts +107 -0
- package/src/process/studio-process-closer.ts +187 -0
- package/src/process/studio-settings.test.ts +18 -0
- package/src/process/studio-settings.ts +61 -0
- package/src/process/studio-window-state.ts +65 -0
- package/src/server/studio-bridge-server.ts +15 -4
- package/src/server/web-socket-protocol.test.ts +55 -0
- package/src/server/web-socket-protocol.ts +468 -8
- package/src/test/e2e/persistent-session.test.ts +137 -0
- package/src/test/e2e/split-server.test.ts +3 -5
- package/templates/studio-bridge-plugin/default.project.json +3 -0
- package/templates/studio-bridge-plugin/src/Shared/ActionRouter.lua +208 -159
- package/templates/studio-bridge-plugin/src/Shared/ActionRouter.spec.lua +418 -0
- package/templates/studio-bridge-plugin/src/Shared/BuiltInActions.lua +94 -0
- package/templates/studio-bridge-plugin/src/Shared/BuiltInActions.spec.lua +166 -0
- package/templates/studio-bridge-plugin/src/Shared/DiscoveryStateMachine.lua +118 -137
- package/templates/studio-bridge-plugin/src/Shared/DiscoveryStateMachine.spec.lua +228 -0
- package/templates/studio-bridge-plugin/src/Shared/MessageBuffer.lua +80 -109
- package/templates/studio-bridge-plugin/src/Shared/MessageBuffer.spec.lua +116 -0
- package/templates/studio-bridge-plugin/src/Shared/StudioBridgeConnection.lua +233 -0
- package/templates/studio-bridge-plugin/src/Shared/StudioBridgeConnection.spec.lua +239 -0
- package/templates/studio-bridge-plugin/src/Shared/StudioBridgeLogUtils.lua +53 -0
- package/templates/studio-bridge-plugin/src/Shared/StudioBridgeLogUtils.spec.lua +27 -0
- package/templates/studio-bridge-plugin/src/Shared/StudioBridgeSessionUtils.lua +164 -0
- package/templates/studio-bridge-plugin/src/Shared/StudioBridgeSessionUtils.spec.lua +159 -0
- package/templates/studio-bridge-plugin/src/StudioBridgePlugin.server.lua +266 -368
- package/templates/studio-bridge-plugin/src/Vendor/png.lua +8 -2
- package/test/default.project.json +41 -0
- package/test/jest.config.lua +3 -0
- package/test/scripts/Server/ServerMain.server.lua +10 -0
- package/tsconfig.json +1 -0
- package/templates/studio-bridge-plugin/src/Shared/Protocol.lua +0 -132
- package/templates/studio-bridge-plugin-test/test/actions.test.lua +0 -580
- package/templates/studio-bridge-plugin-test/test/discovery.test.lua +0 -622
- package/templates/studio-bridge-plugin-test/test/execute-handler.test.lua +0 -517
- package/templates/studio-bridge-plugin-test/test/hash-lifecycle.test.lua +0 -814
- package/templates/studio-bridge-plugin-test/test/integration.test.lua +0 -1020
- package/templates/studio-bridge-plugin-test/test/new-actions.test.lua +0 -339
- package/templates/studio-bridge-plugin-test/test/plugin-entry.test.lua +0 -493
- package/templates/studio-bridge-plugin-test/test/protocol.test.lua +0 -506
- package/templates/studio-bridge-plugin-test/test/roblox-mocks.lua +0 -108
- package/templates/studio-bridge-plugin-test/test/test-runner.lua +0 -112
|
@@ -13,11 +13,18 @@ import type {
|
|
|
13
13
|
} from '../../server/web-socket-protocol.js';
|
|
14
14
|
import type { SessionInfo, SessionContext, InstanceInfo } from '../types.js';
|
|
15
15
|
|
|
16
|
+
/**
|
|
17
|
+
* Raised when the host-client protocol changes, so a client can tell it is
|
|
18
|
+
* relaying through an older host. Hosts before this field have none.
|
|
19
|
+
*/
|
|
20
|
+
export const HOST_PROTOCOL_VERSION = 2;
|
|
21
|
+
|
|
16
22
|
export interface HostEnvelope {
|
|
17
23
|
type: 'host-envelope';
|
|
18
24
|
requestId: string;
|
|
19
25
|
targetSessionId: string;
|
|
20
26
|
action: ServerMessage;
|
|
27
|
+
timeoutMs?: number;
|
|
21
28
|
}
|
|
22
29
|
|
|
23
30
|
export interface ListSessionsRequest {
|
|
@@ -40,6 +47,8 @@ export interface ListSessionsResponse {
|
|
|
40
47
|
type: 'list-sessions-response';
|
|
41
48
|
requestId: string;
|
|
42
49
|
sessions: SessionInfo[];
|
|
50
|
+
/** Absent from hosts older than HOST_PROTOCOL_VERSION 2. */
|
|
51
|
+
protocolVersion?: number;
|
|
43
52
|
}
|
|
44
53
|
|
|
45
54
|
export interface ListInstancesResponse {
|
|
@@ -76,6 +85,8 @@ export type HostProtocolMessage =
|
|
|
76
85
|
// `ServerMessageSchema` is the load-bearing one: it validates the `action`
|
|
77
86
|
// payload that /client connections forward to plugins. Without it, a buggy
|
|
78
87
|
// or hostile CLI client could ship malformed actions and crash the plugin.
|
|
88
|
+
// Payloads keep fields they don't list, so a newer client's options reach
|
|
89
|
+
// the plugin through an older host instead of being silently dropped.
|
|
79
90
|
// Container fields like `result`, `sessions`, `instances`, and `session` are
|
|
80
91
|
// validated only as objects/arrays — their interior shapes flow through to
|
|
81
92
|
// callers that already know how to handle the typed contracts.
|
|
@@ -90,6 +101,8 @@ const ErrorCodeSchema = z.enum([
|
|
|
90
101
|
'SCREENSHOT_FAILED',
|
|
91
102
|
'SCRIPT_LOAD_ERROR',
|
|
92
103
|
'SCRIPT_RUNTIME_ERROR',
|
|
104
|
+
'SCRIPT_TIMEOUT',
|
|
105
|
+
'RESULT_TOO_LARGE',
|
|
93
106
|
'BUSY',
|
|
94
107
|
'SESSION_MISMATCH',
|
|
95
108
|
'INTERNAL_ERROR',
|
|
@@ -102,7 +115,13 @@ const ServerMessageSchema = z.discriminatedUnion('type', [
|
|
|
102
115
|
type: z.literal('execute'),
|
|
103
116
|
sessionId: z.string(),
|
|
104
117
|
requestId: z.string().optional(),
|
|
105
|
-
payload: z
|
|
118
|
+
payload: z
|
|
119
|
+
.object({
|
|
120
|
+
script: z.string(),
|
|
121
|
+
timeoutMs: z.number().optional(),
|
|
122
|
+
args: z.array(z.string()).optional(),
|
|
123
|
+
})
|
|
124
|
+
.loose(),
|
|
106
125
|
}),
|
|
107
126
|
z.object({
|
|
108
127
|
type: z.literal('shutdown'),
|
|
@@ -119,67 +138,157 @@ const ServerMessageSchema = z.discriminatedUnion('type', [
|
|
|
119
138
|
type: z.literal('captureScreenshot'),
|
|
120
139
|
sessionId: z.string(),
|
|
121
140
|
requestId: z.string(),
|
|
122
|
-
payload: z
|
|
123
|
-
|
|
124
|
-
|
|
141
|
+
payload: z
|
|
142
|
+
.object({
|
|
143
|
+
format: z.literal('png').optional(),
|
|
144
|
+
})
|
|
145
|
+
.loose(),
|
|
125
146
|
}),
|
|
126
147
|
z.object({
|
|
127
148
|
type: z.literal('queryDataModel'),
|
|
128
149
|
sessionId: z.string(),
|
|
129
150
|
requestId: z.string(),
|
|
130
|
-
payload: z
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
151
|
+
payload: z
|
|
152
|
+
.object({
|
|
153
|
+
path: z.string(),
|
|
154
|
+
depth: z.number().optional(),
|
|
155
|
+
properties: z.array(z.string()).optional(),
|
|
156
|
+
includeAttributes: z.boolean().optional(),
|
|
157
|
+
find: z
|
|
158
|
+
.object({
|
|
159
|
+
name: z.string(),
|
|
160
|
+
recursive: z.boolean().optional(),
|
|
161
|
+
})
|
|
162
|
+
.optional(),
|
|
163
|
+
listServices: z.boolean().optional(),
|
|
164
|
+
})
|
|
165
|
+
.loose(),
|
|
166
|
+
}),
|
|
167
|
+
z.object({
|
|
168
|
+
type: z.literal('findInstances'),
|
|
169
|
+
sessionId: z.string(),
|
|
170
|
+
requestId: z.string(),
|
|
171
|
+
payload: z
|
|
172
|
+
.object({
|
|
173
|
+
root: z.string().optional(),
|
|
174
|
+
name: z.string().optional(),
|
|
175
|
+
exactName: z.boolean().optional(),
|
|
176
|
+
className: z.string().optional(),
|
|
177
|
+
tag: z.string().optional(),
|
|
178
|
+
limit: z.number().optional(),
|
|
179
|
+
})
|
|
180
|
+
.loose(),
|
|
181
|
+
}),
|
|
182
|
+
z.object({
|
|
183
|
+
type: z.literal('grepScripts'),
|
|
184
|
+
sessionId: z.string(),
|
|
185
|
+
requestId: z.string(),
|
|
186
|
+
payload: z
|
|
187
|
+
.object({
|
|
188
|
+
pattern: z.string(),
|
|
189
|
+
root: z.string().optional(),
|
|
190
|
+
luaPattern: z.boolean().optional(),
|
|
191
|
+
caseSensitive: z.boolean().optional(),
|
|
192
|
+
limit: z.number().optional(),
|
|
193
|
+
})
|
|
194
|
+
.loose(),
|
|
195
|
+
}),
|
|
196
|
+
z.object({
|
|
197
|
+
type: z.literal('exportInstances'),
|
|
198
|
+
sessionId: z.string(),
|
|
199
|
+
requestId: z.string(),
|
|
200
|
+
payload: z.object({ paths: z.array(z.string()) }).loose(),
|
|
201
|
+
}),
|
|
202
|
+
z.object({
|
|
203
|
+
type: z.literal('importInstances'),
|
|
204
|
+
sessionId: z.string(),
|
|
205
|
+
requestId: z.string(),
|
|
206
|
+
payload: z.object({ data: z.string(), parentPath: z.string() }).loose(),
|
|
143
207
|
}),
|
|
144
208
|
z.object({
|
|
145
209
|
type: z.literal('queryLogs'),
|
|
146
210
|
sessionId: z.string(),
|
|
147
211
|
requestId: z.string(),
|
|
148
|
-
payload: z
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
212
|
+
payload: z
|
|
213
|
+
.object({
|
|
214
|
+
count: z.number().optional(),
|
|
215
|
+
direction: z.enum(['head', 'tail']).optional(),
|
|
216
|
+
levels: z.array(OutputLevelSchema).optional(),
|
|
217
|
+
includeInternal: z.boolean().optional(),
|
|
218
|
+
since: z.number().optional(),
|
|
219
|
+
groupRepeats: z.boolean().optional(),
|
|
220
|
+
})
|
|
221
|
+
.loose(),
|
|
154
222
|
}),
|
|
155
223
|
z.object({
|
|
156
224
|
type: z.literal('registerAction'),
|
|
157
225
|
sessionId: z.string(),
|
|
158
226
|
requestId: z.string(),
|
|
159
|
-
payload: z
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
227
|
+
payload: z
|
|
228
|
+
.object({
|
|
229
|
+
name: z.string(),
|
|
230
|
+
source: z.string(),
|
|
231
|
+
hash: z.string().optional(),
|
|
232
|
+
responseType: z.string().optional(),
|
|
233
|
+
})
|
|
234
|
+
.loose(),
|
|
165
235
|
}),
|
|
166
236
|
z.object({
|
|
167
237
|
type: z.literal('syncActions'),
|
|
168
238
|
sessionId: z.string(),
|
|
169
239
|
requestId: z.string(),
|
|
170
|
-
payload: z
|
|
171
|
-
|
|
172
|
-
|
|
240
|
+
payload: z
|
|
241
|
+
.object({
|
|
242
|
+
actions: z.record(z.string(), z.string()),
|
|
243
|
+
verbose: z.boolean().optional(),
|
|
244
|
+
})
|
|
245
|
+
.loose(),
|
|
246
|
+
}),
|
|
247
|
+
z.object({
|
|
248
|
+
type: z.literal('startPlaytest'),
|
|
249
|
+
sessionId: z.string(),
|
|
250
|
+
requestId: z.string(),
|
|
251
|
+
payload: z
|
|
252
|
+
.object({
|
|
253
|
+
mode: z.enum(['play', 'run']),
|
|
254
|
+
playtestId: z.string(),
|
|
255
|
+
bridgePort: z.number(),
|
|
256
|
+
instanceId: z.string(),
|
|
257
|
+
players: z.number().int().min(1).optional(),
|
|
258
|
+
})
|
|
259
|
+
.loose(),
|
|
260
|
+
}),
|
|
261
|
+
z.object({
|
|
262
|
+
type: z.literal('endPlaytest'),
|
|
263
|
+
sessionId: z.string(),
|
|
264
|
+
requestId: z.string(),
|
|
265
|
+
payload: z.object({}).loose(),
|
|
266
|
+
}),
|
|
267
|
+
z.object({
|
|
268
|
+
type: z.literal('runPlaytestScript'),
|
|
269
|
+
sessionId: z.string(),
|
|
270
|
+
requestId: z.string(),
|
|
271
|
+
payload: z
|
|
272
|
+
.object({
|
|
273
|
+
mode: z.enum(['play', 'run']),
|
|
274
|
+
script: z.string(),
|
|
275
|
+
runnerSource: z.string(),
|
|
276
|
+
timeoutSec: z.number(),
|
|
277
|
+
args: z.array(z.string()).optional(),
|
|
278
|
+
})
|
|
279
|
+
.loose(),
|
|
173
280
|
}),
|
|
174
281
|
z.object({
|
|
175
282
|
type: z.literal('error'),
|
|
176
283
|
sessionId: z.string(),
|
|
177
284
|
requestId: z.string().optional(),
|
|
178
|
-
payload: z
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
285
|
+
payload: z
|
|
286
|
+
.object({
|
|
287
|
+
code: ErrorCodeSchema,
|
|
288
|
+
message: z.string(),
|
|
289
|
+
details: z.unknown().optional(),
|
|
290
|
+
})
|
|
291
|
+
.loose(),
|
|
183
292
|
}),
|
|
184
293
|
]);
|
|
185
294
|
|
|
@@ -191,6 +300,7 @@ const HostProtocolMessageSchema = z.discriminatedUnion('type', [
|
|
|
191
300
|
requestId: z.string(),
|
|
192
301
|
targetSessionId: z.string(),
|
|
193
302
|
action: ServerMessageSchema,
|
|
303
|
+
timeoutMs: z.number().optional(),
|
|
194
304
|
}),
|
|
195
305
|
z.object({
|
|
196
306
|
type: z.literal('list-sessions'),
|
|
@@ -209,6 +319,7 @@ const HostProtocolMessageSchema = z.discriminatedUnion('type', [
|
|
|
209
319
|
type: z.literal('list-sessions-response'),
|
|
210
320
|
requestId: z.string(),
|
|
211
321
|
sessions: z.array(LooseObjectSchema),
|
|
322
|
+
protocolVersion: z.number().optional(),
|
|
212
323
|
}),
|
|
213
324
|
z.object({
|
|
214
325
|
type: z.literal('list-instances-response'),
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Every plugin registers as `Edit`, since it cannot see a playtest from the
|
|
3
|
+
* edit DataModel. The bridge can: a playtest's server and client connect as
|
|
4
|
+
* sessions of the same instance. Their place is a copy named "Game", so
|
|
5
|
+
* they take the edit session's place name too.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import type { SessionInfo, StudioState } from '../types.js';
|
|
9
|
+
|
|
10
|
+
export function annotateInstanceState(sessions: SessionInfo[]): SessionInfo[] {
|
|
11
|
+
const byInstance = new Map<string, SessionInfo[]>();
|
|
12
|
+
for (const session of sessions) {
|
|
13
|
+
const group = byInstance.get(session.instanceId) ?? [];
|
|
14
|
+
group.push(session);
|
|
15
|
+
byInstance.set(session.instanceId, group);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
return sessions.map((session) => {
|
|
19
|
+
const group = byInstance.get(session.instanceId)!;
|
|
20
|
+
const hasServer = group.some((s) => s.context === 'server');
|
|
21
|
+
const hasClient = group.some((s) => s.context === 'client');
|
|
22
|
+
const edit = group.find((s) => s.context === 'edit');
|
|
23
|
+
|
|
24
|
+
const state: StudioState = hasServer
|
|
25
|
+
? hasClient
|
|
26
|
+
? 'Play'
|
|
27
|
+
: 'Run'
|
|
28
|
+
: session.state;
|
|
29
|
+
const placeName =
|
|
30
|
+
session.context !== 'edit' && edit ? edit.placeName : session.placeName;
|
|
31
|
+
|
|
32
|
+
return { ...session, state, placeName };
|
|
33
|
+
});
|
|
34
|
+
}
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
import { EventEmitter } from 'events';
|
|
8
8
|
import { WebSocket } from 'ws';
|
|
9
|
+
import { MAX_MESSAGE_BYTES } from '../../server/web-socket-protocol.js';
|
|
9
10
|
|
|
10
11
|
export interface TransportClientOptions {
|
|
11
12
|
/** Maximum number of reconnection attempts. Default: 10. */
|
|
@@ -98,7 +99,7 @@ export class TransportClient extends EventEmitter {
|
|
|
98
99
|
|
|
99
100
|
private _connectInternalAsync(): Promise<void> {
|
|
100
101
|
return new Promise<void>((resolve, reject) => {
|
|
101
|
-
const ws = new WebSocket(this._url);
|
|
102
|
+
const ws = new WebSocket(this._url, { maxPayload: MAX_MESSAGE_BYTES });
|
|
102
103
|
this._ws = ws;
|
|
103
104
|
|
|
104
105
|
const onOpen = () => {
|
|
@@ -13,6 +13,7 @@ import {
|
|
|
13
13
|
} from 'http';
|
|
14
14
|
import type { Socket } from 'net';
|
|
15
15
|
import { WebSocketServer, WebSocket } from 'ws';
|
|
16
|
+
import { MAX_MESSAGE_BYTES } from '../../server/web-socket-protocol.js';
|
|
16
17
|
import { URL } from 'url';
|
|
17
18
|
|
|
18
19
|
export interface TransportServerOptions {
|
|
@@ -67,7 +68,10 @@ export class TransportServer {
|
|
|
67
68
|
});
|
|
68
69
|
});
|
|
69
70
|
|
|
70
|
-
this._wss = new WebSocketServer({
|
|
71
|
+
this._wss = new WebSocketServer({
|
|
72
|
+
noServer: true,
|
|
73
|
+
maxPayload: MAX_MESSAGE_BYTES,
|
|
74
|
+
});
|
|
71
75
|
|
|
72
76
|
this._httpServer.on('upgrade', (request, socket, head) => {
|
|
73
77
|
const pathname = this._parsePath(request);
|
package/src/bridge/types.ts
CHANGED
|
@@ -12,6 +12,7 @@ import type {
|
|
|
12
12
|
DataModelInstance,
|
|
13
13
|
OutputLevel,
|
|
14
14
|
SerializedReturnValue,
|
|
15
|
+
PlaytestMode,
|
|
15
16
|
} from '../server/web-socket-protocol.js';
|
|
16
17
|
|
|
17
18
|
// Re-export protocol types used in the public API
|
|
@@ -21,6 +22,7 @@ export type {
|
|
|
21
22
|
DataModelInstance,
|
|
22
23
|
OutputLevel,
|
|
23
24
|
SerializedReturnValue,
|
|
25
|
+
PlaytestMode,
|
|
24
26
|
};
|
|
25
27
|
|
|
26
28
|
export type SessionContext = 'edit' | 'client' | 'server';
|
|
@@ -35,6 +37,10 @@ export interface SessionInfo {
|
|
|
35
37
|
capabilities: Capability[];
|
|
36
38
|
connectedAt: Date;
|
|
37
39
|
origin: SessionOrigin;
|
|
40
|
+
/** Set on sessions of a Studio that `process run` launched. */
|
|
41
|
+
launchId?: string;
|
|
42
|
+
/** The player of a multiplayer test client session. */
|
|
43
|
+
playerName?: string;
|
|
38
44
|
context: SessionContext;
|
|
39
45
|
instanceId: string;
|
|
40
46
|
placeId: number;
|
|
@@ -54,10 +60,11 @@ export interface ExecResult {
|
|
|
54
60
|
success: boolean;
|
|
55
61
|
output: Array<{ level: OutputLevel; body: string }>;
|
|
56
62
|
error?: string;
|
|
63
|
+
/** Where a runtime error was thrown. */
|
|
64
|
+
traceback?: string;
|
|
57
65
|
/**
|
|
58
66
|
* Everything the script returned, in order. Absent when the plugin reported
|
|
59
|
-
* no return channel at all (
|
|
60
|
-
* a return) — distinct from `[]`, which means it returned nothing.
|
|
67
|
+
* no return channel at all (a run that never reached a return) — distinct from `[]`, which means it returned nothing.
|
|
61
68
|
*/
|
|
62
69
|
returnValues?: SerializedReturnValue[];
|
|
63
70
|
}
|
|
@@ -67,6 +74,10 @@ export interface StateResult {
|
|
|
67
74
|
placeId: number;
|
|
68
75
|
placeName: string;
|
|
69
76
|
gameId: number;
|
|
77
|
+
/** The camera's viewport in pixels. Absent without a camera. */
|
|
78
|
+
viewportSize?: [number, number];
|
|
79
|
+
/** Studio's version. Absent from older plugins. */
|
|
80
|
+
studioVersion?: string;
|
|
70
81
|
}
|
|
71
82
|
|
|
72
83
|
export interface ScreenshotResult {
|
|
@@ -80,6 +91,10 @@ export interface LogEntry {
|
|
|
80
91
|
level: OutputLevel;
|
|
81
92
|
body: string;
|
|
82
93
|
timestamp: number;
|
|
94
|
+
/** When grouped: how many identical entries in a row this stands for. */
|
|
95
|
+
repeats?: number;
|
|
96
|
+
/** When grouped: when the last of the repeats was logged. */
|
|
97
|
+
lastTimestamp?: number;
|
|
83
98
|
}
|
|
84
99
|
|
|
85
100
|
export interface LogsResult {
|
|
@@ -92,11 +107,25 @@ export interface DataModelResult {
|
|
|
92
107
|
instance: DataModelInstance;
|
|
93
108
|
}
|
|
94
109
|
|
|
110
|
+
export interface ExportInstancesResult {
|
|
111
|
+
/** The binary model (.rbxm), base64-encoded. */
|
|
112
|
+
data: string;
|
|
113
|
+
paths: string[];
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
export interface ImportInstancesResult {
|
|
117
|
+
paths: string[];
|
|
118
|
+
}
|
|
119
|
+
|
|
95
120
|
export interface LogOptions {
|
|
96
121
|
count?: number;
|
|
97
122
|
direction?: 'head' | 'tail';
|
|
98
123
|
levels?: OutputLevel[];
|
|
99
124
|
includeInternal?: boolean;
|
|
125
|
+
/** Only entries logged at or after this time, in epoch seconds. */
|
|
126
|
+
since?: number;
|
|
127
|
+
/** Collapse identical consecutive entries, before `count` applies. */
|
|
128
|
+
groupRepeats?: boolean;
|
|
100
129
|
}
|
|
101
130
|
|
|
102
131
|
export interface QueryDataModelOptions {
|
|
@@ -108,6 +137,22 @@ export interface QueryDataModelOptions {
|
|
|
108
137
|
listServices?: boolean;
|
|
109
138
|
}
|
|
110
139
|
|
|
140
|
+
export interface PlaytestEndResult {
|
|
141
|
+
playtestId: string;
|
|
142
|
+
/** False when StudioTestService refused to start the playtest. */
|
|
143
|
+
success: boolean;
|
|
144
|
+
error?: string;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
export interface EndPlaytestResult {
|
|
148
|
+
/** Absent when the playtest was not started by studio-bridge. */
|
|
149
|
+
playtestId?: string;
|
|
150
|
+
/** The mode the playtest ran in. Absent from older plugins. */
|
|
151
|
+
mode?: PlaytestMode;
|
|
152
|
+
/** How many players a multiplayer test started with. */
|
|
153
|
+
players?: number;
|
|
154
|
+
}
|
|
155
|
+
|
|
111
156
|
export interface LogFollowOptions {
|
|
112
157
|
levels?: OutputLevel[];
|
|
113
158
|
}
|
|
@@ -6,8 +6,14 @@
|
|
|
6
6
|
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
7
7
|
import { buildYargsCommand } from './cli-command-adapter.js';
|
|
8
8
|
import { defineCommand } from '../../commands/framework/define-command.js';
|
|
9
|
+
import { arg } from '../../commands/framework/arg-builder.js';
|
|
9
10
|
import type { CliLifecycleProvider } from './cli-command-adapter.js';
|
|
10
11
|
|
|
12
|
+
vi.mock('../cli-output-context.js', () => ({
|
|
13
|
+
getWarnings: () => [],
|
|
14
|
+
warnIfPluginStaleAsync: vi.fn().mockResolvedValue(undefined),
|
|
15
|
+
}));
|
|
16
|
+
|
|
11
17
|
vi.mock('fs', async (importOriginal) => {
|
|
12
18
|
const actual = await importOriginal<typeof import('fs')>();
|
|
13
19
|
return {
|
|
@@ -29,6 +35,7 @@ function createMockConnection() {
|
|
|
29
35
|
resolveSessionAsync: vi.fn().mockResolvedValue(session),
|
|
30
36
|
disconnectAsync: vi.fn().mockResolvedValue(undefined),
|
|
31
37
|
listSessions: vi.fn().mockReturnValue([]),
|
|
38
|
+
listInstances: vi.fn().mockReturnValue([]),
|
|
32
39
|
} as any,
|
|
33
40
|
session,
|
|
34
41
|
};
|
|
@@ -301,6 +308,27 @@ describe('handler — standalone scope', () => {
|
|
|
301
308
|
expect(lifecycle.connectAsync).not.toHaveBeenCalled();
|
|
302
309
|
expect(output[0]).toBe('done');
|
|
303
310
|
});
|
|
311
|
+
|
|
312
|
+
it('hands everything after -- to a passthrough arg as strings', async () => {
|
|
313
|
+
const handler = vi.fn(async () => ({ summary: 'done' }));
|
|
314
|
+
const cmd = defineCommand({
|
|
315
|
+
group: null,
|
|
316
|
+
name: 'standalone',
|
|
317
|
+
description: 'Standalone test',
|
|
318
|
+
category: 'infrastructure',
|
|
319
|
+
safety: 'none',
|
|
320
|
+
scope: 'standalone',
|
|
321
|
+
args: { scriptArgs: arg.passthrough({ description: 'Script args' }) },
|
|
322
|
+
handler,
|
|
323
|
+
});
|
|
324
|
+
const module = buildYargsCommand(cmd);
|
|
325
|
+
|
|
326
|
+
await captureOutput(async () => {
|
|
327
|
+
await (module.handler as any)({ format: 'text', '--': ['Player1', 3] });
|
|
328
|
+
});
|
|
329
|
+
|
|
330
|
+
expect(handler).toHaveBeenCalledWith({ scriptArgs: ['Player1', '3'] });
|
|
331
|
+
});
|
|
304
332
|
});
|
|
305
333
|
|
|
306
334
|
describe('handler — connection lifecycle', () => {
|