diff --git a/src/content/docs/sandbox/api/commands.mdx b/src/content/docs/sandbox/api/commands.mdx index c8aacaea1d39c00..867b6c167a4fe78 100644 --- a/src/content/docs/sandbox/api/commands.mdx +++ b/src/content/docs/sandbox/api/commands.mdx @@ -106,6 +106,7 @@ const process = await sandbox.startProcess(command: string, options?: ProcessOpt - `getLogs()` - Get accumulated logs - `waitForPort()` - Wait for process to listen on a port - `waitForLog()` - Wait for pattern in process output +- `waitForExit()` - Wait for process to exit and get exit code ``` @@ -316,6 +317,51 @@ await server.waitForLog('Ready', 30000); - `ProcessReadyTimeoutError` - If pattern is not found within timeout - `ProcessExitedBeforeReadyError` - If process exits before pattern appears +### `process.waitForExit()` + +Wait for a process to exit and retrieve its exit code. + +```ts +const result = await process.waitForExit(timeout?: number): Promise +``` + +**Parameters**: +- `timeout` - Maximum wait time in milliseconds (optional) + +**Returns**: `Promise` with: +- `exitCode` - The process exit code (0 for success, non-zero for errors) + + +``` +const build = await sandbox.startProcess('npm run build'); + +// Wait for build to complete +const result = await build.waitForExit(); + +if (result.exitCode === 0) { + console.log('Build succeeded'); +} else { + console.error('Build failed with exit code:', result.exitCode); + + // Get logs to see what went wrong + const logs = await build.getLogs(); + console.error('Build logs:', logs); +} + +// With timeout +const test = await sandbox.startProcess('npm test'); +try { + const result = await test.waitForExit(60000); // 60 second timeout + console.log('Tests completed with exit code:', result.exitCode); +} catch (error) { + console.error('Tests timed out after 60 seconds'); +} +``` + + +**Throws**: +- `ProcessReadyTimeoutError` - If process does not exit within timeout + ## Related resources - [Background processes guide](/sandbox/guides/background-processes/) - Managing long-running processes diff --git a/src/content/docs/sandbox/guides/background-processes.mdx b/src/content/docs/sandbox/guides/background-processes.mdx index a523eba829da408..47f1ca057a06db9 100644 --- a/src/content/docs/sandbox/guides/background-processes.mdx +++ b/src/content/docs/sandbox/guides/background-processes.mdx @@ -110,6 +110,49 @@ console.log('Server is ready:', result.line); ``` +## Wait for process completion + +For short-lived processes like builds or tests, wait for the process to exit and check the exit code: + + +``` +const build = await sandbox.startProcess('npm run build'); + +// Wait for build to complete +const result = await build.waitForExit(); + +if (result.exitCode === 0) { + console.log('Build succeeded'); + + // Get the output + const logs = await sandbox.getProcessLogs(build.id); + console.log('Build output:', logs); +} else { + console.error('Build failed with exit code:', result.exitCode); +} +``` + + +With a timeout to prevent waiting indefinitely: + + +``` +const test = await sandbox.startProcess('npm test'); + +try { + // Wait up to 60 seconds for tests to complete + const result = await test.waitForExit(60000); + + console.log('Tests completed with exit code:', result.exitCode); +} catch (error) { + if (error.code === 'PROCESS_READY_TIMEOUT') { + console.error('Tests timed out after 60 seconds'); + await sandbox.killProcess(test.id); + } +} +``` + + ## Monitor process logs Stream logs in real-time: @@ -226,6 +269,7 @@ When using `keepAlive: true`, containers will not automatically timeout. You **m ## Best practices - **Wait for readiness** - Use `waitForPort()` or `waitForLog()` to detect when services are ready +- **Wait for completion** - Use `waitForExit()` for build processes and scripts to check exit codes - **Clean up** - Always stop processes when done - **Handle failures** - Monitor logs for errors and restart if needed - **Use try/finally** - Ensure cleanup happens even on errors