CultLib/packages
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Meta Vens 04858d332a Fix the QUIC consumer's peer-shutdown leak, and give the session manager eviction, single-flight and first-success racing
Soul's fix batch, findings 3, 4, 5 and 6:

- A peer-initiated CONNECTION_SHUTDOWN only set `disposed = true`, so
  `dispose()`'s early-return skipped `release()` and `offConnectionEvent`: the
  runtime reference leaked forever and a pending `receiveFrame` hung forever.
  `disposed` and "already cleaned up" are now the same flag, run through one
  `cleanup()` reached from `dispose()`, a peer shutdown, and the new `fault()`
  (wired from fix 1's `onFault`). Every path releases the runtime reference
  exactly once and rejects every pending and future receive/send with the real
  reason instead of a generic "disposed" message.
- `CultMeshQuicRealtimeSessionManager.connect()` cached a transport forever,
  even a dead one, and raced candidates with `Promise.allSettled`, so one dead
  route delayed every connect by the full handshake timeout. It now: evicts a
  session once its transport reports itself disposed (`onDisposed`, mirroring
  `CultMeshSessions.InvalidateRealtimeSession`); shares one in-flight dial
  across concurrent callers for the same target (mirrors C#'s `Lazy`); refuses
  a transport that lands after `dispose()` instead of caching it; and races
  each tier for the first verified success (mirrors `Task.WhenAny`), aborting
  and disposing the losers via an `AbortSignal` threaded into
  `connector.connect`, which now also honours a signal already aborted at
  entry.
- `streamKinds` never pruned a finished stream (`STREAM_SHUTDOWN` fell into
  `default`); it now removes the entry. The receive side queued every
  latest-only frame in an unbounded array; it now mirrors the C# reference's
  `CultMeshRealtimeInbox`: at most one pending frame per `(channel, body)`,
  coalesced on arrival, while reliable-ordered frames still queue directly
  (unbounded, matching the C# reference's own unbounded channel).

Subtraction: `trimmedOrEmpty` duplicated `cultnet-ts`'s exported `trimCSharp`;
callers now use the shared one.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-23 14:38:34 +02:00
..
cultcache-py Refuse re-entrant Python cache mutations and adopt legacy-key globals on load 2026-09-14 12:27:55 +02:00
cultcache-rs Require an atomic push_all from every Rust backing store 2026-09-14 12:28:07 +02:00
cultcache-ts Delete the TypeScript re-entry guard; state the store-wait rule once 2026-09-14 12:43:46 +02:00
cultmath Say what the cell-mass test proves, and what it does not 2026-09-22 21:43:52 +02:00
cultmesh-browser Kill the browser's local reading of "unsigned", and mutate the browser too 2026-09-16 17:39:50 +02:00
cultmesh-kotlin Consolidate CultNet schema contracts into CultLib/contracts/cultnet 2026-09-13 17:27:41 +02:00
cultmesh-py Consolidate CultNet schema contracts into CultLib/contracts/cultnet 2026-09-13 17:27:41 +02:00
cultmesh-rs Give every cultcache-rs entry type one home store 2026-09-14 00:38:41 +02:00
cultmesh-ts Fix the QUIC consumer's peer-shutdown leak, and give the session manager eviction, single-flight and first-success racing 2026-09-23 14:38:34 +02:00
cultnet-py Merge the CultCache store-routing cuts into main 2026-09-14 15:16:29 +02:00
cultnet-rs Merge the CultCache store-routing cuts into main 2026-09-14 15:16:29 +02:00
cultnet-ts Interop: C# managed QUIC provider serving a TypeScript native consumer 2026-09-23 12:33:02 +02:00