SeamRoomFactory

class SeamRoomFactory(loom: Loom, scope: CoroutineScope, clock: () -> Instant, heartbeatConfig: HeartbeatConfig = HeartbeatConfig(), admitTimeout: Duration = DEFAULT_ADMIT_TIMEOUT, reconnectControllerFactory: JoinerReconnectControllerFactory? = null) : RoomFactory

Loom-backed implementation of RoomFactory.

Each call to host or join weaves a new Seam via loom, wraps it in a SeamRoom, and drives the admit/identify handshake:

scope is used to launch the per-Room admit loop coroutines. Callers should use a scope whose lifetime matches the room's intended lifetime (e.g. backgroundScope in tests, a structured session scope in production).

SeamRoom's internal membership state is guarded by a reentrant lock and is safe under any dispatcher, including multi-threaded ones such as Dispatchers.Default. Suspend calls (sends, broadcasts) are always performed outside the lock.

clock is required (not defaulted) so callers must make an explicit choice: use SeamRoomFactory.systemClock for production wall-clock time or supply a virtual clock in tests. An accidental epoch-zero default would ship wrong timestamps silently.

heartbeatConfig controls partition-detection timing.

admitTimeout bounds the joiner's admit handshake: if no AdmitMessage.Welcome arrives within this window after the joiner's Hello, the room surfaces a terminal MembershipEvent.AdmissionFailed with AdmissionFailure.TimedOut instead of waiting forever (#1178). Hosts ignore it.

See also

for the production convenience constructor.

Constructors

Link copied to clipboard
constructor(loom: Loom, scope: CoroutineScope, clock: () -> Instant, heartbeatConfig: HeartbeatConfig = HeartbeatConfig(), admitTimeout: Duration = DEFAULT_ADMIT_TIMEOUT, reconnectControllerFactory: JoinerReconnectControllerFactory? = null)

Types

Link copied to clipboard
object Companion

Functions

Link copied to clipboard
suspend fun adopt(seam: Seam, role: SessionRole, memberName: String? = null, roomKey: String? = null, reweave: suspend () -> Seam? = null, roomId: RoomId? = null): Room

Adopt an already-woven seam into a Room with an explicit role — no re-weave.

Link copied to clipboard
suspend fun electLobby(pattern: Pattern): ElectionLobby

Symmetric lobby entry both peers call identically: weave the mesh via us.tractat.kuilt.core.Rendezvous.New (a constant session name), then return an ElectionLobby over the woven seam. Every peer elects the same host (min(peers)); on Start the elected host runs the freeze round and each peer adopts a Room once (#1439).

Link copied to clipboard
open suspend override fun host(pattern: Pattern, memberName: String? = null, roomId: RoomId? = null): Room

Host a new room. The caller's peer becomes the SessionRole.Host.

Link copied to clipboard
open suspend override fun join(tag: Tag, memberName: String? = null): Room

Join an existing room. The caller's peer becomes a SessionRole.Joiner.