blast = async function* (query, subjects) {
if (!subjects) return null;
yield {
loading: true,
data: null,
error: null,
detail: null
};
const alignURL = new URL(
"https://blast.ncbi.nlm.nih.gov/blast/BlastAlign.cgi"
);
const body = new FormData();
body.set("CMD", "Put");
body.set("PROGRAM", "blastn");
body.set("DATABASE", "nr");
body.set("MAX_NUM_SEQ", "5000");
body.set("QUERY", query);
body.set("SUBJECTS", subjects);
const response = await fetch(alignURL, { method: "POST", body });
const html = await response.text();
const doc = new DOMParser().parseFromString(html, "text/html");
const rid = doc.querySelector('input[name="RID"]').value;
yield {
loading: true,
data: null,
error: null,
detail: { rid }
};
const url = new URL("https://blast.ncbi.nlm.nih.gov/Blast.cgi");
url.searchParams.set("CMD", "Get");
url.searchParams.set("FORMAT_OBJECT", "Alignment");
url.searchParams.set("FORMAT_TYPE", "JSON2_S");
url.searchParams.set("RID", rid);
let tries = 0;
do {
const response = await fetch(url);
if (response.ok && response.headers.get("Content-Type").includes("json")) {
const data = await response.json();
yield {
loading: false,
data,
error: null,
detail: { rid }
};
break;
}
await new Promise((resolve) => setTimeout(resolve, 5000));
} while (++tries < 100);
}