The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

/ Web-технологии / JavaScript
·03.05 Обход верификации в библиотеке xml-crypto, насчитывающей миллион загрузок в неделю (15 +15)
  В JavaScript-библиотеке xml-crypto, используемой в качестве зависимости у 402 проектов и загружаемой из каталога NPM около миллиона раз каждую неделю, выявлена уязвимость (CVE-2024-32962), которой присвоен максимальный уровень опасности (10 из 10). Библиотека предоставляет функции для шифрования и верификации по цифровой подписи XML-документов. Уязвимость даёт возможность атакующему заверить фиктивный документ, который в конфигурации по умолчанию будет успешно верифицирован библиотекой, несмотря на то, что он подписан не тем ключом, что указан для проверки подписей. Проблема проявляется начиная с версии xml-crypto 4.0.0 и без лишней огласки устранена в январском выпуске 6.0.0.

Уязвимость вызвана тем, что в конфигурации по умолчанию библиотека не авторизирует создателя подписи, а проверяет только корректность самой подписи. В частности, библиотека доверяет любому сертификату, размещённому в подписанном документе в XML-элементе KeyInfo, даже если в настройках указано использование конкретного сертификата для проверки цифровых подписей. Таким образом, для успешной верификации модифицированного документа атакующему достаточно заменить оригинальную цифровую подпись на подпись, сформированную своим закрытым ключом, и разместить связанный с этим закрытым ключом сертификат (открытый ключ) в элементе KeyInfo.

  1. Главная ссылка к новости
  2. OpenNews: Уязвимость в NPM, позволяющая изменить произвольные файлы при установке пакета
  3. OpenNews: Уязвимость в NPM-пакете pac-resolver, насчитывающем 3 млн загрузок в неделю
  4. OpenNews: Уязвимость, позволявшая выпустить обновление для любого пакета в репозитории NPM
  5. OpenNews: Уязвимость в репозитории NPM, позволяющая добавить сопровождающего без подтверждения
  6. OpenNews: Уязвимость в NPM-пакете JsonWebToken, насчитывающем 10 млн загрузок в неделю
Обсуждение (15 +15) | Тип: Проблемы безопасности |


·25.04 Доступна JavaScript-платформа Node.js 22.0.0 (40 +4)
  Состоялся релиз Node.js 22.0, платформы для выполнения сетевых приложений на языке JavaScript. Node.js 22.0 отнесён к веткам с длительным сроком поддержки, но данный статус будет присвоен только в октябре, после проведения стабилизации. Поддержка Node.js 22.x будет осуществляться до 30 апреля 2027 года. Сопровождение прошлой LTS-ветки Node.js 20.x продлится до апреля 2026 года, а позапрошлой LTS-ветки 18.x до апреля 2025 года. Сопровождение промежуточной ветки Node.js 21.x будет прекращено 1 июня 2024 года.

Основные улучшения:

  • Движок V8 обновлён до версии 12.4, применяемой в Chromium 124. Из изменений по сравнению с веткой Node.js 21, в которой использовался движок V8 11.8), отмечается:
    • Поддержка расширения WasmGC, упрощающего портирование в WebAssembly программ, написанных на языках программирования, использующих сборщик мусора (Kotlin, PHP, Java и т.п.). WasmGC добавляет новые типы структур и массивов, для которых может применяться нелинейное выделение памяти.
    • Поддержка метода Array.fromAsync(), в асинхронном режиме возвращающего новый экземпляр объекта Array, скопированный из объектов, напоминающих массив, перечисляемых (iterable) или асинхронно перечисляемых (async iterable).
    • Поддержка методов для работы с итераторами, таких как .map, .filter, .find, .take, .drop, .forEach и .reduce.
    • Поддержка объекта Set, определяющего коллекцию значений и предлагающего методы с реализацией типовых операций работы с множествами, таких как пересечения, объединения, разность и дополнение.
  • Включён по умолчанию оптимизирующий JIT-компилятор Maglev, нацеленный на быструю генерацию высокопроизводительного машинного кода для активно используемого кода на JavaScript. Включение Maglev позволяет заметно ускорить работу короткоживущий CLI-приложений, не выполняющих длительных операций, например, время прохождения теста Jetstrea сокращается на 7.5%, а теста Speedometer на 5%.
  • Ускорена работа с потоками за счёт увеличения значения опции highWaterMark с 16 KB до 65 KB (определяет лимит, до которого выполняется буферизация записи). Изменение приводит к увеличению потребления памяти, поэтому приложениям, рассчитанным на работу с ограниченным объёмом ОЗУ, возможно потребуется вернуть старое значение через вызов setDefaultHighWaterMark().
  • Повышена производительность API fetch() и test runner за счёт повышения эффективности создания экземпляров AbortSignal. Повышена производительность API, связанных с синхронной работой с файловыми системами.
  • Предоставлена экспериментальная возможность использования вызова "require()" для загрузки JavaScript-модулей ESM (ECMAScript Modules) в синхронном режиме. ESM-модули применяются в браузерах и идут на смену модулям CommonJS, специфичным для Node.js. Для загрузки через "require()" ESM-модуль должен выполняться в синхронном режиме (без await на верхнем уровне). Поддержка включается через флаг "--experimental-require-module".
  • Добавлена экспериментальная возможность запуска скриптов, определённых в файле package.json, используя команду "--run <script-in-package-json>".
  • В категорию стабильных переведена команда "node --watch" с реализацией режима наблюдения, обеспечивающего перезапуск процесса при изменении импортированного файла (например, в случае выполнения "node --watch index.js" процесс будет автоматически перезапущен при изменении index.js).
  • Стабилизирована встроенная реализация API WebSocket, позволяющего использовать WebSocket в режиме клиента без установки дополнительных зависимостей.
  • Добавлена частичная поддержка API Navigator.
  • В API Webstreams добавлена поддержка формата сжатия deflate-raw.
  • В модуль node:fsmodule добавлены функции glob и globSync для сопоставления файловых путей по образцу.
  • Улучшена обработка некорректно настроенных стеков IPv6. Реализован алгоритм Happy Eyeballs для быстрого отката в случае проблем с работой IPv6.
  • Объявлен устаревшим API util.
  • Обновлены версии зависимостей: npm 10.5.1, libuv 1.48.0, simdutf 5.2.3, c-ares 1.28.1, zlib 1.3.0.1-motley-24c07df, simdjson to 3.8.0, ada 2.7.7 и undici 6.6.0.

Платформа Node.js может быть использована как для серверного сопровождения работы Web-приложений, так и для создания обычных клиентских и серверных сетевых программ. Для расширения функциональности приложений для Node.js подготовлена большая коллекция модулей, в которой можно найти модули с реализацией серверов и клиентов HTTP, SMTP, XMPP, DNS, FTP, IMAP, POP3, модули для интеграции с различными web-фреймворками, обработчики WebSocket и Ajax, коннекторы к СУБД (MySQL, PostgreSQL, SQLite, MongoDB), шаблонизаторы, CSS-движки, реализации криптоалгоритмов и систем авторизации (OAuth), XML-парсеры.

Для обеспечения обработки большого числа параллельных запросов Node.js задействует асинхронную модель запуска кода, основанную на обработке событий в неблокирующем режиме и определении callback-обработчиков. В качестве способов мультиплексирования соединений поддерживаются такие методы, как epoll, kqueue, /dev/poll и select. Для мультиплексирования соединений используется библиотека libuv, которая является надстройкой над libev в системах Unix и над IOCP в Windows. Для создания пула потоков (thread pool) задействована библиотека libeio, для выполнения DNS-запросов в неблокирующем режиме интегрирован c-ares. Все системные вызовы, вызывающие блокирование, выполняются внутри пула потоков и затем, как и обработчики сигналов, передают результат своей работы обратно через неименованный канал (pipe).

Выполнение JavaScript-кода обеспечивается через задействование разработанного компанией Google движка V8 (дополнительно Microsoft развивает вариант Node.js с движком Chakra-Core). По своей сути Node.js похож на фреймворки Perl AnyEvent, Ruby Event Machine, Python Twisted и реализацию событий в Tcl, но цикл обработки событий (event loop) в Node.js скрыт от разработчика и напоминает обработку событий в web-приложении, работающем в браузере.

  1. Главная ссылка к новости
  2. OpenNews: Уязвимости в Node.js и libuv
  3. OpenNews: Доступна JavaScript-платформа Node.js 21.0
  4. OpenNews: Доступна серверная JavaScript-платформа Bun 1.0, более быстрая, чем Deno и Node.js
  5. OpenNews: Атака на Node.js через манипуляции с прототипами объектов JavaScript
  6. OpenNews: Автор Node.js представил защищённую JavaScript-платформу Deno 1.0
Обсуждение (40 +4) | Тип: Программы |


·12.03 Mozilla, Google, Microsoft и Apple разработали тест производительности браузеров Speedometer 3.0 (127 +22)
  Спустя шесть лет c момента прошлого выпуска представлен обновлённый инструментарий для тестирования производительности и отзывчивости web-браузеров - Speedometer 3.0, подготовленный совместно компаниями Mozilla, Google, Microsoft и Apple. Ключевой задачей тестового набора называется оценка задержек при симуляции работы пользователя с типовыми web-приложениями.

Speedometer 3.0 стал первым набором для оценки производительности браузеров, созданным совместно представителями конкурирующих браузерных движков Blink/V8, Gecko/SpiderMonkey и WebKit/JavaScriptCore, которые сумели выработать общую политику в отношении тестирования. Код Speedometer распространяется под лицензией BSD и начиная с 2022 года разрабатывается в соответствии с новой моделью управления проектом, подразумевающей совместное принятие решений с достижением консенсуса. Репозиторий открыт для участия любых заинтересованных лиц и продвижения своих идей и исправлений.

В Speedometer 3.0 осуществлён переход на применение новых выпусков фреймворков Angular, Backbone, jQuery, Lit, Preact, React, React+Redux, Svelte и Vue. Задействованы современные шаблоны проектирования сайтов и web-приложений, например, использование Webpack, Web Components и новых методов работы с DOM. Добавлены тесты для оценки производительности отрисовки при помощи элемента Canvas, генерации SVG, обработки сложных CSS, работы с очень большими деревьями DOM и использования методов, применяемых при редактировании контента в режиме WYSIWYG и при работе с новостными сайтами.

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

