Current section

Files

Jump to
glitch src glitch@types@access_token.erl
Raw

src/glitch@types@access_token.erl

-module(glitch@types@access_token).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]).
-export([decoder/0, new_user_access_token/6, token/1, refresh_token/1, scopes/1, is_expired/1, needs_validated/1, set_expires_in/2]).
-export_type([access_token/0, raw_access_token/0]).
-opaque access_token() :: {app_access_token,
integer(),
integer(),
binary(),
integer()} |
{user_access_token,
integer(),
integer(),
binary(),
list(glitch@types@scope:scope()),
binary(),
integer()}.
-type raw_access_token() :: {raw_app_access_token, binary(), integer()} |
{raw_user_access_token,
binary(),
integer(),
binary(),
list(glitch@types@scope:scope())}.
-spec from_raw_access_token(raw_access_token()) -> access_token().
from_raw_access_token(Raw_access_token) ->
Now = os:system_time(second),
case Raw_access_token of
{raw_app_access_token, Access_token, Expires_in} ->
{app_access_token, Expires_in, Now, Access_token, Now};
{raw_user_access_token,
Access_token@1,
Expires_in@1,
Refresh_token,
Scope} ->
{user_access_token,
Expires_in@1,
Now,
Refresh_token,
Scope,
Access_token@1,
Now}
end.
-spec decoder() -> fun((gleam@dynamic:dynamic_()) -> {ok, access_token()} |
{error, list(gleam@dynamic:decode_error())}).
decoder() ->
fun(Data) -> _pipe = Data,
_pipe@1 = (gleam@dynamic:decode4(
fun(Field@0, Field@1, Field@2, Field@3) -> {raw_user_access_token, Field@0, Field@1, Field@2, Field@3} end,
gleam@dynamic:field(
<<"access_token"/utf8>>,
fun gleam@dynamic:string/1
),
gleam@dynamic:field(<<"expires_in"/utf8>>, fun gleam@dynamic:int/1),
gleam@dynamic:field(
<<"refresh_token"/utf8>>,
fun gleam@dynamic:string/1
),
gleam@dynamic:field(
<<"scope"/utf8>>,
gleam@dynamic:list(glitch@types@scope:decoder())
)
))(_pipe),
gleam@result:map(_pipe@1, fun from_raw_access_token/1) end.
-spec new_user_access_token(
integer(),
integer(),
binary(),
list(glitch@types@scope:scope()),
binary(),
gleam@option:option(integer())
) -> access_token().
new_user_access_token(
Expires_in,
Obtained_at,
Refresh_token,
Scopes,
Token,
Last_validated_at
) ->
{user_access_token,
Expires_in,
Obtained_at,
Refresh_token,
Scopes,
Token,
gleam@option:unwrap(Last_validated_at, 0)}.
-spec token(access_token()) -> binary().
token(Access_token) ->
case Access_token of
{user_access_token, _, _, _, _, Token, _} ->
Token;
{app_access_token, _, _, Token@1, _} ->
Token@1
end.
-spec refresh_token(access_token()) -> {ok, binary()} |
{error, glitch@error:twitch_error()}.
refresh_token(Access_token) ->
case Access_token of
{user_access_token, _, _, Refresh_token, _, _, _} ->
{ok, Refresh_token};
_ ->
{error, {auth_error, invalid_access_token}}
end.
-spec scopes(access_token()) -> {ok, list(glitch@types@scope:scope())} |
{error, glitch@error:twitch_error()}.
scopes(Access_token) ->
case Access_token of
{user_access_token, _, _, _, Scopes, _, _} ->
{ok, Scopes};
_ ->
{error, {auth_error, invalid_access_token}}
end.
-spec is_expired(access_token()) -> boolean().
is_expired(Access_token) ->
{Expires_in@2, Obtained_at@2} = case Access_token of
{user_access_token, Expires_in, Obtained_at, _, _, _, _} ->
{Expires_in, Obtained_at};
{app_access_token, Expires_in@1, Obtained_at@1, _, _} ->
{Expires_in@1, Obtained_at@1}
end,
Now = os:system_time(second),
Expire_time = Obtained_at@2 + Expires_in@2,
Now > Expire_time.
-spec needs_validated(access_token()) -> boolean().
needs_validated(Access_token) ->
Last_validated_at@2 = case Access_token of
{user_access_token, _, _, _, _, _, Last_validated_at} ->
Last_validated_at;
{app_access_token, _, _, _, Last_validated_at@1} ->
Last_validated_at@1
end,
Now = os:system_time(second),
One_hour_seconds = 3600,
Next_validation_time = Last_validated_at@2 + One_hour_seconds,
Now >= Next_validation_time.
-spec set_expires_in(access_token(), integer()) -> access_token().
set_expires_in(Access_token, Expires_in) ->
case Access_token of
{user_access_token,
_,
Obtained_at,
Refresh_token,
Scopes,
Token,
Last_validated_at} ->
{user_access_token,
Expires_in,
Obtained_at,
Refresh_token,
Scopes,
Token,
Last_validated_at};
{app_access_token, _, Obtained_at@1, Token@1, Last_validated_at@1} ->
{app_access_token,
Expires_in,
Obtained_at@1,
Token@1,
Last_validated_at@1}
end.