syusui-s / rabbit

🐰 A nostr client like TweetDeck
https://rabbit.syusui.net
GNU Affero General Public License v3.0
71 stars 13 forks source link

ホームタイムラインが正しく取得されない #6

Closed sabigara closed 1 year ago

sabigara commented 1 year ago

便利なクライアントを開発していただきありがとうございます。

おそらく一番難しい部分なのだとは思いますが、ホームタイムラインが正しく取得されないことがよくあります(もし想定通りの挙動でしたらすみません)。以下の画面収録のように、(リ)ロード直後には自分の最近の投稿のみが数件表示され、他の人の投稿はロード以後のものしか追加されません。他のカラムは正しく動いているように見えます。

https://user-images.githubusercontent.com/41217985/226097713-16ea5671-2147-4cef-bc3b-6a8b1f2df4d1.mov

過去の投稿も見られたらうれしいです。よろしくお願いします!

環境

sabigara commented 1 year ago

一度ローカルストレージを消去して再ログインしたら今は動いています。(それが原因かはわかりませんが)

あと関係あるかはわかりませんが以下のような notice が返ってきているようです。

Home-df0e5fc7.js:2049 NOTICE: wss://nostr.h3z.jp: Subscription rejected: Too many subscriptions: Number of subscriptions must be less than or equal to 10
(anonymous) @ Home-df0e5fc7.js:2049
(anonymous) @ Home-df0e5fc7.js:2049
x @ Home-df0e5fc7.js:2049
setInterval (async)
t.onmessage @ Home-df0e5fc7.js:2049

ミニファイされていて見にくいですが、一応エラーを吐いているソースの一部も

  , G2 = ({shortcuts: e=K2, onShortcut: t})=>{
    const n = z2(e);
    Je(()=>{
        const r = F2(s=>{
            if (s.type !== "keydown" || s.ctrlKey || s.altKey || s.metaKey || s.target instanceof HTMLTextAreaElement || s.target instanceof HTMLInputElement)
                return;
            const o = n.get(s.key);
            o != null && t(o)
        }
        , 50);
        window.addEventListener("keydown", r),
        Wt(()=>{
            window.removeEventListener("keydown", r)
        }
        )
    }
    )
}
  , W2 = ()=>{
    const e = Cd();
    G2({
        onShortcut: t=>{
            e(t.command).then(()=>console.debug(`shortcut key '${t.key}' was processed successfully`), n=>console.error(n))
        }
    })
}
  , q2 = L('<div class="absolute inset-0 flex w-screen flex-row overflow-hidden"><div class="flex h-full snap-x snap-mandatory flex-row overflow-y-hidden overflow-x-scroll"></div></div>')
  , aw = ()=>{
    W2();
    const e = Va()
      , {persistStatus: t} = Xa()
      , n = Xn()
      , {config: r} = J()
      , s = as();
    Mo(()=>{
        r().relayUrls.map(async l=>{
            (await n().ensureRelay(l)).on("notice", h=>{
                console.error(`NOTICE: ${l}: ${h}`)
            }
            )
        }
        )
    }
    );
    const {followingPubkeys: o} = h2(()=>ke([s()])(([l])=>({
        relayUrls: r().relayUrls,
        pubkey: l
    })))
syusui-s commented 1 year ago

調査ありがとうございます。

ローカルストレージにはリレーの設定が入っているのですが、もし消したことによって改善したとすると、削除前とデフォルト値のリレーの違いが影響している可能性がありますね。

再現を試みているのですが、私のほうで再現ができず・・・

ホームタブだけでその事象が起きているとすると、いま怪しいと思っているのは followingPubkeys() の処理です。 followingPubkeys()はフォローしているユーザの配列を取得する関数で、これを元にホームタイムラインを構築しています。

followingPubkeys()が空になってしまっていると、フォールバックとして自分のpubkeyを使います。 一瞬フォローしている人の投稿が映って、その後自分だけの投稿になるという挙動を見ると、何らかの原因で followingPubkeys() が空になっているのではないかなと予想しています。

まとめると、推測される原因はリレーの違い、あるいはフォロー一覧取得関連のバグかなと思っています。

sabigara commented 1 year ago

なるほど・・・

現在ローカルストレージには2つ (RabbitPersistStatusRabbitConfig)のデータがありますが、消した時はもっと多かった気がするので、もしかしたら過去のスキーマと競合していたのかなと想像しています。もし変えていたらですが・・・

このissueをクローズされるかはお任せします。引き続き開発を続けていただけたら嬉しいです。ありがとうございました。

syusui-s commented 1 year ago

おそらくコレだろうという原因が判明しました。

followingsの取得失敗時にリトライ処理を入れるようにしていませんでした。 nostr-tools 1.3.2では2.4秒がタイムアウト時間に設定されていますが、重いリレーだと期間内にデータを返さない可能性があります。 https://github.com/nbd-wtf/nostr-tools/blob/v1.3.2/pool.ts#L53-L56-L56

nostr-tools 1.3.2だとタイムアウト時間を変更できないので、失敗時にリトライするように修正しました。

https://github.com/syusui-s/rabbit/commit/07c02fd9371ad21fcd9f7d44d6132ec123ed3fb7#diff-32e66fcfee4eec07be4fe1e62bc72a9299d2526f35c0ae132870c02026a0b462R410-R438

これでしばらく様子見したいと思います。まだ発生するようでしたらご報告いただけますと大変助かります。

sabigara commented 1 year ago

おそらく1時間前のコミットはすでにリリースされていると思いますが、そこから正常に動いているようです。(朝の時点では自分の投稿しか表示されていませんでした)

対応いただきありがとうございました!また何かあれば報告させていただきます。