Skip to content

chore: shared rundown state cache resolution helpers#1695

Merged
justandras merged 17 commits intoSofie-Automation:mainfrom
SuperFlyTV:dev/refactor/shared-rundown-state-cache-resolution
Apr 9, 2026
Merged

chore: shared rundown state cache resolution helpers#1695
justandras merged 17 commits intoSofie-Automation:mainfrom
SuperFlyTV:dev/refactor/shared-rundown-state-cache-resolution

Conversation

@justandras
Copy link
Copy Markdown
Member

@justandras justandras commented Mar 19, 2026

About the Contributor

This pull request is posted on behalf of the BBC and the CBC.

Type of Contribution

This is a: Code improvement

Current Behavior

Rundown/segment state resolution logic used by the web UI (especially quick-loop / loop-related timing and resolved segment simulation helpers) was implemented across multiple layers/modules, requiring wrappers and duplications between core playout logic and the web UI/meteor side.

New Behavior

Shared rundown state resolution helpers are centralized in packages/corelib/src/playout/stateCacheResolver.ts, and the web UI now imports and uses the shared exported functions from corelib (eg. loop status helpers like isLoopRunning, quick-loop helpers like deduplicatePartInstancesForQuickLoop, and shared class-name helpers like getSourceLayerClassName).

Additionally, UI-extended/core-used type contracts (eg. PartExtended, PartInstanceLimited) have been moved into corelib’s dataModel so both core and UI use the same TypeScript types.

This allows the helpers to be used in other packages like the LSG.

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

  • Web UI playout / rundown segment resolution and simulation.
  • Web UI imports/types for extended and UI part/instance models (moved into corelib data model).
  • Worker/unit test coverage for playout, ingest, and related subsystems (due to the shared type/module refactor).

Time Frame

  • We intend to finish the development on this feature in two weeks time.

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.

@justandras justandras self-assigned this Mar 19, 2026
@justandras justandras added Contribution from BBC Contributions sponsored by BBC (bbc.co.uk) Contribution from CBC/Radio-Canada Contributions sponsored by CBC/Radio-Canada (cbc.radio-canada.ca) labels Mar 19, 2026
@coderabbitai
Copy link
Copy Markdown

coderabbitai bot commented Mar 19, 2026

Important

Review skipped

Too many files!

This PR contains 173 files, which is 23 over the limit of 150.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 28f690d3-ae19-4496-a7e8-cfdc0781bbf9

📥 Commits

Reviewing files that changed from the base of the PR and between 7ef4508 and f9b827b.

