chore: dev-stack switches, shared e2e harness, and desktop shell rules

- `LIVE_RELOAD=false npm run dev` keeps the renderer alive across a machine
  suspend; the reload client otherwise destroys the session under test.
- `dev-peer.sh` plus a separate userdata dir runs a second local peer.
- `tools/voice-probe.js` samples peer state and RTP counters from a live
  window, persisting to localStorage so a renderer reload cannot erase it.
- e2e helpers for voice pairs, peer-role election, and a TURN relay.
- Electron single-instance and dev-client-load decisions move into rules
  files with colocated specs.
This commit is contained in:
2026-08-14 03:19:29 +02:00
parent d71e3a98da
commit e49b3ec112
41 changed files with 35947 additions and 50 deletions
@@ -0,0 +1,516 @@
{
"stats": {
"startTime": "2026-08-12T10:58:09.830Z",
"duration": 804598.4550000001,
"expected": 65,
"skipped": 0,
"unexpected": 0,
"flaky": 0
},
"failures": [],
"timeouts": [],
"slow": [
{
"title": "8 users with different signal configs can voice, mute, deafen, and chat concurrently",
"file": "voice/mixed-signal-config-voice.spec.ts",
"status": "passed",
"duration": 128215,
"error": null,
"errors": [],
"timeoutHint": false
},
{
"title": "keeps 8 users on 2 signal apis while voice, mute, and deafen stay consistent for 20+ seconds",
"file": "voice/multi-signal-eight-user-voice.spec.ts",
"status": "passed",
"duration": 125136,
"error": null,
"errors": [],
"timeoutHint": false
},
{
"title": "gives a new user a blank slate and restores only that user local data after account switches",
"file": "auth/user-session-data-isolation.spec.ts",
"status": "passed",
"duration": 53448,
"error": null,
"errors": [],
"timeoutHint": false
},
{
"title": "shows per-server channel lists on first saved-server click",
"file": "chat/chat-message-features.spec.ts",
"status": "passed",
"duration": 33665,
"error": null,
"errors": [],
"timeoutHint": false
},
{
"title": "syncs messages between same-user devices and late-joining users after offline gaps",
"file": "chat/multi-client-chat-sync.spec.ts",
"status": "passed",
"duration": 30290,
"error": null,
"errors": [],
"timeoutHint": false
}
],
"all": [
{
"title": "unwraps nested login returnUrl chains after successful login",
"file": "auth/login-return-url.spec.ts",
"status": "passed",
"duration": 3506,
"timeoutHint": false
},
{
"title": "redirects unauthenticated /servers visits to login and returns there after login",
"file": "auth/login-return-url.spec.ts",
"status": "passed",
"duration": 3088,
"timeoutHint": false
},
{
"title": "lets a returning user log back in after an expired session redirect",
"file": "auth/login-return-url.spec.ts",
"status": "passed",
"duration": 2811,
"timeoutHint": false
},
{
"title": "covers identity, chat sync, typing exclusion, and voice exclusivity",
"file": "auth/multi-device-session.spec.ts",
"status": "passed",
"duration": 8640,
"timeoutHint": false
},
{
"title": "auto-provisions a foreign signal server when a new endpoint is added",
"file": "auth/multi-signal-server-auth.spec.ts",
"status": "passed",
"duration": 3836,
"timeoutHint": false
},
{
"title": "does not redirect to authorize login after a foreign server goes offline",
"file": "auth/offline-signal-server-no-login-loop.spec.ts",
"status": "passed",
"duration": 3727,
"timeoutHint": false
},
{
"title": "preserves a user saved rooms and local history across app restarts",
"file": "auth/user-session-data-isolation.spec.ts",
"status": "passed",
"duration": 19725,
"timeoutHint": false
},
{
"title": "gives a new user a blank slate and restores only that user local data after account switches",
"file": "auth/user-session-data-isolation.spec.ts",
"status": "passed",
"duration": 53448,
"timeoutHint": false
},
{
"title": "each caption-less attachment keeps its own message bubble and preview",
"file": "chat/attachment-only-message-grouping.spec.ts",
"status": "passed",
"duration": 2507,
"timeoutHint": false
},
{
"title": "shows per-server channel lists on first saved-server click",
"file": "chat/chat-message-features.spec.ts",
"status": "passed",
"duration": 33665,
"timeoutHint": false
},
{
"title": "shows local room history on first saved-server click",
"file": "chat/chat-message-features.spec.ts",
"status": "passed",
"duration": 3598,
"timeoutHint": false
},
{
"title": "syncs messages in a newly created text channel",
"file": "chat/chat-message-features.spec.ts",
"status": "passed",
"duration": 19613,
"timeoutHint": false
},
{
"title": "shows typing indicators to other users",
"file": "chat/chat-message-features.spec.ts",
"status": "passed",
"duration": 4090,
"timeoutHint": false
},
{
"title": "edits and removes messages for both users",
"file": "chat/chat-message-features.spec.ts",
"status": "passed",
"duration": 5534,
"timeoutHint": false
},
{
"title": "syncs image and file attachments between users",
"file": "chat/chat-message-features.spec.ts",
"status": "passed",
"duration": 4442,
"timeoutHint": false
},
{
"title": "syncs multi-chunk image attachments byte-identical between users",
"file": "chat/chat-message-features.spec.ts",
"status": "passed",
"duration": 4369,
"timeoutHint": false
},
{
"title": "renders link embeds for shared links",
"file": "chat/chat-message-features.spec.ts",
"status": "passed",
"duration": 4303,
"timeoutHint": false
},
{
"title": "sends KLIPY GIF messages with mocked API responses",
"file": "chat/chat-message-features.spec.ts",
"status": "passed",
"duration": 4610,
"timeoutHint": false
},
{
"title": "a second user on the same client does not inherit the first user library",
"file": "chat/custom-emoji-user-binding.spec.ts",
"status": "passed",
"duration": 3929,
"timeoutHint": false
},
{
"title": "opens a DM from a user card and queues messages while offline",
"file": "chat/dm-flow.spec.ts",
"status": "passed",
"duration": 3882,
"timeoutHint": false
},
{
"title": "delivers a live DM to the recipient conversation",
"file": "chat/dm-flow.spec.ts",
"status": "passed",
"duration": 4024,
"timeoutHint": false
},
{
"title": "shows friend and message actions on the search people list",
"file": "chat/dm-flow.spec.ts",
"status": "passed",
"duration": 3849,
"timeoutHint": false
},
{
"title": "browser receiver can request and download a generic file above the auto-save cap",
"file": "chat/large-generic-file-transfer.spec.ts",
"status": "passed",
"duration": 5690,
"timeoutHint": false
},
{
"title": "remembers sent image and file across a page reload with no peer connected",
"file": "chat/local-attachment-persistence.spec.ts",
"status": "passed",
"duration": 2793,
"timeoutHint": false
},
{
"title": "syncs messages between same-user devices and late-joining users after offline gaps",
"file": "chat/multi-client-chat-sync.spec.ts",
"status": "passed",
"duration": 30290,
"timeoutHint": false
},
{
"title": "only the uploading device claims \"Shared from your device\"; the second same-user device can request it",
"file": "chat/multi-device-attachment-sharing.spec.ts",
"status": "passed",
"duration": 4333,
"timeoutHint": false
},
{
"title": "relays file-announce metadata to a sibling device that is already online during upload",
"file": "chat/multi-device-attachment-sharing.spec.ts",
"status": "passed",
"duration": 4266,
"timeoutHint": false
},
{
"title": "groups three images in one message bubble with a visible grid",
"file": "chat/multi-image-gallery.spec.ts",
"status": "passed",
"duration": 2294,
"timeoutHint": false
},
{
"title": "shows desktop notifications and unread badges for inactive channels",
"file": "chat/notifications.spec.ts",
"status": "passed",
"duration": 4758,
"timeoutHint": false
},
{
"title": "keeps unread badges visible when a muted channel suppresses desktop popups",
"file": "chat/notifications.spec.ts",
"status": "passed",
"duration": 20875,
"timeoutHint": false
},
{
"title": "syncs avatar changes for online and late-joining users and persists after restart",
"file": "chat/profile-avatar-sync.spec.ts",
"status": "passed",
"duration": 9605,
"timeoutHint": false
},
{
"title": "syncs display name and description changes for online and late-joining users and persists after restart",
"file": "chat/profile-avatar-sync.spec.ts",
"status": "passed",
"duration": 11864,
"timeoutHint": false
},
{
"title": "loads the chat-server image for online, late-joining, restarted, and discovery users",
"file": "chat/server-icon-sync.spec.ts",
"status": "passed",
"duration": 14204,
"timeoutHint": false
},
{
"title": "ships a launcher icon and splash for every required density",
"file": "mobile/android-app-icon.spec.ts",
"status": "passed",
"duration": 1,
"timeoutHint": false
},
{
"title": "replaces every stock Capacitor placeholder with the brand asset",
"file": "mobile/android-app-icon.spec.ts",
"status": "passed",
"duration": 2,
"timeoutHint": false
},
{
"title": "uses the brand purple as the adaptive-icon background",
"file": "mobile/android-app-icon.spec.ts",
"status": "passed",
"duration": 1,
"timeoutHint": false
},
{
"title": "renders the brand mark (white cat on a purple disc) in the launcher bitmap",
"file": "mobile/android-app-icon.spec.ts",
"status": "passed",
"duration": 13,
"timeoutHint": false
},
{
"title": "renders the splash art as the brand mark centred on a purple field",
"file": "mobile/android-app-icon.spec.ts",
"status": "passed",
"duration": 7,
"timeoutHint": false
},
{
"title": "insets the adaptive foreground so launcher masks do not clip the cat face",
"file": "mobile/android-app-icon.spec.ts",
"status": "passed",
"duration": 3,
"timeoutHint": false
},
{
"title": "greets a signed-out mobile visitor on /dashboard with the login screen",
"file": "mobile/mobile-login-on-startup.spec.ts",
"status": "passed",
"duration": 1217,
"timeoutHint": false
},
{
"title": "greets a signed-out mobile visitor on the app root with the login screen",
"file": "mobile/mobile-login-on-startup.spec.ts",
"status": "passed",
"duration": 1181,
"timeoutHint": false
},
{
"title": "exposes logout in the settings menu on mobile viewports",
"file": "mobile/mobile-settings-logout.spec.ts",
"status": "passed",
"duration": 1704,
"timeoutHint": false
},
{
"title": "runs chat, embed, soundboard, and profile APIs between two users",
"file": "plugins/plugin-api-two-users.spec.ts",
"status": "passed",
"duration": 27382,
"timeoutHint": false
},
{
"title": "installs, grants, activates, and logs an all-API test plugin",
"file": "plugins/plugin-manager-ui.spec.ts",
"status": "passed",
"duration": 4564,
"timeoutHint": false
},
{
"title": "covers plugin requirement, event, data, and websocket APIs with the fixture plugin",
"file": "plugins/plugin-support-api.spec.ts",
"status": "passed",
"duration": 1913,
"timeoutHint": false
},
{
"title": "single user screen share: video and audio flow to receiver, voice audio continues",
"file": "screen-share/screen-share.spec.ts",
"status": "passed",
"duration": 15375,
"timeoutHint": false
},
{
"title": "multiple users screen share simultaneously",
"file": "screen-share/screen-share.spec.ts",
"status": "passed",
"duration": 11093,
"timeoutHint": false
},
{
"title": "screen share connection stays stable for 10+ seconds",
"file": "screen-share/screen-share.spec.ts",
"status": "passed",
"duration": 23371,
"timeoutHint": false
},
{
"title": "a fresh account sees public servers in Popular Servers without searching",
"file": "servers/server-discovery-default.spec.ts",
"status": "passed",
"duration": 3149,
"timeoutHint": false
},
{
"title": "discovery falls back to the public listing when featured/trending routes 404",
"file": "servers/server-discovery-default.spec.ts",
"status": "passed",
"duration": 3110,
"timeoutHint": false
},
{
"title": "shows warning icon when a peer loses all connections",
"file": "settings/connectivity-warning.spec.ts",
"status": "passed",
"duration": 21313,
"timeoutHint": false
},
{
"title": "allows adding, removing, and reordering ICE servers",
"file": "settings/ice-server-settings.spec.ts",
"status": "passed",
"duration": 3855,
"timeoutHint": false
},
{
"title": "validates TURN entries require credentials",
"file": "settings/ice-server-settings.spec.ts",
"status": "passed",
"duration": 2311,
"timeoutHint": false
},
{
"title": "users with different ICE configs can voice chat together",
"file": "settings/stun-turn-fallback.spec.ts",
"status": "passed",
"duration": 11549,
"timeoutHint": false
},
{
"title": "keeps two users hearing each other after a data-channel error and close",
"file": "voice/data-channel-recovery.spec.ts",
"status": "passed",
"duration": 10035,
"timeoutHint": false
},
{
"title": "heals a three-user voice mesh when one client loses every data channel",
"file": "voice/data-channel-recovery.spec.ts",
"status": "passed",
"duration": 12070,
"timeoutHint": false
},
{
"title": "two users can ring, answer, chat, see self voice indicators, and exchange audio",
"file": "voice/direct-call.spec.ts",
"status": "passed",
"duration": 17480,
"timeoutHint": false
},
{
"title": "keeps private-call audio flowing after the data channel closes",
"file": "voice/direct-call.spec.ts",
"status": "passed",
"duration": 8950,
"timeoutHint": false
},
{
"title": "missing and ended private calls do not leave stale call controls behind",
"file": "voice/direct-call.spec.ts",
"status": "passed",
"duration": 5345,
"timeoutHint": false
},
{
"title": "callee is notified when the caller starts the call from the DM chat header",
"file": "voice/dm-header-call-ring.spec.ts",
"status": "passed",
"duration": 4235,
"timeoutHint": false
},
{
"title": "callee homed on another signal server is notified when called via their provisioned actor id",
"file": "voice/dm-header-call-ring.spec.ts",
"status": "passed",
"duration": 4815,
"timeoutHint": false
},
{
"title": "8 users with different signal configs can voice, mute, deafen, and chat concurrently",
"file": "voice/mixed-signal-config-voice.spec.ts",
"status": "passed",
"duration": 128215,
"timeoutHint": false
},
{
"title": "keeps 8 users on 2 signal apis while voice, mute, and deafen stay consistent for 20+ seconds",
"file": "voice/multi-signal-eight-user-voice.spec.ts",
"status": "passed",
"duration": 125136,
"timeoutHint": false
},
{
"title": "two users register, create server, join voice, and stay connected 10+ seconds with audio",
"file": "voice/voice-full-journey.spec.ts",
"status": "passed",
"duration": 21107,
"timeoutHint": false
},
{
"title": "clears stale mute state after abrupt disconnect and voice rejoin",
"file": "voice/voice-mute-state-reset.spec.ts",
"status": "passed",
"duration": 6888,
"timeoutHint": false
}
]
}