-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.