grpc 0.15.0-x86-mingw32 → 1.0.0.pre1-x86-mingw32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of grpc might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/etc/roots.pem +784 -509
- data/grpc_c.32.ruby +0 -0
- data/grpc_c.64.ruby +0 -0
- data/src/ruby/ext/grpc/rb_byte_buffer.c +4 -1
- data/src/ruby/ext/grpc/rb_call.c +87 -54
- data/src/ruby/ext/grpc/rb_call.h +1 -1
- data/src/ruby/ext/grpc/rb_call_credentials.c +1 -30
- data/src/ruby/ext/grpc/rb_channel.c +25 -50
- data/src/ruby/ext/grpc/rb_channel_credentials.c +1 -31
- data/src/ruby/ext/grpc/rb_completion_queue.c +15 -134
- data/src/ruby/ext/grpc/rb_completion_queue.h +3 -7
- data/src/ruby/ext/grpc/rb_grpc.c +2 -4
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +2 -0
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +4 -1
- data/src/ruby/ext/grpc/rb_server.c +81 -133
- data/src/ruby/ext/grpc/rb_server_credentials.c +4 -33
- data/src/ruby/lib/grpc/2.0/grpc_c.so +0 -0
- data/src/ruby/lib/grpc/2.1/grpc_c.so +0 -0
- data/src/ruby/lib/grpc/2.2/grpc_c.so +0 -0
- data/src/ruby/lib/grpc/2.3/grpc_c.so +0 -0
- data/src/ruby/lib/grpc/generic/active_call.rb +40 -55
- data/src/ruby/lib/grpc/generic/bidi_call.rb +21 -23
- data/src/ruby/lib/grpc/generic/client_stub.rb +20 -15
- data/src/ruby/lib/grpc/generic/rpc_server.rb +15 -37
- data/src/ruby/lib/grpc/generic/service.rb +1 -1
- data/src/ruby/lib/grpc/grpc_c.so +0 -0
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/src/ruby/pb/test/client.rb +25 -7
- data/src/ruby/pb/test/server.rb +7 -5
- data/src/ruby/spec/call_spec.rb +1 -2
- data/src/ruby/spec/channel_spec.rb +2 -3
- data/src/ruby/spec/client_server_spec.rb +74 -59
- data/src/ruby/spec/generic/active_call_spec.rb +66 -86
- data/src/ruby/spec/generic/client_stub_spec.rb +27 -48
- data/src/ruby/spec/generic/rpc_server_spec.rb +4 -34
- data/src/ruby/spec/pb/health/checker_spec.rb +0 -2
- data/src/ruby/spec/server_spec.rb +20 -24
- metadata +4 -6
- data/src/ruby/spec/completion_queue_spec.rb +0 -42
| @@ -38,6 +38,7 @@ | |
| 38 38 |  | 
| 39 39 | 
             
            #include <grpc/grpc.h>
         | 
| 40 40 | 
             
            #include <grpc/grpc_security.h>
         | 
| 41 | 
            +
            #include <grpc/support/log.h>
         | 
| 41 42 |  | 
| 42 43 | 
             
            #include "rb_grpc.h"
         | 
| 43 44 |  | 
| @@ -46,8 +47,8 @@ | |
| 46 47 | 
             
            static VALUE grpc_rb_cServerCredentials = Qnil;
         | 
| 47 48 |  | 
| 48 49 | 
             
            /* grpc_rb_server_credentials wraps a grpc_server_credentials.  It provides a
         | 
| 49 | 
            -
               peer ruby object, 'mark' to  | 
| 50 | 
            -
                | 
| 50 | 
            +
               peer ruby object, 'mark' to hold references to objects involved in
         | 
| 51 | 
            +
               constructing the server credentials. */
         | 
| 51 52 | 
             
            typedef struct grpc_rb_server_credentials {
         | 
| 52 53 | 
             
              /* Holder of ruby objects involved in constructing the server credentials */
         | 
| 53 54 | 
             
              VALUE mark;
         | 
| @@ -111,36 +112,6 @@ static VALUE grpc_rb_server_credentials_alloc(VALUE cls) { | |
| 111 112 | 
             
                                           wrapper);
         | 
| 112 113 | 
             
            }
         | 
| 113 114 |  | 
| 114 | 
            -
            /* Clones ServerCredentials instances.
         | 
| 115 | 
            -
             | 
| 116 | 
            -
               Gives ServerCredentials a consistent implementation of Ruby's object copy/dup
         | 
| 117 | 
            -
               protocol. */
         | 
