aboutsummaryrefslogtreecommitdiffstats
path: root/.github
diff options
context:
space:
mode:
authorAram Drevekenin <aram@poor.dev>2025-06-23 19:19:37 +0200
committerGitHub <noreply@github.com>2025-06-23 19:19:37 +0200
commitc5ac7968809ddb1033b625562eae22019cccc2f4 (patch)
tree932cf07d898dfbcc6ec6a9d4cf5353c06a47accc /.github
parentfeat(ui): add optional tooltip with key hints to the compact bar (#4225) (diff)
downloadsl0ppij-c5ac7968809ddb1033b625562eae22019cccc2f4.tar.gz
sl0ppij-c5ac7968809ddb1033b625562eae22019cccc2f4.tar.xz
sl0ppij-c5ac7968809ddb1033b625562eae22019cccc2f4.zip
Feature: web-client/server to share your sessions in the browser (#4242)
* work * moar work * notes * work * separate to terminal and control channels * stdin working * serve html web client initial * serve static assets loaded with include_dir * merge * enable_web_server config parameter * compile time flag to disable web server capability * rustfmt * add license to all xterm.js assets * mouse working except copy/paste * helpful comment * web client improvements - move script to js file - add favicon - add nerd font - change title TODO: investigate if font license embedded in otf is sufficient * get mouse to work properly * kitty keyboard support initial * fix wrong type in preload link * wip axum websocket handlers - upgrade axum to v0.8.1, enable ws feature - begin setup of websocket handlers - tidy up imports * replace control listener * handle terminal websocket with axum * cleanup Cargo.toml * kitty fixes and bracketed paste * fix(mouse): pane not found crash * initial session switching infra * add `web_client_font` option * session switching, creation and resurrection working through the session manager * move session module to zellij-utils and share logic with web-client * some cleanups * require restart for enable-web-server * use session name from router * write config to disk and watch for config changes * rename session name to ipc path * add basic panic handler, make render_to_client exit on channel close * use while let instead of loop * handle websocket close * add mouse motions * make clipboard work * add weblink handling and webgl rendering * add todo * fix: use session name instead of patch on session switch * use "default" layout for new sessions * ui indication for session being shared * share this session ui * plugin assets * Fix process crash on mac with notify watcher. Use poll watcher instead of recommended as a workaround. * make url session switching and creation work * start welcome screen on root url * scaffold control messages, set font from config * set dimensions on session start * bring back session name from url * send bytes on terminal websocket instead of json - create web client os input and id before websocket connection * draft ui * work * refactor ui * remove otf font, remove margins to avoid scrollbar * version query endpoint for server status * web session info query endpoint * refactor: move stuff around * add web client info to session metadata * make tests pass * populate real data in session list * remove unnecessary endpoint * add web_client node to config, add font option * remove web_client_font * allow disabling the web session through the config - WIP * formalize sharing/not-sharing configuration * fix tests * allow shutting down web server * display error when web clients are forbidden to attach * only show sessions that allow web clients if this is a web client * style(fmt): rustfmt * fix: query web server from Zellij rather than from each plugin * remove log spam * handle some error paths better in the web client * allow controlling the web server through the cli * allow configuring the web server's ip/port * fix tests and format code * use direct WebServerStatus event instead of piggy-backing on SessionInfo * plugin revamp initial * make plugin responsive * adjust plugin title * refactor: share plugin * refactor: share plugin * add cors middleware * some fixes for running without a compiled web server capability * display error when starting the share plugin without web server support * clarify config * add pipelines to compile zellij without web support * display error when unable to start web server * only query web server when share plugin is running * refactor(web-client): connection table * give zellij_server_listener access to the control channel * fixes and clarifications * refactor: consolidate generate_unique_session_name * give proper error when trying to attach to a forbidden session * change browser URL when switching sessions * add keyboard shortcut * enforce https when bound to non-loopback ip * initial authentication token implementation * background color from theme * initial web client theme config * basic token generation ui * refactor set config message creation * also set body background * allow editing scrollback for plugins too * set scrollback to 0 * properly parse colors in config * generate token from plugin * nice login modals * initial token management screen * implement token authentication * refactor(share): token management screen * style(fmt): rustfmt * fix(plugin): some minor bugs * refactor(share): main screen * refactor(share): token screen * refactor(share): main * refactor(share): ui components * fix(responsiveness): properly send usage_width to the render function * fix cli commands and add some verbosity * add support for settings ansi and selection colors * add cursor and cursor accent * basic web client tests * fix tests * refactor: web client * use session tokens for authentication * improve modals * move shutdown to ipc * refactor: ipc logic * serialize theme config for web client * update tests * refactor: move some stuff around to prepare for config hot reload * config live reloading for the web clients * change remember-me UI wording * improve xterm.js link handling * make sure terminal is focused on mousemove * remove deprecated sharing indication from compact-bar * gate deps and functionality behind the web_server_compatibility feature * feat(build): add --no-web flag in all the places * fix some other build flows * add new assets * update CI for no-web (untested) * make more dependencies optional * update axum-extra * add web client configuration options * gracefully close connections on server exit * tests for graceful connection closing * handle client-side reconnect when server is down * fix: make sure ipc bus folder exists before starting * add commands to manage login tokens from the cli * style(fmt): rustfmt * some cleanups * fix(ux): allow alt-right-click on the web client without opening the context menu * fix: prevent attaching to welcome screen * fix: reload config issues * fix long socket path on macos * normalize config conversion and fix color gap in browser * revoke session_token cookie if it is not valid * fix: visual bug with multiple clients in extremely small screen sizes * fix: only include rusqlite for the web server capability builds * update e2e snapshots * refactor(web): client side js * some cleanups * moar cleanups * fix(tests): wait for server instead of using a fixed timeout * debug CI * fix(tests): use spawn_blocking for running the test web server * fix(tests): wait for http rather than tcp port * fix(tests): properly pass config path - hopefully this is the issue... * success! bring back the rest of the tests * attempt to fix the macos CI issue * docs(changelog): add PR --------- Co-authored-by: Thomas Linford <linford.t@gmail.com>
Diffstat (limited to '.github')
-rw-r--r--.github/workflows/release.yml98
-rw-r--r--.github/workflows/rust.yml20
2 files changed, 98 insertions, 20 deletions
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 260f5b98..c1e2501b 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -66,54 +66,113 @@ jobs:
cache: false
rustflags: ""
- - name: Build release binary
+ - name: Build release binary (normal)
run: cargo xtask ci cross ${{ matrix.target }}
+ - name: Preserve normal binary and build no-web variant
+ run: |
+ # Copy the normal binary to a safe location outside target/
+ mkdir -p ./release-artifacts
+ cp "target/${{ matrix.target }}/release/zellij" "./release-artifacts/zellij-normal"
+
+ # Clean and build the no-web version
+ cargo clean
+ cargo xtask ci cross ${{ matrix.target }} --no-web
+
+ # Copy the no-web binary to our safe location too
+ cp "target/${{ matrix.target }}/release/zellij" "./release-artifacts/zellij-no-web"
+
# this breaks on aarch64 and this if conditional isn't working for some reason: TODO: investigate
#- name: Strip release binary
# if: runner.target != 'aarch64-unknown-linux-musl' && runner.target != 'aarch64-apple-darwin'
# run: strip "target/${{ matrix.target }}/release/zellij"
- - name: Create checksum
- id: make-checksum
- working-directory: ./target/${{ matrix.target }}/release
+ - name: Create artifacts for both variants
+ id: make-artifacts
+ working-directory: ./release-artifacts
+ run: |
+ # Create normal version artifact
+ normal_name="zellij-${{ matrix.target }}.tar.gz"
+ cp zellij-normal zellij
+ tar cvzf "${normal_name}" zellij
+ rm zellij
+ echo "normal_name=${normal_name}" >> "$GITHUB_OUTPUT"
+
+ # Create no-web version artifact
+ noweb_name="zellij-no-web-${{ matrix.target }}.tar.gz"
+ cp zellij-no-web zellij
+ tar cvzf "${noweb_name}" zellij
+ rm zellij
+ echo "noweb_name=${noweb_name}" >> "$GITHUB_OUTPUT"
+
+ - name: Create checksums
+ id: make-checksums
+ working-directory: ./release-artifacts
run: |
- name="zellij-${{ matrix.target }}.sha256sum"
+ normal_checksum="zellij-${{ matrix.target }}.sha256sum"
+ noweb_checksum="zellij-no-web-${{ matrix.target }}.sha256sum"
+
+ # Create checksum for normal version
+ cp zellij-normal zellij
+ if [[ "$RUNNER_OS" != "macOS" ]]; then
+ sha256sum zellij > "${normal_checksum}"
+ else
+ shasum -a 256 zellij > "${normal_checksum}"
+ fi
+ rm zellij
+
+ # Create checksum for no-web version
+ cp zellij-no-web zellij
if [[ "$RUNNER_OS" != "macOS" ]]; then
- sha256sum "zellij" > "${name}"
+ sha256sum zellij > "${noweb_checksum}"
else
- shasum -a 256 "zellij" > "${name}"
+ shasum -a 256 zellij > "${noweb_checksum}"
fi
- echo "::set-output name=name::${name}"
+ rm zellij
- - name: Tar release
- id: make-artifact
- working-directory: ./target/${{ matrix.target }}/release
- run: |
- name="zellij-${{ matrix.target }}.tar.gz"
- tar cvzf "${name}" "zellij"
- echo "::set-output name=name::${name}"
+ echo "normal_checksum=${normal_checksum}" >> "$GITHUB_OUTPUT"
+ echo "noweb_checksum=${noweb_checksum}" >> "$GITHUB_OUTPUT"
- - name: Upload release archive
+ - name: Upload normal release archive
uses: actions/upload-release-asset@v1.0.2
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ needs.create-release.outputs.upload_url }}
- asset_path: ./target/${{ matrix.target }}/release/${{ steps.make-artifact.outputs.name }}
+ asset_path: ./release-artifacts/${{ steps.make-artifacts.outputs.normal_name }}
asset_name: zellij-${{matrix.target}}.tar.gz
asset_content_type: application/octet-stream
- - name: Upload checksum
+ - name: Upload normal checksum
uses: actions/upload-release-asset@v1.0.2
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ needs.create-release.outputs.upload_url }}
- asset_path: ./target/${{ matrix.target }}/release/${{ steps.make-checksum.outputs.name }}
+ asset_path: ./release-artifacts/${{ steps.make-checksums.outputs.normal_checksum }}
asset_name: zellij-${{matrix.target}}.sha256sum
asset_content_type: text/plain
+ - name: Upload no-web release archive
+ uses: actions/upload-release-asset@v1.0.2
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ with:
+ upload_url: ${{ needs.create-release.outputs.upload_url }}
+ asset_path: ./release-artifacts/${{ steps.make-artifacts.outputs.noweb_name }}
+ asset_name: zellij-no-web-${{matrix.target}}.tar.gz
+ asset_content_type: application/octet-stream
+
+ - name: Upload no-web checksum
+ uses: actions/upload-release-asset@v1.0.2
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ with:
+ upload_url: ${{ needs.create-release.outputs.upload_url }}
+ asset_path: ./release-artifacts/${{ steps.make-checksums.outputs.noweb_checksum }}
+ asset_name: zellij-no-web-${{matrix.target}}.sha256sum
+ asset_content_type: text/plain
+
create-release:
runs-on: ubuntu-latest
outputs:
@@ -129,4 +188,3 @@ jobs:
release_name: Release ${{ github.event_name == 'workflow_dispatch' && 'main' || github.ref }}
draft: ${{ github.event_name == 'workflow_dispatch' }}
prerelease: false
-
diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml
index 86f2a0f3..5d583ffb 100644
--- a/.github/workflows/rust.yml
+++ b/.github/workflows/rust.yml
@@ -62,6 +62,26 @@ jobs:
- name: Test
run: cargo xtask test
+ test-no-web:
+ name: Test (No Web)
+ runs-on: ubuntu-latest
+
+ steps:
+ - uses: actions/checkout@v3
+
+ - name: Install Protoc
+ uses: arduino/setup-protoc@v2
+ with:
+ repo-token: ${{ secrets.GITHUB_TOKEN }}
+
+ - name: Setup toolchain
+ uses: actions-rust-lang/setup-rust-toolchain@v1
+ with:
+ rustflags: ""
+
+ - name: Test without web support
+ run: cargo xtask test --no-web
+
format:
name: Check Formatting
runs-on: ubuntu-latest