APubHook(Webhook的に ActivityPub に投稿する実装)をforkしてDeno版 APubHookD を作った
APubHook とは、castaneaiさんが作成された ActivityPub の実装です。
参考: Webhook的に ActivityPub に投稿する実装を作った
Webhook を通じて ActivityPub に投稿できるため、IFTTT などと連携させて Bot を作るのに便利です。
APubHook は Cloudflare Workers と Cloudflare D1 で動作するのですが、これを fork して Deno に置き換え、Deno Deploy と Deno KV で動作するようにしました。
最後の D は Deno の D です(安直……)。
リポジトリを clone して Deno Deploy に Project を用意してデプロイすれば、APubHook と同様に Webhook 的に動作します。
Deno への置換
npm パッケージの置換
Deno でも npm パッケージは動作しますが、APubHook が依存しているライブラリは Hono と Zod 程度のため、これらを Deno 版に置き換えました。deps.ts にまとめています。
D1 -> KV
APubHook では Cloudflare D1 に対して直接 SQL で操作しているのですが、Deno KV はキーバリューストアのため、そのまま移植はできません。ここでは kvdex という ORM ライクなラッパーを使いました。
db.ts で実装していますが、一部のリレーションが実現できてないと思うので、若干怪しめです(一応フォローやポストができているのは確認している)。
また、アカウントの追加についても APubHook では SQL を流していましたが、APubHookD ではアカウント追加用のエンドポイントを実装しています。URL は公開したくないため、環境変数で UUID を設定するようにしています api.ts。
デプロイ
Deno Deploy では deployctl を使ってデプロイできます。Webのコンソールからプロジェクトを作成するなどの事前作業が必要です。
その他
置換作業は思ったより簡単でした。特に何か目的があって Deno に置き換えたわけではないのですが、kvdex のようなライブラリにも出会えたので少しは Deno 力が上がったような気がします。
Deno KV についてはまだ Beta ですが、上手く使えばいろんなことができそうですね。
Discussion