По сути, сейчас Undici закрывает практически все кейсы, которые мы хотим видеть для эффективных серверных запросов:
- кэширование запросов
- дедупликация запросов
- ретрай запросов
- проксирование и поддержка переменных окружения http_proxy/no_proxy
- переиспользование tcp сокетов (из коробки, а с http.request для этого нужно прокидывать явно Agent с keepAlive: true)
- dns кэширование
- circuit breaker
- мониторинг/логирование через diagnostics_channel
Мы как раз активно мигрируем на
undici.fetch в Tramvai на замену node-fetch, и это уже вылилось в несколько небольших доработок в undici:- мониторинг кэша - https://github.com/nodejs/undici/pull/4589
- мониторинг прокси - https://github.com/nodejs/undici/pull/4659
- env proxy ближе к стандарту - https://github.com/nodejs/undici/pull/4676
Кстати, классные и дружелюбные мейнтейнеры (называю их за глаза "мои итальянцы"), но уже месяца два не могу дождаться релиза - возможно готовят мажорку или просто хотят большой скоуп фичей за раз.
Так вот, наша особенность - SSR приложения требуют универсальные интерфейсы для сервера и для браузера, для этих целей у нас реализована библиотека @tinkoff/request, которая работает поверх
fetch в браузере и теперь уже поверх undici.fetch в ноде.Если посмотреть на список плагинов @tinkoff/request - https://tramvaijs.github.io/request/docs/plugins/index - мы увидем те же кэши, дедупликацию, circuit breaker (очень кстати эффективный механизм для кейсов когда в обычном виде кэширование не подходит, но можно делать фаллбэк кэши на случай сбоев), в общем все что нужно для хорошего http клиента и не завязано на конкретное окружение.
Специфичные под серверное окружение вещи (dns кэши и прочее) мы настраиваем уже на уровне отдельных Tramvai модулей.
Теперь же получается, что мы дублируем функционал Undici, а было бы очень круто переиспользовать все его возможности - но упираемся в то, что в браузере у нас обычный
fetch, а у мейнтейнеров Undici в принципе планов на веб нет (и это вполне оправданно).Кажется, было бы очень полезно если бы браузерный
fetch расширяли новыми возможностями (по принципу тех же interceptors в Undici), и браузерное API поставляло бы готовые сущности для таких базовых вещей как дедупликация и ретрай запросов, мониторинг, да и наверное проксирование.С другой стороны, многие вещи уже идут в браузере из коробки - кэширование с учетом Cache-Control, E-tag и прочих заголовков, переиспользование TCP сокета открытого под конкретных хост, а все отправленные запросы доступны через
performance.getEntries('fetch').И возможно опциональные изменения нужны именно в браузерные механизмы работы сетевых запросов, или в саму спеку HTTP протокола, где ту же дедупликацию мы могли бы настроить через новые HTTP-заголовки?