AT Protocolの理解
まだあまり分かっていないので試したことを中心に書く
atprotoにおいてやり取りされるデータの定義にはLexiconが使われる
https://atproto.com/guides/lexicon
LexiconはActivityPubにおけるActivityのようなもの?
どちらかというとrecordの方か
recordの作成にはagent.post()やagent.com.atproto.repo.createRecord()が使える
このとき、recordにはどんなデータも入れられるしPDSにそのまま保存される
https://bsky.app/profile/mkizka.dev/post/3krfwacapss2q
$typeがapp.bsky.feed.postのrecord(つまりBlueskyのポスト)にfoo: 'bar'という関係ないデータが入っている
これを利用して一部のクライアントは固定ポスト機能を実装している
https://bsky.app/profile/mkizka.dev/post/3krfkgxuhtr2j
createRecordのオプションにvalidate: falseを指定するとレコードの内容の検証をスキップでき、自由な形式のレコードを保存できる
https://docs.bsky.app/docs/api/com-atproto-repo-create-record
以下はセルフホストしたPDSにdev.unsocial.pds.testという$typeのrecordを置いてみたもの(レコードタイプは適当)
https://pds.unsocial.dev/xrpc/com.atproto.repo.getRecord?collection=dev.unsocial.pds.test&repo=compeito.pds.unsocial.dev&rkey=test
つまり実態としてはレコードの内容は完全に自由(PDSの裁量で検証する?もしくはAppViewが使用するときに検証する?)で、おおむね同じデータであることを表すタグのようなものとしてレコードタイプ($typeやcollection)があると理解した
Lexiconを使ってレコードを作成するとリレーがそれを拾ってAppViewに流してくれる
というかこの流れを拾うアプリケーションをAppViewと呼んでいる?
AppViewが流れを披露にはFirehoseに接続する必要がある
https://docs.bsky.app/docs/advanced-guides/firehose
Firehoseとの接続は https://github.com/bluesky-social/feed-generator の実装が参考になる
接続部分のみ抜き出したコードが以下
https://github.com/mkizka/atproto-test/blob/f06204712dbb520b2cd3c4e6ffbb941f802b71a1/src/lib/subscription.ts
tsx src/lib/subscription.tsで動く
handleメソッドを上書きするといい感じに試せる
ここにはBlueskyのrecordだけでなく独自形式のものも流れてくる
WhiteWindのレコードなど
rkeyにはTIDが使われている
https://atproto.com/specs/record-key#record-key-type-tid
TIDは@atproto/commonまたは@atproto/common-webのTID.next().strで生成できる
#さまざまな理解
#atproto