xref: /aosp_15_r20/external/pigweed/pw_rpc/protocol.rst (revision 61c4878ac05f98d0ceed94b57d316916de578985)
1*61c4878aSAndroid Build Coastguard Worker.. _module-pw_rpc-protocol:
2*61c4878aSAndroid Build Coastguard Worker
3*61c4878aSAndroid Build Coastguard Worker===============
4*61c4878aSAndroid Build Coastguard WorkerPacket protocol
5*61c4878aSAndroid Build Coastguard Worker===============
6*61c4878aSAndroid Build Coastguard Worker.. pigweed-module-subpage::
7*61c4878aSAndroid Build Coastguard Worker   :name: pw_rpc
8*61c4878aSAndroid Build Coastguard Worker
9*61c4878aSAndroid Build Coastguard WorkerPigweed RPC servers and clients communicate using ``pw_rpc`` packets. These
10*61c4878aSAndroid Build Coastguard Workerpackets are used to send requests and responses, control streams, cancel ongoing
11*61c4878aSAndroid Build Coastguard WorkerRPCs, and report errors.
12*61c4878aSAndroid Build Coastguard Worker
13*61c4878aSAndroid Build Coastguard WorkerPacket format
14*61c4878aSAndroid Build Coastguard Worker=============
15*61c4878aSAndroid Build Coastguard WorkerPigweed RPC packets consist of a type and a set of fields. The packets are
16*61c4878aSAndroid Build Coastguard Workerencoded as protocol buffers. The full packet format is described in
17*61c4878aSAndroid Build Coastguard Worker``pw_rpc/pw_rpc/internal/packet.proto``.
18*61c4878aSAndroid Build Coastguard Worker
19*61c4878aSAndroid Build Coastguard Worker.. literalinclude:: internal/packet.proto
20*61c4878aSAndroid Build Coastguard Worker   :language: protobuf
21*61c4878aSAndroid Build Coastguard Worker   :lines: 14-
22*61c4878aSAndroid Build Coastguard Worker
23*61c4878aSAndroid Build Coastguard WorkerThe packet type and RPC type determine which fields are present in a Pigweed RPC
24*61c4878aSAndroid Build Coastguard Workerpacket. Each packet type is only sent by either the client or the server.
25*61c4878aSAndroid Build Coastguard WorkerThese tables describe the meaning of and fields included with each packet type.
26*61c4878aSAndroid Build Coastguard Worker
27*61c4878aSAndroid Build Coastguard WorkerClient-to-server packets
28*61c4878aSAndroid Build Coastguard Worker------------------------
29*61c4878aSAndroid Build Coastguard Worker+---------------------------+-------------------------------------+
30*61c4878aSAndroid Build Coastguard Worker| packet type               | description                         |
31*61c4878aSAndroid Build Coastguard Worker+===========================+=====================================+
32*61c4878aSAndroid Build Coastguard Worker| REQUEST                   | Invoke an RPC                       |
33*61c4878aSAndroid Build Coastguard Worker|                           |                                     |
34*61c4878aSAndroid Build Coastguard Worker|                           | .. code-block:: text                |
35*61c4878aSAndroid Build Coastguard Worker|                           |                                     |
36*61c4878aSAndroid Build Coastguard Worker|                           |   - channel_id                      |
37*61c4878aSAndroid Build Coastguard Worker|                           |   - service_id                      |
38*61c4878aSAndroid Build Coastguard Worker|                           |   - method_id                       |
39*61c4878aSAndroid Build Coastguard Worker|                           |   - payload                         |
40*61c4878aSAndroid Build Coastguard Worker|                           |     (unary & server streaming only) |
41*61c4878aSAndroid Build Coastguard Worker|                           |   - call_id (optional)              |
42*61c4878aSAndroid Build Coastguard Worker|                           |                                     |
43*61c4878aSAndroid Build Coastguard Worker+---------------------------+-------------------------------------+
44*61c4878aSAndroid Build Coastguard Worker| CLIENT_STREAM             | Message in a client stream          |
45*61c4878aSAndroid Build Coastguard Worker|                           |                                     |
46*61c4878aSAndroid Build Coastguard Worker|                           | .. code-block:: text                |
47*61c4878aSAndroid Build Coastguard Worker|                           |                                     |
48*61c4878aSAndroid Build Coastguard Worker|                           |   - channel_id                      |
49*61c4878aSAndroid Build Coastguard Worker|                           |   - service_id                      |
50*61c4878aSAndroid Build Coastguard Worker|                           |   - method_id                       |
51*61c4878aSAndroid Build Coastguard Worker|                           |   - payload                         |
52*61c4878aSAndroid Build Coastguard Worker|                           |   - call_id (if set in REQUEST)     |
53*61c4878aSAndroid Build Coastguard Worker|                           |                                     |
54*61c4878aSAndroid Build Coastguard Worker+---------------------------+-------------------------------------+
55*61c4878aSAndroid Build Coastguard Worker| CLIENT_REQUEST_COMPLETION | Client requested stream completion  |
56*61c4878aSAndroid Build Coastguard Worker|                           |                                     |
57*61c4878aSAndroid Build Coastguard Worker|                           | .. code-block:: text                |
58*61c4878aSAndroid Build Coastguard Worker|                           |                                     |
59*61c4878aSAndroid Build Coastguard Worker|                           |   - channel_id                      |
60*61c4878aSAndroid Build Coastguard Worker|                           |   - service_id                      |
61*61c4878aSAndroid Build Coastguard Worker|                           |   - method_id                       |
62*61c4878aSAndroid Build Coastguard Worker|                           |   - call_id (if set in REQUEST)     |
63*61c4878aSAndroid Build Coastguard Worker|                           |                                     |
64*61c4878aSAndroid Build Coastguard Worker+---------------------------+-------------------------------------+
65*61c4878aSAndroid Build Coastguard Worker| CLIENT_ERROR              | Abort an ongoing RPC                |
66*61c4878aSAndroid Build Coastguard Worker|                           |                                     |
67*61c4878aSAndroid Build Coastguard Worker|                           | .. code-block:: text                |
68*61c4878aSAndroid Build Coastguard Worker|                           |                                     |
69*61c4878aSAndroid Build Coastguard Worker|                           |   - channel_id                      |
70*61c4878aSAndroid Build Coastguard Worker|                           |   - service_id                      |
71*61c4878aSAndroid Build Coastguard Worker|                           |   - method_id                       |
72*61c4878aSAndroid Build Coastguard Worker|                           |   - status                          |
73*61c4878aSAndroid Build Coastguard Worker|                           |   - call_id (if set in REQUEST)     |
74*61c4878aSAndroid Build Coastguard Worker|                           |                                     |
75*61c4878aSAndroid Build Coastguard Worker+---------------------------+-------------------------------------+
76*61c4878aSAndroid Build Coastguard Worker
77*61c4878aSAndroid Build Coastguard Worker**Client errors**
78*61c4878aSAndroid Build Coastguard Worker
79*61c4878aSAndroid Build Coastguard WorkerThe client sends ``CLIENT_ERROR`` packets to a server when it receives a packet
80*61c4878aSAndroid Build Coastguard Workerit did not request. If possible, the server should abort it.
81*61c4878aSAndroid Build Coastguard Worker
82*61c4878aSAndroid Build Coastguard WorkerThe status code indicates the type of error. The status code is logged, but all
83*61c4878aSAndroid Build Coastguard Workerstatus codes result in the same action by the server: aborting the RPC.
84*61c4878aSAndroid Build Coastguard Worker
85*61c4878aSAndroid Build Coastguard Worker* ``CANCELLED`` -- The client requested that the RPC be cancelled.
86*61c4878aSAndroid Build Coastguard Worker* ``ABORTED`` -- The RPC was aborted due its channel being closed.
87*61c4878aSAndroid Build Coastguard Worker* ``NOT_FOUND`` -- Received a packet for a service method the client does not
88*61c4878aSAndroid Build Coastguard Worker  recognize.
89*61c4878aSAndroid Build Coastguard Worker* ``FAILED_PRECONDITION`` -- Received a packet for a service method that the
90*61c4878aSAndroid Build Coastguard Worker  client did not invoke.
91*61c4878aSAndroid Build Coastguard Worker* ``DATA_LOSS`` -- Received a corrupt packet for a pending service method.
92*61c4878aSAndroid Build Coastguard Worker* ``INVALID_ARGUMENT`` -- The server sent a packet type to an RPC that does not
93*61c4878aSAndroid Build Coastguard Worker  support it (a ``SERVER_STREAM`` was sent to an RPC with no server stream).
94*61c4878aSAndroid Build Coastguard Worker* ``UNAVAILABLE`` -- Received a packet for an unknown channel.
95*61c4878aSAndroid Build Coastguard Worker
96*61c4878aSAndroid Build Coastguard WorkerServer-to-client packets
97*61c4878aSAndroid Build Coastguard Worker------------------------
98*61c4878aSAndroid Build Coastguard Worker+-------------------+-------------------------------------+
99*61c4878aSAndroid Build Coastguard Worker| packet type       | description                         |
100*61c4878aSAndroid Build Coastguard Worker+===================+=====================================+
101*61c4878aSAndroid Build Coastguard Worker| RESPONSE          | The RPC is complete                 |
102*61c4878aSAndroid Build Coastguard Worker|                   |                                     |
103*61c4878aSAndroid Build Coastguard Worker|                   | .. code-block:: text                |
104*61c4878aSAndroid Build Coastguard Worker|                   |                                     |
105*61c4878aSAndroid Build Coastguard Worker|                   |   - channel_id                      |
106*61c4878aSAndroid Build Coastguard Worker|                   |   - service_id                      |
107*61c4878aSAndroid Build Coastguard Worker|                   |   - method_id                       |
108*61c4878aSAndroid Build Coastguard Worker|                   |   - status                          |
109*61c4878aSAndroid Build Coastguard Worker|                   |   - payload                         |
110*61c4878aSAndroid Build Coastguard Worker|                   |     (unary & client streaming only) |
111*61c4878aSAndroid Build Coastguard Worker|                   |   - call_id (if set in REQUEST)     |
112*61c4878aSAndroid Build Coastguard Worker|                   |                                     |
113*61c4878aSAndroid Build Coastguard Worker+-------------------+-------------------------------------+
114*61c4878aSAndroid Build Coastguard Worker| SERVER_STREAM     | Message in a server stream          |
115*61c4878aSAndroid Build Coastguard Worker|                   |                                     |
116*61c4878aSAndroid Build Coastguard Worker|                   | .. code-block:: text                |
117*61c4878aSAndroid Build Coastguard Worker|                   |                                     |
118*61c4878aSAndroid Build Coastguard Worker|                   |   - channel_id                      |
119*61c4878aSAndroid Build Coastguard Worker|                   |   - service_id                      |
120*61c4878aSAndroid Build Coastguard Worker|                   |   - method_id                       |
121*61c4878aSAndroid Build Coastguard Worker|                   |   - payload                         |
122*61c4878aSAndroid Build Coastguard Worker|                   |   - call_id (if set in REQUEST)     |
123*61c4878aSAndroid Build Coastguard Worker|                   |                                     |
124*61c4878aSAndroid Build Coastguard Worker+-------------------+-------------------------------------+
125*61c4878aSAndroid Build Coastguard Worker| SERVER_ERROR      | Received unexpected packet          |
126*61c4878aSAndroid Build Coastguard Worker|                   |                                     |
127*61c4878aSAndroid Build Coastguard Worker|                   | .. code-block:: text                |
128*61c4878aSAndroid Build Coastguard Worker|                   |                                     |
129*61c4878aSAndroid Build Coastguard Worker|                   |   - channel_id                      |
130*61c4878aSAndroid Build Coastguard Worker|                   |   - service_id (if relevant)        |
131*61c4878aSAndroid Build Coastguard Worker|                   |   - method_id (if relevant)         |
132*61c4878aSAndroid Build Coastguard Worker|                   |   - status                          |
133*61c4878aSAndroid Build Coastguard Worker|                   |   - call_id (if set in REQUEST)     |
134*61c4878aSAndroid Build Coastguard Worker|                   |                                     |
135*61c4878aSAndroid Build Coastguard Worker+-------------------+-------------------------------------+
136*61c4878aSAndroid Build Coastguard Worker
137*61c4878aSAndroid Build Coastguard WorkerAll server packets contain the same ``call_id`` that was set in the initial
138*61c4878aSAndroid Build Coastguard Workerrequest made by the client, if any.
139*61c4878aSAndroid Build Coastguard Worker
140*61c4878aSAndroid Build Coastguard Worker**Server errors**
141*61c4878aSAndroid Build Coastguard Worker
142*61c4878aSAndroid Build Coastguard WorkerThe server sends ``SERVER_ERROR`` packets when it receives a packet it cannot
143*61c4878aSAndroid Build Coastguard Workerprocess. The client should abort any RPC for which it receives an error. The
144*61c4878aSAndroid Build Coastguard Workerstatus field indicates the type of error.
145*61c4878aSAndroid Build Coastguard Worker
146*61c4878aSAndroid Build Coastguard Worker* ``NOT_FOUND`` -- The requested service or method does not exist.
147*61c4878aSAndroid Build Coastguard Worker* ``FAILED_PRECONDITION`` -- A client stream or cancel packet was sent for an
148*61c4878aSAndroid Build Coastguard Worker  RPC that is not pending.
149*61c4878aSAndroid Build Coastguard Worker* ``INVALID_ARGUMENT`` -- The client sent a packet type to an RPC that does not
150*61c4878aSAndroid Build Coastguard Worker  support it (a ``CLIENT_STREAM`` was sent to an RPC with no client stream).
151*61c4878aSAndroid Build Coastguard Worker* ``RESOURCE_EXHAUSTED`` -- The request came on a new channel, but a channel
152*61c4878aSAndroid Build Coastguard Worker  could not be allocated for it.
153*61c4878aSAndroid Build Coastguard Worker* ``ABORTED`` -- The RPC was aborted due its channel being closed.
154*61c4878aSAndroid Build Coastguard Worker* ``INTERNAL`` -- The server was unable to respond to an RPC due to an
155*61c4878aSAndroid Build Coastguard Worker  unrecoverable internal error.
156*61c4878aSAndroid Build Coastguard Worker* ``UNAVAILABLE`` -- Received a packet for an unknown channel.
157*61c4878aSAndroid Build Coastguard Worker
158*61c4878aSAndroid Build Coastguard WorkerInvoking a service method
159*61c4878aSAndroid Build Coastguard Worker=========================
160*61c4878aSAndroid Build Coastguard WorkerCalling an RPC requires a specific sequence of packets. This section describes
161*61c4878aSAndroid Build Coastguard Workerthe protocol for calling service methods of each type: unary, server streaming,
162*61c4878aSAndroid Build Coastguard Workerclient streaming, and bidirectional streaming.
163*61c4878aSAndroid Build Coastguard Worker
164*61c4878aSAndroid Build Coastguard WorkerThe basic flow for all RPC invocations is as follows:
165*61c4878aSAndroid Build Coastguard Worker
166*61c4878aSAndroid Build Coastguard Worker* Client sends a ``REQUEST`` packet. Includes a payload for unary & server
167*61c4878aSAndroid Build Coastguard Worker  streaming RPCs.
168*61c4878aSAndroid Build Coastguard Worker* For client and bidirectional streaming RPCs, the client may send any number of
169*61c4878aSAndroid Build Coastguard Worker  ``CLIENT_STREAM`` packets with payloads.
170*61c4878aSAndroid Build Coastguard Worker* For server and bidirectional streaming RPCs, the server may send any number of
171*61c4878aSAndroid Build Coastguard Worker  ``SERVER_STREAM`` packets.
172*61c4878aSAndroid Build Coastguard Worker* The server sends a ``RESPONSE`` packet. Includes a payload for unary & client
173*61c4878aSAndroid Build Coastguard Worker  streaming RPCs. The RPC is complete.
174*61c4878aSAndroid Build Coastguard Worker
175*61c4878aSAndroid Build Coastguard WorkerThe client may cancel an ongoing RPC at any time by sending a ``CLIENT_ERROR``
176*61c4878aSAndroid Build Coastguard Workerpacket with status ``CANCELLED``. The server may finish an ongoing RPC at any
177*61c4878aSAndroid Build Coastguard Workertime by sending the ``RESPONSE`` packet.
178*61c4878aSAndroid Build Coastguard Worker
179*61c4878aSAndroid Build Coastguard WorkerUnary RPC
180*61c4878aSAndroid Build Coastguard Worker---------
181*61c4878aSAndroid Build Coastguard WorkerIn a unary RPC, the client sends a single request and the server sends a single
182*61c4878aSAndroid Build Coastguard Workerresponse.
183*61c4878aSAndroid Build Coastguard Worker
184*61c4878aSAndroid Build Coastguard Worker.. mermaid::
185*61c4878aSAndroid Build Coastguard Worker   :alt: Unary RPC
186*61c4878aSAndroid Build Coastguard Worker   :align: center
187*61c4878aSAndroid Build Coastguard Worker
188*61c4878aSAndroid Build Coastguard Worker   sequenceDiagram
189*61c4878aSAndroid Build Coastguard Worker       participant C as Client
190*61c4878aSAndroid Build Coastguard Worker       participant S as Server
191*61c4878aSAndroid Build Coastguard Worker       C->>+S: request
192*61c4878aSAndroid Build Coastguard Worker       Note left of C: PacketType.REQUEST<br>channel ID<br>service ID<br>method ID<br>payload
193*61c4878aSAndroid Build Coastguard Worker
194*61c4878aSAndroid Build Coastguard Worker       S->>-C: response
195*61c4878aSAndroid Build Coastguard Worker       Note right of S: PacketType.RESPONSE<br>channel ID<br>service ID<br>method ID<br>payload<br>status
196*61c4878aSAndroid Build Coastguard Worker
197*61c4878aSAndroid Build Coastguard WorkerThe client may attempt to cancel a unary RPC by sending a ``CLIENT_ERROR``
198*61c4878aSAndroid Build Coastguard Workerpacket with status ``CANCELLED``. The server sends no response to a cancelled
199*61c4878aSAndroid Build Coastguard WorkerRPC. If the server processes the unary RPC synchronously (the handling thread
200*61c4878aSAndroid Build Coastguard Workersends the response), it may not be possible to cancel the RPC.
201*61c4878aSAndroid Build Coastguard Worker
202*61c4878aSAndroid Build Coastguard Worker.. mermaid::
203*61c4878aSAndroid Build Coastguard Worker   :alt: Cancelled Unary RPC
204*61c4878aSAndroid Build Coastguard Worker   :align: center
205*61c4878aSAndroid Build Coastguard Worker
206*61c4878aSAndroid Build Coastguard Worker   sequenceDiagram
207*61c4878aSAndroid Build Coastguard Worker       participant C as Client
208*61c4878aSAndroid Build Coastguard Worker       participant S as Server
209*61c4878aSAndroid Build Coastguard Worker       C->>+S: request
210*61c4878aSAndroid Build Coastguard Worker       Note left of C: PacketType.REQUEST<br>channel ID<br>service ID<br>method ID<br>payload
211*61c4878aSAndroid Build Coastguard Worker
212*61c4878aSAndroid Build Coastguard Worker       C->>S: cancel
213*61c4878aSAndroid Build Coastguard Worker       Note left of C: PacketType.CLIENT_ERROR<br>channel ID<br>service ID<br>method ID<br>status=CANCELLED
214*61c4878aSAndroid Build Coastguard Worker
215*61c4878aSAndroid Build Coastguard Worker
216*61c4878aSAndroid Build Coastguard WorkerServer streaming RPC
217*61c4878aSAndroid Build Coastguard Worker--------------------
218*61c4878aSAndroid Build Coastguard WorkerIn a server streaming RPC, the client sends a single request and the server
219*61c4878aSAndroid Build Coastguard Workersends any number of ``SERVER_STREAM`` packets followed by a ``RESPONSE`` packet.
220*61c4878aSAndroid Build Coastguard Worker
221*61c4878aSAndroid Build Coastguard Worker.. mermaid::
222*61c4878aSAndroid Build Coastguard Worker   :alt: Server Streaming RPC
223*61c4878aSAndroid Build Coastguard Worker   :align: center
224*61c4878aSAndroid Build Coastguard Worker
225*61c4878aSAndroid Build Coastguard Worker   sequenceDiagram
226*61c4878aSAndroid Build Coastguard Worker       participant C as Client
227*61c4878aSAndroid Build Coastguard Worker       participant S as Server
228*61c4878aSAndroid Build Coastguard Worker       C->>+S: request
229*61c4878aSAndroid Build Coastguard Worker       Note left of C: PacketType.REQUEST<br>channel ID<br>service ID<br>method ID<br>payload
230*61c4878aSAndroid Build Coastguard Worker
231*61c4878aSAndroid Build Coastguard Worker       S-->>C: messages (zero or more)
232*61c4878aSAndroid Build Coastguard Worker       Note right of S: PacketType.SERVER_STREAM<br>channel ID<br>service ID<br>method ID<br>payload
233*61c4878aSAndroid Build Coastguard Worker
234*61c4878aSAndroid Build Coastguard Worker       S->>-C: done
235*61c4878aSAndroid Build Coastguard Worker       Note right of S: PacketType.RESPONSE<br>channel ID<br>service ID<br>method ID<br>status
236*61c4878aSAndroid Build Coastguard Worker
237*61c4878aSAndroid Build Coastguard Worker
238*61c4878aSAndroid Build Coastguard WorkerThe client may terminate a server streaming RPC by sending a ``CLIENT_STREAM``
239*61c4878aSAndroid Build Coastguard Workerpacket with status ``CANCELLED``. The server sends no response.
240*61c4878aSAndroid Build Coastguard Worker
241*61c4878aSAndroid Build Coastguard Worker.. mermaid::
242*61c4878aSAndroid Build Coastguard Worker   :alt: Cancelled Server Streaming RPC
243*61c4878aSAndroid Build Coastguard Worker   :align: center
244*61c4878aSAndroid Build Coastguard Worker
245*61c4878aSAndroid Build Coastguard Worker   sequenceDiagram
246*61c4878aSAndroid Build Coastguard Worker       participant C as Client
247*61c4878aSAndroid Build Coastguard Worker       participant S as Server
248*61c4878aSAndroid Build Coastguard Worker       C->>S: request
249*61c4878aSAndroid Build Coastguard Worker       Note left of C: PacketType.REQUEST<br>channel ID<br>service ID<br>method ID<br>payload
250*61c4878aSAndroid Build Coastguard Worker
251*61c4878aSAndroid Build Coastguard Worker       S-->>C: messages (zero or more)
252*61c4878aSAndroid Build Coastguard Worker       Note right of S: PacketType.SERVER_STREAM<br>channel ID<br>service ID<br>method ID<br>payload
253*61c4878aSAndroid Build Coastguard Worker
254*61c4878aSAndroid Build Coastguard Worker       C->>S: cancel
255*61c4878aSAndroid Build Coastguard Worker       Note left of C: PacketType.CLIENT_ERROR<br>channel ID<br>service ID<br>method ID<br>status=CANCELLED
256*61c4878aSAndroid Build Coastguard Worker
257*61c4878aSAndroid Build Coastguard WorkerClient streaming RPC
258*61c4878aSAndroid Build Coastguard Worker--------------------
259*61c4878aSAndroid Build Coastguard WorkerIn a client streaming RPC, the client starts the RPC by sending a ``REQUEST``
260*61c4878aSAndroid Build Coastguard Workerpacket with no payload. It then sends any number of messages in
261*61c4878aSAndroid Build Coastguard Worker``CLIENT_STREAM`` packets, followed by a ``CLIENT_REQUEST_COMPLETION``. The server sends
262*61c4878aSAndroid Build Coastguard Workera single ``RESPONSE`` to finish the RPC.
263*61c4878aSAndroid Build Coastguard Worker
264*61c4878aSAndroid Build Coastguard Worker.. mermaid::
265*61c4878aSAndroid Build Coastguard Worker   :alt: Client Streaming RPC
266*61c4878aSAndroid Build Coastguard Worker   :align: center
267*61c4878aSAndroid Build Coastguard Worker
268*61c4878aSAndroid Build Coastguard Worker   sequenceDiagram
269*61c4878aSAndroid Build Coastguard Worker       participant C as Client
270*61c4878aSAndroid Build Coastguard Worker       participant S as Server
271*61c4878aSAndroid Build Coastguard Worker       C->>S: start
272*61c4878aSAndroid Build Coastguard Worker       Note left of C: PacketType.REQUEST<br>channel ID<br>service ID<br>method ID<br>payload
273*61c4878aSAndroid Build Coastguard Worker
274*61c4878aSAndroid Build Coastguard Worker       C-->>S: messages (zero or more)
275*61c4878aSAndroid Build Coastguard Worker       Note left of C: PacketType.CLIENT_STREAM<br>channel ID<br>service ID<br>method ID<br>payload
276*61c4878aSAndroid Build Coastguard Worker
277*61c4878aSAndroid Build Coastguard Worker       C->>S: done
278*61c4878aSAndroid Build Coastguard Worker       Note left of C: PacketType.CLIENT_REQUEST_COMPLETION<br>channel ID<br>service ID<br>method ID
279*61c4878aSAndroid Build Coastguard Worker
280*61c4878aSAndroid Build Coastguard Worker       S->>C: response
281*61c4878aSAndroid Build Coastguard Worker       Note right of S: PacketType.RESPONSE<br>channel ID<br>service ID<br>method ID<br>payload<br>status
282*61c4878aSAndroid Build Coastguard Worker
283*61c4878aSAndroid Build Coastguard WorkerThe server may finish the RPC at any time by sending its ``RESPONSE`` packet,
284*61c4878aSAndroid Build Coastguard Workereven if it has not yet received the ``CLIENT_REQUEST_COMPLETION`` packet. The client may
285*61c4878aSAndroid Build Coastguard Workerterminate the RPC at any time by sending a ``CLIENT_ERROR`` packet with status
286*61c4878aSAndroid Build Coastguard Worker``CANCELLED``.
287*61c4878aSAndroid Build Coastguard Worker
288*61c4878aSAndroid Build Coastguard Worker.. mermaid::
289*61c4878aSAndroid Build Coastguard Worker   :alt: Cancelled Client Streaming RPC
290*61c4878aSAndroid Build Coastguard Worker   :align: center
291*61c4878aSAndroid Build Coastguard Worker
292*61c4878aSAndroid Build Coastguard Worker   sequenceDiagram
293*61c4878aSAndroid Build Coastguard Worker       participant C as Client
294*61c4878aSAndroid Build Coastguard Worker       participant S as Server
295*61c4878aSAndroid Build Coastguard Worker       C->>S: start
296*61c4878aSAndroid Build Coastguard Worker       Note left of C: PacketType.REQUEST<br>channel ID<br>service ID<br>method ID
297*61c4878aSAndroid Build Coastguard Worker
298*61c4878aSAndroid Build Coastguard Worker       C-->>S: messages (zero or more)
299*61c4878aSAndroid Build Coastguard Worker       Note left of C: PacketType.CLIENT_STREAM<br>channel ID<br>service ID<br>method ID<br>payload
300*61c4878aSAndroid Build Coastguard Worker
301*61c4878aSAndroid Build Coastguard Worker       C->>S: cancel
302*61c4878aSAndroid Build Coastguard Worker       Note right of S: PacketType.CLIENT_ERROR<br>channel ID<br>service ID<br>method ID<br>status=CANCELLED
303*61c4878aSAndroid Build Coastguard Worker
304*61c4878aSAndroid Build Coastguard WorkerBidirectional streaming RPC
305*61c4878aSAndroid Build Coastguard Worker---------------------------
306*61c4878aSAndroid Build Coastguard WorkerIn a bidirectional streaming RPC, the client sends any number of requests and
307*61c4878aSAndroid Build Coastguard Workerthe server sends any number of responses. The client invokes the RPC by sending
308*61c4878aSAndroid Build Coastguard Workera ``REQUEST`` with no payload. It sends a ``CLIENT_REQUEST_COMPLETION`` packet when it
309*61c4878aSAndroid Build Coastguard Workerhas finished sending requests. The server sends a ``RESPONSE`` packet to finish
310*61c4878aSAndroid Build Coastguard Workerthe RPC.
311*61c4878aSAndroid Build Coastguard Worker
312*61c4878aSAndroid Build Coastguard Worker.. mermaid::
313*61c4878aSAndroid Build Coastguard Worker   :alt: Bidirectional Streaming RPC
314*61c4878aSAndroid Build Coastguard Worker   :align: center
315*61c4878aSAndroid Build Coastguard Worker
316*61c4878aSAndroid Build Coastguard Worker   sequenceDiagram
317*61c4878aSAndroid Build Coastguard Worker       participant C as Client
318*61c4878aSAndroid Build Coastguard Worker       participant S as Server
319*61c4878aSAndroid Build Coastguard Worker       C->>S: start
320*61c4878aSAndroid Build Coastguard Worker       Note left of C: PacketType.REQUEST<br>channel ID<br>service ID<br>method ID<br>payload
321*61c4878aSAndroid Build Coastguard Worker
322*61c4878aSAndroid Build Coastguard Worker       C-->>S: messages (zero or more)
323*61c4878aSAndroid Build Coastguard Worker       Note left of C: PacketType.CLIENT_STREAM<br>channel ID<br>service ID<br>method ID<br>payload
324*61c4878aSAndroid Build Coastguard Worker
325*61c4878aSAndroid Build Coastguard Worker       C-->S: (messages in any order)
326*61c4878aSAndroid Build Coastguard Worker
327*61c4878aSAndroid Build Coastguard Worker       S-->>C: messages (zero or more)
328*61c4878aSAndroid Build Coastguard Worker       Note right of S: PacketType.SERVER_STREAM<br>channel ID<br>service ID<br>method ID<br>payload
329*61c4878aSAndroid Build Coastguard Worker
330*61c4878aSAndroid Build Coastguard Worker       C->>S: done
331*61c4878aSAndroid Build Coastguard Worker       Note left of C: PacketType.CLIENT_REQUEST_COMPLETION<br>channel ID<br>service ID<br>method ID
332*61c4878aSAndroid Build Coastguard Worker
333*61c4878aSAndroid Build Coastguard Worker       S->>C: done
334*61c4878aSAndroid Build Coastguard Worker       Note right of S: PacketType.RESPONSE<br>channel ID<br>service ID<br>method ID<br>status
335*61c4878aSAndroid Build Coastguard Worker
336*61c4878aSAndroid Build Coastguard Worker
337*61c4878aSAndroid Build Coastguard WorkerThe server may finish the RPC at any time by sending the ``RESPONSE`` packet,
338*61c4878aSAndroid Build Coastguard Workereven if it has not received the ``CLIENT_REQUEST_COMPLETION`` packet. The client may
339*61c4878aSAndroid Build Coastguard Workerterminate the RPC at any time by sending a ``CLIENT_ERROR`` packet with status
340*61c4878aSAndroid Build Coastguard Worker``CANCELLED``.
341*61c4878aSAndroid Build Coastguard Worker
342*61c4878aSAndroid Build Coastguard Worker.. mermaid::
343*61c4878aSAndroid Build Coastguard Worker   :alt: Client Streaming RPC
344*61c4878aSAndroid Build Coastguard Worker   :align: center
345*61c4878aSAndroid Build Coastguard Worker
346*61c4878aSAndroid Build Coastguard Worker   sequenceDiagram
347*61c4878aSAndroid Build Coastguard Worker       participant C as Client
348*61c4878aSAndroid Build Coastguard Worker       participant S as Server
349*61c4878aSAndroid Build Coastguard Worker       C->>S: start
350*61c4878aSAndroid Build Coastguard Worker       Note left of C: PacketType.REQUEST<br>channel ID<br>service ID<br>method ID<br>payload
351*61c4878aSAndroid Build Coastguard Worker
352*61c4878aSAndroid Build Coastguard Worker       C-->>S: messages (zero or more)
353*61c4878aSAndroid Build Coastguard Worker       Note left of C: PacketType.CLIENT_STREAM<br>channel ID<br>service ID<br>method ID<br>payload
354*61c4878aSAndroid Build Coastguard Worker
355*61c4878aSAndroid Build Coastguard Worker       C->>S: done
356*61c4878aSAndroid Build Coastguard Worker       Note left of C: PacketType.CLIENT_REQUEST_COMPLETION<br>channel ID<br>service ID<br>method ID
357*61c4878aSAndroid Build Coastguard Worker
358*61c4878aSAndroid Build Coastguard Worker       S->>C: response
359*61c4878aSAndroid Build Coastguard Worker       Note right of S: PacketType.RESPONSE<br>channel ID<br>service ID<br>method ID<br>payload<br>status
360