Deno で Google Meet みたいなやつを作ってみようと思っている

Google Meet みたいなブラウザで動作するビデオ会議ツールを作りたい。

そこで Node で作っても良いのだが、 以前から少しずつ使っている Deno をそろそろ本格的に使っていきたいので試しにサーバー、フロント共に Deno でやってみることにした。

ある程度動くものができたらオープンソースにする予定。

Deno の API サーバー事情

Deno には Deno.serve というシンプルなサーバーが組み込まれている。

しかしこれは Routing の機能などがないので、そこは別途何とかするしかない。

色々調べたのだが、現状、それなりにメンテされてそうで使われてそうなライブラリは次

他にも色々あったけど、2年くらい前にコミットが止まっているものが多くてやめた。

Deno は少し使ってみればわかるけど、本体にまだまだ変更が入るのでライブラリを作ってもメンテするのが大変なのよね。。。 そのため放置されがちなのは理解できる。

今回は Hono を採用することにした。以前から少しブログなどで注目されているのを知っていたし、日本人が作っているので応援したいため。

Deno で React のフロントエンドを作る

どうせならフロントエンドも Deno で開発したい。 npm が使えるようになったので Vite も使えるようだが、次のライブラリを入れたほうが便利そうだったので採用した。

React Example が用意されているのでこれをコピーして土台とした。

その他、採用予定のライブラリ

この辺を使う予定。

wouter は Preact 対応してあるということで Deno 界隈ではちょっと使われ始めているライブラリのようだ。 不十分だったら React Router に変えようと思う。

Kuma UI は Chakra UI からの置き換えを考えている。 Kuma UI は Chakra UI ほど機能がないのだが、 CSS の読み込みの仕組みを改善していて速いとのこと。

jotai は以前から使っているのだが、もっと本格的に使っていきたいのでプラグインも入れる予定。

他の Web フレームワーク

  • Fresh
    • Deno の公式(たぶん) の Web Framework
    • サーバー、フロント共に作れるが次の理由で今回は不採用
      • Streaming 対応が不安なため
      • サーバーとフロントを分離した設計にしたいため
  • Ultra
    • Fresh に似ているけど React が使える

Streaming Data とデータベース

ビデオ会議ツールを作るために Web Streams API を使って Streaming データをサーバーとフロントでやり取りする設計を考えている。

そこで、 Streaming データをどのようにデータベースに保存するかが重要になってくる。 普通の RDBMS でも良いのだが、以前からちょっと気になっている Timescale DB を使ってみようと思っている。 これは PostgreSQL を拡張したデータベースなので使いやすそうだなと思っている。

Docker でもクラウドでも使える。

全文検索

また、今どき全文検索も必須の機能となってきたのだが、 日本語対応も含めて考えるとデフォルトの PostgreSQL では心もとない。

単に Google Meet クローンを作るだけなら全文検索はいらない気もするけど、 なんとなくチャット機能も作りたいので、実際には Discord クローンみたいになりそうだ。

で、次のような候補を考えた。

  • pg_bigm
    • PostgreSQL のプラグイン。 AWS RDS や GCP Cloud SQL でも使えるが、他に比べると遅いらしい。あんま開発もされてなさそう。
  • PGroonga
    • これも PostgreSQL のプラグイン。速いのだが pg_bigm と違って AWS RDS や GCP Cloud SQL がサポートしてない。
    • なぜか Supabase では使えるのだが、他のクラウドサービスでも使えるように営業を頑張ってほしいところ……。
  • TypeSense
    • これはプラグインではなく ElasticSearch や Algoria のような独立した全文検索エンジン
    • Docker のイメージもありオンプレでも使えるし、クラウドサービスも提供されている
    • ドキュメントを読んだ感じ ElasticSearch ほど面倒なクエリではなさそう

総合的に考えて今の第一候補は TypeSense 。

SQL Builder, ORM 的なやつ

kysely が deno でも動くようなので、特にトラブルなければこれかなぁ。 Timescale DB との相性が若干不安ではあるが...。

kysely そのものは必要十分な機能を備えていてわりと気に入っている。 Prisma が苦手な人には特におすすめかも知れない。

TypeScript でやるのか? 一応そのつもり...

TypeScriptって面倒くさいだけでは... で書いた通り TypeScript があまり好きではないのだが、今回は一応 TypeScript 前提で考えている。

理由としては

  • コード生成機能を使うようなものがない(GraphQL, gRPC, Prisma など)はずなので、自分で型を定義する分にはマシではなかろうか
  • テスト減らしたい
  • Clojure でもそうなんだけど関数の引数として何を期待しているかくらいは明示的にしたい事がある (とはいえ今更 prop-types はなぁ...)
  • Deno なら Repl とか環境セットアップが面倒くさくない

らへん。

どうしても生産性落ちそうだったら JS にするかもしれない。


掲示板にコメントする
※どの記事のコメントかわかるように本文に記事タイトルなどを入れてください。
一覧に戻る