lib/grpc/server/stream.ex

defmodule GRPC.Server.Stream do
  @moduledoc """
  A struct as an argument that servers get in rpc function definitions and use to handle headers,
  send streaming replies.

  Notice that you MUST use new stream returned by `GRPC.Server` as an argument to invoke next
  functions defined by `GRPC.Server`.

  ## Fields

    * `:server`            - user defined gRPC server module
    * `:adapter`           - a server adapter module, like `GRPC.Adapter.Cowboy`
    * `request_mod`        - the request module, or nil for untyped protocols
    * `response_mod`       - the response module, or nil for untyped protocols
    * `:codec`             - the codec
    * `:payload`           - the payload needed by the adapter
    * `:local`             - local data initialized by user
  """

  @type t :: %__MODULE__{
          server: atom,
          service_name: String.t(),
          method_name: String.t(),
          grpc_type: atom,
          endpoint: atom,
          rpc: tuple,
          request_mod: atom,
          response_mod: atom,
          codec: atom,
          payload: any,
          adapter: atom,
          local: any,
          # compressor mainly is used in client decompressing, responses compressing should be set by
          # `GRPC.Server.set_compressor`
          compressor: module | nil,
          __interface__: map
        }

  defstruct server: nil,
            service_name: nil,
            method_name: nil,
            grpc_type: nil,
            endpoint: nil,
            rpc: nil,
            request_mod: nil,
            response_mod: nil,
            codec: GRPC.Codec.Proto,
            payload: nil,
            adapter: nil,
            local: nil,
            compressor: nil,
            __interface__: %{send_reply: &__MODULE__.send_reply/3}

  def send_reply(%{adapter: adapter, codec: codec} = stream, reply, opts) do
    # {:ok, data, _size} = reply |> codec.encode() |> GRPC.Message.to_data()
    data = codec.encode(reply)
    adapter.send_reply(stream.payload, data, opts)
    stream
  end
end