public static async Task <Connection> ConnectToRoom(DiscoveryRoom room, bool waitAllHandshake = true, CancellationToken token = default) { var remoteEP = new IPEndPoint(room.Address, room.Port); if (!PeerToPeerRoomData.TryUnpack(room.Data, room.Data.Length, out var data)) { throw new Exception("unpack room info"); } var impl = await new ConnectToLocalOwnerTask(remoteEP, data, room.DiscoveryPort, token).Run(); return(await TryWaitAllHandshake(new Connection(impl), waitAllHandshake, token)); }