Home | History | Annotate | Download | only in Grpc
      1 <?php
      2 /*
      3  *
      4  * Copyright 2015 gRPC authors.
      5  *
      6  * Licensed under the Apache License, Version 2.0 (the "License");
      7  * you may not use this file except in compliance with the License.
      8  * You may obtain a copy of the License at
      9  *
     10  *     http://www.apache.org/licenses/LICENSE-2.0
     11  *
     12  * Unless required by applicable law or agreed to in writing, software
     13  * distributed under the License is distributed on an "AS IS" BASIS,
     14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     15  * See the License for the specific language governing permissions and
     16  * limitations under the License.
     17  *
     18  */
     19 
     20 namespace Grpc;
     21 
     22 /**
     23  * Represents an active call that sends a stream of messages and then gets
     24  * a single response.
     25  */
     26 class ClientStreamingCall extends AbstractCall
     27 {
     28     /**
     29      * Start the call.
     30      *
     31      * @param array $metadata Metadata to send with the call, if applicable
     32      *                        (optional)
     33      */
     34     public function start(array $metadata = [])
     35     {
     36         $this->call->startBatch([
     37             OP_SEND_INITIAL_METADATA => $metadata,
     38         ]);
     39     }
     40 
     41     /**
     42      * Write a single message to the server. This cannot be called after
     43      * wait is called.
     44      *
     45      * @param ByteBuffer $data    The data to write
     46      * @param array      $options An array of options, possible keys:
     47      *                            'flags' => a number (optional)
     48      */
     49     public function write($data, array $options = [])
     50     {
     51         $message_array = ['message' => $this->_serializeMessage($data)];
     52         if (array_key_exists('flags', $options)) {
     53             $message_array['flags'] = $options['flags'];
     54         }
     55         $this->call->startBatch([
     56             OP_SEND_MESSAGE => $message_array,
     57         ]);
     58     }
     59 
     60     /**
     61      * Wait for the server to respond with data and a status.
     62      *
     63      * @return array [response data, status]
     64      */
     65     public function wait()
     66     {
     67         $event = $this->call->startBatch([
     68             OP_SEND_CLOSE_FROM_CLIENT => true,
     69             OP_RECV_INITIAL_METADATA => true,
     70             OP_RECV_MESSAGE => true,
     71             OP_RECV_STATUS_ON_CLIENT => true,
     72         ]);
     73         $this->metadata = $event->metadata;
     74 
     75         $status = $event->status;
     76         $this->trailing_metadata = $status->metadata;
     77 
     78         return [$this->_deserializeResponse($event->message), $status];
     79     }
     80 }
     81