Эталонные тесты, задействованные в Speedometer 3.0 для оценки производительности:

  • Добавление, заполнение и удаление 100 заметок с использованием менеджера задач TodoMVC, реализованного в вариантах на базе разных web-фреймворков, методов работы с DOM и версий стандарта ECMAScript. Например, запускаются варианты TodoMVC на базе фреймворков React, Angular, Vue, jQuery, WebComponents, Backbone, Preact, Svelte и Lit, а также варианты, использующие расширенные возможности, появившиеся в спецификациях ECMAScript 5 и ECMAScript 6.
  • Редактирование текста с разметкой в режиме WYSIWYG, используя редакторы кода CodeMirror и TipTap.
  • Загрузка и взаимодействие с диаграммами, оформленными через элемент canvas или сгенерированными в формате SVG при помощи библиотек Observable Plot, chart.js и react-stockcharts.
  • Навигация по страницам и взаимодействие с контентом на типовых новостных сайтах, на которых используются web-фреймворки Next.js и Nuxt.

При прохождении тестового набора Speedometer 3.0 в macOS лидирует Chrome (22.6), за которым следуют Firefox (20.7) и Safari (19.0). В проведённом с теми же браузерами тесте Speedometer 2.1 победил Safari (481), от которого немного отстал Firefox (478) и заметно отстал Chrome (404). При запуске в Ubuntu 22.04 браузер Chrome набрал 13.5 и 234 баллов, а Firefox - 12.1 и 186 баллов в версиях Speedometer 3.0 и 2.1.

  1. Главная ссылка к новости
  2. OpenNews: Представлен Speedometer 2.0, пакет для тестирования производительности браузеров
  3. OpenNews: Google объявил Octane устаревшим и не отражающим реальную производительность браузеров
  4. OpenNews: Вышел обновленный пакет для тестирования JavaScript - SunSpider 0.9.1
  5. OpenNews: Разработчики Mozilla представили Kraken, новый пакет для тестирования JavaScript
  6. OpenNews: Создатель JSON представил новый тест производительности JavaScript в web-браузерах
Обсуждение (127 +22) | Тип: К сведению |


·16.02 Уязвимости в Node.js и libuv (33 +15)
  Доступны корректирующие выпуски JavaScript-платформы Node.js 21.6.2, 20.11.1, 18.19.1, в которых исправлено 8 уязвимостей, из которых 4 присвоен высокий уровень опасности:
  • CVE-2024-21892 - возможность подстановки непривилегированным пользователем кода, наследующего расширенные привилегии, с которыми выполняется рабочий процесс. Уязвимость вызвана ошибкой в реализации исключения, позволяющего в процессе с расширенными привилегиями обрабатывать переменные окружения, выставленные непривилегированным пользователем. Исключение должно было предоставляться только для полномочий CAP_NET_BIND_SERVICE, но из-за ошибки применялось и к некоторым другими полномочиям (capabilities).
  • CVE-2024-22019 - отказ в обслуживании через исчерпание доступных ресурсов (нагрузка на CPU и расходование пропускной способности) при обработке встроенным HTTP-сервером специально оформленных chunked-запросов, приводящих к чтению неограниченное количества байтов в одном соединении.
  • CVE-2024-21896 - выход за границу базового каталога в файловых путях. Уязвимость позволяет обойти нормализации файловых путей при помощи path.resolve() в случае передачи пути с использованием класса Buffer. Для получения подобного пути после проверки вызывается метод Buffer.from(), но в приложении может использоваться вызов Buffer.prototype.utf8Write, приводящий к замене содержимого на стадии после выполнения path.resolve() и возникновению уязвимости.
  • CVE-2024-22017 - вызов setuid() не сбрасывал все привилегии. В частности, setuid() не влияет на операции io_uring, используемые в libuv, если они были инициализированы до вызова setuid().
  • CVE-2023-46809 - уязвимость в API privateDecrypt(), допускающая применение атаки Marvin для расшифровки RSA на основе измерения времени операций.
  • CVE-2024-21891 - возможность обхода модели прав доступа при использовании пользовательских обработчиков нормализации файловых путей.
  • CVE-2024-21890 - некорректная обработка масок в параметрах "--allow-fs-read" и "--allow-fs-write". Например, "--allow-fs-read=/home/node/.ssh/*.pub" приведёт предоставлению доступа ко всему содержимому ".ssh/", а не только к файлам с расширением ".pub", так как маска "*" обрабатывается как последний элемент пути.
  • CVE-2024-22025 - отказ в обслуживании через израсходование ресурсов при декодировании сжатых данных в формате Brotli, полученных через вызов fetch().

Дополнительно можно отметить формирование выпуска библиотеки libuv 1.48.0, применяемой в Node.js для мультиплексирования соединений и асинхронной обработки ввода/вывода. Кроме Node.js библиотека также используется DNS-серверах BIND 9 и Knot DNS, HTTP-сервере H2O, Lua-фреймворке Luvit, виртуальной машине MoarVM, языке Julia и Python-фреймворке uvloop. В новой версии устранена уязвимость (CVE-2024-24806), проявляющаяся в проектах, использующих libuv, и позволяющая осуществить атаку SSRF (Server-side request forgery) для получения доступа к внутреннему API. Уязвимость возникла из-за обрезания имени хоста функцией uv_getaddrinfo() до 256 символов на этапе до резолвинга домена через функцию getaddrinfo(), что может привести к определению не того IP-адреса и обходу проверок. Например, сервисы типа MySpace, создающие поддомены вида "username.example.com", можно атаковать через указание длинного имени пользователя.

Также вышло обновление используемого в Node.js HTTP-клиента undici 5.28.3, в котором устранена уязвимость (CVE-2024-24758), вызванная отсутствием очистки HTTP-заголовка Proxy-Authorization при перенаправлении запросов.

  1. Главная ссылка к новости
  2. OpenNews: Доступна JavaScript-платформа Node.js 21.0
  3. OpenNews: Доступна серверная JavaScript-платформа Bun 1.0, более быстрая, чем Deno и Node.js
  4. OpenNews: Атака на Node.js через манипуляции с прототипами объектов JavaScript
  5. OpenNews: Выпуск библиотеки libuv 1.45.0 с поддержкой подсистемы io_uring
  6. OpenNews: Автор Node.js представил защищённую JavaScript-платформу Deno 1.0
Обсуждение (33 +15) | Тип: Проблемы безопасности |


·29.11 Выпуск децентрализованной видеовещательной платформы PeerTube 6.0 (111 +26)
  Состоялся выпуск децентрализованной платформы для организации видеохостинга и видеовещания PeerTube 6.0. PeerTube предлагает независимую от отдельных поставщиков альтернативу YouTube, Dailymotion и Vimeo, использующую сеть распространения контента на базе P2P-коммуникаций и связывания между собой браузеров посетителей. Наработки проекта распространяются под лицензией AGPLv3.

Основные новшества:

  • Добавлена возможность размещения видео, защищённых паролем. Пароль можно выставить при загрузке, импорте или обновлении, после чего только пользователи знающие пароль смогут получить доступ к контенту. Через REST API можно задавать несколько паролей (например, каждому пользователю можно выдавать отдельный пароль) и отзывать выданные пароли.

  • Обеспечен показ эскизов при перемещении указателя мыши по ползунку, отражающему позицию воспроизведения, что позволяет наглядно перемещаться по потоку. Раскадровка с эскизами формируется во время загрузки или импорта видео, т.е. поддержка эскизов станет доступна только для новых видео, загруженных после обновления узла до PeerTube 6.0. Для создания эскизов к старым видео администратору следует выполнить команду "npm run create-generate-storyboard-job".

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

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

  • Продолжено внесение изменений и оптимизаций, подготовленных на основе стресс-тестирования live-вещания и классического стриминга видео с несколькими тысячами одновременных участников. Например, проведена оптимизация обработки unicast HTTP в рабочих потоках, заверения запросов ActivityPub, обработки рекомендаций, SQL-запросов с фильтрацией по тегам, массовых запросов /videos/{id}/views. Добавлена возможность отключения HTTP-лога.
  • Удалена поддержка протокола WebTorrent, а разработка сфокусирована на использовании протокола HLS (HTTP Live Streaming) с WebRTC для P2P.
  • Повышена эффективность видеопроигрывателя, в котором обеспечен автоматический выбор размера окна с учётом соотношения сторон видео, реализовано запоминание настроек и убрано перестраивание при смене видео.
  • Улучшена поддержка возможностей для поисковых оптимизаторов (SEO).
  • Расширены средства для людей с ограниченными возможностями.

Платформа PeerTube изначально была основана на применении BitTorrent-клиента WebTorrent, запускаемого в браузере и использующего технологию WebRTC для организации прямого P2P-канала связи между браузерами. Позднее вместо WebTorrent был задействован протокол HLS (HTTP Live Streaming) в связке с WebRTC, позволяющий адаптивно управлять потоком в зависимости от полосы пропускания. Для объединения разрозненных серверов с видео в общую федеративную сеть, в которой посетители участвуют в доставке контента и имеют возможность подписки на каналы и получения уведомлений о новых видео, задействован протокол ActivityPub. Предоставляемый проектом web-интерфейс построен с использованием фреймворка Angular.

Федеративная сеть PeerTube образуется как содружество связанных между собой небольших серверов хостинга видео, на каждом из которых имеется свой администратор и могут быть приняты свои правила. Каждый сервер с видео выполняет роль BitTorrent-трекера, на котором размещены учётные записи пользователей данного сервера и их видео. Идентификатор пользователя формируются в форме "@имя_пользователя@домен_сервера". Передача данных при просмотре осуществляется непосредственно из браузеров других посетителей, просматривающих контент.

