async asyncDownload()

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);
  }