Fastly の Terrarium 環境で Rust を使ってカウンタを書いてみた
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分制限をどううまく使うかといったところか
関連エントリー
- Terrarium に Terrarium を Terrarium する Terrarium ほんとは自分自身を deploy するやつを deploy したかったんだけどやめた。やる気が失せたので書いたところだけ記録しておく。 #[...
- Spring MVC で @Async と @RequestScope を共存させるには? @Async と @RequestScope を同時につかうとどうなるか @RequestScope、これは @Scope(value = ...
- 現在の h2o.conf.yaml 今のこのサイトの h2o.conf.yaml です。HTTPS (443) のみを処理しています。HTTP (80) は nginx で受け...
- mbed USBSerial を WebUSB から扱うには mbed USBDevice ライブラリの中に USB CDC で動く USBSerial クラスが実装されている。これを Web USB ...
- ES2015 の iterable/iterator/generator による無限 FizzBuzz ES2015 の iterable protocol / iterator protocol だとそこそこ自然に無限リストを作れるわけなので...