/// /// /// import { EventEmitter } from 'eventemitter3'; import * as fs from 'fs'; import * as net from 'net'; import type { PassThrough } from 'stream'; import ProgressBar from '../lib/progress'; import { Candidate } from './candidate'; import { FileInfo } from './fileinfo'; export type JobMessageEvents = { /** * Event triggered when a download from the job fails * @example * ```js * job.on('error', (errorMessage, fileInfo) => { * console.log(`${fileInfo.file} failed to download: ${errorMessage}`) * }) * ``` */ error: (errorMessage: string, fileInfo?: FileInfo) => void; /** * Event triggered when all files from the job have been downloaded * @example * ```js * job.on('done', () => { * console.log('done') * }) * ``` */ done: (endCandidate: { nick: string; success: string[]; failed: number[]; }) => void; /** * Event triggered when a file from the job is downloaded * @example * ```js * job.on('downloaded', (fileInfo) => { * console.log(`${fileInfo.file} saved to ${fileInfo.filePath}`) * }) * ``` */ downloaded: (fileInfo: FileInfo) => void; /** * Event triggered while a file from the job is downloading * @example * ```js * job.on('downloading', (fileInfo, received, percentage, eta) => { * console.log(`${fileInfo.file} @ ${received} of ${fileInfo.length} [${percentage}%] - ${eta} ms remaining`) * }) * ``` */ downloading: (fileInfo: FileInfo, received: number, percentage: number, eta: number) => void; /** * Event triggered when a download from the job starts and is ready to be piped * @example * ```js * job.on('data', (stream) => { * stream.on('data', (chunk) => { * console.log(chunk) * }) * ``` */ pipe: (stream: PassThrough | fs.WriteStream, fileInfo: FileInfo) => void; /** * Event triggered when a job is cancelled * @example * ```js * job.on('cancel', (jobInfo) => { * console.log('cancelled downloads from', jobInfo.nick) * }) * ``` */ cancel: (candidate: Candidate, errorMessage: string, fileInfo?: FileInfo) => void; message: (messageEvent: { nick: string; type: string; message: string; }) => void; }; export declare class Job extends EventEmitter { /** * Cancel Job * @example * ```js * xdccJS.on('ready', async () => { * const job1 = xdccJS.download('bot', '20-30') * job1.on('downloaded', info => { * // stop half-way * if(info.success.length === 5) job1.cancel() * }) * }) * ``` */ cancel: () => void; /** @ignore */ failures: number[]; /** @ignore */ nick: string; /** @ignore */ cancelNick: string; /** @ignore */ now: number; /** @ignore */ queue: number[]; /** @ignore */ retry: number; /** @ignore */ success: string[]; /** @ignore */ timeout: { bar?: ProgressBar; fileInfo?: FileInfo; to?: ReturnType; eventType?: 'error' | 'cancel'; message?: string; padding?: number; delay?: number; fn?: () => void; stream?: fs.WriteStream | PassThrough; server?: net.Server; socket?: net.Socket; pick?: number; clear: () => void; }; /** @ignore */ opts?: Partial<{ ipv6: boolean; throttle: number; }>; constructor(candidate: Candidate, cancelFn: () => void); /** * return current job * @example * ```js * const job = await xdccJS.download('bot', '1-5') * console.log(job.show().nick) //=> 'bot' * console.log(job.show().queue) //=> [2, 3, 4, 5] * console.log(job.show().now) //=> 1 * // etc... * * // both achieve same results: * job.cancel() * job.show().cancel() * ``` */ show(): { nick: Job['nick']; queue: Job['queue']; now: Job['now']; success: Job['success']; failed: Job['failures']; opts: Job['opts']; }; /** * check if Job is done * const job = await xdccJS.download('bot', '1-5') * job.isDone() //=> false */ isDone(): boolean; }