SwiftWasm Blog

Published on

What's new in SwiftWasm #4

SwiftWasm 5.3.0 and 5.3.1 releases

As you may have seen in our previous post, we've published our first stable release recently. Shortly after that, @flavio reported an issue with JSONDecoder. Following an investigation by @kateinoigakukun into the root cause of the issue, we've published SwiftWasm 5.3.1, which also included updates from the upstream 5.3.1 patch release.

(If you're interested in technical details, the JSONDecoder issue was caused by a peculiar assumption about memory layout in Swift runtime, which wasn't applicable to WebAssembly's linear memory. Check the PR diff for more details.)

Libraries

JavaScriptKit

A major update since the latest 0.8.0 release of JavaScriptKit is newly added support for throwing functions developed by @kateinoigakukun. It required an update to the JavaScript runtime part, but was an additive change to the Swift API. As we try to publish releases regularly, new 0.9.0 release was tagged that includes this feature.

A PR with support for Asyncify transformation was created by @yonihemi. It allows calling asynchronous JavaScript APIs with Swift code that looks as plain synchronous code, but through proper suspension that doesn't block browser rendering. The PR has some implications on how we build things, especially as it requires a specific optimizer transformation. It is still in the draft stage, and you're welcome to contribute to the ongoing discussion.

OpenCombine

We still use a fork of OpenCombine in Tokamak due to our custom implementation of the ObservableObject protocol. In addition to that, our fork also contained some changes to the package manifest to make it build with SwiftWasm, but they made it incompatible with non-Wasm platforms. This issue was resolved in the upstream OpenCombine repository, which reduced the amount of customizations we apply, and brings us closer to using the upstream repository as is.

OpenCombineJS

With progress on OpenCombine, it was time to publish the first version of OpenCombineJS. Its code didn't change recently, but parts of it were used in Tokamak already, which gave us confidence that it was reliable enough to be released in a separate library for wider use. It currently doesn't contain much code, but this basic functionality should be enough for basic integration of JavaScriptKit types and OpenCombine.

Tokamak

Following the 0.5.0 release, which added support for the latest carton, we published a small 0.5.1 patch with support for editing Tokamak projects in Xcode with working autocomplete. Not long after that an important bugfix landed in 0.5.2, which fixed an issue with display order of updated views in the DOM renderer. A few weeks later another bugfix release was published as 0.5.3. In this update Tokamak now internally relies on the aforementioned OpenCombineJS library instead of providing its own JSScheduler type conforming to Combine's Scheduler. More importantly, it fixes a bug with Toggle not being updated after resetting it from a binding.

Developer tools

WasmTransformer

@kateinoigakukun implemented a stripCustomSections transformation in the WasmTransformer library. According to the spec, data in custom sections should not contribute to observed behavior of a given binary. In the case of binaries produced by SwiftWasm, custom sections contain debugging information that can now be stripped with

WasmTransformer.

carton

Previously, custom sections were stripped to reduce final binary size as a build step in `carton bundle with the wasm-strip` utility from WABT. Thanks to the new transformation in WasmTransformer, WABT is no longer needed as a dependency of carton, which makes installation for our end users simpler and faster.

Initial support for presenting crash stack traces directly in carton has been completed, starting with Firefox support. Support for more browsers will be added in separate PRs.

There was also work on file downloader cleanup, support for browser testing, and simpler URLs for main bundle resources. As soon as these are merged, a new version of carton will be tagged that will use the latest 5.3.1 release of SwiftWasm.

Contributions

A lot of the progress wouldn't be possible without payments from our GitHub Sponsors. Their contribution is deeply appreciated and allows us to spend more time on SwiftWasm projects. You can see the list of sponsors and make your contribution on the sponsorship pages of Carson Katri, Yuta Saito and Max Desiatov.

Thanks for reading! 👋