libreredirect/src/assets/javascripts/utils.js

147 行
3.0 KiB
JavaScript

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}`
}
function getConfig() {
return new Promise(resolve => {
fetch("/config.json")
.then(response => response.text())
.then(json => {
resolve(JSON.parse(json))
return
})
})
}
function getOptions() {
return new Promise(resolve =>
browser.storage.local.get("options", r => {
resolve(r.options)
})
)
}
function getBlacklist(options) {
return new Promise(resolve => {
let url
if (options.fetchInstances == 'gitler') {
url = 'https://gitler.moe/suwako/libreredirect-instances/raw/branch/main/blacklist.json'
}
else {
resolve('disabled')
return
}
const http = new XMLHttpRequest()
http.open("GET", url, true)
http.onreadystatechange = () => {
if (http.status === 200 && http.readyState == XMLHttpRequest.DONE) {
resolve(JSON.parse(http.responseText))
return
}
}
http.onerror = () => {
resolve()
return
}
http.ontimeout = () => {
resolve()
return
}
http.send(null)
})
}
function getList(options) {
return new Promise(resolve => {
let url
if (options.fetchInstances == 'gitler') {
url = 'https://gitler.moe/suwako/libreredirect-instances/raw/branch/main/blacklist.json'
}
else {
resolve('disabled')
return
}
const http = new XMLHttpRequest()
http.open("GET", url, true)
http.onreadystatechange = () => {
if (http.status === 200 && http.readyState == XMLHttpRequest.DONE) {
resolve(JSON.parse(http.responseText))
return
}
}
http.onerror = () => {
resolve()
return
}
http.ontimeout = () => {
resolve()
return
}
http.send(null)
})
}
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)
})
}
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)
})
}
export default {
getRandomInstance,
protocolHost,
getList,
getBlacklist,
camelCase,
getConfig,
getOptions,
ping,
}