aquatic_ws_protocol 0.9.0

WebTorrent tracker protocol
Documentation
use criterion::{black_box, criterion_group, criterion_main, Criterion};
use std::time::Duration;

use aquatic_ws_protocol::{
    common::*,
    incoming::{AnnounceEvent, AnnounceRequest, AnnounceRequestOffer, InMessage},
};

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,
    ]);
    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;

            AnnounceRequestOffer {
                offer: RtcOffer {
                    t: RtcOfferType::Offer,
                    sdp: "abcdef".into(),
                },
                offer_id,
            }
        })
        .collect();
    let offers_len = offers.len();

    let request = InMessage::AnnounceRequest(AnnounceRequest {
        action: AnnounceAction::Announce,
        info_hash,
        peer_id,
        bytes_left: Some(2),
        event: Some(AnnounceEvent::Started),
        offers: Some(offers),
        numwant: Some(offers_len),
        answer: Some(RtcAnswer {
            t: RtcAnswerType::Answer,
            sdp: "abcdef".into(),
        }),
        answer_to_peer_id: Some(peer_id),
        answer_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())))
    });
}

criterion_group! {
    name = benches;
    config = Criterion::default()
        .sample_size(1000)
        .measurement_time(Duration::from_secs(180))
        .significance_level(0.01);
    targets = bench
}
criterion_main!(benches);