Tsuruのいま、これから

ONOUE Origami
6 min readJul 16, 2018

--

発狂したようにぼくがすべてを書き直し始めてから

Tsuruとは

Twitter, GNU Social, Mastodon, SlackをTweetdeckにインスパイアされたUIで使えるようにする”マルチサービスクライアント”です。

実装中期で、ElectronアプリケーションではなくWeb Appsでの提供―ネイティブ・アプリケーションではない、Webアプリケーションとしての提供―も視野に入れていましたが、私はいくつかの理由により、Webアプリケーションとしての提供を断念せざるを得なくなりました。

実働していたときは以下のようなUIでした。

これらはすべてレンダリング プロセス側で通信・データ保存を行っていましたが、「多数のサービスと常時接続する」となった場合にパフォーマンスの問題が発生していました。そこで、マルチスレッド化を可能にする`WebWorker`で通信部分とレンダリング部分で切り分けを試みましたが、いくつかの問題を経て、結局Node.jsであるElectron側で行うことにしました。以下にその備忘録、及び推測を記載します。

Slack API

Slackは次のAPIの更新でGraphQLをサポートするつもりなのか、あるいは何も考えていないのか、何をリクエストしても”200 OK”を返してきます。Twitter, GNU Social, Mastodonはエラーが起きた場合、4**及び5**系、あるいはタイムアウトになります。しかしSlackではどんなリクエストに関しても2**系のステータスコードを返却するため、それぞれのサービスごとによってエラー形式を変える必要が発生しました。

またもう一つの問題もあります。これはよりクリティカルでした―

それはCORSに関する問題です。正しく使えれば問題ないはずのCORSは、Slackでは意図不明のエラーが発生します。それはpreflight requestに起因しており、`Authorization`ヘッダを含ませるとそれが原因でpreflightリクエストが飛び、そして200を返すことは返しますが、`Authorization Headerは許可されていない`とエラーを返します。

そこで、`Authorization`ヘッダを許可するように`Access-Control-Request-Headers`で`Authorization`を追加すると、今度は`Access-Control-Request-Headers`が許可されていないという腑抜けたエラーになってしまいます。

しかし、不可解なことにPostman―これはAPIリクエストを試したりするのに非常に優秀なアプリケーションです―や、Node.jsから書いたリクエストではすんなり期待するデータが降ってきて、エラーにならないのです。
現職の上司にあたるCTO氏と相談してみる等(迷惑をおかけしました)、原因を探してきましたが、どうやらブラウザ側(少なくともGoogle Chrome, Chromium系列)からのリクエストをSlackは想定していないのだろう、という奇妙な結論に達しました。これによりTsuruは`WebWorker`を使用してマルチスレッド化することが不可能になってしましました。

そして、急遽Electron側のNode.jsではうまくいくため―そちらの方ですべての通信を行う、ということに変更が行われました。現在、それらの作業はtsuruclient/coreで進行中です。

Discord

Discordは、はじめはとてもよいAPIを持っているものと思われました。それは大きな勘違いです。

Discordは、サーバー(Discord APIではギルドという呼称がされています)の一覧は得ることができても、そのサーバーの中身―ユーザー一覧、スレッド一覧、メッセージ一覧―や、メッセージの送受信、はてはダイレクトメッセージの内容の一切を得ることができませんでした。

結論から言うと、REST APIからは取得不能である、というのがコミュニティからの回答でした。ただし、回避策も存在しないわけではありません。
DiscordのClientは、実は常にlocalhostサーバーを立ち上げています。リモート・コール・プロシージャ…まあ同じシステム上で通信を行うこと…をすることにより、一応REST APIよりも幅広いある程度のデータを取得することは可能でした。
しかし、そのために私はtsuruにリモートコールプロシージャの実装もすることになってしまいます。しかし、Discordという素晴らしいサービスのためなら、それも厭わないつもりでした。

Discordが「サードパーティ・クライアントは許さない」という御触書を公表したことをご存知でしょうか。こちらです。日本語でないので、高梨陣平‏氏のツイッターに簡潔な文章が載っていますが

これについてはAPIポリシーを無視、というより注視しなかった私サイドにも非があります。こんな文章の最後に書くことを卑怯だと思われる方もいらっしゃるかと思いますが、この場を借りてお詫び申し上げます。TsuruはDiscordにも対応すると言っておきながら、私の情報精査不足によりDiscordには対応できなくなりました。申し訳ありません。

そして、いま

Tsuruは現在でも開発を進行中です。しかし、まずはAPIとの通信と、APIからのデータの統一化を行うNode.jsプログラムtsuruclient/coreを開発中です。良いニュースとしては、今の所順調であるということです。マイルストーンとしては曖昧ですが、8月はじめにまではなんとかリリースにまで持ち込めることを目標としています。

そして、本体のTsuruは9月半ばをリリースのめどにしています。しかし、これは希望的観測によるものです。これから大幅に遅れる可能性の方が十分にあると思われます。というのも、私個人でのプロジェクトであり、今までは休学していましたが、9月から復学するためです。
期待していたみなさんには長らくおまたせすることになってしまい、申し訳ありません。しかし、なんとしてでもリリースする所存です。

Tsuruをよろしくおねがいします。

--

--