LogDB.Client.Parser behaviour (logdb_client v0.3.0)

Copy Markdown View Source

Как payload превращается в байты при публикации и обратно при доставке.

Тип payload объявляет тот, кто кодирует (_content_type в meta). Через erlangd байты кодирует клиент — парсер (encode_bytes/1); через HTTP/WS payload уходит JSON-значением, и тип ставит шина.

Summary

Callbacks

Раскодирует с учётом meta события и того, в каком виде его отдал транспорт: :bytes — как лежит в шине (erlangd), :json — уже значением JSON-ответа шины (WS, HTTP): JSON разобран, бинарь — base64 с _content_encoding.

Как decode/1, но не раскодированный payload — ошибка, а не сырой бинарь. Worker берёт её, если парсер её реализует: тогда в handle_event/4 не попадает то, что консьюмер не ждёт.

Терм → байты и их тип — для публикации через erlangd. Бинарь сюда не попадает: его клиент уже закодировал сам (тип — _content_type в meta).

Callbacks

decode(binary)

@callback decode(binary()) :: term()

decode_event(payload, meta, wire)

(optional)
@callback decode_event(payload :: term(), meta :: map(), wire :: :bytes | :json) ::
  {:ok, term()} | {:error, term()}

Раскодирует с учётом meta события и того, в каком виде его отдал транспорт: :bytes — как лежит в шине (erlangd), :json — уже значением JSON-ответа шины (WS, HTTP): JSON разобран, бинарь — base64 с _content_encoding.

decode_strict(binary)

(optional)
@callback decode_strict(binary()) :: {:ok, term()} | {:error, term()}

Как decode/1, но не раскодированный payload — ошибка, а не сырой бинарь. Worker берёт её, если парсер её реализует: тогда в handle_event/4 не попадает то, что консьюмер не ждёт.

encode(term)

@callback encode(term()) :: binary()

encode_bytes(term)

(optional)
@callback encode_bytes(term()) :: {:ok, binary(), String.t()} | {:error, term()}

Терм → байты и их тип — для публикации через erlangd. Бинарь сюда не попадает: его клиент уже закодировал сам (тип — _content_type в meta).