From 9d81c27532be27297e861db27b184c48200ff3cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Tue, 20 Aug 2024 02:04:57 +0200 Subject: [PATCH] Layers --- bun.lockb | Bin 64741 -> 70373 bytes package.json | 2 ++ src/Layers/JSONWebToken.ts | 46 +++++++++++++++++++++++++++++++++++++ src/Layers/index.ts | 1 + src/index.ts | 1 + 5 files changed, 50 insertions(+) create mode 100644 src/Layers/JSONWebToken.ts create mode 100644 src/Layers/index.ts diff --git a/bun.lockb b/bun.lockb index 54b56211964a425a033a283cf61ee6cd346375dc..183f9cb8a27a218c4a1b46e81f11d7f8e0c7d68a 100755 GIT binary patch delta 12259 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 delta 8730 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 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"