<< All versions
Skill v1.0.1
currentAutomated scan100/100lichtblick-suite/lichtblick/message-pipeline
+3 new
──Details
PublishedAugust 18, 2026 at 11:05 PM
Content Hashsha256:595110b6f31f3081...
Git SHA355014d99402
Bump Typepatch
──Files
Files (1 file, 3.4 KB)
SKILL.md3.4 KBactive
SKILL.md · 87 lines · 3.4 KB
version: "1.0.1" name: "message-pipeline" description: "Deep MessagePipeline implementation knowledge: zustand store shape, React context provider, subscription merging/memoization, render-state flow, and the Player→panel data bus."
Message Pipeline Skill
The MessagePipeline is the central data bus connecting Players to Panels.
Data Flow
Player (emits PlayerState)│ playerListener callback▼MessagePipeline (zustand store + React context)│ selector-based notifications▼PanelExtensionAdapter (per-panel bridge)│▼Panel (receives RenderState)
Core Files
| File | Role | |
|---|---|---|
packages/suite-base/src/components/MessagePipeline/index.tsx | React context provider; creates the zustand store and connects to the Player | |
packages/suite-base/src/components/MessagePipeline/store.ts | MessagePipelineInternalState + dispatch actions | |
packages/suite-base/src/components/MessagePipeline/types.ts | MessagePipelineContext — the interface panels see | |
packages/suite-base/src/components/MessagePipeline/subscriptions.ts | Subscription merging + memoization | |
packages/suite-base/src/components/MessagePipeline/selectors.ts | Selector helpers for fine-grained subscriptions |
Store Update Flow
- Player emits state → the
playerListenercallback fires - Store dispatch → the
"update"action merges the newPlayerStateinto internal state - Selectors react → zustand subscribers (panels) are notified via selector equality checks
- Render state built →
PanelExtensionAdapterincrementally buildsRenderStateper panel
Internal Store Actions
"update"— newPlayerStatereceived from the player listener"set-subscriptions"— a panel's subscriptions changed"playback-seek"— user seeks to a new time"set-playback-speed"— playback rate changed
Subscription System
Panels declare the topics they need:
typescript
context.subscribe([{ topic: "/camera/image" }]);
The pipeline:
- Collects subscriptions from all active panels
- Merges overlapping subscriptions (deduplicates topics)
- Forwards the merged set to the Player via
player.setSubscriptions() - The Player only iterates topics that are actually subscribed
Subscription Memoization
subscriptions.tsuses reference equality to avoid recomputing the merged subscription set- A Player update is only triggered when the effective topic set changes
MessagePipelineContext (what panels access)
playerState— current player status (playing, paused, error)activeData— messages,currentTime,startTime,endTime, topics, datatypesmessagesByTopic—Map<topic, messages>for the current framesortedTopics— alphabetically sorted topic listsubscriptions— currently active subscriptionsseekPlayback(time)— seek to a specific timesetPlaybackSpeed(speed)— change playback rate
Performance Notes
- Zustand selectors enable per-panel, fine-grained updates (no full re-renders)
messagesByTopicis rebuilt only when new messages arrive (not every frame)- Subscription merging prevents redundant data iteration in the Player
- Render state is built incrementally — only changed fields are recomputed
Skills Reference
- For the panel-side bridge and
RenderStatecontract: loadpanel-extension-apiskill - For Player internals upstream of the pipeline: load
player-internalsskill