diff --git a/lib/web/tty_playback.go b/lib/web/tty_playback.go
index 838c1b45d1efd..87b13a13b312e 100644
--- a/lib/web/tty_playback.go
+++ b/lib/web/tty_playback.go
@@ -74,6 +74,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 {
@@ -83,13 +88,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));
}
}