import { EWinInsertType } from '../../interfaces'; import { VirtualTimeObj } from '../../VirtualTimeObj'; export interface ITimeWindowItem { ts: number; data?: T; } export interface ITimeWindowSetStatOptions { timeWindow: TimeWindow; winInsertType: EWinInsertType; added?: ITimeWindowItem; removed?: ITimeWindowItem[]; } export interface ITimeWindowConstructorOptions { /** * Отличительное имя окна для логирования */ winName: string; /** * Ключ окна, когда оно используется в объекте KeyedTimeWindow */ key?: string | number; /** * Ширина окна, мс */ widthMillis: number; /** * Окно работает на основе "виртуального" времени, что важно в режиме тестирования на исторических данных. * Используется только для вычисления времени устаревания событий в окне, в функции this.removeExpired() */ virtualTimeObj?: VirtualTimeObj; /** * Периодичность очистки окна от устаревших событий. * Если 0, то очистка происходит при добавлении каждого события */ removeExpiredIntervalMillis?: number; /** * Кастомная функция для инициализации статистики. */ initStat?: (_timeWindow: TimeWindow) => void; /** * Опциональная функция для записи статистики при добавлении(удалении) событий в окно. * Если передана, то подменит собой метод this.setStat() */ setStat?: (_setStatOptions: ITimeWindowSetStatOptions) => void; /** * Кастомная функция для получения статистики. Она подменит метод окна this.getStat() * Если не передана, то метод this.getStat() будет возвращать свойство окна stat */ getStat?: (timeWindow: TimeWindow, ...args: any[]) => any; /** * Первое событие, которое можно передать в момент создания экземпляра класса. * Это может быть удобно, когда окна создаются по мере поступления событий определенного класса. */ item?: ITimeWindowItem; } /** * ВРЕМЕННОЕ́ ОКНО для множества событий одного типа. * События обязаны содержать метку времени. * Они поступают в окно с помощью метода add() и выбывают (при вызове метода this.removeExpired()) * после того, как устареют (когда их метка времени сдвинется вправо за границу окна) * * Метод this.removeExpired(), удаляющий события, оказавшиеся за пределами окна (слева) * вызывается либо периодически, через заданный интервал "this.removeExpiredIntervalMillis", * либо при каждом новом событии (если this.removeExpiredIntervalMillis не задан) */ export declare class TimeWindow { options: ITimeWindowConstructorOptions; /** * Собственно - ОКНО - упорядоченный по времени массив событий */ win: ITimeWindowItem[]; /** * Либо временная метка последнего события в окне. * Либо, в случае, когда передан virtualTimeObj и очистка окна происходит периодически на основе виртуального времени, * в этом свойстве хранится время последней очистки. Это позволяет более точно контролировать процесс очистки устаревши событий. */ lastTs: number; /** * expireTs - время в окне, левее которого события устарели. * Используется для быстрого поиска индекса первого устаревшего события * с помощью функции findIndexOfNearestSmaller() */ expireTs: number; /** * Ширина окна, мс */ widthMillis: number; /** * Флаг, устанавливаемый при создании экземпляра класса * и определяющий режим работы очистки окна от устаревших событий: * Если true - очистка производится при поступлении каждого нового события, опираясь на его временную метку. * Если false - очистка будет производиться периодически, опираясь на виртуальное время. * (В последнем случае, значит, гарантировано были переданы virtualTimeObj и ненулевой параметр removeExpiredIntervalMillis) */ readonly removeExpiredOnEveryEvents: boolean; /** * Место хранения статистики. Заполнение этого свойства должно быть описано самостоятельно, в функции setStat, * передаваемой в опциях при создании экземпляра класса */ stat: S; /** * Метод класса, заполняющий статистику. По умолчанию не делает ничего. Но если при создании экземпляра класса * в опциях передано свойство setStat (функция), оно замещает метод класса и управление заполнением статистики * передается этой кастомной функции. */ setStat: (_arg: ITimeWindowSetStatOptions) => void; /** * Метод класса, возвращающий статистику. По умолчанию возвращает свойство класса this.stat. * Но если при создании экземпляра класса в опциях передано свойство getStat (функция), * оно замещает метод класса this.getStat и управление передается этой кастомной функции. */ getStat: (timeWindow: TimeWindow, ...args: any[]) => any; _removeExpiredTimer: any; constructor(options: ITimeWindowConstructorOptions); /** * Удаление (устаревших) элементов окна, оказавшихся за пределами левой границы. * Функция вызывается * 1) либо при поступлении очередного события, опираясь на его метку времени, * 2) либо по таймауту, опираясь на виртуальное время. * Режим работы определяется наличием опции virtualTimeObj и значением опции removeExpiredIntervalMillis * при создании экземпляра класса. Если есть virtualTimeObj и removeExpiredIntervalMillis > 0 запускается режим 2. * Кроме этого метод может вызываться извне. Например, в коллекции именованных временных окон можно периодически совершать * обход окон и совершать очистку устаревших событий из них. */ removeExpired(virtualTs?: number, destructureIt?: boolean): ITimeWindowItem[]; /** * Добавление нового события в окно * * Новое событие добавляется с помощью метода this.add() в окно НА СВОЕ МЕСТО * (его временная метка будет не меньше события слева и не больше события справа) * Тут же: * - выставляются свойства this.lastTs и this.expireTs * - вызывается метод this.setStat() * - вызывается метод this.removeExpired(), если взведен флаг this.removeExpiredOnEveryEvents. * Возвращает только что добавленное событие или null. */ add(item: ITimeWindowItem): ITimeWindowItem | null; /** * Динамическое изменение ширины окна. * Сразу же вызывается метод удаления устаревших событий. */ setWidth(widthMillis: number): void; /** * очистка временного окна */ clear(): void; destroy(): void; } //# sourceMappingURL=TimeWindow.d.ts.map