feat(microservices): add grpc pkg-load hook to support server extensions

This commit is contained in:
Justin Timmons
2024-02-29 22:32:45 -05:00
parent e1ba288590
commit f0baed7370
5 changed files with 42 additions and 6 deletions

View File

@@ -66,6 +66,7 @@ export interface GrpcOptions {
protoLoader?: string;
packageDefinition?: any;
gracefulShutdown?: boolean;
onLoadPackageDefinition?: (pkg: any, server: any) => void;
loader?: {
keepCase?: boolean;
alternateCommentMode?: boolean;

View File

@@ -509,6 +509,14 @@ export class ServerGrpc extends Server implements CustomTransportStrategy {
this.options,
grpcProtoLoaderPackage,
);
if (this.options.onLoadPackageDefinition) {
this.options.onLoadPackageDefinition(
packageDefinition,
this.grpcClient,
);
}
return grpcPackage.loadPackageDefinition(packageDefinition);
} catch (err) {
const invalidProtoError = new InvalidProtoDefinitionException(err.path);

View File

@@ -10,6 +10,7 @@
"license": "MIT",
"dependencies": {
"@grpc/grpc-js": "1.10.0",
"@grpc/reflection": "1.0.3",
"@nestjs/common": "10.3.2",
"@nestjs/core": "10.3.2",
"@nestjs/microservices": "10.3.2",
@@ -1039,6 +1040,18 @@
"node": ">=6"
}
},
"node_modules/@grpc/reflection": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/@grpc/reflection/-/reflection-1.0.3.tgz",
"integrity": "sha512-Fe1F1HpBSbOb2v4DOnZa2TiQkUJrj0/7camKUNoH6OfOXw/GO82e0gA4Eihbsuga8dZxJYNBHsig/c58SG2c/g==",
"dependencies": {
"@grpc/proto-loader": "^0.7.10",
"protobufjs": "^7.2.5"
},
"peerDependencies": {
"@grpc/grpc-js": "^1.8.21"
}
},
"node_modules/@humanwhocodes/config-array": {
"version": "0.11.10",
"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz",
@@ -7744,9 +7757,9 @@
}
},
"node_modules/protobufjs": {
"version": "7.2.4",
"resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.4.tgz",
"integrity": "sha512-AT+RJgD2sH8phPmCf7OUZR8xGdcJRga4+1cOaXJ64hvcSkVhNcRHOwIxUatPH15+nj59WAGTDv3LSGZPEQbJaQ==",
"version": "7.2.6",
"resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.6.tgz",
"integrity": "sha512-dgJaEDDL6x8ASUZ1YqWciTRrdOuYNzoOf27oHNfdyvKqHr5i0FV7FSLU+aIeFjyFgVxrpTOtQUi0BLLBymZaBw==",
"hasInstallScript": true,
"dependencies": {
"@protobufjs/aspromise": "^1.1.2",
@@ -10297,6 +10310,15 @@
"yargs": "^17.7.2"
}
},
"@grpc/reflection": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/@grpc/reflection/-/reflection-1.0.3.tgz",
"integrity": "sha512-Fe1F1HpBSbOb2v4DOnZa2TiQkUJrj0/7camKUNoH6OfOXw/GO82e0gA4Eihbsuga8dZxJYNBHsig/c58SG2c/g==",
"requires": {
"@grpc/proto-loader": "^0.7.10",
"protobufjs": "^7.2.5"
}
},
"@humanwhocodes/config-array": {
"version": "0.11.10",
"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz",
@@ -15315,9 +15337,9 @@
}
},
"protobufjs": {
"version": "7.2.4",
"resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.4.tgz",
"integrity": "sha512-AT+RJgD2sH8phPmCf7OUZR8xGdcJRga4+1cOaXJ64hvcSkVhNcRHOwIxUatPH15+nj59WAGTDv3LSGZPEQbJaQ==",
"version": "7.2.6",
"resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.6.tgz",
"integrity": "sha512-dgJaEDDL6x8ASUZ1YqWciTRrdOuYNzoOf27oHNfdyvKqHr5i0FV7FSLU+aIeFjyFgVxrpTOtQUi0BLLBymZaBw==",
"requires": {
"@protobufjs/aspromise": "^1.1.2",
"@protobufjs/base64": "^1.1.2",

View File

@@ -20,6 +20,7 @@
},
"dependencies": {
"@grpc/grpc-js": "1.10.0",
"@grpc/reflection": "1.0.3",
"@nestjs/common": "10.3.2",
"@nestjs/core": "10.3.2",
"@nestjs/microservices": "10.3.2",

View File

@@ -1,3 +1,4 @@
import { ReflectionService } from '@grpc/reflection';
import { ClientOptions, Transport } from '@nestjs/microservices';
import { join } from 'path';
@@ -6,5 +7,8 @@ export const grpcClientOptions: ClientOptions = {
options: {
package: 'hero', // ['hero', 'hero2']
protoPath: join(__dirname, './hero/hero.proto'), // ['./hero/hero.proto', './hero/hero2.proto']
onLoadPackageDefinition: (pkg, server) => {
new ReflectionService(pkg).addToServer(server);
},
},
};