-
Notifications
You must be signed in to change notification settings - Fork 790
Description
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:
In addition to that, the console tab also shows the failed request:
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.