As you likely know by now, WebAssembly, or wasm, is an efficient, cross-platform, cross-language way to run code almost anywhere, including in a browser and on a server—even in a database. Cosmonic is a commercial platform-as-a-service (PaaS) for wasm modules. It builds on the open-source wasmCloud. This technology preview starts with a quick overview of wasm, then we’ll set up wasmCloud and Cosmonic and see what we can do with them.
What is wasm?
WebAssembly (wasm) is a “binary instruction format for a stack-based virtual machine.” It’s a portable compilation target for programming languages, including C, C++, C#, Rust, Go, Java, PHP, Ruby, Swift, Python, Kotlin, Haskell, and Lua; Rust is often the preferred language for wasm. There are three wasm-specific languages: AssemblyScript, Grain, and Motoko. Wasm targets include browsers (currently Chrome, Firefox, Safari, and Edge), Node.js, Deno, Wasmtime, Wasmer, and wasm2c.
Wasm tries to run at native speed in a small amount of memory. It runs in a memory-safe, sandboxed execution environment, even on the web.
WebAssembly System Interface (WASI) is a modular system interface for WebAssembly. Wasm has a component model with a W3C proposed specification. WebAssembly Gateway Interface (Wagi) is a proposed implementation of CGI for wasm and WASI. Spin is a multi-language framework for wasm applications.
What is wasmCloud?
wasmCloud is a CNCF-owned open source software platform that uses wasm and NATS to build distributed applications composed of portable units of WebAssembly business logic called actors. wasmCloud supports TinyGo and Rust for actor development. It also supports building platforms, which are capability providers. wasmCloud includes lattice, a self-forming, self-healing mesh network using NATS that provides a unified, flattened topology. wasmCloud runs almost everywhere: in the cloud, at the edge, in the browser, on small devices, and so on. The wasmCloud host runtime uses Elixir/OTP and Rust.
Many wasmCloud committers and maintainers work for Cosmonic (the company). Additionally, the wasmCloud
wash cloud shell works with Cosmonic (the product).
What is Cosmonic?
Cosmonic is both a company and a product. The product is a WebAssembly platform as a service (PaaS) that builds on top of wasmCloud and uses wasm actors. Cosmonic offers a graphical cloud user interface for designing applications, and its own shell,
cosmo, that complements
wash and the wasmCloud GUI. Supposedly, anything you build that works in plain wasmCloud should work automatically in Cosmonic.
A host is a distributed, wasmCloud runtime process that manages actors and capability providers. An actor is a WebAssembly module that can handle messages and invoke functions on capability providers. A capability is an abstraction or representation of some functionality required by your application that is not considered part of the core business logic. A capability provider is an implementation of the representation described by a capability contract. There can be multiple providers per capability with different characteristics.
A link is a runtime-defined connection between an actor and a capability provider. Links can be changed without needing to be redeployed or recompiled.
A constellation is a managed, isolated network space that allows your actors and providers to securely communicate with each other regardless of physical or logical location; essentially, a Cosmonic-managed wasmCloud lattice. A super constellation is a larger constellation formed by securely connecting multiple environments through Cosmonic.
A wormhole is an ingress point into your constellation. An OCI distribution is a standard for artifact storage, retrieval, and distribution, implemented by (for example) the Azure Container Registry and the GitHub artifact registry.
The infrastructure view shows the virtual hosts running in your Cosmonic constellation. The logic view shows the logical relationships between components in your Cosmonic constellation or super constellation.
Installing and testing wasmCloud
Installation of wasmCloud varies with your system. I used
brew on my M1 MacBook Pro; it installed more than I wanted because of dependencies, particularly the Rust compiler and cargo package manager, which I prefer to install from the Rust language website using
rustup. Fortunately, a simple brew uninstall rust cleared the way for a standard
rustup installation. While I was installing languages, I also installed TinyGo, the other language supported for wasmCloud actor development.
After installation, I asked the
wash shell to tell me about its capabilities:
martinheller@Martins-M1-MBP ~ % wash --help _________________________________________________________________________________ _____ _ _ _____ _ _ _ / ____| | | | / ____| | | | | __ ____ _ ___ _ __ ___ | | | | ___ _ _ __| | | (___ | |__ ___| | | \ \ /\ / / _` / __| '_ ` _ \| | | |/ _ \| | | |/ _` | \___ \| '_ \ / _ \ | | \ V V / (_| \__ \ | | | | | |____| | (_) | |_| | (_| | ____) | | | | __/ | | \_/\_/ \__,_|___/_| |_| |_|\_____|_|\___/ \__,_|\__,_| |_____/|_| |_|\___|_|_| _________________________________________________________________________________ A single CLI to handle all of your wasmCloud tooling needs Usage: wash [OPTIONS] <COMMAND> Commands: app Manage declarative applications and deployments (wadm) (experimental) build Build (and sign) a wasmCloud actor, provider, or interface call Invoke a wasmCloud actor claims Generate and manage JWTs for wasmCloud actors ctl Interact with a wasmCloud control interface ctx Manage wasmCloud host configuration contexts down Tear down a wasmCloud environment launched with wash up drain Manage contents of local wasmCloud caches gen Generate code from smithy IDL files keys Utilities for generating and managing keys lint Perform lint checks on smithy models new Create a new project from template par Create, inspect, and modify capability provider archive files reg Interact with OCI compliant registries up Bootstrap a wasmCloud environment validate Perform validation checks on smithy models help Print this message or the help of the given subcommand(s) Options: -o, --output <OUTPUT> Specify output format (text or json) [default: text] -h, --help Print help information -V, --version Print version information
Then I made sure I could bring up a wasmCloud:
martinheller@Martins-M1-MBP ~ % wash up 🏃 Running in interactive mode, your host is running at http://localhost:4000 🚪 Press `CTRL+c` at any time to exit 17:00:20.343 [info] Wrote configuration file host_config.json 17:00:20.344 [info] Wrote configuration file /Users/martinheller/.wash/host_config.json 17:00:20.344 [info] Connecting to control interface NATS without authentication 17:00:20.344 [info] Connecting to lattice rpc NATS without authentication 17:00:20.346 [info] Host NCZVXJWZAKMJVVBLGHTPEOVZFV4AW5VOKXMD7GWZ5OSF5YF2ECRZGXXH (gray-dawn-8348) started. 17:00:20.346 [info] Host issuer public key: CCXQKGKOAAVXUQ7MT2TQ57J4DBH67RURBKT6KEZVOHHZYPJKU6EOC3VZ 17:00:20.346 [info] Valid cluster signers: CCXQKGKOAAVXUQ7MT2TQ57J4DBH67RURBKT6KEZVOHHZYPJKU6EOC3VZ 17:00:20.351 [info] Started wasmCloud OTP Host Runtime 17:00:20.356 [info] Running WasmcloudHostWeb.Endpoint with cowboy 2.9.0 at 0.0.0.0:4000 (http) 17:00:20.357 [info] Access WasmcloudHostWeb.Endpoint at http://localhost:4000 17:00:20.453 [info] Lattice cache stream created or verified as existing (0 consumers). 17:00:20.453 [info] Attempting to create ephemeral consumer (cache loader) 17:00:20.455 [info] Created ephemeral consumer for lattice cache loader
While I had the wasmCloud running, I viewed the website at port 4000 on my local machine:
Then I stopped the wasmCloud:
martinheller@Martins-M1-MBP ~ % wash down ✅ wasmCloud host stopped successfully ✅ NATS server stopped successfully 🛁 wash down completed successfully