Hacker News Digest

28 августа 2025 г. в 21:39 • anubis.techaro.lol • ⭐ 98 • 💬 109

OriginalHN

#javascript#web-application-firewall#proof-of-work#web-performance#browser-detection#cpu-cores#ieee-754

Sometimes CPU cores are odd

Всё ПО содержит баги; чем сложнее код, тем запутаннее ошибки. Однажды я столкнулся с «однострочным» фиксом, который спас пользователей от случайных отказов Anubis.

Как всё началось
Anubis — WAF, который проверяет, что клиент — настоящий браузер. Основной способ — proof-of-work: клиент считает хэши, ограничивая скорость подключения. Чтобы экран-заглушка исчезал быстрее, JS-код использует максимум ядер CPU.

Проблема
Firefox тормозит, если задействовать все ядра; оптимум — половина. В коде было:

threads = Math.max(navigator.hardwareConcurrency / 2, 1)

Все мои тестовые устройства (MacBook, Ryzen, iPhone, Steam Deck…) имели чётное количество ядер, поэтому navigator.hardwareConcurrency / 2 всегда получался целым. Но если устройство с нечётным числом ядер (например, 3), результат — 1.5. JavaScript-числа — это IEEE-754, и дробная часть приводила к багу «invalid response», потому что логика расчёта nonce рассчитана на целые.

Фикс
Округлил до ближайшего целого:

threads = Math.max(Math.floor(navigator.hardwareConcurrency / 2), 1)

Одна строчка — и исчезли случайные отказы на нечётных CPU.