📒 Files selected for processing (173)
  • meteor/__mocks__/defaultCollectionObjects.ts
  • meteor/__mocks__/helpers/database.ts
  • meteor/server/__tests__/cronjobs.test.ts
  • meteor/server/api/rest/v1/ingest.ts
  • meteor/server/collections/rundown.ts
  • meteor/server/publications/ingestStatus/reactiveContentCache.ts
  • meteor/server/publications/segmentPartNotesUI/reactiveContentCache.ts
  • meteor/server/publications/showStyleUI.ts
  • meteor/server/publications/studioUI.ts
  • packages/corelib/src/dataModel/Part.ts
  • packages/corelib/src/dataModel/PartInstance.ts
  • packages/corelib/src/dataModel/Piece.ts
  • packages/corelib/src/dataModel/Segment.ts
  • packages/corelib/src/dataModel/ShowStyleBase.ts
  • packages/corelib/src/dataModel/Studio.ts
  • packages/corelib/src/playout/stateCacheResolver.ts
  • packages/corelib/src/playout/stateCacheResolverTypes.ts
  • packages/corelib/src/protectedString.ts
  • packages/job-worker/src/__mocks__/partinstance.ts
  • packages/job-worker/src/blueprints/__tests__/context-events.test.ts
  • packages/job-worker/src/playout/__tests__/infinites.test.ts
  • packages/job-worker/src/playout/lookahead/__tests__/util.test.ts
  • packages/meteor-lib/src/api/pubsub.ts
  • packages/meteor-lib/src/api/showStyles.ts
  • packages/meteor-lib/src/api/studios.ts
  • packages/meteor-lib/src/collections/PartInstances.ts
  • packages/meteor-lib/src/triggers/RundownViewEventBus.ts
  • packages/meteor-lib/src/uiTypes/OutputLayer.ts
  • packages/meteor-lib/src/uiTypes/Piece.ts
  • packages/meteor-lib/src/uiTypes/SourceLayer.ts
  • packages/webui/src/__mocks__/defaultCollectionObjects.ts
  • packages/webui/src/__mocks__/helpers/database.ts
  • packages/webui/src/client/collections/index.ts
  • packages/webui/src/client/lib/RundownResolver.ts
  • packages/webui/src/client/lib/SplitPreviewBox.tsx
  • packages/webui/src/client/lib/__tests__/rundown.test.ts
  • packages/webui/src/client/lib/__tests__/rundownTiming.test.ts
  • packages/webui/src/client/lib/rundown.ts
  • packages/webui/src/client/lib/rundownLayouts.ts
  • packages/webui/src/client/lib/rundownPlaylistUtil.ts
  • packages/webui/src/client/lib/rundownTiming.ts
  • packages/webui/src/client/lib/shelf.ts
  • packages/webui/src/client/lib/triggers/TriggersHandler.tsx
  • packages/webui/src/client/lib/ui/pieceUiClassNames.ts
  • packages/webui/src/client/ui/AfterBroadcastForm.tsx
  • packages/webui/src/client/ui/ClipTrimPanel/ClipTrimDialog.tsx
  • packages/webui/src/client/ui/ClipTrimPanel/ClipTrimPanel.tsx
  • packages/webui/src/client/ui/ClockView/CameraScreen/Part.tsx
  • packages/webui/src/client/ui/ClockView/CameraScreen/Piece.tsx
  • packages/webui/src/client/ui/ClockView/CameraScreen/Rundown.tsx
  • packages/webui/src/client/ui/ClockView/CameraScreen/index.tsx
  • packages/webui/src/client/ui/ClockView/ClockViewPieceIcons/ClockViewRenderers/SplitInputIcon.tsx
  • packages/webui/src/client/ui/ClockView/ClockViewPieceIcons/utils.ts
  • packages/webui/src/client/ui/ClockView/DirectorScreen/DirectorScreen.tsx
  • packages/webui/src/client/ui/ClockView/DirectorScreen/DirectorScreenTop.tsx
  • packages/webui/src/client/ui/ClockView/PresenterScreen.tsx
  • packages/webui/src/client/ui/ClockView/TTimerDisplay.tsx
  • packages/webui/src/client/ui/MediaStatus/MediaStatus.tsx
  • packages/webui/src/client/ui/PieceIcons/Renderers/SplitInputIcon.tsx
  • packages/webui/src/client/ui/PieceIcons/utils.ts
  • packages/webui/src/client/ui/PreviewPopUp/Previews/BoxLayoutPreview.tsx
  • packages/webui/src/client/ui/PreviewPopUp/Previews/LayerInfoPreview.tsx
  • packages/webui/src/client/ui/Prompter/PrompterView.tsx
  • packages/webui/src/client/ui/Prompter/prompter.ts
  • packages/webui/src/client/ui/RundownList/RundownListItemView.tsx
  • packages/webui/src/client/ui/RundownList/RundownPlaylistUi.tsx
  • packages/webui/src/client/ui/RundownView.tsx
  • packages/webui/src/client/ui/RundownView/DataMissing.tsx
  • packages/webui/src/client/ui/RundownView/DragContext.ts
  • packages/webui/src/client/ui/RundownView/DragContextProvider.tsx
  • packages/webui/src/client/ui/RundownView/RundownDetachedShelf.tsx
  • packages/webui/src/client/ui/RundownView/RundownHeader/RundownContextMenu.tsx
  • packages/webui/src/client/ui/RundownView/RundownHeader/RundownHeader.tsx
  • packages/webui/src/client/ui/RundownView/RundownHeader/RundownHeaderDurations.tsx
  • packages/webui/src/client/ui/RundownView/RundownHeader/RundownHeaderPlannedStart.tsx
  • packages/webui/src/client/ui/RundownView/RundownHeader/RundownHeaderTimers.tsx
  • packages/webui/src/client/ui/RundownView/RundownHeader/RundownHeaderTimingDisplay.tsx
  • packages/webui/src/client/ui/RundownView/RundownHeader/useRundownPlaylistOperations.tsx
  • packages/webui/src/client/ui/RundownView/RundownNotifier.tsx
  • packages/webui/src/client/ui/RundownView/RundownSorensenContext.tsx
  • packages/webui/src/client/ui/RundownView/RundownTiming/PlaylistEndTiming.tsx
  • packages/webui/src/client/ui/RundownView/RundownTiming/RundownName.tsx
  • packages/webui/src/client/ui/RundownView/RundownTiming/RundownTimingProvider.tsx
  • packages/webui/src/client/ui/RundownView/RundownViewContextProviders.tsx
  • packages/webui/src/client/ui/RundownView/RundownViewShelf.tsx
  • packages/webui/src/client/ui/RundownView/StudioContext.tsx
  • packages/webui/src/client/ui/RundownView/useQueueMiniShelfAdlib.ts
  • packages/webui/src/client/ui/SegmentAdlibTesting/SegmentAdlibTesting.tsx
  • packages/webui/src/client/ui/SegmentAdlibTesting/SegmentAdlibTestingContainer.tsx
  • packages/webui/src/client/ui/SegmentContainer/PieceElement.tsx
  • packages/webui/src/client/ui/SegmentContainer/PieceMultistepChevron.tsx
  • packages/webui/src/client/ui/SegmentContainer/getReactivePieceNoteCountsForSegment.tsx
  • packages/webui/src/client/ui/SegmentContainer/getSplitItems.tsx
  • packages/webui/src/client/ui/SegmentContainer/withResolvedSegment.ts
  • packages/webui/src/client/ui/SegmentList/LinePart.tsx
  • packages/webui/src/client/ui/SegmentList/LinePartMainPiece/LinePartMainPiece.tsx
  • packages/webui/src/client/ui/SegmentList/LinePartPieceIndicator/LinePartAdLibIndicator.tsx
  • packages/webui/src/client/ui/SegmentList/LinePartPieceIndicator/LinePartIndicator.tsx
  • packages/webui/src/client/ui/SegmentList/LinePartPieceIndicator/LinePartPieceIndicator.tsx
  • packages/webui/src/client/ui/SegmentList/LinePartPieceIndicator/LinePartScriptPiece.tsx
  • packages/webui/src/client/ui/SegmentList/LinePartPieceIndicator/PieceIndicatorMenu.tsx
  • packages/webui/src/client/ui/SegmentList/LinePartPieceIndicators.tsx
  • packages/webui/src/client/ui/SegmentList/LinePartSecondaryPiece/LinePartSecondaryPiece.tsx
  • packages/webui/src/client/ui/SegmentList/LinePartTimeline.tsx
  • packages/webui/src/client/ui/SegmentList/LinePartTransitionPiece/LinePartTransitionPiece.tsx
  • packages/webui/src/client/ui/SegmentList/OnAirLine.tsx
  • packages/webui/src/client/ui/SegmentList/SegmentList.tsx
  • packages/webui/src/client/ui/SegmentStoryboard/SegmentStoryboard.tsx
  • packages/webui/src/client/ui/SegmentStoryboard/SegmentStoryboardContainer.tsx
  • packages/webui/src/client/ui/SegmentStoryboard/StoryboardPart.tsx
  • packages/webui/src/client/ui/SegmentStoryboard/StoryboardPartSecondaryPieces/Renderers/DefaultRenderer.tsx
  • packages/webui/src/client/ui/SegmentStoryboard/StoryboardPartSecondaryPieces/StoryboardPartSecondaryPieces.tsx
  • packages/webui/src/client/ui/SegmentStoryboard/StoryboardPartSecondaryPieces/StoryboardSecondaryPiece.tsx
  • packages/webui/src/client/ui/SegmentStoryboard/StoryboardPartSecondaryPieces/StoryboardSourceLayer.tsx
  • packages/webui/src/client/ui/SegmentStoryboard/StoryboardPartSecondaryPieces/StoryboardSourceLayerItem.tsx
  • packages/webui/src/client/ui/SegmentStoryboard/StoryboardPartThumbnail/Renderers/ThumbnailRendererFactory.tsx
  • packages/webui/src/client/ui/SegmentStoryboard/StoryboardPartThumbnail/Renderers/VTThumbnailRenderer.tsx
  • packages/webui/src/client/ui/SegmentStoryboard/StoryboardPartThumbnail/StoryboardPartThumbnail.tsx
  • packages/webui/src/client/ui/SegmentStoryboard/StoryboardPartThumbnail/StoryboardPartThumbnailInner.tsx
  • packages/webui/src/client/ui/SegmentStoryboard/StoryboardPartTransitions.tsx
  • packages/webui/src/client/ui/SegmentTimeline/Parts/FlattenedSourceLayers.tsx
  • packages/webui/src/client/ui/SegmentTimeline/Parts/OutputGroup.tsx
  • packages/webui/src/client/ui/SegmentTimeline/Parts/SegmentTimelinePart.tsx
  • packages/webui/src/client/ui/SegmentTimeline/Parts/SourceLayer.tsx
  • packages/webui/src/client/ui/SegmentTimeline/Renderers/CustomLayerItemRenderer.tsx
  • packages/webui/src/client/ui/SegmentTimeline/Renderers/SplitsSourceRenderer.tsx
  • packages/webui/src/client/ui/SegmentTimeline/Renderers/VTSourceRenderer.tsx
  • packages/webui/src/client/ui/SegmentTimeline/SegmentContextMenu.tsx
  • packages/webui/src/client/ui/SegmentTimeline/SegmentTimeline.tsx
  • packages/webui/src/client/ui/SegmentTimeline/SegmentTimelineContainer.tsx
  • packages/webui/src/client/ui/SegmentTimeline/SmallParts/SegmentTimelinePartHoverPreview.tsx
  • packages/webui/src/client/ui/SegmentTimeline/SmallParts/SegmentTimelineSmallPartFlag.tsx
  • packages/webui/src/client/ui/SegmentTimeline/SourceLayerItem.tsx
  • packages/webui/src/client/ui/SegmentTimeline/SourceLayerItemContainer.tsx
  • packages/webui/src/client/ui/SegmentTimeline/withMediaObjectStatus.tsx
  • packages/webui/src/client/ui/Settings/components/triggeredActions/TriggeredActionEntry.tsx
  • packages/webui/src/client/ui/Shelf/AdLibListItem.tsx
  • packages/webui/src/client/ui/Shelf/AdLibListView.tsx
  • packages/webui/src/client/ui/Shelf/AdLibPanel.tsx
  • packages/webui/src/client/ui/Shelf/AdLibRegionPanel.tsx
  • packages/webui/src/client/ui/Shelf/BucketPanel.tsx
  • packages/webui/src/client/ui/Shelf/DashboardPanel.tsx
  • packages/webui/src/client/ui/Shelf/DashboardPieceButton.tsx
  • packages/webui/src/client/ui/Shelf/EndWordsPanel.tsx
  • packages/webui/src/client/ui/Shelf/ExternalFramePanel.tsx
  • packages/webui/src/client/ui/Shelf/GlobalAdLibPanel.tsx
  • packages/webui/src/client/ui/Shelf/HotkeyHelpPanel.tsx
  • packages/webui/src/client/ui/Shelf/Inspector/ItemRenderers/ActionItemRenderer.tsx
  • packages/webui/src/client/ui/Shelf/Inspector/ItemRenderers/DefaultItemRenderer.tsx
  • packages/webui/src/client/ui/Shelf/Inspector/ItemRenderers/InspectorTitle.tsx
  • packages/webui/src/client/ui/Shelf/Inspector/ItemRenderers/ItemRendererFactory.ts
  • packages/webui/src/client/ui/Shelf/Inspector/ItemRenderers/NoraItemRenderer.tsx
  • packages/webui/src/client/ui/Shelf/Inspector/ShelfInspector.tsx
  • packages/webui/src/client/ui/Shelf/MiniRundownPanel.tsx
  • packages/webui/src/client/ui/Shelf/PartNamePanel.tsx
  • packages/webui/src/client/ui/Shelf/PartTimingPanel.tsx
  • packages/webui/src/client/ui/Shelf/PieceCountdownPanel.tsx
  • packages/webui/src/client/ui/Shelf/PlaylistEndTimerPanel.tsx
  • packages/webui/src/client/ui/Shelf/Renderers/DefaultListItemRenderer.tsx
  • packages/webui/src/client/ui/Shelf/Renderers/ItemRendererFactory.ts
  • packages/webui/src/client/ui/Shelf/Renderers/L3rdListItemRenderer.tsx
  • packages/webui/src/client/ui/Shelf/Renderers/VTListItemRenderer.tsx
  • packages/webui/src/client/ui/Shelf/RundownViewBuckets.tsx
  • packages/webui/src/client/ui/Shelf/SegmentNamePanel.tsx
  • packages/webui/src/client/ui/Shelf/SegmentTimingPanel.tsx
  • packages/webui/src/client/ui/Shelf/Shelf.tsx
  • packages/webui/src/client/ui/Shelf/ShelfDashboardLayout.tsx
  • packages/webui/src/client/ui/Shelf/ShelfRundownLayout.tsx
  • packages/webui/src/client/ui/Shelf/ShowStylePanel.tsx
  • packages/webui/src/client/ui/Shelf/StudioNamePanel.tsx
  • packages/webui/src/client/ui/Status/media-status/MediaStatusListItem.tsx
  • packages/webui/src/client/ui/StudioScreenSaver/StudioScreenSaver.tsx
  • packages/webui/src/client/ui/UserEditOperations/PropertiesPanel.tsx

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@codecov
Copy link
Copy Markdown

