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  * single response.
     25  */
     26 class UnaryCall 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 (isset($options['flags'])) {
     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      * Wait for the server to respond with data and a status.
     52      *
     53      * @return array [response data, status]
     54      */
     55     public function wait()
     56     {
     57         $batch = [
     58             OP_RECV_MESSAGE => true,
     59             OP_RECV_STATUS_ON_CLIENT => true,
     60         ];
     61         if ($this->metadata === null) {
     62             $batch[OP_RECV_INITIAL_METADATA] = true;
     63         }
     64         $event = $this->call->startBatch($batch);
     65         if ($this->metadata === null) {
     66             $this->metadata = $event->metadata;
     67         }
     68         $status = $event->status;
     69         $this->trailing_metadata = $status->metadata;
     70 
     71         return [$this->_deserializeResponse($event->message), $status];
     72     }
     73 
     74     /**
     75      * @return mixed The metadata sent by the server
     76      */
     77     public function getMetadata()
     78     {
     79         if ($this->metadata === null) {
     80             $event = $this->call->startBatch([OP_RECV_INITIAL_METADATA => true]);
     81             $this->metadata = $event->metadata;
     82         }
     83         return $this->metadata;
     84     }
     85 }
     86