From 640e645dd93cd0e04abac17de9899aa6a172ac37 Mon Sep 17 00:00:00 2001 From: Stephen Haberman Date: Wed, 7 Apr 2021 07:40:16 -0500 Subject: [PATCH] fix: Use the right Metadata for grpc-web. Fixes #270. (#271) --- .../grpc-web-no-streaming-observable/example.ts | 3 +-- integration/grpc-web-no-streaming/example.ts | 3 +-- integration/grpc-web/example-test.ts | 14 ++++++++++++++ integration/grpc-web/example.ts | 11 +++++------ src/generate-services.ts | 5 +++-- tests/options-test.ts | 8 ++++++++ 6 files changed, 32 insertions(+), 12 deletions(-) create mode 100644 integration/grpc-web/example-test.ts diff --git a/integration/grpc-web-no-streaming-observable/example.ts b/integration/grpc-web-no-streaming-observable/example.ts index 5053c6ed9..62bd87620 100644 --- a/integration/grpc-web-no-streaming-observable/example.ts +++ b/integration/grpc-web-no-streaming-observable/example.ts @@ -5,7 +5,6 @@ import { grpc } from '@improbable-eng/grpc-web'; import { Observable } from 'rxjs'; import { BrowserHeaders } from 'browser-headers'; import { take } from 'rxjs/operators'; -import { Metadata } from 'grpc'; export const protobufPackage = 'rpx'; @@ -355,7 +354,7 @@ export const Empty = { * but with the streaming method removed. */ export interface DashState { - UserSettings(request: DeepPartial, metadata?: Metadata): Observable; + UserSettings(request: DeepPartial, metadata?: grpc.Metadata): Observable; } export class DashStateClientImpl implements DashState { diff --git a/integration/grpc-web-no-streaming/example.ts b/integration/grpc-web-no-streaming/example.ts index 9b812cb8c..b291552a7 100644 --- a/integration/grpc-web-no-streaming/example.ts +++ b/integration/grpc-web-no-streaming/example.ts @@ -3,7 +3,6 @@ import { util, configure, Writer, Reader } from 'protobufjs/minimal'; import * as Long from 'long'; import { grpc } from '@improbable-eng/grpc-web'; import { BrowserHeaders } from 'browser-headers'; -import { Metadata } from 'grpc'; export const protobufPackage = 'rpx'; @@ -353,7 +352,7 @@ export const Empty = { * but with the streaming method removed. */ export interface DashState { - UserSettings(request: DeepPartial, metadata?: Metadata): Promise; + UserSettings(request: DeepPartial, metadata?: grpc.Metadata): Promise; } export class DashStateClientImpl implements DashState { diff --git a/integration/grpc-web/example-test.ts b/integration/grpc-web/example-test.ts new file mode 100644 index 000000000..69e858e23 --- /dev/null +++ b/integration/grpc-web/example-test.ts @@ -0,0 +1,14 @@ +import { DashStateClientImpl } from './example'; + +describe('grpc-web', () => { + it('at least compiles', () => { + // TODO move the hand-run `client-ts` integration into here, but for now + // at least check that things compile + const rpc = { + unary: jest.fn(), + invoke: jest.fn(), + }; + const client = new DashStateClientImpl(rpc); + client.UserSettings({}); + }); +}); diff --git a/integration/grpc-web/example.ts b/integration/grpc-web/example.ts index 39fedda36..86885a802 100644 --- a/integration/grpc-web/example.ts +++ b/integration/grpc-web/example.ts @@ -5,7 +5,6 @@ import { grpc } from '@improbable-eng/grpc-web'; import { Observable } from 'rxjs'; import { BrowserHeaders } from 'browser-headers'; import { share } from 'rxjs/operators'; -import { Metadata } from 'grpc'; export const protobufPackage = 'rpx'; @@ -731,8 +730,8 @@ export const Empty = { }; export interface DashState { - UserSettings(request: DeepPartial, metadata?: Metadata): Promise; - ActiveUserSettingsStream(request: DeepPartial, metadata?: Metadata): Observable; + UserSettings(request: DeepPartial, metadata?: grpc.Metadata): Promise; + ActiveUserSettingsStream(request: DeepPartial, metadata?: grpc.Metadata): Observable; } export class DashStateClientImpl implements DashState { @@ -805,9 +804,9 @@ export const DashStateActiveUserSettingsStreamDesc: UnaryMethodDefinitionish = { * ---------------------- */ export interface DashAPICreds { - Create(request: DeepPartial, metadata?: Metadata): Promise; - Update(request: DeepPartial, metadata?: Metadata): Promise; - Delete(request: DeepPartial, metadata?: Metadata): Promise; + Create(request: DeepPartial, metadata?: grpc.Metadata): Promise; + Update(request: DeepPartial, metadata?: grpc.Metadata): Promise; + Delete(request: DeepPartial, metadata?: grpc.Metadata): Promise; } export class DashAPICredsClientImpl implements DashAPICreds { diff --git a/src/generate-services.ts b/src/generate-services.ts index e0e8607a0..f69096eb1 100644 --- a/src/generate-services.ts +++ b/src/generate-services.ts @@ -21,7 +21,6 @@ import { Context } from './context'; const hash = imp('hash*object-hash'); const dataloader = imp('DataLoader*dataloader'); const Reader = imp('Reader@protobufjs/minimal'); -const Metadata = imp('Metadata@grpc'); /** * Generates an interface for `serviceDesc`. @@ -67,8 +66,10 @@ export function generateService( // Use metadata as last argument for interface only configuration if (options.outputClientImpl === 'grpc-web') { - params.push(code`metadata?: ${Metadata}`); + // We have to use grpc.Metadata where grpc will come from @improbable-eng + params.push(code`metadata?: grpc.Metadata`); } else if (options.addGrpcMetadata) { + const Metadata = imp('Metadata@grpc'); const q = options.addNestjsRestParameter ? '' : '?'; params.push(code`metadata${q}: ${Metadata}`); } diff --git a/tests/options-test.ts b/tests/options-test.ts index c4430caf4..99d2e6400 100644 --- a/tests/options-test.ts +++ b/tests/options-test.ts @@ -32,4 +32,12 @@ describe('options', () => { } `); }); + + it('can set outputJsonMethods with nestJs=true', () => { + const options = optionsFromParameter('outputClientImpl=grpc-web,addGrpcMetadata=false'); + expect(options).toMatchObject({ + outputClientImpl: 'grpc-web', + addGrpcMetadata: false, + }); + }); });