codecov bot commented Mar 19, 2026

@justandras
Copy link
Copy Markdown
Member Author

@coderabbitai review

@coderabbitai
Copy link
Copy Markdown

coderabbitai bot commented Mar 19, 2026

✅ Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@justandras justandras marked this pull request as ready for review March 20, 2026 08:47
Copy link
Copy Markdown
Contributor

@jstarpl jstarpl left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've got a couple of nitpicks around the growing signatures of the helper functions - they were bad enough already, but now they've grown to 20+ positional arguments.

But my main objection is around exporting getSourceLayerClassName et al. out of webui and creating a tight binding across 2 packages - and I assume possibly more in the future - on CSS classes: can you provide a bit more perspective on why that's desired/necessary?

Comment thread packages/corelib/src/playout/stateCacheResolver.ts Outdated
Comment thread packages/corelib/src/playout/stateCacheResolver.ts Outdated
Comment thread packages/corelib/src/playout/stateCacheResolver.ts Outdated
Comment thread packages/corelib/src/playout/stateCacheResolver.ts Outdated
Comment thread packages/corelib/src/playout/stateCacheResolver.ts Outdated
@justandras justandras force-pushed the dev/refactor/shared-rundown-state-cache-resolution branch from 4545e66 to 44fe05e Compare March 24, 2026 11:30
@justandras justandras requested a review from jstarpl March 24, 2026 14:37
@justandras justandras force-pushed the dev/refactor/shared-rundown-state-cache-resolution branch from e41af66 to 5b78e0b Compare April 1, 2026 08:34
@justandras justandras force-pushed the dev/refactor/shared-rundown-state-cache-resolution branch from 5b78e0b to 0e3ce54 Compare April 1, 2026 10:28
@justandras justandras requested a review from jstarpl April 3, 2026 03:01
@justandras justandras force-pushed the dev/refactor/shared-rundown-state-cache-resolution branch from 95acac3 to f9b827b Compare April 3, 2026 03:22
@justandras justandras merged commit 0e54356 into Sofie-Automation:main Apr 9, 2026
24 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Contribution from BBC Contributions sponsored by BBC (bbc.co.uk) Contribution from CBC/Radio-Canada Contributions sponsored by CBC/Radio-Canada (cbc.radio-canada.ca)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants