From b9130b239dd2e9921b309cd8c3c5c5129bea0486 Mon Sep 17 00:00:00 2001 From: Alexander Fenster Date: Wed, 30 Jan 2019 12:18:18 -0800 Subject: [PATCH] fix: use getRequestHeaders if available --- packages/grpc-js/src/index.ts | 36 ++++++++++++++++++++++++++--------- 1 file changed, 27 insertions(+), 9 deletions(-) diff --git a/packages/grpc-js/src/index.ts b/packages/grpc-js/src/index.ts index f7a22a0d..1208dc4b 100644 --- a/packages/grpc-js/src/index.ts +++ b/packages/grpc-js/src/index.ts @@ -37,6 +37,7 @@ export interface OAuth2Client { getRequestMetadata: (url: string, callback: (err: Error|null, headers?: { Authorization: string }) => void) => void; + getRequestHeaders: (url?: string) => Promise<{Authorization: string}>; } /**** Client Credentials ****/ @@ -49,22 +50,39 @@ export const credentials = mixin( * @param googleCredentials The authentication client to use. * @return The resulting CallCredentials object. */ - createFromGoogleCredential: (googleCredentials: OAuth2Client): - CallCredentials => { - return CallCredentials.createFromMetadataGenerator( - (options, callback) => { + createFromGoogleCredential: ( + googleCredentials: OAuth2Client): CallCredentials => { + return CallCredentials.createFromMetadataGenerator( + (options, callback) => { + // google-auth-library pre-v2.0.0 does not have getRequestHeaders + // but has getRequestMetadata, which is deprecated in v2.0.0 + let getHeaders: Promise<{Authorization: string}>; + if (typeof googleCredentials.getRequestHeaders === 'function') { + getHeaders = + googleCredentials.getRequestHeaders(options.service_url); + } else { + getHeaders = new Promise((resolve, reject) => { googleCredentials.getRequestMetadata( options.service_url, (err, headers) => { if (err) { - callback(err); + reject(err); return; } - const metadata = new Metadata(); - metadata.add('authorization', headers!.Authorization); - callback(null, metadata); + resolve(headers); }); }); - }, + } + getHeaders.then( + headers => { + const metadata = new Metadata(); + metadata.add('authorization', headers.Authorization); + callback(null, metadata); + }, + err => { + callback(err); + }); + }); + }, /** * Combine a ChannelCredentials with any number of CallCredentials into a