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