90 lines
3.5 KiB
Markdown
90 lines
3.5 KiB
Markdown
# Node Stream Notes
|
|
|
|
## Current Status
|
|
|
|
`Node Stream` is enabled. The single source of truth is:
|
|
|
|
- `ui/features/viewer/nodeStream/nodeStreamFeatureFlag.js`
|
|
|
|
The active implementation is selection-only: when the MFV Node Stream button is
|
|
on, selecting a ComfyUI canvas node streams the best available preview into the
|
|
Floating Viewer. It supports standard ComfyUI node previews, downstream preview
|
|
nodes, load widgets, and ImageOps live-preview canvases exposed through
|
|
`node.__imageops_state.canvas`.
|
|
|
|
Node Stream is the only MFV feature that follows canvas node selection. Live
|
|
Stream is reserved for final generation outputs, and KSampler Preview is
|
|
reserved for denoising-step blobs from the ComfyUI API.
|
|
|
|
If `NODE_STREAM_FEATURE_ENABLED` is set to `false`:
|
|
|
|
- the Floating Viewer toolbar does not show the Node Stream button,
|
|
- the `N` shortcut does nothing,
|
|
- `floatingViewerManager` ignores Node Stream activation and payloads,
|
|
- `entry.js` does not initialize the controller or expose the inspection-only `window.MajoorNodeStream` helpers,
|
|
- `NodeStreamController` stays inert even if called directly.
|
|
|
|
## Files Involved
|
|
|
|
- `ui/features/viewer/nodeStream/nodeStreamFeatureFlag.js`
|
|
- `ui/features/viewer/nodeStream/NodeStreamController.js`
|
|
- `ui/features/viewer/nodeStream/imageOpsPreviewBridge.js`
|
|
- `ui/features/viewer/FloatingViewer.js`
|
|
- `ui/features/viewer/floatingViewerManager.js`
|
|
- `ui/entry.ts`
|
|
- `ui/app/events.js`
|
|
- `ui/tests/node_stream_controller.vitest.mjs`
|
|
|
|
## Smoke Tests
|
|
|
|
Use the real local stack and verify these cases from the ComfyUI canvas:
|
|
|
|
- Core `LoadImage`
|
|
- Core `LoadImageMask`
|
|
- `ImageOpsPreview`
|
|
- Any ImageOps processing node with an embedded live preview
|
|
- `LayerUtility: ImageBlend`
|
|
- `LayerUtility: ImageBlendAdvance`
|
|
- `LayerMask: MaskPreview`
|
|
- `MaskPreview+` from `comfyui_essentials`
|
|
- `PreviewImageOrMask` and `ImageAndMaskPreview` from `comfyui-kjnodes`
|
|
- at least one WAS Suite image node if present locally
|
|
|
|
## Expected Behavior
|
|
|
|
- Selection-only behavior: previews follow node clicks, not execution events.
|
|
- If a selected node has no direct preview, downstream preview/save nodes may be
|
|
used as the preview source.
|
|
- ImageOps live preview canvases update in the MFV when their render signature changes.
|
|
- The feature stays compatible with MFV lifecycle teardown and hot-reload.
|
|
|
|
## Stream Feature Boundaries
|
|
|
|
### Live Stream
|
|
|
|
- Source: `NEW_GENERATION_OUTPUT` events.
|
|
- Trigger: workflow execution finishes and ComfyUI reports output files.
|
|
- Displays: final generated files only.
|
|
- Does not follow selected canvas nodes.
|
|
- Limitation: no raw tensor access and no no-queue preview.
|
|
|
|
### KSampler Preview
|
|
|
|
- Source: ComfyUI API `b_preview_with_metadata` or legacy `b_preview` events.
|
|
- Trigger: sampler denoising during workflow execution.
|
|
- Displays: transient preview blobs, usually JPEG/PNG frames.
|
|
- Limitation: only available while ComfyUI emits sampler previews.
|
|
|
|
### Node Stream
|
|
|
|
- Source: selected ComfyUI canvas node.
|
|
- Trigger: user selects a node while Node Stream is active.
|
|
- Displays: frontend-observable media such as `node.imgs`, widget `<img>`/`<video>`,
|
|
load-widget filenames, downstream preview/save media, and ImageOps live canvases.
|
|
- Public debug surface: `window.MajoorNodeStream.mode`, `.listAdapters()`, and
|
|
`.getKnownNodeSets()` are inspection helpers only; third-party adapter
|
|
registration is not part of the active runtime contract.
|
|
- Limitation: cannot read backend tensors (`IMAGE`, `MASK`, `LATENT`) before node
|
|
execution. For ImageOps, the no-queue live path is the frontend canvas, not the
|
|
Python tensor output.
|