sage/wwwroot/ws/rtc_signaling.ws
2025-07-16 14:28:41 +08:00

78 lines
2.0 KiB
Plaintext

async def online2all():
lst = [{x:y for x,y in v.items() if x != 'ws' } for v in ws_pool.get_data().values()]
d = DictObject(type='onlineList', onlineList=lst)
info(f'{d=}, {lst=}')
for i in lst:
d1 = [ x for x in lst if x['id'] != i['id'] ]
await ws_pool.sendto({
'type':'onlineList',
'onlineList':d1
} , id=i['id'])
def set_from_data(mydata):
buff = ws_pool.get_data()
d = buff.get(ws_pool.id)
d = {k:v for k,v in d.items() if k!='ws'}
info(f'ws_pool.get_data = {d}')
d = d.copy()
mydata['from'] = d
def save_external_ip(ip):
data = ws_pool.get_data()
mydata = data[ws_pool.id]
mydata.external_ip = ip
ws_pool.set_data(data)
def is_extenal_ip(ip):
# 通常不是以 10.、172.16 - 172.31.、192.168 开头
info(ip)
if ip == '127.0.0.1':
info(f'{ip} is not a external ip')
return False
if ip.startswith('10.'):
info(f'{ip} is not a external ip')
return False
if ip.startswith('192.168.'):
info(f'{ip} is not a external ip')
return False
if ip.startswith('172.'):
v = int(ip.split('.')[1])
if v<=31 and v>=16:
info(f'{ip} is not a external ip')
return False
info(f'{ip} is a external ip')
return True
info(f'{ws_data=}')
v = json.loads(ws_data)
client_data = DictObject(**v)
if client_data.type == 'login':
info(f'0 ========client_data={client_data}, {client_data.info=}')
ws_pool.add_me(client_data.info);
info(f'1 ========client_data={client_data}')
await online2all()
info(f'2 ========client_data={client_data}')
return
if client_data.type == 'logout':
ws_pool.remove_me()
online2all()
return
if client_data.type == 'iceCandidate':
s = client_data.candidate.candidate
ip = s.split(' ')[4]
if len(ip.split(':')) < 2:
if is_extenal_ip(ip):
save_external_ip(ip)
else:
info(f'{ip=} is a ipv6==========')
#
# for the following type
# [ 'callRequest', 'offer', 'iceCandidate', 'callAccepted', 'callRejected',
# 'disconnect', 'answer']:
#
set_from_data(client_data)
await ws_pool.sendto(client_data, id=client_data.to.id)
return