Десятилетие влияния: как наши npm-пакеты достигли 1 миллиарда загрузок и сформировали JavaScript

NPM packages billion downloads ecosystem

Предисловие

В мире JavaScript и Node.js есть пакеты, которые являются незаменимыми — их скачивают миллионы раз ежедневно, и они поддерживают работу приложений по всему миру. За этими инструментами стоят разработчики, сосредоточенные на качестве открытого кода. Сегодня мы расскажем, как наша команда помогает создавать и поддерживать npm-пакеты, ставшие ключевыми элементами экосистемы JavaScript.

Пионеры, которые нам доверяют: Айзек З. Шлюетер и Forward Email

Мы гордимся тем, что Айзек З. Шлюетер (GitHub: isaacs) является нашим пользователем. Айзек создал npm и помог построить Node.js. Его доверие к Forward Email демонстрирует наш акцент на качестве и безопасности. Айзек использует Forward Email для нескольких доменов, включая izs.me.

Вклад Айзека в JavaScript огромен. В 2009 году он был одним из первых, кто увидел потенциал Node.js, работая с Райаном Далем, создателем платформы. Как сказал Айзек в интервью журналу Increment: «В этой очень маленькой среде из нескольких человек, пытавшихся понять, как реализовать серверный JS, Райан Даль выпустил Node, что было явно правильным подходом. Я поставил на это и очень активно включился примерно в середине 2009 года.»

Note

Для тех, кто интересуется историей Node.js, доступны отличные документальные фильмы, рассказывающие о его развитии, включая The Story of Node.js и 10 Things I Regret About Node.js - Ryan Dahl. Личный сайт Райана Даля personal website также содержит ценные сведения о его работе.

От создания npm до лидерства в Node.js

Айзек создал npm в сентябре 2009 года, а первая рабочая версия была выпущена в начале 2010 года. Этот менеджер пакетов закрыл важную потребность в Node.js, позволяя разработчикам легко делиться и повторно использовать код. Согласно странице Node.js в Википедии, «В январе 2010 года для среды Node.js был представлен менеджер пакетов под названием npm. Менеджер пакетов позволяет программистам публиковать и делиться пакетами Node.js вместе с исходным кодом и предназначен для упрощения установки, обновления и удаления пакетов.»

Когда Райан Даль отошел от Node.js в январе 2012 года, Айзек стал руководителем проекта. Как указано в его резюме, он «руководил разработкой нескольких фундаментальных API ядра Node.js, включая систему модулей CommonJS, API файловой системы и потоки» и «в течение 2 лет выступал в роли BDFL (Benevolent Dictator For Life) проекта, обеспечивая постоянно растущее качество и надежный процесс сборки для версий Node.js с v0.6 по v0.10.»

Айзек провел Node.js через ключевой период роста, установив стандарты, которые до сих пор формируют платформу. Позже он основал npm, Inc. в 2014 году для поддержки реестра npm, который ранее управлял самостоятельно.

Мы благодарим Айзека за его огромный вклад в JavaScript и продолжаем использовать многие созданные им пакеты. Его работа изменила то, как мы создаем программное обеспечение и как миллионы разработчиков по всему миру обмениваются кодом.

Архитектор кода: путь Ника Бау

В основе нашего успеха в открытом коде стоит Ник Бау, основатель и владелец Forward Email. Его работа с JavaScript длится почти 20 лет и сформировала подход множества разработчиков к созданию приложений. Его путь в open source демонстрирует как технические навыки, так и лидерство в сообществе.

Технический комитет Express и основные вклады

Экспертиза Ника в веб-фреймворках принесла ему место в Техническом комитете Express, где он помогал с одним из самых популярных фреймворков Node.js. Сейчас Ник указан как неактивный участник на странице сообщества Express.

Important

Express изначально был создан TJ Holowaychuk, плодовитым участником open source, который сформировал большую часть экосистемы Node.js. Мы благодарны TJ за его фундаментальную работу и уважаем его решение сделать перерыв от обширных вкладов в open source.

В качестве члена Технического комитета Express Ник проявил большое внимание к деталям в вопросах, таких как уточнение документации req.originalUrl и исправление проблем с обработкой multipart форм.

Вклад в Koa Framework

Работа Ника с фреймворком Koa — современным, более легким альтернативным Express, также созданным TJ Holowaychuk — дополнительно демонстрирует его стремление к улучшению инструментов веб-разработки. Его вклад в Koa включает как вопросы, так и код через pull request, решая задачи обработки ошибок, управления типами контента и улучшения документации.

Его работа как с Express, так и с Koa дает ему уникальное понимание веб-разработки на Node.js, помогая нашей команде создавать пакеты, которые хорошо работают с несколькими экосистемами фреймворков.

От индивидуального участника к лидеру организации

То, что началось с помощи существующим проектам, выросло в создание и поддержку целых экосистем пакетов. Ник основал несколько организаций на GitHub — включая Cabin, Spam Scanner, Forward Email, Lad и Bree — каждая из которых решает конкретные задачи в сообществе JavaScript.

Этот переход от участника к лидеру демонстрирует видение Ника по созданию хорошо спроектированного программного обеспечения, решающего реальные проблемы. Организуя связанные пакеты под сфокусированными организациями GitHub, он построил экосистемы инструментов, которые работают вместе, оставаясь при этом модульными и гибкими для широкого сообщества разработчиков.

Наши организации на GitHub: экосистемы инноваций

Мы организуем нашу работу с open source вокруг сфокусированных организаций на GitHub, каждая из которых решает конкретные задачи в JavaScript. Такая структура создает сплоченные семейства пакетов, которые хорошо работают вместе, оставаясь модульными.

Cabin: структурированное логирование для современных приложений

Организация Cabin — наш взгляд на простое и мощное логирование приложений. Основной пакет cabin имеет почти 900 звезд на GitHub и более 100 000 загрузок в неделю[1]. Cabin предоставляет структурированное логирование, которое работает с популярными сервисами, такими как Sentry, LogDNA и Papertrail.

Особенность Cabin — продуманный API и система плагинов. Поддерживающие пакеты, такие как axe для middleware Express и parse-request для парсинга HTTP-запросов, демонстрируют нашу приверженность комплексным решениям, а не изолированным инструментам.

Пакет bson-objectid заслуживает особого упоминания — более 1,7 миллиона загрузок всего за два месяца[2]. Эта легкая реализация MongoDB ObjectID стала стандартом для разработчиков, которым нужны идентификаторы без полной зависимости от MongoDB.

Spam Scanner: борьба с злоупотреблениями в электронной почте

Организация Spam Scanner демонстрирует нашу приверженность решению реальных проблем. Основной пакет spamscanner предоставляет продвинутую систему обнаружения спама в электронной почте, но именно пакет url-regex-safe получил широкое распространение.

С более чем 1,2 миллиона загрузок за два месяца[3], url-regex-safe исправляет критические проблемы безопасности в других регулярных выражениях для обнаружения URL. Этот пакет отражает наш подход к open source: выявлять общие проблемы (в данном случае уязвимости ReDoS в проверке URL), создавать надежное решение и тщательно его поддерживать.

Bree: Современное планирование задач с использованием Worker Threads

Организация Bree — наш ответ на распространённую проблему в Node.js: надёжное планирование задач. Основной пакет bree с более чем 3100 звёздами на GitHub предоставляет современный планировщик задач, использующий worker threads Node.js для лучшей производительности и надёжности.

Note

Bree был создан после того, как мы помогали поддерживать Agenda, применяя полученный опыт для создания более качественного планировщика задач. Наш вклад в Agenda помог нам найти пути улучшения планирования задач.

Что отличает Bree от других планировщиков, таких как Agenda:

  • Отсутствие внешних зависимостей: В отличие от Agenda, которая требует MongoDB, Bree не нуждается ни в Redis, ни в MongoDB для управления состоянием задач.
  • Worker Threads: Bree использует worker threads Node.js для изолированных процессов, обеспечивая лучшую изоляцию и производительность.
  • Простой API: Bree предлагает детальный контроль при простоте использования, облегчая реализацию сложных требований к планированию.
  • Встроенная поддержка: Такие функции, как плавная перезагрузка, cron-задачи, даты и удобное для человека время, включены по умолчанию.

Bree является ключевой частью forwardemail.net, обрабатывая критически важные фоновые задачи, такие как обработка почты, очистка и плановое обслуживание. Использование Bree в Forward Email демонстрирует нашу приверженность использованию собственных инструментов в продакшене, гарантируя их высокую надёжность.

Мы также используем и ценим другие отличные пакеты для worker threads, такие как piscina, и HTTP-клиенты, например undici. Piscina, как и Bree, использует worker threads Node.js для эффективной обработки задач. Мы благодарим Matteo Collina, который поддерживает undici и piscina, за его значительный вклад в Node.js. Matteo входит в Технический Руководящий Комитет Node.js и значительно улучшил возможности HTTP-клиентов в Node.js.

Forward Email: Открытая инфраструктура электронной почты

Наш самый амбициозный проект — Forward Email, открытый сервис электронной почты, предоставляющий пересылку, хранение и API для электронной почты. Основной репозиторий имеет более 1100 звёзд на GitHub[4], что свидетельствует о признании сообщества этой альтернативы проприетарным почтовым сервисам.

Пакет preview-email из этой организации, с более чем 2,5 миллионами загрузок за два месяца[5], стал незаменимым инструментом для разработчиков, работающих с шаблонами писем. Предоставляя простой способ предварительного просмотра писем во время разработки, он решает распространённую проблему при создании приложений с поддержкой электронной почты.

Lad: Важные утилиты и инструменты для Koa

Организация Lad предоставляет набор важных утилит и инструментов, в основном ориентированных на расширение экосистемы фреймворка Koa. Эти пакеты решают распространённые задачи веб-разработки и разработаны для бесшовной работы вместе, оставаясь при этом полезными по отдельности.

koa-better-error-handler: Улучшенная обработка ошибок для Koa

koa-better-error-handler предлагает улучшенное решение для обработки ошибок в приложениях Koa. С более чем 50 звёздами на GitHub, этот пакет заставляет ctx.throw выдавать удобочитаемые сообщения об ошибках, устраняя несколько ограничений встроенного обработчика ошибок Koa:

  • Обнаруживает и корректно обрабатывает ошибки DNS Node.js, ошибки Mongoose и ошибки Redis
  • Использует Boom для создания последовательных, хорошо отформатированных ответов с ошибками
  • Сохраняет заголовки (в отличие от встроенного обработчика Koa)
  • Поддерживает корректные коды статуса вместо стандартного 500
  • Поддерживает flash-сообщения и сохранение сессий
  • Предоставляет HTML-списки ошибок для ошибок валидации
  • Поддерживает несколько типов ответов (HTML, JSON и простой текст) Этот пакет особенно ценен при использовании вместе с koa-404-handler для комплексного управления ошибками в приложениях Koa.

