fix: prevent stale header rules with versioned storage meta#88
Open
Kirrrusha wants to merge 2 commits into
Open
fix: prevent stale header rules with versioned storage meta#88Kirrrusha wants to merge 2 commits into
Kirrrusha wants to merge 2 commits into
Conversation
🤖 Pull request artifacts
|
13f91af to
1585555
Compare
1585555 to
c7d6752
Compare
c7d6752 to
92e9ea1
Compare
1148fb8 to
6813c3a
Compare
86e0f30 to
386b0d7
Compare
5d6b119 to
fae69b7
Compare
added 2 commits
May 3, 2026 14:25
## Summary
Исправляет Windows-специфичную гонку, когда при переключении вкладок и редактировании заголовков могли применяться **устаревшие** значения (старый снапшот из storage), перезаписывая актуальную конфигурацию.
## Changes
- **Атомарное обновление DNR-правил**: применяем `declarativeNetRequest.updateDynamicRules({ removeRuleIds, addRules })` одним вызовом, чтобы избежать гонки remove→add.
- **Сериализация применения в background**: добавлена очередь (single-flight), которая склеивает параллельные триггеры и гарантирует "latest wins".
- **Строгая версия конфигурации**: сохраняем `headersConfigMetaV1` (`seq`, монотонный `updatedAt`) и в background пропускаем устаревшие снапшоты, даже если события приходят не по порядку.
- **Убрано лишнее применение на смене вкладки**: DNR-правила глобальные, поэтому пересборка на `tabs.onActivated` только увеличивала вероятность гонок.
- **Убран legacy reload-путь**: удалены `updateOverrideHeaders`/runtime reload message; обновления теперь идут через `storage.onChanged`.
## Why this works
На Windows из-за другой латентности и планирования событий чаще происходили перекрывающиеся триггеры применения правил. Версионирование + очередь не позволяют применить старую конфигурацию "после" новой.
## Test plan
- `pnpm test:unit`
- Ручная проверка (Windows):
- Менять значения заголовков в popup и быстро переключать вкладки (несколько раз).
- Проверить, что запросы уходят с **последними** значениями заголовков.
- В логах background убедиться, что устаревшие снапшоты пропускаются (`Apply skipped (stale meta)`), а применения идут последовательно.
## Notes
- `seq` — best-effort при конкурентных записях; `updatedAt` принудительно монотонный и используется как tie-breaker.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Исправляет Windows-специфичную гонку, когда при переключении вкладок и редактировании заголовков могли применяться устаревшие значения (старый снапшот из storage), перезаписывая актуальную конфигурацию.
Changes
declarativeNetRequest.updateDynamicRules({ removeRuleIds, addRules })одним вызовом, чтобы избежать гонки remove→add.headersConfigMetaV1(seq, монотонныйupdatedAt) и в background пропускаем устаревшие снапшоты, даже если события приходят не по порядку.tabs.onActivatedтолько увеличивала вероятность гонок.updateOverrideHeaders/runtime reload message; обновления теперь идут черезstorage.onChanged.Why this works
На Windows из-за другой латентности и планирования событий чаще происходили перекрывающиеся триггеры применения правил. Версионирование + очередь не позволяют применить старую конфигурацию "после" новой.
Test plan
pnpm test:unitApply skipped (stale meta)), а применения идут последовательно.Notes
seq— best-effort при конкурентных записях;updatedAtпринудительно монотонный и используется как tie-breaker.