Skip to content

refactor(sns): split publish topic fan-out into subscribers + per-protocol deliverers#344

Merged
vieiralucas merged 1 commit intomainfrom
worktree-cleanup-sns-publish-fanout
Apr 13, 2026
Merged

refactor(sns): split publish topic fan-out into subscribers + per-protocol deliverers#344
vieiralucas merged 1 commit intomainfrom
worktree-cleanup-sns-publish-fanout

Conversation

@vieiralucas
Copy link
Copy Markdown
Member

@vieiralucas vieiralucas commented Apr 13, 2026

Summary

  • Extract `collect_topic_subscribers` returning a `TopicSubscribers` struct with per-protocol `Vec`s (sqs, http, lambda, email, sms). The single `state.read()` now does one sweep instead of five adjacent inline filter chains.
  • Extract `build_envelope_attrs` for the `Map<String, Value>` used in every SNS notification envelope.
  • Introduce a `TopicFanoutContext` struct that carries the message / subject / envelope values each deliverer needs, so the helper signatures stay readable.
  • Extract `deliver_to_sqs_subscribers`, `deliver_to_http_subscribers`, `deliver_to_lambda_subscribers`, `deliver_to_email_subscribers`, and `deliver_to_sms_subscribers` as methods on `SnsService`. The `publish` topic branch is now a short fan-out sequence that calls each helper in turn instead of inlining ~330 lines of delivery logic.

Test plan

  • `cargo fmt`
  • `cargo clippy --workspace --all-targets -- -D warnings`
  • `cargo test --workspace --exclude fakecloud-e2e --exclude fakecloud-conformance`

Summary by cubic

Split SNS publish fan-out into a subscriber collection pass and per‑protocol deliverers. This simplifies publish, removes duplicate filtering, and gives a small performance win.

  • Refactors
    • Added collect_topic_subscribers returning TopicSubscribers (one state.read() sweep).
    • Added build_envelope_attrs to build SNS envelope MessageAttributes.
    • Introduced TopicFanoutContext to pass shared data cleanly.
    • Extracted deliver_to_{sqs,http,lambda,email,sms}_subscribers on SnsService.
    • publish now calls these helpers; behavior is unchanged.

Written for commit 73639b1. Summary will update on new commits.

- Extract collect_topic_subscribers returning a TopicSubscribers struct
  with per-protocol Vecs (sqs, http, lambda, email, sms). The single
  state.read() now does one sweep instead of five inline filters.
- Extract build_envelope_attrs for the Map<String, Value> used in every
  SNS notification envelope.
- Introduce TopicFanoutContext to carry the message / subject / envelope
  values shared across the per-protocol deliverers.
- Extract deliver_to_sqs_subscribers, deliver_to_http_subscribers,
  deliver_to_lambda_subscribers, deliver_to_email_subscribers, and
  deliver_to_sms_subscribers as methods on SnsService. The publish
  topic branch is now a short fan-out sequence that calls each one.
Copy link
Copy Markdown

@cubic-dev-ai cubic-dev-ai Bot left a comment

Choose a reason for hiding this comment

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

No issues found across 1 file

@vieiralucas vieiralucas merged commit 3ab3c51 into main Apr 13, 2026
22 checks passed
@vieiralucas vieiralucas deleted the worktree-cleanup-sns-publish-fanout branch April 13, 2026 12:29
vieiralucas added a commit that referenced this pull request Apr 13, 2026
…text

fire_rule took 7 positional args (state + delivery + lambda_state +
logs_state + container_runtime + bus_name + rule_name). Bundle the five
that are 'where the surrounding services live' into FireRuleContext<'a>;
keep bus_name and rule_name as regular params since they're the actual
lookup keys. Same shape as the SNS TopicFanoutContext from PR #344.

Updates the three unit tests and the server's /_fakecloud/eventbridge/
fire-rule handler call site.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant