JoinerReconnectControllerFactory
Factory for a host-side JoinerReconnectController, invoked once when a host room starts with the room-owned roomId, scope, and clock — the three inputs a controller needs but that only exist after the seam is woven (the roomId is minted against the host's woven selfId), so a caller cannot pre-build the instance and must supply this lambda instead.
Supply it to SeamRoomFactory to replace the default fixed-window hold with a custom policy — for example a predicate or unbounded hold that keeps a disconnected joiner's seat open for as long as a durable rejoin record exists, driving JoinerReconnectController.expire itself when that record is gone rather than on a fixed timer. When no factory is supplied the room builds the default DefaultJoinerReconnectController, whose window is HeartbeatConfig.reconnectWindow.