From 6b05f2814ddba3b6c9b3b8c25e8abe1a0b341946 Mon Sep 17 00:00:00 2001 From: Daniel Bankhead Date: Mon, 9 Sep 2024 14:44:26 -0700 Subject: [PATCH 1/3] Revert "Revert "feat: Improve `AuthClient` Compatibility (#1641)" (#1648)" This reverts commit d2648f0698c1859e6ca6dbceba406c0ebdbd2b2b. --- gax/src/clientInterface.ts | 4 ++-- gax/src/fallback.ts | 48 +++++++++++++------------------------ gax/src/grpc.ts | 8 +++---- gax/src/iamService.ts | 4 ++-- gax/src/operationsClient.ts | 4 ++-- gax/test/unit/regapic.ts | 19 ++------------- 6 files changed, 29 insertions(+), 58 deletions(-) diff --git a/gax/src/clientInterface.ts b/gax/src/clientInterface.ts index 810892762..17d671642 100644 --- a/gax/src/clientInterface.ts +++ b/gax/src/clientInterface.ts @@ -18,7 +18,7 @@ import {GrpcClientOptions, ClientStubOptions} from './grpc'; import * as gax from './gax'; -import {GoogleAuthOptions} from 'google-auth-library'; +import {AuthClient, GoogleAuthOptions} from 'google-auth-library'; import { BundleDescriptor, LongrunningDescriptor, @@ -30,7 +30,7 @@ import * as operationProtos from '../protos/operations'; export interface ClientOptions extends GrpcClientOptions, - GoogleAuthOptions, + GoogleAuthOptions, ClientStubOptions { libName?: string; libVersion?: string; diff --git a/gax/src/fallback.ts b/gax/src/fallback.ts index e493bbb47..cfc447a59 100644 --- a/gax/src/fallback.ts +++ b/gax/src/fallback.ts @@ -20,15 +20,7 @@ import * as protobuf from 'protobufjs'; import * as gax from './gax'; import * as routingHeader from './routingHeader'; import {Status} from './status'; -import { - GoogleAuth, - OAuth2Client, - Compute, - JWT, - UserRefreshClient, - GoogleAuthOptions, - BaseExternalAccountClient, -} from 'google-auth-library'; +import {GoogleAuth, AuthClient, AnyAuthClient} from 'google-auth-library'; import {OperationsClientBuilder} from './operationsClient'; import type {GrpcClientOptions, ClientStubOptions} from './grpc'; import {GaxCall, GRPCCall} from './apitypes'; @@ -45,6 +37,7 @@ import * as IamProtos from '../protos/iam_service'; import * as LocationProtos from '../protos/locations'; import * as operationsProtos from '../protos/operations'; +export {AnyAuthClient as AuthClient}; export {FallbackServiceError}; export {PathTemplate} from './pathTemplate'; export {routingHeader}; @@ -85,15 +78,8 @@ export interface ServiceMethods { [name: string]: protobuf.Method; } -export type AuthClient = - | OAuth2Client - | Compute - | JWT - | UserRefreshClient - | BaseExternalAccountClient; - export class GrpcClient { - auth?: OAuth2Client | GoogleAuth; + auth?: AuthClient | GoogleAuth; authClient?: AuthClient; fallback: boolean; grpcVersion: string; @@ -113,13 +99,13 @@ export class GrpcClient { * gRPC-fallback version of GrpcClient * Implements GrpcClient API for a browser using grpc-fallback protocol (sends serialized protobuf to HTTP/1 $rpc endpoint). * - * @param {Object=} options.auth - An instance of OAuth2Client to use in browser, or an instance of GoogleAuth from google-auth-library + * @param {Object=} options.auth - An instance of AuthClient to use in browser, or an instance of GoogleAuth from google-auth-library * to use in Node.js. Required for browser, optional for Node.js. * @constructor */ constructor( - options: (GrpcClientOptions | {auth: OAuth2Client}) & { + options: (GrpcClientOptions | {auth: AuthClient}) & { /** * Fallback mode to use instead of gRPC. * A string is accepted for compatibility, all non-empty string values enable the HTTP REST fallback. @@ -127,19 +113,19 @@ export class GrpcClient { fallback?: boolean | string; } = {} ) { - if (!isNodeJS()) { - if (!options.auth) { - throw new Error( - JSON.stringify(options) + - 'You need to pass auth instance to use gRPC-fallback client in browser or other non-Node.js environments. Use OAuth2Client from google-auth-library.' - ); - } - this.auth = options.auth as OAuth2Client; + if (options.auth) { + this.auth = options.auth; + } else if ('authClient' in options) { + this.auth = options.authClient; + } else if (!isNodeJS()) { + throw new Error( + JSON.stringify(options) + + 'You need to pass auth instance to use gRPC-fallback client in browser or other non-Node.js environments. Provide a `GoogleAuth` or `AuthClient` instance from `google-auth-library`.' + ); } else { - this.auth = - (options.auth as GoogleAuth) || - new GoogleAuth(options as GoogleAuthOptions); + this.auth = new GoogleAuth(options as GrpcClientOptions); } + this.fallback = options.fallback ? true : false; this.grpcVersion = require('../../package.json').version; this.httpRules = (options as GrpcClientOptions).httpRules; @@ -264,7 +250,7 @@ export class GrpcClient { /** * gRPC-fallback version of createStub - * Creates a gRPC-fallback stub with authentication headers built from supplied OAuth2Client instance + * Creates a gRPC-fallback stub with authentication headers built from supplied AuthClient instance * * @param {function} CreateStub - The constructor function of the stub. * @param {Object} service - A protobufjs Service object (as returned by lookupService) diff --git a/gax/src/grpc.ts b/gax/src/grpc.ts index f3db7b735..375a923a4 100644 --- a/gax/src/grpc.ts +++ b/gax/src/grpc.ts @@ -17,7 +17,7 @@ import * as grpcProtoLoader from '@grpc/proto-loader'; import {execFile} from 'child_process'; import * as fs from 'fs'; -import {GoogleAuth, GoogleAuthOptions} from 'google-auth-library'; +import {GoogleAuth, GoogleAuthOptions, AuthClient} from 'google-auth-library'; import * as grpc from '@grpc/grpc-js'; import * as os from 'os'; import {join} from 'path'; @@ -44,8 +44,8 @@ const COMMON_PROTO_FILES: string[] = commonProtoFiles.map(file => file.replace(/[/\\]/g, path.sep) ); -export interface GrpcClientOptions extends GoogleAuthOptions { - auth?: GoogleAuth; +export interface GrpcClientOptions extends GoogleAuthOptions { + auth?: GoogleAuth; grpc?: GrpcModule; protoJson?: protobuf.Root; httpRules?: Array; @@ -113,7 +113,7 @@ export class ClientStub extends grpc.Client { } export class GrpcClient { - auth: GoogleAuth; + auth: GoogleAuth; grpc: GrpcModule; grpcVersion: string; fallback: boolean | 'rest' | 'proto'; diff --git a/gax/src/iamService.ts b/gax/src/iamService.ts index 758536775..87e096e79 100644 --- a/gax/src/iamService.ts +++ b/gax/src/iamService.ts @@ -20,7 +20,7 @@ import * as gax from './gax'; import type {GrpcClient, ClientStubOptions} from './grpc'; import type {GrpcClient as FallbackGrpcClient} from './fallback'; import {createApiCall} from './createApiCall'; -import {GoogleAuth, OAuth2Client} from 'google-auth-library'; +import {GoogleAuth, AuthClient} from 'google-auth-library'; import {ProjectIdCallback} from 'google-auth-library/build/src/auth/googleauth'; import * as routingHeader from './routingHeader'; import * as gapicConfig from './iam_policy_service_client_config.json'; @@ -40,7 +40,7 @@ export class IamClient { private _defaults: {[method: string]: gax.CallSettings}; // eslint-disable-next-line @typescript-eslint/no-explicit-any private _protos: any; - auth?: GoogleAuth | OAuth2Client; + auth?: GoogleAuth | AuthClient; descriptors: Descriptors = {page: {}, stream: {}, longrunning: {}}; innerApiCalls: {[name: string]: Function} = {}; iamPolicyStub?: Promise<{[name: string]: Function}>; diff --git a/gax/src/operationsClient.ts b/gax/src/operationsClient.ts index 2941ff436..b821b5c01 100644 --- a/gax/src/operationsClient.ts +++ b/gax/src/operationsClient.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import type {GoogleAuth, OAuth2Client} from 'google-auth-library'; +import {GoogleAuth, AuthClient} from 'google-auth-library'; import {ProjectIdCallback} from 'google-auth-library/build/src/auth/googleauth'; import type {ClientOptions, Callback} from './clientInterface'; @@ -62,7 +62,7 @@ export const ALL_SCOPES: string[] = []; * @class */ export class OperationsClient { - auth?: GoogleAuth | OAuth2Client; + auth?: GoogleAuth | AuthClient; innerApiCalls: {[name: string]: Function}; descriptor: {[method: string]: PageDescriptor}; operationsStub: Promise<{[method: string]: Function}>; diff --git a/gax/test/unit/regapic.ts b/gax/test/unit/regapic.ts index 9ebf08019..0569d21fe 100644 --- a/gax/test/unit/regapic.ts +++ b/gax/test/unit/regapic.ts @@ -24,27 +24,12 @@ import * as stream from 'stream'; import echoProtoJson = require('../fixtures/echo.json'); import {GrpcClient} from '../../src/fallback'; import * as transcoding from '../../src/transcoding'; -import {OAuth2Client} from 'google-auth-library'; -import {GrpcClientOptions} from '../../src'; +import {PassThroughClient} from 'google-auth-library'; import {StreamArrayParser} from '../../src/streamArrayParser'; -const authClient = { - async getRequestHeaders() { - return {Authorization: 'Bearer SOME_TOKEN'}; - }, -}; - -const authStub = { - async getClient() { - return authClient; - }, -}; - const opts = { - auth: authStub, + authClient: new PassThroughClient(), fallback: 'rest', // enabling REGAPIC -} as unknown as (GrpcClientOptions | {auth: OAuth2Client}) & { - fallback?: boolean | 'rest' | 'proto'; }; describe('REGAPIC', () => { From 8d2d0c90f083214969f865e53ae55a24772bd14d Mon Sep 17 00:00:00 2001 From: Daniel Bankhead Date: Mon, 9 Sep 2024 14:48:09 -0700 Subject: [PATCH 2/3] refactor: Prep for next auth major --- gax/src/clientInterface.ts | 4 ++-- gax/src/fallback.ts | 3 +-- gax/src/grpc.ts | 8 ++++---- gax/src/iamService.ts | 2 +- gax/src/operationsClient.ts | 2 +- 5 files changed, 9 insertions(+), 10 deletions(-) diff --git a/gax/src/clientInterface.ts b/gax/src/clientInterface.ts index 17d671642..810892762 100644 --- a/gax/src/clientInterface.ts +++ b/gax/src/clientInterface.ts @@ -18,7 +18,7 @@ import {GrpcClientOptions, ClientStubOptions} from './grpc'; import * as gax from './gax'; -import {AuthClient, GoogleAuthOptions} from 'google-auth-library'; +import {GoogleAuthOptions} from 'google-auth-library'; import { BundleDescriptor, LongrunningDescriptor, @@ -30,7 +30,7 @@ import * as operationProtos from '../protos/operations'; export interface ClientOptions extends GrpcClientOptions, - GoogleAuthOptions, + GoogleAuthOptions, ClientStubOptions { libName?: string; libVersion?: string; diff --git a/gax/src/fallback.ts b/gax/src/fallback.ts index cfc447a59..e0568848e 100644 --- a/gax/src/fallback.ts +++ b/gax/src/fallback.ts @@ -37,7 +37,6 @@ import * as IamProtos from '../protos/iam_service'; import * as LocationProtos from '../protos/locations'; import * as operationsProtos from '../protos/operations'; -export {AnyAuthClient as AuthClient}; export {FallbackServiceError}; export {PathTemplate} from './pathTemplate'; export {routingHeader}; @@ -79,7 +78,7 @@ export interface ServiceMethods { } export class GrpcClient { - auth?: AuthClient | GoogleAuth; + auth?: AuthClient | GoogleAuth; authClient?: AuthClient; fallback: boolean; grpcVersion: string; diff --git a/gax/src/grpc.ts b/gax/src/grpc.ts index 375a923a4..f3db7b735 100644 --- a/gax/src/grpc.ts +++ b/gax/src/grpc.ts @@ -17,7 +17,7 @@ import * as grpcProtoLoader from '@grpc/proto-loader'; import {execFile} from 'child_process'; import * as fs from 'fs'; -import {GoogleAuth, GoogleAuthOptions, AuthClient} from 'google-auth-library'; +import {GoogleAuth, GoogleAuthOptions} from 'google-auth-library'; import * as grpc from '@grpc/grpc-js'; import * as os from 'os'; import {join} from 'path'; @@ -44,8 +44,8 @@ const COMMON_PROTO_FILES: string[] = commonProtoFiles.map(file => file.replace(/[/\\]/g, path.sep) ); -export interface GrpcClientOptions extends GoogleAuthOptions { - auth?: GoogleAuth; +export interface GrpcClientOptions extends GoogleAuthOptions { + auth?: GoogleAuth; grpc?: GrpcModule; protoJson?: protobuf.Root; httpRules?: Array; @@ -113,7 +113,7 @@ export class ClientStub extends grpc.Client { } export class GrpcClient { - auth: GoogleAuth; + auth: GoogleAuth; grpc: GrpcModule; grpcVersion: string; fallback: boolean | 'rest' | 'proto'; diff --git a/gax/src/iamService.ts b/gax/src/iamService.ts index 87e096e79..63beba82f 100644 --- a/gax/src/iamService.ts +++ b/gax/src/iamService.ts @@ -40,7 +40,7 @@ export class IamClient { private _defaults: {[method: string]: gax.CallSettings}; // eslint-disable-next-line @typescript-eslint/no-explicit-any private _protos: any; - auth?: GoogleAuth | AuthClient; + auth?: GoogleAuth | AuthClient; descriptors: Descriptors = {page: {}, stream: {}, longrunning: {}}; innerApiCalls: {[name: string]: Function} = {}; iamPolicyStub?: Promise<{[name: string]: Function}>; diff --git a/gax/src/operationsClient.ts b/gax/src/operationsClient.ts index b821b5c01..ad0fd05fa 100644 --- a/gax/src/operationsClient.ts +++ b/gax/src/operationsClient.ts @@ -62,7 +62,7 @@ export const ALL_SCOPES: string[] = []; * @class */ export class OperationsClient { - auth?: GoogleAuth | AuthClient; + auth?: GoogleAuth | AuthClient; innerApiCalls: {[name: string]: Function}; descriptor: {[method: string]: PageDescriptor}; operationsStub: Promise<{[method: string]: Function}>; From 061e106053bded979e3accd431f7444c6145240c Mon Sep 17 00:00:00 2001 From: Daniel Bankhead Date: Mon, 9 Sep 2024 14:52:03 -0700 Subject: [PATCH 3/3] refactor: clean-up --- gax/src/fallback.ts | 2 +- gax/src/fallbackServiceStub.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/gax/src/fallback.ts b/gax/src/fallback.ts index e0568848e..556ea50f9 100644 --- a/gax/src/fallback.ts +++ b/gax/src/fallback.ts @@ -20,7 +20,7 @@ import * as protobuf from 'protobufjs'; import * as gax from './gax'; import * as routingHeader from './routingHeader'; import {Status} from './status'; -import {GoogleAuth, AuthClient, AnyAuthClient} from 'google-auth-library'; +import {GoogleAuth, AuthClient} from 'google-auth-library'; import {OperationsClientBuilder} from './operationsClient'; import type {GrpcClientOptions, ClientStubOptions} from './grpc'; import {GaxCall, GRPCCall} from './apitypes'; diff --git a/gax/src/fallbackServiceStub.ts b/gax/src/fallbackServiceStub.ts index bb7a1b661..3457c40d2 100644 --- a/gax/src/fallbackServiceStub.ts +++ b/gax/src/fallbackServiceStub.ts @@ -20,9 +20,9 @@ import nodeFetch from 'node-fetch'; import {Response as NodeFetchResponse} from 'node-fetch'; import {AbortController as NodeAbortController} from 'abort-controller'; +import {AuthClient} from 'google-auth-library'; import {hasWindowFetch, hasAbortController} from './featureDetection'; -import {AuthClient} from './fallback'; import {StreamArrayParser} from './streamArrayParser'; import {pipeline, PipelineSource} from 'stream';