import * as stream from 'stream' ; import { JWTInput } from './credentials' ; import { GetTokenResponse , OAuth2Client , RefreshOptions } from './oauth2client' ; export interface UserRefreshClientOptions extends RefreshOptions { clientId ? : string ; clientSecret ? : string ; refreshToken ? : string ; } export class UserRefreshClient extends OAuth2Client { _refreshToken ? : string | null ; param clientId param clientSecret param refreshToken constructor ( clientId ? , clientSecret ? , refreshToken ? ) ; constructor ( options ) ; constructor ( clientId ? , clientSecret ? , refreshToken ? ) ; constructor ( optionsOrClientId ? , clientSecret ? , refreshToken ? , eagerRefreshThresholdMillis ? , forceRefreshOnFailure ? ) { const opts = optionsOrClientId && typeof optionsOrClientId === 'object' ? optionsOrClientId : { clientId : optionsOrClientId , clientSecret , refreshToken , eagerRefreshThresholdMillis , forceRefreshOnFailure , } ; super ( { clientId : opts . clientId , clientSecret : opts . clientSecret , eagerRefreshThresholdMillis : opts . eagerRefreshThresholdMillis , forceRefreshOnFailure : opts . forceRefreshOnFailure , } ) ; this . _refreshToken = opts . refreshToken ; this . credentials . refresh_token = opts . refreshToken ; } param refreshToken param callback protected async refreshTokenNoCache ( refreshToken ? ) { return super . refreshTokenNoCache ( this . _refreshToken ) ; } param json fromJSON ( json ) { if ( ! json ) { throw new Error ( 'Must pass in a JSON object containing the user refresh token' ) ; } if ( json . type !== 'authorized_user' ) { throw new Error ( 'The incoming JSON object does not have the "authorized_user" type' ) ; } if ( ! json . client_id ) { throw new Error ( 'The incoming JSON object does not contain a client_id field' ) ; } if ( ! json . client_secret ) { throw new Error ( 'The incoming JSON object does not contain a client_secret field' ) ; } if ( ! json . refresh_token ) { throw new Error ( 'The incoming JSON object does not contain a refresh_token field' ) ; } this . _clientId = json . client_id ; this . _clientSecret = json . client_secret ; this . _refreshToken = json . refresh_token ; this . credentials . refresh_token = json . refresh_token ; this . quotaProjectId = json . quota_project_id ; } param inputStream param callback fromStream ( inputStream ) ; fromStream ( inputStream , callback ) ; fromStream ( inputStream , callback ? ) { if ( callback ) { this . fromStreamAsync ( inputStream ) . then ( ( ) => callback ( ) , callback ) ; } else { return this . fromStreamAsync ( inputStream ) ; } } private async fromStreamAsync ( inputStream ) { return new Promise < void > ( ( resolve , reject ) => { if ( ! inputStream ) { return reject ( new Error ( 'Must pass in a stream containing the user refresh token.' ) ) ; } let s = '' ; inputStream . setEncoding ( 'utf8' ) . on ( 'error' , reject ) . on ( 'data' , chunk => ( s += chunk ) ) . on ( 'end' , ( ) => { try { const data = JSON . parse ( s ) ; this . fromJSON ( data ) ; return resolve ( ) ; } catch ( err ) { return reject ( err ) ; } } ) ; } ) ; } }