通知ビューワを自作する

概要

通知ビューワを自作するプロジェクト。

Githubのタイムラインや通知を見るアプリをnode-webkitで作った | Web Scratch的なことをやりたい。

Memo

制約

  • iframe内で他ホストの絶対リンクを開けない
    • ブラウザの制約のため
  • iframe内で相対リンクを開けない
    • リンクは暗黙的に、プロキシサーバがホストになる。つまりlocalhost。そうすると元のホストが消えるため、辿れない

Tasks

TODO 受け取れる環境変数の一覧を表示できるようにする

READMEに書いておくのだと忘れるし面倒なので、コマンドで一覧表示できるとよい。

TODO オフラインにすると止まる

サーバごと止まる。取得できないとキャンセルしないといけない。

TODO 2回既読リストに入る可能性がある

チェックをするか、重複を許さないようにハッシュに読み込むなどする。

TODO サイドバーを可変にする

ページによって横幅でデザイン崩れが発生する。例えばdev community。

TODO 既読エンドポイントを普通のエンドポイントにする

クライアント→サーバをwebsocketでやってるけど、別にそうでなくていい。

TODO コピペ用にiframe内のリンクを表示する

どこにいるかわかりにくいというのもある。カンタンだけど、表示する場所がないな。

TODO デスクトップUIを作成する

  • iframeだと制約が大きい
    • リンクが辿れない
    • ホストを変えられない

ただ、iframe制約を回避するためのプロキシによってキャッシュを保持し、高速遷移できている側面もある。

  • feed遷移と、あとでリンクを辿るのを区別する必要がある。feed遷移したあとにホストがプロキシサーバにならなければいい。読み込んだあとに変えることはできそうな
  • つまり、iframe制約を超えられれば可能性がある

TODO リポジトリごとに分けて表示できるようにする

一見同じなので混ざって読みにくい。

jQueryだけだと厳しいか。

TODO キャッシュを更新できるようにする

iframe内の更新ボタンみたいなのを作成する。キャッシュ時刻を保持してもよさそう。

TODO iframeでGitHub以外も開きたい

ちょっとしたときに、不便。見てる途中で開きたいことはけっこうある。

ブラウザでやる限り厳しい可能性が高い。デスクトップアプリにするか、ブラウザを埋め込むか。

TODO 実行チェックのCIを追加する

5分くらい立ち上げるだけのチェック。ないよりはマシか。

Reference

Archives

DONE オフラインになっても止まらないようにする

今はフェッチに失敗すると止まる。別にサーバに影響を与えなくていい。

timeout cancelさせればいいのか。

CLOSE 直近にクリックした項目を色をつける

どこまでたどったかわからなくなるので。削除したときに最新の画面を開くなったので、別にいらなくなった。

DONE 開いたときのiframe内に表示するページとして、Garbanzoの静的ページを用意する

ツールのウェルカムページとしていい感じのページにする。

DONE 削除したとき、先頭の項目でiframeを切り替えたい

そのままチェックボタンを押すだけで、次のやつを見たい。

DONE 既読にできるようにする

表示やデータからの削除と、既読リクエストをやる。

受け渡しがうまくいかない。chanに送信はできるのだが、受信できてないよう。chanを初期化してないせいだった。

DONE 長い本文は省略する

どうせサイドバーだけから見ることはない。でもmarkdownからHTMLに変換をかけてるから切り出すのは難しそうな。 本文非表示でいいか。

DONE DiscussionとReleaseイベントに対応する

対応できてない。

discussionは、APIの不具合でURLが取れないので不可能。スルーする。

DONE PRオープンの通知が来てない

PRイベントをスルーしてたので直した。

DONE デスクトップ通知

push.jsでやればよいというが。

