feat: New Server class for FastAPI websockets
This commit is contained in:
@@ -5,6 +5,7 @@ description = ""
|
|||||||
readme = "README.md"
|
readme = "README.md"
|
||||||
requires-python = ">=3.13"
|
requires-python = ">=3.13"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"loguru>=0.7.3",
|
"fastapi>=0.116.1",
|
||||||
|
"uvicorn>=0.35.0",
|
||||||
"websockets>=15.0.1",
|
"websockets>=15.0.1",
|
||||||
]
|
]
|
||||||
|
|||||||
77
ruff.toml
77
ruff.toml
@@ -1,77 +0,0 @@
|
|||||||
# Exclude a variety of commonly ignored directories.
|
|
||||||
exclude = [
|
|
||||||
".bzr",
|
|
||||||
".direnv",
|
|
||||||
".eggs",
|
|
||||||
".git",
|
|
||||||
".git-rewrite",
|
|
||||||
".hg",
|
|
||||||
".ipynb_checkpoints",
|
|
||||||
".mypy_cache",
|
|
||||||
".nox",
|
|
||||||
".pants.d",
|
|
||||||
".pyenv",
|
|
||||||
".pytest_cache",
|
|
||||||
".pytype",
|
|
||||||
".ruff_cache",
|
|
||||||
".svn",
|
|
||||||
".tox",
|
|
||||||
".venv",
|
|
||||||
".vscode",
|
|
||||||
"__pypackages__",
|
|
||||||
"_build",
|
|
||||||
"buck-out",
|
|
||||||
"build",
|
|
||||||
"dist",
|
|
||||||
"node_modules",
|
|
||||||
"site-packages",
|
|
||||||
"venv",
|
|
||||||
]
|
|
||||||
|
|
||||||
# Same as Black.
|
|
||||||
line-length = 88
|
|
||||||
indent-width = 4
|
|
||||||
|
|
||||||
# Assume Python 3.9
|
|
||||||
target-version = "py39"
|
|
||||||
|
|
||||||
[lint]
|
|
||||||
# Enable Pyflakes (`F`) and a subset of the pycodestyle (`E`) codes by default.
|
|
||||||
# Unlike Flake8, Ruff doesn't enable pycodestyle warnings (`W`) or
|
|
||||||
# McCabe complexity (`C901`) by default.
|
|
||||||
select = ["E4", "E7", "E9", "F"]
|
|
||||||
ignore = []
|
|
||||||
|
|
||||||
# Allow fix for all enabled rules (when `--fix`) is provided.
|
|
||||||
fixable = ["ALL"]
|
|
||||||
unfixable = []
|
|
||||||
|
|
||||||
# Allow unused variables when underscore-prefixed.
|
|
||||||
dummy-variable-rgx = "^(_+|(_+[a-zA-Z0-9_]*[a-zA-Z0-9]+?))$"
|
|
||||||
|
|
||||||
[format]
|
|
||||||
# Like Black, use double quotes for strings.
|
|
||||||
quote-style = "double"
|
|
||||||
|
|
||||||
# Like Black, indent with spaces, rather than tabs.
|
|
||||||
indent-style = "space"
|
|
||||||
|
|
||||||
# Like Black, respect magic trailing commas.
|
|
||||||
skip-magic-trailing-comma = false
|
|
||||||
|
|
||||||
# Like Black, automatically detect the appropriate line ending.
|
|
||||||
line-ending = "auto"
|
|
||||||
|
|
||||||
# Enable auto-formatting of code examples in docstrings. Markdown,
|
|
||||||
# reStructuredText code/literal blocks and doctests are all supported.
|
|
||||||
#
|
|
||||||
# This is currently disabled by default, but it is planned for this
|
|
||||||
# to be opt-out in the future.
|
|
||||||
docstring-code-format = false
|
|
||||||
|
|
||||||
# Set the line length limit used when formatting code snippets in
|
|
||||||
# docstrings.
|
|
||||||
#
|
|
||||||
# This only has an effect when the `docstring-code-format` setting is
|
|
||||||
# enabled.
|
|
||||||
docstring-code-line-length = "dynamic"
|
|
||||||
35
src/pyg2o/server_v3.py
Normal file
35
src/pyg2o/server_v3.py
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
from fastapi import WebSocket, FastAPI, Depends
|
||||||
|
from fastapi.security import HTTPBasic, HTTPBasicCredentials
|
||||||
|
|
||||||
|
class Server:
|
||||||
|
|
||||||
|
def __init__(self, app: FastAPI):
|
||||||
|
self._security = HTTPBasic()
|
||||||
|
self._register_routes(app)
|
||||||
|
|
||||||
|
def _register_routes(self, app):
|
||||||
|
@app.get('/auth')
|
||||||
|
async def pyg2o_auth(credentials: HTTPBasicCredentials = Depends(self._security)):
|
||||||
|
...
|
||||||
|
|
||||||
|
@app.websocket('/pyg2o')
|
||||||
|
async def pyg2o_main(websocket: WebSocket):
|
||||||
|
await self._handle_server_connection(websocket)
|
||||||
|
|
||||||
|
@app.websocket('/pyg2o/{playerid}')
|
||||||
|
async def pyg2o_client(websocket: WebSocket, playerid: int):
|
||||||
|
await self._handle_client_connection(websocket, playerid)
|
||||||
|
|
||||||
|
# I have to do this crap, because I've spent like 2hrs to figure out why pyright ignores type: ignore stuff
|
||||||
|
# I give up
|
||||||
|
_ = pyg2o_main
|
||||||
|
_ = pyg2o_client
|
||||||
|
|
||||||
|
async def _verify_server_token(self, headers):
|
||||||
|
...
|
||||||
|
|
||||||
|
async def _handle_server_connection(self, websocket: WebSocket):
|
||||||
|
await websocket.accept()
|
||||||
|
|
||||||
|
async def _handle_client_connection(self, websocket: WebSocket, playerid: int):
|
||||||
|
...
|
||||||
Reference in New Issue
Block a user