Highlights
fetch+ Blob/ArrayBuffer overhaul —await response.arrayBuffer()now returns real bytes (not a metadata stub) [#227 / PR #232];await response.blob()now returns a realBlobwitharrayBuffer/text/bytes/sliceinstance methods [#234 / PR #238]; default User-Agentperry/<version>set on the shared client so anonymous requests to e.g.api.github.comstop hitting403 Forbidden[#236].perry/updatersubsystem — Ed25519-signed auto-update for desktop apps with sentinel-rollback flow; low-level ambients +@perry/updaterwrapper [PR #224, docs in #248].- Issue #185 Phase D — live inspector UI at
localhost:7676with editable style fields,POST /style/:hfor runtime style edits, and the macOS dispatcher wired (other platforms follow as sweep PRs). - Many correctness fixes — async-fn array param push silent-cap at 16 [#233], method-default-param dispatch passing garbage for skipped trailing args [#235],
.then(console.log)hang + Promise propagation when callback is null [#236], module-level emptyconstarray writes silently dropped [#221], iOS/tvOS/visionOSButtonstyled-color crash [#185 follow-up].
Fixes
#221— module-levelconst A: T[] = []mutated viaarr[i] = vfrom inside a function silently dropped writes (js_array_set_f64no-op'd at index ≥ length).#232 / #227—await response.arrayBuffer()returned{byteLength: N}stub; now returns a realBufferHeaderwith the body bytes.#233—Array.pushfrom inside an async function silently capped at 16 elements (parameter slot wasn't updated with the realloc'd pointer).#234—await response.blob()returned a metadata-only stub; now returns a realBlobwith full instance method surface.#235—await Foo.method({...})could silently hang when the method had a default param the caller skipped (cross-module method declare hardcoded to 6 doubles).#236— anonymousfetchgot403 Forbiddenfrom sites that demand a User-Agent;Promise.resolve(x).then(<NULL_CALLBACK>)chainednextstayed pending forever;console.logas a value (.then(console.log)) lowered to0.0; fetch rejections printed as[object Object].- iOS/tvOS/visionOS —
Button("X", () => {}, { color: "white" })crashed withunrecognized selector setTextColor:onUIButton; now class-probes and routes tosetTitleColor:forState:. textfieldGetString/textareaGetStringreturned gibberish numbers — dispatch metadata hadReturnKind::F64but FFI returned*StringHeader.- better-sqlite3 —
new Database(path).prepare(sql).run/get/allchain restored after the v0.5.329-v0.5.342 lower_call extraction series silently broke it.
Features
perry/updater— Ed25519-signed auto-update with sentinel-rollback, manifest schema, install + relaunch flow,@perry/updaterhigh-level wrapper [PR #224].- Issue #185 Phase D —
POST /style/:hruntime style edits, editable inspector UI fields, live inspector UI served atlocalhost:7676from the embedded geisterhand HTTP server. fs.appendFileSyncend-to-end wiring [PR #231].
Infrastructure
- PR #239 — capture compile stderr in parity + compile-smoke CI jobs into uploadable artifacts so the long-tail macOS-14 SDK/linker
ci-envskips can finally be diagnosed by reading the actual link error. Pure diagnostic plumbing — no source / version churn. - Scoop bucket — manifest published with SHA256 sidecars in the release workflow; field order brought into line with the ScoopInstaller style guide.
- Windows host builds — pin clang
-targeton host invocations to prevent MinGW-default clang from rewriting the IR's MSVC triple to GNU/MinGW (which produced spuriousLNK2019: unresolved external symbol __mainerrors); pre-flight clang probe + actionable hint on link failure [v0.5.353]. #210— Windows wires 4 of 5 styling stubs: text decoration, opacity, border color, border width (the deferred-paint family minusshadowwhich still needs DirectComposition).