Repository navigation
fix(web): Safari entra em servidores por IP, toca a voz e mostra os emojis - #886
Merged
Merged
Conversation
…mojis - WebKit 26 deixa o WebSocket para um IP literal preso em CONNECTING sem enviar SYN; um segundo socket para a mesma URL, fechado na hora, destrava o primeiro (#883). - A voz remota não tocava porque o roteamento exigia AudioContext.setSinkId, que o Safari não tem; a saída padrão já funciona sem ele. - O seletor de emoji abria vazio sem requestIdleCallback; um fallback com setTimeout desenha os glifos em fatias curtas. Closes #883 Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #883
O problema
No Safari, a versão web não entrava no servidor do convite (
wss://147.15.118.243:3000), que funcionava no Edge e no Firefox. Reproduzi no Safari 26.3 real, via safaridriver, e encontrei três bugs do Safari em sequência.1. WebSocket para IP preso em CONNECTING (bug do WebKit 26)
Um
new WebSocket()para um host que é um IP literal fica para sempre emCONNECTINGsem enviar o SYN: o pcap não mostra nenhum tráfego. Com nome DNS funciona. É um bug conhecido do WebKit (bug 308073, Apple Forums 817697). Já descartei com evidência certificado, CSP, WebCrypto/IDB, servidor e Retransmissão Privada do iCloud.Contorno: criar um 2º WebSocket para a mesma URL e fechá-lo de imediato destrava o principal. Fechado antes de conectar, ele não manda nada ao servidor: o pcap mostra um único SYN e o servidor registra uma única conexão. O contorno só é aplicado em WebKit que não seja Chromium, com host IP e fora do loopback.
NetworkClient.ts:needsWebKitIpSocketNudgee o socket companheiro emconnect().serverAddress.ts: novaisIpLiteralHost.2. Voz conectava, mas não se ouvia ninguém
RemoteMediaRouter.routeAudioOutputlançavaAudio output selection unavailablequandoAudioContext.setSinkIdnão existe (o Safari não tem). Isso acontecia antes doplay()/resume(). Removi essa checagem: o grafo já toca na saída padrão. OsetAudioOutputSinkcontinua recusando uma saída específica sem a API, e nesse caso a seleção reverte, como antes.3. Seletor de emoji abria vazio
O Safari não tem
requestIdleCallback/cancelIdleCallback. O novoutils/idleCallback.tsusa a API nativa quando ela existe; senão, faz fatias de até 8 ms viasetTimeout. O helper devolve a função de cancelamento.Testes
networkClient.test.ts: socket companheiro no WebKit com IP; socket único no Chromium, com nome DNS e em loopback.serverAddress.test.ts:isIpLiteralHost.voiceConnection.test.ts: voz remota toca semAudioContext.setSinkId.idleCallback.test.ts: fallback e cancelamento.settingsNavigationSmoke.cjs(Electron/DOM): sem as APIs de idle, o seletor lista e desenha todos os emojis.npm run test --workspace=apps/client: 1525 + 146 + 1353 testes, 0 falhas.tscdo renderer etsc -p tsconfig.electron.json.node apps/client/test/settingsNavigationSmoke.cjs.node scripts/test-changelog.jsecheck-client-release-notes.<audio>não pausado, sem warnings);Não testado: iPhone/iPad (mesmo WebKit, deve se beneficiar) e Windows (sem impacto: o contorno só ativa em WebKit que não seja Chromium).
Fora do escopo: o Safari ainda bloqueia o som de "entrar na voz" pela política de autoplay. É só um aviso no console.
Nota de release:
release-notes/883-safari-web.json. Não muda oPROTOCOL_VERSION.