Application container built for WebAssembly
Clone or download
Latest commit 7f80707 May 6, 2018

README.md

Ice Core

Crates.io Build Status

Build efficient and reliable backend applications in WebAssembly.

What is it?

Ice is a container for backend applications in WebAssembly.

WebAssembly, which is mainly used to build client-side Web applications, can also be used to build server-side applications. With a managed execution environment and the underlying JIT (wasm-core) based on LLVM, Ice is able to achieve a higher level of security (and additional safety for C/C++ applications), provide platform-independent high-level abstractions, and bring a few special features like dynamic inter-machine application migration and more accurate service monitoring.

It should be noted that Ice is not yet stable, lacking many features, may experience bugs / breaking changes and is not ready for production use yet.

Build

Latest nightly Rust and LLVM 6 are required.

cargo build --release

Get started

First, create a root directory to place configurations & applications:

mkdir my_ice_root
cd my_ice_root

Then, create a config file config.yaml in the root directory, whose format is defined in config.rs/Config:

applications:
  - name: hello_world
    path: ./apps/hello_world

Here we've specified an application named hello_world located at ./apps/hello_world, and the application will be automatically initialized when ice_core is launched.

Now let's initialize the hello_world application:

mkdir apps
cd apps
cargo new --lib hello_world
cd hello_world

Add a [lib] section and the runtime library ia to the newly-created Cargo.toml:

[lib]
name = "hello_world"
crate-type = ["cdylib"]

[dependencies]
ia = "0.1"

And create another config.yaml in the hello_world directory, which is the application-level metadata definition (defined in config.rs/AppMetadata:

package_name: com.example.hello_world
bin: target/wasm32-unknown-unknown/release/hello_world.wasm

Write some code to print "Hello, world!" in src/lib.rs:

#[macro_use]
extern crate ia;

app_init!({
    println!("Hello, world!");
    0
});

Build it:

cargo build --release --target wasm32-unknown-unknown

cd back to my_ice_root and launch ice_core:

ice_core config.yaml

and you should see your first hello_world application running!

Examples

ia/examples contains a few examples that show how to do networking and build servers in Ice.

Comparison with native binaries

The WebAssembly VM has to do some necessary checks and translations to ensure things work correctly. Therefore, it is always a little slower than precompiled native binaries. However, the difference is quite small and normally doesn't become the performance bottleneck for real-world applications.

In addition, Ice Core is able to provide a few features that a native environment doesn't provide:

  • Accurate permission control
  • Run-time inter-machine application migration (in progress)
  • Service monitoring and management (in progress)

Roadmap

  • Get WebAssembly code running
  • Provide native interfaces with permission control
  • TCP networking
  • Blocking file I/O
  • Asynchronous file I/O
  • UDP networking
  • Built-in high-level abstraction for HTTP services
  • Profiling & statistics
  • Manager API & management script
  • Runtime application migration across machines