surreal-db: бэкпорт 5 concurrency-фиксов + откат deserialize к keyof T & string #1
Loading…
Reference in a new issue
No description provided.
Delete branch "fix/backport-surreal-concurrency"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Суть
reactorбыл на 1 коммит позадиmain(не содержал канонного зомби-WS фикса0e5467d) — сначала fast-forward доmain, затем поверх него бэкпорт находоккросс-модельного ревью с
rasko/desktop(#105), где этот же канон уже стоит ибыл доработан.
Что сделано
P1 — гонки:
auth/rootDb.ts—getRootDBвозвращалnullпод конкуренцией: параллельныйcatchобнулял глобальныйcachedуже ПОСЛЕ чужого успешного re-signin, иreturn cachedотдавалnullвызывающему. Фикс: локальный захватconn,глобаль обнуляется только
if (cached === conn).auth/rootDb.ts— нет single-flight на реконнект: при инциденте БД Nпараллельных
connectRoot(rate_limit/lockout дёргаютgetRootDBна каждыйвход), выживает последний, остальные висят открытыми. Фикс:
pendingReconnect,симметрично
getDBInstance.db/surreal/getAuthedDBSession.ts— таймаут cached-authenticate()трактовалсякак обычный auth-fail →
newSession+authenticateна том же дохломdb-инстансе, три 15с-таймаута подряд = ~45с. Фикс:
SurrealRpcTimeoutErrorпробрасывается сразу, ретрай новой сессией — только на честный auth-fail.
P2 — утечки:
db/surreal/timeout.ts—Promise.raceбезclearTimeout: проигравшийsetTimeoutвисел все 15с. Фикс:clearTimeoutв.finally.auth/rootDb.ts+db/surreal/getDBInstance.ts— недобитый инстанс притаймауте
connect/signin/useне закрывался — поздний живой WS повисалбесхозным. Фикс:
void instance.close().catch(() => {})вcatch.Плюс — deserialize:
K extends stringбыл unsound (рантайм даётRecordId, тип —string) и не используется ни одним реальным caller'ом здесь (все 4 вызова —top-level ключи:
'id','userId'). Откат кkeyof T & stringвосстанавливаетtypo-защиту на тайпчеке для всех реальных вызовов; дот-пути — через явный
as any, если когда-нибудь понадобятся (тип всё равно их не разворачивает,см. комментарий в файле).
Проверка
bun run typecheck— ни одной новой ошибки в затронутых 5 файлах (весь прочийшум typecheck — предсуществующий, не от этого PR:
routeTree.genнесгенерирован и т.п.).
Тестов на эти файлы в srcTemplate нет (в отличие от briefer/rasko, где то же
самое покрыто и зелено).