← Back to PRs

#6591: fix(signal): process all inbound attachments in parallel

by ProofOfReach open 2026-02-01 21:04 View on GitHub →
channel: signal
## Summary - **Fixes Signal only processing first attachment** - Previously `attachments[0]` was taken, silently dropping additional attachments - **Parallel fetching** - Uses `Promise.all()` for ~4x speedup when processing multiple images - **UX improvement** - Sends "Processing N images..." message for multi-attachment messages - **Backwards compatible** - Populates both `MediaPath` (singular) and `MediaPaths` (array) ## Test plan - [x] Tested with 4-image Signal message - all 4 images detected and processed - [x] Verified parallel fetch reduces processing time - [x] Confirmed "Processing images" message appears for multi-attachment messages - [x] Single attachment messages still work as before ## Related Follows the same pattern as the Line channel which already supports multiple attachments. --- 🦞 Generated with [Claude Code](https://claude.ai/code) <!-- greptile_comment --> <h2>Greptile Overview</h2> <h3>Greptile Summary</h3> This PR updates the Signal inbound event handler to support multiple attachments per message by fetching all attachments (with an `id`) in parallel via `Promise.all`, and by emitting array fields (`MediaPaths`, `MediaTypes`, `MediaUrls`) alongside the existing singular media fields for backward compatibility. It also adds a user-facing "Processing N images..." status message when multiple attachments are present, and updates debouncing/placeholder generation to account for multi-attachment messages. Overall the change matches existing multi-media patterns in the codebase (e.g., Line/iMessage) and improves correctness by no longer silently dropping attachments beyond index 0. <h3>Confidence Score: 4/5</h3> - This PR is likely safe to merge, with minor edge-case handling to consider around group targets and attachment counts. - The changes are localized to Signal inbound processing and follow established multi-media patterns (MediaPaths/Types/Urls). Main risk is around small edge cases: constructing `group:${groupId}` without guarding against undefined and UI placeholder counts using total attachments vs valid/fetched attachments. - src/signal/monitor/event-handler.ts <!-- greptile_other_comments_section --> <sub>(2/5) Greptile learns from your feedback when you react with thumbs up/down!</sub> <!-- /greptile_comment -->

Most Similar PRs