UNPKG

@lynx-js/web-core

Version:

This is an internal experimental package, do not use

86 lines 3.67 kB
// Copyright 2023 The Lynx Authors. All rights reserved. // Licensed under the Apache License Version 2.0 that can be found in the // LICENSE file in the root directory of this source tree. import { dispatchLynxViewEventEndpoint, markTimingEndpoint, postTimingFlagsEndpoint, } from '../../endpoints.js'; const ListenerKeys = { onSetup: 'lynx.performance.timing.onSetup', onUpdate: 'lynx.performance.timing.onUpdate', }; export function createTimingSystem(mainThreadRpc, uiThreadRpc) { let isFp = true; const setupTiming = {}; const pipelineIdToTiming = new Map(); const pipelineIdToTimingFlags = new Map(); const dispatchLynxViewEvent = uiThreadRpc.createCall(dispatchLynxViewEventEndpoint); let commonTimingFlags = []; function markTimingInternal(markTimingRecords) { for (let { timingKey, pipelineId, timeStamp } of markTimingRecords) { if (!timeStamp) timeStamp = performance.now() + performance.timeOrigin; if (!pipelineId) { setupTiming[timingKey] = timeStamp; continue; } if (!pipelineIdToTiming.has(pipelineId)) { pipelineIdToTiming.set(pipelineId, {}); } const timingInfo = pipelineIdToTiming.get(pipelineId); timingInfo[timingKey] = timeStamp; } } const registerGlobalEmitter = (globalEventEmitter) => { mainThreadRpc.registerHandler(postTimingFlagsEndpoint, (timingFlags, pipelineId) => { if (!pipelineId) { commonTimingFlags = commonTimingFlags.concat(timingFlags); } else timingFlags = timingFlags.concat(commonTimingFlags); if (isFp) { const timingInfo = { extra_timing: {}, setup_timing: setupTiming, update_timings: {}, metrics: {}, has_reload: false, thread_strategy: 0, url: '', }; globalEventEmitter.emit(ListenerKeys.onSetup, [timingInfo]); dispatchLynxViewEvent('timing', setupTiming); } else { const timings = (pipelineId ? pipelineIdToTiming.get(pipelineId) : undefined) ?? {}; const flags = [ ...timingFlags, ...(pipelineIdToTimingFlags.get(pipelineId) ?? []), ]; const timingInfo = { extra_timing: {}, setup_timing: {}, update_timings: Object.fromEntries([...flags].map(flag => [flag, timings])), metrics: {}, has_reload: false, thread_strategy: 0, url: '', }; globalEventEmitter.emit(ListenerKeys.onUpdate, [timingInfo]); dispatchLynxViewEvent('timing', timings); } if (pipelineId) { pipelineIdToTimingFlags.delete(pipelineId); pipelineIdToTiming.delete(pipelineId); } if (isFp) { isFp = false; } }); }; mainThreadRpc.registerHandler(markTimingEndpoint, markTimingInternal); uiThreadRpc.registerHandler(markTimingEndpoint, markTimingInternal); return { markTimingInternal: (timingKey, pipelineId, timeStamp) => markTimingInternal([{ timingKey, pipelineId, timeStamp }]), registerGlobalEmitter, pipelineIdToTimingFlags, }; } //# sourceMappingURL=createTimingSystem.js.map