4
4
*--------------------------------------------------------------------------------------------*/
5
5
import * as semver from 'semver' ;
6
6
import fetch from 'node-fetch' ;
7
+ import Log from './common/logger' ;
7
8
8
9
export class GitpodVersion {
9
- static DEFAULT_VERSION = '9999.99.99' ;
10
+ static MAX_VERSION = '9999.99.99' ;
11
+ static MIN_VERSION = '0.0.0' ;
12
+
13
+ static Max = new GitpodVersion ( GitpodVersion . MAX_VERSION ) ;
14
+ static Min = new GitpodVersion ( GitpodVersion . MIN_VERSION ) ;
10
15
11
16
readonly version : string ;
12
17
readonly raw : string ;
13
18
14
19
constructor ( gitpodVersion : string = '' ) {
15
20
this . raw = gitpodVersion ;
16
- this . version = GitpodVersion . DEFAULT_VERSION ;
21
+ this . version = GitpodVersion . MIN_VERSION ;
17
22
18
23
if ( gitpodVersion . startsWith ( 'release-' ) ) {
19
24
gitpodVersion = gitpodVersion . replace ( 'release-' , '' ) ;
@@ -32,39 +37,61 @@ export class GitpodVersion {
32
37
}
33
38
34
39
let cacheGitpodVersion : { host : string ; version : GitpodVersion } | undefined ;
35
- async function getOrFetchVersionInfo ( serviceUrl : string ) {
40
+ async function getOrFetchVersionInfo ( serviceUrl : string , logger : Log ) {
36
41
if ( serviceUrl === 'https://gitpod.io' ) {
37
- return undefined ;
42
+ logger . info ( `Using SaaS, constant Max version ${ GitpodVersion . Max . version } ` ) ;
43
+ return {
44
+ // SaaS default allow all features, should proper handle SaaS feature support if needed in the future
45
+ version : GitpodVersion . Max ,
46
+ } ;
38
47
}
39
48
40
49
if ( serviceUrl === cacheGitpodVersion ?. host ) {
50
+ logger . info ( `Using cached version ${ cacheGitpodVersion . version } for ${ serviceUrl } ` ) ;
41
51
return cacheGitpodVersion ;
42
52
}
43
53
44
- let gitpodRawVersion : string ;
45
- try {
46
- const versionEndPoint = `${ serviceUrl } /api/version` ;
47
- const versionResponse = await fetch ( versionEndPoint ) ;
48
- if ( ! versionResponse . ok ) {
49
- return undefined ;
54
+ const fetchVersion = async ( times : number = 3 ) : Promise < string | undefined > => {
55
+ try {
56
+ const versionEndPoint = `${ serviceUrl } /api/version` ;
57
+ const resp = await fetch ( versionEndPoint , { timeout : 1500 } ) ;
58
+ if ( ! resp . ok ) {
59
+ throw new Error ( `Response with ${ resp . status } ${ resp . statusText } ` ) ;
60
+ }
61
+ return await resp . text ( ) ;
62
+ } catch ( e ) {
63
+ logger . error ( `Failed to fetch version with from: ${ serviceUrl } left attempt: ${ times - 1 } ` , e ) ;
64
+ if ( times - 1 > 0 ) {
65
+ await new Promise ( resolve => setTimeout ( resolve , 1000 ) ) ;
66
+ return fetchVersion ( times - 1 ) ;
67
+ } else {
68
+ return undefined ;
69
+ }
50
70
}
71
+ } ;
51
72
52
- gitpodRawVersion = await versionResponse . text ( ) ;
53
- } catch ( e ) {
54
- return undefined ;
73
+ const gitpodRawVersion = await fetchVersion ( ) ;
74
+ if ( ! gitpodRawVersion ) {
75
+ logger . info ( `Failed to fetch version from: ${ serviceUrl } fallback to Min: ${ GitpodVersion . Min . version } ` ) ;
76
+ return {
77
+ host : serviceUrl ,
78
+ version : GitpodVersion . Min ,
79
+ } ;
55
80
}
56
81
82
+ logger . info ( `Got version from: ${ serviceUrl } version: ${ gitpodRawVersion } ` ) ;
83
+
57
84
cacheGitpodVersion = {
58
85
host : serviceUrl ,
59
86
version : new GitpodVersion ( gitpodRawVersion )
60
87
} ;
61
88
return cacheGitpodVersion ;
62
89
}
63
90
64
- export async function getGitpodVersion ( gitpodHost : string ) {
91
+ export async function getGitpodVersion ( gitpodHost : string , logger : Log ) {
65
92
const serviceUrl = new URL ( gitpodHost ) . toString ( ) . replace ( / \/ $ / , '' ) ;
66
- const versionInfo = await getOrFetchVersionInfo ( serviceUrl ) ;
67
- return versionInfo ? .version || new GitpodVersion ( ) ;
93
+ const versionInfo = await getOrFetchVersionInfo ( serviceUrl , logger ) ;
94
+ return versionInfo . version || new GitpodVersion ( ) ;
68
95
}
69
96
70
97
type Feature = |
0 commit comments