Сформирован выпуск основной ветки nginx 1.17.9, в рамках которой продолжается развитие новых возможностей (в параллельно поддерживаемой стабильной ветке 1.16 вносятся только изменения, связанные с устранением серьёзных ошибок и уязвимостей)...Подробнее: https://www.opennet.dev/opennews/art.shtml?num=52474
Я так понял из новостей, что Рэмблер, несмотря на все заявления, с них не слезает.
А там есть ещё какие-то новости? Что-то давно не слышно было.
Уголовное дело просто так не закрывается. Новость от 12 февраля.
"Заместитель главы комитета Госдумы по информационной политике, информационным технологиям и связи Андрей Свинцов (ЛДПР) направил запрос на имя генпрокурора РФ Игоря Краснова с просьбой взять на личный контроль уголовное дело в отношении сооснователей компании Nginx...."
Слезание Рамблера (точнее, Мамута) и прекращение дела никак не связаны.
Но сих пор неясно, откуда такой порыв защитить теперь уже американскую контору( или к разговору о покупке nginx )Прям какие-то волшебники в голубых вертолетах... а когда помощь реально нужна, так товарищи депутаты-чиновники внезапно становятся слепо-глухонемыми.
Глава ЛДПР - гражданин Испании. Его сын имеет вид на жительство в США. Думаю, достроить логическую цепочку сами сможете...Ну и nginx важен для всей индустрии IT в целом, в том числе и русской. Впрягаться за него имеет смысл всем, кто хоть немного смыслит в IT.
> Глава ЛДПР - гражданин Испании. Его сын имеет вид на жительство в США. Думаю, достроить логическую цепочку сами сможете...Так бы сразу и сказали!
В западных странах очень жестко относятся к воровству интеллектуальной собственности, в частности, попыткам наёмных сотрудников присвоить то, что они делали в рабочее время, т.е. за зарплату.Так что "взять на личный контроль" в данном контексте означает "проследить, чтобы Сысоева покарали".
Удивительно, как ловко вы политизируете обычный конторный спор о правах на продукт..
Это очень плохой прецедент для индустрии. Прецедент во многом определит решения судов по схожим делам в будущем.
Ты думаешь после сидения на бутылке автор не будет Рамблеру ставить палки в колеса?
а кто вам сказал что "после"? Сидя на бутылке - конечно не будет. А команды слезать мы не давали!
Я бы уж лучше китайскую openresty использовал чем сабжевый njs.
А с чем связано? Конкурентное преимущество какое-то или просто личное расположение к Китайцам?
Или лучное отторжение от российских дрязг? Так надо понять почему так и ведь не единая история, а пожалуй национальная идея - отжал спрятал выехал и получил гражданство..
Все что ты сказал плюс неприятие всего что связано с джаваскрипт. Lua подсознательно как то больше ассоциируется с быстрым встроенным простым языком.
Там и ~= вместо != И все равно lua по юзабельности опережает js подделки.
Любой кусок кхм будет лучше, чем JS.[] + [] → "" // Empty string? These are arrays!
[] + {} → [object object]
{} + [] → 0 // Why isn't the operation commutative???
{} + {} → NaN // ???
16 == [16] → true // Array converted into string, then into number
16 == [1,6] → false // But what is array converted into?
"1,6" == [1,6] → true
var arr = [];
arr.length → 0
arr[3] → "undefined" // No array bounds exception???
arr[3] = "hi";
arr.length → 4 // 4??? Only one element has been added!
arr["3"] → "hi" // Apparently "3" is coerced into a number
delete(arr[3]);
arr.length → 4 // 4??? There are no elements in the array!
arr[3] → "undefined" // 7 lines above, length was "0"!
var i = 1;
i = i + ""; // Oops!
i + 1 → "11"
i - 1 → 0
var j = "1";
++j → 2 // Okay, but...
var k = "1";
k += 1 → "11" // What???
[1,5,20,10].sort() → [1, 10, 20, 5] // Why is it sorting strings???
xs = ["10", "10", "10"];
xs.map(parseInt) → [10, NaN, 2] // ???
y = {};
y[[]] = 1;
Object.keys(y) → [""]
Страшилки для маленьких.
Это всё чушь если знать про динамическую типизацию и неявное преобразование типов.
Тем более такой код не будет использоваться в реальной жизни.
> Only one element has been added!Про дырявые массивы не не слышали... А между прочим позволяет огого как в ряде случаев производительность поднять.
> Это всё чушь если знать про динамическую типизацию и неявное преобразование типов.Так как более самых распространённых 50 неочевидных ситуаций при приведении типов в JS вызубрить малореально, то на этой "чуши" разработчики спотыкаются регулярно. "Качество" JS-кода уже стало притчей во языцех.
> на этой "чуши" разработчики спотыкаются регулярно"Разработчики" - это существительное множественного числа. Когда говоришь о себе, употребляй единственное число. И правильно не "разработчик", а "особь семейства Cercopithecidæ", поскольку только она предпочитает использовать "50 неочевидных ситуаций" вместо одной-единственной, но очевидной.
Тоже вспоминаешь npm leftpad?> [] + [] → "" // Empty string? These are arrays!
Особь семейства Cercopithecidæ не читала стандарт языка, но уже имеет ценное мнение о том, как На Самом Деле™ должно работать сложение... массивов? (whatever that means)
> Особь семейства Cercopithecidæ не читала стандарт языка, но уже имеет ценное мнение о том, как На Самом Деле™ должно работать сложение... массивов? (whatever that means)Я тоже не читал стандарт, но для меня, как для особи семейства Cercopithecidæ (кто это?), очевидно, что при сложении двух массивов должен получиться массив.
Если в стандарте языка это не так, это вовсе не значит, что это правильно. Это значит, что стандарт кривой.
> при сложении двух массивов должен получиться массивТакой операции, как "сложение массивов", не знает ни один язык.
Есть конкатенация массивов (concat), сведение массива к одному значению (reduce), есть много чего еще. А вот сложения (addition) нету. И вообще, под этим можно подразумевать все, что угодно, в зависимости от текущей задачи:
Cercopithecus #1: Было бы прикольно, если бы [1,2,3] + [4,5,6] давал [1,2,3,4,5,6]
Cercopithecus #2: Было бы прикольно, если бы [1,2,3] + [4,5,6] давал 1+2+3+4+5+6 = 21
Cercopithecus #3: Было бы прикольно, если бы [1,2,3] + [4,5,6] давал [1+4,2+5,3+6] = [5,7,9]
Cercopithecus #4: Было бы прикольно, если бы [1,2,3] + [4,5,6] давал 3+3 = 6Ну и кого из этих представителей семейства Cercopithecidæ слушать? Чью хотелку официально отражать в стандарте?
> Ну и кого из этих представителей семейства Cercopithecidæ слушать? Чью хотелку официально отражать в стандарте?Очевидно, что стандарт JS писал самый упoротый из их представителей.
Мнение представителя семейства Cercopithecidæ можно оставить без внимания в силу очевидных проблем с формулированием своих хотелок. Так, банальную конкатенацию массивов этот примат называет "сложением массисов", что уже говорит о том, что в программировании ему делать нечего.
>> при сложении двух массивов должен получиться массив
> Такой операции, как "сложение массивов", не знает ни один язык.
> Есть конкатенация массивов (concat), сведение массива к одному значению (reduce), есть
> много чего еще. А вот сложения (addition) нету. И вообще, под
> этим можно подразумевать все, что угодно, в зависимости от текущей задачи:
> Cercopithecus #1: Было бы прикольно, если бы [1,2,3] + [4,5,6] давал [1,2,3,4,5,6]Это конкатенация
> Cercopithecus #2: Было бы прикольно, если бы [1,2,3] + [4,5,6] давал 1+2+3+4+5+6
> = 21Результат - число (не массив)
> Cercopithecus #3: Было бы прикольно, если бы [1,2,3] + [4,5,6] давал [1+4,2+5,3+6]
> = [5,7,9]Правильная хотелка - сумма двух векторов
> Cercopithecus #4: Было бы прикольно, если бы [1,2,3] + [4,5,6] давал 3+3
> = 6Результат - число (не массив)
А сумма двумерных массивов создаст двумерную строку?
Вот, вроде
- программирование
- алгоритмы
- математические выражения...
Ожидается присутствие хоть какой-то логики
Особенно понравилось i+1 и i-1 :)
> js подделки.Если они подделки, то я прямо боюсь спросить, что же оригинал?!
> Индексация массивов начинается с 1 а не 0. Это все что вам нужно знать про это недоразумение.Мнение хипстеров особого интереса не представляет.
FORTRAN (since 1957) индексирует с единицы. Появившийся на 12 лет позже C ввёл костыль с индексацией от нуля в основном для синтаксического сахарка с указателями. В скриптовом языке, естественно, это смысла не имеет.
> Мнение хипстеров особого интереса не представляет.Попробуй без этих "хипстеров" с их сями хотя-бы свой компьютер загрузить, умник :)
У меня не компьютер, у меня ЭВМ. Тёплая, ламповая.
> У меня не компьютер, у меня ЭВМ. Тёплая, ламповая.С теплой и ламповой на опеннете не больно поумничаешь :P
Т.е. если нумерация массива начнется с 1, то компьютер не загрузится?
IBM/360 об этом не знала :)
>> Мнение хипстеров особого интереса не представляет.
> Попробуй без этих "хипстеров" с их сями хотя-бы свой компьютер загрузить, умник :)Если они не знают, почему в сях индексация начинается с 0,
то "их си" - разве что хелловорды … а так (пока, по крайней мере у меня) компьютер все еще без JS и питона грузится :)
#include <stdio.h>
int main(void) {
int bar[6];
4[bar] = 10;
char* foo[2] = {"hello","hello"};
1[foo] = "world";
int y = 2334;
int *x = &y;
0[x] = 1337;
puts(*foo);
puts(1[foo]);
printf("%d %d %d\n",0[x], y, bar[4]);
return 0;
}
% gcc -Wall -Wextra hw.c && ./a.out
hello
world
1337 1337 10
> Если они не знают, почему в сях индексация начинается с 0,Может, потому что память начинается с адреса 0? :) Вон Cortex M при power-up первым делом берет вектор по адресу 0. Кому не нравится что это не 1 - может пожаловаться в спортлото, например.
> Может, потому что память начинается с адреса 0?Итак, вы умеет пользоваться гуглом.
Тогда вы сможете сделать и второй шаг — объяснить, почему в скриптовых языках индексация не обязана начинаться с нуля.
> Тогда вы сможете сделать и второй шаг — объяснить, почему в скриптовых языках индексация не обязана начинаться с нуля.Скритовые ЯП тут особо ни при чем. Массивы сами по себе уже абстракция (foo[i] -- это смещение i относительно адреса foo).
Тут просто сочетается синдром водоплавающих и "мы так привыкли и не задумывемся", хотя в том же сишном foo[3] aka *((foo)+(3)) почему-то анонимов не смущает неявное (3*размер_элемента) ;)
var myarr: array[-5..10, -10..10] of Byte;
begin
myarr[10][10] := 37;
myarr[-5,-10] := 13;
(ну или если паскаль слишком "скриптово")
echo "void foo(void) {
int bar[10];
bar[0] = 1;
bar[1] = 2;
}"|gcc -O0 -masm=intel -S -m32 -xc -o- -|grep -v "\."
foo:
push ebp
mov ebp, esp
sub esp, 48
mov DWORD PTR [ebp-40], 1 ;первый элемент массива
mov DWORD PTR [ebp-36], 2 ;второй
nop
leave
ret
(т.е. на более низком уровне индексация массива может начинаться совсем не с 0)
> Массивы сами по себе уже абстракция (foo[i] -- это смещение i относительно адреса foo).Память как таковая, в общем то тоже абстракция. На уровне физики чип RAM бывает например двухмерным массивом. Однако врядли вы будете в большом восторге от идеи узнавать истинную геометрию каждого чипака оперативы, высчитывая rows и columns, которые, однако, ни разу не константа.
А еще цифровые штуки изначально оперируют единицами и нолями. По поводу чего ноль достаточно удобен для представления на уровне железа. Это "все нули", по всем разрядам шин, регистров и проч. Просто и элегантно.
> (т.е. на более низком уровне индексация массива может начинаться совсем не с 0)
"Права купил, а ездить не купил?" :) Режимы адресации и их чудеса не имеют никакого отношения к тому с чего начинается адресное пространство.
>> Массивы сами по себе уже абстракция (foo[i] -- это смещение i относительно адреса foo).
> Память как таковая, в общем то тоже абстракция. На уровне физики чип
> RAM бывает например двухмерным массивом. Однако врядли вы будете в большомЭто все очень интересно, но на причину "почему индексация массивов с 0 - более труЪ" не тянет от слова "совсем".
>> (т.е. на более низком уровне индексация массива может начинаться совсем не с 0)
> "Права купил, а ездить не купил?" :) Режимы адресации и их чудеса
> не имеют никакого отношения к тому с чего начинается адресное пространство."Очки купил, а читать …?" :) Специально цитировал на что отвечаю - спорить с анонимом по поводу "Может, потому что память начинается с адреса 0?" в качестве аргумента "нулевой индексации" не вижу смысла.
Т.е. тема - индексация массивов в различных ЯП и отображение на более нижнем уровне, а не "с чего начинается адресное пространство".Приведенный выше листинг вполне валидный режим для индексации "в ручном режиме" массивов на стеке при ваянии "шедевров" прямо в x86асме, хотя народ конечно предпочитал LOCAL макросы или хотя бы EQU определения, вместо жонглирования относительными адресами.
Ну и заодно наглядно демонстрирует, что режим адресации "с 0" даже в "низкоуровневом" си не гарантирует такой же "маппинг" на более нижнем уровне.
И вообще, что foo[-10], что foo[10] - компилятору все едино (а уж современному с наворотами - он еще и варнинги "index out of array" будет выдавать).
Поэтому претензии вида "Индексация массивов начинается с 1 а не 0. Это все что вам нужно знать про это недоразумение." - не понятны.Конкретно в cи причина сильно смахивает на гибрид наследия древних времен написания компилятора ручками (не нужно заморачиваться с семантикой и прослойкой для парсинга foo[-10, 10], для которого нужно запоминать и каждый раз вытаскивать определение массива) плюс определение сабскрипта E1[E2]<=> *((E1)+(E2)) (потому и возможны "кунстштюки" типа 10[x] в валидном коде),
т.е. ковыряние массив проходит как "указатель на первый элемент + смещение" => адресная арифметика, а запись foo[i] как синтактический сахар.
Если нужно "как проще" (для написания компилятора) то напрашивается индексация с 0: первый элемент foo[0]<=> foo+0 <==> foo и "больше ничего делать не надо" => т.е. сделали как проще, а не потому что мифическое "так ближе к железу!".
Вон, в фортране индексы вполне себе начинаются по умолчанию с 1 (а еще можно определить свой диапазон integer foo(-100:500)) - и ничего, (был) самый быстрый ЯП для вычислений туеву кучу лет.
> Это все очень интересно, но на причину "почему индексация массивов с
> 0 - более труЪ" не тянет от слова "совсем".Довольно криво считать адреса с нуля а массивы с единицы. Например, в сях отличия массивов от просто указателей ... по сути номинальные.
Поэтому, вы только подумайте, в сях можно сходить по конкретному адресу в памяти. И даже при желании рассмотреть это как массив. И это абсолютно нормально для работы с современными железками и проч, которые вывешивают свои регистры как регионы в памяти.
Вам не кажется что будет по идиотски, если мы хотим начиная с адреса 0 поработать, но референсить в виде массива будем уже как 1? Это немедленно гарантирует легион "off by one" errors во всей системщине, как будто их без этого мало. И более того - есть еще такая веселая штука как alignment и пожелания железяк к оному. Вебмакак такими словами, конечно, не пугают, показывая им фильдеперсовые абстракции. Но эти абстракции кто-то должен сделать. И вот им совершенно не удобно все время влетать мордой в off by one error'ы на этой почве, равно как и большие проблемы с чет/нечет и вообще alignment.
Вплоть до того что хардварно шина может оперировать сразу эн байтами за присест, клав на несколько младших битов адреса болт. Некоторые процы за потуги несуществующие биты шины юзать вообще хардварным эксепшном (alignment error) по морде могут больно дать. Это, конечно, неудобно, но ряд процов этим грешил и назад в фабы их не затолкаешь.
> спорить с анонимом по поводу "Может, потому что память начинается с
> адреса 0?" в качестве аргумента "нулевой индексации" не вижу смысла.А почему, собственно, адресация одного того же по указателю и массивом должна работать вот настолько по разному? Чтобы больше off by one было?
> Итак, вы умеет пользоваться гуглом.Я еще и памятью умею пользоваться.
> Тогда вы сможете сделать и второй шаг — объяснить, почему в скриптовых
> языках индексация не обязана начинаться с нуля.Потому что поделки для вебмакак, не понимающих как работает компьютер? :)
На Rust написали njs, или опять будет UB во все щели?
В вашем Rust неопределённого поведения не меньше чем в C++. Пруфы https://doc.rust-lang.org/reference/behavior-considered-unde...
> В вашем Rust неопределённого поведения не меньше чем в C++.Так это unsafe, для это часть кода маркируется unsafe чтобы сразу показать
где баги. В C++ же весь код unsafe.
В rust весь тулчейн - unsafe, т.к. пилится только мозиллой, а мозилла - сборище стремных хипстеров, конкретно шибанутых на голову и потому шатающихся из крайности в крайность.
Включите -Wall -Wextra -Werror и unsafe обертывайте в #pragma GCC diagnostic.
Уже успел написать что-то на своих «не-unfase» if-ах?
>> В C++ же весь код unsafe.Диванные экспертам лучше видней. А то, что в С++ возможно писать полностью safe код, это никто во внимание не берёт
Писать-то на крастах можно, а вот читать...
Впрочем, у Rust та же проблема. Теперь, встречая что-то наподобие !@#$%^&*(), думаешь — это завуалированное ругательство, следствие чистки клавиатуры, или фрагмент кода на Rust?
Прочитайте документацию Rust по приведённой выше ссылке. UB в Rust не только в unsafe блоках
Ваш хруст - один большой UB сам по себе. Потому что полупроприентарное нечто, контролируемое одной корпорацией с репками завязанными на гамадрилу.корп.
Сложно по ссылке нажать чистый канонический С.Вот какой-то файл там у них открыл http://hg.nginx.org/njs/rev/65f4b11e3302
Блин не пойму чего они все еще на меркуриале?
> Блин не пойму чего они все еще на меркуриале?На гитхабе зеркало есть, но они таки из тех кто любит ссать против ветра. В принципе никто бы не возражал, если б не запах...
Поддержка второго питона в 2020 году — крайне увлекательное занятие. Если хоть немного разума осталось — избавятся от ртути.
> На Rust написали njs, или опять будет UB во все щели?Сначала пусть растоманы перестанут быть театром одного актера с жестким вендорлоком на 1 комерса, чтоли.
>> Интерпретатор njs реализует стандарты ECMAScript и позволяет расширять возможности nginx по обработке запросов с помощью скриптов в конфигурации.лучше бы lua или tcl прикрутили
Lua уже прикручена и называется openresty.
Кто-нибудь, кстати, намекните там Максу, что плешь немодно, и жить ему осталось месяц, можно в ngx_http_mp4_module уже ничего не чинить.
mp4 это не только flash, это еще и куча всяких десктопных и мобильных клиентов вокруг систем видеонаблюдения и подобного.
А что, он не умеет грузить MP4 "просто браузеру"? Ну тады ему амба. Впрочем, нафига он нужен, при наличии dash...
а зачем ему это уметь, "просто браузер" и так его загружает, как обычный файл.Это был грязный хак для флэша, который был настолько суперстар, что не умел Range: - и так и не умеет их до конца своей жизни.
Поэтому когда юзверь тыкал мышкой в слайдер, чтобы пропустить скучный диалог горничной с водопроводчиком, приделанный к слайдеру скрипт просто давал команду загрузить другой файл, вида url://somesite/somepron.mp4?start=100 - а этот модуль парсит параметр и отсчитывает нужное число секунд (по неведомым причинам, старт mp4 отсчитывается в секундах)Браузер c html5 просто запросит другой range с того же самого файла, и сразу в байтах.
> "просто браузер" и так его загружает, как обычный файл.Этот фокус не особо работает с "безразмерным потоком" (трансляция с камеры).
> Браузер c html5 просто запросит другой range с того же самого файла, и сразу в байтах.
Более вероятно что он запросит другой chunk :). Правда модуль нжинкса для этого все же не надо.
> Этот фокус не особо работает с "безразмерным потоком" (трансляция с камеры).дык а какой фокус с ним работает-то?
Где у него "старт", и кто тебе будет хранить произвольный фрагмент при прямой трансляции? Так что рисуем grayed slider и перестаем обрабатывать события от него, делов...
В модуле, правда, еще были рейтлимиты - те что опять же по содержимому файла подстраивались, а не отбалдово-примерно руками настраивать каждый раз. Но они только в коммерческой версии, и вряд ли эта фича использовалась хоть кем, кроме единственного коммерческого клиента, которому десять лет назад ее запилили под заказ.
> дык а какой фокус с ним работает-то?Дык посмотри на dash например. Сделали отдельно хидеры потоков и потом в чанки энного размера складируют. Ну а плеер грузит чанки по мере надобности. Старые можно удалять, можно не удалять, смотря хочется ли оставить поток на потом, или он совсем live (ну, если старые чанки снесли, значит посмотреть их уже не выйдет).
Сие правда требует достаточно мозгастый плеер. Ну и adaptive оно потому что ежели плеер видит что бандвиза или проца не хватило - следующий чанк он может и более тощий уже качать, если несколько вариантов есть. В принципе достаточно здравая по меркам вебмакак конструкция :)
> Где у него "старт",
Либо где поток начался, если его решили еще и хранить, либо там какой чанк актуален на сейчас.
> и кто тебе будет хранить произвольный фрагмент при прямой трансляции?
Сервер. Кусочками. Ютуб так делает, например. Да и не только он.
> Так что рисуем grayed slider и перестаем обрабатывать события от него, делов...
Это если решено не хранить. А если хранить то можно смотреть "с отставанием от реалтайма". Ну как, плеер будет тянуть старые чанки, сервак будет складировать новые. Можно даже ускоренно перемотать если не интересно, плеер пойдет качать более свежие чанки.
> содержимому файла подстраивались, а не отбалдово-примерно руками настраивать каждый раз.
Гугл по этому поводу забавно видео кодирует: Q-based + верхний лимит на битрейт. Если сцены простые, оно жрет столько битов сколько реально надо. На сложных оно не сожрет выше верхнего лимита - и всегда можно зарезать клиента вот в этих пределах.
Еще у них плеер видео грузит только если юзер его смотрит. А если не смотреть, новый чанк тягается только если в буфере менее 120 секунд. Иначе забывается, экономя гугле бандвиз. Юзерь может ведь и забыть про видео, и вообще.
На трансляция на сайтов телеканалов часто можно поскролить видео.
Самое главное, копирайты-то поправили на Рамблеровские или нет?
Нет простой бумажный конверт в адрес людей из компании Р.р с уе решил все вопросы.
Уроды долго не живут. Так что инвесторы от токсичных активов уже избавились,
а компанию разорят и спишут как банкрота скорее всего скоро, а основная статья
доходов у них кинотеатр Okko это вообще смешно. Примерно так же как гамбургеры
в отделениях банков.
Рамблер это СМИ, а не IT-компания. Чего стоит только их решение целый год не покупать сервера и это на заре развития поиска.
Вангую, что это было решение солнцеликого гуру Ашманова.
Поскольку мне лень сейчас перечитывать ради Вас http://www.ashmanov.com/education/articles/zhizn-vnutri-puzyrya/ -- давайте Вы сами перечитаете, а потом или расскажете, где он соврал, или (с большой вероятностью) станете искать щётку, чтобы отчистить от следов лужи свою одёжку.
Ищу single-header http-сервер на С99.
https://github.com/tom-seddon/yhs
Спасибо добрый человек.
А чем тебе libevent не подходит там вроде был HTTP сервер и во всех дистрибутивах можно найти.
Может тем что это _не_ http server? А так по хорошему lwan.ws советую посмотреть. Он, конечно, не single header, но таки шустрый, с удобным апи, и вообще, с ним вы сможете показывать go'пникам что умеете в микросервисы и тому подобное совсем не хуже :)
>Запрещено указание нескольких строк "Host" в заголовке запроса;это чтобы обходить ДПИ было сложнее?
Конечно. Следователь в СИЗО лично коммит писал.
> это чтобы обходить ДПИ было сложнее?Ага, специальный прокси HelloDPI подставляет в каждый запрос заголовки Host со всеми запрещенными хостнеймами, которые есть в реестре. В результате человек жалуется, что клятi москали весь интернет побанили, а у всех остальных всё работает.
А выпуск Сысоева уже состоялся?
доброе у вас сердце, Штирлиц. Нет, пусть пока посидит.
Отпустили но дело не закрыли.
> Интерпретатор njs реализует стандарты ECMAScript и позволяетОчень хотим етот интерпретатор как standalone решение для кастомизации нашего решения. Можно как-то его отдельной библиотекой сделать?