Skip to content

Commit 1041177

Browse files
committed
Add omit_request_instanceof generator option
1 parent 263c478 commit 1041177

File tree

4 files changed

+25
-10
lines changed

4 files changed

+25
-10
lines changed

packages/grpc-tools/README.md

+4
Original file line numberDiff line numberDiff line change
@@ -20,3 +20,7 @@ one of the following:
2020
gRPC library, and instead generates `PackageDefinition` objects that can
2121
be passed to the `loadPackageDefinition` function provided by both the
2222
`grpc` and `@grpc/grpc-js` libraries.
23+
- `omit_request_instanceof`: Omit the `instanceof` check for request messages
24+
in client code. This is useful when the request message was renamed or is
25+
from a different package, and request serialization would fail with
26+
`Expected argument of type …`.

packages/grpc-tools/src/node_generator.cc

+16-10
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,9 @@ grpc::string NodeObjectPath(const Descriptor* descriptor) {
120120
}
121121

122122
// Prints out the message serializer and deserializer functions
123-
void PrintMessageTransformer(const Descriptor* descriptor, Printer* out) {
123+
void PrintMessageTransformer(const Descriptor* descriptor,
124+
Printer* out,
125+
const Parameters& params) {
124126
map<grpc::string, grpc::string> template_vars;
125127
grpc::string full_name = descriptor->full_name();
126128
template_vars["identifier_name"] = MessageIdentifierName(full_name);
@@ -129,12 +131,14 @@ void PrintMessageTransformer(const Descriptor* descriptor, Printer* out) {
129131
// Print the serializer
130132
out->Print(template_vars, "function serialize_$identifier_name$(arg) {\n");
131133
out->Indent();
132-
out->Print(template_vars, "if (!(arg instanceof $node_name$)) {\n");
133-
out->Indent();
134-
out->Print(template_vars,
135-
"throw new Error('Expected argument of type $name$');\n");
136-
out->Outdent();
137-
out->Print("}\n");
134+
if (!params.omit_request_instanceof) {
135+
out->Print(template_vars, "if (!(arg instanceof $node_name$)) {\n");
136+
out->Indent();
137+
out->Print(template_vars,
138+
"throw new Error('Expected argument of type $name$');\n");
139+
out->Outdent();
140+
out->Print("}\n");
141+
}
138142
out->Print("return Buffer.from(arg.serializeBinary());\n");
139143
out->Outdent();
140144
out->Print("}\n\n");
@@ -232,12 +236,14 @@ void PrintImports(const FileDescriptor* file, Printer* out,
232236
out->Print("\n");
233237
}
234238

235-
void PrintTransformers(const FileDescriptor* file, Printer* out) {
239+
void PrintTransformers(const FileDescriptor* file,
240+
Printer* out,
241+
const Parameters& params) {
236242
map<grpc::string, const Descriptor*> messages = GetAllMessages(file);
237243
for (std::map<grpc::string, const Descriptor*>::iterator it =
238244
messages.begin();
239245
it != messages.end(); it++) {
240-
PrintMessageTransformer(it->second, out);
246+
PrintMessageTransformer(it->second, out, params);
241247
}
242248
out->Print("\n");
243249
}
@@ -273,7 +279,7 @@ grpc::string GenerateFile(const FileDescriptor* file,
273279

274280
PrintImports(file, &out, params);
275281

276-
PrintTransformers(file, &out);
282+
PrintTransformers(file, &out, params);
277283

278284
PrintServices(file, &out, params);
279285

packages/grpc-tools/src/node_generator.h

+2
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ struct Parameters {
2828
bool generate_package_definition;
2929
// Use pure JavaScript gRPC Client
3030
bool grpc_js;
31+
// Omit instanceof check for request messages
32+
bool omit_request_instanceof;
3133
};
3234

3335
grpc::string GenerateFile(const grpc::protobuf::FileDescriptor* file,

packages/grpc-tools/src/node_plugin.cc

+3
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ class NodeGrpcGenerator : public grpc::protobuf::compiler::CodeGenerator {
3939
grpc_node_generator::Parameters generator_parameters;
4040
generator_parameters.generate_package_definition = false;
4141
generator_parameters.grpc_js = false;
42+
generator_parameters.omit_request_instanceof = false;
4243
if (!parameter.empty()) {
4344
std::vector<grpc::string> parameters_list =
4445
grpc_generator::tokenize(parameter, ",");
@@ -48,6 +49,8 @@ class NodeGrpcGenerator : public grpc::protobuf::compiler::CodeGenerator {
4849
generator_parameters.generate_package_definition = true;
4950
} else if (*parameter_string == "grpc_js") {
5051
generator_parameters.grpc_js = true;
52+
} else if (*parameter_string == "omit_request_instanceof") {
53+
generator_parameters.omit_request_instanceof = true;
5154
}
5255
}
5356
}

0 commit comments

Comments
 (0)