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