Если видео никто не просматривает, отдача организуется сервером, на который изначально загружено видео (используется протокол WebSeed). Помимо распределения трафика между пользователями, просматривающими видео, PeerTube также позволяет узлам, запущенным авторами для первичного размещения видео, кэшировать видео других авторов, формируя распределённую сеть не только из клиентов, но и из серверов, а также обеспечивая отказоустойчивость. Имеется поддержка потокового вещания (live streaming) с доставкой контента в режиме P2P (для управления стримингом могут использоваться типовые программы, такие как OBS).

Для начала вещания через PeerTube пользователю достаточно загрузить на один из серверов видеоролик, описание и набор тегов. После этого ролик станет доступен во всей федеративной сети, а не только с сервера первичной загрузки. Для работы с PeerTube и участия в распространении контента достаточно обычного браузера и не требуется установка дополнительного ПО. Пользователи могут отслеживать активности в выбранных видеоканалах, подписавшись на интересующие каналы в федеративных социальных сетях (например, в Mastodon и Pleroma) или через RSS. Для распространения видео с использованием P2P-коммуникаций пользователь также может добавить на свой сайт специальный виджет со встроенным web-плеером.

В настоящее время для размещения контента функционирует 1122 сервера, поддерживаемых разными добровольцами и организациями. Если пользователя не устраивают правила размещения видео на определённом сервере PeerTube, он может подключиться к другому серверу или запустить свой собственный сервер. Для быстрого развёртывания сервера предоставляется преднастроенный образ в формате Docker (chocobozzz/peertube).

  1. Главная ссылка к новости
  2. OpenNews: Выпуск децентрализованной видеовещательной платформы PeerTube 5.2
  3. OpenNews: Выпуск децентрализованной видеовещательной платформы PeerTube 5.0
  4. OpenNews: Выпуск libtorrent 2.0 с поддержкой протокола BitTorrent 2
  5. OpenNews: WebTorrent, самодостаточный torrent-клиент, работающий внутри браузера
  6. OpenNews: В libtorrent добавлена поддержка протокола WebTorrent
Обсуждение (111 +26) | Тип: Программы |


·21.10 Доступна JavaScript-платформа Node.js 21.0 (123 +9)
  Состоялся релиз Node.js 21.0, платформы для выполнения сетевых приложений на языке JavaScript. Поддержка ветки Node.js 21.0 будет осуществляться в течение 6 месяцев. В ближайшие дни будет завершена стабилизация ветки Node.js 20, которая получит статус LTS и будет поддерживаться до апреля 2026 года. Сопровождение прошлой LTS-ветки Node.js 18.0 продлится до сентября 2025 года, а позапрошлой LTS-ветки 16.0 до апреля 2024 года.

Основные улучшения:

  • Объявлен стабильным API Fetch, предназначенный для загрузки ресурсов по сети и упрощающий написание универсального JavaScript-кода, пригодного для работы на стороне сервера и клиента. Реализация основана на коде из HTTP/1.1 клиента undici и максимально приближена к аналогичному API, предоставляемому в браузерах. API включает в себя метод fetch() и объекты Headers. Request и Response, представляющие HTTP-заголовки, запрос и ответ.
    
       const res = await fetch('https://nodejs.org/api/documentation.json');
       if (res.ok) {
         const data = await res.json();
         console.log(data);
       }
    
  • Стабилизирована поддержка API WebStreams, предоставляющего доступ к потокам данных, полученным по сети. API даёт возможность добавить свои обработчики, работающие с данными по мере поступления информации по сети, не дожидаясь загрузки всего файла. В Node.js доступны такие объекты, как ReadableStream*, TransformStream*, WritableStream*, TextEncoderStream, TextDecoderStream, CompressionStream и DecompressionStream.
  • Добавлена экспериментальная реализация API WebSocket. Для включения поддержки WebSocket предусмотрен флаг "--experimental-websocket".
  • Добавлен экспериментальный режим использования по умолчанию реализации JavaScript-модулей ESM (ECMAScript Modules, применяется в модулях для браузеров) вместо CommonJS (специфичен для Node.js). Изменение не затрагивает модули, формат которых явно определён через поле "type" в package.json, задан через флаг "--input-type" или очевиден в силу расширения файла (.mjs для ESM, .cjs для CommonJS). При этом модули, которые явно не определены как CommonJS (например, имеют расширение ".js"), при включении нового режима будут восприниматься как модули ESM. Для активации новых настроек модулей предложен флаг "--experimental-default-type".
  • Движок V8 обновлён до версии 11.8, применяемой в Chromium 118, в котором появилась поддержка метода ArrayBuffer.prototype.transfer, возможности группировки массивов (метод groupBy) и WebAssembly-инструкций обработки констант (i32.add, i32.sub, i32.mul, i64.add, i64.sub и i64.mul).
  • Прекращена поддержка обработчика globalPreload, вместо которого для настройки модулей следует использовать вызовы register и initialize.
  • В функцию fs.writeFile добавлена опция "flush" для принудительного сброса данных на накопитель после каждой операции записи.
  • Повышена производительность кода, связанного с разбором URL, API fetch, streams, node:fs и HTTP.
  • Добавлен глобальный объект navigator. Например, для получения данных о числе ядер CPU можно использовать свойство navigator.hardwareConcurrency.
  • В параметре "--test" добавлена поддержка glob-масок для выбора запускаемых тестов (например, можно указать "--test **/*.test.js.").
  • Обновлены входящие в комплект пакетный менеджер npm 10.2.0 и парсер llhttp 9.1.2.
  • Прекращена поддержка Visual Studio 2019 и версий macOS старее 11.0.

Платформа Node.js может быть использована как для серверного сопровождения работы Web-приложений, так и для создания обычных клиентских и серверных сетевых программ. Для расширения функциональности приложений для Node.js подготовлена большая коллекция модулей, в которой можно найти модули с реализацией серверов и клиентов HTTP, SMTP, XMPP, DNS, FTP, IMAP, POP3, модули для интеграции с различными web-фреймворками, обработчики WebSocket и Ajax, коннекторы к СУБД (MySQL, PostgreSQL, SQLite, MongoDB), шаблонизаторы, CSS-движки, реализации криптоалгоритмов и систем авторизации (OAuth), XML-парсеры.

Для обеспечения обработки большого числа параллельных запросов Node.js задействует асинхронную модель запуска кода, основанную на обработке событий в неблокирующем режиме и определении callback-обработчиков. В качестве способов мультиплексирования соединений поддерживаются такие методы, как epoll, kqueue, /dev/poll и select. Для мультиплексирования соединений используется библиотека libuv, которая является надстройкой над libev в системах Unix и над IOCP в Windows. Для создания пула потоков (thread pool) задействована библиотека libeio, для выполнения DNS-запросов в неблокирующем режиме интегрирован c-ares. Все системные вызовы, вызывающие блокирование, выполняются внутри пула потоков и затем, как и обработчики сигналов, передают результат своей работы обратно через неименованный канал (pipe).

Выполнение JavaScript-кода обеспечивается через задействование разработанного компанией Google движка V8 (дополнительно Microsoft развивает вариант Node.js с движком Chakra-Core). По своей сути Node.js похож на фреймворки Perl AnyEvent, Ruby Event Machine, Python Twisted и реализацию событий в Tcl, но цикл обработки событий (event loop) в Node.js скрыт от разработчика и напоминает обработку событий в web-приложении, работающем в браузере.

  1. Главная ссылка к новости
  2. OpenNews: Доступна серверная JavaScript-платформа Node.js 20.0
  3. OpenNews: Доступна серверная JavaScript-платформа Bun 1.0, более быстрая, чем Deno и Node.js
  4. OpenNews: Атака на Node.js через манипуляции с прототипами объектов JavaScript
  5. OpenNews: Автор Node.js представил защищённую JavaScript-платформу Deno 1.0
  6. OpenNews: Представлен Ayo, очередной форк проекта Node.js
Обсуждение (123 +9) | Тип: Программы |


·15.10 Выпуск платформы Electron 27.0 с включением режима декорирования окон для Wayland (114 +4)
  Опубликован релиз платформы Electron 27.0.0, которая предоставляет самодостаточный фреймворк для разработки многоплатформенных пользовательских приложений, использующий в качестве основы компоненты Chromium, V8 и Node.js. Значительное изменение номера версии связано с обновлением до кодовой базы Chromium 118, платформы Node.js 18.17.1 и JavaScript-движка V8 11.8.

Среди изменений в новом выпуске:

  • Включён по умолчанию режим WaylandWindowDecorations, позволяющий при запуске с поддержкой Wayland (--ozone-platform=wayland) корректно менять размер и перемещать окна в Wayland-окружениях на базе GNOME и Weston, в которых не поддерживается протокол XDG Decoration. В окружениях с поддержкой XDG Decoration, таких как KDE и Sway, режим WaylandWindowDecorations игнорируется.
  • Добавлен API для учёта системных настроек, управляющих уровнем прозрачности фона в приложениях.
  • Добавлена поддержка API chrome.scripting, позволяющего подставлять свой JavaScript и CSS на страницы.
  • Добавлены методы safeStorage.setUsePlainTextEncryption и safeStorage.getSelectedStorageBackend.
  • Добавлен API BrowserWindow.showAllTabs. В объект BrowserWindow добавлено свойство tabbingIdentifier. Частично реализован API chrome.tabs.query.
  • В методы session.downloadURL() и webContents.downloadURL() добавлена возможность отправки определённых HTTP-заголовков.
  • Добавлен флаг "--dns-result-order".
  • В Linux реализовано определение настроек тёмной темы оформления через портал "xdg settings".
  • Объявлен устаревшим API ipcRenderer.sendTo(), вместо которого следует использовать MessageChannel для взаимодействия между двумя рендерами.
  • Удалён метод webContents.getPrinters, вместо которого следует использовать webContents.getPrintersAsync.
  • Удалены методы systemPreferences.{get,set}AppLevelAppearance и systemPreferences.appLevelAppearance, на смену которым пришёл модуль nativeTheme.
  • В методе systemPreferences.getColor прекращена поддержка значения alternate-selected-control-text, вместо которого нужно использовать selected-content-background.
  • В systemPreferences удалены события изменения цветовых схем (вместо inverted-color-scheme-changed и high-contrast-color-scheme-changed следует использовать событие updated из модуля nativeTheme).
  • Прекращена поддержка macOS 10.13 (High Sierra) и macOS 10.14 (Mojave).
  • Завершён цикл сопровождения Electron 22.x, последней ветки с поддержкой Windows 7/8/8.1.

