grpc / grpc-web

gRPC for Web Clients
https://grpc.io
Apache License 2.0
8.45k stars 761 forks source link

No error/end-callback triggered for streams on ERR_NETWORK_CHANGED #1363

Open maja42 opened 9 months ago

maja42 commented 9 months ago

We are using long-running server-streams where the server pushes updates to the frontend. If the user's network connections change (e.g. due to entering / leaving a VPN), these long-running streams immediately stop - so far so good.

The Browser shows these streams as "failed" inside the network tab: image

In addition to that, the console tab also shows the failed request: image

Note though that the HTTP Status is 200.

The issue: grpc-web does not propagate the error to our application. I'd expect both the "error" and "end"-callbacks to be triggered. Maybe even the "status"-callback. (Or, at least, the "end"-callback). They are not. As a consequence, these background-streams silently stop, and we can't inform the user or restart the streams.

Simplified code example:

this._alertServiceClient = new AlertServicePublicClient(/*...*/);

// ...

const req: Empty = new Empty();
this._alertStream = this._alertServiceClient.streamAlertChanges(req);

// None of these callbacks gets called if the stream stops with ERR_NETWORK_CHANGED:
this._alertStream.on('data', (response: AlertChanges) => {
  console.log('DATA', status); 
});
this._alertStream.on('error', (err: RpcError) => {
  console.log('ERROR', err); 
});
this._alertStream.on('end', () => {
  console.log('END'); 
});
this._alertStream.on('status', (status) => {
  console.log('STATUS', status); 
});

this._store.dispatch(AlertChangesStarted());

Setup: We are using Google Chrome, but it also happens for other browsers. The backend starts with an nginX-server, that forwards all grpc-web calls to an enovy proxy. Envoy then translates to grpc and forwards to individual backend services.

sampajano commented 8 months ago

@maja42 Thanks for the detailed report!

To help rule out any nginx issue, do you mind checking if you could reproduce the exact problem using our echo demo in docker?

https://github.com/grpc/grpc-web#advanced-demo-browser-echo-app

If you're able to reproduce there, it would be easier for us to debug and create a fix for you!

Thanks!