├── .gitignore ├── src ├── receivers │ ├── mod.rs │ ├── telegram.rs │ └── matrix.rs ├── webhook.rs ├── main.rs ├── args.rs ├── app.rs └── duration.rs ├── .dockerignore ├── .cargo └── config.toml ├── pkg ├── scripts │ ├── prerm │ └── postinst ├── doc │ └── description.txt └── systemd │ ├── alerter.sysconfig │ └── alerter.service ├── .github ├── dependabot.yml └── workflows │ ├── update-packagers.yml │ ├── cicd.yml │ └── pkg.yml ├── .devcontainer ├── Dockerfile └── devcontainer.json ├── templates ├── default.tg.hbs └── default.matrix.hbs ├── scripts ├── test.sh ├── kac2debian_changelog.py └── mangen.rs ├── CHANGELOG.md ├── Dockerfile ├── Cargo.toml ├── README.md ├── LICENSE └── Cargo.lock /.gitignore: -------------------------------------------------------------------------------- 1 | .env 2 | 3 | # Added by cargo 4 | 5 | /target 6 | -------------------------------------------------------------------------------- /src/receivers/mod.rs: -------------------------------------------------------------------------------- 1 | pub mod matrix; 2 | pub mod telegram; 3 | -------------------------------------------------------------------------------- /.dockerignore: -------------------------------------------------------------------------------- 1 | .github 2 | pkg 3 | scripts/kac2debian_changelog.py 4 | scripts/test.sh 5 | target 6 | .gitignore 7 | LICENSE 8 | *.md 9 | -------------------------------------------------------------------------------- /.cargo/config.toml: -------------------------------------------------------------------------------- 1 | [target.aarch64-unknown-linux-gnu] 2 | linker = "aarch64-linux-gnu-gcc" 3 | 4 | [target.armv7-unknown-linux-gnueabihf] 5 | linker = "arm-linux-gnueabihf-gcc" 6 | -------------------------------------------------------------------------------- /pkg/scripts/prerm: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | set -e 4 | 5 | getent passwd alerter >/dev/null || userdel --remove alerter 6 | getent group alerter >/dev/null || groupdel alerter 7 | 8 | #DEBHELPER# 9 | -------------------------------------------------------------------------------- /pkg/doc/description.txt: -------------------------------------------------------------------------------- 1 | Alerter is a free, open source bot with Telegram and Matrix support 2 | for receiving and sending alerts from Alertmanager to chats via webhooks. 3 | 4 | For more information visit https://github.com/ultram4rine/alerter#readme. -------------------------------------------------------------------------------- /pkg/scripts/postinst: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | set -e 4 | 5 | getent group alerter >/dev/null || groupadd -r alerter 6 | getent passwd alerter >/dev/null || useradd -r -g alerter -d /usr/share/alerter -s /sbin/nologin -c "Telegram bot for alerts from Alertmanager" alerter 7 | 8 | #DEBHELPER# 9 | -------------------------------------------------------------------------------- /pkg/systemd/alerter.sysconfig: -------------------------------------------------------------------------------- 1 | RUST_LOG='warn' 2 | ALERTER_LISTEN_PORT=3030 3 | ALERTER_TG_BOT_TOKEN= 4 | ALERTER_TG_CHAT_ID= 5 | ALERTER_TG_TMPL_PATH='/etc/alerter/templates/default.tg.hbs' 6 | ALERTER_MATRIX_USERNAME= 7 | ALERTER_MATRIX_PASSWORD= 8 | ALERTER_MATRIX_ROOM_ID= 9 | ALERTER_MATRIX_TMPL_PATH='/etc/alerter/templates/default.matrix.hbs' 10 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: "cargo" 4 | directory: "/" 5 | schedule: 6 | interval: "daily" 7 | 8 | - package-ecosystem: "docker" 9 | directory: / 10 | schedule: 11 | interval: "daily" 12 | 13 | - package-ecosystem: "github-actions" 14 | directory: "/" 15 | schedule: 16 | interval: "daily" 17 | -------------------------------------------------------------------------------- /pkg/systemd/alerter.service: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Description=Telegram bot for alerts from Alertmanager 3 | After=network-online.target local-fs.target 4 | Wants=network-online.target local-fs.target 5 | 6 | [Service] 7 | User=alerter 8 | Group=alerter 9 | EnvironmentFile=/etc/sysconfig/alerter 10 | ExecStart=/usr/bin/alerter 11 | Restart=on-failure 12 | KillMode=process 13 | 14 | [Install] 15 | WantedBy=multi-user.target 16 | -------------------------------------------------------------------------------- /.devcontainer/Dockerfile: -------------------------------------------------------------------------------- 1 | # See here for image contents: https://github.com/microsoft/vscode-dev-containers/tree/v0.238.1/containers/rust/.devcontainer/base.Dockerfile 2 | 3 | # [Choice] Debian OS version (use bullseye on local arm64/Apple Silicon): buster, bullseye 4 | ARG VARIANT="buster" 5 | FROM mcr.microsoft.com/vscode/devcontainers/rust:0-${VARIANT} 6 | 7 | # [Optional] Uncomment this section to install additional packages. 8 | RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \ 9 | && apt-get -y install --no-install-recommends libssl-dev pkg-config lintian \ 10 | && apt-get -y install --no-install-recommends python3 pip rpm python3-rpm \ 11 | && pip install --upgrade rpmlint \ 12 | && rpmlint -V 13 | -------------------------------------------------------------------------------- /src/webhook.rs: -------------------------------------------------------------------------------- 1 | use serde::{Deserialize, Serialize}; 2 | use serde_json::Value; 3 | 4 | /// Representation of `webhook` from Alertmanager. 5 | /// 6 | /// See https://prometheus.io/docs/alerting/latest/configuration/#webhook_config. 7 | #[derive(Serialize, Deserialize)] 8 | pub struct WebHook { 9 | pub status: String, 10 | pub alerts: Vec, 11 | } 12 | 13 | /// Representation of `alert` from Alertmanager. 14 | /// 15 | /// See https://prometheus.io/docs/alerting/latest/configuration/#webhook_config. 16 | #[derive(Serialize, Deserialize)] 17 | #[serde(rename_all = "camelCase")] 18 | pub struct Alert { 19 | pub labels: Value, 20 | pub annotations: Value, 21 | pub starts_at: String, 22 | pub ends_at: String, 23 | } 24 | -------------------------------------------------------------------------------- /templates/default.tg.hbs: -------------------------------------------------------------------------------- 1 | {{#if (eq status compare="firing")}} 2 | 🔥 Firing 🔥 3 | {{/if}} 4 | {{#if (eq status compare="resolved")}} 5 | ✅ Resolved ✅ 6 | {{/if}} 7 | 8 | {{#each alerts ~}} 9 | 10 | {{labels.alertname}} 11 | {{#if labels.building}} 12 | Building: {{labels.building}} 13 | {{/if}} 14 | {{#if labels.instance}} 15 | Instance: {{labels.instance}} 16 | {{/if}} 17 | {{#if labels.host}} 18 | Host: {{labels.host}} 19 | {{/if}} 20 | {{#if annotations.summary}} 21 | Summary: {{annotations.summary}} 22 | {{/if}} 23 | {{#if annotations.description}} 24 | Description: {{annotations.description}} 25 | {{/if}} 26 | {{#if (eq ../status compare="firing")}} 27 | Duration: {{ since startsAt }} 28 | {{/if}} 29 | {{#if (eq ../status compare="resolved")}} 30 | Duration: {{ duration startsAt y=endsAt }} 31 | Ended: {{ since endsAt }} ago 32 | {{/if}} 33 | 34 | {{/each}} -------------------------------------------------------------------------------- /templates/default.matrix.hbs: -------------------------------------------------------------------------------- 1 | {{#if (eq status compare="firing")}} 2 | 🔥 **Firing** 🔥 3 | {{/if}} 4 | {{#if (eq status compare="resolved")}} 5 | ✅ **Resolved** ✅ 6 | {{/if}} 7 | 8 | {{#each alerts ~}} 9 | 10 | **{{labels.alertname}}**
11 | {{#if labels.building}} 12 | **Building**: {{labels.building}}
13 | {{/if}} 14 | {{#if labels.instance}} 15 | **Instance**: {{labels.instance}}
16 | {{/if}} 17 | {{#if labels.host}} 18 | **Host**: {{labels.host}}
19 | {{/if}} 20 | {{#if annotations.summary}} 21 | **Summary**: {{annotations.summary}}
22 | {{/if}} 23 | {{#if annotations.description}} 24 | **Description**: {{annotations.description}}
25 | {{/if}} 26 | {{#if (eq ../status compare="firing")}} 27 | **Duration**: {{ since startsAt }} 28 | {{/if}} 29 | {{#if (eq ../status compare="resolved")}} 30 | **Duration**: {{ duration startsAt y=endsAt }} 31 | **Ended**: {{ since endsAt }} ago 32 | {{/if}} 33 | 34 | {{/each}} -------------------------------------------------------------------------------- /scripts/test.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | curl -i \ 4 | -H "Content-Type: application/json" \ 5 | --request POST \ 6 | --data '{"receiver":"telegram","status":"firing","alerts":[{"status":"firing","labels":{"alertname":"Fire","severity":"critical"},"annotations":{"summary":"Something is on fire"},"startsAt":"2018-11-04T22:43:58.283995108+01:00","endsAt":"2018-11-04T22:46:58.283995108+01:00","generatorURL":"http://localhost:9090/graph?g0.expr=vector%28666%29\u0026g0.tab=1"},{"status":"resolved","labels":{"alertname":"Green","severity":"critical"},"annotations":{"summary":"Something cool! <3"},"startsAt":"2018-11-04T22:43:58.283995108+01:00","endsAt":"2018-11-04T22:46:58.283995108+01:00","generatorURL":"http://localhost:9090/graph?g0.expr=vector%28666%29\u0026g0.tab=1"}],"groupLabels":{"alertname":"Fire"},"commonLabels":{"alertname":"Fire","severity":"critical"},"commonAnnotations":{"message":"Something is on fire"},"externalURL":"http://localhost:9093","version":"4","groupKey":"{}:{alertname=\"Fire\"}"}' \ 7 | localhost:3030/"$1" 8 | -------------------------------------------------------------------------------- /src/receivers/telegram.rs: -------------------------------------------------------------------------------- 1 | use log::warn; 2 | use std::{convert::Infallible, sync::Arc}; 3 | 4 | use handlebars::Handlebars; 5 | use teloxide::{ 6 | requests::{Request, Requester}, 7 | types::{ChatId, ParseMode}, 8 | Bot, 9 | }; 10 | use warp::http::StatusCode; 11 | 12 | use crate::webhook::WebHook; 13 | 14 | /// Sends message to Telegram chat. 15 | /// 16 | /// # Arguments 17 | /// 18 | /// * `webhook` - A `WebHook` from Alertmanager. 19 | /// * `maybe_bot` - An optional `Bot` instance. If `None`, status code `503` would be returned. 20 | /// * `hb` - A handlebars registry with `default_tg` template. 21 | /// * `chat_id` - A `ChatId` of chat to send message to. 22 | pub async fn send_message_tg( 23 | webhook: WebHook, 24 | maybe_bot: Option, 25 | hb: Arc>, 26 | chat_id: ChatId, 27 | ) -> Result { 28 | match maybe_bot { 29 | Some(bot) => { 30 | let msg_text = match hb.render("default_tg", &webhook) { 31 | Ok(v) => v, 32 | Err(err) => { 33 | warn!("failed to render message: {}", err); 34 | return Ok(StatusCode::INTERNAL_SERVER_ERROR); 35 | } 36 | }; 37 | 38 | let mut msg = bot.send_message(chat_id, msg_text.clone()); 39 | msg.parse_mode = Some(ParseMode::Html); 40 | 41 | match msg.send().await { 42 | Ok(_) => Ok(StatusCode::OK), 43 | Err(err) => { 44 | warn!("failed to send message: {}", err); 45 | Ok(StatusCode::INTERNAL_SERVER_ERROR) 46 | } 47 | } 48 | } 49 | None => Ok(StatusCode::SERVICE_UNAVAILABLE), 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | All notable changes to this project will be documented in this file. 4 | 5 | The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), 6 | and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). 7 | 8 | ## [Unreleased] 9 | 10 | ## [0.3.2] - 2022-06-28 11 | 12 | ### Added 13 | 14 | - Build Docker image for ARMv7. 15 | 16 | ### Changed 17 | 18 | - Use rust:1.61 as base image for docker image. 19 | - Use libssl-dev:armhf for build deb package for ARMv7. 20 | 21 | ## [0.3.1] - 2022-05-02 22 | 23 | ### Added 24 | 25 | - Build RPM package for CentOS 7 too. 26 | - Added changelog to Deb packages. 27 | - Added man page to Deb/RPM packages. 28 | 29 | ### Changed 30 | 31 | - Remove apt cache from docker image. 32 | - Use rust:1.60 as base image for docker image. 33 | 34 | ### Fixed 35 | 36 | - Fixed license field in RPM packages 37 | - Fixed home directory in post installation script. 38 | - Fixed extended description in Deb packages. 39 | 40 | ## [0.3.0] - 2022-03-15 41 | 42 | ### Added 43 | 44 | - [Matrix](https://matrix.org/) support. 45 | 46 | ### Changed 47 | 48 | - Change default listen port to `3030`. 49 | 50 | ### Fixed 51 | 52 | - Fix Docker image. 53 | 54 | ## [0.2.3] - 2022-03-14 55 | 56 | ### Changed 57 | 58 | - New Docker image. 59 | 60 | ### Fixed 61 | 62 | - Fix logging. 63 | 64 | ## [0.2.2] - 2022-03-11 65 | 66 | ### Added 67 | 68 | - Use [clap](https://github.com/clap-rs/clap). 69 | 70 | ## [0.2.1] - 2022-02-21 71 | 72 | ### Changed 73 | 74 | - Updated to Rust 2021 Edition. 75 | 76 | ## [0.2.0] - 2021-08-30 77 | 78 | ### Changed 79 | 80 | - Use [teloxide](https://github.com/teloxide/teloxide). 81 | 82 | ## [0.1.0] - 2021-08-30 83 | 84 | ### Changed 85 | 86 | - Rewrited in [Rust](https://www.rust-lang.org/). 87 | 88 | ## [0.0.1] - 2021-06-16 89 | 90 | - Workable version. 91 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM --platform=$BUILDPLATFORM rust:1.61.0-slim-bullseye as builder 2 | 3 | RUN USER=root cargo new --bin alerter 4 | WORKDIR /alerter 5 | 6 | ENV PKG_CONFIG_ALLOW_CROSS=1 7 | 8 | ARG TARGETPLATFORM 9 | RUN echo "Setting variables for ${TARGETPLATFORM:=linux/amd64}" && \ 10 | case "${TARGETPLATFORM}" in \ 11 | linux/amd64) \ 12 | echo "x86_64-unknown-linux-gnu"| tee /tmp/rusttarget; \ 13 | break;; \ 14 | linux/arm64) \ 15 | echo "aarch64-unknown-linux-gnu" | tee /tmp/rusttarget; \ 16 | break;; \ 17 | linux/arm/v7) \ 18 | echo "armv7-unknown-linux-gnueabihf" | tee /tmp/rusttarget; \ 19 | break;; \ 20 | *) echo "unsupported platform ${TARGETPLATFORM}";; \ 21 | esac 22 | RUN rustup target add "$(cat /tmp/rusttarget)" 23 | 24 | RUN dpkg --add-architecture arm64 &&\ 25 | dpkg --add-architecture armhf && \ 26 | apt-get update && \ 27 | apt-get install -y pkg-config libssl-dev cmake g++ \ 28 | libssl-dev:arm64 gcc-aarch64-linux-gnu g++-aarch64-linux-gnu \ 29 | libssl-dev:armhf gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf 30 | 31 | COPY .cargo ./.cargo 32 | COPY ./scripts/mangen.rs ./scripts/mangen.rs 33 | COPY ./Cargo.lock ./Cargo.lock 34 | COPY ./Cargo.toml ./Cargo.toml 35 | 36 | RUN cargo build --release --target "$(cat /tmp/rusttarget)" 37 | RUN rm src/*.rs 38 | RUN rm ./target/"$(cat /tmp/rusttarget)"/release/deps/alerter* 39 | 40 | COPY ./src ./src 41 | 42 | RUN cargo build --release --target "$(cat /tmp/rusttarget)" 43 | RUN mv ./target/"$(cat /tmp/rusttarget)"/release/alerter ./target/release/ 44 | 45 | FROM debian:bullseye-slim 46 | 47 | RUN apt-get update && \ 48 | apt-get install -y ca-certificates && \ 49 | update-ca-certificates && \ 50 | rm -rf /var/lib/apt/lists/* 51 | 52 | RUN adduser --system --group alerter 53 | USER alerter 54 | 55 | WORKDIR /usr/share/alerter 56 | COPY templates ./templates 57 | COPY --from=builder /alerter/target/release/alerter . 58 | ENV RUST_LOG="warn" 59 | 60 | EXPOSE 3030/tcp 61 | 62 | ENTRYPOINT ["./alerter"] -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | mod app; 2 | mod args; 3 | mod duration; 4 | mod receivers; 5 | mod webhook; 6 | 7 | extern crate dotenv; 8 | extern crate pretty_env_logger; 9 | 10 | use anyhow::Result; 11 | use clap::Parser; 12 | use dotenv::dotenv; 13 | use matrix_sdk::{ruma::UserId, Client}; 14 | use teloxide::{types::ChatId, Bot}; 15 | 16 | use crate::{ 17 | app::{create_filter, create_hb}, 18 | args::Args, 19 | }; 20 | 21 | #[tokio::main] 22 | async fn main() -> Result<()> { 23 | pretty_env_logger::init(); 24 | dotenv().ok(); 25 | let args = Args::parse(); 26 | 27 | let tg_token: String; 28 | let mut tg_chat_id: ChatId = ChatId(0); 29 | let mut tg_bot: Option = None; 30 | 31 | if args.tg { 32 | tg_token = args.tg_token.unwrap(); 33 | tg_chat_id = ChatId(args.tg_chat_id.unwrap()); 34 | 35 | tg_bot = Some(Bot::new(tg_token)); 36 | } 37 | 38 | let matrix_user: String; 39 | let matrix_pass: String; 40 | let mut matrix_room_id: String = "".to_owned(); 41 | let mut matrix_client: Option = None; 42 | 43 | if args.matrix { 44 | matrix_user = args.matrix_user.unwrap(); 45 | matrix_pass = args.matrix_pass.unwrap(); 46 | matrix_room_id = args.matrix_room_id.unwrap(); 47 | 48 | let matrix_user_id = <&UserId>::try_from(matrix_user.as_str())?; 49 | 50 | matrix_client = Some( 51 | Client::builder() 52 | .user_id(matrix_user_id.clone()) 53 | .build() 54 | .await?, 55 | ); 56 | 57 | matrix_client 58 | .clone() 59 | .unwrap() 60 | .login( 61 | matrix_user_id.localpart(), 62 | matrix_pass.as_str(), 63 | Some("Alerter bot"), 64 | None, 65 | ) 66 | .await?; 67 | } 68 | 69 | let hb = create_hb(args.tg_template_path, args.matrix_template_path)?; 70 | let filter = create_filter(tg_bot, matrix_client, hb, tg_chat_id, matrix_room_id); 71 | 72 | let server = warp::serve(filter); 73 | server.run(([0, 0, 0, 0], args.port)).await; 74 | 75 | Ok(()) 76 | } 77 | -------------------------------------------------------------------------------- /src/args.rs: -------------------------------------------------------------------------------- 1 | use clap::{ArgGroup, Parser}; 2 | 3 | #[derive(Parser, Debug)] 4 | #[clap(version, about, long_about = None)] 5 | #[clap(group( 6 | ArgGroup::new("req_flags") 7 | .required(true) 8 | .multiple(true) 9 | .args(&["tg", "matrix"]), 10 | ))] 11 | pub struct Args { 12 | #[clap( 13 | short, 14 | long, 15 | env = "ALERTER_LISTEN_PORT", 16 | default_value_t = 3030, 17 | help = "Port to listen." 18 | )] 19 | pub port: u16, 20 | 21 | #[clap( 22 | long, 23 | requires = "tg-token", 24 | requires = "tg-chat-id", 25 | requires = "tg-template-path", 26 | help = "Enable Telegram support" 27 | )] 28 | pub tg: bool, 29 | 30 | #[clap(long, env = "ALERTER_TG_BOT_TOKEN", help = "Telegram bot token.")] 31 | pub tg_token: Option, 32 | 33 | #[clap(long, env = "ALERTER_TG_CHAT_ID", help = "Telegram chat ID.")] 34 | pub tg_chat_id: Option, 35 | 36 | #[clap( 37 | long, 38 | env = "ALERTER_TG_TMPL_PATH", 39 | default_value = "templates/default.tg.hbs", 40 | help = "Path to handlebars template file for Telegram." 41 | )] 42 | pub tg_template_path: String, 43 | 44 | #[clap( 45 | long, 46 | requires = "matrix-user", 47 | requires = "matrix-pass", 48 | requires = "matrix-room-id", 49 | requires = "matrix-template-path", 50 | help = "Enable Matrix support" 51 | )] 52 | pub matrix: bool, 53 | 54 | #[clap(long, env = "ALERTER_MATRIX_USERNAME", help = "Matrix username")] 55 | pub matrix_user: Option, 56 | 57 | #[clap(long, env = "ALERTER_MATRIX_PASSWORD", help = "Matrix password")] 58 | pub matrix_pass: Option, 59 | 60 | #[clap(long, env = "ALERTER_MATRIX_ROOM_ID", help = "Matrix room id")] 61 | pub matrix_room_id: Option, 62 | 63 | #[clap( 64 | long, 65 | env = "ALERTER_MATRIX_TMPL_PATH", 66 | default_value = "templates/default.matrix.hbs", 67 | help = "Path to handlebars template file for Matrix." 68 | )] 69 | pub matrix_template_path: String, 70 | } 71 | -------------------------------------------------------------------------------- /.devcontainer/devcontainer.json: -------------------------------------------------------------------------------- 1 | // For format details, see https://aka.ms/devcontainer.json. For config options, see the README at: 2 | // https://github.com/microsoft/vscode-dev-containers/tree/v0.238.1/containers/rust 3 | { 4 | "name": "Rust", 5 | "build": { 6 | "dockerfile": "Dockerfile", 7 | "args": { 8 | // Use the VARIANT arg to pick a Debian OS version: buster, bullseye 9 | // Use bullseye when on local on arm64/Apple Silicon. 10 | "VARIANT": "bullseye" 11 | } 12 | }, 13 | "runArgs": ["--cap-add=SYS_PTRACE", "--security-opt", "seccomp=unconfined"], 14 | 15 | // Configure tool-specific properties. 16 | "customizations": { 17 | // Configure properties specific to VS Code. 18 | "vscode": { 19 | // Set *default* container specific settings.json values on container create. 20 | "settings": { 21 | "lldb.executable": "/usr/bin/lldb", 22 | // VS Code don't watch files under ./target 23 | "files.watcherExclude": { 24 | "**/target/**": true 25 | }, 26 | "rust-analyzer.checkOnSave.command": "clippy" 27 | }, 28 | 29 | // Add the IDs of extensions you want installed when the container is created. 30 | "extensions": [ 31 | "vadimcn.vscode-lldb", 32 | "mutantdino.resourcemonitor", 33 | "rust-lang.rust-analyzer", 34 | "tamasfe.even-better-toml", 35 | "serayuzgur.crates", 36 | "mads-hartmann.bash-ide-vscode", 37 | "aaron-bond.better-comments", 38 | "jeff-hykin.better-shellscript-syntax", 39 | "ms-azuretools.vscode-docker", 40 | "IronGeek.vscode-env", 41 | "mhutchie.git-graph", 42 | "cschleiden.vscode-github-actions", 43 | "oderwat.indent-rainbow", 44 | "DavidAnson.vscode-markdownlint", 45 | "ms-python.vscode-pylance", 46 | "ms-python.python", 47 | "foxundermoon.shell-format" 48 | ] 49 | } 50 | }, 51 | 52 | // Use 'forwardPorts' to make a list of ports inside the container available locally. 53 | // "forwardPorts": [], 54 | 55 | // Use 'postCreateCommand' to run commands after the container is created. 56 | "postCreateCommand": "cargo install cargo-deb cargo-generate-rpm", 57 | 58 | // Comment out to connect as root instead. More info: https://aka.ms/vscode-remote/containers/non-root. 59 | "remoteUser": "vscode", 60 | "features": { 61 | "docker-from-docker": "20.10", 62 | "git": "os-provided", 63 | "github-cli": "latest", 64 | "python": "os-provided" 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /src/receivers/matrix.rs: -------------------------------------------------------------------------------- 1 | use log::warn; 2 | use std::{convert::Infallible, sync::Arc}; 3 | 4 | use handlebars::Handlebars; 5 | use matrix_sdk::{ 6 | ruma::{ 7 | api::client::message::send_message_event, 8 | events::{ 9 | room::message::{MessageType, RoomMessageEventContent, TextMessageEventContent}, 10 | AnyMessageLikeEventContent, 11 | }, 12 | RoomId, TransactionId, 13 | }, 14 | Client, 15 | }; 16 | use warp::http::StatusCode; 17 | 18 | use crate::webhook::WebHook; 19 | 20 | /// Sends message to Matrix room. 21 | /// 22 | /// # Arguments 23 | /// 24 | /// * `webhook` - A `WebHook` from Alertmanager. 25 | /// * `maybe_client` - An optional `Client` instance. If `None`, status code `503` would be returned. 26 | /// * `hb` - A handlebars registry with `default_matrix` template. 27 | /// * `room_id` - An ID of room to send message to. 28 | pub async fn send_message_matrix( 29 | webhook: WebHook, 30 | maybe_client: Option, 31 | hb: Arc>, 32 | room_id: String, 33 | ) -> Result { 34 | match maybe_client { 35 | Some(client) => { 36 | let msg_text = match hb.render("default_matrix", &webhook) { 37 | Ok(v) => v, 38 | Err(err) => { 39 | warn!("failed to render message: {}", err); 40 | return Ok(StatusCode::INTERNAL_SERVER_ERROR); 41 | } 42 | }; 43 | 44 | match client 45 | .send( 46 | match send_message_event::v3::Request::new( 47 | &RoomId::parse(room_id).unwrap(), 48 | &TransactionId::new(), 49 | &AnyMessageLikeEventContent::RoomMessage(RoomMessageEventContent::new( 50 | MessageType::Text(TextMessageEventContent::markdown(msg_text)), 51 | )), 52 | ) { 53 | Ok(req) => req, 54 | Err(err) => { 55 | warn!("failed to create request: {}", err); 56 | return Ok(StatusCode::INTERNAL_SERVER_ERROR); 57 | } 58 | }, 59 | None, 60 | ) 61 | .await 62 | { 63 | Ok(_) => Ok(StatusCode::OK), 64 | Err(err) => { 65 | warn!("failed to send message: {}", err); 66 | Ok(StatusCode::INTERNAL_SERVER_ERROR) 67 | } 68 | } 69 | } 70 | None => Ok(StatusCode::SERVICE_UNAVAILABLE), 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /scripts/kac2debian_changelog.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | import argparse 4 | import re 5 | from datetime import datetime, timezone 6 | 7 | parser = argparse.ArgumentParser( 8 | description="Script for transforming 'keep a changelog' to 'debian/changelog'." 9 | ) 10 | parser.add_argument("-i", "--input", type=str, default="CHANGELOG.md", 11 | help="Input changelog in 'keep a changelog' format. Default: 'CHANGELOG.md'") 12 | parser.add_argument("-o", "--output", type=str, 13 | help="Output file.", required=True) 14 | parser.add_argument('-p', "--package-name", type=str, 15 | help="Name of package.", required=True) 16 | parser.add_argument("-a", "--author", type=str, 17 | help="Author's name.", required=True) 18 | parser.add_argument("-e", "--email", type=str, 19 | help="Author's email.", required=True) 20 | args = parser.parse_args() 21 | 22 | changelog_file = open(args.input, "r") 23 | debian_changelog_file = open(args.output, "w") 24 | package_name = args.package_name 25 | author = args.author 26 | email = args.email 27 | 28 | 29 | def remove_md_link(line_with_link: str): 30 | return re.sub(r"(.*)\[(.*)]\(.*\)(.*)", r"\1\2\3", line_with_link) 31 | 32 | 33 | lines = changelog_file.readlines() 34 | first_ver_entry = True # Flag for first version occurrence 35 | ver_and_date = [] 36 | for line in lines: 37 | if re.match(r"^## \[\d.*]", line): 38 | if first_ver_entry: 39 | first_ver_entry = False 40 | else: 41 | new_line = "\n -- {} <{}> {}\n\n".format(author, email, 42 | datetime.strptime(ver_and_date[1], "%Y-%m-%d").replace( 43 | tzinfo=timezone.utc).strftime("%a, %d %b %Y %H:%M:%S %z")) 44 | debian_changelog_file.write(new_line) 45 | 46 | ver_and_date = line[3:].strip().split(" - ") 47 | new_line = "{} ({}) unstable; urgency=medium\n\n".format(package_name, 48 | ver_and_date[0].replace('[', '').replace(']', '')) 49 | debian_changelog_file.write(new_line) 50 | elif re.match(r"^- .*", line): 51 | new_line = " {}\n".format( 52 | remove_md_link(line).strip().replace("- ", "* ", 1)) 53 | debian_changelog_file.write(new_line) 54 | 55 | new_line = "\n -- {} <{}> {}\n".format(author, email, 56 | datetime.strptime(ver_and_date[1], "%Y-%m-%d").replace( 57 | tzinfo=timezone.utc).strftime("%a, %d %b %Y %H:%M:%S %z")) 58 | debian_changelog_file.write(new_line) 59 | -------------------------------------------------------------------------------- /.github/workflows/update-packagers.yml: -------------------------------------------------------------------------------- 1 | name: Update packagers 2 | 3 | on: 4 | workflow_dispatch: 5 | schedule: 6 | - cron: "0 0 * * 1" 7 | 8 | jobs: 9 | check-for-updates: 10 | name: Check packagers updates 11 | runs-on: ubuntu-20.04 12 | env: 13 | DEBIAN_FRONTEND: noninteractive 14 | strategy: 15 | fail-fast: false 16 | matrix: 17 | packager: [cargo-deb, cargo-generate-rpm] 18 | permissions: write-all 19 | steps: 20 | - name: Checkout 21 | uses: actions/checkout@v3 22 | 23 | - name: Get versions and set env vars 24 | run: | 25 | case ${{ matrix.packager }} in 26 | cargo-deb) 27 | VER_NAME='CARGO_DEB_VER' 28 | echo "REPO_URL=https://github.com/kornelski/cargo-deb" >> $GITHUB_ENV 29 | ;; 30 | 31 | cargo-generate-rpm) 32 | VER_NAME='CARGO_GENERATE_RPM_VER' 33 | echo "REPO_URL=https://github.com/cat-in-136/cargo-generate-rpm" >> $GITHUB_ENV 34 | ;; 35 | esac 36 | 37 | echo "VER_NAME=${VER_NAME}" >> $GITHUB_ENV 38 | 39 | echo "OLD_VER=$(cat .github/workflows/pkg.yml | sed -n "s/.*${VER_NAME}: \(.*\)/\1/p")" >> $GITHUB_ENV 40 | echo "NEW_VER=$(curl -s -X GET https://crates.io/api/v1/crates/${{ matrix.packager }} | jq '.versions[0].num' | tr -d '"')" >> $GITHUB_ENV 41 | 42 | - name: Make changes to pkg workflow 43 | if: env.OLD_VER != env.NEW_VER 44 | run: | 45 | sed -i "s/\(\s${VER_NAME}: \)\(.*\)/\1${NEW_VER}/g" .github/workflows/pkg.yml 46 | 47 | - name: Create Pull Request 48 | if: env.OLD_VER != env.NEW_VER 49 | uses: peter-evans/create-pull-request@v4 50 | with: 51 | token: ${{ secrets.GITHUB_TOKEN }} 52 | commit-message: Bump ${{ matrix.packager }} from ${{ env.OLD_VER }} to ${{ env.NEW_VER }} 53 | committer: github-actions[bot] 54 | author: github-actions[bot] 55 | branch: cargo/${{ matrix.packager }}-${{ env.NEW_VER }} 56 | delete-branch: true 57 | base: master 58 | title: "Bump ${{ matrix.packager }} from ${{ env.OLD_VER }} to ${{ env.NEW_VER }}" 59 | body: | 60 | Bumps [${{ matrix.packager }}](${{ env.REPO_URL }}) from ${{ env.OLD_VER }} to ${{ env.NEW_VER }}. 61 | 62 | This PR is auto-generated by [create-pull-request](https://github.com/peter-evans/create-pull-request) using the [update-packagers](https://github.com/ultram4rine/alerter/blob/master/.github/workflows/update-packagers.yml) workflow. 63 | labels: | 64 | dependencies 65 | rust 66 | -------------------------------------------------------------------------------- /src/app.rs: -------------------------------------------------------------------------------- 1 | use std::sync::Arc; 2 | 3 | use chrono::{DateTime, Local}; 4 | use handlebars::{handlebars_helper, Handlebars}; 5 | use matrix_sdk::Client; 6 | use teloxide::{types::ChatId, Bot}; 7 | use warp::Filter; 8 | 9 | use crate::{ 10 | duration::format_duration, 11 | receivers::{matrix::send_message_matrix, telegram::send_message_tg}, 12 | webhook::WebHook, 13 | }; 14 | 15 | pub fn create_hb( 16 | tg_template_path: String, 17 | matrix_template_path: String, 18 | ) -> Result>, anyhow::Error> { 19 | let mut hb = Handlebars::new(); 20 | hb.register_template_file("default_tg", tg_template_path)?; 21 | hb.register_template_file("default_matrix", matrix_template_path)?; 22 | handlebars_helper!(eq: |x: str, { compare: str = "firing" }| x == compare); 23 | handlebars_helper!(since: |x: str| { 24 | let time = DateTime::parse_from_rfc3339(x).unwrap(); 25 | let now = Local::now(); 26 | format_duration(now.signed_duration_since(time)) 27 | }); 28 | handlebars_helper!(duration: |x: str, {y: str = ""}| { 29 | let from = DateTime::parse_from_rfc3339(x).unwrap(); 30 | let to = DateTime::parse_from_rfc3339(y).unwrap(); 31 | format_duration(to.signed_duration_since(from)) 32 | }); 33 | hb.register_helper("eq", Box::new(eq)); 34 | hb.register_helper("since", Box::new(since)); 35 | hb.register_helper("duration", Box::new(duration)); 36 | 37 | Ok(Arc::new(hb)) 38 | } 39 | 40 | pub fn create_filter( 41 | maybe_tg_bot: Option, 42 | maybe_matrix_client: Option, 43 | hb: Arc>, 44 | tg_chat_id: ChatId, 45 | matrix_room_id: String, 46 | ) -> impl Filter + Clone + '_ { 47 | let tg_route = warp::path!("tg") 48 | .and(warp::post()) 49 | .and(json_body()) 50 | .and(warp::any().map(move || maybe_tg_bot.clone())) 51 | .and(with_hb(hb.clone())) 52 | .and(warp::any().map(move || tg_chat_id)) 53 | .and_then(send_message_tg); 54 | 55 | let matrix_route = warp::path!("matrix") 56 | .and(warp::post()) 57 | .and(json_body()) 58 | .and(warp::any().map(move || maybe_matrix_client.clone())) 59 | .and(with_hb(hb)) 60 | .and(warp::any().map(move || matrix_room_id.clone())) 61 | .and_then(send_message_matrix); 62 | 63 | tg_route.or(matrix_route) 64 | } 65 | 66 | fn json_body() -> impl Filter + Clone { 67 | // When accepting a body, we want a JSON body 68 | // (and to reject huge payloads)... 69 | warp::body::content_length_limit(1024 * 16).and(warp::body::json()) 70 | } 71 | 72 | fn with_hb( 73 | hb: Arc, 74 | ) -> impl Filter,), Error = std::convert::Infallible> + Clone { 75 | warp::any().map(move || hb.clone()) 76 | } 77 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "alerter" 3 | version = "0.3.2" 4 | authors = ["ultram4rine "] 5 | edition = "2021" 6 | description = "Telegram and Matrix bot for alerts from Alertmanager" 7 | documentation = "https://github.com/ultram4rine/alerter" 8 | readme = "README.md" 9 | homepage = "https://github.com/ultram4rine/alerter#readme" 10 | repository = "https://github.com/ultram4rine/alerter" 11 | license = "Apache-2.0" 12 | keywords = ["telegram-bot", "matrix-bot", "alertmanager"] 13 | 14 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 15 | 16 | [[bin]] 17 | name = "mangen" 18 | path = "scripts/mangen.rs" 19 | test = false 20 | bench = false 21 | 22 | [dependencies] 23 | anyhow = "1.0" 24 | clap = { version = "3.2", features = ["cargo", "derive", "env"] } 25 | clap_mangen = "0.1" 26 | chrono = "0.4" 27 | dotenv = "0.15" 28 | futures = "0.3" 29 | handlebars = "4.3" 30 | log = "0.4.17" 31 | matrix-sdk = { version = "0.5.0", features = ["markdown"] } 32 | pretty_env_logger = "0.4.0" 33 | serde = { version = "1.0", features = ["derive"] } 34 | serde_json = "1.0" 35 | teloxide = { version = "0.9" } 36 | tokio = { version = "1.19", features = ["rt-multi-thread", "macros"] } 37 | warp = "0.3" 38 | 39 | [package.metadata.deb] 40 | copyright = "Copyright (c) 2022, ultram4rine . All rights reserved." 41 | license-file = ["LICENSE", "0"] 42 | depends = "$auto, libc-bin, passwd" 43 | extended-description-file = "pkg/doc/description.txt" 44 | section = "misc" 45 | assets = [ 46 | [ 47 | "target/release/alerter", 48 | "/usr/bin/alerter", 49 | "755", 50 | ], 51 | [ 52 | "templates/*", 53 | "/etc/alerter/templates/", 54 | "644", 55 | ], 56 | [ 57 | "pkg/doc/alerter.1", 58 | "/usr/share/man/man1/alerter.1", 59 | "644", 60 | ], 61 | [ 62 | "pkg/systemd/alerter.sysconfig", 63 | "/etc/sysconfig/alerter", 64 | "644", 65 | ], 66 | ] 67 | maintainer-scripts = "pkg/scripts" 68 | conf-files = [ 69 | "/etc/alerter/templates/default.tg.hbs", 70 | "/etc/alerter/templates/default.matrix.hbs", 71 | "/etc/sysconfig/alerter", 72 | ] 73 | changelog = "pkg/doc/changelog" 74 | systemd-units = { unit-name = "alerter", unit-scripts = "pkg/systemd", enable = false } 75 | 76 | [package.metadata.generate-rpm] 77 | license = "ASL 2.0" 78 | assets = [ 79 | { source = "target/release/alerter", dest = "/usr/bin/alerter", mode = "755" }, 80 | { source = "templates/*", dest = "/etc/alerter/templates", mode = "644", config = true }, 81 | { source = "pkg/doc/alerter.1.gz", dest = "/usr/share/man/man1/alerter.1.gz", mode = "644", doc = true }, 82 | { source = "pkg/systemd/alerter.service", dest = "/usr/lib/systemd/system/alerter.service", mode = "644" }, 83 | { source = "pkg/systemd/alerter.sysconfig", dest = "/etc/sysconfig/alerter", mode = "644", config = true }, 84 | { source = "pkg/scripts/postinst", dest = "/usr/share/alerter/scripts/postinst", mode = "755" }, 85 | { source = "pkg/scripts/prerm", dest = "/usr/share/alerter/scripts/prerm", mode = "755" }, 86 | ] 87 | release = "1" 88 | post_install_script = "/usr/share/alerter/scripts/postinst" 89 | pre_uninstall_script = "/usr/share/alerter/scripts/prerm" 90 | auto-req = "auto" 91 | 92 | [package.metadata.generate-rpm.requires] 93 | glibc-common = "*" 94 | shadow-utils = "*" 95 | -------------------------------------------------------------------------------- /scripts/mangen.rs: -------------------------------------------------------------------------------- 1 | use clap::{crate_authors, crate_description, crate_version, Arg, ArgGroup}; 2 | 3 | fn main() -> std::io::Result<()> { 4 | let out_dir = std::path::PathBuf::from("pkg/doc"); 5 | 6 | let cmd = clap::Command::new("alerter") 7 | .version(crate_version!()) 8 | .author(crate_authors!()) 9 | .about(crate_description!()) 10 | .group( 11 | ArgGroup::new("req_flags") 12 | .required(true) 13 | .multiple(true) 14 | .args(&["tg", "matrix"]), 15 | ) 16 | .arg( 17 | clap::Arg::new("port") 18 | .short('p') 19 | .long("port") 20 | .env("ALERTER_LISTEN_PORT") 21 | .value_name("PORT") 22 | .default_value("3030") 23 | .help("Port to listen") 24 | .required(false), 25 | ) 26 | .arg( 27 | clap::Arg::new("tg") 28 | .long("tg") 29 | .help("Enable Telegram support") 30 | .required(true) 31 | .requires("tg_token") 32 | .requires("tg_chat_id") 33 | .requires("tg_template_path"), 34 | ) 35 | .arg( 36 | clap::Arg::new("tg_token") 37 | .long("tg-token") 38 | .env("ALERTER_TG_BOT_TOKEN") 39 | .value_name("TG_TOKEN") 40 | .help("Telegram bot token") 41 | .required(false), 42 | ) 43 | .arg( 44 | clap::Arg::new("tg_chat_id") 45 | .long("tg-chat-id") 46 | .env("ALERTER_TG_CHAT_ID") 47 | .value_name("TG_CHAT_ID") 48 | .help("Telegram chat ID") 49 | .required(false), 50 | ) 51 | .arg( 52 | clap::Arg::new("tg_template_path") 53 | .long("tg-template-path") 54 | .env("ALERTER_TG_TMPL_PATH") 55 | .value_name("TG_TEMPLATE_PATH") 56 | .default_value("templates/default.tg.hbs") 57 | .help("Path to handlebars template file for Telegram") 58 | .required(false), 59 | ) 60 | .arg( 61 | Arg::new("matrix") 62 | .long("matrix") 63 | .help("Enable Matrix support") 64 | .required(true) 65 | .requires("matrix_user") 66 | .requires("matrix_pass") 67 | .requires("matrix_room_id") 68 | .requires("matrix_template_path"), 69 | ) 70 | .arg( 71 | Arg::new("matrix_user") 72 | .long("matrix-user") 73 | .env("ALERTER_MATRIX_USERNAME") 74 | .value_name("MATRIX_USER") 75 | .help("Matrix username") 76 | .required(false), 77 | ) 78 | .arg( 79 | Arg::new("matrix_pass") 80 | .long("matrix-pass") 81 | .env("ALERTER_MATRIX_PASSWORD") 82 | .value_name("MATRIX_PASS") 83 | .help("Matrix password") 84 | .required(false), 85 | ) 86 | .arg( 87 | Arg::new("matrix_room_id") 88 | .long("matrix-room-id") 89 | .env("ALERTER_MATRIX_ROOM_ID") 90 | .value_name("MATRIX_ROOM_ID") 91 | .help("Matrix room id") 92 | .required(false), 93 | ) 94 | .arg( 95 | Arg::new("matrix_template_path") 96 | .long("matrix-template-path") 97 | .env("ALERTER_MATRIX_TMPL_PATH") 98 | .value_name("MATRIX_TEMPLATE_PATH") 99 | .default_value("templates/default.matrix.hbs") 100 | .help("Path to handlebars template file for Matrix") 101 | .required(false), 102 | ); 103 | 104 | let man = clap_mangen::Man::new(cmd); 105 | let mut buffer: Vec = Default::default(); 106 | man.render(&mut buffer)?; 107 | 108 | std::fs::write(out_dir.join("alerter.1"), buffer)?; 109 | 110 | Ok(()) 111 | } 112 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Alerter 2 | 3 | [![Crates.io](https://img.shields.io/crates/v/alerter?style=flat-square)](https://crates.io/crates/alerter) [![Docker Image Size (latest by date)](https://img.shields.io/docker/image-size/ultram4rine/alerter?logo=docker&style=flat-square)](https://hub.docker.com/r/ultram4rine/alerter) [![GitHub Workflow Status](https://img.shields.io/github/workflow/status/ultram4rine/alerter/CICD?label=CI%2FCD&logo=github&style=flat-square)](https://github.com/ultram4rine/alerter/actions/workflows/cicd.yml) 4 | 5 | Telegram and Matrix bot for alerts from [Alertmanager](https://github.com/prometheus/alertmanager) 6 | 7 | ## Usage 8 | 9 | ### Telegram preparations 10 | 11 | 1. Create bot with [BotFather](https://t.me/BotFather) and get token. 12 | 13 | 2. Get your, group or channel chat id with [Get My ID](https://t.me/getmyid_bot) bot. 14 | 15 | ### Matrix preparations 16 | 17 | 1. Create user under which `alerter` will work. 18 | 19 | 2. Add this user to room for alerts and get `room_id`. 20 | 21 | After preparations: 22 | 23 | 1. [Configure](#configuration) `alerter`. 24 | 25 | 2. Optionally check that messages are being sent and formatted correctly using this [script](./scripts/test.sh): 26 | 27 | ```sh 28 | ./test.sh tg 29 | ``` 30 | 31 | Or 32 | 33 | ```sh 34 | ./test.sh matrix 35 | ``` 36 | 37 | 3. Add `alerter` to `receivers` in your alertmanager.yml: 38 | 39 | ```yaml 40 | receivers: 41 | - name: alerter_tg 42 | webhook_configs: 43 | - send_resolved: true 44 | url: "http://127.0.0.1:3030/tg" 45 | - name: alerter_matrix 46 | webhook_configs: 47 | - send_resolved: true 48 | url: "http://127.0.0.1:3030/matrix" 49 | ``` 50 | 51 | ### Templating 52 | 53 | You can modify default templates for your needs, they are in [Handlebars](https://handlebarsjs.com/guide/) format. For Telegram `alerter` uses [HTML](https://core.telegram.org/bots/api#html-style) style and for Matrix [Markdown](https://doc.matrix.tu-dresden.de/en/messaging/formatting/) style. 54 | 55 | ## Installation 56 | 57 | ### Prebuilt packages 58 | 59 | You can download prebuilt archive or Deb/RPM package from [releases](https://github.com/ultram4rine/alerter/releases). 60 | 61 | ### Docker 62 | 63 | Pull image from [DockerHub](https://hub.docker.com/r/ultram4rine/alerter): 64 | 65 | ```sh 66 | docker pull ultram4rine/alerter 67 | ``` 68 | 69 | In other cases, you need [Rust](https://www.rust-lang.org/tools/install) installed. 70 | 71 | ### Crates.io 72 | 73 | You can install alerter from [crates.io](https://crates.io/crates/alerter): 74 | 75 | ```sh 76 | cargo install alerter 77 | ``` 78 | 79 | Then download needed [template](./templates) and run. 80 | 81 | ### Build from source 82 | 83 | 1. Clone repository: 84 | 85 | ```sh 86 | git clone https://github.com/ultram4rine/alerter.git 87 | cd alerter 88 | ``` 89 | 90 | 2. Build binary: 91 | 92 | ```sh 93 | cargo build --release 94 | ``` 95 | 96 | 3. Binary should be in `target/release/alerter`. 97 | 98 | ### Build Deb or RPM package 99 | 100 | See [cargo-deb](https://github.com/kornelski/cargo-deb#usage) or [cargo-generate-rpm](https://github.com/cat-in-136/cargo-generate-rpm#usage) instructions respectively. 101 | 102 | ## Configuration 103 | 104 | Use environment variables or command-line flags to configure `alerter`: 105 | 106 | | Environment variable | Command-line flag | Default | Description | 107 | | ------------------------ | ---------------------- | ---------------------------- | ------------------------------------------------------------------------- | 108 | | ALERTER_LISTEN_PORT | --port (-p) | 3030 | Port to listen. | 109 | | | --tg | | Enable Telegram support. | 110 | | ALERTER_TG_BOT_TOKEN | --tg-token | | Telegram bot token. Required for Telegram support. | 111 | | ALERTER_TG_CHAT_ID | --tg-chat-id | | Telegram chat ID. Required for Telegram support. | 112 | | ALERTER_TG_TMPL_PATH | --tg-template-path | templates/default.tg.hbs | Path to handlebars template file. Required for Telegram support. | 113 | | | --matrix | | Enable Matrix support. | 114 | | ALERTER_MATRIX_USERNAME | --matrix-user | | Matrix username. Required for Matrix support. | 115 | | ALERTER_MATRIX_PASSWORD | --matrix-pass | | Matrix password. Required for Matrix support. | 116 | | ALERTER_MATRIX_ROOM_ID | --matrix-room-id | | Matrix room id. Required for Matrix support. | 117 | | ALERTER_MATRIX_TMPL_PATH | --matrix-template-path | templates/default.matrix.hbs | Path to handlebars template file for Matrix. Required for Matrix support. | 118 | -------------------------------------------------------------------------------- /src/duration.rs: -------------------------------------------------------------------------------- 1 | use chrono::Duration; 2 | 3 | /// Converts `chrono::Duration` to human-readable format. 4 | /// 5 | /// # Arguments 6 | /// 7 | /// * `duration` - A `Duration` to format. 8 | /// 9 | /// # Examples 10 | /// 11 | /// ```rust 12 | /// // Format duration of two weeks: 13 | /// let time1 = DateTime::parse_from_rfc3339("1990-12-15T22:00:00Z").unwrap(); 14 | /// let time2 = DateTime::parse_from_rfc3339("1990-12-01T22:00:00Z").unwrap(); 15 | /// assert_eq!( 16 | /// format_duration(time1.signed_duration_since(time2)), 17 | /// "2 weeks" 18 | /// ); 19 | /// ``` 20 | pub fn format_duration(duration: Duration) -> String { 21 | let weeks = duration.num_weeks(); 22 | let days = duration.num_days() - weeks * 7; 23 | let hours = duration.num_hours() - (weeks * 7 + days) * 24; 24 | let minutes = duration.num_minutes() - (((weeks * 7 + days) * 24) + hours) * 60; 25 | let seconds = 26 | duration.num_seconds() - (((((weeks * 7 + days) * 24) + hours) * 60) + minutes) * 60; 27 | let milliseconds = duration.num_milliseconds() 28 | - ((((((weeks * 7 + days) * 24) + hours) * 60) + minutes) * 60 + seconds) * 1000; 29 | 30 | let f_weeks = format_unit("week".to_owned(), "weeks".to_owned(), weeks); 31 | let f_days = format_unit("day".to_owned(), "days".to_owned(), days); 32 | let f_hours = format_unit("hour".to_owned(), "hours".to_owned(), hours); 33 | let f_minutes = format_unit("minute".to_owned(), "minutes".to_owned(), minutes); 34 | let f_seconds = format_unit("second".to_owned(), "seconds".to_owned(), seconds); 35 | let f_milliseconds = if seconds == 0 { 36 | format_unit( 37 | "millisecond".to_owned(), 38 | "milliseconds".to_owned(), 39 | milliseconds, 40 | ) 41 | } else { 42 | "".to_owned() 43 | }; 44 | 45 | format!( 46 | "{} {} {} {} {} {}", 47 | f_weeks, f_days, f_hours, f_minutes, f_seconds, f_milliseconds 48 | ) 49 | .trim() 50 | .to_owned() 51 | } 52 | 53 | /// Formats unit. 54 | /// 55 | /// # Arguments 56 | /// 57 | /// * `unit` - A singular pronunciation of unit. 58 | /// * `units` - A plural pronunciation of unit. 59 | /// * `count` - A count of units. 60 | fn format_unit(unit: String, units: String, count: i64) -> String { 61 | match count { 62 | 0 => "".to_owned(), 63 | 1 => format!("1 {}", unit), 64 | _ => format!("{} {}", count, units), 65 | } 66 | } 67 | 68 | #[cfg(test)] 69 | mod tests { 70 | use chrono::DateTime; 71 | 72 | use crate::duration::format_duration; 73 | 74 | #[test] 75 | fn test_format_duration_weeks() { 76 | let time1 = DateTime::parse_from_rfc3339("1990-12-15T22:00:00Z").unwrap(); 77 | let time2 = DateTime::parse_from_rfc3339("1990-12-01T22:00:00Z").unwrap(); 78 | assert_eq!( 79 | format_duration(time1.signed_duration_since(time2)), 80 | "2 weeks" 81 | ); 82 | } 83 | 84 | #[test] 85 | fn test_format_duration_days() { 86 | let time1 = DateTime::parse_from_rfc3339("1990-12-03T22:00:00Z").unwrap(); 87 | let time2 = DateTime::parse_from_rfc3339("1990-12-01T22:00:00Z").unwrap(); 88 | assert_eq!( 89 | format_duration(time1.signed_duration_since(time2)), 90 | "2 days" 91 | ); 92 | } 93 | 94 | #[test] 95 | fn test_format_duration_hour() { 96 | let time1 = DateTime::parse_from_rfc3339("1990-12-01T23:00:00Z").unwrap(); 97 | let time2 = DateTime::parse_from_rfc3339("1990-12-01T22:00:00Z").unwrap(); 98 | assert_eq!( 99 | format_duration(time1.signed_duration_since(time2)), 100 | "1 hour" 101 | ); 102 | } 103 | 104 | #[test] 105 | fn test_format_duration_minutes() { 106 | let time1 = DateTime::parse_from_rfc3339("1990-12-01T22:30:00Z").unwrap(); 107 | let time2 = DateTime::parse_from_rfc3339("1990-12-01T22:00:00Z").unwrap(); 108 | assert_eq!( 109 | format_duration(time1.signed_duration_since(time2)), 110 | "30 minutes" 111 | ); 112 | } 113 | 114 | #[test] 115 | fn test_format_duration_seconds() { 116 | let time1 = DateTime::parse_from_rfc3339("1990-12-01T22:00:15Z").unwrap(); 117 | let time2 = DateTime::parse_from_rfc3339("1990-12-01T22:00:00Z").unwrap(); 118 | assert_eq!( 119 | format_duration(time1.signed_duration_since(time2)), 120 | "15 seconds" 121 | ); 122 | } 123 | 124 | #[test] 125 | fn test_format_duration_milliseconds() { 126 | let time1 = DateTime::parse_from_rfc3339("1990-12-01T22:00:00.500Z").unwrap(); 127 | let time2 = DateTime::parse_from_rfc3339("1990-12-01T22:00:00.000Z").unwrap(); 128 | assert_eq!( 129 | format_duration(time1.signed_duration_since(time2)), 130 | "500 milliseconds" 131 | ); 132 | } 133 | 134 | #[test] 135 | fn test_format_duration_full() { 136 | // Milliseconds ignored if seconds not 0. 137 | let time1 = DateTime::parse_from_rfc3339("1990-12-17T23:30:15.500Z").unwrap(); 138 | let time2 = DateTime::parse_from_rfc3339("1990-12-01T22:00:00.000Z").unwrap(); 139 | assert_eq!( 140 | format_duration(time1.signed_duration_since(time2)), 141 | "2 weeks 2 days 1 hour 30 minutes 15 seconds" 142 | ); 143 | } 144 | } 145 | -------------------------------------------------------------------------------- /.github/workflows/cicd.yml: -------------------------------------------------------------------------------- 1 | name: CI/CD 2 | 3 | on: 4 | push: 5 | paths-ignore: 6 | - ".devcontainer" 7 | - ".github/workflows/pkg.yml" 8 | - ".github/workflows/update-packagers.yml" 9 | - ".github/dependabot.yml" 10 | - "templates" 11 | - "LICENSE" 12 | - "*.md" 13 | - "test.sh" 14 | pull_request: 15 | paths-ignore: 16 | - ".devcontainer" 17 | - ".github/workflows/pkg.yml" 18 | - ".github/workflows/update-packagers.yml" 19 | - ".github/dependabot.yml" 20 | - "templates" 21 | - "LICENSE" 22 | - "*.md" 23 | - "test.sh" 24 | 25 | jobs: 26 | test-n-build: 27 | name: Test and build 28 | runs-on: ubuntu-20.04 29 | steps: 30 | - name: Setup Rust 31 | uses: actions-rs/toolchain@v1 32 | with: 33 | profile: minimal 34 | toolchain: stable 35 | override: true 36 | 37 | - name: Checkout 38 | uses: actions/checkout@v3 39 | 40 | - name: Restore cache 41 | uses: Swatinem/rust-cache@v1 42 | 43 | - name: Test 44 | uses: actions-rs/cargo@v1 45 | with: 46 | command: test 47 | 48 | - name: Build 49 | uses: actions-rs/cargo@v1 50 | with: 51 | command: build 52 | args: --release 53 | 54 | - name: Archive 55 | run: | 56 | mv target/release/alerter . 57 | tar -czvf alerter-$(cargo read-manifest | jq -r .version).tar.gz alerter templates 58 | 59 | - name: Upload artifact 60 | uses: actions/upload-artifact@v3 61 | with: 62 | name: alerter-archive 63 | path: alerter-*.tar.gz 64 | 65 | package: 66 | name: Package 67 | needs: test-n-build 68 | uses: ./.github/workflows/pkg.yml 69 | 70 | docker: 71 | name: Docker image 72 | needs: test-n-build 73 | runs-on: ubuntu-20.04 74 | steps: 75 | - name: Checkout 76 | uses: actions/checkout@v3 77 | 78 | - name: Set up QEMU 79 | uses: docker/setup-qemu-action@v2 80 | 81 | - name: Set up Docker Buildx 82 | uses: docker/setup-buildx-action@v2 83 | 84 | - name: Set docker image tag 85 | if: startsWith(github.ref, 'refs/tags/') 86 | run: echo "DOCKER_TAG=:$(cargo read-manifest | jq -r .version)" >> $GITHUB_ENV 87 | 88 | - name: Login to DockerHub 89 | uses: docker/login-action@v2 90 | if: startsWith(github.ref, 'refs/tags/') 91 | with: 92 | username: ${{ secrets.DOCKERHUB_USERNAME }} 93 | password: ${{ secrets.DOCKERHUB_TOKEN }} 94 | 95 | - name: Login to GHCR 96 | uses: docker/login-action@v2 97 | if: startsWith(github.ref, 'refs/tags/') 98 | with: 99 | registry: ghcr.io 100 | username: ${{ github.repository_owner }} 101 | password: ${{ secrets.GITHUB_TOKEN }} 102 | 103 | - name: Build and push 104 | uses: docker/build-push-action@v3 105 | with: 106 | platforms: linux/amd64,linux/arm64,linux/arm/v7 107 | push: ${{ startsWith(github.ref, 'refs/tags/') }} 108 | cache-from: type=gha 109 | cache-to: type=gha,mode=max 110 | tags: | 111 | ultram4rine/alerter:latest 112 | ghcr.io/ultram4rine/alerter:latest 113 | ultram4rine/alerter${{ env.DOCKER_TAG }} 114 | ghcr.io/ultram4rine/alerter${{ env.DOCKER_TAG }} 115 | 116 | release: 117 | name: Release 118 | runs-on: ubuntu-20.04 119 | if: startsWith(github.ref, 'refs/tags/') 120 | needs: 121 | - test-n-build 122 | - package 123 | - docker 124 | steps: 125 | - name: Checkout 126 | uses: actions/checkout@v3 127 | 128 | - name: Download archive 129 | uses: actions/download-artifact@v3 130 | with: 131 | name: alerter-archive 132 | path: archive 133 | 134 | - name: Download Deb package 135 | uses: actions/download-artifact@v3 136 | with: 137 | name: alerter-deb 138 | path: packages 139 | 140 | - name: Download RPM package 141 | uses: actions/download-artifact@v3 142 | with: 143 | name: alerter-rpm 144 | path: packages 145 | 146 | - name: Get the version 147 | id: get_version 148 | run: echo ::set-output name=VERSION::$(cargo read-manifest | jq -r .version) 149 | 150 | - name: Create release body 151 | id: extract_changes 152 | uses: ultram4rine/extract-changes-action@v1 153 | with: 154 | changelog: CHANGELOG.md 155 | version: ${{ steps.get_version.outputs.VERSION }} 156 | 157 | - name: Release 158 | uses: softprops/action-gh-release@v1 159 | with: 160 | body: ${{ steps.extract_changes.outputs.changes }} 161 | files: | 162 | archive/alerter-*.tar.gz 163 | packages/**/* 164 | 165 | publish_crate: 166 | name: Publish crate 167 | runs-on: ubuntu-20.04 168 | if: startsWith(github.ref, 'refs/tags/') 169 | needs: 170 | - test-n-build 171 | - package 172 | - docker 173 | steps: 174 | - name: Setup Rust 175 | uses: actions-rs/toolchain@v1 176 | with: 177 | profile: minimal 178 | toolchain: stable 179 | override: true 180 | 181 | - name: Checkout 182 | uses: actions/checkout@v3 183 | 184 | - name: Restore cache 185 | uses: Swatinem/rust-cache@v1 186 | 187 | - name: Login to crates.io 188 | uses: actions-rs/cargo@v1 189 | with: 190 | command: login 191 | args: ${{ secrets.CARGO_REGISTRY_TOKEN }} 192 | 193 | - name: Publish to crates.io 194 | uses: actions-rs/cargo@v1 195 | with: 196 | command: publish 197 | -------------------------------------------------------------------------------- /.github/workflows/pkg.yml: -------------------------------------------------------------------------------- 1 | name: Packaging 2 | 3 | on: 4 | workflow_dispatch: 5 | workflow_call: 6 | push: 7 | paths: 8 | - ".github/workflows/pkg.yml" 9 | branches: 10 | - master 11 | pull_request: 12 | paths: 13 | - ".github/workflows/pkg.yml" 14 | 15 | jobs: 16 | deb: 17 | name: Deb package 18 | env: 19 | CARGO_DEB_VER: 1.38.2 20 | DEBIAN_FRONTEND: noninteractive 21 | PKG_CONFIG_ALLOW_CROSS: 1 22 | strategy: 23 | matrix: 24 | target: 25 | - "x86_64-unknown-linux-gnu" 26 | - "armv7-unknown-linux-gnueabihf" 27 | runs-on: ubuntu-20.04 28 | steps: 29 | - name: Install common libs 30 | run: | 31 | sudo apt-get update 32 | sudo apt-get install pkg-config libssl-dev lintian 33 | 34 | - name: Install libs for ARMv7 35 | if: matrix.target == 'armv7-unknown-linux-gnueabihf' 36 | run: | 37 | sudo dpkg --add-architecture armhf 38 | sudo sed 's/deb http/deb \[arch=amd64,i386\] http/' -i /etc/apt/sources.list 39 | sudo tee -a /etc/apt/sources.list > /dev/null < pkg/doc/alerter.1.gz 154 | 155 | - name: Build binary 156 | uses: actions-rs/cargo@v1 157 | with: 158 | command: build 159 | args: --release 160 | 161 | - name: Remove all symbol and relocation information 162 | run: strip -s target/release/alerter 163 | 164 | - name: Set compress type for CentOS 7 165 | if: matrix.image == 'centos:7' 166 | run: echo "CENTOS_BUILD_FLAGS=--payload-compress=gzip" >> $GITHUB_ENV 167 | 168 | - name: Add dist to release 169 | run: dist=$(rpm --eval %{?dist}); sed -i -e 's/release = "\(.*\)"/release = "\1'$dist'"/g' Cargo.toml 170 | 171 | - name: Create package 172 | uses: actions-rs/cargo@v1 173 | with: 174 | command: generate-rpm 175 | args: ${{ env.CENTOS_BUILD_FLAGS }} 176 | 177 | - name: Verify package 178 | run: | 179 | # do not use exit codes while errors occured 180 | rpmlint target/generate-rpm/alerter-*.rpm || true 181 | 182 | - name: Upload package 183 | uses: actions/upload-artifact@v3 184 | with: 185 | name: alerter-rpm 186 | path: | 187 | target/generate-rpm/alerter-*.rpm 188 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright 2021 ultram4rine 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "aead" 7 | version = "0.4.3" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "0b613b8e1e3cf911a086f53f03bf286f52fd7a7258e4fa606f0ef220d39d8877" 10 | dependencies = [ 11 | "generic-array 0.14.5", 12 | "rand_core 0.6.3", 13 | ] 14 | 15 | [[package]] 16 | name = "aes" 17 | version = "0.8.1" 18 | source = "registry+https://github.com/rust-lang/crates.io-index" 19 | checksum = "bfe0133578c0986e1fe3dfcd4af1cc5b2dd6c3dbf534d69916ce16a2701d40ba" 20 | dependencies = [ 21 | "cfg-if", 22 | "cipher 0.4.3", 23 | "cpufeatures", 24 | ] 25 | 26 | [[package]] 27 | name = "ahash" 28 | version = "0.7.6" 29 | source = "registry+https://github.com/rust-lang/crates.io-index" 30 | checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" 31 | dependencies = [ 32 | "getrandom 0.2.7", 33 | "once_cell", 34 | "version_check", 35 | ] 36 | 37 | [[package]] 38 | name = "aho-corasick" 39 | version = "0.7.18" 40 | source = "registry+https://github.com/rust-lang/crates.io-index" 41 | checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f" 42 | dependencies = [ 43 | "memchr", 44 | ] 45 | 46 | [[package]] 47 | name = "alerter" 48 | version = "0.3.2" 49 | dependencies = [ 50 | "anyhow", 51 | "chrono", 52 | "clap", 53 | "clap_mangen", 54 | "dotenv", 55 | "futures", 56 | "handlebars", 57 | "log", 58 | "matrix-sdk", 59 | "pretty_env_logger", 60 | "serde", 61 | "serde_json", 62 | "teloxide", 63 | "tokio", 64 | "warp", 65 | ] 66 | 67 | [[package]] 68 | name = "anyhow" 69 | version = "1.0.58" 70 | source = "registry+https://github.com/rust-lang/crates.io-index" 71 | checksum = "bb07d2053ccdbe10e2af2995a2f116c1330396493dc1269f6a91d0ae82e19704" 72 | 73 | [[package]] 74 | name = "anymap2" 75 | version = "0.13.0" 76 | source = "registry+https://github.com/rust-lang/crates.io-index" 77 | checksum = "d301b3b94cb4b2f23d7917810addbbaff90738e0ca2be692bd027e70d7e0330c" 78 | 79 | [[package]] 80 | name = "aquamarine" 81 | version = "0.1.11" 82 | source = "registry+https://github.com/rust-lang/crates.io-index" 83 | checksum = "96e14cb2a51c8b45d26a4219981985c7350fc05eacb7b5b2939bceb2ffefdf3e" 84 | dependencies = [ 85 | "itertools 0.9.0", 86 | "proc-macro-error", 87 | "proc-macro2", 88 | "quote", 89 | "syn", 90 | ] 91 | 92 | [[package]] 93 | name = "arrayref" 94 | version = "0.3.6" 95 | source = "registry+https://github.com/rust-lang/crates.io-index" 96 | checksum = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544" 97 | 98 | [[package]] 99 | name = "arrayvec" 100 | version = "0.7.2" 101 | source = "registry+https://github.com/rust-lang/crates.io-index" 102 | checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6" 103 | dependencies = [ 104 | "serde", 105 | ] 106 | 107 | [[package]] 108 | name = "assign" 109 | version = "1.1.1" 110 | source = "registry+https://github.com/rust-lang/crates.io-index" 111 | checksum = "5f093eed78becd229346bf859eec0aa4dd7ddde0757287b2b4107a1f09c80002" 112 | 113 | [[package]] 114 | name = "async-lock" 115 | version = "2.5.0" 116 | source = "registry+https://github.com/rust-lang/crates.io-index" 117 | checksum = "e97a171d191782fba31bb902b14ad94e24a68145032b7eedf871ab0bc0d077b6" 118 | dependencies = [ 119 | "event-listener", 120 | ] 121 | 122 | [[package]] 123 | name = "async-once-cell" 124 | version = "0.3.1" 125 | source = "registry+https://github.com/rust-lang/crates.io-index" 126 | checksum = "72faff1fdc615a0199d7bf71e6f389af54d46a66e9beb5d76c39e48eda93ecce" 127 | 128 | [[package]] 129 | name = "async-stream" 130 | version = "0.3.3" 131 | source = "registry+https://github.com/rust-lang/crates.io-index" 132 | checksum = "dad5c83079eae9969be7fadefe640a1c566901f05ff91ab221de4b6f68d9507e" 133 | dependencies = [ 134 | "async-stream-impl", 135 | "futures-core", 136 | ] 137 | 138 | [[package]] 139 | name = "async-stream-impl" 140 | version = "0.3.3" 141 | source = "registry+https://github.com/rust-lang/crates.io-index" 142 | checksum = "10f203db73a71dfa2fb6dd22763990fa26f3d2625a6da2da900d23b87d26be27" 143 | dependencies = [ 144 | "proc-macro2", 145 | "quote", 146 | "syn", 147 | ] 148 | 149 | [[package]] 150 | name = "async-trait" 151 | version = "0.1.56" 152 | source = "registry+https://github.com/rust-lang/crates.io-index" 153 | checksum = "96cf8829f67d2eab0b2dfa42c5d0ef737e0724e4a82b01b3e292456202b19716" 154 | dependencies = [ 155 | "proc-macro2", 156 | "quote", 157 | "syn", 158 | ] 159 | 160 | [[package]] 161 | name = "atomic" 162 | version = "0.5.1" 163 | source = "registry+https://github.com/rust-lang/crates.io-index" 164 | checksum = "b88d82667eca772c4aa12f0f1348b3ae643424c8876448f3f7bd5787032e234c" 165 | dependencies = [ 166 | "autocfg", 167 | ] 168 | 169 | [[package]] 170 | name = "atty" 171 | version = "0.2.14" 172 | source = "registry+https://github.com/rust-lang/crates.io-index" 173 | checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" 174 | dependencies = [ 175 | "hermit-abi", 176 | "libc", 177 | "winapi", 178 | ] 179 | 180 | [[package]] 181 | name = "autocfg" 182 | version = "1.1.0" 183 | source = "registry+https://github.com/rust-lang/crates.io-index" 184 | checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" 185 | 186 | [[package]] 187 | name = "backoff" 188 | version = "0.4.0" 189 | source = "registry+https://github.com/rust-lang/crates.io-index" 190 | checksum = "b62ddb9cb1ec0a098ad4bbf9344d0713fa193ae1a80af55febcff2627b6a00c1" 191 | dependencies = [ 192 | "futures-core", 193 | "getrandom 0.2.7", 194 | "instant", 195 | "pin-project-lite", 196 | "rand 0.8.5", 197 | "tokio", 198 | ] 199 | 200 | [[package]] 201 | name = "base64" 202 | version = "0.13.0" 203 | source = "registry+https://github.com/rust-lang/crates.io-index" 204 | checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" 205 | 206 | [[package]] 207 | name = "base64ct" 208 | version = "1.5.1" 209 | source = "registry+https://github.com/rust-lang/crates.io-index" 210 | checksum = "3bdca834647821e0b13d9539a8634eb62d3501b6b6c2cec1722786ee6671b851" 211 | 212 | [[package]] 213 | name = "bitflags" 214 | version = "1.3.2" 215 | source = "registry+https://github.com/rust-lang/crates.io-index" 216 | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 217 | 218 | [[package]] 219 | name = "blake3" 220 | version = "1.3.1" 221 | source = "registry+https://github.com/rust-lang/crates.io-index" 222 | checksum = "a08e53fc5a564bb15bfe6fae56bd71522205f1f91893f9c0116edad6496c183f" 223 | dependencies = [ 224 | "arrayref", 225 | "arrayvec", 226 | "cc", 227 | "cfg-if", 228 | "constant_time_eq", 229 | "digest 0.10.3", 230 | ] 231 | 232 | [[package]] 233 | name = "block-buffer" 234 | version = "0.7.3" 235 | source = "registry+https://github.com/rust-lang/crates.io-index" 236 | checksum = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b" 237 | dependencies = [ 238 | "block-padding 0.1.5", 239 | "byte-tools", 240 | "byteorder", 241 | "generic-array 0.12.4", 242 | ] 243 | 244 | [[package]] 245 | name = "block-buffer" 246 | version = "0.9.0" 247 | source = "registry+https://github.com/rust-lang/crates.io-index" 248 | checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" 249 | dependencies = [ 250 | "generic-array 0.14.5", 251 | ] 252 | 253 | [[package]] 254 | name = "block-buffer" 255 | version = "0.10.2" 256 | source = "registry+https://github.com/rust-lang/crates.io-index" 257 | checksum = "0bf7fe51849ea569fd452f37822f606a5cabb684dc918707a0193fd4664ff324" 258 | dependencies = [ 259 | "generic-array 0.14.5", 260 | ] 261 | 262 | [[package]] 263 | name = "block-padding" 264 | version = "0.1.5" 265 | source = "registry+https://github.com/rust-lang/crates.io-index" 266 | checksum = "fa79dedbb091f449f1f39e53edf88d5dbe95f895dae6135a8d7b881fb5af73f5" 267 | dependencies = [ 268 | "byte-tools", 269 | ] 270 | 271 | [[package]] 272 | name = "block-padding" 273 | version = "0.3.2" 274 | source = "registry+https://github.com/rust-lang/crates.io-index" 275 | checksum = "0a90ec2df9600c28a01c56c4784c9207a96d2451833aeceb8cc97e4c9548bb78" 276 | dependencies = [ 277 | "generic-array 0.14.5", 278 | ] 279 | 280 | [[package]] 281 | name = "buf_redux" 282 | version = "0.8.4" 283 | source = "registry+https://github.com/rust-lang/crates.io-index" 284 | checksum = "b953a6887648bb07a535631f2bc00fbdb2a2216f135552cb3f534ed136b9c07f" 285 | dependencies = [ 286 | "memchr", 287 | "safemem", 288 | ] 289 | 290 | [[package]] 291 | name = "bumpalo" 292 | version = "3.10.0" 293 | source = "registry+https://github.com/rust-lang/crates.io-index" 294 | checksum = "37ccbd214614c6783386c1af30caf03192f17891059cecc394b4fb119e363de3" 295 | 296 | [[package]] 297 | name = "byte-tools" 298 | version = "0.3.1" 299 | source = "registry+https://github.com/rust-lang/crates.io-index" 300 | checksum = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" 301 | 302 | [[package]] 303 | name = "byteorder" 304 | version = "1.4.3" 305 | source = "registry+https://github.com/rust-lang/crates.io-index" 306 | checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" 307 | 308 | [[package]] 309 | name = "bytes" 310 | version = "1.1.0" 311 | source = "registry+https://github.com/rust-lang/crates.io-index" 312 | checksum = "c4872d67bab6358e59559027aa3b9157c53d9358c51423c17554809a8858e0f8" 313 | 314 | [[package]] 315 | name = "cbc" 316 | version = "0.1.2" 317 | source = "registry+https://github.com/rust-lang/crates.io-index" 318 | checksum = "26b52a9543ae338f279b96b0b9fed9c8093744685043739079ce85cd58f289a6" 319 | dependencies = [ 320 | "cipher 0.4.3", 321 | ] 322 | 323 | [[package]] 324 | name = "cc" 325 | version = "1.0.73" 326 | source = "registry+https://github.com/rust-lang/crates.io-index" 327 | checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11" 328 | 329 | [[package]] 330 | name = "cfg-if" 331 | version = "1.0.0" 332 | source = "registry+https://github.com/rust-lang/crates.io-index" 333 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 334 | 335 | [[package]] 336 | name = "chacha20" 337 | version = "0.8.1" 338 | source = "registry+https://github.com/rust-lang/crates.io-index" 339 | checksum = "01b72a433d0cf2aef113ba70f62634c56fddb0f244e6377185c56a7cadbd8f91" 340 | dependencies = [ 341 | "cfg-if", 342 | "cipher 0.3.0", 343 | "cpufeatures", 344 | "zeroize", 345 | ] 346 | 347 | [[package]] 348 | name = "chacha20poly1305" 349 | version = "0.9.0" 350 | source = "registry+https://github.com/rust-lang/crates.io-index" 351 | checksum = "3b84ed6d1d5f7aa9bdde921a5090e0ca4d934d250ea3b402a5fab3a994e28a2a" 352 | dependencies = [ 353 | "aead", 354 | "chacha20", 355 | "cipher 0.3.0", 356 | "poly1305", 357 | "zeroize", 358 | ] 359 | 360 | [[package]] 361 | name = "chrono" 362 | version = "0.4.19" 363 | source = "registry+https://github.com/rust-lang/crates.io-index" 364 | checksum = "670ad68c9088c2a963aaa298cb369688cf3f9465ce5e2d4ca10e6e0098a1ce73" 365 | dependencies = [ 366 | "libc", 367 | "num-integer", 368 | "num-traits", 369 | "time", 370 | "winapi", 371 | ] 372 | 373 | [[package]] 374 | name = "cipher" 375 | version = "0.3.0" 376 | source = "registry+https://github.com/rust-lang/crates.io-index" 377 | checksum = "7ee52072ec15386f770805afd189a01c8841be8696bed250fa2f13c4c0d6dfb7" 378 | dependencies = [ 379 | "generic-array 0.14.5", 380 | ] 381 | 382 | [[package]] 383 | name = "cipher" 384 | version = "0.4.3" 385 | source = "registry+https://github.com/rust-lang/crates.io-index" 386 | checksum = "d1873270f8f7942c191139cb8a40fd228da6c3fd2fc376d7e92d47aa14aeb59e" 387 | dependencies = [ 388 | "crypto-common", 389 | "inout", 390 | ] 391 | 392 | [[package]] 393 | name = "clap" 394 | version = "3.2.6" 395 | source = "registry+https://github.com/rust-lang/crates.io-index" 396 | checksum = "9f1fe12880bae935d142c8702d500c63a4e8634b6c3c57ad72bf978fc7b6249a" 397 | dependencies = [ 398 | "atty", 399 | "bitflags", 400 | "clap_derive", 401 | "clap_lex", 402 | "indexmap", 403 | "once_cell", 404 | "strsim", 405 | "termcolor", 406 | "textwrap", 407 | ] 408 | 409 | [[package]] 410 | name = "clap_derive" 411 | version = "3.2.6" 412 | source = "registry+https://github.com/rust-lang/crates.io-index" 413 | checksum = "ed6db9e867166a43a53f7199b5e4d1f522a1e5bd626654be263c999ce59df39a" 414 | dependencies = [ 415 | "heck", 416 | "proc-macro-error", 417 | "proc-macro2", 418 | "quote", 419 | "syn", 420 | ] 421 | 422 | [[package]] 423 | name = "clap_lex" 424 | version = "0.2.3" 425 | source = "registry+https://github.com/rust-lang/crates.io-index" 426 | checksum = "87eba3c8c7f42ef17f6c659fc7416d0f4758cd3e58861ee63c5fa4a4dde649e4" 427 | dependencies = [ 428 | "os_str_bytes", 429 | ] 430 | 431 | [[package]] 432 | name = "clap_mangen" 433 | version = "0.1.9" 434 | source = "registry+https://github.com/rust-lang/crates.io-index" 435 | checksum = "e16658e2f46d5269f95e4ec0f16594524cfc1e51637af40b2e5118c7c71a9fe1" 436 | dependencies = [ 437 | "clap", 438 | "roff", 439 | ] 440 | 441 | [[package]] 442 | name = "const-oid" 443 | version = "0.6.2" 444 | source = "registry+https://github.com/rust-lang/crates.io-index" 445 | checksum = "9d6f2aa4d0537bcc1c74df8755072bd31c1ef1a3a1b85a68e8404a8c353b7b8b" 446 | 447 | [[package]] 448 | name = "const-oid" 449 | version = "0.7.1" 450 | source = "registry+https://github.com/rust-lang/crates.io-index" 451 | checksum = "e4c78c047431fee22c1a7bb92e00ad095a02a983affe4d8a72e2a2c62c1b94f3" 452 | 453 | [[package]] 454 | name = "constant_time_eq" 455 | version = "0.1.5" 456 | source = "registry+https://github.com/rust-lang/crates.io-index" 457 | checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" 458 | 459 | [[package]] 460 | name = "convert_case" 461 | version = "0.4.0" 462 | source = "registry+https://github.com/rust-lang/crates.io-index" 463 | checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" 464 | 465 | [[package]] 466 | name = "core-foundation" 467 | version = "0.9.3" 468 | source = "registry+https://github.com/rust-lang/crates.io-index" 469 | checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" 470 | dependencies = [ 471 | "core-foundation-sys", 472 | "libc", 473 | ] 474 | 475 | [[package]] 476 | name = "core-foundation-sys" 477 | version = "0.8.3" 478 | source = "registry+https://github.com/rust-lang/crates.io-index" 479 | checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" 480 | 481 | [[package]] 482 | name = "cpufeatures" 483 | version = "0.2.2" 484 | source = "registry+https://github.com/rust-lang/crates.io-index" 485 | checksum = "59a6001667ab124aebae2a495118e11d30984c3a653e99d86d58971708cf5e4b" 486 | dependencies = [ 487 | "libc", 488 | ] 489 | 490 | [[package]] 491 | name = "crc32fast" 492 | version = "1.3.2" 493 | source = "registry+https://github.com/rust-lang/crates.io-index" 494 | checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" 495 | dependencies = [ 496 | "cfg-if", 497 | ] 498 | 499 | [[package]] 500 | name = "crossbeam-epoch" 501 | version = "0.9.9" 502 | source = "registry+https://github.com/rust-lang/crates.io-index" 503 | checksum = "07db9d94cbd326813772c968ccd25999e5f8ae22f4f8d1b11effa37ef6ce281d" 504 | dependencies = [ 505 | "autocfg", 506 | "cfg-if", 507 | "crossbeam-utils", 508 | "memoffset", 509 | "once_cell", 510 | "scopeguard", 511 | ] 512 | 513 | [[package]] 514 | name = "crossbeam-utils" 515 | version = "0.8.10" 516 | source = "registry+https://github.com/rust-lang/crates.io-index" 517 | checksum = "7d82ee10ce34d7bc12c2122495e7593a9c41347ecdd64185af4ecf72cb1a7f83" 518 | dependencies = [ 519 | "cfg-if", 520 | "once_cell", 521 | ] 522 | 523 | [[package]] 524 | name = "crypto-common" 525 | version = "0.1.3" 526 | source = "registry+https://github.com/rust-lang/crates.io-index" 527 | checksum = "57952ca27b5e3606ff4dd79b0020231aaf9d6aa76dc05fd30137538c50bd3ce8" 528 | dependencies = [ 529 | "generic-array 0.14.5", 530 | "typenum", 531 | ] 532 | 533 | [[package]] 534 | name = "ctr" 535 | version = "0.9.1" 536 | source = "registry+https://github.com/rust-lang/crates.io-index" 537 | checksum = "0d14f329cfbaf5d0e06b5e87fff7e265d2673c5ea7d2c27691a2c107db1442a0" 538 | dependencies = [ 539 | "cipher 0.4.3", 540 | ] 541 | 542 | [[package]] 543 | name = "curve25519-dalek" 544 | version = "3.2.1" 545 | source = "registry+https://github.com/rust-lang/crates.io-index" 546 | checksum = "90f9d052967f590a76e62eb387bd0bbb1b000182c3cefe5364db6b7211651bc0" 547 | dependencies = [ 548 | "byteorder", 549 | "digest 0.9.0", 550 | "rand_core 0.5.1", 551 | "serde", 552 | "subtle", 553 | "zeroize", 554 | ] 555 | 556 | [[package]] 557 | name = "darling" 558 | version = "0.13.4" 559 | source = "registry+https://github.com/rust-lang/crates.io-index" 560 | checksum = "a01d95850c592940db9b8194bc39f4bc0e89dee5c4265e4b1807c34a9aba453c" 561 | dependencies = [ 562 | "darling_core", 563 | "darling_macro", 564 | ] 565 | 566 | [[package]] 567 | name = "darling_core" 568 | version = "0.13.4" 569 | source = "registry+https://github.com/rust-lang/crates.io-index" 570 | checksum = "859d65a907b6852c9361e3185c862aae7fafd2887876799fa55f5f99dc40d610" 571 | dependencies = [ 572 | "fnv", 573 | "ident_case", 574 | "proc-macro2", 575 | "quote", 576 | "strsim", 577 | "syn", 578 | ] 579 | 580 | [[package]] 581 | name = "darling_macro" 582 | version = "0.13.4" 583 | source = "registry+https://github.com/rust-lang/crates.io-index" 584 | checksum = "9c972679f83bdf9c42bd905396b6c3588a843a17f0f16dfcfa3e2c5d57441835" 585 | dependencies = [ 586 | "darling_core", 587 | "quote", 588 | "syn", 589 | ] 590 | 591 | [[package]] 592 | name = "dashmap" 593 | version = "5.3.4" 594 | source = "registry+https://github.com/rust-lang/crates.io-index" 595 | checksum = "3495912c9c1ccf2e18976439f4443f3fee0fd61f424ff99fde6a66b15ecb448f" 596 | dependencies = [ 597 | "cfg-if", 598 | "hashbrown 0.12.1", 599 | "lock_api", 600 | "parking_lot_core 0.9.3", 601 | ] 602 | 603 | [[package]] 604 | name = "der" 605 | version = "0.4.5" 606 | source = "registry+https://github.com/rust-lang/crates.io-index" 607 | checksum = "79b71cca7d95d7681a4b3b9cdf63c8dbc3730d0584c2c74e31416d64a90493f4" 608 | dependencies = [ 609 | "const-oid 0.6.2", 610 | ] 611 | 612 | [[package]] 613 | name = "der" 614 | version = "0.5.1" 615 | source = "registry+https://github.com/rust-lang/crates.io-index" 616 | checksum = "6919815d73839e7ad218de758883aae3a257ba6759ce7a9992501efbb53d705c" 617 | dependencies = [ 618 | "const-oid 0.7.1", 619 | ] 620 | 621 | [[package]] 622 | name = "derive_more" 623 | version = "0.99.17" 624 | source = "registry+https://github.com/rust-lang/crates.io-index" 625 | checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" 626 | dependencies = [ 627 | "convert_case", 628 | "proc-macro2", 629 | "quote", 630 | "rustc_version", 631 | "syn", 632 | ] 633 | 634 | [[package]] 635 | name = "digest" 636 | version = "0.8.1" 637 | source = "registry+https://github.com/rust-lang/crates.io-index" 638 | checksum = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5" 639 | dependencies = [ 640 | "generic-array 0.12.4", 641 | ] 642 | 643 | [[package]] 644 | name = "digest" 645 | version = "0.9.0" 646 | source = "registry+https://github.com/rust-lang/crates.io-index" 647 | checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" 648 | dependencies = [ 649 | "generic-array 0.14.5", 650 | ] 651 | 652 | [[package]] 653 | name = "digest" 654 | version = "0.10.3" 655 | source = "registry+https://github.com/rust-lang/crates.io-index" 656 | checksum = "f2fb860ca6fafa5552fb6d0e816a69c8e49f0908bf524e30a90d97c85892d506" 657 | dependencies = [ 658 | "block-buffer 0.10.2", 659 | "crypto-common", 660 | "subtle", 661 | ] 662 | 663 | [[package]] 664 | name = "displaydoc" 665 | version = "0.2.3" 666 | source = "registry+https://github.com/rust-lang/crates.io-index" 667 | checksum = "3bf95dc3f046b9da4f2d51833c0d3547d8564ef6910f5c1ed130306a75b92886" 668 | dependencies = [ 669 | "proc-macro2", 670 | "quote", 671 | "syn", 672 | ] 673 | 674 | [[package]] 675 | name = "dotenv" 676 | version = "0.15.0" 677 | source = "registry+https://github.com/rust-lang/crates.io-index" 678 | checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f" 679 | 680 | [[package]] 681 | name = "dptree" 682 | version = "0.2.1" 683 | source = "registry+https://github.com/rust-lang/crates.io-index" 684 | checksum = "90018d2d80bd5c16aaa022271b2747ea8d461a21934c79404c26f568b60cca3d" 685 | dependencies = [ 686 | "futures", 687 | ] 688 | 689 | [[package]] 690 | name = "ed25519" 691 | version = "1.5.2" 692 | source = "registry+https://github.com/rust-lang/crates.io-index" 693 | checksum = "1e9c280362032ea4203659fc489832d0204ef09f247a0506f170dafcac08c369" 694 | dependencies = [ 695 | "serde", 696 | "signature", 697 | ] 698 | 699 | [[package]] 700 | name = "ed25519-dalek" 701 | version = "1.0.1" 702 | source = "registry+https://github.com/rust-lang/crates.io-index" 703 | checksum = "c762bae6dcaf24c4c84667b8579785430908723d5c889f469d76a41d59cc7a9d" 704 | dependencies = [ 705 | "curve25519-dalek", 706 | "ed25519", 707 | "rand 0.7.3", 708 | "serde", 709 | "serde_bytes", 710 | "sha2 0.9.9", 711 | "zeroize", 712 | ] 713 | 714 | [[package]] 715 | name = "either" 716 | version = "1.6.1" 717 | source = "registry+https://github.com/rust-lang/crates.io-index" 718 | checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" 719 | 720 | [[package]] 721 | name = "encoding_rs" 722 | version = "0.8.31" 723 | source = "registry+https://github.com/rust-lang/crates.io-index" 724 | checksum = "9852635589dc9f9ea1b6fe9f05b50ef208c85c834a562f0c6abb1c475736ec2b" 725 | dependencies = [ 726 | "cfg-if", 727 | ] 728 | 729 | [[package]] 730 | name = "env_logger" 731 | version = "0.7.1" 732 | source = "registry+https://github.com/rust-lang/crates.io-index" 733 | checksum = "44533bbbb3bb3c1fa17d9f2e4e38bbbaf8396ba82193c4cb1b6445d711445d36" 734 | dependencies = [ 735 | "atty", 736 | "humantime", 737 | "log", 738 | "regex", 739 | "termcolor", 740 | ] 741 | 742 | [[package]] 743 | name = "erasable" 744 | version = "1.2.1" 745 | source = "registry+https://github.com/rust-lang/crates.io-index" 746 | checksum = "5f11890ce181d47a64e5d1eb4b6caba0e7bae911a356723740d058a5d0340b7d" 747 | dependencies = [ 748 | "autocfg", 749 | "scopeguard", 750 | ] 751 | 752 | [[package]] 753 | name = "event-listener" 754 | version = "2.5.2" 755 | source = "registry+https://github.com/rust-lang/crates.io-index" 756 | checksum = "77f3309417938f28bf8228fcff79a4a37103981e3e186d2ccd19c74b38f4eb71" 757 | 758 | [[package]] 759 | name = "fake-simd" 760 | version = "0.1.2" 761 | source = "registry+https://github.com/rust-lang/crates.io-index" 762 | checksum = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" 763 | 764 | [[package]] 765 | name = "fastrand" 766 | version = "1.7.0" 767 | source = "registry+https://github.com/rust-lang/crates.io-index" 768 | checksum = "c3fcf0cee53519c866c09b5de1f6c56ff9d647101f81c1964fa632e148896cdf" 769 | dependencies = [ 770 | "instant", 771 | ] 772 | 773 | [[package]] 774 | name = "fnv" 775 | version = "1.0.7" 776 | source = "registry+https://github.com/rust-lang/crates.io-index" 777 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 778 | 779 | [[package]] 780 | name = "foreign-types" 781 | version = "0.3.2" 782 | source = "registry+https://github.com/rust-lang/crates.io-index" 783 | checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" 784 | dependencies = [ 785 | "foreign-types-shared", 786 | ] 787 | 788 | [[package]] 789 | name = "foreign-types-shared" 790 | version = "0.1.1" 791 | source = "registry+https://github.com/rust-lang/crates.io-index" 792 | checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" 793 | 794 | [[package]] 795 | name = "form_urlencoded" 796 | version = "1.0.1" 797 | source = "registry+https://github.com/rust-lang/crates.io-index" 798 | checksum = "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191" 799 | dependencies = [ 800 | "matches", 801 | "percent-encoding", 802 | ] 803 | 804 | [[package]] 805 | name = "fs2" 806 | version = "0.4.3" 807 | source = "registry+https://github.com/rust-lang/crates.io-index" 808 | checksum = "9564fc758e15025b46aa6643b1b77d047d1a56a1aea6e01002ac0c7026876213" 809 | dependencies = [ 810 | "libc", 811 | "winapi", 812 | ] 813 | 814 | [[package]] 815 | name = "futures" 816 | version = "0.3.21" 817 | source = "registry+https://github.com/rust-lang/crates.io-index" 818 | checksum = "f73fe65f54d1e12b726f517d3e2135ca3125a437b6d998caf1962961f7172d9e" 819 | dependencies = [ 820 | "futures-channel", 821 | "futures-core", 822 | "futures-executor", 823 | "futures-io", 824 | "futures-sink", 825 | "futures-task", 826 | "futures-util", 827 | ] 828 | 829 | [[package]] 830 | name = "futures-channel" 831 | version = "0.3.21" 832 | source = "registry+https://github.com/rust-lang/crates.io-index" 833 | checksum = "c3083ce4b914124575708913bca19bfe887522d6e2e6d0952943f5eac4a74010" 834 | dependencies = [ 835 | "futures-core", 836 | "futures-sink", 837 | ] 838 | 839 | [[package]] 840 | name = "futures-core" 841 | version = "0.3.21" 842 | source = "registry+https://github.com/rust-lang/crates.io-index" 843 | checksum = "0c09fd04b7e4073ac7156a9539b57a484a8ea920f79c7c675d05d289ab6110d3" 844 | 845 | [[package]] 846 | name = "futures-executor" 847 | version = "0.3.21" 848 | source = "registry+https://github.com/rust-lang/crates.io-index" 849 | checksum = "9420b90cfa29e327d0429f19be13e7ddb68fa1cccb09d65e5706b8c7a749b8a6" 850 | dependencies = [ 851 | "futures-core", 852 | "futures-task", 853 | "futures-util", 854 | ] 855 | 856 | [[package]] 857 | name = "futures-io" 858 | version = "0.3.21" 859 | source = "registry+https://github.com/rust-lang/crates.io-index" 860 | checksum = "fc4045962a5a5e935ee2fdedaa4e08284547402885ab326734432bed5d12966b" 861 | 862 | [[package]] 863 | name = "futures-macro" 864 | version = "0.3.21" 865 | source = "registry+https://github.com/rust-lang/crates.io-index" 866 | checksum = "33c1e13800337f4d4d7a316bf45a567dbcb6ffe087f16424852d97e97a91f512" 867 | dependencies = [ 868 | "proc-macro2", 869 | "quote", 870 | "syn", 871 | ] 872 | 873 | [[package]] 874 | name = "futures-sink" 875 | version = "0.3.21" 876 | source = "registry+https://github.com/rust-lang/crates.io-index" 877 | checksum = "21163e139fa306126e6eedaf49ecdb4588f939600f0b1e770f4205ee4b7fa868" 878 | 879 | [[package]] 880 | name = "futures-task" 881 | version = "0.3.21" 882 | source = "registry+https://github.com/rust-lang/crates.io-index" 883 | checksum = "57c66a976bf5909d801bbef33416c41372779507e7a6b3a5e25e4749c58f776a" 884 | 885 | [[package]] 886 | name = "futures-util" 887 | version = "0.3.21" 888 | source = "registry+https://github.com/rust-lang/crates.io-index" 889 | checksum = "d8b7abd5d659d9b90c8cba917f6ec750a74e2dc23902ef9cd4cc8c8b22e6036a" 890 | dependencies = [ 891 | "futures-channel", 892 | "futures-core", 893 | "futures-io", 894 | "futures-macro", 895 | "futures-sink", 896 | "futures-task", 897 | "memchr", 898 | "pin-project-lite", 899 | "pin-utils", 900 | "slab", 901 | ] 902 | 903 | [[package]] 904 | name = "fxhash" 905 | version = "0.2.1" 906 | source = "registry+https://github.com/rust-lang/crates.io-index" 907 | checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" 908 | dependencies = [ 909 | "byteorder", 910 | ] 911 | 912 | [[package]] 913 | name = "generic-array" 914 | version = "0.12.4" 915 | source = "registry+https://github.com/rust-lang/crates.io-index" 916 | checksum = "ffdf9f34f1447443d37393cc6c2b8313aebddcd96906caf34e54c68d8e57d7bd" 917 | dependencies = [ 918 | "typenum", 919 | ] 920 | 921 | [[package]] 922 | name = "generic-array" 923 | version = "0.14.5" 924 | source = "registry+https://github.com/rust-lang/crates.io-index" 925 | checksum = "fd48d33ec7f05fbfa152300fdad764757cbded343c1aa1cff2fbaf4134851803" 926 | dependencies = [ 927 | "typenum", 928 | "version_check", 929 | ] 930 | 931 | [[package]] 932 | name = "getrandom" 933 | version = "0.1.16" 934 | source = "registry+https://github.com/rust-lang/crates.io-index" 935 | checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" 936 | dependencies = [ 937 | "cfg-if", 938 | "js-sys", 939 | "libc", 940 | "wasi 0.9.0+wasi-snapshot-preview1", 941 | "wasm-bindgen", 942 | ] 943 | 944 | [[package]] 945 | name = "getrandom" 946 | version = "0.2.7" 947 | source = "registry+https://github.com/rust-lang/crates.io-index" 948 | checksum = "4eb1a864a501629691edf6c15a593b7a51eebaa1e8468e9ddc623de7c9b58ec6" 949 | dependencies = [ 950 | "cfg-if", 951 | "js-sys", 952 | "libc", 953 | "wasi 0.11.0+wasi-snapshot-preview1", 954 | "wasm-bindgen", 955 | ] 956 | 957 | [[package]] 958 | name = "h2" 959 | version = "0.3.13" 960 | source = "registry+https://github.com/rust-lang/crates.io-index" 961 | checksum = "37a82c6d637fc9515a4694bbf1cb2457b79d81ce52b3108bdeea58b07dd34a57" 962 | dependencies = [ 963 | "bytes", 964 | "fnv", 965 | "futures-core", 966 | "futures-sink", 967 | "futures-util", 968 | "http", 969 | "indexmap", 970 | "slab", 971 | "tokio", 972 | "tokio-util 0.7.3", 973 | "tracing", 974 | ] 975 | 976 | [[package]] 977 | name = "handlebars" 978 | version = "4.3.1" 979 | source = "registry+https://github.com/rust-lang/crates.io-index" 980 | checksum = "b66d0c1b6e3abfd1e72818798925e16e02ed77e1b47f6c25a95a23b377ee4299" 981 | dependencies = [ 982 | "log", 983 | "pest", 984 | "pest_derive", 985 | "serde", 986 | "serde_json", 987 | "thiserror", 988 | ] 989 | 990 | [[package]] 991 | name = "hashbrown" 992 | version = "0.11.2" 993 | source = "registry+https://github.com/rust-lang/crates.io-index" 994 | checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" 995 | dependencies = [ 996 | "ahash", 997 | ] 998 | 999 | [[package]] 1000 | name = "hashbrown" 1001 | version = "0.12.1" 1002 | source = "registry+https://github.com/rust-lang/crates.io-index" 1003 | checksum = "db0d4cf898abf0081f964436dc980e96670a0f36863e4b83aaacdb65c9d7ccc3" 1004 | 1005 | [[package]] 1006 | name = "headers" 1007 | version = "0.3.7" 1008 | source = "registry+https://github.com/rust-lang/crates.io-index" 1009 | checksum = "4cff78e5788be1e0ab65b04d306b2ed5092c815ec97ec70f4ebd5aee158aa55d" 1010 | dependencies = [ 1011 | "base64", 1012 | "bitflags", 1013 | "bytes", 1014 | "headers-core", 1015 | "http", 1016 | "httpdate", 1017 | "mime", 1018 | "sha-1 0.10.0", 1019 | ] 1020 | 1021 | [[package]] 1022 | name = "headers-core" 1023 | version = "0.2.0" 1024 | source = "registry+https://github.com/rust-lang/crates.io-index" 1025 | checksum = "e7f66481bfee273957b1f20485a4ff3362987f85b2c236580d81b4eb7a326429" 1026 | dependencies = [ 1027 | "http", 1028 | ] 1029 | 1030 | [[package]] 1031 | name = "heck" 1032 | version = "0.4.0" 1033 | source = "registry+https://github.com/rust-lang/crates.io-index" 1034 | checksum = "2540771e65fc8cb83cd6e8a237f70c319bd5c29f78ed1084ba5d50eeac86f7f9" 1035 | 1036 | [[package]] 1037 | name = "hermit-abi" 1038 | version = "0.1.19" 1039 | source = "registry+https://github.com/rust-lang/crates.io-index" 1040 | checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" 1041 | dependencies = [ 1042 | "libc", 1043 | ] 1044 | 1045 | [[package]] 1046 | name = "hkdf" 1047 | version = "0.12.3" 1048 | source = "registry+https://github.com/rust-lang/crates.io-index" 1049 | checksum = "791a029f6b9fc27657f6f188ec6e5e43f6911f6f878e0dc5501396e09809d437" 1050 | dependencies = [ 1051 | "hmac", 1052 | ] 1053 | 1054 | [[package]] 1055 | name = "hmac" 1056 | version = "0.12.1" 1057 | source = "registry+https://github.com/rust-lang/crates.io-index" 1058 | checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" 1059 | dependencies = [ 1060 | "digest 0.10.3", 1061 | ] 1062 | 1063 | [[package]] 1064 | name = "http" 1065 | version = "0.2.8" 1066 | source = "registry+https://github.com/rust-lang/crates.io-index" 1067 | checksum = "75f43d41e26995c17e71ee126451dd3941010b0514a81a9d11f3b341debc2399" 1068 | dependencies = [ 1069 | "bytes", 1070 | "fnv", 1071 | "itoa", 1072 | ] 1073 | 1074 | [[package]] 1075 | name = "http-body" 1076 | version = "0.4.5" 1077 | source = "registry+https://github.com/rust-lang/crates.io-index" 1078 | checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" 1079 | dependencies = [ 1080 | "bytes", 1081 | "http", 1082 | "pin-project-lite", 1083 | ] 1084 | 1085 | [[package]] 1086 | name = "httparse" 1087 | version = "1.7.1" 1088 | source = "registry+https://github.com/rust-lang/crates.io-index" 1089 | checksum = "496ce29bb5a52785b44e0f7ca2847ae0bb839c9bd28f69acac9b99d461c0c04c" 1090 | 1091 | [[package]] 1092 | name = "httpdate" 1093 | version = "1.0.2" 1094 | source = "registry+https://github.com/rust-lang/crates.io-index" 1095 | checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" 1096 | 1097 | [[package]] 1098 | name = "humantime" 1099 | version = "1.3.0" 1100 | source = "registry+https://github.com/rust-lang/crates.io-index" 1101 | checksum = "df004cfca50ef23c36850aaaa59ad52cc70d0e90243c3c7737a4dd32dc7a3c4f" 1102 | dependencies = [ 1103 | "quick-error", 1104 | ] 1105 | 1106 | [[package]] 1107 | name = "hyper" 1108 | version = "0.14.19" 1109 | source = "registry+https://github.com/rust-lang/crates.io-index" 1110 | checksum = "42dc3c131584288d375f2d07f822b0cb012d8c6fb899a5b9fdb3cb7eb9b6004f" 1111 | dependencies = [ 1112 | "bytes", 1113 | "futures-channel", 1114 | "futures-core", 1115 | "futures-util", 1116 | "h2", 1117 | "http", 1118 | "http-body", 1119 | "httparse", 1120 | "httpdate", 1121 | "itoa", 1122 | "pin-project-lite", 1123 | "socket2", 1124 | "tokio", 1125 | "tower-service", 1126 | "tracing", 1127 | "want", 1128 | ] 1129 | 1130 | [[package]] 1131 | name = "hyper-tls" 1132 | version = "0.5.0" 1133 | source = "registry+https://github.com/rust-lang/crates.io-index" 1134 | checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" 1135 | dependencies = [ 1136 | "bytes", 1137 | "hyper", 1138 | "native-tls", 1139 | "tokio", 1140 | "tokio-native-tls", 1141 | ] 1142 | 1143 | [[package]] 1144 | name = "ident_case" 1145 | version = "1.0.1" 1146 | source = "registry+https://github.com/rust-lang/crates.io-index" 1147 | checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" 1148 | 1149 | [[package]] 1150 | name = "idna" 1151 | version = "0.2.3" 1152 | source = "registry+https://github.com/rust-lang/crates.io-index" 1153 | checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" 1154 | dependencies = [ 1155 | "matches", 1156 | "unicode-bidi", 1157 | "unicode-normalization", 1158 | ] 1159 | 1160 | [[package]] 1161 | name = "indexed_db_futures" 1162 | version = "0.2.3" 1163 | source = "registry+https://github.com/rust-lang/crates.io-index" 1164 | checksum = "d26ac735f676c52305becf53264b91cea9866a8de61ccbf464405b377b9cbca9" 1165 | dependencies = [ 1166 | "cfg-if", 1167 | "js-sys", 1168 | "uuid 0.8.2", 1169 | "wasm-bindgen", 1170 | "wasm-bindgen-futures", 1171 | "web-sys", 1172 | ] 1173 | 1174 | [[package]] 1175 | name = "indexmap" 1176 | version = "1.9.1" 1177 | source = "registry+https://github.com/rust-lang/crates.io-index" 1178 | checksum = "10a35a97730320ffe8e2d410b5d3b69279b98d2c14bdb8b70ea89ecf7888d41e" 1179 | dependencies = [ 1180 | "autocfg", 1181 | "hashbrown 0.12.1", 1182 | "serde", 1183 | ] 1184 | 1185 | [[package]] 1186 | name = "inout" 1187 | version = "0.1.3" 1188 | source = "registry+https://github.com/rust-lang/crates.io-index" 1189 | checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" 1190 | dependencies = [ 1191 | "block-padding 0.3.2", 1192 | "generic-array 0.14.5", 1193 | ] 1194 | 1195 | [[package]] 1196 | name = "instant" 1197 | version = "0.1.12" 1198 | source = "registry+https://github.com/rust-lang/crates.io-index" 1199 | checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" 1200 | dependencies = [ 1201 | "cfg-if", 1202 | "js-sys", 1203 | "wasm-bindgen", 1204 | "web-sys", 1205 | ] 1206 | 1207 | [[package]] 1208 | name = "ipnet" 1209 | version = "2.5.0" 1210 | source = "registry+https://github.com/rust-lang/crates.io-index" 1211 | checksum = "879d54834c8c76457ef4293a689b2a8c59b076067ad77b15efafbb05f92a592b" 1212 | 1213 | [[package]] 1214 | name = "itertools" 1215 | version = "0.9.0" 1216 | source = "registry+https://github.com/rust-lang/crates.io-index" 1217 | checksum = "284f18f85651fe11e8a991b2adb42cb078325c996ed026d994719efcfca1d54b" 1218 | dependencies = [ 1219 | "either", 1220 | ] 1221 | 1222 | [[package]] 1223 | name = "itertools" 1224 | version = "0.10.3" 1225 | source = "registry+https://github.com/rust-lang/crates.io-index" 1226 | checksum = "a9a9d19fa1e79b6215ff29b9d6880b706147f16e9b1dbb1e4e5947b5b02bc5e3" 1227 | dependencies = [ 1228 | "either", 1229 | ] 1230 | 1231 | [[package]] 1232 | name = "itoa" 1233 | version = "1.0.2" 1234 | source = "registry+https://github.com/rust-lang/crates.io-index" 1235 | checksum = "112c678d4050afce233f4f2852bb2eb519230b3cf12f33585275537d7e41578d" 1236 | 1237 | [[package]] 1238 | name = "js-sys" 1239 | version = "0.3.58" 1240 | source = "registry+https://github.com/rust-lang/crates.io-index" 1241 | checksum = "c3fac17f7123a73ca62df411b1bf727ccc805daa070338fda671c86dac1bdc27" 1242 | dependencies = [ 1243 | "wasm-bindgen", 1244 | ] 1245 | 1246 | [[package]] 1247 | name = "js_int" 1248 | version = "0.2.2" 1249 | source = "registry+https://github.com/rust-lang/crates.io-index" 1250 | checksum = "d937f95470b270ce8b8950207715d71aa8e153c0d44c6684d59397ed4949160a" 1251 | dependencies = [ 1252 | "serde", 1253 | ] 1254 | 1255 | [[package]] 1256 | name = "js_option" 1257 | version = "0.1.1" 1258 | source = "registry+https://github.com/rust-lang/crates.io-index" 1259 | checksum = "68421373957a1593a767013698dbf206e2b221eefe97a44d98d18672ff38423c" 1260 | dependencies = [ 1261 | "serde", 1262 | ] 1263 | 1264 | [[package]] 1265 | name = "lazy_static" 1266 | version = "1.4.0" 1267 | source = "registry+https://github.com/rust-lang/crates.io-index" 1268 | checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" 1269 | 1270 | [[package]] 1271 | name = "libc" 1272 | version = "0.2.126" 1273 | source = "registry+https://github.com/rust-lang/crates.io-index" 1274 | checksum = "349d5a591cd28b49e1d1037471617a32ddcda5731b99419008085f72d5a53836" 1275 | 1276 | [[package]] 1277 | name = "lock_api" 1278 | version = "0.4.7" 1279 | source = "registry+https://github.com/rust-lang/crates.io-index" 1280 | checksum = "327fa5b6a6940e4699ec49a9beae1ea4845c6bab9314e4f84ac68742139d8c53" 1281 | dependencies = [ 1282 | "autocfg", 1283 | "scopeguard", 1284 | ] 1285 | 1286 | [[package]] 1287 | name = "log" 1288 | version = "0.4.17" 1289 | source = "registry+https://github.com/rust-lang/crates.io-index" 1290 | checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" 1291 | dependencies = [ 1292 | "cfg-if", 1293 | ] 1294 | 1295 | [[package]] 1296 | name = "lru" 1297 | version = "0.7.7" 1298 | source = "registry+https://github.com/rust-lang/crates.io-index" 1299 | checksum = "c84e6fe5655adc6ce00787cf7dcaf8dc4f998a0565d23eafc207a8b08ca3349a" 1300 | dependencies = [ 1301 | "hashbrown 0.11.2", 1302 | ] 1303 | 1304 | [[package]] 1305 | name = "maplit" 1306 | version = "1.0.2" 1307 | source = "registry+https://github.com/rust-lang/crates.io-index" 1308 | checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d" 1309 | 1310 | [[package]] 1311 | name = "matches" 1312 | version = "0.1.9" 1313 | source = "registry+https://github.com/rust-lang/crates.io-index" 1314 | checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" 1315 | 1316 | [[package]] 1317 | name = "matrix-sdk" 1318 | version = "0.5.0" 1319 | source = "registry+https://github.com/rust-lang/crates.io-index" 1320 | checksum = "6afed7115d3dbf0c91c062b2904c964e2405b2e1f8de5511c5eeae7583b70ebe" 1321 | dependencies = [ 1322 | "anymap2", 1323 | "async-once-cell", 1324 | "async-stream", 1325 | "async-trait", 1326 | "backoff", 1327 | "bytes", 1328 | "dashmap", 1329 | "event-listener", 1330 | "futures-core", 1331 | "futures-util", 1332 | "http", 1333 | "matrix-sdk-base", 1334 | "matrix-sdk-common", 1335 | "matrix-sdk-indexeddb", 1336 | "matrix-sdk-sled", 1337 | "mime", 1338 | "reqwest", 1339 | "ruma", 1340 | "serde", 1341 | "serde_json", 1342 | "thiserror", 1343 | "tokio", 1344 | "tracing", 1345 | "url", 1346 | "wasm-timer", 1347 | "zeroize", 1348 | ] 1349 | 1350 | [[package]] 1351 | name = "matrix-sdk-base" 1352 | version = "0.5.1" 1353 | source = "registry+https://github.com/rust-lang/crates.io-index" 1354 | checksum = "f59a52c744df124832643ecfc03ffb468023e9c3644477f41bf316d500df9504" 1355 | dependencies = [ 1356 | "async-stream", 1357 | "async-trait", 1358 | "dashmap", 1359 | "futures-channel", 1360 | "futures-core", 1361 | "futures-util", 1362 | "lru", 1363 | "matrix-sdk-common", 1364 | "matrix-sdk-crypto", 1365 | "ruma", 1366 | "serde", 1367 | "serde_json", 1368 | "thiserror", 1369 | "tracing", 1370 | "zeroize", 1371 | ] 1372 | 1373 | [[package]] 1374 | name = "matrix-sdk-common" 1375 | version = "0.5.0" 1376 | source = "registry+https://github.com/rust-lang/crates.io-index" 1377 | checksum = "52a8af49e5b15c2dee4c0e867cd8065bb999cc63ff2500a0d35331188a9acbae" 1378 | dependencies = [ 1379 | "async-lock", 1380 | "futures-util", 1381 | "instant", 1382 | "ruma", 1383 | "serde", 1384 | "tokio", 1385 | "wasm-bindgen-futures", 1386 | ] 1387 | 1388 | [[package]] 1389 | name = "matrix-sdk-crypto" 1390 | version = "0.5.0" 1391 | source = "registry+https://github.com/rust-lang/crates.io-index" 1392 | checksum = "13ed05a03bcceec396d594df8b6bf8601db8d017611c5ede0ba27f59aee24480" 1393 | dependencies = [ 1394 | "aes", 1395 | "async-trait", 1396 | "atomic", 1397 | "base64", 1398 | "byteorder", 1399 | "ctr", 1400 | "dashmap", 1401 | "futures-util", 1402 | "hmac", 1403 | "matrix-sdk-common", 1404 | "pbkdf2", 1405 | "rand 0.8.5", 1406 | "ruma", 1407 | "serde", 1408 | "serde_json", 1409 | "sha2 0.10.2", 1410 | "thiserror", 1411 | "tracing", 1412 | "vodozemac", 1413 | "zeroize", 1414 | ] 1415 | 1416 | [[package]] 1417 | name = "matrix-sdk-indexeddb" 1418 | version = "0.1.0" 1419 | source = "registry+https://github.com/rust-lang/crates.io-index" 1420 | checksum = "ad42c7e9fdbb9373c08ef1f4fd4a15d6000f2fe35aefae20b3be50a3fac91a4a" 1421 | dependencies = [ 1422 | "anyhow", 1423 | "async-trait", 1424 | "base64", 1425 | "dashmap", 1426 | "futures-util", 1427 | "getrandom 0.2.7", 1428 | "indexed_db_futures", 1429 | "matrix-sdk-base", 1430 | "matrix-sdk-crypto", 1431 | "matrix-sdk-store-encryption", 1432 | "ruma", 1433 | "serde", 1434 | "serde_json", 1435 | "thiserror", 1436 | "tracing", 1437 | "wasm-bindgen", 1438 | "web-sys", 1439 | ] 1440 | 1441 | [[package]] 1442 | name = "matrix-sdk-sled" 1443 | version = "0.1.0" 1444 | source = "registry+https://github.com/rust-lang/crates.io-index" 1445 | checksum = "29b9fea0772f3ccf7b82b3b35db7687a18fc9e8dbf3daeb57214b1a023ddf5be" 1446 | dependencies = [ 1447 | "async-stream", 1448 | "async-trait", 1449 | "dashmap", 1450 | "futures-core", 1451 | "futures-util", 1452 | "matrix-sdk-base", 1453 | "matrix-sdk-common", 1454 | "matrix-sdk-crypto", 1455 | "matrix-sdk-store-encryption", 1456 | "ruma", 1457 | "serde", 1458 | "serde_json", 1459 | "sled", 1460 | "thiserror", 1461 | "tokio", 1462 | "tracing", 1463 | ] 1464 | 1465 | [[package]] 1466 | name = "matrix-sdk-store-encryption" 1467 | version = "0.1.0" 1468 | source = "registry+https://github.com/rust-lang/crates.io-index" 1469 | checksum = "8fd87e2c3e266dc9512d03b45f0771005c621c8fae12c74c766c97b1c756b942" 1470 | dependencies = [ 1471 | "blake3", 1472 | "chacha20poly1305", 1473 | "displaydoc", 1474 | "hmac", 1475 | "pbkdf2", 1476 | "rand 0.8.5", 1477 | "serde", 1478 | "serde_json", 1479 | "sha2 0.10.2", 1480 | "thiserror", 1481 | "zeroize", 1482 | ] 1483 | 1484 | [[package]] 1485 | name = "memchr" 1486 | version = "2.5.0" 1487 | source = "registry+https://github.com/rust-lang/crates.io-index" 1488 | checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" 1489 | 1490 | [[package]] 1491 | name = "memoffset" 1492 | version = "0.6.5" 1493 | source = "registry+https://github.com/rust-lang/crates.io-index" 1494 | checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" 1495 | dependencies = [ 1496 | "autocfg", 1497 | ] 1498 | 1499 | [[package]] 1500 | name = "mime" 1501 | version = "0.3.16" 1502 | source = "registry+https://github.com/rust-lang/crates.io-index" 1503 | checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" 1504 | 1505 | [[package]] 1506 | name = "mime_guess" 1507 | version = "2.0.4" 1508 | source = "registry+https://github.com/rust-lang/crates.io-index" 1509 | checksum = "4192263c238a5f0d0c6bfd21f336a313a4ce1c450542449ca191bb657b4642ef" 1510 | dependencies = [ 1511 | "mime", 1512 | "unicase", 1513 | ] 1514 | 1515 | [[package]] 1516 | name = "mio" 1517 | version = "0.8.4" 1518 | source = "registry+https://github.com/rust-lang/crates.io-index" 1519 | checksum = "57ee1c23c7c63b0c9250c339ffdc69255f110b298b901b9f6c82547b7b87caaf" 1520 | dependencies = [ 1521 | "libc", 1522 | "log", 1523 | "wasi 0.11.0+wasi-snapshot-preview1", 1524 | "windows-sys", 1525 | ] 1526 | 1527 | [[package]] 1528 | name = "multipart" 1529 | version = "0.18.0" 1530 | source = "registry+https://github.com/rust-lang/crates.io-index" 1531 | checksum = "00dec633863867f29cb39df64a397cdf4a6354708ddd7759f70c7fb51c5f9182" 1532 | dependencies = [ 1533 | "buf_redux", 1534 | "httparse", 1535 | "log", 1536 | "mime", 1537 | "mime_guess", 1538 | "quick-error", 1539 | "rand 0.8.5", 1540 | "safemem", 1541 | "tempfile", 1542 | "twoway", 1543 | ] 1544 | 1545 | [[package]] 1546 | name = "native-tls" 1547 | version = "0.2.10" 1548 | source = "registry+https://github.com/rust-lang/crates.io-index" 1549 | checksum = "fd7e2f3618557f980e0b17e8856252eee3c97fa12c54dff0ca290fb6266ca4a9" 1550 | dependencies = [ 1551 | "lazy_static", 1552 | "libc", 1553 | "log", 1554 | "openssl", 1555 | "openssl-probe", 1556 | "openssl-sys", 1557 | "schannel", 1558 | "security-framework", 1559 | "security-framework-sys", 1560 | "tempfile", 1561 | ] 1562 | 1563 | [[package]] 1564 | name = "never" 1565 | version = "0.1.0" 1566 | source = "registry+https://github.com/rust-lang/crates.io-index" 1567 | checksum = "c96aba5aa877601bb3f6dd6a63a969e1f82e60646e81e71b14496995e9853c91" 1568 | 1569 | [[package]] 1570 | name = "num-integer" 1571 | version = "0.1.45" 1572 | source = "registry+https://github.com/rust-lang/crates.io-index" 1573 | checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" 1574 | dependencies = [ 1575 | "autocfg", 1576 | "num-traits", 1577 | ] 1578 | 1579 | [[package]] 1580 | name = "num-traits" 1581 | version = "0.2.15" 1582 | source = "registry+https://github.com/rust-lang/crates.io-index" 1583 | checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" 1584 | dependencies = [ 1585 | "autocfg", 1586 | ] 1587 | 1588 | [[package]] 1589 | name = "num_cpus" 1590 | version = "1.13.1" 1591 | source = "registry+https://github.com/rust-lang/crates.io-index" 1592 | checksum = "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1" 1593 | dependencies = [ 1594 | "hermit-abi", 1595 | "libc", 1596 | ] 1597 | 1598 | [[package]] 1599 | name = "once_cell" 1600 | version = "1.12.0" 1601 | source = "registry+https://github.com/rust-lang/crates.io-index" 1602 | checksum = "7709cef83f0c1f58f666e746a08b21e0085f7440fa6a29cc194d68aac97a4225" 1603 | 1604 | [[package]] 1605 | name = "opaque-debug" 1606 | version = "0.2.3" 1607 | source = "registry+https://github.com/rust-lang/crates.io-index" 1608 | checksum = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c" 1609 | 1610 | [[package]] 1611 | name = "opaque-debug" 1612 | version = "0.3.0" 1613 | source = "registry+https://github.com/rust-lang/crates.io-index" 1614 | checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" 1615 | 1616 | [[package]] 1617 | name = "openssl" 1618 | version = "0.10.40" 1619 | source = "registry+https://github.com/rust-lang/crates.io-index" 1620 | checksum = "fb81a6430ac911acb25fe5ac8f1d2af1b4ea8a4fdfda0f1ee4292af2e2d8eb0e" 1621 | dependencies = [ 1622 | "bitflags", 1623 | "cfg-if", 1624 | "foreign-types", 1625 | "libc", 1626 | "once_cell", 1627 | "openssl-macros", 1628 | "openssl-sys", 1629 | ] 1630 | 1631 | [[package]] 1632 | name = "openssl-macros" 1633 | version = "0.1.0" 1634 | source = "registry+https://github.com/rust-lang/crates.io-index" 1635 | checksum = "b501e44f11665960c7e7fcf062c7d96a14ade4aa98116c004b2e37b5be7d736c" 1636 | dependencies = [ 1637 | "proc-macro2", 1638 | "quote", 1639 | "syn", 1640 | ] 1641 | 1642 | [[package]] 1643 | name = "openssl-probe" 1644 | version = "0.1.5" 1645 | source = "registry+https://github.com/rust-lang/crates.io-index" 1646 | checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" 1647 | 1648 | [[package]] 1649 | name = "openssl-sys" 1650 | version = "0.9.74" 1651 | source = "registry+https://github.com/rust-lang/crates.io-index" 1652 | checksum = "835363342df5fba8354c5b453325b110ffd54044e588c539cf2f20a8014e4cb1" 1653 | dependencies = [ 1654 | "autocfg", 1655 | "cc", 1656 | "libc", 1657 | "pkg-config", 1658 | "vcpkg", 1659 | ] 1660 | 1661 | [[package]] 1662 | name = "os_str_bytes" 1663 | version = "6.1.0" 1664 | source = "registry+https://github.com/rust-lang/crates.io-index" 1665 | checksum = "21326818e99cfe6ce1e524c2a805c189a99b5ae555a35d19f9a284b427d86afa" 1666 | 1667 | [[package]] 1668 | name = "parking_lot" 1669 | version = "0.11.2" 1670 | source = "registry+https://github.com/rust-lang/crates.io-index" 1671 | checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" 1672 | dependencies = [ 1673 | "instant", 1674 | "lock_api", 1675 | "parking_lot_core 0.8.5", 1676 | ] 1677 | 1678 | [[package]] 1679 | name = "parking_lot_core" 1680 | version = "0.8.5" 1681 | source = "registry+https://github.com/rust-lang/crates.io-index" 1682 | checksum = "d76e8e1493bcac0d2766c42737f34458f1c8c50c0d23bcb24ea953affb273216" 1683 | dependencies = [ 1684 | "cfg-if", 1685 | "instant", 1686 | "libc", 1687 | "redox_syscall", 1688 | "smallvec", 1689 | "winapi", 1690 | ] 1691 | 1692 | [[package]] 1693 | name = "parking_lot_core" 1694 | version = "0.9.3" 1695 | source = "registry+https://github.com/rust-lang/crates.io-index" 1696 | checksum = "09a279cbf25cb0757810394fbc1e359949b59e348145c643a939a525692e6929" 1697 | dependencies = [ 1698 | "cfg-if", 1699 | "libc", 1700 | "redox_syscall", 1701 | "smallvec", 1702 | "windows-sys", 1703 | ] 1704 | 1705 | [[package]] 1706 | name = "password-hash" 1707 | version = "0.4.1" 1708 | source = "registry+https://github.com/rust-lang/crates.io-index" 1709 | checksum = "e029e94abc8fb0065241c308f1ac6bc8d20f450e8f7c5f0b25cd9b8d526ba294" 1710 | dependencies = [ 1711 | "base64ct", 1712 | "rand_core 0.6.3", 1713 | "subtle", 1714 | ] 1715 | 1716 | [[package]] 1717 | name = "pbkdf2" 1718 | version = "0.11.0" 1719 | source = "registry+https://github.com/rust-lang/crates.io-index" 1720 | checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" 1721 | dependencies = [ 1722 | "digest 0.10.3", 1723 | "hmac", 1724 | "password-hash", 1725 | "sha2 0.10.2", 1726 | ] 1727 | 1728 | [[package]] 1729 | name = "percent-encoding" 1730 | version = "2.1.0" 1731 | source = "registry+https://github.com/rust-lang/crates.io-index" 1732 | checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" 1733 | 1734 | [[package]] 1735 | name = "pest" 1736 | version = "2.1.3" 1737 | source = "registry+https://github.com/rust-lang/crates.io-index" 1738 | checksum = "10f4872ae94d7b90ae48754df22fd42ad52ce740b8f370b03da4835417403e53" 1739 | dependencies = [ 1740 | "ucd-trie", 1741 | ] 1742 | 1743 | [[package]] 1744 | name = "pest_derive" 1745 | version = "2.1.0" 1746 | source = "registry+https://github.com/rust-lang/crates.io-index" 1747 | checksum = "833d1ae558dc601e9a60366421196a8d94bc0ac980476d0b67e1d0988d72b2d0" 1748 | dependencies = [ 1749 | "pest", 1750 | "pest_generator", 1751 | ] 1752 | 1753 | [[package]] 1754 | name = "pest_generator" 1755 | version = "2.1.3" 1756 | source = "registry+https://github.com/rust-lang/crates.io-index" 1757 | checksum = "99b8db626e31e5b81787b9783425769681b347011cc59471e33ea46d2ea0cf55" 1758 | dependencies = [ 1759 | "pest", 1760 | "pest_meta", 1761 | "proc-macro2", 1762 | "quote", 1763 | "syn", 1764 | ] 1765 | 1766 | [[package]] 1767 | name = "pest_meta" 1768 | version = "2.1.3" 1769 | source = "registry+https://github.com/rust-lang/crates.io-index" 1770 | checksum = "54be6e404f5317079812fc8f9f5279de376d8856929e21c184ecf6bbd692a11d" 1771 | dependencies = [ 1772 | "maplit", 1773 | "pest", 1774 | "sha-1 0.8.2", 1775 | ] 1776 | 1777 | [[package]] 1778 | name = "pin-project" 1779 | version = "1.0.10" 1780 | source = "registry+https://github.com/rust-lang/crates.io-index" 1781 | checksum = "58ad3879ad3baf4e44784bc6a718a8698867bb991f8ce24d1bcbe2cfb4c3a75e" 1782 | dependencies = [ 1783 | "pin-project-internal", 1784 | ] 1785 | 1786 | [[package]] 1787 | name = "pin-project-internal" 1788 | version = "1.0.10" 1789 | source = "registry+https://github.com/rust-lang/crates.io-index" 1790 | checksum = "744b6f092ba29c3650faf274db506afd39944f48420f6c86b17cfe0ee1cb36bb" 1791 | dependencies = [ 1792 | "proc-macro2", 1793 | "quote", 1794 | "syn", 1795 | ] 1796 | 1797 | [[package]] 1798 | name = "pin-project-lite" 1799 | version = "0.2.9" 1800 | source = "registry+https://github.com/rust-lang/crates.io-index" 1801 | checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" 1802 | 1803 | [[package]] 1804 | name = "pin-utils" 1805 | version = "0.1.0" 1806 | source = "registry+https://github.com/rust-lang/crates.io-index" 1807 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 1808 | 1809 | [[package]] 1810 | name = "pkcs7" 1811 | version = "0.3.0" 1812 | source = "registry+https://github.com/rust-lang/crates.io-index" 1813 | checksum = "1f7364e6d0e236473de91e042395d71e0e64715f99a60620b014a4a4c7d1619b" 1814 | dependencies = [ 1815 | "der 0.5.1", 1816 | "spki 0.5.4", 1817 | ] 1818 | 1819 | [[package]] 1820 | name = "pkcs8" 1821 | version = "0.7.6" 1822 | source = "registry+https://github.com/rust-lang/crates.io-index" 1823 | checksum = "ee3ef9b64d26bad0536099c816c6734379e45bbd5f14798def6809e5cc350447" 1824 | dependencies = [ 1825 | "der 0.4.5", 1826 | "spki 0.4.1", 1827 | "zeroize", 1828 | ] 1829 | 1830 | [[package]] 1831 | name = "pkg-config" 1832 | version = "0.3.25" 1833 | source = "registry+https://github.com/rust-lang/crates.io-index" 1834 | checksum = "1df8c4ec4b0627e53bdf214615ad287367e482558cf84b109250b37464dc03ae" 1835 | 1836 | [[package]] 1837 | name = "poly1305" 1838 | version = "0.7.2" 1839 | source = "registry+https://github.com/rust-lang/crates.io-index" 1840 | checksum = "048aeb476be11a4b6ca432ca569e375810de9294ae78f4774e78ea98a9246ede" 1841 | dependencies = [ 1842 | "cpufeatures", 1843 | "opaque-debug 0.3.0", 1844 | "universal-hash", 1845 | ] 1846 | 1847 | [[package]] 1848 | name = "ppv-lite86" 1849 | version = "0.2.16" 1850 | source = "registry+https://github.com/rust-lang/crates.io-index" 1851 | checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872" 1852 | 1853 | [[package]] 1854 | name = "pretty_env_logger" 1855 | version = "0.4.0" 1856 | source = "registry+https://github.com/rust-lang/crates.io-index" 1857 | checksum = "926d36b9553851b8b0005f1275891b392ee4d2d833852c417ed025477350fb9d" 1858 | dependencies = [ 1859 | "env_logger", 1860 | "log", 1861 | ] 1862 | 1863 | [[package]] 1864 | name = "proc-macro-crate" 1865 | version = "1.1.3" 1866 | source = "registry+https://github.com/rust-lang/crates.io-index" 1867 | checksum = "e17d47ce914bf4de440332250b0edd23ce48c005f59fab39d3335866b114f11a" 1868 | dependencies = [ 1869 | "thiserror", 1870 | "toml", 1871 | ] 1872 | 1873 | [[package]] 1874 | name = "proc-macro-error" 1875 | version = "1.0.4" 1876 | source = "registry+https://github.com/rust-lang/crates.io-index" 1877 | checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" 1878 | dependencies = [ 1879 | "proc-macro-error-attr", 1880 | "proc-macro2", 1881 | "quote", 1882 | "syn", 1883 | "version_check", 1884 | ] 1885 | 1886 | [[package]] 1887 | name = "proc-macro-error-attr" 1888 | version = "1.0.4" 1889 | source = "registry+https://github.com/rust-lang/crates.io-index" 1890 | checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" 1891 | dependencies = [ 1892 | "proc-macro2", 1893 | "quote", 1894 | "version_check", 1895 | ] 1896 | 1897 | [[package]] 1898 | name = "proc-macro2" 1899 | version = "1.0.40" 1900 | source = "registry+https://github.com/rust-lang/crates.io-index" 1901 | checksum = "dd96a1e8ed2596c337f8eae5f24924ec83f5ad5ab21ea8e455d3566c69fbcaf7" 1902 | dependencies = [ 1903 | "unicode-ident", 1904 | ] 1905 | 1906 | [[package]] 1907 | name = "prost" 1908 | version = "0.10.4" 1909 | source = "registry+https://github.com/rust-lang/crates.io-index" 1910 | checksum = "71adf41db68aa0daaefc69bb30bcd68ded9b9abaad5d1fbb6304c4fb390e083e" 1911 | dependencies = [ 1912 | "bytes", 1913 | "prost-derive", 1914 | ] 1915 | 1916 | [[package]] 1917 | name = "prost-derive" 1918 | version = "0.10.1" 1919 | source = "registry+https://github.com/rust-lang/crates.io-index" 1920 | checksum = "7b670f45da57fb8542ebdbb6105a925fe571b67f9e7ed9f47a06a84e72b4e7cc" 1921 | dependencies = [ 1922 | "anyhow", 1923 | "itertools 0.10.3", 1924 | "proc-macro2", 1925 | "quote", 1926 | "syn", 1927 | ] 1928 | 1929 | [[package]] 1930 | name = "pulldown-cmark" 1931 | version = "0.9.1" 1932 | source = "registry+https://github.com/rust-lang/crates.io-index" 1933 | checksum = "34f197a544b0c9ab3ae46c359a7ec9cbbb5c7bf97054266fecb7ead794a181d6" 1934 | dependencies = [ 1935 | "bitflags", 1936 | "memchr", 1937 | "unicase", 1938 | ] 1939 | 1940 | [[package]] 1941 | name = "quick-error" 1942 | version = "1.2.3" 1943 | source = "registry+https://github.com/rust-lang/crates.io-index" 1944 | checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" 1945 | 1946 | [[package]] 1947 | name = "quote" 1948 | version = "1.0.20" 1949 | source = "registry+https://github.com/rust-lang/crates.io-index" 1950 | checksum = "3bcdf212e9776fbcb2d23ab029360416bb1706b1aea2d1a5ba002727cbcab804" 1951 | dependencies = [ 1952 | "proc-macro2", 1953 | ] 1954 | 1955 | [[package]] 1956 | name = "rand" 1957 | version = "0.7.3" 1958 | source = "registry+https://github.com/rust-lang/crates.io-index" 1959 | checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" 1960 | dependencies = [ 1961 | "getrandom 0.1.16", 1962 | "libc", 1963 | "rand_chacha 0.2.2", 1964 | "rand_core 0.5.1", 1965 | "rand_hc", 1966 | ] 1967 | 1968 | [[package]] 1969 | name = "rand" 1970 | version = "0.8.5" 1971 | source = "registry+https://github.com/rust-lang/crates.io-index" 1972 | checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" 1973 | dependencies = [ 1974 | "libc", 1975 | "rand_chacha 0.3.1", 1976 | "rand_core 0.6.3", 1977 | ] 1978 | 1979 | [[package]] 1980 | name = "rand_chacha" 1981 | version = "0.2.2" 1982 | source = "registry+https://github.com/rust-lang/crates.io-index" 1983 | checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" 1984 | dependencies = [ 1985 | "ppv-lite86", 1986 | "rand_core 0.5.1", 1987 | ] 1988 | 1989 | [[package]] 1990 | name = "rand_chacha" 1991 | version = "0.3.1" 1992 | source = "registry+https://github.com/rust-lang/crates.io-index" 1993 | checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" 1994 | dependencies = [ 1995 | "ppv-lite86", 1996 | "rand_core 0.6.3", 1997 | ] 1998 | 1999 | [[package]] 2000 | name = "rand_core" 2001 | version = "0.5.1" 2002 | source = "registry+https://github.com/rust-lang/crates.io-index" 2003 | checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" 2004 | dependencies = [ 2005 | "getrandom 0.1.16", 2006 | ] 2007 | 2008 | [[package]] 2009 | name = "rand_core" 2010 | version = "0.6.3" 2011 | source = "registry+https://github.com/rust-lang/crates.io-index" 2012 | checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" 2013 | dependencies = [ 2014 | "getrandom 0.2.7", 2015 | ] 2016 | 2017 | [[package]] 2018 | name = "rand_hc" 2019 | version = "0.2.0" 2020 | source = "registry+https://github.com/rust-lang/crates.io-index" 2021 | checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" 2022 | dependencies = [ 2023 | "rand_core 0.5.1", 2024 | ] 2025 | 2026 | [[package]] 2027 | name = "rc-box" 2028 | version = "1.2.0" 2029 | source = "registry+https://github.com/rust-lang/crates.io-index" 2030 | checksum = "e0690759eabf094030c2cdabc25ade1395bac02210d920d655053c1d49583fd8" 2031 | dependencies = [ 2032 | "erasable", 2033 | ] 2034 | 2035 | [[package]] 2036 | name = "redox_syscall" 2037 | version = "0.2.13" 2038 | source = "registry+https://github.com/rust-lang/crates.io-index" 2039 | checksum = "62f25bc4c7e55e0b0b7a1d43fb893f4fa1361d0abe38b9ce4f323c2adfe6ef42" 2040 | dependencies = [ 2041 | "bitflags", 2042 | ] 2043 | 2044 | [[package]] 2045 | name = "regex" 2046 | version = "1.5.6" 2047 | source = "registry+https://github.com/rust-lang/crates.io-index" 2048 | checksum = "d83f127d94bdbcda4c8cc2e50f6f84f4b611f69c902699ca385a39c3a75f9ff1" 2049 | dependencies = [ 2050 | "aho-corasick", 2051 | "memchr", 2052 | "regex-syntax", 2053 | ] 2054 | 2055 | [[package]] 2056 | name = "regex-syntax" 2057 | version = "0.6.26" 2058 | source = "registry+https://github.com/rust-lang/crates.io-index" 2059 | checksum = "49b3de9ec5dc0a3417da371aab17d729997c15010e7fd24ff707773a33bddb64" 2060 | 2061 | [[package]] 2062 | name = "remove_dir_all" 2063 | version = "0.5.3" 2064 | source = "registry+https://github.com/rust-lang/crates.io-index" 2065 | checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" 2066 | dependencies = [ 2067 | "winapi", 2068 | ] 2069 | 2070 | [[package]] 2071 | name = "reqwest" 2072 | version = "0.11.11" 2073 | source = "registry+https://github.com/rust-lang/crates.io-index" 2074 | checksum = "b75aa69a3f06bbcc66ede33af2af253c6f7a86b1ca0033f60c580a27074fbf92" 2075 | dependencies = [ 2076 | "base64", 2077 | "bytes", 2078 | "encoding_rs", 2079 | "futures-core", 2080 | "futures-util", 2081 | "h2", 2082 | "http", 2083 | "http-body", 2084 | "hyper", 2085 | "hyper-tls", 2086 | "ipnet", 2087 | "js-sys", 2088 | "lazy_static", 2089 | "log", 2090 | "mime", 2091 | "mime_guess", 2092 | "native-tls", 2093 | "percent-encoding", 2094 | "pin-project-lite", 2095 | "serde", 2096 | "serde_json", 2097 | "serde_urlencoded", 2098 | "tokio", 2099 | "tokio-native-tls", 2100 | "tokio-util 0.7.3", 2101 | "tower-service", 2102 | "url", 2103 | "wasm-bindgen", 2104 | "wasm-bindgen-futures", 2105 | "web-sys", 2106 | "winreg", 2107 | ] 2108 | 2109 | [[package]] 2110 | name = "roff" 2111 | version = "0.2.1" 2112 | source = "registry+https://github.com/rust-lang/crates.io-index" 2113 | checksum = "b833d8d034ea094b1ea68aa6d5c740e0d04bad9d16568d08ba6f76823a114316" 2114 | 2115 | [[package]] 2116 | name = "ruma" 2117 | version = "0.6.4" 2118 | source = "registry+https://github.com/rust-lang/crates.io-index" 2119 | checksum = "6602cb2ef70629013d1bfade5aeb775d971a5d87f008dd6a8c99566235fa1933" 2120 | dependencies = [ 2121 | "assign", 2122 | "js_int", 2123 | "ruma-client-api", 2124 | "ruma-common", 2125 | "ruma-federation-api", 2126 | "ruma-signatures", 2127 | "ruma-state-res", 2128 | ] 2129 | 2130 | [[package]] 2131 | name = "ruma-client-api" 2132 | version = "0.14.1" 2133 | source = "registry+https://github.com/rust-lang/crates.io-index" 2134 | checksum = "4339827423dbb3b4f86cb191a38621f12daef73cb304ffd4e050c9ee553ecbd6" 2135 | dependencies = [ 2136 | "assign", 2137 | "bytes", 2138 | "http", 2139 | "js_int", 2140 | "maplit", 2141 | "percent-encoding", 2142 | "ruma-common", 2143 | "serde", 2144 | "serde_json", 2145 | ] 2146 | 2147 | [[package]] 2148 | name = "ruma-common" 2149 | version = "0.9.3" 2150 | source = "registry+https://github.com/rust-lang/crates.io-index" 2151 | checksum = "8ec5360fd23ff56310f9eb571927614feeecceba91fe2d4937f031c236c0e86e" 2152 | dependencies = [ 2153 | "base64", 2154 | "bytes", 2155 | "form_urlencoded", 2156 | "getrandom 0.2.7", 2157 | "http", 2158 | "indexmap", 2159 | "itoa", 2160 | "js-sys", 2161 | "js_int", 2162 | "js_option", 2163 | "percent-encoding", 2164 | "pulldown-cmark", 2165 | "rand 0.8.5", 2166 | "ruma-identifiers-validation", 2167 | "ruma-macros", 2168 | "serde", 2169 | "serde_json", 2170 | "thiserror", 2171 | "tracing", 2172 | "url", 2173 | "uuid 1.1.2", 2174 | "wildmatch", 2175 | ] 2176 | 2177 | [[package]] 2178 | name = "ruma-federation-api" 2179 | version = "0.5.0" 2180 | source = "registry+https://github.com/rust-lang/crates.io-index" 2181 | checksum = "caa53fa447e3ef04889f3f804d49a27045da79e8055f6fd4257c21be6f65edca" 2182 | dependencies = [ 2183 | "js_int", 2184 | "ruma-common", 2185 | "serde", 2186 | "serde_json", 2187 | ] 2188 | 2189 | [[package]] 2190 | name = "ruma-identifiers-validation" 2191 | version = "0.8.1" 2192 | source = "registry+https://github.com/rust-lang/crates.io-index" 2193 | checksum = "74c3b1d01b5ddd8746f25d5971bc1cac5d7f1f455de839a2f817b9e04953a139" 2194 | dependencies = [ 2195 | "thiserror", 2196 | ] 2197 | 2198 | [[package]] 2199 | name = "ruma-macros" 2200 | version = "0.9.3" 2201 | source = "registry+https://github.com/rust-lang/crates.io-index" 2202 | checksum = "ee1a4faf04110071ce7ca438ad0763bdaa5514395593596320c0ca0936519656" 2203 | dependencies = [ 2204 | "proc-macro-crate", 2205 | "proc-macro2", 2206 | "quote", 2207 | "ruma-identifiers-validation", 2208 | "syn", 2209 | ] 2210 | 2211 | [[package]] 2212 | name = "ruma-signatures" 2213 | version = "0.11.0" 2214 | source = "registry+https://github.com/rust-lang/crates.io-index" 2215 | checksum = "8c747652a4f8c5fd83a703f183c73738b2ed8565a740636c045e064ae77f9b51" 2216 | dependencies = [ 2217 | "base64", 2218 | "ed25519-dalek", 2219 | "pkcs8", 2220 | "rand 0.7.3", 2221 | "ruma-common", 2222 | "serde_json", 2223 | "sha2 0.9.9", 2224 | "thiserror", 2225 | "tracing", 2226 | ] 2227 | 2228 | [[package]] 2229 | name = "ruma-state-res" 2230 | version = "0.7.0" 2231 | source = "registry+https://github.com/rust-lang/crates.io-index" 2232 | checksum = "c9b742ca53b37ec3b3cfba1f27bf64be775550aeadf971deb05e4b93cdd27fbe" 2233 | dependencies = [ 2234 | "itertools 0.10.3", 2235 | "js_int", 2236 | "ruma-common", 2237 | "serde", 2238 | "serde_json", 2239 | "thiserror", 2240 | "tracing", 2241 | ] 2242 | 2243 | [[package]] 2244 | name = "rustc_version" 2245 | version = "0.4.0" 2246 | source = "registry+https://github.com/rust-lang/crates.io-index" 2247 | checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" 2248 | dependencies = [ 2249 | "semver", 2250 | ] 2251 | 2252 | [[package]] 2253 | name = "ryu" 2254 | version = "1.0.10" 2255 | source = "registry+https://github.com/rust-lang/crates.io-index" 2256 | checksum = "f3f6f92acf49d1b98f7a81226834412ada05458b7364277387724a237f062695" 2257 | 2258 | [[package]] 2259 | name = "safemem" 2260 | version = "0.3.3" 2261 | source = "registry+https://github.com/rust-lang/crates.io-index" 2262 | checksum = "ef703b7cb59335eae2eb93ceb664c0eb7ea6bf567079d843e09420219668e072" 2263 | 2264 | [[package]] 2265 | name = "schannel" 2266 | version = "0.1.20" 2267 | source = "registry+https://github.com/rust-lang/crates.io-index" 2268 | checksum = "88d6731146462ea25d9244b2ed5fd1d716d25c52e4d54aa4fb0f3c4e9854dbe2" 2269 | dependencies = [ 2270 | "lazy_static", 2271 | "windows-sys", 2272 | ] 2273 | 2274 | [[package]] 2275 | name = "scoped-tls" 2276 | version = "1.0.0" 2277 | source = "registry+https://github.com/rust-lang/crates.io-index" 2278 | checksum = "ea6a9290e3c9cf0f18145ef7ffa62d68ee0bf5fcd651017e586dc7fd5da448c2" 2279 | 2280 | [[package]] 2281 | name = "scopeguard" 2282 | version = "1.1.0" 2283 | source = "registry+https://github.com/rust-lang/crates.io-index" 2284 | checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" 2285 | 2286 | [[package]] 2287 | name = "security-framework" 2288 | version = "2.6.1" 2289 | source = "registry+https://github.com/rust-lang/crates.io-index" 2290 | checksum = "2dc14f172faf8a0194a3aded622712b0de276821addc574fa54fc0a1167e10dc" 2291 | dependencies = [ 2292 | "bitflags", 2293 | "core-foundation", 2294 | "core-foundation-sys", 2295 | "libc", 2296 | "security-framework-sys", 2297 | ] 2298 | 2299 | [[package]] 2300 | name = "security-framework-sys" 2301 | version = "2.6.1" 2302 | source = "registry+https://github.com/rust-lang/crates.io-index" 2303 | checksum = "0160a13a177a45bfb43ce71c01580998474f556ad854dcbca936dd2841a5c556" 2304 | dependencies = [ 2305 | "core-foundation-sys", 2306 | "libc", 2307 | ] 2308 | 2309 | [[package]] 2310 | name = "semver" 2311 | version = "1.0.10" 2312 | source = "registry+https://github.com/rust-lang/crates.io-index" 2313 | checksum = "a41d061efea015927ac527063765e73601444cdc344ba855bc7bd44578b25e1c" 2314 | 2315 | [[package]] 2316 | name = "serde" 2317 | version = "1.0.137" 2318 | source = "registry+https://github.com/rust-lang/crates.io-index" 2319 | checksum = "61ea8d54c77f8315140a05f4c7237403bf38b72704d031543aa1d16abbf517d1" 2320 | dependencies = [ 2321 | "serde_derive", 2322 | ] 2323 | 2324 | [[package]] 2325 | name = "serde_bytes" 2326 | version = "0.11.6" 2327 | source = "registry+https://github.com/rust-lang/crates.io-index" 2328 | checksum = "212e73464ebcde48d723aa02eb270ba62eff38a9b732df31f33f1b4e145f3a54" 2329 | dependencies = [ 2330 | "serde", 2331 | ] 2332 | 2333 | [[package]] 2334 | name = "serde_derive" 2335 | version = "1.0.137" 2336 | source = "registry+https://github.com/rust-lang/crates.io-index" 2337 | checksum = "1f26faba0c3959972377d3b2d306ee9f71faee9714294e41bb777f83f88578be" 2338 | dependencies = [ 2339 | "proc-macro2", 2340 | "quote", 2341 | "syn", 2342 | ] 2343 | 2344 | [[package]] 2345 | name = "serde_json" 2346 | version = "1.0.81" 2347 | source = "registry+https://github.com/rust-lang/crates.io-index" 2348 | checksum = "9b7ce2b32a1aed03c558dc61a5cd328f15aff2dbc17daad8fb8af04d2100e15c" 2349 | dependencies = [ 2350 | "itoa", 2351 | "ryu", 2352 | "serde", 2353 | ] 2354 | 2355 | [[package]] 2356 | name = "serde_urlencoded" 2357 | version = "0.7.1" 2358 | source = "registry+https://github.com/rust-lang/crates.io-index" 2359 | checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" 2360 | dependencies = [ 2361 | "form_urlencoded", 2362 | "itoa", 2363 | "ryu", 2364 | "serde", 2365 | ] 2366 | 2367 | [[package]] 2368 | name = "serde_with_macros" 2369 | version = "1.5.2" 2370 | source = "registry+https://github.com/rust-lang/crates.io-index" 2371 | checksum = "e182d6ec6f05393cc0e5ed1bf81ad6db3a8feedf8ee515ecdd369809bcce8082" 2372 | dependencies = [ 2373 | "darling", 2374 | "proc-macro2", 2375 | "quote", 2376 | "syn", 2377 | ] 2378 | 2379 | [[package]] 2380 | name = "sha-1" 2381 | version = "0.8.2" 2382 | source = "registry+https://github.com/rust-lang/crates.io-index" 2383 | checksum = "f7d94d0bede923b3cea61f3f1ff57ff8cdfd77b400fb8f9998949e0cf04163df" 2384 | dependencies = [ 2385 | "block-buffer 0.7.3", 2386 | "digest 0.8.1", 2387 | "fake-simd", 2388 | "opaque-debug 0.2.3", 2389 | ] 2390 | 2391 | [[package]] 2392 | name = "sha-1" 2393 | version = "0.9.8" 2394 | source = "registry+https://github.com/rust-lang/crates.io-index" 2395 | checksum = "99cd6713db3cf16b6c84e06321e049a9b9f699826e16096d23bbcc44d15d51a6" 2396 | dependencies = [ 2397 | "block-buffer 0.9.0", 2398 | "cfg-if", 2399 | "cpufeatures", 2400 | "digest 0.9.0", 2401 | "opaque-debug 0.3.0", 2402 | ] 2403 | 2404 | [[package]] 2405 | name = "sha-1" 2406 | version = "0.10.0" 2407 | source = "registry+https://github.com/rust-lang/crates.io-index" 2408 | checksum = "028f48d513f9678cda28f6e4064755b3fbb2af6acd672f2c209b62323f7aea0f" 2409 | dependencies = [ 2410 | "cfg-if", 2411 | "cpufeatures", 2412 | "digest 0.10.3", 2413 | ] 2414 | 2415 | [[package]] 2416 | name = "sha2" 2417 | version = "0.9.9" 2418 | source = "registry+https://github.com/rust-lang/crates.io-index" 2419 | checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" 2420 | dependencies = [ 2421 | "block-buffer 0.9.0", 2422 | "cfg-if", 2423 | "cpufeatures", 2424 | "digest 0.9.0", 2425 | "opaque-debug 0.3.0", 2426 | ] 2427 | 2428 | [[package]] 2429 | name = "sha2" 2430 | version = "0.10.2" 2431 | source = "registry+https://github.com/rust-lang/crates.io-index" 2432 | checksum = "55deaec60f81eefe3cce0dc50bda92d6d8e88f2a27df7c5033b42afeb1ed2676" 2433 | dependencies = [ 2434 | "cfg-if", 2435 | "cpufeatures", 2436 | "digest 0.10.3", 2437 | ] 2438 | 2439 | [[package]] 2440 | name = "signal-hook-registry" 2441 | version = "1.4.0" 2442 | source = "registry+https://github.com/rust-lang/crates.io-index" 2443 | checksum = "e51e73328dc4ac0c7ccbda3a494dfa03df1de2f46018127f60c693f2648455b0" 2444 | dependencies = [ 2445 | "libc", 2446 | ] 2447 | 2448 | [[package]] 2449 | name = "signature" 2450 | version = "1.5.0" 2451 | source = "registry+https://github.com/rust-lang/crates.io-index" 2452 | checksum = "f054c6c1a6e95179d6f23ed974060dcefb2d9388bb7256900badad682c499de4" 2453 | 2454 | [[package]] 2455 | name = "slab" 2456 | version = "0.4.6" 2457 | source = "registry+https://github.com/rust-lang/crates.io-index" 2458 | checksum = "eb703cfe953bccee95685111adeedb76fabe4e97549a58d16f03ea7b9367bb32" 2459 | 2460 | [[package]] 2461 | name = "sled" 2462 | version = "0.34.7" 2463 | source = "registry+https://github.com/rust-lang/crates.io-index" 2464 | checksum = "7f96b4737c2ce5987354855aed3797279def4ebf734436c6aa4552cf8e169935" 2465 | dependencies = [ 2466 | "crc32fast", 2467 | "crossbeam-epoch", 2468 | "crossbeam-utils", 2469 | "fs2", 2470 | "fxhash", 2471 | "libc", 2472 | "log", 2473 | "parking_lot", 2474 | ] 2475 | 2476 | [[package]] 2477 | name = "smallvec" 2478 | version = "1.8.1" 2479 | source = "registry+https://github.com/rust-lang/crates.io-index" 2480 | checksum = "cc88c725d61fc6c3132893370cac4a0200e3fedf5da8331c570664b1987f5ca2" 2481 | 2482 | [[package]] 2483 | name = "socket2" 2484 | version = "0.4.4" 2485 | source = "registry+https://github.com/rust-lang/crates.io-index" 2486 | checksum = "66d72b759436ae32898a2af0a14218dbf55efde3feeb170eb623637db85ee1e0" 2487 | dependencies = [ 2488 | "libc", 2489 | "winapi", 2490 | ] 2491 | 2492 | [[package]] 2493 | name = "spki" 2494 | version = "0.4.1" 2495 | source = "registry+https://github.com/rust-lang/crates.io-index" 2496 | checksum = "5c01a0c15da1b0b0e1494112e7af814a678fec9bd157881b49beac661e9b6f32" 2497 | dependencies = [ 2498 | "der 0.4.5", 2499 | ] 2500 | 2501 | [[package]] 2502 | name = "spki" 2503 | version = "0.5.4" 2504 | source = "registry+https://github.com/rust-lang/crates.io-index" 2505 | checksum = "44d01ac02a6ccf3e07db148d2be087da624fea0221a16152ed01f0496a6b0a27" 2506 | dependencies = [ 2507 | "der 0.5.1", 2508 | ] 2509 | 2510 | [[package]] 2511 | name = "strsim" 2512 | version = "0.10.0" 2513 | source = "registry+https://github.com/rust-lang/crates.io-index" 2514 | checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" 2515 | 2516 | [[package]] 2517 | name = "subtle" 2518 | version = "2.4.1" 2519 | source = "registry+https://github.com/rust-lang/crates.io-index" 2520 | checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" 2521 | 2522 | [[package]] 2523 | name = "syn" 2524 | version = "1.0.98" 2525 | source = "registry+https://github.com/rust-lang/crates.io-index" 2526 | checksum = "c50aef8a904de4c23c788f104b7dddc7d6f79c647c7c8ce4cc8f73eb0ca773dd" 2527 | dependencies = [ 2528 | "proc-macro2", 2529 | "quote", 2530 | "unicode-ident", 2531 | ] 2532 | 2533 | [[package]] 2534 | name = "synstructure" 2535 | version = "0.12.6" 2536 | source = "registry+https://github.com/rust-lang/crates.io-index" 2537 | checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" 2538 | dependencies = [ 2539 | "proc-macro2", 2540 | "quote", 2541 | "syn", 2542 | "unicode-xid", 2543 | ] 2544 | 2545 | [[package]] 2546 | name = "take_mut" 2547 | version = "0.2.2" 2548 | source = "registry+https://github.com/rust-lang/crates.io-index" 2549 | checksum = "f764005d11ee5f36500a149ace24e00e3da98b0158b3e2d53a7495660d3f4d60" 2550 | 2551 | [[package]] 2552 | name = "takecell" 2553 | version = "0.1.1" 2554 | source = "registry+https://github.com/rust-lang/crates.io-index" 2555 | checksum = "20f34339676cdcab560c9a82300c4c2581f68b9369aedf0fae86f2ff9565ff3e" 2556 | 2557 | [[package]] 2558 | name = "teloxide" 2559 | version = "0.9.2" 2560 | source = "registry+https://github.com/rust-lang/crates.io-index" 2561 | checksum = "b30e69ea9f7aa110a028bdaa9965fac98270aadce592aa854822a4f04d3b197e" 2562 | dependencies = [ 2563 | "aquamarine", 2564 | "bytes", 2565 | "derive_more", 2566 | "dptree", 2567 | "futures", 2568 | "log", 2569 | "mime", 2570 | "pin-project", 2571 | "serde", 2572 | "serde_json", 2573 | "serde_with_macros", 2574 | "teloxide-core", 2575 | "thiserror", 2576 | "tokio", 2577 | "tokio-stream", 2578 | "tokio-util 0.6.10", 2579 | "url", 2580 | ] 2581 | 2582 | [[package]] 2583 | name = "teloxide-core" 2584 | version = "0.6.3" 2585 | source = "registry+https://github.com/rust-lang/crates.io-index" 2586 | checksum = "9288bbc64609c3572b2995f4bcaf6071a0348e117860e8e4f73e0c57aacba7d8" 2587 | dependencies = [ 2588 | "bitflags", 2589 | "bytes", 2590 | "chrono", 2591 | "derive_more", 2592 | "either", 2593 | "futures", 2594 | "log", 2595 | "mime", 2596 | "never", 2597 | "once_cell", 2598 | "pin-project", 2599 | "rc-box", 2600 | "reqwest", 2601 | "serde", 2602 | "serde_json", 2603 | "serde_with_macros", 2604 | "take_mut", 2605 | "takecell", 2606 | "thiserror", 2607 | "tokio", 2608 | "tokio-util 0.6.10", 2609 | "url", 2610 | "uuid 0.8.2", 2611 | ] 2612 | 2613 | [[package]] 2614 | name = "tempfile" 2615 | version = "3.3.0" 2616 | source = "registry+https://github.com/rust-lang/crates.io-index" 2617 | checksum = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4" 2618 | dependencies = [ 2619 | "cfg-if", 2620 | "fastrand", 2621 | "libc", 2622 | "redox_syscall", 2623 | "remove_dir_all", 2624 | "winapi", 2625 | ] 2626 | 2627 | [[package]] 2628 | name = "termcolor" 2629 | version = "1.1.3" 2630 | source = "registry+https://github.com/rust-lang/crates.io-index" 2631 | checksum = "bab24d30b911b2376f3a13cc2cd443142f0c81dda04c118693e35b3835757755" 2632 | dependencies = [ 2633 | "winapi-util", 2634 | ] 2635 | 2636 | [[package]] 2637 | name = "textwrap" 2638 | version = "0.15.0" 2639 | source = "registry+https://github.com/rust-lang/crates.io-index" 2640 | checksum = "b1141d4d61095b28419e22cb0bbf02755f5e54e0526f97f1e3d1d160e60885fb" 2641 | 2642 | [[package]] 2643 | name = "thiserror" 2644 | version = "1.0.31" 2645 | source = "registry+https://github.com/rust-lang/crates.io-index" 2646 | checksum = "bd829fe32373d27f76265620b5309d0340cb8550f523c1dda251d6298069069a" 2647 | dependencies = [ 2648 | "thiserror-impl", 2649 | ] 2650 | 2651 | [[package]] 2652 | name = "thiserror-impl" 2653 | version = "1.0.31" 2654 | source = "registry+https://github.com/rust-lang/crates.io-index" 2655 | checksum = "0396bc89e626244658bef819e22d0cc459e795a5ebe878e6ec336d1674a8d79a" 2656 | dependencies = [ 2657 | "proc-macro2", 2658 | "quote", 2659 | "syn", 2660 | ] 2661 | 2662 | [[package]] 2663 | name = "time" 2664 | version = "0.1.44" 2665 | source = "registry+https://github.com/rust-lang/crates.io-index" 2666 | checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255" 2667 | dependencies = [ 2668 | "libc", 2669 | "wasi 0.10.0+wasi-snapshot-preview1", 2670 | "winapi", 2671 | ] 2672 | 2673 | [[package]] 2674 | name = "tinyvec" 2675 | version = "1.6.0" 2676 | source = "registry+https://github.com/rust-lang/crates.io-index" 2677 | checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" 2678 | dependencies = [ 2679 | "tinyvec_macros", 2680 | ] 2681 | 2682 | [[package]] 2683 | name = "tinyvec_macros" 2684 | version = "0.1.0" 2685 | source = "registry+https://github.com/rust-lang/crates.io-index" 2686 | checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" 2687 | 2688 | [[package]] 2689 | name = "tokio" 2690 | version = "1.19.2" 2691 | source = "registry+https://github.com/rust-lang/crates.io-index" 2692 | checksum = "c51a52ed6686dd62c320f9b89299e9dfb46f730c7a48e635c19f21d116cb1439" 2693 | dependencies = [ 2694 | "bytes", 2695 | "libc", 2696 | "memchr", 2697 | "mio", 2698 | "num_cpus", 2699 | "once_cell", 2700 | "pin-project-lite", 2701 | "signal-hook-registry", 2702 | "socket2", 2703 | "tokio-macros", 2704 | "winapi", 2705 | ] 2706 | 2707 | [[package]] 2708 | name = "tokio-macros" 2709 | version = "1.8.0" 2710 | source = "registry+https://github.com/rust-lang/crates.io-index" 2711 | checksum = "9724f9a975fb987ef7a3cd9be0350edcbe130698af5b8f7a631e23d42d052484" 2712 | dependencies = [ 2713 | "proc-macro2", 2714 | "quote", 2715 | "syn", 2716 | ] 2717 | 2718 | [[package]] 2719 | name = "tokio-native-tls" 2720 | version = "0.3.0" 2721 | source = "registry+https://github.com/rust-lang/crates.io-index" 2722 | checksum = "f7d995660bd2b7f8c1568414c1126076c13fbb725c40112dc0120b78eb9b717b" 2723 | dependencies = [ 2724 | "native-tls", 2725 | "tokio", 2726 | ] 2727 | 2728 | [[package]] 2729 | name = "tokio-stream" 2730 | version = "0.1.9" 2731 | source = "registry+https://github.com/rust-lang/crates.io-index" 2732 | checksum = "df54d54117d6fdc4e4fea40fe1e4e566b3505700e148a6827e59b34b0d2600d9" 2733 | dependencies = [ 2734 | "futures-core", 2735 | "pin-project-lite", 2736 | "tokio", 2737 | ] 2738 | 2739 | [[package]] 2740 | name = "tokio-tungstenite" 2741 | version = "0.15.0" 2742 | source = "registry+https://github.com/rust-lang/crates.io-index" 2743 | checksum = "511de3f85caf1c98983545490c3d09685fa8eb634e57eec22bb4db271f46cbd8" 2744 | dependencies = [ 2745 | "futures-util", 2746 | "log", 2747 | "pin-project", 2748 | "tokio", 2749 | "tungstenite", 2750 | ] 2751 | 2752 | [[package]] 2753 | name = "tokio-util" 2754 | version = "0.6.10" 2755 | source = "registry+https://github.com/rust-lang/crates.io-index" 2756 | checksum = "36943ee01a6d67977dd3f84a5a1d2efeb4ada3a1ae771cadfaa535d9d9fc6507" 2757 | dependencies = [ 2758 | "bytes", 2759 | "futures-core", 2760 | "futures-sink", 2761 | "log", 2762 | "pin-project-lite", 2763 | "tokio", 2764 | ] 2765 | 2766 | [[package]] 2767 | name = "tokio-util" 2768 | version = "0.7.3" 2769 | source = "registry+https://github.com/rust-lang/crates.io-index" 2770 | checksum = "cc463cd8deddc3770d20f9852143d50bf6094e640b485cb2e189a2099085ff45" 2771 | dependencies = [ 2772 | "bytes", 2773 | "futures-core", 2774 | "futures-sink", 2775 | "pin-project-lite", 2776 | "tokio", 2777 | "tracing", 2778 | ] 2779 | 2780 | [[package]] 2781 | name = "toml" 2782 | version = "0.5.9" 2783 | source = "registry+https://github.com/rust-lang/crates.io-index" 2784 | checksum = "8d82e1a7758622a465f8cee077614c73484dac5b836c02ff6a40d5d1010324d7" 2785 | dependencies = [ 2786 | "serde", 2787 | ] 2788 | 2789 | [[package]] 2790 | name = "tower-service" 2791 | version = "0.3.2" 2792 | source = "registry+https://github.com/rust-lang/crates.io-index" 2793 | checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" 2794 | 2795 | [[package]] 2796 | name = "tracing" 2797 | version = "0.1.35" 2798 | source = "registry+https://github.com/rust-lang/crates.io-index" 2799 | checksum = "a400e31aa60b9d44a52a8ee0343b5b18566b03a8321e0d321f695cf56e940160" 2800 | dependencies = [ 2801 | "cfg-if", 2802 | "log", 2803 | "pin-project-lite", 2804 | "tracing-attributes", 2805 | "tracing-core", 2806 | ] 2807 | 2808 | [[package]] 2809 | name = "tracing-attributes" 2810 | version = "0.1.21" 2811 | source = "registry+https://github.com/rust-lang/crates.io-index" 2812 | checksum = "cc6b8ad3567499f98a1db7a752b07a7c8c7c7c34c332ec00effb2b0027974b7c" 2813 | dependencies = [ 2814 | "proc-macro2", 2815 | "quote", 2816 | "syn", 2817 | ] 2818 | 2819 | [[package]] 2820 | name = "tracing-core" 2821 | version = "0.1.28" 2822 | source = "registry+https://github.com/rust-lang/crates.io-index" 2823 | checksum = "7b7358be39f2f274f322d2aaed611acc57f382e8eb1e5b48cb9ae30933495ce7" 2824 | dependencies = [ 2825 | "once_cell", 2826 | ] 2827 | 2828 | [[package]] 2829 | name = "try-lock" 2830 | version = "0.2.3" 2831 | source = "registry+https://github.com/rust-lang/crates.io-index" 2832 | checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" 2833 | 2834 | [[package]] 2835 | name = "tungstenite" 2836 | version = "0.14.0" 2837 | source = "registry+https://github.com/rust-lang/crates.io-index" 2838 | checksum = "a0b2d8558abd2e276b0a8df5c05a2ec762609344191e5fd23e292c910e9165b5" 2839 | dependencies = [ 2840 | "base64", 2841 | "byteorder", 2842 | "bytes", 2843 | "http", 2844 | "httparse", 2845 | "log", 2846 | "rand 0.8.5", 2847 | "sha-1 0.9.8", 2848 | "thiserror", 2849 | "url", 2850 | "utf-8", 2851 | ] 2852 | 2853 | [[package]] 2854 | name = "twoway" 2855 | version = "0.1.8" 2856 | source = "registry+https://github.com/rust-lang/crates.io-index" 2857 | checksum = "59b11b2b5241ba34be09c3cc85a36e56e48f9888862e19cedf23336d35316ed1" 2858 | dependencies = [ 2859 | "memchr", 2860 | ] 2861 | 2862 | [[package]] 2863 | name = "typenum" 2864 | version = "1.15.0" 2865 | source = "registry+https://github.com/rust-lang/crates.io-index" 2866 | checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" 2867 | 2868 | [[package]] 2869 | name = "ucd-trie" 2870 | version = "0.1.3" 2871 | source = "registry+https://github.com/rust-lang/crates.io-index" 2872 | checksum = "56dee185309b50d1f11bfedef0fe6d036842e3fb77413abef29f8f8d1c5d4c1c" 2873 | 2874 | [[package]] 2875 | name = "unicase" 2876 | version = "2.6.0" 2877 | source = "registry+https://github.com/rust-lang/crates.io-index" 2878 | checksum = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6" 2879 | dependencies = [ 2880 | "version_check", 2881 | ] 2882 | 2883 | [[package]] 2884 | name = "unicode-bidi" 2885 | version = "0.3.8" 2886 | source = "registry+https://github.com/rust-lang/crates.io-index" 2887 | checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992" 2888 | 2889 | [[package]] 2890 | name = "unicode-ident" 2891 | version = "1.0.1" 2892 | source = "registry+https://github.com/rust-lang/crates.io-index" 2893 | checksum = "5bd2fe26506023ed7b5e1e315add59d6f584c621d037f9368fea9cfb988f368c" 2894 | 2895 | [[package]] 2896 | name = "unicode-normalization" 2897 | version = "0.1.20" 2898 | source = "registry+https://github.com/rust-lang/crates.io-index" 2899 | checksum = "81dee68f85cab8cf68dec42158baf3a79a1cdc065a8b103025965d6ccb7f6cbd" 2900 | dependencies = [ 2901 | "tinyvec", 2902 | ] 2903 | 2904 | [[package]] 2905 | name = "unicode-xid" 2906 | version = "0.2.3" 2907 | source = "registry+https://github.com/rust-lang/crates.io-index" 2908 | checksum = "957e51f3646910546462e67d5f7599b9e4fb8acdd304b087a6494730f9eebf04" 2909 | 2910 | [[package]] 2911 | name = "universal-hash" 2912 | version = "0.4.1" 2913 | source = "registry+https://github.com/rust-lang/crates.io-index" 2914 | checksum = "9f214e8f697e925001e66ec2c6e37a4ef93f0f78c2eed7814394e10c62025b05" 2915 | dependencies = [ 2916 | "generic-array 0.14.5", 2917 | "subtle", 2918 | ] 2919 | 2920 | [[package]] 2921 | name = "url" 2922 | version = "2.2.2" 2923 | source = "registry+https://github.com/rust-lang/crates.io-index" 2924 | checksum = "a507c383b2d33b5fc35d1861e77e6b383d158b2da5e14fe51b83dfedf6fd578c" 2925 | dependencies = [ 2926 | "form_urlencoded", 2927 | "idna", 2928 | "matches", 2929 | "percent-encoding", 2930 | "serde", 2931 | ] 2932 | 2933 | [[package]] 2934 | name = "utf-8" 2935 | version = "0.7.6" 2936 | source = "registry+https://github.com/rust-lang/crates.io-index" 2937 | checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" 2938 | 2939 | [[package]] 2940 | name = "uuid" 2941 | version = "0.8.2" 2942 | source = "registry+https://github.com/rust-lang/crates.io-index" 2943 | checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" 2944 | dependencies = [ 2945 | "getrandom 0.2.7", 2946 | ] 2947 | 2948 | [[package]] 2949 | name = "uuid" 2950 | version = "1.1.2" 2951 | source = "registry+https://github.com/rust-lang/crates.io-index" 2952 | checksum = "dd6469f4314d5f1ffec476e05f17cc9a78bc7a27a6a857842170bdf8d6f98d2f" 2953 | dependencies = [ 2954 | "getrandom 0.2.7", 2955 | ] 2956 | 2957 | [[package]] 2958 | name = "vcpkg" 2959 | version = "0.2.15" 2960 | source = "registry+https://github.com/rust-lang/crates.io-index" 2961 | checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" 2962 | 2963 | [[package]] 2964 | name = "version_check" 2965 | version = "0.9.4" 2966 | source = "registry+https://github.com/rust-lang/crates.io-index" 2967 | checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" 2968 | 2969 | [[package]] 2970 | name = "vodozemac" 2971 | version = "0.2.0" 2972 | source = "registry+https://github.com/rust-lang/crates.io-index" 2973 | checksum = "3a42265bb5d65ba2807e477741ca3147a58d25ee5463860491fe0c24f4d21c1a" 2974 | dependencies = [ 2975 | "aes", 2976 | "arrayvec", 2977 | "base64", 2978 | "cbc", 2979 | "ed25519-dalek", 2980 | "hkdf", 2981 | "hmac", 2982 | "pkcs7", 2983 | "prost", 2984 | "rand 0.7.3", 2985 | "serde", 2986 | "serde_json", 2987 | "sha2 0.10.2", 2988 | "thiserror", 2989 | "x25519-dalek", 2990 | "zeroize", 2991 | ] 2992 | 2993 | [[package]] 2994 | name = "want" 2995 | version = "0.3.0" 2996 | source = "registry+https://github.com/rust-lang/crates.io-index" 2997 | checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" 2998 | dependencies = [ 2999 | "log", 3000 | "try-lock", 3001 | ] 3002 | 3003 | [[package]] 3004 | name = "warp" 3005 | version = "0.3.2" 3006 | source = "registry+https://github.com/rust-lang/crates.io-index" 3007 | checksum = "3cef4e1e9114a4b7f1ac799f16ce71c14de5778500c5450ec6b7b920c55b587e" 3008 | dependencies = [ 3009 | "bytes", 3010 | "futures-channel", 3011 | "futures-util", 3012 | "headers", 3013 | "http", 3014 | "hyper", 3015 | "log", 3016 | "mime", 3017 | "mime_guess", 3018 | "multipart", 3019 | "percent-encoding", 3020 | "pin-project", 3021 | "scoped-tls", 3022 | "serde", 3023 | "serde_json", 3024 | "serde_urlencoded", 3025 | "tokio", 3026 | "tokio-stream", 3027 | "tokio-tungstenite", 3028 | "tokio-util 0.6.10", 3029 | "tower-service", 3030 | "tracing", 3031 | ] 3032 | 3033 | [[package]] 3034 | name = "wasi" 3035 | version = "0.9.0+wasi-snapshot-preview1" 3036 | source = "registry+https://github.com/rust-lang/crates.io-index" 3037 | checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" 3038 | 3039 | [[package]] 3040 | name = "wasi" 3041 | version = "0.10.0+wasi-snapshot-preview1" 3042 | source = "registry+https://github.com/rust-lang/crates.io-index" 3043 | checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" 3044 | 3045 | [[package]] 3046 | name = "wasi" 3047 | version = "0.11.0+wasi-snapshot-preview1" 3048 | source = "registry+https://github.com/rust-lang/crates.io-index" 3049 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 3050 | 3051 | [[package]] 3052 | name = "wasm-bindgen" 3053 | version = "0.2.81" 3054 | source = "registry+https://github.com/rust-lang/crates.io-index" 3055 | checksum = "7c53b543413a17a202f4be280a7e5c62a1c69345f5de525ee64f8cfdbc954994" 3056 | dependencies = [ 3057 | "cfg-if", 3058 | "serde", 3059 | "serde_json", 3060 | "wasm-bindgen-macro", 3061 | ] 3062 | 3063 | [[package]] 3064 | name = "wasm-bindgen-backend" 3065 | version = "0.2.81" 3066 | source = "registry+https://github.com/rust-lang/crates.io-index" 3067 | checksum = "5491a68ab4500fa6b4d726bd67408630c3dbe9c4fe7bda16d5c82a1fd8c7340a" 3068 | dependencies = [ 3069 | "bumpalo", 3070 | "lazy_static", 3071 | "log", 3072 | "proc-macro2", 3073 | "quote", 3074 | "syn", 3075 | "wasm-bindgen-shared", 3076 | ] 3077 | 3078 | [[package]] 3079 | name = "wasm-bindgen-futures" 3080 | version = "0.4.31" 3081 | source = "registry+https://github.com/rust-lang/crates.io-index" 3082 | checksum = "de9a9cec1733468a8c657e57fa2413d2ae2c0129b95e87c5b72b8ace4d13f31f" 3083 | dependencies = [ 3084 | "cfg-if", 3085 | "js-sys", 3086 | "wasm-bindgen", 3087 | "web-sys", 3088 | ] 3089 | 3090 | [[package]] 3091 | name = "wasm-bindgen-macro" 3092 | version = "0.2.81" 3093 | source = "registry+https://github.com/rust-lang/crates.io-index" 3094 | checksum = "c441e177922bc58f1e12c022624b6216378e5febc2f0533e41ba443d505b80aa" 3095 | dependencies = [ 3096 | "quote", 3097 | "wasm-bindgen-macro-support", 3098 | ] 3099 | 3100 | [[package]] 3101 | name = "wasm-bindgen-macro-support" 3102 | version = "0.2.81" 3103 | source = "registry+https://github.com/rust-lang/crates.io-index" 3104 | checksum = "7d94ac45fcf608c1f45ef53e748d35660f168490c10b23704c7779ab8f5c3048" 3105 | dependencies = [ 3106 | "proc-macro2", 3107 | "quote", 3108 | "syn", 3109 | "wasm-bindgen-backend", 3110 | "wasm-bindgen-shared", 3111 | ] 3112 | 3113 | [[package]] 3114 | name = "wasm-bindgen-shared" 3115 | version = "0.2.81" 3116 | source = "registry+https://github.com/rust-lang/crates.io-index" 3117 | checksum = "6a89911bd99e5f3659ec4acf9c4d93b0a90fe4a2a11f15328472058edc5261be" 3118 | 3119 | [[package]] 3120 | name = "wasm-timer" 3121 | version = "0.2.5" 3122 | source = "registry+https://github.com/rust-lang/crates.io-index" 3123 | checksum = "be0ecb0db480561e9a7642b5d3e4187c128914e58aa84330b9493e3eb68c5e7f" 3124 | dependencies = [ 3125 | "futures", 3126 | "js-sys", 3127 | "parking_lot", 3128 | "pin-utils", 3129 | "wasm-bindgen", 3130 | "wasm-bindgen-futures", 3131 | "web-sys", 3132 | ] 3133 | 3134 | [[package]] 3135 | name = "web-sys" 3136 | version = "0.3.58" 3137 | source = "registry+https://github.com/rust-lang/crates.io-index" 3138 | checksum = "2fed94beee57daf8dd7d51f2b15dc2bcde92d7a72304cdf662a4371008b71b90" 3139 | dependencies = [ 3140 | "js-sys", 3141 | "wasm-bindgen", 3142 | ] 3143 | 3144 | [[package]] 3145 | name = "wildmatch" 3146 | version = "2.1.0" 3147 | source = "registry+https://github.com/rust-lang/crates.io-index" 3148 | checksum = "d6c48bd20df7e4ced539c12f570f937c6b4884928a87fee70a479d72f031d4e0" 3149 | 3150 | [[package]] 3151 | name = "winapi" 3152 | version = "0.3.9" 3153 | source = "registry+https://github.com/rust-lang/crates.io-index" 3154 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 3155 | dependencies = [ 3156 | "winapi-i686-pc-windows-gnu", 3157 | "winapi-x86_64-pc-windows-gnu", 3158 | ] 3159 | 3160 | [[package]] 3161 | name = "winapi-i686-pc-windows-gnu" 3162 | version = "0.4.0" 3163 | source = "registry+https://github.com/rust-lang/crates.io-index" 3164 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 3165 | 3166 | [[package]] 3167 | name = "winapi-util" 3168 | version = "0.1.5" 3169 | source = "registry+https://github.com/rust-lang/crates.io-index" 3170 | checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" 3171 | dependencies = [ 3172 | "winapi", 3173 | ] 3174 | 3175 | [[package]] 3176 | name = "winapi-x86_64-pc-windows-gnu" 3177 | version = "0.4.0" 3178 | source = "registry+https://github.com/rust-lang/crates.io-index" 3179 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 3180 | 3181 | [[package]] 3182 | name = "windows-sys" 3183 | version = "0.36.1" 3184 | source = "registry+https://github.com/rust-lang/crates.io-index" 3185 | checksum = "ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2" 3186 | dependencies = [ 3187 | "windows_aarch64_msvc", 3188 | "windows_i686_gnu", 3189 | "windows_i686_msvc", 3190 | "windows_x86_64_gnu", 3191 | "windows_x86_64_msvc", 3192 | ] 3193 | 3194 | [[package]] 3195 | name = "windows_aarch64_msvc" 3196 | version = "0.36.1" 3197 | source = "registry+https://github.com/rust-lang/crates.io-index" 3198 | checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47" 3199 | 3200 | [[package]] 3201 | name = "windows_i686_gnu" 3202 | version = "0.36.1" 3203 | source = "registry+https://github.com/rust-lang/crates.io-index" 3204 | checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6" 3205 | 3206 | [[package]] 3207 | name = "windows_i686_msvc" 3208 | version = "0.36.1" 3209 | source = "registry+https://github.com/rust-lang/crates.io-index" 3210 | checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024" 3211 | 3212 | [[package]] 3213 | name = "windows_x86_64_gnu" 3214 | version = "0.36.1" 3215 | source = "registry+https://github.com/rust-lang/crates.io-index" 3216 | checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1" 3217 | 3218 | [[package]] 3219 | name = "windows_x86_64_msvc" 3220 | version = "0.36.1" 3221 | source = "registry+https://github.com/rust-lang/crates.io-index" 3222 | checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680" 3223 | 3224 | [[package]] 3225 | name = "winreg" 3226 | version = "0.10.1" 3227 | source = "registry+https://github.com/rust-lang/crates.io-index" 3228 | checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" 3229 | dependencies = [ 3230 | "winapi", 3231 | ] 3232 | 3233 | [[package]] 3234 | name = "x25519-dalek" 3235 | version = "1.2.0" 3236 | source = "registry+https://github.com/rust-lang/crates.io-index" 3237 | checksum = "2392b6b94a576b4e2bf3c5b2757d63f10ada8020a2e4d08ac849ebcf6ea8e077" 3238 | dependencies = [ 3239 | "curve25519-dalek", 3240 | "rand_core 0.5.1", 3241 | "serde", 3242 | "zeroize", 3243 | ] 3244 | 3245 | [[package]] 3246 | name = "zeroize" 3247 | version = "1.3.0" 3248 | source = "registry+https://github.com/rust-lang/crates.io-index" 3249 | checksum = "4756f7db3f7b5574938c3eb1c117038b8e07f95ee6718c0efad4ac21508f1efd" 3250 | dependencies = [ 3251 | "zeroize_derive", 3252 | ] 3253 | 3254 | [[package]] 3255 | name = "zeroize_derive" 3256 | version = "1.3.2" 3257 | source = "registry+https://github.com/rust-lang/crates.io-index" 3258 | checksum = "3f8f187641dad4f680d25c4bfc4225b418165984179f26ca76ec4fb6441d3a17" 3259 | dependencies = [ 3260 | "proc-macro2", 3261 | "quote", 3262 | "syn", 3263 | "synstructure", 3264 | ] 3265 | --------------------------------------------------------------------------------