ShellRS
ShellRS is a free, open-source SSH client written in Rust: host management, terminals, WinSCP-style SFTP and port forwarding in one GPU-rendered window, for macOS, Windows and Linux.
R6RS bindings to libuv for Chez Scheme
Translation pending
Developer toolsScheme · ShellGitHub @Kiyomi-Computation-SystemsOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Chez Scheme bindings for libuv (R6RS)
Translation pending
Loading the full README.
Read the full README ↗R6RS bindings to [[https://libuv.org][libuv]] for Chez Scheme: an event loop, TCP, timers, DNS, child processes, pipes and signals.
#+begin_quote ✨ AI Disclosure: LLMs are used extensively in the planning and development of this project. #+end_quote
⚠ This is not a web server.
You can use this to /build/ a server like [[https://github.com/Kiyomi-Computation-Systems/chez-http-server][chez-http-server]], or anything that needs async I/O using libuv.
It is a thin, legible mirror of libuv. The API follows libuv's own verbs
(accept, read-start, write, shutdown, timer, getaddrinfo,
spawn, close) closely.
It is transport only. It parses nothing, only understands raw bytes, and has no connection-state or backpressure policy of its own. Those belong to layers built on top of it.
| Module | Binds |
|-------------------+------------------------------------------------------------------|
| (libuv) | Everything below, the condition types and the version queries |
| (libuv loop) | Loops: run, stop, the cached clock, close and teardown |
| (libuv handle) | What every handle shares, and TCP and pipe socket buffer sizes |
| (libuv timer) | One-shot and repeating timers |
| (libuv tcp) | Bind, listen, accept, connect, nodelay, keepalive, addresses |
| (libuv stream) | Reads with backpressure, scalar and vectored writes, shutdown |
| (libuv pipe) | Pipes for child-process stdio |
| (libuv process) | Child processes with libuv's full stdio vocabulary, and kill |
| (libuv signal) | Signal watching, continuous or one-shot |
| (libuv async) | Waking a loop from another thread |
| (libuv dns) | getaddrinfo, getnameinfo and cancellation |
There is no filesystem API, no UDP and no zero-copy I/O. Linux and macOS are supported; Windows is not.
#+begin_src sh git clone --recursive https://github.com/Kiyomi-Computation-Systems/chez-libuv.git cd chez-libuv make build #+end_src
make build compiles the small C shim and generates
src/libuv/private/config.sls, which records absolute paths for /this/
machine. That file is not in the repository, so every clone runs
make build once before (import (libuv)) resolves. Run it again after
every upgrade: a shim built from older sources fails the import with
&uv-shim-unavailable. make help lists every target, and
[[file:docs/building.md][docs/building.md]] covers acquisition paths,
CHEZ_LIBUV_SHIM and release builds.
The shim and config.sls are per-machine build products, so a copy of
the sources alone cannot load. A project that depends on chez-libuv
through Akku gets them from its install hook, scripts/akku-install,
which akku install runs before it installs the libraries: it builds a
release shim into the project's .akku/ffi against the libuv pkg-config
finds, and writes config.sls naming it.
[[file:docs/installing.md#akku][docs/installing.md]] has the lines a
project's Akku.manifest needs to run it, and what each failure says. Akku
also manages the test suites' Scheme dependency (chez-srfi); (libuv)
itself depends on nothing beyond (rnrs).
Chez needs src on its library path:
#+begin_src sh CHEZSCHEMELIBDIRS=src chez --program your-script.sps #+end_src
make dev starts a REPL with everything wired.
#+begin_src scheme (import (rnrs) (libuv))
(define loop (make-uv-loop)) (define timer (make-uv-timer loop)) (define fires 0)
(uv-timer-start! timer (lambda (t) ; the callback receives the timer (set! fires (+ fires 1)) (display "tick\n") (when (= fires 3) (uv-timer-stop! t) (uv-close! t))) 0 100) ; first fire now, then every 100 ms
(uv-run loop 'default) ; callbacks run here and nowhere else (uv-loop-teardown! loop) #+end_src
[[file:docs/quickstart.md][docs/quickstart.md]] walks through an echo server and client on one loop, and the three rules every program here depends on.
make test runs the default suites; the root-only and threading-stress
suites have targets of their own (make help). On Linux,
make HAVE_PKG=no test-memory runs the suites under Valgrind, which is
the memory gate; on macOS the same target uses AddressSanitizer, which
checks addresses but not leaks. On a Guix host, scripts/guix-env make test
runs them in a pinned container. CI runs on Linux; macOS is tested locally.
[[file:docs/building.md][docs/building.md]] describes each gate, and
[[file:CONTRIBUTING.md][CONTRIBUTING.md]] the test discipline.
The guides start at [[file:docs/README.md][docs/README.md]]. make site
renders them into build/site/, the pages published on GitHub Pages.
| [[file:docs/installing.md][Installing]] | What you need, building the shim, importing (libuv) |
| [[file:docs/quickstart.md][Quickstart]] | An echo server start to finish, and the rules that make it work |
| [[file:docs/loops.md][The event loop]] | Making, running, stopping and tearing down a loop |
| [[file:docs/callbacks.md][Callbacks]] | What a callback may do, raises, escapes and engines |
| [[file:docs/threads.md][Threads]] | One thread per loop, handing a loop over, async wakeups |
| [[file:docs/timers.md][Timers]] | One-shot and repeating timers |
| [[file:docs/tcp.md][TCP and streams]] | Listening, connecting, reading and writing |
| [[file:docs/flow-control.md][Flow control]] | Buffers, the write queue, pausing reads |
| [[file:docs/processes.md][Processes and pipes]] | Running a child and talking to it |
| [[file:docs/signals.md][Signals]] | Catching signals on the loop |
| [[file:docs/dns.md][DNS]] | Names to addresses and back |
| [[file:docs/errors.md][Errors]] | Every condition the library raises |
| [[file:docs/reference.md][API reference]] | Every exported binding, checked against the source |
| [[file:docs/building.md][Building and testing]] | Acquisition paths, release builds, test gates, the docs site |
| [[file:CHANGELOG.md][CHANGELOG]] | Per-release history |
See [[file:CONTRIBUTING.md][CONTRIBUTING.md]] for the build and test workflow, and [[file:SECURITY.md][SECURITY.md]] for reporting vulnerabilities privately.
BSD 3-Clause; see [[file:LICENSE][LICENSE]]. Third-party components and their licenses are listed in [[file:NOTICE][NOTICE]].
© [[https://kiyomicomputation.systems/][Kiyomi Computation Systems LLC]], all rights reserved.