Feature: 升级至新版本 websockets client API (#3606)

This commit is contained in:
Ju4tCode
2025-07-30 16:41:13 +08:00
committed by GitHub
parent c52e1307f4
commit 81f899b282
3 changed files with 1200 additions and 1043 deletions

View File

@ -32,8 +32,7 @@ from nonebot.exception import WebSocketClosed
from nonebot.log import LoguruHandler from nonebot.log import LoguruHandler
try: try:
from websockets.exceptions import ConnectionClosed from websockets import ClientConnection, ConnectionClosed, connect
from websockets.legacy.client import Connect, WebSocketClientProtocol
except ModuleNotFoundError as e: # pragma: no cover except ModuleNotFoundError as e: # pragma: no cover
raise ImportError( raise ImportError(
"Please install websockets first to use this driver. " "Please install websockets first to use this driver. "
@ -71,17 +70,15 @@ class Mixin(WebSocketClientMixin):
@override @override
@asynccontextmanager @asynccontextmanager
async def websocket(self, setup: Request) -> AsyncGenerator["WebSocket", None]: async def websocket(self, setup: Request) -> AsyncGenerator["WebSocket", None]:
if setup.proxy is not None:
logger.warning("proxy is not supported by websockets driver")
if isinstance(setup.timeout, Timeout): if isinstance(setup.timeout, Timeout):
timeout = setup.timeout.total or setup.timeout.connect or setup.timeout.read timeout = setup.timeout.total or setup.timeout.connect or setup.timeout.read
else: else:
timeout = setup.timeout timeout = setup.timeout
connection = Connect( connection = connect(
str(setup.url), str(setup.url),
extra_headers={**setup.headers, **setup.cookies.as_header(setup)}, additional_headers={**setup.headers, **setup.cookies.as_header(setup)},
proxy=setup.proxy if setup.proxy is not None else True,
open_timeout=timeout, open_timeout=timeout,
) )
async with connection as ws: async with connection as ws:
@ -92,14 +89,14 @@ class WebSocket(BaseWebSocket):
"""Websockets WebSocket Wrapper""" """Websockets WebSocket Wrapper"""
@override @override
def __init__(self, *, request: Request, websocket: WebSocketClientProtocol): def __init__(self, *, request: Request, websocket: ClientConnection):
super().__init__(request=request) super().__init__(request=request)
self.websocket = websocket self.websocket = websocket
@property @property
@override @override
def closed(self) -> bool: def closed(self) -> bool:
return self.websocket.closed return self.websocket.close_code is not None
@override @override
async def accept(self): async def accept(self):

2224
poetry.lock generated

File diff suppressed because it is too large Load Diff

View File

@ -36,7 +36,7 @@ typing-extensions = ">=4.4.0,<5.0.0"
tomli = { version = "^2.0.1", python = "<3.11" } tomli = { version = "^2.0.1", python = "<3.11" }
pydantic = ">=1.10.0,<3.0.0,!=2.5.0,!=2.5.1,!=2.10.0,!=2.10.1" pydantic = ">=1.10.0,<3.0.0,!=2.5.0,!=2.5.1,!=2.10.0,!=2.10.1"
websockets = { version = ">=10.0", optional = true } websockets = { version = ">=15.0", optional = true }
Quart = { version = ">=0.18.0,<1.0.0", optional = true } Quart = { version = ">=0.18.0,<1.0.0", optional = true }
fastapi = { version = ">=0.93.0,<1.0.0", optional = true } fastapi = { version = ">=0.93.0,<1.0.0", optional = true }
aiohttp = { version = "^3.11.0", extras = ["speedups"], optional = true } aiohttp = { version = "^3.11.0", extras = ["speedups"], optional = true }
@ -46,7 +46,7 @@ uvicorn = { version = ">=0.20.0,<1.0.0", extras = [
], optional = true } ], optional = true }
[tool.poetry.group.dev.dependencies] [tool.poetry.group.dev.dependencies]
ruff = "^0.9.0" ruff = "^0.12.0"
nonemoji = "^0.1.2" nonemoji = "^0.1.2"
pre-commit = "^4.0.0" pre-commit = "^4.0.0"