zellij/Cargo.toml
Aram Drevekenin c5ac796880
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>
2025-06-23 19:19:37 +02:00

143 lines
6.1 KiB
TOML

[package]
name = "zellij"
version = "0.43.0"
authors = ["Aram Drevekenin <aram@poor.dev>"]
edition = "2021"
description = "A terminal workspace with batteries included"
license = "MIT"
repository = "https://github.com/zellij-org/zellij"
homepage = "https://zellij.dev"
include = ["src/**/*", "assets/layouts/*", "assets/config/*", "LICENSE.md", "README.md", "!**/*_test.*", "!**/tests/**/*"]
# NOTE: When updating this, modify `channel` in `rust-toolchain.toml` accordingly
rust-version = "1.84"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
zellij-client = { path = "zellij-client/", version = "0.43.0" }
zellij-server = { path = "zellij-server/", version = "0.43.0" }
zellij-utils = { workspace = true }
anyhow = { workspace = true }
clap = { workspace = true }
dialoguer = { version = "0.10.4", default-features = false }
humantime = { workspace = true }
interprocess = { workspace = true }
log = { workspace = true }
miette = { workspace = true }
names = { workspace = true }
nix = { workspace = true }
suggest = { workspace = true }
thiserror = { workspace = true }
isahc = { workspace = true }
[dev-dependencies]
insta = { version = "1.6.0", features = ["backtrace"] }
ssh2 = "0.9.1"
rand = "0.8.0"
regex = "1.8.1"
vte = { workspace = true }
[workspace]
members = [
"default-plugins/compact-bar",
"default-plugins/status-bar",
"default-plugins/strider",
"default-plugins/tab-bar",
"default-plugins/fixture-plugin-for-tests",
"default-plugins/session-manager",
"default-plugins/configuration",
"default-plugins/plugin-manager",
"default-plugins/about",
"default-plugins/share",
"default-plugins/multiple-select",
"zellij-client",
"zellij-server",
"zellij-utils",
"zellij-tile",
"zellij-tile-utils",
"xtask",
".",
]
[workspace.dependencies]
ansi_term = { version = "0.12.1", default-features = false }
anyhow = { version = "1.0.70", default-features = false, features = ["backtrace", "std"] }
async-std = { version = "1.3.0", default-features = false, features = ["attributes", "default", "std", "unstable"] }
clap = { version = "3.2.2", default-features = false, features = ["env", "derive", "color", "std", "suggestions"] }
daemonize = { version = "0.5", default-features = false }
humantime = { version = "2.1.0", default-features = false }
interprocess = { version = "1.2.1", default-features = false }
isahc = { version = "1.7.2", default-features = false, features = ["http2", "text-decoding"] }
lazy_static = { version = "1.4.0", default-features = false }
libc = { version = "0.2", default-features = false, features = ["std"] }
log = { version = "0.4.17", default-features = false }
miette = { version = "5.7.0", default-features = false, features = ["fancy"] }
nix = { version = "0.23.1", default-features = false }
notify-debouncer-full = { version = "0.3.1", default-features = false }
notify = { version = "6.1.1", default-features = false, features = ["macos_kqueue"] }
prost = { version = "0.11.9", default-features = false, features = ["std", "prost-derive"] }
regex = { version = "1.5.5", default-features = false, features = ["perf", "std"] }
serde = { version = "1.0", default-features = false, features = ["derive", "std"] }
serde_json = { version = "1.0", default-features = false, features = ["std"] }
signal-hook = { version = "0.3", default-features = false, features = ["iterator"] }
strum = { version = "0.20.0", default-features = false }
strum_macros = { version = "0.20.0", default-features = false }
suggest = { version = "0.4.0", default-features = false }
tempfile = { version = "3.2.0", default-features = false }
termwiz = { version = "0.23.2", default-features = false }
thiserror = { version = "1.0.40", default-features = false }
tokio = { version = "1.38.1", features = ["full"] }
tokio-util = { version = "0.7.15" }
unicode-width = { version = "0.1.8", default-features = false }
url = { version = "2.2.2", default-features = false, features = ["serde"] }
uuid = { version = "1.4.1", default-features = false, features = ["serde", "v4", "std"] }
vte = { version = "0.11.0", default-features = false }
names = { version = "0.14.0", default-features = false }
include_dir = { version = "0.7.3", default-features = false }
rmp-serde = { version = "1.1.0", default-features = false }
sha2 = { version = "0.10", default-features = false }
zellij-utils = { path = "zellij-utils/", version = "0.43.0" }
[profile.dev-opt]
inherits = "dev"
[profile.dev-opt.package."*"]
opt-level = 3
[profile.release]
lto = true
strip = true
[package.metadata.deb]
depends = "$auto"
license-file = ["LICENSE.md", "4"]
assets = [
["assets/man/zellij.1", "usr/share/man/man1/zellij.1", "644"],
["target/release/zellij", "usr/bin/zellij", "755"],
["GOVERNANCE.md", "usr/share/doc/zellij/GOVERNANCE.md", "644"],
["README.md", "usr/share/doc/zellij/README.md", "644"],
["assets/layouts/*", "usr/share/zellij/layouts/", "644"],
["assets/plugins/*", "usr/share/zellij/plugins/", "644"],
["assets/completions/zellij.bash", "usr/share/bash-completion/completions/zellij.bash", "644"],
["assets/completions/zellij.fish", "usr/share/fish/vendor_completions.d/zellij.fish", "644"],
["assets/completions/_zellij", "usr/share/zsh/vendor-completions/_zellij", "644"],
]
[package.metadata.binstall]
pkg-url = "{ repo }/releases/download/v{ version }/{ name }-{ target }.tar.gz"
bin-dir = "{ bin }{ binary-ext }"
pkg-fmt = "tgz"
[features]
# See remarks in zellij_utils/Cargo.toml
default = ["plugins_from_target", "vendored_curl", "web_server_capability"]
plugins_from_target = ["zellij-utils/plugins_from_target"]
disable_automatic_asset_installation = ["zellij-utils/disable_automatic_asset_installation"]
vendored_curl = ["zellij-utils/vendored_curl"]
unstable = ["zellij-client/unstable", "zellij-utils/unstable"]
singlepass = ["zellij-server/singlepass"]
web_server_capability = ["zellij-client/web_server_capability", "zellij-server/web_server_capability", "zellij-utils/web_server_capability"]
# uncomment this when developing plugins in the Zellij UI to make plugin compilation faster
# [profile.dev.package."*"]
# opt-level = 3