xref: /aosp_15_r20/external/googleapis/google/watcher/v1/watch.proto (revision d5c09012810ac0c9f33fe448fb6da8260d444cc9)
1*d5c09012SAndroid Build Coastguard Worker// Copyright 2017 Google Inc.
2*d5c09012SAndroid Build Coastguard Worker//
3*d5c09012SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License");
4*d5c09012SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License.
5*d5c09012SAndroid Build Coastguard Worker// You may obtain a copy of the License at
6*d5c09012SAndroid Build Coastguard Worker//
7*d5c09012SAndroid Build Coastguard Worker//     http://www.apache.org/licenses/LICENSE-2.0
8*d5c09012SAndroid Build Coastguard Worker//
9*d5c09012SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software
10*d5c09012SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS,
11*d5c09012SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*d5c09012SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and
13*d5c09012SAndroid Build Coastguard Worker// limitations under the License.
14*d5c09012SAndroid Build Coastguard Worker
15*d5c09012SAndroid Build Coastguard Workersyntax = "proto3";
16*d5c09012SAndroid Build Coastguard Worker
17*d5c09012SAndroid Build Coastguard Workerpackage google.watcher.v1;
18*d5c09012SAndroid Build Coastguard Worker
19*d5c09012SAndroid Build Coastguard Workerimport "google/api/annotations.proto";
20*d5c09012SAndroid Build Coastguard Workerimport "google/protobuf/any.proto";
21*d5c09012SAndroid Build Coastguard Workerimport "google/protobuf/empty.proto";
22*d5c09012SAndroid Build Coastguard Worker
23*d5c09012SAndroid Build Coastguard Workeroption go_package = "google.golang.org/genproto/googleapis/watcher/v1;watcher";
24*d5c09012SAndroid Build Coastguard Workeroption java_multiple_files = true;
25*d5c09012SAndroid Build Coastguard Workeroption java_outer_classname = "WatchProto";
26*d5c09012SAndroid Build Coastguard Workeroption java_package = "com.google.watcher.v1";
27*d5c09012SAndroid Build Coastguard Worker
28*d5c09012SAndroid Build Coastguard Worker// ## API Overview
29*d5c09012SAndroid Build Coastguard Worker//
30*d5c09012SAndroid Build Coastguard Worker// [Watcher][] lets a client watch for updates to a named entity, such as a
31*d5c09012SAndroid Build Coastguard Worker// directory or database table. For each watched entity, the client receives a
32*d5c09012SAndroid Build Coastguard Worker// reliable stream of watch events, without re-ordering.
33*d5c09012SAndroid Build Coastguard Worker//
34*d5c09012SAndroid Build Coastguard Worker// Watching is done by sending an RPC to a service that implements the API. The
35*d5c09012SAndroid Build Coastguard Worker// argument to the RPC contains the name of the entity. The result stream
36*d5c09012SAndroid Build Coastguard Worker// consists of a sequence of Change messages that the service continues to
37*d5c09012SAndroid Build Coastguard Worker// send until the call fails or is cancelled.
38*d5c09012SAndroid Build Coastguard Worker//
39*d5c09012SAndroid Build Coastguard Worker// ## Data model
40*d5c09012SAndroid Build Coastguard Worker//
41*d5c09012SAndroid Build Coastguard Worker// This API assumes that each *entity* has a name and a
42*d5c09012SAndroid Build Coastguard Worker// set of *elements*, where each element has a name and a value. The
43*d5c09012SAndroid Build Coastguard Worker// entity's name must be a unique identifier within the service, such as
44*d5c09012SAndroid Build Coastguard Worker// a resource name. What constitutes an entity or element is
45*d5c09012SAndroid Build Coastguard Worker// implementation-specific: for example, a file system implementation
46*d5c09012SAndroid Build Coastguard Worker// might define an entity as either a directory or a file, and elements would be
47*d5c09012SAndroid Build Coastguard Worker// child files or directories of that entity.
48*d5c09012SAndroid Build Coastguard Worker//
49*d5c09012SAndroid Build Coastguard Worker// The Watch API allows a client to watch an entity E's immediate
50*d5c09012SAndroid Build Coastguard Worker// elements or the whole tree rooted at E. Elements are organized into
51*d5c09012SAndroid Build Coastguard Worker// a hierarchy ("" at the top; the rest follows the natural hierarchy of the
52*d5c09012SAndroid Build Coastguard Worker// namespace of elements that is being watched). For example, when
53*d5c09012SAndroid Build Coastguard Worker// recursively watching a filesystem namespace, X is an ancestor of
54*d5c09012SAndroid Build Coastguard Worker// X/Y and X/Y/Z).
55*d5c09012SAndroid Build Coastguard Worker//
56*d5c09012SAndroid Build Coastguard Worker// ## Watch request
57*d5c09012SAndroid Build Coastguard Worker//
58*d5c09012SAndroid Build Coastguard Worker// When a client makes a request to watch an entity, it can indicate
59*d5c09012SAndroid Build Coastguard Worker// whether it wants to receive the initial state of the entity, just
60*d5c09012SAndroid Build Coastguard Worker// new changes to the entity, or resume watching from a particular
61*d5c09012SAndroid Build Coastguard Worker// point in a previous watch stream, specified with a `resume_marker` value.
62*d5c09012SAndroid Build Coastguard Worker// It can also indicate whether it wants to watch only one entity or all
63*d5c09012SAndroid Build Coastguard Worker// entities in the subtree rooted at a particular entity's name.
64*d5c09012SAndroid Build Coastguard Worker//
65*d5c09012SAndroid Build Coastguard Worker// On receiving a watch request for an entity, the server sends one or more
66*d5c09012SAndroid Build Coastguard Worker// messages to the client. The first message informs the client that the server
67*d5c09012SAndroid Build Coastguard Worker// has registered the client's request: the instant of time when the
68*d5c09012SAndroid Build Coastguard Worker// client receives the event is referred to as the client's "watch
69*d5c09012SAndroid Build Coastguard Worker// point" for that entity.
70*d5c09012SAndroid Build Coastguard Worker//
71*d5c09012SAndroid Build Coastguard Worker// ## Atomic delivery
72*d5c09012SAndroid Build Coastguard Worker//
73*d5c09012SAndroid Build Coastguard Worker// The response stream consists of a sequence of Change messages. Each
74*d5c09012SAndroid Build Coastguard Worker// message contains an `continued` bit. A sub-sequence of Change messages with
75*d5c09012SAndroid Build Coastguard Worker// `continued=true` followed by a Change message with `continued=false` forms an
76*d5c09012SAndroid Build Coastguard Worker// *atomic group*. Systems that support multi-element atomic updates may
77*d5c09012SAndroid Build Coastguard Worker// guarantee that all changes resulting from a single atomic
78*d5c09012SAndroid Build Coastguard Worker// update are delivered in the same atomic group. It is up to the
79*d5c09012SAndroid Build Coastguard Worker// documentation of a particular system that implements the Watch API to
80*d5c09012SAndroid Build Coastguard Worker// document whether or not it supports such grouping. We expect that most
81*d5c09012SAndroid Build Coastguard Worker// callers will ignore the notion of atomic delivery and the `continued` bit,
82*d5c09012SAndroid Build Coastguard Worker// i.e., they will just process each Change message as it is received.
83*d5c09012SAndroid Build Coastguard Worker//
84*d5c09012SAndroid Build Coastguard Worker// ## Batching
85*d5c09012SAndroid Build Coastguard Worker//
86*d5c09012SAndroid Build Coastguard Worker// Multiple Change messages may be grouped into a single ChangeBatch message
87*d5c09012SAndroid Build Coastguard Worker// to reduce message transfer overhead. A single ChangeBatch may contain many
88*d5c09012SAndroid Build Coastguard Worker// atomic groups, or a single atomic group may be split across many
89*d5c09012SAndroid Build Coastguard Worker// ChangeBatch messages.
90*d5c09012SAndroid Build Coastguard Worker//
91*d5c09012SAndroid Build Coastguard Worker// ## Initial State
92*d5c09012SAndroid Build Coastguard Worker//
93*d5c09012SAndroid Build Coastguard Worker// The first atomic group delivered by a watch call is special. It is
94*d5c09012SAndroid Build Coastguard Worker// delivered as soon as possible and contains the initial state of the
95*d5c09012SAndroid Build Coastguard Worker// entity being watched. The client should consider itself caught up
96*d5c09012SAndroid Build Coastguard Worker// after processing this first atomic group.
97*d5c09012SAndroid Build Coastguard Worker//
98*d5c09012SAndroid Build Coastguard Worker// The messages in the first atomic group will either refer to the
99*d5c09012SAndroid Build Coastguard Worker// entity itself (`Change.element` == "") or to elements inside the
100*d5c09012SAndroid Build Coastguard Worker// entity (`Change.element` != ""). Here are the cases to consider:
101*d5c09012SAndroid Build Coastguard Worker//
102*d5c09012SAndroid Build Coastguard Worker// 1. `resume_marker` is "" or not specified: For every element P
103*d5c09012SAndroid Build Coastguard Worker//    (including the entity itself) that exists, there will be at least
104*d5c09012SAndroid Build Coastguard Worker//    one message delivered with element == P and the last such message
105*d5c09012SAndroid Build Coastguard Worker//    will contain the current state of P. For every element Q
106*d5c09012SAndroid Build Coastguard Worker//    (including the entity itself) that does not exist, either no
107*d5c09012SAndroid Build Coastguard Worker//    message will be delivered, or the last message for Q will have
108*d5c09012SAndroid Build Coastguard Worker//    state == DOES_NOT_EXIST. At least one message for element="" will
109*d5c09012SAndroid Build Coastguard Worker//    be delivered.
110*d5c09012SAndroid Build Coastguard Worker//
111*d5c09012SAndroid Build Coastguard Worker// 2. `resume_marker` == "now": there will be exactly one message with
112*d5c09012SAndroid Build Coastguard Worker//    element = "" and state INITIAL_STATE_SKIPPED. The client cannot
113*d5c09012SAndroid Build Coastguard Worker//    assume whether or not the entity exists after receiving this
114*d5c09012SAndroid Build Coastguard Worker//    message.
115*d5c09012SAndroid Build Coastguard Worker//
116*d5c09012SAndroid Build Coastguard Worker// 3. `resume_marker` has a value R from a preceding watch call on this
117*d5c09012SAndroid Build Coastguard Worker//    entity: The same messages as described in (1) will be delivered to
118*d5c09012SAndroid Build Coastguard Worker//    the client, except that any information implied by messages received
119*d5c09012SAndroid Build Coastguard Worker//    on the preceding call up to and including R may not be
120*d5c09012SAndroid Build Coastguard Worker//    delivered. The expectation is that the client will start with state
121*d5c09012SAndroid Build Coastguard Worker//    it had built up from the preceding watch call, apply the changes
122*d5c09012SAndroid Build Coastguard Worker//    received from this call, and build an up-to-date view of the entity
123*d5c09012SAndroid Build Coastguard Worker//    without having to fetch a potentially large amount of information
124*d5c09012SAndroid Build Coastguard Worker//    that has not changed. Note that some information that had already
125*d5c09012SAndroid Build Coastguard Worker//    been delivered by the preceding call might be delivered again.
126*d5c09012SAndroid Build Coastguard Worker//
127*d5c09012SAndroid Build Coastguard Worker// ## Ordering and Reliability
128*d5c09012SAndroid Build Coastguard Worker//
129*d5c09012SAndroid Build Coastguard Worker// The Change messages that apply to a particular element of the entity are
130*d5c09012SAndroid Build Coastguard Worker// delivered eventually in order without loss for the duration of the RPC. Note
131*d5c09012SAndroid Build Coastguard Worker// however that if multiple Changes apply to the same element, the
132*d5c09012SAndroid Build Coastguard Worker// implementation is free to suppress them and deliver just the last one. The
133*d5c09012SAndroid Build Coastguard Worker// underlying system must provide the guarantee that any relevant update
134*d5c09012SAndroid Build Coastguard Worker// received for an entity E after a client's watch point for E MUST be delivered
135*d5c09012SAndroid Build Coastguard Worker// to that client.
136*d5c09012SAndroid Build Coastguard Worker//
137*d5c09012SAndroid Build Coastguard Worker// These tight guarantees allow for the following simplifications in the client:
138*d5c09012SAndroid Build Coastguard Worker//
139*d5c09012SAndroid Build Coastguard Worker//   1. The client does not need to have a separate polling loop to make up for
140*d5c09012SAndroid Build Coastguard Worker//      missed updates.
141*d5c09012SAndroid Build Coastguard Worker//
142*d5c09012SAndroid Build Coastguard Worker//   2. The client does not need to manage timestamps/versions manually; the
143*d5c09012SAndroid Build Coastguard Worker//      last update delivered corresponds to the eventual state of the entity.
144*d5c09012SAndroid Build Coastguard Worker//
145*d5c09012SAndroid Build Coastguard Worker// Example: a calendar entry may have elements named { "starttime", "endtime",
146*d5c09012SAndroid Build Coastguard Worker// "attendees" } with corresponding values or it may have a single element name
147*d5c09012SAndroid Build Coastguard Worker// "entry" with a serialized proto for the calendar entry.
148*d5c09012SAndroid Build Coastguard Worker//
149*d5c09012SAndroid Build Coastguard Worker// ## Ordering constraints for parents/descendants
150*d5c09012SAndroid Build Coastguard Worker//
151*d5c09012SAndroid Build Coastguard Worker// The Watch API provides guarantees regarding the order in which
152*d5c09012SAndroid Build Coastguard Worker// messages for a parent and its descendants are delivered:
153*d5c09012SAndroid Build Coastguard Worker//
154*d5c09012SAndroid Build Coastguard Worker// 1. The creation of an ancestor (i.e., the first EXISTS message for
155*d5c09012SAndroid Build Coastguard Worker//    the ancestor) is reported before the creation of any of its
156*d5c09012SAndroid Build Coastguard Worker//    descendants.
157*d5c09012SAndroid Build Coastguard Worker//
158*d5c09012SAndroid Build Coastguard Worker// 2. The deletion of an ancestor (via a DOES_NOT_EXIST message)
159*d5c09012SAndroid Build Coastguard Worker//    implies the deletion of all its descendants. The service will
160*d5c09012SAndroid Build Coastguard Worker//    not deliver any messages for the descendants until the parent
161*d5c09012SAndroid Build Coastguard Worker//    has been recreated.
162*d5c09012SAndroid Build Coastguard Worker
163*d5c09012SAndroid Build Coastguard Worker// The service that a client uses to connect to the watcher system.
164*d5c09012SAndroid Build Coastguard Worker// The errors returned by the service are in the canonical error space,
165*d5c09012SAndroid Build Coastguard Worker// see [google.rpc.Code][].
166*d5c09012SAndroid Build Coastguard Workerservice Watcher {
167*d5c09012SAndroid Build Coastguard Worker  // Start a streaming RPC to get watch information from the server.
168*d5c09012SAndroid Build Coastguard Worker  rpc Watch(Request) returns (stream ChangeBatch) {
169*d5c09012SAndroid Build Coastguard Worker    option (google.api.http) = {
170*d5c09012SAndroid Build Coastguard Worker      get: "/v1/watch"
171*d5c09012SAndroid Build Coastguard Worker    };
172*d5c09012SAndroid Build Coastguard Worker  }
173*d5c09012SAndroid Build Coastguard Worker}
174*d5c09012SAndroid Build Coastguard Worker
175*d5c09012SAndroid Build Coastguard Worker// The message used by the client to register interest in an entity.
176*d5c09012SAndroid Build Coastguard Workermessage Request {
177*d5c09012SAndroid Build Coastguard Worker  // The `target` value **must** be a valid URL path pointing to an entity
178*d5c09012SAndroid Build Coastguard Worker  // to watch. Note that the service name **must** be
179*d5c09012SAndroid Build Coastguard Worker  // removed from the target field (e.g., the target field must say
180*d5c09012SAndroid Build Coastguard Worker  // "/foo/bar", not "myservice.googleapis.com/foo/bar"). A client is
181*d5c09012SAndroid Build Coastguard Worker  // also allowed to pass system-specific parameters in the URL that
182*d5c09012SAndroid Build Coastguard Worker  // are only obeyed by some implementations. Some parameters will be
183*d5c09012SAndroid Build Coastguard Worker  // implementation-specific. However, some have predefined meaning
184*d5c09012SAndroid Build Coastguard Worker  // and are listed here:
185*d5c09012SAndroid Build Coastguard Worker  //
186*d5c09012SAndroid Build Coastguard Worker  //  * recursive = true|false [default=false]
187*d5c09012SAndroid Build Coastguard Worker  //    If set to true, indicates that the client wants to watch all elements
188*d5c09012SAndroid Build Coastguard Worker  //    of entities in the subtree rooted at the entity's name in `target`. For
189*d5c09012SAndroid Build Coastguard Worker  //    descendants that are not the immediate children of the target, the
190*d5c09012SAndroid Build Coastguard Worker  //    `Change.element` will contain slashes.
191*d5c09012SAndroid Build Coastguard Worker  //
192*d5c09012SAndroid Build Coastguard Worker  //    Note that some namespaces and entities will not support recursive
193*d5c09012SAndroid Build Coastguard Worker  //    watching. When watching such an entity, a client must not set recursive
194*d5c09012SAndroid Build Coastguard Worker  //    to true. Otherwise, it will receive an `UNIMPLEMENTED` error.
195*d5c09012SAndroid Build Coastguard Worker  //
196*d5c09012SAndroid Build Coastguard Worker  // Normal URL encoding must be used inside `target`.  For example, if a query
197*d5c09012SAndroid Build Coastguard Worker  // parameter name or value, or the non-query parameter portion of `target`
198*d5c09012SAndroid Build Coastguard Worker  // contains a special character, it must be %-encoded.  We recommend that
199*d5c09012SAndroid Build Coastguard Worker  // clients and servers use their runtime's URL library to produce and consume
200*d5c09012SAndroid Build Coastguard Worker  // target values.
201*d5c09012SAndroid Build Coastguard Worker  string target = 1;
202*d5c09012SAndroid Build Coastguard Worker
203*d5c09012SAndroid Build Coastguard Worker  // The `resume_marker` specifies how much of the existing underlying state is
204*d5c09012SAndroid Build Coastguard Worker  // delivered to the client when the watch request is received by the
205*d5c09012SAndroid Build Coastguard Worker  // system. The client can set this marker in one of the following ways to get
206*d5c09012SAndroid Build Coastguard Worker  // different semantics:
207*d5c09012SAndroid Build Coastguard Worker  //
208*d5c09012SAndroid Build Coastguard Worker  // *   Parameter is not specified or has the value "".
209*d5c09012SAndroid Build Coastguard Worker  //     Semantics: Fetch initial state.
210*d5c09012SAndroid Build Coastguard Worker  //     The client wants the entity's initial state to be delivered. See the
211*d5c09012SAndroid Build Coastguard Worker  //     description in "Initial State".
212*d5c09012SAndroid Build Coastguard Worker  //
213*d5c09012SAndroid Build Coastguard Worker  // *   Parameter is set to the string "now" (UTF-8 encoding).
214*d5c09012SAndroid Build Coastguard Worker  //     Semantics: Fetch new changes only.
215*d5c09012SAndroid Build Coastguard Worker  //     The client just wants to get the changes received by the system after
216*d5c09012SAndroid Build Coastguard Worker  //     the watch point. The system may deliver changes from before the watch
217*d5c09012SAndroid Build Coastguard Worker  //     point as well.
218*d5c09012SAndroid Build Coastguard Worker  //
219*d5c09012SAndroid Build Coastguard Worker  // *   Parameter is set to a value received in an earlier
220*d5c09012SAndroid Build Coastguard Worker  //     `Change.resume_marker` field while watching the same entity.
221*d5c09012SAndroid Build Coastguard Worker  //     Semantics: Resume from a specific point.
222*d5c09012SAndroid Build Coastguard Worker  //     The client wants to receive the changes from a specific point; this
223*d5c09012SAndroid Build Coastguard Worker  //     value must correspond to a value received in the `Change.resume_marker`
224*d5c09012SAndroid Build Coastguard Worker  //     field. The system may deliver changes from before the `resume_marker`
225*d5c09012SAndroid Build Coastguard Worker  //     as well. If the system cannot resume the stream from this point (e.g.,
226*d5c09012SAndroid Build Coastguard Worker  //     if it is too far behind in the stream), it can raise the
227*d5c09012SAndroid Build Coastguard Worker  //     `FAILED_PRECONDITION` error.
228*d5c09012SAndroid Build Coastguard Worker  //
229*d5c09012SAndroid Build Coastguard Worker  // An implementation MUST support an unspecified parameter and the
230*d5c09012SAndroid Build Coastguard Worker  // empty string "" marker (initial state fetching) and the "now" marker.
231*d5c09012SAndroid Build Coastguard Worker  // It need not support resuming from a specific point.
232*d5c09012SAndroid Build Coastguard Worker  bytes resume_marker = 2;
233*d5c09012SAndroid Build Coastguard Worker}
234*d5c09012SAndroid Build Coastguard Worker
235*d5c09012SAndroid Build Coastguard Worker// A batch of Change messages.
236*d5c09012SAndroid Build Coastguard Workermessage ChangeBatch {
237*d5c09012SAndroid Build Coastguard Worker  // A list of Change messages.
238*d5c09012SAndroid Build Coastguard Worker  repeated Change changes = 1;
239*d5c09012SAndroid Build Coastguard Worker}
240*d5c09012SAndroid Build Coastguard Worker
241*d5c09012SAndroid Build Coastguard Worker// A Change indicates the most recent state of an element.
242*d5c09012SAndroid Build Coastguard Workermessage Change {
243*d5c09012SAndroid Build Coastguard Worker  // A reported value can be in one of the following states:
244*d5c09012SAndroid Build Coastguard Worker  enum State {
245*d5c09012SAndroid Build Coastguard Worker    // The element exists and its full value is included in data.
246*d5c09012SAndroid Build Coastguard Worker    EXISTS = 0;
247*d5c09012SAndroid Build Coastguard Worker
248*d5c09012SAndroid Build Coastguard Worker    // The element does not exist.
249*d5c09012SAndroid Build Coastguard Worker    DOES_NOT_EXIST = 1;
250*d5c09012SAndroid Build Coastguard Worker
251*d5c09012SAndroid Build Coastguard Worker    // Element may or may not exist. Used only for initial state delivery when
252*d5c09012SAndroid Build Coastguard Worker    // the client is not interested in fetching the initial state. See the
253*d5c09012SAndroid Build Coastguard Worker    // "Initial State" section above.
254*d5c09012SAndroid Build Coastguard Worker    INITIAL_STATE_SKIPPED = 2;
255*d5c09012SAndroid Build Coastguard Worker
256*d5c09012SAndroid Build Coastguard Worker    // The element may exist, but some error has occurred. More information is
257*d5c09012SAndroid Build Coastguard Worker    // available in the data field - the value is a serialized Status
258*d5c09012SAndroid Build Coastguard Worker    // proto (from [google.rpc.Status][])
259*d5c09012SAndroid Build Coastguard Worker    ERROR = 3;
260*d5c09012SAndroid Build Coastguard Worker  }
261*d5c09012SAndroid Build Coastguard Worker
262*d5c09012SAndroid Build Coastguard Worker  // Name of the element, interpreted relative to the entity's actual
263*d5c09012SAndroid Build Coastguard Worker  // name. "" refers to the entity itself. The element name is a valid
264*d5c09012SAndroid Build Coastguard Worker  // UTF-8 string.
265*d5c09012SAndroid Build Coastguard Worker  string element = 1;
266*d5c09012SAndroid Build Coastguard Worker
267*d5c09012SAndroid Build Coastguard Worker  // The state of the `element`.
268*d5c09012SAndroid Build Coastguard Worker  State state = 2;
269*d5c09012SAndroid Build Coastguard Worker
270*d5c09012SAndroid Build Coastguard Worker  // The actual change data. This field is present only when `state() == EXISTS`
271*d5c09012SAndroid Build Coastguard Worker  // or `state() == ERROR`. Please see
272*d5c09012SAndroid Build Coastguard Worker  // [google.protobuf.Any][google.protobuf.Any] about how to use the Any type.
273*d5c09012SAndroid Build Coastguard Worker  google.protobuf.Any data = 6;
274*d5c09012SAndroid Build Coastguard Worker
275*d5c09012SAndroid Build Coastguard Worker  // If present, provides a compact representation of all the messages that have
276*d5c09012SAndroid Build Coastguard Worker  // been received by the caller for the given entity, e.g., it could be a
277*d5c09012SAndroid Build Coastguard Worker  // sequence number or a multi-part timestamp/version vector. This marker can
278*d5c09012SAndroid Build Coastguard Worker  // be provided in the Request message, allowing the caller to resume the
279*d5c09012SAndroid Build Coastguard Worker  // stream watching at a specific point without fetching the initial state.
280*d5c09012SAndroid Build Coastguard Worker  bytes resume_marker = 4;
281*d5c09012SAndroid Build Coastguard Worker
282*d5c09012SAndroid Build Coastguard Worker  // If true, this Change is followed by more Changes that are in the same group
283*d5c09012SAndroid Build Coastguard Worker  // as this Change.
284*d5c09012SAndroid Build Coastguard Worker  bool continued = 5;
285*d5c09012SAndroid Build Coastguard Worker}
286