passport: Аутентификация для Lad

@ladjs/passport расширяет популярный middleware для аутентификации Passport.js с конкретными улучшениями для современных веб-приложений. Этот пакет поддерживает несколько стратегий аутентификации из коробки:

  • Локальная аутентификация с помощью электронной почты
  • Вход через Apple
  • Аутентификация через GitHub
  • Аутентификация через Google
  • Аутентификация с одноразовым паролем (OTP)

Пакет очень настраиваемый, позволяя разработчикам изменять имена полей и фразы в соответствии с требованиями их приложения. Он разработан для бесшовной интеграции с Mongoose для управления пользователями, что делает его идеальным решением для приложений на базе Koa, которым нужна надежная аутентификация.

graceful: Элегантное завершение работы приложения

@ladjs/graceful решает критическую задачу корректного завершения работы приложений Node.js. Имея более 70 звезд на GitHub, этот пакет гарантирует, что ваше приложение сможет завершить работу чисто, не потеряв данные и не оставив открытых соединений. Основные возможности включают:

  • Поддержка корректного закрытия HTTP-серверов (Express/Koa/Fastify)
  • Чистое завершение работы с подключениями к базе данных (MongoDB/Mongoose)
  • Правильное закрытие клиентов Redis
  • Обработка планировщиков задач Bree
  • Поддержка пользовательских обработчиков завершения работы
  • Настраиваемые параметры тайм-аута
  • Интеграция с системами логирования

Этот пакет необходим для производственных приложений, где неожиданные завершения работы могут привести к потере или повреждению данных. Реализуя правильные процедуры завершения, @ladjs/graceful помогает обеспечить надежность и стабильность вашего приложения.

Upptime: Открытый мониторинг доступности

Организация Upptime отражает нашу приверженность прозрачному, открытому мониторингу. Основной репозиторий upptime имеет более 13 000 звезд на GitHub, что делает его одним из самых популярных проектов, к которым мы вносим вклад. Upptime предоставляет мониторинг доступности и страницу статуса, работающие полностью без сервера и основанные на GitHub.

Мы используем Upptime для нашей собственной страницы статуса на https://status.forwardemail.net с исходным кодом, доступным на https://github.com/forwardemail/status.forwardemail.net.

Что делает Upptime особенным — это его архитектура:

  • 100% Открытый исходный код: Каждый компонент полностью открыт и настраиваем.
  • Работает на GitHub: Использует GitHub Actions, Issues и Pages для безсерверного решения мониторинга.
  • Не требует сервера: В отличие от традиционных инструментов мониторинга, Upptime не требует запуска или поддержки сервера.
  • Автоматическая страница статуса: Генерирует красивую страницу статуса, которую можно разместить на GitHub Pages.
  • Мощные уведомления: Интегрируется с различными каналами уведомлений, включая email, SMS и Slack.

Для улучшения опыта наших пользователей мы интегрировали @octokit/core в кодовую базу forwardemail.net для отображения обновлений статуса и инцидентов в реальном времени непосредственно на нашем сайте. Эта интеграция обеспечивает прозрачность для наших пользователей в случае любых проблем по всему стеку (Веб-сайт, API, MongoDB, Redis, SQLite, SMTP, POP3, IMAP, Bree и др.) с мгновенными toast-уведомлениями, изменениями иконок бейджей, предупреждающими цветами и прочим.

Библиотека @octokit/core позволяет нам получать данные в реальном времени из нашего репозитория Upptime на GitHub, обрабатывать их и отображать в удобном для пользователя виде. Когда какой-либо сервис испытывает сбой или ухудшение производительности, пользователи сразу же получают уведомления через визуальные индикаторы, не покидая основное приложение. Эта бесшовная интеграция гарантирует, что наши пользователи всегда имеют актуальную информацию о состоянии системы, повышая прозрачность и доверие.

Upptime был принят сотнями организаций, ищущих прозрачный и надежный способ мониторинга своих сервисов и информирования пользователей о статусе. Успех проекта демонстрирует силу создания инструментов, использующих существующую инфраструктуру (в данном случае GitHub) для решения общих задач новыми способами.

Наш вклад в экосистему Forward Email

Хотя наши open source пакеты используются разработчиками по всему миру, они также составляют основу нашего собственного сервиса Forward Email. Эта двойная роль — как создателей, так и пользователей этих инструментов — дает нам уникальный взгляд на их применение в реальных условиях и стимулирует постоянное улучшение.

От пакетов к продакшену

Путь от отдельных пакетов к единой производственной системе требует тщательной интеграции и расширения. Для Forward Email этот процесс включает:

  • Пользовательские расширения: Создание расширений, специфичных для Forward Email, к нашим open source пакетам, которые учитывают наши уникальные требования.
  • Паттерны интеграции: Разработка схем взаимодействия этих пакетов в производственной среде.
  • Оптимизация производительности: Выявление и устранение узких мест в производительности, которые проявляются только в масштабе.
  • Усиление безопасности: Добавление дополнительных уровней безопасности, специфичных для обработки электронной почты и защиты данных пользователей.

Эта работа занимает тысячи часов разработки сверх самих основных пакетов, что приводит к созданию надежного и безопасного почтового сервиса, использующего лучшие наработки наших open source проектов.

