diff --git a/discord/utils.py b/discord/utils.py index dc90c8b95..a4aa2835a 100644 --- a/discord/utils.py +++ b/discord/utils.py @@ -71,10 +71,14 @@ import types import typing import warnings import logging -import zlib import yarl +if sys.version_info >= (3, 14): + import compression.zstd +else: + import zlib + try: import orjson # type: ignore except ModuleNotFoundError: @@ -1437,6 +1441,21 @@ if _HAS_ZSTD: # Each WS message is a complete gateway message return self.context.decompress(data).decode('utf-8') + _ActiveDecompressionContext: Type[_DecompressionContext] = _ZstdDecompressionContext +elif sys.version_info >= (3, 14): + + class _ZstdDecompressionContext: + __slots__ = ('context',) + + COMPRESSION_TYPE: str = 'zstd-stream' + + def __init__(self) -> None: + self.context = compression.zstd.ZstdDecompressor() + + def decompress(self, data: bytes, /) -> str | None: + # Each WS message is a complete gateway message + return self.context.decompress(data).decode('utf-8') + _ActiveDecompressionContext: Type[_DecompressionContext] = _ZstdDecompressionContext else: diff --git a/pyproject.toml b/pyproject.toml index 20d117b01..d32ed9a29 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -58,7 +58,7 @@ speed = [ "aiodns>=1.1; sys_platform != 'win32'", "Brotli", "cchardet==2.1.7; python_version < '3.10'", - "zstandard>=0.23.0" + "zstandard>=0.23.0; python_version <= '3.13'" ] test = [ "coverage[toml]",