├── .dockerignore ├── .gitignore ├── contrib ├── roles │ ├── dendrite_sqlite │ │ └── tasks │ │ │ └── main.yml │ ├── synapse_postgres │ │ └── tasks │ │ │ └── main.yml │ ├── dendrite_postgres │ │ └── tasks │ │ │ └── main.yml │ ├── conduit │ │ ├── files │ │ │ ├── conduit.toml │ │ │ └── conduit.service │ │ └── tasks │ │ │ └── main.yml │ └── synapse_sqlite │ │ ├── files │ │ └── homeserver.override.yaml │ │ └── tasks │ │ └── main.yml ├── group_vars │ └── servers.yml ├── tasks │ ├── mkdirs.yml │ ├── build_rjbench_locally.yml │ ├── install_rjbench_remote.yml │ ├── install_docker.yml │ └── create_droplet.yml ├── ansible.cfg ├── generic_playbook.yml ├── README.md └── digitalocean_playbook.yml ├── Dockerfile ├── Cargo.toml ├── .github └── workflows │ └── docker.yml ├── README.md ├── src └── main.rs └── Cargo.lock /.dockerignore: -------------------------------------------------------------------------------- 1 | target 2 | Dockerfile 3 | *.md -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | **/*.rs.bk 3 | /contrib/out/* -------------------------------------------------------------------------------- /contrib/roles/dendrite_sqlite/tasks/main.yml: -------------------------------------------------------------------------------- 1 | # TODO: Hash out 2 | - name: Marker 3 | debug: 4 | msg: "Dendrite Sqlite hasn't been hashed out yet, NOOP" -------------------------------------------------------------------------------- /contrib/roles/synapse_postgres/tasks/main.yml: -------------------------------------------------------------------------------- 1 | # TODO: Hash out 2 | - name: Marker 3 | debug: 4 | msg: "Synapse Postgres hasn't been hashed out yet, NOOP" -------------------------------------------------------------------------------- /contrib/roles/dendrite_postgres/tasks/main.yml: -------------------------------------------------------------------------------- 1 | # TODO: Hash out 2 | - name: Marker 3 | debug: 4 | msg: "Dendrite Postgres hasn't been hashed out yet, NOOP" -------------------------------------------------------------------------------- /contrib/group_vars/servers.yml: -------------------------------------------------------------------------------- 1 | synapse_image: matrixdotorg/synapse:v1.29.0 2 | 3 | conduit_url: https://gitlab.com/famedly/conduit 4 | conduit_hash: 6538d91567abf64afe6c56f7726541e573138b48 -------------------------------------------------------------------------------- /contrib/tasks/mkdirs.yml: -------------------------------------------------------------------------------- 1 | - name: Create directories 2 | file: 3 | path: "/rjbench{{ item }}" 4 | state: directory 5 | mode: '0755' 6 | loop: 7 | - "" 8 | - /server 9 | - /app -------------------------------------------------------------------------------- /contrib/tasks/build_rjbench_locally.yml: -------------------------------------------------------------------------------- 1 | - name: Build rjbench 2 | debugger: on_failed 3 | shell: 4 | cmd: cargo build --release --locked 5 | chdir: "{{ playbook_dir }}/../" 6 | creates: "{{ playbook_dir }}/../target/release/rjbench" 7 | -------------------------------------------------------------------------------- /contrib/ansible.cfg: -------------------------------------------------------------------------------- 1 | [defaults] 2 | # too annoying and holds up the playbook each time, we're already creating the hosts, no need to hold up over them 3 | host_key_checking = False 4 | 5 | [ssh_connection] 6 | ssh_args = -C -o ControlMaster=auto -o ControlPersist=60s -o ServerAliveInterval=5 -o ServerAliveCountMax=4 7 | -------------------------------------------------------------------------------- /contrib/roles/conduit/files/conduit.toml: -------------------------------------------------------------------------------- 1 | [global] 2 | server_name = "localhost:8080" 3 | database_path = "/rjbench/server/conduit_db" 4 | port = 8080 5 | max_request_size = 20_000_000 # in bytes 6 | allow_registration = true 7 | allow_encryption = true 8 | allow_federation = false 9 | address = "127.0.0.1" 10 | -------------------------------------------------------------------------------- /contrib/roles/conduit/files/conduit.service: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Description=Conduit Matrix homeserver 3 | After=network.target 4 | 5 | [Service] 6 | Type=simple 7 | 8 | Environment="ROCKET_ENV=production" 9 | Environment="ROCKET_DATABASE_PATH=/rjbench/server" 10 | Environment="CONDUIT_CONFIG=/rjbench/server/conduit.toml" 11 | 12 | ExecStart=/root/.cargo/bin/conduit 13 | Restart=on-failure 14 | RestartSec=10 15 | StartLimitInterval=1m 16 | StartLimitBurst=5 17 | 18 | [Install] 19 | WantedBy=multi-user.target 20 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | # syntax=docker/dockerfile:1 2 | FROM docker.io/library/rust:slim as builder 3 | 4 | WORKDIR /app 5 | COPY Cargo.lock . 6 | COPY Cargo.toml . 7 | RUN mkdir .cargo 8 | RUN cargo vendor > .cargo/config 9 | 10 | RUN apt-get update && apt-get install -y libssl-dev pkg-config 11 | 12 | COPY ./src src 13 | RUN cargo build --release 14 | 15 | FROM docker.io/library/debian:buster 16 | 17 | 18 | RUN apt-get update && apt-get install -y libssl1.1 && rm -rf /var/lib/apt/lists/* 19 | 20 | WORKDIR /app 21 | COPY ./romeo_and_juliet.txt . 22 | COPY --from=builder /app/target/release/rjbench . 23 | ENTRYPOINT ["time", "/app/rjbench"] -------------------------------------------------------------------------------- /contrib/roles/synapse_sqlite/files/homeserver.override.yaml: -------------------------------------------------------------------------------- 1 | listeners: 2 | - port: 8008 3 | tls: false 4 | type: http 5 | bind_addresses: ['0.0.0.0'] 6 | 7 | resources: 8 | - names: [client] 9 | compress: false 10 | 11 | enable_registration: true 12 | 13 | rc_message: 14 | per_second: 9001 15 | burst_count: 9001 16 | 17 | rc_registration: 18 | per_second: 9001 19 | burst_count: 9001 20 | 21 | rc_login: 22 | address: 23 | per_second: 9001 24 | burst_count: 9001 25 | account: 26 | per_second: 9001 27 | burst_count: 9001 28 | failed_attempts: 29 | per_second: 9001 30 | burst_count: 9001 -------------------------------------------------------------------------------- /contrib/generic_playbook.yml: -------------------------------------------------------------------------------- 1 | # boilerplate :( 2 | - name: Run roles 3 | hosts: servers 4 | debugger: on_failed 5 | strategy: free 6 | tasks: 7 | - include_role: 8 | name: synapse_sqlite 9 | when: "'synapse-sqlite' in group_names" 10 | - include_role: 11 | name: synapse_postgres 12 | when: "'synapse-postgres' in group_names" 13 | - include_role: 14 | name: dendrite_sqlite 15 | when: "'dendrite-sqlite' in group_names" 16 | - include_role: 17 | name: dendrite_postgres 18 | when: "'dendrite-postgres' in group_names" 19 | - include_role: 20 | name: conduit 21 | when: "'conduit' in group_names" 22 | # boilerplate over :) -------------------------------------------------------------------------------- /contrib/README.md: -------------------------------------------------------------------------------- 1 | `digitalocean_playbook.yml` needs ansible-galaxy module `community.digitalocean`, general roles need `community.docker`, install with; 2 | 3 | ``` 4 | ansible-galaxy collection install community.docker community.digitalocean 5 | ``` 6 | 7 | Add a `DO_API_TOKEN` with a digitalocean `write` API token to your environment variables before running the playbook. 8 | 9 | Parameters can be adjusted in `group_vars/servers.yml` 10 | 11 | Note: Due to the way digitalocean charges you for droplets, 12 | each droplet will be minimally charged for one cent, 13 | meaning you'll have to pay `droplets * 0.01` cents for each run of the playbook, 14 | with however many droplets you have created and destroyed during the run. -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "rjbench" 3 | version = "0.1.0" 4 | authors = ["timokoesters "] 5 | edition = "2018" 6 | 7 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 8 | 9 | [dependencies] 10 | ruma = { git = "https://github.com/timokoesters/ruma", features = ["rand", "client-api", "unstable-pre-spec"], branch = "uiaafix" } 11 | ruma-client = { git = "https://github.com/timokoesters/ruma", features = ["hyper-native-tls", "client-api"], branch = "uiaafix" } 12 | url = "2.2.2" 13 | log = "0.4.14" 14 | pretty_env_logger = "0.4.0" 15 | tokio = { version = "1.8.2", features = ["rt-multi-thread", "macros"] } 16 | hyper = "0.14.11" 17 | futures = "0.3.15" 18 | 19 | [[bin]] 20 | name = "rjbench" 21 | path = "src/main.rs" -------------------------------------------------------------------------------- /contrib/roles/conduit/tasks/main.yml: -------------------------------------------------------------------------------- 1 | - name: Install cargo and build dependencies 2 | apt: 3 | name: 4 | - cargo 5 | - libssl-dev 6 | - pkg-config 7 | state: latest 8 | update_cache: yes 9 | 10 | - name: Build conduit-bin (this can take a while) 11 | debugger: on_failed 12 | shell: 13 | cmd: cargo install --git {{conduit_url}} --rev {{conduit_hash}} --locked 14 | creates: /root/.cargo/bin/conduit 15 | 16 | - name: Install service file 17 | copy: 18 | src: conduit.service 19 | dest: /etc/systemd/system 20 | 21 | - name: Install config file 22 | copy: 23 | src: conduit.toml 24 | dest: /rjbench/server 25 | 26 | - name: Start conduit service 27 | systemd: 28 | name: conduit 29 | state: started 30 | daemon_reload: yes 31 | -------------------------------------------------------------------------------- /contrib/tasks/install_rjbench_remote.yml: -------------------------------------------------------------------------------- 1 | - name: Copy to remote 2 | copy: 3 | src: "{{ playbook_dir }}/../{{ item }}" 4 | dest: /rjbench/app 5 | loop: 6 | - src 7 | - Cargo.toml 8 | - Cargo.lock 9 | - romeo_and_juliet.txt 10 | 11 | - name: Install cargo and build dependencies 12 | apt: 13 | name: 14 | - cargo 15 | - libssl-dev 16 | - pkg-config 17 | state: latest 18 | update_cache: yes 19 | 20 | - name: Build rjbench 21 | debugger: on_failed 22 | shell: 23 | cmd: cargo build --release --locked 24 | chdir: /rjbench/app 25 | creates: /rjbench/app/target/release/rjbench 26 | 27 | - name: Create symbolic link 28 | ansible.builtin.file: 29 | src: /rjbench/app/target/release/rjbench 30 | dest: /rjbench/app/rjbench 31 | state: link -------------------------------------------------------------------------------- /contrib/tasks/install_docker.yml: -------------------------------------------------------------------------------- 1 | - name: Install required system packages 2 | apt: 3 | name: 4 | [ 5 | "apt-transport-https", 6 | "ca-certificates", 7 | "curl", 8 | "software-properties-common", 9 | "python3-pip", 10 | "virtualenv", 11 | "python3-setuptools", 12 | ] 13 | state: latest 14 | update_cache: yes 15 | 16 | - name: Add Docker GPG apt Key 17 | apt_key: 18 | url: https://download.docker.com/linux/ubuntu/gpg 19 | state: present 20 | 21 | - name: Add Docker Repository 22 | apt_repository: 23 | repo: deb https://download.docker.com/linux/ubuntu bionic stable 24 | state: present 25 | 26 | - name: Update apt and install docker-ce 27 | apt: 28 | name: docker-ce 29 | state: latest 30 | update_cache: yes 31 | 32 | - name: Install Docker Module for Python 33 | pip: 34 | name: docker 35 | -------------------------------------------------------------------------------- /.github/workflows/docker.yml: -------------------------------------------------------------------------------- 1 | name: ci 2 | 3 | on: 4 | push: 5 | branches: 6 | - 'master' 7 | 8 | jobs: 9 | docker: 10 | runs-on: ubuntu-latest 11 | steps: 12 | - name: Checkout 13 | uses: actions/checkout@v2 14 | - name: Set up QEMU 15 | uses: docker/setup-qemu-action@v1 16 | - name: Set up Docker Buildx 17 | uses: docker/setup-buildx-action@v1 18 | - name: Login to GitHub Container Registry 19 | uses: docker/login-action@v1 20 | with: 21 | registry: ghcr.io 22 | username: ${{ github.repository_owner }} 23 | password: ${{ secrets.GITHUB_TOKEN }} 24 | - name: Build and push 25 | uses: docker/build-push-action@v2 26 | with: 27 | context: . 28 | platforms: linux/amd64 29 | push: true 30 | tags: | 31 | ghcr.io/${{ github.repository }}:latest 32 | -------------------------------------------------------------------------------- /contrib/tasks/create_droplet.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - name: Create droplet for {{ item }} 3 | digital_ocean_droplet: 4 | name: "rjbench-{{ item }}-throwaway" 5 | size: "{{ droplet_size }}" 6 | region: "{{ droplet_region }}" 7 | image: "{{ droplet_image }}" 8 | wait_timeout: 600 9 | state: present 10 | unique_name: yes 11 | ssh_keys: "{{ ssh_keys_raw.data | map(attribute='fingerprint') }}" 12 | register: this_droplet 13 | 14 | - name: Add new droplet to host group 15 | add_host: 16 | hostname: "{{ this_droplet.data.ip_address }}" 17 | groups: 18 | - "{{ item }}" 19 | - servers 20 | ansible_user: root 21 | rjbench_role: "{{ item }}" 22 | 23 | - name: Wait for SSH to come up 24 | wait_for: 25 | host: "{{ this_droplet.data.ip_address }}" 26 | port: 22 27 | timeout: 320 28 | state: started 29 | 30 | - name: Print info about this_droplet 31 | debug: 32 | msg: "ID is {{ this_droplet.data.droplet.id }}. IP is {{ this_droplet.data.ip_address }}." -------------------------------------------------------------------------------- /contrib/roles/synapse_sqlite/tasks/main.yml: -------------------------------------------------------------------------------- 1 | - name: Install Docker 2 | include_tasks: "{{playbook_dir}}/tasks/install_docker.yml" 3 | 4 | - name: Pull synapse docker image 5 | docker_image: 6 | name: "{{ synapse_image }}" 7 | source: pull 8 | 9 | - name: Generate synapse default config 10 | docker_container: 11 | container_default_behavior: compatibility 12 | name: "synapse-generate" 13 | image: "{{ synapse_image }}" 14 | command: "generate" 15 | state: started 16 | detach: no 17 | volumes: 18 | - "/rjbench/server:/data" 19 | env: 20 | SYNAPSE_SERVER_NAME: "localhost:8080" 21 | SYNAPSE_REPORT_STATS: "no" 22 | register: generate_container 23 | 24 | # - name: Debug container output 25 | # debug: 26 | # msg: "{{ generate_container.container.Output }}" 27 | 28 | - name: Copy Override Config 29 | copy: 30 | src: homeserver.override.yaml 31 | dest: /rjbench/server 32 | 33 | - name: Start Synapse 34 | docker_container: 35 | container_default_behavior: compatibility 36 | name: "synapse" 37 | image: "{{ synapse_image }}" 38 | state: started 39 | volumes: 40 | - "/rjbench/server:/data" 41 | ports: 42 | - "127.0.0.1:8080:8008" 43 | command: "run --config-path=/data/homeserver.yaml --config-path=/data/homeserver.override.yaml" 44 | 45 | - name: Wait for synapse to come up 46 | uri: 47 | url: "http://127.0.0.1:8080/_matrix/client/versions" 48 | status_code: 200 49 | register: result 50 | until: result.status == 200 51 | retries: 60 52 | delay: 1 -------------------------------------------------------------------------------- /contrib/digitalocean_playbook.yml: -------------------------------------------------------------------------------- 1 | - name: Prepare out/ dir 2 | hosts: localhost 3 | tasks: 4 | - name: Make out/ dir 5 | file: 6 | path: "{{ playbook_dir }}/out" 7 | state: directory 8 | 9 | - name: Create droplets 10 | hosts: localhost 11 | vars: 12 | droplet_size: s-2vcpu-2gb 13 | droplet_region: ams3 14 | droplet_image: ubuntu-20-04-x64 15 | # TODO add other roles 16 | roles: 17 | - "synapse-sqlite" 18 | # - "synapse-postgres" 19 | # - "dendrite-sqlite" 20 | # - "dendrite-postgres" 21 | - "conduit" 22 | debugger: on_failed 23 | tasks: 24 | - name: Get digitalocean API keys 25 | digital_ocean_sshkey_info: {} 26 | register: ssh_keys_raw 27 | 28 | - name: Create DO droplets 29 | include_tasks: tasks/create_droplet.yml 30 | 31 | loop: "{{ roles }}" 32 | 33 | - name: Mkdirs 34 | hosts: servers 35 | tasks: 36 | - name: Mkdirs 37 | include_tasks: "{{ playbook_dir }}/tasks/mkdirs.yml" 38 | 39 | ## BUILDING RJBENCH 40 | 41 | # Takes too long, uncomment (and comment local build + install) if you encounter problems with glibc and the like 42 | - name: Install rjbench remotely 43 | hosts: servers 44 | tasks: 45 | - name: Install rjbench command 46 | include_tasks: tasks/install_rjbench_remote.yml 47 | 48 | # - name: Build rjbench locally 49 | # hosts: localhost 50 | # tasks: 51 | # - name: Build rjbench 52 | # include_tasks: tasks/build_rjbench_locally.yml 53 | 54 | # - name: Install rjbench from local 55 | # hosts: servers 56 | # tasks: 57 | # - name: Install rjbench from local 58 | # copy: 59 | # src: "{{ playbook_dir }}/../target/release/rjbench" 60 | # dest: "/rjbench/app" 61 | # mode: "777" 62 | # - name: Copy script 63 | # copy: 64 | # src: "{{ playbook_dir }}/../romeo_and_juliet.txt" 65 | # dest: /rjbench/app 66 | 67 | # ## SETTING UP SERVER 68 | # # has to happen after rjbench or else OOM could occur, or the build could be extremely slow 69 | 70 | - name: Include setup 71 | tags: 72 | - setup 73 | import_playbook: generic_playbook.yml 74 | 75 | # ## RUNNING RJBENCH 76 | 77 | - name: Run test 78 | hosts: servers 79 | tags: 80 | - run 81 | debugger: on_failed 82 | tasks: 83 | - name: Run timing... 84 | shell: 85 | cmd: time /rjbench/app/rjbench http://localhost:8080 86 | chdir: /rjbench/app 87 | executable: /bin/bash 88 | register: time_cmd 89 | 90 | - name: Copy timing output to local file 91 | copy: 92 | content: "{{ time_cmd.stderr }}" 93 | dest: "out/{{ rjbench_role }}.txt" 94 | delegate_to: localhost 95 | 96 | ## CLEANUP 97 | 98 | - name: Destroy all droplets 99 | hosts: localhost 100 | tags: 101 | - delete 102 | vars: 103 | roles: 104 | - "synapse-sqlite" 105 | - "synapse-postgres" 106 | - "dendrite-sqlite" 107 | - "dendrite-postgres" 108 | - "conduit" 109 | tasks: 110 | - name: Remove droplets 111 | digital_ocean_droplet: 112 | name: "rjbench-{{ item }}-throwaway" 113 | state: absent 114 | unique_name: yes 115 | 116 | loop: "{{ roles }}" -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Romeo and Juliet benchmark 2 | 3 | ## Usage: 4 | 5 | Run this command with the correct port: 6 | 7 | ``` 8 | cargo run --release -- http://localhost:8000 9 | ``` 10 | 11 | This will go through the play defined in romeo_and_juliet.txt and create users 12 | for each character and sends one /send request for each line they say. 13 | 14 | 15 | ## Results (2022-05): 16 | 17 | 18 | | Tester | OS | CPU | Storage | Synapse sqlite | Synapse postgres | Dendrite sqlite | Dendrite postgres | Conduit sqlite | Conduit heed (LMDB) | Conduit rocksdb | Additional Notes | 19 | | ------------------- | ------------------- | ------------------- | ------------------- | ------------------- | ------------------- | ------------------- | ------------------- | ------------------- | ------------------- | ------------------- | ------------------- | 20 | | timo | linux | Intel i7 2nd gen | SATA SSD | - | - | 8m24s | 3m54s | 2m13s | 1m24s | - | - | 21 | | neilalexander | macOS | Intel i7 | NVMe SSD | - | - | 0m57s | - | - | - | - | - | 22 | | aaron | macOS | Intel i7 7th gen | NVMe SSD | - | - | 0m51s | - | 0m28s | - | - | - | 23 | | sonicrules1234 | linux | AMD Ryzen 5 1600 | NVMe SSD | - | 3m51s | - | 3m42s | - | - | 0m42s | Tests were done on a CoW filesystem | 24 | 25 | 26 | ### Reproducible runs (contributed by ShadowJonathan) 27 | 28 | While [contrib](contrib/README.md) contains some rudimentary documentation, to be able to use it, you must first: 29 | - Have `ansible-playbook` installed 30 | - Have a DigitalOcean account (with billing info registered, or using a budget) 31 | - Have one of your public keys added to digitalocean (it's also important that your local machine tries to log into servers with this automatically) 32 | - Install the `ansible-galaxy` collections documented in [contrib's readme](contrib/README.md) 33 | - Add the DigitalOcean API token to your environment (also as documented in [contrib's readme](contrib/README.md)) 34 | 35 | Then, `cd` into `contrib/`, and run 36 | ``` 37 | ansible-playbook digitalocean_playbook.yml 38 | ``` 39 | 40 | This'll run the tests in parallel on digitalocean droplets, results will be put into `contrib/out/`, 41 | you can adjust which server versions or revisions are ran/built using `contrib/group_vars/server.yml`, 42 | the committed file is "known to work", and can always be rolled back to when something goes wrong. 43 | 44 | Some stages of the playbook could take a while, such as building `rjbench`, or `conduit`, or the testing itself. 45 | It's advised to leave it alone when it does this, although, if a stage takes more than an hour (as a rule of thumb), 46 | or if you're curious what's happening, take one of the IP addresses noted during the "Create droplets" stage, do `ssh root@IP_ADDRESS`, 47 | and look around with `htop` and `journalctl -f -n 100`. 48 | 49 | 50 | ## Contact me: 51 | 52 | Matrix: @timo:koesters.xyz 53 | -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | use log::debug; 2 | use r0::room::{create_room::RoomPreset, Visibility}; 3 | use ruma::{ 4 | api::client::r0, 5 | events::{room::message::MessageEventContent, AnyMessageEventContent}, 6 | RoomId, 7 | }; 8 | use ruma_client::Client; 9 | use std::{ 10 | collections::{hash_map::Entry, HashMap}, 11 | env, 12 | fs::File, 13 | io::{BufRead, BufReader}, 14 | time::{Instant, SystemTime, UNIX_EPOCH}, 15 | }; 16 | 17 | const PASSWORD: &str = "asljdfbdnfsd"; 18 | 19 | type MatrixClient = ruma_client::Client; 20 | 21 | struct State { 22 | server: String, 23 | room_id: RoomId, 24 | clients: HashMap, // Maps username to client 25 | id: String, 26 | counter: u32, 27 | } 28 | 29 | impl State { 30 | pub fn new(server: String, room_id: RoomId, id: String) -> Self { 31 | State { 32 | server, 33 | room_id, 34 | clients: HashMap::new(), 35 | id, 36 | counter: 0, 37 | } 38 | } 39 | 40 | pub async fn say(&mut self, displayname: String, line: String) { 41 | let username = Self::fix_username(displayname.clone()) + "_" + &self.id; 42 | 43 | let mut entry = self.clients.entry(username.clone()); 44 | let client = match entry { 45 | Entry::Occupied(ref mut e) => e.get_mut(), 46 | Entry::Vacant(e) => e.insert( 47 | Self::new_client(self.server.clone(), &self.room_id, username, displayname).await, 48 | ), 49 | }; 50 | 51 | self.counter += 1; 52 | 53 | client 54 | .send_request(r0::message::send_message_event::Request::new( 55 | &self.room_id, 56 | &self.counter.to_string(), 57 | &AnyMessageEventContent::RoomMessage(MessageEventContent::text_plain(line)), 58 | )) 59 | .await 60 | .unwrap(); 61 | } 62 | 63 | async fn new_client( 64 | server: String, 65 | room_id: &RoomId, 66 | username: String, 67 | displayname: String, 68 | ) -> MatrixClient { 69 | let client = Client::new(server, None); 70 | debug!("Trying to register..."); 71 | client 72 | .register_user(Some(dbg!(&username)), PASSWORD) 73 | .await 74 | .unwrap(); 75 | 76 | debug!("Trying to log in..."); 77 | let user_id = client 78 | .log_in(&username, PASSWORD, None, None) 79 | .await 80 | .unwrap() 81 | .user_id; 82 | 83 | debug!("Trying to set the display name..."); 84 | client 85 | .send_request(r0::profile::set_display_name::Request::new( 86 | &user_id, 87 | Some(&displayname), 88 | )) 89 | .await 90 | .unwrap(); 91 | 92 | debug!("Trying to join the room..."); 93 | client 94 | .send_request(r0::membership::join_room_by_id::Request::new(&room_id)) 95 | .await 96 | .unwrap(); 97 | 98 | client 99 | } 100 | 101 | fn fix_username(username: String) -> String { 102 | username 103 | .to_ascii_lowercase() 104 | .replace(|c: char| !c.is_ascii_alphanumeric(), "_") 105 | } 106 | } 107 | 108 | #[tokio::main] 109 | async fn main() -> Result<(), String> { 110 | // Log info by default 111 | if let Err(_) = std::env::var("RUST_LOG") { 112 | std::env::set_var("RUST_LOG", "info"); 113 | } 114 | pretty_env_logger::init(); 115 | 116 | let mut args = env::args(); 117 | 118 | let program_path = args.next().unwrap(); 119 | 120 | if args.len() < 1 { 121 | eprintln!("Usage: time {} []", program_path); 122 | return Ok(()); 123 | } 124 | 125 | let servers: Vec = args.filter_map(|s| s.parse().ok()).collect(); 126 | 127 | let id = SystemTime::now() 128 | .duration_since(UNIX_EPOCH) 129 | .expect("time is valid") 130 | .as_millis() 131 | .to_string(); 132 | 133 | // Use one client to create the room 134 | let room_id = { 135 | let client = MatrixClient::new(servers[0].clone(), None); 136 | 137 | let first_username = format!("user_{}", id); 138 | 139 | client 140 | .register_user(Some(&first_username), PASSWORD) 141 | .await 142 | .unwrap(); 143 | 144 | client 145 | .log_in(&first_username, PASSWORD, None, None) 146 | .await 147 | .unwrap(); 148 | 149 | let mut create = r0::room::create_room::Request::new(); 150 | let name = format!("Romeo and Juliet {}", id); 151 | create.name = Some(&name); 152 | create.preset = Some(RoomPreset::PublicChat); 153 | create.visibility = Visibility::Public; 154 | 155 | let room_id = client.send_request(create).await.unwrap().room_id; 156 | 157 | room_id 158 | }; 159 | 160 | // Join with all other servers 161 | for server in servers.iter().skip(1) { 162 | let client = MatrixClient::new(server.clone(), None); 163 | 164 | let first_username = format!("user_{}", id); 165 | 166 | println!("{}", first_username); 167 | client 168 | .register_user(Some(&first_username), PASSWORD) 169 | .await 170 | .unwrap(); 171 | 172 | client 173 | .log_in(&first_username, PASSWORD, None, None) 174 | .await 175 | .unwrap(); 176 | 177 | client 178 | .send_request(r0::membership::join_room_by_id::Request::new(&room_id)) 179 | .await 180 | .unwrap(); 181 | } 182 | 183 | let start_time = Instant::now(); 184 | let mut futs = Vec::new(); 185 | for server in servers { 186 | let state = State::new(server, room_id.clone(), id.clone()); 187 | futs.push(play(state)); 188 | } 189 | 190 | futures::future::join_all(futs).await; 191 | println!("Result: {:?}", start_time.elapsed()); 192 | 193 | Ok(()) 194 | } 195 | 196 | async fn play(mut state: State) { 197 | let file = File::open("romeo_and_juliet.txt").unwrap(); 198 | let reader = BufReader::new(file); 199 | 200 | let mut displayname = "STAGE DIRECTION".to_owned(); 201 | 202 | let mut line_iter = reader.lines(); 203 | 204 | while let Some(line) = line_iter.next() { 205 | let mut line = line.unwrap(); 206 | 207 | if line.trim().is_empty() { 208 | displayname = "STAGE DIRECTION".to_owned(); 209 | continue; 210 | } 211 | 212 | if line.starts_with(' ') { 213 | line = line.trim().to_owned(); 214 | state.say(displayname.clone(), line).await; 215 | } else if line.starts_with("ACT") { 216 | line = line.trim().to_owned(); 217 | state.say("ACTS".to_owned(), line).await; 218 | } else { 219 | line = line.trim().to_owned(); 220 | displayname = line; 221 | // Skip a line 222 | line_iter.next(); 223 | } 224 | } 225 | } 226 | -------------------------------------------------------------------------------- /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 = "aho-corasick" 7 | version = "0.7.18" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f" 10 | dependencies = [ 11 | "memchr", 12 | ] 13 | 14 | [[package]] 15 | name = "assign" 16 | version = "1.1.1" 17 | source = "registry+https://github.com/rust-lang/crates.io-index" 18 | checksum = "5f093eed78becd229346bf859eec0aa4dd7ddde0757287b2b4107a1f09c80002" 19 | 20 | [[package]] 21 | name = "async-stream" 22 | version = "0.3.2" 23 | source = "registry+https://github.com/rust-lang/crates.io-index" 24 | checksum = "171374e7e3b2504e0e5236e3b59260560f9fe94bfe9ac39ba5e4e929c5590625" 25 | dependencies = [ 26 | "async-stream-impl", 27 | "futures-core", 28 | ] 29 | 30 | [[package]] 31 | name = "async-stream-impl" 32 | version = "0.3.2" 33 | source = "registry+https://github.com/rust-lang/crates.io-index" 34 | checksum = "648ed8c8d2ce5409ccd57453d9d1b214b342a0d69376a6feda1fd6cae3299308" 35 | dependencies = [ 36 | "proc-macro2", 37 | "quote", 38 | "syn", 39 | ] 40 | 41 | [[package]] 42 | name = "async-trait" 43 | version = "0.1.50" 44 | source = "registry+https://github.com/rust-lang/crates.io-index" 45 | checksum = "0b98e84bbb4cbcdd97da190ba0c58a1bb0de2c1fdf67d159e192ed766aeca722" 46 | dependencies = [ 47 | "proc-macro2", 48 | "quote", 49 | "syn", 50 | ] 51 | 52 | [[package]] 53 | name = "atty" 54 | version = "0.2.14" 55 | source = "registry+https://github.com/rust-lang/crates.io-index" 56 | checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" 57 | dependencies = [ 58 | "hermit-abi", 59 | "libc", 60 | "winapi", 61 | ] 62 | 63 | [[package]] 64 | name = "autocfg" 65 | version = "1.0.1" 66 | source = "registry+https://github.com/rust-lang/crates.io-index" 67 | checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" 68 | 69 | [[package]] 70 | name = "bitflags" 71 | version = "1.2.1" 72 | source = "registry+https://github.com/rust-lang/crates.io-index" 73 | checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" 74 | 75 | [[package]] 76 | name = "bytes" 77 | version = "1.0.1" 78 | source = "registry+https://github.com/rust-lang/crates.io-index" 79 | checksum = "b700ce4376041dcd0a327fd0097c41095743c4c8af8887265942faf1100bd040" 80 | 81 | [[package]] 82 | name = "cc" 83 | version = "1.0.69" 84 | source = "registry+https://github.com/rust-lang/crates.io-index" 85 | checksum = "e70cc2f62c6ce1868963827bd677764c62d07c3d9a3e1fb1177ee1a9ab199eb2" 86 | 87 | [[package]] 88 | name = "cfg-if" 89 | version = "1.0.0" 90 | source = "registry+https://github.com/rust-lang/crates.io-index" 91 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 92 | 93 | [[package]] 94 | name = "core-foundation" 95 | version = "0.9.1" 96 | source = "registry+https://github.com/rust-lang/crates.io-index" 97 | checksum = "0a89e2ae426ea83155dccf10c0fa6b1463ef6d5fcb44cee0b224a408fa640a62" 98 | dependencies = [ 99 | "core-foundation-sys", 100 | "libc", 101 | ] 102 | 103 | [[package]] 104 | name = "core-foundation-sys" 105 | version = "0.8.2" 106 | source = "registry+https://github.com/rust-lang/crates.io-index" 107 | checksum = "ea221b5284a47e40033bf9b66f35f984ec0ea2931eb03505246cd27a963f981b" 108 | 109 | [[package]] 110 | name = "either" 111 | version = "1.6.1" 112 | source = "registry+https://github.com/rust-lang/crates.io-index" 113 | checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" 114 | 115 | [[package]] 116 | name = "env_logger" 117 | version = "0.7.1" 118 | source = "registry+https://github.com/rust-lang/crates.io-index" 119 | checksum = "44533bbbb3bb3c1fa17d9f2e4e38bbbaf8396ba82193c4cb1b6445d711445d36" 120 | dependencies = [ 121 | "atty", 122 | "humantime", 123 | "log", 124 | "regex", 125 | "termcolor", 126 | ] 127 | 128 | [[package]] 129 | name = "fnv" 130 | version = "1.0.7" 131 | source = "registry+https://github.com/rust-lang/crates.io-index" 132 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 133 | 134 | [[package]] 135 | name = "foreign-types" 136 | version = "0.3.2" 137 | source = "registry+https://github.com/rust-lang/crates.io-index" 138 | checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" 139 | dependencies = [ 140 | "foreign-types-shared", 141 | ] 142 | 143 | [[package]] 144 | name = "foreign-types-shared" 145 | version = "0.1.1" 146 | source = "registry+https://github.com/rust-lang/crates.io-index" 147 | checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" 148 | 149 | [[package]] 150 | name = "form_urlencoded" 151 | version = "1.0.1" 152 | source = "registry+https://github.com/rust-lang/crates.io-index" 153 | checksum = "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191" 154 | dependencies = [ 155 | "matches", 156 | "percent-encoding", 157 | ] 158 | 159 | [[package]] 160 | name = "futures" 161 | version = "0.3.16" 162 | source = "registry+https://github.com/rust-lang/crates.io-index" 163 | checksum = "1adc00f486adfc9ce99f77d717836f0c5aa84965eb0b4f051f4e83f7cab53f8b" 164 | dependencies = [ 165 | "futures-channel", 166 | "futures-core", 167 | "futures-executor", 168 | "futures-io", 169 | "futures-sink", 170 | "futures-task", 171 | "futures-util", 172 | ] 173 | 174 | [[package]] 175 | name = "futures-channel" 176 | version = "0.3.16" 177 | source = "registry+https://github.com/rust-lang/crates.io-index" 178 | checksum = "74ed2411805f6e4e3d9bc904c95d5d423b89b3b25dc0250aa74729de20629ff9" 179 | dependencies = [ 180 | "futures-core", 181 | "futures-sink", 182 | ] 183 | 184 | [[package]] 185 | name = "futures-core" 186 | version = "0.3.16" 187 | source = "registry+https://github.com/rust-lang/crates.io-index" 188 | checksum = "af51b1b4a7fdff033703db39de8802c673eb91855f2e0d47dcf3bf2c0ef01f99" 189 | 190 | [[package]] 191 | name = "futures-executor" 192 | version = "0.3.16" 193 | source = "registry+https://github.com/rust-lang/crates.io-index" 194 | checksum = "4d0d535a57b87e1ae31437b892713aee90cd2d7b0ee48727cd11fc72ef54761c" 195 | dependencies = [ 196 | "futures-core", 197 | "futures-task", 198 | "futures-util", 199 | ] 200 | 201 | [[package]] 202 | name = "futures-io" 203 | version = "0.3.16" 204 | source = "registry+https://github.com/rust-lang/crates.io-index" 205 | checksum = "0b0e06c393068f3a6ef246c75cdca793d6a46347e75286933e5e75fd2fd11582" 206 | 207 | [[package]] 208 | name = "futures-macro" 209 | version = "0.3.16" 210 | source = "registry+https://github.com/rust-lang/crates.io-index" 211 | checksum = "c54913bae956fb8df7f4dc6fc90362aa72e69148e3f39041fbe8742d21e0ac57" 212 | dependencies = [ 213 | "autocfg", 214 | "proc-macro-hack", 215 | "proc-macro2", 216 | "quote", 217 | "syn", 218 | ] 219 | 220 | [[package]] 221 | name = "futures-sink" 222 | version = "0.3.16" 223 | source = "registry+https://github.com/rust-lang/crates.io-index" 224 | checksum = "c0f30aaa67363d119812743aa5f33c201a7a66329f97d1a887022971feea4b53" 225 | 226 | [[package]] 227 | name = "futures-task" 228 | version = "0.3.16" 229 | source = "registry+https://github.com/rust-lang/crates.io-index" 230 | checksum = "bbe54a98670017f3be909561f6ad13e810d9a51f3f061b902062ca3da80799f2" 231 | 232 | [[package]] 233 | name = "futures-util" 234 | version = "0.3.16" 235 | source = "registry+https://github.com/rust-lang/crates.io-index" 236 | checksum = "67eb846bfd58e44a8481a00049e82c43e0ccb5d61f8dc071057cb19249dd4d78" 237 | dependencies = [ 238 | "autocfg", 239 | "futures-channel", 240 | "futures-core", 241 | "futures-io", 242 | "futures-macro", 243 | "futures-sink", 244 | "futures-task", 245 | "memchr", 246 | "pin-project-lite", 247 | "pin-utils", 248 | "proc-macro-hack", 249 | "proc-macro-nested", 250 | "slab", 251 | ] 252 | 253 | [[package]] 254 | name = "getrandom" 255 | version = "0.2.3" 256 | source = "registry+https://github.com/rust-lang/crates.io-index" 257 | checksum = "7fcd999463524c52659517fe2cea98493cfe485d10565e7b0fb07dbba7ad2753" 258 | dependencies = [ 259 | "cfg-if", 260 | "libc", 261 | "wasi", 262 | ] 263 | 264 | [[package]] 265 | name = "h2" 266 | version = "0.3.3" 267 | source = "registry+https://github.com/rust-lang/crates.io-index" 268 | checksum = "825343c4eef0b63f541f8903f395dc5beb362a979b5799a84062527ef1e37726" 269 | dependencies = [ 270 | "bytes", 271 | "fnv", 272 | "futures-core", 273 | "futures-sink", 274 | "futures-util", 275 | "http", 276 | "indexmap", 277 | "slab", 278 | "tokio", 279 | "tokio-util", 280 | "tracing", 281 | ] 282 | 283 | [[package]] 284 | name = "hashbrown" 285 | version = "0.11.2" 286 | source = "registry+https://github.com/rust-lang/crates.io-index" 287 | checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" 288 | 289 | [[package]] 290 | name = "hermit-abi" 291 | version = "0.1.19" 292 | source = "registry+https://github.com/rust-lang/crates.io-index" 293 | checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" 294 | dependencies = [ 295 | "libc", 296 | ] 297 | 298 | [[package]] 299 | name = "http" 300 | version = "0.2.4" 301 | source = "registry+https://github.com/rust-lang/crates.io-index" 302 | checksum = "527e8c9ac747e28542699a951517aa9a6945af506cd1f2e1b53a576c17b6cc11" 303 | dependencies = [ 304 | "bytes", 305 | "fnv", 306 | "itoa", 307 | ] 308 | 309 | [[package]] 310 | name = "http-body" 311 | version = "0.4.2" 312 | source = "registry+https://github.com/rust-lang/crates.io-index" 313 | checksum = "60daa14be0e0786db0f03a9e57cb404c9d756eed2b6c62b9ea98ec5743ec75a9" 314 | dependencies = [ 315 | "bytes", 316 | "http", 317 | "pin-project-lite", 318 | ] 319 | 320 | [[package]] 321 | name = "httparse" 322 | version = "1.4.1" 323 | source = "registry+https://github.com/rust-lang/crates.io-index" 324 | checksum = "f3a87b616e37e93c22fb19bcd386f02f3af5ea98a25670ad0fce773de23c5e68" 325 | 326 | [[package]] 327 | name = "httpdate" 328 | version = "1.0.1" 329 | source = "registry+https://github.com/rust-lang/crates.io-index" 330 | checksum = "6456b8a6c8f33fee7d958fcd1b60d55b11940a79e63ae87013e6d22e26034440" 331 | 332 | [[package]] 333 | name = "humantime" 334 | version = "1.3.0" 335 | source = "registry+https://github.com/rust-lang/crates.io-index" 336 | checksum = "df004cfca50ef23c36850aaaa59ad52cc70d0e90243c3c7737a4dd32dc7a3c4f" 337 | dependencies = [ 338 | "quick-error", 339 | ] 340 | 341 | [[package]] 342 | name = "hyper" 343 | version = "0.14.11" 344 | source = "registry+https://github.com/rust-lang/crates.io-index" 345 | checksum = "0b61cf2d1aebcf6e6352c97b81dc2244ca29194be1b276f5d8ad5c6330fffb11" 346 | dependencies = [ 347 | "bytes", 348 | "futures-channel", 349 | "futures-core", 350 | "futures-util", 351 | "h2", 352 | "http", 353 | "http-body", 354 | "httparse", 355 | "httpdate", 356 | "itoa", 357 | "pin-project-lite", 358 | "socket2", 359 | "tokio", 360 | "tower-service", 361 | "tracing", 362 | "want", 363 | ] 364 | 365 | [[package]] 366 | name = "hyper-tls" 367 | version = "0.5.0" 368 | source = "registry+https://github.com/rust-lang/crates.io-index" 369 | checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" 370 | dependencies = [ 371 | "bytes", 372 | "hyper", 373 | "native-tls", 374 | "tokio", 375 | "tokio-native-tls", 376 | ] 377 | 378 | [[package]] 379 | name = "idna" 380 | version = "0.2.3" 381 | source = "registry+https://github.com/rust-lang/crates.io-index" 382 | checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" 383 | dependencies = [ 384 | "matches", 385 | "unicode-bidi", 386 | "unicode-normalization", 387 | ] 388 | 389 | [[package]] 390 | name = "indexmap" 391 | version = "1.7.0" 392 | source = "registry+https://github.com/rust-lang/crates.io-index" 393 | checksum = "bc633605454125dec4b66843673f01c7df2b89479b32e0ed634e43a91cff62a5" 394 | dependencies = [ 395 | "autocfg", 396 | "hashbrown", 397 | "serde", 398 | ] 399 | 400 | [[package]] 401 | name = "indoc" 402 | version = "1.0.3" 403 | source = "registry+https://github.com/rust-lang/crates.io-index" 404 | checksum = "e5a75aeaaef0ce18b58056d306c27b07436fbb34b8816c53094b76dd81803136" 405 | dependencies = [ 406 | "unindent", 407 | ] 408 | 409 | [[package]] 410 | name = "itertools" 411 | version = "0.10.1" 412 | source = "registry+https://github.com/rust-lang/crates.io-index" 413 | checksum = "69ddb889f9d0d08a67338271fa9b62996bc788c7796a5c18cf057420aaed5eaf" 414 | dependencies = [ 415 | "either", 416 | ] 417 | 418 | [[package]] 419 | name = "itoa" 420 | version = "0.4.7" 421 | source = "registry+https://github.com/rust-lang/crates.io-index" 422 | checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" 423 | 424 | [[package]] 425 | name = "js_int" 426 | version = "0.2.1" 427 | source = "registry+https://github.com/rust-lang/crates.io-index" 428 | checksum = "defaba9bcd19568a4b4b3736b23e368e5b75e3ea126fd4cb3e4ad2ea5af274fd" 429 | dependencies = [ 430 | "serde", 431 | ] 432 | 433 | [[package]] 434 | name = "lazy_static" 435 | version = "1.4.0" 436 | source = "registry+https://github.com/rust-lang/crates.io-index" 437 | checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" 438 | 439 | [[package]] 440 | name = "libc" 441 | version = "0.2.98" 442 | source = "registry+https://github.com/rust-lang/crates.io-index" 443 | checksum = "320cfe77175da3a483efed4bc0adc1968ca050b098ce4f2f1c13a56626128790" 444 | 445 | [[package]] 446 | name = "log" 447 | version = "0.4.14" 448 | source = "registry+https://github.com/rust-lang/crates.io-index" 449 | checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710" 450 | dependencies = [ 451 | "cfg-if", 452 | ] 453 | 454 | [[package]] 455 | name = "maplit" 456 | version = "1.0.2" 457 | source = "registry+https://github.com/rust-lang/crates.io-index" 458 | checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d" 459 | 460 | [[package]] 461 | name = "matches" 462 | version = "0.1.8" 463 | source = "registry+https://github.com/rust-lang/crates.io-index" 464 | checksum = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" 465 | 466 | [[package]] 467 | name = "memchr" 468 | version = "2.4.0" 469 | source = "registry+https://github.com/rust-lang/crates.io-index" 470 | checksum = "b16bd47d9e329435e309c58469fe0791c2d0d1ba96ec0954152a5ae2b04387dc" 471 | 472 | [[package]] 473 | name = "mio" 474 | version = "0.7.13" 475 | source = "registry+https://github.com/rust-lang/crates.io-index" 476 | checksum = "8c2bdb6314ec10835cd3293dd268473a835c02b7b352e788be788b3c6ca6bb16" 477 | dependencies = [ 478 | "libc", 479 | "log", 480 | "miow", 481 | "ntapi", 482 | "winapi", 483 | ] 484 | 485 | [[package]] 486 | name = "miow" 487 | version = "0.3.7" 488 | source = "registry+https://github.com/rust-lang/crates.io-index" 489 | checksum = "b9f1c5b025cda876f66ef43a113f91ebc9f4ccef34843000e0adf6ebbab84e21" 490 | dependencies = [ 491 | "winapi", 492 | ] 493 | 494 | [[package]] 495 | name = "native-tls" 496 | version = "0.2.7" 497 | source = "registry+https://github.com/rust-lang/crates.io-index" 498 | checksum = "b8d96b2e1c8da3957d58100b09f102c6d9cfdfced01b7ec5a8974044bb09dbd4" 499 | dependencies = [ 500 | "lazy_static", 501 | "libc", 502 | "log", 503 | "openssl", 504 | "openssl-probe", 505 | "openssl-sys", 506 | "schannel", 507 | "security-framework", 508 | "security-framework-sys", 509 | "tempfile", 510 | ] 511 | 512 | [[package]] 513 | name = "ntapi" 514 | version = "0.3.6" 515 | source = "registry+https://github.com/rust-lang/crates.io-index" 516 | checksum = "3f6bb902e437b6d86e03cce10a7e2af662292c5dfef23b65899ea3ac9354ad44" 517 | dependencies = [ 518 | "winapi", 519 | ] 520 | 521 | [[package]] 522 | name = "num_cpus" 523 | version = "1.13.0" 524 | source = "registry+https://github.com/rust-lang/crates.io-index" 525 | checksum = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3" 526 | dependencies = [ 527 | "hermit-abi", 528 | "libc", 529 | ] 530 | 531 | [[package]] 532 | name = "once_cell" 533 | version = "1.8.0" 534 | source = "registry+https://github.com/rust-lang/crates.io-index" 535 | checksum = "692fcb63b64b1758029e0a96ee63e049ce8c5948587f2f7208df04625e5f6b56" 536 | 537 | [[package]] 538 | name = "openssl" 539 | version = "0.10.35" 540 | source = "registry+https://github.com/rust-lang/crates.io-index" 541 | checksum = "549430950c79ae24e6d02e0b7404534ecf311d94cc9f861e9e4020187d13d885" 542 | dependencies = [ 543 | "bitflags", 544 | "cfg-if", 545 | "foreign-types", 546 | "libc", 547 | "once_cell", 548 | "openssl-sys", 549 | ] 550 | 551 | [[package]] 552 | name = "openssl-probe" 553 | version = "0.1.4" 554 | source = "registry+https://github.com/rust-lang/crates.io-index" 555 | checksum = "28988d872ab76095a6e6ac88d99b54fd267702734fd7ffe610ca27f533ddb95a" 556 | 557 | [[package]] 558 | name = "openssl-sys" 559 | version = "0.9.65" 560 | source = "registry+https://github.com/rust-lang/crates.io-index" 561 | checksum = "7a7907e3bfa08bb85105209cdfcb6c63d109f8f6c1ed6ca318fff5c1853fbc1d" 562 | dependencies = [ 563 | "autocfg", 564 | "cc", 565 | "libc", 566 | "pkg-config", 567 | "vcpkg", 568 | ] 569 | 570 | [[package]] 571 | name = "paste" 572 | version = "1.0.5" 573 | source = "registry+https://github.com/rust-lang/crates.io-index" 574 | checksum = "acbf547ad0c65e31259204bd90935776d1c693cec2f4ff7abb7a1bbbd40dfe58" 575 | 576 | [[package]] 577 | name = "percent-encoding" 578 | version = "2.1.0" 579 | source = "registry+https://github.com/rust-lang/crates.io-index" 580 | checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" 581 | 582 | [[package]] 583 | name = "pin-project-lite" 584 | version = "0.2.7" 585 | source = "registry+https://github.com/rust-lang/crates.io-index" 586 | checksum = "8d31d11c69a6b52a174b42bdc0c30e5e11670f90788b2c471c31c1d17d449443" 587 | 588 | [[package]] 589 | name = "pin-utils" 590 | version = "0.1.0" 591 | source = "registry+https://github.com/rust-lang/crates.io-index" 592 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 593 | 594 | [[package]] 595 | name = "pkg-config" 596 | version = "0.3.19" 597 | source = "registry+https://github.com/rust-lang/crates.io-index" 598 | checksum = "3831453b3449ceb48b6d9c7ad7c96d5ea673e9b470a1dc578c2ce6521230884c" 599 | 600 | [[package]] 601 | name = "ppv-lite86" 602 | version = "0.2.10" 603 | source = "registry+https://github.com/rust-lang/crates.io-index" 604 | checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" 605 | 606 | [[package]] 607 | name = "pretty_env_logger" 608 | version = "0.4.0" 609 | source = "registry+https://github.com/rust-lang/crates.io-index" 610 | checksum = "926d36b9553851b8b0005f1275891b392ee4d2d833852c417ed025477350fb9d" 611 | dependencies = [ 612 | "env_logger", 613 | "log", 614 | ] 615 | 616 | [[package]] 617 | name = "proc-macro-crate" 618 | version = "1.0.0" 619 | source = "registry+https://github.com/rust-lang/crates.io-index" 620 | checksum = "41fdbd1df62156fbc5945f4762632564d7d038153091c3fcf1067f6aef7cff92" 621 | dependencies = [ 622 | "thiserror", 623 | "toml", 624 | ] 625 | 626 | [[package]] 627 | name = "proc-macro-hack" 628 | version = "0.5.19" 629 | source = "registry+https://github.com/rust-lang/crates.io-index" 630 | checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5" 631 | 632 | [[package]] 633 | name = "proc-macro-nested" 634 | version = "0.1.7" 635 | source = "registry+https://github.com/rust-lang/crates.io-index" 636 | checksum = "bc881b2c22681370c6a780e47af9840ef841837bc98118431d4e1868bd0c1086" 637 | 638 | [[package]] 639 | name = "proc-macro2" 640 | version = "1.0.28" 641 | source = "registry+https://github.com/rust-lang/crates.io-index" 642 | checksum = "5c7ed8b8c7b886ea3ed7dde405212185f423ab44682667c8c6dd14aa1d9f6612" 643 | dependencies = [ 644 | "unicode-xid", 645 | ] 646 | 647 | [[package]] 648 | name = "quick-error" 649 | version = "1.2.3" 650 | source = "registry+https://github.com/rust-lang/crates.io-index" 651 | checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" 652 | 653 | [[package]] 654 | name = "quote" 655 | version = "1.0.9" 656 | source = "registry+https://github.com/rust-lang/crates.io-index" 657 | checksum = "c3d0b9745dc2debf507c8422de05d7226cc1f0644216dfdfead988f9b1ab32a7" 658 | dependencies = [ 659 | "proc-macro2", 660 | ] 661 | 662 | [[package]] 663 | name = "rand" 664 | version = "0.8.4" 665 | source = "registry+https://github.com/rust-lang/crates.io-index" 666 | checksum = "2e7573632e6454cf6b99d7aac4ccca54be06da05aca2ef7423d22d27d4d4bcd8" 667 | dependencies = [ 668 | "libc", 669 | "rand_chacha", 670 | "rand_core", 671 | "rand_hc", 672 | ] 673 | 674 | [[package]] 675 | name = "rand_chacha" 676 | version = "0.3.1" 677 | source = "registry+https://github.com/rust-lang/crates.io-index" 678 | checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" 679 | dependencies = [ 680 | "ppv-lite86", 681 | "rand_core", 682 | ] 683 | 684 | [[package]] 685 | name = "rand_core" 686 | version = "0.6.3" 687 | source = "registry+https://github.com/rust-lang/crates.io-index" 688 | checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" 689 | dependencies = [ 690 | "getrandom", 691 | ] 692 | 693 | [[package]] 694 | name = "rand_hc" 695 | version = "0.3.1" 696 | source = "registry+https://github.com/rust-lang/crates.io-index" 697 | checksum = "d51e9f596de227fda2ea6c84607f5558e196eeaf43c986b724ba4fb8fdf497e7" 698 | dependencies = [ 699 | "rand_core", 700 | ] 701 | 702 | [[package]] 703 | name = "redox_syscall" 704 | version = "0.2.9" 705 | source = "registry+https://github.com/rust-lang/crates.io-index" 706 | checksum = "5ab49abadf3f9e1c4bc499e8845e152ad87d2ad2d30371841171169e9d75feee" 707 | dependencies = [ 708 | "bitflags", 709 | ] 710 | 711 | [[package]] 712 | name = "regex" 713 | version = "1.5.4" 714 | source = "registry+https://github.com/rust-lang/crates.io-index" 715 | checksum = "d07a8629359eb56f1e2fb1652bb04212c072a87ba68546a04065d525673ac461" 716 | dependencies = [ 717 | "aho-corasick", 718 | "memchr", 719 | "regex-syntax", 720 | ] 721 | 722 | [[package]] 723 | name = "regex-syntax" 724 | version = "0.6.25" 725 | source = "registry+https://github.com/rust-lang/crates.io-index" 726 | checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" 727 | 728 | [[package]] 729 | name = "remove_dir_all" 730 | version = "0.5.3" 731 | source = "registry+https://github.com/rust-lang/crates.io-index" 732 | checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" 733 | dependencies = [ 734 | "winapi", 735 | ] 736 | 737 | [[package]] 738 | name = "rjbench" 739 | version = "0.1.0" 740 | dependencies = [ 741 | "futures", 742 | "hyper", 743 | "log", 744 | "pretty_env_logger", 745 | "ruma", 746 | "ruma-client", 747 | "tokio", 748 | "url", 749 | ] 750 | 751 | [[package]] 752 | name = "ruma" 753 | version = "0.2.0" 754 | source = "git+https://github.com/timokoesters/ruma?branch=uiaafix#260c953a8829945e3f3dcdbb2e0533694f013a1c" 755 | dependencies = [ 756 | "assign", 757 | "js_int", 758 | "ruma-api", 759 | "ruma-client-api", 760 | "ruma-common", 761 | "ruma-events", 762 | "ruma-federation-api", 763 | "ruma-identifiers", 764 | "ruma-serde", 765 | "ruma-state-res", 766 | ] 767 | 768 | [[package]] 769 | name = "ruma-api" 770 | version = "0.17.1" 771 | source = "git+https://github.com/timokoesters/ruma?branch=uiaafix#260c953a8829945e3f3dcdbb2e0533694f013a1c" 772 | dependencies = [ 773 | "bytes", 774 | "http", 775 | "percent-encoding", 776 | "ruma-api-macros", 777 | "ruma-identifiers", 778 | "ruma-serde", 779 | "serde", 780 | "serde_json", 781 | "thiserror", 782 | ] 783 | 784 | [[package]] 785 | name = "ruma-api-macros" 786 | version = "0.17.1" 787 | source = "git+https://github.com/timokoesters/ruma?branch=uiaafix#260c953a8829945e3f3dcdbb2e0533694f013a1c" 788 | dependencies = [ 789 | "proc-macro-crate", 790 | "proc-macro2", 791 | "quote", 792 | "syn", 793 | ] 794 | 795 | [[package]] 796 | name = "ruma-client" 797 | version = "0.6.0" 798 | source = "git+https://github.com/timokoesters/ruma?branch=uiaafix#260c953a8829945e3f3dcdbb2e0533694f013a1c" 799 | dependencies = [ 800 | "assign", 801 | "async-stream", 802 | "async-trait", 803 | "bytes", 804 | "futures-core", 805 | "http", 806 | "hyper", 807 | "hyper-tls", 808 | "ruma-api", 809 | "ruma-client-api", 810 | "ruma-common", 811 | "ruma-identifiers", 812 | "ruma-serde", 813 | "serde", 814 | "serde_json", 815 | ] 816 | 817 | [[package]] 818 | name = "ruma-client-api" 819 | version = "0.11.0" 820 | source = "git+https://github.com/timokoesters/ruma?branch=uiaafix#260c953a8829945e3f3dcdbb2e0533694f013a1c" 821 | dependencies = [ 822 | "assign", 823 | "bytes", 824 | "http", 825 | "js_int", 826 | "maplit", 827 | "percent-encoding", 828 | "ruma-api", 829 | "ruma-common", 830 | "ruma-events", 831 | "ruma-identifiers", 832 | "ruma-serde", 833 | "serde", 834 | "serde_json", 835 | ] 836 | 837 | [[package]] 838 | name = "ruma-common" 839 | version = "0.5.4" 840 | source = "git+https://github.com/timokoesters/ruma?branch=uiaafix#260c953a8829945e3f3dcdbb2e0533694f013a1c" 841 | dependencies = [ 842 | "indexmap", 843 | "js_int", 844 | "ruma-identifiers", 845 | "ruma-serde", 846 | "serde", 847 | "serde_json", 848 | "tracing", 849 | "wildmatch", 850 | ] 851 | 852 | [[package]] 853 | name = "ruma-events" 854 | version = "0.23.3" 855 | source = "git+https://github.com/timokoesters/ruma?branch=uiaafix#260c953a8829945e3f3dcdbb2e0533694f013a1c" 856 | dependencies = [ 857 | "indoc", 858 | "js_int", 859 | "ruma-common", 860 | "ruma-events-macros", 861 | "ruma-identifiers", 862 | "ruma-serde", 863 | "serde", 864 | "serde_json", 865 | ] 866 | 867 | [[package]] 868 | name = "ruma-events-macros" 869 | version = "0.23.3" 870 | source = "git+https://github.com/timokoesters/ruma?branch=uiaafix#260c953a8829945e3f3dcdbb2e0533694f013a1c" 871 | dependencies = [ 872 | "proc-macro-crate", 873 | "proc-macro2", 874 | "quote", 875 | "syn", 876 | ] 877 | 878 | [[package]] 879 | name = "ruma-federation-api" 880 | version = "0.2.0" 881 | source = "git+https://github.com/timokoesters/ruma?branch=uiaafix#260c953a8829945e3f3dcdbb2e0533694f013a1c" 882 | dependencies = [ 883 | "js_int", 884 | "ruma-api", 885 | "ruma-common", 886 | "ruma-events", 887 | "ruma-identifiers", 888 | "ruma-serde", 889 | "serde", 890 | "serde_json", 891 | ] 892 | 893 | [[package]] 894 | name = "ruma-identifiers" 895 | version = "0.19.4" 896 | source = "git+https://github.com/timokoesters/ruma?branch=uiaafix#260c953a8829945e3f3dcdbb2e0533694f013a1c" 897 | dependencies = [ 898 | "paste", 899 | "rand", 900 | "ruma-identifiers-macros", 901 | "ruma-identifiers-validation", 902 | "ruma-serde", 903 | "ruma-serde-macros", 904 | "serde", 905 | ] 906 | 907 | [[package]] 908 | name = "ruma-identifiers-macros" 909 | version = "0.19.4" 910 | source = "git+https://github.com/timokoesters/ruma?branch=uiaafix#260c953a8829945e3f3dcdbb2e0533694f013a1c" 911 | dependencies = [ 912 | "quote", 913 | "ruma-identifiers-validation", 914 | "syn", 915 | ] 916 | 917 | [[package]] 918 | name = "ruma-identifiers-validation" 919 | version = "0.4.0" 920 | source = "git+https://github.com/timokoesters/ruma?branch=uiaafix#260c953a8829945e3f3dcdbb2e0533694f013a1c" 921 | 922 | [[package]] 923 | name = "ruma-serde" 924 | version = "0.4.1" 925 | source = "git+https://github.com/timokoesters/ruma?branch=uiaafix#260c953a8829945e3f3dcdbb2e0533694f013a1c" 926 | dependencies = [ 927 | "bytes", 928 | "form_urlencoded", 929 | "itoa", 930 | "js_int", 931 | "ruma-serde-macros", 932 | "serde", 933 | "serde_json", 934 | ] 935 | 936 | [[package]] 937 | name = "ruma-serde-macros" 938 | version = "0.4.1" 939 | source = "git+https://github.com/timokoesters/ruma?branch=uiaafix#260c953a8829945e3f3dcdbb2e0533694f013a1c" 940 | dependencies = [ 941 | "proc-macro-crate", 942 | "proc-macro2", 943 | "quote", 944 | "syn", 945 | ] 946 | 947 | [[package]] 948 | name = "ruma-state-res" 949 | version = "0.2.0" 950 | source = "git+https://github.com/timokoesters/ruma?branch=uiaafix#260c953a8829945e3f3dcdbb2e0533694f013a1c" 951 | dependencies = [ 952 | "itertools", 953 | "js_int", 954 | "maplit", 955 | "ruma-common", 956 | "ruma-events", 957 | "ruma-identifiers", 958 | "ruma-serde", 959 | "serde", 960 | "serde_json", 961 | "thiserror", 962 | "tracing", 963 | ] 964 | 965 | [[package]] 966 | name = "ryu" 967 | version = "1.0.5" 968 | source = "registry+https://github.com/rust-lang/crates.io-index" 969 | checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" 970 | 971 | [[package]] 972 | name = "schannel" 973 | version = "0.1.19" 974 | source = "registry+https://github.com/rust-lang/crates.io-index" 975 | checksum = "8f05ba609c234e60bee0d547fe94a4c7e9da733d1c962cf6e59efa4cd9c8bc75" 976 | dependencies = [ 977 | "lazy_static", 978 | "winapi", 979 | ] 980 | 981 | [[package]] 982 | name = "security-framework" 983 | version = "2.3.1" 984 | source = "registry+https://github.com/rust-lang/crates.io-index" 985 | checksum = "23a2ac85147a3a11d77ecf1bc7166ec0b92febfa4461c37944e180f319ece467" 986 | dependencies = [ 987 | "bitflags", 988 | "core-foundation", 989 | "core-foundation-sys", 990 | "libc", 991 | "security-framework-sys", 992 | ] 993 | 994 | [[package]] 995 | name = "security-framework-sys" 996 | version = "2.3.0" 997 | source = "registry+https://github.com/rust-lang/crates.io-index" 998 | checksum = "7e4effb91b4b8b6fb7732e670b6cee160278ff8e6bf485c7805d9e319d76e284" 999 | dependencies = [ 1000 | "core-foundation-sys", 1001 | "libc", 1002 | ] 1003 | 1004 | [[package]] 1005 | name = "serde" 1006 | version = "1.0.126" 1007 | source = "registry+https://github.com/rust-lang/crates.io-index" 1008 | checksum = "ec7505abeacaec74ae4778d9d9328fe5a5d04253220a85c4ee022239fc996d03" 1009 | dependencies = [ 1010 | "serde_derive", 1011 | ] 1012 | 1013 | [[package]] 1014 | name = "serde_derive" 1015 | version = "1.0.126" 1016 | source = "registry+https://github.com/rust-lang/crates.io-index" 1017 | checksum = "963a7dbc9895aeac7ac90e74f34a5d5261828f79df35cbed41e10189d3804d43" 1018 | dependencies = [ 1019 | "proc-macro2", 1020 | "quote", 1021 | "syn", 1022 | ] 1023 | 1024 | [[package]] 1025 | name = "serde_json" 1026 | version = "1.0.64" 1027 | source = "registry+https://github.com/rust-lang/crates.io-index" 1028 | checksum = "799e97dc9fdae36a5c8b8f2cae9ce2ee9fdce2058c57a93e6099d919fd982f79" 1029 | dependencies = [ 1030 | "itoa", 1031 | "ryu", 1032 | "serde", 1033 | ] 1034 | 1035 | [[package]] 1036 | name = "slab" 1037 | version = "0.4.3" 1038 | source = "registry+https://github.com/rust-lang/crates.io-index" 1039 | checksum = "f173ac3d1a7e3b28003f40de0b5ce7fe2710f9b9dc3fc38664cebee46b3b6527" 1040 | 1041 | [[package]] 1042 | name = "socket2" 1043 | version = "0.4.0" 1044 | source = "registry+https://github.com/rust-lang/crates.io-index" 1045 | checksum = "9e3dfc207c526015c632472a77be09cf1b6e46866581aecae5cc38fb4235dea2" 1046 | dependencies = [ 1047 | "libc", 1048 | "winapi", 1049 | ] 1050 | 1051 | [[package]] 1052 | name = "syn" 1053 | version = "1.0.74" 1054 | source = "registry+https://github.com/rust-lang/crates.io-index" 1055 | checksum = "1873d832550d4588c3dbc20f01361ab00bfe741048f71e3fecf145a7cc18b29c" 1056 | dependencies = [ 1057 | "proc-macro2", 1058 | "quote", 1059 | "unicode-xid", 1060 | ] 1061 | 1062 | [[package]] 1063 | name = "tempfile" 1064 | version = "3.2.0" 1065 | source = "registry+https://github.com/rust-lang/crates.io-index" 1066 | checksum = "dac1c663cfc93810f88aed9b8941d48cabf856a1b111c29a40439018d870eb22" 1067 | dependencies = [ 1068 | "cfg-if", 1069 | "libc", 1070 | "rand", 1071 | "redox_syscall", 1072 | "remove_dir_all", 1073 | "winapi", 1074 | ] 1075 | 1076 | [[package]] 1077 | name = "termcolor" 1078 | version = "1.1.2" 1079 | source = "registry+https://github.com/rust-lang/crates.io-index" 1080 | checksum = "2dfed899f0eb03f32ee8c6a0aabdb8a7949659e3466561fc0adf54e26d88c5f4" 1081 | dependencies = [ 1082 | "winapi-util", 1083 | ] 1084 | 1085 | [[package]] 1086 | name = "thiserror" 1087 | version = "1.0.26" 1088 | source = "registry+https://github.com/rust-lang/crates.io-index" 1089 | checksum = "93119e4feac1cbe6c798c34d3a53ea0026b0b1de6a120deef895137c0529bfe2" 1090 | dependencies = [ 1091 | "thiserror-impl", 1092 | ] 1093 | 1094 | [[package]] 1095 | name = "thiserror-impl" 1096 | version = "1.0.26" 1097 | source = "registry+https://github.com/rust-lang/crates.io-index" 1098 | checksum = "060d69a0afe7796bf42e9e2ff91f5ee691fb15c53d38b4b62a9a53eb23164745" 1099 | dependencies = [ 1100 | "proc-macro2", 1101 | "quote", 1102 | "syn", 1103 | ] 1104 | 1105 | [[package]] 1106 | name = "tinyvec" 1107 | version = "1.3.1" 1108 | source = "registry+https://github.com/rust-lang/crates.io-index" 1109 | checksum = "848a1e1181b9f6753b5e96a092749e29b11d19ede67dfbbd6c7dc7e0f49b5338" 1110 | dependencies = [ 1111 | "tinyvec_macros", 1112 | ] 1113 | 1114 | [[package]] 1115 | name = "tinyvec_macros" 1116 | version = "0.1.0" 1117 | source = "registry+https://github.com/rust-lang/crates.io-index" 1118 | checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" 1119 | 1120 | [[package]] 1121 | name = "tokio" 1122 | version = "1.9.0" 1123 | source = "registry+https://github.com/rust-lang/crates.io-index" 1124 | checksum = "4b7b349f11a7047e6d1276853e612d152f5e8a352c61917887cc2169e2366b4c" 1125 | dependencies = [ 1126 | "autocfg", 1127 | "bytes", 1128 | "libc", 1129 | "memchr", 1130 | "mio", 1131 | "num_cpus", 1132 | "pin-project-lite", 1133 | "tokio-macros", 1134 | "winapi", 1135 | ] 1136 | 1137 | [[package]] 1138 | name = "tokio-macros" 1139 | version = "1.3.0" 1140 | source = "registry+https://github.com/rust-lang/crates.io-index" 1141 | checksum = "54473be61f4ebe4efd09cec9bd5d16fa51d70ea0192213d754d2d500457db110" 1142 | dependencies = [ 1143 | "proc-macro2", 1144 | "quote", 1145 | "syn", 1146 | ] 1147 | 1148 | [[package]] 1149 | name = "tokio-native-tls" 1150 | version = "0.3.0" 1151 | source = "registry+https://github.com/rust-lang/crates.io-index" 1152 | checksum = "f7d995660bd2b7f8c1568414c1126076c13fbb725c40112dc0120b78eb9b717b" 1153 | dependencies = [ 1154 | "native-tls", 1155 | "tokio", 1156 | ] 1157 | 1158 | [[package]] 1159 | name = "tokio-util" 1160 | version = "0.6.7" 1161 | source = "registry+https://github.com/rust-lang/crates.io-index" 1162 | checksum = "1caa0b0c8d94a049db56b5acf8cba99dc0623aab1b26d5b5f5e2d945846b3592" 1163 | dependencies = [ 1164 | "bytes", 1165 | "futures-core", 1166 | "futures-sink", 1167 | "log", 1168 | "pin-project-lite", 1169 | "tokio", 1170 | ] 1171 | 1172 | [[package]] 1173 | name = "toml" 1174 | version = "0.5.8" 1175 | source = "registry+https://github.com/rust-lang/crates.io-index" 1176 | checksum = "a31142970826733df8241ef35dc040ef98c679ab14d7c3e54d827099b3acecaa" 1177 | dependencies = [ 1178 | "serde", 1179 | ] 1180 | 1181 | [[package]] 1182 | name = "tower-service" 1183 | version = "0.3.1" 1184 | source = "registry+https://github.com/rust-lang/crates.io-index" 1185 | checksum = "360dfd1d6d30e05fda32ace2c8c70e9c0a9da713275777f5a4dbb8a1893930c6" 1186 | 1187 | [[package]] 1188 | name = "tracing" 1189 | version = "0.1.26" 1190 | source = "registry+https://github.com/rust-lang/crates.io-index" 1191 | checksum = "09adeb8c97449311ccd28a427f96fb563e7fd31aabf994189879d9da2394b89d" 1192 | dependencies = [ 1193 | "cfg-if", 1194 | "pin-project-lite", 1195 | "tracing-attributes", 1196 | "tracing-core", 1197 | ] 1198 | 1199 | [[package]] 1200 | name = "tracing-attributes" 1201 | version = "0.1.15" 1202 | source = "registry+https://github.com/rust-lang/crates.io-index" 1203 | checksum = "c42e6fa53307c8a17e4ccd4dc81cf5ec38db9209f59b222210375b54ee40d1e2" 1204 | dependencies = [ 1205 | "proc-macro2", 1206 | "quote", 1207 | "syn", 1208 | ] 1209 | 1210 | [[package]] 1211 | name = "tracing-core" 1212 | version = "0.1.18" 1213 | source = "registry+https://github.com/rust-lang/crates.io-index" 1214 | checksum = "a9ff14f98b1a4b289c6248a023c1c2fa1491062964e9fed67ab29c4e4da4a052" 1215 | dependencies = [ 1216 | "lazy_static", 1217 | ] 1218 | 1219 | [[package]] 1220 | name = "try-lock" 1221 | version = "0.2.3" 1222 | source = "registry+https://github.com/rust-lang/crates.io-index" 1223 | checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" 1224 | 1225 | [[package]] 1226 | name = "unicode-bidi" 1227 | version = "0.3.5" 1228 | source = "registry+https://github.com/rust-lang/crates.io-index" 1229 | checksum = "eeb8be209bb1c96b7c177c7420d26e04eccacb0eeae6b980e35fcb74678107e0" 1230 | dependencies = [ 1231 | "matches", 1232 | ] 1233 | 1234 | [[package]] 1235 | name = "unicode-normalization" 1236 | version = "0.1.19" 1237 | source = "registry+https://github.com/rust-lang/crates.io-index" 1238 | checksum = "d54590932941a9e9266f0832deed84ebe1bf2e4c9e4a3554d393d18f5e854bf9" 1239 | dependencies = [ 1240 | "tinyvec", 1241 | ] 1242 | 1243 | [[package]] 1244 | name = "unicode-xid" 1245 | version = "0.2.2" 1246 | source = "registry+https://github.com/rust-lang/crates.io-index" 1247 | checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" 1248 | 1249 | [[package]] 1250 | name = "unindent" 1251 | version = "0.1.7" 1252 | source = "registry+https://github.com/rust-lang/crates.io-index" 1253 | checksum = "f14ee04d9415b52b3aeab06258a3f07093182b88ba0f9b8d203f211a7a7d41c7" 1254 | 1255 | [[package]] 1256 | name = "url" 1257 | version = "2.2.2" 1258 | source = "registry+https://github.com/rust-lang/crates.io-index" 1259 | checksum = "a507c383b2d33b5fc35d1861e77e6b383d158b2da5e14fe51b83dfedf6fd578c" 1260 | dependencies = [ 1261 | "form_urlencoded", 1262 | "idna", 1263 | "matches", 1264 | "percent-encoding", 1265 | ] 1266 | 1267 | [[package]] 1268 | name = "vcpkg" 1269 | version = "0.2.15" 1270 | source = "registry+https://github.com/rust-lang/crates.io-index" 1271 | checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" 1272 | 1273 | [[package]] 1274 | name = "want" 1275 | version = "0.3.0" 1276 | source = "registry+https://github.com/rust-lang/crates.io-index" 1277 | checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" 1278 | dependencies = [ 1279 | "log", 1280 | "try-lock", 1281 | ] 1282 | 1283 | [[package]] 1284 | name = "wasi" 1285 | version = "0.10.2+wasi-snapshot-preview1" 1286 | source = "registry+https://github.com/rust-lang/crates.io-index" 1287 | checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" 1288 | 1289 | [[package]] 1290 | name = "wildmatch" 1291 | version = "2.1.0" 1292 | source = "registry+https://github.com/rust-lang/crates.io-index" 1293 | checksum = "d6c48bd20df7e4ced539c12f570f937c6b4884928a87fee70a479d72f031d4e0" 1294 | 1295 | [[package]] 1296 | name = "winapi" 1297 | version = "0.3.9" 1298 | source = "registry+https://github.com/rust-lang/crates.io-index" 1299 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 1300 | dependencies = [ 1301 | "winapi-i686-pc-windows-gnu", 1302 | "winapi-x86_64-pc-windows-gnu", 1303 | ] 1304 | 1305 | [[package]] 1306 | name = "winapi-i686-pc-windows-gnu" 1307 | version = "0.4.0" 1308 | source = "registry+https://github.com/rust-lang/crates.io-index" 1309 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 1310 | 1311 | [[package]] 1312 | name = "winapi-util" 1313 | version = "0.1.5" 1314 | source = "registry+https://github.com/rust-lang/crates.io-index" 1315 | checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" 1316 | dependencies = [ 1317 | "winapi", 1318 | ] 1319 | 1320 | [[package]] 1321 | name = "winapi-x86_64-pc-windows-gnu" 1322 | version = "0.4.0" 1323 | source = "registry+https://github.com/rust-lang/crates.io-index" 1324 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 1325 | --------------------------------------------------------------------------------