Платформа Electron позволяет создавать любые графические приложения с использованием браузерных технологий, логика работы которых определяется на JavaScript, HTML и CSS, а функциональность может быть расширена через систему дополнений. Разработчикам доступны модули Node.js, а также расширенный API для формирования нативных диалогов, интеграции приложений, создания контекстных меню, интеграции с системой вывода уведомлений, манипуляции окнами, взаимодействия с подсистемами Chromium.

В отличие от web-приложений, программы на базе Electron поставляются в виде самодостаточных исполняемых файлов, не привязанных к браузеру. При этом разработчику не нужно заботиться о портировании приложения для различных платформ, Electron обеспечит возможность сборки для всех систем, поддерживаемых в Chromium. Electron также предоставляет средства для организации автоматической доставки и установки обновлений (обновления можно доставлять как с отдельного сервера, так и напрямую с GitHub).

Из программ, построенных на базе платформы Electron можно отметить редактор Atom, почтовый клиент Mailspring, инструментарий для работы с Git GitKraken, система ведения блогов WordPress Desktop, BitTorrent-клиент WebTorrent Desktop, а также официальные клиенты к таким сервисам, как Skype, Signal, Slack, Basecamp, Twitch, Ghost, Wire, Wrike, Visual Studio Code и Discord. Всего в каталоге программ Electron представлено 744 приложения. Для упрощения разработки новых приложений подготовлен набор типовых демонстрационных приложений, включающих примеры кода для решения различных задач.

  1. Главная ссылка к новости
  2. OpenNews: Релиз Chrome 118. Подготовка к блокировке сторонних Cookie в Chrome
  3. OpenNews: В сборки Chromium и Electron будет добавлена поддержка Wayland
  4. OpenNews: Сбои в OpenBSD, DragonFly BSD и Electron из-за устаревания корневого сертификата IdenTrust
  5. OpenNews: Tauri 1.0 - конкурирующая с Electron платформа для создания пользовательских приложений
  6. OpenNews: Выпуск Electron 26.0.0, платформы создания приложений на базе движка Chromium
Обсуждение (114 +4) | Тип: Программы |


·07.10 Выпуск jsii 1.90, генератора кода C#, Go, Java и Python из TypeScript (53 +4)
  Компания Amazon опубликовала компилятор jsii 1.90, представляющий собой модификацию компилятора TypeScript, позволяющую извлечь из компилируемых модулей информацию об API и сгенерировать универсальное представление данного API для обращения к JavaScript-классам из приложений на различных языках программирования. Код проекта написан на TypeScript и распространяется под лицензией Apache 2.0.

Jsii даёт возможность создавать на языке TypeScript библиотеки классов, которые могут использоваться в проектах на языках C#, Go, Java и Python, благодаря трансляции в родные для этих языков модули, предоставляющие тот же самый API. Инструментарий используется в AWS Cloud Development Kit для поставки библиотек для разных языков программирования, формируемых из одной кодовой базы. В новой версии реализовано кэширование списка классов для каждой сборки и документировано как можно превратить обязательное свойство в необязательное.

Пример исходного кода на TypeScript с классом Greeter и последующие примеры его использования в языках C#, Go, Python и Java в качестве родного класса для этих языков:



   export class Greeter {
     public greet(name: string) {
       return `Hello, ${name}!`;
     }
   }

Представление, скомпилированное в C#

   var greeter = new Greeter();
   greeter.Greet("World"); // => Hello, World!

Представление, скомпилированное в Go

   greeter := NewGreeter()
   greeter.Greet("World") // => Hello, World!

Представление, скомпилированное в Java

   final Greeter greeter = new Greeter();
   greeter.greet("World"); // => Hello, World!

Представление, скомпилированное в JavaScript

   const greeter = new Greeter();
   greeter.greet("World"); // => Hello, World!

Представление, скомпилированное в Python

   greeter = Greeter()
   greeter.greet("World") # => Hello, World!






  1. Главная ссылка к новости
  2. OpenNews: Доступна серверная JavaScript-платформа Bun 1.0, более быстрая, чем Deno и Node.js
  3. OpenNews: Фреймворк Turbo прекращает использование языка TypeScript
  4. OpenNews: Вышел Pythonium 0.4.7, компилятор из Python в JavaScript
  5. OpenNews: Проекты по созданию компиляторов из Java в JavaScript и исполняемые файлы
  6. OpenNews: Cheerp 3.0, компилятор C/C++ в JavaScript, переведён на лицензии Apache 2.0 и LLVM
Обсуждение (53 +4) | Тип: Программы |


·11.09 Доступна серверная JavaScript-платформа Bun 1.0, более быстрая, чем Deno и Node.js (104 +25)
  Представлен первый значительный выпуск платформы Bun, предназначенной для обособленного выполнения приложений, написанных на языках JavaScript, JSX и TypeScript. Проект нацелен на использование в качестве прозрачной замены платформы Node.js, поддерживает используемые в Node.js механизмы работы с модулями и обработки зависимостей. Код проекта написан на языках Zig и С++, и распространяется под лицензией MIT. Для выполнения JavaScript задействован JavaScript-движок JavaScriptCore и компоненты проекта WebKit с дополнительными патчами.

В состав Bun входит полный набор инструментов для создания и выполнения приложений на языках JavaScript и TypeScript. Среди прочего, платформа предоставляет runtime для создания серверных обработчиков и выполнения JavaScript-приложений без браузера, совместимый с NPM пакетный менеджер, инструментарий для выполнения тестов, систему сборки самодостаточных пакетов и утилиту bunx для установки и запуска пакетов из репозитория NPM (эквивалент npx и yarn dlx).

Заявлены такие цели, как возможность запуска большей части существующих серверных JavaScript-приложений, достижение высокой производительности и предоставление инструментов для снижения сложности разработки и повышения производительности труда. Проект также предоставляет минимальный набор оптимизированных API для эффективного выполнения таких задач, как запуск HTTP-сервера и работа с файлами. Поддерживается режим "bun --hot" для автоматической горячей перезагрузки кода в случае изменения файлов приложения, выполняемой без остановки работы программы (при перезагрузке установленные соединения не будут оборваны и состояние не будет потеряно).

Особенностью Bun является очень высокая производительность. Например, в тестах на выполнение серверного приложения на базе фреймворка React применение Bun демонстрирует в два раза большую пропускную способность (число обработанных приложением HTTP-запросов в секунду), чем платформа Deno и в 4.7 раза, чем Node.js. В тесте на работу чат-сервера, использующего WebSocket, Bun обгоняет Deno в два раза, а Node.js - в 6 раз. В тесте загрузки больших таблиц из SQLite платформа Bun быстрее Deno в два раза, а Node.js - в 4 раза.

Выполнение установки приложений при помощи команды "bun install" производится в 25 раз быстрее, чем при использовании "npm install", а сборка командой "bun build" в 1.76 быстрее esbuild, в 26 раз быстрее rspack, в 155 раз быстрее Parcel 2 и в 224 раза быстрее WebPack 5. По сравнению с Node.js и Deno, использующими JavaScript-движок V8, Bun построен на базе фреймворка JavaScriptCore, развиваемого компанией Apple для браузера Safari. Кроме высокой производительности применение JavaScriptCore также позволило снизить потребление памяти.

Проект развивается с оглядкой на обеспечение совместимости с серверными приложениями, написанными для Node.js, поддерживает большую часть API Node.js, включая модули и структуры fs, path, http, process, __dirname и Buffer. Поддерживается и традиционный Web API, включая объекты fetch, WebSocket и ReadableStream. Предоставляется совместимость как с модулями Node.js (CommonJS и node_modules), так и с JavaScript-модулями (ESM), созданными в соответствии со спецификацией ECMAScript 6 и применяемыми в браузерных web-приложениях. В текущем виде большинство npm-пакетов, созданных для Node.js, могут быть запущены в Bun без внесения изменений или с минимальными правками. Поддерживаются многие серверные фреймворки, такие как Express, Koa и Hono.

Платформа также может заменить собой множество сопутствующих инструментов, развиваемых для экосистемы Node.js. Например, Bun может использоваться для запуска файлов с расширениями .js, .ts, .cjs, .mjs, .jsx и .tsx, заменяя такие системы, как tsc, babel, ts-node, ts-node-esm и tsx. Встроенная система сборки обособленных программ позволяет обойтись без esbuild, webpack, parcel и rollup. Встроенный пакетный менеджер предоставляет команды, совместимые с npm, обрабатывает package.json, записывает результат в каталог node_modules и может заменить npm, yarn, pnpm и lerna.

  1. Главная ссылка к новости
  2. OpenNews: Facebook открыл код JavaScript-движка Hermes
  3. OpenNews: В JavaScript-платформе Deno обеспечена совместимость с модулями NPM
  4. OpenNews: Автор Node.js представил защищённую JavaScript-платформу Deno 1.0
  5. OpenNews: Бывший техдиректор NPM развивает распределённый репозиторий пакетов Entropic
  6. OpenNews: Доступна серверная JavaScript-платформа Node.js 20.0
Обсуждение (104 +25) | Тип: Программы |


·11.09 Разработка браузерного движка Servo переведена в организацию Linux Foundation Europe (54 +36)
  Проект по разработке браузерного движка Servo официально перешёл под управление некоммерческой организации Linux Foundation Europe, в которой будет развиваться как независимый браузерный движок на нейтральной площадке с привлечением сообщества из заинтересованных разработчиков и компаний.

Проект Servo был создан в 2012 году компанией Mozilla в рамках эксперимента по повышению безопасности и усилению многопоточности Firefox. В 2013 году к разработке подключилась компания Samsung. В 2020 году Mozilla уволила команду, развивавшую Servo, и передала проект под крыло организации Linux Foundation. После этого разработка движка около двух лет находилась в стагнации. В 2023 году к разработке Servo подключилась компания Igalia, которая является участником организации Linux Foundation Europe. Под эгидой организации Linux Foundation Europe компании Igalia удалось собрать новую команду инженеров, подключившихся к разработке Servo.

