以下示例展示了如何将多个不同的源站回复汇聚到一个回复中。
async function aggRequest(urlBase, urlQuery, writable) {
const path_list = urlQuery.split(',');
let preventClose = true;
const size = path_list.length;
let idx = 0;
for (const p of path_list) {
const u = urlBase + p;
const req = await fetch(urlBase + p);
if (idx == (size - 1)) preventClose = false;
// 开始将数据pipe到对应的writable中,那么readable就可以读出数据
await req.body.pipeTo(writable, {preventClose});
// 编写footer,帮助识别各种回复
if (preventClose) {
const writer = writable.getWriter();
await writer.write(
`\n\n<!-- This is from ${u} ------------------------------>\n\n`);
writer.releaseLock();
}
++idx;
}
}
async function handle(event) {
const url = new URL(event.request.url);
const {readable, writable} = new TransformStream();
aggRequest(
url.protocol + '//' + url.hostname + '/', url.search.substring(1),
writable);
return new Response(readable);
}
addEventListener('fetch', (event) => {
event.respondWith(handle(event));
});