diff --git a/pkgs/development/tools/replay-io/default.nix b/pkgs/development/tools/replay-io/default.nix new file mode 100644 index 00000000000..744736657a7 --- /dev/null +++ b/pkgs/development/tools/replay-io/default.nix @@ -0,0 +1,141 @@ +{ stdenv, lib, fetchurl, fetchFromGitHub, autoPatchelfHook, makeWrapper, libcxx +, libX11, libXt, libXdamage, glib, gtk3, dbus-glib, openssl, nodejs, zlib +, fetchzip }: +let metadata = lib.importJSON ./meta.json; +in rec { + replay-recordreplay = stdenv.mkDerivation rec { + pname = "replay-recordreplay"; + version = builtins.head (builtins.match ".*/linux-recordreplay-(.*).tgz" + metadata.recordreplay.url); + nativeBuildInputs = [ autoPatchelfHook ]; + buildInputs = [ stdenv.cc.cc.lib openssl zlib ]; + + src = (fetchzip metadata.recordreplay); + dontBuild = true; + installPhase = '' + runHook preInstall + cp linux-recordreplay.so $out + runHook postInstall + ''; + meta = with lib; { + description = "RecordReplay internal recording library"; + homepage = "https://www.replay.io/"; + license = lib.licenses.unfree; + maintainers = with maintainers; [ phryneas ]; + platforms = [ "x86_64-linux" ]; + }; + }; + + replay-io = stdenv.mkDerivation rec { + pname = "replay-io"; + version = builtins.head + (builtins.match ".*/linux-gecko-(.*).tar.bz2" metadata.replay.url); + srcs = fetchurl metadata.replay; + nativeBuildInputs = [ autoPatchelfHook makeWrapper ]; + buildInputs = [ dbus-glib glib gtk3 libX11 libXdamage libXt ]; + installPhase = '' + runHook preInstall + mkdir -p $out/opt/replay-io + cp -r * $out/opt/replay-io + mkdir $out/bin + makeWrapper $out/opt/replay-io/replay \ + $out/bin/replay-io \ + --set "RECORD_REPLAY_DRIVER" "${replay-recordreplay}" + runHook postInstall + ''; + + passthru.updateScript = ./update.sh; + + meta = with lib; { + description = "The Time Travel Debugger for Web Development"; + longDescription = '' + Replay allows you to record and replay web applications with familiar browser dev tools. + You can access the browser DevTools at any point of the recording, adding new logger + statements and inspecting the status of the DOM, variables and the current call stack. + Your recordings can be shared with other users for collaborative debugging. + ''; + homepage = "https://www.replay.io/"; + downloadPage = "https://www.replay.io/"; + mainProgram = "replay-io"; + license = lib.licenses.mpl20; + maintainers = with maintainers; [ phryneas ]; + platforms = [ "x86_64-linux" ]; + }; + }; + + replay-node = stdenv.mkDerivation rec { + pname = "replay-node"; + version = builtins.head + (builtins.match ".*/linux-node-(.*)" metadata.replay-node.url); + nativeBuildInputs = [ autoPatchelfHook makeWrapper ]; + buildInputs = [ stdenv.cc.cc.lib ]; + + src = (fetchurl metadata.replay-node); + dontUnpack = true; + dontBuild = true; + installPhase = '' + runHook preInstall + mkdir -p $out/bin $out/opt/replay-node + cp $src $out/opt/replay-node/node-unwrapped + chmod +x $out/opt/replay-node/node-unwrapped + + makeWrapper $out/opt/replay-node/node-unwrapped \ + $out/opt/replay-node/node \ + --set "RECORD_REPLAY_DRIVER" "${replay-recordreplay}" + + ln -s $out/opt/replay-node/node $out/bin/replay-node + runHook postInstall + ''; + + meta = with lib; { + description = "Event-driven I/O framework for the V8 JavaScript engine, patched for replay"; + homepage = "https://github.com/RecordReplay/node"; + license = licenses.mit; + maintainers = with maintainers; [ phryneas ]; + platforms = platforms.linux; + mainProgram = "replay-node"; + }; + }; + + replay-node-cli = stdenv.mkDerivation { + pname = "replay-node-cli"; + version = "0.1.7-" + builtins.head + (builtins.match ".*/linux-node-(.*)" metadata.replay-node.url); + src = fetchFromGitHub { + owner = "RecordReplay"; + repo = "replay-node-cli"; + rev = "5269c8b8e7c5c7a9618a68f883d19c11a68be837"; + sha256 = "04d22q3dvs9vxpb9ps64pdxq9ziwgvnzdgsn6p9p0lzjagh0f5n0"; + }; + + nativeBuildInputs = [ makeWrapper ]; + buildInputs = [ stdenv.cc.cc.lib nodejs ]; + dontBuild = true; + installPhase = '' + runHook preInstall + mkdir -p $out/opt/replay-node-cli + cp -r * $out/opt/replay-node-cli + makeWrapper $out/opt/replay-node-cli/bin/replay-node \ + $out/bin/replay-node \ + --prefix "PATH" ":" "${nodejs}/bin" \ + --set "RECORD_REPLAY_NODE_DIRECTORY" "${replay-node}/opt/replay-node" + runHook postInstall + ''; + + meta = with lib; { + description = "The Time Travel Debugger for Web Development - Node Command Line"; + longDescription = '' + The Replay Node Command Line allows you to record node applications and debug them + with familiar browser dev tools. + You can access the browser DevTools at any point of the recording, adding new logger + statements and inspecting the status of variables and the current call stack. + Your recordings can be shared with other users for collaborative debugging. + ''; + homepage = "https://www.replay.io/"; + mainProgram = "replay-node"; + license = lib.licenses.bsd3; + maintainers = with maintainers; [ phryneas ]; + platforms = [ "x86_64-linux" ]; + }; + }; +} diff --git a/pkgs/development/tools/replay-io/meta.json b/pkgs/development/tools/replay-io/meta.json new file mode 100644 index 00000000000..1afc5c10dfa --- /dev/null +++ b/pkgs/development/tools/replay-io/meta.json @@ -0,0 +1,15 @@ +{ + "replay": { + "url": "https://static.replay.io/downloads/linux-gecko-20220516-372662e7c79d-a9c63f38ea9b.tar.bz2", + "sha256": "151k0ykd2mn722zk7n902si6llcsrqnhgjb5bs4wgn9rik9advbi" + }, + "recordreplay": { + "url": "https://static.replay.io/downloads/linux-recordreplay-a9c63f38ea9b.tgz", + "sha256": "032x9wiw4jcdkn0wjgr5j3pc4parrdy5n4r8bgmfxsldg5j48hmk", + "stripRoot": false + }, + "replay-node": { + "url": "https://static.replay.io/downloads/linux-node-20220506-096c12cb47eb-a1d05f422dff", + "sha256": "1fbqlx01vp6llbvvz285brmz86jxc989v0cw6s06jk0657g87inq" + } +} diff --git a/pkgs/development/tools/replay-io/update.sh b/pkgs/development/tools/replay-io/update.sh new file mode 100755 index 00000000000..49f68d6677e --- /dev/null +++ b/pkgs/development/tools/replay-io/update.sh @@ -0,0 +1,32 @@ +#!/usr/bin/env nix-shell +#!nix-shell -i bash -p curl jq gnused + +set -euo pipefail + +# e.g. linux-gecko-20220331-59d0a686993f-ffd8d6280276 +BUILD_ID=$(curl https://static.replay.io/downloads/linux-replay.json | jq .buildId -r) +REVISION=$(echo $BUILD_ID | sed 's/^.*-//') +NODE_BUILD_ID=$(curl https://static.replay.io/downloads/linux-replay-node.json | jq .buildId -r) + +REPLAY_DL=https://static.replay.io/downloads/${BUILD_ID}.tar.bz2 +LIB_DL=https://static.replay.io/downloads/linux-recordreplay-${REVISION}.tgz +NODE_DL=https://static.replay.io/downloads/${NODE_BUILD_ID} + + +cat >"${BASH_SOURCE%/*}/meta.json" <