UNPKG

split-time

Version:

A JavaScript library for measuring FCP, LCP. Report real user measurements to tracking tool.

77 lines 2.72 kB
import EntryList from './entry-list'; const INTERVAL = 100; class TaskQueue { constructor(registeredObservers, processedEntries) { this.registeredObservers = registeredObservers || new Set(); this.processedEntries = processedEntries || new Set(); this.performanceEntries = new Set(); this.timerId = null; } add(observer) { this.registeredObservers.add(observer); if (this.registeredObservers.size === 1) { this.observe(); } } remove(observer) { this.registeredObservers.delete(observer); if (!this.registeredObservers.size) { this.disconnect(); } } disconnect() { self.clearInterval(this.timerId); this.timerId = null; } // call callbacks function when CPU idle idleCallback() { } // Polling observe() { this.timerId = self.setInterval(this.processEntries.bind(this), INTERVAL); } processEntries() { const entries = this.getNewEntries(); entries.forEach((entry) => { const { entryType } = entry; const observers = this.getObserversForType(this.registeredObservers, entryType); // Add the entry to observer buffer observers.forEach((observer) => { observer.buffer.add(entry); }); // Mark the entry as processed this.processedEntries.add(entry); }); // Queue task to process all observer buffers // TODO: wait for CPU idle const task = () => this.registeredObservers.forEach(this.processBuffer); if ('requestAnimationFrame' in self) { self.requestAnimationFrame(task); } else { self.setTimeout(task, 0); } } processBuffer(observer) { // if use native observer, call callback function when native observers call if (observer.useNative) return; const entries = Array.from(observer.buffer); const entryList = new EntryList(entries); observer.buffer.clear(); if (entries.length && observer.callback) { observer.callback.call(undefined, entryList, observer); } } getNewEntries() { const entries = self.performance.getEntries(); const totalEntries = [...entries, ...this.performanceEntries]; return totalEntries.filter((entry) => !this.processedEntries.has(entry)); } getObserversForType(observers, type) { return Array.from(observers) .filter((observer) => observer.unsupportedEntryTypes.some((t) => t === type)); } } export default TaskQueue; //# sourceMappingURL=task-queue.js.map