lol
1{
2 lib,
3 callPackage,
4 rustPlatform,
5 fetchFromGitHub,
6 protobuf,
7 buildNpmPackage,
8}:
9let
10 version = "0.4.1";
11
12 src = fetchFromGitHub {
13 owner = "ekzhang";
14 repo = "sshx";
15 tag = "v${version}";
16 hash = "sha256-+IHV+dJb/j1/tmdqDXo6bqhvj3nBQ7i4AsUeHFA3+NU=";
17 };
18
19 mkSshxPackage =
20 { pname, cargoHash, ... }@args:
21 rustPlatform.buildRustPackage (
22 rec {
23 inherit
24 pname
25 version
26 src
27 cargoHash
28 ;
29
30 useFetchCargoVendor = true;
31
32 nativeBuildInputs = [ protobuf ];
33
34 cargoBuildFlags = [
35 "--package"
36 pname
37 ];
38
39 cargoTestFlags = cargoBuildFlags;
40
41 meta = {
42 description = "Fast, collaborative live terminal sharing over the web";
43 homepage = "https://github.com/ekzhang/sshx";
44 changelog = "https://github.com/ekzhang/sshx/releases/tag/v${version}";
45 license = lib.licenses.mit;
46 maintainers = with lib.maintainers; [
47 pinpox
48 kranzes
49 ];
50 mainProgram = pname;
51 };
52 }
53 // args
54 );
55in
56{
57 sshx = mkSshxPackage {
58 pname = "sshx";
59 cargoHash = "sha256-QftBUGDQvCSHoOBLnEzNOe1dMTpVTvMDXNp5qZr0C2M=";
60 };
61
62 sshx-server = mkSshxPackage rec {
63 pname = "sshx-server";
64 cargoHash = "sha256-QftBUGDQvCSHoOBLnEzNOe1dMTpVTvMDXNp5qZr0C2M=";
65
66 postPatch = ''
67 substituteInPlace crates/sshx-server/src/web.rs \
68 --replace-fail 'ServeDir::new("build")' 'ServeDir::new("${passthru.web.outPath}")' \
69 --replace-fail 'ServeFile::new("build/spa.html")' 'ServeFile::new("${passthru.web.outPath}/spa.html")'
70 '';
71
72 passthru.web = buildNpmPackage {
73 pname = "sshx-web";
74
75 inherit
76 version
77 src
78 ;
79
80 postPatch = ''
81 substituteInPlace vite.config.ts \
82 --replace-fail 'execSync("git rev-parse --short HEAD").toString().trim()' '"${src.rev}"'
83 '';
84
85 npmDepsHash = "sha256-QdgNtQMjK229QzB5LbCry1hKVPon8IWUnj+v5L7ydfI=";
86
87 installPhase = ''
88 cp -r build $out
89 '';
90 };
91 };
92}