mattermost-redux
Version:
Common code (API client, Redux stores, logic, utility functions) for building a Mattermost client
76 lines (75 loc) • 3.5 kB
TypeScript
export type Comparator = (a: any, b: any) => boolean;
/**
* A DataLoader is an object that can be used to batch requests for fetching objects from the server for performance
* reasons.
*/
declare abstract class DataLoader<Identifier, Result = unknown> {
protected readonly fetchBatch: (identifiers: Identifier[]) => Result;
private readonly maxBatchSize;
private readonly comparator?;
protected readonly pendingIdentifiers: Set<Identifier>;
constructor(args: {
fetchBatch: (identifiers: Identifier[]) => Result;
maxBatchSize: number;
comparator?: Comparator;
});
queue(identifiersToLoad: Identifier[]): void;
/**
* prepareBatch removes an array of identifiers for data to be loaded from pendingIdentifiers and returns it. If
* pendingIdentifiers contains more than maxBatchSize identifiers, then only that many are returned, but if it
* contains fewer than that, all of the identifiers are returned and pendingIdentifiers is cleared.
*/
protected prepareBatch(): {
identifiers: Identifier[];
moreToLoad: boolean;
};
/**
* isBusy is a method for testing which returns true if the DataLoader is waiting to request or receive any data.
*/
isBusy(): boolean;
}
/**
* A BackgroundDataLoader is an object that can be used to batch requests for fetching objects from the server. Instead
* of requesting data immediately, it will periodically check if any objects need to be requested from the server.
*
* It's intended to be used for loading low priority data such as information needed in response to WebSocket messages
* that the user won't see immediately.
*/
export declare class BackgroundDataLoader<Identifier, Result = unknown> extends DataLoader<Identifier, Result> {
private intervalId;
startIntervalIfNeeded(ms: number): void;
stopInterval(): void;
fetchBatchNow(): void;
isBusy(): boolean;
}
/**
* A DelayedDataLoader is an object that can be used to batch requests for fetching objects from the server. Instead of
* requesting data immediately, it will wait for an amount of time and then send a request to the server for all of
* the data which would've been requested during that time.
*
* More specifically, when queue is first called, a timer will be started. Until that timer expires, any other
* calls to queue will have the provided identifiers added to the ones from the initial call. When the timer
* finally expires, the request will be sent to the server to fetch that data. After that, the timer will be reset and
* the next call to queue will start a new one.
*
* DelayedDataLoader is intended to be used for loading data for components which are unaware of each other and may appear
* in different places in the UI from each other which could otherwise send repeated requests for the same or similar
* data as one another.
*/
export declare class DelayedDataLoader<Identifier> extends DataLoader<Identifier, Promise<unknown>> {
private readonly wait;
private timeoutId;
private timeoutCallbacks;
constructor(args: {
fetchBatch: (identifiers: Identifier[]) => Promise<unknown>;
maxBatchSize: number;
wait: number;
comparator?: Comparator;
});
queue(identifiersToLoad: Identifier[]): void;
queueAndWait(identifiersToLoad: Identifier[]): Promise<void>;
private startTimeoutIfNeeded;
private resolveCompletedCallbacks;
isBusy(): boolean;
}
export {};