commit
38f6eebc44
1195 changed files with 67206 additions and 19456 deletions
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,15 @@ |
||||
# Copyright 2017 gRPC authors. |
||||
# |
||||
# Licensed under the Apache License, Version 2.0 (the "License"); |
||||
# you may not use this file except in compliance with the License. |
||||
# You may obtain a copy of the License at |
||||
# |
||||
# http://www.apache.org/licenses/LICENSE-2.0 |
||||
# |
||||
# Unless required by applicable law or agreed to in writing, software |
||||
# distributed under the License is distributed on an "AS IS" BASIS, |
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
# See the License for the specific language governing permissions and |
||||
# limitations under the License. |
||||
|
||||
set(_gRPC_XXHASH_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/third_party/xxhash") |
@ -0,0 +1,14 @@ |
||||
gRPC Admin |
||||
========== |
||||
|
||||
What is gRPC Admin? |
||||
--------------------------------------------- |
||||
|
||||
It's a convenient API to improve the usability of creating a gRPC server with admin services to expose states in the gRPC library. |
||||
|
||||
Design Document `gRPC Admin Interface <https://github.com/grpc/proposal/blob/master/A38-admin-interface-api.md>`_ |
||||
|
||||
Module Contents |
||||
--------------- |
||||
|
||||
.. automodule:: grpc_admin |
@ -0,0 +1,14 @@ |
||||
gRPC CSDS |
||||
========= |
||||
|
||||
What is gRPC CSDS? |
||||
--------------------------------------------- |
||||
|
||||
In short, it's a xDS configuration dump protocol. |
||||
|
||||
Design Document `gRPC CSDS <https://github.com/grpc/proposal/blob/master/A40-csds-support.md>`_ |
||||
|
||||
Module Contents |
||||
--------------- |
||||
|
||||
.. automodule:: grpc_csds |
@ -0,0 +1,68 @@ |
||||
# Copyright 2021 the gRPC authors. |
||||
# |
||||
# Licensed under the Apache License, Version 2.0 (the "License"); |
||||
# you may not use this file except in compliance with the License. |
||||
# You may obtain a copy of the License at |
||||
# |
||||
# http://www.apache.org/licenses/LICENSE-2.0 |
||||
# |
||||
# Unless required by applicable law or agreed to in writing, software |
||||
# distributed under the License is distributed on an "AS IS" BASIS, |
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
# See the License for the specific language governing permissions and |
||||
# limitations under the License. |
||||
# |
||||
# cmake build file for C++ helloworld example. |
||||
# Assumes protobuf and gRPC have been installed using cmake. |
||||
# See cmake_externalproject/CMakeLists.txt for all-in-one cmake build |
||||
# that automatically builds all the dependencies before building helloworld. |
||||
|
||||
cmake_minimum_required(VERSION 3.5.1) |
||||
|
||||
project(Compression C CXX) |
||||
|
||||
include(../cmake/common.cmake) |
||||
|
||||
# Proto file |
||||
get_filename_component(hw_proto "../../protos/helloworld.proto" ABSOLUTE) |
||||
get_filename_component(hw_proto_path "${hw_proto}" PATH) |
||||
|
||||
# Generated sources |
||||
set(hw_proto_srcs "${CMAKE_CURRENT_BINARY_DIR}/helloworld.pb.cc") |
||||
set(hw_proto_hdrs "${CMAKE_CURRENT_BINARY_DIR}/helloworld.pb.h") |
||||
set(hw_grpc_srcs "${CMAKE_CURRENT_BINARY_DIR}/helloworld.grpc.pb.cc") |
||||
set(hw_grpc_hdrs "${CMAKE_CURRENT_BINARY_DIR}/helloworld.grpc.pb.h") |
||||
add_custom_command( |
||||
OUTPUT "${hw_proto_srcs}" "${hw_proto_hdrs}" "${hw_grpc_srcs}" "${hw_grpc_hdrs}" |
||||
COMMAND ${_PROTOBUF_PROTOC} |
||||
ARGS --grpc_out "${CMAKE_CURRENT_BINARY_DIR}" |
||||
--cpp_out "${CMAKE_CURRENT_BINARY_DIR}" |
||||
-I "${hw_proto_path}" |
||||
--plugin=protoc-gen-grpc="${_GRPC_CPP_PLUGIN_EXECUTABLE}" |
||||
"${hw_proto}" |
||||
DEPENDS "${hw_proto}") |
||||
|
||||
# Include generated *.pb.h files |
||||
include_directories("${CMAKE_CURRENT_BINARY_DIR}") |
||||
|
||||
# hw_grpc_proto |
||||
add_library(hw_grpc_proto |
||||
${hw_grpc_srcs} |
||||
${hw_grpc_hdrs} |
||||
${hw_proto_srcs} |
||||
${hw_proto_hdrs}) |
||||
target_link_libraries(hw_grpc_proto |
||||
${_REFLECTION} |
||||
${_GRPC_GRPCPP} |
||||
${_PROTOBUF_LIBPROTOBUF}) |
||||
|
||||
# Targets greeter_(client|server) |
||||
foreach(_target |
||||
greeter_client greeter_server) |
||||
add_executable(${_target} "${_target}.cc") |
||||
target_link_libraries(${_target} |
||||
hw_grpc_proto |
||||
${_REFLECTION} |
||||
${_GRPC_GRPCPP} |
||||
${_PROTOBUF_LIBPROTOBUF}) |
||||
endforeach() |
@ -0,0 +1,92 @@ |
||||
/*
|
||||
* |
||||
* Copyright 2021 gRPC authors. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
* |
||||
*/ |
||||
|
||||
#include <iostream> |
||||
#include <memory> |
||||
#include <string> |
||||
|
||||
#include "absl/flags/flag.h" |
||||
#include "absl/flags/parse.h" |
||||
|
||||
#include <grpcpp/grpcpp.h> |
||||
|
||||
#ifdef BAZEL_BUILD |
||||
#include "examples/protos/helloworld.grpc.pb.h" |
||||
#else |
||||
#include "helloworld.grpc.pb.h" |
||||
#endif |
||||
|
||||
ABSL_FLAG(std::string, target, "xds:///helloworld:50051", "Target string"); |
||||
ABSL_FLAG(bool, secure, true, "Secure mode"); |
||||
|
||||
using grpc::Channel; |
||||
using grpc::ClientContext; |
||||
using grpc::Status; |
||||
using helloworld::Greeter; |
||||
using helloworld::HelloReply; |
||||
using helloworld::HelloRequest; |
||||
|
||||
class GreeterClient { |
||||
public: |
||||
GreeterClient(std::shared_ptr<Channel> channel) |
||||
: stub_(Greeter::NewStub(channel)) {} |
||||
|
||||
// Assembles the client's payload, sends it and presents the response back
|
||||
// from the server.
|
||||
std::string SayHello(const std::string& user) { |
||||
// Data we are sending to the server.
|
||||
HelloRequest request; |
||||
request.set_name(user); |
||||
|
||||
// Container for the data we expect from the server.
|
||||
HelloReply reply; |
||||
|
||||
// Context for the client. It could be used to convey extra information to
|
||||
// the server and/or tweak certain RPC behaviors.
|
||||
ClientContext context; |
||||
|
||||
// The actual RPC.
|
||||
Status status = stub_->SayHello(&context, request, &reply); |
||||
|
||||
// Act upon its status.
|
||||
if (status.ok()) { |
||||
return reply.message(); |
||||
} else { |
||||
std::cout << status.error_code() << ": " << status.error_message() |
||||
<< std::endl; |
||||
return "RPC failed"; |
||||
} |
||||
} |
||||
|
||||
private: |
||||
std::unique_ptr<Greeter::Stub> stub_; |
||||
}; |
||||
|
||||
int main(int argc, char** argv) { |
||||
absl::ParseCommandLine(argc, argv); |
||||
GreeterClient greeter(grpc::CreateChannel( |
||||
absl::GetFlag(FLAGS_target), absl::GetFlag(FLAGS_secure) |
||||
? grpc::experimental::XdsCredentials( |
||||
grpc::InsecureChannelCredentials()) |
||||
: grpc::InsecureChannelCredentials())); |
||||
std::string user("world"); |
||||
std::string reply = greeter.SayHello(user); |
||||
std::cout << "Greeter received: " << reply << std::endl; |
||||
|
||||
return 0; |
||||
} |
@ -0,0 +1,108 @@ |
||||
/*
|
||||
* |
||||
* Copyright 2021 gRPC authors. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
* |
||||
*/ |
||||
|
||||
#include <iostream> |
||||
#include <memory> |
||||
#include <string> |
||||
|
||||
#include "absl/flags/flag.h" |
||||
#include "absl/flags/parse.h" |
||||
#include "absl/strings/str_cat.h" |
||||
|
||||
#include <grpcpp/ext/admin_services.h> |
||||
#include <grpcpp/ext/proto_server_reflection_plugin.h> |
||||
#include <grpcpp/grpcpp.h> |
||||
#include <grpcpp/health_check_service_interface.h> |
||||
#include <grpcpp/xds_server_builder.h> |
||||
|
||||
#ifdef BAZEL_BUILD |
||||
#include "examples/protos/helloworld.grpc.pb.h" |
||||
#else |
||||
#include "helloworld.grpc.pb.h" |
||||
#endif |
||||
|
||||
ABSL_FLAG(int32_t, port, 50051, "Server port for service."); |
||||
ABSL_FLAG(int32_t, maintenance_port, 50052, |
||||
"Server port for maintenance if --secure is used."); |
||||
ABSL_FLAG(bool, secure, true, "Secure mode"); |
||||
|
||||
using grpc::Server; |
||||
using grpc::ServerBuilder; |
||||
using grpc::ServerContext; |
||||
using grpc::Status; |
||||
using helloworld::Greeter; |
||||
using helloworld::HelloReply; |
||||
using helloworld::HelloRequest; |
||||
|
||||
// Logic and data behind the server's behavior.
|
||||
class GreeterServiceImpl final : public Greeter::Service { |
||||
Status SayHello(ServerContext* context, const HelloRequest* request, |
||||
HelloReply* reply) override { |
||||
std::string prefix("Hello "); |
||||
reply->set_message(prefix + request->name()); |
||||
return Status::OK; |
||||
} |
||||
}; |
||||
|
||||
void RunServer() { |
||||
grpc::EnableDefaultHealthCheckService(true); |
||||
grpc::reflection::InitProtoReflectionServerBuilderPlugin(); |
||||
int port = absl::GetFlag(FLAGS_port); |
||||
int maintenance_port = absl::GetFlag(FLAGS_maintenance_port); |
||||
grpc::experimental::XdsServerBuilder xds_builder; |
||||
ServerBuilder builder; |
||||
std::unique_ptr<Server> xds_enabled_server; |
||||
std::unique_ptr<Server> server; |
||||
GreeterServiceImpl service; |
||||
// Register "service" as the instance through which we'll communicate with
|
||||
// clients. In this case it corresponds to an *synchronous* service.
|
||||
xds_builder.RegisterService(&service); |
||||
if (absl::GetFlag(FLAGS_secure)) { |
||||
// Listen on the given address with XdsServerCredentials and a fallback of
|
||||
// InsecureServerCredentials
|
||||
xds_builder.AddListeningPort(absl::StrCat("0.0.0.0:", port), |
||||
grpc::experimental::XdsServerCredentials( |
||||
grpc::InsecureServerCredentials())); |
||||
xds_enabled_server = xds_builder.BuildAndStart(); |
||||
gpr_log(GPR_INFO, "Server starting on 0.0.0.0:%d", port); |
||||
grpc::AddAdminServices(&builder); |
||||
// For the maintenance server, do not use any authentication mechanism.
|
||||
builder.AddListeningPort(absl::StrCat("0.0.0.0:", maintenance_port), |
||||
grpc::InsecureServerCredentials()); |
||||
server = builder.BuildAndStart(); |
||||
gpr_log(GPR_INFO, "Maintenance server listening on 0.0.0.0:%d", |
||||
maintenance_port); |
||||
} else { |
||||
grpc::AddAdminServices(&xds_builder); |
||||
// Listen on the given address without any authentication mechanism.
|
||||
builder.AddListeningPort(absl::StrCat("0.0.0.0:", port), |
||||
grpc::InsecureServerCredentials()); |
||||
server = xds_builder.BuildAndStart(); |
||||
gpr_log(GPR_INFO, "Server listening on 0.0.0.0:%d", port); |
||||
} |
||||
|
||||
// Wait for the server to shutdown. Note that some other thread must be
|
||||
// responsible for shutting down the server for this call to ever return.
|
||||
server->Wait(); |
||||
} |
||||
|
||||
int main(int argc, char** argv) { |
||||
absl::ParseCommandLine(argc, argv); |
||||
RunServer(); |
||||
return 0; |
||||
} |
@ -0,0 +1,73 @@ |
||||
# Copyright 2021 the gRPC authors. |
||||
# |
||||
# Licensed under the Apache License, Version 2.0 (the "License"); |
||||
# you may not use this file except in compliance with the License. |
||||
# You may obtain a copy of the License at |
||||
# |
||||
# http://www.apache.org/licenses/LICENSE-2.0 |
||||
# |
||||
# Unless required by applicable law or agreed to in writing, software |
||||
# distributed under the License is distributed on an "AS IS" BASIS, |
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
# See the License for the specific language governing permissions and |
||||
# limitations under the License. |
||||
# |
||||
# cmake build file for C++ keyvaluestore example. |
||||
# Assumes protobuf and gRPC have been installed using cmake. |
||||
# See cmake_externalproject/CMakeLists.txt for all-in-one cmake build |
||||
# that automatically builds all the dependencies before building keyvaluestore. |
||||
|
||||
cmake_minimum_required(VERSION 3.5.1) |
||||
|
||||
project(KeyValueStore C CXX) |
||||
|
||||
include(../cmake/common.cmake) |
||||
|
||||
# Proto file |
||||
get_filename_component(kvs_proto "../../protos/keyvaluestore.proto" ABSOLUTE) |
||||
get_filename_component(kvs_proto_path "${kvs_proto}" PATH) |
||||
|
||||
# Generated sources |
||||
set(kvs_proto_srcs "${CMAKE_CURRENT_BINARY_DIR}/keyvaluestore.pb.cc") |
||||
set(kvs_proto_hdrs "${CMAKE_CURRENT_BINARY_DIR}/keyvaluestore.pb.h") |
||||
set(kvs_grpc_srcs "${CMAKE_CURRENT_BINARY_DIR}/keyvaluestore.grpc.pb.cc") |
||||
set(kvs_grpc_hdrs "${CMAKE_CURRENT_BINARY_DIR}/keyvaluestore.grpc.pb.h") |
||||
add_custom_command( |
||||
OUTPUT "${kvs_proto_srcs}" "${kvs_proto_hdrs}" "${kvs_grpc_srcs}" "${kvs_grpc_hdrs}" |
||||
COMMAND ${_PROTOBUF_PROTOC} |
||||
ARGS --grpc_out "${CMAKE_CURRENT_BINARY_DIR}" |
||||
--cpp_out "${CMAKE_CURRENT_BINARY_DIR}" |
||||
-I "${kvs_proto_path}" |
||||
--plugin=protoc-gen-grpc="${_GRPC_CPP_PLUGIN_EXECUTABLE}" |
||||
"${kvs_proto}" |
||||
DEPENDS "${kvs_proto}") |
||||
|
||||
# Include generated *.pb.h files |
||||
include_directories("${CMAKE_CURRENT_BINARY_DIR}") |
||||
|
||||
# kvs_grpc_proto |
||||
add_library(kvs_grpc_proto |
||||
${kvs_grpc_srcs} |
||||
${kvs_grpc_hdrs} |
||||
${kvs_proto_srcs} |
||||
${kvs_proto_hdrs}) |
||||
target_link_libraries(kvs_grpc_proto |
||||
${_REFLECTION} |
||||
${_GRPC_GRPCPP} |
||||
${_PROTOBUF_LIBPROTOBUF}) |
||||
|
||||
# client |
||||
add_executable(client "client.cc" "caching_interceptor.h") |
||||
target_link_libraries(client |
||||
kvs_grpc_proto |
||||
${_REFLECTION} |
||||
${_GRPC_GRPCPP} |
||||
${_PROTOBUF_LIBPROTOBUF}) |
||||
|
||||
# server |
||||
add_executable(server "server.cc") |
||||
target_link_libraries(server |
||||
kvs_grpc_proto |
||||
${_REFLECTION} |
||||
${_GRPC_GRPCPP} |
||||
${_PROTOBUF_LIBPROTOBUF}) |
@ -0,0 +1,68 @@ |
||||
# Copyright 2021 the gRPC authors. |
||||
# |
||||
# Licensed under the Apache License, Version 2.0 (the "License"); |
||||
# you may not use this file except in compliance with the License. |
||||
# You may obtain a copy of the License at |
||||
# |
||||
# http://www.apache.org/licenses/LICENSE-2.0 |
||||
# |
||||
# Unless required by applicable law or agreed to in writing, software |
||||
# distributed under the License is distributed on an "AS IS" BASIS, |
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
# See the License for the specific language governing permissions and |
||||
# limitations under the License. |
||||
# |
||||
# cmake build file for C++ helloworld example. |
||||
# Assumes protobuf and gRPC have been installed using cmake. |
||||
# See cmake_externalproject/CMakeLists.txt for all-in-one cmake build |
||||
# that automatically builds all the dependencies before building helloworld. |
||||
|
||||
cmake_minimum_required(VERSION 3.5.1) |
||||
|
||||
project(LoadBalancing C CXX) |
||||
|
||||
include(../cmake/common.cmake) |
||||
|
||||
# Proto file |
||||
get_filename_component(hw_proto "../../protos/helloworld.proto" ABSOLUTE) |
||||
get_filename_component(hw_proto_path "${hw_proto}" PATH) |
||||
|
||||
# Generated sources |
||||
set(hw_proto_srcs "${CMAKE_CURRENT_BINARY_DIR}/helloworld.pb.cc") |
||||
set(hw_proto_hdrs "${CMAKE_CURRENT_BINARY_DIR}/helloworld.pb.h") |
||||
set(hw_grpc_srcs "${CMAKE_CURRENT_BINARY_DIR}/helloworld.grpc.pb.cc") |
||||
set(hw_grpc_hdrs "${CMAKE_CURRENT_BINARY_DIR}/helloworld.grpc.pb.h") |
||||
add_custom_command( |
||||
OUTPUT "${hw_proto_srcs}" "${hw_proto_hdrs}" "${hw_grpc_srcs}" "${hw_grpc_hdrs}" |
||||
COMMAND ${_PROTOBUF_PROTOC} |
||||
ARGS --grpc_out "${CMAKE_CURRENT_BINARY_DIR}" |
||||
--cpp_out "${CMAKE_CURRENT_BINARY_DIR}" |
||||
-I "${hw_proto_path}" |
||||
--plugin=protoc-gen-grpc="${_GRPC_CPP_PLUGIN_EXECUTABLE}" |
||||
"${hw_proto}" |
||||
DEPENDS "${hw_proto}") |
||||
|
||||
# Include generated *.pb.h files |
||||
include_directories("${CMAKE_CURRENT_BINARY_DIR}") |
||||
|
||||
# hw_grpc_proto |
||||
add_library(hw_grpc_proto |
||||
${hw_grpc_srcs} |
||||
${hw_grpc_hdrs} |
||||
${hw_proto_srcs} |
||||
${hw_proto_hdrs}) |
||||
target_link_libraries(hw_grpc_proto |
||||
${_REFLECTION} |
||||
${_GRPC_GRPCPP} |
||||
${_PROTOBUF_LIBPROTOBUF}) |
||||
|
||||
# Targets greeter_(client|server) |
||||
foreach(_target |
||||
greeter_client greeter_server) |
||||
add_executable(${_target} "${_target}.cc") |
||||
target_link_libraries(${_target} |
||||
hw_grpc_proto |
||||
${_REFLECTION} |
||||
${_GRPC_GRPCPP} |
||||
${_PROTOBUF_LIBPROTOBUF}) |
||||
endforeach() |
@ -0,0 +1,68 @@ |
||||
# Copyright 2021 the gRPC authors. |
||||
# |
||||
# Licensed under the Apache License, Version 2.0 (the "License"); |
||||
# you may not use this file except in compliance with the License. |
||||
# You may obtain a copy of the License at |
||||
# |
||||
# http://www.apache.org/licenses/LICENSE-2.0 |
||||
# |
||||
# Unless required by applicable law or agreed to in writing, software |
||||
# distributed under the License is distributed on an "AS IS" BASIS, |
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
# See the License for the specific language governing permissions and |
||||
# limitations under the License. |
||||
# |
||||
# cmake build file for C++ helloworld example. |
||||
# Assumes protobuf and gRPC have been installed using cmake. |
||||
# See cmake_externalproject/CMakeLists.txt for all-in-one cmake build |
||||
# that automatically builds all the dependencies before building helloworld. |
||||
|
||||
cmake_minimum_required(VERSION 3.5.1) |
||||
|
||||
project(Metadata C CXX) |
||||
|
||||
include(../cmake/common.cmake) |
||||
|
||||
# Proto file |
||||
get_filename_component(hw_proto "../../protos/helloworld.proto" ABSOLUTE) |
||||
get_filename_component(hw_proto_path "${hw_proto}" PATH) |
||||
|
||||
# Generated sources |
||||
set(hw_proto_srcs "${CMAKE_CURRENT_BINARY_DIR}/helloworld.pb.cc") |
||||
set(hw_proto_hdrs "${CMAKE_CURRENT_BINARY_DIR}/helloworld.pb.h") |
||||
set(hw_grpc_srcs "${CMAKE_CURRENT_BINARY_DIR}/helloworld.grpc.pb.cc") |
||||
set(hw_grpc_hdrs "${CMAKE_CURRENT_BINARY_DIR}/helloworld.grpc.pb.h") |
||||
add_custom_command( |
||||
OUTPUT "${hw_proto_srcs}" "${hw_proto_hdrs}" "${hw_grpc_srcs}" "${hw_grpc_hdrs}" |
||||
COMMAND ${_PROTOBUF_PROTOC} |
||||
ARGS --grpc_out "${CMAKE_CURRENT_BINARY_DIR}" |
||||
--cpp_out "${CMAKE_CURRENT_BINARY_DIR}" |
||||
-I "${hw_proto_path}" |
||||
--plugin=protoc-gen-grpc="${_GRPC_CPP_PLUGIN_EXECUTABLE}" |
||||
"${hw_proto}" |
||||
DEPENDS "${hw_proto}") |
||||
|
||||
# Include generated *.pb.h files |
||||
include_directories("${CMAKE_CURRENT_BINARY_DIR}") |
||||
|
||||
# hw_grpc_proto |
||||
add_library(hw_grpc_proto |
||||
${hw_grpc_srcs} |
||||
${hw_grpc_hdrs} |
||||
${hw_proto_srcs} |
||||
${hw_proto_hdrs}) |
||||
target_link_libraries(hw_grpc_proto |
||||
${_REFLECTION} |
||||
${_GRPC_GRPCPP} |
||||
${_PROTOBUF_LIBPROTOBUF}) |
||||
|
||||
# Targets greeter_(client|server) |
||||
foreach(_target |
||||
greeter_client greeter_server) |
||||
add_executable(${_target} "${_target}.cc") |
||||
target_link_libraries(${_target} |
||||
hw_grpc_proto |
||||
${_REFLECTION} |
||||
${_GRPC_GRPCPP} |
||||
${_PROTOBUF_LIBPROTOBUF}) |
||||
endforeach() |
Binary file not shown.
@ -0,0 +1,50 @@ |
||||
<?php |
||||
// GENERATED CODE -- DO NOT EDIT! |
||||
|
||||
// Original file comments: |
||||
// Copyright 2015 gRPC authors. |
||||
// |
||||
// Licensed under the Apache License, Version 2.0 (the "License"); |
||||
// you may not use this file except in compliance with the License. |
||||
// You may obtain a copy of the License at |
||||
// |
||||
// http://www.apache.org/licenses/LICENSE-2.0 |
||||
// |
||||
// Unless required by applicable law or agreed to in writing, software |
||||
// distributed under the License is distributed on an "AS IS" BASIS, |
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
// See the License for the specific language governing permissions and |
||||
// limitations under the License. |
||||
// |
||||
namespace Helloworld; |
||||
|
||||
/** |
||||
* The greeting service definition. |
||||
*/ |
||||
class GreeterClient extends \Grpc\BaseStub { |
||||
|
||||
/** |
||||
* @param string $hostname hostname |
||||
* @param array $opts channel options |
||||
* @param \Grpc\Channel $channel (optional) re-use channel object |
||||
*/ |
||||
public function __construct($hostname, $opts, $channel = null) { |
||||
parent::__construct($hostname, $opts, $channel); |
||||
} |
||||
|
||||
/** |
||||
* Sends a greeting |
||||
* @param \Helloworld\HelloRequest $argument input argument |
||||
* @param array $metadata metadata |
||||
* @param array $options call options |
||||
* @return \Grpc\UnaryCall |
||||
*/ |
||||
public function SayHello(\Helloworld\HelloRequest $argument, |
||||
$metadata = [], $options = []) { |
||||
return $this->_simpleRequest('/helloworld.Greeter/SayHello', |
||||
$argument, |
||||
['\Helloworld\HelloReply', 'decode'], |
||||
$metadata, $options); |
||||
} |
||||
|
||||
} |
@ -0,0 +1,58 @@ |
||||
<?php |
||||
// GENERATED CODE -- DO NOT EDIT! |
||||
|
||||
// Original file comments: |
||||
// Copyright 2015 gRPC authors. |
||||
// |
||||
// Licensed under the Apache License, Version 2.0 (the "License"); |
||||
// you may not use this file except in compliance with the License. |
||||
// You may obtain a copy of the License at |
||||
// |
||||
// http://www.apache.org/licenses/LICENSE-2.0 |
||||
// |
||||
// Unless required by applicable law or agreed to in writing, software |
||||
// distributed under the License is distributed on an "AS IS" BASIS, |
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
// See the License for the specific language governing permissions and |
||||
// limitations under the License. |
||||
// |
||||
namespace Helloworld; |
||||
|
||||
/** |
||||
* The greeting service definition. |
||||
*/ |
||||
class GreeterStub { |
||||
|
||||
/** |
||||
* Sends a greeting |
||||
* @param \Helloworld\HelloRequest $request client request |
||||
* @param \Grpc\ServerContext $context server request context |
||||
* @return \Helloworld\HelloReply for response data, null if if error occured |
||||
* initial metadata (if any) and status (if not ok) should be set to $context |
||||
*/ |
||||
public function SayHello( |
||||
\Helloworld\HelloRequest $request, |
||||
\Grpc\ServerContext $context |
||||
): ?\Helloworld\HelloReply { |
||||
$context->setStatus(\Grpc\Status::unimplemented()); |
||||
return null; |
||||
} |
||||
|
||||
/** |
||||
* Get the method descriptors of the service for server registration |
||||
* |
||||
* @return array of \Grpc\MethodDescriptor for the service methods |
||||
*/ |
||||
public final function getMethodDescriptors(): array |
||||
{ |
||||
return [ |
||||
'/helloworld.Greeter/SayHello' => new \Grpc\MethodDescriptor( |
||||
$this, |
||||
'SayHello', |
||||
'\Helloworld\HelloRequest', |
||||
\Grpc\MethodDescriptor::UNARY_CALL |
||||
), |
||||
]; |
||||
} |
||||
|
||||
} |
@ -0,0 +1,60 @@ |
||||
<?php |
||||
# Generated by the protocol buffer compiler. DO NOT EDIT! |
||||
# source: helloworld.proto |
||||
|
||||
namespace Helloworld; |
||||
|
||||
use Google\Protobuf\Internal\GPBType; |
||||
use Google\Protobuf\Internal\RepeatedField; |
||||
use Google\Protobuf\Internal\GPBUtil; |
||||
|
||||
/** |
||||
* The response message containing the greetings |
||||
* |
||||
* Generated from protobuf message <code>helloworld.HelloReply</code> |
||||
*/ |
||||
class HelloReply extends \Google\Protobuf\Internal\Message |
||||
{ |
||||
/** |
||||
* Generated from protobuf field <code>string message = 1;</code> |
||||
*/ |
||||
protected $message = ''; |
||||
|
||||
/** |
||||
* Constructor. |
||||
* |
||||
* @param array $data { |
||||
* Optional. Data for populating the Message object. |
||||
* |
||||
* @type string $message |
||||
* } |
||||
*/ |
||||
public function __construct($data = NULL) { |
||||
\GPBMetadata\Helloworld::initOnce(); |
||||
parent::__construct($data); |
||||
} |
||||
|
||||
/** |
||||
* Generated from protobuf field <code>string message = 1;</code> |
||||
* @return string |
||||
*/ |
||||
public function getMessage() |
||||
{ |
||||
return $this->message; |
||||
} |
||||
|
||||
/** |
||||
* Generated from protobuf field <code>string message = 1;</code> |
||||
* @param string $var |
||||
* @return $this |
||||
*/ |
||||
public function setMessage($var) |
||||
{ |
||||
GPBUtil::checkString($var, True); |
||||
$this->message = $var; |
||||
|
||||
return $this; |
||||
} |
||||
|
||||
} |
||||
|
@ -0,0 +1,60 @@ |
||||
<?php |
||||
# Generated by the protocol buffer compiler. DO NOT EDIT! |
||||
# source: helloworld.proto |
||||
|
||||
namespace Helloworld; |
||||
|
||||
use Google\Protobuf\Internal\GPBType; |
||||
use Google\Protobuf\Internal\RepeatedField; |
||||
use Google\Protobuf\Internal\GPBUtil; |
||||
|
||||
/** |
||||
* The request message containing the user's name. |
||||
* |
||||
* Generated from protobuf message <code>helloworld.HelloRequest</code> |
||||
*/ |
||||
class HelloRequest extends \Google\Protobuf\Internal\Message |
||||
{ |
||||
/** |
||||
* Generated from protobuf field <code>string name = 1;</code> |
||||
*/ |
||||
protected $name = ''; |
||||
|
||||
/** |
||||
* Constructor. |
||||
* |
||||
* @param array $data { |
||||
* Optional. Data for populating the Message object. |
||||
* |
||||
* @type string $name |
||||
* } |
||||
*/ |
||||
public function __construct($data = NULL) { |
||||
\GPBMetadata\Helloworld::initOnce(); |
||||
parent::__construct($data); |
||||
} |
||||
|
||||
/** |
||||
* Generated from protobuf field <code>string name = 1;</code> |
||||
* @return string |
||||
*/ |
||||
public function getName() |
||||
{ |
||||
return $this->name; |
||||
} |
||||
|
||||
/** |
||||
* Generated from protobuf field <code>string name = 1;</code> |
||||
* @param string $var |
||||
* @return $this |
||||
*/ |
||||
public function setName($var) |
||||
{ |
||||
GPBUtil::checkString($var, True); |
||||
$this->name = $var; |
||||
|
||||
return $this; |
||||
} |
||||
|
||||
} |
||||
|
@ -1,56 +1,9 @@ |
||||
# gRPC PHP Quick Start Example |
||||
# gRPC PHP examples |
||||
|
||||
This directory contains the sources for the following PHP examples: |
||||
|
||||
## Prerequisites |
||||
- [Quick start][] |
||||
- [Basics tutorial][] |
||||
|
||||
This requires `php` >= 5.5, `pecl`, `composer` |
||||
|
||||
## Install |
||||
|
||||
- Install the `grpc` extension |
||||
|
||||
```sh |
||||
$ [sudo] pecl install grpc |
||||
``` |
||||
|
||||
- Install the `protoc` compiler plugin `grpc_php_plugin` |
||||
|
||||
```sh |
||||
$ git clone -b RELEASE_TAG_HERE https://github.com/grpc/grpc |
||||
$ cd grpc |
||||
$ make grpc_php_plugin |
||||
``` |
||||
|
||||
- Install the `grpc/grpc` composer package |
||||
|
||||
``` |
||||
$ cd examples/php |
||||
$ composer install |
||||
``` |
||||
|
||||
## Try it! |
||||
|
||||
- Run the server |
||||
|
||||
Please follow the instruction in [Node][] to run the server |
||||
``` |
||||
$ cd examples/node |
||||
$ npm install |
||||
$ cd dynamic_codegen or cd static_codegen |
||||
$ node greeter_server.js |
||||
``` |
||||
|
||||
- Generate proto files and run the client |
||||
|
||||
``` |
||||
$ cd examples/php |
||||
$ ./greeter_proto_gen.sh |
||||
$ ./run_greeter_client.sh |
||||
``` |
||||
|
||||
## In-depth Tutorial |
||||
|
||||
You can find a more detailed tutorial in [gRPC Basics: PHP][] |
||||
|
||||
[Node]:https://github.com/grpc/grpc/tree/master/examples/node |
||||
[gRPC Basics: PHP]:https://grpc.io/docs/languages/php/basics |
||||
[Quick start]: https://grpc.io/docs/languages/php/quickstart/ |
||||
[Basics tutorial]: https://grpc.io/docs/languages/php/basics/ |
||||
|
@ -0,0 +1,47 @@ |
||||
<?php |
||||
/* |
||||
* |
||||
* Copyright 2020 gRPC authors. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0 |
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
* |
||||
*/ |
||||
|
||||
require dirname(__FILE__) . '/../../src/php/lib/Grpc/MethodDescriptor.php'; |
||||
require dirname(__FILE__) . '/../../src/php/lib/Grpc/Status.php'; |
||||
require dirname(__FILE__) . '/../../src/php/lib/Grpc/ServerCallReader.php'; |
||||
require dirname(__FILE__) . '/../../src/php/lib/Grpc/ServerCallWriter.php'; |
||||
require dirname(__FILE__) . '/../../src/php/lib/Grpc/ServerContext.php'; |
||||
require dirname(__FILE__) . '/../../src/php/lib/Grpc/RpcServer.php'; |
||||
require dirname(__FILE__) . '/vendor/autoload.php'; |
||||
require dirname(__FILE__) . '/route_guide/RouteGuideService.php'; |
||||
|
||||
class Greeter extends \Helloworld\GreeterStub |
||||
{ |
||||
public function SayHello( |
||||
\Helloworld\HelloRequest $request, |
||||
\Grpc\ServerContext $serverContext |
||||
): ?\Helloworld\HelloReply { |
||||
$name = $request->getName(); |
||||
$response = new \Helloworld\HelloReply(); |
||||
$response->setMessage("Hello " . $name); |
||||
return $response; |
||||
} |
||||
} |
||||
|
||||
|
||||
$server = new \Grpc\RpcServer(); |
||||
$server->addHttp2Port('0.0.0.0:50051'); |
||||
$server->handle(new RouteGuideService(null)); |
||||
$server->handle(new Greeter()); |
||||
$server->run(); |
@ -0,0 +1,44 @@ |
||||
<?php |
||||
/* |
||||
* |
||||
* Copyright 2020 gRPC authors. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0 |
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
* |
||||
*/ |
||||
|
||||
require dirname(__FILE__) . '/../../src/php/lib/Grpc/MethodDescriptor.php'; |
||||
require dirname(__FILE__) . '/../../src/php/lib/Grpc/Status.php'; |
||||
require dirname(__FILE__) . '/../../src/php/lib/Grpc/ServerCallReader.php'; |
||||
require dirname(__FILE__) . '/../../src/php/lib/Grpc/ServerCallWriter.php'; |
||||
require dirname(__FILE__) . '/../../src/php/lib/Grpc/ServerContext.php'; |
||||
require dirname(__FILE__) . '/../../src/php/lib/Grpc/RpcServer.php'; |
||||
require dirname(__FILE__) . '/vendor/autoload.php'; |
||||
|
||||
class Greeter extends Helloworld\GreeterStub |
||||
{ |
||||
public function SayHello( |
||||
\Helloworld\HelloRequest $request, |
||||
\Grpc\ServerContext $serverContext |
||||
): ?\Helloworld\HelloReply { |
||||
$name = $request->getName(); |
||||
$response = new \Helloworld\HelloReply(); |
||||
$response->setMessage("Hello " . $name); |
||||
return $response; |
||||
} |
||||
} |
||||
|
||||
$server = new \Grpc\RpcServer(); |
||||
$server->addHttp2Port('0.0.0.0:50051'); |
||||
$server->handle(new Greeter()); |
||||
$server->run(); |
Binary file not shown.
@ -0,0 +1,182 @@ |
||||
<?php |
||||
/* |
||||
* |
||||
* Copyright 2020 gRPC authors. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0 |
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
* |
||||
*/ |
||||
|
||||
|
||||
class RouteGuideService extends \Routeguide\RouteGuideStub |
||||
{ |
||||
public function __construct($dbFilePath) |
||||
{ |
||||
$dbFilePath = $dbFilePath ?? dirname(__FILE__) . '/route_guide_db.json'; |
||||
$dbData = file_get_contents($dbFilePath); |
||||
if (!$dbData) { |
||||
throw new InvalidArgumentException( |
||||
"Error reading route db file: " . $dbFilePath |
||||
); |
||||
} |
||||
$featureList = json_decode($dbData); |
||||
if (!$featureList) { |
||||
throw new InvalidArgumentException( |
||||
"Error decoding route db file: " . $dbFilePath |
||||
); |
||||
} |
||||
foreach ($featureList as $feature) { |
||||
array_push($this->featureList, new Routeguide\Feature([ |
||||
'name' => $feature->name, |
||||
'location' => new Routeguide\Point([ |
||||
'latitude' => $feature->location->latitude, |
||||
'longitude' => $feature->location->longitude, |
||||
]), |
||||
])); |
||||
} |
||||
} |
||||
|
||||
private function findFeature(\Routeguide\Point $point) |
||||
{ |
||||
foreach ($this->featureList as $feature) { |
||||
$location = $feature->getLocation(); |
||||
if ( |
||||
$location->getLatitude() === $point->getLatitude() |
||||
&& $location->getLongitude() === $point->getLongitude() |
||||
) { |
||||
return $feature; |
||||
} |
||||
} |
||||
return null; |
||||
} |
||||
|
||||
// The formula is based on http://mathforum.org/library/drmath/view/51879.html |
||||
private function calculateDistance( |
||||
\Routeguide\Point $start, |
||||
\Routeguide\Point $end |
||||
) { |
||||
$toRadians = function (float $num) { |
||||
return $num * 3.1415926 / 180; |
||||
}; |
||||
$coordFactor = 10000000.0; |
||||
$R = 6371000; // metres |
||||
|
||||
$lat_1 = $start->getLatitude() / $coordFactor; |
||||
$lat_2 = $end->getLatitude() / $coordFactor; |
||||
$lon_1 = $start->getLongitude() / $coordFactor; |
||||
$lon_2 = $end->getLongitude() / $coordFactor; |
||||
$lat_rad_1 = $toRadians($lat_1); |
||||
$lat_rad_2 = $toRadians($lat_2); |
||||
$delta_lat_rad = $toRadians($lat_2 - $lat_1); |
||||
$delta_lon_rad = $toRadians($lon_2 - $lon_1); |
||||
|
||||
$a = pow(sin($delta_lat_rad / 2), 2) + |
||||
cos($lat_rad_1) * cos($lat_rad_2) * pow(sin($delta_lon_rad / 2), 2); |
||||
$c = 2 * atan2(sqrt($a), sqrt(1 - $a)); |
||||
|
||||
return $R * $c; |
||||
} |
||||
|
||||
public function GetFeature( |
||||
\Routeguide\Point $request, |
||||
\Grpc\ServerContext $serverContext |
||||
): ?\Routeguide\Feature { |
||||
$feature = $this->findFeature($request); |
||||
$notFoundFeature = new Routeguide\Feature([ |
||||
'name' => '', |
||||
'location' => $request, |
||||
]); |
||||
return $feature ?? $notFoundFeature; |
||||
} |
||||
|
||||
public function ListFeatures( |
||||
\Routeguide\Rectangle $request, |
||||
\Grpc\ServerCallWriter $writer, |
||||
\Grpc\ServerContext $serverContext |
||||
): void { |
||||
$lo = $request->getLo(); |
||||
$hi = $request->getHi(); |
||||
$left = min($lo->getLongitude(), $hi->getLongitude()); |
||||
$right = max($lo->getLongitude(), $hi->getLongitude()); |
||||
$top = max($lo->getLatitude(), $hi->getLatitude()); |
||||
$bottom = min($lo->getLatitude(), $hi->getLatitude()); |
||||
|
||||
foreach ($this->featureList as $feature) { |
||||
$longitude = $feature->getLocation()->getLongitude(); |
||||
$latitude = $feature->getLocation()->getLatitude(); |
||||
if ( |
||||
$longitude >= $left && $longitude <= $right |
||||
&& $latitude >= $bottom && $latitude <= $top |
||||
) { |
||||
$writer->write($feature); |
||||
} |
||||
} |
||||
|
||||
$writer->finish(); |
||||
} |
||||
|
||||
public function RecordRoute( |
||||
\Grpc\ServerCallReader $reader, |
||||
\Grpc\ServerContext $serverContext |
||||
): ?\Routeguide\RouteSummary { |
||||
$point_count = 0; |
||||
$feature_count = 0; |
||||
$distance = 0; |
||||
$previous = null; |
||||
|
||||
$start_time = time(); |
||||
while ($point = $reader->read()) { |
||||
$point_count++; |
||||
$feature = $this->findFeature($point); |
||||
if ($feature) { |
||||
$feature_count++; |
||||
if ($previous) { |
||||
$distance += $this->calculateDistance($previous, $point); |
||||
} |
||||
$previous = $point; |
||||
} |
||||
} |
||||
|
||||
$summary = new \Routeguide\RouteSummary(); |
||||
$summary->setPointCount($point_count); |
||||
$summary->setFeatureCount($feature_count); |
||||
$summary->setDistance($distance); |
||||
$summary->setElapsedTime(time() - $start_time); |
||||
|
||||
return $summary; |
||||
} |
||||
|
||||
public function RouteChat( |
||||
\Grpc\ServerCallReader $reader, |
||||
\Grpc\ServerCallWriter $writer, |
||||
\Grpc\ServerContext $serverContext |
||||
): void { |
||||
while ($note = $reader->read()) { |
||||
foreach ($this->received_notes as $n) { |
||||
if ( |
||||
$n->getLocation()->getLatitude() === |
||||
$note->getLocation()->getLatitude() |
||||
&& $n->getLocation()->getLongitude() === |
||||
$note->getLocation()->getLongitude() |
||||
) { |
||||
$writer->write($n); |
||||
} |
||||
} |
||||
array_push($this->received_notes, $note); |
||||
} |
||||
$writer->finish(); |
||||
} |
||||
|
||||
private $received_notes = []; |
||||
private $featureList = []; |
||||
} |
@ -0,0 +1,112 @@ |
||||
<?php |
||||
# Generated by the protocol buffer compiler. DO NOT EDIT! |
||||
# source: route_guide.proto |
||||
|
||||
namespace Routeguide; |
||||
|
||||
use Google\Protobuf\Internal\GPBType; |
||||
use Google\Protobuf\Internal\RepeatedField; |
||||
use Google\Protobuf\Internal\GPBUtil; |
||||
|
||||
/** |
||||
* A feature names something at a given point. |
||||
* If a feature could not be named, the name is empty. |
||||
* |
||||
* Generated from protobuf message <code>routeguide.Feature</code> |
||||
*/ |
||||
class Feature extends \Google\Protobuf\Internal\Message |
||||
{ |
||||
/** |
||||
* The name of the feature. |
||||
* |
||||
* Generated from protobuf field <code>string name = 1;</code> |
||||
*/ |
||||
protected $name = ''; |
||||
/** |
||||
* The point where the feature is detected. |
||||
* |
||||
* Generated from protobuf field <code>.routeguide.Point location = 2;</code> |
||||
*/ |
||||
protected $location = null; |
||||
|
||||
/** |
||||
* Constructor. |
||||
* |
||||
* @param array $data { |
||||
* Optional. Data for populating the Message object. |
||||
* |
||||
* @type string $name |
||||
* The name of the feature. |
||||
* @type \Routeguide\Point $location |
||||
* The point where the feature is detected. |
||||
* } |
||||
*/ |
||||
public function __construct($data = NULL) { |
||||
\GPBMetadata\RouteGuide::initOnce(); |
||||
parent::__construct($data); |
||||
} |
||||
|
||||
/** |
||||
* The name of the feature. |
||||
* |
||||
* Generated from protobuf field <code>string name = 1;</code> |
||||
* @return string |
||||
*/ |
||||
public function getName() |
||||
{ |
||||
return $this->name; |
||||
} |
||||
|
||||
/** |
||||
* The name of the feature. |
||||
* |
||||
* Generated from protobuf field <code>string name = 1;</code> |
||||
* @param string $var |
||||
* @return $this |
||||
*/ |
||||
public function setName($var) |
||||
{ |
||||
GPBUtil::checkString($var, True); |
||||
$this->name = $var; |
||||
|
||||
return $this; |
||||
} |
||||
|
||||
/** |
||||
* The point where the feature is detected. |
||||
* |
||||
* Generated from protobuf field <code>.routeguide.Point location = 2;</code> |
||||
* @return \Routeguide\Point|null |
||||
*/ |
||||
public function getLocation() |
||||
{ |
||||
return isset($this->location) ? $this->location : null; |
||||
} |
||||
|
||||
public function hasLocation() |
||||
{ |
||||
return isset($this->location); |
||||
} |
||||
|
||||
public function clearLocation() |
||||
{ |
||||
unset($this->location); |
||||
} |
||||
|
||||
/** |
||||
* The point where the feature is detected. |
||||
* |
||||
* Generated from protobuf field <code>.routeguide.Point location = 2;</code> |
||||
* @param \Routeguide\Point $var |
||||
* @return $this |
||||
*/ |
||||
public function setLocation($var) |
||||
{ |
||||
GPBUtil::checkMessage($var, \Routeguide\Point::class); |
||||
$this->location = $var; |
||||
|
||||
return $this; |
||||
} |
||||
|
||||
} |
||||
|
@ -0,0 +1,90 @@ |
||||
<?php |
||||
# Generated by the protocol buffer compiler. DO NOT EDIT! |
||||
# source: route_guide.proto |
||||
|
||||
namespace Routeguide; |
||||
|
||||
use Google\Protobuf\Internal\GPBType; |
||||
use Google\Protobuf\Internal\RepeatedField; |
||||
use Google\Protobuf\Internal\GPBUtil; |
||||
|
||||
/** |
||||
* Points are represented as latitude-longitude pairs in the E7 representation |
||||
* (degrees multiplied by 10**7 and rounded to the nearest integer). |
||||
* Latitudes should be in the range +/- 90 degrees and longitude should be in |
||||
* the range +/- 180 degrees (inclusive). |
||||
* |
||||
* Generated from protobuf message <code>routeguide.Point</code> |
||||
*/ |
||||
class Point extends \Google\Protobuf\Internal\Message |
||||
{ |
||||
/** |
||||
* Generated from protobuf field <code>int32 latitude = 1;</code> |
||||
*/ |
||||
protected $latitude = 0; |
||||
/** |
||||
* Generated from protobuf field <code>int32 longitude = 2;</code> |
||||
*/ |
||||
protected $longitude = 0; |
||||
|
||||
/** |
||||
* Constructor. |
||||
* |
||||
* @param array $data { |
||||
* Optional. Data for populating the Message object. |
||||
* |
||||
* @type int $latitude |
||||
* @type int $longitude |
||||
* } |
||||
*/ |
||||
public function __construct($data = NULL) { |
||||
\GPBMetadata\RouteGuide::initOnce(); |
||||
parent::__construct($data); |
||||
} |
||||
|
||||
/** |
||||
* Generated from protobuf field <code>int32 latitude = 1;</code> |
||||
* @return int |
||||
*/ |
||||
public function getLatitude() |
||||
{ |
||||
return $this->latitude; |
||||
} |
||||
|
||||
/** |
||||
* Generated from protobuf field <code>int32 latitude = 1;</code> |
||||
* @param int $var |
||||
* @return $this |
||||
*/ |
||||
public function setLatitude($var) |
||||
{ |
||||
GPBUtil::checkInt32($var); |
||||
$this->latitude = $var; |
||||
|
||||
return $this; |
||||
} |
||||
|
||||
/** |
||||
* Generated from protobuf field <code>int32 longitude = 2;</code> |
||||
* @return int |
||||
*/ |
||||
public function getLongitude() |
||||
{ |
||||
return $this->longitude; |
||||
} |
||||
|
||||
/** |
||||
* Generated from protobuf field <code>int32 longitude = 2;</code> |
||||
* @param int $var |
||||
* @return $this |
||||
*/ |
||||
public function setLongitude($var) |
||||
{ |
||||
GPBUtil::checkInt32($var); |
||||
$this->longitude = $var; |
||||
|
||||
return $this; |
||||
} |
||||
|
||||
} |
||||
|
@ -0,0 +1,122 @@ |
||||
<?php |
||||
# Generated by the protocol buffer compiler. DO NOT EDIT! |
||||
# source: route_guide.proto |
||||
|
||||
namespace Routeguide; |
||||
|
||||
use Google\Protobuf\Internal\GPBType; |
||||
use Google\Protobuf\Internal\RepeatedField; |
||||
use Google\Protobuf\Internal\GPBUtil; |
||||
|
||||
/** |
||||
* A latitude-longitude rectangle, represented as two diagonally opposite |
||||
* points "lo" and "hi". |
||||
* |
||||
* Generated from protobuf message <code>routeguide.Rectangle</code> |
||||
*/ |
||||
class Rectangle extends \Google\Protobuf\Internal\Message |
||||
{ |
||||
/** |
||||
* One corner of the rectangle. |
||||
* |
||||
* Generated from protobuf field <code>.routeguide.Point lo = 1;</code> |
||||
*/ |
||||
protected $lo = null; |
||||
/** |
||||
* The other corner of the rectangle. |
||||
* |
||||
* Generated from protobuf field <code>.routeguide.Point hi = 2;</code> |
||||
*/ |
||||
protected $hi = null; |
||||
|
||||
/** |
||||
* Constructor. |
||||
* |
||||
* @param array $data { |
||||
* Optional. Data for populating the Message object. |
||||
* |
||||
* @type \Routeguide\Point $lo |
||||
* One corner of the rectangle. |
||||
* @type \Routeguide\Point $hi |
||||
* The other corner of the rectangle. |
||||
* } |
||||
*/ |
||||
public function __construct($data = NULL) { |
||||
\GPBMetadata\RouteGuide::initOnce(); |
||||
parent::__construct($data); |
||||
} |
||||
|
||||
/** |
||||
* One corner of the rectangle. |
||||
* |
||||
* Generated from protobuf field <code>.routeguide.Point lo = 1;</code> |
||||
* @return \Routeguide\Point|null |
||||
*/ |
||||
public function getLo() |
||||
{ |
||||
return isset($this->lo) ? $this->lo : null; |
||||
} |
||||
|
||||
public function hasLo() |
||||
{ |
||||
return isset($this->lo); |
||||
} |
||||
|
||||
public function clearLo() |
||||
{ |
||||
unset($this->lo); |
||||
} |
||||
|
||||
/** |
||||
* One corner of the rectangle. |
||||
* |
||||
* Generated from protobuf field <code>.routeguide.Point lo = 1;</code> |
||||
* @param \Routeguide\Point $var |
||||
* @return $this |
||||
*/ |
||||
public function setLo($var) |
||||
{ |
||||
GPBUtil::checkMessage($var, \Routeguide\Point::class); |
||||
$this->lo = $var; |
||||
|
||||
return $this; |
||||
} |
||||
|
||||
/** |
||||
* The other corner of the rectangle. |
||||
* |
||||
* Generated from protobuf field <code>.routeguide.Point hi = 2;</code> |
||||
* @return \Routeguide\Point|null |
||||
*/ |
||||
public function getHi() |
||||
{ |
||||
return isset($this->hi) ? $this->hi : null; |
||||
} |
||||
|
||||
public function hasHi() |
||||
{ |
||||
return isset($this->hi); |
||||
} |
||||
|
||||
public function clearHi() |
||||
{ |
||||
unset($this->hi); |
||||
} |
||||
|
||||
/** |
||||
* The other corner of the rectangle. |
||||
* |
||||
* Generated from protobuf field <code>.routeguide.Point hi = 2;</code> |
||||
* @param \Routeguide\Point $var |
||||
* @return $this |
||||
*/ |
||||
public function setHi($var) |
||||
{ |
||||
GPBUtil::checkMessage($var, \Routeguide\Point::class); |
||||
$this->hi = $var; |
||||
|
||||
return $this; |
||||
} |
||||
|
||||
} |
||||
|
@ -0,0 +1,105 @@ |
||||
<?php |
||||
// GENERATED CODE -- DO NOT EDIT! |
||||
|
||||
// Original file comments: |
||||
// Copyright 2015 gRPC authors. |
||||
// |
||||
// Licensed under the Apache License, Version 2.0 (the "License"); |
||||
// you may not use this file except in compliance with the License. |
||||
// You may obtain a copy of the License at |
||||
// |
||||
// http://www.apache.org/licenses/LICENSE-2.0 |
||||
// |
||||
// Unless required by applicable law or agreed to in writing, software |
||||
// distributed under the License is distributed on an "AS IS" BASIS, |
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
// See the License for the specific language governing permissions and |
||||
// limitations under the License. |
||||
// |
||||
namespace Routeguide; |
||||
|
||||
/** |
||||
* Interface exported by the server. |
||||
*/ |
||||
class RouteGuideClient extends \Grpc\BaseStub { |
||||
|
||||
/** |
||||
* @param string $hostname hostname |
||||
* @param array $opts channel options |
||||
* @param \Grpc\Channel $channel (optional) re-use channel object |
||||
*/ |
||||
public function __construct($hostname, $opts, $channel = null) { |
||||
parent::__construct($hostname, $opts, $channel); |
||||
} |
||||
|
||||
/** |
||||
* A simple RPC. |
||||
* |
||||
* Obtains the feature at a given position. |
||||
* |
||||
* A feature with an empty name is returned if there's no feature at the given |
||||
* position. |
||||
* @param \Routeguide\Point $argument input argument |
||||
* @param array $metadata metadata |
||||
* @param array $options call options |
||||
* @return \Grpc\UnaryCall |
||||
*/ |
||||
public function GetFeature(\Routeguide\Point $argument, |
||||
$metadata = [], $options = []) { |
||||
return $this->_simpleRequest('/routeguide.RouteGuide/GetFeature', |
||||
$argument, |
||||
['\Routeguide\Feature', 'decode'], |
||||
$metadata, $options); |
||||
} |
||||
|
||||
/** |
||||
* A server-to-client streaming RPC. |
||||
* |
||||
* Obtains the Features available within the given Rectangle. Results are |
||||
* streamed rather than returned at once (e.g. in a response message with a |
||||
* repeated field), as the rectangle may cover a large area and contain a |
||||
* huge number of features. |
||||
* @param \Routeguide\Rectangle $argument input argument |
||||
* @param array $metadata metadata |
||||
* @param array $options call options |
||||
* @return \Grpc\ServerStreamingCall |
||||
*/ |
||||
public function ListFeatures(\Routeguide\Rectangle $argument, |
||||
$metadata = [], $options = []) { |
||||
return $this->_serverStreamRequest('/routeguide.RouteGuide/ListFeatures', |
||||
$argument, |
||||
['\Routeguide\Feature', 'decode'], |
||||
$metadata, $options); |
||||
} |
||||
|
||||
/** |
||||
* A client-to-server streaming RPC. |
||||
* |
||||
* Accepts a stream of Points on a route being traversed, returning a |
||||
* RouteSummary when traversal is completed. |
||||
* @param array $metadata metadata |
||||
* @param array $options call options |
||||
* @return \Grpc\ClientStreamingCall |
||||
*/ |
||||
public function RecordRoute($metadata = [], $options = []) { |
||||
return $this->_clientStreamRequest('/routeguide.RouteGuide/RecordRoute', |
||||
['\Routeguide\RouteSummary','decode'], |
||||
$metadata, $options); |
||||
} |
||||
|
||||
/** |
||||
* A Bidirectional streaming RPC. |
||||
* |
||||
* Accepts a stream of RouteNotes sent while a route is being traversed, |
||||
* while receiving other RouteNotes (e.g. from other users). |
||||
* @param array $metadata metadata |
||||
* @param array $options call options |
||||
* @return \Grpc\BidiStreamingCall |
||||
*/ |
||||
public function RouteChat($metadata = [], $options = []) { |
||||
return $this->_bidiRequest('/routeguide.RouteGuide/RouteChat', |
||||
['\Routeguide\RouteNote','decode'], |
||||
$metadata, $options); |
||||
} |
||||
|
||||
} |
@ -0,0 +1,139 @@ |
||||
<?php |
||||
// GENERATED CODE -- DO NOT EDIT! |
||||
|
||||
// Original file comments: |
||||
// Copyright 2015 gRPC authors. |
||||
// |
||||
// Licensed under the Apache License, Version 2.0 (the "License"); |
||||
// you may not use this file except in compliance with the License. |
||||
// You may obtain a copy of the License at |
||||
// |
||||
// http://www.apache.org/licenses/LICENSE-2.0 |
||||
// |
||||
// Unless required by applicable law or agreed to in writing, software |
||||
// distributed under the License is distributed on an "AS IS" BASIS, |
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
// See the License for the specific language governing permissions and |
||||
// limitations under the License. |
||||
// |
||||
namespace Routeguide; |
||||
|
||||
/** |
||||
* Interface exported by the server. |
||||
*/ |
||||
class RouteGuideStub { |
||||
|
||||
/** |
||||
* A simple RPC. |
||||
* |
||||
* Obtains the feature at a given position. |
||||
* |
||||
* A feature with an empty name is returned if there's no feature at the given |
||||
* position. |
||||
* @param \Routeguide\Point $request client request |
||||
* @param \Grpc\ServerContext $context server request context |
||||
* @return \Routeguide\Feature for response data, null if if error occured |
||||
* initial metadata (if any) and status (if not ok) should be set to $context |
||||
*/ |
||||
public function GetFeature( |
||||
\Routeguide\Point $request, |
||||
\Grpc\ServerContext $context |
||||
): ?\Routeguide\Feature { |
||||
$context->setStatus(\Grpc\Status::unimplemented()); |
||||
return null; |
||||
} |
||||
|
||||
/** |
||||
* A server-to-client streaming RPC. |
||||
* |
||||
* Obtains the Features available within the given Rectangle. Results are |
||||
* streamed rather than returned at once (e.g. in a response message with a |
||||
* repeated field), as the rectangle may cover a large area and contain a |
||||
* huge number of features. |
||||
* @param \Routeguide\Rectangle $request client request |
||||
* @param \Grpc\ServerCallWriter $writer write response data of \Routeguide\Feature |
||||
* @param \Grpc\ServerContext $context server request context |
||||
* @return void |
||||
*/ |
||||
public function ListFeatures( |
||||
\Routeguide\Rectangle $request, |
||||
\Grpc\ServerCallWriter $writer, |
||||
\Grpc\ServerContext $context |
||||
): void { |
||||
$context->setStatus(\Grpc\Status::unimplemented()); |
||||
$writer->finish(); |
||||
} |
||||
|
||||
/** |
||||
* A client-to-server streaming RPC. |
||||
* |
||||
* Accepts a stream of Points on a route being traversed, returning a |
||||
* RouteSummary when traversal is completed. |
||||
* @param \Grpc\ServerCallReader $reader read client request data of \Routeguide\Point |
||||
* @param \Grpc\ServerContext $context server request context |
||||
* @return \Routeguide\RouteSummary for response data, null if if error occured |
||||
* initial metadata (if any) and status (if not ok) should be set to $context |
||||
*/ |
||||
public function RecordRoute( |
||||
\Grpc\ServerCallReader $reader, |
||||
\Grpc\ServerContext $context |
||||
): ?\Routeguide\RouteSummary { |
||||
$context->setStatus(\Grpc\Status::unimplemented()); |
||||
return null; |
||||
} |
||||
|
||||
/** |
||||
* A Bidirectional streaming RPC. |
||||
* |
||||
* Accepts a stream of RouteNotes sent while a route is being traversed, |
||||
* while receiving other RouteNotes (e.g. from other users). |
||||
* @param \Grpc\ServerCallReader $reader read client request data of \Routeguide\RouteNote |
||||
* @param \Grpc\ServerCallWriter $writer write response data of \Routeguide\RouteNote |
||||
* @param \Grpc\ServerContext $context server request context |
||||
* @return void |
||||
*/ |
||||
public function RouteChat( |
||||
\Grpc\ServerCallReader $reader, |
||||
\Grpc\ServerCallWriter $writer, |
||||
\Grpc\ServerContext $context |
||||
): void { |
||||
$context->setStatus(\Grpc\Status::unimplemented()); |
||||
$writer->finish(); |
||||
} |
||||
|
||||
/** |
||||
* Get the method descriptors of the service for server registration |
||||
* |
||||
* @return array of \Grpc\MethodDescriptor for the service methods |
||||
*/ |
||||
public final function getMethodDescriptors(): array |
||||
{ |
||||
return [ |
||||
'/routeguide.RouteGuide/GetFeature' => new \Grpc\MethodDescriptor( |
||||
$this, |
||||
'GetFeature', |
||||
'\Routeguide\Point', |
||||
\Grpc\MethodDescriptor::UNARY_CALL |
||||
), |
||||
'/routeguide.RouteGuide/ListFeatures' => new \Grpc\MethodDescriptor( |
||||
$this, |
||||
'ListFeatures', |
||||
'\Routeguide\Rectangle', |
||||
\Grpc\MethodDescriptor::SERVER_STREAMING_CALL |
||||
), |
||||
'/routeguide.RouteGuide/RecordRoute' => new \Grpc\MethodDescriptor( |
||||
$this, |
||||
'RecordRoute', |
||||
'\Routeguide\Point', |
||||
\Grpc\MethodDescriptor::CLIENT_STREAMING_CALL |
||||
), |
||||
'/routeguide.RouteGuide/RouteChat' => new \Grpc\MethodDescriptor( |
||||
$this, |
||||
'RouteChat', |
||||
'\Routeguide\RouteNote', |
||||
\Grpc\MethodDescriptor::BIDI_STREAMING_CALL |
||||
), |
||||
]; |
||||
} |
||||
|
||||
} |
@ -0,0 +1,111 @@ |
||||
<?php |
||||
# Generated by the protocol buffer compiler. DO NOT EDIT! |
||||
# source: route_guide.proto |
||||
|
||||
namespace Routeguide; |
||||
|
||||
use Google\Protobuf\Internal\GPBType; |
||||
use Google\Protobuf\Internal\RepeatedField; |
||||
use Google\Protobuf\Internal\GPBUtil; |
||||
|
||||
/** |
||||
* A RouteNote is a message sent while at a given point. |
||||
* |
||||
* Generated from protobuf message <code>routeguide.RouteNote</code> |
||||
*/ |
||||
class RouteNote extends \Google\Protobuf\Internal\Message |
||||
{ |
||||
/** |
||||
* The location from which the message is sent. |
||||
* |
||||
* Generated from protobuf field <code>.routeguide.Point location = 1;</code> |
||||
*/ |
||||
protected $location = null; |
||||
/** |
||||
* The message to be sent. |
||||
* |
||||
* Generated from protobuf field <code>string message = 2;</code> |
||||
*/ |
||||
protected $message = ''; |
||||
|
||||
/** |
||||
* Constructor. |
||||
* |
||||
* @param array $data { |
||||
* Optional. Data for populating the Message object. |
||||
* |
||||
* @type \Routeguide\Point $location |
||||
* The location from which the message is sent. |
||||
* @type string $message |
||||
* The message to be sent. |
||||
* } |
||||
*/ |
||||
public function __construct($data = NULL) { |
||||
\GPBMetadata\RouteGuide::initOnce(); |
||||
parent::__construct($data); |
||||
} |
||||
|
||||
/** |
||||
* The location from which the message is sent. |
||||
* |
||||
* Generated from protobuf field <code>.routeguide.Point location = 1;</code> |
||||
* @return \Routeguide\Point|null |
||||
*/ |
||||
public function getLocation() |
||||
{ |
||||
return isset($this->location) ? $this->location : null; |
||||
} |
||||
|
||||
public function hasLocation() |
||||
{ |
||||
return isset($this->location); |
||||
} |
||||
|
||||
public function clearLocation() |
||||
{ |
||||
unset($this->location); |
||||
} |
||||
|
||||
/** |
||||
* The location from which the message is sent. |
||||
* |
||||
* Generated from protobuf field <code>.routeguide.Point location = 1;</code> |
||||
* @param \Routeguide\Point $var |
||||
* @return $this |
||||
*/ |
||||
public function setLocation($var) |
||||
{ |
||||
GPBUtil::checkMessage($var, \Routeguide\Point::class); |
||||
$this->location = $var; |
||||
|
||||
return $this; |
||||
} |
||||
|
||||
/** |
||||
* The message to be sent. |
||||
* |
||||
* Generated from protobuf field <code>string message = 2;</code> |
||||
* @return string |
||||
*/ |
||||
public function getMessage() |
||||
{ |
||||
return $this->message; |
||||
} |
||||
|
||||
/** |
||||
* The message to be sent. |
||||
* |
||||
* Generated from protobuf field <code>string message = 2;</code> |
||||
* @param string $var |
||||
* @return $this |
||||
*/ |
||||
public function setMessage($var) |
||||
{ |
||||
GPBUtil::checkString($var, True); |
||||
$this->message = $var; |
||||
|
||||
return $this; |
||||
} |
||||
|
||||
} |
||||
|
@ -0,0 +1,172 @@ |
||||
<?php |
||||
# Generated by the protocol buffer compiler. DO NOT EDIT! |
||||
# source: route_guide.proto |
||||
|
||||
namespace Routeguide; |
||||
|
||||
use Google\Protobuf\Internal\GPBType; |
||||
use Google\Protobuf\Internal\RepeatedField; |
||||
use Google\Protobuf\Internal\GPBUtil; |
||||
|
||||
/** |
||||
* A RouteSummary is received in response to a RecordRoute rpc. |
||||
* It contains the number of individual points received, the number of |
||||
* detected features, and the total distance covered as the cumulative sum of |
||||
* the distance between each point. |
||||
* |
||||
* Generated from protobuf message <code>routeguide.RouteSummary</code> |
||||
*/ |
||||
class RouteSummary extends \Google\Protobuf\Internal\Message |
||||
{ |
||||
/** |
||||
* The number of points received. |
||||
* |
||||
* Generated from protobuf field <code>int32 point_count = 1;</code> |
||||
*/ |
||||
protected $point_count = 0; |
||||
/** |
||||
* The number of known features passed while traversing the route. |
||||
* |
||||
* Generated from protobuf field <code>int32 feature_count = 2;</code> |
||||
*/ |
||||
protected $feature_count = 0; |
||||
/** |
||||
* The distance covered in metres. |
||||
* |
||||
* Generated from protobuf field <code>int32 distance = 3;</code> |
||||
*/ |
||||
protected $distance = 0; |
||||
/** |
||||
* The duration of the traversal in seconds. |
||||
* |
||||
* Generated from protobuf field <code>int32 elapsed_time = 4;</code> |
||||
*/ |
||||
protected $elapsed_time = 0; |
||||
|
||||
/** |
||||
* Constructor. |
||||
* |
||||
* @param array $data { |
||||
* Optional. Data for populating the Message object. |
||||
* |
||||
* @type int $point_count |
||||
* The number of points received. |
||||
* @type int $feature_count |
||||
* The number of known features passed while traversing the route. |
||||
* @type int $distance |
||||
* The distance covered in metres. |
||||
* @type int $elapsed_time |
||||
* The duration of the traversal in seconds. |
||||
* } |
||||
*/ |
||||
public function __construct($data = NULL) { |
||||
\GPBMetadata\RouteGuide::initOnce(); |
||||
parent::__construct($data); |
||||
} |
||||
|
||||
/** |
||||
* The number of points received. |
||||
* |
||||
* Generated from protobuf field <code>int32 point_count = 1;</code> |
||||
* @return int |
||||
*/ |
||||
public function getPointCount() |
||||
{ |
||||
return $this->point_count; |
||||
} |
||||
|
||||
/** |
||||
* The number of points received. |
||||
* |
||||
* Generated from protobuf field <code>int32 point_count = 1;</code> |
||||
* @param int $var |
||||
* @return $this |
||||
*/ |
||||
public function setPointCount($var) |
||||
{ |
||||
GPBUtil::checkInt32($var); |
||||
$this->point_count = $var; |
||||
|
||||
return $this; |
||||
} |
||||
|
||||
/** |
||||
* The number of known features passed while traversing the route. |
||||
* |
||||
* Generated from protobuf field <code>int32 feature_count = 2;</code> |
||||
* @return int |
||||
*/ |
||||
public function getFeatureCount() |
||||
{ |
||||
return $this->feature_count; |
||||
} |
||||
|
||||
/** |
||||
* The number of known features passed while traversing the route. |
||||
* |
||||
* Generated from protobuf field <code>int32 feature_count = 2;</code> |
||||
* @param int $var |
||||
* @return $this |
||||
*/ |
||||
public function setFeatureCount($var) |
||||
{ |
||||
GPBUtil::checkInt32($var); |
||||
$this->feature_count = $var; |
||||
|
||||
return $this; |
||||
} |
||||
|
||||
/** |
||||
* The distance covered in metres. |
||||
* |
||||
* Generated from protobuf field <code>int32 distance = 3;</code> |
||||
* @return int |
||||
*/ |
||||
public function getDistance() |
||||
{ |
||||
return $this->distance; |
||||
} |
||||
|
||||
/** |
||||
* The distance covered in metres. |
||||
* |
||||
* Generated from protobuf field <code>int32 distance = 3;</code> |
||||
* @param int $var |
||||
* @return $this |
||||
*/ |
||||
public function setDistance($var) |
||||
{ |
||||
GPBUtil::checkInt32($var); |
||||
$this->distance = $var; |
||||
|
||||
return $this; |
||||
} |
||||
|
||||
/** |
||||
* The duration of the traversal in seconds. |
||||
* |
||||
* Generated from protobuf field <code>int32 elapsed_time = 4;</code> |
||||
* @return int |
||||
*/ |
||||
public function getElapsedTime() |
||||
{ |
||||
return $this->elapsed_time; |
||||
} |
||||
|
||||
/** |
||||
* The duration of the traversal in seconds. |
||||
* |
||||
* Generated from protobuf field <code>int32 elapsed_time = 4;</code> |
||||
* @param int $var |
||||
* @return $this |
||||
*/ |
||||
public function setElapsedTime($var) |
||||
{ |
||||
GPBUtil::checkInt32($var); |
||||
$this->elapsed_time = $var; |
||||
|
||||
return $this; |
||||
} |
||||
|
||||
} |
||||
|
@ -0,0 +1,601 @@ |
||||
[{ |
||||
"location": { |
||||
"latitude": 407838351, |
||||
"longitude": -746143763 |
||||
}, |
||||
"name": "Patriots Path, Mendham, NJ 07945, USA" |
||||
}, { |
||||
"location": { |
||||
"latitude": 408122808, |
||||
"longitude": -743999179 |
||||
}, |
||||
"name": "101 New Jersey 10, Whippany, NJ 07981, USA" |
||||
}, { |
||||
"location": { |
||||
"latitude": 413628156, |
||||
"longitude": -749015468 |
||||
}, |
||||
"name": "U.S. 6, Shohola, PA 18458, USA" |
||||
}, { |
||||
"location": { |
||||
"latitude": 419999544, |
||||
"longitude": -740371136 |
||||
}, |
||||
"name": "5 Conners Road, Kingston, NY 12401, USA" |
||||
}, { |
||||
"location": { |
||||
"latitude": 414008389, |
||||
"longitude": -743951297 |
||||
}, |
||||
"name": "Mid Hudson Psychiatric Center, New Hampton, NY 10958, USA" |
||||
}, { |
||||
"location": { |
||||
"latitude": 419611318, |
||||
"longitude": -746524769 |
||||
}, |
||||
"name": "287 Flugertown Road, Livingston Manor, NY 12758, USA" |
||||
}, { |
||||
"location": { |
||||
"latitude": 406109563, |
||||
"longitude": -742186778 |
||||
}, |
||||
"name": "4001 Tremley Point Road, Linden, NJ 07036, USA" |
||||
}, { |
||||
"location": { |
||||
"latitude": 416802456, |
||||
"longitude": -742370183 |
||||
}, |
||||
"name": "352 South Mountain Road, Wallkill, NY 12589, USA" |
||||
}, { |
||||
"location": { |
||||
"latitude": 412950425, |
||||
"longitude": -741077389 |
||||
}, |
||||
"name": "Bailey Turn Road, Harriman, NY 10926, USA" |
||||
}, { |
||||
"location": { |
||||
"latitude": 412144655, |
||||
"longitude": -743949739 |
||||
}, |
||||
"name": "193-199 Wawayanda Road, Hewitt, NJ 07421, USA" |
||||
}, { |
||||
"location": { |
||||
"latitude": 415736605, |
||||
"longitude": -742847522 |
||||
}, |
||||
"name": "406-496 Ward Avenue, Pine Bush, NY 12566, USA" |
||||
}, { |
||||
"location": { |
||||
"latitude": 413843930, |
||||
"longitude": -740501726 |
||||
}, |
||||
"name": "162 Merrill Road, Highland Mills, NY 10930, USA" |
||||
}, { |
||||
"location": { |
||||
"latitude": 410873075, |
||||
"longitude": -744459023 |
||||
}, |
||||
"name": "Clinton Road, West Milford, NJ 07480, USA" |
||||
}, { |
||||
"location": { |
||||
"latitude": 412346009, |
||||
"longitude": -744026814 |
||||
}, |
||||
"name": "16 Old Brook Lane, Warwick, NY 10990, USA" |
||||
}, { |
||||
"location": { |
||||
"latitude": 402948455, |
||||
"longitude": -747903913 |
||||
}, |
||||
"name": "3 Drake Lane, Pennington, NJ 08534, USA" |
||||
}, { |
||||
"location": { |
||||
"latitude": 406337092, |
||||
"longitude": -740122226 |
||||
}, |
||||
"name": "6324 8th Avenue, Brooklyn, NY 11220, USA" |
||||
}, { |
||||
"location": { |
||||
"latitude": 406421967, |
||||
"longitude": -747727624 |
||||
}, |
||||
"name": "1 Merck Access Road, Whitehouse Station, NJ 08889, USA" |
||||
}, { |
||||
"location": { |
||||
"latitude": 416318082, |
||||
"longitude": -749677716 |
||||
}, |
||||
"name": "78-98 Schalck Road, Narrowsburg, NY 12764, USA" |
||||
}, { |
||||
"location": { |
||||
"latitude": 415301720, |
||||
"longitude": -748416257 |
||||
}, |
||||
"name": "282 Lakeview Drive Road, Highland Lake, NY 12743, USA" |
||||
}, { |
||||
"location": { |
||||
"latitude": 402647019, |
||||
"longitude": -747071791 |
||||
}, |
||||
"name": "330 Evelyn Avenue, Hamilton Township, NJ 08619, USA" |
||||
}, { |
||||
"location": { |
||||
"latitude": 412567807, |
||||
"longitude": -741058078 |
||||
}, |
||||
"name": "New York State Reference Route 987E, Southfields, NY 10975, USA" |
||||
}, { |
||||
"location": { |
||||
"latitude": 416855156, |
||||
"longitude": -744420597 |
||||
}, |
||||
"name": "103-271 Tempaloni Road, Ellenville, NY 12428, USA" |
||||
}, { |
||||
"location": { |
||||
"latitude": 404663628, |
||||
"longitude": -744820157 |
||||
}, |
||||
"name": "1300 Airport Road, North Brunswick Township, NJ 08902, USA" |
||||
}, { |
||||
"location": { |
||||
"latitude": 407113723, |
||||
"longitude": -749746483 |
||||
}, |
||||
"name": "" |
||||
}, { |
||||
"location": { |
||||
"latitude": 402133926, |
||||
"longitude": -743613249 |
||||
}, |
||||
"name": "" |
||||
}, { |
||||
"location": { |
||||
"latitude": 400273442, |
||||
"longitude": -741220915 |
||||
}, |
||||
"name": "" |
||||
}, { |
||||
"location": { |
||||
"latitude": 411236786, |
||||
"longitude": -744070769 |
||||
}, |
||||
"name": "" |
||||
}, { |
||||
"location": { |
||||
"latitude": 411633782, |
||||
"longitude": -746784970 |
||||
}, |
||||
"name": "211-225 Plains Road, Augusta, NJ 07822, USA" |
||||
}, { |
||||
"location": { |
||||
"latitude": 415830701, |
||||
"longitude": -742952812 |
||||
}, |
||||
"name": "" |
||||
}, { |
||||
"location": { |
||||
"latitude": 413447164, |
||||
"longitude": -748712898 |
||||
}, |
||||
"name": "165 Pedersen Ridge Road, Milford, PA 18337, USA" |
||||
}, { |
||||
"location": { |
||||
"latitude": 405047245, |
||||
"longitude": -749800722 |
||||
}, |
||||
"name": "100-122 Locktown Road, Frenchtown, NJ 08825, USA" |
||||
}, { |
||||
"location": { |
||||
"latitude": 418858923, |
||||
"longitude": -746156790 |
||||
}, |
||||
"name": "" |
||||
}, { |
||||
"location": { |
||||
"latitude": 417951888, |
||||
"longitude": -748484944 |
||||
}, |
||||
"name": "650-652 Willi Hill Road, Swan Lake, NY 12783, USA" |
||||
}, { |
||||
"location": { |
||||
"latitude": 407033786, |
||||
"longitude": -743977337 |
||||
}, |
||||
"name": "26 East 3rd Street, New Providence, NJ 07974, USA" |
||||
}, { |
||||
"location": { |
||||
"latitude": 417548014, |
||||
"longitude": -740075041 |
||||
}, |
||||
"name": "" |
||||
}, { |
||||
"location": { |
||||
"latitude": 410395868, |
||||
"longitude": -744972325 |
||||
}, |
||||
"name": "" |
||||
}, { |
||||
"location": { |
||||
"latitude": 404615353, |
||||
"longitude": -745129803 |
||||
}, |
||||
"name": "" |
||||
}, { |
||||
"location": { |
||||
"latitude": 406589790, |
||||
"longitude": -743560121 |
||||
}, |
||||
"name": "611 Lawrence Avenue, Westfield, NJ 07090, USA" |
||||
}, { |
||||
"location": { |
||||
"latitude": 414653148, |
||||
"longitude": -740477477 |
||||
}, |
||||
"name": "18 Lannis Avenue, New Windsor, NY 12553, USA" |
||||
}, { |
||||
"location": { |
||||
"latitude": 405957808, |
||||
"longitude": -743255336 |
||||
}, |
||||
"name": "82-104 Amherst Avenue, Colonia, NJ 07067, USA" |
||||
}, { |
||||
"location": { |
||||
"latitude": 411733589, |
||||
"longitude": -741648093 |
||||
}, |
||||
"name": "170 Seven Lakes Drive, Sloatsburg, NY 10974, USA" |
||||
}, { |
||||
"location": { |
||||
"latitude": 412676291, |
||||
"longitude": -742606606 |
||||
}, |
||||
"name": "1270 Lakes Road, Monroe, NY 10950, USA" |
||||
}, { |
||||
"location": { |
||||
"latitude": 409224445, |
||||
"longitude": -748286738 |
||||
}, |
||||
"name": "509-535 Alphano Road, Great Meadows, NJ 07838, USA" |
||||
}, { |
||||
"location": { |
||||
"latitude": 406523420, |
||||
"longitude": -742135517 |
||||
}, |
||||
"name": "652 Garden Street, Elizabeth, NJ 07202, USA" |
||||
}, { |
||||
"location": { |
||||
"latitude": 401827388, |
||||
"longitude": -740294537 |
||||
}, |
||||
"name": "349 Sea Spray Court, Neptune City, NJ 07753, USA" |
||||
}, { |
||||
"location": { |
||||
"latitude": 410564152, |
||||
"longitude": -743685054 |
||||
}, |
||||
"name": "13-17 Stanley Street, West Milford, NJ 07480, USA" |
||||
}, { |
||||
"location": { |
||||
"latitude": 408472324, |
||||
"longitude": -740726046 |
||||
}, |
||||
"name": "47 Industrial Avenue, Teterboro, NJ 07608, USA" |
||||
}, { |
||||
"location": { |
||||
"latitude": 412452168, |
||||
"longitude": -740214052 |
||||
}, |
||||
"name": "5 White Oak Lane, Stony Point, NY 10980, USA" |
||||
}, { |
||||
"location": { |
||||
"latitude": 409146138, |
||||
"longitude": -746188906 |
||||
}, |
||||
"name": "Berkshire Valley Management Area Trail, Jefferson, NJ, USA" |
||||
}, { |
||||
"location": { |
||||
"latitude": 404701380, |
||||
"longitude": -744781745 |
||||
}, |
||||
"name": "1007 Jersey Avenue, New Brunswick, NJ 08901, USA" |
||||
}, { |
||||
"location": { |
||||
"latitude": 409642566, |
||||
"longitude": -746017679 |
||||
}, |
||||
"name": "6 East Emerald Isle Drive, Lake Hopatcong, NJ 07849, USA" |
||||
}, { |
||||
"location": { |
||||
"latitude": 408031728, |
||||
"longitude": -748645385 |
||||
}, |
||||
"name": "1358-1474 New Jersey 57, Port Murray, NJ 07865, USA" |
||||
}, { |
||||
"location": { |
||||
"latitude": 413700272, |
||||
"longitude": -742135189 |
||||
}, |
||||
"name": "367 Prospect Road, Chester, NY 10918, USA" |
||||
}, { |
||||
"location": { |
||||
"latitude": 404310607, |
||||
"longitude": -740282632 |
||||
}, |
||||
"name": "10 Simon Lake Drive, Atlantic Highlands, NJ 07716, USA" |
||||
}, { |
||||
"location": { |
||||
"latitude": 409319800, |
||||
"longitude": -746201391 |
||||
}, |
||||
"name": "11 Ward Street, Mount Arlington, NJ 07856, USA" |
||||
}, { |
||||
"location": { |
||||
"latitude": 406685311, |
||||
"longitude": -742108603 |
||||
}, |
||||
"name": "300-398 Jefferson Avenue, Elizabeth, NJ 07201, USA" |
||||
}, { |
||||
"location": { |
||||
"latitude": 419018117, |
||||
"longitude": -749142781 |
||||
}, |
||||
"name": "43 Dreher Road, Roscoe, NY 12776, USA" |
||||
}, { |
||||
"location": { |
||||
"latitude": 412856162, |
||||
"longitude": -745148837 |
||||
}, |
||||
"name": "Swan Street, Pine Island, NY 10969, USA" |
||||
}, { |
||||
"location": { |
||||
"latitude": 416560744, |
||||
"longitude": -746721964 |
||||
}, |
||||
"name": "66 Pleasantview Avenue, Monticello, NY 12701, USA" |
||||
}, { |
||||
"location": { |
||||
"latitude": 405314270, |
||||
"longitude": -749836354 |
||||
}, |
||||
"name": "" |
||||
}, { |
||||
"location": { |
||||
"latitude": 414219548, |
||||
"longitude": -743327440 |
||||
}, |
||||
"name": "" |
||||
}, { |
||||
"location": { |
||||
"latitude": 415534177, |
||||
"longitude": -742900616 |
||||
}, |
||||
"name": "565 Winding Hills Road, Montgomery, NY 12549, USA" |
||||
}, { |
||||
"location": { |
||||
"latitude": 406898530, |
||||
"longitude": -749127080 |
||||
}, |
||||
"name": "231 Rocky Run Road, Glen Gardner, NJ 08826, USA" |
||||
}, { |
||||
"location": { |
||||
"latitude": 407586880, |
||||
"longitude": -741670168 |
||||
}, |
||||
"name": "100 Mount Pleasant Avenue, Newark, NJ 07104, USA" |
||||
}, { |
||||
"location": { |
||||
"latitude": 400106455, |
||||
"longitude": -742870190 |
||||
}, |
||||
"name": "517-521 Huntington Drive, Manchester Township, NJ 08759, USA" |
||||
}, { |
||||
"location": { |
||||
"latitude": 400066188, |
||||
"longitude": -746793294 |
||||
}, |
||||
"name": "" |
||||
}, { |
||||
"location": { |
||||
"latitude": 418803880, |
||||
"longitude": -744102673 |
||||
}, |
||||
"name": "40 Mountain Road, Napanoch, NY 12458, USA" |
||||
}, { |
||||
"location": { |
||||
"latitude": 414204288, |
||||
"longitude": -747895140 |
||||
}, |
||||
"name": "" |
||||
}, { |
||||
"location": { |
||||
"latitude": 414777405, |
||||
"longitude": -740615601 |
||||
}, |
||||
"name": "" |
||||
}, { |
||||
"location": { |
||||
"latitude": 415464475, |
||||
"longitude": -747175374 |
||||
}, |
||||
"name": "48 North Road, Forestburgh, NY 12777, USA" |
||||
}, { |
||||
"location": { |
||||
"latitude": 404062378, |
||||
"longitude": -746376177 |
||||
}, |
||||
"name": "" |
||||
}, { |
||||
"location": { |
||||
"latitude": 405688272, |
||||
"longitude": -749285130 |
||||
}, |
||||
"name": "" |
||||
}, { |
||||
"location": { |
||||
"latitude": 400342070, |
||||
"longitude": -748788996 |
||||
}, |
||||
"name": "" |
||||
}, { |
||||
"location": { |
||||
"latitude": 401809022, |
||||
"longitude": -744157964 |
||||
}, |
||||
"name": "" |
||||
}, { |
||||
"location": { |
||||
"latitude": 404226644, |
||||
"longitude": -740517141 |
||||
}, |
||||
"name": "9 Thompson Avenue, Leonardo, NJ 07737, USA" |
||||
}, { |
||||
"location": { |
||||
"latitude": 410322033, |
||||
"longitude": -747871659 |
||||
}, |
||||
"name": "" |
||||
}, { |
||||
"location": { |
||||
"latitude": 407100674, |
||||
"longitude": -747742727 |
||||
}, |
||||
"name": "" |
||||
}, { |
||||
"location": { |
||||
"latitude": 418811433, |
||||
"longitude": -741718005 |
||||
}, |
||||
"name": "213 Bush Road, Stone Ridge, NY 12484, USA" |
||||
}, { |
||||
"location": { |
||||
"latitude": 415034302, |
||||
"longitude": -743850945 |
||||
}, |
||||
"name": "" |
||||
}, { |
||||
"location": { |
||||
"latitude": 411349992, |
||||
"longitude": -743694161 |
||||
}, |
||||
"name": "" |
||||
}, { |
||||
"location": { |
||||
"latitude": 404839914, |
||||
"longitude": -744759616 |
||||
}, |
||||
"name": "1-17 Bergen Court, New Brunswick, NJ 08901, USA" |
||||
}, { |
||||
"location": { |
||||
"latitude": 414638017, |
||||
"longitude": -745957854 |
||||
}, |
||||
"name": "35 Oakland Valley Road, Cuddebackville, NY 12729, USA" |
||||
}, { |
||||
"location": { |
||||
"latitude": 412127800, |
||||
"longitude": -740173578 |
||||
}, |
||||
"name": "" |
||||
}, { |
||||
"location": { |
||||
"latitude": 401263460, |
||||
"longitude": -747964303 |
||||
}, |
||||
"name": "" |
||||
}, { |
||||
"location": { |
||||
"latitude": 412843391, |
||||
"longitude": -749086026 |
||||
}, |
||||
"name": "" |
||||
}, { |
||||
"location": { |
||||
"latitude": 418512773, |
||||
"longitude": -743067823 |
||||
}, |
||||
"name": "" |
||||
}, { |
||||
"location": { |
||||
"latitude": 404318328, |
||||
"longitude": -740835638 |
||||
}, |
||||
"name": "42-102 Main Street, Belford, NJ 07718, USA" |
||||
}, { |
||||
"location": { |
||||
"latitude": 419020746, |
||||
"longitude": -741172328 |
||||
}, |
||||
"name": "" |
||||
}, { |
||||
"location": { |
||||
"latitude": 404080723, |
||||
"longitude": -746119569 |
||||
}, |
||||
"name": "" |
||||
}, { |
||||
"location": { |
||||
"latitude": 401012643, |
||||
"longitude": -744035134 |
||||
}, |
||||
"name": "" |
||||
}, { |
||||
"location": { |
||||
"latitude": 404306372, |
||||
"longitude": -741079661 |
||||
}, |
||||
"name": "" |
||||
}, { |
||||
"location": { |
||||
"latitude": 403966326, |
||||
"longitude": -748519297 |
||||
}, |
||||
"name": "" |
||||
}, { |
||||
"location": { |
||||
"latitude": 405002031, |
||||
"longitude": -748407866 |
||||
}, |
||||
"name": "" |
||||
}, { |
||||
"location": { |
||||
"latitude": 409532885, |
||||
"longitude": -742200683 |
||||
}, |
||||
"name": "" |
||||
}, { |
||||
"location": { |
||||
"latitude": 416851321, |
||||
"longitude": -742674555 |
||||
}, |
||||
"name": "" |
||||
}, { |
||||
"location": { |
||||
"latitude": 406411633, |
||||
"longitude": -741722051 |
||||
}, |
||||
"name": "3387 Richmond Terrace, Staten Island, NY 10303, USA" |
||||
}, { |
||||
"location": { |
||||
"latitude": 413069058, |
||||
"longitude": -744597778 |
||||
}, |
||||
"name": "261 Van Sickle Road, Goshen, NY 10924, USA" |
||||
}, { |
||||
"location": { |
||||
"latitude": 418465462, |
||||
"longitude": -746859398 |
||||
}, |
||||
"name": "" |
||||
}, { |
||||
"location": { |
||||
"latitude": 411733222, |
||||
"longitude": -744228360 |
||||
}, |
||||
"name": "" |
||||
}, { |
||||
"location": { |
||||
"latitude": 410248224, |
||||
"longitude": -747127767 |
||||
}, |
||||
"name": "3 Hasta Way, Newton, NJ 07860, USA" |
||||
}] |
@ -0,0 +1,34 @@ |
||||
<?php |
||||
/* |
||||
* |
||||
* Copyright 2020 gRPC authors. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0 |
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
* |
||||
*/ |
||||
|
||||
require dirname(__FILE__) . '/../../../src/php/lib/Grpc/MethodDescriptor.php'; |
||||
require dirname(__FILE__) . '/../../../src/php/lib/Grpc/Status.php'; |
||||
require dirname(__FILE__) . '/../../../src/php/lib/Grpc/ServerCallReader.php'; |
||||
require dirname(__FILE__) . '/../../../src/php/lib/Grpc/ServerCallWriter.php'; |
||||
require dirname(__FILE__) . '/../../../src/php/lib/Grpc/ServerContext.php'; |
||||
require dirname(__FILE__) . '/../../../src/php/lib/Grpc/RpcServer.php'; |
||||
require dirname(__FILE__) . '/../vendor/autoload.php'; |
||||
require dirname(__FILE__) . '/RouteGuideService.php'; |
||||
|
||||
$routeDbFile = $argv[1]; |
||||
|
||||
$server = new \Grpc\RpcServer(); |
||||
$server->addHttp2Port('0.0.0.0:50051'); |
||||
$server->handle(new RouteGuideService($routeDbFile)); |
||||
$server->run(); |
@ -0,0 +1,38 @@ |
||||
# gRPC EventEngine |
||||
|
||||
An EventEngine handles all cross-platform I/O, task execution, and DNS |
||||
resolution for gRPC. A default, cross-platform implementation is provided with |
||||
gRPC, but part of the intent here is to provide an interface for external |
||||
integrators to bring their own functionality. This allows for integration with |
||||
external event loops, siloing I/O and task execution between channels or |
||||
servers, and other custom integrations that were previously unsupported. |
||||
|
||||
*WARNING*: This is experimental code and is subject to change. |
||||
|
||||
## High level expectations of an EventEngine implementation |
||||
|
||||
### Provide their own I/O threads |
||||
EventEngines are expected to internally create whatever threads are required to |
||||
perform I/O and execute callbacks. For example, an EventEngine implementation |
||||
may want to spawn separate thread pools for polling and callback execution. |
||||
|
||||
### Provisioning data buffers via Slice allocation |
||||
At a high level, gRPC provides a `ResourceQuota` system that allows gRPC to |
||||
reclaim memory and degrade gracefully when memory reaches application-defined |
||||
thresholds. To enable this feature, the memory allocation of read/write buffers |
||||
within an EventEngine must be acquired in the form of Slices from |
||||
SliceAllocators. This is covered more fully in the gRFC and code. |
||||
|
||||
### Documentating expectations around callback execution |
||||
Some callbacks may be expensive to run. EventEngines should decide on and |
||||
document whether callback execution might block polling operations. This way, |
||||
application developers can plan accordingly (e.g., run their expensive callbacks |
||||
on a separate thread if necessary). |
||||
|
||||
### Handling concurrent usage |
||||
Assume that gRPC may use an EventEngine concurrently across multiple threads. |
||||
|
||||
## TODO: documentation |
||||
|
||||
* Example usage |
||||
* Link to gRFC |
@ -0,0 +1,28 @@ |
||||
// Copyright 2021 The gRPC Authors
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
#ifndef GRPC_EVENT_ENGINE_CHANNEL_ARGS_H |
||||
#define GRPC_EVENT_ENGINE_CHANNEL_ARGS_H |
||||
|
||||
#include <grpc/support/port_platform.h> |
||||
|
||||
namespace grpc_event_engine { |
||||
namespace experimental { |
||||
|
||||
// TODO(hork): define
|
||||
class ChannelArgs; |
||||
|
||||
} // namespace experimental
|
||||
} // namespace grpc_event_engine
|
||||
|
||||
#endif // GRPC_EVENT_ENGINE_CHANNEL_ARGS_H
|
@ -0,0 +1,280 @@ |
||||
// Copyright 2021 The gRPC Authors
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
#ifndef GRPC_EVENT_ENGINE_EVENT_ENGINE_H |
||||
#define GRPC_EVENT_ENGINE_EVENT_ENGINE_H |
||||
|
||||
#include <grpc/support/port_platform.h> |
||||
|
||||
#include <functional> |
||||
#include <vector> |
||||
|
||||
#include "absl/status/status.h" |
||||
#include "absl/status/statusor.h" |
||||
#include "absl/time/time.h" |
||||
|
||||
#include "grpc/event_engine/channel_args.h" |
||||
#include "grpc/event_engine/port.h" |
||||
#include "grpc/event_engine/slice_allocator.h" |
||||
|
||||
// TODO(hork): explicitly define lifetimes and ownership of all objects.
|
||||
// TODO(hork): Define the Endpoint::Write metrics collection system
|
||||
|
||||
namespace grpc_event_engine { |
||||
namespace experimental { |
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// The EventEngine encapsulates all platform-specific behaviors related to low
|
||||
/// level network I/O, timers, asynchronous execution, and DNS resolution.
|
||||
///
|
||||
/// This interface allows developers to provide their own event management and
|
||||
/// network stacks. Motivating uses cases for supporting custom EventEngines
|
||||
/// include the ability to hook into external event loops, and using different
|
||||
/// EventEngine instances for each channel to better insulate network I/O and
|
||||
/// callback processing from other channels.
|
||||
///
|
||||
/// A default cross-platform EventEngine instance is provided by gRPC.
|
||||
///
|
||||
/// LIFESPAN AND OWNERSHIP
|
||||
///
|
||||
/// gRPC takes shared ownership of EventEngines via std::shared_ptrs to ensure
|
||||
/// that the engines remain available until they are no longer needed. Depending
|
||||
/// on the use case, engines may live until gRPC is shut down.
|
||||
///
|
||||
/// EXAMPLE USAGE (Not yet implemented)
|
||||
///
|
||||
/// Custom EventEngines can be specified per channel, and allow configuration
|
||||
/// for both clients and servers. To set a custom EventEngine for a client
|
||||
/// channel, you can do something like the following:
|
||||
///
|
||||
/// ChannelArguments args;
|
||||
/// std::shared_ptr<EventEngine> engine = std::make_shared<MyEngine>(...);
|
||||
/// args.SetEventEngine(engine);
|
||||
/// MyAppClient client(grpc::CreateCustomChannel(
|
||||
/// "localhost:50051", grpc::InsecureChannelCredentials(), args));
|
||||
///
|
||||
/// A gRPC server can use a custom EventEngine by calling the
|
||||
/// ServerBuilder::SetEventEngine method:
|
||||
///
|
||||
/// ServerBuilder builder;
|
||||
/// std::shared_ptr<EventEngine> engine = std::make_shared<MyEngine>(...);
|
||||
/// builder.SetEventEngine(engine);
|
||||
/// std::unique_ptr<Server> server(builder.BuildAndStart());
|
||||
/// server->Wait();
|
||||
///
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
class EventEngine { |
||||
public: |
||||
/// A basic callable function. The first argument to all callbacks is an
|
||||
/// absl::Status indicating the status of the operation associated with this
|
||||
/// callback. Each EventEngine method that takes a callback parameter, defines
|
||||
/// the expected sets and meanings of statuses for that use case.
|
||||
using Callback = std::function<void(absl::Status)>; |
||||
struct TaskHandle { |
||||
intptr_t key; |
||||
}; |
||||
/// A thin wrapper around a platform-specific sockaddr type. A sockaddr struct
|
||||
/// exists on all platforms that gRPC supports.
|
||||
///
|
||||
/// Platforms are expected to provide definitions for:
|
||||
/// * sockaddr
|
||||
/// * sockaddr_in
|
||||
/// * sockaddr_in6
|
||||
class ResolvedAddress { |
||||
public: |
||||
static constexpr socklen_t MAX_SIZE_BYTES = 128; |
||||
|
||||
ResolvedAddress(const sockaddr* address, socklen_t size); |
||||
const struct sockaddr* address() const; |
||||
socklen_t size() const; |
||||
|
||||
private: |
||||
char address_[MAX_SIZE_BYTES]; |
||||
socklen_t size_; |
||||
}; |
||||
|
||||
/// An Endpoint represents one end of a connection between a gRPC client and
|
||||
/// server. Endpoints are created when connections are established, and
|
||||
/// Endpoint operations are gRPC's primary means of communication.
|
||||
///
|
||||
/// Endpoints must use the provided SliceAllocator for all data buffer memory
|
||||
/// allocations. gRPC allows applications to set memory constraints per
|
||||
/// Channel or Server, and the implementation depends on all dynamic memory
|
||||
/// allocation being handled by the quota system.
|
||||
class Endpoint { |
||||
public: |
||||
virtual ~Endpoint() = 0; |
||||
|
||||
// TODO(hork): define status codes for the callback
|
||||
/// Read data from the Endpoint.
|
||||
///
|
||||
/// When data is available on the connection, that data is moved into the
|
||||
/// \a buffer, and the \a on_read callback is called. The caller must ensure
|
||||
/// that the callback has access to the buffer when executed later.
|
||||
/// Ownership of the buffer is not transferred. Valid slices *may* be placed
|
||||
/// into the buffer even if the callback is invoked with Status != OK.
|
||||
virtual void Read(Callback on_read, SliceBuffer* buffer, |
||||
absl::Time deadline) = 0; |
||||
// TODO(hork): define status codes for the callback
|
||||
/// Write data out on the connection.
|
||||
///
|
||||
/// \a on_writable is called when the connection is ready for more data. The
|
||||
/// Slices within the \a data buffer may be mutated at will by the Endpoint
|
||||
/// until \a on_writable is called. The \a data SliceBuffer will remain
|
||||
/// valid after calling \a Write, but its state is otherwise undefined.
|
||||
virtual void Write(Callback on_writable, SliceBuffer* data, |
||||
absl::Time deadline) = 0; |
||||
// TODO(hork): define status codes for the callback
|
||||
// TODO(hork): define cleanup operations, lifetimes, responsibilities.
|
||||
virtual void Close(Callback on_close) = 0; |
||||
/// These methods return an address in the format described in DNSResolver.
|
||||
/// The returned values are owned by the Endpoint and are expected to remain
|
||||
/// valid for the life of the Endpoint.
|
||||
virtual const ResolvedAddress* GetPeerAddress() const = 0; |
||||
virtual const ResolvedAddress* GetLocalAddress() const = 0; |
||||
}; |
||||
|
||||
/// Called when a new connection is established. This callback takes ownership
|
||||
/// of the Endpoint and is responsible for its destruction.
|
||||
using OnConnectCallback = std::function<void(absl::Status, Endpoint*)>; |
||||
|
||||
/// An EventEngine Listener listens for incoming connection requests from gRPC
|
||||
/// clients and initiates request processing once connections are established.
|
||||
class Listener { |
||||
public: |
||||
/// A callback handle, used to cancel a callback. Called when the listener
|
||||
/// has accepted a new client connection. This callback takes ownership of
|
||||
/// the Endpoint and is responsible its destruction.
|
||||
using AcceptCallback = std::function<void(absl::Status, Endpoint*)>; |
||||
|
||||
virtual ~Listener() = 0; |
||||
|
||||
// TODO(hork): define return status codes
|
||||
/// Bind an address/port to this Listener. It is expected that multiple
|
||||
/// addresses/ports can be bound to this Listener before Listener::Start has
|
||||
/// been called. Returns the bound port or an error status.
|
||||
virtual absl::StatusOr<int> Bind(const ResolvedAddress& addr) = 0; |
||||
virtual absl::Status Start() = 0; |
||||
}; |
||||
|
||||
// TODO(hork): define status codes for the callback
|
||||
// TODO(hork): define return status codes
|
||||
// TODO(hork): document status arg meanings for on_accept and on_shutdown
|
||||
/// Factory method to create a network listener.
|
||||
virtual absl::StatusOr<std::unique_ptr<Listener>> CreateListener( |
||||
Listener::AcceptCallback on_accept, Callback on_shutdown, |
||||
const ChannelArgs& args, |
||||
SliceAllocatorFactory slice_allocator_factory) = 0; |
||||
// TODO(hork): define status codes for the callback
|
||||
// TODO(hork): define return status codes
|
||||
/// Creates a network connection to a remote network listener.
|
||||
virtual absl::Status Connect(OnConnectCallback on_connect, |
||||
const ResolvedAddress& addr, |
||||
const ChannelArgs& args, |
||||
SliceAllocator slice_allocator, |
||||
absl::Time deadline) = 0; |
||||
|
||||
/// The DNSResolver that provides asynchronous resolution.
|
||||
class DNSResolver { |
||||
public: |
||||
/// A task handle for DNS Resolution requests.
|
||||
struct LookupTaskHandle { |
||||
intptr_t key; |
||||
}; |
||||
/// A DNS SRV record type.
|
||||
struct SRVRecord { |
||||
std::string host; |
||||
int port = 0; |
||||
int priority = 0; |
||||
int weight = 0; |
||||
}; |
||||
/// Called with the collection of sockaddrs that were resolved from a given
|
||||
/// target address.
|
||||
using LookupHostnameCallback = |
||||
std::function<void(absl::Status, std::vector<ResolvedAddress>)>; |
||||
/// Called with a collection of SRV records.
|
||||
using LookupSRVCallback = |
||||
std::function<void(absl::Status, std::vector<SRVRecord>)>; |
||||
/// Called with the result of a TXT record lookup
|
||||
using LookupTXTCallback = std::function<void(absl::Status, std::string)>; |
||||
|
||||
virtual ~DNSResolver() = 0; |
||||
|
||||
// TODO(hork): define status codes for the callback
|
||||
/// Asynchronously resolve an address. \a default_port may be a non-numeric
|
||||
/// named service port, and will only be used if \a address does not already
|
||||
/// contain a port component.
|
||||
virtual LookupTaskHandle LookupHostname(LookupHostnameCallback on_resolve, |
||||
absl::string_view address, |
||||
absl::string_view default_port, |
||||
absl::Time deadline) = 0; |
||||
// TODO(hork): define status codes for the callback
|
||||
virtual LookupTaskHandle LookupSRV(LookupSRVCallback on_resolve, |
||||
absl::string_view name, |
||||
absl::Time deadline) = 0; |
||||
// TODO(hork): define status codes for the callback
|
||||
virtual LookupTaskHandle LookupTXT(LookupTXTCallback on_resolve, |
||||
absl::string_view name, |
||||
absl::Time deadline) = 0; |
||||
/// Cancel an asynchronous lookup operation.
|
||||
virtual void TryCancelLookup(LookupTaskHandle handle) = 0; |
||||
}; |
||||
|
||||
virtual ~EventEngine() = 0; |
||||
|
||||
// TODO(hork): define return status codes
|
||||
/// Retrieves an instance of a DNSResolver.
|
||||
virtual absl::StatusOr<std::unique_ptr<DNSResolver>> GetDNSResolver() = 0; |
||||
|
||||
/// Intended for future expansion of Task run functionality.
|
||||
struct RunOptions {}; |
||||
// TODO(hork): define status codes for the callback
|
||||
// TODO(hork): consider recommendation to make TaskHandle an output arg
|
||||
/// Run a callback as soon as possible.
|
||||
virtual TaskHandle Run(Callback fn, RunOptions opts) = 0; |
||||
// TODO(hork): define status codes for the callback
|
||||
/// Synonymous with scheduling an alarm to run at time \a when.
|
||||
virtual TaskHandle RunAt(absl::Time when, Callback fn, RunOptions opts) = 0; |
||||
/// Immediately tries to cancel a callback.
|
||||
/// Note that this is a "best effort" cancellation. No guarantee is made that
|
||||
/// the callback will be cancelled, the call could be in any stage.
|
||||
///
|
||||
/// There are three scenarios in which we may cancel a scheduled function:
|
||||
/// 1. We cancel the execution before it has run.
|
||||
/// 2. The callback has already run.
|
||||
/// 3. We can't cancel it because it is "in flight".
|
||||
///
|
||||
/// In all cases, the cancellation is still considered successful, the
|
||||
/// callback will be run exactly once from either cancellation or from its
|
||||
/// activation.
|
||||
virtual void TryCancel(TaskHandle handle) = 0; |
||||
// TODO(hork): define return status codes
|
||||
// TODO(hork): Carefully evaluate shutdown requirements, determine if we need
|
||||
// a callback parameter to be added to this method.
|
||||
/// Immediately run all callbacks with status indicating the shutdown. Every
|
||||
/// EventEngine is expected to shut down exactly once. No new callbacks/tasks
|
||||
/// should be scheduled after shutdown has begun. Any registered callbacks
|
||||
/// must be executed.
|
||||
virtual absl::Status Shutdown() = 0; |
||||
}; |
||||
|
||||
// Lazily instantiate and return a default global EventEngine instance if no
|
||||
// custom instance is provided. If a custom EventEngine is provided for every
|
||||
// channel/server via ChannelArgs, this method should never be called, and the
|
||||
// default instance will never be instantiated.
|
||||
std::shared_ptr<EventEngine> GetDefaultEventEngine(); |
||||
|
||||
} // namespace experimental
|
||||
} // namespace grpc_event_engine
|
||||
|
||||
#endif // GRPC_EVENT_ENGINE_EVENT_ENGINE_H
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue