|
|
|
|
@@ -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")<JSONWebToken, {
|
|
|
|
|
sign: (
|
|
|
|
|
payload: string | object | Buffer,
|
|
|
|
|
secretOrPrivateKey: jwt.Secret,
|
|
|
|
|
options: jwt.SignOptions,
|
|
|
|
|
secretOrPrivateKey: JWT.Secret,
|
|
|
|
|
options: JWT.SignOptions,
|
|
|
|
|
) => Effect.Effect<
|
|
|
|
|
string,
|
|
|
|
|
Error,
|
|
|
|
|
@@ -15,32 +15,39 @@ export class JSONWebToken extends Context.Tag("JSONWebToken")<JSONWebToken, {
|
|
|
|
|
|
|
|
|
|
verify: (
|
|
|
|
|
token: string,
|
|
|
|
|
secretOrPublicKey: jwt.Secret,
|
|
|
|
|
options: jwt.VerifyOptions,
|
|
|
|
|
secretOrPublicKey: JWT.Secret,
|
|
|
|
|
options: JWT.VerifyOptions,
|
|
|
|
|
) => 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"))
|
|
|
|
|
)
|
|
|
|
|
})
|
|
|
|
|
),
|
|
|
|
|
}))
|
|
|
|
|
))
|
|
|
|
|
|