Skip to content

Comments

T-Timers pause time#77

Draft
rjmunro wants to merge 4 commits intorjmunro/t-timers-expectedfrom
rjmunro/t-timers-pause-time
Draft

T-Timers pause time#77
rjmunro wants to merge 4 commits intorjmunro/t-timers-expectedfrom
rjmunro/t-timers-pause-time

Conversation

@rjmunro
Copy link
Collaborator

@rjmunro rjmunro commented Feb 19, 2026

About the Contributor

This pull request is posted by SuperflyTV on behalf of the BBC.

Type of Contribution

This is a Feature

Current Behavior

When a part starts "pushing" and progress through the timeline is paused, the T-Timer estimateState is set to paused on the server and the update is propogated to the clients through the database and meteors standard methods.

New Behavior

Information about when pushing will start and therefore a pause is needed, is included in the estimateState, so the client is able to pause itself, and no update needs to be sent. The pauseTime is a time of day, not a duration. The remaining duration is therefore zeroTime - pauseTime.

This also means a regular T-Timer can have a pause time if you know that you want to hold the clock at a certain point in the future. If you set zeroTime and pauseTime to the same value, the clock will stop at zero, so we could maybe remove the stopAtZero feature.

Testing

  • I have added one or more unit tests for this PR
  • I have updated the relevant unit tests
  • No unit test changes are needed for this PR

Affected areas

Time Frame

Other Information

Status

  • PR is ready to be reviewed.
  • The functionality has been tested by the author.
  • Relevant unit tests has been added / updated.
  • Relevant documentation (code comments, system documentation) has been added / updated.

Add optional pauseTime field to TimerState type to indicate when a
timer should automatically pause (when current part ends and overrun begins).

Benefits:
- Client can handle running→paused transition locally without server update
- Reduces latency in state transitions
- Server still triggers recalculation on Take/part changes
- More declarative timing ("pause at this time" vs "set paused now")

Implementation:
- When not pushing: pauseTime = now + currentPartRemainingTime
- When already pushing: pauseTime = null
- Client should display timer as paused when now >= pauseTime
Document the client-side logic for rendering timer states with pauseTime support:
- paused === true: use frozen duration
- pauseTime && now >= pauseTime: use zeroTime - pauseTime (auto-pause)
- otherwise: use zeroTime - now (running normally)
Add calculateTimerDuration() function to calculate current timer duration
from TimerState, handling all three cases:
- Manually paused or already pushing
- Auto-pause at overrun (pauseTime)
- Running normally

Clients can import and use:
import { calculateTimerDuration } from '@sofie-automation/corelib/dist/dataModel/RundownPlaylist'
const duration = calculateTimerDuration(timer.state, getCurrentTime())
@rjmunro rjmunro force-pushed the rjmunro/t-timers-pause-time branch from 4bede23 to 6bd8b20 Compare February 20, 2026 10:55
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant