You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
homepage/src/widgets/deluge/proxy.js

73 lines
2.0 KiB

import { formatApiCall } from "utils/proxy/api-helpers";
import { sendJsonRpcRequest } from "utils/proxy/handlers/jsonrpc";
import getServiceWidget from "utils/config/service-helpers";
import createLogger from "utils/logger";
import widgets from "widgets/widgets";
const logger = createLogger("delugeProxyHandler");
const dataMethod = "web.update_ui";
const dataParams = [
[
"queue",
"name",
"total_wanted",
"state",
"progress",
"download_payload_rate",
"upload_payload_rate",
"total_remaining",
],
{},
];
const loginMethod = "auth.login";
async function sendRpc(url, method, params) {
const [status, contentType, data] = await sendJsonRpcRequest(url, method, params);
const json = JSON.parse(data.toString());
if (json?.error) {
if (json.error.code === 1) {
return [403, contentType, data];
}
return [500, contentType, data];
}
return [status, contentType, data];
}
function login(url, password) {
return sendRpc(url, loginMethod, [password]);
}
export default async function delugeProxyHandler(req, res) {
const { group, service } = req.query;
if (!group || !service) {
logger.debug("Invalid or missing service '%s' or group '%s'", service, group);
return res.status(400).json({ error: "Invalid proxy service type" });
}
const widget = await getServiceWidget(group, service);
if (!widget) {
logger.debug("Invalid or missing widget for service '%s' in group '%s'", service, group);
return res.status(400).json({ error: "Invalid proxy service type" });
}
const api = widgets?.[widget.type]?.api;
const url = new URL(formatApiCall(api, { ...widget }));
let [status, contentType, data] = await sendRpc(url, dataMethod, dataParams);
if (status === 403) {
[status, contentType, data] = await login(url, widget.password);
if (status !== 200) {
return res.status(status).end(data);
}
// eslint-disable-next-line no-unused-vars
[status, contentType, data] = await sendRpc(url, dataMethod, dataParams);
}
return res.status(status).end(data);
}