Servo написан на языке Rust и отличается поддержкой многопоточного рендеринга web-страниц, а также распараллеливанием операций с DOM (Document Object Model). Кроме эффективного распараллеливания операций, используемые в Rust технологии безопасного программирования позволяют поднять уровень безопасности кодовой базы. Изначально браузерный движок Firefox не мог в полной мере задействовать потенциал современных многоядерных систем из-за использования однопоточных схем обработки контента. Servo позволяет разбить код DOM и рендеринга на более мелкие подзадачи, которые могут выполняться параллельно и более эффективно использовать ресурсы многоядерных CPU. В Firefox уже интегрированы некоторые части Servo, такие как многопоточный CSS-движок и система отрисовки WebRender.

  1. Главная ссылка к новости
  2. OpenNews: Возобновлена активная разработка браузерного движка Servo
  3. OpenNews: Компания Mozilla передала движок Servo организации Linux Foundation
  4. OpenNews: Представлен браузерный движок Kosmonaut, написанный на языке Rust
  5. OpenNews: Проект RustPython развивает реализацию интерпретатора Python на языке Rust
  6. OpenNews: В ночные сборки Firefox добавлен WebRender, использующий GPU для отрисовки web-страниц
Обсуждение (54 +36) | Тип: К сведению |


·08.09 Фреймворк Turbo прекращает использование языка TypeScript (150 +33)
  Давид Хейнемейер Ханссон (David Heinemeier Hansson), автогонщик и автор веб-фреймворка Ruby on Rails, объявил о прекращении поддержки языка программирования TypeScript в коде развиваемого им проекта Turbo и переходе на использование чистого JavaScript начиная с выпуска Turbo 8, без задействования строгой типизации. Уход от использования TypeScript во фреймворке Turbo не повлияет на возможность применения TypeScript в клиентском коде или подключение библиотек, написанных на TypeScript.

В качестве причины прекращения использования TypeScript упоминается то, что этот язык мешает автору при разработке и делает трудными вещи, которые должны быть простыми. Недовольство касается не только наличия дополнительной стадии компиляции TypeScript, но и того, что данный язык загрязняет код "гимнастикой с типами". Многие пользователи и участники разработки Turbo не согласились с внесённым изменением и считают, что решение было поспешным. Например, комментарий с мнением, что уход от TypeScript является шагом назад, поддержали 357 участников, а против высказалось всего 8.

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

В ответ Давид Ханссон пояснил, что обсуждение выбора между TypeScript или JavaScript вряд ли могло изменить фундаментальную позицию сторонников и противников TypeScript. Компания 37signals, которая курирует разработку проекта, полностью перешла на использование чистого JavaScript в клиентском коде и внутренних библиотеках. Использование чистого JavaScript не только значительно улучшает читаемость кода, но и избавляет разработчиков от выкрутасов с типами, производимых для удовлетворения капризов компилятора TypeScript.

Фреймворк Turbo распространяется под лицензией MIT и изначально был создан компанией 37signals в процессе разработки платформы управления проектами Basecamp, аналогично тому, как в своё время для данной платформы был создан фреймворк Ruby on Rails. Turbo позиционируется как более простая альтернатива web-фреймворкам, формирующим представления страницы на стороне клиента. В Turbo применяется концепция построения интерактивных web-приложений "HTML-over-the-wire", при которой сервер вместо использования JSON напрямую отправляет клиенту HTML-код. Отмечается, что реализованный подход позволяет минимизировать использование JavaScript в web-приложении, обеспечить высокую производительность и упростить процесс доработки приложений. При использовании Turbo логика работы приложения не размазывается по фронтэнду и бэкенду, а определяется только на сервере с использованием языка программирования, наиболее удобного для разработчика. Браузер же занимается только обработкой готового HTML.

  1. Главная ссылка к новости
  2. OpenNews: Предложен компилятор исходных текстов на языке TypeScript в машинный код
  3. OpenNews: Доступен язык TypeScript 2.0, продвигаемый Microsoft в качестве дополнения к JavaScript
  4. OpenNews: Результаты опроса разработчиков, использующих Ruby on Rails
  5. OpenNews: Устранение нарушения GPL в библиотеке mimemagic привело к сбою в Ruby on Rails
  6. OpenNews: В Ruby on Rails устранена уязвимость, допускающая подстановку SQL-кода
Обсуждение (150 +33) | Тип: Тема для размышления |


·19.04 Доступна серверная JavaScript-платформа Node.js 20.0 (142 +10)
  Состоялся релиз Node.js 20.0, платформы для выполнения сетевых приложений на языке JavaScript. Node.js 20.0 отнесён к веткам с длительным сроком поддержки, но данный статус будет присвоен только в октябре, после проведения стабилизации. Поддержка Node.js 20.x будет осуществляться до 30 апреля 2026 года. Сопровождение прошлой LTS-ветки Node.js 18.x продлится до апреля 2025 года, а позапрошлой LTS-ветки 16.x до сентября 2023 года. Сопровождение LTS-ветки 14.x будет прекращено 30 апреля, а промежуточной ветки Node.js 19.x - 1 июня.

Основные улучшения:

  • Движок V8 обновлён до версии 11.3, применяемой в Chromium 113. Из изменений по сравнению с веткой Node.js 19, в которой использовался движок Chromium 107, отмечаются функции String.prototype.isWellFormed и toWellFormed, методы Array.prototype и TypedArray.prototype для работы с копией при изменении объектов Array и TypedArray, флаг "v" в RegExp, поддержка изменения размера ArrayBuffer и увеличения размера SharedArrayBuffer, хвостовая рекурсия (tail-call) в WebAssembly.
  • Предложен экспериментальный механизм Permission Model, позволяющий ограничить доступ к определённым ресурсам в процессе исполнения. Поддержка Permission Model включается через указание при запуске флага "--experimental-permission". В начальной реализации предложены опции для ограничения доступа на запись (--allow-fs-write) и чтение (--allow-fs-read) к определённым частям ФС, дочерним процессам (--allow-child-process), дополнениям (--no-addons) и потокам (--allow-worker). Например, чтобы разрешить запись в каталог /tmp и чтение файла /home/index.js можно указать:
    
        node --experimental-permission --allow-fs-write=/tmp/ --allow-fs-read=/home/index.js index.js
    

    Для проверки доступа предлагается использовать метод process.permission.has(), например, "process.permission.has('fs.write',"/tmp/test").

  • Обработчики внешних модулей ECMAScript (ESM), загружаемых через опцию "--experimental-loader", теперь выполняются в отдельном потоке, изолированном от основного потока, что исключает пересечение кода приложений и загружаемых ESM-модулей. По аналогии с браузерами метод import.meta.resolve() при вызове из приложения теперь выполняется в синхронном режиме. В одной из следующих веток Node.js поддержку загрузки ESM планируют перевести в разряд стабильных возможностей.
  • В число стабильный переведён модуль node:test (test_runner), предназначенный для создания и запуска тестов на языке JavaScript, возвращающих результат в формате TAP (Test Anything Protocol).
  • Сформирована отдельная команда разработчиков, отвечающая за оптимизацию производительности, которая при подготовке новой ветки провела работу по ускорению различных runtime-компонентов, включая разбор URL, fetch() и EventTarget. Например, накладные расходы при инициализации EventTarget снижены в два раза, значительно повышена производительность метода URL.canParse() и повышена эффективность работы таймеров. Кроме того, в состав включён выпуск высокопроизводительного парсера URL - Ada 2.0, написанного на языке C++.
  • Продолжено развитие экспериментальной возможности для поставки приложений в форме одного исполняемого файла (SEA, Single Executable Applications). Создание исполняемого файла теперь требует подстановки блоба, формируемого на основе файла конфигурации в формате JSON (вместо подстановки JavaScript-файла).
  • Улучшена совместимость API Web Crypto с реализациями от других проектов.
  • Добавлена официальная поддержка Windows на системах ARM64.
  • Продолжена реализация поддержки расширений WASI (WebAssembly System Interface) для создания обособленных WebAssembly-приложений. Убрана необходимость указания специального флага командной строки для включения поддержки WASI.

Платформа Node.js может быть использована как для серверного сопровождения работы Web-приложений, так и для создания обычных клиентских и серверных сетевых программ. Для расширения функциональности приложений для Node.js подготовлена большая коллекция модулей, в которой можно найти модули с реализацией серверов и клиентов HTTP, SMTP, XMPP, DNS, FTP, IMAP, POP3, модули для интеграции с различными web-фреймворками, обработчики WebSocket и Ajax, коннекторы к СУБД (MySQL, PostgreSQL, SQLite, MongoDB), шаблонизаторы, CSS-движки, реализации криптоалгоритмов и систем авторизации (OAuth), XML-парсеры.

Для обеспечения обработки большого числа параллельных запросов Node.js задействует асинхронную модель запуска кода, основанную на обработке событий в неблокирующем режиме и определении callback-обработчиков. В качестве способов мультиплексирования соединений поддерживаются такие методы, как epoll, kqueue, /dev/poll и select. Для мультиплексирования соединений используется библиотека libuv, которая является надстройкой над libev в системах Unix и над IOCP в Windows. Для создания пула потоков (thread pool) задействована библиотека libeio, для выполнения DNS-запросов в неблокирующем режиме интегрирован c-ares. Все системные вызовы, вызывающие блокирование, выполняются внутри пула потоков и затем, как и обработчики сигналов, передают результат своей работы обратно через неименованный канал (pipe). Выполнение JavaScript-кода обеспечивается через задействование разработанного компанией Google движка V8 (дополнительно Microsoft развивает вариант Node.js с движком Chakra-Core).

