6.8 KiB
Свежесть данных и повторное использование
WealthLedger читает инвестиционные данные из SQLite. Обычный GET возвращает сохранённый результат и не запускает личную синхронизацию. Общие справочные данные инструментов запрашиваются онлайн, когда это требуется карточке; финансовый HTTP-ответ не ждёт T-Bank. Модель принята в ADR 017.
Клиентский и серверный снимки
Client Cached Snapshot — успешный ответ в TanStack Query. Он сохраняет показанное содержимое при временной ошибке запроса в той же границе доступа. SQLite сохраняет источники независимо от браузера: membership, последний полный portfolio, исполненные операции, общие сведения об инструментах, котировки, свечи и календари.
Полнота периода и свежесть различаются.
Успешно проверенный пустой интервал полон; последняя страница журнала сама
по себе полноту не доказывает. Ошибка сверки сохраняет прежние данные и время.
Старый полный портфель не удаляется по истечении TTL. isStale показывает
возраст portfolio source, а не сам факт неудачного обновления.
| Источник | Когда обычный запрос требует обновления |
|---|---|
| Portfolio, котировки, изменяемый хвост дневных свечей | Через 60 секунд |
| Membership и изменяемый хвост операций | Через 5 минут |
| Metadata, поиск каталога и company | Онлайн при чтении |
| Календари | Через часовой обход |
| Полные прошлые интервалы операций и завершённые свечи | При явном обновлении показанного периода |
TTL не создаёт таймер импорта. Запрошенная работа может закончиться после ухода со страницы. После перезапуска нет автоматического обхода intent: следующий подходящий запрос повторяет незавершённый интервал с первой страницы, переиспользуя полные интервалы. Cursor брокера не служит durable checkpoint.
Повторное чтение перечитывает общие справочные данные онлайн, а финансовые
ресурсы используют сохранённый результат и применяемую политику свежести.
Повторная сверка полного периода публикуется одной
транзакцией после всех страниц, интервалов и счетов, включая all.
Сбой сохраняет весь прежний результат. Первая загрузка может публиковать
полные малые интервалы и показывать частичный период без окончательных сумм.
Клиент наблюдает только известную активную работу открытого экрана.
Status GET и data GET с sync=observe не запускают работу. После изменения
состояния ответ попадает в ту же query identity; после ухода или завершения
наблюдение прекращается. Поздний ответ не заменяет уже принятый новый.
HTTP API объясняет envelope и экранный refresh.
Отменой query lifecycle владеет TanStack Query. Status не пересобирает финансовые ответы и не передаёт hash notifications. Свечи нового диапазона загружаются при его открытии; предзагрузка всей истории портфеля не выполняется.
Смена подключения
Каждое чтение проверяет локальную сессию, текущее подключение, известный отказ токена и сохранённый состав доступных счетов. Расшифровка token и GetAccounts для локальной выдачи не нужны. Старый membership допускает выдачу и фоновую сверку; это задержка обнаружения отзыва доступа, а не live-проверка брокера. Unknown membership не даёт доступа к произвольному accountId: ответ сообщает о загрузке доступа. Успешный новый список немедленно ограничивает последующие чтения. Известный invalid token блокирует личные данные.
Успешный PUT атомарно сохраняет token, новую случайную внутреннюю revision и membership из проверки token. Прежние личные datasets и work становятся недоступны. DELETE удаляет подключение и личные данные; общие неперсональные источники могут оставаться. Неуспешный PUT сохраняет действующую границу.
Публикация проверяет revision и attempt в той же SQLite-транзакции; поздняя работа старого подключения не меняет даже timestamp. Revision не попадает в API, логи или cursor. Frontend очищает personal queries при смене подключения и известном отказе доступа; поздний ответ не восстанавливает скрытые данные. Logout очищает сессию и query cache. Подробнее — интеграция T-Bank.