Class: GRPC::BidiCall
- Inherits:
-
Object
- Object
- GRPC::BidiCall
- Includes:
- Core::CallOps, Core::StatusCodes, Core::TimeConsts
- Defined in:
- src/ruby/lib/grpc/generic/bidi_call.rb
Overview
The BiDiCall class orchestrates exection of a BiDi stream on a client or server.
Instance Method Summary collapse
-
#initialize(call, marshal, unmarshal, metadata_received: false, req_view: nil) ⇒ BidiCall
constructor
Creates a BidiCall.
-
#run_on_client(requests, op_notifier, &blk) ⇒ Object
Begins orchestration of the Bidi stream for a client sending requests.
-
#run_on_server(gen_each_reply) ⇒ Object
Begins orchestration of the Bidi stream for a server generating replies.
Methods included from Core::TimeConsts
Constructor Details
#initialize(call, marshal, unmarshal, metadata_received: false, req_view: nil) ⇒ BidiCall
Creates a BidiCall.
BidiCall should only be created after a call is accepted. That means different things on a client and a server. On the client, the call is accepted after call.invoke. On the server, this is after call.accept.
#initialize cannot determine if the call is accepted or not; so if a call that’s not accepted is used here, the error won’t be visible until the BidiCall#run is called.
deadline is the absolute deadline for the call.
59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
# File 'src/ruby/lib/grpc/generic/bidi_call.rb', line 59 def initialize(call, marshal, unmarshal, metadata_received: false, req_view: nil) fail(ArgumentError, 'not a call') unless call.is_a? Core::Call @call = call @marshal = marshal @op_notifier = nil # signals completion on clients @unmarshal = unmarshal @metadata_received = @reads_complete = false @writes_complete = false @complete = false @done_mutex = Mutex.new @req_view = req_view end |
Instance Method Details
#run_on_client(requests, op_notifier, &blk) ⇒ Object
Begins orchestration of the Bidi stream for a client sending requests.
The method either returns an Enumerator of the responses, or accepts a block that can be invoked with each response.
82 83 84 85 86 |
# File 'src/ruby/lib/grpc/generic/bidi_call.rb', line 82 def run_on_client(requests, op_notifier, &blk) @op_notifier = op_notifier @enq_th = Thread.new { write_loop(requests) } read_loop(&blk) end |
#run_on_server(gen_each_reply) ⇒ Object
Begins orchestration of the Bidi stream for a server generating replies.
N.B. gen_each_reply is a func(Enumerable<Requests>)
It takes an enumerable of requests as an arg, in case there is a relationship between the stream of requests and the stream of replies.
This does not mean that must necessarily be one. E.g, the replies produced by gen_each_reply could ignore the received_msgs
99 100 101 102 103 104 105 106 107 108 109 110 |
# File 'src/ruby/lib/grpc/generic/bidi_call.rb', line 99 def run_on_server(gen_each_reply) # Pass in the optional call object parameter if possible if gen_each_reply.arity == 1 replys = gen_each_reply.call(read_loop(is_client: false)) elsif gen_each_reply.arity == 2 replys = gen_each_reply.call(read_loop(is_client: false), @req_view) else fail 'Illegal arity of reply generator' end write_loop(replys, is_client: false) end |