<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Alexey Vasyukov</title>
    <description>The latest articles on DEV Community by Alexey Vasyukov (@notmedia).</description>
    <link>https://dev.to/notmedia</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F879507%2F1e9c6442-c29f-42da-9535-aff5587d9f22.jpeg</url>
      <title>DEV Community: Alexey Vasyukov</title>
      <link>https://dev.to/notmedia</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/notmedia"/>
    <language>en</language>
    <item>
      <title>ezy – open-source gRPC client, alternative to Postman and Insomnia</title>
      <dc:creator>Alexey Vasyukov</dc:creator>
      <pubDate>Wed, 08 Feb 2023 16:47:57 +0000</pubDate>
      <link>https://dev.to/notmedia/ezy-open-source-grpc-client-alternative-to-postman-and-insomnia-20l4</link>
      <guid>https://dev.to/notmedia/ezy-open-source-grpc-client-alternative-to-postman-and-insomnia-20l4</guid>
      <description>&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/getezy" rel="noopener noreferrer"&gt;
        getezy
      &lt;/a&gt; / &lt;a href="https://github.com/getezy/ezy" rel="noopener noreferrer"&gt;
        ezy
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      🔥 GUI client for gRPC/gRPC-Web
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;br&gt;
&lt;div&gt;
  
  &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fgetezy%2Fezydocs%2Flogo.png"&gt;
  
&lt;/div&gt;
&lt;div&gt;
&lt;br&gt;
&lt;p&gt;&lt;a href="https://github.com/getezy/ezy/releases/latest" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/18afd8bb33a97cd7f481f8ddae7aa73edda8edba32cea70221952c6897af5abc/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f7061636b6167652d6a736f6e2f762f676574657a792f657a793f636f6c6f723d73756363657373" alt="Release"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/16fdbdd8f65eeb6efb1419750fe68b7a014f01d237ea7d99ff2ad110a957f1db/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f646f776e6c6f6164732f676574657a792f657a792f746f74616c"&gt;&lt;img src="https://camo.githubusercontent.com/16fdbdd8f65eeb6efb1419750fe68b7a014f01d237ea7d99ff2ad110a957f1db/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f646f776e6c6f6164732f676574657a792f657a792f746f74616c" alt="Downloads"&gt;&lt;/a&gt;
&lt;a href="https://www.codacy.com/gh/getezy/ezy/dashboard?utm_source=github.com&amp;amp;utm_medium=referral&amp;amp;utm_content=getezy/ezy&amp;amp;utm_campaign=Badge_Grade" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/31791fba56f69340ced94422056e80a5cabe511d1eb2a27e786e185403eebb8a/68747470733a2f2f6170702e636f646163792e636f6d2f70726f6a6563742f62616467652f47726164652f6362623933643039663233333431366361633966616133323661383833613434" alt="Codacy Badge"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://discord.gg/r26ETPgj6R" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/43539504bd91d9050189ce9e097cd7401c2914d7832ff8e9d438efce16e4ee57/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f446973636f72642d3732383944413f7374796c653d666c6174266c6f676f3d646973636f7264266c6f676f436f6c6f723d7768697465" alt="Discord"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Fully-featured desktop &lt;a href="https://grpc.io/" rel="nofollow noopener noreferrer"&gt;gRPC/gRPC-Web&lt;/a&gt; client.&lt;/p&gt;
&lt;div&gt;
  &lt;a rel="noopener noreferrer" href="https://github.com/getezy/ezydocs/preview.gif"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fgetezy%2Fezydocs%2Fpreview.gif"&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;br&gt;
&lt;p&gt;🚧 This project is in beta phase and can get breaking changes at any time until it goes to v1.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Features&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;✅ Tabs&lt;br&gt;
✅ Shortcuts&lt;br&gt;
✅ Environments&lt;br&gt;
✅ Persisted collections&lt;/p&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;gRPC&lt;/th&gt;
&lt;th&gt;gRPC-Web&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Unary Calls&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Server Streaming&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Client Streaming&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌ &lt;a href="https://github.com/grpc/grpc-web/blob/master/doc/streaming-roadmap.md#client-streaming-and-half-duplex-streaming" rel="noopener noreferrer"&gt;read&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bi-directional Streaming&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌ &lt;a href="https://github.com/grpc/grpc-web/blob/master/doc/streaming-roadmap.md#full-duplex-streaming-over-http" rel="noopener noreferrer"&gt;read&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stream cancelation&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Metadata&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅ Browser Headers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TLS (Server-side/Mutual) with CA/Self-Signed certificates&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Getting started&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Install the latest version for your OS from &lt;a href="https://github.com/getezy/ezy/releases/latest" rel="noopener noreferrer"&gt;release page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Today you can update only by manually downloading new app version and reinstalling it. I'm working on automatic updates.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Shortcuts&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;Use &lt;code&gt;⌘+K&lt;/code&gt; (macOS) or &lt;code&gt;Ctrl+K&lt;/code&gt;(Windows/Linux). Just try it.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Working with 64-bit integers&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;If you want to send 64-bit integers (&lt;code&gt;int64&lt;/code&gt;, &lt;code&gt;uint64&lt;/code&gt;, &lt;code&gt;sint64&lt;/code&gt;, &lt;code&gt;fixed64&lt;/code&gt;, &lt;code&gt;sfixed64&lt;/code&gt;) just wrap values in quotes.&lt;/p&gt;
&lt;div class="highlight highlight-source-json notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;{
  &lt;span class="pl-ent"&gt;"int64"&lt;/span&gt;: &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;9223372036854775807&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;
  &lt;span class="pl-ent"&gt;"uint64"&lt;/span&gt;: &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;18446744073709551615&lt;/span&gt;&lt;/pre&gt;…