По своей сути Node.js похож на фреймворки Perl AnyEvent, Ruby Event Machine, Python Twisted и реализацию событий в Tcl, но цикл обработки событий (event loop) в Node.js скрыт от разработчика и напоминает обработку событий в web-приложении, работающем в браузере. При написании приложений для node.js необходимо учитывать специфику событийно-ориентированного программирования, например, вместо выполнения "var result = db.query("select..");" с ожиданием завершения работы и последующей обработкой результатов, в Node.js использует принцип асинхронного выполнения, т.е. код трансформируется в "db.query("select..", function (result) {обработка результата});", при котором управление мгновенно перейдёт к дальнейшему коду, а результат запроса будет обработан по мере поступления данных.

  1. Главная ссылка к новости
  2. OpenNews: Доступна серверная JavaScript-платформа Node.js 19.0
  3. OpenNews: Атака на Node.js через манипуляции с прототипами объектов JavaScript
  4. OpenNews: Автор Node.js представил защищённую JavaScript-платформу Deno 1.0
  5. OpenNews: Доступна серверная JavaScript-платформа Node.js 18.0
  6. OpenNews: В JavaScript-платформе Deno обеспечена совместимость с модулями NPM
Обсуждение (142 +10) | Тип: Программы |


·06.04 Выпуск Electron 24.0.0, платформы создания приложений на базе движка Chromium (196 –16)
  Подготовлен релиз платформы Electron 24.0.0, которая предоставляет самодостаточный фреймворк для разработки многоплатформенных пользовательских приложений, использующий в качестве основы компоненты Chromium, V8 и Node.js. Значительное изменение номера версии связано с обновлением до кодовой базы Chromium 112, платформы Node.js 18.14.0 и JavaScript-движка V8 11.2.

Среди изменений в новом выпуске:

  • Изменена логика обработки размера изображения в методе nativeImage.createThumbnailFromPath(path, size), в котором параметр "maxSize" заменён на "size" и теперь отражает фактический размер создаваемой миниатюры, а не максимальный (т.е. если размер меньше будет применено масштабирование).
  • Объявлены устаревшими методы BrowserWindow.setTrafficLightPosition(position) и BrowserWindow.getTrafficLightPosition(), вместо которых следует использовать BrowserWindow.setWindowButtonPosition(position) и BrowserWindow.getWindowButtonPosition().
  • В методе cookies.get() добавлена возможность фильтрации Cookie при режиме HttpOnly.
  • В метод shell.openExternal() добавлен параметр logUsage.
  • В webRequest появилась возможность фильтрации запросов по типам.
  • В webContents добавлено событие devtools-open-url для открытия нового окна.
  • В callback-обработчик ses.setDisplayMediaRequestHandler() добавлен флаг enableLocalEcho для отражения внешнего звукового ввода в локальный выходной поток.
  • В файле конфигурации по умолчанию включена общая оптимизация, использующая информацию, полученную при компиляции всех модулей.

Платформа Electron позволяет создавать любые графические приложения с использованием браузерных технологий, логика работы которых определяется на JavaScript, HTML и CSS, а функциональность может быть расширена через систему дополнений. Разработчикам доступны модули Node.js, а также расширенный API для формирования нативных диалогов, интеграции приложений, создания контекстных меню, интеграции с системой вывода уведомлений, манипуляции окнами, взаимодействия с подсистемами Chromium.

В отличие от web-приложений, программы на базе Electron поставляются в виде самодостаточных исполняемых файлов, не привязанных к браузеру. При этом разработчику не нужно заботиться о портировании приложения для различных платформ, Electron обеспечит возможность сборки для всех систем, поддерживаемых в Chromium. Electron также предоставляет средства для организации автоматической доставки и установки обновлений (обновления можно доставлять как с отдельного сервера, так и напрямую с GitHub).

Из программ, построенных на базе платформы Electron можно отметить редактор Atom, почтовый клиент Mailspring, инструментарий для работы с Git GitKraken, система ведения блогов WordPress Desktop, BitTorrent-клиент WebTorrent Desktop, а также официальные клиенты к таким сервисам, как Skype, Signal, Slack, Basecamp, Twitch, Ghost, Wire, Wrike, Visual Studio Code и Discord. Всего в каталоге программ Electron представлено 734 приложения. Для упрощения разработки новых приложений подготовлен набор типовых демонстрационных приложений, включающих примеры кода для решения различных задач.

  1. Главная ссылка к новости
  2. OpenNews: Релиз Chrome 112
  3. OpenNews: В сборки Chromium и Electron будет добавлена поддержка Wayland
  4. OpenNews: Сбои в OpenBSD, DragonFly BSD и Electron из-за устаревания корневого сертификата IdenTrust
  5. OpenNews: Tauri 1.0 - конкурирующая с Electron платформа для создания пользовательских приложений
  6. OpenNews: Выпуск Electron 23.0.0, платформы создания приложений на базе движка Chromium
Обсуждение (196 –16) | Тип: Программы |


·17.03 Cheerp 3.0, компилятор C/C++ в JavaScript, переведён на лицензии Apache 2.0 и LLVM (62 +5)
  Представлен компилятор Cheerp 3.0, позволяющий скомпилировать любой код C/C++ в WebAssembly или JavaScript. Новая ветка примечательна переводом компилятора и сопутствующих библиотек на использование пермиссивных лицензий Apache 2.0 и LLVM, вместо ранее применяемой ограниченной лицензионной политики, предлагающей вариант с лицензией GPLv2 для некоммерческих проектов и проприетарную лицензию для коммерческих. Код компилятора основан на наработках LLVM и Clang, и включает дополнительные оптимизации для повышения производительности и уменьшения размера скомпилированного результата.

Cheerp может применяться как для портирования существующих C/C++ библиотек и приложений для выполнения в браузере, так и для создания высокопроизводительных web-приложений и WebAssembly-компонентов с нуля. Проект позволяет комбинировать в одном web-приложении код на C/C++ и JavaScript с возможностью доступа из кода JavaScript к функциям, изначально разработанным на C/C++, а из кода C/C++ к объектам JavaScript, JavaScript-библиотекам, Web API и всем возможностям DOM. Допускается создание комбинированных сборок, часть кода в которых компилируется в JavaScript, а часть в WebAssembly. Поддерживается сборка проектов, использующих стандартные библиотеки libc и libc++.

По сравнению с компилятором Emscripten, Cheerp генерирует более оптимизированный и компактный промежуточный код WebAssembly (в среднем размер итоговых файлов на 7% меньше). Концептуально различия сводятся к тому, что Emscripten используется в качестве объектного формата WebAssembly и выполняет связывание и оптимизацию на стадии постобработки WebAssembly (wasm-opt). В Cheerp в качестве промежуточного представления для библиотек и объектных файлов используется байткод в формате LLVM, что позволяет применять более широкие оптимизации, охватывающие проект в целом и использующие метаданные на уровне LLVM, без необходимости выполнения постобработки.

Дополнительное в Cheerp применяются оптимизатор PreExecuter, обеспечивающий упреждающее выполнение кода на этапе компиляции, например, для преобразования в константы конструкторов, используемых для инициализации глобальных объектов. Также при компиляции используется PartialExecuter, который на основе анализа параметров функций удаляет код, который гарантированно не используется при выполнении.

Cheerp также может генерировать код JavaScript для динамической работы с памятью, охватываемой сборщиком мусора. В частности, вместо эмулирования традиционного адресного пространства при помощи типизированных массивов, Cheerp обеспечивает прямой маппинг объектов C++ в объекты JavaScript, что позволяет снизить потребление памяти, так как сборщик мусора JavaScript имеет возможность удалять неиспользуемые объекты. Для повышения производительности в генерируемом промежуточном коде WebAssembly применяются SIMD-расширения, позволяющие организовать распараллеливание выполнения операций над данными.

Cheerp может использоваться как платформа для создания интегрированных клиент/серверных web-приложений на языке C++. В существующей практике обычно отдельно разрабатываются выполняемый в браузере фронтэнд, написанный на языке JavaScript, и раздельная серверная часть, написанная на языках PHP, Python, Ruby или JavaScript/Node.js. Cheerp предоставляет средства для создания целостных web-приложений на языке C++, в которых бэкенд и фронтэнд поддерживаются в единой кодовой базе. В процессе компиляции серверная часть компилируется в нативный код, а интерфейс преобразуется в JavaScript-представление. Отладка всех компонентов проекта, в том числе преобразуемых в JavaScript, осуществляется по исходным текстам на языке C++ с использованием технологии Source Map (при возникновении ошибки можно увидеть участок кода на C++, поддерживается установка точек останова в коде C++ и построчного пошагового выполнения С++ кода).

  1. Главная ссылка к новости
  2. OpenNews: Релиз Cheerp 1.3, компилятора C++ в JavaScript
  3. OpenNews: Началось ограниченное бета-тестирование Duetto, компилятора из C++ в JavaScript
  4. OpenNews: Открыт код Duetto, системы для запуска в web-браузере проектов на языке C++
  5. OpenNews: Доступен предварительный вариант стандарта WebAssembly 2.0
  6. OpenNews: Доступен Emscripten 3.0, компилятор из C/C++ в WebAssembly
Обсуждение (62 +5) | Тип: Программы |


·10.02 Выпуск Electron 23.0.0, платформы создания приложений на базе движка Chromium (89 –15)
  Подготовлен релиз платформы Electron 23.0.0, которая предоставляет самодостаточный фреймворк для разработки многоплатформенных пользовательских приложений, использующий в качестве основы компоненты Chromium, V8 и Node.js. Значительное изменение номера версии связано с обновлением до кодовой базы Chromium 110, платформы Node.js 18.12.1 и JavaScript-движка V8 11.

Среди изменений в новом выпуске:

  • Добавлена поддержка API WebUSB, позволяющего напрямую взаимодействовать со специализированными периферийными устройствами, подключаемыми через порт USB. WebUSB даёт возможность организовать работу с USB-устройствами без установки в систему специализированных драйверов c определением логики низкоуровневого взаимодействия в приложении.
  • В объект Display добавлено свойство "label" с текстовой меткой, наглядно идентифицирующей экран.
  • Реализован API app.getPreferredSystemLanguages() для определения выбранных в системе языков.
  • Добавлен метод SerialPort.forget(), возвращающий Promise для обработки закрытия последовательного порта, а также реализовано событие serial-port-revoked, генерируемое при отзыве доступа к последовательному порту после закрытия соединения к нему.
  • Добавлен API win.setHiddenInMissionControl, позволяющий скрыть окно приложения в интерфейсе Mission Control на системах с macOS.
  • Из объекта BrowserWindow удалены устаревшие события scroll-touch-begin, scroll-touch-end и scroll-touch-edge, вместо которых следует использовать событие input-event в WebContents.
  • Прекращена поддержка ОС Windows 7, 8 и 8.1, а также Windows Server 2012 и 2012 R2.