簡単にできた。ただ初回実行で通知が多すぎるので無視したい。

  • 通知したいかどうかはクライアントによって変わる。最新のリロードしたてのクライアントでは通知は出ないが、開きっぱなしにしていたクライアントでは出る
  • 初回読み込みからそれ以後に受信された場合は通知したい
  • 初回リロード時は通知しない
  • 最初にサーバを立ち上げたときは、徐々に追加していくので、初回リロードのロジックだけでは不足する
  • 単純に更新が3分以内だったら、とかでもよさそうな

DONE 上から新しい順に並ばせる

今はmapから取り出してランダムで見にくい。

map型のroom.eventsで一覧を持っている。これはかぶりを防ぐためmap型にしている。eventsから、各クライアントのdoneにないものをwebsocketに書き込む。

DONE commentとissue openの処理を共通化する

できるところが多くある。

DONE eventにタイプフィールドを追加する

パッと見でわかりやすい。

タイプというか、タグ的な使い方か。

DONE 競合する

まだpanicすることがある。

DONE クライアントが増えると競合する

消えたクライアントは消す。

コネクションの切断をサーバ側で見て、終了させる。切断とはつまり、websocketへの書き込みが失敗したとき。そのときハンドラのコネクションキープの無限ループを終了させ、deferで削除チャンネルに追加する、という処理。

DONE 無限ループで通知取得する

リアルタイムに通知を取得できるようにする。今は起動時にやってるだけ。

やるためには、無駄にリクエストしないロジックが必要になる。ストアに存在していれば、リクエストしないというような。

DONE 通知が少ないことがある

競合かと思いきや、dereference失敗だ。タイトルか本文を持たないことがあるのか。 ループのどこかでreturnしているように見える。

crypto/internal/bigmod: switch to saturated limbs のissueが来ると止まる。

コミットに対するコメントだと止まるのか。

DONE 現在のURLを表示する

遷移する方法もほしい。

iframeの中のURLを別タブで開けるようにする。

ボタンをリンクすればよさそう。

DONE favicon追加する

blob書き込みとしてできた。ファイルだろうとほかの、HTMLなどと同じように扱えるのに感動。

DONE テキストをマークダウン化する

ライブラリで簡単にできた。

DONE 通知が多い場合の対応

たくさんリクエストしてしまう。インメモリも無尽蔵に増えてしまう。

1リクエストで50のよう。まあいい。

  • 50個を最大にして、なくなったら取得が走るようにする
    • 削除ロジックはどうするか。現状、重複を避けるためにマップにしているが、順番がないのでやりにくい

すでにあるリソースにリクエストを絶対飛ばないことがわかれば、とりあえず全部保存すればよさそう。

DONE 通知にdiscussionがあるときにバグる

subjectのURLがないよう。

スルーする処理を追加した。

DONE 時刻表示

GitHubから取ってきた時刻を入れる。

DONE リポジトリを制限しない

今はテストのため固定になっている。リポジトリ関わらず取得するようにする。ただ数がとんでもないことになりそうなので、あらかじめ数対応をしておきたい。

DONE イメージを用意する

軽量イメージを使っていい感じになった。

DONE 初回起動時に配信されない

起動直後に読み込むと、ウェブソケットの内容を受け取れない。clientにjoinはしているのだが、送信されてないようだ。

eventsを用意できてないと、forwardイベントが作成されないため、実行されない。起動後に無限ループ実行できれば解決する。

今のコードだと、forwardとroom.eventsを同期させようとすると全部追加で送ってしまうので、スタックしてしまう。重複もとんでもないことになる。クライアントごとに、どれが未送なのか判定できないといけない。

クライアント側にすでに送信したnotificationIDのmapを持たせておくことにした。

DONE CPU使用率が高い

送信しまくってるからな。

DONE latest comment URL を event から消す

使ってないな。 CLOSED: [2023-05-30 火 23:19]

DONE サイドバーの固定

通知がたくさんあるとページが下に伸びる。

DONE コメント種別によってエラーになる

まだ特定してない。

issueが開かれたときの通知だな。

DONE event内にリポジトリ情報を入れる

