2022-10-04 22:33:53 +02:00
|
|
|
window.browser = window.browser || window.chrome
|
|
|
|
|
|
|
|
function getRandomInstance(instances) {
|
|
|
|
return instances[~~(instances.length * Math.random())]
|
|
|
|
}
|
|
|
|
|
|
|
|
function camelCase(str) {
|
|
|
|
return str.charAt(0).toUpperCase() + str.slice(1)
|
|
|
|
}
|
|
|
|
|
|
|
|
function protocolHost(url) {
|
|
|
|
if (url.username && url.password) return `${url.protocol}//${url.username}:${url.password}@${url.host}`
|
|
|
|
return `${url.protocol}//${url.host}`
|
|
|
|
}
|
|
|
|
|
2023-01-21 12:29:10 +01:00
|
|
|
function getConfig() {
|
2022-10-04 22:33:53 +02:00
|
|
|
return new Promise(resolve => {
|
2023-01-21 12:29:10 +01:00
|
|
|
fetch("/config.json")
|
|
|
|
.then(response => response.text())
|
|
|
|
.then(json => {
|
|
|
|
resolve(JSON.parse(json))
|
|
|
|
return
|
|
|
|
})
|
2022-10-04 22:33:53 +02:00
|
|
|
})
|
|
|
|
}
|
|
|
|
|
2023-01-21 12:29:10 +01:00
|
|
|
function getOptions() {
|
|
|
|
return new Promise(resolve =>
|
|
|
|
browser.storage.local.get("options", r => {
|
|
|
|
resolve(r.options)
|
2022-10-04 22:33:53 +02:00
|
|
|
})
|
2023-01-21 12:29:10 +01:00
|
|
|
)
|
2022-10-04 22:33:53 +02:00
|
|
|
}
|
|
|
|
|
2023-09-17 21:49:27 +02:00
|
|
|
function getPingCache() {
|
|
|
|
return new Promise(resolve =>
|
|
|
|
browser.storage.local.get("pingCache", r => {
|
|
|
|
resolve(r.pingCache ?? {})
|
|
|
|
})
|
|
|
|
)
|
|
|
|
}
|
|
|
|
|
2023-02-08 13:51:07 +01:00
|
|
|
function getBlacklist(options) {
|
2023-01-08 09:05:45 +01:00
|
|
|
return new Promise(resolve => {
|
2023-02-08 13:51:07 +01:00
|
|
|
let url
|
|
|
|
if (options.fetchInstances == 'github') {
|
|
|
|
url = 'https://raw.githubusercontent.com/libredirect/instances/main/blacklist.json'
|
|
|
|
}
|
|
|
|
else if (options.fetchInstances == 'codeberg') {
|
|
|
|
url = 'https://codeberg.org/LibRedirect/instances/raw/branch/main/blacklist.json'
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
resolve('disabled')
|
|
|
|
return
|
|
|
|
}
|
2023-01-08 09:05:45 +01:00
|
|
|
const http = new XMLHttpRequest()
|
2023-02-08 13:51:07 +01:00
|
|
|
http.open("GET", url, true)
|
2023-01-08 09:05:45 +01:00
|
|
|
http.onreadystatechange = () => {
|
|
|
|
if (http.status === 200 && http.readyState == XMLHttpRequest.DONE) {
|
|
|
|
resolve(JSON.parse(http.responseText))
|
|
|
|
return
|
|
|
|
}
|
|
|
|
}
|
2023-02-08 13:51:07 +01:00
|
|
|
http.onerror = () => {
|
|
|
|
resolve()
|
|
|
|
return
|
|
|
|
}
|
|
|
|
http.ontimeout = () => {
|
|
|
|
resolve()
|
|
|
|
return
|
|
|
|
}
|
2023-01-08 09:05:45 +01:00
|
|
|
http.send(null)
|
|
|
|
})
|
2023-01-06 22:24:25 +01:00
|
|
|
}
|
|
|
|
|
2023-02-08 13:51:07 +01:00
|
|
|
function getList(options) {
|
2023-01-08 09:05:45 +01:00
|
|
|
return new Promise(resolve => {
|
2023-02-08 13:51:07 +01:00
|
|
|
let url
|
|
|
|
if (options.fetchInstances == 'github') {
|
|
|
|
url = 'https://raw.githubusercontent.com/libredirect/instances/main/data.json'
|
|
|
|
}
|
|
|
|
else if (options.fetchInstances == 'codeberg') {
|
|
|
|
url = 'https://codeberg.org/LibRedirect/instances/raw/branch/main/data.json'
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
resolve('disabled')
|
|
|
|
return
|
|
|
|
}
|
2023-01-08 09:05:45 +01:00
|
|
|
const http = new XMLHttpRequest()
|
2023-02-08 13:51:07 +01:00
|
|
|
http.open("GET", url, true)
|
2023-01-08 09:05:45 +01:00
|
|
|
http.onreadystatechange = () => {
|
|
|
|
if (http.status === 200 && http.readyState == XMLHttpRequest.DONE) {
|
|
|
|
resolve(JSON.parse(http.responseText))
|
|
|
|
return
|
|
|
|
}
|
|
|
|
}
|
2023-02-08 13:51:07 +01:00
|
|
|
http.onerror = () => {
|
|
|
|
resolve()
|
|
|
|
return
|
|
|
|
}
|
|
|
|
http.ontimeout = () => {
|
|
|
|
resolve()
|
|
|
|
return
|
|
|
|
}
|
2023-01-08 09:05:45 +01:00
|
|
|
http.send(null)
|
|
|
|
})
|
2023-02-07 23:41:32 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
function pingOnce(href) {
|
|
|
|
return new Promise(async resolve => {
|
|
|
|
let started
|
|
|
|
let http = new XMLHttpRequest()
|
|
|
|
http.timeout = 5000
|
|
|
|
http.ontimeout = () => resolve(5000)
|
|
|
|
http.onerror = () => resolve()
|
|
|
|
http.onreadystatechange = () => {
|
|
|
|
if (http.readyState == 2) {
|
|
|
|
if (http.status == 200) {
|
|
|
|
let ended = new Date().getTime()
|
|
|
|
http.abort()
|
|
|
|
resolve(ended - started)
|
|
|
|
} else {
|
|
|
|
resolve(5000 + http.status)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
http.open("GET", `${href}?_=${new Date().getTime()}`, true)
|
|
|
|
started = new Date().getTime()
|
|
|
|
http.send(null)
|
|
|
|
})
|
|
|
|
}
|
2023-01-08 09:05:45 +01:00
|
|
|
|
2023-02-07 23:41:32 +01:00
|
|
|
function ping(href) {
|
|
|
|
return new Promise(async resolve => {
|
|
|
|
let average = 0
|
|
|
|
let time
|
|
|
|
for (let i = 0; i < 3; i++) {
|
|
|
|
time = await pingOnce(href)
|
|
|
|
if (i == 0) continue
|
|
|
|
if (time >= 5000) {
|
|
|
|
resolve(time)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
average += time
|
|
|
|
}
|
|
|
|
average = parseInt(average / 3)
|
|
|
|
resolve(average)
|
|
|
|
})
|
2023-01-06 22:24:25 +01:00
|
|
|
}
|
|
|
|
|
2022-10-04 22:33:53 +02:00
|
|
|
export default {
|
|
|
|
getRandomInstance,
|
|
|
|
protocolHost,
|
2023-01-06 22:24:25 +01:00
|
|
|
getList,
|
|
|
|
getBlacklist,
|
2022-10-04 22:33:53 +02:00
|
|
|
camelCase,
|
2023-01-21 12:29:10 +01:00
|
|
|
getConfig,
|
2023-02-07 23:41:32 +01:00
|
|
|
getOptions,
|
2023-09-17 21:49:27 +02:00
|
|
|
getPingCache,
|
2023-02-07 23:41:32 +01:00
|
|
|
ping,
|
2022-10-04 22:33:53 +02:00
|
|
|
}
|