# Websocket Connect/Disconnect

**URL:** <https://discourse.nameko.io/t/websocket-connect-disconnect/119>\
**Category:** googlegroup\
**Created:** [January 29, 2016, 4:28pm UTC](https://discourse.nameko.io/t/websocket-connect-disconnect/119 "2016-01-29T16:28:41Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![Conor\_Seabrook](https://yyz1.discourse-cdn.com/flex031/user_avatar/discourse.nameko.io/conor_seabrook/32/85_2.png) [@Conor\_Seabrook](https://discourse.nameko.io/u/Conor_Seabrook)\
**Post date:** [January 29, 2016, 4:28pm UTC](https://discourse.nameko.io/t/websocket-connect-disconnect/119/1 "2016-01-29T16:28:41Z")

</div>

Hello!

I have a number of nameko services behind a websocket gateway service. The  
gateway service maps user\_ids to socket\_ids and is responsible for routing  
messages to and from services and users. What I'm looking to do is get a  
disconnect event from the websocket dependency so I can notify services and  
clean up the user/socket mapping.

I've added a user dictionary to the websocket\_hub, but without a disconnect  
event I'm unable to cleanup the mapping. Looking for some pointers on how  
to implement this.

Thanks!

&nbsp;&nbsp;&nbsp;&nbsp;@event\_handler("jackpot", "\*")  
&nbsp;&nbsp;&nbsp;&nbsp;def jackpot\_handler(self, payload):  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.handle\_event("jackpot", payload)  
&nbsp;&nbsp;&nbsp;&nbsp;  
&nbsp;&nbsp;&nbsp;&nbsp;def handle\_event(self, service, payload):  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if "players" in payload:  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;players = payload["players"]  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;event = payload["event"]  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data = payload["data"]

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if players == "\*":  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# Broadcast to any players who have subscribed to service  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.websocket\_hub.broadcast(service, event, data)  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else:  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# Send to specific players  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for player\_id in players:  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;socket\_id = self.get\_player\_socket\_id(player\_id)  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if socket\_id:  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.websocket\_hub.unicast(socket\_id, event, data)

&nbsp;&nbsp;&nbsp;&nbsp;def get\_player\_socket\_id(self, player\_id):  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if hasattr(self.websocket\_hub, 'players'):  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if player\_id in self.websocket\_hub.players:  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;socket\_id = self.websocket\_hub.players[player\_id]  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return socket\_id

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return None

&nbsp;&nbsp;&nbsp;&nbsp;def set\_player\_socket\_id(self, player\_id, socket\_id):  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn = self.websocket\_hub.\_get\_connection(socket\_id)  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn.player\_id = player\_id

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if not hasattr(self.websocket\_hub, 'players'):  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.websocket\_hub.players = dict()

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.websocket\_hub.players[player\_id] = socket\_id

---

<div class="post-metadata">

**Author:** ![David\_Szotten](https://yyz1.discourse-cdn.com/flex031/user_avatar/discourse.nameko.io/david_szotten/32/6_2.png) [@David\_Szotten](https://discourse.nameko.io/u/David_Szotten)\
**Post date:** [January 29, 2016, 7:01pm UTC](https://discourse.nameko.io/t/websocket-connect-disconnect/119/2 "2016-01-29T19:01:44Z")

</div>

Hi,

As i mentioned on the ticket  
\<[Issues · nameko/nameko · GitHub](https://github.com/onefinestay/nameko/issues/308&gt;), I think you want to  
build a new entrypoint, similar to nameko.web.websocket:WebSocketRpc, but  
using a modified WebSocketServer that overrides e.g. `add_websocket` to  
(also) do something like find your `ConnectedProvider` and fire it

Then you add methods to your service class decorated with your new  
entrypoint

Best,  
David

> **···**
>
> On Friday, 29 January 2016 16:28:42 UTC, conor.s...@gmail.com wrote:
> 
> > Hello!
> > 
> > I have a number of nameko services behind a websocket gateway service. The  
> > gateway service maps user\_ids to socket\_ids and is responsible for routing  
> > messages to and from services and users. What I'm looking to do is get a  
> > disconnect event from the websocket dependency so I can notify services and  
> > clean up the user/socket mapping.
> > 
> > I've added a user dictionary to the websocket\_hub, but without a  
> > disconnect event I'm unable to cleanup the mapping. Looking for some  
> > pointers on how to implement this.
> > 
> > Thanks!
> > 
> > &nbsp;&nbsp;&nbsp;&nbsp;@event\_handler("jackpot", "\*")  
> > &nbsp;&nbsp;&nbsp;&nbsp;def jackpot\_handler(self, payload):  
> > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.handle\_event("jackpot", payload)  
> > &nbsp;&nbsp;&nbsp;&nbsp;  
> > &nbsp;&nbsp;&nbsp;&nbsp;def handle\_event(self, service, payload):  
> > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if "players" in payload:  
> > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;players = payload["players"]  
> > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;event = payload["event"]  
> > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data = payload["data"]
> > 
> > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if players == "\*":  
> > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# Broadcast to any players who have subscribed to service  
> > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.websocket\_hub.broadcast(service, event, data)  
> > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else:  
> > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# Send to specific players  
> > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for player\_id in players:  
> > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;socket\_id = self.get\_player\_socket\_id(player\_id)  
> > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if socket\_id:  
> > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.websocket\_hub.unicast(socket\_id, event, data)
> > 
> > &nbsp;&nbsp;&nbsp;&nbsp;def get\_player\_socket\_id(self, player\_id):  
> > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if hasattr(self.websocket\_hub, 'players'):  
> > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if player\_id in self.websocket\_hub.players:  
> > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;socket\_id = self.websocket\_hub.players[player\_id]  
> > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return socket\_id
> > 
> > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return None
> > 
> > &nbsp;&nbsp;&nbsp;&nbsp;def set\_player\_socket\_id(self, player\_id, socket\_id):  
> > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn = self.websocket\_hub.\_get\_connection(socket\_id)  
> > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn.player\_id = player\_id
> > 
> > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if not hasattr(self.websocket\_hub, 'players'):  
> > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.websocket\_hub.players = dict()
> > 
> > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.websocket\_hub.players[player\_id] = socket\_id

---

<div class="post-metadata">

**Author:** ![Conor\_Seabrook](https://yyz1.discourse-cdn.com/flex031/user_avatar/discourse.nameko.io/conor_seabrook/32/85_2.png) [@Conor\_Seabrook](https://discourse.nameko.io/u/Conor_Seabrook)\
**Post date:** [January 29, 2016, 7:34pm UTC](https://discourse.nameko.io/t/websocket-connect-disconnect/119/3 "2016-01-29T19:34:30Z")

</div>

Thanks, I'll give that a shot.

> **···**
>
> On Friday, January 29, 2016 at 2:01:44 PM UTC-5, David Szotten wrote:
> 
> > Hi,
> > 
> > As i mentioned on the ticket  
> > \<[Issues · nameko/nameko · GitHub](https://github.com/onefinestay/nameko/issues/308&gt;), I think you want to  
> > build a new entrypoint, similar to nameko.web.websocket:WebSocketRpc, but  
> > using a modified WebSocketServer that overrides e.g. `add_websocket` to  
> > (also) do something like find your `ConnectedProvider` and fire it
> > 
> > Then you add methods to your service class decorated with your new  
> > entrypoint
> > 
> > Best,  
> > David
> > 
> > On Friday, 29 January 2016 16:28:42 UTC, conor.s...@gmail.com wrote:
> > 
> > > Hello!
> > > 
> > > I have a number of nameko services behind a websocket gateway service.  
> > > The gateway service maps user\_ids to socket\_ids and is responsible for  
> > > routing messages to and from services and users. What I'm looking to do is  
> > > get a disconnect event from the websocket dependency so I can notify  
> > > services and clean up the user/socket mapping.
> > > 
> > > I've added a user dictionary to the websocket\_hub, but without a  
> > > disconnect event I'm unable to cleanup the mapping. Looking for some  
> > > pointers on how to implement this.
> > > 
> > > Thanks!
> > > 
> > > &nbsp;&nbsp;&nbsp;&nbsp;@event\_handler("jackpot", "\*")  
> > > &nbsp;&nbsp;&nbsp;&nbsp;def jackpot\_handler(self, payload):  
> > > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.handle\_event("jackpot", payload)  
> > > &nbsp;&nbsp;&nbsp;&nbsp;  
> > > &nbsp;&nbsp;&nbsp;&nbsp;def handle\_event(self, service, payload):  
> > > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if "players" in payload:  
> > > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;players = payload["players"]  
> > > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;event = payload["event"]  
> > > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data = payload["data"]
> > > 
> > > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if players == "\*":  
> > > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# Broadcast to any players who have subscribed to service  
> > > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.websocket\_hub.broadcast(service, event, data)  
> > > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else:  
> > > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# Send to specific players  
> > > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for player\_id in players:  
> > > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;socket\_id = self.get\_player\_socket\_id(player\_id)  
> > > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if socket\_id:  
> > > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.websocket\_hub.unicast(socket\_id, event, data)
> > > 
> > > &nbsp;&nbsp;&nbsp;&nbsp;def get\_player\_socket\_id(self, player\_id):  
> > > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if hasattr(self.websocket\_hub, 'players'):  
> > > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if player\_id in self.websocket\_hub.players:  
> > > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;socket\_id = self.websocket\_hub.players[player\_id]  
> > > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return socket\_id
> > > 
> > > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return None
> > > 
> > > &nbsp;&nbsp;&nbsp;&nbsp;def set\_player\_socket\_id(self, player\_id, socket\_id):  
> > > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn = self.websocket\_hub.\_get\_connection(socket\_id)  
> > > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn.player\_id = player\_id
> > > 
> > > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if not hasattr(self.websocket\_hub, 'players'):  
> > > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.websocket\_hub.players = dict()
> > > 
> > > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.websocket\_hub.players[player\_id] = socket\_id

---

<div class="post-metadata">

**Author:** ![David\_Szotten](https://yyz1.discourse-cdn.com/flex031/user_avatar/discourse.nameko.io/david_szotten/32/6_2.png) [@David\_Szotten](https://discourse.nameko.io/u/David_Szotten)\
**Post date:** [February 1, 2016, 9:11am UTC](https://discourse.nameko.io/t/websocket-connect-disconnect/119/4 "2016-02-01T09:11:16Z")

</div>

Cool. Let me know how you get on and if you need any more help/advice.

D

> **···**
>
> On Friday, 29 January 2016 19:34:30 UTC, conor.s...@gmail.com wrote:
> 
> > Thanks, I'll give that a shot.
> > 
> > On Friday, January 29, 2016 at 2:01:44 PM UTC-5, David Szotten wrote:
> > 
> > > Hi,
> > > 
> > > As i mentioned on the ticket  
> > > \<[Issues · nameko/nameko · GitHub](https://github.com/onefinestay/nameko/issues/308&gt;), I think you want to  
> > > build a new entrypoint, similar to nameko.web.websocket:WebSocketRpc, but  
> > > using a modified WebSocketServer that overrides e.g. `add_websocket` to  
> > > (also) do something like find your `ConnectedProvider` and fire it
> > > 
> > > Then you add methods to your service class decorated with your new  
> > > entrypoint
> > > 
> > > Best,  
> > > David
> > > 
> > > On Friday, 29 January 2016 16:28:42 UTC, conor.s...@gmail.com wrote:
> > > 
> > > > Hello!
> > > > 
> > > > I have a number of nameko services behind a websocket gateway service.  
> > > > The gateway service maps user\_ids to socket\_ids and is responsible for  
> > > > routing messages to and from services and users. What I'm looking to do is  
> > > > get a disconnect event from the websocket dependency so I can notify  
> > > > services and clean up the user/socket mapping.
> > > > 
> > > > I've added a user dictionary to the websocket\_hub, but without a  
> > > > disconnect event I'm unable to cleanup the mapping. Looking for some  
> > > > pointers on how to implement this.
> > > > 
> > > > Thanks!
> > > > 
> > > > &nbsp;&nbsp;&nbsp;&nbsp;@event\_handler("jackpot", "\*")  
> > > > &nbsp;&nbsp;&nbsp;&nbsp;def jackpot\_handler(self, payload):  
> > > > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.handle\_event("jackpot", payload)  
> > > > &nbsp;&nbsp;&nbsp;&nbsp;  
> > > > &nbsp;&nbsp;&nbsp;&nbsp;def handle\_event(self, service, payload):  
> > > > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if "players" in payload:  
> > > > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;players = payload["players"]  
> > > > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;event = payload["event"]  
> > > > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data = payload["data"]
> > > > 
> > > > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if players == "\*":  
> > > > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# Broadcast to any players who have subscribed to service  
> > > > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.websocket\_hub.broadcast(service, event, data)  
> > > > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else:  
> > > > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# Send to specific players  
> > > > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for player\_id in players:  
> > > > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;socket\_id = self.get\_player\_socket\_id(player\_id)  
> > > > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if socket\_id:  
> > > > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.websocket\_hub.unicast(socket\_id, event,  
> > > > data)
> > > > 
> > > > &nbsp;&nbsp;&nbsp;&nbsp;def get\_player\_socket\_id(self, player\_id):  
> > > > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if hasattr(self.websocket\_hub, 'players'):  
> > > > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if player\_id in self.websocket\_hub.players:  
> > > > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;socket\_id = self.websocket\_hub.players[player\_id]  
> > > > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return socket\_id
> > > > 
> > > > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return None
> > > > 
> > > > &nbsp;&nbsp;&nbsp;&nbsp;def set\_player\_socket\_id(self, player\_id, socket\_id):  
> > > > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn = self.websocket\_hub.\_get\_connection(socket\_id)  
> > > > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn.player\_id = player\_id
> > > > 
> > > > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if not hasattr(self.websocket\_hub, 'players'):  
> > > > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.websocket\_hub.players = dict()
> > > > 
> > > > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.websocket\_hub.players[player\_id] = socket\_id

---

<div class="post-metadata">

**Author:** ![Conor\_Seabrook](https://yyz1.discourse-cdn.com/flex031/user_avatar/discourse.nameko.io/conor_seabrook/32/85_2.png) [@Conor\_Seabrook](https://discourse.nameko.io/u/Conor_Seabrook)\
**Post date:** [February 1, 2016, 1:20pm UTC](https://discourse.nameko.io/t/websocket-connect-disconnect/119/5 "2016-02-01T13:20:37Z")

</div>

Hi David,

I played around with creating a new entry point but in the end opted to  
extend the WebSocketHub. I actually just tied into the "cleanup\_websocket"  
function to remove the user from the mapping.

Appreciate the help and am really liking the framework.. our monolith's  
days are numbered :).

Thanks,  
Conor

> **···**
>
> On Monday, February 1, 2016 at 4:11:16 AM UTC-5, David Szotten wrote:
> 
> > Cool. Let me know how you get on and if you need any more help/advice.
> > 
> > D
> > 
> > On Friday, 29 January 2016 19:34:30 UTC, conor.s...@gmail.com wrote:
> > 
> > > Thanks, I'll give that a shot.
> > > 
> > > On Friday, January 29, 2016 at 2:01:44 PM UTC-5, David Szotten wrote:
> > > 
> > > > Hi,
> > > > 
> > > > As i mentioned on the ticket  
> > > > \<[Issues · nameko/nameko · GitHub](https://github.com/onefinestay/nameko/issues/308&gt;), I think you want to  
> > > > build a new entrypoint, similar to nameko.web.websocket:WebSocketRpc, but  
> > > > using a modified WebSocketServer that overrides e.g. `add_websocket` to  
> > > > (also) do something like find your `ConnectedProvider` and fire it
> > > > 
> > > > Then you add methods to your service class decorated with your new  
> > > > entrypoint
> > > > 
> > > > Best,  
> > > > David
> > > > 
> > > > On Friday, 29 January 2016 16:28:42 UTC, conor.s...@gmail.com wrote:
> > > > 
> > > > > Hello!
> > > > > 
> > > > > I have a number of nameko services behind a websocket gateway service.  
> > > > > The gateway service maps user\_ids to socket\_ids and is responsible for  
> > > > > routing messages to and from services and users. What I'm looking to do is  
> > > > > get a disconnect event from the websocket dependency so I can notify  
> > > > > services and clean up the user/socket mapping.
> > > > > 
> > > > > I've added a user dictionary to the websocket\_hub, but without a  
> > > > > disconnect event I'm unable to cleanup the mapping. Looking for some  
> > > > > pointers on how to implement this.
> > > > > 
> > > > > Thanks!
> > > > > 
> > > > > &nbsp;&nbsp;&nbsp;&nbsp;@event\_handler("jackpot", "\*")  
> > > > > &nbsp;&nbsp;&nbsp;&nbsp;def jackpot\_handler(self, payload):  
> > > > > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.handle\_event("jackpot", payload)  
> > > > > &nbsp;&nbsp;&nbsp;&nbsp;  
> > > > > &nbsp;&nbsp;&nbsp;&nbsp;def handle\_event(self, service, payload):  
> > > > > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if "players" in payload:  
> > > > > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;players = payload["players"]  
> > > > > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;event = payload["event"]  
> > > > > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data = payload["data"]
> > > > > 
> > > > > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if players == "\*":  
> > > > > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# Broadcast to any players who have subscribed to  
> > > > > service  
> > > > > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.websocket\_hub.broadcast(service, event, data)  
> > > > > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else:  
> > > > > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# Send to specific players  
> > > > > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for player\_id in players:  
> > > > > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;socket\_id = self.get\_player\_socket\_id(player\_id)  
> > > > > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if socket\_id:  
> > > > > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.websocket\_hub.unicast(socket\_id, event,  
> > > > > data)
> > > > > 
> > > > > &nbsp;&nbsp;&nbsp;&nbsp;def get\_player\_socket\_id(self, player\_id):  
> > > > > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if hasattr(self.websocket\_hub, 'players'):  
> > > > > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if player\_id in self.websocket\_hub.players:  
> > > > > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;socket\_id = self.websocket\_hub.players[player\_id]  
> > > > > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return socket\_id
> > > > > 
> > > > > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return None
> > > > > 
> > > > > &nbsp;&nbsp;&nbsp;&nbsp;def set\_player\_socket\_id(self, player\_id, socket\_id):  
> > > > > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn = self.websocket\_hub.\_get\_connection(socket\_id)  
> > > > > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn.player\_id = player\_id
> > > > > 
> > > > > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if not hasattr(self.websocket\_hub, 'players'):  
> > > > > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.websocket\_hub.players = dict()
> > > > > 
> > > > > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.websocket\_hub.players[player\_id] = socket\_id

---

<div class="post-metadata">

**Author:** ![Remco\_Boerma](https://avatars.discourse-cdn.com/v4/letter/r/df705f/32.png) [@Remco\_Boerma](https://discourse.nameko.io/u/Remco_Boerma)\
**Post date:** [March 4, 2016, 10:32pm UTC](https://discourse.nameko.io/t/websocket-connect-disconnect/119/6 "2016-03-04T22:32:04Z")

</div>

Seems great to use websockets, I haven't found a working sample nor documentation. Anyone have a pointer for me or preferably an example of how to host a websocket server and use it in nameko? Thanks!

---

<div class="post-metadata">

**Author:** ![Conor\_Seabrook](https://yyz1.discourse-cdn.com/flex031/user_avatar/discourse.nameko.io/conor_seabrook/32/85_2.png) [@Conor\_Seabrook](https://discourse.nameko.io/u/Conor_Seabrook)\
**Post date:** [March 16, 2016, 2:12pm UTC](https://discourse.nameko.io/t/websocket-connect-disconnect/119/7 "2016-03-16T14:12:56Z")

</div>

Here is a simple example that makes a request to another service.

from nameko.web.websocket import rpc

from nameko.rpc import RpcProxy

class GatewayService(object):  
&nbsp;&nbsp;&nbsp;&nbsp;name = "gateway"

&nbsp;&nbsp;&nbsp;&nbsp;other\_service = RpcProxy("other\_service")

&nbsp;&nbsp;&nbsp;&nbsp;@rpc  
&nbsp;&nbsp;&nbsp;&nbsp;def service\_request(self, socket\_id, service, method, args):  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return getattr(getattr(self, service), method)(\*\*args)

Then connect to ws://localhost:8080/ws, using whichever port you configured  
in your config.

From the client, we send a packet that looks like this

&nbsp;&nbsp;&nbsp;&nbsp;data = {  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"method": "service\_request",  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"data": {  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"service": "other\_service",  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"method": "other\_service\_method",  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"args": {"some\_arg": "value", "some\_arg\_2": "value"}  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}  
&nbsp;&nbsp;&nbsp;&nbsp;}

The idea being that the websocket gateway is just a relay to other services.

> **···**
>
> On Friday, March 4, 2016 at 5:32:04 PM UTC-5, remco....@gmail.com wrote:
> 
> > Seems great to use websockets, I haven't found a working sample nor  
> > documentation. Anyone have a pointer for me or preferably an example of how  
> > to host a websocket server and use it in nameko? Thanks!
