Wydanie Node.js 17.0, platformy do uruchamiania aplikacji sieciowych napisanych w JavaScript, miało miejsce. Node.js 17.0 należy do gałęzi z normalnym okresem wsparcia, aktualizacje będą wydawane do czerwca 2022 roku. W najbliższych dniach zakończone zostaną prace stabilizacyjne nad gałęzią Node.js 16, która uzyska status LTS i będzie wspierana do kwietnia 2024 roku. Wsparcie dla wcześniejszej gałęzi LTS Node.js 14.0 potrwa do kwietnia 2023 roku, a dla gałęzi 12.0 do kwietnia 2022 roku.
Zaimplementowano wywołania systemowe waitid (oczekiwanie na zmianę stanu procesu), pinsyscall (do przekazywania informacji o punkcie wejścia execve w celu ochrony przed exploitami ROP), getthrname i setthrname (uzyskiwanie i ustalanie nazwy wątku).
- Silnik V8 zaktualizowany do wersji 9.5.
- Продолжена реализация вариантов базового API, основанных на использовании интерфейса асинхронных вычислений Promise. В дополнение к ранее предложенным API Timers Promises и Streams Promises в Node.js 17.0 представлен API Readline Promise для построчного чтения данных с использованием модуля readline. import * as readline from ‘node:readline/promises’; import { stdin as input, stdout as output } from ‘process’; const rl = readline.createInterface({ input, output }); const answer = await rl.question(‘What do you think of Node.js?’); console.log(‘Thank you for your valuable feedback: ${answer}’); rl.close();
- Dostarczona biblioteka OpenSSL została zaktualizowana do wersji 3.0 (użyto forka quictls/openssl z włączoną obsługą protokołu QUIC).
- Został zapewniony wyjście wersji Node.js w zrzutach stosu, które są generowane w przypadku krytycznych błędów prowadzących do zakończenia pracy aplikacji.
Dodatkowo można wspomnieć o usunięciu w aktualnych gałęziach Node.js dwóch luk (CVE-2021-22959, CVE-2021-22960), które umożliwiają ataki typu "HTTP Request Smuggling" (HRS), pozwalające na wniknięcie w treść żądań innych użytkowników przetwarzanych w tym samym wątku pomiędzy frontendem a backendem za pomocą specjalnie sformułowanych żądań od klienta (na przykład, można osiągnąć podstawienie złośliwego kodu JavaScript do sesji innego użytkownika). Szczegóły zostaną ujawnione później, a na razie wiadomo tylko, że problemy są spowodowane niewłaściwym przetwarzaniem spacji między nazwą nagłówka HTTP a dwukropkiem, jak również różnym przetwarzaniem znaków powrotu karetki i nowej linii w bloku parametrów używanym do przesyłania treści żądania w częściach w trybie "chunked".
Przypomnijmy, że platforma Node.js może być wykorzystywana zarówno do serwerowego wsparcia Web aplikacji, jak i do tworzenia zwykłych klientów oraz programów sieciowych. Aby rozszerzyć funkcjonalność aplikacji dla Node.js, przygotowano dużą kolekcję modułów, w której można znaleźć moduły z realizacją serwerów klientów HTTP, SMTP, XMPP, DNS, FTP, IMAP, POP3, moduły do integracji z różnymi frameworkami webowymi, obsługiwacze WebSocket i Ajax, konektory do baz danych (MySQL, PostgreSQL, SQLite, MongoDB), silniki szablonów, silniki CSS, realizacje algorytmów kryptograficznych oraz systemów autoryzacji (OAuth), parsery XML.
Aby obsłużyć dużą liczbę równoległych zapytań, Node.js wykorzystuje asynchroniczny model uruchamiania kodu oparty na przetwarzaniu zdarzeń w trybie non-blocking oraz definiowaniu callbacków. Wsparcie dla multiplexing połączeń obejmuje takie metody jak epoll, kqueue, /dev/poll i select. Do multiplexing połączeń używana jest biblioteka libuv, która jest dodatkową warstwą nad libev w systemach Unix oraz nad IOCP w Windows. Do tworzenia puli wątków (thread pool) wykorzystana jest biblioteka libeio, a do wykonywania zapytań DNS w trybie non-blocking zintegrowano c-ares. Wszystkie wywołania systemowe, które powodują blokowanie, są realizowane w obrębie puli wątków, a następnie, podobnie jak obsługa sygnałów, przekazują wyniki swojej pracy z powrotem przez niestrunną rynnę (pipe). Wykonanie kodu JavaScript zapewnia stworzony przez firmę Google silnik V8 (dodatkowo Microsoft rozwija wersję Node.js z silnikiem Chakra-Core).
Zasadniczo Node.js przypomina frameworki Perl AnyEvent, Ruby Event Machine, Python Twisted oraz implementację zdarzeń w Tcl, ale pętla zdarzeń (event loop) w Node.js jest ukryta przed deweloperem i przypomina przetwarzanie zdarzeń w aplikacji webowej działającej w przeglądarce. Przy pisaniu aplikacji dla Node.js należy uwzględnić specyfikę programowania opartego na zdarzeniach, na przykład zamiast wykonywać „var result = db.query(„select..”);” z oczekiwaniem na zakończenie pracy i dalszą obróbką wyników, w Node.js stosuje się zasadę asynchronicznego wykonania, tj. kod przekształca się w „db.query(„select..”, function (result) {obróbka wyniku});”, przy czym kontrola natychmiast przechodzi do dalszego kodu, a wynik zapytania jest przetwarzany na bieżąco.
Źródło: opennet.ru