| 118 | 
            -
            static VALUE grpc_rb_server_credentials_init_copy(VALUE copy, VALUE orig) {
         | 
| 119 | 
            -
              grpc_rb_server_credentials *orig_ch = NULL;
         | 
| 120 | 
            -
              grpc_rb_server_credentials *copy_ch = NULL;
         | 
| 121 | 
            -
             | 
| 122 | 
            -
              if (copy == orig) {
         | 
| 123 | 
            -
                return copy;
         | 
| 124 | 
            -
              }
         | 
| 125 | 
            -
             | 
| 126 | 
            -
              /* Raise an error if orig is not a server_credentials object or a subclass. */
         | 
| 127 | 
            -
              if (TYPE(orig) != T_DATA ||
         | 
| 128 | 
            -
                  RDATA(orig)->dfree != (RUBY_DATA_FUNC)grpc_rb_server_credentials_free) {
         | 
| 129 | 
            -
                rb_raise(rb_eTypeError, "not a %s",
         | 
| 130 | 
            -
                         rb_obj_classname(grpc_rb_cServerCredentials));
         | 
| 131 | 
            -
              }
         | 
| 132 | 
            -
             | 
| 133 | 
            -
              TypedData_Get_Struct(orig, grpc_rb_server_credentials,
         | 
| 134 | 
            -
                                   &grpc_rb_server_credentials_data_type, orig_ch);
         | 
| 135 | 
            -
              TypedData_Get_Struct(copy, grpc_rb_server_credentials,
         | 
| 136 | 
            -
                                   &grpc_rb_server_credentials_data_type, copy_ch);
         | 
| 137 | 
            -
             | 
| 138 | 
            -
              /* use ruby's MEMCPY to make a byte-for-byte copy of the server_credentials
         | 
| 139 | 
            -
                 wrapper object. */
         | 
| 140 | 
            -
              MEMCPY(copy_ch, orig_ch, grpc_rb_server_credentials, 1);
         | 
| 141 | 
            -
              return copy;
         | 
| 142 | 
            -
            }
         | 
| 143 | 
            -
             | 
| 144 115 | 
             
            /* The attribute used on the mark object to preserve the pem_root_certs. */
         | 
| 145 116 | 
             
            static ID id_pem_root_certs;
         | 
