Voltar
NREPL direto no navegador

NREPL direto no navegador: servidor usa SCI e Web Workers em playground de cerca de 230 KB

Aprofundamento CEVIU

Aprofundamento

O autor do post no metaredux.com precisava de um nREPL para o playground do nrepl.org, mas hospedar um servidor que avalia código de qualquer visitante era inviável (risco e custo). A solução foi rodar tudo no navegador. Ele testou o CheerpJ, uma JVM no browser, onde nREPL 1.8 e Clojure 1.12 funcionaram bem, inclusive stdin. O problema era o entorno: cerca de 8 segundos até o servidor ficar pronto, uns 4,5 MB de download, página travada em loop ocupado sem Web Worker e interrupt que só funciona em código dormindo. O scittle, que roda o SCI no browser com o sci.nrepl, resolve outro problema (editor avaliando código na página via relay) e tem respostas diferentes das do nREPL. O nbb tem servidor completo, mas só em Node.

Daí nasceu o nrepl-sci, um servidor nREPL para SCI escrito em ClojureScript, com cerca de 230 KB gzipped (uns 1 MB de JavaScript) e pronto em fração de segundo. A parte difícil são interrupt e stdin, já que o JavaScript tem uma só thread. A saída usa dois Web Workers: um supervisor que enfileira requisições e responde interrupt e stdin, e um avaliador que roda o SCI. Os dois trocam mensagens por uma caixa de correio em SharedArrayBuffer, com Atomics.wait para bloquear sem spin. Um hook do SCI checa a caixa a cada 256 chamadas de função ou recur. Código que nunca volta ao SCI, como um regex com backtracking infinito, ganha um segundo e depois o avaliador é morto e recriado (as sessões sobrevivem, as definições não).

Tudo isso exige página com isolamento cross-origin (cabeçalhos Cross-Origin-Opener-Policy e Cross-Origin-Embedder-Policy). O GitHub Pages não envia esses cabeçalhos, então o playground cai no modo de uma tarefa por vez: read-line lança erro e interromper significa recomeçar. O projeto usa o proof, suíte de compatibilidade de protocolo, e passa 73 checks aplicáveis. Sem memória compartilhada, falha em stdin.need-input e robust.sessions-at-once. Há limites: é SCI, não Clojure, sem classes Java nem interop com JavaScript (até (.toUpperCase "hi") falha, por segurança).

Por que isso importa

Para quem constrói documentação interativa ou tutoriais, o recado é prático: dá para embutir um REPL em uma página com cerca de 170 linhas, trocando bencode via Uint8Array com o worker. Para quem escreve servidor nREPL ou plugin de editor, o proof e o build Node (subindo em cerca de um décimo de segundo) cortam o chute sobre o que cada cliente espera. O padrão supervisor mais caixa de correio também serve a qualquer interpretador single-thread que possa dar callbacks durante a execução. Essa é a leitura editorial; o custo real é abrir mão da JVM e do interop.

Perguntas frequentes

O que é o nrepl-sci?

É um servidor nREPL para SCI, o interpretador de Clojure de Michiel Borkent, que roda inteiro numa página web, com a própria página como cliente. Faz avaliação, completion e busca de docs. Pesa cerca de 230 KB com gzip.

Por que ele precisa de dois Web Workers?

O JavaScript tem uma thread só, e um loop infinito impediria o servidor de ler o pedido de interrupt. Um worker supervisor recebe e enfileira requisições e responde interrupt e stdin, enquanto o avaliador roda o SCI. Os dois se comunicam por SharedArrayBuffer.

O que acontece se a página não tiver isolamento cross-origin?

Sem os cabeçalhos COOP e COEP não há SharedArrayBuffer. O servidor passa a fazer uma coisa por vez, read-line lança erro e interromper um código significa recomeçar. Avaliação, saída, erros, completion e doc continuam iguais.

Dá para usar JavaScript interop ou bibliotecas da JVM nele?

Não. É ClojureScript interpretado pelo SCI, sem classes Java nem bibliotecas da JVM. O interop com JavaScript é bloqueado, o que torna seguro embutir o REPL em qualquer lugar. Funções como clojure.string/upper-case funcionam normalmente.

Fontes

Avalie este artigo:
Categoria
CEVIU Web Dev
Publicado
02 de novembro de 2026
Editoria
CEVIU Web Dev

Quer receber mais sobre CEVIU Web Dev?

Conteúdo curado diariamente, direto no seu e-mail.

Conteúdo curado diariamenteDiversas categoriasCancele quando quiser