I need a way to capture the signal when a client disconnects or cancels their request on a UnaryStream.
I tried using grpclib.events.listen and listening to several different events.
SendTrailingMetadata appears to be called when a client cancels the request. The problem is, I don't know which client it is. I tried storing a "session ID" on respective unary function stream. stream.metadata.add("session_id", "aaaa-bbbb") and then read that from the respective SendTrailingMetadata event event.metadata.pop("session_id", None). That didn't work.
None of the other events were called when a user disconnects. That being said I see a respective log message request_handler: * telling me that the client canceled and that the connection was lost! So I know they are being handled. But I don't know how to get access to those signals. It wasn't immediately obvious, after reading the code, how I could tap into those signals.
I also tried using contextlib but could not figure out how to use it.
Ideally, I would either like an exception be raised when I attempt to send_message on a stream OR have some sort of callback that I can associate to the stream which gets called. But it looks like the function is dumped immediately after the client disconnects. I guess that makes sense as the client is no longer there.
If there isn't a solution to this, one idea is to register an event callback stream.register_callback(event_handler). Where event_handler could be class instance that implements all of the possible events that a client could receive after they connect (could be used as a way to intercept / transform messages). OR simply have some type of stream.disconnect_handler = disconnect_handler where disconnect_handler is a reference to a function... I would define disconnect_handler in the respective method of the IServabledef so that I could retain context of that connected client.
Thank you so much for this great library!
I need a way to capture the signal when a client disconnects or cancels their request on a
UnaryStream
.I tried using
grpclib.events.listen
and listening to several different events.SendTrailingMetadata
appears to be called when a client cancels the request. The problem is, I don't know which client it is. I tried storing a "session ID" on respective unary function stream.stream.metadata.add("session_id", "aaaa-bbbb")
and then read that from the respectiveSendTrailingMetadata
eventevent.metadata.pop("session_id", None)
. That didn't work.None of the other events were called when a user disconnects. That being said I see a respective log message
request_handler: *
telling me that the client canceled and that the connection was lost! So I know they are being handled. But I don't know how to get access to those signals. It wasn't immediately obvious, after reading the code, how I could tap into those signals.I also tried using
contextlib
but could not figure out how to use it.Ideally, I would either like an exception be raised when I attempt to
send_message
on astream
OR have some sort of callback that I can associate to thestream
which gets called. But it looks like the function is dumped immediately after the client disconnects. I guess that makes sense as the client is no longer there.If there isn't a solution to this, one idea is to register an event callback
stream.register_callback(event_handler)
. Whereevent_handler
could beclass instance
that implements all of the possible events that a client could receive after they connect (could be used as a way to intercept / transform messages). OR simply have some type ofstream.disconnect_handler = disconnect_handler
wheredisconnect_handler
is a reference to a function... I would definedisconnect_handler
in the respective method of theIServable
def
so that I could retain context of that connected client.