Skip to content

Commit 61c57c9

Browse files
committed
Add experimental rawServerBuilder
1 parent c5cfe9f commit 61c57c9

File tree

1 file changed

+38
-1
lines changed

1 file changed

+38
-1
lines changed

src/experimental/index.ts

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,12 @@ import { ServiceDefinition } from 'grpc';
44
import { Observable, Subscribable } from 'rxjs';
55

66
import {
7+
addServerBuildMethods,
78
ClientFactoryConstructor,
9+
createService,
810
createServiceClient,
911
DynamicMethods,
12+
GenericServerBuilder,
1013
getServiceNames,
1114
grpcLoad,
1215
GrpcService,
@@ -15,7 +18,8 @@ import {
1518
} from '../utils';
1619

1720
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>;
1923
type ResponseType<T> = LooseReturnType<T> extends Subscribable<infer A> ? A : never;
2024

2125
export type SerializedMessage<T> = Buffer & {
@@ -54,6 +58,12 @@ export type RawClientFactory<ClientFactory> = {
5458
[GetterName in keyof ClientFactory]: () => RawService<LooseReturnType<ClientFactory[GetterName]>>
5559
};
5660

61+
export type RawServerBuilder<ServerBuilder> = {
62+
[AdderName in keyof ServerBuilder]: (
63+
service: RawService<FirstArgument<ServerBuilder[AdderName]>>,
64+
) => RawServerBuilder<ServerBuilder>
65+
};
66+
5767
export function rawClientFactory<ClientFactory>(protoPath: string, packageName: string) {
5868
class Constructor {
5969
readonly __args: [string, grpc.ChannelCredentials, any | undefined];
@@ -86,6 +96,33 @@ export function rawClientFactory<ClientFactory>(protoPath: string, packageName:
8696
return (Constructor as any) as ClientFactoryConstructor<RawClientFactory<ClientFactory>>;
8797
}
8898

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+
89126
export function buildCodecsFactory<ClientFactory>(
90127
protoPath: string,
91128
packageName: string,

0 commit comments

Comments
 (0)