metasearch/index.js

82 lines
2.2 KiB
JavaScript
Raw Normal View History

2023-10-22 15:21:39 +00:00
const storageType = 'localStorage'
2023-10-14 12:41:06 +00:00
var data = {}
const infoEl = document.getElementById('info')
const formEl = document.getElementById('search')
// Register event listeners
formEl.addEventListener('submit', (event) => {
2023-10-18 23:50:10 +00:00
event.preventDefault()
2023-10-14 12:41:06 +00:00
if ('instances' in data && data.instances.length > 0) {
// Random instance
const n = Math.floor(Math.random() * data.instances.length)
const instanceURL = data.instances[n]
// Assign URL
const params = new URLSearchParams({
q: formEl.query.value
})
const url = `${instanceURL}?${params.toString()}`
location.assign(url)
}
})
2023-10-18 23:50:10 +00:00
function locallyGetInstances () {
if (!(storageType in window)) return []
const item = window[storageType].getItem('instances')
try {
return JSON.parse(item)
2023-10-22 15:21:39 +00:00
} catch (_err) {
2023-10-18 23:50:10 +00:00
return []
}
}
function locallySetInstances () {
if (!(storageType in window)) return
if (!('instances' in data)) return
if (data.instances.length === 0) return
window[storageType].setItem(
'instances',
JSON.stringify(data.instances)
)
}
async function remotelyGetInstances () {
const instances = await fetch('https://searx.space/data/instances.json')
.then((req) => req.json())
.then((json) => Object.entries(json.instances))
.then((entries) => entries.filter(([_url, details]) => {
if (details.network_type !== 'normal') return
2023-10-22 15:21:39 +00:00
if (details.uptime == null) return
2023-10-18 23:50:10 +00:00
if (details.uptime.uptimeDay !== 100) return
return true
}))
.then((entries) => entries.map(([url]) => url))
.catch((err) => {
console.error(err)
return []
})
2023-10-22 15:21:39 +00:00
window[storageType].setItem('timestamp', Date.now().toString())
2023-10-18 23:50:10 +00:00
return instances
}
2023-10-22 15:21:39 +00:00
// Get local instances
2023-10-18 23:50:10 +00:00
data.instances = locallyGetInstances()
2023-10-22 15:21:39 +00:00
// Fetch remote instances if necessary
const timestamp = +window[storageType].getItem('timestamp')
if (Date.now() > timestamp + 3_600_000 /* 1 hour */) {
const remoteInstances = await remotelyGetInstances()
if (remoteInstances.length > 0) {
data.instances = remoteInstances
locallySetInstances()
}
2023-10-18 23:50:10 +00:00
}
if (data.instances.length > 0) {
infoEl.textContent = `${data.instances.length} instances`
} else {
infoEl.classList.add('error')
infoEl.textContent = '0 instances'
}