1: <?php
2: /*
3: *
4: * Copyright 2015, Google Inc.
5: * All rights reserved.
6: *
7: * Redistribution and use in source and binary forms, with or without
8: * modification, are permitted provided that the following conditions are
9: * met:
10: *
11: * * Redistributions of source code must retain the above copyright
12: * notice, this list of conditions and the following disclaimer.
13: * * Redistributions in binary form must reproduce the above
14: * copyright notice, this list of conditions and the following disclaimer
15: * in the documentation and/or other materials provided with the
16: * distribution.
17: * * Neither the name of Google Inc. nor the names of its
18: * contributors may be used to endorse or promote products derived from
19: * this software without specific prior written permission.
20: *
21: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22: * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23: * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24: * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25: * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26: * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27: * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28: * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29: * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30: * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31: * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32: *
33: */
34:
35: namespace Grpc;
36:
37: /**
38: * Represents an active call that sends a single message and then gets a
39: * single response.
40: */
41: class UnaryCall extends AbstractCall
42: {
43: /**
44: * Start the call.
45: *
46: * @param mixed $data The data to send
47: * @param array $metadata Metadata to send with the call, if applicable
48: * (optional)
49: * @param array $options An array of options, possible keys:
50: * 'flags' => a number (optional)
51: */
52: public function start($data, array $metadata = [], array $options = [])
53: {
54: $message_array = ['message' => $this->_serializeMessage($data)];
55: if (isset($options['flags'])) {
56: $message_array['flags'] = $options['flags'];
57: }
58: $event = $this->call->startBatch([
59: OP_SEND_INITIAL_METADATA => $metadata,
60: OP_RECV_INITIAL_METADATA => true,
61: OP_SEND_MESSAGE => $message_array,
62: OP_SEND_CLOSE_FROM_CLIENT => true,
63: ]);
64: $this->metadata = $event->metadata;
65: }
66:
67: /**
68: * Wait for the server to respond with data and a status.
69: *
70: * @return array [response data, status]
71: */
72: public function wait()
73: {
74: $event = $this->call->startBatch([
75: OP_RECV_MESSAGE => true,
76: OP_RECV_STATUS_ON_CLIENT => true,
77: ]);
78:
79: $status = $event->status;
80: $this->trailing_metadata = $status->metadata;
81:
82: return [$this->_deserializeResponse($event->message), $status];
83: }
84: }
85: