rats-search/src/background/torrentClient.js

94 lines
2.2 KiB
JavaScript

const WebTorrent = require('webtorrent')
const fs = require('fs')
const torrentClient = new WebTorrent({webSeeds: false})
torrentClient.saveSession = (sessionFile) => {
fs.writeFileSync(sessionFile, JSON.stringify({
torrents: torrentClient.torrents.map(torrent => ({
infoHash: torrent.infoHash,
path: torrent.path,
torrent: torrent.torrentObject,
removeOnDone: torrent.removeOnDone,
paused: torrent.paused || torrent._paused,
selection: torrent.files.map(file => typeof file.selected === 'undefined' || file.selected)
}))
}, null, 4), 'utf8');
}
torrentClient.loadSession = (sessionFile) => {
if(!fs.existsSync(sessionFile))
{
logT('downloader', 'no download sessions - ignore')
return
}
const data = fs.readFileSync(sessionFile, 'utf8')
const obj = JSON.parse(data);
if(!obj.torrents)
{
logT('downloader', 'no torrents list for loading session')
return
}
if(!torrentClient._add)
{
logT('downloader', 'no overriden _add() method')
return
}
const {torrents} = obj
torrents.forEach(({torrent, infoHash, path, removeOnDone, paused, selection}) => {
if(!torrent || !infoHash || !path)
{
logT('downloader', 'no info for starting download this torrent')
return
}
logT('downloader', 'restore download session:', torrent.name)
const download = torrentClient._add(torrent, path)
if(download)
{
logT('downloader', 'restore options')
// restore options
download.removeOnDone = removeOnDone
if(paused)
{
download._paused = true
}
if(selection)
{
download.on('metadata', () => {
logT('downloader', 'load torrent selection from session')
download.selectFiles(selection)
})
}
}
})
}
const metaHashes = {}
torrentClient.dht.on('peer', (peer, infoHash) => {
const hash = infoHash.toString('hex')
if(!(hash in metaHashes))
return
if(torrentClient._downloader)
{
torrentClient._downloader(peer, infoHash, (...data) => {
if(metaHashes[hash])
metaHashes[hash](...data)
delete metaHashes[hash]
})
}
else
{
delete metaHashes[hash]
}
})
torrentClient.getMetadata = (hash, callback) => {
hash = hash.toLowerCase()
torrentClient.dht.lookup(hash)
metaHashes[hash] = callback
}
module.exports = torrentClient