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: * stream of responses.
40: */
41: class ServerStreamingCall 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 (array_key_exists('flags', $options)) {
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: * @return mixed An iterator of response values
69: */
70: public function responses()
71: {
72: $response = $this->call->startBatch([
73: OP_RECV_MESSAGE => true,
74: ])->message;
75: while ($response !== null) {
76: yield $this->_deserializeResponse($response);
77: $response = $this->call->startBatch([
78: OP_RECV_MESSAGE => true,
79: ])->message;
80: }
81: }
82:
83: /**
84: * Wait for the server to send the status, and return it.
85: *
86: * @return \stdClass The status object, with integer $code, string
87: * $details, and array $metadata members
88: */
89: public function getStatus()
90: {
91: $status_event = $this->call->startBatch([
92: OP_RECV_STATUS_ON_CLIENT => true,
93: ]);
94:
95: $this->trailing_metadata = $status_event->status->metadata;
96:
97: return $status_event->status;
98: }
99: }
100: