From 38e988ea03bd76ab4002e69903d43d3fe1b31fd9 Mon Sep 17 00:00:00 2001 From: Slavo Vojacek Date: Mon, 31 Aug 2020 20:34:14 +0100 Subject: [PATCH 1/3] fix(grpc-js): Add support for impl type to server.addService --- packages/grpc-js/src/server.ts | 11 ++++++++--- packages/grpc-js/test/test-server.ts | 2 +- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/packages/grpc-js/src/server.ts b/packages/grpc-js/src/server.ts index 8d8952e8f..673e913d4 100644 --- a/packages/grpc-js/src/server.ts +++ b/packages/grpc-js/src/server.ts @@ -144,9 +144,14 @@ export class Server { throw new Error('Not implemented. Use addService() instead'); } - addService( - service: ServiceDefinition, - implementation: UntypedServiceImplementation + addService< + ImplementationType extends Record< + string, + UntypedHandleCall + > = UntypedServiceImplementation + >( + service: ServiceDefinition, + implementation: ImplementationType ): void { if (this.started === true) { throw new Error("Can't add a service to a started server."); diff --git a/packages/grpc-js/test/test-server.ts b/packages/grpc-js/test/test-server.ts index 434efbbc4..f8b13b309 100644 --- a/packages/grpc-js/test/test-server.ts +++ b/packages/grpc-js/test/test-server.ts @@ -181,7 +181,7 @@ describe('Server', () => { const server = new Server(); assert.throws(() => { - server.addService({}, dummyImpls); + server.addService({} as any, dummyImpls); }, /Cannot add an empty service to a server/); }); From 0d1d5a12fa1e3ee444db6929e9f7707b6bde5bc1 Mon Sep 17 00:00:00 2001 From: Slavo Vojacek Date: Wed, 2 Sep 2020 16:05:10 +0100 Subject: [PATCH 2/3] chore(Typings): Update types --- packages/grpc-js/src/server.ts | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/packages/grpc-js/src/server.ts b/packages/grpc-js/src/server.ts index 673e913d4..9b5f3af8b 100644 --- a/packages/grpc-js/src/server.ts +++ b/packages/grpc-js/src/server.ts @@ -145,10 +145,9 @@ export class Server { } addService< - ImplementationType extends Record< - string, - UntypedHandleCall - > = UntypedServiceImplementation + ImplementationType extends { + readonly [index in keyof ImplementationType]: UntypedHandleCall; + } >( service: ServiceDefinition, implementation: ImplementationType @@ -166,7 +165,7 @@ export class Server { throw new Error('addService() requires two objects as arguments'); } - const serviceKeys = Object.keys(service); + const serviceKeys = Object.keys(service) as Array; if (serviceKeys.length === 0) { throw new Error('Cannot add an empty service to a server'); @@ -194,13 +193,13 @@ export class Server { let impl; if (implFn === undefined && typeof attrs.originalName === 'string') { - implFn = implementation[attrs.originalName]; + implFn = implementation[attrs.originalName as keyof ImplementationType]; } if (implFn !== undefined) { - impl = implFn.bind(implementation); + impl = implFn.bind(implementation as any); } else { - impl = getDefaultHandler(methodType, name); + impl = getDefaultHandler(methodType, name as string); } const success = this.register( From fba1ee0cc398c63d0a3e960e8418eb8dd3dbe30c Mon Sep 17 00:00:00 2001 From: Slavo Vojacek Date: Wed, 2 Sep 2020 20:32:31 +0100 Subject: [PATCH 3/3] fix(grpc): Fix typings --- packages/grpc-js/src/server.ts | 10 +++++----- packages/grpc-js/test/test-server.ts | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/grpc-js/src/server.ts b/packages/grpc-js/src/server.ts index 9b5f3af8b..64c17a023 100644 --- a/packages/grpc-js/src/server.ts +++ b/packages/grpc-js/src/server.ts @@ -146,7 +146,7 @@ export class Server { addService< ImplementationType extends { - readonly [index in keyof ImplementationType]: UntypedHandleCall; + [key: string]: any } >( service: ServiceDefinition, @@ -165,7 +165,7 @@ export class Server { throw new Error('addService() requires two objects as arguments'); } - const serviceKeys = Object.keys(service) as Array; + const serviceKeys = Object.keys(service); if (serviceKeys.length === 0) { throw new Error('Cannot add an empty service to a server'); @@ -193,13 +193,13 @@ export class Server { let impl; if (implFn === undefined && typeof attrs.originalName === 'string') { - implFn = implementation[attrs.originalName as keyof ImplementationType]; + implFn = implementation[attrs.originalName]; } if (implFn !== undefined) { - impl = implFn.bind(implementation as any); + impl = implFn.bind(implementation); } else { - impl = getDefaultHandler(methodType, name as string); + impl = getDefaultHandler(methodType, name); } const success = this.register( diff --git a/packages/grpc-js/test/test-server.ts b/packages/grpc-js/test/test-server.ts index f8b13b309..b30963fb0 100644 --- a/packages/grpc-js/test/test-server.ts +++ b/packages/grpc-js/test/test-server.ts @@ -181,7 +181,7 @@ describe('Server', () => { const server = new Server(); assert.throws(() => { - server.addService({} as any, dummyImpls); + server.addService(({} as any), dummyImpls); }, /Cannot add an empty service to a server/); });