| 146 117 |  | 
| @@ -270,7 +241,7 @@ void Init_grpc_server_credentials() { | |
| 270 241 | 
             
              rb_define_method(grpc_rb_cServerCredentials, "initialize",
         | 
| 271 242 | 
             
                               grpc_rb_server_credentials_init, 3);
         | 
| 272 243 | 
             
              rb_define_method(grpc_rb_cServerCredentials, "initialize_copy",
         | 
| 273 | 
            -
                                | 
| 244 | 
            +
                               grpc_rb_cannot_init_copy, 1);
         | 
| 274 245 |  | 
| 275 246 | 
             
              id_pem_key_certs = rb_intern("__pem_key_certs");
         | 
| 276 247 | 
             
              id_pem_root_certs = rb_intern("__pem_root_certs");
         | 
| Binary file | 
| Binary file | 
| Binary file | 
| Binary file | 
| @@ -43,8 +43,7 @@ class Struct | |
| 43 43 | 
             
                    GRPC.logger.debug("Failing with status #{status}")
         | 
| 44 44 | 
             
                    # raise BadStatus, propagating the metadata if present.
         | 
| 45 45 | 
             
                    md = status.metadata
         | 
| 46 | 
            -
                     | 
| 47 | 
            -
                    fail GRPC::BadStatus.new(status.code, status.details, with_sym_keys)
         | 
| 46 | 
            +
                    fail GRPC::BadStatus.new(status.code, status.details, md)
         | 
| 48 47 | 
             
                  end
         | 
| 49 48 | 
             
                  status
         | 
| 50 49 | 
             
                end
         | 
| @@ -61,7 +60,7 @@ module GRPC | |
| 61 60 | 
             
                extend Forwardable
         | 
| 62 61 | 
             
                attr_reader(:deadline)
         | 
| 63 62 | 
             
                def_delegators :@call, :cancel, :metadata, :write_flag, :write_flag=,
         | 
| 64 | 
            -
                               :peer, :peer_cert
         | 
| 63 | 
            +
                               :peer, :peer_cert, :trailing_metadata
         | 
| 65 64 |  | 
| 66 65 | 
             
                # client_invoke begins a client invocation.
         | 
| 67 66 | 
             
                #
         | 
| @@ -75,17 +74,10 @@ module GRPC | |
| 75 74 | 
             
                # if a keyword value is a list, multiple metadata for it's key are sent
         | 
| 76 75 | 
             
                #
         | 
| 77 76 | 
             
                # @param call [Call] a call on which to start and invocation
         | 
| 78 | 
            -
                # @param q [CompletionQueue] the completion queue
         | 
| 79 77 | 
             
                # @param metadata [Hash] the metadata
         | 
| 80 | 
            -
                def self.client_invoke(call,  | 
| 78 | 
            +
                def self.client_invoke(call, metadata = {})
         | 
| 81 79 | 
             
                  fail(TypeError, '!Core::Call') unless call.is_a? Core::Call
         | 
| 82 | 
            -
                   | 
| 83 | 
            -
                    fail(TypeError, '!Core::CompletionQueue')
         | 
| 84 | 
            -
                  end
         | 
| 85 | 
            -
                  metadata_tag = Object.new
         | 
| 86 | 
            -
                  call.run_batch(q, metadata_tag, INFINITE_FUTURE,
         | 
| 87 | 
            -
                                 SEND_INITIAL_METADATA => metadata)
         | 
| 88 | 
            -
                  metadata_tag
         | 
| 80 | 
            +
                  call.run_batch(SEND_INITIAL_METADATA => metadata)
         | 
| 89 81 | 
             
                end
         | 
| 90 82 |  | 
| 91 83 | 
             
                # Creates an ActiveCall.
         | 
| @@ -102,26 +94,21 @@ module GRPC | |
| 102 94 | 
             
                # deadline is the absolute deadline for the call.
         | 
| 103 95 | 
             
                #
         | 
| 104 96 | 
             
                # @param call [Call] the call used by the ActiveCall
         | 
| 105 | 
            -
                # @param q [CompletionQueue] the completion queue used to accept
         | 
| 106 | 
            -
                #          the call.  This queue will be closed on call completion.
         | 
| 107 97 | 
             
                # @param marshal [Function] f(obj)->string that marshal requests
         | 
| 108 98 | 
             
                # @param unmarshal [Function] f(string)->obj that unmarshals responses
         | 
| 109 99 | 
             
                # @param deadline [Fixnum] the deadline for the call to complete
         | 
| 110 | 
            -
                # @param  | 
| 111 | 
            -
                # @param  | 
| 112 | 
            -
                 | 
| 113 | 
            -
             | 
| 100 | 
            +
                # @param started [true|false] indicates that metadata was sent
         | 
| 101 | 
            +
                # @param metadata_received [true|false] indicates if metadata has already
         | 
| 102 | 
            +
                #     been received. Should always be true for server calls
         | 
| 103 | 
            +
                def initialize(call, marshal, unmarshal, deadline, started: true,
         | 
| 104 | 
            +
                               metadata_received: false)
         | 
| 114 105 | 
             
                  fail(TypeError, '!Core::Call') unless call.is_a? Core::Call
         | 
| 115 | 
            -
                  unless q.is_a? Core::CompletionQueue
         | 
| 116 | 
            -
                    fail(TypeError, '!Core::CompletionQueue')
         | 
| 117 | 
            -
                  end
         | 
| 118 106 | 
             
                  @call = call
         | 
| 119 | 
            -
                  @cq = q
         | 
| 120 107 | 
             
                  @deadline = deadline
         | 
| 121 108 | 
             
                  @marshal = marshal
         | 
| 122 | 
            -
                  @started = started
         | 
| 123 109 | 
             
                  @unmarshal = unmarshal
         | 
| 124 | 
            -
                  @ | 
| 110 | 
            +
                  @metadata_received = metadata_received
         | 
| 111 | 
            +
                  @metadata_sent = started
         | 
| 125 112 | 
             
                  @op_notifier = nil
         | 
| 126 113 | 
             
                end
         | 
| 127 114 |  | 
| @@ -132,7 +119,7 @@ module GRPC | |
| 132 119 | 
             
                end
         | 
| 133 120 |  | 
| 134 121 | 
             
                # cancelled indicates if the call was cancelled
         | 
| 135 | 
            -
                def cancelled
         | 
| 122 | 
            +
                def cancelled?
         | 
| 136 123 | 
             
                  !@call.status.nil? && @call.status.code == Core::StatusCodes::CANCELLED
         | 
| 137 124 | 
             
                end
         | 
| 138 125 |  | 
| @@ -168,8 +155,11 @@ module GRPC | |
| 168 155 | 
             
                    SEND_CLOSE_FROM_CLIENT => nil
         | 
| 169 156 | 
             
                  }
         | 
| 170 157 | 
             
                  ops[RECV_STATUS_ON_CLIENT] = nil if assert_finished
         | 
| 171 | 
            -
                  batch_result = @call.run_batch( | 
| 158 | 
            +
                  batch_result = @call.run_batch(ops)
         | 
| 172 159 | 
             
                  return unless assert_finished
         | 
| 160 | 
            +
                  unless batch_result.status.nil?
         | 
| 161 | 
            +
                    @call.trailing_metadata = batch_result.status.metadata
         | 
| 162 | 
            +
                  end
         | 
| 173 163 | 
             
                  @call.status = batch_result.status
         | 
| 174 164 | 
             
                  op_is_done
         | 
| 175 165 | 
             
                  batch_result.check_status
         | 
| @@ -179,20 +169,14 @@ module GRPC | |
| 179 169 | 
             
                #
         | 
| 180 170 | 
             
                # It blocks until the remote endpoint acknowledges by sending a status.
         | 
| 181 171 | 
             
                def finished
         | 
| 182 | 
            -
                  batch_result = @call.run_batch( | 
| 183 | 
            -
                                                 RECV_STATUS_ON_CLIENT => nil)
         | 
| 172 | 
            +
                  batch_result = @call.run_batch(RECV_STATUS_ON_CLIENT => nil)
         | 
| 184 173 | 
             
                  unless batch_result.status.nil?
         | 
| 185 | 
            -
                     | 
| 186 | 
            -
                      @call.metadata = batch_result.status.metadata
         | 
| 187 | 
            -
                    else
         | 
| 188 | 
            -
                      @call.metadata.merge!(batch_result.status.metadata)
         | 
| 189 | 
            -
                    end
         | 
| 174 | 
            +
                    @call.trailing_metadata = batch_result.status.metadata
         | 
| 190 175 | 
             
                  end
         | 
| 191 176 | 
             
                  @call.status = batch_result.status
         | 
| 192 177 | 
             
                  op_is_done
         | 
| 193 178 | 
             
                  batch_result.check_status
         | 
| 194 179 | 
             
                  @call.close
         | 
| 195 | 
            -
                  @cq.close
         | 
| 196 180 | 
             
                end
         | 
| 197 181 |  | 
| 198 182 | 
             
                # remote_send sends a request to the remote endpoint.
         | 
| @@ -203,9 +187,10 @@ module GRPC | |
| 203 187 | 
             
                # @param marshalled [false, true] indicates if the object is already
         | 
| 204 188 | 
             
                # marshalled.
         | 
| 205 189 | 
             
                def remote_send(req, marshalled = false)
         | 
| 190 | 
            +
                  # TODO(murgatroid99): ensure metadata was sent
         | 
| 206 191 | 
             
                  GRPC.logger.debug("sending #{req}, marshalled? #{marshalled}")
         | 
| 207 192 | 
             
                  payload = marshalled ? req : @marshal.call(req)
         | 
| 208 | 
            -
                  @call.run_batch( | 
| 193 | 
            +
                  @call.run_batch(SEND_MESSAGE => payload)
         | 
| 209 194 | 
             
                end
         | 
| 210 195 |  | 
| 211 196 | 
             
                # send_status sends a status to the remote endpoint.
         | 
| @@ -222,7 +207,7 @@ module GRPC | |
| 222 207 | 
             
                    SEND_STATUS_FROM_SERVER => Struct::Status.new(code, details, metadata)
         | 
| 223 208 | 
             
                  }
         | 
| 224 209 | 
             
                  ops[RECV_CLOSE_ON_SERVER] = nil if assert_finished
         | 
| 225 | 
            -
                  @call.run_batch( | 
| 210 | 
            +
                  @call.run_batch(ops)
         | 
| 226 211 | 
             
                  nil
         | 
| 227 212 | 
             
                end
         | 
| 228 213 |  | 
| @@ -234,11 +219,11 @@ module GRPC | |
| 234 219 | 
             
                # raising BadStatus
         | 
| 235 220 | 
             
                def remote_read
         | 
| 236 221 | 
             
                  ops = { RECV_MESSAGE => nil }
         | 
| 237 | 
            -
                  ops[RECV_INITIAL_METADATA] = nil unless @ | 
| 238 | 
            -
                  batch_result = @call.run_batch( | 
| 239 | 
            -
                  unless @ | 
| 222 | 
            +
                  ops[RECV_INITIAL_METADATA] = nil unless @metadata_received
         | 
| 223 | 
            +
                  batch_result = @call.run_batch(ops)
         | 
| 224 | 
            +
                  unless @metadata_received
         | 
| 240 225 | 
             
                    @call.metadata = batch_result.metadata
         | 
| 241 | 
            -
                    @ | 
| 226 | 
            +
                    @metadata_received = true
         | 
| 242 227 | 
             
                  end
         | 
| 243 228 | 
             
                  GRPC.logger.debug("received req: #{batch_result}")
         | 
| 244 229 | 
             
                  unless batch_result.nil? || batch_result.message.nil?
         | 
| @@ -318,7 +303,7 @@ module GRPC | |
| 318 303 | 
             
                # a list, multiple metadata for its key are sent
         | 
| 319 304 | 
             
                # @return [Object] the response received from the server
         | 
| 320 305 | 
             
                def request_response(req, metadata: {})
         | 
| 321 | 
            -
                  start_call(metadata) | 
| 306 | 
            +
                  start_call(metadata)
         | 
| 322 307 | 
             
                  remote_send(req)
         | 
| 323 308 | 
             
                  writes_done(false)
         | 
| 324 309 | 
             
                  response = remote_read
         | 
| @@ -342,7 +327,7 @@ module GRPC | |
| 342 327 | 
             
                # a list, multiple metadata for its key are sent
         | 
| 343 328 | 
             
                # @return [Object] the response received from the server
         | 
| 344 329 | 
             
                def client_streamer(requests, metadata: {})
         | 
| 345 | 
            -
                  start_call(metadata) | 
| 330 | 
            +
                  start_call(metadata)
         | 
| 346 331 | 
             
                  requests.each { |r| remote_send(r) }
         | 
| 347 332 | 
             
                  writes_done(false)
         | 
| 348 333 | 
             
                  response = remote_read
         | 
| @@ -368,7 +353,7 @@ module GRPC | |
| 368 353 | 
             
                # a list, multiple metadata for its key are sent
         | 
| 369 354 | 
             
                # @return [Enumerator|nil] a response Enumerator
         | 
| 370 355 | 
             
                def server_streamer(req, metadata: {})
         | 
| 371 | 
            -
                  start_call(metadata) | 
| 356 | 
            +
                  start_call(metadata)
         | 
| 372 357 | 
             
                  remote_send(req)
         | 
| 373 358 | 
             
                  writes_done(false)
         | 
| 374 359 | 
             
                  replies = enum_for(:each_remote_read_then_finish)
         | 
| @@ -407,10 +392,9 @@ module GRPC | |
| 407 392 | 
             
                # a list, multiple metadata for its key are sent
         | 
| 408 393 | 
             
                # @return [Enumerator, nil] a response Enumerator
         | 
| 409 394 | 
             
                def bidi_streamer(requests, metadata: {}, &blk)
         | 
| 410 | 
            -
                  start_call(metadata) | 
| 411 | 
            -
                  bd = BidiCall.new(@call, @ | 
| 412 | 
            -
                                     | 
| 413 | 
            -
                  @metadata_tag = nil  # run_on_client ensures metadata is read
         | 
| 395 | 
            +
                  start_call(metadata)
         | 
| 396 | 
            +
                  bd = BidiCall.new(@call, @marshal, @unmarshal,
         | 
| 397 | 
            +
                                    metadata_received: @metadata_received)
         | 
| 414 398 | 
             
                  bd.run_on_client(requests, @op_notifier, &blk)
         | 
| 415 399 | 
             
                end
         | 
| 416 400 |  | 
| @@ -426,7 +410,8 @@ module GRPC | |
| 426 410 | 
             
                #
         | 
| 427 411 | 
             
                # @param gen_each_reply [Proc] generates the BiDi stream replies
         | 
| 428 412 | 
             
                def run_server_bidi(gen_each_reply)
         | 
| 429 | 
            -
                  bd = BidiCall.new(@call, @ | 
| 413 | 
            +
                  bd = BidiCall.new(@call, @marshal, @unmarshal,
         | 
| 414 | 
            +
                                    metadata_received: @metadata_received)
         | 
| 430 415 | 
             
                  bd.run_on_server(gen_each_reply)
         | 
| 431 416 | 
             
                end
         | 
| 432 417 |  | 
| @@ -449,9 +434,9 @@ module GRPC | |
| 449 434 | 
             
                # @param metadata [Hash] metadata to be sent to the server. If a value is
         | 
| 450 435 | 
             
                # a list, multiple metadata for its key are sent
         | 
| 451 436 | 
             
                def start_call(metadata = {})
         | 
| 452 | 
            -
                  return if @ | 
| 453 | 
            -
                  @metadata_tag = ActiveCall.client_invoke(@call,  | 
| 454 | 
            -
                  @ | 
| 437 | 
            +
                  return if @metadata_sent
         | 
| 438 | 
            +
                  @metadata_tag = ActiveCall.client_invoke(@call, metadata)
         | 
| 439 | 
            +
                  @metadata_sent = true
         | 
| 455 440 | 
             
                end
         | 
| 456 441 |  | 
| 457 442 | 
             
                def self.view_class(*visible_methods)
         | 
| @@ -468,18 +453,18 @@ module GRPC | |
| 468 453 |  | 
| 469 454 | 
             
                # SingleReqView limits access to an ActiveCall's methods for use in server
         | 
| 470 455 | 
             
                # handlers that receive just one request.
         | 
| 471 | 
            -
                SingleReqView = view_class(:cancelled | 
| 456 | 
            +
                SingleReqView = view_class(:cancelled?, :deadline, :metadata,
         | 
| 472 457 | 
             
                                           :output_metadata, :peer, :peer_cert)
         | 
| 473 458 |  | 
| 474 459 | 
             
                # MultiReqView limits access to an ActiveCall's methods for use in
         | 
| 475 460 | 
             
                # server client_streamer handlers.
         | 
| 476 | 
            -
                MultiReqView = view_class(:cancelled | 
| 461 | 
            +
                MultiReqView = view_class(:cancelled?, :deadline, :each_queued_msg,
         | 
| 477 462 | 
             
                                          :each_remote_read, :metadata, :output_metadata)
         | 
| 478 463 |  | 
| 479 464 | 
             
                # Operation limits access to an ActiveCall's methods for use as
         | 
| 480 465 | 
             
                # a Operation on the client.
         | 
| 481 | 
            -
                Operation = view_class(:cancel, :cancelled | 
| 466 | 
            +
                Operation = view_class(:cancel, :cancelled?, :deadline, :execute,
         | 
| 482 467 | 
             
                                       :metadata, :status, :start_call, :wait, :write_flag,
         | 
| 483 | 
            -
                                       :write_flag | 
| 468 | 
            +
                                       :write_flag=, :trailing_metadata)
         | 
| 484 469 | 
             
              end
         | 
| 485 470 | 
             
            end
         | 
| @@ -52,23 +52,18 @@ module GRPC | |
| 52 52 | 
             
                # deadline is the absolute deadline for the call.
         | 
| 53 53 | 
             
                #
         | 
| 54 54 | 
             
                # @param call [Call] the call used by the ActiveCall
         | 
| 55 | 
            -
                # @param q [CompletionQueue] the completion queue used to accept
         | 
| 56 | 
            -
                #          the call
         | 
| 57 55 | 
             
                # @param marshal [Function] f(obj)->string that marshal requests
         | 
| 58 56 | 
             
                # @param unmarshal [Function] f(string)->obj that unmarshals responses
         | 
| 59 | 
            -
                # @param  | 
| 60 | 
            -
                 | 
| 57 | 
            +
                # @param metadata_received [true|false] indicates if metadata has already
         | 
| 58 | 
            +
                #     been received. Should always be true for server calls
         | 
| 59 | 
            +
                def initialize(call, marshal, unmarshal, metadata_received: false)
         | 
| 61 60 | 
             
                  fail(ArgumentError, 'not a call') unless call.is_a? Core::Call
         | 
| 62 | 
            -
                  unless q.is_a? Core::CompletionQueue
         | 
| 63 | 
            -
                    fail(ArgumentError, 'not a CompletionQueue')
         | 
| 64 | 
            -
                  end
         | 
| 65 61 | 
             
                  @call = call
         | 
| 66 | 
            -
                  @cq = q
         | 
| 67 62 | 
             
                  @marshal = marshal
         | 
| 68 63 | 
             
                  @op_notifier = nil  # signals completion on clients
         | 
| 69 64 | 
             
                  @readq = Queue.new
         | 
| 70 65 | 
             
                  @unmarshal = unmarshal
         | 
| 71 | 
            -
                  @ | 
| 66 | 
            +
                  @metadata_received = metadata_received
         | 
| 72 67 | 
             
                  @reads_complete = false
         | 
| 73 68 | 
             
                  @writes_complete = false
         | 
| 74 69 | 
             
                  @complete = false
         | 
| @@ -81,7 +76,7 @@ module GRPC | |
| 81 76 | 
             
                # block that can be invoked with each response.
         | 
| 82 77 | 
             
                #
         | 
| 83 78 | 
             
                # @param requests the Enumerable of requests to send
         | 
| 84 | 
            -
                # @op_notifier a Notifier used to signal completion
         | 
| 79 | 
            +
                # @param op_notifier a Notifier used to signal completion
         | 
| 85 80 | 
             
                # @return an Enumerator of requests to yield
         | 
| 86 81 | 
             
                def run_on_client(requests, op_notifier, &blk)
         | 
| 87 82 | 
             
                  @op_notifier = op_notifier
         | 
| @@ -124,7 +119,6 @@ module GRPC | |
| 124 119 | 
             
                  @done_mutex.synchronize do
         | 
| 125 120 | 
             
                    return unless @reads_complete && @writes_complete && !@complete
         | 
| 126 121 | 
             
                    @call.close
         | 
| 127 | 
            -
                    @cq.close
         | 
| 128 122 | 
             
                    @complete = true
         | 
| 129 123 | 
             
                  end
         | 
| 130 124 | 
             
                end
         | 
| @@ -132,11 +126,11 @@ module GRPC | |
| 132 126 | 
             
                # performs a read using @call.run_batch, ensures metadata is set up
         | 
| 133 127 | 
             
                def read_using_run_batch
         | 
| 134 128 | 
             
                  ops = { RECV_MESSAGE => nil }
         | 
| 135 | 
            -
                  ops[RECV_INITIAL_METADATA] = nil unless @ | 
| 136 | 
            -
                  batch_result = @call.run_batch( | 
| 137 | 
            -
                  unless @ | 
| 129 | 
            +
                  ops[RECV_INITIAL_METADATA] = nil unless @metadata_received
         | 
| 130 | 
            +
                  batch_result = @call.run_batch(ops)
         | 
| 131 | 
            +
                  unless @metadata_received
         | 
| 138 132 | 
             
                    @call.metadata = batch_result.metadata
         | 
| 139 | 
            -
                    @ | 
| 133 | 
            +
                    @metadata_received = true
         | 
| 140 134 | 
             
                  end
         | 
| 141 135 | 
             
                  batch_result
         | 
| 142 136 | 
             
                end
         | 
| @@ -161,20 +155,26 @@ module GRPC | |
| 161 155 |  | 
| 162 156 | 
             
                def write_loop(requests, is_client: true)
         | 
| 163 157 | 
             
                  GRPC.logger.debug('bidi-write-loop: starting')
         | 
| 164 | 
            -
                  write_tag = Object.new
         | 
| 165 158 | 
             
                  count = 0
         | 
| 166 159 | 
             
                  requests.each do |req|
         | 
| 167 160 | 
             
                    GRPC.logger.debug("bidi-write-loop: #{count}")
         | 
| 168 161 | 
             
                    count += 1
         | 
| 169 162 | 
             
                    payload = @marshal.call(req)
         | 
| 170 | 
            -
                     | 
| 171 | 
            -
             | 
| 163 | 
            +
                    # Fails if status already received
         | 
| 164 | 
            +
                    begin
         | 
| 165 | 
            +
                      @call.run_batch(SEND_MESSAGE => payload)
         | 
| 166 | 
            +
                    rescue GRPC::Core::CallError => e
         | 
| 167 | 
            +
                      # This is almost definitely caused by a status arriving while still
         | 
| 168 | 
            +
                      # writing. Don't re-throw the error
         | 
| 169 | 
            +
                      GRPC.logger.warn('bidi-write-loop: ended with error')
         | 
| 170 | 
            +
                      GRPC.logger.warn(e)
         | 
| 171 | 
            +
                      break
         | 
| 172 | 
            +
                    end
         | 
| 172 173 | 
             
                  end
         | 
| 173 174 | 
             
                  GRPC.logger.debug("bidi-write-loop: #{count} writes done")
         | 
| 174 175 | 
             
                  if is_client
         | 
| 175 176 | 
             
                    GRPC.logger.debug("bidi-write-loop: client sent #{count}, waiting")
         | 
| 176 | 
            -
                    @call.run_batch( | 
| 177 | 
            -
                                    SEND_CLOSE_FROM_CLIENT => nil)
         | 
| 177 | 
            +
                    @call.run_batch(SEND_CLOSE_FROM_CLIENT => nil)
         | 
| 178 178 | 
             
                    GRPC.logger.debug('bidi-write-loop: done')
         | 
| 179 179 | 
             
                    notify_done
         | 
| 180 180 | 
             
                    @writes_complete = true
         | 
| @@ -195,7 +195,6 @@ module GRPC | |
| 195 195 | 
             
                  Thread.new do
         | 
| 196 196 | 
             
                    GRPC.logger.debug('bidi-read-loop: starting')
         | 
| 197 197 | 
             
                    begin
         | 
| 198 | 
            -
                      read_tag = Object.new
         | 
| 199 198 | 
             
                      count = 0
         | 
| 200 199 | 
             
                      # queue the initial read before beginning the loop
         | 
| 201 200 | 
             
                      loop do
         | 
| @@ -208,8 +207,7 @@ module GRPC | |
| 208 207 | 
             
                          GRPC.logger.debug("bidi-read-loop: null batch #{batch_result}")
         | 
| 209 208 |  | 
| 210 209 | 
             
                          if is_client
         | 
| 211 | 
            -
                            batch_result = @call.run_batch( | 
| 212 | 
            -
                                                           RECV_STATUS_ON_CLIENT => nil)
         | 
| 210 | 
            +
                            batch_result = @call.run_batch(RECV_STATUS_ON_CLIENT => nil)
         | 
| 213 211 | 
             
                            @call.status = batch_result.status
         | 
| 214 212 | 
             
                            batch_result.check_status
         | 
| 215 213 | 
             
                            GRPC.logger.debug("bidi-read-loop: done status #{@call.status}")
         | 
| @@ -34,7 +34,8 @@ require_relative '../version' | |
| 34 34 | 
             
            module GRPC
         | 
| 35 35 | 
             
              # rubocop:disable Metrics/ParameterLists
         | 
| 36 36 |  | 
| 37 | 
            -
              # ClientStub represents  | 
| 37 | 
            +
              # ClientStub represents a client connection to a gRPC server, and can be used
         | 
| 38 | 
            +
              # to send requests.
         | 
| 38 39 | 
             
              class ClientStub
         | 
| 39 40 | 
             
                include Core::StatusCodes
         | 
| 40 41 | 
             
                include Core::TimeConsts
         | 
| @@ -75,8 +76,9 @@ module GRPC | |
| 75 76 | 
             
                # my_stub = ClientStub.new(example.host.com:50505,
         | 
| 76 77 | 
             
                #                          :this_channel_is_insecure)
         | 
| 77 78 | 
             
                #
         | 
| 78 | 
            -
                #  | 
| 79 | 
            -
                #  | 
| 79 | 
            +
                # If a channel_override argument is passed, it will be used as the
         | 
| 80 | 
            +
                # underlying channel. Otherwise, the channel_args argument will be used
         | 
| 81 | 
            +
                # to construct a new underlying channel.
         | 
| 80 82 | 
             
                #
         | 
| 81 83 | 
             
                # There are some specific keyword args that are not used to configure the
         | 
| 82 84 | 
             
                # channel:
         | 
| @@ -90,19 +92,23 @@ module GRPC | |
| 90 92 | 
             
                # when present, this is the default timeout used for calls
         | 
| 91 93 | 
             
                #
         | 
| 92 94 | 
             
                # @param host [String] the host the stub connects to
         | 
| 93 | 
            -
                # @param q [Core::CompletionQueue] used to wait for events - now deprecated
         | 
| 94 | 
            -
                #        since each new active call gets its own separately
         | 
| 95 95 | 
             
                # @param creds [Core::ChannelCredentials|Symbol] the channel credentials, or
         | 
| 96 | 
            -
                #     :this_channel_is_insecure
         | 
| 96 | 
            +
                #     :this_channel_is_insecure, which explicitly indicates that the client
         | 
| 97 | 
            +
                #     should be created with an insecure connection. Note: this argument is
         | 
| 98 | 
            +
                #     ignored if the channel_override argument is provided.
         | 
| 97 99 | 
             
                # @param channel_override [Core::Channel] a pre-created channel
         | 
| 98 100 | 
             
                # @param timeout [Number] the default timeout to use in requests
         | 
| 99 | 
            -
                # @param  | 
| 100 | 
            -
                 | 
| 101 | 
            +
                # @param propagate_mask [Number] A bitwise combination of flags in
         | 
| 102 | 
            +
                #     GRPC::Core::PropagateMasks. Indicates how data should be propagated
         | 
| 103 | 
            +
                #     from parent server calls to child client calls if this client is being
         | 
| 104 | 
            +
                #     used within a gRPC server.
         | 
| 105 | 
            +
                # @param channel_args [Hash] the channel arguments. Note: this argument is
         | 
| 106 | 
            +
                #     ignored if the channel_override argument is provided.
         | 
| 107 | 
            +
                def initialize(host, creds,
         | 
| 101 108 | 
             
                               channel_override: nil,
         | 
| 102 109 | 
             
                               timeout: nil,
         | 
| 103 110 | 
             
                               propagate_mask: nil,
         | 
| 104 111 | 
             
                               channel_args: {})
         | 
| 105 | 
            -
                  fail(TypeError, '!CompletionQueue') unless q.is_a?(Core::CompletionQueue)
         | 
| 106 112 | 
             
                  @ch = ClientStub.setup_channel(channel_override, host, creds,
         | 
| 107 113 | 
             
                                                 channel_args)
         | 
| 108 114 | 
             
                  alt_host = channel_args[Core::Channel::SSL_TARGET]
         | 
| @@ -392,11 +398,11 @@ module GRPC | |
| 392 398 | 
             
                # @param marshal [Function] f(obj)->string that marshals requests
         | 
| 393 399 | 
             
                # @param unmarshal [Function] f(string)->obj that unmarshals responses
         | 
| 394 400 | 
             
                # @param deadline [Time] (optional) the time the request should complete
         | 
| 401 | 
            +
                # @param return_op [true|false] return an Operation if true
         | 
| 395 402 | 
             
                # @param parent [Core::Call] a prior call whose reserved metadata
         | 
| 396 403 | 
             
                #   will be propagated by this one.
         | 
| 397 404 | 
             
                # @param credentials [Core::CallCredentials] credentials to use when making
         | 
| 398 405 | 
             
                #   the call
         | 
| 399 | 
            -
                # @param return_op [true|false] return an Operation if true
         | 
| 400 406 | 
             
                # @param metadata [Hash] metadata to be sent to the server
         | 
| 401 407 | 
             
                # @param blk [Block] when provided, is executed for each response
         | 
| 402 408 | 
             
                # @return [Enumerator|nil|Operation] as discussed above
         | 
| @@ -433,7 +439,8 @@ module GRPC | |
| 433 439 | 
             
                # @param unmarshal [Function] f(string)->obj that unmarshals responses
         | 
| 434 440 | 
             
                # @param parent [Grpc::Call] a parent call, available when calls are
         | 
| 435 441 | 
             
                #   made from server
         | 
| 436 | 
            -
                # @param  | 
| 442 | 
            +
                # @param credentials [Core::CallCredentials] credentials to use when making
         | 
| 443 | 
            +
                #   the call
         | 
| 437 444 | 
             
                def new_active_call(method, marshal, unmarshal,
         | 
| 438 445 | 
             
                                    deadline: nil,
         | 
| 439 446 | 
             
                                    parent: nil,
         | 
| @@ -441,15 +448,13 @@ module GRPC | |
| 441 448 |  | 
| 442 449 | 
             
                  deadline = from_relative_time(@timeout) if deadline.nil?
         | 
| 443 450 | 
             
                  # Provide each new client call with its own completion queue
         | 
| 444 | 
            -
                   | 
| 445 | 
            -
                  call = @ch.create_call(call_queue,
         | 
| 446 | 
            -
                                         parent, # parent call
         | 
| 451 | 
            +
                  call = @ch.create_call(parent, # parent call
         | 
| 447 452 | 
             
                                         @propagate_mask, # propagation options
         | 
| 448 453 | 
             
                                         method,
         | 
| 449 454 | 
             
                                         nil, # host use nil,
         | 
| 450 455 | 
             
                                         deadline)
         | 
| 451 456 | 
             
                  call.set_credentials! credentials unless credentials.nil?
         | 
| 452 | 
            -
                  ActiveCall.new(call,  | 
| 457 | 
            +
                  ActiveCall.new(call, marshal, unmarshal, deadline,
         | 
| 453 458 | 
             
                                 started: false)
         | 
| 454 459 | 
             
                end
         | 
| 455 460 | 
             
              end
         |