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 nativeBuildInputs = [ protobuf ];
31
32 cargoBuildFlags = [
33 "--package"
34 pname
35 ];
36
37 cargoTestFlags = cargoBuildFlags;
38
39 meta = {
40 description = "Fast, collaborative live terminal sharing over the web";
41 homepage = "https://github.com/ekzhang/sshx";
42 changelog = "https://github.com/ekzhang/sshx/releases/tag/v${version}";
43 license = lib.licenses.mit;
44 maintainers = with lib.maintainers; [
45 pinpox
46 kranzes
47 ];
48 mainProgram = pname;
49 };
50 }
51 // args
52 );
53in
54{
55 sshx = mkSshxPackage {
56 pname = "sshx";
57 cargoHash = "sha256-QftBUGDQvCSHoOBLnEzNOe1dMTpVTvMDXNp5qZr0C2M=";
58 };
59
60 sshx-server = mkSshxPackage rec {
61 pname = "sshx-server";
62 cargoHash = "sha256-QftBUGDQvCSHoOBLnEzNOe1dMTpVTvMDXNp5qZr0C2M=";
63
64 postPatch = ''
65 substituteInPlace crates/sshx-server/src/web.rs \
66 --replace-fail 'ServeDir::new("build")' 'ServeDir::new("${passthru.web.outPath}")' \
67 --replace-fail 'ServeFile::new("build/spa.html")' 'ServeFile::new("${passthru.web.outPath}/spa.html")'
68 '';
69
70 passthru.web = buildNpmPackage {
71 pname = "sshx-web";
72
73 inherit
74 version
75 src
76 ;
77
78 postPatch = ''
79 substituteInPlace vite.config.ts \
80 --replace-fail 'execSync("git rev-parse --short HEAD").toString().trim()' '"${src.rev}"'
81 '';
82
83 npmDepsHash = "sha256-QdgNtQMjK229QzB5LbCry1hKVPon8IWUnj+v5L7ydfI=";
84
85 installPhase = ''
86 cp -r build $out
87 '';
88 };
89 };
90}