import { AnyAction } from 'redux'; import MiddlewareRegistry from '../redux/MiddlewareRegistry'; import { inIframe } from '../util/iframeUtils'; import { APP_WILL_MOUNT, APP_WILL_UNMOUNT } from './actionTypes'; import logger from './logger'; /** * Experimental feature to monitor CPU pressure. */ let pressureObserver: typeof window.PressureObserver; /** * Middleware which intercepts app actions to handle changes to the related state. * * @param {Store} store - The redux store. * @returns {Function} */ MiddlewareRegistry.register(() => (next: Function) => (action: AnyAction) => { switch (action.type) { case APP_WILL_MOUNT: { // Disable it inside an iframe until Google fixes the origin trial for 3rd party sources: // https://bugs.chromium.org/p/chromium/issues/detail?id=1504167 if (!inIframe() && 'PressureObserver' in globalThis) { pressureObserver = new window.PressureObserver( (records: typeof window.PressureRecord) => { logger.info('Compute pressure state changed:', JSON.stringify(records)); if (typeof APP !== 'undefined') { APP.API.notifyComputePressureChanged(records); } }, { sampleRate: 1 } ); try { pressureObserver .observe('cpu') .catch((e: any) => logger.error('CPU pressure observer failed to start', e)); } catch (e: any) { logger.error('CPU pressure observer failed to start', e); } } break; } case APP_WILL_UNMOUNT: { if (pressureObserver) { pressureObserver.unobserve('cpu'); } break; } } return next(action); });