Just a proof of concept, please be kind.
-
Start all the things
-
Client, create-react-app + grpc-web signaling + webrtc extensions
cd client yarn yarn start -
Client v2, same but using Improbable version with client and bidi-streaming
cd client-improbable yarn yarn start -
Server, grpc server + grpc-web signaling + pion/webrtc
cd server go run .
-
-
Click on buttons in your browser
-
Profit!
Regular gRPC client/server are implemented in client/src/echo.tsx and server/echo.go. They should look like business as usual.
To simplify establishing the connection, this uses a simple grpc-web api defined by signaling.proto. It expects to run on localhost so there is no fancy ICE candidate exchange, that would be out of scope.
For the grpc-web client, the magic happens in client/src/grtc/adapter.ts which introduces a WebRtcClientBase to replace GrpcWebClientBase.
For the improbable client, instead of using a new transport which manipulates chunks, client-improbable/src/grpc/client.ts dispatches
between the original GrpcClient and WebRtcClient. The other files in client-improbable/src/grpc are just linking to that new client function.
- Pion WebRTC, data channels example
- gRPC Web, gateway echo example
- Improbable gRPC Web
- Where it started