Unify sender workers into one package - #583
Conversation
There was a problem hiding this comment.
🟡 Changes recommended
There are confirmed runtime/templating bugs (undefined variables, wrong Twig include vars, broken prettyTime pluralization) and a TS visibility issue (channelWorkers private but referenced) that should be fixed before merge.
Once you've addressed the issues Copilot identified, you can request another Copilot review.
This review doesn't count toward merge requirements. Sign up for the private preview to control whether Copilot approvals count.
Pull request overview
This PR consolidates multiple per-channel “sender” workers (email/telegram/slack/webhook/loop) into a single workers/sender package that starts one queue consumer per enabled channel while sharing MongoDB connections, aiming to reduce k8s resource usage.
Changes:
- Replace standalone channel sender workers with one multi-channel sender process (
SenderWorker+ChannelSenderWorker). - Move channel providers/templates under
workers/sender/src/providers/<channel>/and update tests accordingly. - Update local/dev/prod run/test wiring (root
package.json, compose files, worker name registry).
File summaries
| File | Description |
|---|---|
| workers/webhook/src/index.ts | Removes standalone webhook sender worker entrypoint |
| workers/webhook/package.json | Removes standalone webhook worker package metadata |
| workers/telegram/src/index.ts | Removes standalone telegram sender worker entrypoint |
| workers/telegram/README.md | Removes standalone telegram worker docs |
| workers/telegram/package.json | Removes standalone telegram worker package metadata |
| workers/slack/yarn.lock | Removes slack worker lockfile (worker removed) |
| workers/slack/src/index.ts | Removes standalone slack sender worker entrypoint |
| workers/slack/package.json | Removes standalone slack worker package metadata |
| workers/sender/tests/worker.test.ts | Updates worker tests for multi-channel sender |
| workers/sender/tests/webhook/provider.test.ts | Repoints webhook provider tests to new paths |
| workers/sender/tests/webhook/mocks/several-events-notify.ts | Adds webhook mock payload fixture |
| workers/sender/tests/webhook/mocks/event-notify.ts | Adds webhook mock payload fixture |
| workers/sender/tests/webhook/mocks/assignee-notify.ts | Adds webhook mock payload fixture |
| workers/sender/tests/telegram/provider.test.ts | Repoints telegram provider tests to new paths |
| workers/sender/tests/slack/utils.test.ts | Repoints slack utils test to new paths |
| workers/sender/tests/slack/provider.test.ts | Repoints slack provider tests to new paths |
| workers/sender/tests/slack/mocks/several-events-notify.ts | Adds slack mock payload fixture |
| workers/sender/tests/slack/mocks/event-notify.ts | Adds slack mock payload fixture |
| workers/sender/tests/sender-example.ts | Removes example sender worker class (replaced) |
| workers/sender/tests/loop/provider.test.ts | Repoints loop provider tests to new paths |
| workers/sender/tests/loop/mocks/several-events-notify.ts | Adds loop mock payload fixture |
| workers/sender/tests/loop/mocks/event-notify.ts | Adds loop mock payload fixture |
| workers/sender/tests/email/provider.test.ts | Repoints email provider tests to new paths |
| workers/sender/src/providers/webhook/types/template.d.ts | Adds webhook delivery shape type |
| workers/sender/src/providers/webhook/templates/index.ts | Exports webhook template helpers |
| workers/sender/src/providers/webhook/templates/generic.ts | Implements generic webhook serializer |
| workers/sender/src/providers/webhook/provider.ts | Adds webhook provider in unified sender |
| workers/sender/src/providers/webhook/deliverer.ts | Moves webhook HTTP deliverer under sender |
| workers/sender/src/providers/telegram/types/template.d.ts | Adds telegram template interface type |
| workers/sender/src/providers/telegram/templates/several-events.ts | Adds telegram several-events template |
| workers/sender/src/providers/telegram/templates/index.ts | Exports telegram templates registry |
| workers/sender/src/providers/telegram/templates/event.ts | Adds telegram event template |
| workers/sender/src/providers/telegram/provider.ts | Updates telegram provider template typing import |
| workers/sender/src/providers/slack/types/template.d.ts | Adds slack template interface type |
| workers/sender/src/providers/slack/templates/utils.ts | Adds slack template helper utilities |
| workers/sender/src/providers/slack/templates/several-events.ts | Adds slack several-events template |
| workers/sender/src/providers/slack/templates/index.ts | Exports slack templates registry |
| workers/sender/src/providers/slack/templates/event.ts | Adds slack event template |
| workers/sender/src/providers/slack/provider.ts | Updates slack provider template typing import |
| workers/sender/src/providers/slack/deliverer.ts | Adds slack deliverer abstraction for testing |
| workers/sender/src/providers/loop/types/template.d.ts | Adds loop template interface type |
| workers/sender/src/providers/loop/templates/several-events.ts | Fixes loop template util import path |
| workers/sender/src/providers/loop/templates/index.ts | Exports loop templates registry |
| workers/sender/src/providers/loop/templates/event.ts | Repoints toMaxLen helper to unified slack utils |
| workers/sender/src/providers/loop/provider.ts | Updates loop provider template typing import |
| workers/sender/src/providers/loop/deliverer.ts | Adds loop deliverer abstraction |
| workers/sender/src/providers/email/templates/names.ts | Adds generated email template names enum |
| workers/sender/src/providers/email/templates/index.ts | Updates template path docs to new location |
| workers/sender/src/providers/email/templates/extensions.ts | Adds twig extensions/filters for email templates |
| workers/sender/src/providers/email/templates/emails/workspace-invite/text.twig | Adds workspace-invite email (text) |
| workers/sender/src/providers/email/templates/emails/workspace-invite/subject.twig | Adds workspace-invite email (subject) |
| workers/sender/src/providers/email/templates/emails/workspace-invite/html.twig | Adds workspace-invite email (html) |
| workers/sender/src/providers/email/templates/emails/sign-up/text.twig | Adds sign-up email (text) |
| workers/sender/src/providers/email/templates/emails/sign-up/subject.twig | Adds sign-up email (subject) |
| workers/sender/src/providers/email/templates/emails/sign-up/html.twig | Adds sign-up email (html) |
| workers/sender/src/providers/email/templates/emails/several-events/text.twig | Adds several-events email (text) |
| workers/sender/src/providers/email/templates/emails/several-events/subject.twig | Adds several-events email (subject) |
| workers/sender/src/providers/email/templates/emails/several-events/html.twig | Adds several-events email (html) |
| workers/sender/src/providers/email/templates/emails/payment-success/text.twig | Adds payment-success email (text) |
| workers/sender/src/providers/email/templates/emails/payment-success/subject.twig | Adds payment-success email (subject) |
| workers/sender/src/providers/email/templates/emails/payment-success/html.twig | Adds payment-success email (html) |
| workers/sender/src/providers/email/templates/emails/payment-failed/text.twig | Adds payment-failed email (text) |
| workers/sender/src/providers/email/templates/emails/payment-failed/subject.twig | Adds payment-failed email (subject) |
| workers/sender/src/providers/email/templates/emails/payment-failed/html.twig | Adds payment-failed email (html) |
| workers/sender/src/providers/email/templates/emails/password-reset/text.twig | Adds password-reset email (text) |
| workers/sender/src/providers/email/templates/emails/password-reset/subject.twig | Adds password-reset email (subject) |
| workers/sender/src/providers/email/templates/emails/password-reset/html.twig | Adds password-reset email (html) |
| workers/sender/src/providers/email/templates/emails/events-limit-almost-reached/text.twig | Adds events-limit email (text) |
| workers/sender/src/providers/email/templates/emails/events-limit-almost-reached/subject.twig | Adds events-limit email (subject) |
| workers/sender/src/providers/email/templates/emails/events-limit-almost-reached/html.twig | Adds events-limit email (html) |
| workers/sender/src/providers/email/templates/emails/event/text.twig | Adds event email (text) |
| workers/sender/src/providers/email/templates/emails/event/subject.twig | Adds event email (subject) |
| workers/sender/src/providers/email/templates/emails/event/html.twig | Adds event email (html) |
| workers/sender/src/providers/email/templates/emails/days-limit-almost-reached/text.twig | Adds days-limit email (text) |
| workers/sender/src/providers/email/templates/emails/days-limit-almost-reached/subject.twig | Adds days-limit email (subject) |
| workers/sender/src/providers/email/templates/emails/days-limit-almost-reached/html.twig | Adds days-limit email (html) |
| workers/sender/src/providers/email/templates/emails/blocked-workspace-reminder/text.twig | Adds blocked reminder email (text) |
| workers/sender/src/providers/email/templates/emails/blocked-workspace-reminder/subject.twig | Adds blocked reminder email (subject) |
| workers/sender/src/providers/email/templates/emails/blocked-workspace-reminder/html.twig | Adds blocked reminder email (html) |
| workers/sender/src/providers/email/templates/emails/block-workspace/text.twig | Adds block-workspace email (text) |
| workers/sender/src/providers/email/templates/emails/block-workspace/subject.twig | Adds block-workspace email (subject) |
| workers/sender/src/providers/email/templates/emails/block-workspace/html.twig | Adds block-workspace email (html) |
| workers/sender/src/providers/email/templates/emails/assignee/text.twig | Adds assignee email (text) |
| workers/sender/src/providers/email/templates/emails/assignee/subject.twig | Adds assignee email (subject) |
| workers/sender/src/providers/email/templates/emails/assignee/html.twig | Adds assignee email (html) |
| workers/sender/src/providers/email/templates/components/workspace.twig | Adds reusable workspace header component |
| workers/sender/src/providers/email/templates/components/project.twig | Adds reusable project header component |
| workers/sender/src/providers/email/templates/components/layout.twig | Adds shared email layout wrapper |
| workers/sender/src/providers/email/templates/components/filename.twig | Adds filename display component |
| workers/sender/src/providers/email/templates/components/event.twig | Adds reusable event component |
| workers/sender/src/providers/email/templates/components/event-info.twig | Adds reusable event meta component |
| workers/sender/src/providers/email/templates/components/button.twig | Adds reusable CTA button component |
| workers/sender/src/providers/email/templates/components/backtrace.twig | Adds reusable backtrace component |
| workers/sender/src/providers/email/provider.ts | Updates email provider util import path |
| workers/sender/src/index.ts | Implements multi-channel sender orchestrator |
| workers/sender/src/channels.ts | Adds channel→provider registry |
| workers/sender/src/channel-sender.ts | Adds per-channel queue consumer worker |
| workers/sender/scripts/generateTemplatesNames.ts | Updates generator paths for moved templates |
| workers/sender/scripts/emailOverviewForm.twig | Updates email overview links to sender |
| workers/sender/scripts/emailOverview.ts | Repoints email overview script to new template module |
| workers/sender/README.md | Updates docs for unified sender structure/config |
| workers/sender/package.json | Adds dependencies/scripts merged from channel workers |
| workers/sender/.env.sample | Documents SENDER_CHANNELS + SMTP vars |
| workers/loop/yarn.lock | Removes loop worker lockfile (worker removed) |
| workers/loop/src/index.ts | Removes standalone loop sender worker entrypoint |
| workers/loop/package.json | Removes standalone loop worker package metadata |
| workers/email/yarn.lock | Removes email worker lockfile (worker removed) |
| workers/email/src/index.ts | Removes standalone email sender worker entrypoint |
| workers/email/src/env.ts | Removes email worker env loader |
| workers/email/README.md | Removes email worker docs (moved to sender) |
| workers/email/package.json | Removes standalone email worker package metadata |
| workers/email/.gitignore | Removes email worker .env ignore (worker removed) |
| workers/email/.env.sample | Removes email worker env sample (moved to sender) |
| README.md | Updates compose example to hawk-worker-sender |
| package.json | Consolidates run/test scripts under sender |
| lib/workerNames.js | Adds explicit per-channel sender queue names |
| docker-compose.prod.yml | Replaces email/telegram services with sender |
| docker-compose.dev.yml | Replaces multiple sender services with sender |
Review details
- Files reviewed: 46/118 changed files
- Comments generated: 1
- Review effort level: Lite
We're testing this review assessment. Please use 👍 or 👎 to tell us if it's correct.
| * Workers of enabled channels | ||
| */ | ||
| protected abstract channelType: ChannelType; | ||
| private channelWorkers: ChannelSenderWorker[]; |
Merges email, telegram, slack, webhook and loop sender workers into workers/sender.
One process serves all channels, each channel still consumes its own sender/ queue, MongoDB connections are shared.
Goal: optimize k8s resource usage