diff --git a/docker-compose.yml b/docker-compose.yml index e60161917..4d3a7a0e1 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -180,10 +180,10 @@ services: y-provider: user: ${DOCKER_USER:-1000} - build: + build: context: . - dockerfile: ./src/frontend/servers/y-provider/Dockerfile - target: y-provider + dockerfile: ./src/backend/servers/y-provider/Dockerfile + #target: y-provider restart: unless-stopped env_file: - env.d/development/common diff --git a/src/backend/servers/y-provider/Dockerfile b/src/backend/servers/y-provider/Dockerfile new file mode 100644 index 000000000..bba58fd86 --- /dev/null +++ b/src/backend/servers/y-provider/Dockerfile @@ -0,0 +1,13 @@ +FROM python:3.13 + +USER root +RUN pip install hypercorn +RUN pip install git+https://github.com/davidbrochart/pycrdt-websocket.git@query-params + +USER 1000 + +COPY ./src/backend/servers/y-provider/server.py . +#COPY ./server.py . + +CMD python server.py + diff --git a/src/backend/servers/y-provider/server.py b/src/backend/servers/y-provider/server.py new file mode 100644 index 000000000..9d7f06e06 --- /dev/null +++ b/src/backend/servers/y-provider/server.py @@ -0,0 +1,49 @@ +import asyncio +from hypercorn import Config +from hypercorn.asyncio import serve +from pycrdt import Channel, Decoder, write_message +from pycrdt.websocket import ASGIServer, WebsocketServer + + +class MyWebsocket(Channel): + def __init__(self, websocket: Channel): + self._websocket = websocket + self._room_id = websocket.query_params[b"room"][0] + + @property + def path(self) -> str: + return self._websocket.path + + def __aiter__(self) -> "Channel": + return self + + async def __anext__(self) -> bytes: + return await self.recv() + + async def send(self, message: bytes) -> None: + my_message = write_message(self._room_id) + message + return await self._websocket.send(my_message) + + async def recv(self) -> bytes: + my_message = await self._websocket.recv() + decoder = Decoder(my_message) + decoder.read_message() + message = my_message[decoder.i0:] + return message + + +class MyWebsocketServer(WebsocketServer): + async def serve(self, websocket: Channel) -> None: + my_websocket = MyWebsocket(websocket) + await super().serve(my_websocket) + + +async def main(): + websocket_server = MyWebsocketServer() + app = ASGIServer(websocket_server) + config = Config() + config.bind = ["0.0.0.0:4444"] + async with websocket_server: + await serve(app, config, mode="asgi") + +asyncio.run(main())