diff --git a/bun.lockb b/bun.lockb index 54b5621..183f9cb 100755 Binary files a/bun.lockb and b/bun.lockb differ diff --git a/package.json b/package.json index f15f662..630c426 100644 --- a/package.json +++ b/package.json @@ -69,7 +69,9 @@ }, "optionalDependencies": { "@effect/schema": "*", + "@types/jsonwebtoken": "*", "effect": "*", + "jsonwebtoken": "*", "mobx": "*" } } diff --git a/src/Layers/JSONWebToken.ts b/src/Layers/JSONWebToken.ts new file mode 100644 index 0000000..0ee5d14 --- /dev/null +++ b/src/Layers/JSONWebToken.ts @@ -0,0 +1,46 @@ +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")) + ) + }) + ), +}) diff --git a/src/Layers/index.ts b/src/Layers/index.ts new file mode 100644 index 0000000..37dc85f --- /dev/null +++ b/src/Layers/index.ts @@ -0,0 +1 @@ +export * as JSONWebToken from "./JSONWebToken" diff --git a/src/index.ts b/src/index.ts index 05f2af0..1129b8d 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,2 +1,3 @@ +export * as Layers from "./Layers" export * as Schema from "./Schema" export * as Types from "./Types"