&lt;/div&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/getezy/ezy" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;In this release I have concentrated on user experience:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Full support of shortcuts&lt;/li&gt;
&lt;li&gt;Reworked collections management&lt;/li&gt;
&lt;li&gt;Notifications&lt;/li&gt;
&lt;li&gt;Improved UX&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;gRPC clients I’ve worked with had drawbacks and didn’t fit my use-case in a way I was expecting, since I’ve started working with gRPC 3+ years ago.&lt;/p&gt;

&lt;p&gt;Since then, I wanted a tool that fits any need in gRPC world. This is why I created ezy.&lt;/p&gt;

&lt;p&gt;Compared to Insomnia and Postman, ezy offers better streams support, allows you to use Server-Side and Mutual TLS with custom TLS certificates, works with gRPC-Web and has a more slick UI/UX.&lt;/p&gt;

&lt;p&gt;If you are looking for a gRPC/gRPC-Web client which fits your needs, give ezy a chance!&lt;/p&gt;

&lt;p&gt;I’d love to hear your feedback and answer any questions regarding ezy.&lt;/p&gt;

</description>
      <category>css</category>
      <category>webdev</category>
      <category>frontend</category>
      <category>howto</category>
    </item>
    <item>
      <title>ezy – open-source gRPC client, alternative to Postman and Insomnia</title>
      <dc:creator>Alexey Vasyukov</dc:creator>
      <pubDate>Thu, 08 Dec 2022 21:28:12 +0000</pubDate>
      <link>https://dev.to/notmedia/ezy-open-source-grpc-client-alternative-to-postman-and-insomnia-1djn</link>
      <guid>https://dev.to/notmedia/ezy-open-source-grpc-client-alternative-to-postman-and-insomnia-1djn</guid>
      <description>&lt;p&gt;&lt;a href="https://github.com/getezy/ezy"&gt;https://github.com/getezy/ezy&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--1g3lFLTF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yn69138ajn4xwpsecq8j.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1g3lFLTF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yn69138ajn4xwpsecq8j.gif" alt="Preview" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this release I have concentrated on user experience:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Full support of shortcuts&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Reworked collections management&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Notifications&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Improved UX&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;gRPC clients I’ve worked with had drawbacks and didn’t fit my use-case in a way I was expecting, since I’ve started working with gRPC 3+ years ago.&lt;/p&gt;

&lt;p&gt;Since then, I wanted a tool that fits any need in gRPC world. This is why I created ezy.&lt;/p&gt;

&lt;p&gt;Compared to Insomnia and Postman, ezy offers better streams support, allows you to use Server-Side and Mutual TLS with custom TLS certificates, works with gRPC-Web and has a more slick UI/UX.&lt;/p&gt;

&lt;p&gt;If you are looking for a gRPC/gRPC-Web client which fits your needs, give ezy a chance!&lt;/p&gt;

&lt;p&gt;I’d love to hear your feedback and answer any questions regarding ezy.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How to setup and test TLS in gRPC/gRPC-Web</title>
      <dc:creator>Alexey Vasyukov</dc:creator>
      <pubDate>Mon, 29 Aug 2022 19:54:41 +0000</pubDate>
      <link>https://dev.to/notmedia/how-to-setup-and-test-tls-in-grpcgrpc-web-485m</link>
      <guid>https://dev.to/notmedia/how-to-setup-and-test-tls-in-grpcgrpc-web-485m</guid>
      <description>&lt;p&gt;This article has samples in Node.JS but can be helpful for other languages, so lets start. All working examples you can find &lt;a href="https://github.com/getezy/ezy/tree/master/__tests__/tls-service"&gt;here&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  How TLS works?
&lt;/h2&gt;

&lt;p&gt;I recommend to read the best comic-article about &lt;a href="https://howhttps.works/"&gt;how TLS works&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  gRPC connection types
&lt;/h2&gt;

