webSocketMeshLoomJoin

fun webSocketMeshLoomJoin(httpClient: HttpClient, selfId: PeerId = freshPeerId(), policy: DeliveryPolicy = DeliveryPolicy.Reliable, dispatcher: CoroutineDispatcher = Dispatchers.Default, random: Random = Random.Default): KtorMeshClientLoom

Join a hub-spoke mesh over one WebSocket, rather than the two-peer relay webSocketLoomJoin gives you.

Same fabric, different topology: the returned loom's join completes an in-band mesh preamble with the hub and the resulting us.tractat.kuilt.core.Seam sees every other spoke in the room, not just the hub. Pair it with a us.tractat.kuilt.core.MuxServerLoom hub — pointing webSocketLoomJoin at one instead never completes admit, because a two-peer seam never sends the preamble the hub is waiting for.

The same argument order, the same deliberate omission of weaveTimeout, and the same httpClient lifecycle rule as webSocketLoomJoin; see its documentation.

Parameters

httpClient

The Ktor client every dial goes through; not closed by the loom.

selfId

This spoke's fabric identity, presented as ?peer=<id> on every dial. Defaults to a fresh random PeerId per loom.

policy

Bounds the spoke seam's inbound spool; see webSocketLoomJoin.

dispatcher

The canonical dispatcher slot — schedules the seam's read/write coroutines.

random

Source of the per-connection mesh nonce that breaks a displacement tie. Fabric- specific and not a general RNG slot: tests pass a seeded Random so the tiebreak is deterministic. Kept out of the universal quartet for the reason freshPeerId records — an identity mint is not a simulation input, but this nonce is.