mirror of https://github.com/grpc/grpc.git
commit
d0a162dc78
275 changed files with 43479 additions and 21497 deletions
@ -1,79 +0,0 @@ |
|||||||
// This file will be moved to a new location. |
|
||||||
|
|
||||||
// Copyright 2015, Google Inc. |
|
||||||
// All rights reserved. |
|
||||||
// |
|
||||||
// Redistribution and use in source and binary forms, with or without |
|
||||||
// modification, are permitted provided that the following conditions are |
|
||||||
// met: |
|
||||||
// |
|
||||||
// * Redistributions of source code must retain the above copyright |
|
||||||
// notice, this list of conditions and the following disclaimer. |
|
||||||
// * Redistributions in binary form must reproduce the above |
|
||||||
// copyright notice, this list of conditions and the following disclaimer |
|
||||||
// in the documentation and/or other materials provided with the |
|
||||||
// distribution. |
|
||||||
// * Neither the name of Google Inc. nor the names of its |
|
||||||
// contributors may be used to endorse or promote products derived from |
|
||||||
// this software without specific prior written permission. |
|
||||||
// |
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
|
||||||
|
|
||||||
// Labels provide a way to associate user-defined metadata with various |
|
||||||
// objects. Labels may be used to organize objects into non-hierarchical |
|
||||||
// groups; think metadata tags attached to mp3s. |
|
||||||
|
|
||||||
syntax = "proto2"; |
|
||||||
|
|
||||||
package tech.label; |
|
||||||
|
|
||||||
// A key-value pair applied to a given object. |
|
||||||
message Label { |
|
||||||
// The key of a label is a syntactically valid URL (as per RFC 1738) with |
|
||||||
// the "scheme" and initial slashes omitted and with the additional |
|
||||||
// restrictions noted below. Each key should be globally unique. The |
|
||||||
// "host" portion is called the "namespace" and is not necessarily |
|
||||||
// resolvable to a network endpoint. Instead, the namespace indicates what |
|
||||||
// system or entity defines the semantics of the label. Namespaces do not |
|
||||||
// restrict the set of objects to which a label may be associated. |
|
||||||
// |
|
||||||
// Keys are defined by the following grammar: |
|
||||||
// |
|
||||||
// key = hostname "/" kpath |
|
||||||
// kpath = ksegment *[ "/" ksegment ] |
|
||||||
// ksegment = alphadigit | *[ alphadigit | "-" | "_" | "." ] |
|
||||||
// |
|
||||||
// where "hostname" and "alphadigit" are defined as in RFC 1738. |
|
||||||
// |
|
||||||
// Example key: |
|
||||||
// spanner.google.com/universe |
|
||||||
required string key = 1; |
|
||||||
|
|
||||||
// The value of the label. |
|
||||||
oneof value { |
|
||||||
// A string value. |
|
||||||
string str_value = 2; |
|
||||||
// An integer value. |
|
||||||
int64 num_value = 3; |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
// A collection of labels, such as the set of all labels attached to an |
|
||||||
// object. Each label in the set must have a different key. |
|
||||||
// |
|
||||||
// Users should prefer to embed "repeated Label" directly when possible. |
|
||||||
// This message should only be used in cases where that isn't possible (e.g. |
|
||||||
// with oneof). |
|
||||||
message Labels { |
|
||||||
repeated Label label = 1; |
|
||||||
} |
|
@ -1,729 +0,0 @@ |
|||||||
// This file will be moved to a new location. |
|
||||||
|
|
||||||
// Copyright 2015, Google Inc. |
|
||||||
// All rights reserved. |
|
||||||
// |
|
||||||
// Redistribution and use in source and binary forms, with or without |
|
||||||
// modification, are permitted provided that the following conditions are |
|
||||||
// met: |
|
||||||
// |
|
||||||
// * Redistributions of source code must retain the above copyright |
|
||||||
// notice, this list of conditions and the following disclaimer. |
|
||||||
// * Redistributions in binary form must reproduce the above |
|
||||||
// copyright notice, this list of conditions and the following disclaimer |
|
||||||
// in the documentation and/or other materials provided with the |
|
||||||
// distribution. |
|
||||||
// * Neither the name of Google Inc. nor the names of its |
|
||||||
// contributors may be used to endorse or promote products derived from |
|
||||||
// this software without specific prior written permission. |
|
||||||
// |
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
|
||||||
|
|
||||||
|
|
||||||
// Specification of the Pubsub API. |
|
||||||
|
|
||||||
syntax = "proto2"; |
|
||||||
|
|
||||||
import "examples/pubsub/empty.proto"; |
|
||||||
import "examples/pubsub/label.proto"; |
|
||||||
|
|
||||||
package tech.pubsub; |
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------- |
|
||||||
// Overview of the Pubsub API |
|
||||||
// ----------------------------------------------------------------------------- |
|
||||||
|
|
||||||
// This file describes an API for a Pubsub system. This system provides a |
|
||||||
// reliable many-to-many communication mechanism between independently written |
|
||||||
// publishers and subscribers where the publisher publishes messages to "topics" |
|
||||||
// and each subscriber creates a "subscription" and consumes messages from it. |
|
||||||
// |
|
||||||
// (a) The pubsub system maintains bindings between topics and subscriptions. |
|
||||||
// (b) A publisher publishes messages into a topic. |
|
||||||
// (c) The pubsub system delivers messages from topics into relevant |
|
||||||
// subscriptions. |
|
||||||
// (d) A subscriber receives pending messages from its subscription and |
|
||||||
// acknowledges or nacks each one to the pubsub system. |
|
||||||
// (e) The pubsub system removes acknowledged messages from that subscription. |
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------- |
|
||||||
// Data Model |
|
||||||
// ----------------------------------------------------------------------------- |
|
||||||
|
|
||||||
// The data model consists of the following: |
|
||||||
// |
|
||||||
// * Topic: A topic is a resource to which messages are published by publishers. |
|
||||||
// Topics are named, and the name of the topic is unique within the pubsub |
|
||||||
// system. |
|
||||||
// |
|
||||||
// * Subscription: A subscription records the subscriber's interest in a topic. |
|
||||||
// It can optionally include a query to select a subset of interesting |
|
||||||
// messages. The pubsub system maintains a logical cursor tracking the |
|
||||||
// matching messages which still need to be delivered and acked so that |
|
||||||
// they can retried as needed. The set of messages that have not been |
|
||||||
// acknowledged is called the subscription backlog. |
|
||||||
// |
|
||||||
// * Message: A message is a unit of data that flows in the system. It contains |
|
||||||
// opaque data from the publisher along with its labels. |
|
||||||
// |
|
||||||
// * Message Labels (optional): A set of opaque key, value pairs assigned |
|
||||||
// by the publisher which the subscriber can use for filtering out messages |
|
||||||
// in the topic. For example, a label with key "foo.com/device_type" and |
|
||||||
// value "mobile" may be added for messages that are only relevant for a |
|
||||||
// mobile subscriber; a subscriber on a phone may decide to create a |
|
||||||
// subscription only for messages that have this label. |
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------- |
|
||||||
// Publisher Flow |
|
||||||
// ----------------------------------------------------------------------------- |
|
||||||
|
|
||||||
// A publisher publishes messages to the topic using the Publish request: |
|
||||||
// |
|
||||||
// PubsubMessage message; |
|
||||||
// message.set_data("...."); |
|
||||||
// Label label; |
|
||||||
// label.set_key("foo.com/key1"); |
|
||||||
// label.set_str_value("value1"); |
|
||||||
// message.add_label(label); |
|
||||||
// PublishRequest request; |
|
||||||
// request.set_topic("topicName"); |
|
||||||
// request.set_message(message); |
|
||||||
// PublisherService.Publish(request); |
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------- |
|
||||||
// Subscriber Flow |
|
||||||
// ----------------------------------------------------------------------------- |
|
||||||
|
|
||||||
// The subscriber part of the API is richer than the publisher part and has a |
|
||||||
// number of concepts w.r.t. subscription creation and monitoring: |
|
||||||
// |
|
||||||
// (1) A subscriber creates a subscription using the CreateSubscription call. |
|
||||||
// It may specify an optional "query" to indicate that it wants to receive |
|
||||||
// only messages with a certain set of labels using the label query syntax. |
|
||||||
// It may also specify an optional truncation policy to indicate when old |
|
||||||
// messages from the subcription can be removed. |
|
||||||
// |
|
||||||
// (2) A subscriber receives messages in one of two ways: via push or pull. |
|
||||||
// |
|
||||||
// (a) To receive messages via push, the PushConfig field must be specified in |
|
||||||
// the Subscription parameter when creating a subscription. The PushConfig |
|
||||||
// specifies an endpoint at which the subscriber must expose the |
|
||||||
// PushEndpointService. Messages are received via the HandlePubsubEvent |
|
||||||
// method. The push subscriber responds to the HandlePubsubEvent method |
|
||||||
// with a result code that indicates one of three things: Ack (the message |
|
||||||
// has been successfully processed and the Pubsub system may delete it), |
|
||||||
// Nack (the message has been rejected, the Pubsub system should resend it |
|
||||||
// at a later time), or Push-Back (this is a Nack with the additional |
|
||||||
// semantics that the subscriber is overloaded and the pubsub system should |
|
||||||
// back off on the rate at which it is invoking HandlePubsubEvent). The |
|
||||||
// endpoint may be a load balancer for better scalability. |
|
||||||
// |
|
||||||
// (b) To receive messages via pull a subscriber calls the Pull method on the |
|
||||||
// SubscriberService to get messages from the subscription. For each |
|
||||||
// individual message, the subscriber may use the ack_id received in the |
|
||||||
// PullResponse to Ack the message, Nack the message, or modify the ack |
|
||||||
// deadline with ModifyAckDeadline. See the |
|
||||||
// Subscription.ack_deadline_seconds field documentation for details on the |
|
||||||
// ack deadline behavior. |
|
||||||
// |
|
||||||
// Note: Messages may be consumed in parallel by multiple subscribers making |
|
||||||
// Pull calls to the same subscription; this will result in the set of |
|
||||||
// messages from the subscription being shared and each subscriber |
|
||||||
// receiving a subset of the messages. |
|
||||||
// |
|
||||||
// (4) The subscriber can explicitly truncate the current subscription. |
|
||||||
// |
|
||||||
// (5) "Truncated" events are delivered when a subscription is |
|
||||||
// truncated, whether due to the subscription's truncation policy |
|
||||||
// or an explicit request from the subscriber. |
|
||||||
// |
|
||||||
// Subscription creation: |
|
||||||
// |
|
||||||
// Subscription subscription; |
|
||||||
// subscription.set_topic("topicName"); |
|
||||||
// subscription.set_name("subscriptionName"); |
|
||||||
// subscription.push_config().set_push_endpoint("machinename:8888"); |
|
||||||
// SubscriberService.CreateSubscription(subscription); |
|
||||||
// |
|
||||||
// Consuming messages via push: |
|
||||||
// |
|
||||||
// The port 'machinename:8888' must be bound to a server that implements |
|
||||||
// the PushEndpointService with the following method: |
|
||||||
// |
|
||||||
// int HandlePubsubEvent(PubsubEvent event) { |
|
||||||
// if (event.subscription().equals("subscriptionName")) { |
|
||||||
// if (event.has_message()) { |
|
||||||
// Process(event.message().data()); |
|
||||||
// } else if (event.truncated()) { |
|
||||||
// ProcessTruncatedEvent(); |
|
||||||
// } |
|
||||||
// } |
|
||||||
// return OK; // This return code implies an acknowledgment |
|
||||||
// } |
|
||||||
// |
|
||||||
// Consuming messages via pull: |
|
||||||
// |
|
||||||
// The subscription must be created without setting the push_config field. |
|
||||||
// |
|
||||||
// PullRequest pull_request; |
|
||||||
// pull_request.set_subscription("subscriptionName"); |
|
||||||
// pull_request.set_return_immediately(false); |
|
||||||
// while (true) { |
|
||||||
// PullResponse pull_response; |
|
||||||
// if (SubscriberService.Pull(pull_request, pull_response) == OK) { |
|
||||||
// PubsubEvent event = pull_response.pubsub_event(); |
|
||||||
// if (event.has_message()) { |
|
||||||
// Process(event.message().data()); |
|
||||||
// } else if (event.truncated()) { |
|
||||||
// ProcessTruncatedEvent(); |
|
||||||
// } |
|
||||||
// AcknowledgeRequest ack_request; |
|
||||||
// ackRequest.set_subscription("subscriptionName"); |
|
||||||
// ackRequest.set_ack_id(pull_response.ack_id()); |
|
||||||
// SubscriberService.Acknowledge(ack_request); |
|
||||||
// } |
|
||||||
// } |
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------- |
|
||||||
// Reliability Semantics |
|
||||||
// ----------------------------------------------------------------------------- |
|
||||||
|
|
||||||
// When a subscriber successfully creates a subscription using |
|
||||||
// Subscriber.CreateSubscription, it establishes a "subscription point" with |
|
||||||
// respect to that subscription - the subscriber is guaranteed to receive any |
|
||||||
// message published after this subscription point that matches the |
|
||||||
// subscription's query. Note that messages published before the Subscription |
|
||||||
// point may or may not be delivered. |
|
||||||
// |
|
||||||
// If the system truncates the subscription according to the specified |
|
||||||
// truncation policy, the system delivers a subscription status event with the |
|
||||||
// "truncated" field set to true. We refer to such events as "truncation |
|
||||||
// events". A truncation event: |
|
||||||
// |
|
||||||
// * Informs the subscriber that part of the subscription messages have been |
|
||||||
// discarded. The subscriber may want to recover from the message loss, e.g., |
|
||||||
// by resyncing its state with its backend. |
|
||||||
// * Establishes a new subscription point, i.e., the subscriber is guaranteed to |
|
||||||
// receive all changes published after the trunction event is received (or |
|
||||||
// until another truncation event is received). |
|
||||||
// |
|
||||||
// Note that messages are not delivered in any particular order by the pubsub |
|
||||||
// system. Furthermore, the system guarantees at-least-once delivery |
|
||||||
// of each message or truncation events until acked. |
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------- |
|
||||||
// Deletion |
|
||||||
// ----------------------------------------------------------------------------- |
|
||||||
|
|
||||||
// Both topics and subscriptions may be deleted. Deletion of a topic implies |
|
||||||
// deletion of all attached subscriptions. |
|
||||||
// |
|
||||||
// When a subscription is deleted directly by calling DeleteSubscription, all |
|
||||||
// messages are immediately dropped. If it is a pull subscriber, future pull |
|
||||||
// requests will return NOT_FOUND. |
|
||||||
// |
|
||||||
// When a topic is deleted all corresponding subscriptions are immediately |
|
||||||
// deleted, and subscribers experience the same behavior as directly deleting |
|
||||||
// the subscription. |
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------- |
|
||||||
// The Publisher service and its protos. |
|
||||||
// ----------------------------------------------------------------------------- |
|
||||||
|
|
||||||
// The service that an application uses to manipulate topics, and to send |
|
||||||
// messages to a topic. |
|
||||||
service PublisherService { |
|
||||||
|
|
||||||
// Creates the given topic with the given name. |
|
||||||
rpc CreateTopic(Topic) returns (Topic) { |
|
||||||
} |
|
||||||
|
|
||||||
// Adds a message to the topic. Returns NOT_FOUND if the topic does not |
|
||||||
// exist. |
|
||||||
rpc Publish(PublishRequest) returns (proto2.Empty) { |
|
||||||
} |
|
||||||
|
|
||||||
// Adds one or more messages to the topic. Returns NOT_FOUND if the topic does |
|
||||||
// not exist. |
|
||||||
rpc PublishBatch(PublishBatchRequest) returns (PublishBatchResponse) { |
|
||||||
} |
|
||||||
|
|
||||||
// Gets the configuration of a topic. Since the topic only has the name |
|
||||||
// attribute, this method is only useful to check the existence of a topic. |
|
||||||
// If other attributes are added in the future, they will be returned here. |
|
||||||
rpc GetTopic(GetTopicRequest) returns (Topic) { |
|
||||||
} |
|
||||||
|
|
||||||
// Lists matching topics. |
|
||||||
rpc ListTopics(ListTopicsRequest) returns (ListTopicsResponse) { |
|
||||||
} |
|
||||||
|
|
||||||
// Deletes the topic with the given name. All subscriptions to this topic |
|
||||||
// are also deleted. Returns NOT_FOUND if the topic does not exist. |
|
||||||
// After a topic is deleted, a new topic may be created with the same name. |
|
||||||
rpc DeleteTopic(DeleteTopicRequest) returns (proto2.Empty) { |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
// A topic resource. |
|
||||||
message Topic { |
|
||||||
// Name of the topic. |
|
||||||
optional string name = 1; |
|
||||||
} |
|
||||||
|
|
||||||
// A message data and its labels. |
|
||||||
message PubsubMessage { |
|
||||||
// The message payload. |
|
||||||
optional bytes data = 1; |
|
||||||
|
|
||||||
// Optional list of labels for this message. Keys in this collection must |
|
||||||
// be unique. |
|
||||||
repeated tech.label.Label label = 2; |
|
||||||
|
|
||||||
// ID of this message assigned by the server at publication time. Guaranteed |
|
||||||
// to be unique within the topic. This value may be read by a subscriber |
|
||||||
// that receives a PubsubMessage via a Pull call or a push delivery. It must |
|
||||||
// not be populated by a publisher in a Publish call. |
|
||||||
optional string message_id = 3; |
|
||||||
} |
|
||||||
|
|
||||||
// Request for the GetTopic method. |
|
||||||
message GetTopicRequest { |
|
||||||
// The name of the topic to get. |
|
||||||
optional string topic = 1; |
|
||||||
} |
|
||||||
|
|
||||||
// Request for the Publish method. |
|
||||||
message PublishRequest { |
|
||||||
// The message in the request will be published on this topic. |
|
||||||
optional string topic = 1; |
|
||||||
|
|
||||||
// The message to publish. |
|
||||||
optional PubsubMessage message = 2; |
|
||||||
} |
|
||||||
|
|
||||||
// Request for the PublishBatch method. |
|
||||||
message PublishBatchRequest { |
|
||||||
// The messages in the request will be published on this topic. |
|
||||||
optional string topic = 1; |
|
||||||
|
|
||||||
// The messages to publish. |
|
||||||
repeated PubsubMessage messages = 2; |
|
||||||
} |
|
||||||
|
|
||||||
// Response for the PublishBatch method. |
|
||||||
message PublishBatchResponse { |
|
||||||
// The server-assigned ID of each published message, in the same order as |
|
||||||
// the messages in the request. IDs are guaranteed to be unique within |
|
||||||
// the topic. |
|
||||||
repeated string message_ids = 1; |
|
||||||
} |
|
||||||
|
|
||||||
// Request for the ListTopics method. |
|
||||||
message ListTopicsRequest { |
|
||||||
// A valid label query expression. |
|
||||||
// (-- Which labels are required or supported is implementation-specific. --) |
|
||||||
optional string query = 1; |
|
||||||
|
|
||||||
// Maximum number of topics to return. |
|
||||||
// (-- If not specified or <= 0, the implementation will select a reasonable |
|
||||||
// value. --) |
|
||||||
optional int32 max_results = 2; |
|
||||||
|
|
||||||
// The value obtained in the last <code>ListTopicsResponse</code> |
|
||||||
// for continuation. |
|
||||||
optional string page_token = 3; |
|
||||||
|
|
||||||
} |
|
||||||
|
|
||||||
// Response for the ListTopics method. |
|
||||||
message ListTopicsResponse { |
|
||||||
// The resulting topics. |
|
||||||
repeated Topic topic = 1; |
|
||||||
|
|
||||||
// If not empty, indicates that there are more topics that match the request, |
|
||||||
// and this value should be passed to the next <code>ListTopicsRequest</code> |
|
||||||
// to continue. |
|
||||||
optional string next_page_token = 2; |
|
||||||
} |
|
||||||
|
|
||||||
// Request for the Delete method. |
|
||||||
message DeleteTopicRequest { |
|
||||||
// Name of the topic to delete. |
|
||||||
optional string topic = 1; |
|
||||||
} |
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------- |
|
||||||
// The Subscriber service and its protos. |
|
||||||
// ----------------------------------------------------------------------------- |
|
||||||
|
|
||||||
// The service that an application uses to manipulate subscriptions and to |
|
||||||
// consume messages from a subscription via the pull method. |
|
||||||
service SubscriberService { |
|
||||||
|
|
||||||
// Creates a subscription on a given topic for a given subscriber. |
|
||||||
// If the subscription already exists, returns ALREADY_EXISTS. |
|
||||||
// If the corresponding topic doesn't exist, returns NOT_FOUND. |
|
||||||
// |
|
||||||
// If the name is not provided in the request, the server will assign a random |
|
||||||
// name for this subscription on the same project as the topic. |
|
||||||
rpc CreateSubscription(Subscription) returns (Subscription) { |
|
||||||
} |
|
||||||
|
|
||||||
// Gets the configuration details of a subscription. |
|
||||||
rpc GetSubscription(GetSubscriptionRequest) returns (Subscription) { |
|
||||||
} |
|
||||||
|
|
||||||
// Lists matching subscriptions. |
|
||||||
rpc ListSubscriptions(ListSubscriptionsRequest) |
|
||||||
returns (ListSubscriptionsResponse) { |
|
||||||
} |
|
||||||
|
|
||||||
// Deletes an existing subscription. All pending messages in the subscription |
|
||||||
// are immediately dropped. Calls to Pull after deletion will return |
|
||||||
// NOT_FOUND. |
|
||||||
rpc DeleteSubscription(DeleteSubscriptionRequest) returns (proto2.Empty) { |
|
||||||
} |
|
||||||
|
|
||||||
// Removes all the pending messages in the subscription and releases the |
|
||||||
// storage associated with them. Results in a truncation event to be sent to |
|
||||||
// the subscriber. Messages added after this call returns are stored in the |
|
||||||
// subscription as before. |
|
||||||
rpc TruncateSubscription(TruncateSubscriptionRequest) returns (proto2.Empty) { |
|
||||||
} |
|
||||||
|
|
||||||
// |
|
||||||
// Push subscriber calls. |
|
||||||
// |
|
||||||
|
|
||||||
// Modifies the <code>PushConfig</code> for a specified subscription. |
|
||||||
// This method can be used to suspend the flow of messages to an endpoint |
|
||||||
// by clearing the <code>PushConfig</code> field in the request. Messages |
|
||||||
// will be accumulated for delivery even if no push configuration is |
|
||||||
// defined or while the configuration is modified. |
|
||||||
rpc ModifyPushConfig(ModifyPushConfigRequest) returns (proto2.Empty) { |
|
||||||
} |
|
||||||
|
|
||||||
// |
|
||||||
// Pull Subscriber calls |
|
||||||
// |
|
||||||
|
|
||||||
// Pulls a single message from the server. |
|
||||||
// If return_immediately is true, and no messages are available in the |
|
||||||
// subscription, this method returns FAILED_PRECONDITION. The system is free |
|
||||||
// to return an UNAVAILABLE error if no messages are available in a |
|
||||||
// reasonable amount of time (to reduce system load). |
|
||||||
rpc Pull(PullRequest) returns (PullResponse) { |
|
||||||
} |
|
||||||
|
|
||||||
// Pulls messages from the server. Returns an empty list if there are no |
|
||||||
// messages available in the backlog. The system is free to return UNAVAILABLE |
|
||||||
// if there are too many pull requests outstanding for the given subscription. |
|
||||||
rpc PullBatch(PullBatchRequest) returns (PullBatchResponse) { |
|
||||||
} |
|
||||||
|
|
||||||
// Modifies the Ack deadline for a message received from a pull request. |
|
||||||
rpc ModifyAckDeadline(ModifyAckDeadlineRequest) returns (proto2.Empty) { |
|
||||||
} |
|
||||||
|
|
||||||
// Acknowledges a particular received message: the Pub/Sub system can remove |
|
||||||
// the given message from the subscription. Acknowledging a message whose |
|
||||||
// Ack deadline has expired may succeed, but the message could have been |
|
||||||
// already redelivered. Acknowledging a message more than once will not |
|
||||||
// result in an error. This is only used for messages received via pull. |
|
||||||
rpc Acknowledge(AcknowledgeRequest) returns (proto2.Empty) { |
|
||||||
} |
|
||||||
|
|
||||||
// Refuses processing a particular received message. The system will |
|
||||||
// redeliver this message to some consumer of the subscription at some |
|
||||||
// future time. This is only used for messages received via pull. |
|
||||||
rpc Nack(NackRequest) returns (proto2.Empty) { |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
// A subscription resource. |
|
||||||
message Subscription { |
|
||||||
// Name of the subscription. |
|
||||||
optional string name = 1; |
|
||||||
|
|
||||||
// The name of the topic from which this subscription is receiving messages. |
|
||||||
optional string topic = 2; |
|
||||||
|
|
||||||
// If <code>query</code> is non-empty, only messages on the subscriber's |
|
||||||
// topic whose labels match the query will be returned. Otherwise all |
|
||||||
// messages on the topic will be returned. |
|
||||||
// (-- The query syntax is described in label_query.proto --) |
|
||||||
optional string query = 3; |
|
||||||
|
|
||||||
// The subscriber may specify requirements for truncating unacknowledged |
|
||||||
// subscription entries. The system will honor the |
|
||||||
// <code>CreateSubscription</code> request only if it can meet these |
|
||||||
// requirements. If this field is not specified, messages are never truncated |
|
||||||
// by the system. |
|
||||||
optional TruncationPolicy truncation_policy = 4; |
|
||||||
|
|
||||||
// Specifies which messages can be truncated by the system. |
|
||||||
message TruncationPolicy { |
|
||||||
oneof policy { |
|
||||||
// If <code>max_bytes</code> is specified, the system is allowed to drop |
|
||||||
// old messages to keep the combined size of stored messages under |
|
||||||
// <code>max_bytes</code>. This is a hint; the system may keep more than |
|
||||||
// this many bytes, but will make a best effort to keep the size from |
|
||||||
// growing much beyond this parameter. |
|
||||||
int64 max_bytes = 1; |
|
||||||
|
|
||||||
// If <code>max_age_seconds</code> is specified, the system is allowed to |
|
||||||
// drop messages that have been stored for at least this many seconds. |
|
||||||
// This is a hint; the system may keep these messages, but will make a |
|
||||||
// best effort to remove them when their maximum age is reached. |
|
||||||
int64 max_age_seconds = 2; |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
// If push delivery is used with this subscription, this field is |
|
||||||
// used to configure it. |
|
||||||
optional PushConfig push_config = 5; |
|
||||||
|
|
||||||
// For either push or pull delivery, the value is the maximum time after a |
|
||||||
// subscriber receives a message before the subscriber should acknowledge or |
|
||||||
// Nack the message. If the Ack deadline for a message passes without an |
|
||||||
// Ack or a Nack, the Pub/Sub system will eventually redeliver the message. |
|
||||||
// If a subscriber acknowledges after the deadline, the Pub/Sub system may |
|
||||||
// accept the Ack, but it is possible that the message has been already |
|
||||||
// delivered again. Multiple Acks to the message are allowed and will |
|
||||||
// succeed. |
|
||||||
// |
|
||||||
// For push delivery, this value is used to set the request timeout for |
|
||||||
// the call to the push endpoint. |
|
||||||
// |
|
||||||
// For pull delivery, this value is used as the initial value for the Ack |
|
||||||
// deadline. It may be overridden for a specific pull request (message) with |
|
||||||
// <code>ModifyAckDeadline</code>. |
|
||||||
// While a message is outstanding (i.e. it has been delivered to a pull |
|
||||||
// subscriber and the subscriber has not yet Acked or Nacked), the Pub/Sub |
|
||||||
// system will not deliver that message to another pull subscriber |
|
||||||
// (on a best-effort basis). |
|
||||||
optional int32 ack_deadline_seconds = 6; |
|
||||||
|
|
||||||
// If this parameter is set to n, the system is allowed to (but not required |
|
||||||
// to) delete the subscription when at least n seconds have elapsed since the |
|
||||||
// client presence was detected. (Presence is detected through any |
|
||||||
// interaction using the subscription ID, including Pull(), Get(), or |
|
||||||
// acknowledging a message.) |
|
||||||
// |
|
||||||
// If this parameter is not set, the subscription will stay live until |
|
||||||
// explicitly deleted. |
|
||||||
// |
|
||||||
// Clients can detect such garbage collection when a Get call or a Pull call |
|
||||||
// (for pull subscribers only) returns NOT_FOUND. |
|
||||||
optional int64 garbage_collect_seconds = 7; |
|
||||||
} |
|
||||||
|
|
||||||
// Configuration for a push delivery endpoint. |
|
||||||
message PushConfig { |
|
||||||
// A URL locating the endpoint to which messages should be pushed. |
|
||||||
// For example, a Webhook endpoint might use "https://example.com/push". |
|
||||||
// (-- An Android application might use "gcm:<REGID>", where <REGID> is a |
|
||||||
// GCM registration id allocated for pushing messages to the application. --) |
|
||||||
optional string push_endpoint = 1; |
|
||||||
} |
|
||||||
|
|
||||||
// An event indicating a received message or truncation event. |
|
||||||
message PubsubEvent { |
|
||||||
// The subscription that received the event. |
|
||||||
optional string subscription = 1; |
|
||||||
|
|
||||||
oneof type { |
|
||||||
// A received message. |
|
||||||
PubsubMessage message = 2; |
|
||||||
|
|
||||||
// Indicates that this subscription has been truncated. |
|
||||||
bool truncated = 3; |
|
||||||
|
|
||||||
// Indicates that this subscription has been deleted. (Note that pull |
|
||||||
// subscribers will always receive NOT_FOUND in response in their pull |
|
||||||
// request on the subscription, rather than seeing this boolean.) |
|
||||||
bool deleted = 4; |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
// Request for the GetSubscription method. |
|
||||||
message GetSubscriptionRequest { |
|
||||||
// The name of the subscription to get. |
|
||||||
optional string subscription = 1; |
|
||||||
} |
|
||||||
|
|
||||||
// Request for the ListSubscriptions method. |
|
||||||
message ListSubscriptionsRequest { |
|
||||||
// A valid label query expression. |
|
||||||
// (-- Which labels are required or supported is implementation-specific. |
|
||||||
// TODO(eschapira): This method must support to query by topic. We must |
|
||||||
// define the key URI for the "topic" label. --) |
|
||||||
optional string query = 1; |
|
||||||
|
|
||||||
// Maximum number of subscriptions to return. |
|
||||||
// (-- If not specified or <= 0, the implementation will select a reasonable |
|
||||||
// value. --) |
|
||||||
optional int32 max_results = 3; |
|
||||||
|
|
||||||
// The value obtained in the last <code>ListSubscriptionsResponse</code> |
|
||||||
// for continuation. |
|
||||||
optional string page_token = 4; |
|
||||||
} |
|
||||||
|
|
||||||
// Response for the ListSubscriptions method. |
|
||||||
message ListSubscriptionsResponse { |
|
||||||
// The subscriptions that match the request. |
|
||||||
repeated Subscription subscription = 1; |
|
||||||
|
|
||||||
// If not empty, indicates that there are more subscriptions that match the |
|
||||||
// request and this value should be passed to the next |
|
||||||
// <code>ListSubscriptionsRequest</code> to continue. |
|
||||||
optional string next_page_token = 2; |
|
||||||
} |
|
||||||
|
|
||||||
// Request for the TruncateSubscription method. |
|
||||||
message TruncateSubscriptionRequest { |
|
||||||
// The subscription that is being truncated. |
|
||||||
optional string subscription = 1; |
|
||||||
} |
|
||||||
|
|
||||||
// Request for the DeleteSubscription method. |
|
||||||
message DeleteSubscriptionRequest { |
|
||||||
// The subscription to delete. |
|
||||||
optional string subscription = 1; |
|
||||||
} |
|
||||||
|
|
||||||
// Request for the ModifyPushConfig method. |
|
||||||
message ModifyPushConfigRequest { |
|
||||||
// The name of the subscription. |
|
||||||
optional string subscription = 1; |
|
||||||
|
|
||||||
// An empty <code>push_config</code> indicates that the Pub/Sub system should |
|
||||||
// pause pushing messages from the given subscription. |
|
||||||
optional PushConfig push_config = 2; |
|
||||||
} |
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------- |
|
||||||
// The protos used by a pull subscriber. |
|
||||||
// ----------------------------------------------------------------------------- |
|
||||||
|
|
||||||
// Request for the Pull method. |
|
||||||
message PullRequest { |
|
||||||
// The subscription from which a message should be pulled. |
|
||||||
optional string subscription = 1; |
|
||||||
|
|
||||||
// If this is specified as true the system will respond immediately even if |
|
||||||
// it is not able to return a message in the Pull response. Otherwise the |
|
||||||
// system is allowed to wait until at least one message is available rather |
|
||||||
// than returning FAILED_PRECONDITION. The client may cancel the request if |
|
||||||
// it does not wish to wait any longer for the response. |
|
||||||
optional bool return_immediately = 2; |
|
||||||
} |
|
||||||
|
|
||||||
// Either a <code>PubsubMessage</code> or a truncation event. One of these two |
|
||||||
// must be populated. |
|
||||||
message PullResponse { |
|
||||||
// This ID must be used to acknowledge the received event or message. |
|
||||||
optional string ack_id = 1; |
|
||||||
|
|
||||||
// A pubsub message or truncation event. |
|
||||||
optional PubsubEvent pubsub_event = 2; |
|
||||||
} |
|
||||||
|
|
||||||
// Request for the PullBatch method. |
|
||||||
message PullBatchRequest { |
|
||||||
// The subscription from which messages should be pulled. |
|
||||||
optional string subscription = 1; |
|
||||||
|
|
||||||
// If this is specified as true the system will respond immediately even if |
|
||||||
// it is not able to return a message in the Pull response. Otherwise the |
|
||||||
// system is allowed to wait until at least one message is available rather |
|
||||||
// than returning no messages. The client may cancel the request if it does |
|
||||||
// not wish to wait any longer for the response. |
|
||||||
optional bool return_immediately = 2; |
|
||||||
|
|
||||||
// The maximum number of PubsubEvents returned for this request. The Pub/Sub |
|
||||||
// system may return fewer than the number of events specified. |
|
||||||
optional int32 max_events = 3; |
|
||||||
} |
|
||||||
|
|
||||||
// Response for the PullBatch method. |
|
||||||
message PullBatchResponse { |
|
||||||
|
|
||||||
// Received Pub/Sub messages or status events. The Pub/Sub system will return |
|
||||||
// zero messages if there are no more messages available in the backlog. The |
|
||||||
// Pub/Sub system may return fewer than the max_events requested even if |
|
||||||
// there are more messages available in the backlog. |
|
||||||
repeated PullResponse pull_responses = 2; |
|
||||||
} |
|
||||||
|
|
||||||
// Request for the ModifyAckDeadline method. |
|
||||||
message ModifyAckDeadlineRequest { |
|
||||||
// The name of the subscription from which messages are being pulled. |
|
||||||
optional string subscription = 1; |
|
||||||
|
|
||||||
// The acknowledgment ID. |
|
||||||
optional string ack_id = 2; |
|
||||||
|
|
||||||
// The new Ack deadline. Must be >= 0. |
|
||||||
optional int32 ack_deadline_seconds = 3; |
|
||||||
} |
|
||||||
|
|
||||||
// Request for the Acknowledge method. |
|
||||||
message AcknowledgeRequest { |
|
||||||
// The subscription whose message is being acknowledged. |
|
||||||
optional string subscription = 1; |
|
||||||
|
|
||||||
// The acknowledgment ID for the message being acknowledged. This was |
|
||||||
// returned by the Pub/Sub system in the Pull response. |
|
||||||
repeated string ack_id = 2; |
|
||||||
} |
|
||||||
|
|
||||||
// Request for the Nack method. |
|
||||||
message NackRequest { |
|
||||||
// The subscription whose message is being Nacked. |
|
||||||
optional string subscription = 1; |
|
||||||
|
|
||||||
// The acknowledgment ID for the message being refused. This was returned by |
|
||||||
// the Pub/Sub system in the Pull response. |
|
||||||
repeated string ack_id = 2; |
|
||||||
} |
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------- |
|
||||||
// The service and protos used by a push subscriber. |
|
||||||
// ----------------------------------------------------------------------------- |
|
||||||
|
|
||||||
// The service that a subscriber uses to handle messages sent via push |
|
||||||
// delivery. |
|
||||||
// This service is not currently exported for HTTP clients. |
|
||||||
// TODO(eschapira): Explain HTTP subscribers. |
|
||||||
service PushEndpointService { |
|
||||||
// Sends a <code>PubsubMessage</code> or a subscription status event to a |
|
||||||
// push endpoint. |
|
||||||
// The push endpoint responds with an empty message and a code from |
|
||||||
// util/task/codes.proto. The following codes have a particular meaning to the |
|
||||||
// Pub/Sub system: |
|
||||||
// OK - This is interpreted by Pub/Sub as Ack. |
|
||||||
// ABORTED - This is intepreted by Pub/Sub as a Nack, without implying |
|
||||||
// pushback for congestion control. The Pub/Sub system will |
|
||||||
// retry this message at a later time. |
|
||||||
// UNAVAILABLE - This is intepreted by Pub/Sub as a Nack, with the additional |
|
||||||
// semantics of push-back. The Pub/Sub system will use an AIMD |
|
||||||
// congestion control algorithm to backoff the rate of sending |
|
||||||
// messages from this subscription. |
|
||||||
// Any other code, or a failure to respond, will be interpreted in the same |
|
||||||
// way as ABORTED; i.e. the system will retry the message at a later time to |
|
||||||
// ensure reliable delivery. |
|
||||||
rpc HandlePubsubEvent(PubsubEvent) returns (proto2.Empty); |
|
||||||
} |
|
@ -0,0 +1,69 @@ |
|||||||
|
Pod::Spec.new do |s| |
||||||
|
s.name = 'gRPC' |
||||||
|
s.version = '0.0.1' |
||||||
|
s.summary = 'Generic gRPC client library for iOS' |
||||||
|
s.homepage = 'https://www.grpc.io' |
||||||
|
s.license = 'New BSD' |
||||||
|
s.authors = { 'Jorge Canizales' => 'jcanizales@google.com' } |
||||||
|
|
||||||
|
# s.source = { :git => 'https://github.com/grpc/grpc.git', :tag => 'release-0_5_0' } |
||||||
|
s.source_files = 'src/objective-c/GRPCClient/*.{h,m}', 'src/objective-c/GRPCClient/private/*.{h,m}' |
||||||
|
s.private_header_files = 'src/objective-c/GRPCClient/private/*.h' |
||||||
|
|
||||||
|
s.platform = :ios |
||||||
|
s.ios.deployment_target = '6.0' |
||||||
|
s.requires_arc = true |
||||||
|
|
||||||
|
s.subspec 'RxLibrary' do |rs| |
||||||
|
rs.summary = 'Reactive Extensions library for iOS' |
||||||
|
rs.authors = { 'Jorge Canizales' => 'jcanizales@google.com' } |
||||||
|
|
||||||
|
rs.source_files = 'src/objective-c/RxLibrary/*.{h,m}', 'src/objective-c/RxLibrary/transformations/*.{h,m}', 'src/objective-c/RxLibrary/private/*.{h,m}' |
||||||
|
rs.private_header_files = 'src/objective-c/RxLibrary/private/*.h' |
||||||
|
end |
||||||
|
|
||||||
|
s.subspec 'C-Core' do |cs| |
||||||
|
cs.summary = 'Core gRPC library, written in C' |
||||||
|
cs.authors = { 'Craig Tiller' => 'ctiller@google.com', |
||||||
|
'David Klempner' => 'klempner@google.com', |
||||||
|
'Nicolas Noble' => 'nnoble@google.com', |
||||||
|
'Vijay Pai' => 'vpai@google.com', |
||||||
|
'Yang Gao' => 'yangg@google.com' } |
||||||
|
|
||||||
|
cs.source_files = 'src/core/**/*.{h,c}', 'include/grpc/*.h', 'include/grpc/**/*.h' |
||||||
|
cs.private_header_files = 'src/core/**/*.h' |
||||||
|
cs.header_mappings_dir = '.' |
||||||
|
cs.xcconfig = { 'HEADER_SEARCH_PATHS' => '"$(PODS_ROOT)/Headers/Build/gRPC" "$(PODS_ROOT)/Headers/Build/gRPC/include"' } |
||||||
|
|
||||||
|
cs.requires_arc = false |
||||||
|
cs.libraries = 'z' |
||||||
|
cs.dependency 'OpenSSL', '~> 1.0.200' |
||||||
|
end |
||||||
|
|
||||||
|
# This is a workaround for Cocoapods Issue #1437. |
||||||
|
# It renames time.h and string.h to grpc_time.h and grpc_string.h. |
||||||
|
s.prepare_command = <<-CMD |
||||||
|
DIR_TIME="grpc/support" |
||||||
|
BAD_TIME="$DIR_TIME/time.h" |
||||||
|
GOOD_TIME="$DIR_TIME/grpc_time.h" |
||||||
|
if [ -f "include/$BAD_TIME" ]; |
||||||
|
then |
||||||
|
grep -rl "$BAD_TIME" include/grpc src/core | xargs sed -i '' -e s@$BAD_TIME@$GOOD_TIME@g |
||||||
|
mv "include/$BAD_TIME" "include/$GOOD_TIME" |
||||||
|
fi |
||||||
|
|
||||||
|
DIR_STRING="src/core/support" |
||||||
|
BAD_STRING="$DIR_STRING/string.h" |
||||||
|
GOOD_STRING="$DIR_STRING/grpc_string.h" |
||||||
|
if [ -f "$BAD_STRING" ]; |
||||||
|
then |
||||||
|
grep -rl "$BAD_STRING" include/grpc src/core | xargs sed -i '' -e s@$BAD_STRING@$GOOD_STRING@g |
||||||
|
mv "$BAD_STRING" "$GOOD_STRING" |
||||||
|
fi |
||||||
|
CMD |
||||||
|
|
||||||
|
s.xcconfig = { 'HEADER_SEARCH_PATHS' => '"$(PODS_ROOT)/Headers/Public/gRPC/include"' } |
||||||
|
|
||||||
|
# Certificates, to be able to establish TLS connections: |
||||||
|
s.resource_bundles = { 'gRPC' => ['etc/roots.pem'] } |
||||||
|
end |
@ -0,0 +1,201 @@ |
|||||||
|
/*
|
||||||
|
* |
||||||
|
* Copyright 2015, Google Inc. |
||||||
|
* All rights reserved. |
||||||
|
* |
||||||
|
* Redistribution and use in source and binary forms, with or without |
||||||
|
* modification, are permitted provided that the following conditions are |
||||||
|
* met: |
||||||
|
* |
||||||
|
* * Redistributions of source code must retain the above copyright |
||||||
|
* notice, this list of conditions and the following disclaimer. |
||||||
|
* * Redistributions in binary form must reproduce the above |
||||||
|
* copyright notice, this list of conditions and the following disclaimer |
||||||
|
* in the documentation and/or other materials provided with the |
||||||
|
* distribution. |
||||||
|
* * Neither the name of Google Inc. nor the names of its |
||||||
|
* contributors may be used to endorse or promote products derived from |
||||||
|
* this software without specific prior written permission. |
||||||
|
* |
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||||
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||||
|
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||||
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||||
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||||
|
* |
||||||
|
*/ |
||||||
|
|
||||||
|
#ifndef GRPC_INTERNAL_CORE_SECURITY_SECURITY_CONNECTOR_H |
||||||
|
#define GRPC_INTERNAL_CORE_SECURITY_SECURITY_CONNECTOR_H |
||||||
|
|
||||||
|
#include <grpc/grpc_security.h> |
||||||
|
#include "src/core/iomgr/endpoint.h" |
||||||
|
#include "src/core/tsi/transport_security_interface.h" |
||||||
|
|
||||||
|
/* --- status enum. --- */ |
||||||
|
|
||||||
|
typedef enum { |
||||||
|
GRPC_SECURITY_OK = 0, |
||||||
|
GRPC_SECURITY_PENDING, |
||||||
|
GRPC_SECURITY_ERROR |
||||||
|
} grpc_security_status; |
||||||
|
|
||||||
|
/* --- URL schemes. --- */ |
||||||
|
|
||||||
|
#define GRPC_SSL_URL_SCHEME "https" |
||||||
|
#define GRPC_FAKE_SECURITY_URL_SCHEME "http+fake_security" |
||||||
|
|
||||||
|
/* --- security_connector object. ---
|
||||||
|
|
||||||
|
A security connector object represents away to configure the underlying |
||||||
|
transport security mechanism and check the resulting trusted peer. */ |
||||||
|
|
||||||
|
typedef struct grpc_security_connector grpc_security_connector; |
||||||
|
|
||||||
|
#define GRPC_SECURITY_CONNECTOR_ARG "grpc.security_connector" |
||||||
|
|
||||||
|
typedef void (*grpc_security_check_cb)(void *user_data, |
||||||
|
grpc_security_status status); |
||||||
|
|
||||||
|
typedef struct { |
||||||
|
void (*destroy)(grpc_security_connector *sc); |
||||||
|
grpc_security_status (*create_handshaker)(grpc_security_connector *sc, |
||||||
|
tsi_handshaker **handshaker); |
||||||
|
grpc_security_status (*check_peer)(grpc_security_connector *sc, tsi_peer peer, |
||||||
|
grpc_security_check_cb cb, |
||||||
|
void *user_data); |
||||||
|
} grpc_security_connector_vtable; |
||||||
|
|
||||||
|
struct grpc_security_connector { |
||||||
|
const grpc_security_connector_vtable *vtable; |
||||||
|
gpr_refcount refcount; |
||||||
|
int is_client_side; |
||||||
|
const char *url_scheme; |
||||||
|
}; |
||||||
|
|
||||||
|
/* Increments the refcount. */ |
||||||
|
grpc_security_connector *grpc_security_connector_ref( |
||||||
|
grpc_security_connector *sc); |
||||||
|
|
||||||
|
/* Decrements the refcount and destroys the object if it reaches 0. */ |
||||||
|
void grpc_security_connector_unref(grpc_security_connector *sc); |
||||||
|
|
||||||
|
/* Handshake creation. */ |
||||||
|
grpc_security_status grpc_security_connector_create_handshaker( |
||||||
|
grpc_security_connector *sc, tsi_handshaker **handshaker); |
||||||
|
|
||||||
|
/* Check the peer.
|
||||||
|
Implementations can choose to check the peer either synchronously or |
||||||
|
asynchronously. In the first case, a successful call will return |
||||||
|
GRPC_SECURITY_OK. In the asynchronous case, the call will return |
||||||
|
GRPC_SECURITY_PENDING unless an error is detected early on. |
||||||
|
Ownership of the peer is transfered. |
||||||
|
*/ |
||||||
|
grpc_security_status grpc_security_connector_check_peer( |
||||||
|
grpc_security_connector *sc, tsi_peer peer, grpc_security_check_cb cb, |
||||||
|
void *user_data); |
||||||
|
|
||||||
|
/* Util to encapsulate the connector in a channel arg. */ |
||||||
|
grpc_arg grpc_security_connector_to_arg(grpc_security_connector *sc); |
||||||
|
|
||||||
|
/* Util to get the connector from a channel arg. */ |
||||||
|
grpc_security_connector *grpc_security_connector_from_arg(const grpc_arg *arg); |
||||||
|
|
||||||
|
/* Util to find the connector from channel args. */ |
||||||
|
grpc_security_connector *grpc_find_security_connector_in_args( |
||||||
|
const grpc_channel_args *args); |
||||||
|
|
||||||
|
/* --- channel_security_connector object. ---
|
||||||
|
|
||||||
|
A channel security connector object represents away to configure the |
||||||
|
underlying transport security mechanism on the client side. */ |
||||||
|
|
||||||
|
typedef struct grpc_channel_security_connector grpc_channel_security_connector; |
||||||
|
|
||||||
|
struct grpc_channel_security_connector { |
||||||
|
grpc_security_connector base; /* requires is_client_side to be non 0. */ |
||||||
|
grpc_credentials *request_metadata_creds; |
||||||
|
grpc_security_status (*check_call_host)(grpc_channel_security_connector *sc, |
||||||
|
const char *host, |
||||||
|
grpc_security_check_cb cb, |
||||||
|
void *user_data); |
||||||
|
}; |
||||||
|
|
||||||
|
/* Checks that the host that will be set for a call is acceptable.
|
||||||
|
Implementations can choose do the check either synchronously or |
||||||
|
asynchronously. In the first case, a successful call will return |
||||||
|
GRPC_SECURITY_OK. In the asynchronous case, the call will return |
||||||
|
GRPC_SECURITY_PENDING unless an error is detected early on. */ |
||||||
|
grpc_security_status grpc_channel_security_connector_check_call_host( |
||||||
|
grpc_channel_security_connector *sc, const char *host, |
||||||
|
grpc_security_check_cb cb, void *user_data); |
||||||
|
|
||||||
|
/* --- Creation security connectors. --- */ |
||||||
|
|
||||||
|
/* For TESTING ONLY!
|
||||||
|
Creates a fake connector that emulates real channel security. */ |
||||||
|
grpc_channel_security_connector *grpc_fake_channel_security_connector_create( |
||||||
|
grpc_credentials *request_metadata_creds, int call_host_check_is_async); |
||||||
|
|
||||||
|
/* For TESTING ONLY!
|
||||||
|
Creates a fake connector that emulates real server security. */ |
||||||
|
grpc_security_connector *grpc_fake_server_security_connector_create(void); |
||||||
|
|
||||||
|
/* Config for ssl clients. */ |
||||||
|
typedef struct { |
||||||
|
unsigned char *pem_private_key; |
||||||
|
size_t pem_private_key_size; |
||||||
|
unsigned char *pem_cert_chain; |
||||||
|
size_t pem_cert_chain_size; |
||||||
|
unsigned char *pem_root_certs; |
||||||
|
size_t pem_root_certs_size; |
||||||
|
} grpc_ssl_config; |
||||||
|
|
||||||
|
/* Creates an SSL channel_security_connector.
|
||||||
|
- request_metadata_creds is the credentials object which metadata |
||||||
|
will be sent with each request. This parameter can be NULL. |
||||||
|
- config is the SSL config to be used for the SSL channel establishment. |
||||||
|
- is_client should be 0 for a server or a non-0 value for a client. |
||||||
|
- secure_peer_name is the secure peer name that should be checked in |
||||||
|
grpc_channel_security_connector_check_peer. This parameter may be NULL in |
||||||
|
which case the peer name will not be checked. Note that if this parameter |
||||||
|
is not NULL, then, pem_root_certs should not be NULL either. |
||||||
|
- sc is a pointer on the connector to be created. |
||||||
|
This function returns GRPC_SECURITY_OK in case of success or a |
||||||
|
specific error code otherwise. |
||||||
|
*/ |
||||||
|
grpc_security_status grpc_ssl_channel_security_connector_create( |
||||||
|
grpc_credentials *request_metadata_creds, |
||||||
|
const grpc_ssl_config *config, const char *target_name, |
||||||
|
const char *overridden_target_name, grpc_channel_security_connector **sc); |
||||||
|
|
||||||
|
/* Gets the default ssl roots. */ |
||||||
|
size_t grpc_get_default_ssl_roots(const unsigned char **pem_root_certs); |
||||||
|
|
||||||
|
/* Config for ssl servers. */ |
||||||
|
typedef struct { |
||||||
|
unsigned char **pem_private_keys; |
||||||
|
size_t *pem_private_keys_sizes; |
||||||
|
unsigned char **pem_cert_chains; |
||||||
|
size_t *pem_cert_chains_sizes; |
||||||
|
size_t num_key_cert_pairs; |
||||||
|
unsigned char *pem_root_certs; |
||||||
|
size_t pem_root_certs_size; |
||||||
|
} grpc_ssl_server_config; |
||||||
|
|
||||||
|
/* Creates an SSL server_security_connector.
|
||||||
|
- config is the SSL config to be used for the SSL channel establishment. |
||||||
|
- sc is a pointer on the connector to be created. |
||||||
|
This function returns GRPC_SECURITY_OK in case of success or a |
||||||
|
specific error code otherwise. |
||||||
|
*/ |
||||||
|
grpc_security_status grpc_ssl_server_security_connector_create( |
||||||
|
const grpc_ssl_server_config *config, grpc_security_connector **sc); |
||||||
|
|
||||||
|
#endif /* GRPC_INTERNAL_CORE_SECURITY_SECURITY_CONNECTOR_H */ |
@ -1,214 +0,0 @@ |
|||||||
/*
|
|
||||||
* |
|
||||||
* Copyright 2015, Google Inc. |
|
||||||
* All rights reserved. |
|
||||||
* |
|
||||||
* Redistribution and use in source and binary forms, with or without |
|
||||||
* modification, are permitted provided that the following conditions are |
|
||||||
* met: |
|
||||||
* |
|
||||||
* * Redistributions of source code must retain the above copyright |
|
||||||
* notice, this list of conditions and the following disclaimer. |
|
||||||
* * Redistributions in binary form must reproduce the above |
|
||||||
* copyright notice, this list of conditions and the following disclaimer |
|
||||||
* in the documentation and/or other materials provided with the |
|
||||||
* distribution. |
|
||||||
* * Neither the name of Google Inc. nor the names of its |
|
||||||
* contributors may be used to endorse or promote products derived from |
|
||||||
* this software without specific prior written permission. |
|
||||||
* |
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
|
||||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
|
||||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
|
||||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
|
||||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
|
||||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
|
||||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
|
||||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
|
||||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
|
||||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
|
||||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
|
||||||
* |
|
||||||
*/ |
|
||||||
|
|
||||||
#ifndef GRPC_INTERNAL_CORE_SECURITY_SECURITY_CONTEXT_H |
|
||||||
#define GRPC_INTERNAL_CORE_SECURITY_SECURITY_CONTEXT_H |
|
||||||
|
|
||||||
#include <grpc/grpc_security.h> |
|
||||||
#include "src/core/iomgr/endpoint.h" |
|
||||||
#include "src/core/security/credentials.h" |
|
||||||
#include "src/core/tsi/transport_security_interface.h" |
|
||||||
|
|
||||||
/* --- status enum. --- */ |
|
||||||
|
|
||||||
typedef enum { |
|
||||||
GRPC_SECURITY_OK = 0, |
|
||||||
GRPC_SECURITY_PENDING, |
|
||||||
GRPC_SECURITY_ERROR |
|
||||||
} grpc_security_status; |
|
||||||
|
|
||||||
/* --- URL schemes. --- */ |
|
||||||
|
|
||||||
#define GRPC_SSL_URL_SCHEME "https" |
|
||||||
#define GRPC_FAKE_SECURITY_URL_SCHEME "http+fake_security" |
|
||||||
|
|
||||||
/* --- security_context object. ---
|
|
||||||
|
|
||||||
A security context object represents away to configure the underlying |
|
||||||
transport security mechanism and check the resulting trusted peer. */ |
|
||||||
|
|
||||||
typedef struct grpc_security_context grpc_security_context; |
|
||||||
|
|
||||||
#define GRPC_SECURITY_CONTEXT_ARG "grpc.security_context" |
|
||||||
|
|
||||||
typedef void (*grpc_security_check_cb)(void *user_data, |
|
||||||
grpc_security_status status); |
|
||||||
|
|
||||||
typedef struct { |
|
||||||
void (*destroy)(grpc_security_context *ctx); |
|
||||||
grpc_security_status (*create_handshaker)(grpc_security_context *ctx, |
|
||||||
tsi_handshaker **handshaker); |
|
||||||
grpc_security_status (*check_peer)(grpc_security_context *ctx, tsi_peer peer, |
|
||||||
grpc_security_check_cb cb, |
|
||||||
void *user_data); |
|
||||||
} grpc_security_context_vtable; |
|
||||||
|
|
||||||
struct grpc_security_context { |
|
||||||
const grpc_security_context_vtable *vtable; |
|
||||||
gpr_refcount refcount; |
|
||||||
int is_client_side; |
|
||||||
const char *url_scheme; |
|
||||||
}; |
|
||||||
|
|
||||||
/* Increments the refcount. */ |
|
||||||
grpc_security_context *grpc_security_context_ref(grpc_security_context *ctx); |
|
||||||
|
|
||||||
/* Decrements the refcount and destroys the object if it reaches 0. */ |
|
||||||
void grpc_security_context_unref(grpc_security_context *ctx); |
|
||||||
|
|
||||||
/* Handshake creation. */ |
|
||||||
grpc_security_status grpc_security_context_create_handshaker( |
|
||||||
grpc_security_context *ctx, tsi_handshaker **handshaker); |
|
||||||
|
|
||||||
/* Check the peer.
|
|
||||||
Implementations can choose to check the peer either synchronously or |
|
||||||
asynchronously. In the first case, a successful call will return |
|
||||||
GRPC_SECURITY_OK. In the asynchronous case, the call will return |
|
||||||
GRPC_SECURITY_PENDING unless an error is detected early on. |
|
||||||
Ownership of the peer is transfered. |
|
||||||
*/ |
|
||||||
grpc_security_status grpc_security_context_check_peer( |
|
||||||
grpc_security_context *ctx, tsi_peer peer, |
|
||||||
grpc_security_check_cb cb, void *user_data); |
|
||||||
|
|
||||||
/* Util to encapsulate the context in a channel arg. */ |
|
||||||
grpc_arg grpc_security_context_to_arg(grpc_security_context *ctx); |
|
||||||
|
|
||||||
/* Util to get the context from a channel arg. */ |
|
||||||
grpc_security_context *grpc_security_context_from_arg(const grpc_arg *arg); |
|
||||||
|
|
||||||
/* Util to find the context from channel args. */ |
|
||||||
grpc_security_context *grpc_find_security_context_in_args( |
|
||||||
const grpc_channel_args *args); |
|
||||||
|
|
||||||
/* --- channel_security_context object. ---
|
|
||||||
|
|
||||||
A channel security context object represents away to configure the |
|
||||||
underlying transport security mechanism on the client side. */ |
|
||||||
|
|
||||||
typedef struct grpc_channel_security_context grpc_channel_security_context; |
|
||||||
|
|
||||||
struct grpc_channel_security_context { |
|
||||||
grpc_security_context base; /* requires is_client_side to be non 0. */ |
|
||||||
grpc_credentials *request_metadata_creds; |
|
||||||
grpc_security_status (*check_call_host)( |
|
||||||
grpc_channel_security_context *ctx, const char *host, |
|
||||||
grpc_security_check_cb cb, void *user_data); |
|
||||||
}; |
|
||||||
|
|
||||||
/* Checks that the host that will be set for a call is acceptable.
|
|
||||||
Implementations can choose do the check either synchronously or |
|
||||||
asynchronously. In the first case, a successful call will return |
|
||||||
GRPC_SECURITY_OK. In the asynchronous case, the call will return |
|
||||||
GRPC_SECURITY_PENDING unless an error is detected early on. */ |
|
||||||
grpc_security_status grpc_channel_security_context_check_call_host( |
|
||||||
grpc_channel_security_context *ctx, const char *host, |
|
||||||
grpc_security_check_cb cb, void *user_data); |
|
||||||
|
|
||||||
/* --- Creation security contexts. --- */ |
|
||||||
|
|
||||||
/* For TESTING ONLY!
|
|
||||||
Creates a fake context that emulates real channel security. */ |
|
||||||
grpc_channel_security_context *grpc_fake_channel_security_context_create( |
|
||||||
grpc_credentials *request_metadata_creds, int call_host_check_is_async); |
|
||||||
|
|
||||||
/* For TESTING ONLY!
|
|
||||||
Creates a fake context that emulates real server security. */ |
|
||||||
grpc_security_context *grpc_fake_server_security_context_create(void); |
|
||||||
|
|
||||||
/* Creates an SSL channel_security_context.
|
|
||||||
- request_metadata_creds is the credentials object which metadata |
|
||||||
will be sent with each request. This parameter can be NULL. |
|
||||||
- config is the SSL config to be used for the SSL channel establishment. |
|
||||||
- is_client should be 0 for a server or a non-0 value for a client. |
|
||||||
- secure_peer_name is the secure peer name that should be checked in |
|
||||||
grpc_channel_security_context_check_peer. This parameter may be NULL in |
|
||||||
which case the peer name will not be checked. Note that if this parameter |
|
||||||
is not NULL, then, pem_root_certs should not be NULL either. |
|
||||||
- ctx is a pointer on the context to be created. |
|
||||||
This function returns GRPC_SECURITY_OK in case of success or a |
|
||||||
specific error code otherwise. |
|
||||||
*/ |
|
||||||
grpc_security_status grpc_ssl_channel_security_context_create( |
|
||||||
grpc_credentials *request_metadata_creds, const grpc_ssl_config *config, |
|
||||||
const char *target_name, const char *overridden_target_name, |
|
||||||
grpc_channel_security_context **ctx); |
|
||||||
|
|
||||||
/* Creates an SSL server_security_context.
|
|
||||||
- config is the SSL config to be used for the SSL channel establishment. |
|
||||||
- ctx is a pointer on the context to be created. |
|
||||||
This function returns GRPC_SECURITY_OK in case of success or a |
|
||||||
specific error code otherwise. |
|
||||||
*/ |
|
||||||
grpc_security_status grpc_ssl_server_security_context_create( |
|
||||||
const grpc_ssl_server_config *config, grpc_security_context **ctx); |
|
||||||
|
|
||||||
/* --- Creation of high level objects. --- */ |
|
||||||
|
|
||||||
/* Secure client channel creation. */ |
|
||||||
|
|
||||||
size_t grpc_get_default_ssl_roots(const unsigned char **pem_root_certs); |
|
||||||
|
|
||||||
grpc_channel *grpc_ssl_channel_create(grpc_credentials *ssl_creds, |
|
||||||
grpc_credentials *request_metadata_creds, |
|
||||||
const char *target, |
|
||||||
const grpc_channel_args *args); |
|
||||||
|
|
||||||
grpc_channel *grpc_fake_transport_security_channel_create( |
|
||||||
grpc_credentials *fake_creds, grpc_credentials *request_metadata_creds, |
|
||||||
const char *target, const grpc_channel_args *args); |
|
||||||
|
|
||||||
grpc_channel *grpc_secure_channel_create_internal( |
|
||||||
const char *target, const grpc_channel_args *args, |
|
||||||
grpc_channel_security_context *ctx, grpc_mdctx *mdctx); |
|
||||||
|
|
||||||
typedef grpc_channel *(*grpc_secure_channel_factory_func)( |
|
||||||
grpc_credentials *transport_security_creds, |
|
||||||
grpc_credentials *request_metadata_creds, const char *target, |
|
||||||
const grpc_channel_args *args); |
|
||||||
|
|
||||||
typedef struct { |
|
||||||
const char *creds_type; |
|
||||||
grpc_secure_channel_factory_func factory; |
|
||||||
} grpc_secure_channel_factory; |
|
||||||
|
|
||||||
grpc_channel *grpc_secure_channel_create_with_factories( |
|
||||||
const grpc_secure_channel_factory *factories, size_t num_factories, |
|
||||||
grpc_credentials *creds, const char *target, const grpc_channel_args *args); |
|
||||||
|
|
||||||
/* Secure server context creation. */ |
|
||||||
|
|
||||||
grpc_security_status grpc_server_security_context_create( |
|
||||||
grpc_server_credentials *creds, grpc_security_context **ctx); |
|
||||||
|
|
||||||
#endif /* GRPC_INTERNAL_CORE_SECURITY_SECURITY_CONTEXT_H */ |
|
@ -1,2 +1,3 @@ |
|||||||
bin |
bin |
||||||
obj |
obj |
||||||
|
*.nupkg |
||||||
|
@ -1,44 +0,0 @@ |
|||||||
// This file will be moved to a new location. |
|
||||||
|
|
||||||
// Copyright 2015, Google Inc. |
|
||||||
// All rights reserved. |
|
||||||
// |
|
||||||
// Redistribution and use in source and binary forms, with or without |
|
||||||
// modification, are permitted provided that the following conditions are |
|
||||||
// met: |
|
||||||
// |
|
||||||
// * Redistributions of source code must retain the above copyright |
|
||||||
// notice, this list of conditions and the following disclaimer. |
|
||||||
// * Redistributions in binary form must reproduce the above |
|
||||||
// copyright notice, this list of conditions and the following disclaimer |
|
||||||
// in the documentation and/or other materials provided with the |
|
||||||
// distribution. |
|
||||||
// * Neither the name of Google Inc. nor the names of its |
|
||||||
// contributors may be used to endorse or promote products derived from |
|
||||||
// this software without specific prior written permission. |
|
||||||
// |
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
|
||||||
|
|
||||||
syntax = "proto2"; |
|
||||||
|
|
||||||
package proto2; |
|
||||||
|
|
||||||
// An empty message that you can re-use to avoid defining duplicated empty |
|
||||||
// messages in your project. A typical example is to use it as argument or the |
|
||||||
// return value of a service API. For instance: |
|
||||||
// |
|
||||||
// service Foo { |
|
||||||
// rpc Bar (proto2.Empty) returns (proto2.Empty) { }; |
|
||||||
// }; |
|
||||||
// |
|
||||||
message Empty {} |
|
@ -1,79 +0,0 @@ |
|||||||
// This file will be moved to a new location. |
|
||||||
|
|
||||||
// Copyright 2015, Google Inc. |
|
||||||
// All rights reserved. |
|
||||||
// |
|
||||||
// Redistribution and use in source and binary forms, with or without |
|
||||||
// modification, are permitted provided that the following conditions are |
|
||||||
// met: |
|
||||||
// |
|
||||||
// * Redistributions of source code must retain the above copyright |
|
||||||
// notice, this list of conditions and the following disclaimer. |
|
||||||
// * Redistributions in binary form must reproduce the above |
|
||||||
// copyright notice, this list of conditions and the following disclaimer |
|
||||||
// in the documentation and/or other materials provided with the |
|
||||||
// distribution. |
|
||||||
// * Neither the name of Google Inc. nor the names of its |
|
||||||
// contributors may be used to endorse or promote products derived from |
|
||||||
// this software without specific prior written permission. |
|
||||||
// |
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
|
||||||
|
|
||||||
// Labels provide a way to associate user-defined metadata with various |
|
||||||
// objects. Labels may be used to organize objects into non-hierarchical |
|
||||||
// groups; think metadata tags attached to mp3s. |
|
||||||
|
|
||||||
syntax = "proto2"; |
|
||||||
|
|
||||||
package tech.label; |
|
||||||
|
|
||||||
// A key-value pair applied to a given object. |
|
||||||
message Label { |
|
||||||
// The key of a label is a syntactically valid URL (as per RFC 1738) with |
|
||||||
// the "scheme" and initial slashes omitted and with the additional |
|
||||||
// restrictions noted below. Each key should be globally unique. The |
|
||||||
// "host" portion is called the "namespace" and is not necessarily |
|
||||||
// resolvable to a network endpoint. Instead, the namespace indicates what |
|
||||||
// system or entity defines the semantics of the label. Namespaces do not |
|
||||||
// restrict the set of objects to which a label may be associated. |
|
||||||
// |
|
||||||
// Keys are defined by the following grammar: |
|
||||||
// |
|
||||||
// key = hostname "/" kpath |
|
||||||
// kpath = ksegment *[ "/" ksegment ] |
|
||||||
// ksegment = alphadigit | *[ alphadigit | "-" | "_" | "." ] |
|
||||||
// |
|
||||||
// where "hostname" and "alphadigit" are defined as in RFC 1738. |
|
||||||
// |
|
||||||
// Example key: |
|
||||||
// spanner.google.com/universe |
|
||||||
required string key = 1; |
|
||||||
|
|
||||||
// The value of the label. |
|
||||||
oneof value { |
|
||||||
// A string value. |
|
||||||
string str_value = 2; |
|
||||||
// An integer value. |
|
||||||
int64 num_value = 3; |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
// A collection of labels, such as the set of all labels attached to an |
|
||||||
// object. Each label in the set must have a different key. |
|
||||||
// |
|
||||||
// Users should prefer to embed "repeated Label" directly when possible. |
|
||||||
// This message should only be used in cases where that isn't possible (e.g. |
|
||||||
// with oneof). |
|
||||||
message Labels { |
|
||||||
repeated Label label = 1; |
|
||||||
} |
|
@ -1,734 +0,0 @@ |
|||||||
// This file will be moved to a new location. |
|
||||||
|
|
||||||
// Copyright 2015, Google Inc. |
|
||||||
// All rights reserved. |
|
||||||
// |
|
||||||
// Redistribution and use in source and binary forms, with or without |
|
||||||
// modification, are permitted provided that the following conditions are |
|
||||||
// met: |
|
||||||
// |
|
||||||
// * Redistributions of source code must retain the above copyright |
|
||||||
// notice, this list of conditions and the following disclaimer. |
|
||||||
// * Redistributions in binary form must reproduce the above |
|
||||||
// copyright notice, this list of conditions and the following disclaimer |
|
||||||
// in the documentation and/or other materials provided with the |
|
||||||
// distribution. |
|
||||||
// * Neither the name of Google Inc. nor the names of its |
|
||||||
// contributors may be used to endorse or promote products derived from |
|
||||||
// this software without specific prior written permission. |
|
||||||
// |
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
|
||||||
|
|
||||||
|
|
||||||
// Specification of the Pubsub API. |
|
||||||
|
|
||||||
syntax = "proto2"; |
|
||||||
|
|
||||||
import "empty.proto"; |
|
||||||
import "label.proto"; |
|
||||||
|
|
||||||
package tech.pubsub; |
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------- |
|
||||||
// Overview of the Pubsub API |
|
||||||
// ----------------------------------------------------------------------------- |
|
||||||
|
|
||||||
// This file describes an API for a Pubsub system. This system provides a |
|
||||||
// reliable many-to-many communication mechanism between independently written |
|
||||||
// publishers and subscribers where the publisher publishes messages to "topics" |
|
||||||
// and each subscriber creates a "subscription" and consumes messages from it. |
|
||||||
// |
|
||||||
// (a) The pubsub system maintains bindings between topics and subscriptions. |
|
||||||
// (b) A publisher publishes messages into a topic. |
|
||||||
// (c) The pubsub system delivers messages from topics into relevant |
|
||||||
// subscriptions. |
|
||||||
// (d) A subscriber receives pending messages from its subscription and |
|
||||||
// acknowledges or nacks each one to the pubsub system. |
|
||||||
// (e) The pubsub system removes acknowledged messages from that subscription. |
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------- |
|
||||||
// Data Model |
|
||||||
// ----------------------------------------------------------------------------- |
|
||||||
|
|
||||||
// The data model consists of the following: |
|
||||||
// |
|
||||||
// * Topic: A topic is a resource to which messages are published by publishers. |
|
||||||
// Topics are named, and the name of the topic is unique within the pubsub |
|
||||||
// system. |
|
||||||
// |
|
||||||
// * Subscription: A subscription records the subscriber's interest in a topic. |
|
||||||
// It can optionally include a query to select a subset of interesting |
|
||||||
// messages. The pubsub system maintains a logical cursor tracking the |
|
||||||
// matching messages which still need to be delivered and acked so that |
|
||||||
// they can retried as needed. The set of messages that have not been |
|
||||||
// acknowledged is called the subscription backlog. |
|
||||||
// |
|
||||||
// * Message: A message is a unit of data that flows in the system. It contains |
|
||||||
// opaque data from the publisher along with its labels. |
|
||||||
// |
|
||||||
// * Message Labels (optional): A set of opaque key, value pairs assigned |
|
||||||
// by the publisher which the subscriber can use for filtering out messages |
|
||||||
// in the topic. For example, a label with key "foo.com/device_type" and |
|
||||||
// value "mobile" may be added for messages that are only relevant for a |
|
||||||
// mobile subscriber; a subscriber on a phone may decide to create a |
|
||||||
// subscription only for messages that have this label. |
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------- |
|
||||||
// Publisher Flow |
|
||||||
// ----------------------------------------------------------------------------- |
|
||||||
|
|
||||||
// A publisher publishes messages to the topic using the Publish request: |
|
||||||
// |
|
||||||
// PubsubMessage message; |
|
||||||
// message.set_data("...."); |
|
||||||
// Label label; |
|
||||||
// label.set_key("foo.com/key1"); |
|
||||||
// label.set_str_value("value1"); |
|
||||||
// message.add_label(label); |
|
||||||
// PublishRequest request; |
|
||||||
// request.set_topic("topicName"); |
|
||||||
// request.set_message(message); |
|
||||||
// PublisherService.Publish(request); |
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------- |
|
||||||
// Subscriber Flow |
|
||||||
// ----------------------------------------------------------------------------- |
|
||||||
|
|
||||||
// The subscriber part of the API is richer than the publisher part and has a |
|
||||||
// number of concepts w.r.t. subscription creation and monitoring: |
|
||||||
// |
|
||||||
// (1) A subscriber creates a subscription using the CreateSubscription call. |
|
||||||
// It may specify an optional "query" to indicate that it wants to receive |
|
||||||
// only messages with a certain set of labels using the label query syntax. |
|
||||||
// It may also specify an optional truncation policy to indicate when old |
|
||||||
// messages from the subcription can be removed. |
|
||||||
// |
|
||||||
// (2) A subscriber receives messages in one of two ways: via push or pull. |
|
||||||
// |
|
||||||
// (a) To receive messages via push, the PushConfig field must be specified in |
|
||||||
// the Subscription parameter when creating a subscription. The PushConfig |
|
||||||
// specifies an endpoint at which the subscriber must expose the |
|
||||||
// PushEndpointService. Messages are received via the HandlePubsubEvent |
|
||||||
// method. The push subscriber responds to the HandlePubsubEvent method |
|
||||||
// with a result code that indicates one of three things: Ack (the message |
|
||||||
// has been successfully processed and the Pubsub system may delete it), |
|
||||||
// Nack (the message has been rejected, the Pubsub system should resend it |
|
||||||
// at a later time), or Push-Back (this is a Nack with the additional |
|
||||||
// semantics that the subscriber is overloaded and the pubsub system should |
|
||||||
// back off on the rate at which it is invoking HandlePubsubEvent). The |
|
||||||
// endpoint may be a load balancer for better scalability. |
|
||||||
// |
|
||||||
// (b) To receive messages via pull a subscriber calls the Pull method on the |
|
||||||
// SubscriberService to get messages from the subscription. For each |
|
||||||
// individual message, the subscriber may use the ack_id received in the |
|
||||||
// PullResponse to Ack the message, Nack the message, or modify the ack |
|
||||||
// deadline with ModifyAckDeadline. See the |
|
||||||
// Subscription.ack_deadline_seconds field documentation for details on the |
|
||||||
// ack deadline behavior. |
|
||||||
// |
|
||||||
// Note: Messages may be consumed in parallel by multiple subscribers making |
|
||||||
// Pull calls to the same subscription; this will result in the set of |
|
||||||
// messages from the subscription being shared and each subscriber |
|
||||||
// receiving a subset of the messages. |
|
||||||
// |
|
||||||
// (4) The subscriber can explicitly truncate the current subscription. |
|
||||||
// |
|
||||||
// (5) "Truncated" events are delivered when a subscription is |
|
||||||
// truncated, whether due to the subscription's truncation policy |
|
||||||
// or an explicit request from the subscriber. |
|
||||||
// |
|
||||||
// Subscription creation: |
|
||||||
// |
|
||||||
// Subscription subscription; |
|
||||||
// subscription.set_topic("topicName"); |
|
||||||
// subscription.set_name("subscriptionName"); |
|
||||||
// subscription.push_config().set_push_endpoint("machinename:8888"); |
|
||||||
// SubscriberService.CreateSubscription(subscription); |
|
||||||
// |
|
||||||
// Consuming messages via push: |
|
||||||
// |
|
||||||
// TODO(eschapira): Add HTTP push example. |
|
||||||
// |
|
||||||
// The port 'machinename:8888' must be bound to a stubby server that implements |
|
||||||
// the PushEndpointService with the following method: |
|
||||||
// |
|
||||||
// int HandlePubsubEvent(PubsubEvent event) { |
|
||||||
// if (event.subscription().equals("subscriptionName")) { |
|
||||||
// if (event.has_message()) { |
|
||||||
// Process(event.message().data()); |
|
||||||
// } else if (event.truncated()) { |
|
||||||
// ProcessTruncatedEvent(); |
|
||||||
// } |
|
||||||
// } |
|
||||||
// return OK; // This return code implies an acknowledgment |
|
||||||
// } |
|
||||||
// |
|
||||||
// Consuming messages via pull: |
|
||||||
// |
|
||||||
// The subscription must be created without setting the push_config field. |
|
||||||
// |
|
||||||
// PullRequest pull_request; |
|
||||||
// pull_request.set_subscription("subscriptionName"); |
|
||||||
// pull_request.set_return_immediately(false); |
|
||||||
// while (true) { |
|
||||||
// PullResponse pull_response; |
|
||||||
// if (SubscriberService.Pull(pull_request, pull_response) == OK) { |
|
||||||
// PubsubEvent event = pull_response.pubsub_event(); |
|
||||||
// if (event.has_message()) { |
|
||||||
// Process(event.message().data()); |
|
||||||
// } else if (event.truncated()) { |
|
||||||
// ProcessTruncatedEvent(); |
|
||||||
// } |
|
||||||
// AcknowledgeRequest ack_request; |
|
||||||
// ackRequest.set_subscription("subscriptionName"); |
|
||||||
// ackRequest.set_ack_id(pull_response.ack_id()); |
|
||||||
// SubscriberService.Acknowledge(ack_request); |
|
||||||
// } |
|
||||||
// } |
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------- |
|
||||||
// Reliability Semantics |
|
||||||
// ----------------------------------------------------------------------------- |
|
||||||
|
|
||||||
// When a subscriber successfully creates a subscription using |
|
||||||
// Subscriber.CreateSubscription, it establishes a "subscription point" with |
|
||||||
// respect to that subscription - the subscriber is guaranteed to receive any |
|
||||||
// message published after this subscription point that matches the |
|
||||||
// subscription's query. Note that messages published before the Subscription |
|
||||||
// point may or may not be delivered. |
|
||||||
// |
|
||||||
// If the system truncates the subscription according to the specified |
|
||||||
// truncation policy, the system delivers a subscription status event with the |
|
||||||
// "truncated" field set to true. We refer to such events as "truncation |
|
||||||
// events". A truncation event: |
|
||||||
// |
|
||||||
// * Informs the subscriber that part of the subscription messages have been |
|
||||||
// discarded. The subscriber may want to recover from the message loss, e.g., |
|
||||||
// by resyncing its state with its backend. |
|
||||||
// * Establishes a new subscription point, i.e., the subscriber is guaranteed to |
|
||||||
// receive all changes published after the trunction event is received (or |
|
||||||
// until another truncation event is received). |
|
||||||
// |
|
||||||
// Note that messages are not delivered in any particular order by the pubsub |
|
||||||
// system. Furthermore, the system guarantees at-least-once delivery |
|
||||||
// of each message or truncation events until acked. |
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------- |
|
||||||
// Deletion |
|
||||||
// ----------------------------------------------------------------------------- |
|
||||||
|
|
||||||
// Both topics and subscriptions may be deleted. Deletion of a topic implies |
|
||||||
// deletion of all attached subscriptions. |
|
||||||
// |
|
||||||
// When a subscription is deleted directly by calling DeleteSubscription, all |
|
||||||
// messages are immediately dropped. If it is a pull subscriber, future pull |
|
||||||
// requests will return NOT_FOUND. |
|
||||||
// |
|
||||||
// When a topic is deleted all corresponding subscriptions are immediately |
|
||||||
// deleted, and subscribers experience the same behavior as directly deleting |
|
||||||
// the subscription. |
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------- |
|
||||||
// The Publisher service and its protos. |
|
||||||
// ----------------------------------------------------------------------------- |
|
||||||
|
|
||||||
// The service that an application uses to manipulate topics, and to send |
|
||||||
// messages to a topic. |
|
||||||
service PublisherService { |
|
||||||
|
|
||||||
// Creates the given topic with the given name. |
|
||||||
rpc CreateTopic(Topic) returns (Topic) { |
|
||||||
} |
|
||||||
|
|
||||||
// Adds a message to the topic. Returns NOT_FOUND if the topic does not |
|
||||||
// exist. |
|
||||||
// (-- For different error code values returned via Stubby, see |
|
||||||
// util/task/codes.proto. --) |
|
||||||
rpc Publish(PublishRequest) returns (proto2.Empty) { |
|
||||||
} |
|
||||||
|
|
||||||
// Adds one or more messages to the topic. Returns NOT_FOUND if the topic does |
|
||||||
// not exist. |
|
||||||
rpc PublishBatch(PublishBatchRequest) returns (PublishBatchResponse) { |
|
||||||
} |
|
||||||
|
|
||||||
// Gets the configuration of a topic. Since the topic only has the name |
|
||||||
// attribute, this method is only useful to check the existence of a topic. |
|
||||||
// If other attributes are added in the future, they will be returned here. |
|
||||||
rpc GetTopic(GetTopicRequest) returns (Topic) { |
|
||||||
} |
|
||||||
|
|
||||||
// Lists matching topics. |
|
||||||
rpc ListTopics(ListTopicsRequest) returns (ListTopicsResponse) { |
|
||||||
} |
|
||||||
|
|
||||||
// Deletes the topic with the given name. All subscriptions to this topic |
|
||||||
// are also deleted. Returns NOT_FOUND if the topic does not exist. |
|
||||||
// After a topic is deleted, a new topic may be created with the same name. |
|
||||||
rpc DeleteTopic(DeleteTopicRequest) returns (proto2.Empty) { |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
// A topic resource. |
|
||||||
message Topic { |
|
||||||
// Name of the topic. |
|
||||||
optional string name = 1; |
|
||||||
} |
|
||||||
|
|
||||||
// A message data and its labels. |
|
||||||
message PubsubMessage { |
|
||||||
// The message payload. |
|
||||||
optional bytes data = 1; |
|
||||||
|
|
||||||
// Optional list of labels for this message. Keys in this collection must |
|
||||||
// be unique. |
|
||||||
//(-- TODO(eschapira): Define how key namespace may be scoped to the topic.--) |
|
||||||
repeated tech.label.Label label = 2; |
|
||||||
|
|
||||||
// ID of this message assigned by the server at publication time. Guaranteed |
|
||||||
// to be unique within the topic. This value may be read by a subscriber |
|
||||||
// that receives a PubsubMessage via a Pull call or a push delivery. It must |
|
||||||
// not be populated by a publisher in a Publish call. |
|
||||||
optional string message_id = 3; |
|
||||||
} |
|
||||||
|
|
||||||
// Request for the GetTopic method. |
|
||||||
message GetTopicRequest { |
|
||||||
// The name of the topic to get. |
|
||||||
optional string topic = 1; |
|
||||||
} |
|
||||||
|
|
||||||
// Request for the Publish method. |
|
||||||
message PublishRequest { |
|
||||||
// The message in the request will be published on this topic. |
|
||||||
optional string topic = 1; |
|
||||||
|
|
||||||
// The message to publish. |
|
||||||
optional PubsubMessage message = 2; |
|
||||||
} |
|
||||||
|
|
||||||
// Request for the PublishBatch method. |
|
||||||
message PublishBatchRequest { |
|
||||||
// The messages in the request will be published on this topic. |
|
||||||
optional string topic = 1; |
|
||||||
|
|
||||||
// The messages to publish. |
|
||||||
repeated PubsubMessage messages = 2; |
|
||||||
} |
|
||||||
|
|
||||||
// Response for the PublishBatch method. |
|
||||||
message PublishBatchResponse { |
|
||||||
// The server-assigned ID of each published message, in the same order as |
|
||||||
// the messages in the request. IDs are guaranteed to be unique within |
|
||||||
// the topic. |
|
||||||
repeated string message_ids = 1; |
|
||||||
} |
|
||||||
|
|
||||||
// Request for the ListTopics method. |
|
||||||
message ListTopicsRequest { |
|
||||||
// A valid label query expression. |
|
||||||
// |
|
||||||
optional string query = 1; |
|
||||||
|
|
||||||
// Maximum number of topics to return. |
|
||||||
// (-- If not specified or <= 0, the implementation will select a reasonable |
|
||||||
// value. --) |
|
||||||
optional int32 max_results = 2; |
|
||||||
|
|
||||||
// The value obtained in the last <code>ListTopicsResponse</code> |
|
||||||
// for continuation. |
|
||||||
optional string page_token = 3; |
|
||||||
|
|
||||||
} |
|
||||||
|
|
||||||
// Response for the ListTopics method. |
|
||||||
message ListTopicsResponse { |
|
||||||
// The resulting topics. |
|
||||||
repeated Topic topic = 1; |
|
||||||
|
|
||||||
// If not empty, indicates that there are more topics that match the request, |
|
||||||
// and this value should be passed to the next <code>ListTopicsRequest</code> |
|
||||||
// to continue. |
|
||||||
optional string next_page_token = 2; |
|
||||||
} |
|
||||||
|
|
||||||
// Request for the Delete method. |
|
||||||
message DeleteTopicRequest { |
|
||||||
// Name of the topic to delete. |
|
||||||
optional string topic = 1; |
|
||||||
} |
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------- |
|
||||||
// The Subscriber service and its protos. |
|
||||||
// ----------------------------------------------------------------------------- |
|
||||||
|
|
||||||
// The service that an application uses to manipulate subscriptions and to |
|
||||||
// consume messages from a subscription via the pull method. |
|
||||||
service SubscriberService { |
|
||||||
|
|
||||||
// Creates a subscription on a given topic for a given subscriber. |
|
||||||
// If the subscription already exists, returns ALREADY_EXISTS. |
|
||||||
// If the corresponding topic doesn't exist, returns NOT_FOUND. |
|
||||||
// |
|
||||||
// If the name is not provided in the request, the server will assign a random |
|
||||||
// name for this subscription on the same project as the topic. |
|
||||||
rpc CreateSubscription(Subscription) returns (Subscription) { |
|
||||||
} |
|
||||||
|
|
||||||
// Gets the configuration details of a subscription. |
|
||||||
rpc GetSubscription(GetSubscriptionRequest) returns (Subscription) { |
|
||||||
} |
|
||||||
|
|
||||||
// Lists matching subscriptions. |
|
||||||
rpc ListSubscriptions(ListSubscriptionsRequest) |
|
||||||
returns (ListSubscriptionsResponse) { |
|
||||||
} |
|
||||||
|
|
||||||
// Deletes an existing subscription. All pending messages in the subscription |
|
||||||
// are immediately dropped. Calls to Pull after deletion will return |
|
||||||
// NOT_FOUND. |
|
||||||
rpc DeleteSubscription(DeleteSubscriptionRequest) returns (proto2.Empty) { |
|
||||||
} |
|
||||||
|
|
||||||
// Removes all the pending messages in the subscription and releases the |
|
||||||
// storage associated with them. Results in a truncation event to be sent to |
|
||||||
// the subscriber. Messages added after this call returns are stored in the |
|
||||||
// subscription as before. |
|
||||||
rpc TruncateSubscription(TruncateSubscriptionRequest) returns (proto2.Empty) { |
|
||||||
} |
|
||||||
|
|
||||||
// |
|
||||||
// Push subscriber calls. |
|
||||||
// |
|
||||||
|
|
||||||
// Modifies the <code>PushConfig</code> for a specified subscription. |
|
||||||
// This method can be used to suspend the flow of messages to an endpoint |
|
||||||
// by clearing the <code>PushConfig</code> field in the request. Messages |
|
||||||
// will be accumulated for delivery even if no push configuration is |
|
||||||
// defined or while the configuration is modified. |
|
||||||
rpc ModifyPushConfig(ModifyPushConfigRequest) returns (proto2.Empty) { |
|
||||||
} |
|
||||||
|
|
||||||
// |
|
||||||
// Pull Subscriber calls |
|
||||||
// |
|
||||||
|
|
||||||
// Pulls a single message from the server. |
|
||||||
// If return_immediately is true, and no messages are available in the |
|
||||||
// subscription, this method returns FAILED_PRECONDITION. The system is free |
|
||||||
// to return an UNAVAILABLE error if no messages are available in a |
|
||||||
// reasonable amount of time (to reduce system load). |
|
||||||
rpc Pull(PullRequest) returns (PullResponse) { |
|
||||||
} |
|
||||||
|
|
||||||
// Pulls messages from the server. Returns an empty list if there are no |
|
||||||
// messages available in the backlog. The system is free to return UNAVAILABLE |
|
||||||
// if there are too many pull requests outstanding for the given subscription. |
|
||||||
rpc PullBatch(PullBatchRequest) returns (PullBatchResponse) { |
|
||||||
} |
|
||||||
|
|
||||||
// Modifies the Ack deadline for a message received from a pull request. |
|
||||||
rpc ModifyAckDeadline(ModifyAckDeadlineRequest) returns (proto2.Empty) { |
|
||||||
} |
|
||||||
|
|
||||||
// Acknowledges a particular received message: the Pub/Sub system can remove |
|
||||||
// the given message from the subscription. Acknowledging a message whose |
|
||||||
// Ack deadline has expired may succeed, but the message could have been |
|
||||||
// already redelivered. Acknowledging a message more than once will not |
|
||||||
// result in an error. This is only used for messages received via pull. |
|
||||||
rpc Acknowledge(AcknowledgeRequest) returns (proto2.Empty) { |
|
||||||
} |
|
||||||
|
|
||||||
// Refuses processing a particular received message. The system will |
|
||||||
// redeliver this message to some consumer of the subscription at some |
|
||||||
// future time. This is only used for messages received via pull. |
|
||||||
rpc Nack(NackRequest) returns (proto2.Empty) { |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
// A subscription resource. |
|
||||||
message Subscription { |
|
||||||
// Name of the subscription. |
|
||||||
optional string name = 1; |
|
||||||
|
|
||||||
// The name of the topic from which this subscription is receiving messages. |
|
||||||
optional string topic = 2; |
|
||||||
|
|
||||||
// If <code>query</code> is non-empty, only messages on the subscriber's |
|
||||||
// topic whose labels match the query will be returned. Otherwise all |
|
||||||
// messages on the topic will be returned. |
|
||||||
// |
|
||||||
optional string query = 3; |
|
||||||
|
|
||||||
// The subscriber may specify requirements for truncating unacknowledged |
|
||||||
// subscription entries. The system will honor the |
|
||||||
// <code>CreateSubscription</code> request only if it can meet these |
|
||||||
// requirements. If this field is not specified, messages are never truncated |
|
||||||
// by the system. |
|
||||||
optional TruncationPolicy truncation_policy = 4; |
|
||||||
|
|
||||||
// Specifies which messages can be truncated by the system. |
|
||||||
message TruncationPolicy { |
|
||||||
oneof policy { |
|
||||||
// If <code>max_bytes</code> is specified, the system is allowed to drop |
|
||||||
// old messages to keep the combined size of stored messages under |
|
||||||
// <code>max_bytes</code>. This is a hint; the system may keep more than |
|
||||||
// this many bytes, but will make a best effort to keep the size from |
|
||||||
// growing much beyond this parameter. |
|
||||||
int64 max_bytes = 1; |
|
||||||
|
|
||||||
// If <code>max_age_seconds</code> is specified, the system is allowed to |
|
||||||
// drop messages that have been stored for at least this many seconds. |
|
||||||
// This is a hint; the system may keep these messages, but will make a |
|
||||||
// best effort to remove them when their maximum age is reached. |
|
||||||
int64 max_age_seconds = 2; |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
// If push delivery is used with this subscription, this field is |
|
||||||
// used to configure it. |
|
||||||
optional PushConfig push_config = 5; |
|
||||||
|
|
||||||
// For either push or pull delivery, the value is the maximum time after a |
|
||||||
// subscriber receives a message before the subscriber should acknowledge or |
|
||||||
// Nack the message. If the Ack deadline for a message passes without an |
|
||||||
// Ack or a Nack, the Pub/Sub system will eventually redeliver the message. |
|
||||||
// If a subscriber acknowledges after the deadline, the Pub/Sub system may |
|
||||||
// accept the Ack, but it is possible that the message has been already |
|
||||||
// delivered again. Multiple Acks to the message are allowed and will |
|
||||||
// succeed. |
|
||||||
// |
|
||||||
// For push delivery, this value is used to set the request timeout for |
|
||||||
// the call to the push endpoint. |
|
||||||
// |
|
||||||
// For pull delivery, this value is used as the initial value for the Ack |
|
||||||
// deadline. It may be overridden for a specific pull request (message) with |
|
||||||
// <code>ModifyAckDeadline</code>. |
|
||||||
// While a message is outstanding (i.e. it has been delivered to a pull |
|
||||||
// subscriber and the subscriber has not yet Acked or Nacked), the Pub/Sub |
|
||||||
// system will not deliver that message to another pull subscriber |
|
||||||
// (on a best-effort basis). |
|
||||||
optional int32 ack_deadline_seconds = 6; |
|
||||||
|
|
||||||
// If this parameter is set to n, the system is allowed to (but not required |
|
||||||
// to) delete the subscription when at least n seconds have elapsed since the |
|
||||||
// client presence was detected. (Presence is detected through any |
|
||||||
// interaction using the subscription ID, including Pull(), Get(), or |
|
||||||
// acknowledging a message.) |
|
||||||
// |
|
||||||
// If this parameter is not set, the subscription will stay live until |
|
||||||
// explicitly deleted. |
|
||||||
// |
|
||||||
// Clients can detect such garbage collection when a Get call or a Pull call |
|
||||||
// (for pull subscribers only) returns NOT_FOUND. |
|
||||||
optional int64 garbage_collect_seconds = 7; |
|
||||||
} |
|
||||||
|
|
||||||
// Configuration for a push delivery endpoint. |
|
||||||
message PushConfig { |
|
||||||
// A URL locating the endpoint to which messages should be pushed. |
|
||||||
// For example, a Webhook endpoint might use "https://example.com/push". |
|
||||||
// (-- An Android application might use "gcm:<REGID>", where <REGID> is a |
|
||||||
// GCM registration id allocated for pushing messages to the application. --) |
|
||||||
optional string push_endpoint = 1; |
|
||||||
} |
|
||||||
|
|
||||||
// An event indicating a received message or truncation event. |
|
||||||
message PubsubEvent { |
|
||||||
// The subscription that received the event. |
|
||||||
optional string subscription = 1; |
|
||||||
|
|
||||||
oneof type { |
|
||||||
// A received message. |
|
||||||
PubsubMessage message = 2; |
|
||||||
|
|
||||||
// Indicates that this subscription has been truncated. |
|
||||||
bool truncated = 3; |
|
||||||
|
|
||||||
// Indicates that this subscription has been deleted. (Note that pull |
|
||||||
// subscribers will always receive NOT_FOUND in response in their pull |
|
||||||
// request on the subscription, rather than seeing this boolean.) |
|
||||||
bool deleted = 4; |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
// Request for the GetSubscription method. |
|
||||||
message GetSubscriptionRequest { |
|
||||||
// The name of the subscription to get. |
|
||||||
optional string subscription = 1; |
|
||||||
} |
|
||||||
|
|
||||||
// Request for the ListSubscriptions method. |
|
||||||
message ListSubscriptionsRequest { |
|
||||||
// A valid label query expression. |
|
||||||
// (-- Which labels are required or supported is implementation-specific. |
|
||||||
// TODO(eschapira): This method must support to query by topic. We must |
|
||||||
// define the key URI for the "topic" label. --) |
|
||||||
optional string query = 1; |
|
||||||
|
|
||||||
// Maximum number of subscriptions to return. |
|
||||||
// (-- If not specified or <= 0, the implementation will select a reasonable |
|
||||||
// value. --) |
|
||||||
optional int32 max_results = 3; |
|
||||||
|
|
||||||
// The value obtained in the last <code>ListSubscriptionsResponse</code> |
|
||||||
// for continuation. |
|
||||||
optional string page_token = 4; |
|
||||||
} |
|
||||||
|
|
||||||
// Response for the ListSubscriptions method. |
|
||||||
message ListSubscriptionsResponse { |
|
||||||
// The subscriptions that match the request. |
|
||||||
repeated Subscription subscription = 1; |
|
||||||
|
|
||||||
// If not empty, indicates that there are more subscriptions that match the |
|
||||||
// request and this value should be passed to the next |
|
||||||
// <code>ListSubscriptionsRequest</code> to continue. |
|
||||||
optional string next_page_token = 2; |
|
||||||
} |
|
||||||
|
|
||||||
// Request for the TruncateSubscription method. |
|
||||||
message TruncateSubscriptionRequest { |
|
||||||
// The subscription that is being truncated. |
|
||||||
optional string subscription = 1; |
|
||||||
} |
|
||||||
|
|
||||||
// Request for the DeleteSubscription method. |
|
||||||
message DeleteSubscriptionRequest { |
|
||||||
// The subscription to delete. |
|
||||||
optional string subscription = 1; |
|
||||||
} |
|
||||||
|
|
||||||
// Request for the ModifyPushConfig method. |
|
||||||
message ModifyPushConfigRequest { |
|
||||||
// The name of the subscription. |
|
||||||
optional string subscription = 1; |
|
||||||
|
|
||||||
// An empty <code>push_config</code> indicates that the Pub/Sub system should |
|
||||||
// pause pushing messages from the given subscription. |
|
||||||
optional PushConfig push_config = 2; |
|
||||||
} |
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------- |
|
||||||
// The protos used by a pull subscriber. |
|
||||||
// ----------------------------------------------------------------------------- |
|
||||||
|
|
||||||
// Request for the Pull method. |
|
||||||
message PullRequest { |
|
||||||
// The subscription from which a message should be pulled. |
|
||||||
optional string subscription = 1; |
|
||||||
|
|
||||||
// If this is specified as true the system will respond immediately even if |
|
||||||
// it is not able to return a message in the Pull response. Otherwise the |
|
||||||
// system is allowed to wait until at least one message is available rather |
|
||||||
// than returning FAILED_PRECONDITION. The client may cancel the request if |
|
||||||
// it does not wish to wait any longer for the response. |
|
||||||
optional bool return_immediately = 2; |
|
||||||
} |
|
||||||
|
|
||||||
// Either a <code>PubsubMessage</code> or a truncation event. One of these two |
|
||||||
// must be populated. |
|
||||||
message PullResponse { |
|
||||||
// This ID must be used to acknowledge the received event or message. |
|
||||||
optional string ack_id = 1; |
|
||||||
|
|
||||||
// A pubsub message or truncation event. |
|
||||||
optional PubsubEvent pubsub_event = 2; |
|
||||||
} |
|
||||||
|
|
||||||
// Request for the PullBatch method. |
|
||||||
message PullBatchRequest { |
|
||||||
// The subscription from which messages should be pulled. |
|
||||||
optional string subscription = 1; |
|
||||||
|
|
||||||
// If this is specified as true the system will respond immediately even if |
|
||||||
// it is not able to return a message in the Pull response. Otherwise the |
|
||||||
// system is allowed to wait until at least one message is available rather |
|
||||||
// than returning no messages. The client may cancel the request if it does |
|
||||||
// not wish to wait any longer for the response. |
|
||||||
optional bool return_immediately = 2; |
|
||||||
|
|
||||||
// The maximum number of PubsubEvents returned for this request. The Pub/Sub |
|
||||||
// system may return fewer than the number of events specified. |
|
||||||
optional int32 max_events = 3; |
|
||||||
} |
|
||||||
|
|
||||||
// Response for the PullBatch method. |
|
||||||
message PullBatchResponse { |
|
||||||
|
|
||||||
// Received Pub/Sub messages or status events. The Pub/Sub system will return |
|
||||||
// zero messages if there are no more messages available in the backlog. The |
|
||||||
// Pub/Sub system may return fewer than the max_events requested even if |
|
||||||
// there are more messages available in the backlog. |
|
||||||
repeated PullResponse pull_responses = 2; |
|
||||||
} |
|
||||||
|
|
||||||
// Request for the ModifyAckDeadline method. |
|
||||||
message ModifyAckDeadlineRequest { |
|
||||||
// The name of the subscription from which messages are being pulled. |
|
||||||
optional string subscription = 1; |
|
||||||
|
|
||||||
// The acknowledgment ID. |
|
||||||
optional string ack_id = 2; |
|
||||||
|
|
||||||
// The new Ack deadline. Must be >= 0. |
|
||||||
optional int32 ack_deadline_seconds = 3; |
|
||||||
} |
|
||||||
|
|
||||||
// Request for the Acknowledge method. |
|
||||||
message AcknowledgeRequest { |
|
||||||
// The subscription whose message is being acknowledged. |
|
||||||
optional string subscription = 1; |
|
||||||
|
|
||||||
// The acknowledgment ID for the message being acknowledged. This was |
|
||||||
// returned by the Pub/Sub system in the Pull response. |
|
||||||
repeated string ack_id = 2; |
|
||||||
} |
|
||||||
|
|
||||||
// Request for the Nack method. |
|
||||||
message NackRequest { |
|
||||||
// The subscription whose message is being Nacked. |
|
||||||
optional string subscription = 1; |
|
||||||
|
|
||||||
// The acknowledgment ID for the message being refused. This was returned by |
|
||||||
// the Pub/Sub system in the Pull response. |
|
||||||
repeated string ack_id = 2; |
|
||||||
} |
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------- |
|
||||||
// The service and protos used by a push subscriber. |
|
||||||
// ----------------------------------------------------------------------------- |
|
||||||
|
|
||||||
// The service that a subscriber uses to handle messages sent via push |
|
||||||
// delivery. |
|
||||||
// This service is not currently exported for HTTP clients. |
|
||||||
// TODO(eschapira): Explain HTTP subscribers. |
|
||||||
service PushEndpointService { |
|
||||||
// Sends a <code>PubsubMessage</code> or a subscription status event to a |
|
||||||
// push endpoint. |
|
||||||
// The push endpoint responds with an empty message and a code from |
|
||||||
// util/task/codes.proto. The following codes have a particular meaning to the |
|
||||||
// Pub/Sub system: |
|
||||||
// OK - This is interpreted by Pub/Sub as Ack. |
|
||||||
// ABORTED - This is intepreted by Pub/Sub as a Nack, without implying |
|
||||||
// pushback for congestion control. The Pub/Sub system will |
|
||||||
// retry this message at a later time. |
|
||||||
// UNAVAILABLE - This is intepreted by Pub/Sub as a Nack, with the additional |
|
||||||
// semantics of push-back. The Pub/Sub system will use an AIMD |
|
||||||
// congestion control algorithm to backoff the rate of sending |
|
||||||
// messages from this subscription. |
|
||||||
// Any other code, or a failure to respond, will be interpreted in the same |
|
||||||
// way as ABORTED; i.e. the system will retry the message at a later time to |
|
||||||
// ensure reliable delivery. |
|
||||||
rpc HandlePubsubEvent(PubsubEvent) returns (proto2.Empty); |
|
||||||
} |
|
@ -1,285 +0,0 @@ |
|||||||
/* |
|
||||||
* |
|
||||||
* Copyright 2015, Google Inc. |
|
||||||
* All rights reserved. |
|
||||||
* |
|
||||||
* Redistribution and use in source and binary forms, with or without |
|
||||||
* modification, are permitted provided that the following conditions are |
|
||||||
* met: |
|
||||||
* |
|
||||||
* * Redistributions of source code must retain the above copyright |
|
||||||
* notice, this list of conditions and the following disclaimer. |
|
||||||
* * Redistributions in binary form must reproduce the above |
|
||||||
* copyright notice, this list of conditions and the following disclaimer |
|
||||||
* in the documentation and/or other materials provided with the |
|
||||||
* distribution. |
|
||||||
* * Neither the name of Google Inc. nor the names of its |
|
||||||
* contributors may be used to endorse or promote products derived from |
|
||||||
* this software without specific prior written permission. |
|
||||||
* |
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
|
||||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
|
||||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
|
||||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
|
||||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
|
||||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
|
||||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
|
||||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
|
||||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
|
||||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
|
||||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
|
||||||
* |
|
||||||
*/ |
|
||||||
|
|
||||||
'use strict'; |
|
||||||
|
|
||||||
var async = require('async'); |
|
||||||
var fs = require('fs'); |
|
||||||
var GoogleAuth = require('google-auth-library'); |
|
||||||
var parseArgs = require('minimist'); |
|
||||||
var strftime = require('strftime'); |
|
||||||
var _ = require('underscore'); |
|
||||||
var grpc = require('../..'); |
|
||||||
var PROTO_PATH = __dirname + '/pubsub.proto'; |
|
||||||
var pubsub = grpc.load(PROTO_PATH).tech.pubsub; |
|
||||||
|
|
||||||
function PubsubRunner(pub, sub, args) { |
|
||||||
this.pub = pub; |
|
||||||
this.sub = sub; |
|
||||||
this.args = args; |
|
||||||
} |
|
||||||
|
|
||||||
PubsubRunner.prototype.getTestTopicName = function() { |
|
||||||
var base_name = '/topics/' + this.args.project_id + '/'; |
|
||||||
if (this.args.topic_name) { |
|
||||||
return base_name + this.args.topic_name; |
|
||||||
} |
|
||||||
var now_text = strftime('%Y%m%d%H%M%S%L'); |
|
||||||
return base_name + process.env.USER + '-' + now_text; |
|
||||||
}; |
|
||||||
|
|
||||||
PubsubRunner.prototype.getTestSubName = function() { |
|
||||||
var base_name = '/subscriptions/' + this.args.project_id + '/'; |
|
||||||
if (this.args.sub_name) { |
|
||||||
return base_name + this.args.sub_name; |
|
||||||
} |
|
||||||
var now_text = strftime('%Y%m%d%H%M%S%L'); |
|
||||||
return base_name + process.env.USER + '-' + now_text; |
|
||||||
}; |
|
||||||
|
|
||||||
PubsubRunner.prototype.listProjectTopics = function(callback) { |
|
||||||
var q = ('cloud.googleapis.com/project in (/projects/' + |
|
||||||
this.args.project_id + ')'); |
|
||||||
this.pub.listTopics({query: q}, callback); |
|
||||||
}; |
|
||||||
|
|
||||||
PubsubRunner.prototype.topicExists = function(name, callback) { |
|
||||||
this.listProjectTopics(function(err, response) { |
|
||||||
if (err) { |
|
||||||
callback(err); |
|
||||||
} else { |
|
||||||
callback(null, _.some(response.topic, function(t) { |
|
||||||
return t.name === name; |
|
||||||
})); |
|
||||||
} |
|
||||||
}); |
|
||||||
}; |
|
||||||
|
|
||||||
PubsubRunner.prototype.createTopicIfNeeded = function(name, callback) { |
|
||||||
var self = this; |
|
||||||
this.topicExists(name, function(err, exists) { |
|
||||||
if (err) { |
|
||||||
callback(err); |
|
||||||
} else{ |
|
||||||
if (exists) { |
|
||||||
callback(null); |
|
||||||
} else { |
|
||||||
self.pub.createTopic({name: name}, callback); |
|
||||||
} |
|
||||||
} |
|
||||||
}); |
|
||||||
}; |
|
||||||
|
|
||||||
PubsubRunner.prototype.removeTopic = function(callback) { |
|
||||||
var name = this.getTestTopicName(); |
|
||||||
console.log('... removing Topic', name); |
|
||||||
this.pub.deleteTopic({topic: name}, function(err, value) { |
|
||||||
if (err) { |
|
||||||
console.log('Could not delete a topic: rpc failed with', err); |
|
||||||
callback(err); |
|
||||||
} else { |
|
||||||
console.log('removed Topic', name, 'OK'); |
|
||||||
callback(null); |
|
||||||
} |
|
||||||
}); |
|
||||||
}; |
|
||||||
|
|
||||||
PubsubRunner.prototype.createTopic = function(callback) { |
|
||||||
var name = this.getTestTopicName(); |
|
||||||
console.log('... creating Topic', name); |
|
||||||
this.pub.createTopic({name: name}, function(err, value) { |
|
||||||
if (err) { |
|
||||||
console.log('Could not create a topic: rpc failed with', err); |
|
||||||
callback(err); |
|
||||||
} else { |
|
||||||
console.log('created Topic', name, 'OK'); |
|
||||||
callback(null); |
|
||||||
} |
|
||||||
}); |
|
||||||
}; |
|
||||||
|
|
||||||
PubsubRunner.prototype.listSomeTopics = function(callback) { |
|
||||||
console.log('Listing topics'); |
|
||||||
console.log('-------------_'); |
|
||||||
this.listProjectTopics(function(err, response) { |
|
||||||
if (err) { |
|
||||||
console.log('Could not list topic: rpc failed with', err); |
|
||||||
callback(err); |
|
||||||
} else { |
|
||||||
_.each(response.topic, function(t) { |
|
||||||
console.log(t.name); |
|
||||||
}); |
|
||||||
callback(null); |
|
||||||
} |
|
||||||
}); |
|
||||||
}; |
|
||||||
|
|
||||||
PubsubRunner.prototype.checkExists = function(callback) { |
|
||||||
var name = this.getTestTopicName(); |
|
||||||
console.log('... checking for topic', name); |
|
||||||
this.topicExists(name, function(err, exists) { |
|
||||||
if (err) { |
|
||||||
console.log('Could not check for a topics: rpc failed with', err); |
|
||||||
callback(err); |
|
||||||
} else { |
|
||||||
if (exists) { |
|
||||||
console.log(name, 'is a topic'); |
|
||||||
} else { |
|
||||||
console.log(name, 'is not a topic'); |
|
||||||
} |
|
||||||
callback(null); |
|
||||||
} |
|
||||||
}); |
|
||||||
}; |
|
||||||
|
|
||||||
PubsubRunner.prototype.randomPubSub = function(callback) { |
|
||||||
var self = this; |
|
||||||
var topic_name = this.getTestTopicName(); |
|
||||||
var sub_name = this.getTestSubName(); |
|
||||||
var subscription = {name: sub_name, topic: topic_name}; |
|
||||||
async.waterfall([ |
|
||||||
_.bind(this.createTopicIfNeeded, this, topic_name), |
|
||||||
_.bind(this.sub.createSubscription, this.sub, subscription), |
|
||||||
function(resp, cb) { |
|
||||||
var msg_count = _.random(10, 30); |
|
||||||
// Set up msg_count messages to publish
|
|
||||||
var message_senders = _.times(msg_count, function(n) { |
|
||||||
return _.bind(self.pub.publish, self.pub, { |
|
||||||
topic: topic_name, |
|
||||||
message: {data: new Buffer('message ' + n)} |
|
||||||
}); |
|
||||||
}); |
|
||||||
async.parallel(message_senders, function(err, result) { |
|
||||||
cb(err, result, msg_count); |
|
||||||
}); |
|
||||||
}, |
|
||||||
function(result, msg_count, cb) { |
|
||||||
console.log('Sent', msg_count, 'messages to', topic_name + ',', |
|
||||||
'checking for them now.'); |
|
||||||
var batch_request = { |
|
||||||
subscription: sub_name, |
|
||||||
max_events: msg_count |
|
||||||
}; |
|
||||||
self.sub.pullBatch(batch_request, cb); |
|
||||||
}, |
|
||||||
function(batch, cb) { |
|
||||||
var ack_id = _.pluck(batch.pull_responses, 'ack_id'); |
|
||||||
console.log('Got', ack_id.length, 'messages, acknowledging them...'); |
|
||||||
var ack_request = { |
|
||||||
subscription: sub_name, |
|
||||||
ack_id: ack_id |
|
||||||
}; |
|
||||||
self.sub.acknowledge(ack_request, cb); |
|
||||||
}, |
|
||||||
function(result, cb) { |
|
||||||
console.log( |
|
||||||
'Test messages were acknowledged OK, deleting the subscription'); |
|
||||||
self.sub.deleteSubscription({subscription: sub_name}, cb); |
|
||||||
} |
|
||||||
], function (err, result) { |
|
||||||
if (err) { |
|
||||||
console.log('Could not do random pub sub: rpc failed with', err); |
|
||||||
} |
|
||||||
callback(err, result); |
|
||||||
}); |
|
||||||
}; |
|
||||||
|
|
||||||
function main(callback) { |
|
||||||
var argv = parseArgs(process.argv, { |
|
||||||
string: [ |
|
||||||
'host', |
|
||||||
'oauth_scope', |
|
||||||
'port', |
|
||||||
'action', |
|
||||||
'project_id', |
|
||||||
'topic_name', |
|
||||||
'sub_name' |
|
||||||
], |
|
||||||
default: { |
|
||||||
host: 'pubsub-staging.googleapis.com', |
|
||||||
oauth_scope: 'https://www.googleapis.com/auth/pubsub', |
|
||||||
port: 443, |
|
||||||
action: 'listSomeTopics', |
|
||||||
project_id: 'stoked-keyword-656' |
|
||||||
} |
|
||||||
}); |
|
||||||
var valid_actions = [ |
|
||||||
'createTopic', |
|
||||||
'removeTopic', |
|
||||||
'listSomeTopics', |
|
||||||
'checkExists', |
|
||||||
'randomPubSub' |
|
||||||
]; |
|
||||||
if (_.some(valid_actions, function(action) { |
|
||||||
return action === argv.action; |
|
||||||
})) { |
|
||||||
callback(new Error('Action was not valid')); |
|
||||||
} |
|
||||||
var address = argv.host + ':' + argv.port; |
|
||||||
(new GoogleAuth()).getApplicationDefault(function(err, credential) { |
|
||||||
if (err) { |
|
||||||
callback(err); |
|
||||||
return; |
|
||||||
} |
|
||||||
if (credential.createScopedRequired()) { |
|
||||||
credential = credential.createScoped(argv.oauth_scope); |
|
||||||
} |
|
||||||
var updateMetadata = grpc.getGoogleAuthDelegate(credential); |
|
||||||
var ca_path = process.env.SSL_CERT_FILE; |
|
||||||
fs.readFile(ca_path, function(err, ca_data) { |
|
||||||
if (err) { |
|
||||||
callback(err); |
|
||||||
return; |
|
||||||
} |
|
||||||
var ssl_creds = grpc.Credentials.createSsl(ca_data); |
|
||||||
var options = { |
|
||||||
credentials: ssl_creds, |
|
||||||
'grpc.ssl_target_name_override': argv.host |
|
||||||
}; |
|
||||||
var pub = new pubsub.PublisherService(address, options, updateMetadata); |
|
||||||
var sub = new pubsub.SubscriberService(address, options, updateMetadata); |
|
||||||
var runner = new PubsubRunner(pub, sub, argv); |
|
||||||
runner[argv.action](callback); |
|
||||||
}); |
|
||||||
}); |
|
||||||
} |
|
||||||
|
|
||||||
if (require.main === module) { |
|
||||||
main(function(err) { |
|
||||||
if (err) { |
|
||||||
throw err; |
|
||||||
} |
|
||||||
}); |
|
||||||
} |
|
||||||
|
|
||||||
module.exports = PubsubRunner; |
|
@ -0,0 +1,55 @@ |
|||||||
|
{ |
||||||
|
"package": null, |
||||||
|
"messages": [ |
||||||
|
{ |
||||||
|
"name": "Request", |
||||||
|
"fields": [ |
||||||
|
{ |
||||||
|
"rule": "optional", |
||||||
|
"type": "bool", |
||||||
|
"name": "error", |
||||||
|
"id": 1 |
||||||
|
} |
||||||
|
] |
||||||
|
}, |
||||||
|
{ |
||||||
|
"name": "Response", |
||||||
|
"fields": [ |
||||||
|
{ |
||||||
|
"rule": "optional", |
||||||
|
"type": "int32", |
||||||
|
"name": "count", |
||||||
|
"id": 1 |
||||||
|
} |
||||||
|
] |
||||||
|
} |
||||||
|
], |
||||||
|
"services": [ |
||||||
|
{ |
||||||
|
"name": "TestService", |
||||||
|
"options": {}, |
||||||
|
"rpc": { |
||||||
|
"Unary": { |
||||||
|
"request": "Request", |
||||||
|
"response": "Response", |
||||||
|
"options": {} |
||||||
|
}, |
||||||
|
"ClientStream": { |
||||||
|
"request": "Request", |
||||||
|
"response": "Response", |
||||||
|
"options": {} |
||||||
|
}, |
||||||
|
"ServerStream": { |
||||||
|
"request": "Request", |
||||||
|
"response": "Response", |
||||||
|
"options": {} |
||||||
|
}, |
||||||
|
"BidiStream": { |
||||||
|
"request": "Request", |
||||||
|
"response": "Response", |
||||||
|
"options": {} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
] |
||||||
|
} |
@ -1,14 +0,0 @@ |
|||||||
Pod::Spec.new do |s| |
|
||||||
s.name = 'GRPCClient' |
|
||||||
s.version = '0.0.1' |
|
||||||
s.summary = 'Generic gRPC client library for iOS' |
|
||||||
s.author = { |
|
||||||
'Jorge Canizales' => 'jcanizales@google.com' |
|
||||||
} |
|
||||||
s.source_files = '*.{h,m}', 'private/*.{h,m}' |
|
||||||
s.private_header_files = 'private/*.h' |
|
||||||
s.platform = :ios |
|
||||||
s.ios.deployment_target = '6.0' |
|
||||||
s.requires_arc = true |
|
||||||
s.dependency 'RxLibrary', '~> 0.0' |
|
||||||
end |
|
@ -0,0 +1,52 @@ |
|||||||
|
/* |
||||||
|
* |
||||||
|
* Copyright 2015, Google Inc. |
||||||
|
* All rights reserved. |
||||||
|
* |
||||||
|
* Redistribution and use in source and binary forms, with or without |
||||||
|
* modification, are permitted provided that the following conditions are |
||||||
|
* met: |
||||||
|
* |
||||||
|
* * Redistributions of source code must retain the above copyright |
||||||
|
* notice, this list of conditions and the following disclaimer. |
||||||
|
* * Redistributions in binary form must reproduce the above |
||||||
|
* copyright notice, this list of conditions and the following disclaimer |
||||||
|
* in the documentation and/or other materials provided with the |
||||||
|
* distribution. |
||||||
|
* * Neither the name of Google Inc. nor the names of its |
||||||
|
* contributors may be used to endorse or promote products derived from |
||||||
|
* this software without specific prior written permission. |
||||||
|
* |
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||||
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||||
|
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||||
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||||
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||||
|
* |
||||||
|
*/ |
||||||
|
|
||||||
|
#import "GRPCSecureChannel.h" |
||||||
|
|
||||||
|
#import <grpc/grpc_security.h> |
||||||
|
|
||||||
|
@implementation GRPCSecureChannel |
||||||
|
|
||||||
|
- (instancetype)initWithHost:(NSString *)host { |
||||||
|
// TODO(jcanizales): Load certs only once. |
||||||
|
NSURL *certsURL = [[NSBundle mainBundle] URLForResource:@"gRPC.bundle/roots" withExtension:@"pem"]; |
||||||
|
NSData *certsData = [NSData dataWithContentsOfURL:certsURL]; |
||||||
|
NSString *certsString = [[NSString alloc] initWithData:certsData encoding:NSUTF8StringEncoding]; |
||||||
|
|
||||||
|
grpc_credentials *credentials = grpc_ssl_credentials_create(certsString.UTF8String, NULL); |
||||||
|
return (self = [super initWithChannel:grpc_secure_channel_create(credentials, |
||||||
|
host.UTF8String, |
||||||
|
NULL)]); |
||||||
|
} |
||||||
|
|
||||||
|
@end |
@ -0,0 +1,38 @@ |
|||||||
|
/*
|
||||||
|
* |
||||||
|
* Copyright 2015, Google Inc. |
||||||
|
* All rights reserved. |
||||||
|
* |
||||||
|
* Redistribution and use in source and binary forms, with or without |
||||||
|
* modification, are permitted provided that the following conditions are |
||||||
|
* met: |
||||||
|
* |
||||||
|
* * Redistributions of source code must retain the above copyright |
||||||
|
* notice, this list of conditions and the following disclaimer. |
||||||
|
* * Redistributions in binary form must reproduce the above |
||||||
|
* copyright notice, this list of conditions and the following disclaimer |
||||||
|
* in the documentation and/or other materials provided with the |
||||||
|
* distribution. |
||||||
|
* * Neither the name of Google Inc. nor the names of its |
||||||
|
* contributors may be used to endorse or promote products derived from |
||||||
|
* this software without specific prior written permission. |
||||||
|
* |
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||||
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||||
|
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||||
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||||
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||||
|
* |
||||||
|
*/ |
||||||
|
|
||||||
|
#import "GRPCChannel.h" |
||||||
|
|
||||||
|
@interface GRPCUnsecuredChannel : GRPCChannel |
||||||
|
|
||||||
|
@end |
@ -1,13 +0,0 @@ |
|||||||
Pod::Spec.new do |s| |
|
||||||
s.name = 'RxLibrary' |
|
||||||
s.version = '0.0.1' |
|
||||||
s.summary = 'Reactive Extensions library for iOS' |
|
||||||
s.author = { |
|
||||||
'Jorge Canizales' => 'jcanizales@google.com' |
|
||||||
} |
|
||||||
s.source_files = '*.{h,m}', 'transformations/*.{h,m}', 'private/*.{h,m}' |
|
||||||
s.private_header_files = 'private/*.h' |
|
||||||
s.platform = :ios |
|
||||||
s.ios.deployment_target = '6.0' |
|
||||||
s.requires_arc = true |
|
||||||
end |
|
@ -1,13 +1,14 @@ |
|||||||
source 'https://github.com/CocoaPods/Specs.git' |
source 'https://github.com/CocoaPods/Specs.git' |
||||||
platform :ios, '8.0' |
platform :ios, '8.0' |
||||||
|
|
||||||
pod 'RxLibrary', :path => "../../RxLibrary" |
pod 'gRPC', :path => "../../../.." |
||||||
pod 'GRPCClient', :path => "../../GRPCClient" |
pod 'Route_guide', :path => "RouteGuideClient" |
||||||
|
pod 'RemoteTest', :path => "RemoteTestClient" |
||||||
|
|
||||||
target 'Sample' do |
link_with 'Sample', 'SampleTests' |
||||||
|
|
||||||
|
target 'Sample' do |
||||||
end |
end |
||||||
|
|
||||||
target 'SampleTests' do |
target 'SampleTests' do |
||||||
|
|
||||||
end |
end |
||||||
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,103 @@ |
|||||||
|
// Generated by the protocol buffer compiler. DO NOT EDIT!
|
||||||
|
|
||||||
|
#import <ProtocolBuffers/ProtocolBuffers.h> |
||||||
|
|
||||||
|
// @@protoc_insertion_point(imports)
|
||||||
|
|
||||||
|
@class ObjectiveCFileOptions; |
||||||
|
@class ObjectiveCFileOptionsBuilder; |
||||||
|
@class PBDescriptorProto; |
||||||
|
@class PBDescriptorProtoBuilder; |
||||||
|
@class PBDescriptorProtoExtensionRange; |
||||||
|
@class PBDescriptorProtoExtensionRangeBuilder; |
||||||
|
@class PBEnumDescriptorProto; |
||||||
|
@class PBEnumDescriptorProtoBuilder; |
||||||
|
@class PBEnumOptions; |
||||||
|
@class PBEnumOptionsBuilder; |
||||||
|
@class PBEnumValueDescriptorProto; |
||||||
|
@class PBEnumValueDescriptorProtoBuilder; |
||||||
|
@class PBEnumValueOptions; |
||||||
|
@class PBEnumValueOptionsBuilder; |
||||||
|
@class PBFieldDescriptorProto; |
||||||
|
@class PBFieldDescriptorProtoBuilder; |
||||||
|
@class PBFieldOptions; |
||||||
|
@class PBFieldOptionsBuilder; |
||||||
|
@class PBFileDescriptorProto; |
||||||
|
@class PBFileDescriptorProtoBuilder; |
||||||
|
@class PBFileDescriptorSet; |
||||||
|
@class PBFileDescriptorSetBuilder; |
||||||
|
@class PBFileOptions; |
||||||
|
@class PBFileOptionsBuilder; |
||||||
|
@class PBMessageOptions; |
||||||
|
@class PBMessageOptionsBuilder; |
||||||
|
@class PBMethodDescriptorProto; |
||||||
|
@class PBMethodDescriptorProtoBuilder; |
||||||
|
@class PBMethodOptions; |
||||||
|
@class PBMethodOptionsBuilder; |
||||||
|
@class PBOneofDescriptorProto; |
||||||
|
@class PBOneofDescriptorProtoBuilder; |
||||||
|
@class PBServiceDescriptorProto; |
||||||
|
@class PBServiceDescriptorProtoBuilder; |
||||||
|
@class PBServiceOptions; |
||||||
|
@class PBServiceOptionsBuilder; |
||||||
|
@class PBSourceCodeInfo; |
||||||
|
@class PBSourceCodeInfoBuilder; |
||||||
|
@class PBSourceCodeInfoLocation; |
||||||
|
@class PBSourceCodeInfoLocationBuilder; |
||||||
|
@class PBUninterpretedOption; |
||||||
|
@class PBUninterpretedOptionBuilder; |
||||||
|
@class PBUninterpretedOptionNamePart; |
||||||
|
@class PBUninterpretedOptionNamePartBuilder; |
||||||
|
@class RMTEmpty; |
||||||
|
@class RMTEmptyBuilder; |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@interface RMTEmptyRoot : NSObject { |
||||||
|
} |
||||||
|
+ (PBExtensionRegistry*) extensionRegistry; |
||||||
|
+ (void) registerAllExtensions:(PBMutableExtensionRegistry*) registry; |
||||||
|
@end |
||||||
|
|
||||||
|
@interface RMTEmpty : PBGeneratedMessage<GeneratedMessageProtocol> { |
||||||
|
@private |
||||||
|
} |
||||||
|
|
||||||
|
+ (instancetype) defaultInstance; |
||||||
|
- (instancetype) defaultInstance; |
||||||
|
|
||||||
|
- (BOOL) isInitialized; |
||||||
|
- (void) writeToCodedOutputStream:(PBCodedOutputStream*) output; |
||||||
|
- (RMTEmptyBuilder*) builder; |
||||||
|
+ (RMTEmptyBuilder*) builder; |
||||||
|
+ (RMTEmptyBuilder*) builderWithPrototype:(RMTEmpty*) prototype; |
||||||
|
- (RMTEmptyBuilder*) toBuilder; |
||||||
|
|
||||||
|
+ (RMTEmpty*) parseFromData:(NSData*) data; |
||||||
|
+ (RMTEmpty*) parseFromData:(NSData*) data extensionRegistry:(PBExtensionRegistry*) extensionRegistry; |
||||||
|
+ (RMTEmpty*) parseFromInputStream:(NSInputStream*) input; |
||||||
|
+ (RMTEmpty*) parseFromInputStream:(NSInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry; |
||||||
|
+ (RMTEmpty*) parseFromCodedInputStream:(PBCodedInputStream*) input; |
||||||
|
+ (RMTEmpty*) parseFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry; |
||||||
|
@end |
||||||
|
|
||||||
|
@interface RMTEmptyBuilder : PBGeneratedMessageBuilder { |
||||||
|
@private |
||||||
|
RMTEmpty* resultEmpty; |
||||||
|
} |
||||||
|
|
||||||
|
- (RMTEmpty*) defaultInstance; |
||||||
|
|
||||||
|
- (RMTEmptyBuilder*) clear; |
||||||
|
- (RMTEmptyBuilder*) clone; |
||||||
|
|
||||||
|
- (RMTEmpty*) build; |
||||||
|
- (RMTEmpty*) buildPartial; |
||||||
|
|
||||||
|
- (RMTEmptyBuilder*) mergeFrom:(RMTEmpty*) other; |
||||||
|
- (RMTEmptyBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input; |
||||||
|
- (RMTEmptyBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry; |
||||||
|
@end |
||||||
|
|
||||||
|
|
||||||
|
// @@protoc_insertion_point(global_scope)
|
@ -0,0 +1,179 @@ |
|||||||
|
// Generated by the protocol buffer compiler. DO NOT EDIT! |
||||||
|
|
||||||
|
#import "Empty.pb.h" |
||||||
|
// @@protoc_insertion_point(imports) |
||||||
|
|
||||||
|
@implementation RMTEmptyRoot |
||||||
|
static PBExtensionRegistry* extensionRegistry = nil; |
||||||
|
+ (PBExtensionRegistry*) extensionRegistry { |
||||||
|
return extensionRegistry; |
||||||
|
} |
||||||
|
|
||||||
|
+ (void) initialize { |
||||||
|
if (self == [RMTEmptyRoot class]) { |
||||||
|
PBMutableExtensionRegistry* registry = [PBMutableExtensionRegistry registry]; |
||||||
|
[self registerAllExtensions:registry]; |
||||||
|
[ObjectivecDescriptorRoot registerAllExtensions:registry]; |
||||||
|
extensionRegistry = registry; |
||||||
|
} |
||||||
|
} |
||||||
|
+ (void) registerAllExtensions:(PBMutableExtensionRegistry*) registry { |
||||||
|
} |
||||||
|
@end |
||||||
|
|
||||||
|
@interface RMTEmpty () |
||||||
|
@end |
||||||
|
|
||||||
|
@implementation RMTEmpty |
||||||
|
|
||||||
|
- (instancetype) init { |
||||||
|
if ((self = [super init])) { |
||||||
|
} |
||||||
|
return self; |
||||||
|
} |
||||||
|
static RMTEmpty* defaultRMTEmptyInstance = nil; |
||||||
|
+ (void) initialize { |
||||||
|
if (self == [RMTEmpty class]) { |
||||||
|
defaultRMTEmptyInstance = [[RMTEmpty alloc] init]; |
||||||
|
} |
||||||
|
} |
||||||
|
+ (instancetype) defaultInstance { |
||||||
|
return defaultRMTEmptyInstance; |
||||||
|
} |
||||||
|
- (instancetype) defaultInstance { |
||||||
|
return defaultRMTEmptyInstance; |
||||||
|
} |
||||||
|
- (BOOL) isInitialized { |
||||||
|
return YES; |
||||||
|
} |
||||||
|
- (void) writeToCodedOutputStream:(PBCodedOutputStream*) output { |
||||||
|
[self.unknownFields writeToCodedOutputStream:output]; |
||||||
|
} |
||||||
|
- (SInt32) serializedSize { |
||||||
|
__block SInt32 size_ = memoizedSerializedSize; |
||||||
|
if (size_ != -1) { |
||||||
|
return size_; |
||||||
|
} |
||||||
|
|
||||||
|
size_ = 0; |
||||||
|
size_ += self.unknownFields.serializedSize; |
||||||
|
memoizedSerializedSize = size_; |
||||||
|
return size_; |
||||||
|
} |
||||||
|
+ (RMTEmpty*) parseFromData:(NSData*) data { |
||||||
|
return (RMTEmpty*)[[[RMTEmpty builder] mergeFromData:data] build]; |
||||||
|
} |
||||||
|
+ (RMTEmpty*) parseFromData:(NSData*) data extensionRegistry:(PBExtensionRegistry*) extensionRegistry { |
||||||
|
return (RMTEmpty*)[[[RMTEmpty builder] mergeFromData:data extensionRegistry:extensionRegistry] build]; |
||||||
|
} |
||||||
|
+ (RMTEmpty*) parseFromInputStream:(NSInputStream*) input { |
||||||
|
return (RMTEmpty*)[[[RMTEmpty builder] mergeFromInputStream:input] build]; |
||||||
|
} |
||||||
|
+ (RMTEmpty*) parseFromInputStream:(NSInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry { |
||||||
|
return (RMTEmpty*)[[[RMTEmpty builder] mergeFromInputStream:input extensionRegistry:extensionRegistry] build]; |
||||||
|
} |
||||||
|
+ (RMTEmpty*) parseFromCodedInputStream:(PBCodedInputStream*) input { |
||||||
|
return (RMTEmpty*)[[[RMTEmpty builder] mergeFromCodedInputStream:input] build]; |
||||||
|
} |
||||||
|
+ (RMTEmpty*) parseFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry { |
||||||
|
return (RMTEmpty*)[[[RMTEmpty builder] mergeFromCodedInputStream:input extensionRegistry:extensionRegistry] build]; |
||||||
|
} |
||||||
|
+ (RMTEmptyBuilder*) builder { |
||||||
|
return [[RMTEmptyBuilder alloc] init]; |
||||||
|
} |
||||||
|
+ (RMTEmptyBuilder*) builderWithPrototype:(RMTEmpty*) prototype { |
||||||
|
return [[RMTEmpty builder] mergeFrom:prototype]; |
||||||
|
} |
||||||
|
- (RMTEmptyBuilder*) builder { |
||||||
|
return [RMTEmpty builder]; |
||||||
|
} |
||||||
|
- (RMTEmptyBuilder*) toBuilder { |
||||||
|
return [RMTEmpty builderWithPrototype:self]; |
||||||
|
} |
||||||
|
- (void) writeDescriptionTo:(NSMutableString*) output withIndent:(NSString*) indent { |
||||||
|
[self.unknownFields writeDescriptionTo:output withIndent:indent]; |
||||||
|
} |
||||||
|
- (BOOL) isEqual:(id)other { |
||||||
|
if (other == self) { |
||||||
|
return YES; |
||||||
|
} |
||||||
|
if (![other isKindOfClass:[RMTEmpty class]]) { |
||||||
|
return NO; |
||||||
|
} |
||||||
|
RMTEmpty *otherMessage = other; |
||||||
|
return |
||||||
|
(self.unknownFields == otherMessage.unknownFields || (self.unknownFields != nil && [self.unknownFields isEqual:otherMessage.unknownFields])); |
||||||
|
} |
||||||
|
- (NSUInteger) hash { |
||||||
|
__block NSUInteger hashCode = 7; |
||||||
|
hashCode = hashCode * 31 + [self.unknownFields hash]; |
||||||
|
return hashCode; |
||||||
|
} |
||||||
|
@end |
||||||
|
|
||||||
|
@interface RMTEmptyBuilder() |
||||||
|
@property (strong) RMTEmpty* resultEmpty; |
||||||
|
@end |
||||||
|
|
||||||
|
@implementation RMTEmptyBuilder |
||||||
|
@synthesize resultEmpty; |
||||||
|
- (instancetype) init { |
||||||
|
if ((self = [super init])) { |
||||||
|
self.resultEmpty = [[RMTEmpty alloc] init]; |
||||||
|
} |
||||||
|
return self; |
||||||
|
} |
||||||
|
- (PBGeneratedMessage*) internalGetResult { |
||||||
|
return resultEmpty; |
||||||
|
} |
||||||
|
- (RMTEmptyBuilder*) clear { |
||||||
|
self.resultEmpty = [[RMTEmpty alloc] init]; |
||||||
|
return self; |
||||||
|
} |
||||||
|
- (RMTEmptyBuilder*) clone { |
||||||
|
return [RMTEmpty builderWithPrototype:resultEmpty]; |
||||||
|
} |
||||||
|
- (RMTEmpty*) defaultInstance { |
||||||
|
return [RMTEmpty defaultInstance]; |
||||||
|
} |
||||||
|
- (RMTEmpty*) build { |
||||||
|
[self checkInitialized]; |
||||||
|
return [self buildPartial]; |
||||||
|
} |
||||||
|
- (RMTEmpty*) buildPartial { |
||||||
|
RMTEmpty* returnMe = resultEmpty; |
||||||
|
self.resultEmpty = nil; |
||||||
|
return returnMe; |
||||||
|
} |
||||||
|
- (RMTEmptyBuilder*) mergeFrom:(RMTEmpty*) other { |
||||||
|
if (other == [RMTEmpty defaultInstance]) { |
||||||
|
return self; |
||||||
|
} |
||||||
|
[self mergeUnknownFields:other.unknownFields]; |
||||||
|
return self; |
||||||
|
} |
||||||
|
- (RMTEmptyBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input { |
||||||
|
return [self mergeFromCodedInputStream:input extensionRegistry:[PBExtensionRegistry emptyRegistry]]; |
||||||
|
} |
||||||
|
- (RMTEmptyBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry { |
||||||
|
PBUnknownFieldSetBuilder* unknownFields = [PBUnknownFieldSet builderWithUnknownFields:self.unknownFields]; |
||||||
|
while (YES) { |
||||||
|
SInt32 tag = [input readTag]; |
||||||
|
switch (tag) { |
||||||
|
case 0: |
||||||
|
[self setUnknownFields:[unknownFields build]]; |
||||||
|
return self; |
||||||
|
default: { |
||||||
|
if (![self parseUnknownField:input unknownFields:unknownFields extensionRegistry:extensionRegistry tag:tag]) { |
||||||
|
[self setUnknownFields:[unknownFields build]]; |
||||||
|
return self; |
||||||
|
} |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
@end |
||||||
|
|
||||||
|
|
||||||
|
// @@protoc_insertion_point(global_scope) |
@ -0,0 +1,578 @@ |
|||||||
|
// Generated by the protocol buffer compiler. DO NOT EDIT!
|
||||||
|
|
||||||
|
#import <ProtocolBuffers/ProtocolBuffers.h> |
||||||
|
|
||||||
|
// @@protoc_insertion_point(imports)
|
||||||
|
|
||||||
|
@class ObjectiveCFileOptions; |
||||||
|
@class ObjectiveCFileOptionsBuilder; |
||||||
|
@class PBDescriptorProto; |
||||||
|
@class PBDescriptorProtoBuilder; |
||||||
|
@class PBDescriptorProtoExtensionRange; |
||||||
|
@class PBDescriptorProtoExtensionRangeBuilder; |
||||||
|
@class PBEnumDescriptorProto; |
||||||
|
@class PBEnumDescriptorProtoBuilder; |
||||||
|
@class PBEnumOptions; |
||||||
|
@class PBEnumOptionsBuilder; |
||||||
|
@class PBEnumValueDescriptorProto; |
||||||
|
@class PBEnumValueDescriptorProtoBuilder; |
||||||
|
@class PBEnumValueOptions; |
||||||
|
@class PBEnumValueOptionsBuilder; |
||||||
|
@class PBFieldDescriptorProto; |
||||||
|
@class PBFieldDescriptorProtoBuilder; |
||||||
|
@class PBFieldOptions; |
||||||
|
@class PBFieldOptionsBuilder; |
||||||
|
@class PBFileDescriptorProto; |
||||||
|
@class PBFileDescriptorProtoBuilder; |
||||||
|
@class PBFileDescriptorSet; |
||||||
|
@class PBFileDescriptorSetBuilder; |
||||||
|
@class PBFileOptions; |
||||||
|
@class PBFileOptionsBuilder; |
||||||
|
@class PBMessageOptions; |
||||||
|
@class PBMessageOptionsBuilder; |
||||||
|
@class PBMethodDescriptorProto; |
||||||
|
@class PBMethodDescriptorProtoBuilder; |
||||||
|
@class PBMethodOptions; |
||||||
|
@class PBMethodOptionsBuilder; |
||||||
|
@class PBOneofDescriptorProto; |
||||||
|
@class PBOneofDescriptorProtoBuilder; |
||||||
|
@class PBServiceDescriptorProto; |
||||||
|
@class PBServiceDescriptorProtoBuilder; |
||||||
|
@class PBServiceOptions; |
||||||
|
@class PBServiceOptionsBuilder; |
||||||
|
@class PBSourceCodeInfo; |
||||||
|
@class PBSourceCodeInfoBuilder; |
||||||
|
@class PBSourceCodeInfoLocation; |
||||||
|
@class PBSourceCodeInfoLocationBuilder; |
||||||
|
@class PBUninterpretedOption; |
||||||
|
@class PBUninterpretedOptionBuilder; |
||||||
|
@class PBUninterpretedOptionNamePart; |
||||||
|
@class PBUninterpretedOptionNamePartBuilder; |
||||||
|
@class RMTPayload; |
||||||
|
@class RMTPayloadBuilder; |
||||||
|
@class RMTResponseParameters; |
||||||
|
@class RMTResponseParametersBuilder; |
||||||
|
@class RMTSimpleRequest; |
||||||
|
@class RMTSimpleRequestBuilder; |
||||||
|
@class RMTSimpleResponse; |
||||||
|
@class RMTSimpleResponseBuilder; |
||||||
|
@class RMTStreamingInputCallRequest; |
||||||
|
@class RMTStreamingInputCallRequestBuilder; |
||||||
|
@class RMTStreamingInputCallResponse; |
||||||
|
@class RMTStreamingInputCallResponseBuilder; |
||||||
|
@class RMTStreamingOutputCallRequest; |
||||||
|
@class RMTStreamingOutputCallRequestBuilder; |
||||||
|
@class RMTStreamingOutputCallResponse; |
||||||
|
@class RMTStreamingOutputCallResponseBuilder; |
||||||
|
|
||||||
|
|
||||||
|
typedef NS_ENUM(SInt32, RMTPayloadType) { |
||||||
|
RMTPayloadTypeCompressable = 0, |
||||||
|
RMTPayloadTypeUncompressable = 1, |
||||||
|
RMTPayloadTypeRandom = 2, |
||||||
|
}; |
||||||
|
|
||||||
|
BOOL RMTPayloadTypeIsValidValue(RMTPayloadType value); |
||||||
|
NSString *NSStringFromRMTPayloadType(RMTPayloadType value); |
||||||
|
|
||||||
|
|
||||||
|
@interface RMTMessagesRoot : NSObject { |
||||||
|
} |
||||||
|
+ (PBExtensionRegistry*) extensionRegistry; |
||||||
|
+ (void) registerAllExtensions:(PBMutableExtensionRegistry*) registry; |
||||||
|
@end |
||||||
|
|
||||||
|
@interface RMTPayload : PBGeneratedMessage<GeneratedMessageProtocol> { |
||||||
|
@private |
||||||
|
BOOL hasBody_:1; |
||||||
|
BOOL hasType_:1; |
||||||
|
NSData* body; |
||||||
|
RMTPayloadType type; |
||||||
|
} |
||||||
|
- (BOOL) hasType; |
||||||
|
- (BOOL) hasBody; |
||||||
|
@property (readonly) RMTPayloadType type; |
||||||
|
@property (readonly, strong) NSData* body; |
||||||
|
|
||||||
|
+ (instancetype) defaultInstance; |
||||||
|
- (instancetype) defaultInstance; |
||||||
|
|
||||||
|
- (BOOL) isInitialized; |
||||||
|
- (void) writeToCodedOutputStream:(PBCodedOutputStream*) output; |
||||||
|
- (RMTPayloadBuilder*) builder; |
||||||
|
+ (RMTPayloadBuilder*) builder; |
||||||
|
+ (RMTPayloadBuilder*) builderWithPrototype:(RMTPayload*) prototype; |
||||||
|
- (RMTPayloadBuilder*) toBuilder; |
||||||
|
|
||||||
|
+ (RMTPayload*) parseFromData:(NSData*) data; |
||||||
|
+ (RMTPayload*) parseFromData:(NSData*) data extensionRegistry:(PBExtensionRegistry*) extensionRegistry; |
||||||
|
+ (RMTPayload*) parseFromInputStream:(NSInputStream*) input; |
||||||
|
+ (RMTPayload*) parseFromInputStream:(NSInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry; |
||||||
|
+ (RMTPayload*) parseFromCodedInputStream:(PBCodedInputStream*) input; |
||||||
|
+ (RMTPayload*) parseFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry; |
||||||
|
@end |
||||||
|
|
||||||
|
@interface RMTPayloadBuilder : PBGeneratedMessageBuilder { |
||||||
|
@private |
||||||
|
RMTPayload* resultPayload; |
||||||
|
} |
||||||
|
|
||||||
|
- (RMTPayload*) defaultInstance; |
||||||
|
|
||||||
|
- (RMTPayloadBuilder*) clear; |
||||||
|
- (RMTPayloadBuilder*) clone; |
||||||
|
|
||||||
|
- (RMTPayload*) build; |
||||||
|
- (RMTPayload*) buildPartial; |
||||||
|
|
||||||
|
- (RMTPayloadBuilder*) mergeFrom:(RMTPayload*) other; |
||||||
|
- (RMTPayloadBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input; |
||||||
|
- (RMTPayloadBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry; |
||||||
|
|
||||||
|
- (BOOL) hasType; |
||||||
|
- (RMTPayloadType) type; |
||||||
|
- (RMTPayloadBuilder*) setType:(RMTPayloadType) value; |
||||||
|
- (RMTPayloadBuilder*) clearType; |
||||||
|
|
||||||
|
- (BOOL) hasBody; |
||||||
|
- (NSData*) body; |
||||||
|
- (RMTPayloadBuilder*) setBody:(NSData*) value; |
||||||
|
- (RMTPayloadBuilder*) clearBody; |
||||||
|
@end |
||||||
|
|
||||||
|
@interface RMTSimpleRequest : PBGeneratedMessage<GeneratedMessageProtocol> { |
||||||
|
@private |
||||||
|
BOOL hasFillUsername_:1; |
||||||
|
BOOL hasFillOauthScope_:1; |
||||||
|
BOOL hasResponseSize_:1; |
||||||
|
BOOL hasPayload_:1; |
||||||
|
BOOL hasResponseType_:1; |
||||||
|
BOOL fillUsername_:1; |
||||||
|
BOOL fillOauthScope_:1; |
||||||
|
SInt32 responseSize; |
||||||
|
RMTPayload* payload; |
||||||
|
RMTPayloadType responseType; |
||||||
|
} |
||||||
|
- (BOOL) hasResponseType; |
||||||
|
- (BOOL) hasResponseSize; |
||||||
|
- (BOOL) hasPayload; |
||||||
|
- (BOOL) hasFillUsername; |
||||||
|
- (BOOL) hasFillOauthScope; |
||||||
|
@property (readonly) RMTPayloadType responseType; |
||||||
|
@property (readonly) SInt32 responseSize; |
||||||
|
@property (readonly, strong) RMTPayload* payload; |
||||||
|
- (BOOL) fillUsername; |
||||||
|
- (BOOL) fillOauthScope; |
||||||
|
|
||||||
|
+ (instancetype) defaultInstance; |
||||||
|
- (instancetype) defaultInstance; |
||||||
|
|
||||||
|
- (BOOL) isInitialized; |
||||||
|
- (void) writeToCodedOutputStream:(PBCodedOutputStream*) output; |
||||||
|
- (RMTSimpleRequestBuilder*) builder; |
||||||
|
+ (RMTSimpleRequestBuilder*) builder; |
||||||
|
+ (RMTSimpleRequestBuilder*) builderWithPrototype:(RMTSimpleRequest*) prototype; |
||||||
|
- (RMTSimpleRequestBuilder*) toBuilder; |
||||||
|
|
||||||
|
+ (RMTSimpleRequest*) parseFromData:(NSData*) data; |
||||||
|
+ (RMTSimpleRequest*) parseFromData:(NSData*) data extensionRegistry:(PBExtensionRegistry*) extensionRegistry; |
||||||
|
+ (RMTSimpleRequest*) parseFromInputStream:(NSInputStream*) input; |
||||||
|
+ (RMTSimpleRequest*) parseFromInputStream:(NSInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry; |
||||||
|
+ (RMTSimpleRequest*) parseFromCodedInputStream:(PBCodedInputStream*) input; |
||||||
|
+ (RMTSimpleRequest*) parseFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry; |
||||||
|
@end |
||||||
|
|
||||||
|
@interface RMTSimpleRequestBuilder : PBGeneratedMessageBuilder { |
||||||
|
@private |
||||||
|
RMTSimpleRequest* resultSimpleRequest; |
||||||
|
} |
||||||
|
|
||||||
|
- (RMTSimpleRequest*) defaultInstance; |
||||||
|
|
||||||
|
- (RMTSimpleRequestBuilder*) clear; |
||||||
|
- (RMTSimpleRequestBuilder*) clone; |
||||||
|
|
||||||
|
- (RMTSimpleRequest*) build; |
||||||
|
- (RMTSimpleRequest*) buildPartial; |
||||||
|
|
||||||
|
- (RMTSimpleRequestBuilder*) mergeFrom:(RMTSimpleRequest*) other; |
||||||
|
- (RMTSimpleRequestBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input; |
||||||
|
- (RMTSimpleRequestBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry; |
||||||
|
|
||||||
|
- (BOOL) hasResponseType; |
||||||
|
- (RMTPayloadType) responseType; |
||||||
|
- (RMTSimpleRequestBuilder*) setResponseType:(RMTPayloadType) value; |
||||||
|
- (RMTSimpleRequestBuilder*) clearResponseType; |
||||||
|
|
||||||
|
- (BOOL) hasResponseSize; |
||||||
|
- (SInt32) responseSize; |
||||||
|
- (RMTSimpleRequestBuilder*) setResponseSize:(SInt32) value; |
||||||
|
- (RMTSimpleRequestBuilder*) clearResponseSize; |
||||||
|
|
||||||
|
- (BOOL) hasPayload; |
||||||
|
- (RMTPayload*) payload; |
||||||
|
- (RMTSimpleRequestBuilder*) setPayload:(RMTPayload*) value; |
||||||
|
- (RMTSimpleRequestBuilder*) setPayloadBuilder:(RMTPayloadBuilder*) builderForValue; |
||||||
|
- (RMTSimpleRequestBuilder*) mergePayload:(RMTPayload*) value; |
||||||
|
- (RMTSimpleRequestBuilder*) clearPayload; |
||||||
|
|
||||||
|
- (BOOL) hasFillUsername; |
||||||
|
- (BOOL) fillUsername; |
||||||
|
- (RMTSimpleRequestBuilder*) setFillUsername:(BOOL) value; |
||||||
|
- (RMTSimpleRequestBuilder*) clearFillUsername; |
||||||
|
|
||||||
|
- (BOOL) hasFillOauthScope; |
||||||
|
- (BOOL) fillOauthScope; |
||||||
|
- (RMTSimpleRequestBuilder*) setFillOauthScope:(BOOL) value; |
||||||
|
- (RMTSimpleRequestBuilder*) clearFillOauthScope; |
||||||
|
@end |
||||||
|
|
||||||
|
@interface RMTSimpleResponse : PBGeneratedMessage<GeneratedMessageProtocol> { |
||||||
|
@private |
||||||
|
BOOL hasUsername_:1; |
||||||
|
BOOL hasOauthScope_:1; |
||||||
|
BOOL hasPayload_:1; |
||||||
|
NSString* username; |
||||||
|
NSString* oauthScope; |
||||||
|
RMTPayload* payload; |
||||||
|
} |
||||||
|
- (BOOL) hasPayload; |
||||||
|
- (BOOL) hasUsername; |
||||||
|
- (BOOL) hasOauthScope; |
||||||
|
@property (readonly, strong) RMTPayload* payload; |
||||||
|
@property (readonly, strong) NSString* username; |
||||||
|
@property (readonly, strong) NSString* oauthScope; |
||||||
|
|
||||||
|
+ (instancetype) defaultInstance; |
||||||
|
- (instancetype) defaultInstance; |
||||||
|
|
||||||
|
- (BOOL) isInitialized; |
||||||
|
- (void) writeToCodedOutputStream:(PBCodedOutputStream*) output; |
||||||
|
- (RMTSimpleResponseBuilder*) builder; |
||||||
|
+ (RMTSimpleResponseBuilder*) builder; |
||||||
|
+ (RMTSimpleResponseBuilder*) builderWithPrototype:(RMTSimpleResponse*) prototype; |
||||||
|
- (RMTSimpleResponseBuilder*) toBuilder; |
||||||
|
|
||||||
|
+ (RMTSimpleResponse*) parseFromData:(NSData*) data; |
||||||
|
+ (RMTSimpleResponse*) parseFromData:(NSData*) data extensionRegistry:(PBExtensionRegistry*) extensionRegistry; |
||||||
|
+ (RMTSimpleResponse*) parseFromInputStream:(NSInputStream*) input; |
||||||
|
+ (RMTSimpleResponse*) parseFromInputStream:(NSInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry; |
||||||
|
+ (RMTSimpleResponse*) parseFromCodedInputStream:(PBCodedInputStream*) input; |
||||||
|
+ (RMTSimpleResponse*) parseFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry; |
||||||
|
@end |
||||||
|
|
||||||
|
@interface RMTSimpleResponseBuilder : PBGeneratedMessageBuilder { |
||||||
|
@private |
||||||
|
RMTSimpleResponse* resultSimpleResponse; |
||||||
|
} |
||||||
|
|
||||||
|
- (RMTSimpleResponse*) defaultInstance; |
||||||
|
|
||||||
|
- (RMTSimpleResponseBuilder*) clear; |
||||||
|
- (RMTSimpleResponseBuilder*) clone; |
||||||
|
|
||||||
|
- (RMTSimpleResponse*) build; |
||||||
|
- (RMTSimpleResponse*) buildPartial; |
||||||
|
|
||||||
|
- (RMTSimpleResponseBuilder*) mergeFrom:(RMTSimpleResponse*) other; |
||||||
|
- (RMTSimpleResponseBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input; |
||||||
|
- (RMTSimpleResponseBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry; |
||||||
|
|
||||||
|
- (BOOL) hasPayload; |
||||||
|
- (RMTPayload*) payload; |
||||||
|
- (RMTSimpleResponseBuilder*) setPayload:(RMTPayload*) value; |
||||||
|
- (RMTSimpleResponseBuilder*) setPayloadBuilder:(RMTPayloadBuilder*) builderForValue; |
||||||
|
- (RMTSimpleResponseBuilder*) mergePayload:(RMTPayload*) value; |
||||||
|
- (RMTSimpleResponseBuilder*) clearPayload; |
||||||
|
|
||||||
|
- (BOOL) hasUsername; |
||||||
|
- (NSString*) username; |
||||||
|
- (RMTSimpleResponseBuilder*) setUsername:(NSString*) value; |
||||||
|
- (RMTSimpleResponseBuilder*) clearUsername; |
||||||
|
|
||||||
|
- (BOOL) hasOauthScope; |
||||||
|
- (NSString*) oauthScope; |
||||||
|
- (RMTSimpleResponseBuilder*) setOauthScope:(NSString*) value; |
||||||
|
- (RMTSimpleResponseBuilder*) clearOauthScope; |
||||||
|
@end |
||||||
|
|
||||||
|
@interface RMTStreamingInputCallRequest : PBGeneratedMessage<GeneratedMessageProtocol> { |
||||||
|
@private |
||||||
|
BOOL hasPayload_:1; |
||||||
|
RMTPayload* payload; |
||||||
|
} |
||||||
|
- (BOOL) hasPayload; |
||||||
|
@property (readonly, strong) RMTPayload* payload; |
||||||
|
|
||||||
|
+ (instancetype) defaultInstance; |
||||||
|
- (instancetype) defaultInstance; |
||||||
|
|
||||||
|
- (BOOL) isInitialized; |
||||||
|
- (void) writeToCodedOutputStream:(PBCodedOutputStream*) output; |
||||||
|
- (RMTStreamingInputCallRequestBuilder*) builder; |
||||||
|
+ (RMTStreamingInputCallRequestBuilder*) builder; |
||||||
|
+ (RMTStreamingInputCallRequestBuilder*) builderWithPrototype:(RMTStreamingInputCallRequest*) prototype; |
||||||
|
- (RMTStreamingInputCallRequestBuilder*) toBuilder; |
||||||
|
|
||||||
|
+ (RMTStreamingInputCallRequest*) parseFromData:(NSData*) data; |
||||||
|
+ (RMTStreamingInputCallRequest*) parseFromData:(NSData*) data extensionRegistry:(PBExtensionRegistry*) extensionRegistry; |
||||||
|
+ (RMTStreamingInputCallRequest*) parseFromInputStream:(NSInputStream*) input; |
||||||
|
+ (RMTStreamingInputCallRequest*) parseFromInputStream:(NSInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry; |
||||||
|
+ (RMTStreamingInputCallRequest*) parseFromCodedInputStream:(PBCodedInputStream*) input; |
||||||
|
+ (RMTStreamingInputCallRequest*) parseFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry; |
||||||
|
@end |
||||||
|
|
||||||
|
@interface RMTStreamingInputCallRequestBuilder : PBGeneratedMessageBuilder { |
||||||
|
@private |
||||||
|
RMTStreamingInputCallRequest* resultStreamingInputCallRequest; |
||||||
|
} |
||||||
|
|
||||||
|
- (RMTStreamingInputCallRequest*) defaultInstance; |
||||||
|
|
||||||
|
- (RMTStreamingInputCallRequestBuilder*) clear; |
||||||
|
- (RMTStreamingInputCallRequestBuilder*) clone; |
||||||
|
|
||||||
|
- (RMTStreamingInputCallRequest*) build; |
||||||
|
- (RMTStreamingInputCallRequest*) buildPartial; |
||||||
|
|
||||||
|
- (RMTStreamingInputCallRequestBuilder*) mergeFrom:(RMTStreamingInputCallRequest*) other; |
||||||
|
- (RMTStreamingInputCallRequestBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input; |
||||||
|
- (RMTStreamingInputCallRequestBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry; |
||||||
|
|
||||||
|
- (BOOL) hasPayload; |
||||||
|
- (RMTPayload*) payload; |
||||||
|
- (RMTStreamingInputCallRequestBuilder*) setPayload:(RMTPayload*) value; |
||||||
|
- (RMTStreamingInputCallRequestBuilder*) setPayloadBuilder:(RMTPayloadBuilder*) builderForValue; |
||||||
|
- (RMTStreamingInputCallRequestBuilder*) mergePayload:(RMTPayload*) value; |
||||||
|
- (RMTStreamingInputCallRequestBuilder*) clearPayload; |
||||||
|
@end |
||||||
|
|
||||||
|
@interface RMTStreamingInputCallResponse : PBGeneratedMessage<GeneratedMessageProtocol> { |
||||||
|
@private |
||||||
|
BOOL hasAggregatedPayloadSize_:1; |
||||||
|
SInt32 aggregatedPayloadSize; |
||||||
|
} |
||||||
|
- (BOOL) hasAggregatedPayloadSize; |
||||||
|
@property (readonly) SInt32 aggregatedPayloadSize; |
||||||
|
|
||||||
|
+ (instancetype) defaultInstance; |
||||||
|
- (instancetype) defaultInstance; |
||||||
|
|
||||||
|
- (BOOL) isInitialized; |
||||||
|
- (void) writeToCodedOutputStream:(PBCodedOutputStream*) output; |
||||||
|
- (RMTStreamingInputCallResponseBuilder*) builder; |
||||||
|
+ (RMTStreamingInputCallResponseBuilder*) builder; |
||||||
|
+ (RMTStreamingInputCallResponseBuilder*) builderWithPrototype:(RMTStreamingInputCallResponse*) prototype; |
||||||
|
- (RMTStreamingInputCallResponseBuilder*) toBuilder; |
||||||
|
|
||||||
|
+ (RMTStreamingInputCallResponse*) parseFromData:(NSData*) data; |
||||||
|
+ (RMTStreamingInputCallResponse*) parseFromData:(NSData*) data extensionRegistry:(PBExtensionRegistry*) extensionRegistry; |
||||||
|
+ (RMTStreamingInputCallResponse*) parseFromInputStream:(NSInputStream*) input; |
||||||
|
+ (RMTStreamingInputCallResponse*) parseFromInputStream:(NSInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry; |
||||||
|
+ (RMTStreamingInputCallResponse*) parseFromCodedInputStream:(PBCodedInputStream*) input; |
||||||
|
+ (RMTStreamingInputCallResponse*) parseFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry; |
||||||
|
@end |
||||||
|
|
||||||
|
@interface RMTStreamingInputCallResponseBuilder : PBGeneratedMessageBuilder { |
||||||
|
@private |
||||||
|
RMTStreamingInputCallResponse* resultStreamingInputCallResponse; |
||||||
|
} |
||||||
|
|
||||||
|
- (RMTStreamingInputCallResponse*) defaultInstance; |
||||||
|
|
||||||
|
- (RMTStreamingInputCallResponseBuilder*) clear; |
||||||
|
- (RMTStreamingInputCallResponseBuilder*) clone; |
||||||
|
|
||||||
|
- (RMTStreamingInputCallResponse*) build; |
||||||
|
- (RMTStreamingInputCallResponse*) buildPartial; |
||||||
|
|
||||||
|
- (RMTStreamingInputCallResponseBuilder*) mergeFrom:(RMTStreamingInputCallResponse*) other; |
||||||
|
- (RMTStreamingInputCallResponseBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input; |
||||||
|
- (RMTStreamingInputCallResponseBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry; |
||||||
|
|
||||||
|
- (BOOL) hasAggregatedPayloadSize; |
||||||
|
- (SInt32) aggregatedPayloadSize; |
||||||
|
- (RMTStreamingInputCallResponseBuilder*) setAggregatedPayloadSize:(SInt32) value; |
||||||
|
- (RMTStreamingInputCallResponseBuilder*) clearAggregatedPayloadSize; |
||||||
|
@end |
||||||
|
|
||||||
|
@interface RMTResponseParameters : PBGeneratedMessage<GeneratedMessageProtocol> { |
||||||
|
@private |
||||||
|
BOOL hasSize_:1; |
||||||
|
BOOL hasIntervalUs_:1; |
||||||
|
SInt32 size; |
||||||
|
SInt32 intervalUs; |
||||||
|
} |
||||||
|
- (BOOL) hasSize; |
||||||
|
- (BOOL) hasIntervalUs; |
||||||
|
@property (readonly) SInt32 size; |
||||||
|
@property (readonly) SInt32 intervalUs; |
||||||
|
|
||||||
|
+ (instancetype) defaultInstance; |
||||||
|
- (instancetype) defaultInstance; |
||||||
|
|
||||||
|
- (BOOL) isInitialized; |
||||||
|
- (void) writeToCodedOutputStream:(PBCodedOutputStream*) output; |
||||||
|
- (RMTResponseParametersBuilder*) builder; |
||||||
|
+ (RMTResponseParametersBuilder*) builder; |
||||||
|
+ (RMTResponseParametersBuilder*) builderWithPrototype:(RMTResponseParameters*) prototype; |
||||||
|
- (RMTResponseParametersBuilder*) toBuilder; |
||||||
|
|
||||||
|
+ (RMTResponseParameters*) parseFromData:(NSData*) data; |
||||||
|
+ (RMTResponseParameters*) parseFromData:(NSData*) data extensionRegistry:(PBExtensionRegistry*) extensionRegistry; |
||||||
|
+ (RMTResponseParameters*) parseFromInputStream:(NSInputStream*) input; |
||||||
|
+ (RMTResponseParameters*) parseFromInputStream:(NSInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry; |
||||||
|
+ (RMTResponseParameters*) parseFromCodedInputStream:(PBCodedInputStream*) input; |
||||||
|
+ (RMTResponseParameters*) parseFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry; |
||||||
|
@end |
||||||
|
|
||||||
|
@interface RMTResponseParametersBuilder : PBGeneratedMessageBuilder { |
||||||
|
@private |
||||||
|
RMTResponseParameters* resultResponseParameters; |
||||||
|
} |
||||||
|
|
||||||
|
- (RMTResponseParameters*) defaultInstance; |
||||||
|
|
||||||
|
- (RMTResponseParametersBuilder*) clear; |
||||||
|
- (RMTResponseParametersBuilder*) clone; |
||||||
|
|
||||||
|
- (RMTResponseParameters*) build; |
||||||
|
- (RMTResponseParameters*) buildPartial; |
||||||
|
|
||||||
|
- (RMTResponseParametersBuilder*) mergeFrom:(RMTResponseParameters*) other; |
||||||
|
- (RMTResponseParametersBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input; |
||||||
|
- (RMTResponseParametersBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry; |
||||||
|
|
||||||
|
- (BOOL) hasSize; |
||||||
|
- (SInt32) size; |
||||||
|
- (RMTResponseParametersBuilder*) setSize:(SInt32) value; |
||||||
|
- (RMTResponseParametersBuilder*) clearSize; |
||||||
|
|
||||||
|
- (BOOL) hasIntervalUs; |
||||||
|
- (SInt32) intervalUs; |
||||||
|
- (RMTResponseParametersBuilder*) setIntervalUs:(SInt32) value; |
||||||
|
- (RMTResponseParametersBuilder*) clearIntervalUs; |
||||||
|
@end |
||||||
|
|
||||||
|
@interface RMTStreamingOutputCallRequest : PBGeneratedMessage<GeneratedMessageProtocol> { |
||||||
|
@private |
||||||
|
BOOL hasPayload_:1; |
||||||
|
BOOL hasResponseType_:1; |
||||||
|
RMTPayload* payload; |
||||||
|
RMTPayloadType responseType; |
||||||
|
NSMutableArray * responseParametersArray; |
||||||
|
} |
||||||
|
- (BOOL) hasResponseType; |
||||||
|
- (BOOL) hasPayload; |
||||||
|
@property (readonly) RMTPayloadType responseType; |
||||||
|
@property (readonly, strong) NSArray * responseParameters; |
||||||
|
@property (readonly, strong) RMTPayload* payload; |
||||||
|
- (RMTResponseParameters*)responseParametersAtIndex:(NSUInteger)index; |
||||||
|
|
||||||
|
+ (instancetype) defaultInstance; |
||||||
|
- (instancetype) defaultInstance; |
||||||
|
|
||||||
|
- (BOOL) isInitialized; |
||||||
|
- (void) writeToCodedOutputStream:(PBCodedOutputStream*) output; |
||||||
|
- (RMTStreamingOutputCallRequestBuilder*) builder; |
||||||
|
+ (RMTStreamingOutputCallRequestBuilder*) builder; |
||||||
|
+ (RMTStreamingOutputCallRequestBuilder*) builderWithPrototype:(RMTStreamingOutputCallRequest*) prototype; |
||||||
|
- (RMTStreamingOutputCallRequestBuilder*) toBuilder; |
||||||
|
|
||||||
|
+ (RMTStreamingOutputCallRequest*) parseFromData:(NSData*) data; |
||||||
|
+ (RMTStreamingOutputCallRequest*) parseFromData:(NSData*) data extensionRegistry:(PBExtensionRegistry*) extensionRegistry; |
||||||
|
+ (RMTStreamingOutputCallRequest*) parseFromInputStream:(NSInputStream*) input; |
||||||
|
+ (RMTStreamingOutputCallRequest*) parseFromInputStream:(NSInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry; |
||||||
|
+ (RMTStreamingOutputCallRequest*) parseFromCodedInputStream:(PBCodedInputStream*) input; |
||||||
|
+ (RMTStreamingOutputCallRequest*) parseFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry; |
||||||
|
@end |
||||||
|
|
||||||
|
@interface RMTStreamingOutputCallRequestBuilder : PBGeneratedMessageBuilder { |
||||||
|
@private |
||||||
|
RMTStreamingOutputCallRequest* resultStreamingOutputCallRequest; |
||||||
|
} |
||||||
|
|
||||||
|
- (RMTStreamingOutputCallRequest*) defaultInstance; |
||||||
|
|
||||||
|
- (RMTStreamingOutputCallRequestBuilder*) clear; |
||||||
|
- (RMTStreamingOutputCallRequestBuilder*) clone; |
||||||
|
|
||||||
|
- (RMTStreamingOutputCallRequest*) build; |
||||||
|
- (RMTStreamingOutputCallRequest*) buildPartial; |
||||||
|
|
||||||
|
- (RMTStreamingOutputCallRequestBuilder*) mergeFrom:(RMTStreamingOutputCallRequest*) other; |
||||||
|
- (RMTStreamingOutputCallRequestBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input; |
||||||
|
- (RMTStreamingOutputCallRequestBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry; |
||||||
|
|
||||||
|
- (BOOL) hasResponseType; |
||||||
|
- (RMTPayloadType) responseType; |
||||||
|
- (RMTStreamingOutputCallRequestBuilder*) setResponseType:(RMTPayloadType) value; |
||||||
|
- (RMTStreamingOutputCallRequestBuilder*) clearResponseType; |
||||||
|
|
||||||
|
- (NSMutableArray *)responseParameters; |
||||||
|
- (RMTResponseParameters*)responseParametersAtIndex:(NSUInteger)index; |
||||||
|
- (RMTStreamingOutputCallRequestBuilder *)addResponseParameters:(RMTResponseParameters*)value; |
||||||
|
- (RMTStreamingOutputCallRequestBuilder *)setResponseParametersArray:(NSArray *)array; |
||||||
|
- (RMTStreamingOutputCallRequestBuilder *)clearResponseParameters; |
||||||
|
|
||||||
|
- (BOOL) hasPayload; |
||||||
|
- (RMTPayload*) payload; |
||||||
|
- (RMTStreamingOutputCallRequestBuilder*) setPayload:(RMTPayload*) value; |
||||||
|
- (RMTStreamingOutputCallRequestBuilder*) setPayloadBuilder:(RMTPayloadBuilder*) builderForValue; |
||||||
|
- (RMTStreamingOutputCallRequestBuilder*) mergePayload:(RMTPayload*) value; |
||||||
|
- (RMTStreamingOutputCallRequestBuilder*) clearPayload; |
||||||
|
@end |
||||||
|
|
||||||
|
@interface RMTStreamingOutputCallResponse : PBGeneratedMessage<GeneratedMessageProtocol> { |
||||||
|
@private |
||||||
|
BOOL hasPayload_:1; |
||||||
|
RMTPayload* payload; |
||||||
|
} |
||||||
|
- (BOOL) hasPayload; |
||||||
|
@property (readonly, strong) RMTPayload* payload; |
||||||
|
|
||||||
|
+ (instancetype) defaultInstance; |
||||||
|
- (instancetype) defaultInstance; |
||||||
|
|
||||||
|
- (BOOL) isInitialized; |
||||||
|
- (void) writeToCodedOutputStream:(PBCodedOutputStream*) output; |
||||||
|
- (RMTStreamingOutputCallResponseBuilder*) builder; |
||||||
|
+ (RMTStreamingOutputCallResponseBuilder*) builder; |
||||||
|
+ (RMTStreamingOutputCallResponseBuilder*) builderWithPrototype:(RMTStreamingOutputCallResponse*) prototype; |
||||||
|
- (RMTStreamingOutputCallResponseBuilder*) toBuilder; |
||||||
|
|
||||||
|
+ (RMTStreamingOutputCallResponse*) parseFromData:(NSData*) data; |
||||||
|
+ (RMTStreamingOutputCallResponse*) parseFromData:(NSData*) data extensionRegistry:(PBExtensionRegistry*) extensionRegistry; |
||||||
|
+ (RMTStreamingOutputCallResponse*) parseFromInputStream:(NSInputStream*) input; |
||||||
|
+ (RMTStreamingOutputCallResponse*) parseFromInputStream:(NSInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry; |
||||||
|
+ (RMTStreamingOutputCallResponse*) parseFromCodedInputStream:(PBCodedInputStream*) input; |
||||||
|
+ (RMTStreamingOutputCallResponse*) parseFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry; |
||||||
|
@end |
||||||
|
|
||||||
|
@interface RMTStreamingOutputCallResponseBuilder : PBGeneratedMessageBuilder { |
||||||
|
@private |
||||||
|
RMTStreamingOutputCallResponse* resultStreamingOutputCallResponse; |
||||||
|
} |
||||||
|
|
||||||
|
- (RMTStreamingOutputCallResponse*) defaultInstance; |
||||||
|
|
||||||
|
- (RMTStreamingOutputCallResponseBuilder*) clear; |
||||||
|
- (RMTStreamingOutputCallResponseBuilder*) clone; |
||||||
|
|
||||||
|
- (RMTStreamingOutputCallResponse*) build; |
||||||
|
- (RMTStreamingOutputCallResponse*) buildPartial; |
||||||
|
|
||||||
|
- (RMTStreamingOutputCallResponseBuilder*) mergeFrom:(RMTStreamingOutputCallResponse*) other; |
||||||
|
- (RMTStreamingOutputCallResponseBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input; |
||||||
|
- (RMTStreamingOutputCallResponseBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry; |
||||||
|
|
||||||
|
- (BOOL) hasPayload; |
||||||
|
- (RMTPayload*) payload; |
||||||
|
- (RMTStreamingOutputCallResponseBuilder*) setPayload:(RMTPayload*) value; |
||||||
|
- (RMTStreamingOutputCallResponseBuilder*) setPayloadBuilder:(RMTPayloadBuilder*) builderForValue; |
||||||
|
- (RMTStreamingOutputCallResponseBuilder*) mergePayload:(RMTPayload*) value; |
||||||
|
- (RMTStreamingOutputCallResponseBuilder*) clearPayload; |
||||||
|
@end |
||||||
|
|
||||||
|
|
||||||
|
// @@protoc_insertion_point(global_scope)
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,17 @@ |
|||||||
|
Pod::Spec.new do |s| |
||||||
|
s.name = 'RemoteTest' |
||||||
|
s.version = '0.0.1' |
||||||
|
s.summary = 'Protobuf library generated from test.proto, messages.proto, and empty.proto' |
||||||
|
s.homepage = 'https://github.com/grpc/grpc/tree/master/src/objective-c/examples/Sample/RemoteTestClient' |
||||||
|
s.license = 'New BSD' |
||||||
|
s.authors = { 'Jorge Canizales' => 'jcanizales@google.com' } |
||||||
|
|
||||||
|
s.source_files = '*.pb.{h,m}' |
||||||
|
s.public_header_files = '*.pb.h' |
||||||
|
|
||||||
|
s.platform = :ios |
||||||
|
s.ios.deployment_target = '6.0' |
||||||
|
s.requires_arc = true |
||||||
|
|
||||||
|
s.dependency 'ProtocolBuffers', '~> 1.9' |
||||||
|
end |
@ -0,0 +1,81 @@ |
|||||||
|
// Generated by the protocol buffer compiler. DO NOT EDIT!
|
||||||
|
|
||||||
|
#import <ProtocolBuffers/ProtocolBuffers.h> |
||||||
|
|
||||||
|
#import "Empty.pb.h" |
||||||
|
#import "Messages.pb.h" |
||||||
|
// @@protoc_insertion_point(imports)
|
||||||
|
|
||||||
|
@class ObjectiveCFileOptions; |
||||||
|
@class ObjectiveCFileOptionsBuilder; |
||||||
|
@class PBDescriptorProto; |
||||||
|
@class PBDescriptorProtoBuilder; |
||||||
|
@class PBDescriptorProtoExtensionRange; |
||||||
|
@class PBDescriptorProtoExtensionRangeBuilder; |
||||||
|
@class PBEnumDescriptorProto; |
||||||
|
@class PBEnumDescriptorProtoBuilder; |
||||||
|
@class PBEnumOptions; |
||||||
|
@class PBEnumOptionsBuilder; |
||||||
|
@class PBEnumValueDescriptorProto; |
||||||
|
@class PBEnumValueDescriptorProtoBuilder; |
||||||
|
@class PBEnumValueOptions; |
||||||
|
@class PBEnumValueOptionsBuilder; |
||||||
|
@class PBFieldDescriptorProto; |
||||||
|
@class PBFieldDescriptorProtoBuilder; |
||||||
|
@class PBFieldOptions; |
||||||
|
@class PBFieldOptionsBuilder; |
||||||
|
@class PBFileDescriptorProto; |
||||||
|
@class PBFileDescriptorProtoBuilder; |
||||||
|
@class PBFileDescriptorSet; |
||||||
|
@class PBFileDescriptorSetBuilder; |
||||||
|
@class PBFileOptions; |
||||||
|
@class PBFileOptionsBuilder; |
||||||
|
@class PBMessageOptions; |
||||||
|
@class PBMessageOptionsBuilder; |
||||||
|
@class PBMethodDescriptorProto; |
||||||
|
@class PBMethodDescriptorProtoBuilder; |
||||||
|
@class PBMethodOptions; |
||||||
|
@class PBMethodOptionsBuilder; |
||||||
|
@class PBOneofDescriptorProto; |
||||||
|
@class PBOneofDescriptorProtoBuilder; |
||||||
|
@class PBServiceDescriptorProto; |
||||||
|
@class PBServiceDescriptorProtoBuilder; |
||||||
|
@class PBServiceOptions; |
||||||
|
@class PBServiceOptionsBuilder; |
||||||
|
@class PBSourceCodeInfo; |
||||||
|
@class PBSourceCodeInfoBuilder; |
||||||
|
@class PBSourceCodeInfoLocation; |
||||||
|
@class PBSourceCodeInfoLocationBuilder; |
||||||
|
@class PBUninterpretedOption; |
||||||
|
@class PBUninterpretedOptionBuilder; |
||||||
|
@class PBUninterpretedOptionNamePart; |
||||||
|
@class PBUninterpretedOptionNamePartBuilder; |
||||||
|
@class RMTEmpty; |
||||||
|
@class RMTEmptyBuilder; |
||||||
|
@class RMTPayload; |
||||||
|
@class RMTPayloadBuilder; |
||||||
|
@class RMTResponseParameters; |
||||||
|
@class RMTResponseParametersBuilder; |
||||||
|
@class RMTSimpleRequest; |
||||||
|
@class RMTSimpleRequestBuilder; |
||||||
|
@class RMTSimpleResponse; |
||||||
|
@class RMTSimpleResponseBuilder; |
||||||
|
@class RMTStreamingInputCallRequest; |
||||||
|
@class RMTStreamingInputCallRequestBuilder; |
||||||
|
@class RMTStreamingInputCallResponse; |
||||||
|
@class RMTStreamingInputCallResponseBuilder; |
||||||
|
@class RMTStreamingOutputCallRequest; |
||||||
|
@class RMTStreamingOutputCallRequestBuilder; |
||||||
|
@class RMTStreamingOutputCallResponse; |
||||||
|
@class RMTStreamingOutputCallResponseBuilder; |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@interface RMTTestRoot : NSObject { |
||||||
|
} |
||||||
|
+ (PBExtensionRegistry*) extensionRegistry; |
||||||
|
+ (void) registerAllExtensions:(PBMutableExtensionRegistry*) registry; |
||||||
|
@end |
||||||
|
|
||||||
|
|
||||||
|
// @@protoc_insertion_point(global_scope)
|
@ -0,0 +1,27 @@ |
|||||||
|
// Generated by the protocol buffer compiler. DO NOT EDIT! |
||||||
|
|
||||||
|
#import "Test.pb.h" |
||||||
|
// @@protoc_insertion_point(imports) |
||||||
|
|
||||||
|
@implementation RMTTestRoot |
||||||
|
static PBExtensionRegistry* extensionRegistry = nil; |
||||||
|
+ (PBExtensionRegistry*) extensionRegistry { |
||||||
|
return extensionRegistry; |
||||||
|
} |
||||||
|
|
||||||
|
+ (void) initialize { |
||||||
|
if (self == [RMTTestRoot class]) { |
||||||
|
PBMutableExtensionRegistry* registry = [PBMutableExtensionRegistry registry]; |
||||||
|
[self registerAllExtensions:registry]; |
||||||
|
[RMTEmptyRoot registerAllExtensions:registry]; |
||||||
|
[RMTMessagesRoot registerAllExtensions:registry]; |
||||||
|
[ObjectivecDescriptorRoot registerAllExtensions:registry]; |
||||||
|
extensionRegistry = registry; |
||||||
|
} |
||||||
|
} |
||||||
|
+ (void) registerAllExtensions:(PBMutableExtensionRegistry*) registry { |
||||||
|
} |
||||||
|
@end |
||||||
|
|
||||||
|
|
||||||
|
// @@protoc_insertion_point(global_scope) |
@ -0,0 +1,135 @@ |
|||||||
|
// Copyright 2015, Google Inc. |
||||||
|
// All rights reserved. |
||||||
|
// |
||||||
|
// Redistribution and use in source and binary forms, with or without |
||||||
|
// modification, are permitted provided that the following conditions are |
||||||
|
// met: |
||||||
|
// |
||||||
|
// * Redistributions of source code must retain the above copyright |
||||||
|
// notice, this list of conditions and the following disclaimer. |
||||||
|
// * Redistributions in binary form must reproduce the above |
||||||
|
// copyright notice, this list of conditions and the following disclaimer |
||||||
|
// in the documentation and/or other materials provided with the |
||||||
|
// distribution. |
||||||
|
// * Neither the name of Google Inc. nor the names of its |
||||||
|
// contributors may be used to endorse or promote products derived from |
||||||
|
// this software without specific prior written permission. |
||||||
|
// |
||||||
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||||
|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||||
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||||
|
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||||
|
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||||
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||||
|
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||||
|
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||||
|
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||||
|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||||
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||||
|
|
||||||
|
// Message definitions to be used by integration test service definitions. |
||||||
|
|
||||||
|
syntax = "proto2"; |
||||||
|
|
||||||
|
import "google/protobuf/objectivec-descriptor.proto"; |
||||||
|
|
||||||
|
package grpc.testing; |
||||||
|
|
||||||
|
option (google.protobuf.objectivec_file_options).class_prefix = "RMT"; |
||||||
|
|
||||||
|
// The type of payload that should be returned. |
||||||
|
enum PayloadType { |
||||||
|
// Compressable text format. |
||||||
|
COMPRESSABLE = 0; |
||||||
|
|
||||||
|
// Uncompressable binary format. |
||||||
|
UNCOMPRESSABLE = 1; |
||||||
|
|
||||||
|
// Randomly chosen from all other formats defined in this enum. |
||||||
|
RANDOM = 2; |
||||||
|
} |
||||||
|
|
||||||
|
// A block of data, to simply increase gRPC message size. |
||||||
|
message Payload { |
||||||
|
// The type of data in body. |
||||||
|
optional PayloadType type = 1; |
||||||
|
// Primary contents of payload. |
||||||
|
optional bytes body = 2; |
||||||
|
} |
||||||
|
|
||||||
|
// Unary request. |
||||||
|
message SimpleRequest { |
||||||
|
// Desired payload type in the response from the server. |
||||||
|
// If response_type is RANDOM, server randomly chooses one from other formats. |
||||||
|
optional PayloadType response_type = 1; |
||||||
|
|
||||||
|
// Desired payload size in the response from the server. |
||||||
|
// If response_type is COMPRESSABLE, this denotes the size before compression. |
||||||
|
optional int32 response_size = 2; |
||||||
|
|
||||||
|
// Optional input payload sent along with the request. |
||||||
|
optional Payload payload = 3; |
||||||
|
|
||||||
|
// Whether SimpleResponse should include username. |
||||||
|
optional bool fill_username = 4; |
||||||
|
|
||||||
|
// Whether SimpleResponse should include OAuth scope. |
||||||
|
optional bool fill_oauth_scope = 5; |
||||||
|
} |
||||||
|
|
||||||
|
// Unary response, as configured by the request. |
||||||
|
message SimpleResponse { |
||||||
|
// Payload to increase message size. |
||||||
|
optional Payload payload = 1; |
||||||
|
// The user the request came from, for verifying authentication was |
||||||
|
// successful when the client expected it. |
||||||
|
optional string username = 2; |
||||||
|
// OAuth scope. |
||||||
|
optional string oauth_scope = 3; |
||||||
|
} |
||||||
|
|
||||||
|
// Client-streaming request. |
||||||
|
message StreamingInputCallRequest { |
||||||
|
// Optional input payload sent along with the request. |
||||||
|
optional Payload payload = 1; |
||||||
|
|
||||||
|
// Not expecting any payload from the response. |
||||||
|
} |
||||||
|
|
||||||
|
// Client-streaming response. |
||||||
|
message StreamingInputCallResponse { |
||||||
|
// Aggregated size of payloads received from the client. |
||||||
|
optional int32 aggregated_payload_size = 1; |
||||||
|
} |
||||||
|
|
||||||
|
// Configuration for a particular response. |
||||||
|
message ResponseParameters { |
||||||
|
// Desired payload sizes in responses from the server. |
||||||
|
// If response_type is COMPRESSABLE, this denotes the size before compression. |
||||||
|
optional int32 size = 1; |
||||||
|
|
||||||
|
// Desired interval between consecutive responses in the response stream in |
||||||
|
// microseconds. |
||||||
|
optional int32 interval_us = 2; |
||||||
|
} |
||||||
|
|
||||||
|
// Server-streaming request. |
||||||
|
message StreamingOutputCallRequest { |
||||||
|
// Desired payload type in the response from the server. |
||||||
|
// If response_type is RANDOM, the payload from each response in the stream |
||||||
|
// might be of different types. This is to simulate a mixed type of payload |
||||||
|
// stream. |
||||||
|
optional PayloadType response_type = 1; |
||||||
|
|
||||||
|
// Configuration for each expected response message. |
||||||
|
repeated ResponseParameters response_parameters = 2; |
||||||
|
|
||||||
|
// Optional input payload sent along with the request. |
||||||
|
optional Payload payload = 3; |
||||||
|
} |
||||||
|
|
||||||
|
// Server-streaming response, as configured by the request and parameters. |
||||||
|
message StreamingOutputCallResponse { |
||||||
|
// Payload to increase response size. |
||||||
|
optional Payload payload = 1; |
||||||
|
} |
@ -0,0 +1,74 @@ |
|||||||
|
// Copyright 2015, Google Inc. |
||||||
|
// All rights reserved. |
||||||
|
// |
||||||
|
// Redistribution and use in source and binary forms, with or without |
||||||
|
// modification, are permitted provided that the following conditions are |
||||||
|
// met: |
||||||
|
// |
||||||
|
// * Redistributions of source code must retain the above copyright |
||||||
|
// notice, this list of conditions and the following disclaimer. |
||||||
|
// * Redistributions in binary form must reproduce the above |
||||||
|
// copyright notice, this list of conditions and the following disclaimer |
||||||
|
// in the documentation and/or other materials provided with the |
||||||
|
// distribution. |
||||||
|
// * Neither the name of Google Inc. nor the names of its |
||||||
|
// contributors may be used to endorse or promote products derived from |
||||||
|
// this software without specific prior written permission. |
||||||
|
// |
||||||
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||||
|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||||
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||||
|
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||||
|
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||||
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||||
|
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||||
|
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||||
|
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||||
|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||||
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||||
|
|
||||||
|
// An integration test service that covers all the method signature permutations |
||||||
|
// of unary/streaming requests/responses. |
||||||
|
syntax = "proto2"; |
||||||
|
|
||||||
|
import "empty.proto"; |
||||||
|
import "messages.proto"; |
||||||
|
import "google/protobuf/objectivec-descriptor.proto"; |
||||||
|
|
||||||
|
package grpc.testing; |
||||||
|
|
||||||
|
option (google.protobuf.objectivec_file_options).class_prefix = "RMT"; |
||||||
|
|
||||||
|
// A simple service to test the various types of RPCs and experiment with |
||||||
|
// performance with various types of payload. |
||||||
|
service TestService { |
||||||
|
// One empty request followed by one empty response. |
||||||
|
rpc EmptyCall(grpc.testing.Empty) returns (grpc.testing.Empty); |
||||||
|
|
||||||
|
// One request followed by one response. |
||||||
|
// TODO(Issue 527): Describe required server behavior. |
||||||
|
rpc UnaryCall(SimpleRequest) returns (SimpleResponse); |
||||||
|
|
||||||
|
// One request followed by a sequence of responses (streamed download). |
||||||
|
// The server returns the payload with client desired type and sizes. |
||||||
|
// rpc StreamingOutputCall(StreamingOutputCallRequest) |
||||||
|
// returns (stream StreamingOutputCallResponse); |
||||||
|
|
||||||
|
// A sequence of requests followed by one response (streamed upload). |
||||||
|
// The server returns the aggregated size of client payload as the result. |
||||||
|
// rpc StreamingInputCall(stream StreamingInputCallRequest) |
||||||
|
// returns (StreamingInputCallResponse); |
||||||
|
|
||||||
|
// A sequence of requests with each request served by the server immediately. |
||||||
|
// As one request could lead to multiple responses, this interface |
||||||
|
// demonstrates the idea of full duplexing. |
||||||
|
// rpc FullDuplexCall(stream StreamingOutputCallRequest) |
||||||
|
// returns (stream StreamingOutputCallResponse); |
||||||
|
|
||||||
|
// A sequence of requests followed by a sequence of responses. |
||||||
|
// The server buffers all the client requests and then serves them in order. A |
||||||
|
// stream of responses are returned to the client when the server starts with |
||||||
|
// first request. |
||||||
|
// rpc HalfDuplexCall(stream StreamingOutputCallRequest) |
||||||
|
// returns (stream StreamingOutputCallResponse); |
||||||
|
} |
@ -0,0 +1,387 @@ |
|||||||
|
// Generated by the protocol buffer compiler. DO NOT EDIT!
|
||||||
|
|
||||||
|
#import <ProtocolBuffers/ProtocolBuffers.h> |
||||||
|
|
||||||
|
// @@protoc_insertion_point(imports)
|
||||||
|
|
||||||
|
@class ObjectiveCFileOptions; |
||||||
|
@class ObjectiveCFileOptionsBuilder; |
||||||
|
@class PBDescriptorProto; |
||||||
|
@class PBDescriptorProtoBuilder; |
||||||
|
@class PBDescriptorProtoExtensionRange; |
||||||
|
@class PBDescriptorProtoExtensionRangeBuilder; |
||||||
|
@class PBEnumDescriptorProto; |
||||||
|
@class PBEnumDescriptorProtoBuilder; |
||||||
|
@class PBEnumOptions; |
||||||
|
@class PBEnumOptionsBuilder; |
||||||
|
@class PBEnumValueDescriptorProto; |
||||||
|
@class PBEnumValueDescriptorProtoBuilder; |
||||||
|
@class PBEnumValueOptions; |
||||||
|
@class PBEnumValueOptionsBuilder; |
||||||
|
@class PBFieldDescriptorProto; |
||||||
|
@class PBFieldDescriptorProtoBuilder; |
||||||
|
@class PBFieldOptions; |
||||||
|
@class PBFieldOptionsBuilder; |
||||||
|
@class PBFileDescriptorProto; |
||||||
|
@class PBFileDescriptorProtoBuilder; |
||||||
|
@class PBFileDescriptorSet; |
||||||
|
@class PBFileDescriptorSetBuilder; |
||||||
|
@class PBFileOptions; |
||||||
|
@class PBFileOptionsBuilder; |
||||||
|
@class PBMessageOptions; |
||||||
|
@class PBMessageOptionsBuilder; |
||||||
|
@class PBMethodDescriptorProto; |
||||||
|
@class PBMethodDescriptorProtoBuilder; |
||||||
|
@class PBMethodOptions; |
||||||
|
@class PBMethodOptionsBuilder; |
||||||
|
@class PBOneofDescriptorProto; |
||||||
|
@class PBOneofDescriptorProtoBuilder; |
||||||
|
@class PBServiceDescriptorProto; |
||||||
|
@class PBServiceDescriptorProtoBuilder; |
||||||
|
@class PBServiceOptions; |
||||||
|
@class PBServiceOptionsBuilder; |
||||||
|
@class PBSourceCodeInfo; |
||||||
|
@class PBSourceCodeInfoBuilder; |
||||||
|
@class PBSourceCodeInfoLocation; |
||||||
|
@class PBSourceCodeInfoLocationBuilder; |
||||||
|
@class PBUninterpretedOption; |
||||||
|
@class PBUninterpretedOptionBuilder; |
||||||
|
@class PBUninterpretedOptionNamePart; |
||||||
|
@class PBUninterpretedOptionNamePartBuilder; |
||||||
|
@class RGDFeature; |
||||||
|
@class RGDFeatureBuilder; |
||||||
|
@class RGDPoint; |
||||||
|
@class RGDPointBuilder; |
||||||
|
@class RGDRectangle; |
||||||
|
@class RGDRectangleBuilder; |
||||||
|
@class RGDRouteNote; |
||||||
|
@class RGDRouteNoteBuilder; |
||||||
|
@class RGDRouteSummary; |
||||||
|
@class RGDRouteSummaryBuilder; |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@interface RGDRouteGuideRoot : NSObject { |
||||||
|
} |
||||||
|
+ (PBExtensionRegistry*) extensionRegistry; |
||||||
|
+ (void) registerAllExtensions:(PBMutableExtensionRegistry*) registry; |
||||||
|
@end |
||||||
|
|
||||||
|
@interface RGDPoint : PBGeneratedMessage<GeneratedMessageProtocol> { |
||||||
|
@private |
||||||
|
BOOL hasLatitude_:1; |
||||||
|
BOOL hasLongitude_:1; |
||||||
|
SInt32 latitude; |
||||||
|
SInt32 longitude; |
||||||
|
} |
||||||
|
- (BOOL) hasLatitude; |
||||||
|
- (BOOL) hasLongitude; |
||||||
|
@property (readonly) SInt32 latitude; |
||||||
|
@property (readonly) SInt32 longitude; |
||||||
|
|
||||||
|
+ (instancetype) defaultInstance; |
||||||
|
- (instancetype) defaultInstance; |
||||||
|
|
||||||
|
- (BOOL) isInitialized; |
||||||
|
- (void) writeToCodedOutputStream:(PBCodedOutputStream*) output; |
||||||
|
- (RGDPointBuilder*) builder; |
||||||
|
+ (RGDPointBuilder*) builder; |
||||||
|
+ (RGDPointBuilder*) builderWithPrototype:(RGDPoint*) prototype; |
||||||
|
- (RGDPointBuilder*) toBuilder; |
||||||
|
|
||||||
|
+ (RGDPoint*) parseFromData:(NSData*) data; |
||||||
|
+ (RGDPoint*) parseFromData:(NSData*) data extensionRegistry:(PBExtensionRegistry*) extensionRegistry; |
||||||
|
+ (RGDPoint*) parseFromInputStream:(NSInputStream*) input; |
||||||
|
+ (RGDPoint*) parseFromInputStream:(NSInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry; |
||||||
|
+ (RGDPoint*) parseFromCodedInputStream:(PBCodedInputStream*) input; |
||||||
|
+ (RGDPoint*) parseFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry; |
||||||
|
@end |
||||||
|
|
||||||
|
@interface RGDPointBuilder : PBGeneratedMessageBuilder { |
||||||
|
@private |
||||||
|
RGDPoint* resultPoint; |
||||||
|
} |
||||||
|
|
||||||
|
- (RGDPoint*) defaultInstance; |
||||||
|
|
||||||
|
- (RGDPointBuilder*) clear; |
||||||
|
- (RGDPointBuilder*) clone; |
||||||
|
|
||||||
|
- (RGDPoint*) build; |
||||||
|
- (RGDPoint*) buildPartial; |
||||||
|
|
||||||
|
- (RGDPointBuilder*) mergeFrom:(RGDPoint*) other; |
||||||
|
- (RGDPointBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input; |
||||||
|
- (RGDPointBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry; |
||||||
|
|
||||||
|
- (BOOL) hasLatitude; |
||||||
|
- (SInt32) latitude; |
||||||
|
- (RGDPointBuilder*) setLatitude:(SInt32) value; |
||||||
|
- (RGDPointBuilder*) clearLatitude; |
||||||
|
|
||||||
|
- (BOOL) hasLongitude; |
||||||
|
- (SInt32) longitude; |
||||||
|
- (RGDPointBuilder*) setLongitude:(SInt32) value; |
||||||
|
- (RGDPointBuilder*) clearLongitude; |
||||||
|
@end |
||||||
|
|
||||||
|
@interface RGDRectangle : PBGeneratedMessage<GeneratedMessageProtocol> { |
||||||
|
@private |
||||||
|
BOOL hasLo_:1; |
||||||
|
BOOL hasHi_:1; |
||||||
|
RGDPoint* lo; |
||||||
|
RGDPoint* hi; |
||||||
|
} |
||||||
|
- (BOOL) hasLo; |
||||||
|
- (BOOL) hasHi; |
||||||
|
@property (readonly, strong) RGDPoint* lo; |
||||||
|
@property (readonly, strong) RGDPoint* hi; |
||||||
|
|
||||||
|
+ (instancetype) defaultInstance; |
||||||
|
- (instancetype) defaultInstance; |
||||||
|
|
||||||
|
- (BOOL) isInitialized; |
||||||
|
- (void) writeToCodedOutputStream:(PBCodedOutputStream*) output; |
||||||
|
- (RGDRectangleBuilder*) builder; |
||||||
|
+ (RGDRectangleBuilder*) builder; |
||||||
|
+ (RGDRectangleBuilder*) builderWithPrototype:(RGDRectangle*) prototype; |
||||||
|
- (RGDRectangleBuilder*) toBuilder; |
||||||
|
|
||||||
|
+ (RGDRectangle*) parseFromData:(NSData*) data; |
||||||
|
+ (RGDRectangle*) parseFromData:(NSData*) data extensionRegistry:(PBExtensionRegistry*) extensionRegistry; |
||||||
|
+ (RGDRectangle*) parseFromInputStream:(NSInputStream*) input; |
||||||
|
+ (RGDRectangle*) parseFromInputStream:(NSInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry; |
||||||
|
+ (RGDRectangle*) parseFromCodedInputStream:(PBCodedInputStream*) input; |
||||||
|
+ (RGDRectangle*) parseFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry; |
||||||
|
@end |
||||||
|
|
||||||
|
@interface RGDRectangleBuilder : PBGeneratedMessageBuilder { |
||||||
|
@private |
||||||
|
RGDRectangle* resultRectangle; |
||||||
|
} |
||||||
|
|
||||||
|
- (RGDRectangle*) defaultInstance; |
||||||
|
|
||||||
|
- (RGDRectangleBuilder*) clear; |
||||||
|
- (RGDRectangleBuilder*) clone; |
||||||
|
|
||||||
|
- (RGDRectangle*) build; |
||||||
|
- (RGDRectangle*) buildPartial; |
||||||
|
|
||||||
|
- (RGDRectangleBuilder*) mergeFrom:(RGDRectangle*) other; |
||||||
|
- (RGDRectangleBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input; |
||||||
|
- (RGDRectangleBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry; |
||||||
|
|
||||||
|
- (BOOL) hasLo; |
||||||
|
- (RGDPoint*) lo; |
||||||
|
- (RGDRectangleBuilder*) setLo:(RGDPoint*) value; |
||||||
|
- (RGDRectangleBuilder*) setLoBuilder:(RGDPointBuilder*) builderForValue; |
||||||
|
- (RGDRectangleBuilder*) mergeLo:(RGDPoint*) value; |
||||||
|
- (RGDRectangleBuilder*) clearLo; |
||||||
|
|
||||||
|
- (BOOL) hasHi; |
||||||
|
- (RGDPoint*) hi; |
||||||
|
- (RGDRectangleBuilder*) setHi:(RGDPoint*) value; |
||||||
|
- (RGDRectangleBuilder*) setHiBuilder:(RGDPointBuilder*) builderForValue; |
||||||
|
- (RGDRectangleBuilder*) mergeHi:(RGDPoint*) value; |
||||||
|
- (RGDRectangleBuilder*) clearHi; |
||||||
|
@end |
||||||
|
|
||||||
|
@interface RGDFeature : PBGeneratedMessage<GeneratedMessageProtocol> { |
||||||
|
@private |
||||||
|
BOOL hasName_:1; |
||||||
|
BOOL hasLocation_:1; |
||||||
|
NSString* name; |
||||||
|
RGDPoint* location; |
||||||
|
} |
||||||
|
- (BOOL) hasName; |
||||||
|
- (BOOL) hasLocation; |
||||||
|
@property (readonly, strong) NSString* name; |
||||||
|
@property (readonly, strong) RGDPoint* location; |
||||||
|
|
||||||
|
+ (instancetype) defaultInstance; |
||||||
|
- (instancetype) defaultInstance; |
||||||
|
|
||||||
|
- (BOOL) isInitialized; |
||||||
|
- (void) writeToCodedOutputStream:(PBCodedOutputStream*) output; |
||||||
|
- (RGDFeatureBuilder*) builder; |
||||||
|
+ (RGDFeatureBuilder*) builder; |
||||||
|
+ (RGDFeatureBuilder*) builderWithPrototype:(RGDFeature*) prototype; |
||||||
|
- (RGDFeatureBuilder*) toBuilder; |
||||||
|
|
||||||
|
+ (RGDFeature*) parseFromData:(NSData*) data; |
||||||
|
+ (RGDFeature*) parseFromData:(NSData*) data extensionRegistry:(PBExtensionRegistry*) extensionRegistry; |
||||||
|
+ (RGDFeature*) parseFromInputStream:(NSInputStream*) input; |
||||||
|
+ (RGDFeature*) parseFromInputStream:(NSInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry; |
||||||
|
+ (RGDFeature*) parseFromCodedInputStream:(PBCodedInputStream*) input; |
||||||
|
+ (RGDFeature*) parseFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry; |
||||||
|
@end |
||||||
|
|
||||||
|
@interface RGDFeatureBuilder : PBGeneratedMessageBuilder { |
||||||
|
@private |
||||||
|
RGDFeature* resultFeature; |
||||||
|
} |
||||||
|
|
||||||
|
- (RGDFeature*) defaultInstance; |
||||||
|
|
||||||
|
- (RGDFeatureBuilder*) clear; |
||||||
|
- (RGDFeatureBuilder*) clone; |
||||||
|
|
||||||
|
- (RGDFeature*) build; |
||||||
|
- (RGDFeature*) buildPartial; |
||||||
|
|
||||||
|
- (RGDFeatureBuilder*) mergeFrom:(RGDFeature*) other; |
||||||
|
- (RGDFeatureBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input; |
||||||
|
- (RGDFeatureBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry; |
||||||
|
|
||||||
|
- (BOOL) hasName; |
||||||
|
- (NSString*) name; |
||||||
|
- (RGDFeatureBuilder*) setName:(NSString*) value; |
||||||
|
- (RGDFeatureBuilder*) clearName; |
||||||
|
|
||||||
|
- (BOOL) hasLocation; |
||||||
|
- (RGDPoint*) location; |
||||||
|
- (RGDFeatureBuilder*) setLocation:(RGDPoint*) value; |
||||||
|
- (RGDFeatureBuilder*) setLocationBuilder:(RGDPointBuilder*) builderForValue; |
||||||
|
- (RGDFeatureBuilder*) mergeLocation:(RGDPoint*) value; |
||||||
|
- (RGDFeatureBuilder*) clearLocation; |
||||||
|
@end |
||||||
|
|
||||||
|
@interface RGDRouteNote : PBGeneratedMessage<GeneratedMessageProtocol> { |
||||||
|
@private |
||||||
|
BOOL hasMessage_:1; |
||||||
|
BOOL hasLocation_:1; |
||||||
|
NSString* message; |
||||||
|
RGDPoint* location; |
||||||
|
} |
||||||
|
- (BOOL) hasLocation; |
||||||
|
- (BOOL) hasMessage; |
||||||
|
@property (readonly, strong) RGDPoint* location; |
||||||
|
@property (readonly, strong) NSString* message; |
||||||
|
|
||||||
|
+ (instancetype) defaultInstance; |
||||||
|
- (instancetype) defaultInstance; |
||||||
|
|
||||||
|
- (BOOL) isInitialized; |
||||||
|
- (void) writeToCodedOutputStream:(PBCodedOutputStream*) output; |
||||||
|
- (RGDRouteNoteBuilder*) builder; |
||||||
|
+ (RGDRouteNoteBuilder*) builder; |
||||||
|
+ (RGDRouteNoteBuilder*) builderWithPrototype:(RGDRouteNote*) prototype; |
||||||
|
- (RGDRouteNoteBuilder*) toBuilder; |
||||||
|
|
||||||
|
+ (RGDRouteNote*) parseFromData:(NSData*) data; |
||||||
|
+ (RGDRouteNote*) parseFromData:(NSData*) data extensionRegistry:(PBExtensionRegistry*) extensionRegistry; |
||||||
|
+ (RGDRouteNote*) parseFromInputStream:(NSInputStream*) input; |
||||||
|
+ (RGDRouteNote*) parseFromInputStream:(NSInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry; |
||||||
|
+ (RGDRouteNote*) parseFromCodedInputStream:(PBCodedInputStream*) input; |
||||||
|
+ (RGDRouteNote*) parseFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry; |
||||||
|
@end |
||||||
|
|
||||||
|
@interface RGDRouteNoteBuilder : PBGeneratedMessageBuilder { |
||||||
|
@private |
||||||
|
RGDRouteNote* resultRouteNote; |
||||||
|
} |
||||||
|
|
||||||
|
- (RGDRouteNote*) defaultInstance; |
||||||
|
|
||||||
|
- (RGDRouteNoteBuilder*) clear; |
||||||
|
- (RGDRouteNoteBuilder*) clone; |
||||||
|
|
||||||
|
- (RGDRouteNote*) build; |
||||||
|
- (RGDRouteNote*) buildPartial; |
||||||
|
|
||||||
|
- (RGDRouteNoteBuilder*) mergeFrom:(RGDRouteNote*) other; |
||||||
|
- (RGDRouteNoteBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input; |
||||||
|
- (RGDRouteNoteBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry; |
||||||
|
|
||||||
|
- (BOOL) hasLocation; |
||||||
|
- (RGDPoint*) location; |
||||||
|
- (RGDRouteNoteBuilder*) setLocation:(RGDPoint*) value; |
||||||
|
- (RGDRouteNoteBuilder*) setLocationBuilder:(RGDPointBuilder*) builderForValue; |
||||||
|
- (RGDRouteNoteBuilder*) mergeLocation:(RGDPoint*) value; |
||||||
|
- (RGDRouteNoteBuilder*) clearLocation; |
||||||
|
|
||||||
|
- (BOOL) hasMessage; |
||||||
|
- (NSString*) message; |
||||||
|
- (RGDRouteNoteBuilder*) setMessage:(NSString*) value; |
||||||
|
- (RGDRouteNoteBuilder*) clearMessage; |
||||||
|
@end |
||||||
|
|
||||||
|
@interface RGDRouteSummary : PBGeneratedMessage<GeneratedMessageProtocol> { |
||||||
|
@private |
||||||
|
BOOL hasPointCount_:1; |
||||||
|
BOOL hasFeatureCount_:1; |
||||||
|
BOOL hasDistance_:1; |
||||||
|
BOOL hasElapsedTime_:1; |
||||||
|
SInt32 pointCount; |
||||||
|
SInt32 featureCount; |
||||||
|
SInt32 distance; |
||||||
|
SInt32 elapsedTime; |
||||||
|
} |
||||||
|
- (BOOL) hasPointCount; |
||||||
|
- (BOOL) hasFeatureCount; |
||||||
|
- (BOOL) hasDistance; |
||||||
|
- (BOOL) hasElapsedTime; |
||||||
|
@property (readonly) SInt32 pointCount; |
||||||
|
@property (readonly) SInt32 featureCount; |
||||||
|
@property (readonly) SInt32 distance; |
||||||
|
@property (readonly) SInt32 elapsedTime; |
||||||
|
|
||||||
|
+ (instancetype) defaultInstance; |
||||||
|
- (instancetype) defaultInstance; |
||||||
|
|
||||||
|
- (BOOL) isInitialized; |
||||||
|
- (void) writeToCodedOutputStream:(PBCodedOutputStream*) output; |
||||||
|
- (RGDRouteSummaryBuilder*) builder; |
||||||
|
+ (RGDRouteSummaryBuilder*) builder; |
||||||
|
+ (RGDRouteSummaryBuilder*) builderWithPrototype:(RGDRouteSummary*) prototype; |
||||||
|
- (RGDRouteSummaryBuilder*) toBuilder; |
||||||
|
|
||||||
|
+ (RGDRouteSummary*) parseFromData:(NSData*) data; |
||||||
|
+ (RGDRouteSummary*) parseFromData:(NSData*) data extensionRegistry:(PBExtensionRegistry*) extensionRegistry; |
||||||
|
+ (RGDRouteSummary*) parseFromInputStream:(NSInputStream*) input; |
||||||
|
+ (RGDRouteSummary*) parseFromInputStream:(NSInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry; |
||||||
|
+ (RGDRouteSummary*) parseFromCodedInputStream:(PBCodedInputStream*) input; |
||||||
|
+ (RGDRouteSummary*) parseFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry; |
||||||
|
@end |
||||||
|
|
||||||
|
@interface RGDRouteSummaryBuilder : PBGeneratedMessageBuilder { |
||||||
|
@private |
||||||
|
RGDRouteSummary* resultRouteSummary; |
||||||
|
} |
||||||
|
|
||||||
|
- (RGDRouteSummary*) defaultInstance; |
||||||
|
|
||||||
|
- (RGDRouteSummaryBuilder*) clear; |
||||||
|
- (RGDRouteSummaryBuilder*) clone; |
||||||
|
|
||||||
|
- (RGDRouteSummary*) build; |
||||||
|
- (RGDRouteSummary*) buildPartial; |
||||||
|
|
||||||
|
- (RGDRouteSummaryBuilder*) mergeFrom:(RGDRouteSummary*) other; |
||||||
|
- (RGDRouteSummaryBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input; |
||||||
|
- (RGDRouteSummaryBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry; |
||||||
|
|
||||||
|
- (BOOL) hasPointCount; |
||||||
|
- (SInt32) pointCount; |
||||||
|
- (RGDRouteSummaryBuilder*) setPointCount:(SInt32) value; |
||||||
|
- (RGDRouteSummaryBuilder*) clearPointCount; |
||||||
|
|
||||||
|
- (BOOL) hasFeatureCount; |
||||||
|
- (SInt32) featureCount; |
||||||
|
- (RGDRouteSummaryBuilder*) setFeatureCount:(SInt32) value; |
||||||
|
- (RGDRouteSummaryBuilder*) clearFeatureCount; |
||||||
|
|
||||||
|
- (BOOL) hasDistance; |
||||||
|
- (SInt32) distance; |
||||||
|
- (RGDRouteSummaryBuilder*) setDistance:(SInt32) value; |
||||||
|
- (RGDRouteSummaryBuilder*) clearDistance; |
||||||
|
|
||||||
|
- (BOOL) hasElapsedTime; |
||||||
|
- (SInt32) elapsedTime; |
||||||
|
- (RGDRouteSummaryBuilder*) setElapsedTime:(SInt32) value; |
||||||
|
- (RGDRouteSummaryBuilder*) clearElapsedTime; |
||||||
|
@end |
||||||
|
|
||||||
|
|
||||||
|
// @@protoc_insertion_point(global_scope)
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,17 @@ |
|||||||
|
Pod::Spec.new do |s| |
||||||
|
s.name = 'Route_guide' |
||||||
|
s.version = '0.0.1' |
||||||
|
s.summary = 'Protobuf library generated from route_guide.proto' |
||||||
|
s.homepage = 'https://github.com/grpc/grpc/tree/master/src/objective-c/examples/Sample/RouteGuideClient' |
||||||
|
s.license = 'New BSD' |
||||||
|
s.authors = { 'Jorge Canizales' => 'jcanizales@google.com' } |
||||||
|
|
||||||
|
s.source_files = '*.pb.{h,m}' |
||||||
|
s.public_header_files = '*.pb.h' |
||||||
|
|
||||||
|
s.platform = :ios |
||||||
|
s.ios.deployment_target = '6.0' |
||||||
|
s.requires_arc = true |
||||||
|
|
||||||
|
s.dependency 'ProtocolBuffers', '~> 1.9' |
||||||
|
end |
@ -0,0 +1,121 @@ |
|||||||
|
// Copyright 2015, Google Inc. |
||||||
|
// All rights reserved. |
||||||
|
// |
||||||
|
// Redistribution and use in source and binary forms, with or without |
||||||
|
// modification, are permitted provided that the following conditions are |
||||||
|
// met: |
||||||
|
// |
||||||
|
// * Redistributions of source code must retain the above copyright |
||||||
|
// notice, this list of conditions and the following disclaimer. |
||||||
|
// * Redistributions in binary form must reproduce the above |
||||||
|
// copyright notice, this list of conditions and the following disclaimer |
||||||
|
// in the documentation and/or other materials provided with the |
||||||
|
// distribution. |
||||||
|
// * Neither the name of Google Inc. nor the names of its |
||||||
|
// contributors may be used to endorse or promote products derived from |
||||||
|
// this software without specific prior written permission. |
||||||
|
// |
||||||
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||||
|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||||
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||||
|
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||||
|
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||||
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||||
|
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||||
|
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||||
|
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||||
|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||||
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||||
|
|
||||||
|
syntax = "proto2"; |
||||||
|
|
||||||
|
package grpc.example.routeguide; |
||||||
|
|
||||||
|
import "google/protobuf/objectivec-descriptor.proto"; |
||||||
|
option (google.protobuf.objectivec_file_options).class_prefix = "RGD"; |
||||||
|
|
||||||
|
// Interface exported by the server. |
||||||
|
service RouteGuide { |
||||||
|
// A simple RPC. |
||||||
|
// |
||||||
|
// Obtains the feature at a given position. |
||||||
|
rpc GetFeature(Point) returns (Feature) {} |
||||||
|
|
||||||
|
// 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. |
||||||
|
// rpc ListFeatures(Rectangle) returns (stream Feature) {} |
||||||
|
|
||||||
|
// A client-to-server streaming RPC. |
||||||
|
// |
||||||
|
// Accepts a stream of Points on a route being traversed, returning a |
||||||
|
// RouteSummary when traversal is completed. |
||||||
|
// rpc RecordRoute(stream Point) returns (RouteSummary) {} |
||||||
|
|
||||||
|
// 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). |
||||||
|
// rpc RouteChat(stream RouteNote) returns (stream RouteNote) {} |
||||||
|
} |
||||||
|
|
||||||
|
// 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). |
||||||
|
message Point { |
||||||
|
optional int32 latitude = 1; |
||||||
|
optional int32 longitude = 2; |
||||||
|
} |
||||||
|
|
||||||
|
// A latitude-longitude rectangle, represented as two diagonally opposite |
||||||
|
// points "lo" and "hi". |
||||||
|
message Rectangle { |
||||||
|
// One corner of the rectangle. |
||||||
|
optional Point lo = 1; |
||||||
|
|
||||||
|
// The other corner of the rectangle. |
||||||
|
optional Point hi = 2; |
||||||
|
} |
||||||
|
|
||||||
|
// A feature names something at a given point. |
||||||
|
// |
||||||
|
// If a feature could not be named, the name is empty. |
||||||
|
message Feature { |
||||||
|
// The name of the feature. |
||||||
|
optional string name = 1; |
||||||
|
|
||||||
|
// The point where the feature is detected. |
||||||
|
optional Point location = 2; |
||||||
|
} |
||||||
|
|
||||||
|
// A RouteNote is a message sent while at a given point. |
||||||
|
message RouteNote { |
||||||
|
// The location from which the message is sent. |
||||||
|
optional Point location = 1; |
||||||
|
|
||||||
|
// The message to be sent. |
||||||
|
optional string message = 2; |
||||||
|
} |
||||||
|
|
||||||
|
// 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. |
||||||
|
message RouteSummary { |
||||||
|
// The number of points received. |
||||||
|
optional int32 point_count = 1; |
||||||
|
|
||||||
|
// The number of known features passed while traversing the route. |
||||||
|
optional int32 feature_count = 2; |
||||||
|
|
||||||
|
// The distance covered in metres. |
||||||
|
optional int32 distance = 3; |
||||||
|
|
||||||
|
// The duration of the traversal in seconds. |
||||||
|
optional int32 elapsed_time = 4; |
||||||
|
} |
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue