Files
thilalib/src/JSONWebToken.ts
Julien Valverdé 6e5c371b40
All checks were successful
Lint / lint (push) Successful in 11s
JSONWebToken work
2024-09-07 19:24:33 +02:00

57 lines
1.7 KiB
TypeScript

import { Context, Effect, Layer } from "effect"
import type * as JWT from "jsonwebtoken"
import { ImportError } from "./ImportError"
export class JSONWebToken extends Context.Tag("JSONWebToken")<JSONWebToken, JSONWebTokenService>() {}
export interface JSONWebTokenService {
sign: (
payload: string | object | Buffer,
secretOrPrivateKey: JWT.Secret,
options: JWT.SignOptions,
) => 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
>
}
const importJWT = Effect.tryPromise({
try: () => import("jsonwebtoken"),
catch: cause => new ImportError({ path: "jsonwebtoken", 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"))
)
})
),
}))
))