Skip to content
This repository was archived by the owner on Sep 5, 2019. It is now read-only.

Commit 6db5ac3

Browse files
committed
don' overwrite the peer
1 parent f496cea commit 6db5ac3

File tree

3 files changed

+87
-34
lines changed

3 files changed

+87
-34
lines changed

src/main.rs

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,15 @@
11
#![feature(async_await)]
22

3-
use std::{net::ToSocketAddrs, sync::Arc, collections::HashMap};
3+
use std::{
4+
net::ToSocketAddrs,
5+
sync::Arc,
6+
collections::hash_map::{HashMap, Entry},
7+
};
48

5-
use futures::channel::mpsc;
6-
use futures::SinkExt;
9+
use futures::{
10+
channel::mpsc,
11+
SinkExt,
12+
};
713

814
use async_std::{
915
io::BufReader,
@@ -102,9 +108,14 @@ async fn broker(mut events: Receiver<Event>) -> Result<()> {
102108
}
103109
}
104110
Event::NewPeer { name, stream} => {
105-
let (client_sender, client_receiver) = mpsc::unbounded();
106-
peers.insert(name.clone(), client_sender);
107-
spawn_and_log_error(client_writer(client_receiver, stream));
111+
match peers.entry(name) {
112+
Entry::Occupied(..) => (),
113+
Entry::Vacant(entry) => {
114+
let (client_sender, client_receiver) = mpsc::unbounded();
115+
entry.insert(client_sender);
116+
spawn_and_log_error(client_writer(client_receiver, stream));
117+
}
118+
}
108119
}
109120
}
110121
}

tutorial.adoc

Lines changed: 35 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -328,10 +328,15 @@ async fn broker(mut events: Receiver<Event>) -> Result<()> {
328328
}
329329
}
330330
}
331-
Event::NewPeer { name, stream} => {
332-
let (client_sender, client_receiver) = mpsc::unbounded();
333-
peers.insert(name.clone(), client_sender); <4>
334-
spawn_and_log_error(client_writer(client_receiver, stream)); <5>
331+
Event::NewPeer { name, stream } => {
332+
match peers.entry(name) {
333+
Entry::Occupied(..) => (),
334+
Entry::Vacant(entry) => {
335+
let (client_sender, client_receiver) = mpsc::unbounded();
336+
entry.insert(client_sender); <4>
337+
spawn_and_log_error(client_writer(client_receiver, stream)); <5>
338+
}
339+
}
335340
}
336341
}
337342
}
@@ -354,10 +359,16 @@ At this point, we only need to start broker to get a fully-functioning (in the h
354359
----
355360
#![feature(async_await)]
356361
357-
use std::{net::ToSocketAddrs, sync::Arc, collections::HashMap};
362+
use std::{
363+
net::ToSocketAddrs,
364+
sync::Arc,
365+
collections::hash_map::{HashMap, Entry},
366+
};
358367
359-
use futures::channel::mpsc;
360-
use futures::SinkExt;
368+
use futures::{
369+
channel::mpsc,
370+
SinkExt,
371+
};
361372
362373
use async_std::{
363374
io::BufReader,
@@ -456,9 +467,14 @@ async fn broker(mut events: Receiver<Event>) -> Result<()> {
456467
}
457468
}
458469
Event::NewPeer { name, stream} => {
459-
let (client_sender, client_receiver) = mpsc::unbounded();
460-
peers.insert(name.clone(), client_sender);
461-
spawn_and_log_error(client_writer(client_receiver, stream));
470+
match peers.entry(name) {
471+
Entry::Occupied(..) => (),
472+
Entry::Vacant(entry) => {
473+
let (client_sender, client_receiver) = mpsc::unbounded();
474+
entry.insert(client_sender); <4>
475+
spawn_and_log_error(client_writer(client_receiver, stream)); <5>
476+
}
477+
}
462478
}
463479
}
464480
}
@@ -532,10 +548,15 @@ async fn broker(mut events: Receiver<Event>) -> Result<()> {
532548
}
533549
}
534550
Event::NewPeer { name, stream} => {
535-
let (client_sender, client_receiver) = mpsc::unbounded();
536-
peers.insert(name.clone(), client_sender);
537-
let handle = spawn_and_log_error(client_writer(client_receiver, stream));
538-
writers.push(handle);
551+
match peers.entry(name) {
552+
Entry::Occupied(..) => (),
553+
Entry::Vacant(entry) => {
554+
let (client_sender, client_receiver) = mpsc::unbounded();
555+
entry.insert(client_sender);
556+
let handle = spawn_and_log_error(client_writer(client_receiver, stream));
557+
writers.push(handle); <4>
558+
}
559+
}
539560
}
540561
}
541562
}

0 commit comments

Comments
 (0)