FakeRoom

class FakeRoom(val selfId: PeerId = PeerId("self"), initialRole: SessionRole = SessionRole.Host, initialRoster: Set<Member> = emptySet(), initialResumeToken: ResumeToken? = null) : Room

A test double for Room with test-driver helpers for roster manipulation, event delivery, and outgoing-frame inspection.

Defaults make FakeRoom() a ready-to-use, host-role, empty-roster room in one line:

val room = FakeRoom()
room.addMember(Member(PeerId("alice"), identity("alice"), Liveness.Connected))
room.deliver(PeerId("alice"), byteArrayOf(1, 2, 3))
val frame = room.incoming.first()

For wired two-room scenarios, prefer fakeRoomPair which cross-wires broadcast delivery between two rooms.

Send semantics (matching the Room contract):

Stream semantics — a deliberate divergence from the real Room. The real Room documents events and incoming as hot, no-replay streams (late collectors miss history). For test ergonomics this double backs them with unbounded buffering channels instead, so deliver(...) followed by incoming.first() works without racing a collector. Two consequences a consumer should not encode as Room guarantees:

  • frames/events emitted before collection are buffered and replayed here, whereas the real Room would drop them;

  • leave completes events/incoming (channel close), whereas the real Room cancels its backing scope without completing the flows.

Constructors

Link copied to clipboard
constructor(selfId: PeerId = PeerId("self"), initialRole: SessionRole = SessionRole.Host, initialRoster: Set<Member> = emptySet(), initialResumeToken: ResumeToken? = null)

Types

Link copied to clipboard
inner class FakeChannelSeam(val id: String) : Seam

A Seam view returned by FakeRoom.channel.

Properties

Link copied to clipboard

All payloads passed to broadcast, in call order.

Link copied to clipboard

All (peer, payload) pairs passed to sendTo, in call order.

Link copied to clipboard
open override val events: Flow<MembershipEvent>
Link copied to clipboard
open override val incoming: Flow<RoomFrame>
Link copied to clipboard

Configurable result returned by resume. Defaults to ResumeResult.Success.

Link copied to clipboard
open override val resumeToken: ResumeToken?
Link copied to clipboard
open override val role: StateFlow<SessionRole>
Link copied to clipboard
open override val roster: StateFlow<Set<Member>>
Link copied to clipboard
open override val selfId: PeerId

Functions

Link copied to clipboard
suspend fun addMember(member: Member)

Add member to the roster and emit MembershipEvent.Joined.

Link copied to clipboard
open suspend override fun broadcast(bytes: ByteArray)
Link copied to clipboard
open override fun channel(id: String): Seam

Returns a Seam view scoped to channel id, backed by _rosterPeers for admit-gated peer visibility and a dedicated Channel for test-driver frame delivery via FakeChannelSeam.deliver.

Link copied to clipboard

Returns the FakeChannelSeam for id if it has been created, or null otherwise.

Link copied to clipboard
suspend fun deliver(from: PeerId, payload: ByteArray)

Push payload from from into incoming as a RoomFrame.

Link copied to clipboard
suspend fun emit(event: MembershipEvent)

Push a raw MembershipEvent onto the events channel. Useful for events not covered by the named helpers.

Link copied to clipboard
suspend fun emitResumed(peerId: PeerId)

Emit MembershipEvent.Resumed for peerId (a partitioned joiner has reconnected within the window).

Link copied to clipboard
suspend fun hostLost(at: Instant)

Emit MembershipEvent.HostLost (terminal event on a joiner's room). After this, broadcast and sendTo become silent no-ops per the contract.

Link copied to clipboard
open suspend override fun leave(reason: LeaveReason)
Link copied to clipboard
suspend fun openWindow(peerId: PeerId, expiresAt: Instant)

Emit MembershipEvent.WindowOpened (host-side signal that a joiner's reconnect window has opened, expiring at expiresAt).

Link copied to clipboard
suspend fun partition(peerId: PeerId, at: Instant)

Flip the named member's Liveness to Liveness.Partitioned and emit MembershipEvent.Partitioned.

Link copied to clipboard
suspend fun recover(peerId: PeerId, at: Instant)

Flip the named member's Liveness back to Liveness.Connected and emit MembershipEvent.Recovered.

Link copied to clipboard
suspend fun removeMember(peerId: PeerId, reason: LeaveReason = LeaveReason.Normal)

Remove the member with peerId from the roster and emit MembershipEvent.Left. No-op if the peer is not in the roster.

Link copied to clipboard
open suspend override fun resume(token: ResumeToken): ResumeResult
Link copied to clipboard
open suspend override fun sendTo(peer: PeerId, bytes: ByteArray)
Link copied to clipboard
Link copied to clipboard
fun setRole(newRole: SessionRole)

Transition role to newRole.

Link copied to clipboard
fun tearSeam(reason: CloseReason = CloseReason.Normal)

Transition the seam state to SeamState.Torn. Channel views forward state from _seamState, so tearing the seam winds down any us.tractat.kuilt.crdt.replicator.Quilter subscribed to the channel.