import { ARIA2, ARIA2Event } from './lib/saw-rpc/src/index';
import { promises as fs } from 'fs';
import * as path from 'path';
import { w3cwebsocket as WebSocket } from 'websocket';
import { rpcPath, secret } from './config.json';
// @ts-ignore
global.WebSocket = WebSocket;
const UNDEFINED = void 22;
const aria2 = new ARIA2(rpcPath, secret);
// 检查当前执行状态
(async function () {
try {
await aria2.tellActive(['gid']);
} catch (e) {
console.log('Wrong rpcPath or secret!');
process.exit(1);
}
})();
// 绑定事件处理回调
async function onDownloadComplete(ev: ARIA2Event) {
const status = await aria2.tellStatus(ev.gid, ['dir', 'files']);
const dir = status.dir;
const files = status.files;
if (dir !== UNDEFINED && files !== UNDEFINED) {
const titleName = ARIA2.getTitleName(files[0], dir);
const controlFile = path.join(dir, titleName + '.aria2');
try {
console.log(`aria2-watchdog: removing control file of completed '${titleName}'...`);
await fs.unlink(controlFile);
} catch (e) {
console.error(e);
}
}
}
aria2.onNotify('aria2.onBtDownloadComplete', onDownloadComplete);
aria2.onNotify('aria2.onDownloadComplete', onDownloadComplete);
aria2.onNotify('aria2.onDownloadError', async function (ev: ARIA2Event) {
const status = await aria2.tellStatus(ev.gid, ['dir', 'files']);
const dir = status.dir;
const files = status.files;
if (dir !== UNDEFINED && files !== UNDEFINED) {
const titleName = ARIA2.getTitleName(files[0], dir);
const filePath = path.join(dir, titleName);
const controlFile = filePath + '.aria2';
try {
console.log(`aria2-watchdog: removing fault files of '${titleName}'...`);
await fs.rm(filePath, { 'force': true, 'recursive': true });
await fs.unlink(controlFile);
} catch (e) {
console.error(e);
}
}
});