Skip to content
This repository was archived by the owner on Dec 8, 2021. It is now read-only.

Commit 1815d40

Browse files
alexander-fensterJustinBeckwith
authored andcommitted
feat: allow passing grpc in service constructor (#241)
1 parent a2e03d3 commit 1815d40

File tree

2 files changed

+78
-40
lines changed

2 files changed

+78
-40
lines changed

src/service.ts

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,10 @@ interface GrpcOptions {
6161
* Configuration object for GrpcService.
6262
*/
6363
export interface GrpcServiceConfig extends ServiceConfig {
64+
/** gRPC implementation to use. By default, uses `@grpc/grpc-js`. */
65+
grpc?: typeof grpc;
66+
/** gRPC version, to send in headers */
67+
grpcVersion?: string;
6468
/** Metadata to send with every request. */
6569
grpcMetadata: grpc.Metadata;
6670
/** The root directory where proto files live. */
@@ -329,6 +333,8 @@ export class ObjectToStructConverter {
329333
}
330334

331335
export class GrpcService extends Service {
336+
grpc?: typeof grpc;
337+
grpcVersion?: string;
332338
grpcCredentials?: {};
333339
grpcMetadata?: {add: Function};
334340
maxRetries?: number;
@@ -366,22 +372,27 @@ export class GrpcService extends Service {
366372
// https://github.com/GoogleCloudPlatform/google-cloud-node/pull/1137#issuecomment-193315047
367373
return global['GCLOUD_SANDBOX_ENV'];
368374
}
369-
375+
if (config.grpc) {
376+
this.grpc = config.grpc;
377+
this.grpcVersion = config.grpcVersion || 'grpc/unknown';
378+
} else {
379+
this.grpc = grpc;
380+
this.grpcVersion =
381+
'grpc-js/' + require('@grpc/grpc-js/package.json').version;
382+
}
370383
if (config.customEndpoint) {
371-
this.grpcCredentials = grpc.credentials.createInsecure();
384+
this.grpcCredentials = this.grpc.credentials.createInsecure();
372385
}
373386

374-
this.grpcMetadata = new grpc.Metadata();
375-
387+
this.grpcMetadata = new this.grpc.Metadata();
376388
this.grpcMetadata.add(
377389
'x-goog-api-client',
378390
[
379391
'gl-node/' + process.versions.node,
380392
'gccl/' + config.packageJson.version,
381-
'grpc-js/' + require('@grpc/grpc-js/package.json').version,
393+
this.grpcVersion,
382394
].join(' ')
383395
);
384-
385396
if (config.grpcMetadata) {
386397
for (const prop in config.grpcMetadata) {
387398
if (config.grpcMetadata.hasOwnProperty(prop)) {
@@ -967,9 +978,9 @@ export class GrpcService extends Service {
967978
*/
968979
private getGrpcCredentials_(callback) {
969980
this.authClient.getClient().then(client => {
970-
const credentials = grpc.credentials.combineChannelCredentials(
971-
grpc.credentials.createSsl(),
972-
grpc.credentials.createFromGoogleCredential(client)
981+
const credentials = this.grpc!.credentials.combineChannelCredentials(
982+
this.grpc!.credentials.createSsl(),
983+
this.grpc!.credentials.createFromGoogleCredential(client)
973984
);
974985
if (!this.projectId || this.projectId === '{{projectId}}') {
975986
this.projectId = client.projectId!;

test/service.ts

Lines changed: 58 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -71,35 +71,6 @@ class FakeMetadata {
7171
// tslint:disable-next-line:variable-name
7272
let GrpcMetadataOverride;
7373
let grpcProtoLoadOverride: (typeof grpcProtoLoader.loadSync) | null = null;
74-
const fakeGrpc = {
75-
Metadata: FakeMetadata,
76-
credentials: {
77-
combineChannelCredentials() {
78-
return {
79-
name: 'combineChannelCredentials',
80-
args: arguments,
81-
};
82-
},
83-
createSsl() {
84-
return {
85-
name: 'createSsl',
86-
args: arguments,
87-
};
88-
},
89-
createFromGoogleCredential() {
90-
return {
91-
name: 'createFromGoogleCredential',
92-
args: arguments,
93-
};
94-
},
95-
createInsecure() {
96-
return {
97-
name: 'createInsecure',
98-
args: arguments,
99-
};
100-
},
101-
},
102-
};
10374

10475
const fakeGrpcProtoLoader = {
10576
loadSync(filename: string, options?: grpcProtoLoader.Options) {
@@ -146,10 +117,12 @@ describe('GrpcService', () => {
146117
maxRetries: 3,
147118
};
148119

120+
const grpcJsVersion = require('@grpc/grpc-js/package.json').version;
121+
149122
const EXPECTED_API_CLIENT_HEADER = [
150123
'gl-node/' + process.versions.node,
151124
'gccl/' + CONFIG.packageJson.version,
152-
'grpc-js/' + require('@grpc/grpc-js/package.json').version,
125+
'grpc-js/' + grpcJsVersion,
153126
].join(' ');
154127

155128
const MOCK_GRPC_API: grpcProtoLoader.PackageDefinition = {
@@ -162,7 +135,6 @@ describe('GrpcService', () => {
162135
Service: FakeService,
163136
util: fakeUtil,
164137
},
165-
grpc: fakeGrpc,
166138
'@google-cloud/projectify': {
167139
replaceProjectIdToken: fakeReplaceProjectIdTokenOverride,
168140
},
@@ -192,6 +164,61 @@ describe('GrpcService', () => {
192164
sinon.restore();
193165
});
194166

167+
it('should use grpc from config object', () => {
168+
let metadataUsed = 0;
169+
let credentialsUsed = 0;
170+
class Credentials {
171+
createInsecure() {
172+
++credentialsUsed;
173+
}
174+
}
175+
class Metadata {
176+
add() {
177+
++metadataUsed;
178+
}
179+
}
180+
const fakeGrpc = {
181+
Metadata,
182+
credentials: new Credentials(),
183+
};
184+
const grpcService = new GrpcService(
185+
Object.assign(
186+
{
187+
grpc: fakeGrpc,
188+
grpcVersion: 'grpc-foo/1.2.3',
189+
customEndpoint: 'endpoint',
190+
},
191+
CONFIG
192+
),
193+
OPTIONS
194+
);
195+
assert.strictEqual(grpcService.grpc, fakeGrpc);
196+
assert.strictEqual(grpcService.grpcVersion, 'grpc-foo/1.2.3');
197+
assert(metadataUsed > 0);
198+
assert(credentialsUsed > 0);
199+
});
200+
201+
it('should not use @grpc/grpc-js version if grpc object is passed', () => {
202+
class Metadata {
203+
add() {}
204+
}
205+
const fakeGrpc = {
206+
Metadata,
207+
};
208+
const grpcService = new GrpcService(
209+
Object.assign({grpc: fakeGrpc}, CONFIG),
210+
OPTIONS
211+
);
212+
assert.strictEqual(grpcService.grpc, fakeGrpc);
213+
assert.strictEqual(grpcService.grpcVersion, 'grpc/unknown');
214+
});
215+
216+
it('should use @grpc/grpc-js by default', () => {
217+
const grpcService = new GrpcService(CONFIG, OPTIONS);
218+
assert.strictEqual(grpcService.grpcVersion, 'grpc-js/' + grpcJsVersion);
219+
assert.strictEqual(grpcService.grpc, grpc);
220+
});
221+
195222
describe('grpc error to http error map', () => {
196223
it('should export grpc error map', () => {
197224
assert.deepStrictEqual(GrpcService.GRPC_ERROR_CODE_TO_HTTP, {

0 commit comments

Comments
 (0)