Releases: danReynolds/tailscale_dart
Releases · danReynolds/tailscale_dart
Release list
tailscale 0.3.1
- Adds
Tailscale.up(ephemeral: true)for disposable CI jobs, preview
environments, and tests. - Adds
example/shelf_adapter.dart, a tested adapter showing how to run Shelf
handlers directly onhttp.bindwithout making Shelf a core dependency. - Updates the README, developer site, API status, and architecture notes to
point Shelf users at the tested adapter example.
tailscale 0.3.0
0.3.0
This release is a major API and transport rebuild for public POSIX usage.
It keeps the embedded-tsnet lifecycle model, but replaces the old loopback
transport helpers with package-native APIs backed by private fd capabilities
and a shared POSIX reactor.
Platform contract:
pubspec.yamldeclares Android, iOS, Linux, and macOS support. Windows is
intentionally unsupported until a Windows-native data-plane backend or
fallback carrier is designed.- Linux CI runs Headscale E2E against the epoll reactor path; macOS, iOS, and
Android have been validated through the demo/smoke harness.
Breaking — public API shape:
Tailscale.httpis now the HTTP namespace. UseTailscale.http.clientfor a
standardpackage:httpclient routed through the tailnet.- The old
Tailscale.listen(localPort, {tailnetPort})reverse-proxy helper was
removed. UseTailscale.http.bind(port: ...)for in-process HTTP handling, or
Tailscale.serve.forward(...)when forwarding an existing loopback HTTP
server. - Inventory APIs now use Tailscale's node terminology:
Tailscale.nodes(),Tailscale.nodeByIp(ip),Tailscale.onNodeChanges,
TailscaleNode, andTailscaleNodeIdentity. Tailscale.up()now returnsFuture<TailscaleStatus>and resolves on the
first stable state (running,needsLogin, orneedsMachineAuth).PingResult.directis nowPingResult.path(PingPath.direct,derp, or
unknown). The.directgetter remains as a convenience for the positive
case.ClientVersionnow mirrors upstream fields:latestVersion,
urgentSecurityUpdate, and optionalnotifyText.
Core lifecycle and observation:
TailscaleClientis the testable app-facing interface implemented by
Tailscale.instance.onStateChange,onError, andonNodeChangesare pushed from Go; node
updates are debounced and newonNodeChangessubscribers receive the current
snapshot.- Structured
TailscaleErrorCodeand per-namespace operation exceptions now
preserve known LocalAPI error categories (notFound,forbidden,conflict,
preconditionFailed,featureDisabled,unknown).
fd-backed transport APIs:
http.clientstreams outbound request/response bodies over private fd-backed
channels while Go ownstsnet.Server.HTTPClient()semantics.http.bind({port})returnsTailscaleHttpServerwith package-native
request/response objects and fd-backed request/response bodies.tcp.dial(...)andtcp.bind(...)provide package-native raw TCP streams and
listeners via Go-ownedtsnet.Server.Dial/Listenconnections handed to Dart
as private fd capabilities.tls.bind(...)accepts TLS-terminated tailnet connections as plaintext
TailscaleConnections; certificate acquisition and renewal remain in Go.udp.bind(...)provides message-preserving datagrams with remote endpoint
metadata and rejects payloads over 60 KiB.- The POSIX data plane uses a shared kqueue/epoll reactor instead of spawning
reader/writer isolates per fd.
Tailscale feature namespaces:
whois(ip)andnodeByIp(ip)are implemented for identity-aware
authorization flows.tls.domains()exposes auto-provisioned Tailscale certificate SANs.diag.ping,diag.metrics,diag.derpMap, anddiag.checkUpdateare
implemented.prefs.get, single-field prefs setters, andprefs.updateMaskedare
implemented.exitNode.current,suggest,use,useById,useAuto,clear, and
onCurrentChangeare implemented.serve.forward/clearpublishes an existing loopback HTTP service inside the
tailnet using LocalAPI ServeConfig.funnel.forward/clearpublishes an existing loopback HTTP service through
Tailscale Funnel usingtsnet.ListenFunnelplus a package-owned reverse
proxy. Forwarding targets are loopback-only.taildropandprofilesremain declared roadmap namespaces and throw
UnimplementedErrorin this release.
Validation:
- Unit, FFI, fd, runtime, Go, and Headscale E2E suites cover the core feature
spine. - Live Tailscale tests cover hosted-control-plane behavior Headscale cannot
model: routing controls, TLS serving, Serve forwarding, Funnel forwarding,
and Serve cleanup ondown()/restart.
Release hardening:
- HTTP fd response-head envelopes are capped at 256 KiB on both the Dart and
Go sides. - fd transport write/close dispatch failures, listener/server close failures,
unread HTTP request bodies, and UDP binding teardown paths now deterministically
close local resources. - Serve/Funnel forwarding canonicalizes
localhostto127.0.0.1before
creating loopback proxy targets. - Smoke-matrix tooling redacts bearer credentials from logs and stores generated
runner tokens with owner-only file permissions.