Packages

A library for creating LTI 1.3 Tools in Gleam

Current section

Files

Jump to
lightbulb src lightbulb@jwk.erl
Raw

src/lightbulb@jwk.erl

-module(lightbulb@jwk).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]).
-export([jwk_decoder/0, jwks_decoder/0, to_map/1, from_map/2, generate/0]).
-export_type([jwk/0]).
-if(?OTP_RELEASE >= 27).
-define(MODULEDOC(Str), -moduledoc(Str)).
-define(DOC(Str), -doc(Str)).
-else.
-define(MODULEDOC(Str), -compile([])).
-define(DOC(Str), -compile([])).
-endif.
?MODULEDOC(false).
-type jwk() :: {jwk, binary(), binary(), binary(), binary()}.
-file("src/lightbulb/jwk.gleam", 11).
?DOC(false).
-spec jwk_decoder() -> gleam@dynamic@decode:decoder(jwk()).
jwk_decoder() ->
gleam@dynamic@decode:field(
<<"kid"/utf8>>,
{decoder, fun gleam@dynamic@decode:decode_string/1},
fun(Kid) ->
gleam@dynamic@decode:optional_field(
<<"typ"/utf8>>,
<<"JWT"/utf8>>,
{decoder, fun gleam@dynamic@decode:decode_string/1},
fun(Typ) ->
gleam@dynamic@decode:optional_field(
<<"alg"/utf8>>,
<<"RS256"/utf8>>,
{decoder, fun gleam@dynamic@decode:decode_string/1},
fun(Alg) ->
gleam@dynamic@decode:field(
<<"pem"/utf8>>,
{decoder,
fun gleam@dynamic@decode:decode_string/1},
fun(Pem) ->
gleam@dynamic@decode:success(
{jwk, Kid, Typ, Alg, Pem}
)
end
)
end
)
end
)
end
).
-file("src/lightbulb/jwk.gleam", 20).
?DOC(false).
-spec jwks_decoder() -> gleam@dynamic@decode:decoder(list(jwk())).
jwks_decoder() ->
gleam@dynamic@decode:field(
<<"keys"/utf8>>,
gleam@dynamic@decode:list(jwk_decoder()),
fun(Keys) -> gleam@dynamic@decode:success(Keys) end
).
-file("src/lightbulb/jwk.gleam", 26).
?DOC(false).
-spec to_map(jwk()) -> {gleam@dict:dict(binary(), gleam@dynamic:dynamic_()),
gleam@dict:dict(binary(), binary())}.
to_map(Jwk) ->
{jwk, _, _, _, Pem} = Jwk,
_pipe = jose_jwk:from_pem(Pem),
jose_jwk:to_map(_pipe).
-file("src/lightbulb/jwk.gleam", 33).
?DOC(false).
-spec from_map(binary(), gleam@dict:dict(binary(), binary())) -> {ok, jwk()} |
{error, any()}.
from_map(Kid, Map) ->
Typ = begin
_pipe = gleam_stdlib:map_get(Map, <<"typ"/utf8>>),
gleam@result:unwrap(_pipe, <<"JWT"/utf8>>)
end,
Alg = begin
_pipe@1 = gleam_stdlib:map_get(Map, <<"alg"/utf8>>),
gleam@result:unwrap(_pipe@1, <<"RS256"/utf8>>)
end,
{_, Pem} = jose_jwk:to_pem(Map),
{ok, {jwk, Kid, Typ, Alg, Pem}}.
-file("src/lightbulb/jwk.gleam", 41).
?DOC(false).
-spec generate() -> {ok, jwk()} | {error, binary()}.
generate() ->
gleam@result:'try'(
ids@uuid:generate_v4(),
fun(Kid) ->
{_, Jwk_map} = begin
_pipe = jose_jwk:generate_key({rsa, 2048}),
jose_jwk:to_map(_pipe)
end,
Typ = begin
_pipe@1 = gleam_stdlib:map_get(Jwk_map, <<"typ"/utf8>>),
gleam@result:unwrap(_pipe@1, <<"JWT"/utf8>>)
end,
Alg = begin
_pipe@2 = gleam_stdlib:map_get(Jwk_map, <<"alg"/utf8>>),
gleam@result:unwrap(_pipe@2, <<"RS256"/utf8>>)
end,
{_, Pem} = jose_jwk:to_pem(Jwk_map),
{ok, {jwk, Kid, Typ, Alg, Pem}}
end
).