@@ -9,9 +9,21 @@ import {upgrade} from "@renderer/customize";
99
1010const CACHE_DURATION = Duration . Hour ;
1111
12- let latestVersion : string = "" ;
13- let latestDownloadUrl : string = "" ;
14- let lastCheckTimestamp : number = 0 ;
12+ interface UpdateInfo {
13+ referer : string ,
14+ downloadPageUrl : string ,
15+ latestVersion : string ,
16+ latestDownloadUrl : string ,
17+ lastCheckTimestamp : number ,
18+ }
19+
20+ let cachedUpdateInfo : UpdateInfo = {
21+ referer : "" ,
22+ downloadPageUrl : "" ,
23+ latestVersion : "" ,
24+ latestDownloadUrl : "" ,
25+ lastCheckTimestamp : 0 ,
26+ }
1527
1628function compareVersion ( current : string , latest : string ) {
1729 const arr = current . split ( "." ) ;
@@ -33,27 +45,60 @@ function compareVersion(current: string, latest: string) {
3345}
3446
3547export async function fetchReleaseNote ( version : string ) : Promise < string > {
36- const resp = await fetch ( `${ upgrade . release_notes_url } ${ version } .md` ) ;
37- if ( Math . floor ( resp . status / 100 ) !== 2 ) {
48+ const resp = await new Promise < request . Response > ( ( resolve , reject ) => {
49+ request . get (
50+ {
51+ url : `${ upgrade . release_notes_url } ${ version } .md` ,
52+ } ,
53+ ( error , response ) => {
54+ if ( error ) {
55+ reject ( error ) ;
56+ return ;
57+ }
58+ resolve ( response ) ;
59+ } ) ;
60+ } ) ;
61+ if ( Math . floor ( resp . statusCode / 100 ) !== 2 ) {
3862 return "Not Found" ;
3963 }
40- return resp . text ( ) ;
64+ return resp . body ;
65+ }
66+
67+
68+ export async function fetchUpdate ( ) : Promise < UpdateInfo > {
69+ if ( Date . now ( ) - cachedUpdateInfo . lastCheckTimestamp <= CACHE_DURATION ) {
70+ return cachedUpdateInfo ;
71+ }
72+ const resp = await new Promise < request . Response > ( ( resolve , reject ) => {
73+ request . get (
74+ {
75+ url : upgrade . check_url ,
76+ } ,
77+ ( error , response ) => {
78+ if ( error || Math . floor ( response . statusCode / 100 ) !== 2 ) {
79+ reject ( error ) ;
80+ return ;
81+ }
82+ resolve ( response ) ;
83+ }
84+ ) ;
85+ } ) ;
86+ const respJson = JSON . parse ( resp . body ) ;
87+ cachedUpdateInfo = {
88+ referer : respJson . referer ,
89+ downloadPageUrl : respJson [ "download_page" ] ,
90+ latestVersion : respJson . version ,
91+ latestDownloadUrl : respJson . downloads [ process . platform ] [ process . arch ] ,
92+ lastCheckTimestamp : 0 ,
93+ } ;
94+ return cachedUpdateInfo ;
4195}
4296
4397/**
4498 * return null if there isn't a new version
4599 */
46100export async function fetchLatestVersion ( currentVersion : string ) : Promise < string | null > {
47- if ( Date . now ( ) - lastCheckTimestamp <= CACHE_DURATION ) {
48- return compareVersion ( currentVersion , latestVersion ) < 0
49- ? latestVersion
50- : null ;
51- }
52- const resp = await fetch ( upgrade . check_url ) ;
53- const respJson = await resp . json ( ) ;
54- lastCheckTimestamp = Date . now ( ) ;
55- latestVersion = respJson . version ;
56- latestDownloadUrl = respJson . downloads [ process . platform ] [ process . arch ] ;
101+ const { latestVersion} = await fetchUpdate ( ) ;
57102 return compareVersion ( currentVersion , latestVersion ) < 0
58103 ? latestVersion
59104 : null ;
@@ -102,9 +147,7 @@ export async function downloadLatestVersion({
102147 // if return false will stop download
103148 onProgress : ( loaded : number , total : number ) => boolean ,
104149} ) : Promise < string > {
105- if ( ! latestDownloadUrl || Date . now ( ) - lastCheckTimestamp <= CACHE_DURATION ) {
106- await fetchLatestVersion ( "" ) ;
107- }
150+ const { latestDownloadUrl, referer} = await fetchUpdate ( ) ;
108151
109152 const fileName = decodeURIComponent ( path . basename ( latestDownloadUrl ) ) ;
110153 const to = path . join ( toDirectory , fileName ) ;
@@ -125,7 +168,12 @@ export async function downloadLatestVersion({
125168
126169 // get remote file info
127170 const response = await new Promise < Response > ( ( resolve , reject ) => {
128- request . head ( latestDownloadUrl )
171+ request . head ( {
172+ url : latestDownloadUrl ,
173+ headers : {
174+ "Referer" : referer ,
175+ } ,
176+ } )
129177 . on ( "error" , reject )
130178 . on ( "response" , resolve ) ;
131179 } ) ;
@@ -146,16 +194,21 @@ export async function downloadLatestVersion({
146194
147195 // download file
148196 let downloadedSize = tempFileSize ;
149- const fileWriter = fs . createWriteStream ( downloadedFilePath , {
150- // old code is `flags: ...`. maybe it's a mistake
151- // mode: fs.constants.O_CREAT | fs.constants.O_WRONLY | fs.constants.O_NONBLOCK,
152- start : downloadedSize ,
153- } ) ;
154197 await new Promise ( ( resolve , reject ) => {
198+ const fileWriter = fs . createWriteStream ( downloadedFilePath , {
199+ start : downloadedSize ,
200+ } ) ;
201+ fileWriter . on ( "error" , err => {
202+ if ( req ) {
203+ req . abort ( ) ;
204+ }
205+ reject ( err ) ;
206+ } ) ;
155207 const req = request ( {
156208 url : latestDownloadUrl ,
157209 headers : {
158- "Range" : `bytes=${ downloadedSize } -`
210+ "Range" : `bytes=${ downloadedSize } -` ,
211+ "Referer" : referer ,
159212 } ,
160213 } ) ;
161214 req . on ( "error" , reject )
0 commit comments