Цикл обратной связи

Возможно, самая ценная часть использования наших собственных пакетов в продакшене — это создаваемый цикл обратной связи. Когда мы сталкиваемся с ограничениями или крайними случаями в Forward Email, мы не просто исправляем их локально — мы улучшаем базовые пакеты, принося пользу как нашему сервису, так и всему сообществу.

Этот подход привел к множеству улучшений:

  • Graceful Shutdown в Bree: Потребность Forward Email в развертываниях без простоев привела к улучшению возможностей плавного завершения работы в Bree.
  • Распознавание шаблонов в Spam Scanner: Реальные спам-шаблоны, встреченные в Forward Email, повлияли на алгоритмы обнаружения в Spam Scanner.
  • Оптимизация производительности в Cabin: Высоконагруженное логирование в продакшене выявило возможности оптимизации в Cabin, которые полезны всем пользователям.

Поддерживая этот добродетельный цикл между нашей open source работой и продакшен-сервисом, мы гарантируем, что наши пакеты остаются практичными, проверенными решениями, а не теоретическими реализациями.

Основные принципы Forward Email: фундамент для совершенства

Forward Email разработан в соответствии с набором основных принципов, которые направляют все наши решения в разработке. Эти принципы, подробно описанные на нашем сайте, обеспечивают, что наш сервис остается удобным для разработчиков, безопасным и ориентированным на конфиденциальность пользователей.

Всегда удобный для разработчиков, ориентированный на безопасность и прозрачный

Наш первый и главный принцип — создавать программное обеспечение, удобное для разработчиков, при этом поддерживая высочайшие стандарты безопасности и конфиденциальности. Мы считаем, что техническое совершенство никогда не должно идти в ущерб удобству использования, а прозрачность строит доверие в нашем сообществе.

Этот принцип проявляется в нашей подробной документации, понятных сообщениях об ошибках и открытом общении как об успехах, так и о сложностях. Делая весь наш код открытым, мы приглашаем к проверке и сотрудничеству, укрепляя как наше ПО, так и всю экосистему.

Соблюдение проверенных временем принципов разработки ПО

Мы следуем нескольким устоявшимся принципам разработки программного обеспечения, которые доказали свою ценность за десятилетия:

  • MVC: Разделение ответственности через паттерн Model-View-Controller
  • Философия Unix: Создание модульных компонентов, которые делают одну вещь хорошо
  • KISS: Делать просто и понятно
  • DRY: Не повторяй себя, поощрение повторного использования кода
  • YAGNI: Ты не будешь это использовать, избегание преждевременной оптимизации
  • Twelve Factor: Следование лучшим практикам создания современных масштабируемых приложений
  • Бритва Оккама: Выбор самого простого решения, удовлетворяющего требованиям
  • Dogfooding: Активное использование собственных продуктов Эти принципы — не просто теоретические концепции, они встроены в нашу повседневную практику разработки. Например, наше следование философии Unix очевидно в том, как мы структурировали наши npm-пакеты: небольшие, сфокусированные модули, которые можно комбинировать для решения сложных задач.

Ориентация на предприимчивого, самостоятельно финансируемого разработчика

Мы специально ориентируемся на предприимчивого, самостоятельно финансируемого и приносящего доход на уровне рамена разработчика. Этот фокус формирует всё — от нашей модели ценообразования до технических решений. Мы понимаем сложности создания продуктов с ограниченными ресурсами, потому что сами через это прошли.

Этот принцип особенно важен в нашем подходе к открытому исходному коду. Мы создаём и поддерживаем пакеты, которые решают реальные проблемы разработчиков без корпоративных бюджетов, делая мощные инструменты доступными для всех, независимо от их ресурсов.

Принципы на практике: кодовая база Forward Email

Эти принципы чётко видны в кодовой базе Forward Email. Наш файл package.json демонстрирует продуманный выбор зависимостей, каждая из которых соответствует нашим основным ценностям:

  • Пакеты с акцентом на безопасность, такие как mailauth для аутентификации электронной почты
  • Удобные для разработчиков инструменты, такие как preview-email для упрощённой отладки
  • Модульные компоненты, например различные утилиты p-* от Синдре Сорхуса

Последовательно следуя этим принципам с течением времени, мы создали сервис, которому разработчики могут доверять в вопросах своей почтовой инфраструктуры — безопасный, надёжный и соответствующий ценностям сообщества открытого исходного кода.

Конфиденциальность по дизайну

Конфиденциальность — это не второстепенный момент или маркетинговая функция для Forward Email, это фундаментальный принцип проектирования, который определяет каждый аспект нашего сервиса и кода:

  • Шифрование с нулевым доступом: Мы реализовали системы, которые технически делают невозможным для нас чтение писем пользователей.
  • Минимальный сбор данных: Мы собираем только те данные, которые необходимы для предоставления нашего сервиса, и ничего больше.
  • Прозрачные политики: Наша политика конфиденциальности написана понятным, доступным языком без юридического жаргона.
  • Проверка открытым исходным кодом: Наша открытая кодовая база позволяет исследователям безопасности проверять наши заявления о конфиденциальности.

Это обязательство распространяется и на наши пакеты с открытым исходным кодом, которые разработаны с учётом лучших практик безопасности и конфиденциальности с самого начала.

Устойчивое открытое программное обеспечение

