Summary: Plugins moved from "sonar/desktop/src/plugins" to "sonar/desktop/plugins". Fixed all the paths after moving. New "desktop" folder structure: - `src` - Flipper desktop app JS code executing in Electron Renderer (Chrome) process. - `static` - Flipper desktop app JS code executing in Electron Main (Node.js) process. - `plugins` - Flipper desktop JS plugins. - `pkg` - Flipper packaging lib and CLI tool. - `doctor` - Flipper diagnostics lib and CLI tool. - `scripts` - Build scripts for Flipper desktop app. - `headless` - Headless version of Flipper desktop app. - `headless-tests` - Integration tests running agains Flipper headless version. Reviewed By: mweststrate Differential Revision: D20344186 fbshipit-source-id: d020da970b2ea1e001f9061a8782bfeb54e31ba0
79 lines
1.8 KiB
TypeScript
79 lines
1.8 KiB
TypeScript
/**
|
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*
|
|
* @format
|
|
*/
|
|
|
|
import {ImageId, ImageData} from './api';
|
|
|
|
export type ImagesMap = {[imageId in ImageId]: ImageData};
|
|
|
|
const maxInflightRequests = 10;
|
|
|
|
export default class ImagePool {
|
|
cache: ImagesMap = {};
|
|
requested: {[imageId in ImageId]: boolean} = {};
|
|
queued: Array<ImageId> = [];
|
|
inFlightRequests: number = 0;
|
|
fetchImage: (imageId: ImageId) => void;
|
|
updateNotificationScheduled: boolean = false;
|
|
onPoolUpdated: (images: ImagesMap) => void;
|
|
|
|
constructor(
|
|
fetchImage: (imageId: ImageId) => void,
|
|
onPoolUpdated: (images: ImagesMap) => void,
|
|
) {
|
|
this.fetchImage = fetchImage;
|
|
this.onPoolUpdated = onPoolUpdated;
|
|
}
|
|
|
|
getImages(): ImagesMap {
|
|
return {...this.cache};
|
|
}
|
|
|
|
fetchImages(ids: Array<string>) {
|
|
for (const id of ids) {
|
|
if (!this.cache[id] && !this.requested[id]) {
|
|
this.requested[id] = true;
|
|
|
|
if (this.inFlightRequests < maxInflightRequests) {
|
|
this.inFlightRequests++;
|
|
this.fetchImage(id);
|
|
} else {
|
|
this.queued.unshift(id);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
clear() {
|
|
this.cache = {};
|
|
this.requested = {};
|
|
}
|
|
|
|
_fetchCompleted(image: ImageData): void {
|
|
this.cache[image.imageId] = image;
|
|
delete this.requested[image.imageId];
|
|
|
|
if (this.queued.length > 0) {
|
|
const popped = this.queued.pop() as string;
|
|
this.fetchImage(popped);
|
|
} else {
|
|
this.inFlightRequests--;
|
|
}
|
|
|
|
if (!this.updateNotificationScheduled) {
|
|
this.updateNotificationScheduled = true;
|
|
window.setTimeout(this._notify, 1000);
|
|
}
|
|
}
|
|
|
|
_notify = () => {
|
|
this.updateNotificationScheduled = false;
|
|
this.onPoolUpdated(this.getImages());
|
|
};
|
|
}
|