Skip to content

Commit 39dd330

Browse files
committed
fix(browser): wait up to 30 s for the browser to start
Edge's first start on a new Linux machine (the Ubuntu runner) took over 20 s, past the 10 s the daemon waited; a start that works takes under a second either way. CI starts Edge once before the tests instead of the diagnostic step.
1 parent 015d709 commit 39dd330

3 files changed

Lines changed: 12 additions & 17 deletions

File tree

‎.github/workflows/ci.yml‎

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -64,22 +64,16 @@ jobs:
6464
sudo chmod 4755 "$helper"
6565
fi
6666
done
67-
- name: Browser start (diagnostic)
67+
# Edge's first start on a fresh runner took over 20 s, and the next
68+
# ones under one. Starting it once keeps the tests off that wait.
69+
- name: Start Edge once
6870
if: runner.os == 'Linux'
69-
continue-on-error: true
7071
run: |
71-
ls -l /usr/bin/microsoft-edge* /usr/bin/google-chrome* /opt/microsoft/msedge/msedge-sandbox /opt/google/chrome/chrome-sandbox || true
72-
sysctl kernel.apparmor_restrict_unprivileged_userns kernel.unprivileged_userns_clone || true
73-
for browser in microsoft-edge-stable google-chrome-stable; do
74-
echo "== $browser"
75-
dir=$(mktemp -d)
76-
start=$(date +%s)
77-
timeout 20 "$browser" --headless=new --remote-debugging-port=0 --no-first-run --no-default-browser-check --disable-extensions --user-data-dir="$dir" about:blank > "$dir.out" 2>&1 &
78-
for i in $(seq 1 40); do [ -f "$dir/DevToolsActivePort" ] && break; sleep 0.5; done
79-
echo "after $(( $(date +%s) - start )) s:"; cat "$dir/DevToolsActivePort" 2>/dev/null || echo "no port file"
80-
wait
81-
head -20 "$dir.out"
82-
done
72+
dir=$(mktemp -d)
73+
microsoft-edge-stable --headless=new --remote-debugging-port=0 --no-first-run \
74+
--user-data-dir="$dir" about:blank > /dev/null 2>&1 &
75+
for i in $(seq 1 120); do [ -f "$dir/DevToolsActivePort" ] && break; sleep 0.5; done
76+
kill $! || true
8377
- run: cargo test
8478

8579
app:

‎crates/botloftd/src/browser/launch.rs‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,9 @@ use tracing::debug;
1212
use super::BrowserError;
1313
use crate::platform::{self, ProcessJob};
1414

15-
/// How long Edge may take to write `DevToolsActivePort`.
16-
const START_TIMEOUT: Duration = Duration::from_secs(10);
15+
/// How long the browser may take to write `DevToolsActivePort`. Usually
16+
/// under a second; Edge's first start on a new Linux machine took over 20.
17+
const START_TIMEOUT: Duration = Duration::from_secs(30);
1718
const PORT_FILE: &str = "DevToolsActivePort";
1819
/// Longest stderr line passed on as the reason a browser stopped.
1920
const REASON_MAX: usize = 300;

‎docs/spec.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1185,7 +1185,7 @@ Cada bot tem um navegador próprio para pesquisar e usar sites: um Microsoft Edg
11851185
### 21.2 Processo
11861186

11871187
- Sobe na primeira tool `browser_*` do bot e fica aberto enquanto ele o usa. Um processo por bot.
1188-
- Comando: `msedge.exe --headless=new --remote-debugging-port=0 --user-data-dir=<home>\browsers\<bot_id> --no-first-run --no-default-browser-check --mute-audio --disable-extensions --disable-sync about:blank`. Sem `--disable-extensions`, um perfil novo recebe as extensões instaladas para todo o computador, e elas abrem abas próprias no navegador do bot (visto com o Edge 154). Com a porta 0, o Edge escolhe uma porta livre em 127.0.0.1 e a escreve com o caminho do WebSocket em `DevToolsActivePort`, na pasta do perfil (visto com o Edge 154); o daemon apaga o arquivo antigo antes de subir e espera o novo por até 10 s.
1188+
- Comando: `msedge.exe --headless=new --remote-debugging-port=0 --user-data-dir=<home>\browsers\<bot_id> --no-first-run --no-default-browser-check --mute-audio --disable-extensions --disable-sync about:blank`. Sem `--disable-extensions`, um perfil novo recebe as extensões instaladas para todo o computador, e elas abrem abas próprias no navegador do bot (visto com o Edge 154). Com a porta 0, o Edge escolhe uma porta livre em 127.0.0.1 e a escreve com o caminho do WebSocket em `DevToolsActivePort`, na pasta do perfil (visto com o Edge 154); o daemon apaga o arquivo antigo antes de subir e espera o novo por até 30 s. Costuma levar menos de 1 s, mas a primeira abertura do Edge num Linux novo (o runner Ubuntu do CI) passou de 20 s. Se o navegador fecha ou não fica pronto, o erro traz a linha do stderr dele que melhor explica (uma falha de sandbox ou de namespace, senão a primeira fatal, senão a última); o stderr não vai para o log.
11891189
- Como o `claude.exe`: sem janela (`CREATE_NO_WINDOW`), num Job Object próprio com `KILL_ON_JOB_CLOSE` (morre junto com o daemon) e com o ambiente padrão do usuário (7.4).
11901190
- Achar o Edge: `[browser] path`, senão `msedge.exe` em `%ProgramFiles(x86)%` e `%ProgramFiles%` (`Microsoft\Edge\Application`) e em `%LOCALAPPDATA%`. No macOS, Edge, Chrome ou Chromium em `/Applications` e em `~/Applications`; no Linux, o primeiro de `microsoft-edge-stable`, `microsoft-edge`, `google-chrome-stable`, `google-chrome`, `chromium` e `chromium-browser` no `PATH` do ambiente do dono (14.1). Fora do Windows, o grupo de processos faz o papel do Job Object (14.1). Sem navegador, a tool responde ao bot que ele não está disponível, e o painel diz o mesmo.
11911191
- **Perfil:** `<home>\browsers\<bot_id>\`, fora da pasta do bot e em `%LOCALAPPDATA%` (5): cookies e sessões são do navegador, não dos arquivos que o bot faz. O perfil fica entre aberturas, então um login feito continua valendo. Arquivar ou excluir o bot fecha o navegador e apaga o perfil.

0 commit comments

Comments
 (0)