193 releases

new 0.7.41 Nov 7, 2024
0.7.35 Sep 25, 2024
0.7.28 Jul 30, 2024
0.7.1 Mar 21, 2024
0.1.24 Nov 16, 2022

#896 in Network programming

Download history 521/week @ 2024-07-18 724/week @ 2024-07-25 336/week @ 2024-08-01 326/week @ 2024-08-08 319/week @ 2024-08-15 124/week @ 2024-08-22 377/week @ 2024-08-29 322/week @ 2024-09-05 352/week @ 2024-09-12 307/week @ 2024-09-19 182/week @ 2024-09-26 383/week @ 2024-10-03 188/week @ 2024-10-10 449/week @ 2024-10-17 241/week @ 2024-10-24 303/week @ 2024-10-31

1,273 downloads per month
Used in divviup-cli

MPL-2.0 license

455KB
11K SLoC

janus_collector

Build Status latest version docs badge

janus_collector is a self-contained implementation of the Distributed Aggregation Protocol's collector role. It is intended for use with Janus and Divvi Up, ISRG's privacy-respecting metrics service. janus_collector is published to crates.io by a GitHub Action that runs when a janus release is created.


lib.rs:

A DAP-PPM collector

This library implements the collector role of the DAP-PPM protocol. It works in concert with two DAP-PPM aggregator servers to compute a statistical aggregate over data from many clients, while preserving the privacy of each client's data.

Examples

Initialize an instance of Collector.

use std::{fs::File, str::FromStr};

use janus_collector::{Collector, PrivateCollectorCredential};
use janus_messages::{Duration, FixedSizeQuery, Interval, Query, TaskId, Time};
use prio::vdaf::prio3::Prio3;
use url::Url;

let task_id = TaskId::from_str("[your DAP task ID here]").unwrap();

let collector_credential: PrivateCollectorCredential =
    serde_json::from_reader(File::open("[path to JSON encoded collector credential]").unwrap())
        .unwrap();

let leader_url =
    Url::from_str("[absolute URI to the DAP leader, e.g. https://leader.dap.example.com/]")
        .unwrap();

// Supply a VDAF implementation, corresponding to this task.
let vdaf = Prio3::new_count(2).unwrap();

let collector = Collector::new(
    task_id,
    leader_url,
    collector_credential.authentication_token(),
    collector_credential.hpke_keypair(),
    vdaf,
)
.unwrap();

// If this is a time interval task, specify the time interval over which the aggregation
// should be calculated.
let interval = Interval::new(
    Time::from_seconds_since_epoch(1_656_000_000),
    Duration::from_seconds(3600),
)
.unwrap();

// Make the requests and retrieve the aggregated statistic.
let aggregation_result = collector
    .collect(Query::new_time_interval(interval), &())
    .await
    .unwrap();

// Or if this is a fixed size task, make a fixed size query.
let query = Query::new_fixed_size(FixedSizeQuery::CurrentBatch);
let aggregation_result = collector.collect(query, &()).await.unwrap();

Dependencies

~38–52MB
~1M SLoC