diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 5b70770..8794c9c 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -33,5 +33,5 @@ jobs: TWINE_PASSWORD: ${{ secrets.PYPI_TOKEN }} run: | python setup.py sdist bdist_wheel - twine upload dist/* + twine upload --skip-existing dist/* diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md new file mode 100644 index 0000000..4c3f0d2 --- /dev/null +++ b/CONTRIBUTORS.md @@ -0,0 +1,6 @@ +# Contributors + +* [Matthew D. Scholefield](https://github.com/MatthewScholefield) - Added cors allowed origins for AsyncServer [#7](https://github.com/pyropy/fastapi-socketio/pull/7) +* [Aaron Tolman](https://github.com/tolmanam) - Reported issue with broken pip download [#5](https://github.com/pyropy/fastapi-socketio/issues/5) +* [Khiem Doan](https://github.com/khiemdoan) - Helped with cleaning up old unused dependencies[#5](https://github.com/pyropy/fastapi-socketio/issues/15) +* [Artem Kolomatskiy](https://github.com/Roxe322) - Fixed invalid usage of enter_room and leave_room[#24](https://github.com/pyropy/fastapi-socketio/issues/24) \ No newline at end of file diff --git a/Pipfile b/Pipfile index c4c9f41..9c4aec2 100644 --- a/Pipfile +++ b/Pipfile @@ -8,15 +8,22 @@ jedi = "*" neovim = "*" [packages] -fastapi = "==0.61.1" -netifaces = "==0.10.6" -pydantic = "==1.6.1" -starlette = "==0.13.6" -python-socketio = "==4.6.0" +fastapi = ">=0.61.1" +netifaces = ">=0.10.6" +pydantic = ">=1.6.1" +starlette = ">=0.13.6" +python-socketio = ">=4.6.0" python-engineio = "*" [test] -pytest = "==6.0.1" +pytest = ">=6.0.1" +fastapi = ">=0.61.1" +netifaces = ">=0.10.6" +pydantic = ">=1.6.1" +starlette = ">=0.13.6" +python-socketio = ">=4.6.0" +python-engineio = "*" + [requires] python_version = "3.8" diff --git a/Pipfile.lock b/Pipfile.lock index f6f4147..31c7d5a 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "ccf9ac43f22dd96a47acfd5c28086eb1484a4965b19a1a004b97a5517999fc90" + "sha256": "66ea5b34a9c92727c054844c2115d439f8d99e26b1e0e81b75030d919194c0a7" }, "pipfile-spec": 6, "requires": { @@ -18,75 +18,83 @@ "default": { "fastapi": { "hashes": [ - "sha256:61ed73b4304413a2ea618d1b95ea866ee386e0e62dd8659c4f5059286f4a39c2", - "sha256:6cc31bb555dd8ca956d1d227477d661e4ac012337242a41d36214ffbda78bfe9" + "sha256:62074dd38541d9d7245f3aacbbd0d44340c53d56186c9b249d261a18dad4874b", + "sha256:8f4c64cd9cea67fb7dd175ca5015961efa572b9f43a8731014dac8929d86225f" ], "index": "pypi", - "version": "==0.61.1" + "version": "==0.62.0" }, "netifaces": { "hashes": [ - "sha256:0c4da523f36d36f1ef92ee183f2512f3ceb9a9d2a45f7d19cda5a42c6689ebe0", - "sha256:137a77c2e0a68a3e409a532fe73340c3df6a59ffe8eb565ec8b1f0a131402d09", - "sha256:2245677ee3aa1244bbd0fbf3d6e0158d38b612eba406e7be9639e7efe0371bfa", - "sha256:337f0fae970ab7a9acf5690516f7c7795f41934350cc1e8ad33c5c0331904ac0", - "sha256:369eb616a6c844987bd4df486bb5f591aa0d5552378c6831f56ed81cfc228cab", - "sha256:3b19bf224b3e46c62f5f5e65a9fbd2e9731cda09289c76aca110a3dbdf0c3332", - "sha256:48275e627ce9220acfed2e1ca1e4cf01f58940412f2aebac7995750b50232701", - "sha256:4ddf0f329d83516bba096b7eb1ad2ee354a98e2483f89ad3a590e653ece963c8", - "sha256:563a18f942a9c9f64eed27fe2a1b3dfb5866a440cdaf4d833213798699cc1789", - "sha256:5a0114933657eebe4985fdf7b0099a27ec75501901000770addca6ad7bd23008", - "sha256:60f25e5b6d2a682a394c87a6d2bf4d38c8dd8999ee32b955af88ceccaef7fe93", - "sha256:61fd2706de21aac11475c921ba0fd98af19d5280702a11c5c8e2e910765dc378", - "sha256:7925add91982cb689963cc28fb8718c006f7713b527d262e32b29b4491cec295", - "sha256:88d8fa4fcccaca07519141e95b42f52fb650bed2e8f5b29c44e22968b92b7097", - "sha256:8c3a2c7d573511507f0f29c9d1a28ce1b2a958b8d0d7a1b1966c6fd0fa5d2953", - "sha256:a0c7c19e1fb62ac6018582f72d15ac056e75c3d2ab222fb25369e7766ed67453", - "sha256:c455ca29737bf9b298408fd78a48f8fc6ddaa1f50a6eb92d814a8874412c631b", - "sha256:ef223d45b73cc96c25a6295f471106b3195d2367b7f153e43490673d89e9240e", - "sha256:f8b352247ae4b6731192d33fd35b27f247e3e4618a2d5cf65de41d46bbb53223" + "sha256:078986caf4d6a602a4257d3686afe4544ea74362b8928e9f4389b5cd262bc215", + "sha256:0c4304c6d5b33fbd9b20fdc369f3a2fef1a8bbacfb6fd05b9708db01333e9e7b", + "sha256:2dee9ffdd16292878336a58d04a20f0ffe95555465fee7c9bd23b3490ef2abf3", + "sha256:3095218b66d359092b82f07c5422293c2f6559cf8d36b96b379cc4cdc26eeffa", + "sha256:30ed89ab8aff715caf9a9d827aa69cd02ad9f6b1896fd3fb4beb998466ed9a3c", + "sha256:4921ed406386246b84465950d15a4f63480c1458b0979c272364054b29d73084", + "sha256:563a1a366ee0fb3d96caab79b7ac7abd2c0a0577b157cc5a40301373a0501f89", + "sha256:5b3167f923f67924b356c1338eb9ba275b2ba8d64c7c2c47cf5b5db49d574994", + "sha256:6d84e50ec28e5d766c9911dce945412dc5b1ce760757c224c71e1a9759fa80c2", + "sha256:755050799b5d5aedb1396046f270abfc4befca9ccba3074f3dbbb3cb34f13aae", + "sha256:75d3a4ec5035db7478520ac547f7c176e9fd438269e795819b67223c486e5cbe", + "sha256:7a25a8e28281504f0e23e181d7a9ed699c72f061ca6bdfcd96c423c2a89e75fc", + "sha256:7cc6fd1eca65be588f001005446a47981cbe0b2909f5be8feafef3bf351a4e24", + "sha256:86b8a140e891bb23c8b9cb1804f1475eb13eea3dbbebef01fcbbf10fbafbee42", + "sha256:ad10acab2ef691eb29a1cc52c3be5ad1423700e993cc035066049fa72999d0dc", + "sha256:b2ff3a0a4f991d2da5376efd3365064a43909877e9fabfa801df970771161d29", + "sha256:b47e8f9ff6846756be3dc3fb242ca8e86752cd35a08e06d54ffc2e2a2aca70ea", + "sha256:da298241d87bcf468aa0f0705ba14572ad296f24c4fda5055d6988701d6fd8e1", + "sha256:db881478f1170c6dd524175ba1c83b99d3a6f992a35eca756de0ddc4690a1940", + "sha256:f0427755c68571df37dc58835e53a4307884a48dec76f3c01e33eb0d4a3a81d7", + "sha256:f8885cc48c8c7ad51f36c175e462840f163cb4687eeb6c6d7dfaf7197308e36b", + "sha256:f911b7f0083d445c8d24cfa5b42ad4996e33250400492080f5018a28c026db2b" ], "index": "pypi", - "version": "==0.10.6" + "version": "==0.10.9" }, "pydantic": { "hashes": [ - "sha256:1783c1d927f9e1366e0e0609ae324039b2479a1a282a98ed6a6836c9ed02002c", - "sha256:2dc946b07cf24bee4737ced0ae77e2ea6bc97489ba5a035b603bd1b40ad81f7e", - "sha256:2de562a456c4ecdc80cf1a8c3e70c666625f7d02d89a6174ecf63754c734592e", - "sha256:36dbf6f1be212ab37b5fda07667461a9219c956181aa5570a00edfb0acdfe4a1", - "sha256:3fa799f3cfff3e5f536cbd389368fc96a44bb30308f258c94ee76b73bd60531d", - "sha256:40d765fa2d31d5be8e29c1794657ad46f5ee583a565c83cea56630d3ae5878b9", - "sha256:418b84654b60e44c0cdd5384294b0e4bc1ebf42d6e873819424f3b78b8690614", - "sha256:4900b8820b687c9a3ed753684337979574df20e6ebe4227381d04b3c3c628f99", - "sha256:530d7222a2786a97bc59ee0e0ebbe23728f82974b1f1ad9a11cd966143410633", - "sha256:54122a8ed6b75fe1dd80797f8251ad2063ea348a03b77218d73ea9fe19bd4e73", - "sha256:6c3f162ba175678218629f446a947e3356415b6b09122dcb364e58c442c645a7", - "sha256:b49c86aecde15cde33835d5d6360e55f5e0067bb7143a8303bf03b872935c75b", - "sha256:b5b3489cb303d0f41ad4a7390cf606a5f2c7a94dcba20c051cd1c653694cb14d", - "sha256:cf3933c98cb5e808b62fae509f74f209730b180b1e3c3954ee3f7949e083a7df", - "sha256:eb75dc1809875d5738df14b6566ccf9fd9c0bcde4f36b72870f318f16b9f5c20", - "sha256:f769141ab0abfadf3305d4fcf36660e5cf568a666dd3efab7c3d4782f70946b1", - "sha256:f8af9b840a9074e08c0e6dc93101de84ba95df89b267bf7151d74c553d66833b" + "sha256:025bf13ce27990acc059d0c5be46f416fc9b293f45363b3d19855165fee1874f", + "sha256:185e18134bec5ef43351149fe34fda4758e53d05bb8ea4d5928f0720997b79ef", + "sha256:213125b7e9e64713d16d988d10997dabc6a1f73f3991e1ff8e35ebb1409c7dc9", + "sha256:24ca47365be2a5a3cc3f4a26dcc755bcdc9f0036f55dcedbd55663662ba145ec", + "sha256:38be427ea01a78206bcaf9a56f835784afcba9e5b88fbdce33bbbfbcd7841229", + "sha256:475f2fa134cf272d6631072554f845d0630907fce053926ff634cc6bc45bf1af", + "sha256:514b473d264671a5c672dfb28bdfe1bf1afd390f6b206aa2ec9fed7fc592c48e", + "sha256:59e45f3b694b05a69032a0d603c32d453a23f0de80844fb14d55ab0c6c78ff2f", + "sha256:5b24e8a572e4b4c18f614004dda8c9f2c07328cb5b6e314d6e1bbd536cb1a6c1", + "sha256:6e3874aa7e8babd37b40c4504e3a94cc2023696ced5a0500949f3347664ff8e2", + "sha256:8d72e814c7821125b16f1553124d12faba88e85405b0864328899aceaad7282b", + "sha256:a4143c8d0c456a093387b96e0f5ee941a950992904d88bc816b4f0e72c9a0009", + "sha256:b2b054d095b6431cdda2f852a6d2f0fdec77686b305c57961b4c5dd6d863bf3c", + "sha256:c59ea046aea25be14dc22d69c97bee629e6d48d2b2ecb724d7fe8806bf5f61cd", + "sha256:d1fe3f0df8ac0f3a9792666c69a7cd70530f329036426d06b4f899c025aca74e", + "sha256:d8df4b9090b595511906fa48deda47af04e7d092318bfb291f4d45dfb6bb2127", + "sha256:dba5c1f0a3aeea5083e75db9660935da90216f8a81b6d68e67f54e135ed5eb23", + "sha256:e682f6442ebe4e50cb5e1cfde7dda6766fb586631c3e5569f6aa1951fd1a76ef", + "sha256:ecb54491f98544c12c66ff3d15e701612fc388161fd455242447083350904730", + "sha256:f5b06f5099e163295b8ff5b1b71132ecf5866cc6e7f586d78d7d3fd6e8084608", + "sha256:f6864844b039805add62ebe8a8c676286340ba0c6d043ae5dea24114b82a319e", + "sha256:ffd180ebd5dd2a9ac0da4e8b995c9c99e7c74c31f985ba090ee01d681b1c4b95" ], "index": "pypi", - "version": "==1.6.1" + "version": "==1.7.3" }, "python-engineio": { "hashes": [ - "sha256:36b33c6aa702d9b6a7f527eec6387a2da1a9a24484ec2f086d76576413cef04b", - "sha256:cfded18156862f94544a9f8ef37f56727df731c8552d7023f5afee8369be2db6" + "sha256:5a9e6086d192463b04a1428ff1f85b6ba631bbb19d453b144ffc04f530542b84", + "sha256:eab4553f2804c1ce97054c8b22cf0d5a9ab23128075248b97e1a5b2f29553085" ], "index": "pypi", - "version": "==3.13.2" + "version": "==3.14.2" }, "python-socketio": { "hashes": [ - "sha256:358d8fbbc029c4538ea25bcaa283e47f375be0017fcba829de8a3a731c9df25a", - "sha256:d437f797c44b6efba2f201867cf02b8c96b97dff26d4e4281ac08b45817cd522" + "sha256:5a21da53fdbdc6bb6c8071f40e13d100e0b279ad997681c2492478e06f370523", + "sha256:cd1f5aa492c1eb2be77838e837a495f117e17f686029ebc03d62c09e33f4fa10" ], "index": "pypi", - "version": "==4.6.0" + "version": "==4.6.1" }, "six": { "hashes": [ @@ -108,25 +116,26 @@ "develop": { "greenlet": { "hashes": [ - "sha256:1000038ba0ea9032948e2156a9c15f5686f36945e8f9906e6b8db49f358e7b52", - "sha256:133ba06bad4e5f2f8bf6a0ac434e0fd686df749a86b3478903b92ec3a9c0c90b", - "sha256:1429dc183b36ec972055e13250d96e174491559433eb3061691b446899b87384", - "sha256:1b805231bfb7b2900a16638c3c8b45c694334c811f84463e52451e00c9412691", - "sha256:3a35e33902b2e6079949feed7a2dafa5ac6f019da97bd255842bb22de3c11bf5", - "sha256:5ea034d040e6ab1d2ae04ab05a3f37dbd719c4dee3804b13903d4cc794b1336e", - "sha256:682328aa576ec393c1872615bcb877cf32d800d4a2f150e1a5dc7e56644010b1", - "sha256:6e06eac722676797e8fce4adb8ad3dc57a1bb3adfb0dd3fdf8306c055a38456c", - "sha256:7eed31f4efc8356e200568ba05ad645525f1fbd8674f1e5be61a493e715e3873", - "sha256:80cb0380838bf4e48da6adedb0c7cd060c187bb4a75f67a5aa9ec33689b84872", - "sha256:b0b2a984bbfc543d144d88caad6cc7ff4a71be77102014bd617bd88cfb038727", - "sha256:c196a5394c56352e21cb7224739c6dd0075b69dd56f758505951d1d8d68cf8a9", - "sha256:d83c1d38658b0f81c282b41238092ed89d8f93c6e342224ab73fb39e16848721", - "sha256:df7de669cbf21de4b04a3ffc9920bc8426cab4c61365fa84d79bf97401a8bef7", - "sha256:e5db19d4a7d41bbeb3dd89b49fc1bc7e6e515b51bbf32589c618655a0ebe0bf0", - "sha256:e695ac8c3efe124d998230b219eb51afb6ef10524a50b3c45109c4b77a8a3a92", - "sha256:eac2a3f659d5f41d6bbfb6a97733bc7800ea5e906dc873732e00cebb98cec9e4" + "sha256:1023d7b43ca11264ab7052cb09f5635d4afdb43df55e0854498fc63070a0b206", + "sha256:124a3ae41215f71dc91d1a3d45cbf2f84e46b543e5d60b99ecc20e24b4c8f272", + "sha256:13037e2d7ab2145300676852fa069235512fdeba4ed1e3bb4b0677a04223c525", + "sha256:3af587e9813f9bd8be9212722321a5e7be23b2bc37e6323a90e592ab0c2ef117", + "sha256:41d8835c69a78de718e466dd0e6bfd4b46125f21a67c3ff6d76d8d8059868d6b", + "sha256:4481002118b2f1588fa3d821936ffdc03db80ef21186b62b90c18db4ba5e743b", + "sha256:47825c3a109f0331b1e54c1173d4e57fa000aa6c96756b62852bfa1af91cd652", + "sha256:5494e3baeacc371d988345fbf8aa4bd15555b3077c40afcf1994776bb6d77eaf", + "sha256:75e4c27188f28149b74e7685809f9227410fd15432a4438fc48627f518577fa5", + "sha256:97f2b01ab622a4aa4b3724a3e1fba66f47f054c434fbaa551833fa2b41e3db51", + "sha256:a34023b9eabb3525ee059f3bf33a417d2e437f7f17e341d334987d4091ae6072", + "sha256:ac85db59aa43d78547f95fc7b6fd2913e02b9e9b09e2490dfb7bbdf47b2a4914", + "sha256:be7a79988b8fdc5bbbeaed69e79cfb373da9759242f1565668be4fb7f3f37552", + "sha256:bee111161420f341a346731279dd976be161b465c1286f82cc0779baf7b729e8", + "sha256:ccd62f09f90b2730150d82f2f2ffc34d73c6ce7eac234aed04d15dc8a3023994", + "sha256:d3436110ca66fe3981031cc6aff8cc7a40d8411d173dde73ddaa5b8445385e2d", + "sha256:e495096e3e2e8f7192afb6aaeba19babc4fb2bdf543d7b7fed59e00c1df7f170", + "sha256:e66a824f44892bc4ec66c58601a413419cafa9cec895e63d8da889c8a1a4fa4a" ], - "version": "==0.4.16" + "version": "==0.4.17" }, "jedi": { "hashes": [ diff --git a/README.md b/README.md index a3d232b..7522ffd 100644 --- a/README.md +++ b/README.md @@ -49,6 +49,34 @@ async def handle_leave(sid, *args, **kwargs): ``` +### Working with distributed applications + +When working with distributed applications, it is often necessary to access the functionality of the Socket.IO from multiple processes. As a solution to the above problems, the Socket.IO server can be configured to connect to a message queue such as `Redis` or `RabbitMQ`, to communicate with other related Socket.IO servers or auxiliary workers. + +Refer this link for more details https://python-socketio.readthedocs.io/en/latest/server.html#using-a-message-queue + +```python +# app.py +import socketio + +from fastapi import FastAPI +from fastapi_socketio import SocketManager + +app = FastAPI() +redis_manager = socketio.AsyncRedisManager('redis://') + +socket_manager = SocketManager(app=app, client_manager=redis_manager) +``` + +### Emitting from external process + +```python +# emitter.py +import socketio + +external_sio = socketio.RedisManager('redis://', write_only=True) # connect to the redis queue as an external process +external_sio.emit('my event', data={'foo': 'bar'}, room='my room') # emit an event +``` ## Development To contribute to this library, first checkout the code. Then create a new virtual environment: @@ -68,3 +96,18 @@ Now install the dependencies and tests: To run the tests: pytest + + +## Run example + +To run the examples simply run: + +```bash +PYTHONPATH=. python examples/app.py +``` + +Before running example make sure you have all dependencies installed. + +## Contributors + +For list of contributors please reefer to CONTRIBUTORS.md file in this repository. \ No newline at end of file diff --git a/examples/app.py b/examples/app.py index 8909fdf..fe62c18 100644 --- a/examples/app.py +++ b/examples/app.py @@ -25,4 +25,4 @@ async def test(sid, *args, **kwargs): import uvicorn - uvicorn.run("examples:app", host='0.0.0.0', port=8000, reload=True, debug=False) + uvicorn.run("examples.app:app", host='0.0.0.0', port=8000, reload=True, debug=False) diff --git a/fastapi_socketio/__init__.py b/fastapi_socketio/__init__.py index 8c57d9f..4bf4510 100644 --- a/fastapi_socketio/__init__.py +++ b/fastapi_socketio/__init__.py @@ -1,4 +1 @@ -from .socket_manager import SocketManager - -def example_function(): - return 1 + 1 +from .socket_manager import SocketManager \ No newline at end of file diff --git a/fastapi_socketio/socket_manager.py b/fastapi_socketio/socket_manager.py index 653d6b8..e6be387 100644 --- a/fastapi_socketio/socket_manager.py +++ b/fastapi_socketio/socket_manager.py @@ -1,4 +1,8 @@ +from typing import Union + import socketio + +from socketio.asyncio_manager import AsyncManager from fastapi import FastAPI @@ -21,10 +25,13 @@ def __init__( app: FastAPI, mount_location: str = "/ws", socketio_path: str = "socket.io", - cors_allowed_origins: list = [], + cors_allowed_origins: Union[str, list] = '*', + async_mode: str = "asgi", + client_manager=None ) -> None: # TODO: Change Cors policy based on fastapi cors Middleware - self._sio = socketio.AsyncServer(async_mode="asgi", cors_allowed_origins="*") + self._sio = socketio.AsyncServer( + async_mode=async_mode, cors_allowed_origins=cors_allowed_origins, client_manager=client_manager) self._app = socketio.ASGIApp( socketio_server=self._sio, socketio_path=socketio_path ) @@ -86,3 +93,15 @@ def start_background_task(self): @property def sleep(self): return self._sio.sleep + + @property + def enter_room(self): + return self._sio.enter_room + + @property + def leave_room(self): + return self._sio.leave_room + + @property + def rooms(self): + return self._sio.rooms diff --git a/setup.py b/setup.py index 61d9448..a1261d3 100644 --- a/setup.py +++ b/setup.py @@ -1,7 +1,7 @@ from setuptools import setup import os -VERSION = "0.1" +VERSION = "0.0.9" def get_long_description(): @@ -28,7 +28,10 @@ def get_long_description(): license="Apache License, Version 2.0", version=VERSION, packages=["fastapi_socketio"], - install_requires=[], + install_requires=[ + "fastapi>=0.61.1", + "python-socketio>=4.6.0", + ], extras_require={"test": ["pytest"]}, tests_require=["fastapi-socketio[test]"], ) diff --git a/tests/test_fastapi_socketio.py b/tests/test_fastapi_socketio.py index 8d5ebdf..603860f 100644 --- a/tests/test_fastapi_socketio.py +++ b/tests/test_fastapi_socketio.py @@ -1,5 +1,2 @@ -from fastapi_socketio import example_function - - -def test_example_function(): - assert example_function() == 2 +def test_dummy(): + assert True \ No newline at end of file