Skip to content

Commit 0fa37eb

Browse files
Log renderer startup timings
1 parent 89f84e2 commit 0fa37eb

1 file changed

Lines changed: 47 additions & 13 deletions

File tree

apps/app/src/react/App.tsx

Lines changed: 47 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,18 @@ if (process.env.NODE_ENV === 'development' && ENABLE_WHY_DID_YOU_RENDER) {
7070
}
7171

7272
export const App = observer(function App() {
73+
const startupStartRef = useRef<number>(performance.now())
74+
const loggedFirstProject = useRef(false)
75+
const loggedFirstAppData = useRef(false)
76+
const logStartup = useCallback((label: string, data?: Record<string, unknown>) => {
77+
const elapsedMs = Math.round(performance.now() - startupStartRef.current)
78+
if (data) {
79+
console.info('[startup]', label, { elapsedMs, ...data })
80+
} else {
81+
console.info('[startup]', label, { elapsedMs })
82+
}
83+
}, [])
84+
7385
const [project, setProject] = useState<Project>()
7486
const [sorensenInitialized, setSorensenInitialized] = useState(false)
7587
const { enqueueSnackbar, closeSnackbar } = useSnackbar()
@@ -107,8 +119,13 @@ export const App = observer(function App() {
107119
[enqueueSnackbar, logger, serverAPI]
108120
)
109121

122+
useEffect(() => {
123+
logStartup('App mounted')
124+
}, [logStartup])
125+
110126
// Handle IPC-messages from server
111127
useEffect(() => {
128+
logStartup('RealtimeDataProvider init')
112129
const ipcClient = new RealtimeDataProvider(logger, {
113130
systemMessage: (messageStr: string, options: SystemMessageOptions) => {
114131
messageStr = messageStr.replace(/\n/g, '<br>')
@@ -149,10 +166,18 @@ export const App = observer(function App() {
149166
updateAppData: (appData: AppData) => {
150167
store.appStore.update(appData)
151168
store.rundownsStore.update(appData.rundowns)
169+
if (!loggedFirstAppData.current) {
170+
loggedFirstAppData.current = true
171+
logStartup('Received initial appData')
172+
}
152173
},
153174
updateProject: (project: Project) => {
154175
setProject(project)
155176
store.projectStore.update(project)
177+
if (!loggedFirstProject.current) {
178+
loggedFirstProject.current = true
179+
logStartup('Received initial project')
180+
}
156181
},
157182
updatePeripheralTriggers: (peripheralTriggers: ActiveTriggers) => {
158183
triggers.setPeripheralTriggers(peripheralTriggers)
@@ -174,7 +199,7 @@ export const App = observer(function App() {
174199
return () => {
175200
ipcClient.destroy()
176201
}
177-
}, [enqueueSnackbar, closeSnackbar, triggers, logger, handleError, serverAPI])
202+
}, [enqueueSnackbar, closeSnackbar, triggers, logger, handleError, serverAPI, logStartup])
178203

179204
const errorHandlerContextValue = useMemo(() => {
180205
return {
@@ -184,7 +209,16 @@ export const App = observer(function App() {
184209

185210
useEffect(() => {
186211
// Ask backend for the data once ready:
187-
serverAPI.triggerSendAll().catch(handleError)
212+
logStartup('triggerSendAll start')
213+
serverAPI
214+
.triggerSendAll()
215+
.then(() => {
216+
logStartup('triggerSendAll resolved')
217+
})
218+
.catch((error) => {
219+
logStartup('triggerSendAll failed')
220+
handleError(error)
221+
})
188222

189223
// @ts-expect-error hack:
190224
window.makeDevData = () => {
@@ -200,7 +234,7 @@ export const App = observer(function App() {
200234
}
201235
})
202236
}
203-
}, [handleError, serverAPI])
237+
}, [handleError, serverAPI, logStartup])
204238

205239
useEffect(() => {
206240
window.addEventListener('error', handleError)
@@ -331,12 +365,14 @@ export const App = observer(function App() {
331365

332366
/* eslint-disable @typescript-eslint/unbound-method */
333367
useEffect(() => {
368+
logStartup('Sorensen init start')
334369
Sorensen.init()
335370
.then(() => {
336371
setSorensenInitialized(true)
372+
logStartup('Sorensen init resolved')
337373
})
338374
.catch(logger.error)
339-
}, [logger.error, serverAPI])
375+
}, [logger.error, serverAPI, logStartup])
340376
/* eslint-enable @typescript-eslint/unbound-method */
341377

342378
const appStore = store.appStore
@@ -641,13 +677,7 @@ export const App = observer(function App() {
641677
true
642678
)
643679

644-
if (!project || !sorensenInitialized) {
645-
return (
646-
<div className="app-loading">
647-
<Spinner heavyOperation />
648-
</div>
649-
)
650-
}
680+
const hasProject = Boolean(project)
651681

652682
const handleClickResizer: React.MouseEventHandler<HTMLDivElement> = (e) => {
653683
const tarEl = e.target as HTMLElement
@@ -662,7 +692,7 @@ export const App = observer(function App() {
662692
<HotkeyContext.Provider value={hotkeyContext}>
663693
<LoggerContext.Provider value={logger}>
664694
<IPCServerContext.Provider value={serverAPI}>
665-
<ProjectContext.Provider value={project}>
695+
<ProjectContext.Provider value={project ?? ({} as Project)}>
666696
<ErrorHandlerContext.Provider value={errorHandlerContextValue}>
667697
<div className="app" onClick={handleClickAnywhere}>
668698
<ErrorBoundary>
@@ -691,7 +721,11 @@ export const App = observer(function App() {
691721
}
692722
</ErrorBoundary>
693723

694-
{store.guiStore.isNewRundownSelected() ? (
724+
{!hasProject ? (
725+
<div className="app-loading">
726+
<Spinner heavyOperation />
727+
</div>
728+
) : store.guiStore.isNewRundownSelected() ? (
695729
<ErrorBoundary>
696730
<NewRundownPage />
697731
</ErrorBoundary>

0 commit comments

Comments
 (0)