From 463becb7ed62ea3924a9af1da0e78be0f886ad8c Mon Sep 17 00:00:00 2001 From: beerpsi <92439990+beer-psi@users.noreply.github.com> Date: Thu, 9 Oct 2025 04:33:29 +0700 Subject: [PATCH] Use compression.zstd for gateway compression on Python 3.14 --- discord/utils.py | 21 ++++++++++++++++++++- pyproject.toml | 2 +- 2 files changed, 21 insertions(+), 2 deletions(-) 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]",