UNPKG

vite-plugin-naria2

Version:
92 lines (89 loc) 3.09 kB
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 };