Как клиент говорит с шиной. Реализации: Erlangd (дистрибуция Erlang),
WebSocket (доставка и подтверждения), HTTP (публикация и
подтверждения), Hybrid (WS для доставки, HTTP для остального).
| Ответы — одной формы: команды `{:ok, результат} | }`, |
subscribe и ping — `:ok | }`. Чего транспорт не |
умеет, он не делает вид, что сделал, — отвечает ошибкой с кодом
:not_supported. Фасад (LogDB) приводит к этой форме и то, что ответил
транспорт не по контракту, но транспорт должен держать её сам.
Входящие события транспорт отдаёт консьюмеру сам —
LogDB.Client.Worker.deliver/5 (имя — opts[:name]) — или шлёт процессу-
владельцу (Connection) {:logdb_event, type, payload, meta}, если формат
задаёт не он (erlangd: события шлёт шина). В каком виде payload — :bytes
или :json — говорит wire/0. О состоянии соединения — владельцу:
{:transport_status, :connected | :ready | :disconnected}.
Противодавление: push-доставку (WS, erlangd) ограничивает шина —
max_ack_pending консьюмера (неподтверждённых не больше стольких).
Придерживать чтение сокета нельзя: ответы на подтверждения идут по нему же.
Кто забирает события сам (HTTP long-poll), берёт следующую пачку, когда
консьюмер разобрал эту (LogDB.Client.Worker.drained/2).
Summary
Callbacks
Подписка по адресу "stream/имя" (сервис шина знает по токену; LogDB с /v1).
В каком виде транспорт отдаёт payload событий; по умолчанию :json.
Types
@type ids() :: [String.t()]
@type opts() :: keyword()
@type result() :: {:ok, term()} | {:error, LogDB.Error.t()}
@type state() :: term()
@type status() :: :ok | {:error, LogDB.Error.t()}
Callbacks
@callback nack(state(), ids(), [{:delay_ms, non_neg_integer()}]) :: result()
Подписка по адресу "stream/имя" (сервис шина знает по токену; LogDB с /v1).
@callback wire() :: :bytes | :json
В каком виде транспорт отдаёт payload событий; по умолчанию :json.