bugfix
This commit is contained in:
parent
e940467a2b
commit
5f0e01941c
102
rtcllm/wss.py
Normal file
102
rtcllm/wss.py
Normal file
@ -0,0 +1,102 @@
|
|||||||
|
|
||||||
|
from websockets.client import connect
|
||||||
|
import websockets
|
||||||
|
from appPublic.background import Background
|
||||||
|
from appPublic.uniqueID import getID
|
||||||
|
from appPublic.dictObject import DictObject
|
||||||
|
|
||||||
|
class Wss:
|
||||||
|
"""
|
||||||
|
new session
|
||||||
|
session_type: p2p, aba, meeting
|
||||||
|
|
||||||
|
signaling data format
|
||||||
|
{
|
||||||
|
type:callRequest,
|
||||||
|
sessionid:kkkk,
|
||||||
|
sessiontype:...
|
||||||
|
from:
|
||||||
|
to:
|
||||||
|
}
|
||||||
|
"""
|
||||||
|
def __init__(self, app, wss_url, info=None, handler_name='sessionid'):
|
||||||
|
self.wss_url = wss_url
|
||||||
|
if info is None:
|
||||||
|
info = {
|
||||||
|
'id':getID()
|
||||||
|
}
|
||||||
|
self.ifno = info
|
||||||
|
self.ws = None
|
||||||
|
self.handler_name = handler_name
|
||||||
|
self.app = app
|
||||||
|
self.running = False
|
||||||
|
self.app.wss = self
|
||||||
|
self.handlers = {}
|
||||||
|
self.sessionhandlers = {}
|
||||||
|
self.peers = []
|
||||||
|
|
||||||
|
def add_handler(self, key, handler):
|
||||||
|
sef.handlers[key] = handler
|
||||||
|
|
||||||
|
def start(self):
|
||||||
|
loop = asyncio.get_running_loop()
|
||||||
|
f = asyncio.run_coroutine_threadsafe(self._start, loop)
|
||||||
|
return f.result()
|
||||||
|
|
||||||
|
def add_sessionhandler(self, sessiontype, handler):
|
||||||
|
self.sessionhandlers[sessiontype] = handler
|
||||||
|
|
||||||
|
async def _start(self):
|
||||||
|
self.ws = await connect(self.wss_url)
|
||||||
|
self.running = True
|
||||||
|
while self.running:
|
||||||
|
msg = await self.ws.recv()
|
||||||
|
data = DictObject(**json.loads(msg))
|
||||||
|
name = data.get(self.handler_name)
|
||||||
|
handler = self.handlers.get(name)
|
||||||
|
if handler is None:
|
||||||
|
handler = self.recvdata_handler
|
||||||
|
await handler(data)
|
||||||
|
|
||||||
|
async def recvdata_handler(self, data):
|
||||||
|
if data.type == 'info':
|
||||||
|
|
||||||
|
return
|
||||||
|
if data.type == 'session'
|
||||||
|
h = self.sessionhandlers.get(data.sessiontype)
|
||||||
|
i = h(data.from)
|
||||||
|
k = data.get(self.handler_name)
|
||||||
|
self.add_handler(k, i.recvdata_handler)
|
||||||
|
return
|
||||||
|
|
||||||
|
async def stop(self):
|
||||||
|
self.running = False
|
||||||
|
await self.ws.close()
|
||||||
|
|
||||||
|
async def restart(self):
|
||||||
|
try:
|
||||||
|
await self.stop()
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
await self.start()
|
||||||
|
|
||||||
|
async def send(self, dic):
|
||||||
|
dic['from'] = self.info
|
||||||
|
txt = json.dumps(dic)
|
||||||
|
try:
|
||||||
|
return await self.ws.send(txt)
|
||||||
|
except:
|
||||||
|
await self.restart()
|
||||||
|
return self.send(dic)
|
||||||
|
|
||||||
|
async def login(self):
|
||||||
|
d = DictObject()
|
||||||
|
d['from'] = self.info
|
||||||
|
d.type = 'login'
|
||||||
|
await self.send(d)
|
||||||
|
|
||||||
|
async def logout(self):
|
||||||
|
d = DictObject()
|
||||||
|
d['from'] = self.info
|
||||||
|
d.type = 'logout'
|
||||||
|
await self.send(d)
|
Loading…
Reference in New Issue
Block a user