feat: Унифицирован формат сообщений
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
from __future__ import annotations
|
||||
import json
|
||||
from types import SimpleNamespace
|
||||
import loguru
|
||||
import asyncio
|
||||
from weakref import WeakValueDictionary, WeakSet, finalize
|
||||
@@ -33,18 +34,24 @@ class Server:
|
||||
cls._register_routes(app)
|
||||
|
||||
@classmethod
|
||||
def publish(cls, topic: str, message) -> asyncio.Future:
|
||||
if topic not in cls._topics:
|
||||
raise KeyError('Клиентов прослушивающих этот топик не существует')
|
||||
def publish(cls, topic: str, event: str, message: dict) -> asyncio.Future | None:
|
||||
try:
|
||||
if topic not in cls._topics:
|
||||
raise KeyError('Клиентов прослушивающих этот топик не существует')
|
||||
|
||||
request, data = cls._make_request()
|
||||
data['data'] = message
|
||||
data = json.dumps(data)
|
||||
# Меняем синтаксис под Squirrel
|
||||
data = data.replace("'", '\\"').replace('True', 'true').replace('False', 'false')
|
||||
# Формируем сообщение
|
||||
request, data = cls._make_request()
|
||||
data['event'] = event
|
||||
data.update(message)
|
||||
data = json.dumps(data)
|
||||
|
||||
asyncio.create_task(cls._send_to_topic(topic, data))
|
||||
return request
|
||||
# Меняем синтаксис под Squirrel
|
||||
data = data.replace("'", '\\"').replace('True', 'true').replace('False', 'false')
|
||||
|
||||
asyncio.create_task(cls._send_to_topic(topic, data))
|
||||
return request
|
||||
except ValueError:
|
||||
cls._logger.exception('message должен быть типа dict')
|
||||
|
||||
@classmethod
|
||||
async def _send_to_topic(cls, topic, data):
|
||||
@@ -52,15 +59,19 @@ class Server:
|
||||
await connection.send_text(data)
|
||||
|
||||
@classmethod
|
||||
async def send(cls, connection: WebSocket, message, uuid: str):
|
||||
data = {
|
||||
'uuid': uuid,
|
||||
'data': message,
|
||||
}
|
||||
data = json.dumps(data)
|
||||
# Меняем синтаксис под Squirrel
|
||||
data = data.replace("'", '\\"').replace('True', 'true').replace('False', 'false')
|
||||
await connection.send_text(data)
|
||||
async def send(cls, connection: WebSocket, event: str, message: dict, uuid: str | None = None):
|
||||
try:
|
||||
data = {
|
||||
'event': event,
|
||||
'uuid': uuid,
|
||||
}
|
||||
data.update(message)
|
||||
data = json.dumps(data)
|
||||
# Меняем синтаксис под Squirrel
|
||||
data = data.replace("'", '\\"').replace('True', 'true').replace('False', 'false')
|
||||
await connection.send_text(data)
|
||||
except ValueError:
|
||||
cls._logger.exception('message должен быть типа dict')
|
||||
|
||||
@classmethod
|
||||
def _make_request(cls):
|
||||
@@ -70,7 +81,6 @@ class Server:
|
||||
|
||||
data = {
|
||||
'uuid': request_id,
|
||||
'data': None,
|
||||
}
|
||||
|
||||
return request, data
|
||||
@@ -136,29 +146,34 @@ class Server:
|
||||
async def _process_message(cls, connection: WebSocket, message: dict):
|
||||
match message:
|
||||
|
||||
case {'event': event, **kwargs}:
|
||||
try:
|
||||
cls._requests[kwargs['uuid']].set_result(kwargs.get('data'))
|
||||
except KeyError:
|
||||
uuid = kwargs.get('uuid')
|
||||
if uuid is not None:
|
||||
del kwargs['uuid']
|
||||
asyncio.create_task(call_event(event, connection, uuid, **kwargs))
|
||||
|
||||
case {'subscribe': topics}:
|
||||
case {'event': 'subscribe', 'topics': topics}:
|
||||
await cls._subscribe(topics, connection)
|
||||
|
||||
case {'unsubscribe': topics}:
|
||||
case {'event': 'unsubscribe', 'topics': topics}:
|
||||
await cls._unsubscribe(topics, connection)
|
||||
|
||||
case {'create_temp_token': token}:
|
||||
case {'event': 'create_temp_token', 'token': token}:
|
||||
cls._temp_tokens.append(token)
|
||||
|
||||
case {'remove_temp_token': token}:
|
||||
case {'event': 'remove_temp_token', 'token': token}:
|
||||
cls._temp_tokens.remove(token)
|
||||
|
||||
case {'init_temp_tokens': tokens}:
|
||||
case {'event': 'init_temp_tokens', 'tokens': tokens}:
|
||||
cls._temp_tokens = cls._temp_tokens + list(tokens.items())
|
||||
|
||||
case {'event': 'sq_response', 'uuid': uuid, 'data': data}:
|
||||
try:
|
||||
cls._requests[uuid].set_result(data)
|
||||
except KeyError:
|
||||
...
|
||||
|
||||
case {'event': event, 'uuid': uuid, **kwargs}:
|
||||
try:
|
||||
cls._requests[uuid].set_result(SimpleNamespace(**kwargs))
|
||||
except KeyError:
|
||||
kwargs['uuid'] = uuid
|
||||
kwargs['connection'] = connection
|
||||
asyncio.create_task(call_event(event, **kwargs))
|
||||
|
||||
case _:
|
||||
raise ValueError(f'Неподдерживаемый тип PyG2O сообщения: {message}')
|
||||
|
||||
Reference in New Issue
Block a user