JSON-LD名前空間の問題
MastodonからのActivityを処理しようとすると、JSON-LDの解析でエラーが発生した。
jsonld.InvalidUrl: Dereferencing a URL did not result in a valid JSON-LD object.
url: 'http://joinmastodon.org/ns',
cause: FetchError: HTTP 404
Mastodonは http://joinmastodon.org/ns# をJSON-LD名前空間として使用しているが、このURLは実際のJSON-LDコンテキストドキュメントを返さない。これはHacker Newsのスレッドで「fake namespace」と指摘されている。
この問題の背景には、JSON-LDコンテキストの配信に関する歴史がある。Issue #9411によると、Mastodonは以前、共通のJSON-LDコンテキストをバンドルしていた。しかしコミットd40ef112で削除された。「わずかなRAMの節約」が理由だったが、外部サーバー(w3id.org/identity/v1など)がダウンした際にキャッシュを持たないインスタンスが機能停止に陥る問題が発生した。
解決策として、カスタムコンテキストローダーを実装し、問題のある名前空間をローカルで事前定義した。
const PRELOADED_CONTEXTS: Record<string, object> = {
'http://joinmastodon.org/ns': {
'@context': {
'toot': 'http://joinmastodon.org/ns#',
'Emoji': 'toot:Emoji',
'featured': { '@id': 'toot:featured', '@type': '@id' },
'discoverable': 'toot:discoverable',
// ... 他のMastodon固有の語彙
},
},
'http://litepub.social/ns': {
'@context': {
'litepub': 'http://litepub.social/ns#',
'EmojiReact': 'litepub:EmojiReact',
},
},
};