Commit Graph

22 Commits

Author SHA1 Message Date
maaz519 06449acd96 fix: pass loggedOut reason in closeAll to prevent reconnect timers after shutdown 2026-05-27 17:38:37 +05:30
maaz519 41aabc4c0d fix: address code quality issues in session pool, approval, and main
- session.ts: add onReconnect callback so reconnected socket replaces stale pool entry
- session-pool.ts: pass onReconnect to update pool on reconnect; add closeAll() to gracefully end WebSocket connections on shutdown
- approval.ts: use approved flag so double-approval race (updateMany count=0) returns null instead of sending duplicate forward jobs
- main.ts: wrap pool.add() in try/catch to continue if one account fails; replace silent groupMap fallback with explicit error log and early return; call pool.closeAll() before BullMQ shutdown to prevent hanging sockets
- Tests: add closeAll() test to session-pool.test.ts; add double-approval race test to approval.test.ts (56 tests total, all passing)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-27 17:35:52 +05:30
maaz519 9e3ee0cd38 feat(worker): wire multi-account pool, reactions → approval → forward pipeline
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-27 17:28:08 +05:30
maaz519 5ad33fd416 feat(worker): forward queue + processor with 20/min rate limiter 2026-05-27 17:23:08 +05:30
maaz519 57a06bc517 fix(worker): atomic approval via transaction, guard null targetGroup
Wrap message.update + approval.create in a $transaction using updateMany
with a PENDING status guard to prevent duplicate approvals and audit gaps.
Filter out null targetGroup routes to prevent runtime errors on DB inconsistency.
Add TODO comment for multi-platform support and fallback accountId comment.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-27 17:21:17 +05:30
maaz519 a07f393373 feat(worker): handleStarReaction approval core with tests
Implement approval core logic for Task 5: when admin reacts to WhatsApp
message with , verify admin status, update message to APPROVED, create
Approval record, find active SyncRoutes from source group, and return
ForwardJobData[] for each target group. All 7 tests pass.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-27 17:17:02 +05:30
maaz519 9cdc41e23e fix(worker): improve sendMessage error, add session-pool unit tests 2026-05-27 17:14:56 +05:30
maaz519 0f30af6018 feat(worker): WhatsAppSessionPool + group-sync accepts accountId 2026-05-27 17:11:19 +05:30
maaz519 705bd177e8 fix(worker): reactorJid null guard, document reaction removal, restore comments 2026-05-27 17:03:47 +05:30
maaz519 f255ef91fb feat(worker): seal WhatsApp adapter — normalize inside session, reactions handled internally
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-27 16:58:22 +05:30
maaz519 c7cec29c83 fix: rename queue from tower:ingest to tower-ingest (BullMQ v5 forbids colons)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-27 16:23:55 +05:30
maaz519 b32f901005 fix: load .env in worker dev script via dotenv/config
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-27 16:23:02 +05:30
maaz519 31f047492a fix: harden session error handling, normalizer null guard, extract redis-connection
- Wrap groupFetchAllParticipating in try/catch to prevent unhandled rejection on connect
- Catch errors from async onMessage/onGroups callbacks via Promise.resolve().catch
- Return null from normalizer when key.id is missing (prevents empty upsert key collision)
- Extract parseRedisUrl to redis-connection.ts to eliminate duplication

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-27 16:18:56 +05:30
maaz519 213e496c3a feat: wire worker bootstrap — session → normalizer → queue pipeline
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-27 15:39:19 +05:30
maaz519 fe7a779ed7 chore: add Prisma client to worker, turbo generate task, update env
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-27 15:36:52 +05:30
maaz519 a4771aaf05 feat: add Baileys WhatsApp session with reconnect logic
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-27 15:33:46 +05:30
maaz519 0d45bd8bd6 feat: add WhatsApp group sync to database
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-27 15:19:15 +05:30
maaz519 81da0d483e feat: add BullMQ ingest queue and processor
Idempotent message persistence via prisma.message.upsert. Uses URL parsing
to pass connection options to BullMQ, avoiding ioredis version conflicts.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-27 15:18:04 +05:30
maaz519 a4135fe983 feat: add BullMQ ingest queue and processor
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-27 15:15:08 +05:30
maaz519 7151e0dd6d feat: add Baileys message normalizer
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-27 15:08:10 +05:30
maaz519 4c721f0b19 feat: add tag detector for TOWER message flagging
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-27 15:00:37 +05:30
maaz519 f26c50dec0 feat: scaffold worker application shell
Adds apps/worker with TypeScript config, BullMQ/ioredis dependencies,
pino logger bootstrap, and a smoke test. Queue consumers wired in later phases.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-27 14:36:15 +05:30