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, но у меня недостаточно прав.


Ответы (0 шт):