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