@@ -112,21 +112,27 @@ grpc::string MessageIdentifierName(const grpc::string& name) {
112112 return grpc_generator::StringReplace (name, " ." , " _" );
113113}
114114
115- grpc::string NodeObjectPath (const Descriptor* descriptor) {
115+ grpc::string NodeObjectPath (const Descriptor* descriptor, const grpc::string& runtime ) {
116116 grpc::string module_alias = ModuleAlias (descriptor->file ()->name ());
117+ if (runtime == " es" && descriptor->file ()->name ().find (" google/protobuf" ) == 0 ) {
118+ module_alias = " wkt" ;
119+ }
117120 grpc::string name = descriptor->full_name ();
118121 grpc_generator::StripPrefix (&name, descriptor->file ()->package () + " ." );
122+ if (runtime == " es" ) {
123+ name += " Schema" ;
124+ }
119125 return module_alias + " ." + name;
120126}
121127
122- // Prints out the message serializer and deserializer functions
123- void PrintMessageTransformer (const Descriptor* descriptor, Printer* out,
128+ // Prints out the message serializer and deserializer functions for google-protobuf.
129+ void PrintGoogleProtobufMessageTransformer (const Descriptor* descriptor, Printer* out,
124130 const Parameters& params) {
125131 map<grpc::string, grpc::string> template_vars;
126132 grpc::string full_name = descriptor->full_name ();
127133 template_vars[" identifier_name" ] = MessageIdentifierName (full_name);
128134 template_vars[" name" ] = full_name;
129- template_vars[" node_name" ] = NodeObjectPath (descriptor);
135+ template_vars[" node_name" ] = NodeObjectPath (descriptor, params. runtime );
130136 // Print the serializer
131137 out->Print (template_vars, " function serialize_$identifier_name$(arg) {\n " );
132138 out->Indent ();
@@ -153,15 +159,59 @@ void PrintMessageTransformer(const Descriptor* descriptor, Printer* out,
153159 out->Print (" }\n\n " );
154160}
155161
156- void PrintMethod (const MethodDescriptor* method, Printer* out) {
162+ // Prints out the message serializer and deserializer functions for bufbuild-protobuf.
163+ void PrintBufbuildProtobufMessageTransformer (const Descriptor* descriptor, Printer* out,
164+ const Parameters& params) {
165+ map<grpc::string, grpc::string> template_vars;
166+ grpc::string full_name = descriptor->full_name ();
167+ template_vars[" identifier_name" ] = MessageIdentifierName (full_name);
168+ template_vars[" name" ] = full_name;
169+ template_vars[" node_name" ] = NodeObjectPath (descriptor, params.runtime );
170+ // Print the serializer
171+ out->Print (template_vars, " function serialize_$identifier_name$(arg) {\n " );
172+ out->Indent ();
173+ if (!params.omit_serialize_instanceof ) {
174+ out->Print (template_vars, " if (!proto.isMessage(arg, $node_name$)) {\n " );
175+ out->Indent ();
176+ out->Print (template_vars,
177+ " throw new Error('Expected argument of type $name$');\n " );
178+ out->Outdent ();
179+ out->Print (" }\n " );
180+ }
181+ out->Print (template_vars, " return Buffer.from(proto.toBinary($node_name$, arg));\n " );
182+ out->Outdent ();
183+ out->Print (" }\n\n " );
184+
185+ // Print the deserializer
186+ out->Print (template_vars,
187+ " function deserialize_$identifier_name$(buffer_arg) {\n " );
188+ out->Indent ();
189+ out->Print (
190+ template_vars,
191+ " return proto.fromBinary($node_name$, new Uint8Array(buffer_arg));\n " );
192+ out->Outdent ();
193+ out->Print (" }\n\n " );
194+ }
195+
196+ // Prints out the message serializer and deserializer functions
197+ void PrintMessageTransformer (const Descriptor* descriptor, Printer* out,
198+ const Parameters& params) {
199+ if (params.runtime == " es" ) {
200+ PrintBufbuildProtobufMessageTransformer (descriptor, out, params);
201+ } else {
202+ PrintGoogleProtobufMessageTransformer (descriptor, out, params);
203+ }
204+ }
205+
206+ void PrintMethod (const MethodDescriptor* method, Printer* out, const Parameters& params) {
157207 const Descriptor* input_type = method->input_type ();
158208 const Descriptor* output_type = method->output_type ();
159209 map<grpc::string, grpc::string> vars;
160210 vars[" service_name" ] = method->service ()->full_name ();
161211 vars[" name" ] = method->name ();
162- vars[" input_type" ] = NodeObjectPath (input_type);
212+ vars[" input_type" ] = NodeObjectPath (input_type, params. runtime );
163213 vars[" input_type_id" ] = MessageIdentifierName (input_type->full_name ());
164- vars[" output_type" ] = NodeObjectPath (output_type);
214+ vars[" output_type" ] = NodeObjectPath (output_type, params. runtime );
165215 vars[" output_type_id" ] = MessageIdentifierName (output_type->full_name ());
166216 vars[" client_stream" ] = method->client_streaming () ? " true" : " false" ;
167217 vars[" server_stream" ] = method->server_streaming () ? " true" : " false" ;
@@ -198,7 +248,7 @@ void PrintService(const ServiceDescriptor* service, Printer* out,
198248 grpc_generator::LowercaseFirstLetter (service->method (i)->name ());
199249 out->PrintRaw (GetNodeComments (service->method (i), true ).c_str ());
200250 out->Print (" $method_name$: " , " method_name" , method_name);
201- PrintMethod (service->method (i), out);
251+ PrintMethod (service->method (i), out, params );
202252 out->Print (" ,\n " );
203253 out->PrintRaw (GetNodeComments (service->method (i), false ).c_str ());
204254 }
@@ -218,14 +268,25 @@ void PrintImports(const FileDescriptor* file, Printer* out,
218268 grpc::string package = params.grpc_js ? " @grpc/grpc-js" : " grpc" ;
219269 out->Print (" var grpc = require('$package$');\n " , " package" , package);
220270 }
271+ if (params.runtime == " es" ) {
272+ out->Print (" var proto = require('@bufbuild/protobuf');\n " );
273+ }
221274 if (file->message_type_count () > 0 ) {
222275 grpc::string file_path =
223276 GetRelativePath (file->name (), GetJSMessageFilename (file->name ()));
224277 out->Print (" var $module_alias$ = require('$file_path$');\n " , " module_alias" ,
225278 ModuleAlias (file->name ()), " file_path" , file_path);
226279 }
227-
280+ bool imports_wkt = false ;
228281 for (int i = 0 ; i < file->dependency_count (); i++) {
282+ if (params.runtime == " es" && file->dependency (i)->name ().find (" google/protobuf" ) == 0 ) {
283+ // WKTs are provided by the runtime from a single location.
284+ if (!imports_wkt) {
285+ out->Print (" var wkt = require('@bufbuild/protobuf/wkt');" );
286+ imports_wkt = true ;
287+ }
288+ continue ;
289+ }
229290 grpc::string file_path = GetRelativePath (
230291 file->name (), GetJSMessageFilename (file->dependency (i)->name ()));
231292 out->Print (" var $module_alias$ = require('$file_path$');\n " , " module_alias" ,
0 commit comments