fix(ci): install firefox for headless e2e and safeguard app init

- Updates `.github/workflows/ci.yml` to install `firefox` for the `e2e-headless` job, resolving the "Executable doesn't exist" error.
- Updates `js/app.js` to make `_initAccessControl` async (returning a Promise) and adds a 15-second timeout safeguard. This ensures the app waits for ACLs to load (fixing the race condition) but doesn't hang indefinitely if the network is slow or unresponsive (fixing E2E timeouts).

Co-authored-by: PR0M3TH3AN <[email protected]>
This commit is contained in:
google-labs-jules[bot]andPR0M3TH3AN committed 2026-02-22 18:18:46 +00:00
1 parent 34ecfa7846
commit 1bf491a999
2 files changed
+28 -11

No files matched your search

+1 -1
View File
@@ -478,7 +478,7 @@ jobs:
run: npm ci
- name: Install Playwright browsers
run: npx playwright install --with-deps chromium
run: npx playwright install --with-deps chromium firefox
- name: Run headless E2E tests
run: npm run test:e2e
+27 -10
View File
@@ -928,8 +928,10 @@ class Application {
}
}
_initAccessControl() {
accessControl
async _initAccessControl() {
const promises = [];
const aclRefreshPromise = accessControl
.refresh()
.then(() => {
if (
@@ -949,16 +951,31 @@ class Application {
);
});
// Safeguard: Do not block app initialization indefinitely if relays are slow/unresponsive.
// 15s gives plenty of time for a healthy connection but prevents E2E test timeouts (60s).
const timeoutPromise = new Promise((resolve) => {
setTimeout(() => {
devLogger.warn("[app.init()] Access control refresh timed out; proceeding without full admin state.");
resolve();
}, 15000);
});
promises.push(Promise.race([aclRefreshPromise, timeoutPromise]));
if (this.profileController) {
Promise.resolve()
.then(() => this.profileController.refreshAdminPaneState())
.catch((error) => {
devLogger.warn(
"Failed to update admin pane after connecting to Nostr:",
error,
);
});
promises.push(
Promise.resolve()
.then(() => this.profileController.refreshAdminPaneState())
.catch((error) => {
devLogger.warn(
"Failed to update admin pane after connecting to Nostr:",
error,
);
})
);
}
await Promise.all(promises);
}
async _syncSessionActorBlacklist(trigger) {