Платформа Electron позволяет создавать любые графические приложения с использованием браузерных технологий, логика работы которых определяется на JavaScript, HTML и CSS, а функциональность может быть расширена через систему дополнений. Разработчикам доступны модули Node.js, а также расширенный API для формирования нативных диалогов, интеграции приложений, создания контекстных меню, интеграции с системой вывода уведомлений, манипуляции окнами, взаимодействия с подсистемами Chromium.

В отличие от web-приложений, программы на базе Electron поставляются в виде самодостаточных исполняемых файлов, не привязанных к браузеру. При этом разработчику не нужно заботиться о портировании приложения для различных платформ, Electron обеспечит возможность сборки для всех систем, поддерживаемых в Chromium. Electron также предоставляет средства для организации автоматической доставки и установки обновлений (обновления можно доставлять как с отдельного сервера, так и напрямую с GitHub).

Из программ, построенных на базе платформы Electron можно отметить редактор Atom, почтовый клиент Mailspring, инструментарий для работы с Git GitKraken, система ведения блогов WordPress Desktop, BitTorrent-клиент WebTorrent Desktop, а также официальные клиенты к таким сервисам, как Skype, Signal, Slack, Basecamp, Twitch, Ghost, Wire, Wrike, Visual Studio Code и Discord. Всего в каталоге программ Electron представлено 734 приложения. Для упрощения разработки новых приложений подготовлен набор типовых демонстрационных приложений, включающих примеры кода для решения различных задач.


  1. Главная ссылка к новости
  2. OpenNews: Выпуск Electron 19.0.0, платформы создания приложений на базе движка Chromium
  3. OpenNews: Tauri 1.0 - конкурирующая с Electron платформа для создания пользовательских приложений
  4. OpenNews: Сбои в OpenBSD, DragonFly BSD и Electron из-за устаревания корневого сертификата IdenTrust
  5. OpenNews: Опубликован инструмент для выявления проблем с безопасностью в приложениях Electron
  6. OpenNews: Релиз Chrome 110
Обсуждение (89 –15) | Тип: Программы |


·11.01 Уязвимость в NPM-пакете JsonWebToken, насчитывающем 10 млн загрузок в неделю (54 +7)
  В JavaScript-библиотеке JsonWebToken с реализацией технологии JSON Web Token (JWT) выявлена уязвимость (CVE-2022-23529), потенциально позволяющая добиться удалённого выполнения кода при передаче в функцию jwt.verify() специально оформленного параметра secretOrPublicKey при верификации JWT-запроса (примеров приложений, на которые может быть совершена атака не приведено). За последнюю неделю библиотека была загружена из каталога NPM более 10 млн раз. В качестве зависимости JsonWebToken задействован в более чем 22 тысячах пакетов, в которых используется для верификации и подписывания токенов JWT, применяемых для защищённой передачи информации в формате JSON. Уязвимость устранена в выпуске JsonWebToken 9.0.0.

Уязвимость вызвана ошибкой в реализации метода verify, который принимает три параметра (токен, secretOrPublicKey и набор опций), после чего проверяет корректность токена и возвращает декодированное содержимое. В соответствии со спецификацией параметр secretOrPublicKey может быть строкой или буфером, но в коде JsonWebToken это не учитывается и он всегда разбирается как строка с использованием метода toString().

Соответственно, если передать в secretOrPublicKey вместо строки JavaScript-объект с собственным методом toString(), то при проверке будет вызван указанный атакующим код.

Дополнение: Видимо, исправление было преждевременно и CVE-идентификатор будет помечен как отозванный, так как для атаки недостаточно передачи определённого JSON-содержимого и требуется, чтобы функции был передан готовый объект, чего нереалистично добиться без изменения кода приложения.

  1. Главная ссылка к новости
  2. OpenNews: Уязвимость, позволявшая выпустить обновление для любого пакета в репозитории NPM
  3. OpenNews: Уязвимость в NPM, приводящая к перезаписи файлов в системе
  4. OpenNews: Уязвимость в репозитории NPM, позволяющая добавить сопровождающего без подтверждения
  5. OpenNews: Уязвимость в NPM-пакете pac-resolver, насчитывающем 3 млн загрузок в неделю
  6. OpenNews: Уязвимость в NPM-пакете node-netmask, применяемом в 270 тысячах проектов
Обсуждение (54 +7) | Тип: Проблемы безопасности |


·04.01 Вышла новая LTS-версия менеджера состояния Reatom (18 –10)
  Вышла новая LTS-версия Reatom 3, менеджера состояния для веб-приложений, работающих по модели Flux. Проект может применяться в качестве альтернативы Redux. В новой ветке поменялось практически все, кроме ключевых принципов: работа в выделенном глобальном контексте и разделение на чистые вычисления и побочные эффекты (side-effect) для облегчения тестирования, разделение на атомы (atoms) и действия (actions) для DCI-подобного описания логики. Код написан на JavaScript и распространяется под лицензией MIT.

Нововведения:

  • Более проактивная и дружелюбная политика развития экосистемы, более десятка новых пакетов, скрипт для старта нового пакета.
  • Пакет для обработки асинхронных запросов, добавления к ним мета статусов, кеширования, перезапросов.
  • Агресивный механизм группировки вызовов (batching), позволяющий обновлять атомы и вызывать действия (actions) внутри других атомов и действий.
  • Публичная возможность планировать откаты состояния (rollback), при необходимости сделать побочный эффект (side-effect) в чистой функции.
  • Возможность динамически подписываться на атомы: по условия или по изменяемому списку атомов.
  • Возможность связывать действия для FRP-подобной логики (Functional Reactive Programming).
  • Lifecycle-хуки позволяют описывать более изолированные логические модули в стиле акторов.
  • Пакет для логирования.
  • Новый сайт документации reatom.dev.


  1. Главная ссылка к новости
  2. OpenNews: Вышел менеджер состояний Reatom 1.0, позиционируемый как альтернатива Redux
  3. Знакомство c Reatom
Обсуждение (18 –10) | Автор: artalar | Тип: Программы |


·27.11 Доступен Wasmer 3.0, инструментарий для создания приложений на базе WebAssembly (39 +4)
  Представлен третий значительный выпуск проекта Wasmer, развивающего runtime для выполнения модулей WebAssembly, который можно использовать для создания универсальных приложений, способных выполняться в разных операционных системах, а также для изолированного выполнения кода, не заслуживающего доверия. Код проекта написан на языке Rust и распространяется под лицензией MIT.

Возможность запуска одного приложения на разных платформах обеспечивается благодаря компиляции кода в низкоуровневый промежуточный код WebAssembly, который может запускаться в любых ОС или встраиваться в программы на других языках программирования. Программы представляют собой легковесные контейнеры, в которых выполняется псевдокод WebAssembly. Данные контейнеры не привязаны к операционной системе и могут включать код, изначально написанный на любом языке программирования. Для компиляции в WebAssembly может использоваться инструментарий Emscripten. Для трансляции WebAssembly в машинный код текущей платформы поддерживается подключение разных бэкендов компиляции (Singlepass, Cranelift, LLVM) и движков (задействование JIT или генерация машинного кода).

Приложения изолированы от основной системы в sandbox-окружении и имеют доступ только к заявленной функциональности (механизм безопасности на основе управления возможностями - для действий с каждым из ресурсов (файлы, каталоги, сокеты, системные вызовы и т.п.) приложению должны быть даны соответствующие полномочия). Управление доступом и взаимодействие с системой обеспечивается при помощи API WASI (WebAssembly System Interface), предоставляющем программные интерфейсы для работы с файлами, сокетами и другими функциями, предоставляемыми операционной системой.

Платформа позволяет добиться производительности выполнения приложений, близкой к выполнению родных сборок. При помощи Native Object Engine для WebAssembly-модуля можно сгенерировать машинный код ("wasmer compile --native" для генерации предкомпилированных объектных файлов .so, .dylib и .dll), для запуска которого требуется минимальный runtime, но сохраняются все возможности sandbox-изоляции. Возможна поставка предкомпилированных программ со встроенным Wasmer. Для создания надстроек и дополнений предлагаются Rust API и Wasm-C-API.

Для запуска WebAssembly-контейнера достаточно установить в системе runtime Wasmer, который поставляется без внешних зависимостей ("curl https://get.wasmer.io -sSfL | sh"), и запустить необходимый файл ("wasmer test.wasm"). Программы распространяются в форме обычных WebAssembly-модулей, для управления которыми можно использовать пакетный менеджер WAPM. Wasmer также доступен в форме библиотеки, которую можно использовать для встраивания кода WebAssembly в программы на языках Rust, С/C++, C#, D, Python, JavaScript, Go, PHP, Ruby, Elixir и Java.

