11"""HTTP backend for SocketDock."""
22
33import logging
4- from typing import Union
4+ from typing import Dict , Union
55
66import aiohttp
77
1414class HTTPBackend (Backend ):
1515 """HTTP backend for SocketDock."""
1616
17- def __init__ (self , connect_uri : str , message_uri : str , disconnect_uri : str ):
17+ def __init__ (
18+ self ,
19+ socket_base_uri : str ,
20+ connect_uri : str ,
21+ message_uri : str ,
22+ disconnect_uri : str ,
23+ ):
1824 """Initialize HTTP backend."""
1925 self ._connect_uri = connect_uri
2026 self ._message_uri = message_uri
2127 self ._disconnect_uri = disconnect_uri
28+ self .socket_base_uri = socket_base_uri
29+
30+ def send_callback (self , connection_id : str ) -> str :
31+ """Return the callback URI for sending a message to a connected socket."""
32+ return f"{ self .socket_base_uri } /{ connection_id } /send"
33+
34+ def disconnect_callback (self , connection_id : str ) -> str :
35+ """Return the callback URI for disconnecting a connected socket."""
36+ return f"{ self .socket_base_uri } /{ connection_id } /disconnect"
2237
23- async def socket_connected (self , callback_uris : dict ):
38+ def callback_uris (self , connection_id : str ) -> Dict [str , str ]:
39+ """Return labelled callback URIs."""
40+ return {
41+ "send" : self .send_callback (connection_id ),
42+ "disconnect" : self .disconnect_callback (connection_id ),
43+ }
44+
45+ async def socket_connected (
46+ self ,
47+ connection_id : str ,
48+ headers : Dict [str , str ],
49+ ):
2450 """Handle inbound socket message, with calback provided."""
2551 http_body = {
26- "meta" : callback_uris ,
52+ "meta" : {
53+ ** self .callback_uris (connection_id ),
54+ "headers" : headers ,
55+ "connection_id" : connection_id ,
56+ },
2757 }
2858
2959 if self ._connect_uri :
@@ -37,11 +67,16 @@ async def socket_connected(self, callback_uris: dict):
3767 LOGGER .debug ("Response: %s" , response )
3868
3969 async def inbound_socket_message (
40- self , callback_uris : dict , message : Union [str , bytes ]
70+ self ,
71+ connection_id : str ,
72+ message : Union [str , bytes ],
4173 ):
4274 """Handle inbound socket message, with calback provided."""
4375 http_body = {
44- "meta" : callback_uris ,
76+ "meta" : {
77+ ** self .callback_uris (connection_id ),
78+ "connection_id" : connection_id ,
79+ },
4580 "message" : message .decode ("utf-8" ) if isinstance (message , bytes ) else message ,
4681 }
4782
@@ -54,11 +89,15 @@ async def inbound_socket_message(
5489 else :
5590 LOGGER .debug ("Response: %s" , response )
5691
57- async def socket_disconnected (self , bundle : dict ):
92+ async def socket_disconnected (self , connection_id : str ):
5893 """Handle socket disconnected."""
5994 async with aiohttp .ClientSession () as session :
60- LOGGER .info ("Notifying of disconnect: %s %s" , self ._disconnect_uri , bundle )
61- async with session .post (self ._disconnect_uri , json = bundle ) as resp :
95+ LOGGER .info (
96+ "Notifying of disconnect: %s %s" , self ._disconnect_uri , connection_id
97+ )
98+ async with session .post (
99+ self ._disconnect_uri , json = {"connection_id" : connection_id }
100+ ) as resp :
62101 response = await resp .text ()
63102 if resp .status != 200 :
64103 LOGGER .error ("Error posting to disconnect uri: %s" , response )
0 commit comments