in frontend/app/SearchComponent.tsx [54:110]
async asyncDownload(url:string) {
const abortController = new AbortController();
const response = await authenticatedFetch(url, {
signal: abortController.signal,
});
if (response.status !== 200) {
console.error(`Could not load data: server error ${response.status}`);
const rawData = await response.text();
console.error(`Server said ${rawData}`);
return;
}
const stream = await ndjsonStream<Uint8Array,FileEntry>(response.body);
const reader = stream.getReader();
await this.setStatePromise({
currentReader: reader,
currentAbort: abortController,
});
const parentComponent = this;
const readNextChunk = (reader:ReadableStreamReader<FileEntry>) => {
reader.read().then(({ done, value }) => {
if (value) {
parentComponent.setState(
(oldState) => {
return {
fileEntries: oldState.fileEntries ? oldState.fileEntries.concat([value]) : [value],
searching: !done,
};
},
() => {
if (
parentComponent.state.fileEntries &&
parentComponent.state.fileEntries.length >= SearchComponent.resultsLimit
) {
console.log("Reached limit, stopping");
reader.cancel();
}
}
);
} else {
console.warn("Got no data");
}
if (done) {
parentComponent.setState({ searching: false });
} else {
readNextChunk(reader);
}
});
}
readNextChunk(reader);
}