Artifact dae248fae4948790de4c0907e7382037dc554d9356654390ad6fdd20fef4dc68:
- File
internal/sync/nethttp_std.go
— part of check-in
[0650171d55]
at
2026-10-23 21:25:20
on branch main
— feat(wasm): build the whole public API with TinyGo
go-libfossil compiled for js/wasm only with the standard toolchain, whose output is about 16 MB, too large to ship with a page or an edge function. Three standard-library features TinyGo lacks kept it from building there: http.ErrUseLastResponse and net.DNSError in the sync client, and os.SameFile in checkout-marker recovery.
Each now sits behind a tinygo build tag. Under TinyGo a sync redirect ends the request with an error instead of being followed, DNS failures are not classified as transient, and two names of one checkout marker are reported as ambiguous rather than paired; the standard build is unchanged.
examples/tinygo exercises the whole public API, sync and signing included. Built with TinyGo 0.43 and wasm-opt -Oz it is 3.83 MB raw and 1.40 MB gzipped, against 16.1 MB and 4.06 MB from the standard toolchain. A new CI job builds it with TinyGo on every change. (user: [email protected], size: 659) [annotate] [blame] [check-ins using] [more...]
//go:build !tinygo package sync import ( "errors" "net" "net/http" ) // errStopRedirect makes the client hand back a redirect response instead of // following it, so PostXfer applies the sync protocol's own redirect rules. var errStopRedirect = http.ErrUseLastResponse // dnsFault reports whether err is a name-resolution failure (ok), and if so // whether retrying could help: a temporary failure can pass, but a name that // does not exist will not start existing. func dnsFault(err error) (transient, ok bool) { var dnsErr *net.DNSError if !errors.As(err, &dnsErr) { return false, false } return dnsErr.IsTemporary || dnsErr.IsTimeout, true }