| 274 | |
| 275 | /** Wait until the shell finishes, `pattern` matches its output, or `ms` elapses. */ |
| 276 | export function waitForShell(sh: BgShell, ms: number, pattern?: RegExp): Promise<void> { |
| 277 | return new Promise((resolve) => { |
| 278 | const deadline = Date.now() + Math.max(0, ms); |
| 279 | const tick = () => { |
| 280 | sh.pump?.(); |
| 281 | if (sh.done || (pattern && pattern.test(sh.output)) || Date.now() >= deadline) return resolve(); |
| 282 | setTimeout(tick, 100); |
| 283 | }; |
| 284 | tick(); |
| 285 | }); |
| 286 | } |
| 287 | |
| 288 | /** |
| 289 | * Render a shell's state. Header + footer carry metadata (pid, timings, |