ちょっと調べたいことがあったのでそのメモ。
workerd
GitHub - cloudflare/workerd: The JavaScript / Wasm runtime that powers Cloudflare Workers
Cloudflare Workersのランタイムである`workerd`は、OSSとして公開されていて、自分でモジュールとして使えば、セルフホストもできるよってことになってる。
ビルドするならBazeliskで`bazel`を使えとか、READMEに必要なことはほとんど書いてある。
自分でビルドせずとも、プリビルトのものでよければ`npx workerd`から利用できる。
コマンド
- serve
- compile
- test
現状で利用できるコマンドはこの3つだった。
(`test`は知らないが)、`serve`と`compile`は、引数に`.capnp`の設定ファイルを渡して使う。
Cap’n Protoっていうフォーマットは初めて知ったけど、JSONよりProtobufよりすげーやつらしい。
とりあえず動かす
まずは`my-config.capnp`をこのように。
using Workerd = import "/workerd/workerd.capnp";
const config :Workerd.Config = (
services = [
(name = "main", worker = .mainWorker),
],
sockets = [
( name = "http",
address = "*:8080",
http = (),
service = "main"
),
]
);
const mainWorker :Workerd.Worker = (
modules = [
(name = "worker", esModule = embed "hello.js")
],
compatibilityDate = "2023-07-17",
);で、`hello.js`はこれだけ。
export default { async fetch() { return new Response("Hello World!"); } }
そして、`npx workerd serve my-config.capnp`とすれば、`http://localhost:8080`にサービスが立って、アクセスできるようになる。
もしくは、`npx workerd compile my-config.capnp > my-worker`とすれば、実行できるバイナリも生成できる。
あとは`systemd`なんかでよしなに`serve`するように設定すれば、誰でもセルフホストできる!という感じ。
おまけ
- `.capnp`で使える定義の詳細について
- いろんなユースケースの定義例
- ほかにも引数やフラグがあるようだったが、何に使うのかはよくわからなかった