You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

132 lines
3.4 KiB

2 years ago
const { RelayPool, Relay } = require('nostr'),
crypto = require('crypto'),
writeYamlFile = require('write-yaml-file'),
fs = require('fs'),
fetch = require('cross-fetch')
const result = {},
relays_endpoint = 'https://nostr.watch/relays.json'
const subid = crypto.randomBytes(40).toString('hex')
let relays = [],
relaysRemote = {}
async function getRelays(){
return await fetch(relays_endpoint, { method: "Get" })
.then(res => res.json())
.then(json => relays = json.relays)
}
async function run(){
await getRelays()
return new Promise(resolve => {
const pool = RelayPool(relays)
pool
.on('open', relay => {
// console.log('open')
relay.subscribe(subid, {limit: 500, kinds:[3]})
})
.on('close', () => {
// console.log('close')
})
.on('event', (relay, _subid, event) => {
if(subid == _subid) {
try {
relaysRemote = Object.assign(relaysRemote, JSON.parse(event.content))
// console.log( event.content )
} catch(e) {""}
}
})
setTimeout( () => {
pool.close()
resolve(true)
}, 2*1000 )
})
}
run()
.then( async () => {
remote1 = Object.entries(relaysRemote)
.filter( relay => Array.isArray(relay) )
.map( relay => {
return relay[0]
.toLowerCase()
.trim()
.replace('\t', '')
.replace(/\s\t/g, '')
.replace(/\/+$/, "");
2 years ago
})
.filter( relay => relay.startsWith('wss://') )
.filter( relay => !relay.includes('localhost') )
remote2 = Object.entries(relaysRemote)
.filter( relay => typeof relay === 'String' )
.map( relay => {
return relay
.toLowerCase()
.trim()
.replace('\t', '')
.replace(/\s\t/g, '')
.replace(/\/+$/, "");
2 years ago
})
.filter( relay => relay.startsWith('wss://') )
.filter( relay => !relay.includes('localhost') )
let remoteMerged = remote1.concat(remote2)
// console.log(remoteMerged)
const check = async function(relay){
return new Promise( (resolve, reject) => {
let socket = new Relay(relay)
socket
.on('open', resolve )
.on('error', reject )
setTimeout( reject, 1000)
})
}
let remove = []
for(let i=0;i<remoteMerged.length;i++) {
// console.log('check for connect', remoteMerged[i])
await check(remoteMerged[i]).catch( (err) => {
// console.log(err)
remove.push(remoteMerged[i])
console.log('removals:', remove.length, remoteMerged[i])
})
}
console.log('before check', remoteMerged.length)
remoteMerged = remoteMerged.filter( relay => {
return !remove.includes(relay)
})
console.log('after check', remoteMerged.length)
const merged = relays.concat(remoteMerged)
const uniques = Array.from(new Set(merged))
console.log('after concat', uniques.length)
let final = { relays: uniques }
// console.log(final)
await writeYamlFile('./relays.yaml', final)
process.exit()
})
.catch( err => console.warn(err) )