@@ -163,6 +163,18 @@ export interface TuyaCustomBearerCredentialConfiguration {
163163 secret : string ;
164164}
165165
166+ interface TokenResponse {
167+ success ?: boolean ;
168+ result ?: {
169+ // eslint-disable-next-line camelcase
170+ access_token ?: string ;
171+ // eslint-disable-next-line camelcase
172+ refresh_token ?: string ;
173+ // eslint-disable-next-line camelcase
174+ expire_time ?: number ;
175+ } ;
176+ }
177+
166178export class TuyaCustomBearer extends Credential {
167179 protected key : string ;
168180 protected secret : string ;
@@ -184,14 +196,15 @@ export class TuyaCustomBearer extends Credential {
184196 await this . requestAndRefreshToken ( isTokenExpired ) ;
185197
186198 const url : string = request . url ;
187- const body = request . body ? request . body . read ( ) . toString ( ) : "" ;
188- const headers = this . getHeaders ( true , request . headers . raw ( ) , body , url , request . method ) ;
199+ const body = request . body ?. read ( ) . toString ( ) ;
200+ const method = request . method ;
201+ const headers = this . getHeaders ( true , request . headers . raw ( ) , body , url , method ) ;
189202 Object . assign ( headers , request . headers . raw ( ) ) ;
190- return new Request ( url , { method : request . method , body : body !== "" ? body : undefined , headers } ) ;
203+ return new Request ( url , { method, body : body !== "" ? body : undefined , headers } ) ;
191204 }
192205
193206 protected async requestAndRefreshToken ( refresh : boolean ) : Promise < void > {
194- const headers = this . getHeaders ( false , { } , "" ) ;
207+ const headers = this . getHeaders ( false , { } ) ;
195208 const request = {
196209 headers,
197210 method : "GET" ,
@@ -200,36 +213,51 @@ export class TuyaCustomBearer extends Credential {
200213 if ( refresh ) {
201214 url = `${ this . baseUri } /token/${ this . refreshToken } ` ;
202215 }
203- const data = await ( await fetch ( url , request ) ) . json ( ) ;
204- if ( data . success ) {
205- this . token = data . result . access_token ;
206- this . refreshToken = data . result . refresh_token ;
207- this . expireTime = new Date ( Date . now ( ) + data . result . expire_time * 1000 ) ;
216+ const data : TokenResponse = await ( await fetch ( url , request ) ) . json ( ) ;
217+ const success = data . success ?? false ;
218+
219+ if ( success ) {
220+ this . token = data . result ?. access_token ;
221+ this . refreshToken = data . result ?. refresh_token ;
222+
223+ const expireTime = data . result ?. expire_time ;
224+ if ( expireTime != null ) {
225+ this . expireTime = new Date ( Date . now ( ) + expireTime * 1000 ) ;
226+ }
208227 } else {
209228 throw new Error ( "token fetch failed" ) ;
210229 }
211230 }
212231
213- private getHeaders ( NormalRequest : boolean , headers : unknown , body : string , url ?: string , method ?: string ) {
232+ private getHeaders ( NormalRequest : boolean , headers : unknown , body ? : string , url ?: string , method ?: string ) {
214233 const requestTime = Date . now ( ) . toString ( ) ;
215234 const replaceUri = this . baseUri . replace ( "/v1.0" , "" ) ;
216- const _url = url ? url . replace ( ` ${ replaceUri } ` , "" ) : undefined ;
235+ const _url = url ? .replace ( replaceUri , "" ) ;
217236 const sign = this . requestSign ( NormalRequest , requestTime , body , _url , method ) ;
218237 return {
219238 t : requestTime ,
220239 client_id : this . key ,
221240 sign_method : "HMAC-SHA256" ,
222241 sign,
223- access_token : this . token || "" ,
242+ access_token : this . token ?? "" ,
224243 } ;
225244 }
226245
227- private requestSign ( NormalRequest : boolean , requestTime : string , body : string , path = "" , method ?: string ) : string {
228- const bodyHash = crypto . createHash ( "sha256" ) . update ( body ) . digest ( "hex" ) ;
246+ private requestSign (
247+ NormalRequest : boolean ,
248+ requestTime : string ,
249+ body ?: string ,
250+ path = "" ,
251+ method ?: string
252+ ) : string {
253+ const bodyHash = crypto
254+ . createHash ( "sha256" )
255+ . update ( body ?? "" )
256+ . digest ( "hex" ) ;
229257 let signUrl = "/v1.0/token?grant_type=1" ;
230258 const headerString = "" ;
231259 let useToken = "" ;
232- const _method = method || "GET" ;
260+ const _method = method ?? "GET" ;
233261 if ( NormalRequest ) {
234262 useToken = this . token ?? "" ;
235263 const pathQuery = queryString . parse ( path . split ( "?" ) [ 1 ] ) ;
0 commit comments