Sobre o projeto
grpc-web é uma implementação JavaScript de gRPC para clientes de navegador, mantida no repositório grpc/grpc-web. Como navegadores não podem abrir conexões gRPC HTTP/2 brutas, clientes gRPC-web falam com serviços gRPC por meio de um proxy especial; Envoy é o proxy padrão, e o projeto também documenta interoperabilidade com o proxy Go gRPC-web, Apache APISIX e o módulo gRPC do Nginx.
O projeto inclui duas partes principais. Primeiro, uma biblioteca de tempo de execução publicada no npm como `grpc-web`, que agora é escrita inteiramente em TypeScript e, portanto, fornece segurança de tipos de primeira classe, zero dependências de tempo de execução e definições de tipos integradas. Segundo, um plugin protoc, `protoc-gen-grpc-web`, que gera stubs de cliente de serviço a partir de definições `.proto`. A geração normalmente combina o plugin padrão `--js_out` (para classes de mensagem protobuf) com `--grpc-web_out` (para o stub de serviço), e pode ser empacotado com Browserify, Webpack ou Closure Compiler.
Os modos RPC suportados são chamadas unárias e streaming do lado do servidor. O streaming do lado do servidor está disponível apenas no formato de fio `grpcwebtext`, onde os payloads são codificados em base64 e enviados com `Content-Type: application/grpc-web-text`. Um modo binário, `grpcweb`, usa `Content-Type: application/grpc-web+proto` com payloads protobuf binários, mas suporta apenas chamadas unárias. Streaming bidirecional e do lado do cliente não são suportados atualmente.
A geração de código oferece vários estilos de importação: `closure` (o padrão, usando `goog.require()`), `commonjs` (usando `require()`), `commonjs+dts` (stubs CommonJS mais um arquivo de tipagem `.d.ts`) e `typescript` (saída TypeScript completa). Os estilos `commonjs+dts` e `typescript` são suportados apenas por `--grpc-web_out`, não por `--js_out`. O README inclui um exemplo concreto de geração de código TypeScript com o formato de fio binário, que produz um cliente de serviço TypeScript, um módulo protobuf JavaScript e um arquivo de definição `.d.ts` correspondente.
O uso do cliente é direto: instancie um cliente de serviço com uma URL de proxy, construa uma mensagem de solicitação e chame o RPC com metadados opcionais e um callback. O streaming do lado do servidor retorna um objeto de stream com eventos `data`, `status` e `end`, além de um método `cancel()`. Um prazo pode ser definido passando um cabeçalho `deadline` contendo um timestamp Unix em milissegundos. Dois estilos de cliente estão disponíveis: clientes baseados em callback e clientes baseados em Promise, embora a variante Promise não possa acessar callbacks `.on(...)` para metadados e status.
Interceptadores personalizados podem ser implementados e encadeados para recursos como autenticação e tentativas. Existem dois tipos de interceptadores: `UnaryInterceptor`, que intercepta RPCs unários e só pode ser usado com clientes Promise, e `StreamInterceptor`, que é mais versátil e funciona com clientes regulares.
O repositório inclui um exemplo Hello World que percorre a definição de um serviço com buffers de protocolo, implementação de um serviço gRPC Node.js, configuração do proxy Envoy, geração de classes protobuf e stubs de cliente, e compilação de dependências JS em uma biblioteca estática. Uma demonstração mais avançada de Echo pode ser executada com Docker Compose e expõe uma página de navegador para testar streaming. O README também aponta para integrações de ecossistema, incluindo estruturas de servidor Armeria (JVM) e Tonic (Rust) com suporte a gRPC-web, e uma demonstração de compatibilidade com Vite. Um documento de roadmap descreve trabalhos futuros, incluindo suporte a estruturas web específicas de linguagem para Python, Java e Node.
Comments
0 Rating appears after 10 ratings
Sign in to join the discussion.