@@ -4,9 +4,12 @@ import { ServiceDefinition } from 'grpc';
4
4
import { Observable , Subscribable } from 'rxjs' ;
5
5
6
6
import {
7
+ addServerBuildMethods ,
7
8
ClientFactoryConstructor ,
9
+ createService ,
8
10
createServiceClient ,
9
11
DynamicMethods ,
12
+ GenericServerBuilder ,
10
13
getServiceNames ,
11
14
grpcLoad ,
12
15
GrpcService ,
@@ -15,7 +18,8 @@ import {
15
18
} from '../utils' ;
16
19
17
20
type LooseReturnType < T > = T extends ( ...args : any [ ] ) => infer R ? R : never ;
18
- type RequestType < T > = T extends ( arg : infer A , ...args : any [ ] ) => any ? A : never ;
21
+ type FirstArgument < T > = T extends ( arg : infer A , ...args : any [ ] ) => any ? A : never ;
22
+ type RequestType < T > = FirstArgument < T > ;
19
23
type ResponseType < T > = LooseReturnType < T > extends Subscribable < infer A > ? A : never ;
20
24
21
25
export type SerializedMessage < T > = Buffer & {
@@ -54,6 +58,12 @@ export type RawClientFactory<ClientFactory> = {
54
58
[ GetterName in keyof ClientFactory ] : ( ) => RawService < LooseReturnType < ClientFactory [ GetterName ] > >
55
59
} ;
56
60
61
+ export type RawServerBuilder < ServerBuilder > = {
62
+ [ AdderName in keyof ServerBuilder ] : (
63
+ service : RawService < FirstArgument < ServerBuilder [ AdderName ] > > ,
64
+ ) => RawServerBuilder < ServerBuilder >
65
+ } ;
66
+
57
67
export function rawClientFactory < ClientFactory > ( protoPath : string , packageName : string ) {
58
68
class Constructor {
59
69
readonly __args : [ string , grpc . ChannelCredentials , any | undefined ] ;
@@ -86,6 +96,33 @@ export function rawClientFactory<ClientFactory>(protoPath: string, packageName:
86
96
return ( Constructor as any ) as ClientFactoryConstructor < RawClientFactory < ClientFactory > > ;
87
97
}
88
98
99
+ export function rawServerBuilder < T > (
100
+ protoPath : string ,
101
+ packageName : string ,
102
+ server = new grpc . Server ( ) ,
103
+ ) : RawServerBuilder < T > & GenericServerBuilder < RawServerBuilder < T > > {
104
+ const adders : DynamicMethods = { } ;
105
+ const pkg = lookupPackage ( grpcLoad ( protoPath ) , packageName ) ;
106
+ for ( const name of getServiceNames ( pkg ) ) {
107
+ adders [ `add${ name } ` ] = function ( rxImpl : DynamicMethods ) {
108
+ const serviceData = ( pkg [ name ] as any ) as GrpcService < any > ;
109
+ const definition = serviceData . service ;
110
+ typedKeys ( definition ) . forEach ( methodKey => {
111
+ const methodDefinition = definition [ methodKey ] ;
112
+ methodDefinition . requestDeserialize = ( serialized : SerializedMessage < any > ) => {
113
+ return serialized ;
114
+ } ;
115
+ methodDefinition . responseSerialize = ( alreadySerialized : SerializedMessage < any > ) => {
116
+ return alreadySerialized ;
117
+ } ;
118
+ } ) ;
119
+ server . addService ( serviceData . service , createService ( serviceData , rxImpl ) ) ;
120
+ return this ;
121
+ } ;
122
+ }
123
+ return addServerBuildMethods ( adders , server ) as any ;
124
+ }
125
+
89
126
export function buildCodecsFactory < ClientFactory > (
90
127
protoPath : string ,
91
128
packageName : string ,
0 commit comments