import type { AniListAuthorisation } from "$lib/Data/AniList/identity"; import { Effect, Result, Schema } from "effect"; const UserCookieSchema = Schema.Struct({ token_type: Schema.NonEmptyString, expires_in: Schema.Number, access_token: Schema.NonEmptyString, refresh_token: Schema.NonEmptyString, }); export const decodeAuthCookieEffect = (cookie: string) => Effect.gen(function* () { const parsedCookie = yield* Effect.try({ try: () => JSON.parse(cookie) as unknown, catch: (cause) => new Error("Invalid user cookie JSON", { cause }), }); const decodedCookie = yield* Effect.try({ try: () => Schema.decodeUnknownSync(UserCookieSchema)(parsedCookie), catch: (cause) => new Error("Invalid user cookie payload", { cause }), }); return { tokenType: decodedCookie.token_type, expiresIn: decodedCookie.expires_in, accessToken: decodedCookie.access_token, refreshToken: decodedCookie.refresh_token, } as AniListAuthorisation; }); export const decodeAuthCookieEither = (cookie: string) => Result.try({ try: () => Effect.runSync(decodeAuthCookieEffect(cookie)), catch: (cause) => cause instanceof Error ? cause : new Error("Failed to decode user cookie", { cause }), }); export const decodeAuthCookieOrThrow = ( cookie: string, ): AniListAuthorisation => { const decoded = decodeAuthCookieEither(cookie); return Result.getOrThrow(decoded); }; export const decodeAuthCookieOrNull = ( cookie: string, ): AniListAuthorisation | null => { const decoded = decodeAuthCookieEither(cookie); return Result.isSuccess(decoded) ? decoded.success : null; };