import { Context, Effect, Layer } from "effect" import jwt from "jsonwebtoken" export class JSONWebToken extends Context.Tag("JSONWebToken") Effect.Effect< string, Error, never >, verify: ( token: string, secretOrPublicKey: jwt.Secret, options: jwt.VerifyOptions, ) => Effect.Effect< 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")) ) }) ), })