mirror of https://github.com/grpc/grpc-web.git
				
				
				
			internal sync
This commit is contained in:
		
							parent
							
								
									c1b07a70d6
								
							
						
					
					
						commit
						4ca20a4f9c
					
				|  | @ -16,12 +16,12 @@ | ||||||
|  * |  * | ||||||
|  */ |  */ | ||||||
| 
 | 
 | ||||||
| #include <algorithm> |  | ||||||
| #include <google/protobuf/compiler/code_generator.h> | #include <google/protobuf/compiler/code_generator.h> | ||||||
| #include <google/protobuf/compiler/plugin.h> | #include <google/protobuf/compiler/plugin.h> | ||||||
| #include <google/protobuf/descriptor.h> | #include <google/protobuf/descriptor.h> | ||||||
| #include <google/protobuf/io/printer.h> | #include <google/protobuf/io/printer.h> | ||||||
| #include <google/protobuf/io/zero_copy_stream.h> | #include <google/protobuf/io/zero_copy_stream.h> | ||||||
|  | #include <algorithm> | ||||||
| 
 | 
 | ||||||
| using google::protobuf::Descriptor; | using google::protobuf::Descriptor; | ||||||
| using google::protobuf::FieldDescriptor; | using google::protobuf::FieldDescriptor; | ||||||
|  | @ -740,12 +740,14 @@ void PrintServerStreamingCall(Printer* printer, std::map<string, string> vars) { | ||||||
|       " * @return {!grpc.web.ClientReadableStream<!proto.$out$>}\n" |       " * @return {!grpc.web.ClientReadableStream<!proto.$out$>}\n" | ||||||
|       " *     The XHR Node Readable Stream\n" |       " *     The XHR Node Readable Stream\n" | ||||||
|       " */\n" |       " */\n" | ||||||
|       "proto.$package_dot$$service_name$$client_type$.prototype.$js_method_name$ =\n"); |       "proto.$package_dot$$service_name$$client_type$.prototype." | ||||||
|  |       "$js_method_name$ =\n"); | ||||||
|   printer->Indent(); |   printer->Indent(); | ||||||
|   if (vars["client_type"] == "PromiseClient") { |   if (vars["client_type"] == "PromiseClient") { | ||||||
|     printer->Print( |     printer->Print( | ||||||
|         "  function(request, metadata) {\n" |         "  function(request, metadata) {\n" | ||||||
|         "return this.delegateClient_.client_.serverStreaming(this.delegateClient_.hostname_ +\n"); |         "return this.delegateClient_.client_.serverStreaming(" | ||||||
|  |         "this.delegateClient_.hostname_ +\n"); | ||||||
|   } else { |   } else { | ||||||
|     printer->Print( |     printer->Print( | ||||||
|         "  function(request, metadata) {\n" |         "  function(request, metadata) {\n" | ||||||
|  |  | ||||||
|  | @ -16,12 +16,16 @@ syntax = "proto3"; | ||||||
| 
 | 
 | ||||||
| package grpc.gateway.testing; | package grpc.gateway.testing; | ||||||
| 
 | 
 | ||||||
|  | message Empty { | ||||||
|  | } | ||||||
|  | 
 | ||||||
| message EchoRequest { | message EchoRequest { | ||||||
|   string message = 1; |   string message = 1; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| message EchoResponse { | message EchoResponse { | ||||||
|   string message = 1; |   string message = 1; | ||||||
|  |   int32 message_count = 2; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // Request type for server side streaming echo. | // Request type for server side streaming echo. | ||||||
|  | @ -44,6 +48,18 @@ message ServerStreamingEchoResponse { | ||||||
|   string message = 1; |   string message = 1; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // Request type for client side streaming echo. | ||||||
|  | message ClientStreamingEchoRequest { | ||||||
|  |   // A special value "" indicates that there's no further messages. | ||||||
|  |   string message = 1; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Response type for client side streaming echo. | ||||||
|  | message ClientStreamingEchoResponse { | ||||||
|  |   // Total number of client messages that have been received. | ||||||
|  |   int32 message_count = 1; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // A simple echo service. | // A simple echo service. | ||||||
| service EchoService { | service EchoService { | ||||||
|   // One request followed by one response |   // One request followed by one response | ||||||
|  | @ -54,8 +70,34 @@ service EchoService { | ||||||
|   rpc EchoAbort(EchoRequest) returns (EchoResponse) { |   rpc EchoAbort(EchoRequest) returns (EchoResponse) { | ||||||
|   }; |   }; | ||||||
| 
 | 
 | ||||||
|  |   // One empty request, ZERO processing, followed by one empty response | ||||||
|  |   // (minimum effort to do message serialization). | ||||||
|  |   rpc NoOp(Empty) returns (Empty); | ||||||
|  | 
 | ||||||
|   // One request followed by a sequence of responses (streamed download). |   // One request followed by a sequence of responses (streamed download). | ||||||
|   // The server will return the same client message repeatedly. |   // The server will return the same client message repeatedly. | ||||||
|   rpc ServerStreamingEcho(ServerStreamingEchoRequest) |   rpc ServerStreamingEcho(ServerStreamingEchoRequest) | ||||||
|       returns (stream ServerStreamingEchoResponse); |       returns (stream ServerStreamingEchoResponse); | ||||||
|  | 
 | ||||||
|  |   // One request followed by a sequence of responses (streamed download). | ||||||
|  |   // The server abort directly. | ||||||
|  |   rpc ServerStreamingEchoAbort(ServerStreamingEchoRequest) | ||||||
|  |       returns (stream ServerStreamingEchoResponse) { | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   // A sequence of requests followed by one response (streamed upload). | ||||||
|  |   // The server returns the total number of messages as the result. | ||||||
|  |   rpc ClientStreamingEcho(stream ClientStreamingEchoRequest) | ||||||
|  |       returns (ClientStreamingEchoResponse); | ||||||
|  | 
 | ||||||
|  |   // A sequence of requests with each message echoed by the server immediately. | ||||||
|  |   // The server returns the same client messages in order. | ||||||
|  |   // E.g. this is how the speech API works. | ||||||
|  |   rpc FullDuplexEcho(stream EchoRequest) returns (stream EchoResponse); | ||||||
|  | 
 | ||||||
|  |   // A sequence of requests followed by a sequence of responses. | ||||||
|  |   // The server buffers all the client messages and then returns the same | ||||||
|  |   // client messages one by one after the client half-closes the stream. | ||||||
|  |   // This is how an image recognition API may work. | ||||||
|  |   rpc HalfDuplexEcho(stream EchoRequest) returns (stream EchoResponse); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -30,6 +30,7 @@ using grpc::Status; | ||||||
| using grpc::gateway::testing::EchoRequest; | using grpc::gateway::testing::EchoRequest; | ||||||
| using grpc::gateway::testing::EchoResponse; | using grpc::gateway::testing::EchoResponse; | ||||||
| using grpc::gateway::testing::EchoService; | using grpc::gateway::testing::EchoService; | ||||||
|  | using grpc::gateway::testing::Empty; | ||||||
| using grpc::gateway::testing::ServerStreamingEchoRequest; | using grpc::gateway::testing::ServerStreamingEchoRequest; | ||||||
| using grpc::gateway::testing::ServerStreamingEchoResponse; | using grpc::gateway::testing::ServerStreamingEchoResponse; | ||||||
| 
 | 
 | ||||||
|  | @ -67,6 +68,12 @@ Status EchoServiceImpl::EchoAbort(ServerContext* context, | ||||||
|                 "Aborted from server side."); |                 "Aborted from server side."); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | Status EchoServiceImpl::NoOp(ServerContext* context, const Empty* request, | ||||||
|  |                              Empty* response) { | ||||||
|  |   CopyClientMetadataToResponse(context); | ||||||
|  |   return Status::OK; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| Status EchoServiceImpl::ServerStreamingEcho( | Status EchoServiceImpl::ServerStreamingEcho( | ||||||
|     ServerContext* context, const ServerStreamingEchoRequest* request, |     ServerContext* context, const ServerStreamingEchoRequest* request, | ||||||
|     ServerWriter<ServerStreamingEchoResponse>* writer) { |     ServerWriter<ServerStreamingEchoResponse>* writer) { | ||||||
|  | @ -82,3 +89,14 @@ Status EchoServiceImpl::ServerStreamingEcho( | ||||||
|   } |   } | ||||||
|   return Status::OK; |   return Status::OK; | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | Status EchoServiceImpl::ServerStreamingEchoAbort( | ||||||
|  |     ServerContext* context, const ServerStreamingEchoRequest* request, | ||||||
|  |     ServerWriter<ServerStreamingEchoResponse>* writer) { | ||||||
|  |   CopyClientMetadataToResponse(context); | ||||||
|  |   ServerStreamingEchoResponse response; | ||||||
|  |   response.set_message(request->message()); | ||||||
|  |   writer->Write(response); | ||||||
|  |   return Status(grpc::StatusCode::ABORTED, | ||||||
|  |                 "Aborted from server side."); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | @ -40,11 +40,20 @@ class EchoServiceImpl final : | ||||||
|       grpc::ServerContext* context, |       grpc::ServerContext* context, | ||||||
|       const grpc::gateway::testing::EchoRequest* request, |       const grpc::gateway::testing::EchoRequest* request, | ||||||
|       grpc::gateway::testing::EchoResponse* response) override; |       grpc::gateway::testing::EchoResponse* response) override; | ||||||
|  |   grpc::Status NoOp( | ||||||
|  |       grpc::ServerContext* context, | ||||||
|  |       const grpc::gateway::testing::Empty* request, | ||||||
|  |       grpc::gateway::testing::Empty* response) override; | ||||||
|   grpc::Status ServerStreamingEcho( |   grpc::Status ServerStreamingEcho( | ||||||
|       grpc::ServerContext* context, |       grpc::ServerContext* context, | ||||||
|       const grpc::gateway::testing::ServerStreamingEchoRequest* request, |       const grpc::gateway::testing::ServerStreamingEchoRequest* request, | ||||||
|       grpc::ServerWriter< |       grpc::ServerWriter< | ||||||
|       grpc::gateway::testing::ServerStreamingEchoResponse>* writer) override; |       grpc::gateway::testing::ServerStreamingEchoResponse>* writer) override; | ||||||
|  |   grpc::Status ServerStreamingEchoAbort( | ||||||
|  |       grpc::ServerContext* context, | ||||||
|  |       const grpc::gateway::testing::ServerStreamingEchoRequest* request, | ||||||
|  |       grpc::ServerWriter< | ||||||
|  |       grpc::gateway::testing::ServerStreamingEchoResponse>* writer) override; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| #endif  // NET_GRPC_GATEWAY_EXAMPLES_ECHO_ECHO_SERVICE_IMPL_H_
 | #endif  // NET_GRPC_GATEWAY_EXAMPLES_ECHO_ECHO_SERVICE_IMPL_H_
 | ||||||
|  |  | ||||||
|  | @ -1,6 +1,6 @@ | ||||||
| /* | /* | ||||||
|  * |  * | ||||||
|  * Copyright 2015 gRPC authors. |  * Copyright 2018 Google LLC | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -33,7 +33,10 @@ var packageDefinition = protoLoader.loadSync( | ||||||
| var protoDescriptor = grpc.loadPackageDefinition(packageDefinition); | var protoDescriptor = grpc.loadPackageDefinition(packageDefinition); | ||||||
| var echo = protoDescriptor.grpc.gateway.testing; | var echo = protoDescriptor.grpc.gateway.testing; | ||||||
| 
 | 
 | ||||||
| 
 | /** | ||||||
|  |  * @param {!Object} call | ||||||
|  |  * @return {!Object} metadata | ||||||
|  |  */ | ||||||
| function copyMetadata(call) { | function copyMetadata(call) { | ||||||
|   var metadata = call.metadata.getMap(); |   var metadata = call.metadata.getMap(); | ||||||
|   var response_metadata = new grpc.Metadata(); |   var response_metadata = new grpc.Metadata(); | ||||||
|  | @ -43,12 +46,20 @@ function copyMetadata(call) { | ||||||
|   return response_metadata; |   return response_metadata; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | /** | ||||||
|  |  * @param {!Object} call | ||||||
|  |  * @param {function():?} callback | ||||||
|  |  */ | ||||||
| function doEcho(call, callback) { | function doEcho(call, callback) { | ||||||
|   callback(null, { |   callback(null, { | ||||||
|     message: call.request.message |     message: call.request.message | ||||||
|   }, copyMetadata(call)); |   }, copyMetadata(call)); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | /** | ||||||
|  |  * @param {!Object} call | ||||||
|  |  * @param {function():?} callback | ||||||
|  |  */ | ||||||
| function doEchoAbort(call, callback) { | function doEchoAbort(call, callback) { | ||||||
|   callback({ |   callback({ | ||||||
|     code: grpc.status.ABORTED, |     code: grpc.status.ABORTED, | ||||||
|  | @ -56,6 +67,9 @@ function doEchoAbort(call, callback) { | ||||||
|   }); |   }); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | /** | ||||||
|  |  * @param {!Object} call | ||||||
|  |  */ | ||||||
| function doServerStreamingEcho(call) { | function doServerStreamingEcho(call) { | ||||||
|   var senders = []; |   var senders = []; | ||||||
|   function sender(message, interval) { |   function sender(message, interval) { | ||||||
|  | @ -77,7 +91,7 @@ function doServerStreamingEcho(call) { | ||||||
| /** | /** | ||||||
|  * Get a new server with the handler functions in this file bound to the methods |  * Get a new server with the handler functions in this file bound to the methods | ||||||
|  * it serves. |  * it serves. | ||||||
|  * @return {Server} The new server object |  * @return {!Server} The new server object | ||||||
|  */ |  */ | ||||||
| function getServer() { | function getServer() { | ||||||
|   var server = new grpc.Server(); |   var server = new grpc.Server(); | ||||||
|  |  | ||||||
|  | @ -254,9 +254,9 @@ in the current directory: | ||||||
| These are also the 2 files that our `client.js` file imported earlier in the | These are also the 2 files that our `client.js` file imported earlier in the | ||||||
| example. | example. | ||||||
| 
 | 
 | ||||||
| ## Compile the Client Javascript Code | ## Compile the Client JavaScript Code | ||||||
| 
 | 
 | ||||||
| Next, we need to compile the client side Javascript code into something that | Next, we need to compile the client side JavaScript code into something that | ||||||
| can be consumed by the browser. | can be consumed by the browser. | ||||||
| 
 | 
 | ||||||
| ```sh | ```sh | ||||||
|  |  | ||||||
|  | @ -17,8 +17,11 @@ syntax = "proto3"; | ||||||
| package helloworld; | package helloworld; | ||||||
| 
 | 
 | ||||||
| service Greeter { | service Greeter { | ||||||
|  |   // unary call | ||||||
|   rpc SayHello (HelloRequest) returns (HelloReply); |   rpc SayHello (HelloRequest) returns (HelloReply); | ||||||
|  |   // server streaming call | ||||||
|   rpc SayRepeatHello (RepeatHelloRequest) returns (stream HelloReply); |   rpc SayRepeatHello (RepeatHelloRequest) returns (stream HelloReply); | ||||||
|  |   // unary call - response after a length delay | ||||||
|   rpc SayHelloAfterDelay (HelloRequest) returns (HelloReply); |   rpc SayHelloAfterDelay (HelloRequest) returns (HelloReply); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -11,11 +11,14 @@ var packageDefinition = protoLoader.loadSync( | ||||||
|      defaults: true, |      defaults: true, | ||||||
|      oneofs: true |      oneofs: true | ||||||
|     }); |     }); | ||||||
| var protoDescriptor = grpc.loadPackageDefinition(packageDefinition) | var protoDescriptor = grpc.loadPackageDefinition(packageDefinition); | ||||||
| var helloworld = protoDescriptor.helloworld; | var helloworld = protoDescriptor.helloworld; | ||||||
| var client = new helloworld.Greeter('localhost:9090', | var client = new helloworld.Greeter('localhost:9090', | ||||||
|                                     grpc.credentials.createInsecure()); |                                     grpc.credentials.createInsecure()); | ||||||
| 
 | 
 | ||||||
|  | /** | ||||||
|  |  * @param {function():?} callback | ||||||
|  |  */ | ||||||
| function runSayHello(callback) { | function runSayHello(callback) { | ||||||
|   client.sayHello({name: 'John'}, {}, (err, response) => { |   client.sayHello({name: 'John'}, {}, (err, response) => { | ||||||
|     console.log(response.message); |     console.log(response.message); | ||||||
|  | @ -23,6 +26,9 @@ function runSayHello(callback) { | ||||||
|   }); |   }); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | /** | ||||||
|  |  * @param {function():?} callback | ||||||
|  |  */ | ||||||
| function runSayRepeatHello(callback) { | function runSayRepeatHello(callback) { | ||||||
|   var stream = client.sayRepeatHello({name: 'John', count: 5}, {}); |   var stream = client.sayRepeatHello({name: 'John', count: 5}, {}); | ||||||
|   stream.on('data', (response) => { |   stream.on('data', (response) => { | ||||||
|  | @ -33,6 +39,9 @@ function runSayRepeatHello(callback) { | ||||||
|   }); |   }); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | /** | ||||||
|  |  * @param {function():?} callback | ||||||
|  |  */ | ||||||
| function runSayHelloAfterDelay(callback) { | function runSayHelloAfterDelay(callback) { | ||||||
|   var deadline = new Date(); |   var deadline = new Date(); | ||||||
|   deadline.setSeconds(deadline.getSeconds() + 1); |   deadline.setSeconds(deadline.getSeconds() + 1); | ||||||
|  |  | ||||||
|  | @ -33,10 +33,17 @@ var packageDefinition = protoLoader.loadSync( | ||||||
| var protoDescriptor = grpc.loadPackageDefinition(packageDefinition); | var protoDescriptor = grpc.loadPackageDefinition(packageDefinition); | ||||||
| var helloworld = protoDescriptor.helloworld; | var helloworld = protoDescriptor.helloworld; | ||||||
| 
 | 
 | ||||||
|  | /** | ||||||
|  |  * @param {!Object} call | ||||||
|  |  * @param {function():?} callback | ||||||
|  |  */ | ||||||
| function doSayHello(call, callback) { | function doSayHello(call, callback) { | ||||||
|   callback(null, {message: 'Hello! '+ call.request.name}); |   callback(null, {message: 'Hello! '+ call.request.name}); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | /** | ||||||
|  |  * @param {!Object} call | ||||||
|  |  */ | ||||||
| function doSayRepeatHello(call) { | function doSayRepeatHello(call) { | ||||||
|   var senders = []; |   var senders = []; | ||||||
|   function sender(name) { |   function sender(name) { | ||||||
|  | @ -55,6 +62,10 @@ function doSayRepeatHello(call) { | ||||||
|   }); |   }); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | /** | ||||||
|  |  * @param {!Object} call | ||||||
|  |  * @param {function():?} callback | ||||||
|  |  */ | ||||||
| function doSayHelloAfterDelay(call, callback) { | function doSayHelloAfterDelay(call, callback) { | ||||||
|   function dummy() { |   function dummy() { | ||||||
|     return (cb) => { |     return (cb) => { | ||||||
|  | @ -68,6 +79,9 @@ function doSayHelloAfterDelay(call, callback) { | ||||||
|   }); |   }); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | /** | ||||||
|  |  * @return {!Object} gRPC server | ||||||
|  |  */ | ||||||
| function getServer() { | function getServer() { | ||||||
|   var server = new grpc.Server(); |   var server = new grpc.Server(); | ||||||
|   server.addProtoService(helloworld.Greeter.service, { |   server.addProtoService(helloworld.Greeter.service, { | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue