5 releases

0.0.5 Jan 11, 2020
0.0.4 Oct 2, 2019
0.0.3 Sep 12, 2019
0.0.2 Jun 17, 2019
0.0.1 Jun 16, 2019

#87 in #serverless


Used in vinyl-embly

MIT license

50KB
1K SLoC

embly

A serverless web application framework for collaboration and scale.

For more background and details about what embly is read here or here

Hello World

Create a new folder and add the following files and directory structure:

├── embly.hcl
└── hello
    ├── Cargo.toml
    └── src
        └── main.rs

Now add the following file contents:

embly.hcl:

function "hello" {
  runtime = "rust"
  path    = "./hello"
}

gateway {
  type = "http"
  port = 8765
  route "/" {
    function = "${function.hello}"
  }
}

hello/Cargo.toml:

[package]
name = "hello"
version = "0.0.1"
edition = "2018"

[dependencies]
embly = "0.0.5"

hello/src/main.rs:

extern crate embly;
use embly::{
  http::{run_catch_error, Body, Request, ResponseWriter},
  prelude::*,
  Error,
};

async fn execute(_req: Request<Body>, mut w: ResponseWriter) -> Result<(), Error> {
  w.write_all(b"Hello World")?; // writing our hello response bytes
  Ok(()) // if an error is returned the server will respond with an HTTP error
}

// this function is run first
fn main() {
  run_catch_error(execute); // this is the embly::http::run function that is specific to http responses
}

You can now run your project for local development with embly dev, although the fastest way to get started is with docker:

docker run -v /var/run/docker.sock:/var/run/docker.sock  -v $(pwd):/app -p 8765:8765 -it embly/embly embly dev

More on how to run embly in the installation section.

The embly Command

$ embly
Usage: embly [--version] [--help] <command> [<args>]

Available commands are:
    build     Build an embly project
    bundle    Create a bundled project file
    db        Run various database maintenace tasks. 
    dev       Develop a local embly project
    run       Run a local embly project

Installation

embly uses docker to download and run build images. It's recommended that you run embly from within a docker container and give it access to the docker socket. If you are in the root of an embly project you can start the dev server like so:

docker run -v /var/run/docker.sock:/var/run/docker.sock  -v $(pwd):/app -p 8765:8765 -it embly/embly embly dev

If you would like to run embly locally you'll need to have cargo and go installed. The following sequence of commands should work:

go get github.com/embly/embly/cmd/embly
cargo install embly-wrapper
cargo install lucetc

embly used to be wasabi, which was more focused on providing full operating system functionality within a webassembly runtime. That code is available here.


lib.rs:

Embly is a serverless webassembly runtime. It runs small isolated functions. Functions can do a handful of things:

  • Receive bytes
  • Send bytes
  • Spawn a new function

This library is used to access embly functionality from within a program being run by Embly.

A "prelude" for crates using the embly crate

imports io::Read and io::Write

pub use std::io::Read as _;
pub use std::io::Write as _;

Dependencies

~5–10MB
~124K SLoC