diff --git a/src/Layers/JSONWebToken.ts b/src/Layers/JSONWebToken.ts index 0ee5d14..24bf772 100644 --- a/src/Layers/JSONWebToken.ts +++ b/src/Layers/JSONWebToken.ts @@ -1,12 +1,12 @@ import { Context, Effect, Layer } from "effect" -import jwt from "jsonwebtoken" +import type * as JWT from "jsonwebtoken" export class JSONWebToken extends Context.Tag("JSONWebToken") Effect.Effect< string, Error, @@ -15,32 +15,39 @@ export class JSONWebToken extends Context.Tag("JSONWebToken") Effect.Effect< - string | jwt.Jwt | jwt.JwtPayload, - jwt.VerifyErrors | Error, + string | JWT.Jwt | JWT.JwtPayload, + JWT.VerifyErrors | Error, never >, }>() {} -export const JSONWebTokenLive = Layer.succeed(JSONWebToken, { - sign: (payload, secretOrPrivateKey, options) => Effect.async(resume => - jwt.sign(payload, secretOrPrivateKey, options, (err, token) => { - resume(token - ? Effect.succeed(token) - : Effect.fail(err || new Error("Unknown error")) - ) - }) - ), - - verify: (token, secretOrPublicKey, options) => Effect.async(resume => - jwt.verify(token, secretOrPublicKey, options, (err, decoded) => { - resume(decoded - ? Effect.succeed(decoded) - : Effect.fail(err || new Error("Unknown error")) - ) - }) - ), +const importJWT = Effect.tryPromise({ + try: () => import("jsonwebtoken"), + catch: cause => new Error("Could not import 'jsonwebtoken'. Make sure it is installed.", { cause }), }) + +export const JSONWebTokenLive = Layer.effect(JSONWebToken, importJWT.pipe( + Effect.map(jwt => JSONWebToken.of({ + sign: (payload, secretOrPrivateKey, options) => Effect.async(resume => + jwt.sign(payload, secretOrPrivateKey, options, (err, token) => { + resume(token + ? Effect.succeed(token) + : Effect.fail(err || new Error("Unknown error")) + ) + }) + ), + + verify: (token, secretOrPublicKey, options) => Effect.async(resume => + jwt.verify(token, secretOrPublicKey, options, (err, decoded) => { + resume(decoded + ? Effect.succeed(decoded) + : Effect.fail(err || new Error("Unknown error")) + ) + }) + ), + })) +))