etunnel 1.4.0
etunnel: ^1.4.0 copied to clipboard
Expose local services to the internet in one line of code: instant public HTTPS URLs with automatic TLS, through NAT and firewalls, no signup.
etunnel for Dart #
dart:io only, zero dependencies.
Zero registration: every SDK client speaks the same tiny wire protocol
(PROTOCOL.md) against any etunnel server
(default wss://t.etun.uk/tunnel).
Install #
dart pub add etunnel
Requires Dart ^3.0.
CLI #
dart run etunnel.dart 3000
Prints TUNNEL_URL: https://<subdomain>.t.etun.uk — that URL now routes to
your local service. Ctrl-C closes the tunnel.
Reconnects automatically. If the connection drops (including a server
restart) the CLI re-dials with exponential backoff (500ms → 30s, ±20%
jitter, reset on success) and prints TUNNEL_URL: again. The subdomain is
reclaimed, not re-randomised: the client replays the server's signed
resumeToken in hello.resume, so links already shared keep working (the
server needs a stable SESSION_SECRET; see PROTOCOL.md §1). Set
ETUNNEL_RECONNECT=0 to restore the old one-shot behaviour.
Embed #
See the header of the source file for the embed example.
Environment variables #
| Variable | Meaning | Default |
|---|---|---|
ETUNNEL_SERVER |
tunnel server WebSocket URL | wss://t.etun.uk/tunnel |
ETUNNEL_LOCAL |
local port or host:port (or 1st CLI arg) |
3000 |
ETUNNEL_TOKEN |
paid-plan API key (optional) | - |
ETUNNEL_RECONNECT |
0 disables auto-reconnect (one-shot CLI) |
enabled |
ETUNNEL_SUBDOMAIN |
custom subdomain (paid plans) | random |
License #
MIT — see LICENSE. Buffer-based protocol client: request and response bodies are buffered per stream (fine for webhooks/dashboards/demos; use the Go SDK for streaming and WebSocket pass-through).