diff --git a/src/gisaf/api/geoapi.py b/src/gisaf/api/geoapi.py index c32ca17..44aebf6 100644 --- a/src/gisaf/api/geoapi.py +++ b/src/gisaf/api/geoapi.py @@ -3,7 +3,6 @@ Geographical json stores, served under /gj Used for displaying features on maps """ -from json import JSONDecodeError import logging from typing import Annotated from asyncio import CancelledError @@ -15,17 +14,14 @@ from fastapi import ( Response, Header, WebSocket, - WebSocketDisconnect, status, ) from gisaf.models.authentication import User from gisaf.redis_tools import store as redis_store -from gisaf.live import live_server from gisaf.registry import registry from gisaf.security import get_current_active_user - logger = logging.getLogger(__name__) api = APIRouter( @@ -59,37 +55,6 @@ class ConnectionManager: manager = ConnectionManager() -@api.websocket("/live/{store}") -async def live_layer(store: str, websocket: WebSocket): - """ - Websocket for live layer updates - """ - await websocket.accept() - try: - while True: - try: - msg_data = await websocket.receive_json() - except JSONDecodeError: - msg_text = await websocket.receive_text() - if msg_text == "close": - await websocket.close() - continue - # else: - if "message" in msg_data: - if msg_data["message"] == "subscribeLiveLayer": - live_server.add_subscription(websocket, store) - elif msg_data["message"] == "unsubscribeLiveLayer": - live_server.remove_subscription(websocket, store) - else: - logger.warning( - f"Got websocket message with no message field: {msg_data}" - ) - except WebSocketDisconnect: - logger.debug("Websocket disconnected") - - # logger.debug('websocket connection closed') - - @api.get("/{store_name}") async def get_geojson( store_name, diff --git a/src/gisaf/api/ws.py b/src/gisaf/api/ws.py new file mode 100644 index 0000000..89d1f85 --- /dev/null +++ b/src/gisaf/api/ws.py @@ -0,0 +1,43 @@ +from json import JSONDecodeError +import logging + +from fastapi import WebSocket, APIRouter, WebSocketDisconnect + +from gisaf.live import live_server + +logger = logging.getLogger(__name__) + +api = APIRouter( + tags=["websockets"], + responses={404: {"description": "Not found"}}, +) + + +@api.websocket("/live/{store}") +async def live_layer(store: str, websocket: WebSocket): + """ + Websocket for live layer updates + """ + await websocket.accept() + try: + while True: + try: + msg_data = await websocket.receive_json() + except JSONDecodeError: + msg_text = await websocket.receive_text() + if msg_text == "close": + await websocket.close() + continue + # else: + if "message" in msg_data: + if msg_data["message"] == "subscribeLiveLayer": + live_server.add_subscription(websocket, store) + elif msg_data["message"] == "unsubscribeLiveLayer": + live_server.remove_subscription(websocket, store) + else: + logger.warning( + f"Got websocket message with no message field: {msg_data}" + ) + except WebSocketDisconnect: + logger.debug("Websocket disconnected") + # logger.debug('websocket connection closed') diff --git a/src/gisaf/application.py b/src/gisaf/application.py index 524822f..fe6cdd5 100644 --- a/src/gisaf/application.py +++ b/src/gisaf/application.py @@ -15,6 +15,7 @@ from gisaf.api.admin import api as admin_api from gisaf.api.dashboard import api as dashboard_api from gisaf.api.map import api as map_api from gisaf.api.download import api as download_api +from gisaf.api.ws import api as ws_api from gisaf.plugins import manager as plugin_manager logging.basicConfig(level=conf.gisaf.debugLevel) @@ -45,6 +46,7 @@ app = FastAPI( app.include_router(api, prefix="/api") app.include_router(geoapi, prefix="/api/gj") +app.include_router(ws_api, prefix="/gj") app.include_router(admin_api, prefix="/api/admin") app.include_router(dashboard_api, prefix="/api/dashboard") app.include_router(map_api, prefix="/api/map")