diff --git a/.dockerignore b/.dockerignore index d6dc5af..e280464 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,15 +1,15 @@ * -!/packages/backend/src -!/packages/backend/Cargo.lock -!/packages/backend/Cargo.toml +!/packages +!/package.json +!/pnpm-lock.yaml +!/pnpm-workspace.yaml -!/packages/frontend/locales -!/packages/frontend/src -!/packages/frontend/static -!/packages/frontend/.npmrc -!/packages/frontend/package.json -!/packages/frontend/pnpm-lock.yaml -!/packages/frontend/svelte.config.js -!/packages/frontend/tsconfig.json -!/packages/frontend/vite.config.js +**/target +**/node_modules +**/dist +**/bin +**/*.tsbuildinfo +**/build +**/.svelte +**/.svelte-kit diff --git a/.github/workflows/docker.yml b/.github/workflows/release.yml similarity index 56% rename from .github/workflows/docker.yml rename to .github/workflows/release.yml index 7af0cc6..1dea9a7 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/release.yml @@ -4,21 +4,34 @@ on: workflow_dispatch: push: tags: - - "v*.*.*" + - 'v*.*.*' jobs: + cli: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + + - uses: actions/setup-node@v3 + with: + node-version-file: '.nvmrc' + - uses: pnpm/action-setup@v2 + + - run: | + pnpm install --frozen-lockfile + pnpm run build + docker: runs-on: ubuntu-latest steps: - - name: Set up QEMU - uses: docker/setup-qemu-action@v1 - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v1 + - uses: actions/checkout@v3 + - uses: docker/setup-qemu-action@v2 + - uses: docker/setup-buildx-action@v2 with: install: true - name: Docker Labels id: meta - uses: crazy-max/ghaction-docker-meta@v2 + uses: docker/metadata-action@v4 with: images: cupcakearmy/cryptgeon tags: | @@ -26,12 +39,12 @@ jobs: type=semver,pattern={{major}}.{{minor}} type=semver,pattern={{major}} - name: Login to DockerHub - uses: docker/login-action@v1 + uses: docker/login-action@v2 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Build and push - uses: docker/build-push-action@v2 + uses: docker/build-push-action@v4 with: platforms: linux/amd64,linux/arm64 push: true diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index d6d27b2..a4a3114 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -10,27 +10,29 @@ jobs: test: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 - - uses: actions/setup-node@v2 - with: - node-version: "16" + - uses: actions/checkout@v3 - - uses: docker/setup-qemu-action@v1 - - uses: docker/setup-buildx-action@v1 + # Node + - uses: actions/setup-node@v3 + with: + node-version-file: '.nvmrc' + - uses: pnpm/action-setup@v2 + + # Docker + - uses: docker/setup-qemu-action@v2 + - uses: docker/setup-buildx-action@v2 with: install: true - - name: Build docker image - run: npm run test:prepare - name: Prepare run: | - npm install playwright - npx playwright install --with-deps + pnpm install --frozen-lockfile + pnpm exec playwright install --with-deps + pnpm run test:prepare - name: Run your tests - run: npm test - - uses: actions/upload-artifact@v2 - if: always() + run: pnpm test + - uses: actions/upload-artifact@v3 with: name: test-results path: test-results diff --git a/.gitignore b/.gitignore index f3198e7..4c85f1f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,14 +1,10 @@ +.env +*.tsbuildinfo +node_modules +dist +bin -# Backend target -# Client -.DS_Store -node_modules -/.svelte -/build -/functions -.env - -General +# Testing test-results diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 0000000..d3e33db --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +v18.16 diff --git a/CHANGELOG.md b/CHANGELOG.md index e2813e1..65ded82 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,17 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [2.3.0] - 2023-05-XX + +### Added + +- New CLI 🎉 +- Russian language + +### Changed + +- Moved to monorepo + ## [2.2.0] - 2023-01-14 ### Changed diff --git a/Dockerfile b/Dockerfile index a1681a8..9202c40 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,31 +1,27 @@ # FRONTEND -FROM node:16-alpine as client +FROM node:18-alpine as client WORKDIR /tmp -RUN npm install -g pnpm@7 -COPY ./packages/frontend ./ -RUN pnpm install -RUN pnpm exec svelte-kit sync +RUN npm install -g pnpm@8 +COPY . . +RUN pnpm install --frozen-lockfile RUN pnpm run build # BACKEND -FROM rust:1.64-alpine as backend +FROM rust:1.69-alpine as backend WORKDIR /tmp RUN apk add libc-dev openssl-dev alpine-sdk COPY ./packages/backend/Cargo.* ./ -# https://blog.rust-lang.org/2022/06/22/sparse-registry-testing.html -RUN rustup update nightly -ENV CARGO_UNSTABLE_SPARSE_REGISTRY=true -RUN cargo +nightly fetch +RUN cargo fetch COPY ./packages/backend ./ -RUN cargo +nightly build --release +RUN cargo build --release # RUNNER FROM alpine WORKDIR /app COPY --from=backend /tmp/target/release/cryptgeon . -COPY --from=client /tmp/build ./frontend +COPY --from=client /tmp/packages/frontend/build ./frontend ENV FRONTEND_PATH="./frontend" ENV REDIS="redis://redis/" EXPOSE 8000 diff --git a/cryptgeon.code-workspace b/cryptgeon.code-workspace index 83ba629..be05d60 100644 --- a/cryptgeon.code-workspace +++ b/cryptgeon.code-workspace @@ -5,12 +5,19 @@ }, { "path": "packages/backend" + }, + { + "path": "packages/frontend" + }, + { + "path": "packages/cli" + }, + { + "path": "packages/shared" } ], "settings": { - "cSpell.words": ["ciphertext", "cryptgeon"], - "i18n-ally.enabledFrameworks": ["svelte"], - "i18n-ally.keystyle": "nested", - "i18n-ally.localesPaths": ["packages/frontend/locales"] + "i18n-ally.localesPaths": ["packages/frontend/locales"], + "cSpell.words": ["cryptgeon"] } } diff --git a/docker-compose.dev.yaml b/docker-compose.dev.yaml index 2e05170..9a6f0e7 100644 --- a/docker-compose.dev.yaml +++ b/docker-compose.dev.yaml @@ -10,7 +10,6 @@ services: - 6379:6379 app: - image: cupcakearmy/cryptgeon:test build: . env_file: .dev.env depends_on: diff --git a/package.json b/package.json index 55f8537..e6fb6d7 100644 --- a/package.json +++ b/package.json @@ -1,18 +1,21 @@ { + "packageManager": "pnpm@8.4.0", "scripts": { "dev:docker": "docker-compose -f docker-compose.dev.yaml up redis", "dev:packages": "pnpm --parallel run dev", - "dev:proxy": "node proxy.mjs", "dev": "run-p dev:*", + "docker:up": "docker compose -f docker-compose.dev.yaml up", + "docker:build": "docker compose -f docker-compose.dev.yaml build", "test": "playwright test --project chrome firefox safari", "test:local": "playwright test --project local", - "test:server": "docker compose -f docker-compose.dev.yaml up", - "test:prepare": "docker compose -f docker-compose.dev.yaml build" + "test:server": "run-s docker:up", + "test:prepare": "run-p build docker:build", + "build": "pnpm run --recursive --filter=!@cryptgeon/backend build" }, "devDependencies": { - "@playwright/test": "^1.29.2", - "@types/node": "^16.18.11", - "http-proxy": "^1.18.1", - "npm-run-all": "^4.1.5" + "@playwright/test": "^1.33.0", + "@types/node": "^20.1.3", + "npm-run-all": "^4.1.5", + "shelljs": "^0.8.5" } } diff --git a/packages/backend/Cargo.lock b/packages/backend/Cargo.lock index 8fe4aea..898d59c 100644 --- a/packages/backend/Cargo.lock +++ b/packages/backend/Cargo.lock @@ -4,19 +4,19 @@ version = 3 [[package]] name = "actix-codec" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57a7559404a7f3573127aab53c08ce37a6c6a315c374a31070f3c91cd1b4a7fe" +checksum = "617a8268e3537fe1d8c9ead925fca49ef6400927ee7bc26750e90ecee14ce4b8" dependencies = [ "bitflags", "bytes", "futures-core", "futures-sink", - "log", "memchr", "pin-project-lite", "tokio", "tokio-util", + "tracing", ] [[package]] @@ -44,15 +44,15 @@ dependencies = [ [[package]] name = "actix-http" -version = "3.2.2" +version = "3.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c83abf9903e1f0ad9973cc4f7b9767fd5a03a583f51a5b7a339e07987cd2724" +checksum = "c2079246596c18b4a33e274ae10c0e50613f4d32a4198e09c7b93771013fed74" dependencies = [ "actix-codec", "actix-rt", "actix-service", "actix-utils", - "ahash", + "ahash 0.8.3", "base64", "bitflags", "brotli", @@ -75,6 +75,8 @@ dependencies = [ "rand", "sha1 0.10.5", "smallvec", + "tokio", + "tokio-util", "tracing", "zstd", ] @@ -86,7 +88,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "465a6172cf69b960917811022d8f29bc0b7fa1398bc4f78b3c466673db1213b6" dependencies = [ "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -104,9 +106,9 @@ dependencies = [ [[package]] name = "actix-rt" -version = "2.7.0" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ea16c295198e958ef31930a6ef37d0fb64e9ca3b6116e6b93a8bdae96ee1000" +checksum = "15265b6b8e2347670eb363c47fc8c75208b4a4994b27192f345fcbe707804f3e" dependencies = [ "futures-core", "tokio", @@ -114,9 +116,9 @@ dependencies = [ [[package]] name = "actix-server" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0da34f8e659ea1b077bb4637948b815cd3768ad5a188fdcd74ff4d84240cd824" +checksum = "3e8613a75dd50cc45f473cee3c34d59ed677c0f7b44480ce3b8247d7dc519327" dependencies = [ "actix-rt", "actix-service", @@ -153,9 +155,9 @@ dependencies = [ [[package]] name = "actix-web" -version = "4.2.1" +version = "4.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d48f7b6534e06c7bfc72ee91db7917d4af6afe23e7d223b51e68fffbb21e96b9" +checksum = "cd3cb42f9566ab176e1ef0b8b3a896529062b4efc6be0123046095914c4c1c96" dependencies = [ "actix-codec", "actix-http", @@ -166,7 +168,7 @@ dependencies = [ "actix-service", "actix-utils", "actix-web-codegen", - "ahash", + "ahash 0.7.6", "bytes", "bytestring", "cfg-if", @@ -194,14 +196,14 @@ dependencies = [ [[package]] name = "actix-web-codegen" -version = "4.1.0" +version = "4.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fa9362663c8643d67b2d5eafba49e4cb2c8a053a29ed00a0bea121f17c76b13" +checksum = "2262160a7ae29e3415554a3f1fc04c764b1540c116aa524683208078b7a75bc9" dependencies = [ "actix-router", "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -222,10 +224,22 @@ dependencies = [ ] [[package]] -name = "aho-corasick" -version = "0.7.20" +name = "ahash" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac" +checksum = "2c99f64d1e06488f620f932677e24bc6e2897582980441ae90a671415bd7ec2f" +dependencies = [ + "cfg-if", + "getrandom", + "once_cell", + "version_check", +] + +[[package]] +name = "aho-corasick" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67fc08ce920c31afb70f013dcce1bfc3a3195de6a228474e45e1f145b36f8d04" dependencies = [ "memchr", ] @@ -253,13 +267,13 @@ checksum = "619743e34b5ba4e9703bba34deac3427c72507c7159f5fd030aea8cac0cfe341" [[package]] name = "async-trait" -version = "0.1.61" +version = "0.1.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "705339e0e4a9690e2908d2b3d049d85682cf19fbd5782494498fbf7003a6a282" +checksum = "b9ccdd8f2a161be9bd5c023df56f1b2a0bd1d83872ae53b71a84a12c9bf6e842" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.15", ] [[package]] @@ -281,9 +295,9 @@ checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" [[package]] name = "base64" -version = "0.13.1" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" +checksum = "a4a4ddaa51a5bc52a6948f74c06d20aaaddb71924eab79b8c97a8c556e942d6a" [[package]] name = "bitflags" @@ -293,9 +307,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "block-buffer" -version = "0.10.3" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69cce20737498f97b993470a6e536b8523f0af7892a4f928cceb1ac5e52ebe7e" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" dependencies = [ "generic-array", ] @@ -313,9 +327,9 @@ dependencies = [ [[package]] name = "brotli-decompressor" -version = "2.3.2" +version = "2.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59ad2d4653bf5ca36ae797b1f4bb4dbddb60ce49ca4aed8a2ce4829f60425b80" +checksum = "4b6561fd3f895a11e8f72af2cb7d22e08366bebc2b6b57f7744c4bda27034744" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -334,15 +348,15 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.11.1" +version = "3.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "572f695136211188308f16ad2ca5c851a712c464060ae6974944458eb83880ba" +checksum = "3c6ed94e98ecff0c12dd1b04c15ec0d7d9458ca8fe806cea6f12954efe74c63b" [[package]] name = "byte-unit" -version = "4.0.18" +version = "4.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3348673602e04848647fffaa8e9a861e7b5d5cae6570727b41bde0f722514484" +checksum = "da78b32057b8fdfc352504708feeba7216dcd65a2c9ab02978cbd288d1279b6c" dependencies = [ "serde", "utf8-width", @@ -350,24 +364,24 @@ dependencies = [ [[package]] name = "bytes" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfb24e866b15a1af2a1b663f10c6b6b8f397a84aadb828f12e5b289ec23a3a3c" +checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" [[package]] name = "bytestring" -version = "1.2.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7f83e57d9154148e355404702e2694463241880b939570d7c97c014da7a69a1" +checksum = "238e4886760d98c4f899360c834fa93e62cf7f721ac3c2da375cbdf4b8679aae" dependencies = [ "bytes", ] [[package]] name = "cc" -version = "1.0.78" +version = "1.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a20104e2335ce8a659d6dd92a51a767a0c062599c73b343fd152cb401e828c3d" +checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" dependencies = [ "jobserver", ] @@ -407,9 +421,9 @@ dependencies = [ [[package]] name = "cpufeatures" -version = "0.2.5" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28d997bd5e24a5928dd43e46dc529867e207907fe0b239c3477d924f7f2ca320" +checksum = "3e4c1eaa2012c47becbbad2ab175484c2a84d1185b566fb2cc5b8707343dfe58" dependencies = [ "libc", ] @@ -425,7 +439,7 @@ dependencies = [ [[package]] name = "cryptgeon" -version = "2.2.0" +version = "2.3.0-beta.4" dependencies = [ "actix-files", "actix-web", @@ -461,7 +475,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version", - "syn", + "syn 1.0.109", ] [[package]] @@ -482,9 +496,9 @@ checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f" [[package]] name = "encoding_rs" -version = "0.8.31" +version = "0.8.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9852635589dc9f9ea1b6fe9f05b50ef208c85c834a562f0c6abb1c475736ec2b" +checksum = "071a31f4ee85403370b58aca746f01041ede6f0da2730960ad001edc2b71b394" dependencies = [ "cfg-if", ] @@ -504,9 +518,9 @@ dependencies = [ [[package]] name = "flate2" -version = "1.0.25" +version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8a2db397cb1c8772f31494cb8917e48cd1e64f0fa7efac59fbd741a0a8ce841" +checksum = "3b9429470923de8e8cbd4d2dc513535400b4b3fef0319fb5c4e1f520a7bef743" dependencies = [ "crc32fast", "miniz_oxide", @@ -529,27 +543,27 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.25" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04909a7a7e4633ae6c4a9ab280aeb86da1236243a77b694a49eacd659a4bd3ac" +checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" [[package]] name = "futures-sink" -version = "0.3.25" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39c15cf1a4aa79df40f1bb462fb39676d0ad9e366c2a33b590d7c66f4f81fcf9" +checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" [[package]] name = "futures-task" -version = "0.3.25" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ffb393ac5d9a6eaa9d3fdf37ae2776656b706e200c8e16b1bdb227f5198e6ea" +checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" [[package]] name = "futures-util" -version = "0.3.25" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "197676987abd2f9cadff84926f410af1c183608d36641465df73ae8211dc65d6" +checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" dependencies = [ "futures-core", "futures-task", @@ -559,9 +573,9 @@ dependencies = [ [[package]] name = "generic-array" -version = "0.14.6" +version = "0.14.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bff49e947297f3312447abdca79f45f4738097cc82b06e72054d2223f601f1b9" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", @@ -569,9 +583,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.8" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31" +checksum = "c85e1d9ab2eadba7e5040d4e09cbd6d072b76a557ad64e797c2cb9d4da21d7e4" dependencies = [ "cfg-if", "libc", @@ -580,9 +594,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.3.15" +version = "0.3.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f9f29bc9dda355256b2916cf526ab02ce0aeaaaf2bad60d65ef3f12f11dd0f4" +checksum = "d357c7ae988e7d2182f7d7871d0b963962420b0678b0997ce7de72001aeab782" dependencies = [ "bytes", "fnv", @@ -623,9 +637,9 @@ dependencies = [ [[package]] name = "http" -version = "0.2.8" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75f43d41e26995c17e71ee126451dd3941010b0514a81a9d11f3b341debc2399" +checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" dependencies = [ "bytes", "fnv", @@ -668,9 +682,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "1.9.2" +version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1885e79c1fc4b10f0e172c475f458b7f7b93061064d98c3293e98c5ba0c8b399" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" dependencies = [ "autocfg", "hashbrown", @@ -678,24 +692,24 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.5" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fad582f4b9e86b6caa621cabeb0963332d92eea04729ab12892c2533951e6440" +checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" [[package]] name = "jobserver" -version = "0.1.25" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "068b1ee6743e4d11fb9c6a1e6064b3693a1b600e7f5f5988047d98b3dc9fb90b" +checksum = "936cfd212a0155903bcbc060e316fb6cc7cbf2e1907329391ebadc1fe0ce77c2" dependencies = [ "libc", ] [[package]] name = "js-sys" -version = "0.3.60" +version = "0.3.62" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49409df3e3bf0856b916e2ceaca09ee28e6871cf7d9ce97a692cacfdb2a25a47" +checksum = "68c16e1bfd491478ab155fd8b4896b86f9ede344949b641e61501e07c2b8b4d5" dependencies = [ "wasm-bindgen", ] @@ -714,9 +728,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.139" +version = "0.2.144" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "201de327520df007757c1f0adce6e827fe8562fbc28bfd9c15571c66ca1f5f79" +checksum = "2b00cc1c228a6782d0f076e7b232802e0c5689d41bb5df366f2a6b6621cfdfe1" [[package]] name = "local-channel" @@ -763,9 +777,9 @@ checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" [[package]] name = "mime" -version = "0.3.16" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] name = "mime_guess" @@ -779,23 +793,23 @@ dependencies = [ [[package]] name = "miniz_oxide" -version = "0.6.2" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b275950c28b37e794e8c55d88aeb5e139d0ce23fdbbeda68f8d7174abdf9e8fa" +checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" dependencies = [ "adler", ] [[package]] name = "mio" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5d732bc30207a6423068df043e3d02e0735b155ad7ce1a6f76fe2baa5b158de" +checksum = "5b9d9a46eff5b4ff64b45a9e316a6d1e0bc719ef429cbec4dc630684212bfdf9" dependencies = [ "libc", "log", "wasi", - "windows-sys", + "windows-sys 0.45.0", ] [[package]] @@ -840,9 +854,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.17.0" +version = "1.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f61fba1741ea2b3d6a1e3178721804bb716a68a6aeba1149b5d52e3d464ea66" +checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" [[package]] name = "parking_lot" @@ -856,22 +870,22 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.6" +version = "0.9.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba1ef8814b5c993410bb3adfad7a5ed269563e4a2f90c41f5d85be7fb47133bf" +checksum = "9069cbb9f99e3a5083476ccb29ceb1de18b9118cafa53e90c9551235de2b9521" dependencies = [ "cfg-if", "libc", "redox_syscall", "smallvec", - "windows-sys", + "windows-sys 0.45.0", ] [[package]] name = "paste" -version = "1.0.11" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d01a5bd0424d00070b0098dd17ebca6f961a959dead1dbcbbbc1d1cd8d3deeba" +checksum = "9f746c4065a8fa3fe23974dd82f15431cc8d40779821001404d10d2e79ca7d79" [[package]] name = "percent-encoding" @@ -893,9 +907,9 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "pkg-config" -version = "0.3.26" +version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ac9a59f73473f1b8d852421e59e64809f025994837ef743615c6d0c5b305160" +checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" [[package]] name = "ppv-lite86" @@ -905,18 +919,18 @@ checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" [[package]] name = "proc-macro2" -version = "1.0.49" +version = "1.0.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57a8eca9f9c4ffde41714334dee777596264c7825420f521abc92b5b5deb63a5" +checksum = "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.23" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8856d8364d252a14d474036ea1358d63c9e6965c8e5c1885c18f73d70bff9c7b" +checksum = "8f4f29d145265ec1c483c7c654450edde0bfe043d3938d6972630663356d9500" dependencies = [ "proc-macro2", ] @@ -977,9 +991,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.7.1" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48aaa5748ba571fb95cd2c85c09f629215d3a6ece942baa100950af03a34f733" +checksum = "af83e617f331cc6ae2da5443c602dfa5af81e517212d9d611a5b3ba1777b5370" dependencies = [ "aho-corasick", "memchr", @@ -988,9 +1002,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.6.28" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848" +checksum = "a5996294f19bd3aae0453a862ad728f60e6600695733dd5df01da90c54363a3c" [[package]] name = "ring" @@ -1018,9 +1032,9 @@ dependencies = [ [[package]] name = "ryu" -version = "1.0.12" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b4b9743ed687d4b4bcedf9ff5eaa7398495ae14e61cba0a295704edbc7decde" +checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041" [[package]] name = "scopeguard" @@ -1030,35 +1044,35 @@ checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" [[package]] name = "semver" -version = "1.0.16" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58bc9567378fc7690d6b2addae4e60ac2eeea07becb2c64b9f218b53865cba2a" +checksum = "bebd363326d05ec3e2f532ab7660680f3b02130d780c299bca73469d521bc0ed" [[package]] name = "serde" -version = "1.0.152" +version = "1.0.163" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb7d1f0d3021d347a83e556fc4683dea2ea09d87bccdf88ff5c12545d89d5efb" +checksum = "2113ab51b87a539ae008b5c6c02dc020ffa39afd2d83cffcb3f4eb2722cebec2" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.152" +version = "1.0.163" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af487d118eecd09402d70a5d72551860e788df87b464af30e5ea6a38c75c541e" +checksum = "8c805777e3930c8883389c602315a24224bcc738b63905ef87cd1420353ea93e" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.15", ] [[package]] name = "serde_json" -version = "1.0.91" +version = "1.0.96" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877c235533714907a8c2464236f5c4b2a17262ef1bd71f38f35ea592c8da6883" +checksum = "057d394a50403bcac12672b2b18fb387ab6d289d957dab67dd201875391e52f1" dependencies = [ "itoa", "ryu", @@ -1105,18 +1119,18 @@ checksum = "ae1a47186c03a32177042e55dbc5fd5aee900b8e0069a8d70fba96a9375cd012" [[package]] name = "signal-hook-registry" -version = "1.4.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51e73328dc4ac0c7ccbda3a494dfa03df1de2f46018127f60c693f2648455b0" +checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" dependencies = [ "libc", ] [[package]] name = "slab" -version = "0.4.7" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4614a76b2a8be0058caa9dbbaf66d988527d86d003c11a94fbd335d7661edcef" +checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d" dependencies = [ "autocfg", ] @@ -1129,9 +1143,9 @@ checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" [[package]] name = "socket2" -version = "0.4.7" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02e2d2db9033d13a1567121ddd7a095ee144db4e1ca1b1bda3419bc0da294ebd" +checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" dependencies = [ "libc", "winapi", @@ -1145,9 +1159,20 @@ checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" [[package]] name = "syn" -version = "1.0.107" +version = "1.0.109" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f4064b5b16e03ae50984a5a8ed5d4f8803e6bc1fd170a3cda91a1be4b18e3f5" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a34fcf3e8b60f57e6a14301a2e916d323af98b0ea63c599441eec8558660c822" dependencies = [ "proc-macro2", "quote", @@ -1156,18 +1181,18 @@ dependencies = [ [[package]] name = "termcolor" -version = "1.1.3" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bab24d30b911b2376f3a13cc2cd443142f0c81dda04c118693e35b3835757755" +checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6" dependencies = [ "winapi-util", ] [[package]] name = "time" -version = "0.3.17" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a561bf4617eebd33bca6434b988f39ed798e527f51a1e797d0ee4f61c0a38376" +checksum = "8f3403384eaacbca9923fa06940178ac13e4edb725486d70e8e15881d0c836cc" dependencies = [ "itoa", "serde", @@ -1177,15 +1202,15 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e153e1f1acaef8acc537e68b44906d2db6436e2b35ac2c6b42640fff91f00fd" +checksum = "7300fbefb4dadc1af235a9cef3737cea692a9d97e1b9cbcd4ebdae6f8868e6fb" [[package]] name = "time-macros" -version = "0.2.6" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d967f99f534ca7e495c575c62638eebc2898a8c84c119b89e250477bc4ba16b2" +checksum = "372950940a5f07bf38dbe211d7283c9e6d7327df53794992d293e534c733d09b" dependencies = [ "time-core", ] @@ -1201,33 +1226,32 @@ dependencies = [ [[package]] name = "tinyvec_macros" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.25.0" +version = "1.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8e00990ebabbe4c14c08aca901caed183ecd5c09562a12c824bb53d3c3fd3af" +checksum = "0aa32867d44e6f2ce3385e89dceb990188b8bb0fb25b0cf576647a6f98ac5105" dependencies = [ "autocfg", "bytes", "libc", - "memchr", "mio", "parking_lot", "pin-project-lite", "signal-hook-registry", "socket2", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] name = "tokio-util" -version = "0.7.4" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bb2e075f03b3d66d8d8785356224ba688d2906a371015e225beeb65ca92c740" +checksum = "806fe8c2c87eccc8b3267cbae29ed3ab2d0bd37fca70ab622e46aaa9375ddb7d" dependencies = [ "bytes", "futures-core", @@ -1251,9 +1275,9 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.30" +version = "0.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a" +checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a" dependencies = [ "once_cell", ] @@ -1275,15 +1299,15 @@ dependencies = [ [[package]] name = "unicode-bidi" -version = "0.3.8" +version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992" +checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" [[package]] name = "unicode-ident" -version = "1.0.6" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84a22b9f218b40614adcb3f4ff08b703773ad44fa9423e4e0d346d5db86e4ebc" +checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" [[package]] name = "unicode-normalization" @@ -1331,9 +1355,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.83" +version = "0.2.85" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eaf9f5aceeec8be17c128b2e93e031fb8a4d469bb9c4ae2d7dc1888b26887268" +checksum = "5b6cb788c4e39112fbe1822277ef6fb3c55cd86b95cb3d3c4c1c9597e4ac74b4" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -1341,24 +1365,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.83" +version = "0.2.85" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c8ffb332579b0557b52d268b91feab8df3615f265d5270fec2a8c95b17c1142" +checksum = "35e522ed4105a9d626d885b35d62501b30d9666283a5c8be12c14a8bdafe7822" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn", + "syn 2.0.15", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.83" +version = "0.2.85" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "052be0f94026e6cbc75cdefc9bae13fd6052cdcaf532fa6c45e7ae33a1e6c810" +checksum = "358a79a0cb89d21db8120cbfb91392335913e4890665b1a7981d9e956903b434" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1366,28 +1390,28 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.83" +version = "0.2.85" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07bc0c051dc5f23e307b13285f9d75df86bfdf816c5721e573dec1f9b8aa193c" +checksum = "4783ce29f09b9d93134d41297aded3a712b7b979e9c6f28c32cb88c973a94869" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.15", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.83" +version = "0.2.85" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c38c045535d93ec4f0b4defec448e4291638ee608530863b1e2ba115d4fff7f" +checksum = "a901d592cafaa4d711bc324edfaff879ac700b19c3dfd60058d2b445be2691eb" [[package]] name = "web-sys" -version = "0.3.60" +version = "0.3.62" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcda906d8be16e728fd5adc5b729afad4e444e106ab28cd1c7256e54fa61510f" +checksum = "16b5f940c7edfdc6d12126d98c9ef4d1b3d470011c47c76a6581df47ad9ba721" dependencies = [ "js-sys", "wasm-bindgen", @@ -1426,75 +1450,150 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windows-sys" -version = "0.42.0" +version = "0.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", + "windows-targets 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.0", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows-targets" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5" +dependencies = [ + "windows_aarch64_gnullvm 0.48.0", + "windows_aarch64_msvc 0.48.0", + "windows_i686_gnu 0.48.0", + "windows_i686_msvc 0.48.0", + "windows_x86_64_gnu 0.48.0", + "windows_x86_64_gnullvm 0.48.0", + "windows_x86_64_msvc 0.48.0", ] [[package]] name = "windows_aarch64_gnullvm" -version = "0.42.1" +version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c9864e83243fdec7fc9c5444389dcbbfd258f745e7853198f365e3c4968a608" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" [[package]] name = "windows_aarch64_msvc" -version = "0.42.1" +version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c8b1b673ffc16c47a9ff48570a9d85e25d265735c503681332589af6253c6c7" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" [[package]] name = "windows_i686_gnu" -version = "0.42.1" +version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de3887528ad530ba7bdbb1faa8275ec7a1155a45ffa57c37993960277145d640" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" [[package]] name = "windows_i686_msvc" -version = "0.42.1" +version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf4d1122317eddd6ff351aa852118a2418ad4214e6613a50e0191f7004372605" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" [[package]] name = "windows_x86_64_gnu" -version = "0.42.1" +version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1040f221285e17ebccbc2591ffdc2d44ee1f9186324dd3e84e99ac68d699c45" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" [[package]] name = "windows_x86_64_gnullvm" -version = "0.42.1" +version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "628bfdf232daa22b0d64fdb62b09fcc36bb01f05a3939e20ab73aaf9470d0463" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" [[package]] name = "windows_x86_64_msvc" -version = "0.42.1" +version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "447660ad36a13288b1db4d4248e857b510e8c3a225c822ba4fb748c0aafecffd" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" [[package]] name = "zstd" -version = "0.11.2+zstd.1.5.2" +version = "0.12.3+zstd.1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20cc960326ece64f010d2d2107537f26dc589a6573a316bd5b1dba685fa5fde4" +checksum = "76eea132fb024e0e13fd9c2f5d5d595d8a967aa72382ac2f9d39fcc95afd0806" dependencies = [ "zstd-safe", ] [[package]] name = "zstd-safe" -version = "5.0.2+zstd.1.5.2" +version = "6.0.5+zstd.1.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d2a5585e04f9eea4b2a3d1eca508c4dee9592a89ef6f450c11719da0726f4db" +checksum = "d56d9e60b4b1758206c238a10165fbcae3ca37b01744e394c463463f6529d23b" dependencies = [ "libc", "zstd-sys", @@ -1502,9 +1601,9 @@ dependencies = [ [[package]] name = "zstd-sys" -version = "2.0.5+zstd.1.5.2" +version = "2.0.8+zstd.1.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edc50ffce891ad571e9f9afe5039c4837bede781ac4bb13052ed7ae695518596" +checksum = "5556e6ee25d32df2586c098bbfa278803692a20d0ab9565e049480d52707ec8c" dependencies = [ "cc", "libc", diff --git a/packages/backend/Cargo.toml b/packages/backend/Cargo.toml index 6de3029..00ffa0d 100644 --- a/packages/backend/Cargo.toml +++ b/packages/backend/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cryptgeon" -version = "2.2.0" +version = "2.3.0-beta.4" authors = ["cupcakearmy "] edition = "2021" @@ -8,6 +8,9 @@ edition = "2021" name = "cryptgeon" path = "src/main.rs" +[registries.crates-io] +protocol = "sparse" + # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] diff --git a/packages/backend/package.json b/packages/backend/package.json index d5efad1..bcb0667 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -1,6 +1,6 @@ { - "name": "backend", "private": true, + "name": "@cryptgeon/backend", "scripts": { "dev": "cargo watch -x 'run --bin cryptgeon'", "build": "cargo build --release", diff --git a/packages/cli/package.json b/packages/cli/package.json new file mode 100644 index 0000000..df7f5bf --- /dev/null +++ b/packages/cli/package.json @@ -0,0 +1,37 @@ +{ + "version": "2.3.0-beta.4", + "name": "cryptgeon", + "type": "module", + "engines": { + "node": ">=18" + }, + "scripts": { + "dev": "./scripts/build.js --watch", + "build": "./scripts/build.js", + "package": "./scripts/package.js", + "bin": "run-s build package", + "prepublishOnly": "run-s build" + }, + "main": "./dist/index.cjs", + "bin": { + "cryptgeon": "./dist/index.cjs" + }, + "files": [ + "dist" + ], + "devDependencies": { + "@commander-js/extra-typings": "^10.0.3", + "@cryptgeon/shared": "workspace:*", + "@types/inquirer": "^9.0.3", + "@types/mime": "^3.0.1", + "@types/node": "^20.1.3", + "commander": "^10.0.1", + "esbuild": "^0.17.19", + "inquirer": "^9.2.2", + "mime": "^3.0.0", + "occulto": "^2.0.1", + "pkg": "^5.8.1", + "pretty-bytes": "^6.1.0", + "typescript": "^5.0.4" + } +} diff --git a/packages/cli/scripts/build.js b/packages/cli/scripts/build.js new file mode 100755 index 0000000..2626f51 --- /dev/null +++ b/packages/cli/scripts/build.js @@ -0,0 +1,17 @@ +#!/usr/bin/env node + +import { build, context } from 'esbuild' +import pkg from '../package.json' assert { type: 'json' } + +const options = { + entryPoints: ['./src/index.ts'], + bundle: true, + minify: true, + platform: 'node', + outfile: './dist/index.cjs', + define: { VERSION: `"${pkg.version}"` }, +} + +const watch = process.argv.slice(2)[0] === '--watch' +if (watch) (await context(options)).watch() +else await build(options) diff --git a/packages/cli/scripts/package.js b/packages/cli/scripts/package.js new file mode 100755 index 0000000..658f81c --- /dev/null +++ b/packages/cli/scripts/package.js @@ -0,0 +1,17 @@ +#!/usr/bin/env node + +import { exec } from 'pkg' + +const targets = [ + 'node18-macos-arm64', + 'node18-macos-x64', + 'node18-linux-arm64', + 'node18-linux-x64', + 'node18-win-arm64', + 'node18-win-x64', +] + +for (const target of targets) { + console.log(`🚀 Building ${target}`) + await exec(['./dist/index.cjs', '--target', target, '--output', `./bin/${target.replace('node18', 'cryptgeon')}`]) +} diff --git a/packages/cli/src/download.ts b/packages/cli/src/download.ts new file mode 100644 index 0000000..4da04ef --- /dev/null +++ b/packages/cli/src/download.ts @@ -0,0 +1,62 @@ +import { Adapters, get, info, setBase } from '@cryptgeon/shared' +import inquirer from 'inquirer' +import { access, constants, writeFile } from 'node:fs/promises' +import { basename, resolve } from 'node:path' +import { Hex } from 'occulto' +import pretty from 'pretty-bytes' + +import { exit } from './utils' + +export async function download(url: URL) { + setBase(url.origin) + const id = url.pathname.split('/')[2] + await info(id).catch(() => exit('Note does not exist or is expired')) + const note = await get(id) + + const password = url.hash.slice(1) + const key = Hex.decode(password) + + const couldNotDecrypt = () => exit('Could not decrypt note. Probably an invalid password') + switch (note.meta.type) { + case 'file': + const files = await Adapters.Files.decrypt(note.contents, key).catch(couldNotDecrypt) + if (!files) { + exit('No files found in note') + return + } + const { names } = await inquirer.prompt([ + { + type: 'checkbox', + message: 'What files should be saved?', + name: 'names', + choices: files.map((file) => ({ + value: file.name, + name: `${file.name} - ${file.type} - ${pretty(file.size, { binary: true })}`, + checked: true, + })), + }, + ]) + + const selected = files.filter((file) => names.includes(file.name)) + + if (!selected.length) exit('No files selected') + + await Promise.all( + files.map(async (file) => { + let filename = resolve(file.name) + try { + // If exists -> prepend timestamp to not overwrite the current file + await access(filename, constants.R_OK) + filename = resolve(`${Date.now()}-${file.name}`) + } catch {} + await writeFile(filename, file.contents) + console.log(`Saved: ${basename(filename)}`) + }) + ) + break + case 'text': + const plaintext = await Adapters.Text.decrypt(note.contents, key).catch(couldNotDecrypt) + console.log(plaintext) + break + } +} diff --git a/packages/cli/src/index.ts b/packages/cli/src/index.ts new file mode 100644 index 0000000..19356fe --- /dev/null +++ b/packages/cli/src/index.ts @@ -0,0 +1,93 @@ +#!/usr/bin/env node + +import { Argument, Option, program } from '@commander-js/extra-typings' +import { setBase, status } from '@cryptgeon/shared' +import prettyBytes from 'pretty-bytes' + +import { download } from './download.js' +import { parseFile, parseNumber } from './parsers.js' +import { uploadFiles, uploadText } from './upload.js' +import { exit } from './utils.js' + +const defaultServer = process.env['CRYPTGEON_SERVER'] || 'https://cryptgeon.org' +const server = new Option('-s --server ', 'the cryptgeon server to use').default(defaultServer) +const files = new Argument('', 'Files to be sent').argParser(parseFile) +const text = new Argument('', 'Text content of the note') +const password = new Option('-p --password ', 'manually set a password') +const url = new Argument('', 'The url to open') +const views = new Option('-v --views ', 'Amount of views before getting destroyed').argParser(parseNumber) +const minutes = new Option('-m --minutes ', 'Minutes before the note expires').argParser(parseNumber) + +// Node 18 guard +parseInt(process.version.slice(1).split(',')[0]) < 18 && exit('Node 18 or higher is required') + +// @ts-ignore +const version: string = VERSION + +async function checkConstrains(constrains: { views?: number; minutes?: number }) { + const { views, minutes } = constrains + if (views && minutes) exit('cannot set view and minutes constrains simultaneously') + if (!views && !minutes) constrains.views = 1 + + const response = await status() + if (views && views > response.max_views) + exit(`Only a maximum of ${response.max_views} views allowed. ${views} given.`) + if (minutes && minutes > response.max_expiration) + exit(`Only a maximum of ${response.max_expiration} minutes allowed. ${minutes} given.`) +} + +program.name('cryptgeon').version(version).configureHelp({ showGlobalOptions: true }) + +program + .command('info') + .addOption(server) + .action(async (options) => { + setBase(options.server) + const response = await status() + const formatted = { + ...response, + max_size: prettyBytes(response.max_size), + } + for (const key of Object.keys(formatted)) { + if (key.startsWith('theme_')) delete formatted[key as keyof typeof formatted] + } + console.table(formatted) + }) + +const send = program.command('send') +send + .command('file') + .addArgument(files) + .addOption(server) + .addOption(views) + .addOption(minutes) + .action(async (files, options) => { + setBase(options.server!) + await checkConstrains(options) + await uploadFiles(files, { views: options.views, expiration: options.minutes }) + }) +send + .command('text') + .addArgument(text) + .addOption(server) + .addOption(views) + .addOption(minutes) + .action(async (text, options) => { + setBase(options.server!) + await checkConstrains(options) + await uploadText(text, { views: options.views, expiration: options.minutes }) + }) + +program + .command('open') + .addArgument(url) + .action(async (note, options) => { + try { + const url = new URL(note) + await download(url) + } catch { + exit('Invalid URL') + } + }) + +program.parse() diff --git a/packages/cli/src/parsers.ts b/packages/cli/src/parsers.ts new file mode 100644 index 0000000..33cac70 --- /dev/null +++ b/packages/cli/src/parsers.ts @@ -0,0 +1,27 @@ +import { InvalidArgumentError, InvalidOptionArgumentError } from '@commander-js/extra-typings' +import { accessSync, constants } from 'node:fs' +import { resolve } from 'node:path' + +export function parseFile(value: string, before: string[] = []) { + try { + const file = resolve(value) + accessSync(file, constants.R_OK) + return [...before, file] + } catch { + throw new InvalidArgumentError('cannot access file') + } +} + +export function parseURL(value: string, _: URL): URL { + try { + return new URL(value) + } catch { + throw new InvalidArgumentError('is not a valid url') + } +} + +export function parseNumber(value: string, _: number): number { + const n = parseInt(value, 10) + if (isNaN(n)) throw new InvalidOptionArgumentError('invalid number') + return n +} diff --git a/packages/cli/src/upload.ts b/packages/cli/src/upload.ts new file mode 100644 index 0000000..ff7e6c1 --- /dev/null +++ b/packages/cli/src/upload.ts @@ -0,0 +1,48 @@ +import { readFile, stat } from 'node:fs/promises' +import { basename } from 'node:path' + +import { Adapters, BASE, create, FileDTO, Note } from '@cryptgeon/shared' +import mime from 'mime' +import { AES, Hex, TypedArray } from 'occulto' + +import { exit } from './utils.js' + +type UploadOptions = Pick + +export async function upload(key: TypedArray, note: Note) { + try { + const result = await create(note) + const password = Hex.encode(key) + const url = `${BASE}/note/${result.id}#${password}` + console.log(`Note created under:\n\n${url}`) + } catch { + exit('Could not create note') + } +} + +export async function uploadFiles(paths: string[], options: UploadOptions) { + const key = await AES.generateKey() + const files: FileDTO[] = await Promise.all( + paths.map(async (path) => { + const data = new Uint8Array(await readFile(path)) + const stats = await stat(path) + const extension = path.substring(path.indexOf('.') + 1) + const type = mime.getType(extension) ?? 'application/octet-stream' + return { + name: basename(path), + size: stats.size, + contents: data, + type, + } satisfies FileDTO + }) + ) + + const contents = await Adapters.Files.encrypt(files, key) + await upload(key, { ...options, contents, meta: { type: 'file' } }) +} + +export async function uploadText(text: string, options: UploadOptions) { + const key = await AES.generateKey() + const contents = await Adapters.Text.encrypt(text, key) + await upload(key, { ...options, contents, meta: { type: 'text' } }) +} diff --git a/packages/cli/src/utils.ts b/packages/cli/src/utils.ts new file mode 100644 index 0000000..6dcb7e1 --- /dev/null +++ b/packages/cli/src/utils.ts @@ -0,0 +1,6 @@ +import { exit as exitNode } from 'node:process' + +export function exit(message: string) { + console.error(message) + exitNode(1) +} diff --git a/packages/cli/tsconfig.json b/packages/cli/tsconfig.json new file mode 100644 index 0000000..50f234b --- /dev/null +++ b/packages/cli/tsconfig.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "target": "es2022", + "module": "es2022", + "moduleResolution": "node", + "noEmit": true, + "strict": true, + "allowSyntheticDefaultImports": true + } +} diff --git a/packages/frontend/.npmrc b/packages/frontend/.npmrc deleted file mode 100644 index b6f27f1..0000000 --- a/packages/frontend/.npmrc +++ /dev/null @@ -1 +0,0 @@ -engine-strict=true diff --git a/packages/frontend/locales/es.json b/packages/frontend/locales/es.json index 10f022e..8890e37 100644 --- a/packages/frontend/locales/es.json +++ b/packages/frontend/locales/es.json @@ -41,7 +41,7 @@ }, "explanation": "pulse abajo para mostrar y borrar la nota si el contador ha llegado a su límite", "show_note": "mostrar nota", - "warning_will_not_see_again": " no tendrás la oportunidad de volver a ver la nota.", + "warning_will_not_see_again": "no tendrás la oportunidad de volver a ver la nota.", "download_all": "descargar todo" }, "file_upload": { diff --git a/packages/frontend/locales/it.json b/packages/frontend/locales/it.json index e6764cb..f1146cf 100644 --- a/packages/frontend/locales/it.json +++ b/packages/frontend/locales/it.json @@ -41,7 +41,7 @@ }, "explanation": "clicca sotto per mostrare e cancellare la nota se il contatore ha raggiunto il suo limite", "show_note": "mostra la nota", - "warning_will_not_see_again": " non avrete la possibilità di rivedere la nota.", + "warning_will_not_see_again": "non avrete la possibilità di rivedere la nota.", "download_all": "scarica tutti" }, "file_upload": { diff --git a/packages/frontend/locales/ja.json b/packages/frontend/locales/ja.json new file mode 100644 index 0000000..1f6c778 --- /dev/null +++ b/packages/frontend/locales/ja.json @@ -0,0 +1,51 @@ +{ + "common": { + "note": "新しいメモ", + "file": "ファイル", + "advanced": "アドバンスド", + "create": "作成", + "loading": "読み込み中", + "mode": "モード", + "views": "{n, plural, =0 {表示可能な時間} =1 { 1 ビュー} other {#ビュー}}", + "minutes": "{n, plural, =0 {有効期間(分)} =1 {1 分} other {# 分}}", + "max": "マックス", + "share_link": "共有リンク", + "copy_clipboard": "クリップボードにコピーする", + "copied_to_clipboard": "クリップボードにコピーされました", + "encrypting": "暗号化", + "decrypting": "復号化", + "uploading": "アップロード中", + "downloading": "ダウンロード中", + "qr_code": "QRコード" + }, + "home": { + "intro": "完全に暗号化された 、安全なメモやファイルをワンクリックで簡単に送信できます。メモを作成してリンクを共有するだけです。", + "explanation": "メモは{type}後に期限切れになり、破棄されます。", + "new_note": "新しいメモ", + "new_note_notice": "可用性:
すべてが RAM に保持されるため、メモが保存されるとは限りません。いっぱいになると、最も古いメモが削除されます。
(大丈夫だと思いますが、ご了承ください。)", + "errors": { + "note_to_big": "メモを作成できませんでした。メモが大きすぎる", + "note_error": "メモを作成できませんでした。もう一度お試しください。", + "max": "最大ファイルサイズ: {n}", + "empty_content": "メモは空です。" + }, + "messages": { + "note_created": "メモが作成されました。" + } + }, + "show": { + "errors": { + "not_found": "メモが見つからないか、既に削除されています。", + "decryption_failed": "パスワードエラー!不完全なリンクを貼り付けたり、暗号を解読しようとしたりしている可能性があります!しかし、いずれにしても、この暗号は破棄されました!", + "unsupported_type": "サポートされていないメモ タイプです。" + }, + "explanation": "カウンターが上限に達した場合、ノートの表示と削除を行うには、以下をクリックします。", + "show_note": "メモを表示", + "warning_will_not_see_again": "あなた できません このノートをもう一度見る", + "download_all": "すべてダウンロード" + }, + "file_upload": { + "selected_files": "選択したファイル", + "no_files_selected": "ファイルが選択されていません" + } +} diff --git a/packages/frontend/locales/ru.json b/packages/frontend/locales/ru.json index 2dc39ce..beabd53 100644 --- a/packages/frontend/locales/ru.json +++ b/packages/frontend/locales/ru.json @@ -1,51 +1,51 @@ -{ - "common": { - "note": "заметка", - "file": "файл", - "advanced": "расширенные", - "create": "создать", - "loading": "загрузка", - "mode": "режим", - "views": "{n, plural, =0 {просмотры} =1 {1 просмотр} other {# просмотры}}", - "minutes": "{n, plural, =0 {минут} =1 {1 минута} other {# минуты}}", - "max": "макс", - "share_link": "поделиться ссылкой", - "copy_clipboard": "скопировать в буфер обмена", - "copied_to_clipboard": "скопировано в буфер обмена", - "encrypting": "шифрование", - "decrypting": "расшифровка", - "uploading": "загрузка", - "downloading": "скачивание", - "qr_code": "qr код" - }, - "home": { - "intro": "Легко отправляйте полностью зашифрованные защищенные заметки или файлы одним щелчком мыши. Просто создайте заметку и поделитесь ссылкой.", - "explanation": "заметка истечет и будет уничтожена после {type}.", - "new_note": "новая заметка", - "new_note_notice": "availability:
the note is not guaranteed to be stored as everything is kept in ram, if it fills up the oldest notes will be removed.
(you probably will be fine, just be warned.)", - "errors": { - "note_to_big": "нельзя создать новую заметку. заметка слишком большая", - "note_error": "нельзя создать новую заметку. пожалйста попробуйте позднее.", - "max": "макс: {n}", - "empty_content": "пустая заметка." - }, - "messages": { - "note_created": "заметка создана." - } - }, - "show": { - "errors": { - "not_found": "заметка не найдена или была удалена.", - "decryption_failed": "неправильный пароль. не смог расшифровать. возможно ссылка битая. записка уничтожена.", - "unsupported_type": "неподдерживаемый тип заметки." - }, - "explanation": "щелкните ниже, чтобы показать и удалить примечание, если счетчик достиг предела", - "show_note": "показать заметку", - "warning_will_not_see_again": "вы не сможете больше просмотреть заметку.", - "download_all": "скачать всё" - }, - "file_upload": { - "selected_files": "Выбранные файлы", - "no_files_selected": "Файлы не выбраны" - } -} \ No newline at end of file +{ + "common": { + "note": "заметка", + "file": "файл", + "advanced": "расширенные", + "create": "создать", + "loading": "загрузка", + "mode": "режим", + "views": "{n, plural, =0 {просмотры} =1 {1 просмотр} other {# просмотры}}", + "minutes": "{n, plural, =0 {минут} =1 {1 минута} other {# минуты}}", + "max": "макс", + "share_link": "поделиться ссылкой", + "copy_clipboard": "скопировать в буфер обмена", + "copied_to_clipboard": "скопировано в буфер обмена", + "encrypting": "шифрование", + "decrypting": "расшифровка", + "uploading": "загрузка", + "downloading": "скачивание", + "qr_code": "qr код" + }, + "home": { + "intro": "Легко отправляйте полностью зашифрованные защищенные заметки или файлы одним щелчком мыши. Просто создайте заметку и поделитесь ссылкой.", + "explanation": "заметка истечет и будет уничтожена после {type}.", + "new_note": "новая заметка", + "new_note_notice": "availability:
the note is not guaranteed to be stored as everything is kept in ram, if it fills up the oldest notes will be removed.
(you probably will be fine, just be warned.)", + "errors": { + "note_to_big": "нельзя создать новую заметку. заметка слишком большая", + "note_error": "нельзя создать новую заметку. пожалйста попробуйте позднее.", + "max": "макс: {n}", + "empty_content": "пустая заметка." + }, + "messages": { + "note_created": "заметка создана." + } + }, + "show": { + "errors": { + "not_found": "заметка не найдена или была удалена.", + "decryption_failed": "неправильный пароль. не смог расшифровать. возможно ссылка битая. записка уничтожена.", + "unsupported_type": "неподдерживаемый тип заметки." + }, + "explanation": "щелкните ниже, чтобы показать и удалить примечание, если счетчик достиг предела", + "show_note": "показать заметку", + "warning_will_not_see_again": "вы не сможете больше просмотреть заметку.", + "download_all": "скачать всё" + }, + "file_upload": { + "selected_files": "Выбранные файлы", + "no_files_selected": "Файлы не выбраны" + } +} diff --git a/packages/frontend/locales/zh.json b/packages/frontend/locales/zh.json index 910575b..a1fc664 100644 --- a/packages/frontend/locales/zh.json +++ b/packages/frontend/locales/zh.json @@ -48,4 +48,4 @@ "selected_files": "已选中的文件", "no_files_selected": "没有文件被选中" } -} \ No newline at end of file +} diff --git a/packages/frontend/package.json b/packages/frontend/package.json index bf25bed..ec222cb 100644 --- a/packages/frontend/package.json +++ b/packages/frontend/package.json @@ -1,6 +1,8 @@ { "private": true, + "name": "@cryptgeon/web", "scripts": { + "postinstall": "svelte-kit sync", "dev": "vite dev", "build": "vite build", "preview": "vite preview", @@ -11,29 +13,29 @@ }, "type": "module", "devDependencies": { - "@lokalise/node-api": "^9.5.0", - "@sveltejs/adapter-static": "^1.0.2", - "@sveltejs/kit": "^1.1.0", - "@types/dompurify": "^2.4.0", + "@lokalise/node-api": "^9.8.0", + "@sveltejs/adapter-static": "^2.0.2", + "@sveltejs/kit": "^1.16.3", + "@types/dompurify": "^3.0.2", "@types/file-saver": "^2.0.5", - "@zerodevx/svelte-toast": "^0.7.2", + "@zerodevx/svelte-toast": "^0.9.3", "adm-zip": "^0.5.10", "dotenv": "^16.0.3", - "svelte": "^3.55.1", - "svelte-check": "^2.10.3", - "svelte-intl-precompile": "^0.10.1", - "svelte-preprocess": "^4.10.7", - "tslib": "^2.4.1", - "typescript": "^4.9.4", - "vite": "^4.0.4" + "svelte": "^3.59.1", + "svelte-check": "^3.3.2", + "svelte-intl-precompile": "^0.12.1", + "tslib": "^2.5.0", + "typescript": "^5.0.4", + "vite": "^4.3.5" }, "dependencies": { + "@cryptgeon/shared": "workspace:*", "@fontsource/fira-mono": "^4.5.10", "copy-to-clipboard": "^3.3.3", - "dompurify": "^2.4.3", + "dompurify": "^3.0.3", "file-saver": "^2.0.5", - "occulto": "2.0.0", - "pretty-bytes": "^6.0.0", + "occulto": "^2.0.1", + "pretty-bytes": "^6.1.0", "qrious": "^4.0.2" } } diff --git a/packages/frontend/scripts/locale.js b/packages/frontend/scripts/locale.js index 745d949..37f5df1 100644 --- a/packages/frontend/scripts/locale.js +++ b/packages/frontend/scripts/locale.js @@ -5,10 +5,15 @@ import https from 'https' dotenv.config() +function exit(msg) { + console.error(msg) + process.exit(1) +} + const apiKey = process.env.LOKALISE_API_KEY const project_id = process.env.LOKALISE_PROJECT -if (!apiKey) throw new Error('No API Key set for Lokalize! Set with "LOKALISE_API_KEY"') -if (!project_id) throw new Error('No project id set for Lokalize! Set with "LOKALISE_PROJECT"') +if (!apiKey) exit('No API Key set for Lokalize! Set with "LOKALISE_API_KEY"') +if (!project_id) exit('No project id set for Lokalize! Set with "LOKALISE_PROJECT"') const client = new LokaliseApi({ apiKey }) const WGet = (url) => diff --git a/packages/frontend/src/app.d.ts b/packages/frontend/src/app.d.ts new file mode 100644 index 0000000..26a9569 --- /dev/null +++ b/packages/frontend/src/app.d.ts @@ -0,0 +1,9 @@ +// See https://kit.svelte.dev/docs/types#app +// for information about these interfaces +// and what to do when importing types +declare namespace App { + // interface Error {} + // interface Locals {} + // interface PageData {} + // interface Platform {} +} diff --git a/packages/frontend/src/global.d.ts b/packages/frontend/src/global.d.ts deleted file mode 100644 index 79d7d7f..0000000 --- a/packages/frontend/src/global.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -/// -/// -/// diff --git a/packages/frontend/src/lib/adapters.ts b/packages/frontend/src/lib/adapters.ts deleted file mode 100644 index 2bf965a..0000000 --- a/packages/frontend/src/lib/adapters.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { AES, Bytes, type TypedArray } from 'occulto' -import type { EncryptedFileDTO, FileDTO } from './api' - -abstract class CryptAdapter { - abstract encrypt(plaintext: T, key: TypedArray): Promise - abstract decrypt(ciphertext: string, key: TypedArray): Promise -} - -class CryptTextAdapter implements CryptAdapter { - async encrypt(plaintext: string, key: TypedArray) { - return await AES.encrypt(Bytes.encode(plaintext), key) - } - async decrypt(ciphertext: string, key: TypedArray) { - return Bytes.decode(await AES.decrypt(ciphertext, key)) - } -} - -class CryptBlobAdapter implements CryptAdapter { - async encrypt(plaintext: Blob, key: TypedArray) { - return await AES.encrypt(new Uint8Array(await plaintext.arrayBuffer()), key) - } - - async decrypt(ciphertext: string, key: TypedArray) { - const plaintext = await AES.decrypt(ciphertext, key) - return new Blob([plaintext], { type: 'application/octet-stream' }) - } -} - -class CryptFilesAdapter implements CryptAdapter { - async encrypt(plaintext: FileDTO[], key: TypedArray) { - const adapter = new CryptBlobAdapter() - const data: Promise[] = plaintext.map(async (file) => ({ - name: file.name, - size: file.size, - type: file.type, - contents: await adapter.encrypt(file.contents, key), - })) - return JSON.stringify(await Promise.all(data)) - } - - async decrypt(ciphertext: string, key: TypedArray) { - const adapter = new CryptBlobAdapter() - const data: EncryptedFileDTO[] = JSON.parse(ciphertext) - const files: FileDTO[] = await Promise.all( - data.map(async (file) => ({ - name: file.name, - size: file.size, - type: file.type, - contents: await adapter.decrypt(file.contents, key), - })) - ) - return files - } -} - -export const Adapters = { - Text: new CryptTextAdapter(), - Blob: new CryptBlobAdapter(), - Files: new CryptFilesAdapter(), -} diff --git a/packages/frontend/src/lib/api.ts b/packages/frontend/src/lib/api.ts deleted file mode 100644 index 793753d..0000000 --- a/packages/frontend/src/lib/api.ts +++ /dev/null @@ -1,78 +0,0 @@ -export type NoteMeta = { type: 'text' | 'file' } - -export type Note = { - contents: string - meta: NoteMeta - views?: number - expiration?: number -} -export type NoteInfo = {} -export type NotePublic = Pick -export type NoteCreate = Omit & { meta: string } - -export type FileDTO = Pick & { - contents: Blob -} - -export type EncryptedFileDTO = Omit & { - contents: string -} - -type CallOptions = { - url: string - method: string - body?: any -} - -export class PayloadToLargeError extends Error {} - -export async function call(options: CallOptions) { - const response = await fetch('/api/' + options.url, { - method: options.method, - body: options.body === undefined ? undefined : JSON.stringify(options.body), - mode: 'cors', - headers: { - 'Content-Type': 'application/json', - }, - }) - - if (!response.ok) { - if (response.status === 413) throw new PayloadToLargeError() - else throw new Error('API call failed') - } - return response.json() -} - -export async function create(note: Note) { - const { meta, ...rest } = note - const body: NoteCreate = { - ...rest, - meta: JSON.stringify(meta), - } - const data = await call({ - url: 'notes/', - method: 'post', - body, - }) - return data as { id: string } -} - -export async function get(id: string): Promise { - const data = await call({ - url: `notes/${id}`, - method: 'delete', - }) - const { contents, meta } = data - return { - contents, - meta: JSON.parse(meta) as NoteMeta, - } -} - -export async function info(id: string): Promise { - const data = await call({ - url: `notes/${id}`, - method: 'get', - }) - return data -} diff --git a/packages/frontend/src/lib/stores/status.ts b/packages/frontend/src/lib/stores/status.ts index 627bb3f..4cc347c 100644 --- a/packages/frontend/src/lib/stores/status.ts +++ b/packages/frontend/src/lib/stores/status.ts @@ -1,24 +1,8 @@ -import { call } from '$lib/api' +import { status as getStatus, type Status } from '@cryptgeon/shared' import { writable } from 'svelte/store' -export type Status = { - version: string - max_size: number - max_views: number - max_expiration: number - allow_advanced: boolean - theme_image: string - theme_text: string - theme_favicon: string - theme_page_title: string -} - export const status = writable(null) export async function init() { - const data = await call({ - url: 'status/', - method: 'get', - }) - status.set(data) + status.set(await getStatus()) } diff --git a/packages/frontend/src/lib/ui/AdvancedParameters.svelte b/packages/frontend/src/lib/ui/AdvancedParameters.svelte index 8db3701..442e38a 100644 --- a/packages/frontend/src/lib/ui/AdvancedParameters.svelte +++ b/packages/frontend/src/lib/ui/AdvancedParameters.svelte @@ -1,10 +1,10 @@