Terrarium は Fastly の WebAssembly を実行してくれるお試し環境みたいなやつ。ちょっと前に話題になった Lucet が使われているらしい。何のログインもなく使えて、デプロイできて「お、おう」って感じ。デプロイすると15分だけアクセスできる。
ちょっとリファレンスを見てみたところ KVStore というのがあってパーシステントな (ただし15分だけ) 状態も持てる。ということでとりあえずカウンタを書いてみた。
Rust に不慣れなので不必要なコードとかもっとうまく書けるところがありそう。
#[macro_use]
extern crate http_guest;
use std::fmt;
use http_guest::{Request, Response, KVStore};
pub fn user_entrypoint(kvs: &mut KVStore, req: &Request<Vec<u8>>) -> Response<Vec<u8>> {
if req.uri() != "/" {
return Response::builder()
.status(404)
.body("".as_bytes().to_owned())
.unwrap()
}
kvs.append("count", b"1");
let count = kvs.get("count").unwrap().len();
let body = format!("{}", count);
Response::builder()
.status(200)
.header("Content-Type", "text/plain")
.body(body.as_bytes().to_owned())
.unwrap()
}
guest_app_kvs!(user_entrypoint);
メモ
- Rust で KVS を使う場合は guest_app_kvs!() を使って、エントリポイントで KVStore を受けとる必要がある。
- KVS は一つのキーに値を append していくことができる。たぶんアトミックに incr する方法はこれしかないと思うので、1リクエストごとに count というキーの長さを1つ増やす実装にした (append している値は使ってない)
最初 TypeScript (AssemblyScript) で書いたら、i32 を簡単に String にする方法がわからなかったので Rust で書きなおした。
なんかもっと面白いことできると思うが15分制限をどううまく使うかといったところか