API 取得
URL を非同期 Iterable で渡し、最大5件を並行取得します。結果は完了順に処理し、全件をメモリに保持しません。
ts
import { from, map, rateLimit } from "mogami-stream";
export function crawl(urls: AsyncIterable<string>, signal: AbortSignal) {
return from(urls)
.pipe(
rateLimit({ count: 5, perMs: 1_000 }),
map(
async (url, { signal }) => {
const response = await fetch(url, { signal });
if (!response.ok) {
await response.body?.cancel();
throw new Error(`HTTP ${response.status}`);
}
return { url, text: await response.text() };
},
{
concurrency: 5,
capacity: 5,
ordered: false,
},
),
)
.forEach(
({ url, text }) => {
console.log(url, text.length);
},
{ signal },
);
}rateLimit はこの実行内の上流読み取り開始数を毎秒5回までに制限します。signal を fetch に渡してキャンセルを伝えます。再試行が必要な場合はリトライを参照してください。