Skip to content

Commit 2812c38

Browse files
Merge pull request nestjs#895 from jbpionnier/feature/grpc-loader
feature(@nestjs/microservices) load proto with proto-loader
2 parents 9ad7927 + caf99c6 commit 2812c38

8 files changed

Lines changed: 265 additions & 10 deletions

File tree

package-lock.json

Lines changed: 119 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
"author": "Kamil Mysliwiec",
3232
"license": "MIT",
3333
"dependencies": {
34+
"@grpc/proto-loader": "^0.3.0",
3435
"@nestjs/common": "5.1.0",
3536
"@nestjs/core": "5.1.0",
3637
"@nestjs/microservices": "5.1.0",

packages/microservices/client/client-grpc.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import { ClientProxy } from './client-proxy';
1111
import { GRPC_CANCELLED } from './constants';
1212

1313
let grpcPackage: any = {};
14+
let grpcProtoLoaderPackage: any = {};
1415

1516
export class ClientGrpcProxy extends ClientProxy implements ClientGrpc {
1617
private readonly logger = new Logger(ClientProxy.name);
@@ -23,6 +24,7 @@ export class ClientGrpcProxy extends ClientProxy implements ClientGrpc {
2324
this.getOptionsProp<GrpcOptions>(options, 'url') || GRPC_DEFAULT_URL;
2425

2526
grpcPackage = loadPackage('grpc', ClientGrpcProxy.name);
27+
grpcProtoLoaderPackage = loadPackage('@grpc/proto-loader', ClientGrpcProxy.name);
2628
this.grpcClient = this.createClient();
2729
}
2830

@@ -122,12 +124,12 @@ export class ClientGrpcProxy extends ClientProxy implements ClientGrpc {
122124

123125
public loadProto(): any {
124126
try {
125-
const root = this.getOptionsProp<GrpcOptions>(this.options, 'root');
126127
const file = this.getOptionsProp<GrpcOptions>(this.options, 'protoPath');
127-
const options = root ? { root, file } : file;
128+
const loader = this.getOptionsProp<GrpcOptions>(this.options, 'loader');
128129

129-
const context = grpcPackage.load(options);
130-
return context;
130+
const packageDefinition = grpcProtoLoaderPackage.loadSync(file, loader);
131+
const packageObject = grpcPackage.loadPackageDefinition(packageDefinition);
132+
return packageObject;
131133
} catch (err) {
132134
const invalidProtoError = new InvalidProtoDefinitionException();
133135
const message =

packages/microservices/interfaces/microservice-configuration.interface.ts

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,20 @@ export interface GrpcOptions {
2222
url?: string;
2323
credentials?: any;
2424
protoPath: string;
25-
root?: string;
2625
package: string;
26+
loader?: {
27+
keepCase?: boolean;
28+
alternateCommentMode?: boolean;
29+
longs?: Function;
30+
enums?: Function;
31+
bytes?: Function;
32+
defaults?: boolean;
33+
arrays?: boolean;
34+
objects?: boolean;
35+
oneofs?: boolean;
36+
json?: boolean;
37+
includeDirs?: string[];
38+
}
2739
};
2840
}
2941

packages/microservices/server/server-grpc.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import { GrpcOptions, MicroserviceOptions } from '../interfaces/microservice-con
88
import { Server } from './server';
99

1010
let grpcPackage: any = {};
11+
let grpcProtoLoaderPackage: any = {};
1112

1213
export class ServerGrpc extends Server implements CustomTransportStrategy {
1314
private readonly url: string;
@@ -19,6 +20,7 @@ export class ServerGrpc extends Server implements CustomTransportStrategy {
1920
this.getOptionsProp<GrpcOptions>(options, 'url') || GRPC_DEFAULT_URL;
2021

2122
grpcPackage = this.loadPackage('grpc', ServerGrpc.name);
23+
grpcProtoLoaderPackage = this.loadPackage('@grpc/proto-loader', ServerGrpc.name);
2224
}
2325

2426
public async listen(callback: () => void) {
@@ -149,12 +151,12 @@ export class ServerGrpc extends Server implements CustomTransportStrategy {
149151

150152
public loadProto(): any {
151153
try {
152-
const root = this.getOptionsProp<GrpcOptions>(this.options, 'root');
153154
const file = this.getOptionsProp<GrpcOptions>(this.options, 'protoPath');
154-
const options = root ? { root, file } : file;
155+
const loader = this.getOptionsProp<GrpcOptions>(this.options, 'loader');
155156

156-
const context = grpcPackage.load(options);
157-
return context;
157+
const packageDefinition = grpcProtoLoaderPackage.loadSync(file, loader);
158+
const packageObject = grpcPackage.loadPackageDefinition(packageDefinition);
159+
return packageObject;
158160
} catch (err) {
159161
const invalidProtoError = new InvalidProtoDefinitionException();
160162
const message = err && err.message ? err.message : invalidProtoError.message;
Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
11
syntax = "proto3";
22

3-
package test;
3+
package test;
4+
5+
service TestService {
6+
7+
}

sample/04-grpc/package-lock.json

Lines changed: 114 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

sample/04-grpc/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
"start:prod": "node dist/main.js"
1010
},
1111
"dependencies": {
12+
"@grpc/proto-loader": "^0.3.0",
1213
"@nestjs/common": "^5.1.0",
1314
"@nestjs/core": "^5.1.0",
1415
"@nestjs/microservices": "^5.1.0",

0 commit comments

Comments
 (0)