Skip to content

Commit 0ac8e14

Browse files
committed
feat: add DeleteTopic
1 parent 71f0ae4 commit 0ac8e14

File tree

2 files changed

+42
-0
lines changed

2 files changed

+42
-0
lines changed

src/client.rs

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,16 @@ impl Client {
213213
let res = r.await??;
214214
Ok(res)
215215
}
216+
217+
/// Delete a gossip topic.
218+
pub async fn delete_gossip_topic(&mut self, topic: TopicId) -> Result<()> {
219+
let (s, r) = oneshot::channel();
220+
self.sender
221+
.send(ActorMessage::DeleteTopic { topic, s })
222+
.await?;
223+
let res = r.await??;
224+
Ok(res)
225+
}
216226
}
217227

218228
struct Actor {
@@ -264,6 +274,10 @@ enum ActorMessage {
264274
bootstrap: Vec<NodeId>,
265275
s: oneshot::Sender<anyhow::Result<()>>,
266276
},
277+
DeleteTopic {
278+
topic: iroh_gossip::proto::TopicId,
279+
s: oneshot::Sender<anyhow::Result<()>>,
280+
},
267281
}
268282

269283
impl Actor {
@@ -436,6 +450,30 @@ impl Actor {
436450
};
437451
s.send(response).ok();
438452
}
453+
ActorMessage::DeleteTopic { topic, s } => {
454+
if let Err(err) = self
455+
.writer
456+
.send(ServerMessage::DeleteTopic {
457+
topic: *topic.as_bytes(),
458+
})
459+
.await
460+
{
461+
s.send(Err(err.into())).ok();
462+
return;
463+
}
464+
let response = match self.reader.next().await {
465+
Some(Ok(msg)) => match msg {
466+
ClientMessage::DeleteTopicResponse(None) => Ok(()),
467+
ClientMessage::DeleteTopicResponse(Some(err)) => {
468+
Err(anyhow!("delete topic failed: {}", err))
469+
}
470+
_ => Err(anyhow!("unexpected message from server: {:?}", msg)),
471+
},
472+
Some(Err(err)) => Err(anyhow!("failed to receive response: {:?}", err)),
473+
None => Err(anyhow!("connection closed")),
474+
};
475+
s.send(response).ok();
476+
}
439477
}
440478
}
441479

src/protocol.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ pub enum ServerMessage {
2424
label: String,
2525
bootstrap: Vec<NodeId>,
2626
},
27+
/// Request that the node joins the given tossip topic
28+
DeleteTopic { topic: ProtoTopicId },
2729
/// Request the name of a blob held by the node
2830
GetTag { name: String },
2931
/// Request to store the given metrics data
@@ -44,6 +46,8 @@ pub enum ClientMessage {
4446
PutBlobResponse(Option<String>),
4547
/// If set, this means it was an error.
4648
PutTopicResponse(Option<String>),
49+
/// If set, this means it was an error.
50+
DeleteTopicResponse(Option<String>),
4751
/// Simple pong response
4852
Pong {
4953
req: [u8; 32],

0 commit comments

Comments
 (0)