@@ -5,8 +5,8 @@ import { CredentialsProvider } from "./index.js";
5
5
import { dbg } from "./dbg.js" ;
6
6
7
7
export type MetadataCredentialsToken = {
8
- access_token : string
9
- expires_in : number
8
+ value : string
9
+ expired_at : number
10
10
}
11
11
12
12
export type MetadataCredentials = {
@@ -30,6 +30,13 @@ export class MetadataCredentialsProvider extends CredentialsProvider {
30
30
#flavor: string = 'Google'
31
31
#endpoint: string = 'http://169.254.169.254/computeMetadata/v1/instance/service-accounts/default/token'
32
32
33
+ /**
34
+ * Creates an instance of `MetadataCredentialsProvider`.
35
+ *
36
+ * @param credentials - An optional object containing metadata credentials.
37
+ * @param credentials.flavor - The metadata flavor (default: 'Google').
38
+ * @param credentials.endpoint - The metadata endpoint URL (default: 'http://169.254.169.254/computeMetadata/v1/instance/service-accounts/default/token').
39
+ */
33
40
constructor ( credentials : MetadataCredentials = { } ) {
34
41
super ( )
35
42
if ( credentials . flavor ) {
@@ -52,8 +59,8 @@ export class MetadataCredentialsProvider extends CredentialsProvider {
52
59
* @throws Will throw an error if the token fetch fails, the response is not OK, or the content type is incorrect.
53
60
*/
54
61
async getToken ( force ?: boolean , signal ?: AbortSignal ) : Promise < string > {
55
- if ( ! force && this . #token && this . #token. expires_in > Date . now ( ) / 1000 ) {
56
- return this . #token. access_token
62
+ if ( ! force && this . #token && this . #token. expired_at > Date . now ( ) ) {
63
+ return this . #token. value
57
64
}
58
65
59
66
if ( this . #promise) {
@@ -81,14 +88,18 @@ export class MetadataCredentialsProvider extends CredentialsProvider {
81
88
throw new Error ( `Failed to fetch token: ${ response . status } ${ response . statusText } ` )
82
89
}
83
90
84
- this . #token = JSON . parse ( await response . text ( ) )
85
-
86
- if ( ! this . #token! . access_token ) {
87
- dbg ( 'missing token in response, response=%O' , this . #token)
91
+ let token = JSON . parse ( await response . text ( ) ) as { access_token ?: string , expires_in ?: number }
92
+ if ( ! token . access_token ) {
93
+ dbg ( 'missing access token in response, response=%O' , token )
88
94
throw new Error ( 'No access token exists in response' ) ;
89
95
}
90
96
91
- return this . #token! . access_token
97
+ this . #token = {
98
+ value : token . access_token ,
99
+ expired_at : Date . now ( ) + ( token . expires_in ?? 3600 ) * 1000 ,
100
+ }
101
+
102
+ return this . #token. value
92
103
} ) . finally ( ( ) => {
93
104
this . #promise = null
94
105
} )
0 commit comments