From 6e0fec20c6897694a2a5893e7e702c35ad12d75e Mon Sep 17 00:00:00 2001 From: Alexey Kasyanchuk Date: Mon, 18 Jun 2018 00:21:35 +0300 Subject: [PATCH] fix(gui): fix potencial false window load --- src/background/background.js | 19 +- src/background/spider.js | 1122 +++++++++++++++++----------------- 2 files changed, 573 insertions(+), 568 deletions(-) diff --git a/src/background/background.js b/src/background/background.js index c9faeea1..5e665202 100644 --- a/src/background/background.js +++ b/src/background/background.js @@ -152,14 +152,6 @@ app.on("ready", () => { dbPatcher(() => { changeLanguage(appConfig.language, () => setApplicationMenu()) - mainWindow.loadURL( - url.format({ - pathname: path.join(__dirname, "app.html"), - protocol: "file:", - slashes: true - }) - ); - if (env.name === "development") { mainWindow.openDevTools(); } @@ -240,6 +232,17 @@ app.on("ready", () => { callback.apply(null, arg) }) }, app.getPath("userData"), app.getVersion(), env.name) + + // load page only after init app + spider.initialized.then(() => { + mainWindow.loadURL( + url.format({ + pathname: path.join(__dirname, "app.html"), + protocol: "file:", + slashes: true + }) + ); + }) }, mainWindow, sphinx) }, app.getPath("userData"), () => app.quit()) }); diff --git a/src/background/spider.js b/src/background/spider.js index 284cf5de..a217a58c 100644 --- a/src/background/spider.js +++ b/src/background/spider.js @@ -36,71 +36,73 @@ const torrentClient = require('./torrentClient') module.exports = function (send, recive, dataDirectory, version, env) { + this.initialized = (async () => + { - let torrentsId = 1; - let filesId = 1; + let torrentsId = 1; + let filesId = 1; - let sphinx = pool(); + let sphinx = pool(); - // initialize p2p - const p2p = new P2PServer(send) - p2p.version = version - p2p.encryptor = encryptor - p2p.listen() - const p2pStore = new P2PStore(p2p, sphinx) + // initialize p2p + const p2p = new P2PServer(send) + p2p.version = version + p2p.encryptor = encryptor + p2p.listen() + const p2pStore = new P2PStore(p2p, sphinx) - const udpTrackers = [ - { - host: 'tracker.coppersurfer.tk', - port: 6969 - }, - { - host: 'tracker.leechers-paradise.org', - port: 6969 - }, - { - host: 'tracker.opentrackr.org', - port: 1337 - }, - { - host: '9.rarbg.me', - port: 2710 - } - ] + const udpTrackers = [ + { + host: 'tracker.coppersurfer.tk', + port: 6969 + }, + { + host: 'tracker.leechers-paradise.org', + port: 6969 + }, + { + host: 'tracker.opentrackr.org', + port: 1337 + }, + { + host: '9.rarbg.me', + port: 2710 + } + ] - let mysqlSingle = single((mysqlSingle) => { - mysqlSingle.query("SELECT MAX(`id`) as mx from torrents", (err, rows) => { - if(err) - return + let mysqlSingle = single((mysqlSingle) => { + mysqlSingle.query("SELECT MAX(`id`) as mx from torrents", (err, rows) => { + if(err) + return - if(rows[0] && rows[0].mx >= 1) - torrentsId = rows[0].mx + 1; - }) + if(rows[0] && rows[0].mx >= 1) + torrentsId = rows[0].mx + 1; + }) - mysqlSingle.query("SELECT COUNT(*) as cnt from torrents", (err, rows) => { - if(err) - return + mysqlSingle.query("SELECT COUNT(*) as cnt from torrents", (err, rows) => { + if(err) + return - p2p.info.torrents = rows[0].cnt - }) + p2p.info.torrents = rows[0].cnt + }) - mysqlSingle.query("SELECT MAX(`id`) as mx from files", (err, rows) => { - if(err) - return + mysqlSingle.query("SELECT MAX(`id`) as mx from files", (err, rows) => { + if(err) + return - if(rows[0] &&rows[0].mx >= 1) - filesId = rows[0].mx + 1; - }) + if(rows[0] &&rows[0].mx >= 1) + filesId = rows[0].mx + 1; + }) - mysqlSingle.query("SELECT COUNT(*) as cnt from files", (err, rows) => { - if(err) - return + mysqlSingle.query("SELECT COUNT(*) as cnt from files", (err, rows) => { + if(err) + return - p2p.info.files = rows[0].cnt - }) - }); + p2p.info.files = rows[0].cnt + }) + }); - /* + /* app.use(express.static('build', {index: false})); app.get('/sitemap.xml', function(req, res) { @@ -174,117 +176,117 @@ app.get('*', function(req, res) }); */ - // start + // start - function baseRowData(row) - { - return { - hash: row.hash, - name: row.name, - size: row.size, - files: row.files, - filesList: row.filesList, - piecelength: row.piecelength, - added: row.added ? (typeof row.added === 'object' ? row.added.getTime() : row.added) : (new Date()).getTime(), - contentType: row.contentType || row.contenttype, - contentCategory: row.contentCategory || row.contentcategory, - seeders: row.seeders, - completed: row.completed, - leechers: row.leechers, - trackersChecked: row.trackersChecked ? row.trackersChecked.getTime() : undefined, - good: row.good, - bad: row.bad, + function baseRowData(row) + { + return { + hash: row.hash, + name: row.name, + size: row.size, + files: row.files, + filesList: row.filesList, + piecelength: row.piecelength, + added: row.added ? (typeof row.added === 'object' ? row.added.getTime() : row.added) : (new Date()).getTime(), + contentType: row.contentType || row.contenttype, + contentCategory: row.contentCategory || row.contentcategory, + seeders: row.seeders, + completed: row.completed, + leechers: row.leechers, + trackersChecked: row.trackersChecked ? row.trackersChecked.getTime() : undefined, + good: row.good, + bad: row.bad, + } } - } - // load initial peers - if(dataDirectory && fs.existsSync(dataDirectory + '/peers.p2p')) - { - const peersEncrypted = fs.readFileSync(dataDirectory + '/peers.p2p', 'utf8') - const peers = encryptor.decrypt(peersEncrypted) - if(peers && peers.length > 0) + // load initial peers + if(dataDirectory && fs.existsSync(dataDirectory + '/peers.p2p')) { - peers.forEach(peer => p2p.add(peer)) - console.log('loaded', peers.length, 'peers') + const peersEncrypted = fs.readFileSync(dataDirectory + '/peers.p2p', 'utf8') + const peers = encryptor.decrypt(peersEncrypted) + if(peers && peers.length > 0) + { + peers.forEach(peer => p2p.add(peer)) + console.log('loaded', peers.length, 'peers') + } } - } - const getServiceJson = (url) => new Promise((resolve) => { - http.get(url, (resp) => { - let data = ''; + const getServiceJson = (url) => new Promise((resolve) => { + http.get(url, (resp) => { + let data = ''; - resp.on('data', (chunk) => { - data += chunk; - }); + resp.on('data', (chunk) => { + data += chunk; + }); - resp.on('end', () => { - resolve(data.length > 0 && JSON.parse(data)) + resp.on('end', () => { + resolve(data.length > 0 && JSON.parse(data)) + }); + }).on("error", (err) => { + console.log(`${url} error: ` + err.message) + resolve(false) }); - }).on("error", (err) => { - console.log(`${url} error: ` + err.message) - resolve(false) - }); - }) + }) - if(config.p2pBootstrap) - { - const loadBootstrapPeers = async (url) => { - const json = await getServiceJson(url) - if(json.bootstrap) - { - const peers = encryptor.decrypt(json.bootstrap) - if(peers && peers.length > 0) + if(config.p2pBootstrap) + { + const loadBootstrapPeers = async (url) => { + const json = await getServiceJson(url) + if(json.bootstrap) { - peers.forEach(peer => p2p.add(peer)) - console.log('loaded', peers.length, 'peers from bootstrap') + const peers = encryptor.decrypt(json.bootstrap) + if(peers && peers.length > 0) + { + peers.forEach(peer => p2p.add(peer)) + console.log('loaded', peers.length, 'peers from bootstrap') + } } - } - if(json.bootstrapMap) - { - const peersMap = encryptor.decrypt(json.bootstrapMap) - if(typeof peersMap === 'object') + if(json.bootstrapMap) { - for(const map in peersMap) + const peersMap = encryptor.decrypt(json.bootstrapMap) + if(typeof peersMap === 'object') { - if(parseInt(map) <= 0) - continue // break if this is not number - - const peers = peersMap[map] - if(peers.length > 0) + for(const map in peersMap) { - peers.forEach(peer => p2p.add(peer)) + if(parseInt(map) <= 0) + continue // break if this is not number + + const peers = peersMap[map] + if(peers.length > 0) + { + peers.forEach(peer => p2p.add(peer)) + } } } + console.log('loaded peers map from bootstrap') } - console.log('loaded peers map from bootstrap') } - } - - loadBootstrapPeers('https://api.myjson.com/bins/1e5rmh') - loadBootstrapPeers('https://jsonblob.com/api/jsonBlob/013a4415-3533-11e8-8290-a901f3cf34aa') - } - let undoneQueries = 0; - let pushDatabaseBalance = () => { - undoneQueries++; - if(undoneQueries >= 5000) - { - balanceDebug('start balance mysql, queries:', undoneQueries); - spider.ignore = true; - } - }; - let popDatabaseBalance = () => { - undoneQueries--; - balanceDebug('balanced, queries left:', undoneQueries); - if(undoneQueries == 0) - { - balanceDebug('balance done'); - spider.ignore = false; + loadBootstrapPeers('https://api.myjson.com/bins/1e5rmh') + loadBootstrapPeers('https://jsonblob.com/api/jsonBlob/013a4415-3533-11e8-8290-a901f3cf34aa') } - }; - // обновление статистики - /* + let undoneQueries = 0; + let pushDatabaseBalance = () => { + undoneQueries++; + if(undoneQueries >= 5000) + { + balanceDebug('start balance mysql, queries:', undoneQueries); + spider.ignore = true; + } + }; + let popDatabaseBalance = () => { + undoneQueries--; + balanceDebug('balanced, queries left:', undoneQueries); + if(undoneQueries == 0) + { + balanceDebug('balance done'); + spider.ignore = false; + } + }; + + // обновление статистики + /* setInterval(() => { let stats = {}; sphinx.query('SELECT COUNT(*) as tornum FROM `torrents`', function (error, rows, fields) { @@ -308,60 +310,60 @@ setInterval(() => { }, 10 * 60 * 1000) */ - const updateTorrentTrackers = (hash) => { - let maxSeeders = 0, maxLeechers = 0, maxCompleted = 0; - mysqlSingle.query('UPDATE torrents SET trackersChecked = ? WHERE hash = ?', [Math.floor(Date.now() / 1000), hash], function(err, result) { - if(!result) { - console.error(err); - return - } + const updateTorrentTrackers = (hash) => { + let maxSeeders = 0, maxLeechers = 0, maxCompleted = 0; + mysqlSingle.query('UPDATE torrents SET trackersChecked = ? WHERE hash = ?', [Math.floor(Date.now() / 1000), hash], function(err, result) { + if(!result) { + console.error(err); + return + } - udpTrackers.forEach((tracker) => { - getPeersStatisticUDP(tracker.host, tracker.port, hash, ({seeders, completed, leechers}) => { - if(seeders == 0 && completed == 0 && leechers == 0) - return; + udpTrackers.forEach((tracker) => { + getPeersStatisticUDP(tracker.host, tracker.port, hash, ({seeders, completed, leechers}) => { + if(seeders == 0 && completed == 0 && leechers == 0) + return; - if(seeders < maxSeeders) - { - return; - } - if(seeders == maxSeeders && leechers < maxLeechers) - { - return; - } - if(seeders == maxSeeders && leechers == maxLeechers && completed <= maxCompleted) - { - return; - } - maxSeeders = seeders; - maxLeechers = leechers; - maxCompleted = completed; - let checkTime = new Date(); - - mysqlSingle.query('UPDATE torrents SET seeders = ?, completed = ?, leechers = ?, trackersChecked = ? WHERE hash = ?', [seeders, completed, leechers, Math.floor(checkTime.getTime() / 1000), hash], function(err, result) { - if(!result) { - console.error(err); - return + if(seeders < maxSeeders) + { + return; } + if(seeders == maxSeeders && leechers < maxLeechers) + { + return; + } + if(seeders == maxSeeders && leechers == maxLeechers && completed <= maxCompleted) + { + return; + } + maxSeeders = seeders; + maxLeechers = leechers; + maxCompleted = completed; + let checkTime = new Date(); - send('trackerTorrentUpdate', { - hash, - seeders, - completed, - leechers, - trackersChecked: checkTime.getTime() + mysqlSingle.query('UPDATE torrents SET seeders = ?, completed = ?, leechers = ?, trackersChecked = ? WHERE hash = ?', [seeders, completed, leechers, Math.floor(checkTime.getTime() / 1000), hash], function(err, result) { + if(!result) { + console.error(err); + return + } + + send('trackerTorrentUpdate', { + hash, + seeders, + completed, + leechers, + trackersChecked: checkTime.getTime() + }); }); }); }); }); - }); - } + } - const cleanupTorrents = (cleanTorrents = 1) => { - if(!config.cleanup) - return; + const cleanupTorrents = (cleanTorrents = 1) => { + if(!config.cleanup) + return; - /* + /* disk.check(rootPath, function(err, info) { if (err) { console.log(err); @@ -392,453 +394,453 @@ setInterval(() => { } }); */ - } - - const checkTorrent = (torrent) => { - if(config.filters.maxFiles > 0 && torrent.files > config.filters.maxFiles) - { - console.log('ignore', torrent.name, 'because files', torrent.files, '>', config.filters.maxFiles) - return false } - const nameRX = config.filters.namingRegExp && config.filters.namingRegExp.trim() - if(nameRX && nameRX.length > 0) - { - const rx = new RegExp(nameRX) - if(!config.filters.namingRegExpNegative && !rx.test(torrent.name)) + const checkTorrent = (torrent) => { + if(config.filters.maxFiles > 0 && torrent.files > config.filters.maxFiles) { - console.log('ignore', torrent.name, 'by naming rx') + console.log('ignore', torrent.name, 'because files', torrent.files, '>', config.filters.maxFiles) return false } - else if(config.filters.namingRegExpNegative && rx.test(torrent.name)) + + const nameRX = config.filters.namingRegExp && config.filters.namingRegExp.trim() + if(nameRX && nameRX.length > 0) { - console.log('ignore', torrent.name, 'by naming rx negative') - return false + const rx = new RegExp(nameRX) + if(!config.filters.namingRegExpNegative && !rx.test(torrent.name)) + { + console.log('ignore', torrent.name, 'by naming rx') + return false + } + else if(config.filters.namingRegExpNegative && rx.test(torrent.name)) + { + console.log('ignore', torrent.name, 'by naming rx negative') + return false + } } - } - - if(torrent.contentType === 'bad') - { - console.log('ignore torrent', torrent.name, 'because this is a bad thing') - return false - } - - if(config.filters.adultFilter && torrent.contentCategory === 'xxx') - { - console.log('ignore torrent', torrent.name, 'because adult filter') - return false - } - - return true - } - const insertTorrentToDB = (torrent, silent) => new Promise((resolve) => { - if(!torrent) - { - resolve() - return - } + if(torrent.contentType === 'bad') + { + console.log('ignore torrent', torrent.name, 'because this is a bad thing') + return false + } - // fix cases for low cases letters - if(torrent.contentcategory) - { - torrent.contentCategory = torrent.contentcategory; - delete torrent.contentcategory; - } - if(torrent.contenttype) - { - torrent.contentType = torrent.contenttype; - delete torrent.contenttype; - } + if(config.filters.adultFilter && torrent.contentCategory === 'xxx') + { + console.log('ignore torrent', torrent.name, 'because adult filter') + return false + } - if(!checkTorrent(torrent)) - { - resolve() - return + return true } - const { filesList } = torrent - delete torrent.filesList; - - torrent.id = torrentsId++; - - mysqlSingle.query("SELECT id FROM torrents WHERE hash = ?", torrent.hash, (err, single) => { - if(!single) + const insertTorrentToDB = (torrent, silent) => new Promise((resolve) => { + if(!torrent) { - console.log(err) resolve() return } - if(single.length > 0) + // fix cases for low cases letters + if(torrent.contentcategory) + { + torrent.contentCategory = torrent.contentcategory; + delete torrent.contentcategory; + } + if(torrent.contenttype) + { + torrent.contentType = torrent.contenttype; + delete torrent.contenttype; + } + + if(!checkTorrent(torrent)) { resolve() return } - torrent.nameIndex = torrent.name - - mysqlSingle.insertValues('torrents', torrent, function(err, result) { - if(result) { - if(!silent) - send('newTorrent', { - hash: torrent.hash, - name: torrent.name, - size: torrent.size, - files: torrent.files, - piecelength: torrent.piecelength, - contentType: torrent.contentType, - contentCategory: torrent.contentCategory, - }); - updateTorrentTrackers(torrent.hash); - } - else + const { filesList } = torrent + delete torrent.filesList; + + torrent.id = torrentsId++; + + mysqlSingle.query("SELECT id FROM torrents WHERE hash = ?", torrent.hash, (err, single) => { + if(!single) { - console.log(torrent); - console.error(err); + console.log(err) + resolve() + return } - resolve() - }); - }) - let filesToAdd = filesList.length; - mysqlSingle.query('SELECT count(*) as files_count FROM files WHERE hash = ?', [torrent.hash], function(err, rows) { - if(!rows) - return + if(single.length > 0) + { + resolve() + return + } - const db_files = rows[0]['files_count']; - if(db_files !== torrent.files) - { - mysqlSingle.query('DELETE FROM files WHERE hash = ?', torrent.hash, function (err, result) { - if(err) + torrent.nameIndex = torrent.name + + mysqlSingle.insertValues('torrents', torrent, function(err, result) { + if(result) { + if(!silent) + send('newTorrent', { + hash: torrent.hash, + name: torrent.name, + size: torrent.size, + files: torrent.files, + piecelength: torrent.piecelength, + contentType: torrent.contentType, + contentCategory: torrent.contentCategory, + }); + updateTorrentTrackers(torrent.hash); + } + else { - return; + console.log(torrent); + console.error(err); } + resolve() + }); + }) - filesList.forEach((file) => { - file.id = filesId++; - file.pathIndex = file.path; - mysqlSingle.insertValues('files', file, function(err, result) { - if(!result) { - console.log(file); - console.error(err); - return - } - if(--filesToAdd === 0) { - if(!silent) - send('filesReady', torrent.hash); - } + let filesToAdd = filesList.length; + mysqlSingle.query('SELECT count(*) as files_count FROM files WHERE hash = ?', [torrent.hash], function(err, rows) { + if(!rows) + return + + const db_files = rows[0]['files_count']; + if(db_files !== torrent.files) + { + mysqlSingle.query('DELETE FROM files WHERE hash = ?', torrent.hash, function (err, result) { + if(err) + { + return; + } + + filesList.forEach((file) => { + file.id = filesId++; + file.pathIndex = file.path; + mysqlSingle.insertValues('files', file, function(err, result) { + if(!result) { + console.log(file); + console.error(err); + return + } + if(--filesToAdd === 0) { + if(!silent) + send('filesReady', torrent.hash); + } + }); }); - }); - }) - } + }) + } + }) }) - }) - const removeTorrentFromDB = async (torrent) => { - const {hash} = torrent - await mysqlSingle.query('DELETE FROM torrents WHERE hash = ?', hash) - await mysqlSingle.query('DELETE FROM files WHERE hash = ?', hash) - } + const removeTorrentFromDB = async (torrent) => { + const {hash} = torrent + await mysqlSingle.query('DELETE FROM torrents WHERE hash = ?', hash) + await mysqlSingle.query('DELETE FROM files WHERE hash = ?', hash) + } - const updateTorrentToDB = async (torrent) => { - if(typeof torrent !== 'object') - return + const updateTorrentToDB = async (torrent) => { + if(typeof torrent !== 'object') + return - delete torrent.id + delete torrent.id - await mysqlSingle.updateValues('torrents', torrent, {hash: torrent.hash}) - } + await mysqlSingle.updateValues('torrents', torrent, {hash: torrent.hash}) + } - const updateTorrent = (metadata, infohash, rinfo) => { - console.log('finded torrent', metadata.info.name, ' and add to database'); + const updateTorrent = (metadata, infohash, rinfo) => { + console.log('finded torrent', metadata.info.name, ' and add to database'); - const hash = infohash.toString('hex'); - let size = metadata.info.length ? metadata.info.length : 0; - let filesCount = 1; - let filesArray = []; + const hash = infohash.toString('hex'); + let size = metadata.info.length ? metadata.info.length : 0; + let filesCount = 1; + let filesArray = []; - const filesAdd = (path, size) => filesArray.push({ - hash, - path, - size, - }) + const filesAdd = (path, size) => filesArray.push({ + hash, + path, + size, + }) - if(metadata.info.files && metadata.info.files.length > 0) - { - filesCount = metadata.info.files.length; - size = 0; + if(metadata.info.files && metadata.info.files.length > 0) + { + filesCount = metadata.info.files.length; + size = 0; - for(let i = 0; i < metadata.info.files.length; i++) + for(let i = 0; i < metadata.info.files.length; i++) + { + let file = metadata.info.files[i]; + let filePath = file.path.join('/'); + filesAdd(filePath, file.length); + size += file.length; + } + } + else { - let file = metadata.info.files[i]; - let filePath = file.path.join('/'); - filesAdd(filePath, file.length); - size += file.length; + filesAdd(metadata.info.name, size) } - } - else - { - filesAdd(metadata.info.name, size) + + const torrentQ = { + hash: hash, + name: metadata.info.name, + size: size, + files: filesCount, + piecelength: metadata.info['piece length'], + ipv4: rinfo.address, + port: rinfo.port, + added: Math.floor(Date.now() / 1000) + }; + + torrentTypeDetect(torrentQ, filesArray); + torrentQ.filesList = filesArray; + insertTorrentToDB(torrentQ) } - const torrentQ = { - hash: hash, - name: metadata.info.name, - size: size, - files: filesCount, - piecelength: metadata.info['piece length'], - ipv4: rinfo.address, - port: rinfo.port, - added: Math.floor(Date.now() / 1000) - }; + client.on('complete', function (metadata, infohash, rinfo) { - torrentTypeDetect(torrentQ, filesArray); - torrentQ.filesList = filesArray; - insertTorrentToDB(torrentQ) - } + cleanupTorrents(1); // clean old torrents before writing new - client.on('complete', function (metadata, infohash, rinfo) { + if(config.spaceQuota && config.spaceDiskLimit > 0) + { + disk.check(rootPath, function(err, info) { + if (err) { + console.log(err); + } else { + const {available, free, total} = info; - cleanupTorrents(1); // clean old torrents before writing new + if(free >= config.spaceDiskLimit) + { + hideFakeTorrents(); // also enable fake torrents; + updateTorrent(metadata, infohash, rinfo); + } + else + { + quotaDebug('ignore torrent', metadata.info.name, 'free space', (free / (1024 * 1024)) + "mb"); + showFakeTorrents(); // also enable fake torrents; + } + } + }); + } + else + { + updateTorrent(metadata, infohash, rinfo); + } + }); - if(config.spaceQuota && config.spaceDiskLimit > 0) - { - disk.check(rootPath, function(err, info) { - if (err) { - console.log(err); - } else { - const {available, free, total} = info; + checkInternet((connected) => { + if(!connected) + return - if(free >= config.spaceDiskLimit) - { - hideFakeTorrents(); // also enable fake torrents; - updateTorrent(metadata, infohash, rinfo); - } - else - { - quotaDebug('ignore torrent', metadata.info.name, 'free space', (free / (1024 * 1024)) + "mb"); - showFakeTorrents(); // also enable fake torrents; - } - } - }); - } - else - { - updateTorrent(metadata, infohash, rinfo); - } - }); - - checkInternet((connected) => { - if(!connected) - return - - const { STUN_BINDING_REQUEST, STUN_ATTR_XOR_MAPPED_ADDRESS } = stun.constants - const stunServer = stun.createServer() - const stunRequest = stun.createMessage(STUN_BINDING_REQUEST) - stunServer.once('bindingResponse', stunMsg => { - const {address, port} = stunMsg.getAttribute(STUN_ATTR_XOR_MAPPED_ADDRESS).value - stunServer.close() + const { STUN_BINDING_REQUEST, STUN_ATTR_XOR_MAPPED_ADDRESS } = stun.constants + const stunServer = stun.createServer() + const stunRequest = stun.createMessage(STUN_BINDING_REQUEST) + stunServer.once('bindingResponse', stunMsg => { + const {address, port} = stunMsg.getAttribute(STUN_ATTR_XOR_MAPPED_ADDRESS).value + stunServer.close() - console.log('p2p stun ignore my address', address) - p2p.ignore(address) + console.log('p2p stun ignore my address', address) + p2p.ignore(address) - // check port avalibility - p2p.checkPortAndRedirect(address, config.spiderPort) + // check port avalibility + p2p.checkPortAndRedirect(address, config.spiderPort) + }) + stunServer.send(stunRequest, 19302, 'stun.l.google.com') }) - stunServer.send(stunRequest, 19302, 'stun.l.google.com') - }) - let upnp - if(config.upnp) - { - upnp = natUpnp.createClient(); - upnp.ratsMap = () => { - upnp.portMapping({ - public: config.spiderPort, - private: config.spiderPort, - protocol: 'UDP', - description: 'Rats', - ttl: 0 - }, function(err) { - if(err) - console.log('upnp server dont respond') - }); - upnp.portMapping({ - public: config.spiderPort, - private: config.spiderPort, - protocol: 'TCP', - description: 'Rats', - ttl: 0 - }, function(err) { - if(err) - console.log('upnp server dont respond') - }); - upnp.portMapping({ - public: config.udpTrackersPort, - private: config.udpTrackersPort, - protocol: 'UDP', - description: 'Rats', - ttl: 0 - }, function(err) { + let upnp + if(config.upnp) + { + upnp = natUpnp.createClient(); + upnp.ratsMap = () => { + upnp.portMapping({ + public: config.spiderPort, + private: config.spiderPort, + protocol: 'UDP', + description: 'Rats', + ttl: 0 + }, function(err) { + if(err) + console.log('upnp server dont respond') + }); + upnp.portMapping({ + public: config.spiderPort, + private: config.spiderPort, + protocol: 'TCP', + description: 'Rats', + ttl: 0 + }, function(err) { + if(err) + console.log('upnp server dont respond') + }); + upnp.portMapping({ + public: config.udpTrackersPort, + private: config.udpTrackersPort, + protocol: 'UDP', + description: 'Rats', + ttl: 0 + }, function(err) { + if(err) + console.log('upnp server dont respond') + }); + } + + upnp.ratsUnmap = () => { + upnp.portUnmapping({ + public: config.spiderPort, + protocol: 'UDP' + }); + upnp.portUnmapping({ + public: config.spiderPort, + protocol: 'TCP' + }); + upnp.portUnmapping({ + public: config.udpTrackersPort, + protocol: 'UDP' + }); + } + + upnp.ratsMap(); + + upnp.externalIp(function(err, ip) { if(err) - console.log('upnp server dont respond') - }); - } + return - upnp.ratsUnmap = () => { - upnp.portUnmapping({ - public: config.spiderPort, - protocol: 'UDP' - }); - upnp.portUnmapping({ - public: config.spiderPort, - protocol: 'TCP' - }); - upnp.portUnmapping({ - public: config.udpTrackersPort, - protocol: 'UDP' + console.log('p2p upnp ignore my address', ip) + p2p.ignore(ip) }); } - upnp.ratsMap(); + spider.on('peer', (IPs) => { + IPs.forEach(ip => p2p.add(ip)) + }) - upnp.externalIp(function(err, ip) { - if(err) - return + // feed + const feed = new Feed({sphinx}) + // load inside api + + // setup api + await API({ + sphinx, + recive, + send, + p2p, + config, + baseRowData, + torrentClient, + spider, + upnp, + crypto, + insertTorrentToDB, + removeTorrentFromDB, + updateTorrentToDB, + checkTorrent, + p2pStore, + feed + }) - console.log('p2p upnp ignore my address', ip) - p2p.ignore(ip) - }); - } - - spider.on('peer', (IPs) => { - IPs.forEach(ip => p2p.add(ip)) - }) - - // feed - const feed = new Feed({sphinx}) - // load inside api - - // setup api - API({ - sphinx, - recive, - send, - p2p, - config, - baseRowData, - torrentClient, - spider, - upnp, - crypto, - insertTorrentToDB, - removeTorrentFromDB, - updateTorrentToDB, - checkTorrent, - p2pStore, - feed - }) - - if(config.indexer) { - spider.listen(config.spiderPort) - if(config.p2p) - { - spider.announceHashes = [crypto.createHash('sha1').update('degrats-v1').digest()] + if(config.indexer) { + spider.listen(config.spiderPort) + if(config.p2p) + { + spider.announceHashes = [crypto.createHash('sha1').update('degrats-v1').digest()] + } } - } - if(config.cleanup && config.indexer) - { - cleanupDebug('cleanup enabled'); - cleanupDebug('cleanup disc limit', (config.cleanupDiscLimit / (1024 * 1024)) + 'mb'); - } + if(config.cleanup && config.indexer) + { + cleanupDebug('cleanup enabled'); + cleanupDebug('cleanup disc limit', (config.cleanupDiscLimit / (1024 * 1024)) + 'mb'); + } - if(config.spaceQuota) - { - quotaDebug('disk quota enabled'); - } + if(config.spaceQuota) + { + quotaDebug('disk quota enabled'); + } - this.stop = async (callback) => { - console.log('spider closing...') - if(upnp) - upnp.ratsUnmap() + this.stop = async (callback) => { + console.log('spider closing...') + if(upnp) + upnp.ratsUnmap() - console.log('closing p2p...') - p2p.close() + console.log('closing p2p...') + p2p.close() - // save feed - await feed.save() + // save feed + await feed.save() - // safe future peers - if(dataDirectory) - { - const addresses = p2p.addresses(p2p.peersList()) - const peersEncripted = encryptor.encrypt(addresses) - if(addresses.length > 0) + // safe future peers + if(dataDirectory) { - fs.writeFileSync(dataDirectory + '/peers.p2p', peersEncripted, 'utf8'); - console.log('local peers saved') - } + const addresses = p2p.addresses(p2p.peersList()) + const peersEncripted = encryptor.encrypt(addresses) + if(addresses.length > 0) + { + fs.writeFileSync(dataDirectory + '/peers.p2p', peersEncripted, 'utf8'); + console.log('local peers saved') + } - if(config.p2pBootstrap) - { - const saveBootstrapPeers = (host, path) => new Promise(async (resolve) => { - if(env === 'test') - { - resolve() - return - } + if(config.p2pBootstrap) + { + const saveBootstrapPeers = (host, path) => new Promise(async (resolve) => { + if(env === 'test') + { + resolve() + return + } - if(addresses.length <= 0) - { - resolve() - return - } + if(addresses.length <= 0) + { + resolve() + return + } - // check bootstrap map - const json = await getServiceJson(`https://${host}${path}`) - let bootstrapMap = {} - if(json.bootstrapMap) - { - const bootstrapMapCandidate = encryptor.decrypt(json.bootstrapMap) - if(typeof bootstrapMapCandidate === 'object') - bootstrapMap = bootstrapMapCandidate - } - bootstrapMap[addresses.length] = addresses - - const options = { - port: 443, - host, - method: 'PUT', - path, - headers: { - 'Content-Type' : "application/json", + // check bootstrap map + const json = await getServiceJson(`https://${host}${path}`) + let bootstrapMap = {} + if(json.bootstrapMap) + { + const bootstrapMapCandidate = encryptor.decrypt(json.bootstrapMap) + if(typeof bootstrapMapCandidate === 'object') + bootstrapMap = bootstrapMapCandidate } - }; - console.log('bootstrap peers saved to', host) - const req = http.request(options, resolve); - req.on('error', resolve) - req.end(JSON.stringify({ - bootstrap: peersEncripted, - bootstrapMap: encryptor.encrypt(bootstrapMap) - })) - }) - - - await saveBootstrapPeers('api.myjson.com', '/bins/1e5rmh') - await saveBootstrapPeers('jsonblob.com', '/api/jsonBlob/013a4415-3533-11e8-8290-a901f3cf34aa') + bootstrapMap[addresses.length] = addresses + + const options = { + port: 443, + host, + method: 'PUT', + path, + headers: { + 'Content-Type' : "application/json", + } + }; + console.log('bootstrap peers saved to', host) + const req = http.request(options, resolve); + req.on('error', resolve) + req.end(JSON.stringify({ + bootstrap: peersEncripted, + bootstrapMap: encryptor.encrypt(bootstrapMap) + })) + }) + + + await saveBootstrapPeers('api.myjson.com', '/bins/1e5rmh') + await saveBootstrapPeers('jsonblob.com', '/api/jsonBlob/013a4415-3533-11e8-8290-a901f3cf34aa') + } } - } - - torrentClient.destroy(() => { - sphinx.end(() => spider.close(() => { - mysqlSingle.destroy() - console.log('spider closed') - callback() - })) - }) - } - return this + torrentClient.destroy(() => { + sphinx.end(() => spider.close(() => { + mysqlSingle.destroy() + console.log('spider closed') + callback() + })) + }) + } + + })() } \ No newline at end of file