Current section
Files
Jump to
Current section
Files
src/glitch@eventsub@websocket_message.erl
-module(glitch@eventsub@websocket_message).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]).
-export([message_type_to_string/1, message_type_from_string/1, session_status_to_string/1, session_status_from_string/1, decoder/0, from_json/1]).
-export_type([web_socket_message/0, message_type/0, metadata/0, subscription_metadata/0, session_status/0, session/0, welcome_message_payload/0, notification_message_payload/0]).
-type web_socket_message() :: close |
{notification_message,
subscription_metadata(),
notification_message_payload()} |
{session_keepalive_message, metadata()} |
{unhandled_message, binary()} |
{welcome_message, metadata(), welcome_message_payload()}.
-type message_type() :: notification |
session_welcome |
session_keepalive |
session_reconnect |
revocation.
-type metadata() :: {metadata, binary(), message_type(), binary()}.
-type subscription_metadata() :: {subscription_metadata,
binary(),
message_type(),
binary(),
glitch@types@subscription:subscription_type(),
binary()}.
-type session_status() :: connected.
-type session() :: {session,
binary(),
session_status(),
binary(),
integer(),
gleam@option:option(gleam@uri:uri())}.
-type welcome_message_payload() :: {welcome_message_payload, session()}.
-type notification_message_payload() :: {notification_message_payload,
glitch@types@subscription:subscription(),
glitch@types@event:event()}.
-spec message_type_to_string(message_type()) -> binary().
message_type_to_string(Message_type) ->
case Message_type of
notification ->
<<"notification"/utf8>>;
session_welcome ->
<<"session_welcome"/utf8>>;
session_keepalive ->
<<"session_keepalive"/utf8>>;
session_reconnect ->
<<"sessions_reconnect"/utf8>>;
revocation ->
<<"revocation"/utf8>>
end.
-spec message_type_from_string(binary()) -> {ok, message_type()} | {error, nil}.
message_type_from_string(String) ->
case String of
<<"notification"/utf8>> ->
{ok, notification};
<<"session_welcome"/utf8>> ->
{ok, session_welcome};
<<"session_keepalive"/utf8>> ->
{ok, session_keepalive};
<<"sessions_reconnect"/utf8>> ->
{ok, session_reconnect};
<<"revocation"/utf8>> ->
{ok, revocation};
_ ->
{error, nil}
end.
-spec message_type_decoder() -> fun((gleam@dynamic:dynamic_()) -> {ok,
message_type()} |
{error, list(gleam@dynamic:decode_error())}).
message_type_decoder() ->
fun(Data) ->
gleam@result:'try'(
gleam@dynamic:string(Data),
fun(String) -> _pipe = String,
_pipe@1 = message_type_from_string(_pipe),
gleam@result:replace_error(
_pipe@1,
[{decode_error,
<<"MessageType"/utf8>>,
<<<<"String("/utf8, String/binary>>/binary,
")"/utf8>>,
[]}]
) end
)
end.
-spec metadata_decoder() -> fun((gleam@dynamic:dynamic_()) -> {ok, metadata()} |
{error, list(gleam@dynamic:decode_error())}).
metadata_decoder() ->
gleam@dynamic:decode3(
fun(Field@0, Field@1, Field@2) -> {metadata, Field@0, Field@1, Field@2} end,
gleam@dynamic:field(<<"message_id"/utf8>>, fun gleam@dynamic:string/1),
gleam@dynamic:field(<<"message_type"/utf8>>, message_type_decoder()),
gleam@dynamic:field(
<<"message_timestamp"/utf8>>,
fun gleam@dynamic:string/1
)
).
-spec session_keepalive_message_decoder() -> fun((gleam@dynamic:dynamic_()) -> {ok,
web_socket_message()} |
{error, list(gleam@dynamic:decode_error())}).
session_keepalive_message_decoder() ->
gleam@dynamic:decode1(
fun(Field@0) -> {session_keepalive_message, Field@0} end,
gleam@dynamic:field(<<"metadata"/utf8>>, metadata_decoder())
).
-spec subscription_metadata_decoder() -> fun((gleam@dynamic:dynamic_()) -> {ok,
subscription_metadata()} |
{error, list(gleam@dynamic:decode_error())}).
subscription_metadata_decoder() ->
gleam@dynamic:decode5(
fun(Field@0, Field@1, Field@2, Field@3, Field@4) -> {subscription_metadata, Field@0, Field@1, Field@2, Field@3, Field@4} end,
gleam@dynamic:field(<<"message_id"/utf8>>, fun gleam@dynamic:string/1),
gleam@dynamic:field(<<"message_type"/utf8>>, message_type_decoder()),
gleam@dynamic:field(
<<"message_timestamp"/utf8>>,
fun gleam@dynamic:string/1
),
gleam@dynamic:field(
<<"subscription_type"/utf8>>,
glitch@types@subscription:subscription_type_decoder()
),
gleam@dynamic:field(
<<"subscription_version"/utf8>>,
fun gleam@dynamic:string/1
)
).
-spec session_status_to_string(session_status()) -> binary().
session_status_to_string(Session_status) ->
case Session_status of
connected ->
<<"connnected"/utf8>>
end.
-spec session_status_from_string(binary()) -> {ok, session_status()} |
{error, nil}.
session_status_from_string(String) ->
case String of
<<"connected"/utf8>> ->
{ok, connected};
_ ->
{error, nil}
end.
-spec session_status_decoder() -> fun((gleam@dynamic:dynamic_()) -> {ok,
session_status()} |
{error, list(gleam@dynamic:decode_error())}).
session_status_decoder() ->
fun(Data) ->
gleam@result:'try'(
gleam@dynamic:string(Data),
fun(String) -> _pipe = String,
_pipe@1 = session_status_from_string(_pipe),
gleam@result:replace_error(
_pipe@1,
[{decode_error,
<<"SessionStatus"/utf8>>,
<<<<"String("/utf8, String/binary>>/binary,
")"/utf8>>,
[]}]
) end
)
end.
-spec session_decoder() -> fun((gleam@dynamic:dynamic_()) -> {ok, session()} |
{error, list(gleam@dynamic:decode_error())}).
session_decoder() ->
gleam@dynamic:decode5(
fun(Field@0, Field@1, Field@2, Field@3, Field@4) -> {session, Field@0, Field@1, Field@2, Field@3, Field@4} end,
gleam@dynamic:field(<<"id"/utf8>>, fun gleam@dynamic:string/1),
gleam@dynamic:field(<<"status"/utf8>>, session_status_decoder()),
gleam@dynamic:field(<<"connected_at"/utf8>>, fun gleam@dynamic:string/1),
gleam@dynamic:field(
<<"keepalive_timeout_seconds"/utf8>>,
fun gleam@dynamic:int/1
),
gleam@dynamic:field(
<<"reconnect_url"/utf8>>,
gleam@dynamic:optional(fun glitch@extended@dynamic_ext:uri/1)
)
).
-spec welcome_message_payload_decoder() -> fun((gleam@dynamic:dynamic_()) -> {ok,
welcome_message_payload()} |
{error, list(gleam@dynamic:decode_error())}).
welcome_message_payload_decoder() ->
gleam@dynamic:decode1(
fun(Field@0) -> {welcome_message_payload, Field@0} end,
gleam@dynamic:field(<<"session"/utf8>>, session_decoder())
).
-spec welcome_message_decoder() -> fun((gleam@dynamic:dynamic_()) -> {ok,
web_socket_message()} |
{error, list(gleam@dynamic:decode_error())}).
welcome_message_decoder() ->
gleam@dynamic:decode2(
fun(Field@0, Field@1) -> {welcome_message, Field@0, Field@1} end,
gleam@dynamic:field(<<"metadata"/utf8>>, metadata_decoder()),
gleam@dynamic:field(
<<"payload"/utf8>>,
welcome_message_payload_decoder()
)
).
-spec notification_message_payload_decoder() -> fun((gleam@dynamic:dynamic_()) -> {ok,
notification_message_payload()} |
{error, list(gleam@dynamic:decode_error())}).
notification_message_payload_decoder() ->
gleam@dynamic:decode2(
fun(Field@0, Field@1) -> {notification_message_payload, Field@0, Field@1} end,
gleam@dynamic:field(
<<"subscription"/utf8>>,
glitch@types@subscription:decoder()
),
gleam@dynamic:field(<<"event"/utf8>>, glitch@types@event:decoder())
).
-spec notification_message_decoder() -> fun((gleam@dynamic:dynamic_()) -> {ok,
web_socket_message()} |
{error, list(gleam@dynamic:decode_error())}).
notification_message_decoder() ->
gleam@dynamic:decode2(
fun(Field@0, Field@1) -> {notification_message, Field@0, Field@1} end,
gleam@dynamic:field(
<<"metadata"/utf8>>,
subscription_metadata_decoder()
),
gleam@dynamic:field(
<<"payload"/utf8>>,
notification_message_payload_decoder()
)
).
-spec decoder() -> fun((gleam@dynamic:dynamic_()) -> {ok, web_socket_message()} |
{error, list(gleam@dynamic:decode_error())}).
decoder() ->
gleam@dynamic:any(
[welcome_message_decoder(),
notification_message_decoder(),
session_keepalive_message_decoder()]
).
-spec from_json(binary()) -> {ok, web_socket_message()} |
{error, gleam@json:decode_error()}.
from_json(Json_string) ->
gleam@json:decode(Json_string, decoder()).