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 single message and then gets a
     24  * stream of responses.
     25  */
     26 class ServerStreamingCall extends AbstractCall
     27 {
     28     /**
     29      * Start the call.
     30      *
     31      * @param mixed $data     The data to send
     32      * @param array $metadata Metadata to send with the call, if applicable
     33      *                        (optional)
     34      * @param array $options  An array of options, possible keys:
     35      *                        'flags' => a number (optional)
     36      */
     37     public function start($data, array $metadata = [], array $options = [])
     38     {
     39         $message_array = ['message' => $this->_serializeMessage($data)];
     40         if (array_key_exists('flags', $options)) {
     41             $message_array['flags'] = $options['flags'];
     42         }
     43         $this->call->startBatch([
     44             OP_SEND_INITIAL_METADATA => $metadata,
     45             OP_SEND_MESSAGE => $message_array,
     46             OP_SEND_CLOSE_FROM_CLIENT => true,
     47         ]);
     48     }
     49 
     50     /**
     51      * @return mixed An iterator of response values
     52      */
     53     public function responses()
     54     {
     55         $batch = [OP_RECV_MESSAGE => true];
     56         if ($this->metadata === null) {
     57             $batch[OP_RECV_INITIAL_METADATA] = true;
     58         }
     59         $read_event = $this->call->startBatch($batch);
     60         if ($this->metadata === null) {
     61             $this->metadata = $read_event->metadata;
     62         }
     63         $response = $read_event->message;
     64         while ($response !== null) {
     65             yield $this->_deserializeResponse($response);
     66             $response = $this->call->startBatch([
     67                 OP_RECV_MESSAGE => true,
     68             ])->message;
     69         }
     70     }
     71 
     72     /**
     73      * Wait for the server to send the status, and return it.
     74      *
     75      * @return \stdClass The status object, with integer $code, string
     76      *                   $details, and array $metadata members
     77      */
     78     public function getStatus()
     79     {
     80         $status_event = $this->call->startBatch([
     81             OP_RECV_STATUS_ON_CLIENT => true,
     82         ]);
     83 
     84         $this->trailing_metadata = $status_event->status->metadata;
     85 
     86         return $status_event->status;
     87     }
     88 
     89     /**
     90      * @return mixed The metadata sent by the server
     91      */
     92     public function getMetadata()
     93     {
     94         if ($this->metadata === null) {
     95             $event = $this->call->startBatch([OP_RECV_INITIAL_METADATA => true]);
     96             $this->metadata = $event->metadata;
     97         }
     98         return $this->metadata;
     99     }
    100 }
    101