🐾

cloudflare/wildebeest をForkして開発をしている

2023/08/03に公開

つい先日アーカイブ状態になった cloudflare/wildebeest ですが、自分がForkしてオリジナルからこの記事が投稿された時点で+400コミットぐらいバグ修正や足りない機能の追加をしています。(オリジナルが700コミット)

https://github.com/shuymn/wildebeest

まだまだバグ、中途半端な実装、未実装などあるのでいくらか修正が入ったとはいえ使うのはオススメしないですし、こんなの真面目に使ってんの自分だけなんじゃないかと思うんですが、とりあえず備忘録として何をやったのか書いておきます。逆に言うと、ここに書かれていることはオリジナルのWildebeestではできないことでもあります。

大きめの修正

  • Misskeyのユーザーをフォローしたりフォローされたりできるようにした
  • SQLiteが日付を雑にソートできないせいでTLの順番がバグってたのを直した
  • Mastodon IDとして返すものをUUIDからSnowflake-likeなものにした
  • 投稿のvisibilityが適切にハンドリングされてなかったので直した
    • 特にreblogはprivateなreblogでもpublicとして表示される状態だった
  • PleromaとのFederationやフォローしたりされたりをできるようにした

適切なMastodon IDを後から付与することについては、修正が困難だという見方もありましたが投稿データをDBから取り出してレスポンスのJSONを構築するまでの間で、その投稿のMastodon IDがUUIDだったら適切なIDを割り振り直すという挙動にすることで修正をしました。DBのマイグレーションで解決するのは不可能なので、クライアントから見たときにサーバーから降ってきたデータが正しい状態になっているというのをゴールに設定して課題解決しました[1]

reblogの不具合についてはDBのスキーマの破壊的変更が必要だったのですが、D1がトランザクションに対応していないのでデプロイ中はサービスが使えないのを許容するしかなく、早くトランザクションできるようになってほしいです。

ここまでやってやっとIvoryというiOSのMastodon Clientが使えるようになりました。

そもそもTwitterと比較してMastodonはpublic, unlisted, private, directとvisibilityが多いです。さらにそこにreblogも含めるとまあまあな量のパターンを考慮する必要があって頭とSQLが爆発しました。

個人的などうでもいい修正

  • yarn v1からpnpmに移行した
    • cloudflare/wrangler-actionという公式で提供されているGithub Actionsがpnpm対応とは言える状態でなくて、CI上ではnpmを無理矢理使わせるみたいなワークアラウンドが必要で大変でした
    • どうでもいいけど pnpm ってタイプしづらくて困る
  • dependabotからRenovateに移行した
  • TypeScriptの型付けで気に入らないところを少し直した
  • 他にもどうでも良いことたくさん

今後やりたいこと

  • jestからvitestに移行
    • 追記(2023/08/28): 移行しました
  • wrangler v3対応
    • 追記(2023/08/06): 対応しました
  • 現状はCloudflare Pagesにフロントエンドが、Functionsにバックエンドがデプロイされているので、バックエンドをWorkersにしてデプロイを分離する
  • Mastodon APIやActivityPubの互換性まわりのテストを書いて非互換な挙動をなるべく排除する
  • レスポンスが遅いのでどうにかする
    • ActivityPubのイベント駆動でDurable Objectsにキャッシュを配置すればいいんじゃないかと思っています
      • 追記(2023/08/06): D1のbeta backendにしたらかなり改善しました。beta backendのD1はDBサイズが500MBまでと制限がある[2]のでDOやKVへのキャッシュやコールドデータの退避はレスポンス改善よりもサイズ制限回避のためにやる必要がありそう
  • Qwikなんもわからない(助けて)
  • その他にも色々

優先度順ではないです。

さいごに

何度も言いますがWildebeestはオリジナルも自分がForkして直しているものも使うのはオススメしません。

ですがWildebeestを直す道中でActivityPubやMastodonのAPIについての知見や、Cloudflareの技術スタックに対する理解度を高めることができたので非常に満足しています。機能が足りないところはたくさんありますが、逆に言うと実装はコンパクトになっているのでActivityPubやMastodon API互換のなにかを作りたいと思っている人にはちょうど良い実験場になると感じました。

自分がWildebeestを直そうと思ったモチベーションは、今後さらにあらゆる物がCloudflareのようなCDNの提供する技術スタックで解決できるようになっていき、Wasmの成熟と合わせて次世代のスタンダードなインフラストラクチャーになるんじゃないかと思っているので素振りができそうだというのと、最近はTwitterを使いたくないと感じることが多くなったというところにあります。

これからもやる気の続く限りWildebeestのForkを直していくつもりです。

脚注
  1. Mastodon IDの問題はActivityPubによるインスタンス間の通信には使わないのであくまでもローカルな問題です ↩︎

  2. alpha backendは100MBなのでこれでも増えた方 ↩︎

Discussion