This post is intended for businesses and other organizations interested... Read more →
Posted by Richy George on 25 April, 2023This post was originally published on this site
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.
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.
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).
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.
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
I installed the Cosmonic CLI from the Quickstart page and asked it to tell me about itself:
martinheller@Martins-M1-MBP ~ % cosmo --help ⣀⣴⣶⣶⣦⣀ ⢀⣠⣴⣾⣿⣿⣿⣿⣿⣿⣷⣦⣄⡀ ⣀⣤⣶⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣶⣤⣀ ⢀⣴⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⠋⠹⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣦⡀ ⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠏ ⢻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷ ⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠁ ⠙⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿ ⣿⣿⣿⣿⣿⣿⡿⠛⠁ ⠈⠛⠛⠿⠿⠿⣿⣿⡿ ⣿⣿⣿⣿⣏ ⣿⣿⣿⣿⣿⣿⣷⣦⣀ ⣀⣤⣶⣶⣾⣿⣿⣿⣷ ⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⡄ ⣴⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿ ⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣆ ⣼⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿ ⠈⠛⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣄⣰⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠛⠁ ⠈⠛⠻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠿⠛⠁ ⠙⠻⢿⣿⣿⣿⣿⣿⣿⡿⠛⠋ ⠈⠛⠿⠿⠛⠁ C O S M O N I C Usage: cosmo [OPTIONS] <COMMAND> Commands: build Build (and sign) an actor, provider, or interface down Stop the wasmCloud host and NATS leaf launched by `up` launch Launch an actor on a local wasmCloud host login Securely download credentials to authenticate this machine with Cosmonic infrastructure new Create a new project from template up Start a NATS leaf and wasmCloud host connected to Cosmonic infrastructure, forming a super constellation tutorial Run through the tutorial flow whoami Check connectivity to Cosmonic and query device identity information 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 -V, --version Print version
Then, I went through the online interactive drag-and-drop tutorial to create an echo application, resulting in this diagram:
I also ran the local Quickstart
martinheller@Martins-M1-MBP ~ % cosmo tutorial hello ⣀⣴⣶⣶⣦⣀ ⢀⣠⣴⣾⣿⣿⣿⣿⣿⣿⣷⣦⣄⡀ ⣀⣤⣶⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣶⣤⣀ ⢀⣴⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⠋⠹⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣦⡀ ⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠏ ⢻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷ ⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠁ ⠙⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿ ⣿⣿⣿⣿⣿⣿⡿⠛⠁ ⠈⠛⠛⠿⠿⠿⣿⣿⡿ ⣿⣿⣿⣿⣏ ⣿⣿⣿⣿⣿⣿⣷⣦⣀ ⣀⣤⣶⣶⣾⣿⣿⣿⣷ ⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⡄ ⣴⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿ ⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣆ ⣼⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿ ⠈⠛⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣄⣰⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠛⠁ ⠈⠛⠻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠿⠛⠁ ⠙⠻⢿⣿⣿⣿⣿⣿⣿⡿⠛⠋ ⠈⠛⠿⠿⠛⠁ C O S M O N I C Welcome to cosmo! ✅ You're already authenticated! ⚙️ It looks like you don't have a wasmCloud host running locally. Launching one with: `cosmo up` >>> ⠀⢀ Ok to download NATS and wasmCloud to /Users/martinheller/.cosmo ?: y 🟢 A wasmCloud host connected to your constellation has been started! To stop the host, run: 'cosmo down' >>> ⡋⢀ To start the tutorial, we'll generate a new project with `cosmo new`. Proceed?: y 🌐 Next we'll download code for your hello world actor to the hello/ directory... >>> ⢋⠁ Cloning into '.'... >>> ⠈⢙ remote: Enumerating objects: 86, done. remote: Counting objects: 100% (86/86), done. remote: Compressing objects: 100% (56/56), done. >>> ⠈⡙ >>> ⠀⢙ >>> ⠀⡙ remote: Total 86 (delta 23), reused 76 (delta 22), pack-reused 0 Receiving objects: 100% (86/86), 312.66 KiB | 1.02 MiB/s, done. Resolving deltas: 100% (23/23), done. >>> ⠀⠩ Already on 'main' Your branch is up to date with 'origin/main'. 🔧 Using template subfolder `hello-world/rust`... 🔧 Generating template ... [ 1/15] Done: .cargo/config.toml [ 7/15] Done: .gitignore ✨ Done! New project created /Users/martinheller/hello >>> ⠀⠠ No keypair found in "/Users/martinheller/.wash/keys/martinheller_account.nk". We will generate one for you and place it there. If you'd like to use alternative keys, you can supply them as a flag. No keypair found in "/Users/martinheller/.wash/keys/hello_module.nk". We will generate one for you and place it there. If you'd like to use alternative keys, you can supply them as a flag. >>> ⠀⢀ Now, we'll launch your hello actor and connect it to its capabilities. Proceed?: y 🚀 Launching your actor with: cosmo launch -p hello 🚀 Actor launched! ✅ You already have a Cosmonic-managed host running! 🔗 Launching capability providers and linking them to your actor... In the future, you can start providers from the UI at https://app.cosmonic.com/constellations/logic ✅ You're already running a required capability provider: HTTP Server 🌌 Creating a wormhole connected to your actor... In the future, you can create wormholes from the UI at https://app.cosmonic.com/constellations/logic 👇 Here's what we did: ⭐️ We started a wasmCloud host on your machine, connected to your constellation 🚀 We launched the hello world actor on your local wasmCloud host ⚙️ We started a managed host on the Cosmonic platform in your constellation We started an HTTP server capability provider on this host 🔗 We linked the actor on your local host to the provider running on your Cosmonic-managed host 🌌 We created a wormhole associated with this actor, allowing you to access your hello world app from the internet Feel free to browse the code placed in the `hello/` directory. If you're interested in how to deploy custom code to Cosmonic, check out our docs at: https://cosmonic.com/docs/user_guide/deploying-your-application If you want to go through this tutorial again in the future, simply run: cosmo tutorial hello 🎉 That's it! Access your actor securely through a wormhole now: curl https://nameless-pine-8370.cosmonic.app martinheller@Martins-M1-MBP ~ % curl https://nameless-pine-8370.cosmonic.app Hello, World!%
At this point, both my online and offline tutorials appeared in my Cosmonic constellation:
cosmo down stops the local host and NATS server from
cosmo tutorial hello, but doesn’t affect the online tutorial result. The code generated by the tutorial is remarkably simple, given that it’s creating a web application with a wormhole:
At this point, you should have a reasonably good feeling for what is possible with this technology. Given that wasmCloud is free and open source, and that Cosmonic’s developer preview is also currently free, I encourage you to explore those possibilities and see what you come up with.
Copyright 2015 - InnovatePC - All Rights Reserved
Site Design By Digital web avenue