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