diff --git a/lib/web/tty_playback.go b/lib/web/tty_playback.go index 76c456a4a7010..d3ec7a08b1174 100644 --- a/lib/web/tty_playback.go +++ b/lib/web/tty_playback.go @@ -73,6 +73,11 @@ func (h *Handler) sessionLengthHandle( return nil, trace.Wrap(err) } + type response struct { + Duration int64 `json:"durationMs"` + RecordingType string `json:"recordingType"` + } + evts, errs := clt.StreamSessionEvents(ctx, session.ID(sID), 0) for { select { @@ -82,13 +87,14 @@ func (h *Handler) sessionLengthHandle( if !ok { return nil, trace.NotFound("could not find end event for session %v", sID) } + switch evt := evt.(type) { case *events.SessionEnd: - return map[string]any{"durationMs": evt.EndTime.Sub(evt.StartTime).Milliseconds()}, nil + return response{evt.EndTime.Sub(evt.StartTime).Milliseconds(), "ssh"}, nil case *events.WindowsDesktopSessionEnd: - return map[string]any{"durationMs": evt.EndTime.Sub(evt.StartTime).Milliseconds()}, nil + return response{evt.EndTime.Sub(evt.StartTime).Milliseconds(), "desktop"}, nil case *events.DatabaseSessionEnd: - return map[string]any{"durationMs": evt.EndTime.Sub(evt.StartTime).Milliseconds()}, nil + return response{evt.EndTime.Sub(evt.StartTime).Milliseconds(), "database"}, nil } } } diff --git a/web/packages/teleport/src/Player/Player.tsx b/web/packages/teleport/src/Player/Player.tsx index 608abef2d33cf..57b223d99224f 100644 --- a/web/packages/teleport/src/Player/Player.tsx +++ b/web/packages/teleport/src/Player/Player.tsx @@ -64,8 +64,9 @@ export function Player() { const validRecordingType = validRecordingTypes.includes(recordingType); const durationMs = Number(getUrlParameter('durationMs', search)); - const shouldFetchSessionDuration = - validRecordingType && (!Number.isInteger(durationMs) || durationMs <= 0); + const validDuration = Number.isInteger(durationMs) && durationMs > 0; + + const shouldFetchSessionDuration = !validRecordingType || !validDuration; useEffect(() => { if (shouldFetchSessionDuration) { @@ -75,25 +76,12 @@ export function Player() { const combinedAttempt = shouldFetchSessionDuration ? fetchDurationAttempt - : makeSuccessAttempt({ durationMs }); + : makeSuccessAttempt({ durationMs, recordingType }); function onLogout() { session.logout(); } - if (!validRecordingType) { - return ( - - - - Invalid query parameter recordingType: {recordingType}, should be - one of {validRecordingTypes.join(', ')}. - - - - ); - } - if ( combinedAttempt.status === '' || combinedAttempt.status === 'processing' @@ -119,6 +107,20 @@ export function Player() { ); } + if (!validRecordingTypes.includes(combinedAttempt.data.recordingType)) { + return ( + + + + Invalid query parameter recordingType:{' '} + {combinedAttempt.data.recordingType}, should be one of{' '} + {validRecordingTypes.join(', ')}. + + + + ); + } + return ( @@ -134,7 +136,7 @@ export function Player() { position: 'relative', }} > - {recordingType === 'desktop' ? ( + {combinedAttempt.data.recordingType === 'desktop' ? ( { + ): Promise<{ durationMs: number; recordingType: string }> { return api.get(cfg.getSessionDurationUrl(clusterId, sessionId)); } }