Current section

Files

Jump to
glitch src glitch@auth@auth_provider.erl
Raw

src/glitch@auth@auth_provider.erl

-module(glitch@auth@auth_provider).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]).
-export([new_client_credentials_provider/2, new_static_provider/2, new_refreshing_provider/4, client_id/1, access_token/1]).
-export_type([auth_provider/0]).
-opaque auth_provider() :: {client_credentials_auth_provider,
gleam@option:option(glitch@types@access_token:access_token()),
binary(),
binary()} |
{refreshing_auth_provider,
glitch@types@access_token:access_token(),
binary(),
binary(),
gleam@option:option(fun((glitch@types@access_token:access_token()) -> nil))} |
{static_auth_provider, glitch@types@access_token:access_token(), binary()}.
-spec new_client_credentials_provider(binary(), binary()) -> auth_provider().
new_client_credentials_provider(Client_id, Client_secret) ->
{client_credentials_auth_provider, none, Client_id, Client_secret}.
-spec new_static_provider(glitch@types@access_token:access_token(), binary()) -> auth_provider().
new_static_provider(Access_token, Client_id) ->
{static_auth_provider, Access_token, Client_id}.
-spec new_refreshing_provider(
glitch@types@access_token:access_token(),
binary(),
binary(),
gleam@option:option(fun((glitch@types@access_token:access_token()) -> nil))
) -> auth_provider().
new_refreshing_provider(Access_token, Client_id, Client_secret, On_refresh) ->
{refreshing_auth_provider,
Access_token,
Client_id,
Client_secret,
On_refresh}.
-spec client_id(auth_provider()) -> binary().
client_id(Auth_provider) ->
case Auth_provider of
{client_credentials_auth_provider, _, Client_id, _} ->
Client_id;
{refreshing_auth_provider, _, Client_id@1, _, _} ->
Client_id@1;
{static_auth_provider, _, Client_id@2} ->
Client_id@2
end.
-spec access_token_for_refreshing_provider(
glitch@types@access_token:access_token(),
binary(),
binary(),
gleam@option:option(fun((glitch@types@access_token:access_token()) -> nil))
) -> {ok, glitch@types@access_token:access_token()} |
{error, glitch@error:twitch_error()}.
access_token_for_refreshing_provider(
Access_token,
Client_id,
Client_secret,
On_refresh
) ->
case {glitch@types@access_token:is_expired(Access_token),
glitch@types@access_token:needs_validated(Access_token)} of
{true, _} ->
gleam@result:'try'(
glitch@types@access_token:refresh_token(Access_token),
fun(Refresh_token) ->
Refresh_token_request = glitch@api@auth:new_refresh_token_grant_request(
Client_id,
Client_secret,
Refresh_token
),
gleam@result:'try'(
glitch@api@auth:refresh_token(Refresh_token_request),
fun(Refreshed_token) -> case On_refresh of
none ->
{ok, Refreshed_token};
{some, On_refresh@1} ->
On_refresh@1(Refreshed_token),
{ok, Refreshed_token}
end end
)
end
);
{false, true} ->
gleam@result:'try'(
begin
_pipe = glitch@api@auth:validate_token(Access_token),
gleam@result:map_error(
_pipe,
fun(Error) ->
{auth_error, {validate_token_error, Error}}
end
)
end,
fun(Validate_token_response) ->
{ok,
glitch@types@access_token:set_expires_in(
Access_token,
erlang:element(6, Validate_token_response)
)}
end
);
{false, false} ->
{ok, Access_token}
end.
-spec fetch_token(glitch@api@auth:get_token_request()) -> {ok,
glitch@types@access_token:access_token()} |
{error, glitch@error:twitch_error()}.
fetch_token(Request) ->
_pipe = Request,
_pipe@1 = glitch@api@auth:get_token(_pipe),
gleam@result:map_error(
_pipe@1,
fun(Error) -> {auth_error, {token_fetcher_fetch_error, Error}} end
).
-spec access_token_for_client_credential_provider(
gleam@option:option(glitch@types@access_token:access_token()),
binary(),
binary()
) -> {ok, glitch@types@access_token:access_token()} |
{error, glitch@error:twitch_error()}.
access_token_for_client_credential_provider(
Access_token,
Client_id,
Client_secret
) ->
case Access_token of
none ->
fetch_token(
glitch@api@auth:new_client_credentials_grant_request(
Client_id,
Client_secret
)
);
{some, Access_token@1} ->
case {glitch@types@access_token:is_expired(Access_token@1),
glitch@types@access_token:needs_validated(Access_token@1)} of
{true, _} ->
{error, {auth_error, access_token_expired}};
{false, true} ->
gleam@result:'try'(
begin
_pipe = glitch@api@auth:validate_token(
Access_token@1
),
gleam@result:map_error(
_pipe,
fun(Error) ->
{auth_error, {validate_token_error, Error}}
end
)
end,
fun(Validate_token_response) ->
{ok,
glitch@types@access_token:set_expires_in(
Access_token@1,
erlang:element(6, Validate_token_response)
)}
end
);
{false, false} ->
{ok, Access_token@1}
end
end.
-spec access_token(auth_provider()) -> {ok,
glitch@types@access_token:access_token()} |
{error, glitch@error:twitch_error()}.
access_token(Auth_provider) ->
case Auth_provider of
{client_credentials_auth_provider,
Access_token,
Client_id,
Client_secret} ->
access_token_for_client_credential_provider(
Access_token,
Client_id,
Client_secret
);
{refreshing_auth_provider,
Access_token@1,
Client_id@1,
Client_secret@1,
On_refresh} ->
access_token_for_refreshing_provider(
Access_token@1,
Client_id@1,
Client_secret@1,
On_refresh
);
{static_auth_provider, Access_token@2, _} ->
{ok, Access_token@2}
end.