feat(update): 优先使用代理更新失败时切回去

This commit is contained in:
shanmite 2022-01-16 20:12:35 +08:00
parent 86e6b7dbc9
commit dd1b1db76a
3 changed files with 59 additions and 47 deletions

View File

@ -2,13 +2,25 @@ const { send } = require('./net/http')
const { strToJson, download, try_for_each } = require('./utils') const { strToJson, download, try_for_each } = require('./utils')
const { version, checkVersion, log } = require('./utils') const { version, checkVersion, log } = require('./utils')
const
platform = new Map([
['win32', 'win'],
['linux', 'linux'],
['darwin', 'macos']
]).get(process.platform),
arch = new Map([
['x64', 'x64'],
['arm', 'armv7'],
['arm64', 'arm64']
]).get(process.arch);
/** /**
* 获取下载链接 * 获取下载链接
* @param {string} owner * @param {string} owner
* @param {string} repo * @param {string} repo
* @returns {Promise<{ download_url: string[], text: string }>} * @returns {Promise<{ tag_name:string, assets:Object, text:string }>}
*/ */
function getLatestReleaseDownloadUrl(owner, repo) { function getLatestRelease(owner, repo) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
send({ send({
url: `https://api.github.com/repos/${owner}/${repo}/releases/latest`, url: `https://api.github.com/repos/${owner}/${repo}/releases/latest`,
@ -19,37 +31,9 @@ function getLatestReleaseDownloadUrl(owner, repo) {
retry: false retry: false
}, },
success: ({ body }) => { success: ({ body }) => {
const { tag_name, assets, body: text } = strToJson(body) const release = strToJson(body);
if (tag_name) { if (release.tag_name) {
if (checkVersion(version) < checkVersion(tag_name)) { resolve(release)
const platform = new Map([
['win32', 'win'],
['linux', 'linux'],
['darwin', 'macos']
]).get(process.platform)
const arch = new Map([
['x64', 'x64'],
['arm', 'armv7'],
['arm64', 'arm64']
]).get(process.arch)
if (platform && arch) {
try {
const download_url = assets
.filter(({ name }) => name.includes(platform) && name.includes(arch))
.map(({ browser_download_url }) => browser_download_url)
if (!download_url.length) {
reject(`未找到能在此平台(${process.platform})-(${process.arch})上运行的版本`)
}
resolve({ download_url, text })
} catch (err) {
reject(err)
}
} else {
reject(`未找到能在此平台(${process.platform})-(${process.arch})上运行的版本`)
}
} else {
reject('当前已是最新版本')
}
} else { } else {
reject(body) reject(body)
} }
@ -61,21 +45,48 @@ function getLatestReleaseDownloadUrl(owner, repo) {
}); });
} }
/**
* @param {string} releases
* @return {boolean}
*/
function checkPlatform(releases) {
return releases.includes(platform)
&& releases.includes(arch)
}
/** /**
* 半自动更新 * 半自动更新
*/ */
async function update() { async function update() {
try { try {
const { download_url, text } = await getLatestReleaseDownloadUrl('shanmiteko', 'LotteryAutoScript') const { tag_name, assets, body: text } = await getLatestRelease('shanmiteko', 'LotteryAutoScript')
await try_for_each(download_url.entries(), async ([i, url]) => { if (checkVersion(version) < checkVersion(tag_name)) {
let proxy_url = new URL(url) const download_url = assets
proxy_url.host = 'download.fastgit.org' .filter(({ name }) => checkPlatform(name))
await download(proxy_url.href, `latest_version${i}.zip`) .map(({ browser_download_url }) => browser_download_url)
return false if (download_url.length) {
}) const proxy_host = ['download.fastgit.org']
await try_for_each(download_url.entries(), async ([i, url]) => {
log.info('自动下载', '成功下载到当前目录') let proxy_url = new URL(url)
log.info('更新说明', '\n' + text + '\n') proxy_url.host = proxy_host[0]
log.warn('自动下载', `切换代理${proxy_host[0]}`)
await download(proxy_url.href, `latest_version${i}.zip`)
.catch(async err => {
log.error('自动下载', err)
proxy_url.host = 'github.com'
log.warn('自动下载', `使用原始链接github.com`)
await download(proxy_url.href, `latest_version${i}.zip`)
})
return false
})
log.info('自动下载', '成功下载到当前目录')
log.info('更新说明', '\n' + text + '\n')
} else {
throw `未找到能在此平台(${process.platform})-(${process.arch})上运行的版本,建议以源码运行`
}
} else {
throw '当前已是最新版本'
}
} catch (error) { } catch (error) {
log.error('更新脚本', error) log.error('更新脚本', error)
} }

View File

@ -248,12 +248,13 @@ const utils = {
redirect: true, redirect: true,
retry: false retry: false
}, },
success: ({ resStream }) => { success: ({ headers, resStream }) => {
const total_len = Number(headers["content-length"]);
let recv_length = 0; let recv_length = 0;
const wtbs = fs.createWriteStream(file_name); const wtbs = fs.createWriteStream(file_name);
resStream.on('data', chuck => { resStream.on('data', chuck => {
recv_length += chuck.length recv_length += chuck.length
utils.log.proPrint(`已收到:${recv_length} Bytes`) utils.log.proPrint(total_len ? `已下载${(recv_length * 100 / total_len + '').slice(0, 5)}%` : `已收到:${recv_length} Bytes`)
}) })
resStream.pipe(wtbs) resStream.pipe(wtbs)
wtbs.on('finish', () => { wtbs.on('finish', () => {
@ -261,7 +262,7 @@ const utils = {
resolve() resolve()
}).on('error', error => { }).on('error', error => {
wtbs.destroy() wtbs.destroy()
resolve(error) reject(error)
}) })
}, },
failure: error => { failure: error => {

View File

@ -88,7 +88,7 @@ async function main() {
} }
} else { } else {
log.error('Cookie已失效', '切换账号时不要点击退出账号而应直接删除Cookie退出') log.error('Cookie已失效', '切换账号时不要点击退出账号而应直接删除Cookie退出')
return '' return
} }
} else { } else {
return '请查看README文件, 在env.js指定位置填入cookie' return '请查看README文件, 在env.js指定位置填入cookie'