async fetchSessionScreenshots()

in source/idea/idea-cluster-manager/webapp/src/pages/virtual-desktops/my-virtual-desktop-sessions.tsx [275:366]


    async fetchSessionScreenshots() {
        const sessions = this.state.sessions;
        if (sessions.size === 0) {
            return;
        }

        let screenshots: VirtualDesktopSessionScreenshot[] = [];
        sessions.forEach((session) => {
            if (Utils.isEmpty(session.dcv_session_id) || session.dcv_session_id === undefined) {
                return true;
            } else if (session.state !== "READY") {
                // no screenshots required unless the session is ready.
                return true;
            } else if (this.state.screenshots[session.dcv_session_id] !== undefined && moment().subtract(5, "minutes").isBefore(this.state.screenshots[session.dcv_session_id].time)) {
                // do not ask for screenshots if we already have a screenshot that is less than 5 minutes old
                return true;
            }

            screenshots.push({
                idea_session_owner: AppContext.get().auth().getUsername(),
                idea_session_id: session.idea_session_id,
                dcv_session_id: session.dcv_session_id,
                create_time: session.created_on,
            });
        });

        if (Utils.isEmpty(screenshots)) {
            // not calling the screenshots API when we know that there are no sessions that are active.
            return;
        }

        screenshots = screenshots.sort((a: VirtualDesktopSessionScreenshot, b: VirtualDesktopSessionScreenshot) => {
            if (a === undefined && b === undefined) {
                return 0;
            }

            if (a === undefined || a.dcv_session_id === undefined) {
                return 1;
            }

            if (b === undefined || b.dcv_session_id === undefined) {
                return -1;
            }

            if (this.state.screenshots[a.dcv_session_id] === undefined && this.state.screenshots[b.dcv_session_id] === undefined) {
                return moment(a.create_time).diff(b.create_time);
            }

            if (this.state.screenshots[a.dcv_session_id] === undefined) {
                return 1;
            }

            if (this.state.screenshots[a.dcv_session_id] === undefined) {
                return -1;
            }

            return this.state.screenshots[a.dcv_session_id].time.diff(this.state.screenshots[b.dcv_session_id].time);
        });

        const delay = async (interval: number) => {
            return new Promise((resolve) => {
                setTimeout(() => resolve(true), interval);
            });
        };

        const batchSize = 3;
        const screenshotState = this.state.screenshots;
        for (let i = 0; i < screenshots.length; i += batchSize) {
            if (!this.componentMounted) {
                // No need to go fetching for screenshots if the component is not mounted.
                continue;
            }
            const batch = screenshots.slice(i, i + batchSize);
            let result = await this.getVirtualDesktopClient().getSessionScreenshot({
                screenshots: batch,
            });
            if (result.success) {
                result.success.forEach((screenshot) => {
                    screenshotState[screenshot.dcv_session_id!] = {
                        data: screenshot.image_data!,
                        time: moment(),
                    };
                });
            }
            this.setState({
                screenshots: screenshotState,
            });
            if (i + batchSize < screenshots.length) {
                await delay(1000);
            }
        }
    }