public override async Task Initialize() { await Task.Delay(1000); NodeId = await signaler.ConnectAsync(); Logger.Log("Client", "Connected to signaling server"); Logger.Debug("Client", $"My NodeId is {NodeId}"); await Task.Delay(1000); await conn.SetupAsync(signaler, false); Logger.Log("Client", "Connected to server"); var nodeIdCancelSource = new CancellationTokenSource(); nodeIdCancelSource.CancelAfter(NodeIdRetryTimeout); var nodeIdCancel = nodeIdCancelSource.Token; while (true) { nodeIdCancel.ThrowIfCancellationRequested(); // FIXME: this message has not meaningful but seems working as a kind of "ready" if (await conn.ReceiveMessageAsync <ITcpMessage>(Connection.ChannelType.Control, nodeIdCancel) is NodeIdMessage nodeIdMsg) { Logger.Debug("Client", $"Received NodeId={nodeIdMsg.NodeId}"); break; } } var cancelSource = new CancellationTokenSource(); conn.OnDisconnect += () => cancelSource.Cancel(); var _ = ProcessBlobMessagesAsync(ServerNodeId, conn, cancelSource.Token); }