Основные изменения в Wasmer 3.0:

  • Добавлена возможность создания родных исполняемых файлов для любых платформ. Полностью переработана команда "wasmer create-exe", которая позволяет преобразовать файл с промежуточным кодом WebAssembly в самодостаточные исполняемые файлы для платформ Linux, Windows и macOS, которые могут работать без установки самого Wasmer.
  • Предоставлена возможность запуска WAPM-пакетов, размещённых в каталоге wapm.io, при помощи команды "wasmer run". Например, выполнение "wasmer run python/python" приведёт к загрузке из репозитория wapm.io пакета python и его запуску.
  • Полностью переработан Wasmer Rust API, в котором изменён стиль работы с памятью и обеспечена возможность безопасного сохранения объектов Wasm в структуре Store. Предложена новая структура MemoryView, позволяющая читать и записывать данные в линейную область памяти.
  • Реализован набор компонентов wasmer-js для запуска Wasmer в web-браузере и взаимодействия с ним из JavaScript, используя библиотеку wasm-bindgen.
  • Упрощены движки. Вместо раздельных движков для JIT, динамического и статического связывания (Universal, Dylib, StaticLib) теперь предлагается один общий движок и загрузка и сохранение кода в котором управляется на уровня выставления параметров.
  • Для десериализации артефактов задействован фреймворк rkyv, обеспечивающий работу в режиме zero-copy, т.е. не требующий выделения дополнительной памяти и выполняющий десериализацию только с использованием изначально предоставленного буфера. Применение rkyv позволило значительно повысить скорость запуска.
  • Улучшен однопроходный компилятор Singlepass, в котором появилась поддержка функций с несколькими аргументами (multi-value), повышена надёжность работы и добавлена поддержка кадров обработки исключений.
  • Улучшена реализация API WASI (WebAssembly System Interface). Решены проблемы в программном интерфейсе WASI для работы с файловой системой. Внутренние типы переработаны с использованием WAI (WebAssembly Interfaces), что в будущем позволит воплотить в жизнь серию новых возможностей.

  1. Главная ссылка к новости
  2. OpenNews: Доступен Wasmer 2.0, инструментарий для создания приложений на базе WebAssembly
  3. OpenNews: Разработчики V8 представили декомпилятор для WebAssembly
  4. OpenNews: Доступен Emscripten 3.0, компилятор из C/C++ в WebAssembly
  5. OpenNews: Вариант LibreOffice, скомпилированный в WebAssembly и работающий в web-браузере
  6. OpenNews: Доступен предварительный вариант стандарта WebAssembly 2.0
Обсуждение (39 +4) | Тип: Программы |


·14.11 В JavaScript-платформе Deno обеспечена совместимость с модулями NPM (67 +11)
  Представлен выпуск Deno 1.28, платформы для обособленного выполнения приложений на языках JavaScript и TypeScript, которая может быть использована для создания обработчиков, работающих на сервере. Платформу развивает Райан Даль (Ryan Dahl), создатель Node.js. Как и в Node.js в Deno используется JavaScript-движок V8, который также применяется в браузерах на основе Chromium. При этом Deno не является ответвлением от Node.js, а представляет собой созданный с нуля новый проект. Код проекта распространяется под лицензией MIT. Сборки подготовлены для Linux, Windows и macOS.

Проект Deno был создан для предоставления пользователям более защищённого окружения и устранения концептуальных ошибок, допущенных в архитектуре Node.js. Для повышения безопасности обвязка вокруг движка V8 написана на языке Rust, позволяющем избежать многих уязвимостей, возникающих из-за низкоуровневой работы с памятью. Для обработки запросов в неблокирующем режиме применяется платформа Tokio, также написанная на языке Rust. Tokio позволяет создавать высокопроизводительные приложения на основе событийно-ориентированной архитектуры (Event-driven), поддерживающие многопоточность и обработку сетевых запросов в асинхронном режиме.

Ключевым изменением в новом выпуске является стабилизация совместимости с пакетами, размещёнными в репозитории NPM, что позволяет использовать в Deno более 1.3 млн модулей, созданных для платформы Node.js. Например, в приложениях на базе Deno теперь можно использовать такие модули для организации постоянного доступа к данным, как Prisma, Mongoose и MySQL, а также фреймворки для обеспечения работы фронтэндов, такие как React и Vue. Некоторые NPM-модули пока остаются несовместимыми с Deno, например, из-за привязок к специфичным для Node.js элементам окружения, таким как файл package.json. Также пока невозможно использовать команду "deno compile" с модулями NPM. В будущих выпусках планируется устранить подобные несовместимости и ограничения.

Поддержка ранее применяемой в Deno модели на основе системы модулей ECMAScript и Web API сохранена на том же уровне и для импорта модулей NPM используется привычная для Deno схема загрузки на основе URL. Для обращения к модулям NPM предусмотрен специальный URL-префикс "npm:", который может использоваться по аналогии с обычными модулями Deno. Например, для импорта NPM-модуля можно указать 'import { chalk } from "npm:chalk@5";', а для запуска NPM-скрипта из командной строки - "deno run --allow-env --allow-read npm:create-vite-extra".

Использование NPM-пакетов в Deno значительно проще, чем в Node.js, так как нет необходимости предварительной установки модулей (модули устанавливаются при первом запуске приложения), не используется файл package.json, а также не используется по умолчанию каталог node_modules (модули кэшируются в общем каталоге, но есть возможность возвращения старого поведения при помощи опции "--node-modules-dir").

В приложениях на базе NPM сохраняется возможность использования предоставляемых в Deno механизмов разграничения доступа, изоляции и активации влияющих на безопасность расширенных возможностей. Для противодействия проведению атак через сомнительные зависимости Deno блокирует по умолчанию все попытки получения доступа к системе из зависимостей и выводит предупреждение о выявленных проблемах. Например, при попытке модуля получения доступа на запись в /usr/bin/ будет выведен запрос подтверждения данной операции:


   deno run npm:install-malware
   ⚠️  ┌ Deno requests write access to /usr/bin/.
       ├ Requested by `install-malware`
       ├ Run again with --allow-write to bypass this prompt.
       └ Allow? [y/n] (y = yes, allow; n = no, deny) >

Из не связанных в NPM улучшений в новой версии упоминается обновление движка V8 до выпуска 10.9, автоматическое определение файлов с блокировками, стабилизация API Deno.bench(), Deno.gid(), Deno.networkInterfaces(), Deno.systemMemoryInfo() и Deno.uid(), добавление нового нестабильного API Deno.Command() для запуска команд (универсальная замена Deno.spawn, Deno.spawnSync и Deno.spawnChild).


Основные особенности Deno:

  • Ориентация на безопасность в конфигурации по умолчанию. Обращения к файлам, сетевые возможности и доступ к переменным окружения по умолчанию блокированы и требуют явного включения. Приложения по умолчанию запускаются в изолированных sandbox-окружениях и не могут получить доступ к системным возможностям без предоставления явных полномочий;
  • Встроенная поддержка языка TypeScript помимо JavaScript. Для проверки типов и генерации JavaScript задействован штатный компилятор TypeScript, что приводит к проседанию производительности по сравнению с разбором JavaScript в V8;
  • Runtime поставляется в форме одного самодостаточного исполняемого файла ("deno"). Для запуска приложений при помощи Deno достаточно загрузить для своей платформы один исполняемый файл, размером около 30 МБ, не имеющий внешних зависимостей и не требующий какой-то особой установки в систему. При этом deno не является монолитным приложением, а представляет собой коллекцию crate-пакетов на Rust (deno_core, rusty_v8), которые могут использоваться по отдельности;
  • При запуске программы, а также для загрузки модулей можно использовать адресацию через URL. Например, для запуска программы welcome.js можно использовать команду "deno https://deno.land/std/examples/welcome.js". Код с внешних ресурсов загружается и кэшируется на локальной системе, но никогда автоматически не обновляется (для обновления требуется явно запустить приложение с флагом "--reload");
  • Эффективная обработка в приложениях сетевых запросов по HTTP, платформа рассчитана на создание высокопроизводительных сетевых приложений;
  • Возможность создания универсальных web-приложений, которые могут выполниться как в Deno, так и в обычном web-браузере;
  • Наличие стандартного набора модулей, использование которых не требует привязки к внешним зависимостям. Модули из стандартной коллекции прошли дополнительный аудит и проверку на совместимость;
  • Кроме runtime платформа Deno также выполняет роль пакетного менеджера и позволяет внутри кода обращаться к модулям по URL. Например, для загрузки модуля можно указать в коде "import * as log from "https://deno.land/std/log/mod.ts". Файлы, загруженные с внешних серверов по URL, кэшируются. Привязка к версиям модулей определяются через указания номеров версий внутри URL, например, "https://unpkg.com/liltest@0.0.5/dist/liltest.js";
  • В состав интегрирована система инспектирования зависимостей (команда "deno info") и утилита для форматирования кода (deno fmt);
  • Все скрипты приложения могут быть объединены в один JavaScript файл.

  1. Главная ссылка к новости
  2. OpenNews: Доступна серверная JavaScript-платформа Node.js 19.0
  3. OpenNews: Атака на Node.js через манипуляции с прототипами объектов JavaScript
  4. OpenNews: Релиз Tokio 1.13.0, платформы для создания асинхронных приложений на языке Rust
  5. OpenNews: Проект Deno развивает защищённую JavaScript-платформу, похожую на Node.js
  6. OpenNews: Автор Node.js представил защищённую JavaScript-платформу Deno 1.0
Обсуждение (67 +11) | Тип: Программы |


·03.11 В NPM включена обязательная двухфакторная аутентификация для сопровождающих значимых пакетов (21 –7)
  GitHub расширил применение в репозитории NPM обязательной двухфакторной аутентификации, которая отныне станет применяться к учётным записям разработчиков, сопровождающих пакеты, насчитывающие более 1 млн загрузок в неделю или используемые в качестве зависимости у более 500 пакетов. Ранее двухфакторная аутентификация была обязательной только для сопровождающих 500 самых популярных NPM-пакетов (по числу зависимых пакетов).

Сопровождающие значимых пакетов теперь смогут выполнить связанные с внесением изменений операции с репозиторием только после включения двухфакторной аутентификации, требующей подтверждения входа при помощи одноразовых паролей (TOTP), генерируемых такими приложениями, как Authy, Google Authenticator и FreeOTP, или аппаратных ключей и биометрических сканеров, поддерживающих протокол WebAuth.

  1. Главная ссылка к новости
  2. OpenNews: В NPM планируют использовать Sigstore для подтверждения подлинности пакетов
  3. OpenNews: В NPM включена обязательная двухфакторная аутентификация для 500 самых популярных пакетов
  4. OpenNews: GitHub перейдёт на использование обязательной двухфакторной аутентификации
  5. OpenNews: RubyGems переходит на обязательную двухфакторную аутентификацию для популярных пакетов
  6. OpenNews: Внедрение двухфакторной аутентификации в PyPI привело к инциденту с удалением популярного пакета
Обсуждение (21 –7) |


Следующая страница (раньше) >>



Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру