class User extends Schema.Class<User>("User")({ code: Schema.String, token: Schema.String }) {}
class Unauthorized extends Schema.TaggedError<Unauthorized>()(
"Unauthorized",
{},
HttpApiSchema.annotations({ status: 401 })
) {}
class CurrentUser extends Context.Tag("CurrentUser")<CurrentUser, User>() {}
class AuthMiddleware extends HttpApiMiddleware.Tag<AuthMiddleware>()("AuthMiddleware", {
provides: CurrentUser,
failure: Unauthorized,
security: {
bearer: HttpApiSecurity.bearer
}
}) {}
const AuthMiddlewareLive = Layer.effect(
AuthMiddleware,
JWTService.pipe(Effect.map((jwtService) => AuthMiddleware.of({
bearer: (_token) =>
Effect.gen(function*() {
const {token, code} = yield* jwtService.verify(Redacted.value(_token)).pipe(
Effect.catchTag("JWTVerifyError", () => Effect.failSync(() => new Unauthorized()))
);
return new User({token, code})
})
})))
)
class User extends Schema.Class<User>("User")({ code: Schema.String, token: Schema.String }) {}
class Unauthorized extends Schema.TaggedError<Unauthorized>()(
"Unauthorized",
{},
HttpApiSchema.annotations({ status: 401 })
) {}
class CurrentUser extends Context.Tag("CurrentUser")<CurrentUser, User>() {}
class AuthMiddleware extends HttpApiMiddleware.Tag<AuthMiddleware>()("AuthMiddleware", {
provides: CurrentUser,
failure: Unauthorized,
security: {
bearer: HttpApiSecurity.bearer
}
}) {}
const AuthMiddlewareLive = Layer.effect(
AuthMiddleware,
JWTService.pipe(Effect.map((jwtService) => AuthMiddleware.of({
bearer: (_token) =>
Effect.gen(function*() {
const {token, code} = yield* jwtService.verify(Redacted.value(_token)).pipe(
Effect.catchTag("JWTVerifyError", () => Effect.failSync(() => new Unauthorized()))
);
return new User({token, code})
})
})))
)