リポジトリ名を入れる。

DONE プロキシを図に描く

頭がこんがらがるので整理する。

DONE ステータスを表示するページ

どこまでフェッチが終わったかを示す。

今はwebsocketでeventしか送ってないが、別の情報を送るのはどうするか。

  • 送信すると止まるな。受信元が用意できてないとか。
    • 同じゴルーチン上で送信と受信してるから、capが1以上でないとブロックして止まるようになっていた
  • 今はsendにあるごとに、jsonにwriteしてる。すでにある場合は無視してる。
  • イベントを送るときと、統計を送るときは明らかに、タイミングと送るjsonが異なる
    • 今はjsonが同じなのが問題だ。event用しか送れない
    • websocketごと分けるとコードの重複が増えるのと、接続を管理する手間が増える
  • case文にdefaultがないと、ループして先に進まない
  • 2回読み込みできなくなった

DONE プロキシをGitHub以外に対応する

ホストが何でもできるようにする。できたが、相変わらずその画面から別のリンクを開くことはできない。

DONE たまに何も出なくなる

  • 統計の数字がすべて0になる
  • エラーとかは出てない

ロック関係か。途中でなることもある。その場合は既読が増えない。メインのselect文が止まるってことか。既読ボタンを連打するとなるぽい。時間のかかるリクエストを非同期にした。

DONE RSSを既読記録できるようにする

既読の場合は非表示にしたい。

  • 既読をどうやって記録するか
    • CSVファイルに保存する
    • 既読したときにリンクを書き込む
    • 読み込むときにリンクリストを見て、ないときにeventに追加する
  • 設定ディレクトリを生成する(.garbanzo)
  • ファイルを生成する(history)
  • 読み込まないパターン
    • ファイルにあるとき
    • メモリにあるとき

DONE RSS対応する

いちおう表示はできるようになった。

DONE フィードURLを設定ファイルから取り込むようにする

先に既読対応しないと、取りまくってしまう。

DONE フィード設定ファイルがない場合の対応

ファイルがない場合は作成する。起動したときに、いくつかのファイルについて作成を走らせる。

DONE フィード表示を整える

  • アイコン
  • リンク
  • 作成日時

などを入れる。

DONE 統計表示を表にする

もうちょっときれいに表示する。

DONE RSSのdescriptionにHTMLタグが入っているので消す

文字を切り取るので、HTMLタグにしてるとうまくいかない。

DONE 設定ファイルのテンプレートを用意する

空白のファイルができるだけでわかりづらい。

DONE フィードのドキュメントを作成する

書く。

  • 設定ymlのエントリの例を作成する
  • 今の設定をトップページに表示する
  • ないときは自動作成する

DONE ymlのタイトルを何かに使う

あるいは設定ファイルからタイトルを消す。今はイベントと分離して使えない。できればカテゴリにしたいが…。

フィードリストの説明を表示するために、増やした。タイトルではなくdescriptionとした。

DONE RSSの取得情報をいい感じにする

アイコンがブランクになることが多い。どうにかできないか。

とりあえず一括でRSSアイコンにした。

CLOSE 起動直後にリロードするとクライアントの分だけfetchが走るような

ログを仕込んだときに2つ出てくるときがある。

CLOSE トークンをトップページから入れられるようにする

別にファイルを直にいじってできればいいので、スルー。

入れて、設定ファイルに保存して次回以降使う。iframe内でやると、POSTできない可能性がある。

DONE 構造体まわりのリファクタ

  • 場所がわかりづらい
  • 関数がでかい
  • 設定がまとまってない

DONE 定数化する

リファクタ。

DONE トークンがないとき実行すると止まる

いつのまにか。

トークンがないときか。

DONE brew installに対応する

気軽にMacでもインストールできるようにする。

  • Go installはGoが入っているか限らない
  • dockerは使い方に慣れてない可能性がある

動作確認するのが面倒だな。