&lt;p&gt;There are three types for gRPC connections you can use:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Insecure — all data transmitted without encryption.&lt;/li&gt;
&lt;li&gt;Server-Side TLS — browser like encryption, where only the server provides TLS certificate to the client.&lt;/li&gt;
&lt;li&gt;Mutual TLS — most secure, both the server and the client provides there certificates to each other.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Creating Self-Signed certificates
&lt;/h2&gt;

&lt;p&gt;This is optional step if you don’t have certificate from any CA’s or want to work with TLS on localhost.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Note that in production environment is mostly recommended to choose CA’s certificate for more security, for example you can get free certificate from &lt;a href="https://letsencrypt.org/"&gt;Let’s Encrypt&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;





&lt;h2&gt;
  
  
  Preparation
&lt;/h2&gt;

&lt;p&gt;Let’s start from implementing our gRPC service.&lt;/p&gt;

&lt;p&gt;First, we will define our service &lt;a href="https://developers.google.com/protocol-buffers"&gt;Protocol Buffers&lt;/a&gt; file.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Second, we need to generate types, service and client definitions.&lt;br&gt;
For TypeScript I prefer to use &lt;a href="https://github.com/stephenh/ts-proto"&gt;ts-proto&lt;/a&gt;, but you can choose any tool you like depends on your language.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;protoc &lt;span class="nt"&gt;--plugin&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;./node_modules/.bin/protoc-gen-ts_proto &lt;span class="nt"&gt;--ts_proto_opt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;env&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;node,outputServices&lt;span class="o"&gt;=&lt;/span&gt;grpc-js &lt;span class="nt"&gt;--ts_proto_out&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;./src/generated ./proto/tls_service.proto
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Now we can implement our server running on Node.js.&lt;/p&gt;


&lt;h2&gt;
  
  
  gRPC
&lt;/h2&gt;

&lt;p&gt;We will use an official &lt;a href="https://github.com/grpc/grpc-node/tree/master/packages/grpc-js"&gt;@grpc/grpc-js&lt;/a&gt; package both for server and client side here.&lt;/p&gt;


&lt;h3&gt;
  
  
  Server-Side TLS
&lt;/h3&gt;

&lt;p&gt;Server-Side TLS requires only the server certificate and it’s private key.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Server&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Client&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Now we can implement the client side.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Note here that if your TLS certificate signed with CA (not Self-Signed) you don’t need to provide this certificate on the client, it should automatically works.&lt;/em&gt;&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;





&lt;h3&gt;
  
  
  Mutual TLS
&lt;/h3&gt;

&lt;p&gt;Mutual TLS requires the root certificate, server certificate and it’s private key.&lt;br&gt;
Root certificate would be used here for checking that client certificate is signed and the server can trust to the client.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Server&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Like in Server-Side section, changed only &lt;code&gt;getServerCredentials&lt;/code&gt; function.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Client&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Like in Server-Side section, changed only &lt;code&gt;getChannelCredentials&lt;/code&gt; function.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;





&lt;h3&gt;
  
  
  Override SSL target name
&lt;/h3&gt;

&lt;p&gt;@grpc/grpc-js package additionally provides some useful &lt;a href="https://github.com/grpc/grpc-node/tree/master/packages/grpc-js#supported-channel-options"&gt;channel options&lt;/a&gt; that you can set. You can read about each of them &lt;a href="https://grpc.github.io/grpc/core/group__grpc__arg__keys.html"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;grpc.ssl_target_name_override&lt;/code&gt; — would be helpful for us when the actual server behind the proxy and CN don’t match.&lt;/p&gt;

&lt;p&gt;To setup channel options you need to pass them into client constructor’s third argument.&lt;/p&gt;




&lt;h2&gt;
  
  
  gRPC-Web
&lt;/h2&gt;

&lt;p&gt;Read the grpc.io blog post about &lt;a href="https://grpc.io/blog/state-of-grpc-web/"&gt;the state of gRPC-Web&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;TL;DR&lt;br&gt;
The things you should know:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Working scheme:&lt;br&gt;
Client ↔ Proxy [HTTP(S) gRPC-Web] ↔ Server (gRPC)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;There are two implementations — &lt;a href="https://github.com/grpc/grpc-web"&gt;official gRPC-Web&lt;/a&gt; and &lt;a href="https://github.com/improbable-eng/grpc-web"&gt;@improbable-eng/grpc-web&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Right now gRPC-Web supports only Unary and Server-Streaming requests over HTTP(S).&lt;br&gt;&lt;br&gt;
&lt;em&gt;Additionally &lt;a href="https://github.com/improbable-eng/grpc-web"&gt;@improbable-eng/grpc-web&lt;/a&gt; supports client-side and bi-directional streaming with an experimental websocket transport. This is not part of the gRPC-Web spec, and is not recommended for production use.&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;There are two proxies — Envoy with &lt;a href="https://www.envoyproxy.io/docs/envoy/latest/configuration/http/http_filters/grpc_web_filter"&gt;gRPC-Web filter&lt;/a&gt; from official gRPC-Web and &lt;a href="https://github.com/improbable-eng/grpc-web/tree/master/go/grpcwebproxy"&gt;grpcwebproxy&lt;/a&gt; from @improbable-eng.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You can use either client with either proxy.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Clients have different communication transports.&lt;br&gt;&lt;br&gt;
&lt;em&gt;Official gRPC-web supports only XMLHttpRequest.&lt;br&gt;
@improbable-eng/grpc-web additionally support Fetch (using it if available) and can be extended with custom transport, for example Node.js.&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In this example we will use Envoy proxy running in docker.&lt;/p&gt;


