9cedd64 perf(bridge): split MTProto packets in O(N) instead of O(N^2)
📊 Changes
1 file changed (+30 additions, -21 deletions)
View changed files
📝proxy/bridge.py (+30 -21)
📄 Description
MsgSplitter.split() удалял каждый разобранный пакет с начала bytearray (del self._cipher_buf[:packet_len] / del self._plain_buf[:packet_len]). Удаление с начала сдвигает весь остаток буфера, поэтому один чанк с множеством мелких пакетов деградировал до O(N²) по числу пакетов в чанке.
Теперь буфер проходится по индексу offset, а del выполняется один раз в конце вызова → нарезка O(N) от размера чанка.
Поведение
Не изменилось. Проверено дифференциальным фаззером против старой реализации: ~9000 случайных потоков с произвольной нарезкой чанков по всем трём протоколам (abridged / intermediate / padded intermediate), включая ветку отключения при нулевой длине пакета. Результаты (выданные пакеты + остаток буфера + флаг _disabled) совпадают байт-в-байт.
Замечания
Изменён только proxy/bridge.py, публичный API не затронут.
Сигнатуры приватных хелперов _next_*_len получили параметры offset/avail.
🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.
## 📋 Pull Request Information
**Original PR:** https://github.com/Flowseal/tg-ws-proxy/pull/913
**Author:** [@f4rceful](https://github.com/f4rceful)
**Created:** 5/30/2026
**Status:** ✅ Merged
**Merged:** 5/30/2026
**Merged by:** [@Flowseal](https://github.com/Flowseal)
**Base:** `main` ← **Head:** `perf/msgsplitter-on2-to-on`
---
### 📝 Commits (1)
- [`9cedd64`](https://github.com/Flowseal/tg-ws-proxy/commit/9cedd641cd5ab31d889afe6bafee7bba4b2f8514) perf(bridge): split MTProto packets in O(N) instead of O(N^2)
### 📊 Changes
**1 file changed** (+30 additions, -21 deletions)
<details>
<summary>View changed files</summary>
📝 `proxy/bridge.py` (+30 -21)
</details>
### 📄 Description
`MsgSplitter.split()` удалял каждый разобранный пакет с начала `bytearray` (`del self._cipher_buf[:packet_len]` / `del self._plain_buf[:packet_len]`). Удаление с начала сдвигает весь остаток буфера, поэтому один чанк с множеством мелких пакетов деградировал до O(N²) по числу пакетов в чанке.
Теперь буфер проходится по индексу `offset`, а `del` выполняется один раз в конце вызова → нарезка O(N) от размера чанка.
## Поведение
Не изменилось. Проверено дифференциальным фаззером против старой реализации: ~9000 случайных потоков с произвольной нарезкой чанков по всем трём протоколам (abridged / intermediate / padded intermediate), включая ветку отключения при нулевой длине пакета. Результаты (выданные пакеты + остаток буфера + флаг `_disabled`) совпадают байт-в-байт.
## Замечания
- Изменён только `proxy/bridge.py`, публичный API не затронут.
- Сигнатуры приватных хелперов `_next_*_len` получили параметры `offset`/`avail`.
---
<sub>🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.</sub>
mirror-bot
changed title from [PR #913] [MERGED] perf(bridge): нарезка MTProto-пакетов за O(N) вместо O(N²) to [PR #913] perf(bridge): нарезка MTProto-пакетов за O(N) вместо O(N²)2026-07-20 04:10:59 +03:00
mirror-bot
changed title from [PR #913] perf(bridge): нарезка MTProto-пакетов за O(N) вместо O(N²) to [PR #913] [MERGED] perf(bridge): нарезка MTProto-пакетов за O(N) вместо O(N²)2026-07-20 23:14:54 +03:00
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
📋 Pull Request Information
Original PR: https://github.com/Flowseal/tg-ws-proxy/pull/913
Author: @f4rceful
Created: 5/30/2026
Status: ✅ Merged
Merged: 5/30/2026
Merged by: @Flowseal
Base:
main← Head:perf/msgsplitter-on2-to-on📝 Commits (1)
9cedd64perf(bridge): split MTProto packets in O(N) instead of O(N^2)📊 Changes
1 file changed (+30 additions, -21 deletions)
View changed files
📝
proxy/bridge.py(+30 -21)📄 Description
MsgSplitter.split()удалял каждый разобранный пакет с началаbytearray(del self._cipher_buf[:packet_len]/del self._plain_buf[:packet_len]). Удаление с начала сдвигает весь остаток буфера, поэтому один чанк с множеством мелких пакетов деградировал до O(N²) по числу пакетов в чанке.Теперь буфер проходится по индексу
offset, аdelвыполняется один раз в конце вызова → нарезка O(N) от размера чанка.Поведение
Не изменилось. Проверено дифференциальным фаззером против старой реализации: ~9000 случайных потоков с произвольной нарезкой чанков по всем трём протоколам (abridged / intermediate / padded intermediate), включая ветку отключения при нулевой длине пакета. Результаты (выданные пакеты + остаток буфера + флаг
_disabled) совпадают байт-в-байт.Замечания
proxy/bridge.py, публичный API не затронут._next_*_lenполучили параметрыoffset/avail.🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.
[PR #913] [MERGED] perf(bridge): нарезка MTProto-пакетов за O(N) вместо O(N²)to [PR #913] perf(bridge): нарезка MTProto-пакетов за O(N) вместо O(N²)[PR #913] perf(bridge): нарезка MTProto-пакетов за O(N) вместо O(N²)to [PR #913] [MERGED] perf(bridge): нарезка MTProto-пакетов за O(N) вместо O(N²)