active-onions
Version:
Filter out inactive onion URLs from an array
43 lines (38 loc) • 1.3 kB
JavaScript
;
const tr = require('tor-request');
const checkTor = () => {
return new Promise((resolve, reject) => {
tr.request(`https://locate.now.sh/ip/json`, (error, res, body) => {
if (!error && res.statusCode == 200) resolve();
else {
if (error.message.includes(`Are you running \`tor\``)) {
reject(new Error(`Please ensure that you are running \`tor\``));
} else reject(new Error(error));
}
})
})
};
const checkOnion = (onion) => {
return new Promise(resolve => {
return tr.request(onion, {json: true}, (error, res, body) => {
if (!error && [200, 403].includes(res.statusCode)) resolve(true);
else resolve(false);
})
})
};
const activeOnions = (onions) => {
if (!Array.isArray(onions)) {
return Promise.reject(new TypeError(`Expected an \`array\`, got \`${typeof onions}\``));
}
return new Promise((resolve, reject) => {
const onionsWithStatus = onions.map(async onion => [onion, await checkOnion(onion)])
Promise.all(onionsWithStatus).then(x => resolve(x.filter(y => y[1]).map(z => z.slice(0, -1)[0])))
})
};
module.exports = urls => {
return checkTor().then(() => {
return activeOnions(urls).then(onions => {
return onions
}).catch(error => { return Promise.reject(error) });
}).catch(error => { return Promise.reject(error) });
};