&lt;h3&gt;
  
  
  Server-Side TLS
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Server&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;As you already noticed we need to start our gRPC service behind the proxy. So there is nothing to change, simply start service with Server-Side TLS we discuss earlier.&lt;/p&gt;

&lt;p&gt;After that we need to setup envoy and start it.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;



&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;
&lt;br&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker-compose up envoy-server
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;That’s it. Your gRPC-Web proxy with Server-Side TLS will be available at &lt;code&gt;https://0.0.0.0:8080&lt;/code&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  Mutual TLS
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Server&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The hack here is to start gRPC service with &lt;strong&gt;Server-Side TLS&lt;/strong&gt; but on envoy side check the client certificate signed by trusted CA.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;




&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;
&lt;br&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker-compose up envoy-mutual
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Great! Your gRPC-Web proxy with Mutual TLS will be available at &lt;code&gt;https://0.0.0.0:8080&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Testing both gRPC and gRPC-Web requests
&lt;/h2&gt;

&lt;p&gt;Recently I released a multi-platform desktop gRPC / gRPC-Web client called &lt;a href="https://github.com/getezy/ezy"&gt;ezy&lt;/a&gt;. I’m working with gRPC every day and there is no any fully featured, UI/UX-perfect clients for gRPC testing, so I tried to create one.&lt;/p&gt;

&lt;p&gt;&lt;iframe src="https://player.vimeo.com/video/744325213" width="710" height="399"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;This client has fully featured support of gRPC / gRPC-Web. I would be appreciate if you try it.&lt;/p&gt;

&lt;p&gt;🙏 If you have any feedback or ideas feel free to open &lt;a href="https://github.com/getezy/ezy/discussions"&gt;discussion&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>testing</category>
      <category>programming</category>
      <category>grpc</category>
      <category>api</category>
    </item>
    <item>
      <title>ezy - desktop gRPC client</title>
      <dc:creator>Alexey Vasyukov</dc:creator>
      <pubDate>Sat, 13 Aug 2022 17:01:46 +0000</pubDate>
      <link>https://dev.to/notmedia/ezy-desktop-grpc-client-113o</link>
      <guid>https://dev.to/notmedia/ezy-desktop-grpc-client-113o</guid>
      <description>&lt;p&gt;Hi! I just released new desktop gRPC client called &lt;a href="https://github.com/getezy/ezy"&gt;ezy&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Why another one?&lt;/em&gt;&lt;br&gt;
I'm working with gRPC every day and for my opinion all existed GUI clients do not well designed or do not have fully gRPC features support. And some of them like &lt;a href="https://github.com/bloomrpc/bloomrpc/issues/398"&gt;BloomRPC&lt;/a&gt; unfortunately are unmaintained.&lt;/p&gt;

&lt;h2&gt;
  
  
  ezy
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Features
&lt;/h3&gt;

&lt;p&gt;✅ Localy persisted collections.&lt;br&gt;
✅ Multi-tabs.&lt;br&gt;
✅ Environments.  &lt;/p&gt;

&lt;h4&gt;
  
  
  gRPC
&lt;/h4&gt;

&lt;p&gt;✅ Unary calls.&lt;br&gt;
✅ Client/Server/Bidirectional streaming.&lt;br&gt;
✅ Metadata support.&lt;br&gt;
✅ TLS (Server-side/Mutual) support.&lt;br&gt;
✅ Good errors output.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--E44jQkzs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hzd5yxw60rz4bdiigoyi.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--E44jQkzs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hzd5yxw60rz4bdiigoyi.gif" alt="Preview" width="880" height="525"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Plans
&lt;/h3&gt;

&lt;p&gt;Actual roadmap available &lt;a href="https://github.com/orgs/getezy/projects/1/views/1"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you are interested in this project, please share your feedback/ideas here or in &lt;a href="https://github.com/getezy/ezy/discussions"&gt;discussions&lt;/a&gt; 🙏&lt;/p&gt;

</description>
      <category>grpc</category>
      <category>protobuf</category>
      <category>api</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
