feat(crypto) + docs: request persistent storage; consolidate docs to 3
- index.tsx: request navigator.storage.persist() for logged-in sessions so the browser can't evict the IndexedDB rust-crypto store (eviction while the localStorage session survives resurrects the device with a blank store → the KE-1 "one time key already exists" upload storm). Guarded, checks persisted() first, best-effort. - Docs: remove HANDOFF_ELEMENT_CALL_FORK.md, LOTUS_E2EE_INVESTIGATION.md, and LOTUS_BUGS.md. Port their live content into the three kept docs — verification backlog → LOTUS_TESTING; open bugs + E2EE (KE-1..4) + an Element Call fork operational reference (publish steps + io.lotus action catalog) → LOTUS_TODO. Fix all dangling references (README, code comments, cross-doc links). Full history of the removed docs remains in git. Gates: tsc/eslint/prettier clean, build OK, 665 tests. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -34,7 +34,7 @@ export class CallControl extends EventEmitter implements CallControlState {
|
||||
// P6-2: mirrors CallEmbed.joined. Set true from forceState(), which CallEmbed
|
||||
// invokes only from onCallJoined(). Gates io.lotus.set_deafen so we never send
|
||||
// before the fork's widget handler mounts (pre-join sends pend to a 10s
|
||||
// timeout — HANDOFF_ELEMENT_CALL_FORK.md §12.1 F1).
|
||||
// timeout — io.lotus toWidget actions must only be sent after call-join).
|
||||
private joined = false;
|
||||
|
||||
private get document(): Document | undefined {
|
||||
|
||||
@@ -5,7 +5,7 @@ import pkg from '../../../package.json';
|
||||
//
|
||||
// Installs pass-through wrappers around `console.warn` / `console.error` that
|
||||
// ring-buffer any log line matching the KE-1..KE-4 bug-cluster signatures
|
||||
// (see LOTUS_E2EE_INVESTIGATION.md). It NEVER swallows a log call — the
|
||||
// (E2EE KE-1..4 capture; see LOTUS_TODO.md). It NEVER swallows a log call — the
|
||||
// original console method is always invoked — and it performs NO network I/O.
|
||||
// The report metadata is limited to SDK version / device id / user id / sync
|
||||
// state; the captured log lines themselves are intentional evidence and may
|
||||
|
||||
@@ -44,6 +44,20 @@ if ('serviceWorker' in navigator) {
|
||||
});
|
||||
}
|
||||
|
||||
// Request persistent storage so the browser can't evict the IndexedDB
|
||||
// rust-crypto store under storage pressure. Eviction (while the localStorage
|
||||
// session/device-id survives) resurrects the device with a blank crypto store,
|
||||
// which then re-uploads OTKs the server already holds → the "one time key
|
||||
// already exists" upload storm and E2EE breakage. Only ask for sessions worth
|
||||
// protecting (skip anonymous/landing visitors to avoid a needless Firefox
|
||||
// prompt); check persisted() first so we don't re-prompt. Best-effort.
|
||||
if (navigator.storage?.persist && getFallbackSession()) {
|
||||
navigator.storage
|
||||
.persisted()
|
||||
.then((already) => (already ? undefined : navigator.storage.persist()))
|
||||
.catch(() => undefined);
|
||||
}
|
||||
|
||||
// Reload once if a lazy-loaded chunk is missing (stale deployment)
|
||||
window.addEventListener('vite:preloadError', () => {
|
||||
if (!sessionStorage.getItem('chunk-reload-attempted')) {
|
||||
|
||||
Reference in New Issue
Block a user