Как в Java посредством GraalVM заставить работать nodejs модуль?
Подскажите,
пишу программу на java и есть npm модуль (javascript), достаточно сложный, что бы переписать его на java, потому подумалось запускать его посредством graalvm в java коде.
Я graalvm подключил и простенькие javascript-ы он может компилировать и исполнять, но дальше не идет. Я npm модуль пробовал webpack и esbuild компилировать к одному файлу, все упирается в npm библиотеку get-random-values. В зависимости от того исполняется она в браузере или как nodejs модуль, она вызывает либо window.crypto.getRandomValues или require("crypto").randomBytes
В graalvm window.crypto.getRandomValues естественно нет. Так же graalvm не умеет require и естественно не может require("crypto").randomBytes.
У graalvm есть вроде модуль nodejs, но не пойму как его использовать в яве. Может есть какой то модуль, который может эмулировать браузер c его window объектом? Было бы проще. Или хотя бы более менее надежную имплементацию crypto.randomBytes или window.crypto.getRandomValues на голом javascript? Хотя про надежность наверное можно забыть.
Может есть какой то модуль, который может эмулировать браузер c его window объектом?
Могу предложить решить твою задачу по другому, использовать javascript из стандартного JavaFX WebView и WebEngine компонент (это вебкит), код очень простой, из недостатков - нет поддержки gpu ускорения (проигрывание видео youtube нагружает процессор)... доступ к dom html страницы как прямой так и косвенный, через инжект javascript (через setTimeout будет доступ только к песочнице веб страницы), т.е. можно открыть тупо пустую страницу и добавить туда необходимых скриптов.
Поковырялся вчера и пришла идея использовать java класс для генерации рандомных чисел. Для этого написал следующий javascript и загрузил его до проблемной библиотеки.
var SecureRandom = Java.type('java.security.SecureRandom');
var window = {
crypto: {
getRandomValues: (buf) => {
var bytes = SecureRandom.getSeed(buf.length);
buf.set(bytes);
}
}
};
То-есть из JS вызываю метод getSeed класса java.security.SecureRandom. Судя по всему это работает. Теперь могу использовать webpack-ом сгенерерированный js скрипт. Загружается без ошибок, но все еще не совсем рабочий. Но это уже мелочи я думаю.