atagen

malice

public
Star0
Watch0
973f8fbdaf80e2ef6679dd071233fe6b853344b2
2
ssh://brewery@pls.lobotomise.me:33/atagen/malice.git
flake.nixNix230 lines8.2 KB
1
{
2
  description = "Malice: a hosted Matrix client backed by macltok";
3
4
  inputs = {
5
    nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
6
    fenix = {
7
      url = "github:nix-community/fenix";
8
      inputs.nixpkgs.follows = "nixpkgs";
9
    };
10
  };
11
12
  outputs =
13
    { self, nixpkgs, fenix }:
14
    let
15
      systems = [
16
        "x86_64-linux"
17
        "aarch64-linux"
18
      ];
19
      forAllSystems = nixpkgs.lib.genAttrs systems;
20
      workerLock = builtins.fromTOML (builtins.readFile ./crates/malice-worker/Cargo.lock);
21
      lockedVersion =
22
        name: (nixpkgs.lib.findFirst (p: p.name == name) null workerLock.package).version;
23
      # wasm-bindgen-test-runner refuses a module built by any other wasm-bindgen version
24
      wasmBindgenCli =
25
        pkgs:
26
        pkgs.buildWasmBindgenCli rec {
27
          src = pkgs.fetchCrate {
28
            pname = "wasm-bindgen-cli";
29
            version = lockedVersion "wasm-bindgen";
30
            hash = "sha256-a7lcXJnnZkYReja+iUO7NqqrWyv3toxnUgQb8s4IS5s=";
31
          };
32
          cargoDeps = pkgs.rustPlatform.fetchCargoVendor {
33
            inherit src;
34
            inherit (src) pname version;
35
            hash = "sha256-R1Tas33Ursy8kqsxguAkG0ZhNed2n5uFTAhw1l2qlLY=";
36
          };
37
        };
38
      wasmToolchain =
39
        system:
40
        let
41
          toolchains = fenix.packages.${system};
42
        in
43
        toolchains.combine [
44
          toolchains.stable.cargo
45
          toolchains.stable.clippy
46
          toolchains.stable.rustc
47
          toolchains.stable.rustfmt
48
          toolchains.stable.rust-src
49
          toolchains.targets.wasm32-unknown-unknown.stable.rust-std
50
        ];
51
    in
52
    {
53
      packages = forAllSystems (
54
        system:
55
        let
56
          pkgs = nixpkgs.legacyPackages.${system};
57
          wasmPlatform = pkgs.makeRustPlatform {
58
            cargo = wasmToolchain system;
59
            rustc = wasmToolchain system;
60
          };
61
          web = pkgs.buildNpmPackage {
62
            pname = "malice-web";
63
            version = "0.1.0";
64
            src = ./web;
65
            npmDepsHash = "sha256-Q00XwHH/+kfZTAPBKUlkx3hAtYvSpDw2opj22nGTIMY=";
66
            installPhase = ''
67
              runHook preInstall
68
              mkdir -p $out/share/malice
69
              cp -R dist/. $out/share/malice/
70
              runHook postInstall
71
            '';
72
          };
73
          backend = pkgs.rustPlatform.buildRustPackage {
74
            pname = "malice-server";
75
            version = "0.1.0";
76
            src = ./.;
77
            cargoLock.lockFile = ./Cargo.lock;
78
            nativeBuildInputs = [ pkgs.pkg-config ];
79
            buildInputs = [ pkgs.sqlite ];
80
            # preBuild = "export NIX_BUILD_CORES=2";
81
            preCheck = ''
82
              cargo build --release --bin malice --target ${pkgs.stdenv.hostPlatform.rust.rustcTarget} --offline --locked
83
            '';
84
            SSL_CERT_FILE = "${pkgs.cacert}/etc/ssl/certs/ca-bundle.crt";
85
          };
86
          server = pkgs.symlinkJoin {
87
            name = "malice";
88
            paths = [
89
              backend
90
              web
91
            ];
92
            nativeBuildInputs = [ pkgs.makeWrapper ];
93
            postBuild = ''
94
              wrapProgram $out/bin/malice --set MALICE_WEB_DIR ${web}/share/malice
95
            '';
96
          };
97
          # the wasm-bindgen `--target web` glue for malice-worker's `Host`, consumed by
98
          # web/src/worker/pkg (gitignored, worker-web's TS imports it as ./pkg/malice_worker.js)
99
          workerWasm = wasmPlatform.buildRustPackage {
100
            pname = "malice-worker-wasm";
101
            version = "0.1.0";
102
            src = self;
103
            cargoRoot = "crates/malice-worker";
104
            cargoLock.lockFile = ./crates/malice-worker/Cargo.lock;
105
            nativeBuildInputs = [ (wasmBindgenCli pkgs) ];
106
            buildPhase = ''
107
              runHook preBuild
108
              cd crates/malice-worker
109
              cargo build --offline --frozen --release --lib --target wasm32-unknown-unknown
110
              mkdir -p $out
111
              wasm-bindgen --target web --out-dir $out --out-name malice_worker \
112
                target/wasm32-unknown-unknown/release/malice_worker.wasm
113
              runHook postBuild
114
            '';
115
            doCheck = false;
116
            installPhase = "true";
117
          };
118
          web-device = pkgs.buildNpmPackage {
119
            pname = "malice-web-device";
120
            version = "0.1.0";
121
            src = ./web;
122
            npmDepsHash = "sha256-Q00XwHH/+kfZTAPBKUlkx3hAtYvSpDw2opj22nGTIMY=";
123
            postPatch = ''
124
              mkdir -p src/worker/pkg
125
              cp -R ${workerWasm}/. src/worker/pkg/
126
            '';
127
            npmBuildScript = "build:device";
128
            installPhase = ''
129
              runHook preInstall
130
              mkdir -p $out/share/malice
131
              cp -R dist-device/. $out/share/malice/
132
              runHook postInstall
133
            '';
134
          };
135
          local = pkgs.symlinkJoin {
136
            name = "malice-local";
137
            paths = [
138
              backend
139
              web-device
140
            ];
141
            nativeBuildInputs = [ pkgs.makeWrapper ];
142
            postBuild = ''
143
              wrapProgram $out/bin/malice \
144
                --set MALICE_WEB_DIR ${web-device}/share/malice \
145
                --set MALICE_STATIC_ONLY 1
146
            '';
147
          };
148
        in
149
        {
150
          inherit web server web-device local;
151
          default = server;
152
        }
153
      );
154
155
      devShells = forAllSystems (
156
        system:
157
        let
158
          pkgs = nixpkgs.legacyPackages.${system};
159
        in
160
        {
161
          default = pkgs.mkShell {
162
            packages = [
163
              (wasmToolchain system)
164
              (wasmBindgenCli pkgs)
165
              pkgs.rust-analyzer
166
              pkgs.nodejs_22
167
              pkgs.pkg-config
168
              pkgs.sqlite
169
              pkgs.firefox
170
              pkgs.geckodriver
171
              pkgs.matrix-continuwuity
172
              pkgs.nushell
173
            ];
174
            # fenix's rustc links through its bundled rust-lld, which skips nix's ld-wrapper and so
175
            # the store rpaths, leaving the native server unable to find libsqlite3 at run time
176
            "CARGO_TARGET_${nixpkgs.lib.toUpper (builtins.replaceStrings [ "-" ] [ "_" ] pkgs.stdenv.hostPlatform.config)}_RUSTFLAGS" =
177
              "-C linker-features=-lld";
178
          };
179
        }
180
      );
181
182
      nixosModules.malice = import ./nix/module.nix { inherit self; };
183
      nixosModules.default = self.nixosModules.malice;
184
      checks = forAllSystems (
185
        system:
186
        let
187
          pkgs = nixpkgs.legacyPackages.${system};
188
          wasmPlatform = pkgs.makeRustPlatform {
189
            cargo = wasmToolchain system;
190
            rustc = wasmToolchain system;
191
          };
192
          # continuwuity refuses to start without /etc/resolv.conf, which the build sandbox lacks, or with
193
          # stdenv's deliberately bogus SSL_CERT_FILE. no exec, run.nu launches through a shell that exits at
194
          # once and would trip --die-with-parent, so this shell stays as the parent run.nu kills
195
          sandboxedHomeserver = pkgs.writeShellScriptBin "conduwuit" ''
196
            export SSL_CERT_FILE=${pkgs.cacert}/etc/ssl/certs/ca-bundle.crt
197
            ${pkgs.lib.getExe pkgs.bubblewrap} --die-with-parent --dev-bind / / --tmpfs /etc \
198
              --ro-bind ${pkgs.writeText "resolv.conf" "nameserver 127.0.0.1\n"} /etc/resolv.conf \
199
              ${pkgs.lib.getExe' pkgs.matrix-continuwuity "conduwuit"} "$@"
200
          '';
201
        in
202
        {
203
          default = self.packages.${system}.default;
204
          worker-wasm = self.packages.${system}.web-device;
205
          worker-browser = wasmPlatform.buildRustPackage {
206
            pname = "malice-worker-browser-check";
207
            version = "0.1.0";
208
            src = self;
209
            cargoRoot = "crates/malice-worker";
210
            cargoLock.lockFile = ./crates/malice-worker/Cargo.lock;
211
            nativeBuildInputs = [
212
              (wasmBindgenCli pkgs)
213
              pkgs.firefox
214
              pkgs.geckodriver
215
              sandboxedHomeserver
216
              pkgs.nushell
217
            ];
218
            buildPhase = ''
219
              runHook preBuild
220
              export HOME=$TMPDIR
221
              nu --no-config-file crates/malice-worker/run.nu
222
              runHook postBuild
223
            '';
224
            doCheck = false;
225
            installPhase = "touch $out";
226
          };
227
        }
228
      );
229
    };
230
}