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 stream of messages and then gets
39: * a single response.
40: */
41: class ClientStreamingCall extends AbstractCall
42: {
43: /**
44: * Start the call.
45: *
46: * @param array $metadata Metadata to send with the call, if applicable
47: * (optional)
48: */
49: public function start(array $metadata = [])
50: {
51: $this->call->startBatch([
52: OP_SEND_INITIAL_METADATA => $metadata,
53: ]);
54: }
55:
56: /**
57: * Write a single message to the server. This cannot be called after
58: * wait is called.
59: *
60: * @param ByteBuffer $data The data to write
61: * @param array $options An array of options, possible keys:
62: * 'flags' => a number (optional)
63: */
64: public function write($data, array $options = [])
65: {
66: $message_array = ['message' => $this->_serializeMessage($data)];
67: if (array_key_exists('flags', $options)) {
68: $message_array['flags'] = $options['flags'];
69: }
70: $this->call->startBatch([
71: OP_SEND_MESSAGE => $message_array,
72: ]);
73: }
74:
75: /**
76: * Wait for the server to respond with data and a status.
77: *
78: * @return array [response data, status]
79: */
80: public function wait()
81: {
82: $event = $this->call->startBatch([
83: OP_SEND_CLOSE_FROM_CLIENT => true,
84: OP_RECV_INITIAL_METADATA => true,
85: OP_RECV_MESSAGE => true,
86: OP_RECV_STATUS_ON_CLIENT => true,
87: ]);
88: $this->metadata = $event->metadata;
89:
90: $status = $event->status;
91: $this->trailing_metadata = $status->metadata;
92:
93: return [$this->_deserializeResponse($event->message), $status];
94: }
95: }
96: