Replace Nuke with StreamImageDownloader#1531
Conversation
|
No actionable comments were generated in the recent review. π βΉοΈ Recent review infoβοΈ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Run ID: π Files selected for processing (6)
π§ Files skipped from review as they are similar to previous changes (1)
π WalkthroughWalkthroughThe PR removes the embedded StreamNuke implementation and downloader, updates image-cache handling to use the current loader, retains SwiftyGif support, changes dependency tooling and package configuration, removes StreamNuke references from analysis configuration and documentation, and updates chat test fixtures. ChangesNuke removal and replacement wiring
Estimated code review effort: 4 (Complex) | ~45 minutes Possibly related PRs
Suggested reviewers: π₯ Pre-merge checks | β 5β Passed checks (5 passed)
β¨ Finishing Touchesπ Generate docstrings
π§ͺ Generate unit tests (beta)
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. Comment |
There was a problem hiding this comment.
Actionable comments posted: 1
π€ Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@Sources/StreamChatSwiftUI/ChatMessageList/GiphyAttachmentView.swift`:
- Around line 167-169: Replace the private implementation-detail documentation
comments with regular `//` comments or remove them: update the comment above
`AnimatedGifView` in
Sources/StreamChatSwiftUI/ChatMessageList/GiphyAttachmentView.swift (lines
167-169) and the surrounding `normalizedResize` documentation block in
Sources/StreamChatSwiftUI/CommonViews/StreamAsyncImage.swift (line 181). No code
behavior changes are needed.
πͺ Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
βΉοΈ Review info
βοΈ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: e6224768-3ff8-410c-9c8a-759df807eba7
π Files selected for processing (83)
.slather.yml.swiftformat.swiftlint.ymlAGENTS.mdCHANGELOG.mdMakefileScripts/removePublicDeclarations.shScripts/updateDependency.shSources/StreamChatSwiftUI/ChatChannel/ChatChannelViewModel.swiftSources/StreamChatSwiftUI/ChatMessageList/GiphyAttachmentView.swiftSources/StreamChatSwiftUI/ChatMessageList/MessageMediaAttachmentContentView.swiftSources/StreamChatSwiftUI/CommonViews/StreamAsyncImage.swiftSources/StreamChatSwiftUI/README.mdSources/StreamChatSwiftUI/StreamNuke/Nuke/Caching/DataCache.swiftSources/StreamChatSwiftUI/StreamNuke/Nuke/Caching/DataCaching.swiftSources/StreamChatSwiftUI/StreamNuke/Nuke/Caching/ImageCache.swiftSources/StreamChatSwiftUI/StreamNuke/Nuke/Caching/ImageCaching.swiftSources/StreamChatSwiftUI/StreamNuke/Nuke/Caching/NukeCache.swiftSources/StreamChatSwiftUI/StreamNuke/Nuke/Decoding/AssetType.swiftSources/StreamChatSwiftUI/StreamNuke/Nuke/Decoding/ImageDecoderRegistry.swiftSources/StreamChatSwiftUI/StreamNuke/Nuke/Decoding/ImageDecoders+Default.swiftSources/StreamChatSwiftUI/StreamNuke/Nuke/Decoding/ImageDecoders+Empty.swiftSources/StreamChatSwiftUI/StreamNuke/Nuke/Decoding/ImageDecoding.swiftSources/StreamChatSwiftUI/StreamNuke/Nuke/Encoding/ImageEncoders+Default.swiftSources/StreamChatSwiftUI/StreamNuke/Nuke/Encoding/ImageEncoders+ImageIO.swiftSources/StreamChatSwiftUI/StreamNuke/Nuke/Encoding/ImageEncoders.swiftSources/StreamChatSwiftUI/StreamNuke/Nuke/Encoding/ImageEncoding.swiftSources/StreamChatSwiftUI/StreamNuke/Nuke/ImageContainer.swiftSources/StreamChatSwiftUI/StreamNuke/Nuke/ImageRequest.swiftSources/StreamChatSwiftUI/StreamNuke/Nuke/ImageResponse.swiftSources/StreamChatSwiftUI/StreamNuke/Nuke/ImageTask.swiftSources/StreamChatSwiftUI/StreamNuke/Nuke/Internal/Atomic.swiftSources/StreamChatSwiftUI/StreamNuke/Nuke/Internal/DataPublisher.swiftSources/StreamChatSwiftUI/StreamNuke/Nuke/Internal/Extensions.swiftSources/StreamChatSwiftUI/StreamNuke/Nuke/Internal/Graphics.swiftSources/StreamChatSwiftUI/StreamNuke/Nuke/Internal/ImagePublisher.swiftSources/StreamChatSwiftUI/StreamNuke/Nuke/Internal/ImageRequestKeys.swiftSources/StreamChatSwiftUI/StreamNuke/Nuke/Internal/LinkedList.swiftSources/StreamChatSwiftUI/StreamNuke/Nuke/Internal/Log.swiftSources/StreamChatSwiftUI/StreamNuke/Nuke/Internal/Operation.swiftSources/StreamChatSwiftUI/StreamNuke/Nuke/Internal/RateLimiter.swiftSources/StreamChatSwiftUI/StreamNuke/Nuke/Internal/ResumableData.swiftSources/StreamChatSwiftUI/StreamNuke/Nuke/Loading/DataLoader.swiftSources/StreamChatSwiftUI/StreamNuke/Nuke/Loading/DataLoading.swiftSources/StreamChatSwiftUI/StreamNuke/Nuke/Pipeline/ImagePipeline+Cache.swiftSources/StreamChatSwiftUI/StreamNuke/Nuke/Pipeline/ImagePipeline+Configuration.swiftSources/StreamChatSwiftUI/StreamNuke/Nuke/Pipeline/ImagePipeline+Delegate.swiftSources/StreamChatSwiftUI/StreamNuke/Nuke/Pipeline/ImagePipeline+Error.swiftSources/StreamChatSwiftUI/StreamNuke/Nuke/Pipeline/ImagePipeline.swiftSources/StreamChatSwiftUI/StreamNuke/Nuke/Prefetching/ImagePrefetcher.swiftSources/StreamChatSwiftUI/StreamNuke/Nuke/Processing/ImageDecompression.swiftSources/StreamChatSwiftUI/StreamNuke/Nuke/Processing/ImageProcessing.swiftSources/StreamChatSwiftUI/StreamNuke/Nuke/Processing/ImageProcessingOptions.swiftSources/StreamChatSwiftUI/StreamNuke/Nuke/Processing/ImageProcessors+Anonymous.swiftSources/StreamChatSwiftUI/StreamNuke/Nuke/Processing/ImageProcessors+Circle.swiftSources/StreamChatSwiftUI/StreamNuke/Nuke/Processing/ImageProcessors+Composition.swiftSources/StreamChatSwiftUI/StreamNuke/Nuke/Processing/ImageProcessors+CoreImage.swiftSources/StreamChatSwiftUI/StreamNuke/Nuke/Processing/ImageProcessors+GaussianBlur.swiftSources/StreamChatSwiftUI/StreamNuke/Nuke/Processing/ImageProcessors+Resize.swiftSources/StreamChatSwiftUI/StreamNuke/Nuke/Processing/ImageProcessors+RoundedCorners.swiftSources/StreamChatSwiftUI/StreamNuke/Nuke/Processing/ImageProcessors.swiftSources/StreamChatSwiftUI/StreamNuke/Nuke/Tasks/AsyncPipelineTask.swiftSources/StreamChatSwiftUI/StreamNuke/Nuke/Tasks/AsyncTask.swiftSources/StreamChatSwiftUI/StreamNuke/Nuke/Tasks/TaskFetchOriginalData.swiftSources/StreamChatSwiftUI/StreamNuke/Nuke/Tasks/TaskFetchOriginalImage.swiftSources/StreamChatSwiftUI/StreamNuke/Nuke/Tasks/TaskFetchWithPublisher.swiftSources/StreamChatSwiftUI/StreamNuke/Nuke/Tasks/TaskLoadData.swiftSources/StreamChatSwiftUI/StreamNuke/Nuke/Tasks/TaskLoadImage.swiftSources/StreamChatSwiftUI/StreamNuke/NukeExtensions/ImageLoadingOptions.swiftSources/StreamChatSwiftUI/StreamNuke/NukeExtensions/ImageViewExtensions.swiftSources/StreamChatSwiftUI/StreamNuke/NukeUI/FetchImage.swiftSources/StreamChatSwiftUI/StreamNuke/NukeUI/Internal.swiftSources/StreamChatSwiftUI/StreamNuke/NukeUI/LazyImage.swiftSources/StreamChatSwiftUI/StreamNuke/NukeUI/LazyImageState.swiftSources/StreamChatSwiftUI/StreamNuke/NukeUI/LazyImageView.swiftSources/StreamChatSwiftUI/StreamNuke/NukeVideo/AVDataAsset.swiftSources/StreamChatSwiftUI/StreamNuke/NukeVideo/ImageDecoders+Video.swiftSources/StreamChatSwiftUI/StreamNuke/NukeVideo/NukeVideoPlayerView.swiftSources/StreamChatSwiftUI/Utils/StreamImageDownloader.swiftStreamChatSwiftUI.xcodeproj/project.pbxprojStreamChatSwiftUITests/Tests/Utils/StreamImageDownloader_Tests.swiftfastlane/Fastfilesonar-project.properties
π€ Files with no reviewable changes (71)
- Sources/StreamChatSwiftUI/README.md
- Sources/StreamChatSwiftUI/StreamNuke/Nuke/Decoding/ImageDecoders+Default.swift
- Sources/StreamChatSwiftUI/StreamNuke/Nuke/ImageContainer.swift
- Sources/StreamChatSwiftUI/StreamNuke/NukeUI/LazyImage.swift
- Sources/StreamChatSwiftUI/StreamNuke/Nuke/ImageRequest.swift
- Sources/StreamChatSwiftUI/StreamNuke/NukeExtensions/ImageLoadingOptions.swift
- Sources/StreamChatSwiftUI/StreamNuke/Nuke/Encoding/ImageEncoding.swift
- .slather.yml
- Sources/StreamChatSwiftUI/StreamNuke/Nuke/Processing/ImageProcessors+Circle.swift
- Sources/StreamChatSwiftUI/StreamNuke/Nuke/Internal/RateLimiter.swift
- Sources/StreamChatSwiftUI/StreamNuke/Nuke/Decoding/AssetType.swift
- Sources/StreamChatSwiftUI/StreamNuke/Nuke/Caching/DataCaching.swift
- Sources/StreamChatSwiftUI/StreamNuke/Nuke/Decoding/ImageDecoders+Empty.swift
- Sources/StreamChatSwiftUI/StreamNuke/NukeVideo/NukeVideoPlayerView.swift
- Sources/StreamChatSwiftUI/StreamNuke/Nuke/Internal/Log.swift
- Sources/StreamChatSwiftUI/StreamNuke/Nuke/Processing/ImageProcessors+Composition.swift
- Sources/StreamChatSwiftUI/StreamNuke/Nuke/Internal/ResumableData.swift
- Sources/StreamChatSwiftUI/StreamNuke/Nuke/ImageTask.swift
- StreamChatSwiftUITests/Tests/Utils/StreamImageDownloader_Tests.swift
- Sources/StreamChatSwiftUI/StreamNuke/Nuke/Encoding/ImageEncoders.swift
- Sources/StreamChatSwiftUI/StreamNuke/Nuke/Tasks/TaskLoadData.swift
- Sources/StreamChatSwiftUI/StreamNuke/Nuke/Tasks/TaskFetchOriginalImage.swift
- Sources/StreamChatSwiftUI/StreamNuke/Nuke/Internal/Operation.swift
- Sources/StreamChatSwiftUI/StreamNuke/Nuke/Processing/ImageDecompression.swift
- Sources/StreamChatSwiftUI/StreamNuke/Nuke/Pipeline/ImagePipeline.swift
- Sources/StreamChatSwiftUI/StreamNuke/Nuke/Prefetching/ImagePrefetcher.swift
- Sources/StreamChatSwiftUI/StreamNuke/Nuke/Encoding/ImageEncoders+Default.swift
- Sources/StreamChatSwiftUI/StreamNuke/Nuke/Encoding/ImageEncoders+ImageIO.swift
- Sources/StreamChatSwiftUI/StreamNuke/Nuke/Internal/ImagePublisher.swift
- Sources/StreamChatSwiftUI/StreamNuke/Nuke/Processing/ImageProcessors+GaussianBlur.swift
- Sources/StreamChatSwiftUI/StreamNuke/Nuke/Caching/ImageCache.swift
- Sources/StreamChatSwiftUI/StreamNuke/Nuke/Caching/ImageCaching.swift
- .swiftlint.yml
- Sources/StreamChatSwiftUI/StreamNuke/NukeUI/LazyImageState.swift
- Sources/StreamChatSwiftUI/StreamNuke/Nuke/Caching/NukeCache.swift
- Sources/StreamChatSwiftUI/StreamNuke/Nuke/Loading/DataLoader.swift
- Sources/StreamChatSwiftUI/StreamNuke/Nuke/Decoding/ImageDecoderRegistry.swift
- Sources/StreamChatSwiftUI/StreamNuke/Nuke/Tasks/TaskFetchWithPublisher.swift
- Sources/StreamChatSwiftUI/StreamNuke/Nuke/Processing/ImageProcessing.swift
- Sources/StreamChatSwiftUI/StreamNuke/Nuke/Pipeline/ImagePipeline+Delegate.swift
- Sources/StreamChatSwiftUI/StreamNuke/Nuke/Pipeline/ImagePipeline+Configuration.swift
- Sources/StreamChatSwiftUI/StreamNuke/Nuke/Internal/Extensions.swift
- Sources/StreamChatSwiftUI/StreamNuke/Nuke/Tasks/AsyncTask.swift
- Sources/StreamChatSwiftUI/StreamNuke/NukeUI/Internal.swift
- Sources/StreamChatSwiftUI/StreamNuke/Nuke/Internal/Atomic.swift
- Sources/StreamChatSwiftUI/StreamNuke/Nuke/Internal/ImageRequestKeys.swift
- Sources/StreamChatSwiftUI/StreamNuke/Nuke/Processing/ImageProcessors+Resize.swift
- Sources/StreamChatSwiftUI/StreamNuke/NukeVideo/AVDataAsset.swift
- Sources/StreamChatSwiftUI/StreamNuke/NukeUI/LazyImageView.swift
- Sources/StreamChatSwiftUI/StreamNuke/Nuke/Processing/ImageProcessors+Anonymous.swift
- Sources/StreamChatSwiftUI/StreamNuke/Nuke/Loading/DataLoading.swift
- Sources/StreamChatSwiftUI/StreamNuke/NukeExtensions/ImageViewExtensions.swift
- Sources/StreamChatSwiftUI/StreamNuke/Nuke/Processing/ImageProcessors+RoundedCorners.swift
- Sources/StreamChatSwiftUI/Utils/StreamImageDownloader.swift
- Sources/StreamChatSwiftUI/StreamNuke/Nuke/Decoding/ImageDecoding.swift
- Sources/StreamChatSwiftUI/StreamNuke/Nuke/Internal/LinkedList.swift
- Sources/StreamChatSwiftUI/StreamNuke/Nuke/Caching/DataCache.swift
- Sources/StreamChatSwiftUI/StreamNuke/Nuke/Pipeline/ImagePipeline+Cache.swift
- Sources/StreamChatSwiftUI/StreamNuke/Nuke/Tasks/TaskFetchOriginalData.swift
- Sources/StreamChatSwiftUI/StreamNuke/Nuke/Pipeline/ImagePipeline+Error.swift
- Sources/StreamChatSwiftUI/StreamNuke/Nuke/Internal/DataPublisher.swift
- Sources/StreamChatSwiftUI/StreamNuke/Nuke/Internal/Graphics.swift
- Sources/StreamChatSwiftUI/StreamNuke/Nuke/Tasks/TaskLoadImage.swift
- Sources/StreamChatSwiftUI/StreamNuke/Nuke/Tasks/AsyncPipelineTask.swift
- Sources/StreamChatSwiftUI/StreamNuke/Nuke/Processing/ImageProcessingOptions.swift
- Sources/StreamChatSwiftUI/StreamNuke/Nuke/ImageResponse.swift
- Sources/StreamChatSwiftUI/StreamNuke/Nuke/Processing/ImageProcessors.swift
- Sources/StreamChatSwiftUI/StreamNuke/NukeVideo/ImageDecoders+Video.swift
- Makefile
- Sources/StreamChatSwiftUI/StreamNuke/NukeUI/FetchImage.swift
- Sources/StreamChatSwiftUI/StreamNuke/Nuke/Processing/ImageProcessors+CoreImage.swift
| /// Recommended implementation by SwiftyGif for rendering gifs in SwiftUI. | ||
| /// The image pipeline delivers raw GIF data without animating it, so | ||
| /// rendering is implemented separately. |
There was a problem hiding this comment.
π Maintainability & Code Quality | π Major | β‘ Quick win
Use regular comments for private implementation details.
Both changed segments use /// documentation for private declarations, contrary to the Swift documentation guideline.
Sources/StreamChatSwiftUI/ChatMessageList/GiphyAttachmentView.swift#L167-L169: convert theAnimatedGifViewcomment to//or remove it.Sources/StreamChatSwiftUI/CommonViews/StreamAsyncImage.swift#L181-L181: convert the surroundingnormalizedResizedocumentation block to//or remove it.
π Affects 2 files
Sources/StreamChatSwiftUI/ChatMessageList/GiphyAttachmentView.swift#L167-L169(this comment)Sources/StreamChatSwiftUI/CommonViews/StreamAsyncImage.swift#L181-L181
π€ Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@Sources/StreamChatSwiftUI/ChatMessageList/GiphyAttachmentView.swift` around
lines 167 - 169, Replace the private implementation-detail documentation
comments with regular `//` comments or remove them: update the comment above
`AnimatedGifView` in
Sources/StreamChatSwiftUI/ChatMessageList/GiphyAttachmentView.swift (lines
167-169) and the surrounding `normalizedResize` documentation block in
Sources/StreamChatSwiftUI/CommonViews/StreamAsyncImage.swift (line 181). No code
behavior changes are needed.
Source: Coding guidelines
Generated by π« Danger |
|
|
||
| @objc | ||
| private func didReceiveMemoryWarning() { | ||
| ImageCache.shared.removeAll() |
There was a problem hiding this comment.
This is automatic now, StreamImageLoader observes it internally
| cleanupAudioPlayer() | ||
| ImageCache.shared.trim(toCost: utils.messageListConfig.cacheSizeOnChatDismiss) | ||
| let downloader = (utils.mediaLoader as? StreamMediaLoader)?.downloader as? StreamImageDownloader | ||
| downloader?.trimMemoryCache(toCost: utils.messageListConfig.cacheSizeOnChatDismiss) |
There was a problem hiding this comment.
Looks slightly ugly. I think I need to update image loading protocol for skipping the casting.
SDK Size
|
StreamChatSwiftUI XCSize
Show 77 more objects
|
|
Public Interface- public final class StreamImageDownloader: ImageDownloading, Sendable
-
- public init()
-
-
- public func downloadImage(url: URL,options: ImageDownloadingOptions,completion: @escaping @MainActor (Result<DownloadedImage, Error>) -> Void)
|



π Issue Links
Related:
π― Goal
Remove the vendored Nuke stack and load images through
StreamImageDownloaderfrom StreamChatCommonUI.π Summary
StreamNukesources (~9.5k lines), including the unused NukeUI/NukeVideo/NukeExtensions treesStreamImageDownloader; the same-named StreamChatCommonUI implementation takes over through the existing re-exportChatChannelViewModelno longer clears Nuke's cache on memory warnings (the new memory cache clears itself) and trims the default downloader's memory cache on chat dismiss, keepingMessageListConfig.cacheSizeOnChatDismissworkingπ Implementation
stream-chat-swiftto thestream-image-loaderbranch until Replace Nuke with StreamImageDownloader with caching supportΒ stream-chat-swift#4171 merges;Package.swiftis unchanged.MediaLoader/StreamAsyncImage, so no view code changes were needed. GIFs keep rendering through the vendored SwiftyGif, fed byanimatedImageDatafrom the new pipeline.π¨ Showcase
No intended visual changes.
π§ͺ Manual Testing Notes
Browse channels with avatars, image and GIF attachments; verify images fill in while scrolling, cached images appear instantly on revisit, and previously viewed images load offline after a relaunch.
βοΈ Contributor Checklist
docs-contentrepoSummary by CodeRabbit
StreamImageDownloaderfrom StreamChatCommonUI.