Como funciona
O JustDropFile é uma transferência de arquivos ponto a ponto que roda inteiramente no navegador. Esta página explica cada etapa sem rodeios, para que você decida por conta própria se confia nela.
Você solta um arquivo e recebe um link
Seu navegador gera dois valores aleatórios: um ID de sessão de 128 bits e uma chave de criptografia de 256 bits. Com eles, monta um link como justdropfile.com/r/#sessao.chave. Toda a identidade da transferência fica depois do sinal #, o chamado fragmento, e os navegadores nunca enviam o fragmento a servidor nenhum. Neste ponto nada saiu do seu dispositivo além de uma conexão WebSocket com o nosso serviço de sinalização carregando o ID de sessão.
- •O código QR é o mesmo link, desenhado localmente.
- •O link vale por 20 minutos se ninguém abrir; depois a sessão é destruída.
A outra pessoa abre o link, e os navegadores se encontram
O navegador receptor lê o fragmento, conecta-se ao serviço de sinalização com o mesmo ID de sessão, e os dois navegadores trocam descritores de conexão (SDP e candidatos ICE) por meio dele. Esse é o único trabalho do servidor: passar alguns kilobytes de handshake entre exatamente dois pares. Ele recusa um terceiro, não registra os descritores e apaga a sessão no instante em que os pares se conectam.
Technical note:
O serviço de sinalização é um Cloudflare Worker com um Durable Object por sessão. A criação de sessões tem limite de taxa por IP. Só contadores agregados são registrados, nunca o conteúdo dos descritores.
Uma conexão direta é tentada primeiro
O WebRTC tenta três rotas em ordem: um caminho direto pela rede local, um caminho direto pela internet usando STUN para descobrir os endereços públicos, e por último um relay. A maioria das redes domésticas e móveis permite uma das duas primeiras. A conexão em si é criptografada com DTLS, como o WebRTC exige.
- •Conexões diretas não têm limite de tamanho.
- •Depois de conectar, a página verifica qual rota foi escolhida e mostra "direta" ou "por relay".
Se a direta falhar, um relay criptografado assume
Algumas redes de escritório, hospital, campus e hotel bloqueiam completamente conexões diretas entre pares. Quando isso acontece, o tráfego é retransmitido pelo Cloudflare TURN. O relay encaminha texto cifrado; ele não tem a chave. As credenciais de relay são geradas por sessão pelo nosso worker e expiram, então o relay não pode ser aproveitado como proxy gratuito. Transferências por relay têm limite de 2 GB porque bytes por relay custam dinheiro.
Technical note:
O Cloudflare TURN é usado com credenciais de curta duração geradas por sessão. Se até o relay estiver bloqueado, a página avisa e sugere outra rede ou o roteador do celular.
O receptor vê a lista de arquivos e aceita
Antes de qualquer byte de arquivo se mover, o remetente transmite um manifesto criptografado: nomes, tamanhos e tipos de arquivo. Ele passa pela conexão entre pares, não pela sinalização, então o nosso servidor nunca o vê. O receptor pode recusar. Ao aceitar, o navegador receptor abre um lugar para gravar o arquivo: uma pasta que você escolhe (Chrome e Edge no desktop) ou o armazenamento privado em disco do navegador (Safari, Firefox, Android), de modo que o arquivo é gravado no disco conforme chega, em vez de ficar na memória.
Os arquivos atravessam em pedaços criptografados
O remetente lê o arquivo em fatias de até 64 KB, criptografa cada fatia com AES-GCM usando a chave do link e a envia por um canal de dados WebRTC. Cada pedaço carrega o número do arquivo e a posição como dados autenticados, então um pedaço corrompido, faltando, fora de ordem ou repetido falha na verificação. No fim de cada arquivo o remetente envia uma contagem e um total de bytes assinados; o receptor confirma os dois antes de dar o aceite. Os arquivos são enviados um após o outro por uma única conexão.
- •Nenhum dos lados jamais mantém um arquivo inteiro na memória. Transferências de vários gigabytes funcionam em celulares.
- •O remetente respeita a contrapressão do canal, então um receptor lento desacelera o remetente em vez de encher a memória dele.
- •Se a conexão cair, a transferência falha de forma clara e o remetente pode criar um novo link. Não há retomada nesta versão.
Confira você mesmo
Abra as ferramentas de desenvolvedor do navegador, vá até a aba Rede e faça uma transferência. Você verá um WebSocket para o host de sinalização carregando pequenas mensagens JSON, e nada mais: nenhuma requisição de upload, nenhum byte de arquivo. A transferência em si aparece nos internos do WebRTC (chrome://webrtc-internals no Chrome), onde você também pode confirmar se o par de candidatos escolhido é direto ou por relay.
A chave nunca aparece em nenhuma requisição porque está no fragmento da URL. Você pode confirmar isso na mesma aba Rede: a requisição para o host de sinalização contém o ID de sessão e nada depois do ponto.
O que este design não consegue fazer
- •Não consegue entregar para alguém que está offline. Não há armazenamento, então os dois lados precisam estar presentes.
- •Não consegue esconder seu endereço IP do outro participante. Conexões entre pares funcionam trocando endereços.
- •Não consegue atravessar uma rede que bloqueia tanto conexões diretas quanto relays TURN.
- •Não consegue retomar uma transferência interrompida. Você recomeça com um novo link.