Мы считаем, что для долгосрочного процветания открытого программного обеспечения необходимы устойчивые модели. Наш подход включает:

  • Коммерческая поддержка: Предоставление премиальной поддержки и услуг вокруг наших инструментов с открытым исходным кодом.
  • Сбалансированные лицензии: Использование лицензий, которые защищают как свободы пользователей, так и устойчивость проекта.
  • Вовлечение сообщества: Активное взаимодействие с участниками для создания поддерживающего сообщества.
  • Прозрачные дорожные карты: Обнародование наших планов разработки, чтобы пользователи могли планировать свои действия.

Фокусируясь на устойчивости, мы гарантируем, что наши вклады в открытый исходный код смогут продолжать расти и улучшаться со временем, а не оказаться заброшенными.

Цифры не врут: наши впечатляющие статистики загрузок npm

Когда мы говорим о влиянии программного обеспечения с открытым исходным кодом, статистика загрузок предоставляет ощутимую меру принятия и доверия. Многие пакеты, которые мы помогаем поддерживать, достигли масштаба, которого немногие проекты с открытым исходным кодом когда-либо достигают, с общим числом загрузок в миллиарды.

Топ npm-пакетов по количеству загрузок

Important

Хотя мы гордимся тем, что помогаем поддерживать несколько пакетов с большим количеством загрузок в экосистеме JavaScript, мы хотим признать, что многие из этих пакетов изначально были созданы другими талантливыми разработчиками. Пакеты, такие как superagent и supertest, изначально были созданы TJ Holowaychuk, чьи плодотворные вклады в открытый исходный код сыграли ключевую роль в формировании экосистемы Node.js.

Обзор нашего влияния с высоты птичьего полёта

Всего за двухмесячный период с февраля по март 2025 года, ведущие пакеты, к которым мы вносим вклад и помогаем поддерживать, зафиксировали ошеломляющие показатели загрузок:

Note

Несколько других пакетов, которые мы помогаем поддерживать, но не создавали, имеют ещё более высокие показатели загрузок, включая form-data (более 738 млн загрузок), toidentifier (более 309 млн загрузок), stackframe (более 116 млн загрузок) и error-stack-parser (более 113 млн загрузок). Для нас честь вносить вклад в эти пакеты, уважая труд их оригинальных авторов.

Это не просто впечатляющие цифры — это реальные разработчики, решающие реальные задачи с помощью кода, который мы помогаем поддерживать. Каждая загрузка — это случай, когда эти пакеты помогли кому-то создать что-то значимое, от любительских проектов до корпоративных приложений, используемых миллионами.

Package Categories Distribution

Ежедневное влияние в масштабе

Ежедневные паттерны загрузок показывают стабильное использование в больших объёмах, с пиками, достигающими миллионов загрузок в день[22]. Такая стабильность говорит о надёжности и устойчивости этих пакетов — разработчики не просто пробуют их; они интегрируют их в свои основные рабочие процессы и полагаются на них день за днём.

Еженедельные паттерны загрузок демонстрируют ещё более впечатляющие цифры, стабильно удерживаясь на уровне десятков миллионов загрузок в неделю[23]. Это представляет собой огромный след в экосистеме JavaScript, с этими пакетами, работающими в продуктивных средах по всему миру.

За пределами сырых цифр

Хотя статистика загрузок впечатляет сама по себе, она рассказывает более глубокую историю о доверии, которое сообщество оказывает этим пакетам. Поддержка пакетов в таких масштабах требует непоколебимой приверженности:

  • Обратная совместимость: изменения должны тщательно продумывать, чтобы не нарушить существующие реализации.
  • Безопасность: миллионы приложений зависят от этих пакетов, и уязвимости могут иметь далеко идущие последствия.
  • Производительность: в таких масштабах даже незначительные улучшения производительности могут иметь значительный совокупный эффект.
  • Документация: чёткая и исчерпывающая документация необходима для пакетов, используемых разработчиками с любым уровнем опыта.

Постоянный рост числа загрузок с течением времени отражает успех в выполнении этих обязательств, укрепляя доверие сообщества разработчиков через надёжные, хорошо поддерживаемые пакеты.

Поддержка экосистемы: наши спонсорства в области открытого ПО

Tip

Устойчивость открытого ПО — это не только вклад в код, но и поддержка разработчиков, которые поддерживают критическую инфраструктуру.

Помимо наших прямых вкладов в экосистему JavaScript, мы гордимся спонсорством видных участников сообщества Node.js, чья работа лежит в основе многих современных приложений. Наши спонсорства включают:

Андрис Рейнман: пионер инфраструктуры электронной почты

Андрис Рейнман — создатель Nodemailer, самой популярной библиотеки для отправки электронной почты в Node.js с более чем 14 миллионами загрузок в неделю[24]. Его работа распространяется на другие критически важные компоненты инфраструктуры электронной почты, такие как SMTP Server, Mailparser и WildDuck.

Наше спонсорство помогает обеспечить дальнейшее сопровождение и развитие этих важных инструментов, которые обеспечивают работу электронной почты для множества приложений на Node.js, включая наш собственный сервис Forward Email.

Синдре Сорхус: мастер утилитных пакетов

Синдре Сорхус — один из самых плодовитых участников сообщества открытого ПО в экосистеме JavaScript, автор более 1000 пакетов npm. Его утилиты, такие как p-map, p-retry и is-stream, являются фундаментальными строительными блоками, используемыми по всей экосистеме Node.js.

