misotek

Nostr kind:30000 ユーザリスト編集アプリ 詳細設計(実装者向け)

目的

外部仕様(別ドキュメント)を実装として成立させるための、構成・状態管理・通信フロー・関数責務・安全設計・リファレンスをまとめる。

本書は PoC 実装(単一 HTML)を前提とし、将来の分割(モジュール化・ビルド導入)も見越した「引き継ぎ可能な粒度」を目標とする。


実装の前提


フォルダ/ファイル構成(現状)

将来の推奨分割(任意):


画面構成(DOM)

Screen

Modals


状態管理(in-memory)

グローバル

キャッシュ

編集ステート

Entry 例:

不変条件:


Nostr 通信設計

使用ライブラリ

リレー選定

購読(read)

利用箇所:

publish(write)

バグ対応の経験則:


イベント構築

kind:30000

kind:5


UI レンダリング設計

原則

主要関数

レンダリング方針:


入力検証・正規化

文字数制限

リレーURL

npub/nsec


セキュリティ設計(nsec入力以外)

守るべきこと

実装している対策

注意点


ログ/デバッグ

推奨ログ追加ポイント:


テスト観点(実装者向け)


残課題(TODO)


関数リファレンス

本節では、PoC 実装内で主要となる関数について、役割・引数・戻り値・例外・注意点を整理する。

記載の「例外」は JavaScript の throw によるものに加え、Promise の reject(非同期例外)も含む。


clampStr(s, max)

safeShort(s, n)

sanitizeImageUrl(url)

normalizeRelayUrls(raw)

setRelayUrls(urls) / getRelayUrls()


bech32ToSk(nsec)

decodeNpubToHex(npubStr)

encryptPrivatePTags(privatePTags)

decryptPrivatePTags(content)


fetchMany(filter, relays, timeoutMs)

fetchOne(filter, relays, timeoutMs)

withTimeout(promise, ms, label)

publishToRelays(ev, relays)

loadKind10002Relays()

loadAllLists()


hydrateStateFromEvent(ev)

fetchProfilesForEntries() / applyProfiles()

buildKind30000Event()

publishNow()

buildDeleteEvent()


switchScreen(which)

renderListCards()

renderEditAll()

renderRow(entry)

markDirty(v) / updateDirtyUI()

debugLog(msg, obj)