Код-ревью Middle Офлайн и хранение обновлено

Код-ревью: хранение сессии и кеша

Вопрос

Модуль хранения сессии и кеша каталога. Найдите проблемы.

import AsyncStorage from '@react-native-async-storage/async-storage';

export async function saveSession(token: string, refresh: string) {
  await AsyncStorage.setItem('session', JSON.stringify({ token, refresh }));
}

export async function cacheCatalog(items: Product[]) {
  await AsyncStorage.setItem('catalog', JSON.stringify(items));
}

export async function addToCatalog(item: Product) {
  const items = JSON.parse(await AsyncStorage.getItem('catalog'));
  items.push(item);
  await cacheCatalog(items);
}

export function logout() {
  AsyncStorage.removeItem('session');
}

Коротко

Секреты в защищённое хранилище, большие данные в базу, обработка пустых значений, атомарные изменения и полная очистка при выходе.

Что должен найти ревьюер

  1. Безопасностьстрока 4
    Токены в AsyncStorage хранятся без шифрования. Нужно защищённое хранилище (expo-secure-store, Keychain/Keystore).
  2. Производительностьстрока 8
    Весь каталог одним ключом: каждое изменение сериализует и пишет всё. Для больших данных нужна база (SQLite).
  3. Ошибкастрока 12
    getItem вернёт null при пустом кеше, JSON.parse(null) даст null, и push упадёт.
  4. Ошибкастрока 12
    Чтение и запись без блокировки: два параллельных addToCatalog потеряют один из товаров.
  5. Ошибкастрока 18
    removeItem без await и без обработки ошибки; при выходе не очищаются кеш каталога и другие данные пользователя, не отвязывается push-токен.

Разбор

Секреты в защищённое хранилище, большие данные в базу, обработка пустых значений, атомарные изменения и полная очистка при выходе.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.