Спонсируя работу Синдре, мы поддерживаем развитие этих критически важных утилит, которые делают разработку на JavaScript более эффективной и надежной.

Эти спонсорства отражают нашу приверженность более широкой экосистеме открытого ПО. Мы понимаем, что наш собственный успех построен на основе, заложенной этими и другими участниками, и мы стремимся обеспечить устойчивость всей экосистемы.

Обнаружение уязвимостей безопасности в экосистеме JavaScript

Наша приверженность открытом ПО выходит за рамки разработки функций и включает выявление и устранение уязвимостей безопасности, которые могут повлиять на миллионы разработчиков. Некоторые из наших самых значительных вкладов в экосистему JavaScript связаны с безопасностью.

Спасение Koa-Router

В феврале 2019 года Ник выявил критическую проблему с поддержкой популярного пакета koa-router. Как он сообщил на Hacker News, пакет был заброшен его первоначальным сопровождающим, что оставило уязвимости безопасности без внимания и сообщество без обновлений.

Warning

Заброшенные пакеты с уязвимостями безопасности представляют значительные риски для всей экосистемы, особенно когда их скачивают миллионы раз в неделю.

В ответ Ник создал @koa/router и помог предупредить сообщество о ситуации. С тех пор он поддерживает этот критически важный пакет, обеспечивая пользователям Koa безопасное и хорошо поддерживаемое решение для маршрутизации.

Устранение уязвимостей ReDoS

В 2020 году Ник выявил и устранил критическую уязвимость Regular Expression Denial of Service (ReDoS) в широко используемом пакете url-regex. Эта уязвимость (SNYK-JS-URLREGEX-569472) могла позволить злоумышленникам вызвать отказ в обслуживании, предоставляя специально сформированный ввод, вызывающий катастрофический бэктрекинг в регулярном выражении.

Вместо простого исправления существующего пакета Ник создал url-regex-safe, полностью переписанную реализацию, которая устраняет уязвимость, сохраняя совместимость с оригинальным API. Он также опубликовал подробный блог-пост, объясняющий уязвимость и способы её устранения. Эта работа демонстрирует наш подход к безопасности: не просто исправлять проблемы, но и обучать сообщество, а также предоставлять надежные альтернативы, которые предотвращают подобные проблемы в будущем.

Продвижение безопасности Node.js и Chromium

Ник также активно выступал за улучшение безопасности в более широком экосистеме. В августе 2020 года он выявил значительную проблему безопасности в Node.js, связанную с обработкой HTTP-заголовков, о чем было сообщено в The Register.

Эта проблема, возникшая из-за патча в Chromium, могла потенциально позволить злоумышленникам обойти меры безопасности. Благодаря усилиям Ника проблема была оперативно решена, что защитило миллионы приложений на Node.js от возможной эксплуатации.

Обеспечение безопасности инфраструктуры npm

Позже в том же месяце Ник выявил еще одну критическую проблему безопасности, на этот раз в инфраструктуре электронной почты npm. Как сообщается в The Register, npm неправильно реализовывал протоколы аутентификации электронной почты DMARC, SPF и DKIM, что потенциально позволяло злоумышленникам отправлять фишинговые письма, которые выглядели как исходящие от npm.

Отчет Ника привел к улучшениям в безопасности электронной почты npm, защитив миллионы разработчиков, которые полагаются на npm для управления пакетами, от возможных фишинговых атак.

Наш вклад в экосистему Forward Email

Forward Email построен на основе нескольких критически важных проектов с открытым исходным кодом, включая Nodemailer, WildDuck и mailauth. Наша команда внесла значительный вклад в эти проекты, помогая выявлять и исправлять глубокие проблемы, влияющие на доставку и безопасность электронной почты.

Улучшение основной функциональности Nodemailer

Nodemailer является основой отправки электронной почты в Node.js, и наши вклады помогли сделать его более надежным:

  • Улучшения SMTP-сервера: Мы исправили ошибки парсинга, проблемы с обработкой потоков и конфигурацией TLS в компоненте SMTP-сервера[25][26].
  • Улучшения парсера почты: Мы устранили ошибки декодирования последовательностей символов и проблемы с парсером адресов, которые могли вызывать сбои при обработке писем[27][28].

Эти улучшения обеспечивают надежность Nodemailer как основы для обработки электронной почты в приложениях на Node.js, включая Forward Email.

Продвижение аутентификации электронной почты с Mailauth

Mailauth предоставляет критически важную функциональность аутентификации электронной почты, и наши вклады значительно улучшили его возможности:

  • Улучшения проверки DKIM: Мы обнаружили и сообщили о проблемах с кэшированием DNS у X/Twitter, вызывавших сбои DKIM для их исходящих сообщений, сообщив об этом на Hacker One[29].
  • Улучшения DMARC и ARC: Мы исправили проблемы с проверкой DMARC и ARC, которые могли приводить к некорректным результатам аутентификации[30][31].
  • Оптимизация производительности: Мы внесли оптимизации, повышающие производительность процессов аутентификации электронной почты[32][33][34][35].

Эти улучшения помогают обеспечить точность и надежность аутентификации электронной почты, защищая пользователей от фишинга и подделки.

Ключевые улучшения Upptime

