Packages

A library for creating LTI 1.3 Tools in Gleam

Current section

Files

Jump to
lightbulb src lightbulb@providers@memory_provider.erl
Raw

src/lightbulb@providers@memory_provider.erl

-module(lightbulb@providers@memory_provider).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]).
-export([start/0, cleanup/1, create_jwk/2, cleanup_expired_nonces/1, delete_registration/2, get_active_jwk/1, get_all_jwks/1, create_nonce/1, validate_nonce/2, create_registration/2, list_registrations/1, get_registration/2, get_registration_by/3, create_deployment/2, get_deployment/4, data_provider/1]).
-export_type([state/0, message/0]).
-type state() :: {state,
fun((message()) -> nil),
list(lightbulb@jwk:jwk()),
binary(),
list(lightbulb@nonce:nonce()),
lightbulb@providers@memory_provider@tables:table(lightbulb@registration:registration()),
lightbulb@providers@memory_provider@tables:table(lightbulb@deployment:deployment())}.
-type message() :: shutdown |
{get_active_jwk,
gleam@erlang@process:subject({ok, lightbulb@jwk:jwk()} | {error, nil})} |
{get_all_jwks, gleam@erlang@process:subject(list(lightbulb@jwk:jwk()))} |
{create_jwk, lightbulb@jwk:jwk()} |
{set_active_jwk, binary()} |
{create_nonce,
gleam@erlang@process:subject({ok, lightbulb@nonce:nonce()} |
{error, nil})} |
{validate_nonce,
binary(),
gleam@erlang@process:subject({ok, nil} | {error, nil})} |
cleanup_expired_nonces |
{create_registration,
lightbulb@registration:registration(),
gleam@erlang@process:subject({ok,
{integer(), lightbulb@registration:registration()}} |
{error, nil})} |
{get_registration,
integer(),
gleam@erlang@process:subject({ok,
{integer(), lightbulb@registration:registration()}} |
{error, nil})} |
{get_registration_by,
binary(),
binary(),
gleam@erlang@process:subject({ok,
{integer(), lightbulb@registration:registration()}} |
{error, nil})} |
{get_all_registrations,
gleam@erlang@process:subject(list({integer(),
lightbulb@registration:registration()}))} |
{delete_registration, integer()} |
{create_deployment,
lightbulb@deployment:deployment(),
gleam@erlang@process:subject({ok,
{integer(), lightbulb@deployment:deployment()}} |
{error, nil})} |
{get_deployment,
binary(),
binary(),
binary(),
gleam@erlang@process:subject({ok,
{integer(), lightbulb@deployment:deployment()}} |
{error, binary()})}.
-file("src/lightbulb/providers/memory_provider.gleam", 78).
-spec handle_message(message(), state()) -> gleam@otp@actor:next(message(), state()).
handle_message(Message, State) ->
{state, Dispatch, _, _, _, _, _} = State,
case Message of
shutdown ->
{stop, normal};
{get_active_jwk, Reply_with} ->
case erlang:element(3, State) of
[] ->
gleam@otp@actor:send(Reply_with, {error, nil});
[Jwk | _] ->
gleam@otp@actor:send(Reply_with, {ok, Jwk})
end,
gleam@otp@actor:continue(State);
{get_all_jwks, Reply_with@1} ->
gleam@otp@actor:send(Reply_with@1, erlang:element(3, State)),
gleam@otp@actor:continue(State);
{create_jwk, Jwk@1} ->
case erlang:element(3, State) =:= [] of
true ->
Dispatch({set_active_jwk, erlang:element(2, Jwk@1)});
false ->
nil
end,
gleam@otp@actor:continue(
begin
_record = State,
{state,
erlang:element(2, _record),
[Jwk@1 | erlang:element(3, State)],
erlang:element(4, _record),
erlang:element(5, _record),
erlang:element(6, _record),
erlang:element(7, _record)}
end
);
{set_active_jwk, Kid} ->
gleam@otp@actor:continue(
begin
_record@1 = State,
{state,
erlang:element(2, _record@1),
erlang:element(3, _record@1),
Kid,
erlang:element(5, _record@1),
erlang:element(6, _record@1),
erlang:element(7, _record@1)}
end
);
{create_nonce, Reply_with@2} ->
Nonce_result = begin
gleam@result:'try'(
begin
_pipe = ids@uuid:generate_v4(),
gleam@result:replace_error(_pipe, nil)
end,
fun(Nonce) ->
{ok,
{nonce,
Nonce,
begin
_pipe@1 = birl:now(),
birl:add(_pipe@1, birl@duration:minutes(5))
end}}
end
)
end,
gleam@otp@actor:send(Reply_with@2, Nonce_result),
case Nonce_result of
{ok, Nonce@1} ->
gleam@otp@actor:continue(
begin
_record@2 = State,
{state,
erlang:element(2, _record@2),
erlang:element(3, _record@2),
erlang:element(4, _record@2),
[Nonce@1 | erlang:element(5, State)],
erlang:element(6, _record@2),
erlang:element(7, _record@2)}
end
);
{error, _} ->
gleam@otp@actor:continue(State)
end;
{validate_nonce, Value, Reply_with@3} ->
Result = gleam@list:find(
erlang:element(5, State),
fun(Nonce@2) -> erlang:element(2, Nonce@2) =:= Value end
),
gleam@otp@actor:send(
Reply_with@3,
begin
_pipe@2 = Result,
gleam@result:map(_pipe@2, fun(_) -> nil end)
end
),
Nonces = gleam@list:filter(
erlang:element(5, State),
fun(Nonce@3) -> erlang:element(2, Nonce@3) /= Value end
),
gleam@otp@actor:continue(
begin
_record@3 = State,
{state,
erlang:element(2, _record@3),
erlang:element(3, _record@3),
erlang:element(4, _record@3),
Nonces,
erlang:element(6, _record@3),
erlang:element(7, _record@3)}
end
);
cleanup_expired_nonces ->
Now = birl:now(),
Nonces@1 = gleam@list:filter(
erlang:element(5, State),
fun(Nonce@4) ->
case birl:compare(Now, erlang:element(3, Nonce@4)) of
lt ->
true;
_ ->
false
end
end
),
gleam@otp@actor:continue(
begin
_record@4 = State,
{state,
erlang:element(2, _record@4),
erlang:element(3, _record@4),
erlang:element(4, _record@4),
Nonces@1,
erlang:element(6, _record@4),
erlang:element(7, _record@4)}
end
);
{create_registration, Registration, Reply_with@4} ->
{Updated_registrations, Record} = lightbulb@providers@memory_provider@tables:insert(
erlang:element(6, State),
Registration
),
gleam@otp@actor:send(Reply_with@4, {ok, Record}),
gleam@otp@actor:continue(
begin
_record@5 = State,
{state,
erlang:element(2, _record@5),
erlang:element(3, _record@5),
erlang:element(4, _record@5),
erlang:element(5, _record@5),
Updated_registrations,
erlang:element(7, _record@5)}
end
);
{get_registration, Id, Reply_with@5} ->
Record@1 = lightbulb@providers@memory_provider@tables:get(
erlang:element(6, State),
Id
),
gleam@otp@actor:send(Reply_with@5, Record@1),
gleam@otp@actor:continue(State);
{get_registration_by, Issuer, Client_id, Reply_with@6} ->
Record@2 = lightbulb@providers@memory_provider@tables:get_by(
erlang:element(6, State),
fun(Registration@1) ->
(erlang:element(3, Registration@1) =:= Issuer) andalso (erlang:element(
4,
Registration@1
)
=:= Client_id)
end
),
gleam@otp@actor:send(Reply_with@6, Record@2),
gleam@otp@actor:continue(State);
{get_all_registrations, Reply_with@7} ->
gleam@otp@actor:send(
Reply_with@7,
erlang:element(3, erlang:element(6, State))
),
gleam@otp@actor:continue(State);
{delete_registration, Id@1} ->
Updated_registrations@1 = lightbulb@providers@memory_provider@tables:delete(
erlang:element(6, State),
Id@1
),
gleam@otp@actor:continue(
begin
_record@6 = State,
{state,
erlang:element(2, _record@6),
erlang:element(3, _record@6),
erlang:element(4, _record@6),
erlang:element(5, _record@6),
Updated_registrations@1,
erlang:element(7, _record@6)}
end
);
{create_deployment, Deployment, Reply_with@8} ->
{Updated_deployments, Record@3} = lightbulb@providers@memory_provider@tables:insert(
erlang:element(7, State),
Deployment
),
gleam@otp@actor:send(Reply_with@8, {ok, Record@3}),
gleam@otp@actor:continue(
begin
_record@7 = State,
{state,
erlang:element(2, _record@7),
erlang:element(3, _record@7),
erlang:element(4, _record@7),
erlang:element(5, _record@7),
erlang:element(6, _record@7),
Updated_deployments}
end
);
{get_deployment, Issuer@1, Client_id@1, Deployment_id, Reply_with@9} ->
Deployment_record_result = begin
gleam@result:'try'(
begin
_pipe@3 = lightbulb@providers@memory_provider@tables:get_by(
erlang:element(6, State),
fun(Registration@2) ->
(erlang:element(3, Registration@2) =:= Issuer@1)
andalso (erlang:element(4, Registration@2) =:= Client_id@1)
end
),
gleam@result:replace_error(
_pipe@3,
<<"Registration not found"/utf8>>
)
end,
fun(_use0) ->
{Registration_id, _} = _use0,
_pipe@4 = lightbulb@providers@memory_provider@tables:get_by(
erlang:element(7, State),
fun(Deployment@1) ->
(erlang:element(3, Deployment@1) =:= Registration_id)
andalso (erlang:element(2, Deployment@1) =:= Deployment_id)
end
),
gleam@result:replace_error(
_pipe@4,
<<"Deployment not found"/utf8>>
)
end
)
end,
gleam@otp@actor:send(Reply_with@9, Deployment_record_result),
gleam@otp@actor:continue(State)
end.
-file("src/lightbulb/providers/memory_provider.gleam", 228).
-spec start() -> {ok, gleam@erlang@process:subject(message())} |
{error, gleam@otp@actor:start_error()}.
start() ->
Init = fun() ->
Self = gleam@erlang@process:new_subject(),
State = {state,
fun(_capture) -> gleam@erlang@process:send(Self, _capture) end,
[],
<<""/utf8>>,
[],
lightbulb@providers@memory_provider@tables:new(),
lightbulb@providers@memory_provider@tables:new()},
Selector = gleam@erlang@process:selecting(
gleam_erlang_ffi:new_selector(),
Self,
fun gleam@function:identity/1
),
{ready, State, Selector}
end,
Call_timeout = 5000,
gleam@otp@actor:start_spec({spec, Init, Call_timeout, fun handle_message/2}).
-file("src/lightbulb/providers/memory_provider.gleam", 252).
-spec cleanup(gleam@erlang@process:subject(message())) -> nil.
cleanup(Actor) ->
gleam@erlang@process:send(Actor, shutdown).
-file("src/lightbulb/providers/memory_provider.gleam", 293).
-spec create_jwk(gleam@erlang@process:subject(message()), lightbulb@jwk:jwk()) -> nil.
create_jwk(Actor, Jwk) ->
gleam@erlang@process:send(Actor, {create_jwk, Jwk}).
-file("src/lightbulb/providers/memory_provider.gleam", 305).
-spec cleanup_expired_nonces(gleam@erlang@process:subject(message())) -> nil.
cleanup_expired_nonces(Actor) ->
gleam@erlang@process:send(Actor, cleanup_expired_nonces).
-file("src/lightbulb/providers/memory_provider.gleam", 325).
-spec delete_registration(gleam@erlang@process:subject(message()), integer()) -> {ok,
integer()} |
{error, any()}.
delete_registration(Actor, Id) ->
gleam@erlang@process:send(Actor, {delete_registration, Id}),
{ok, Id}.
-file("src/lightbulb/providers/memory_provider.gleam", 285).
-spec get_active_jwk(gleam@erlang@process:subject(message())) -> {ok,
lightbulb@jwk:jwk()} |
{error, nil}.
get_active_jwk(Actor) ->
gleam@erlang@process:call(
Actor,
fun(Field@0) -> {get_active_jwk, Field@0} end,
5000
).
-file("src/lightbulb/providers/memory_provider.gleam", 289).
-spec get_all_jwks(gleam@erlang@process:subject(message())) -> list(lightbulb@jwk:jwk()).
get_all_jwks(Actor) ->
gleam@erlang@process:call(
Actor,
fun(Field@0) -> {get_all_jwks, Field@0} end,
5000
).
-file("src/lightbulb/providers/memory_provider.gleam", 297).
-spec create_nonce(gleam@erlang@process:subject(message())) -> {ok,
lightbulb@nonce:nonce()} |
{error, nil}.
create_nonce(Actor) ->
gleam@erlang@process:call(
Actor,
fun(Field@0) -> {create_nonce, Field@0} end,
5000
).
-file("src/lightbulb/providers/memory_provider.gleam", 301).
-spec validate_nonce(gleam@erlang@process:subject(message()), binary()) -> {ok,
nil} |
{error, nil}.
validate_nonce(Actor, Value) ->
gleam@erlang@process:call(
Actor,
fun(_capture) -> {validate_nonce, Value, _capture} end,
5000
).
-file("src/lightbulb/providers/memory_provider.gleam", 309).
-spec create_registration(
gleam@erlang@process:subject(message()),
lightbulb@registration:registration()
) -> {ok, {integer(), lightbulb@registration:registration()}} | {error, nil}.
create_registration(Actor, Registration) ->
gleam@erlang@process:call(
Actor,
fun(_capture) -> {create_registration, Registration, _capture} end,
5000
).
-file("src/lightbulb/providers/memory_provider.gleam", 313).
-spec list_registrations(gleam@erlang@process:subject(message())) -> list({integer(),
lightbulb@registration:registration()}).
list_registrations(Actor) ->
gleam@erlang@process:call(
Actor,
fun(Field@0) -> {get_all_registrations, Field@0} end,
5000
).
-file("src/lightbulb/providers/memory_provider.gleam", 317).
-spec get_registration(gleam@erlang@process:subject(message()), integer()) -> {ok,
{integer(), lightbulb@registration:registration()}} |
{error, nil}.
get_registration(Actor, Id) ->
gleam@erlang@process:call(
Actor,
fun(_capture) -> {get_registration, Id, _capture} end,
5000
).
-file("src/lightbulb/providers/memory_provider.gleam", 321).
-spec get_registration_by(
gleam@erlang@process:subject(message()),
binary(),
binary()
) -> {ok, {integer(), lightbulb@registration:registration()}} | {error, nil}.
get_registration_by(Actor, Issuer, Client_id) ->
gleam@erlang@process:call(
Actor,
fun(_capture) -> {get_registration_by, Issuer, Client_id, _capture} end,
5000
).
-file("src/lightbulb/providers/memory_provider.gleam", 331).
-spec create_deployment(
gleam@erlang@process:subject(message()),
lightbulb@deployment:deployment()
) -> {ok, {integer(), lightbulb@deployment:deployment()}} | {error, nil}.
create_deployment(Actor, Deployment) ->
gleam@erlang@process:call(
Actor,
fun(_capture) -> {create_deployment, Deployment, _capture} end,
5000
).
-file("src/lightbulb/providers/memory_provider.gleam", 335).
-spec get_deployment(
gleam@erlang@process:subject(message()),
binary(),
binary(),
binary()
) -> {ok, {integer(), lightbulb@deployment:deployment()}} | {error, binary()}.
get_deployment(Actor, Issuer, Client_id, Deployment_id) ->
gleam@erlang@process:call(
Actor,
fun(_capture) ->
{get_deployment, Issuer, Client_id, Deployment_id, _capture}
end,
5000
).
-file("src/lightbulb/providers/memory_provider.gleam", 256).
-spec data_provider(gleam@erlang@process:subject(message())) -> {ok,
lightbulb@providers@data_provider:data_provider()} |
{error, binary()}.
data_provider(Memory_provider) ->
{ok, {data_provider, fun() -> _pipe = create_nonce(Memory_provider),
gleam@result:replace_error(
_pipe,
<<"Failed to create nonce"/utf8>>
) end, fun(Nonce) ->
_pipe@1 = validate_nonce(Memory_provider, Nonce),
gleam@result:replace_error(
_pipe@1,
<<"Failed to validate nonce"/utf8>>
)
end, fun(Issuer, Client_id) ->
_pipe@2 = get_registration_by(
Memory_provider,
Issuer,
Client_id
),
_pipe@3 = gleam@result:map(_pipe@2, fun gleam@pair:second/1),
gleam@result:replace_error(
_pipe@3,
<<"Failed to get registration"/utf8>>
)
end, fun(Issuer@1, Client_id@1, Deployment_id) ->
_pipe@4 = get_deployment(
Memory_provider,
Issuer@1,
Client_id@1,
Deployment_id
),
_pipe@5 = gleam@result:map(_pipe@4, fun gleam@pair:second/1),
gleam@result:replace_error(
_pipe@5,
<<"Failed to get deployment"/utf8>>
)
end, fun() -> _pipe@6 = get_active_jwk(Memory_provider),
gleam@result:replace_error(
_pipe@6,
<<"Failed to get active JWK"/utf8>>
) end}}.