Comparing the streaming versions of gRPC and GraphQL to Resgate, the thing you notice is that the former two have a much simpler synchronization between the backend and the client. Effectively, it’s trivial to stream updates (and very contextual updates for graphql) onto the client, while Res requires you to carefully manage the tracked state. It’s not bad, it’s just not that straightforward (I’m looking at you, weak references!)
Res does much more for multiple backends, that’s true, but it comes with more complexity tradeoffs. Off the top of my head, the librarian bot desyncs on every server upgrade you do. It just stops receiving the massages. Why? shrug. Can it reconnect and keep up? Absolutely. But with e.g. a streaming grpc that wouldn’t have been an issue as much because it’s just… well… RPC. It can be easily dumbed down to primitives, while it might be impossible to trace the propagation of data updates from backends to customers in Res given how implicit they are.
But again, I might be looking at this more from the protocol implementor POV rather than end user. Having to implement gRPC (although it’s not that bad given it’s just protobufs over http2), and res, I’d surely prefer to implement the former.