diff --git a/rtcllm/wss.py b/rtcllm/wss.py index 8ea5c7c..964ee1d 100644 --- a/rtcllm/wss.py +++ b/rtcllm/wss.py @@ -11,23 +11,37 @@ class Wss: session_type: p2p, aba, meeting signaling data format + create a new session { - type:callRequest, - sessionid:kkkk, - sessiontype:... + type:new_session, + session:{ + sessiontype: + sessionid + } from: to: } + (will boastcast to all peer online)login: + { + type:login, + from: + } + (will boastcast to all peer online)logout: + { + type:logout + from: + } """ - def __init__(self, app, wss_url, info=None, handler_name='sessionid'): + def __init__(self, app, wss_url, info=None, opts={}): self.wss_url = wss_url if info is None: info = { 'id':getID() } - self.ifno = info + self.opts = opts + self.info = info self.ws = None - self.handler_name = handler_name + self.handler_name = 'sessionid' self.app = app self.running = False self.app.wss = self @@ -58,14 +72,24 @@ class Wss: handler = self.recvdata_handler await handler(data) + def add_peer(self, info): + self.peers = [ i for i in self.peers if i.id != info.id ] + self.peers.append(info) + + def delete_peer(self, info): + self.peers = [ i for i in self.peers if i.id != info.id ] + async def recvdata_handler(self, data): - if data.type == 'info': - + if data.type == 'login': + self.add_peer(data.msgfrom) return - if data.type == 'session' - h = self.sessionhandlers.get(data.sessiontype) + if data.type == 'logout': + self.delete_peer(data.msgfrom) + return + if data.type == 'new_session' + h = self.sessionhandlers.get(data.session.sessiontype) i = h(data.from) - k = data.get(self.handler_name) + k = data.session.sessionid self.add_handler(k, i.recvdata_handler) return @@ -81,7 +105,7 @@ class Wss: await self.start() async def send(self, dic): - dic['from'] = self.info + dic.msgfrom = self.info txt = json.dumps(dic) try: return await self.ws.send(txt) @@ -89,14 +113,30 @@ class Wss: await self.restart() return self.send(dic) + async def new_session(self, sessiontype, opts): + k = self.sessionhandlers.get(sessiontype) + if k is None: + e = Exception(f'Sessiontype({sessiontype}) not registed') + exception(f'new_session() exception {e}') + raise e + d = DictObject() + d.type = 'new_session' + d.msgfrom = self.info + sessionid = getID() + d.session = DictObject(sessiontype=sessiontype, sessionid=sessionid) + await self.send(d) + h = k(self, sessionid, opts) + self.add_sessionhandler(sessionid, h.recvdata_handler) + return h + async def login(self): d = DictObject() - d['from'] = self.info + d.msgfrom = self.info d.type = 'login' await self.send(d) async def logout(self): d = DictObject() - d['from'] = self.info + d.msgfrom = self.info d.type = 'logout' await self.send(d)