@@ -54,7 +54,7 @@ import { getSession } from './utils/session.server.ts'
5454import { TeamProvider , useTeam } from './utils/team-provider.tsx'
5555import { getTheme } from './utils/theme.server.ts'
5656import { useTheme } from './utils/theme.tsx'
57- import { getServerTimeHeader } from './utils/timing.server.ts'
57+ import { getServerTimeHeader , time , withTimeout } from './utils/timing.server.ts'
5858import { getUserInfo } from './utils/user-info.server.ts'
5959
6060export const handle : KCDHandle & { id : string } = {
@@ -116,8 +116,15 @@ export const links: LinksFunction = () => {
116116 ]
117117}
118118
119+ const PODCAST_LINKS_FALLBACK = {
120+ chats : { latestSeasonNumber : null , latestSeasonPath : '/chats' } ,
121+ calls : { latestSeasonNumber : null , latestSeasonPath : '/calls' } ,
122+ } as const
123+
119124export async function loader ( { request } : Route . LoaderArgs ) {
120125 const timings = { }
126+ const loaderStart = performance . now ( )
127+ const podcastLinksAbortController = new AbortController ( )
121128 const session = await getSession ( request )
122129 const [
123130 user ,
@@ -130,10 +137,26 @@ export async function loader({ request }: Route.LoaderArgs) {
130137 getClientSession ( request , session . getUser ( { timings } ) ) ,
131138 getLoginInfoSession ( request ) ,
132139 getInstanceInfo ( ) . then ( ( i ) => i . primaryInstance ) ,
133- getLatestPodcastSeasonLinks ( { request, timings } ) . catch ( ( ) => ( {
134- chats : { latestSeasonNumber : null , latestSeasonPath : '/chats' } ,
135- calls : { latestSeasonNumber : null , latestSeasonPath : '/calls' } ,
136- } ) ) ,
140+ time (
141+ withTimeout (
142+ getLatestPodcastSeasonLinks ( {
143+ request,
144+ timings,
145+ signal : podcastLinksAbortController . signal ,
146+ } ) ,
147+ {
148+ timeoutMs : 2000 ,
149+ fallback : PODCAST_LINKS_FALLBACK ,
150+ label : 'root:podcast-season-links' ,
151+ onTimeout : ( ) => podcastLinksAbortController . abort ( ) ,
152+ } ,
153+ ) ,
154+ {
155+ timings,
156+ type : 'root:podcast-season-links' ,
157+ desc : 'podcast nav links (Simplecast + Transistor)' ,
158+ } ,
159+ ) ,
137160 ] )
138161
139162 const randomFooterImageKeys = Object . keys ( illustrationImages )
@@ -170,7 +193,15 @@ export async function loader({ request }: Route.LoaderArgs) {
170193 await session . getHeaders ( headers )
171194 await clientSession . getHeaders ( headers )
172195 await loginInfoSession . getHeaders ( headers )
173- headers . append ( 'Server-Timing' , getServerTimeHeader ( timings ) )
196+ // Add root loader total for production diagnostics (visible in Server-Timing)
197+ const rootLoaderTotal = performance . now ( ) - loaderStart
198+ const rootTimings = {
199+ ...timings ,
200+ 'root:loader' : [
201+ { type : 'root:loader' , desc : 'root loader total' , time : rootLoaderTotal } ,
202+ ] ,
203+ }
204+ headers . append ( 'Server-Timing' , getServerTimeHeader ( rootTimings ) )
174205
175206 return json ( data , { headers } )
176207}
0 commit comments