def run_server_bidi(mth, interception_ctx)
      view = multi_req_view
      bidi_call = BidiCall.new(
        @call,
        @marshal,
        @unmarshal,
        metadata_received: @metadata_received,
        req_view: view
      )
      requests = bidi_call.read_next_loop(proc { set_input_stream_done }, false)
      interception_ctx.intercept!(
        :bidi_streamer,
        call: view,
        method: mth,
        requests: requests
      ) do
        bidi_call.run_on_server(mth, requests)
      end
    end
def run_server_bidi(mth, interception_ctx)
      view = multi_req_view
      bidi_call = BidiCall.new(
        @call,
        @marshal,
        @unmarshal,
        metadata_received: @metadata_received,
        req_view: view
      )
      requests = bidi_call.read_next_loop(proc { set_input_stream_done }, false)
      interception_ctx.intercept!(
        :bidi_streamer,
        call: view,
        method: mth,
        requests: requests
      ) do
        bidi_call.run_on_server(mth, requests)
      end
    end
run_server_bidi orchestrates a BiDi stream processing on a server.

 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

 @param mth [Proc] generates the BiDi stream replies
 @param interception_ctx [InterceptionContext]