Наши вклады в Upptime включают:

  • Мониторинг SSL-сертификатов: Мы добавили функциональность для мониторинга срока действия SSL-сертификатов, предотвращая неожиданные простои из-за истечения сертификатов[36].
  • Поддержка нескольких номеров SMS: Мы реализовали поддержку оповещения нескольких членов команды по SMS при возникновении инцидентов, улучшая время реакции[37].
  • Исправления проверки IPv6: Мы устранили проблемы с проверками подключения IPv6, обеспечивая более точный мониторинг в современных сетевых средах[38].
  • Поддержка темной/светлой темы: Мы добавили поддержку тем для улучшения пользовательского опыта на страницах статуса[39].
  • Улучшенная поддержка TCP-Ping: Мы улучшили функциональность TCP ping для более надежного тестирования соединения[40]. Эти улучшения приносят пользу не только мониторингу статуса Forward Email, но и доступны всему сообществу пользователей Upptime, демонстрируя нашу приверженность улучшению инструментов, от которых мы зависим.

Связующее звено: масштабный кастомный код

Хотя наши npm-пакеты и вклад в существующие проекты значительны, именно кастомный код, который интегрирует эти компоненты, по-настоящему демонстрирует нашу техническую экспертизу. Кодовая база Forward Email представляет собой десятилетие усилий по разработке, начиная с 2017 года, когда проект начался как free-email-forwarding, а затем был объединён в монорепозиторий.

Масштабные усилия по разработке

Масштаб этого кастомного интеграционного кода впечатляет:

  • Общее количество коммитов: Более 3,217
  • Размер кодовой базы: Более 421,545 строк кода в файлах JavaScript, Pug, CSS и JSON[^33]

Это тысячи часов работы по разработке, отладке и оптимизации производительности. Это «секретный ингредиент», который превращает отдельные пакеты в единый, надёжный сервис, используемый тысячами клиентов ежедневно.

Интеграция основных зависимостей

Кодовая база Forward Email интегрирует множество зависимостей в единое целое:

  • Обработка электронной почты: Интегрирует Nodemailer для отправки, SMTP Server для приёма и Mailparser для парсинга
  • Аутентификация: Использует Mailauth для проверки DKIM, SPF, DMARC и ARC
  • Разрешение DNS: Использует Tangerine для DNS-over-HTTPS с глобальным кэшированием
  • Подключение к MX: Использует mx-connect с интеграцией Tangerine для надёжных подключений к почтовым серверам
  • Планирование задач: Применяет Bree для надёжной обработки фоновых задач с использованием worker threads
  • Шаблонизация: Использует email-templates для повторного использования стилей с сайта в коммуникациях с клиентами
  • Хранение почты: Реализует индивидуально зашифрованные почтовые ящики SQLite с помощью better-sqlite3-multiple-ciphers с шифрованием ChaCha20-Poly1305 для квантово-безопасной приватности, обеспечивая полную изоляцию между пользователями и доступ к почтовому ящику только у самого пользователя

Каждая из этих интеграций требует тщательного учёта крайних случаев, влияния на производительность и вопросов безопасности. В результате получается надёжная система, которая обрабатывает миллионы почтовых транзакций без сбоев. Наша реализация SQLite также использует msgpackr для эффективной бинарной сериализации и WebSockets (через ws) для обновления статуса в реальном времени по всей инфраструктуре.

DNS-инфраструктура с Tangerine и mx-connect

Критическим компонентом инфраструктуры Forward Email является наша система разрешения DNS, построенная вокруг двух ключевых пакетов:

  • Tangerine: Наша реализация DNS-over-HTTPS для Node.js, которая служит заменой стандартного DNS-резолвера с встроенными повторными попытками, таймаутами, умным переключением серверов и поддержкой кэширования.

  • mx-connect: Этот пакет устанавливает TCP-соединения с MX-серверами, принимая целевой домен или адрес электронной почты, разрешая соответствующие MX-серверы и подключаясь к ним в порядке приоритета.

Мы интегрировали Tangerine с mx-connect через pull request #4, обеспечивая DNS-запросы на уровне приложения через HTTP во всём Forward Email. Это обеспечивает глобальное кэширование DNS в масштабе с 1:1 согласованностью в любом регионе, приложении или процессе — критично для надёжной доставки почты в распределённой системе.

Влияние на корпоративный сектор: от открытого кода к критически важным решениям

Кульминация нашего десятилетнего пути в разработке с открытым исходным кодом позволила Forward Email обслуживать не только отдельных разработчиков, но и крупные предприятия и образовательные учреждения, которые составляют основу самого движения открытого кода.

Кейсы в критически важной инфраструктуре электронной почты

Наша приверженность надежности, конфиденциальности и принципам открытого исходного кода сделала Forward Email надежным выбором для организаций с высокими требованиями к электронной почте:

  • Образовательные учреждения: Как подробно описано в нашем кейсе по пересылке электронной почты выпускникам, крупные университеты полагаются на нашу инфраструктуру для поддержания пожизненных связей с сотнями тысяч выпускников через надежные сервисы пересылки электронной почты.

  • Корпоративные решения на Linux: Кейс Canonical Ubuntu по корпоративной электронной почте демонстрирует, как наш подход с открытым исходным кодом идеально соответствует потребностям поставщиков корпоративных Linux-решений, предоставляя им необходимую прозрачность и контроль.

  • Фонды с открытым исходным кодом: Возможно, самым убедительным является наше партнерство с Linux Foundation, как задокументировано в кейсе Linux Foundation по корпоративной электронной почте, где наш сервис обеспечивает коммуникацию для самой организации, которая курирует развитие Linux.

