Open7
Nostr クライアント開発
Nostr クライアント開発に関する知見や設計の参考。
基本
WebSocket でリレーに接続し JSON 配列でメッセージを送る。
読み取り
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 とクライアントフィルターを組み合わせる必要があるためページングや無限スクロールを実装する場合いろいろと問題になる。
メタデータ等の取得
WIP
NIP-07
拡張機能が window
に nostr
オブジェクトを追加する。
使用例
const pubkey = await window.nostr.getPublicKey();
注意点
ロード時
追加されるまでにはラグがある(load
や DOMContentLoaded
の時点では読み込まれていないことがある)のでクライアントは存在チェックをする必要がある。
アカウント切り替え
拡張機能によってはマルチアカウントに対応しているが切り替えたことをクライアント側では検知できない。
ライブラリ
1 行追加するだけで NIP-07 の window.nostr
をフックして NIP-46 にも対応してくれるライブラリ。