Run rustfmt, clean up aquatic_http_protocol/Cargo.toml

This commit is contained in:
Joakim Frostegård 2021-08-15 22:26:11 +02:00
parent 0cc312a78d
commit d0e716f80b
65 changed files with 1754 additions and 2590 deletions

View file

@ -1,27 +1,25 @@
use std::time::Duration;
use criterion::{black_box, criterion_group, criterion_main, Criterion};
use std::time::Duration;
use aquatic_ws_protocol::*;
pub fn bench(c: &mut Criterion) {
let info_hash = InfoHash([
b'a', b'b', b'c', b'd', b'e',
b'?', b'\n', b'1', b'2', b'3',
0, 1, 2, 3, 4,
0, 1, 2, 3, 4,
b'a', b'b', b'c', b'd', b'e', b'?', b'\n', b'1', b'2', b'3', 0, 1, 2, 3, 4, 0, 1, 2, 3, 4,
]);
let peer_id = PeerId(info_hash.0);
let offers: Vec<AnnounceRequestOffer> = (0..10).map(|i| {
let mut offer_id = OfferId(info_hash.0);
offer_id.0[i] = i as u8;
let offers: Vec<AnnounceRequestOffer> = (0..10)
.map(|i| {
let mut offer_id = OfferId(info_hash.0);
AnnounceRequestOffer {
offer: JsonValue(::serde_json::json!({ "sdp": "abcdef" })),
offer_id,
}
}).collect();
offer_id.0[i] = i as u8;
AnnounceRequestOffer {
offer: JsonValue(::serde_json::json!({ "sdp": "abcdef" })),
offer_id,
}
})
.collect();
let offers_len = offers.len();
let request = InMessage::AnnounceRequest(AnnounceRequest {
@ -34,17 +32,17 @@ pub fn bench(c: &mut Criterion) {
numwant: Some(offers_len),
answer: Some(JsonValue(::serde_json::json!({ "sdp": "abcdef" }))),
to_peer_id: Some(peer_id),
offer_id: Some(OfferId(info_hash.0))
offer_id: Some(OfferId(info_hash.0)),
});
let ws_message = request.to_ws_message();
c.bench_function("deserialize-announce-request", |b| b.iter(||
InMessage::from_ws_message(black_box(ws_message.clone()))
));
c.bench_function("deserialize-announce-request", |b| {
b.iter(|| InMessage::from_ws_message(black_box(ws_message.clone())))
});
}
criterion_group!{
criterion_group! {
name = benches;
config = Criterion::default()
.sample_size(1000)
@ -52,4 +50,4 @@ criterion_group!{
.significance_level(0.01);
targets = bench
}
criterion_main!(benches);
criterion_main!(benches);

View file

@ -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
}

View file

@ -1,20 +1,20 @@
use serde::{Serializer, Deserializer, de::Visitor};
use serde::{de::Visitor, Deserializer, Serializer};
use super::{AnnounceAction, ScrapeAction};
pub struct AnnounceActionVisitor;
impl<'de> Visitor<'de> for AnnounceActionVisitor {
type Value = AnnounceAction;
fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
formatter.write_str("string with value 'announce'")
}
fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
where E: ::serde::de::Error, {
where
E: ::serde::de::Error,
{
if v == "announce" {
Ok(AnnounceAction)
} else {
@ -23,19 +23,19 @@ impl<'de> Visitor<'de> for AnnounceActionVisitor {
}
}
pub struct ScrapeActionVisitor;
impl<'de> Visitor<'de> for ScrapeActionVisitor {
type Value = ScrapeAction;
fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
formatter.write_str("string with value 'scrape'")
}
fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
where E: ::serde::de::Error, {
where
E: ::serde::de::Error,
{
if v == "scrape" {
Ok(ScrapeAction)
} else {
@ -44,17 +44,15 @@ impl<'de> Visitor<'de> for ScrapeActionVisitor {
}
}
pub fn serialize_20_bytes<S>(
data: &[u8; 20],
serializer: S
) -> Result<S::Ok, S::Error> where S: Serializer {
pub fn serialize_20_bytes<S>(data: &[u8; 20], serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
let text: String = data.iter().map(|byte| char::from(*byte)).collect();
serializer.serialize_str(&text)
}
struct TwentyByteVisitor;
impl<'de> Visitor<'de> for TwentyByteVisitor {
@ -66,7 +64,8 @@ impl<'de> Visitor<'de> for TwentyByteVisitor {
#[inline]
fn visit_str<E>(self, value: &str) -> Result<Self::Value, E>
where E: ::serde::de::Error,
where
E: ::serde::de::Error,
{
// Value is encoded in nodejs reference client something as follows:
// ```
@ -83,8 +82,8 @@ impl<'de> Visitor<'de> for TwentyByteVisitor {
let mut arr = [0u8; 20];
let mut char_iter = value.chars();
for a in arr.iter_mut(){
if let Some(c) = char_iter.next(){
for a in arr.iter_mut() {
if let Some(c) = char_iter.next() {
if c as u32 > 255 {
return Err(E::custom(format!(
"character not in single byte range: {:#?}",
@ -102,17 +101,14 @@ impl<'de> Visitor<'de> for TwentyByteVisitor {
}
}
#[inline]
pub fn deserialize_20_bytes<'de, D>(
deserializer: D
) -> Result<[u8; 20], D::Error>
where D: Deserializer<'de>
pub fn deserialize_20_bytes<'de, D>(deserializer: D) -> Result<[u8; 20], D::Error>
where
D: Deserializer<'de>,
{
deserializer.deserialize_any(TwentyByteVisitor)
}
#[cfg(test)]
mod tests {
use quickcheck_macros::quickcheck;
@ -130,7 +126,7 @@ mod tests {
}
#[test]
fn test_deserialize_20_bytes(){
fn test_deserialize_20_bytes() {
let mut input = r#""aaaabbbbccccddddeeee""#.to_string();
let expected = info_hash_from_bytes(b"aaaabbbbccccddddeeee");
@ -150,7 +146,7 @@ mod tests {
}
#[test]
fn test_serde_20_bytes(){
fn test_serde_20_bytes() {
let info_hash = info_hash_from_bytes(b"aaaabbbbccccddddeeee");
let mut out = ::simd_json::serde::to_string(&info_hash).unwrap();
@ -166,5 +162,4 @@ mod tests {
info_hash == info_hash_2
}
}
}