TelegramPWA/src/api/gramjs/updates/apiUpdateEmitter.ts

51 lines
1.3 KiB
TypeScript

import type { ApiUpdate, OnApiUpdate } from '../../types';
import { API_THROTTLE_RESET_UPDATES, API_UPDATE_THROTTLE } from '../../../config';
import { throttle, throttleWithTickEnd } from '../../../util/schedulers';
let onUpdate: OnApiUpdate;
export function init(_onUpdate: OnApiUpdate) {
onUpdate = _onUpdate;
}
export function sendApiUpdate(update: ApiUpdate) {
queueUpdate(update);
}
export function sendImmediateApiUpdate(update: ApiUpdate) {
onUpdate(update);
}
const flushUpdatesOnTickEnd = throttleWithTickEnd(flushUpdates);
let flushUpdatesThrottled: typeof flushUpdatesOnTickEnd | undefined;
let currentThrottleId: number | undefined;
let pendingUpdates: ApiUpdate[] | undefined;
function queueUpdate(update: ApiUpdate) {
if (!pendingUpdates) {
pendingUpdates = [update];
} else {
pendingUpdates.push(update);
}
if (!flushUpdatesThrottled || API_THROTTLE_RESET_UPDATES.has(update['@type'])) {
flushUpdatesThrottled = throttle(flushUpdatesOnTickEnd, API_UPDATE_THROTTLE, true);
currentThrottleId = Math.random();
}
flushUpdatesThrottled(currentThrottleId!);
}
function flushUpdates(throttleId: number) {
if (!pendingUpdates || throttleId !== currentThrottleId) {
return;
}
const currentUpdates = pendingUpdates!;
pendingUpdates = undefined;
currentUpdates.forEach(onUpdate);
}