Open7

Nostr クライアント開発

雪猫雪猫

Nostr クライアント開発に関する知見や設計の参考。

雪猫雪猫

基本

WebSocket でリレーに接続し JSON 配列でメッセージを送る。

https://github.com/nostr-protocol/nips/blob/master/01.md#nip-01

読み取り

2 番目の要素はサブスクリプション ID で任意の文字列。
レスポンスに同じものが含まれて返ってくる。

3 番目の要素はフィルター。

リクエスト
["REQ", "_", {"kinds": [1]}]
レスポンス
["EVENT", "_", {"id", "<id>", "kind": 1, "pubkey": "<pubkey>", ...}]

書き込み

2 番目の要素は署名済みのイベント。

リクエスト
["EVENT", {"id", "<id>", "kind": 1, "pubkey": "<pubkey>", ...}]

3 番目の要素は成功可否。

レスポンス
["OK", "<id>", true]
雪猫雪猫

タイムラインの取得

REQ (サーバーフィルター)

authors はホームやリストに含まれる pubkey リスト。

フィルター
{
  "kinds": [1],
  "authors": ["<pubkey>", "<pubkey>", ...]
}

クライアントフィルター

REQ では除外ができないのでミュートの反映や必要に応じてブリッジを弾くのはクライアント側でフィルターする必要がある。

ブリッジを弾く
events.filter((event) =>
  !event.tags.some(([tagName]) => tagName === 'proxy')
)

ページング

WIP

REQ とクライアントフィルターを組み合わせる必要があるためページングや無限スクロールを実装する場合いろいろと問題になる。

https://zenn.dev/link/comments/65991d69ef0ab1

メタデータ等の取得

WIP

雪猫雪猫

ログイン

  • NIP-07
    • ブラウザ拡張機能(スマホ PWA では使用できない)
    • ネイティブアプリ WebView
  • NIP-46
  • 秘密鍵
  • 公開鍵(読み取り専用)
雪猫雪猫

NIP-07

拡張機能が windownostr オブジェクトを追加する。

使用例
const pubkey = await window.nostr.getPublicKey();

注意点

ロード時

追加されるまでにはラグがある(loadDOMContentLoaded の時点では読み込まれていないことがある)のでクライアントは存在チェックをする必要がある。

https://github.com/penpenpng/nip07-awaiter

アカウント切り替え

拡張機能によってはマルチアカウントに対応しているが切り替えたことをクライアント側では検知できない。

ライブラリ

1 行追加するだけで NIP-07 の window.nostr をフックして NIP-46 にも対応してくれるライブラリ。

https://github.com/fiatjaf/window.nostr.js
https://github.com/nostrband/nostr-login