Refactor Base64 variant handling in tryDecodeBase64
Simplifies and clarifies the logic for selecting Base64 variants by using a Set to ensure uniqueness and order. This change improves maintainability and robustness when decoding Base64 strings with different variants.
This commit is contained in:
@@ -58,25 +58,22 @@ export async function generateChatKeyPair(): Promise<{
|
|||||||
|
|
||||||
// Helper to robustly decode Base64 regardless of variant (Original vs URLSafe)
|
// Helper to robustly decode Base64 regardless of variant (Original vs URLSafe)
|
||||||
function tryDecodeBase64(str: string): Uint8Array {
|
function tryDecodeBase64(str: string): Uint8Array {
|
||||||
const variants = [
|
// Use a Set to ensure uniqueness and order, explicitly allowing undefined
|
||||||
// Standard Base64 (likely for Remote keys with +/)
|
const variants = new Set<number | undefined>();
|
||||||
(sodium.base64_variants && sodium.base64_variants.ORIGINAL),
|
|
||||||
// URL-Safe Base64 (likely for Local keys)
|
|
||||||
(sodium.base64_variants && sodium.base64_variants.URLSAFE),
|
|
||||||
// No Padding variants
|
|
||||||
(sodium.base64_variants && sodium.base64_variants.ORIGINAL_NO_PADDING),
|
|
||||||
(sodium.base64_variants && sodium.base64_variants.URLSAFE_NO_PADDING),
|
|
||||||
// Fallback/Default
|
|
||||||
undefined
|
|
||||||
];
|
|
||||||
|
|
||||||
// Filter out undefined variants (if enum missing) and create unique set
|
// Prefer standard/known variants first
|
||||||
const validVariants = [...new Set(variants.filter(v => v !== undefined))];
|
if (sodium.base64_variants) {
|
||||||
// Add undefined at the end as fallback if not present
|
if (sodium.base64_variants.ORIGINAL !== undefined) variants.add(sodium.base64_variants.ORIGINAL);
|
||||||
if (!validVariants.includes(undefined)) validVariants.push(undefined);
|
if (sodium.base64_variants.URLSAFE !== undefined) variants.add(sodium.base64_variants.URLSAFE);
|
||||||
|
if (sodium.base64_variants.ORIGINAL_NO_PADDING !== undefined) variants.add(sodium.base64_variants.ORIGINAL_NO_PADDING);
|
||||||
|
if (sodium.base64_variants.URLSAFE_NO_PADDING !== undefined) variants.add(sodium.base64_variants.URLSAFE_NO_PADDING);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Always add default (undefined) as fallback
|
||||||
|
variants.add(undefined);
|
||||||
|
|
||||||
let lastError;
|
let lastError;
|
||||||
for (const v of validVariants) {
|
for (const v of variants) {
|
||||||
try {
|
try {
|
||||||
return v !== undefined
|
return v !== undefined
|
||||||
? sodium.from_base64(str, v)
|
? sodium.from_base64(str, v)
|
||||||
|
|||||||
Reference in New Issue
Block a user