Существует красивая симметрия в том, как наши пакеты с открытым исходным кодом, поддерживаемые с заботой на протяжении многих лет, позволили нам создать сервис электронной почты, который теперь поддерживает сообщества и организации, продвигающие программное обеспечение с открытым исходным кодом. Это путешествие по замкнутому кругу — от вклада в отдельные пакеты до создания корпоративной инфраструктуры электронной почты для лидеров открытого исходного кода — представляет собой высшее подтверждение нашего подхода к разработке программного обеспечения.

Десятилетие открытого исходного кода: взгляд в будущее

Оглядываясь на десятилетие вклада в открытый исходный код и смотря вперед на следующие десять лет, мы полны благодарности сообществу, которое поддерживало нашу работу, и воодушевления по поводу будущего.

Наш путь от отдельных авторов пакетов до поддерживающих комплексную инфраструктуру электронной почты, используемую крупными предприятиями и фондами с открытым исходным кодом, был замечательным. Это свидетельство силы разработки с открытым исходным кодом и влияния, которое продуманное, хорошо поддерживаемое программное обеспечение может оказать на более широкую экосистему.

В ближайшие годы мы намерены:

  • Продолжать поддерживать и улучшать наши существующие пакеты, обеспечивая их надежность для разработчиков по всему миру.
  • Расширять наш вклад в критически важные инфраструктурные проекты, особенно в области электронной почты и безопасности.
  • Улучшать возможности Forward Email, сохраняя нашу приверженность конфиденциальности, безопасности и прозрачности.
  • Поддерживать новое поколение участников сообщества открытого исходного кода через наставничество, спонсорство и вовлечение сообщества.

Мы верим, что будущее разработки программного обеспечения — открытое, совместное и построенное на основе доверия. Продолжая вносить высококачественные, ориентированные на безопасность пакеты в экосистему JavaScript, мы надеемся сыграть небольшую роль в построении этого будущего.

Спасибо всем, кто использовал наши пакеты, вносил вклад в наши проекты, сообщал об ошибках или просто распространял информацию о нашей работе. Ваша поддержка сделала возможным это десятилетие влияния, и мы с нетерпением ждем, чего сможем достичь вместе в следующие десять лет.


  1. npm статистика загрузок для cabin, апрель 2025 ↩︎

  2. npm статистика загрузок для bson-objectid, февраль-март 2025 ↩︎

  3. npm статистика загрузок для url-regex-safe, апрель 2025 ↩︎

  4. Количество звезд на GitHub для forwardemail/forwardemail.net по состоянию на апрель 2025 ↩︎

  5. npm статистика загрузок для preview-email, апрель 2025 ↩︎

  6. npm статистика загрузок для superagent, февраль-март 2025 ↩︎

  7. npm статистика загрузок для supertest, февраль-март 2025 ↩︎

  8. npm статистика загрузок для koa, февраль-март 2025 ↩︎

  9. npm статистика загрузок для @koa/router, февраль-март 2025 ↩︎

  10. npm статистика загрузок для koa-router, февраль-март 2025 ↩︎

  11. npm статистика загрузок для url-regex, февраль-март 2025 ↩︎

  12. npm статистика загрузок для preview-email, февраль-март 2025 ↩︎

  13. npm статистика загрузок для cabin, февраль-март 2025 ↩︎

  14. npm статистика загрузок для @breejs/later, февраль-март 2025 ↩︎

  15. npm статистика загрузок для email-templates, февраль-март 2025 ↩︎

  16. npm статистика загрузок для get-paths, февраль-март 2025 ↩︎

  17. npm статистика загрузок для url-regex-safe, февраль-март 2025 ↩︎

  18. npm статистика загрузок для dotenv-parse-variables, февраль-март 2025 ↩︎

  19. npm статистика загрузок для @koa/multer, февраль-март 2025 ↩︎

  20. npm статистика загрузок для spamscanner, февраль-март 2025 ↩︎

  21. npm статистика загрузок для bree, февраль-март 2025 ↩︎

  22. Ежедневные паттерны загрузок из статистики npm, апрель 2025 ↩︎

  23. Еженедельные паттерны загрузок из статистики npm, апрель 2025 ↩︎

  24. npm статистика загрузок для nodemailer, апрель 2025 ↩︎

  25. https://github.com/nodemailer/smtp-server/issues/155 ↩︎

  26. https://github.com/nodemailer/smtp-server/issues/node-v12-requires-tls-min ↩︎

  27. https://github.com/nodemailer/mailparser/issues/261 ↩︎

  28. https://github.com/nodemailer/nodemailer/issues/1102 ↩︎

  29. https://github.com/postalsys/mailauth/issues/30 ↩︎

  30. https://github.com/postalsys/mailauth/issues/58 ↩︎

  31. https://github.com/postalsys/mailauth/issues/48 ↩︎

  32. https://github.com/postalsys/mailauth/issues/74 ↩︎

  33. https://github.com/postalsys/mailauth/issues/75 ↩︎

  34. https://github.com/postalsys/mailauth/issues/60 ↩︎

  35. https://github.com/postalsys/mailauth/issues/73 ↩︎

  36. На основе проблем GitHub в репозитории Upptime ↩︎

  37. На основе проблем GitHub в репозитории Upptime ↩︎

  38. На основе проблем GitHub в репозитории Upptime ↩︎

  39. На основе pull-запросов GitHub к Upptime ↩︎

  40. На основе pull-запросов GitHub к Upptime ↩︎