vite-plugin-naria2
Version:
Vite naria2 integration
92 lines (89 loc) • 3.09 kB
JavaScript
import path from 'node:path';
import { promises } from 'node:fs';
import { createLogger } from 'vite';
import { green, bold, cyan } from '@breadc/color';
import { createChildProcess } from '@naria2/node';
import { handleWebUIOpenRequest } from '@naria2/node/ui';
function Naria2(options = {}) {
let root;
const logger = createLogger();
const childProcessRuntime = {
dir: path.join(process.cwd(), ".aria2"),
process: void 0,
url: void 0,
secret: void 0
};
return [
{
name: "vite-plugin-naria2:runtime",
apply: "serve",
configResolved(config) {
root = config.root;
},
async configureServer(server) {
server.middlewares.use("/_/open", async (req, res, next) => {
try {
if (await handleWebUIOpenRequest(new URL(req.url), req, res, {
rpc: {
port: childProcessRuntime.process?.getOptions().listenPort ?? 6800,
secret: childProcessRuntime.secret
}
})) {
return;
}
} catch {
}
next();
});
const _printUrls = server.printUrls;
if (!childProcessRuntime.process) {
childProcessRuntime.dir = path.join(root, ".aria2");
await promises.mkdir(childProcessRuntime.dir, { recursive: true }).catch(() => {
});
const childProcess = await createChildProcess({
dir: childProcessRuntime.dir,
...options.childProcess
});
childProcessRuntime.process = childProcess;
childProcessRuntime.url = `ws://127.0.0.1:${childProcess.getOptions().listenPort}/jsonrpc`;
childProcessRuntime.secret = childProcess.getOptions().secret;
}
server.printUrls = () => {
_printUrls();
if (childProcessRuntime.url) {
const colorUrl = (url) => cyan(url.replace(/:(\d+)\//, (_, port) => `:${bold(port)}/`));
logger.info(
` ${green("\u279C")} ${bold("Naria2")}: ${colorUrl(childProcessRuntime.url)}
`
);
}
};
},
closeBundle() {
childProcessRuntime.process?.close?.();
childProcessRuntime.url = void 0;
childProcessRuntime.secret = void 0;
}
},
{
name: "vite-plugin-naria2:build",
resolveId(id) {
if (id === "~naria2/jsonrpc") {
return "\0" + id;
}
},
load(id) {
if (id === "\0~naria2/jsonrpc") {
const socketCode = childProcessRuntime.url ? `new WebSocket(${JSON.stringify(childProcessRuntime.url)})` : "undefined";
const clientCode = `socket ? await createClient(socket, { ${childProcessRuntime.secret ? "secret: " + JSON.stringify(childProcessRuntime.secret) : ""} }) : undefined`;
return [
`import { createClient } from 'naria2';`,
`export const socket = ${socketCode};`,
`export const client = ${clientCode};`
].join("\n");
}
}
}
];
}
export { Naria2 as default };