@bitwheeze

Как в 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? Хотя про надежность наверное можно забыть.

Спасибо
  • Вопрос задан
  • 106 просмотров
Пригласить эксперта
Ответы на вопрос 2
@rPman
Может есть какой то модуль, который может эмулировать браузер c его window объектом?

Могу предложить решить твою задачу по другому, использовать javascript из стандартного JavaFX WebView и WebEngine компонент (это вебкит), код очень простой, из недостатков - нет поддержки gpu ускорения (проигрывание видео youtube нагружает процессор)... доступ к dom html страницы как прямой так и косвенный, через инжект javascript (через setTimeout будет доступ только к песочнице веб страницы), т.е. можно открыть тупо пустую страницу и добавить туда необходимых скриптов.
Ответ написан
Комментировать
@bitwheeze Автор вопроса
Поковырялся вчера и пришла идея использовать 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 скрипт. Загружается без ошибок, но все еще не совсем рабочий. Но это уже мелочи я думаю.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы