リンクカードを実装する時にJSRだけ上手く情報を取得できなかったので、その解決方法を書いていく。
JSRにリクエストを送る時はacceptヘッダーを付ける
これが全て。
JSRではhttps://jsr.io/@std/assert/meta.json
のように、ドキュメントのURLの末尾にmeta.json
を付けると、そのモジュールのメタデータが取れる。
つまり、curl https://jsr.io/@std/assert/meta.json | jq '.name'
なりすればブラウザを開かなくてもモジュールの情報を取得できる。
ただ、このノリでドキュメントのHTMLを取ろうとすると404が返却される。
curl https://jsr.io/@std/assert
404 - Not Found⏎
これを解決するには、acceptヘッダーを指定してやる必要がある。
curl https://jsr.io/@std/assert -H 'accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7'
このブログでも、linkcardの取得時にoriginがJSRの場合のみこのヘッダーを付加してリクエストを飛ばす処理が含まれている。
const resp = await fetch(req, {
headers: isJSR
? {
...header,
"accept":
"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",
}
: header,
signal: AbortSignal.timeout(timeout),
});
この挙動はバグとして報告されているので、近い将来修正されるかもしれない。