/**
 * 本模块负责与aria2通信并构造下载数据
 */ /**
 * 本模块负责与aria2通信并构造下载数据
 */ ( function ( ) { try { class Aria2 { setting : Partial < Aria2Data > = { } ; constructor ( ) { config . useragent && ( this . setting . userAgent = config . useragent ) ; config . referer && ( this . setting . referer = config . referer ) ; config . filepath && ( this . setting . directory = config . filepath ) ; config . rpcToken && ( this . setting . token = config . rpcToken ) ; } shell ( obj ) { return new Promise ( ( r , j ) => { let result = "aria2c" ; obj = { ... this . setting , ... obj } ; obj . urls . forEach ( d => result += ` "${ d }"` ) ; obj . out && ( result += ` --out="${ obj . out }"` ) ; obj . userAgent && ( result += ` --user-agent="${ obj . userAgent }"` ) ; obj . referer && ( result += ` --referer="${ obj . referer }"` ) ; obj . directory && ( result += ` --dir="${ obj . directory }"` ) ; obj . split && ( result += ` --split="${ obj . split }"` ) ; obj . header && Object . entries ( obj . header ) . forEach ( d => result += ` --header="${ d [ 0 ] }: ${ d [ 1 ] }"` ) ; navigator . clipboard . writeText ( result ) . then ( r , e => j ( e ) ) ; } ) ; } rpc ( obj ) { obj = { ... this . setting , ... obj } ; const options = { } ; obj . out && ( options . out = obj . out ) ; obj . userAgent && ( options [ "user-agent" ] = obj . userAgent ) ; obj . referer && ( options [ "referer" ] = obj . referer ) ; obj . directory && ( options [ "dir" ] = obj . directory ) ; obj . split && ( options [ "split" ] = obj . split ) ; obj . header && ( options [ "header" ] = obj . header ) ; return this . postMessage ( "aria2.addUri" , obj . id || < any > new Date ( ) . getTime ( ) , [ obj . urls , options ] ) ; } postMessage < T extends keyof Aria2Method > ( method , id , params = [ ] ) { const url = `${ config . rpcServer }:${ config . rpcPort }/jsonrpc` ; config . rpcToken && params . unshift ( `token:${ config . rpcToken }` ) ; return new Promise ( ( r , j ) => { xhr ( { url : url , method : "POST" , responseType : "json" , data : JSON . stringify ( { method , id , params } ) } ) . then ( d => { d . error && j ( d . error ) ; d . result && r ( d . result ) ; } ) . catch ( e => { xhr ( { url : API . objUrl ( url , { method , id , params : API . Base64 . encode ( JSON . stringify ( params ) ) } ) , method : "GET" , responseType : "json" } ) . then ( d => { d . error && j ( d . error ) ; d . result && r ( d . result ) ; } ) . catch ( ( ) => j ( e ) ) ; } ) ; } ) ; } getVersion ( ) { return this . postMessage ( "aria2.getVersion" , < any > new Date ( ) . getTime ( ) ) ; } } API . aria2 = { shell : ( obj ) => new Aria2 ( ) . shell ( obj ) , rpcTest : ( ) => new Aria2 ( ) . getVersion ( ) , rpc : ( obj ) => new Aria2 ( ) . rpc ( obj ) } ; } catch ( e ) { toast . error ( "aria2.js" , e ) ; } } ) ( ) ; declare namespace API { /**
     * aria2下载方法
     */ let aria2 ; } /**
 * 本项目可用的aria配置
 * aria2支持配置数据太繁杂，这里只提炼出需要的
 */ interface Aria2Data { /**
     * URL组，所有链接必须指向同一文件，或者只提供一条链接
     */ urls : string [ ] ; /**
     * 文件名（含拓展名）
     */ out ? : string ; /**
     * user-agent
     */ userAgent ? : string ; /**
     * referer
     */ referer ? : string ; /**
     * 文件保存目录
     */ directory ? : string ; /**
     * 链接数，一般指线程数
     */ split ? : number ; /**
     * 附加的HTTP请求头组
     */ header ? : { [ name ] : string ; } ; /**
     * 令牌
     */ token ? : string ; /**
     * 任务唯一GID，用于唯一标志任务
     * **请不要使用url中禁止的字符，可使用encodeURIComponent等标准方法或者本项目提供的md5、Base64、crc32等方法预处理一下！**
     */ id ? : string ; } /**
 * aria任务配置信息，类型信息有待进一步核实
 */ interface Aria2Option { "all-proxy" ? : string ; "all-proxy-passwd" ? : string ; "all-proxy-user" ? : string ; "allow-overwrite" ? : string ; "allow-piece-length-change" ? : string ; "always-resume" ? : string ; "async-dns" ? : string ; "auto-file-renaming" ? : string ; "bt-enable-hook-after-hash-check" ? : string ; "bt-enable-lpd" ? : string ; "bt-exclude-tracker" ? : string ; "bt-external-ip" ? : string ; "bt-force-encryption" ? : string ; "bt-hash-check-seed" ? : string ; "bt-load-saved-metadata" ? : string ; "bt-max-peers" ? : string ; "bt-metadata-only" ? : string ; "bt-min-crypto-level" ? : string ; "bt-prioritize-piece" ? : string ; "bt-remove-unselected-file" ? : string ; "bt-request-peer-speed-limit" ? : string ; "bt-require-crypto" ? : string ; "bt-save-metadata" ? : string ; "bt-seed-unverified" ? : string ; "bt-stop-timeout" ? : string ; "bt-tracker" ? : string ; "bt-tracker-connect-timeout" ? : string ; "bt-tracker-interval" ? : string ; "bt-tracker-timeout" ? : string ; "check-integrity" ? : string ; "checksum" ? : string ; "conditional-get" ? : string ; "connect-timeout" ? : string ; "content-disposition-default-utf8" ? : string ; "continue" ? : string ; "dir" ? : string ; "dry-run" ? : string ; "enable-http-keep-alive" ? : string ; "enable-http-pipelining" ? : string ; "enable-mmap" ? : string ; "enable-peer-exchange" ? : string ; "file-allocation" ? : string ; "follow-metalink" ? : string ; "follow-torrent" ? : string ; "force-save" ? : string ; "ftp-passwd" ? : string ; "ftp-pasv" ? : string ; "ftp-proxy" ? : string ; "ftp-proxy-passwd" ? : string ; "ftp-proxy-user" ? : string ; "ftp-reuse-connection" ? : string ; "ftp-type" ? : string ; "ftp-user" ? : string ; "gid" ? : string ; "hash-check-only" ? : string ; "header" ? : { [ name ] : string ; } ; "http-accept-gzip" ? : string ; "http-auth-challenge" ? : string ; "http-no-cache" ? : string ; "http-passwd" ? : string ; "http-proxy" ? : string ; "http-proxy-passwd" ? : string ; "http-proxy-user" ? : string ; "http-user" ? : string ; "https-proxy" ? : string ; "https-proxy-passwd" ? : string ; "https-proxy-user" ? : string ; "index-out" ? : string ; "lowest-speed-limit" ? : string ; "max-connection-per-server" ? : string ; "max-download-limit" ? : string ; "max-file-not-found" ? : string ; "max-mmap-limit" ? : string ; "max-resume-failure-tries" ? : string ; "max-tries" ? : string ; "max-upload-limit" ? : string ; "metalink-base-uri" ? : string ; "metalink-enable-unique-protocol" ? : string ; "metalink-language" ? : string ; "metalink-location" ? : string ; "metalink-os" ? : string ; "metalink-preferred-protocol" ? : string ; "metalink-version" ? : string ; "min-split-size" ? : string ; "no-file-allocation-limit" ? : string ; "no-netrc" ? : string ; "no-proxy" ? : string ; "out" ? : string ; "parameterized-uri" ? : string ; "pause" ? : string ; "pause-metadata" ? : string ; "piece-length" ? : string ; "proxy-method" ? : string ; "realtime-chunk-checksum" ? : string ; "referer" ? : string ; "remote-time" ? : string ; "remove-control-file" ? : string ; "retry-wait" ? : string ; "reuse-uri" ? : string ; "rpc-save-upload-metadata" ? : string ; "seed-ratio" ? : string ; "seed-time" ? : string ; "select-file" ? : string ; "split" ? : number ; "ssh-host-key-md" ? : string ; "stream-piece-selector" ? : string ; "timeout" ? : string ; "uri-selector" ? : string ; "use-head" ? : string ; "user-agent" ? : string ; } /**
 * 下载文件列表
 */ interface Aria2Files { /**
     * 文件索引，从1开始
     */ index : number ; /**
     * 文件路径
     */ path : string ; /**
     * 文件大小，单位：字节
     */ length : number ; /**
     * 已下载文件大小，单位：字节
     */ completedLength : number ; /**
     * 标志此文件被--selecte-file选中
     */ selected : boolean ; /**
     * 此文件的url列表
     */ uris : string [ ] ; } /**
 * aria任务状态信息
 */ interface Aria2Status { /**
     * 任务唯一id
     */ gid : string ; /**
     * 下载状态
     */ status : "active" | "waiting" | "paused" | "error" | "complete" | "removed" ; /**
     * 任务总大小，单位：字节
     */ totalLength : number ; /**
     * 已下载大小，单位：字节
     */ completedLength : number ; /**
     * 上传大小，单位：字节
     */ uploadLength : number ; /**
     * 下载进度的十六进制数据1表示
     * 最高位对应索引0，已设置位表示已下载的片段，未设置位表示未下载/丢失片段，溢出的位全为0
     * 未开始下载时不会返回奔项
     */ bitfield ? : string ; /**
     * 下载速度，单位：字节/秒
     */ downloadSpeed : number ; /**
     * 上传速度，单位：字节/秒
     */ uploadSpeed : number ; /**
     * 哈希信息，仅限BitTorrent
     */ infoHash ? : string ; /**
     * 已连接的主机数，仅限BitTorrent
     */ numSeeders ? : number ; /**
     * 是否做种中，仅限BitTorrent
     */ seeder ? : boolean ; /**
     * 片段长度，单位：字节
     */ pieceLength : number ; /**
     * 片段数
     */ numPieces : number ; /**
     * 已建立链接数
     */ connections : number ; /**
     * 最后一个错误码，只使用已完成/失败的下载
     */ errorCode ? : string ; /**
     * 最后一个错误码，只使用已完成/失败的下载
     */ errorMessage ? : string ; /**
     * 下载结果声成的gid表，用于跟踪自动生成的下载
     */ followedBy ? : string [ ] ; /**
     * followedBy的另一头，只是自动下载的源gid
     */ following ? : string ; /**
     * 父下载的gid，该下载附带了很多下载时
     */ belongsTo ? : string ; /**
     * 保存目录
     */ dir : string ; /**
     * 文件列表
     */ files : Aria2Files ; /**
     * .torrent信息
     */ bittorrent : { /**
         * 公告 URI 列表的列表
         */ announceList : string [ ] ; /**
         * torrent评论
         */ comment : string [ ] ; /**
         * torrent生成时间戳
         */ creationDate : number ; /**
         * torrent类别
         */ mode : "single" | "multi" ; /**
         * torrent信息字典
         */ info : { /**
             * torrent信息字典名
             */ name : string ; } ; } ; /**
     * 已哈希检验大小，只在启用了哈西校验时出现
     */ verifiedLength ? : number ; /**
     * 等待哈希校验，只在启用了哈西校验时出现
     */ verifyIntegrityPending ? : boolean ; } /**
 * aria2 RPC 方法参数
 * 按数组顺序传递，带问号的位可选参数
 * 返回值在Aria2MethodResponse并一一对应
 */ interface Aria2Method { param secret param urls param options param position returns "aria2.addUri" ( secret , urls , options ? , position ? ) : string ; param secret param torrent param urls param options param position returns "aria2.addTorrent" ( secret , torrent , options ? , position ? ) : string ; param secret param metalink param options param position returns "aria2.addMetalink" ( secret , metalink , options ? , position ? ) : string ; param secret param gid returns "aria2.remove" ( secret , gid ) : string ; param secret param gid returns "aria2.forceRemove" ( secret , gid ) : string ; param secret param gid returns "aria2.pause" ( secret , gid ) : string ; param secret "aria2.pauseAll" ( secret ? ) : "OK" ; param secret param gid returns "aria2.forcePause" ( secret , gid ) : string ; param secret "aria2.forcePauseAll" ( secret ? ) : "OK" ; param secret param gid returns "aria2.unpause" ( secret , gid ) : string ; param secret "aria2.unpauseAll" ( secret ? ) : "OK" ; param secret param gid param keys "aria2.tellStatus" ( secret , gid , keys ? ) : Aria2Status ; param secret param gid "aria2.getUris" ( secret , gid ) : { uri : string ; status : "used" | "waiting" ; } [ ] ; param secret param gid "aria2.getFiles" ( secret , gid ) : Aria2Files [ ] ; param secret param gid "aria2.getPeers" ( secret , gid ) : { peerId : string ; ip : string ; port : string ; bitfield : string ; amChoking : boolean ; peerChoking : boolean ; downloadSpeed : number ; uploadSpeed : number ; seeder : boolean ; } [ ] ; param secret param gid "aria2.getServers" ( secret , gid ) : { index : number ; servers : { uri : string ; currentUri : string ; downloadSpeed : number ; } ; } [ ] ; param secret param keys "aria2.tellActive" ( secret ? , keys ? ) : Aria2Status [ ] ; param secret param offset param num param keys "aria2.tellWaiting" ( secret , offset , num , keys ? ) : Aria2Status [ ] ; param secret param offset param num param keys "aria2.tellStopped" ( secret , offset , num , keys ? ) : Aria2Status [ ] ; param secret param gid param pos param how returns "aria2.changePosition" ( secret , gid , pos , how ) : number ; param secret param gid param fileIndex param delUris param addUris param position returns "aria2.changeUri" ( secret , gid , fileIndex , delUris , addUris , position ? ) : [ number , number ] ; param secret param gid "aria2.getOption" ( secret , gid ) : Aria2Option ; param secret param gid param options "aria2.changeOption" ( secret , gid , options ) : "OK" ; param secret "aria2.getGlobalOption" ( secret ? ) : Aria2Option ; param secret param options "aria2.changeGlobalOption" ( secret , options ) : "OK" ; param secret returns "aria2.getGlobalStat" ( secret ? ) : { downloadSpeed : number ; uploadSpeed : number ; numActive : number ; numWaiting : number ; numStopped : number ; numStoppedTotal : number ; } ; param secret "aria2.purgeDownloadResult" ( secret ? ) : "OK" ; param secret param gid "aria2.removeDownloadResult" ( secret , gid ) : "OK" ; param secret returns "aria2.getVersion" ( secret ? ) : { version : string ; enabledFeatures : string [ ] ; } ; param secret returns "aria2.getSessionInfo" ( secret ? ) : { sessionId : string ; } ; param secret "aria2.shutdown" ( secret ? ) : "OK" ; param secret "aria2.forceShutdown" ( secret ? ) : "OK" ; param secret "aria2.saveSession" ( secret ? ) : "OK" ; param methods returns "system.multicall" ( ) : any [ ] ; returns "system.listMethods" ( ) : string [ ] ; returns "system.listNotifications" ( ) : string [ ] ; }