feat: Новый формат сообщений
This commit is contained in:
@@ -1,5 +1,7 @@
|
|||||||
import json
|
import json
|
||||||
import logging
|
import logging
|
||||||
|
import asyncio
|
||||||
|
from weakref import WeakValueDictionary
|
||||||
from fastapi import WebSocket, FastAPI, Depends, HTTPException, WebSocketDisconnect, WebSocketException
|
from fastapi import WebSocket, FastAPI, Depends, HTTPException, WebSocketDisconnect, WebSocketException
|
||||||
from fastapi.security import HTTPBasic, HTTPBasicCredentials
|
from fastapi.security import HTTPBasic, HTTPBasicCredentials
|
||||||
from uuid import uuid4
|
from uuid import uuid4
|
||||||
@@ -17,7 +19,36 @@ class Server:
|
|||||||
self._logger.addHandler(logging.NullHandler())
|
self._logger.addHandler(logging.NullHandler())
|
||||||
|
|
||||||
self._server_connection: WebSocket | None = None
|
self._server_connection: WebSocket | None = None
|
||||||
|
self._requests: WeakValueDictionary[str, asyncio.Future] = WeakValueDictionary()
|
||||||
self._register_routes(app)
|
self._register_routes(app)
|
||||||
|
|
||||||
|
async def server_call(self, message: str):
|
||||||
|
return await self._call(self._server_connection, message)
|
||||||
|
|
||||||
|
async def _call(self, socket: WebSocket | None, message: str):
|
||||||
|
if socket is None:
|
||||||
|
raise ConnectionError('PyG2O сервер не подключен')
|
||||||
|
|
||||||
|
request, data = self._make_request()
|
||||||
|
data['data'] = message
|
||||||
|
data = json.dumps(data)
|
||||||
|
# Меняем синтаксис под Squirrel
|
||||||
|
data = data.replace("'", '\\"').replace('True', 'true').replace('False', 'false')
|
||||||
|
|
||||||
|
await socket.send_text(message)
|
||||||
|
return request
|
||||||
|
|
||||||
|
def _make_request(self):
|
||||||
|
request_id = str(uuid4())
|
||||||
|
request = asyncio.Future()
|
||||||
|
self._requests[request_id] = request
|
||||||
|
|
||||||
|
data = {
|
||||||
|
'uuid': request_id,
|
||||||
|
'data': None,
|
||||||
|
}
|
||||||
|
|
||||||
|
return request, data
|
||||||
|
|
||||||
def _register_routes(self, app):
|
def _register_routes(self, app):
|
||||||
@app.get('/pyg2o/auth')
|
@app.get('/pyg2o/auth')
|
||||||
@@ -94,9 +125,9 @@ class Server:
|
|||||||
|
|
||||||
async def _process_server_message(self, message: dict):
|
async def _process_server_message(self, message: dict):
|
||||||
match message:
|
match message:
|
||||||
case {'type': 'message', 'uuid': id, 'data': data}:
|
case {'uuid': id, 'data': data}:
|
||||||
...
|
...
|
||||||
case {'type': 'event', 'uuid': id, 'data': data}:
|
case {'data': data}:
|
||||||
...
|
...
|
||||||
case _:
|
case _:
|
||||||
raise ValueError(f'Неподдерживаемый тип PyG2O Server сообщения: {message}')
|
raise ValueError(f'Неподдерживаемый тип PyG2O Server сообщения: {message}')
|
||||||
|
|||||||
Reference in New Issue
Block a user