| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 |
- import path from 'node:path';
- import fs from 'node:fs';
- import fsp from 'node:fs/promises';
- import { Readable } from 'node:stream';
- import { pipeline } from 'node:stream/promises';
- import zlib from 'node:zlib';
- import process from 'node:process';
- import { async as ezspawn } from '@jsdevtools/ez-spawn';
- import { mkdirp } from './misc';
- import { fetchWithRetry } from './fetch-retry';
- const mihomoBinaryDir = path.join(__dirname, '../../node_modules/.cache/mihomo');
- const mihomoBinaryPath = path.join(mihomoBinaryDir, 'mihomo');
- const mihomoBinaryUrl: Partial<Record<NodeJS.Platform, Partial<Record<NodeJS.Architecture, string>>>> = {
- linux: {
- x64: 'https://github.com/MetaCubeX/mihomo/releases/download/v1.18.7/mihomo-linux-amd64-compatible-v1.18.7.gz'
- },
- darwin: {
- x64: 'https://github.com/MetaCubeX/mihomo/releases/download/v1.18.7/mihomo-darwin-amd64-v1.18.7.gz',
- arm64: 'https://github.com/MetaCubeX/mihomo/releases/download/v1.18.7/mihomo-darwin-arm64-v1.18.7.gz'
- }
- };
- const ensureMihomoBinary = async () => {
- await mkdirp(mihomoBinaryDir);
- if (!fs.existsSync(mihomoBinaryPath)) {
- const writeStream = fs.createWriteStream(mihomoBinaryPath);
- const downloadUrl = mihomoBinaryUrl[process.platform]?.[process.arch];
- if (!downloadUrl) {
- throw new Error(`Unsupported platform: ${process.platform} ${process.arch}`);
- }
- const res = await fetchWithRetry(downloadUrl);
- if (!res.ok || !res.body) {
- throw new Error(`Failed to download mihomo binary: ${res.statusText}`);
- }
- const gunzip = zlib.createGunzip();
- await pipeline(
- Readable.fromWeb(res.body),
- gunzip,
- writeStream
- );
- }
- await fsp.chmod(mihomoBinaryPath, 0o755);
- };
- export const convertClashMetaMrs = async (type: 'domain', format: 'text', input: string, output: string) => {
- await ensureMihomoBinary();
- const { stderr } = await ezspawn(mihomoBinaryPath, ['convert-ruleset', type, format, input, output]);
- if (stderr) {
- throw new Error(stderr);
- }
- };
|