wit-bindgen 是通过 wit 生成 wasm 绑定函数的库。wit 是 wasm 的类型抽象描述文件,替换原来的 witxwat 格式。wit-bindgen 生成的绑定函数,可以直接在 Rust 代码中调用,不需要手动编写 wasm 代码。

wasmtime 是一个 wasm runtime,可以直接运行 wasm 文件,也可以通过 wasmtime 的 API 在 Rust 代码中调用 wasm 函数。wasm 在 serverless runtime 中的应用,可以通过 wasmtime 来运行能够处理 HTTP 请求的 wasm 文件的。这里以处理 HTTP 请求的能力为例,介绍如何使用 wit-bindgenwasmtime 开发 WebAssembly 应用。

定义 wit 接口并生成代码

首先,我们需要定义一个 wit 接口文件 leaf-http.wit,用于描述 wasm 文件的能力。这里我们定义一个处理 HTTP 请求的接口,接口定义如下:

interface exports {
    // status code
    type status = u16
    // headers as key value pairs
    type headers = list<tuple<string, string>>
    // request uri
    type uri = string
    // body as bytes
    type body = list<u8>
    // request method
    type method = string
    // request object
    record request{
        method: method,
        uri: uri,
        headers: headers,
        body: option<body>,
    }
    // response object
    record response{
        status: status,
        headers: headers,
        body: option<body>,
    }
    // handle request function
    handle-request: func(req: request) -> response
}

// exports the interface
world leaf-http {
  default export exports
}

这里定义了一个 handle-request 函数,接收一个 request 对象,返回一个 response 对象。request 对象包含了请求的方法、uri、headers、body 等信息。response 对象包含了响应的状态码、headers、body 等信息。export 的接口名为 leaf-http

这里使用 wit_bindgen_gen_guest_rust 生成 rust 代码,生成的代码如下 https://github.com/fuxiaohei/leaf-wasm/blob/0f62fc90ae044edd7861053e1373cdb9dd76bf4d/wit/leaf-http.rs。使用代码生成而不是宏,为了更直观的看到需要编译为 rust 的 wasm 文件的内容。

如果使用宏的姿势,可以参考:

wit_bindgen_guest_rust::generate!("leaf-http.wit");