From f8c5b10ea91a5b3fdf454feb1279da462a00cdf9 Mon Sep 17 00:00:00 2001 From: Sebastian Hugentobler Date: Thu, 9 Mar 2023 08:36:31 +0100 Subject: [PATCH 01/10] set woweb version to 0.2.0 --- woweb/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/woweb/Cargo.toml b/woweb/Cargo.toml index 8c001b1..7ebd3f3 100644 --- a/woweb/Cargo.toml +++ b/woweb/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "woweb" -version = "0.1.0" +version = "0.2.0" edition = "2021" build = "build.rs" From 939201fedbfcc1fbcc000e1d03fa8cfce983f44c Mon Sep 17 00:00:00 2001 From: Sebastian Hugentobler Date: Thu, 9 Mar 2023 08:50:55 +0100 Subject: [PATCH 02/10] compile static musl for cdylib support --- Cargo.lock | 2 +- Dockerfile | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 93086bf..e065794 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1537,7 +1537,7 @@ checksum = "447660ad36a13288b1db4d4248e857b510e8c3a225c822ba4fb748c0aafecffd" [[package]] name = "woweb" -version = "0.1.0" +version = "0.2.0" dependencies = [ "axum", "axum-extra", diff --git a/Dockerfile b/Dockerfile index af8536c..9d5f316 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,12 @@ FROM docker.io/rust:1.67-alpine3.17 AS builder +ENV RUSTFLAGS="-C target-feature=-crt-static" + RUN apk add --no-cache \ - musl-dev + musl-dev \ + wasm-pack + +RUN rustup target add wasm32-unknown-unknown ADD . /src WORKDIR /src From 9c5cd5f4da015952470ef544795b823bb8f77325 Mon Sep 17 00:00:00 2001 From: Sebastian Hugentobler Date: Thu, 9 Mar 2023 10:36:11 +0100 Subject: [PATCH 03/10] remove deadlock in build system --- .gitignore | 1 + .idea/misc.xml | 18 ++++++++++++++++++ .idea/modules.xml | 8 -------- .idea/poc.iml | 16 ---------------- Cargo.lock | 16 ++++++++-------- Cargo.toml | 3 +++ Dockerfile | 12 ++++++------ Makefile | 38 ++++++++++++++++++++++++++++++++++++++ README.md | 9 +++++++++ dist_text_js/Cargo.toml | 2 +- woweb/.idea/.gitignore | 8 -------- woweb/.idea/modules.xml | 8 -------- woweb/.idea/vcs.xml | 6 ------ woweb/.idea/woweb-poc.iml | 11 ----------- woweb/Cargo.toml | 1 - woweb/build.rs | 29 ----------------------------- 16 files changed, 84 insertions(+), 102 deletions(-) create mode 100644 .idea/misc.xml delete mode 100644 .idea/modules.xml delete mode 100644 .idea/poc.iml create mode 100644 Makefile create mode 100644 README.md delete mode 100644 woweb/.idea/.gitignore delete mode 100644 woweb/.idea/modules.xml delete mode 100644 woweb/.idea/vcs.xml delete mode 100644 woweb/.idea/woweb-poc.iml delete mode 100644 woweb/build.rs diff --git a/.gitignore b/.gitignore index a036acb..70a1120 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ **/target **/Cargo.lock woweb/assets/dist_text* +dist/ diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..53624c9 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,18 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index 4312957..0000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/poc.iml b/.idea/poc.iml deleted file mode 100644 index 53e954b..0000000 --- a/.idea/poc.iml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index e065794..cf11b5a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -121,9 +121,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", ] @@ -898,9 +898,9 @@ checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" [[package]] name = "serde" -version = "1.0.153" +version = "1.0.154" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a382c72b4ba118526e187430bb4963cd6d55051ebf13d9b25574d379cc98d20" +checksum = "8cdd151213925e7f1ab45a9bbfb129316bd00799784b174b7cc7bcd16961c49e" dependencies = [ "serde_derive", ] @@ -918,9 +918,9 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.153" +version = "1.0.154" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ef476a5790f0f6decbc66726b6e5d63680ed518283e64c7df415989d880954f" +checksum = "4fc80d722935453bcafdc2c9a73cd6fac4dc1938f0346035d84bf99fa9e33217" dependencies = [ "proc-macro2", "quote", @@ -1317,9 +1317,9 @@ dependencies = [ [[package]] name = "unicode-bidi" -version = "0.3.10" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d54675592c1dbefd78cbd98db9bacd89886e1ca50692a0692baefffdeb92dd58" +checksum = "524b68aca1d05e03fdf03fcdce2c6c94b6daf6d16861ddaa7e4f2b6638a9052c" [[package]] name = "unicode-ident" diff --git a/Cargo.toml b/Cargo.toml index be4055b..c9c2e9f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,3 +5,6 @@ members = [ "dist_text_js", "woweb" ] + +[profile.release] +strip = true \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index 9d5f316..a4ef92a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,25 +4,25 @@ ENV RUSTFLAGS="-C target-feature=-crt-static" RUN apk add --no-cache \ musl-dev \ - wasm-pack + wasm-pack \ + make RUN rustup target add wasm32-unknown-unknown ADD . /src WORKDIR /src -RUN cargo build --release -RUN strip target/release/woweb +RUN make release RUN adduser -D woweb -RUN sed -i 's|ws://localhost:3000/ws|wss://woweb.vanwa.ch/ws|' woweb/assets/index.js +RUN sed -i 's|ws://localhost:3000/ws|wss://woweb.vanwa.ch/ws|' dist/assets/index.js FROM scratch COPY --from=builder /etc/passwd /etc/passwd -COPY --from=builder /src/target/release/woweb "/opt/woweb" -COPY --from=builder /src/woweb/assets "/opt/assets" +COPY --from=builder /src/dist/woweb "/opt/woweb" +COPY --from=builder /src/dist/assets "/opt/assets" EXPOSE 3000 diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..6a07330 --- /dev/null +++ b/Makefile @@ -0,0 +1,38 @@ +WASM_PKG_DIR = dist_text_js/pkg +ASSET_DIR = woweb/assets +WASM_JS = dist_text_js.js +WASM_BG = dist_text_js_bg.wasm +WASM_JS_PKG = $(WASM_PKG_DIR)/$(WASM_JS) +WASM_BG_PKG = $(WASM_PKG_DIR)/$(WASM_BG) +WASM_JS_ASSET = $(ASSET_DIR)/$(WASM_JS) +WASM_BG_ASSET = $(ASSET_DIR)/$(WASM_BG) +DIST_DIR = dist + +.PHONY: default all wasm serve clean + +default: all +all: wasm +wasm: $(WASM_JS_ASSET) $(WASM_BG_ASSET) + +$(WASM_JS_ASSET) $(WASM_BG_ASSET): dist_text_js/src/lib.rs + cd dist_text_js; \ + wasm-pack build --target web --release --no-typescript + + cp $(WASM_JS_PKG) $(WASM_JS_ASSET) + cp $(WASM_BG_PKG) $(WASM_BG_ASSET) + +serve: wasm + cargo run --package woweb + +release: $(DIST_DIR) wasm + cargo build --package woweb --release + cp target/release/woweb $(DIST_DIR) + cp -r $(ASSET_DIR) $(DIST_DIR) + +$(DIST_DIR): + mkdir -p $(DIST_DIR) + +clean: + cargo clean + rm -rf $(WASM_PKG_DIR) + rm -f $(ASSET_DIR)/dist_text* diff --git a/README.md b/README.md new file mode 100644 index 0000000..82b1203 --- /dev/null +++ b/README.md @@ -0,0 +1,9 @@ +# Prerequisites +- [make](https://en.wikipedia.org/wiki/Make_(software)) +- [wasm-pack](https://github.com/rustwasm/wasm-pack) +- [rustup](https://rustup.rs/) +- [cargo](https://github.com/rust-lang/cargo) + +``` +rustup target add wasm32-unknown-unknown +``` \ No newline at end of file diff --git a/dist_text_js/Cargo.toml b/dist_text_js/Cargo.toml index cecd323..dbc2c74 100644 --- a/dist_text_js/Cargo.toml +++ b/dist_text_js/Cargo.toml @@ -10,4 +10,4 @@ crate-type = ["cdylib"] dist_text = { path = "../dist_text" } serde = { version = "1.0.153", features = ["derive"] } serde-wasm-bindgen = "0.5.0" -wasm-bindgen = "0.2.84" \ No newline at end of file +wasm-bindgen = "0.2.84" diff --git a/woweb/.idea/.gitignore b/woweb/.idea/.gitignore deleted file mode 100644 index 13566b8..0000000 --- a/woweb/.idea/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml -# Editor-based HTTP Client requests -/httpRequests/ -# Datasource local storage ignored files -/dataSources/ -/dataSources.local.xml diff --git a/woweb/.idea/modules.xml b/woweb/.idea/modules.xml deleted file mode 100644 index ea8c3ec..0000000 --- a/woweb/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/woweb/.idea/vcs.xml b/woweb/.idea/vcs.xml deleted file mode 100644 index 35eb1dd..0000000 --- a/woweb/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/woweb/.idea/woweb-poc.iml b/woweb/.idea/woweb-poc.iml deleted file mode 100644 index c254557..0000000 --- a/woweb/.idea/woweb-poc.iml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/woweb/Cargo.toml b/woweb/Cargo.toml index 7ebd3f3..9d0f045 100644 --- a/woweb/Cargo.toml +++ b/woweb/Cargo.toml @@ -2,7 +2,6 @@ name = "woweb" version = "0.2.0" edition = "2021" -build = "build.rs" [dependencies] dist_text = { path = "../dist_text" } diff --git a/woweb/build.rs b/woweb/build.rs deleted file mode 100644 index d835b8f..0000000 --- a/woweb/build.rs +++ /dev/null @@ -1,29 +0,0 @@ -use std::env; -use std::fs; -use std::path::Path; -use std::process::Command; - -fn main() { - let woweb_dir = env::var("CARGO_MANIFEST_DIR").unwrap(); - let woweb_path = Path::new(&woweb_dir); - let woweb_asset_path = woweb_path.join("assets"); - let dist_text_path = woweb_path.parent().unwrap().join("dist_text_js"); - let dist_text_pkg_path = dist_text_path.join("pkg"); - - Command::new("wasm-pack") - .args(&["build", "--target", "web", "--release", "--no-typescript"]) - .current_dir(dist_text_path) - .status() - .unwrap(); - - let js_path_src = dist_text_pkg_path.join("dist_text_js.js"); - let js_path_dest = woweb_asset_path.join("dist_text_js.js"); - - let wasm_path_src = dist_text_pkg_path.join("dist_text_js_bg.wasm"); - let wasm_path_dest = woweb_asset_path.join("dist_text_js_bg.wasm"); - - let _ = fs::copy(js_path_src, js_path_dest); - let _ = fs::copy(wasm_path_src, wasm_path_dest); - - println!("cargo:rerun-if-changed=../dist_text_js/**/*.rs"); -} From d5af19b02a14f402a570b50d8737b6e3df88d1a1 Mon Sep 17 00:00:00 2001 From: Sebastian Hugentobler Date: Thu, 9 Mar 2023 10:57:25 +0100 Subject: [PATCH 04/10] add cargo deny config --- .woodpecker.yml | 13 ++ Cargo.lock | 7 -- Makefile | 5 +- deny.toml | 264 ++++++++++++++++++++++++++++++++++++++++ dist_text/Cargo.toml | 1 + dist_text_js/Cargo.toml | 1 + woweb/Cargo.toml | 4 +- 7 files changed, 285 insertions(+), 10 deletions(-) create mode 100644 deny.toml diff --git a/.woodpecker.yml b/.woodpecker.yml index 8fec64f..2f25e82 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -1,4 +1,17 @@ pipeline: + check: + image: docker.io/rust:1.67-alpine3.17 + commands: + - apk --no-cache add cargo-deny make + - make check + release: + image: docker.io/rust:1.67-alpine3.17 + when: + event: tag + commands: + - apk --no-cache add cargo-deny make + - make check + - make release publish-docker-image: image: plugins/kaniko when: diff --git a/Cargo.lock b/Cargo.lock index cf11b5a..7b2044a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1336,12 +1336,6 @@ dependencies = [ "tinyvec", ] -[[package]] -name = "unicode-segmentation" -version = "1.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36" - [[package]] name = "url" version = "2.3.1" @@ -1550,5 +1544,4 @@ dependencies = [ "tower-http 0.3.5", "tracing", "tracing-subscriber", - "unicode-segmentation", ] diff --git a/Makefile b/Makefile index 6a07330..b7184c5 100644 --- a/Makefile +++ b/Makefile @@ -8,7 +8,7 @@ WASM_JS_ASSET = $(ASSET_DIR)/$(WASM_JS) WASM_BG_ASSET = $(ASSET_DIR)/$(WASM_BG) DIST_DIR = dist -.PHONY: default all wasm serve clean +.PHONY: default all check wasm serve clean default: all all: wasm @@ -21,6 +21,9 @@ $(WASM_JS_ASSET) $(WASM_BG_ASSET): dist_text_js/src/lib.rs cp $(WASM_JS_PKG) $(WASM_JS_ASSET) cp $(WASM_BG_PKG) $(WASM_BG_ASSET) +check: + cargo deny check + serve: wasm cargo run --package woweb diff --git a/deny.toml b/deny.toml new file mode 100644 index 0000000..c6d5801 --- /dev/null +++ b/deny.toml @@ -0,0 +1,264 @@ +# This template contains all of the possible sections and their default values + +# Note that all fields that take a lint level have these possible values: +# * deny - An error will be produced and the check will fail +# * warn - A warning will be produced, but the check will not fail +# * allow - No warning or error will be produced, though in some cases a note +# will be + +# The values provided in this template are the default values that will be used +# when any section or field is not specified in your own configuration + +# Root options + +# If 1 or more target triples (and optionally, target_features) are specified, +# only the specified targets will be checked when running `cargo deny check`. +# This means, if a particular package is only ever used as a target specific +# dependency, such as, for example, the `nix` crate only being used via the +# `target_family = "unix"` configuration, that only having windows targets in +# this list would mean the nix crate, as well as any of its exclusive +# dependencies not shared by any other crates, would be ignored, as the target +# list here is effectively saying which targets you are building for. +targets = [ + # The triple can be any string, but only the target triples built in to + # rustc (as of 1.40) can be checked against actual config expressions + #{ triple = "x86_64-unknown-linux-musl" }, + # You can also specify which target_features you promise are enabled for a + # particular target. target_features are currently not validated against + # the actual valid features supported by the target architecture. + #{ triple = "wasm32-unknown-unknown", features = ["atomics"] }, +] +# When creating the dependency graph used as the source of truth when checks are +# executed, this field can be used to prune crates from the graph, removing them +# from the view of cargo-deny. This is an extremely heavy hammer, as if a crate +# is pruned from the graph, all of its dependencies will also be pruned unless +# they are connected to another crate in the graph that hasn't been pruned, +# so it should be used with care. The identifiers are [Package ID Specifications] +# (https://doc.rust-lang.org/cargo/reference/pkgid-spec.html) +#exclude = [] +# If true, metadata will be collected with `--all-features`. Note that this can't +# be toggled off if true, if you want to conditionally enable `--all-features` it +# is recommended to pass `--all-features` on the cmd line instead +all-features = false +# If true, metadata will be collected with `--no-default-features`. The same +# caveat with `all-features` applies +no-default-features = false +# If set, these feature will be enabled when collecting metadata. If `--features` +# is specified on the cmd line they will take precedence over this option. +#features = [] +# When outputting inclusion graphs in diagnostics that include features, this +# option can be used to specify the depth at which feature edges will be added. +# This option is included since the graphs can be quite large and the addition +# of features from the crate(s) to all of the graph roots can be far too verbose. +# This option can be overridden via `--feature-depth` on the cmd line +feature-depth = 1 + +# This section is considered when running `cargo deny check advisories` +# More documentation for the advisories section can be found here: +# https://embarkstudios.github.io/cargo-deny/checks/advisories/cfg.html +[advisories] +# The path where the advisory database is cloned/fetched into +db-path = "~/.cargo/advisory-db" +# The url(s) of the advisory databases to use +db-urls = ["https://github.com/rustsec/advisory-db"] +# The lint level for security vulnerabilities +vulnerability = "deny" +# The lint level for unmaintained crates +unmaintained = "warn" +# The lint level for crates that have been yanked from their source registry +yanked = "warn" +# The lint level for crates with security notices. Note that as of +# 2019-12-17 there are no security notice advisories in +# https://github.com/rustsec/advisory-db +notice = "warn" +# A list of advisory IDs to ignore. Note that ignored advisories will still +# output a note when they are encountered. +ignore = [ + #"RUSTSEC-0000-0000", +] +# Threshold for security vulnerabilities, any vulnerability with a CVSS score +# lower than the range specified will be ignored. Note that ignored advisories +# will still output a note when they are encountered. +# * None - CVSS Score 0.0 +# * Low - CVSS Score 0.1 - 3.9 +# * Medium - CVSS Score 4.0 - 6.9 +# * High - CVSS Score 7.0 - 8.9 +# * Critical - CVSS Score 9.0 - 10.0 +#severity-threshold = + +# If this is true, then cargo deny will use the git executable to fetch advisory database. +# If this is false, then it uses a built-in git library. +# Setting this to true can be helpful if you have special authentication requirements that cargo-deny does not support. +# See Git Authentication for more information about setting up git authentication. +#git-fetch-with-cli = true + +# This section is considered when running `cargo deny check licenses` +# More documentation for the licenses section can be found here: +# https://embarkstudios.github.io/cargo-deny/checks/licenses/cfg.html +[licenses] +# The lint level for crates which do not have a detectable license +unlicensed = "deny" +# List of explicitly allowed licenses +# See https://spdx.org/licenses/ for list of possible licenses +# [possible values: any SPDX 3.11 short identifier (+ optional exception)]. +allow = [ + #"MIT", + #"Apache-2.0", + #"Apache-2.0 WITH LLVM-exception", +] +# List of explicitly disallowed licenses +# See https://spdx.org/licenses/ for list of possible licenses +# [possible values: any SPDX 3.11 short identifier (+ optional exception)]. +deny = [ + #"Nokia", +] +# Lint level for licenses considered copyleft +copyleft = "allow" +# Blanket approval or denial for OSI-approved or FSF Free/Libre licenses +# * both - The license will be approved if it is both OSI-approved *AND* FSF +# * either - The license will be approved if it is either OSI-approved *OR* FSF +# * osi-only - The license will be approved if is OSI-approved *AND NOT* FSF +# * fsf-only - The license will be approved if is FSF *AND NOT* OSI-approved +# * neither - This predicate is ignored and the default lint level is used +allow-osi-fsf-free = "both" +# Lint level used when no other predicates are matched +# 1. License isn't in the allow or deny lists +# 2. License isn't copyleft +# 3. License isn't OSI/FSF, or allow-osi-fsf-free = "neither" +default = "deny" +# The confidence threshold for detecting a license from license text. +# The higher the value, the more closely the license text must be to the +# canonical license text of a valid SPDX license file. +# [possible values: any between 0.0 and 1.0]. +confidence-threshold = 0.8 +# Allow 1 or more licenses on a per-crate basis, so that particular licenses +# aren't accepted for every possible crate as with the normal allow list +exceptions = [ + # Each entry is the crate and version constraint, and its specific allow + # list + { allow = ["CC0-1.0"], name = "tiny-keccak", version = "2.0.2" }, + { allow = ["Unicode-DFS-2016"], name = "unicode-ident", version = "1.0.8" }, +] + +# Some crates don't have (easily) machine readable licensing information, +# adding a clarification entry for it allows you to manually specify the +# licensing information +#[[licenses.clarify]] +# The name of the crate the clarification applies to +#name = "ring" +# The optional version constraint for the crate +#version = "*" +# The SPDX expression for the license requirements of the crate +#expression = "MIT AND ISC AND OpenSSL" +# One or more files in the crate's source used as the "source of truth" for +# the license expression. If the contents match, the clarification will be used +# when running the license check, otherwise the clarification will be ignored +# and the crate will be checked normally, which may produce warnings or errors +# depending on the rest of your configuration +#license-files = [ + # Each entry is a crate relative path, and the (opaque) hash of its contents + #{ path = "LICENSE", hash = 0xbd0eed23 } +#] + +[licenses.private] +# If true, ignores workspace crates that aren't published, or are only +# published to private registries. +# To see how to mark a crate as unpublished (to the official registry), +# visit https://doc.rust-lang.org/cargo/reference/manifest.html#the-publish-field. +ignore = false +# One or more private registries that you might publish crates to, if a crate +# is only published to private registries, and ignore is true, the crate will +# not have its license(s) checked +registries = [ + #"https://sekretz.com/registry +] + +# This section is considered when running `cargo deny check bans`. +# More documentation about the 'bans' section can be found here: +# https://embarkstudios.github.io/cargo-deny/checks/bans/cfg.html +[bans] +# Lint level for when multiple versions of the same crate are detected +multiple-versions = "warn" +# Lint level for when a crate version requirement is `*` +wildcards = "allow" +# The graph highlighting used when creating dotgraphs for crates +# with multiple versions +# * lowest-version - The path to the lowest versioned duplicate is highlighted +# * simplest-path - The path to the version with the fewest edges is highlighted +# * all - Both lowest-version and simplest-path are used +highlight = "all" +# The default lint level for `default` features for crates that are members of +# the workspace that is being checked. This can be overriden by allowing/denying +# `default` on a crate-by-crate basis if desired. +workspace-default-features = "allow" +# The default lint level for `default` features for external crates that are not +# members of the workspace. This can be overriden by allowing/denying `default` +# on a crate-by-crate basis if desired. +external-default-features = "allow" +# List of crates that are allowed. Use with care! +allow = [ + #{ name = "ansi_term", version = "=0.11.0" }, +] +# List of crates to deny +deny = [ + # Each entry the name of a crate and a version range. If version is + # not specified, all versions will be matched. + #{ name = "ansi_term", version = "=0.11.0" }, + # + # Wrapper crates can optionally be specified to allow the crate when it + # is a direct dependency of the otherwise banned crate + #{ name = "ansi_term", version = "=0.11.0", wrappers = [] }, +] + +# List of features to allow/deny +# Each entry the name of a crate and a version range. If version is +# not specified, all versions will be matched. +#[[bans.features]] +#name = "reqwest" +# Features to not allow +#deny = ["json"] +# Features to allow +#allow = [ +# "rustls", +# "__rustls", +# "__tls", +# "hyper-rustls", +# "rustls", +# "rustls-pemfile", +# "rustls-tls-webpki-roots", +# "tokio-rustls", +# "webpki-roots", +#] +# If true, the allowed features must exactly match the enabled feature set. If +# this is set there is no point setting `deny` +#exact = true + +# Certain crates/versions that will be skipped when doing duplicate detection. +skip = [ + #{ name = "ansi_term", version = "=0.11.0" }, +] +# Similarly to `skip` allows you to skip certain crates during duplicate +# detection. Unlike skip, it also includes the entire tree of transitive +# dependencies starting at the specified crate, up to a certain depth, which is +# by default infinite. +skip-tree = [ + #{ name = "ansi_term", version = "=0.11.0", depth = 20 }, +] + +# This section is considered when running `cargo deny check sources`. +# More documentation about the 'sources' section can be found here: +# https://embarkstudios.github.io/cargo-deny/checks/sources/cfg.html +[sources] +# Lint level for what to happen when a crate from a crate registry that is not +# in the allow list is encountered +unknown-registry = "warn" +# Lint level for what to happen when a crate from a git repository that is not +# in the allow list is encountered +unknown-git = "warn" +# List of URLs for allowed crate registries. Defaults to the crates.io index +# if not specified. If it is specified but empty, no registries are allowed. +allow-registry = ["https://github.com/rust-lang/crates.io-index"] +# List of URLs for allowed Git repositories +allow-git = [] + +[sources.allow-org] diff --git a/dist_text/Cargo.toml b/dist_text/Cargo.toml index 640b012..4a79cb0 100644 --- a/dist_text/Cargo.toml +++ b/dist_text/Cargo.toml @@ -2,6 +2,7 @@ name = "dist_text" version = "0.1.0" edition = "2021" +license = "AGPL-3.0-or-later" [dependencies] crdts = "7.3.0" diff --git a/dist_text_js/Cargo.toml b/dist_text_js/Cargo.toml index dbc2c74..bb98492 100644 --- a/dist_text_js/Cargo.toml +++ b/dist_text_js/Cargo.toml @@ -2,6 +2,7 @@ name = "dist_text_js" version = "0.1.0" edition = "2021" +license = "AGPL-3.0-or-later" [lib] crate-type = ["cdylib"] diff --git a/woweb/Cargo.toml b/woweb/Cargo.toml index 9d0f045..bd8ba41 100644 --- a/woweb/Cargo.toml +++ b/woweb/Cargo.toml @@ -2,6 +2,7 @@ name = "woweb" version = "0.2.0" edition = "2021" +license = "AGPL-3.0-or-later" [dependencies] dist_text = { path = "../dist_text" } @@ -14,5 +15,4 @@ serde_json = "1.0.93" tokio = { version = "1.25.0", features = ["full"] } tower-http = { version = "0.3.5", features = ["trace"] } tracing = "0.1.37" -tracing-subscriber = { version = "0.3.16", features = ["env-filter"] } -unicode-segmentation = "1.10.1" +tracing-subscriber = { version = "0.3.16", features = ["env-filter"] } \ No newline at end of file From e690f3ce913847da60125c8576d3312870246141 Mon Sep 17 00:00:00 2001 From: Sebastian Hugentobler Date: Thu, 9 Mar 2023 10:59:09 +0100 Subject: [PATCH 05/10] need alpine testing repo for cargo deny --- .woodpecker.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.woodpecker.yml b/.woodpecker.yml index 2f25e82..dce6539 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -2,14 +2,14 @@ pipeline: check: image: docker.io/rust:1.67-alpine3.17 commands: - - apk --no-cache add cargo-deny make + - apk --no-cache --repository=https://dl-cdn.alpinelinux.org/alpine/edge/testing add cargo-deny make - make check release: image: docker.io/rust:1.67-alpine3.17 when: event: tag commands: - - apk --no-cache add cargo-deny make + - apk --no-cache add --repository=https://dl-cdn.alpinelinux.org/alpine/edge/testing cargo-deny make - make check - make release publish-docker-image: From 658c21905464bf7b193672a0ba1089959448d633 Mon Sep 17 00:00:00 2001 From: Sebastian Hugentobler Date: Thu, 9 Mar 2023 11:01:54 +0100 Subject: [PATCH 06/10] no need to separately run check for release --- .woodpecker.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.woodpecker.yml b/.woodpecker.yml index dce6539..c9ca5dc 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -10,7 +10,6 @@ pipeline: event: tag commands: - apk --no-cache add --repository=https://dl-cdn.alpinelinux.org/alpine/edge/testing cargo-deny make - - make check - make release publish-docker-image: image: plugins/kaniko From 85989c7597ce9000797d2115aa1c0e57d6aa5232 Mon Sep 17 00:00:00 2001 From: Sebastian Hugentobler Date: Thu, 9 Mar 2023 11:03:06 +0100 Subject: [PATCH 07/10] install wasm-pack for release step --- .woodpecker.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.woodpecker.yml b/.woodpecker.yml index c9ca5dc..b0460e2 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -9,7 +9,7 @@ pipeline: when: event: tag commands: - - apk --no-cache add --repository=https://dl-cdn.alpinelinux.org/alpine/edge/testing cargo-deny make + - apk --no-cache add wasm-pack make - make release publish-docker-image: image: plugins/kaniko From 339f9626d2793bb0f3d935abaeee3b7cea4c5895 Mon Sep 17 00:00:00 2001 From: Sebastian Hugentobler Date: Thu, 9 Mar 2023 11:38:49 +0100 Subject: [PATCH 08/10] compile statically on musl --- Dockerfile | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index a4ef92a..1b446cb 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,5 @@ FROM docker.io/rust:1.67-alpine3.17 AS builder -ENV RUSTFLAGS="-C target-feature=-crt-static" - RUN apk add --no-cache \ musl-dev \ wasm-pack \ @@ -18,7 +16,7 @@ RUN adduser -D woweb RUN sed -i 's|ws://localhost:3000/ws|wss://woweb.vanwa.ch/ws|' dist/assets/index.js -FROM scratch +FROM docker.io/alpine:3.17 COPY --from=builder /etc/passwd /etc/passwd COPY --from=builder /src/dist/woweb "/opt/woweb" From 14ab9bf4698318402bc382e27d373a153e782403 Mon Sep 17 00:00:00 2001 From: Sebastian Hugentobler Date: Tue, 14 Mar 2023 12:42:54 +0100 Subject: [PATCH 09/10] make serve work --- Makefile | 3 ++- woweb/src/main.rs | 2 +- woweb/src/ws.rs | 5 ++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index b7184c5..5ce21ac 100644 --- a/Makefile +++ b/Makefile @@ -25,7 +25,8 @@ check: cargo deny check serve: wasm - cargo run --package woweb + cd woweb; \ + cargo run release: $(DIST_DIR) wasm cargo build --package woweb --release diff --git a/woweb/src/main.rs b/woweb/src/main.rs index 8cacf4e..e4c1814 100644 --- a/woweb/src/main.rs +++ b/woweb/src/main.rs @@ -1,13 +1,13 @@ use axum::routing::get; use axum::Router; use axum_extra::routing::SpaRouter; +use dist_text::text::Text; use std::env; use std::net::SocketAddr; use std::sync::Arc; use tokio::sync::{broadcast, RwLock}; use tower_http::trace::TraceLayer; use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt}; -use dist_text::text::Text; mod ws; diff --git a/woweb/src/ws.rs b/woweb/src/ws.rs index 97d5e15..519e02e 100644 --- a/woweb/src/ws.rs +++ b/woweb/src/ws.rs @@ -9,8 +9,8 @@ use axum::{ response::IntoResponse, }; -use futures::{sink::SinkExt, stream::StreamExt}; use dist_text::crdts::list::Op; +use futures::{sink::SinkExt, stream::StreamExt}; use crate::AppState; @@ -84,6 +84,5 @@ async fn handle_socket(stream: WebSocket, state: Arc) { tokio::select! { _ = (&mut send_task) => recv_task.abort(), _ = (&mut recv_task) => send_task.abort(), - } - ; + }; } From 95161692f4667f0b60885a55a20fc8c874b6de06 Mon Sep 17 00:00:00 2001 From: Sebastian Hugentobler Date: Tue, 14 Mar 2023 13:11:19 +0100 Subject: [PATCH 10/10] correct tests --- dist_text/src/text.rs | 57 ++++++++++++++++++++++++++++--------------- 1 file changed, 37 insertions(+), 20 deletions(-) diff --git a/dist_text/src/text.rs b/dist_text/src/text.rs index e850594..c2c14bd 100644 --- a/dist_text/src/text.rs +++ b/dist_text/src/text.rs @@ -1,6 +1,6 @@ -use std::fmt::{Display, Formatter}; -use crdts::{CmRDT, List}; use crdts::list::Op; +use crdts::{CmRDT, List}; +use std::fmt::{Display, Formatter}; #[derive(Clone)] pub struct Text { @@ -9,9 +9,7 @@ pub struct Text { impl Default for Text { fn default() -> Self { - Self { - inner: List::new() - } + Self { inner: List::new() } } } @@ -25,14 +23,26 @@ impl Display for Text { impl Text { pub fn apply_ops(&mut self, ops: Vec>) { - ops.iter().for_each(move |op| self.inner.apply(op.to_owned())); + ops.iter() + .for_each(move |op| self.inner.apply(op.to_owned())); } - pub fn insert_linebreak(&mut self, start: usize, end: usize, src: &str) -> Vec> { + pub fn insert_linebreak( + &mut self, + start: usize, + end: usize, + src: &str, + ) -> Vec> { self.insert(start, end, "\n", src) } - pub fn insert(&mut self, start: usize, end: usize, data: &str, src: &str) -> Vec> { + pub fn insert( + &mut self, + start: usize, + end: usize, + data: &str, + src: &str, + ) -> Vec> { let mut ops: Vec> = Vec::new(); if start < end { @@ -55,14 +65,22 @@ impl Text { } pub fn delete_backward(&mut self, start: usize, end: usize, src: &str) -> Vec> { - if (start == 0 && start == end) || end > self.inner.len() { return Vec::new(); } + if (start == 0 && start == end) || end > self.inner.len() { + return Vec::new(); + } - let (end, start) = if start == end { (start, start - 1) } else { (end, start) }; + let (end, start) = if start == end { + (start, start - 1) + } else { + (end, start) + }; self.delete(start, end, src) } pub fn delete_forward(&mut self, start: usize, end: usize, src: &str) -> Vec> { - if start >= self.inner.len() { return Vec::new(); } + if start >= self.inner.len() { + return Vec::new(); + } let end = if start == end { start + 1 } else { end }; self.delete(start, end, src) @@ -104,7 +122,7 @@ mod tests { #[test] fn insert_delete() { - let mut t = Text::new(); + let mut t = Text::default(); t.insert(0, 0, "Hello", "A"); t.insert(5, 5, "world!", "A"); t.insert(5, 5, ", ", "B"); @@ -121,7 +139,7 @@ mod tests { #[test] fn backspace() { - let mut t = Text::new(); + let mut t = Text::default(); t.insert(0, 0, "Hello", "A"); t.delete_backward(5, 5, "A"); @@ -133,7 +151,7 @@ mod tests { #[test] fn delete() { - let mut t = Text::new(); + let mut t = Text::default(); t.insert(0, 0, "Hello", "A"); t.delete_forward(4, 4, "A"); @@ -145,7 +163,7 @@ mod tests { #[test] fn linebreak() { - let mut t = Text::new(); + let mut t = Text::default(); t.insert(0, 0, "Hello, world!", "A"); t.insert_linebreak(6, 6, "A"); @@ -159,21 +177,20 @@ mod tests { #[test] fn apply_ops() { - let mut t_a = Text::new(); + let mut t_a = Text::default(); let ops_a = t_a.insert(0, 0, "Hello, world!", "A"); - let mut t_b = Text::new(); + let mut t_b = Text::default(); t_b.apply_ops(ops_a); assert_eq!(t_b.to_string(), "Hello, world!"); - let ops_a = t_a.insert(7,7, "distributed ", "A"); + let ops_a = t_a.insert(7, 7, "distributed ", "A"); t_b.apply_ops(ops_a); - let ops_b = t_b.insert(7,7, "cruel ", "B"); + let ops_b = t_b.insert(7, 7, "cruel ", "B"); t_a.apply_ops(ops_b); - assert_eq!(t_a.to_string(), "Hello, cruel distributed world!"); assert_eq!(t_b.to_string(), "Hello, cruel distributed world!"); }