mirror of
https://github.com/YGGverse/aquatic.git
synced 2026-04-02 10:45:30 +00:00
Run rustfmt, clean up aquatic_http_protocol/Cargo.toml
This commit is contained in:
parent
0cc312a78d
commit
d0e716f80b
65 changed files with 1754 additions and 2590 deletions
|
|
@ -1,28 +1,23 @@
|
|||
use anyhow::Context;
|
||||
use hashbrown::HashMap;
|
||||
use serde::{Serialize, Deserialize, Serializer, Deserializer};
|
||||
use serde::{Deserialize, Deserializer, Serialize, Serializer};
|
||||
|
||||
mod serde_helpers;
|
||||
|
||||
use serde_helpers::*;
|
||||
|
||||
|
||||
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
||||
pub struct AnnounceAction;
|
||||
|
||||
|
||||
impl Serialize for AnnounceAction {
|
||||
fn serialize<S>(
|
||||
&self,
|
||||
serializer: S
|
||||
) -> Result<S::Ok, S::Error>
|
||||
where S: Serializer
|
||||
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
|
||||
where
|
||||
S: Serializer,
|
||||
{
|
||||
serializer.serialize_str("announce")
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
impl<'de> Deserialize<'de> for AnnounceAction {
|
||||
fn deserialize<D>(deserializer: D) -> Result<AnnounceAction, D::Error>
|
||||
where
|
||||
|
|
@ -32,23 +27,18 @@ impl<'de> Deserialize<'de> for AnnounceAction {
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
||||
pub struct ScrapeAction;
|
||||
|
||||
|
||||
impl Serialize for ScrapeAction {
|
||||
fn serialize<S>(
|
||||
&self,
|
||||
serializer: S
|
||||
) -> Result<S::Ok, S::Error>
|
||||
where S: Serializer
|
||||
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
|
||||
where
|
||||
S: Serializer,
|
||||
{
|
||||
serializer.serialize_str("scrape")
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
impl<'de> Deserialize<'de> for ScrapeAction {
|
||||
fn deserialize<D>(deserializer: D) -> Result<ScrapeAction, D::Error>
|
||||
where
|
||||
|
|
@ -58,7 +48,6 @@ impl<'de> Deserialize<'de> for ScrapeAction {
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq, Serialize, Deserialize)]
|
||||
#[serde(transparent)]
|
||||
pub struct PeerId(
|
||||
|
|
@ -66,10 +55,9 @@ pub struct PeerId(
|
|||
deserialize_with = "deserialize_20_bytes",
|
||||
serialize_with = "serialize_20_bytes"
|
||||
)]
|
||||
pub [u8; 20]
|
||||
pub [u8; 20],
|
||||
);
|
||||
|
||||
|
||||
#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq, Serialize, Deserialize)]
|
||||
#[serde(transparent)]
|
||||
pub struct InfoHash(
|
||||
|
|
@ -77,10 +65,9 @@ pub struct InfoHash(
|
|||
deserialize_with = "deserialize_20_bytes",
|
||||
serialize_with = "serialize_20_bytes"
|
||||
)]
|
||||
pub [u8; 20]
|
||||
pub [u8; 20],
|
||||
);
|
||||
|
||||
|
||||
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
|
||||
#[serde(transparent)]
|
||||
pub struct OfferId(
|
||||
|
|
@ -88,33 +75,29 @@ pub struct OfferId(
|
|||
deserialize_with = "deserialize_20_bytes",
|
||||
serialize_with = "serialize_20_bytes"
|
||||
)]
|
||||
pub [u8; 20]
|
||||
pub [u8; 20],
|
||||
);
|
||||
|
||||
|
||||
/// Some kind of nested structure from https://www.npmjs.com/package/simple-peer
|
||||
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
|
||||
#[serde(transparent)]
|
||||
pub struct JsonValue(pub ::serde_json::Value);
|
||||
|
||||
|
||||
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
|
||||
#[serde(rename_all = "lowercase")]
|
||||
pub enum AnnounceEvent {
|
||||
Started,
|
||||
Stopped,
|
||||
Completed,
|
||||
Update
|
||||
Update,
|
||||
}
|
||||
|
||||
|
||||
impl Default for AnnounceEvent {
|
||||
fn default() -> Self {
|
||||
Self::Update
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// Apparently, these are sent to a number of peers when they are set
|
||||
/// in an AnnounceRequest
|
||||
/// action = "announce"
|
||||
|
|
@ -126,12 +109,11 @@ pub struct MiddlemanOfferToPeer {
|
|||
pub peer_id: PeerId,
|
||||
pub info_hash: InfoHash,
|
||||
/// Gets copied from AnnounceRequestOffer
|
||||
pub offer: JsonValue,
|
||||
pub offer: JsonValue,
|
||||
/// Gets copied from AnnounceRequestOffer
|
||||
pub offer_id: OfferId,
|
||||
}
|
||||
|
||||
|
||||
/// If announce request has answer = true, send this to peer with
|
||||
/// peer id == "to_peer_id" field
|
||||
/// Action field should be 'announce'
|
||||
|
|
@ -145,7 +127,6 @@ pub struct MiddlemanAnswerToPeer {
|
|||
pub offer_id: OfferId,
|
||||
}
|
||||
|
||||
|
||||
/// Element of AnnounceRequest.offers
|
||||
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
|
||||
pub struct AnnounceRequestOffer {
|
||||
|
|
@ -153,7 +134,6 @@ pub struct AnnounceRequestOffer {
|
|||
pub offer_id: OfferId,
|
||||
}
|
||||
|
||||
|
||||
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
|
||||
pub struct AnnounceRequest {
|
||||
pub action: AnnounceAction,
|
||||
|
|
@ -171,7 +151,7 @@ pub struct AnnounceRequest {
|
|||
/// Length of this is number of peers wanted?
|
||||
/// Max length of this is 10 in reference client code
|
||||
/// Not sent when announce event is stopped or completed
|
||||
pub offers: Option<Vec<AnnounceRequestOffer>>,
|
||||
pub offers: Option<Vec<AnnounceRequestOffer>>,
|
||||
/// Seems to only get sent by client when sending offers, and is also same
|
||||
/// as length of offers vector (or at least never less)
|
||||
/// Max length of this is 10 in reference client code
|
||||
|
|
@ -182,14 +162,13 @@ pub struct AnnounceRequest {
|
|||
/// Else, send MiddlemanAnswerToPeer to peer with "to_peer_id" as peer_id.
|
||||
/// I think using Option is good, it seems like this isn't always set
|
||||
/// (same as `offers`)
|
||||
pub answer: Option<JsonValue>,
|
||||
pub answer: Option<JsonValue>,
|
||||
/// Likely undefined if !(answer == true)
|
||||
pub to_peer_id: Option<PeerId>,
|
||||
pub to_peer_id: Option<PeerId>,
|
||||
/// Sent if answer is set
|
||||
pub offer_id: Option<OfferId>,
|
||||
}
|
||||
|
||||
|
||||
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
|
||||
pub struct AnnounceResponse {
|
||||
pub action: AnnounceAction,
|
||||
|
|
@ -201,7 +180,6 @@ pub struct AnnounceResponse {
|
|||
pub announce_interval: usize, // Default 2 min probably
|
||||
}
|
||||
|
||||
|
||||
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
|
||||
#[serde(untagged)]
|
||||
pub enum ScrapeRequestInfoHashes {
|
||||
|
|
@ -209,7 +187,6 @@ pub enum ScrapeRequestInfoHashes {
|
|||
Multiple(Vec<InfoHash>),
|
||||
}
|
||||
|
||||
|
||||
impl ScrapeRequestInfoHashes {
|
||||
pub fn as_vec(self) -> Vec<InfoHash> {
|
||||
match self {
|
||||
|
|
@ -219,7 +196,6 @@ impl ScrapeRequestInfoHashes {
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
|
||||
pub struct ScrapeRequest {
|
||||
pub action: ScrapeAction,
|
||||
|
|
@ -230,7 +206,6 @@ pub struct ScrapeRequest {
|
|||
pub info_hashes: Option<ScrapeRequestInfoHashes>,
|
||||
}
|
||||
|
||||
|
||||
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
|
||||
pub struct ScrapeStatistics {
|
||||
pub complete: usize,
|
||||
|
|
@ -238,7 +213,6 @@ pub struct ScrapeStatistics {
|
|||
pub downloaded: usize,
|
||||
}
|
||||
|
||||
|
||||
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
|
||||
pub struct ScrapeResponse {
|
||||
pub action: ScrapeAction,
|
||||
|
|
@ -247,7 +221,6 @@ pub struct ScrapeResponse {
|
|||
// pub flags: HashMap<String, usize>,
|
||||
}
|
||||
|
||||
|
||||
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
|
||||
#[serde(untagged)]
|
||||
pub enum InMessage {
|
||||
|
|
@ -255,7 +228,6 @@ pub enum InMessage {
|
|||
ScrapeRequest(ScrapeRequest),
|
||||
}
|
||||
|
||||
|
||||
impl InMessage {
|
||||
#[inline]
|
||||
pub fn to_ws_message(&self) -> ::tungstenite::Message {
|
||||
|
|
@ -263,9 +235,7 @@ impl InMessage {
|
|||
}
|
||||
|
||||
#[inline]
|
||||
pub fn from_ws_message(
|
||||
ws_message: tungstenite::Message
|
||||
) -> ::anyhow::Result<Self> {
|
||||
pub fn from_ws_message(ws_message: tungstenite::Message) -> ::anyhow::Result<Self> {
|
||||
use tungstenite::Message::Text;
|
||||
|
||||
let mut text = if let Text(text) = ws_message {
|
||||
|
|
@ -274,12 +244,10 @@ impl InMessage {
|
|||
return Err(anyhow::anyhow!("Message is not text"));
|
||||
};
|
||||
|
||||
return ::simd_json::serde::from_str(&mut text)
|
||||
.context("deserialize with serde");
|
||||
return ::simd_json::serde::from_str(&mut text).context("deserialize with serde");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
|
||||
#[serde(untagged)]
|
||||
pub enum OutMessage {
|
||||
|
|
@ -289,7 +257,6 @@ pub enum OutMessage {
|
|||
ScrapeResponse(ScrapeResponse),
|
||||
}
|
||||
|
||||
|
||||
impl OutMessage {
|
||||
#[inline]
|
||||
pub fn to_ws_message(&self) -> tungstenite::Message {
|
||||
|
|
@ -297,10 +264,8 @@ impl OutMessage {
|
|||
}
|
||||
|
||||
#[inline]
|
||||
pub fn from_ws_message(
|
||||
message: ::tungstenite::Message
|
||||
) -> ::anyhow::Result<Self> {
|
||||
use tungstenite::Message::{Text, Binary};
|
||||
pub fn from_ws_message(message: ::tungstenite::Message) -> ::anyhow::Result<Self> {
|
||||
use tungstenite::Message::{Binary, Text};
|
||||
|
||||
let mut text = match message {
|
||||
Text(text) => text,
|
||||
|
|
@ -312,7 +277,6 @@ impl OutMessage {
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use quickcheck::Arbitrary;
|
||||
|
|
@ -354,7 +318,7 @@ mod tests {
|
|||
|
||||
impl Arbitrary for AnnounceEvent {
|
||||
fn arbitrary(g: &mut quickcheck::Gen) -> Self {
|
||||
match (bool::arbitrary(g), bool::arbitrary(g)){
|
||||
match (bool::arbitrary(g), bool::arbitrary(g)) {
|
||||
(false, false) => Self::Started,
|
||||
(true, false) => Self::Started,
|
||||
(false, true) => Self::Completed,
|
||||
|
|
@ -370,7 +334,7 @@ mod tests {
|
|||
peer_id: Arbitrary::arbitrary(g),
|
||||
info_hash: Arbitrary::arbitrary(g),
|
||||
offer_id: Arbitrary::arbitrary(g),
|
||||
offer: sdp_json_value()
|
||||
offer: sdp_json_value(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -382,7 +346,7 @@ mod tests {
|
|||
peer_id: Arbitrary::arbitrary(g),
|
||||
info_hash: Arbitrary::arbitrary(g),
|
||||
offer_id: Arbitrary::arbitrary(g),
|
||||
answer: sdp_json_value()
|
||||
answer: sdp_json_value(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -391,7 +355,7 @@ mod tests {
|
|||
fn arbitrary(g: &mut quickcheck::Gen) -> Self {
|
||||
Self {
|
||||
offer_id: Arbitrary::arbitrary(g),
|
||||
offer: sdp_json_value()
|
||||
offer: sdp_json_value(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -408,17 +372,16 @@ mod tests {
|
|||
match has_offers_or_answer_or_neither {
|
||||
Some(true) => {
|
||||
offers = Some(Arbitrary::arbitrary(g));
|
||||
},
|
||||
}
|
||||
Some(false) => {
|
||||
answer = Some(sdp_json_value());
|
||||
to_peer_id = Some(Arbitrary::arbitrary(g));
|
||||
offer_id = Some(Arbitrary::arbitrary(g));
|
||||
},
|
||||
}
|
||||
None => (),
|
||||
}
|
||||
|
||||
let numwant = offers.as_ref()
|
||||
.map(|offers| offers.len());
|
||||
let numwant = offers.as_ref().map(|offers| offers.len());
|
||||
|
||||
Self {
|
||||
action: AnnounceAction,
|
||||
|
|
@ -456,7 +419,6 @@ mod tests {
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
impl Arbitrary for ScrapeRequestInfoHashes {
|
||||
fn arbitrary(g: &mut quickcheck::Gen) -> Self {
|
||||
if Arbitrary::arbitrary(g) {
|
||||
|
|
@ -490,7 +452,7 @@ mod tests {
|
|||
|
||||
impl Arbitrary for InMessage {
|
||||
fn arbitrary(g: &mut quickcheck::Gen) -> Self {
|
||||
if Arbitrary::arbitrary(g){
|
||||
if Arbitrary::arbitrary(g) {
|
||||
Self::AnnounceRequest(Arbitrary::arbitrary(g))
|
||||
} else {
|
||||
Self::ScrapeRequest(Arbitrary::arbitrary(g))
|
||||
|
|
@ -500,7 +462,7 @@ mod tests {
|
|||
|
||||
impl Arbitrary for OutMessage {
|
||||
fn arbitrary(g: &mut quickcheck::Gen) -> Self {
|
||||
match (Arbitrary::arbitrary(g), Arbitrary::arbitrary(g)){
|
||||
match (Arbitrary::arbitrary(g), Arbitrary::arbitrary(g)) {
|
||||
(false, false) => Self::AnnounceResponse(Arbitrary::arbitrary(g)),
|
||||
(true, false) => Self::ScrapeResponse(Arbitrary::arbitrary(g)),
|
||||
(false, true) => Self::Offer(Arbitrary::arbitrary(g)),
|
||||
|
|
@ -513,11 +475,9 @@ mod tests {
|
|||
fn quickcheck_serde_identity_in_message(in_message_1: InMessage) -> bool {
|
||||
let ws_message = in_message_1.to_ws_message();
|
||||
|
||||
let in_message_2 = InMessage::from_ws_message(
|
||||
ws_message.clone()
|
||||
).unwrap();
|
||||
let in_message_2 = InMessage::from_ws_message(ws_message.clone()).unwrap();
|
||||
|
||||
let success = in_message_1 == in_message_2;
|
||||
let success = in_message_1 == in_message_2;
|
||||
|
||||
if !success {
|
||||
dbg!(in_message_1);
|
||||
|
|
@ -534,11 +494,9 @@ mod tests {
|
|||
fn quickcheck_serde_identity_out_message(out_message_1: OutMessage) -> bool {
|
||||
let ws_message = out_message_1.to_ws_message();
|
||||
|
||||
let out_message_2 = OutMessage::from_ws_message(
|
||||
ws_message.clone()
|
||||
).unwrap();
|
||||
let out_message_2 = OutMessage::from_ws_message(ws_message.clone()).unwrap();
|
||||
|
||||
let success = out_message_1 == out_message_2;
|
||||
let success = out_message_1 == out_message_2;
|
||||
|
||||
if !success {
|
||||
dbg!(out_message_1);
|
||||
|
|
@ -562,22 +520,21 @@ mod tests {
|
|||
}
|
||||
|
||||
#[test]
|
||||
fn test_deserialize_info_hashes_vec(){
|
||||
fn test_deserialize_info_hashes_vec() {
|
||||
let mut input: String = r#"{
|
||||
"action": "scrape",
|
||||
"info_hash": ["aaaabbbbccccddddeeee", "aaaabbbbccccddddeeee"]
|
||||
}"#.into();
|
||||
}"#
|
||||
.into();
|
||||
|
||||
let info_hashes = ScrapeRequestInfoHashes::Multiple(
|
||||
vec![
|
||||
info_hash_from_bytes(b"aaaabbbbccccddddeeee"),
|
||||
info_hash_from_bytes(b"aaaabbbbccccddddeeee"),
|
||||
]
|
||||
);
|
||||
let info_hashes = ScrapeRequestInfoHashes::Multiple(vec![
|
||||
info_hash_from_bytes(b"aaaabbbbccccddddeeee"),
|
||||
info_hash_from_bytes(b"aaaabbbbccccddddeeee"),
|
||||
]);
|
||||
|
||||
let expected = ScrapeRequest {
|
||||
action: ScrapeAction,
|
||||
info_hashes: Some(info_hashes)
|
||||
info_hashes: Some(info_hashes),
|
||||
};
|
||||
|
||||
let observed: ScrapeRequest = ::simd_json::serde::from_str(&mut input).unwrap();
|
||||
|
|
@ -586,19 +543,19 @@ mod tests {
|
|||
}
|
||||
|
||||
#[test]
|
||||
fn test_deserialize_info_hashes_str(){
|
||||
fn test_deserialize_info_hashes_str() {
|
||||
let mut input: String = r#"{
|
||||
"action": "scrape",
|
||||
"info_hash": "aaaabbbbccccddddeeee"
|
||||
}"#.into();
|
||||
}"#
|
||||
.into();
|
||||
|
||||
let info_hashes = ScrapeRequestInfoHashes::Single(
|
||||
info_hash_from_bytes(b"aaaabbbbccccddddeeee")
|
||||
);
|
||||
let info_hashes =
|
||||
ScrapeRequestInfoHashes::Single(info_hash_from_bytes(b"aaaabbbbccccddddeeee"));
|
||||
|
||||
let expected = ScrapeRequest {
|
||||
action: ScrapeAction,
|
||||
info_hashes: Some(info_hashes)
|
||||
info_hashes: Some(info_hashes),
|
||||
};
|
||||
|
||||
let observed: ScrapeRequest = ::simd_json::serde::from_str(&mut input).unwrap();
|
||||
|
|
@ -607,15 +564,16 @@ mod tests {
|
|||
}
|
||||
|
||||
#[test]
|
||||
fn test_deserialize_info_hashes_null(){
|
||||
fn test_deserialize_info_hashes_null() {
|
||||
let mut input: String = r#"{
|
||||
"action": "scrape",
|
||||
"info_hash": null
|
||||
}"#.into();
|
||||
}"#
|
||||
.into();
|
||||
|
||||
let expected = ScrapeRequest {
|
||||
action: ScrapeAction,
|
||||
info_hashes: None
|
||||
info_hashes: None,
|
||||
};
|
||||
|
||||
let observed: ScrapeRequest = ::simd_json::serde::from_str(&mut input).unwrap();
|
||||
|
|
@ -624,14 +582,15 @@ mod tests {
|
|||
}
|
||||
|
||||
#[test]
|
||||
fn test_deserialize_info_hashes_missing(){
|
||||
fn test_deserialize_info_hashes_missing() {
|
||||
let mut input: String = r#"{
|
||||
"action": "scrape"
|
||||
}"#.into();
|
||||
}"#
|
||||
.into();
|
||||
|
||||
let expected = ScrapeRequest {
|
||||
action: ScrapeAction,
|
||||
info_hashes: None
|
||||
info_hashes: None,
|
||||
};
|
||||
|
||||
let observed: ScrapeRequest = ::simd_json::serde::from_str(&mut input).unwrap();
|
||||
|
|
@ -645,12 +604,12 @@ mod tests {
|
|||
|
||||
println!("{}", json);
|
||||
|
||||
let deserialized: ScrapeRequestInfoHashes = ::simd_json::serde::from_str(&mut json).unwrap();
|
||||
let deserialized: ScrapeRequestInfoHashes =
|
||||
::simd_json::serde::from_str(&mut json).unwrap();
|
||||
|
||||
let success = info_hashes == deserialized;
|
||||
|
||||
if !success {
|
||||
}
|
||||
if !success {}
|
||||
|
||||
success
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue