Ultraviolet App | Генерация проксированной версии урла при обращении с клиента на express-север Ultraviolet App
Ultraviolet App - либа на базе Ultraviolet, используемая для обхода блокировок тех или иных сервисов. Я пытаюсь использовать ее для реализации своей задачи:
Есть некий перечень сервисов, по клику на один из которых, по задумке, должен отправляться запрос на Ultraviolet App, который в качестве ответа должен вернуть мне проксированную версию урла єтого сервиса для последующей его вставки в src iframe и доступом к сервису.
Код прокси-сервера на express в index.js с некоторыми моими доработками (я тут добавил обработчик маршрута /generate-proxy-url и пробую импортировать Ultraviolet) сейчас выглядит следующим образом:
import { createBareServer } from "@tomphttp/bare-server-node";
import express from "express";
import { createServer } from "node:http";
import { publicPath } from "ultraviolet-static";
import { uvPath } from "@titaniumnetwork-dev/ultraviolet";
import { join } from "node:path";
import { hostname } from "node:os";
import Ultraviolet from '@titaniumnetwork-dev/ultraviolet';
const bare = createBareServer("/bare/");
const app = express();
app.use(function(req, res, next) {
res.header('Access-Control-Allow-Origin', '*'); // Разрешить все домены
res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept');
next();
});
/* обработчик запроса с клиента */
app.get('/generate-proxy-url', (req, res) => {
const serviceUrl = req.query.url;
if (serviceUrl) {
const encodedUrl = Ultraviolet.encodeUrl(serviceUrl);
const proxyUrl = `http://localhost:${port}/service/${encodedUrl}`;
res.send(proxyUrl);
} else {
res.status(400).send('No URL provided');
}
});
app.use(express.static(publicPath));
app.use("/uv/", express.static(uvPath));
app.use((req, res) => {
res.status(404);
res.sendFile(join(publicPath, "404.html"));
});
const server = createServer();
server.on("request", (req, res) => {
if (bare.shouldRoute(req)) {
bare.routeRequest(req, res);
} else {
app(req, res);
console.log('end');
}
});
server.on("upgrade", (req, socket, head) => {
if (bare.shouldRoute(req)) {
bare.routeUpgrade(req, socket, head);
} else {
socket.end();
}
});
let port = parseInt(process.env.PORT || "");
if (isNaN(port)) port = 8080;
server.on("listening", () => {
const address = server.address();
});
process.on("SIGINT", shutdown);
process.on("SIGTERM", shutdown);
function shutdown() {
server.close();
bare.close();
process.exit(0);
}
server.listen({
port,
});
Проблема в общем в том, что Ultraviolet не импортируется, соответственно кодирование оригинального урла сервиса в проксированный его вариант const encodedUrl = Ultraviolet.encodeUrl(serviceUrl); не работает. Как я только его уже не пробовал импортировать, ничего не получается. Да, документации по либам крайне мало.
В текущем варианте - при обращении на прокси-сервер ошибка что Ultraviolet.encodeUrl is not a function. Если использовать const encodedUrl = Ultraviolet.codec.xor.encode(serviceUrl); - ошибка уже TypeError: Cannot read properties of undefined (reading 'xor') .
Словом, не получается именно encode урла, и я не имею ни малейшего представления как решить проблему.
P.S. здесь бы добавить тег Ultraviolet, но у меня недостаточно прав.