All files / src/utils decodeElevenLabsFirebaseJWTPayload.ts

75% Statements 12/16
50% Branches 2/4
100% Functions 2/2
75% Lines 12/16

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64      1x                             1x                   1x   1x               1x     1x 1x             1x 1x         1x   1x       1x    
import z from "zod";
import { NoThrow } from "./NoThrow";
 
const ElevenLabsFirebaseJWTSchema = z
    .object({
        workspace_id: z.string(),
        workspace_user_id: z.string(),
        user_id: z.string(),
        email: z.string(),
        email_verified: z.boolean(),
    })
    .transform(
        ({
            workspace_id: workspaceID,
            workspace_user_id: workspaceUserID,
            user_id: userID,
            email_verified: emailVerified,
            ...rest
        }) => ({
            workspaceID,
            workspaceUserID,
            userID,
            emailVerified,
            ...rest,
        }),
    );
 
export async function decodeElevenLabsFirebaseJWTPayload(jwt: string) {
    const parts = jwt.split(".");
 
    Iif (parts.length !== 3) {
        return NoThrow.error(
            new Error(
                `Invalid jwt format; Expected '<header>.<payload>.<signature>', where 'header', 'payload', and 'signature' are base64 strings`,
            ),
        );
    }
 
    const payloadBase64 = parts[1];
    let payloadString: string;
 
    try {
        payloadString = atob(payloadBase64);
    } catch (error) {
        return NoThrow.error(new Error("Error while decoding base64", { cause: error }));
    }
 
    let payloadObject: unknown;
 
    try {
        payloadObject = JSON.parse(payloadString);
    } catch (error) {
        return NoThrow.error(new Error("Error while parsing (JSON) payload string", { cause: error }));
    }
 
    const payloadResult = await ElevenLabsFirebaseJWTSchema.safeParseAsync(payloadObject);
 
    Iif (!payloadResult.success) {
        return NoThrow.error(payloadResult.error);
    }
 
    return NoThrow.success(payloadResult.data);
}