waWorker.js 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. const pddiktiService = require('../services/v2/pddikti.service')
  2. const waJobService = require('../services/waJob.service')
  3. const { processBatchUpdateSanksi } = require('../services/batchSanksi.service')
  4. const { logInfo, logError } = require('../utils/logger')
  5. let isWaWorkerRunning = false
  6. let isBatchWorkerRunning = false
  7. let waTimer = null
  8. let batchTimer = null
  9. const processWaJobs = async () => {
  10. if (isWaWorkerRunning) return
  11. isWaWorkerRunning = true
  12. try {
  13. const job = await waJobService.processNextJob()
  14. if (job) {
  15. logInfo('WA_WORKER', 'Processing job', { jobId: job._id, templateId: job.templateId })
  16. try {
  17. const response = await pddiktiService.whatsapp(
  18. job.templateId,
  19. job.contacts,
  20. job.body,
  21. job.buttons
  22. )
  23. await waJobService.markJobSuccess(job._id, response)
  24. } catch (error) {
  25. await waJobService.markJobFailed(job._id, error, job.attempt + 1)
  26. }
  27. }
  28. } catch (err) {
  29. logError('WA_WORKER', 'Error in worker tick', { error: err.message })
  30. } finally {
  31. isWaWorkerRunning = false
  32. }
  33. }
  34. const processBatchJobs = async () => {
  35. if (isBatchWorkerRunning) return
  36. isBatchWorkerRunning = true
  37. try {
  38. const { processed, error } = await processBatchUpdateSanksi()
  39. if (processed > 0) {
  40. logInfo('BATCH_WORKER', `Processed ${processed} batch items`, { errors: error.length })
  41. }
  42. } catch (err) {
  43. logError('BATCH_WORKER', 'Error in batch worker tick', { error: err.message })
  44. } finally {
  45. isBatchWorkerRunning = false
  46. }
  47. }
  48. const startWorker = (waIntervalMs = 3000, batchIntervalMs = 30000) => {
  49. logInfo('WORKER', `Starting Background Workers (WA: ${waIntervalMs}ms, Batch: ${batchIntervalMs}ms)`)
  50. waJobService.resetStuckJobs()
  51. waTimer = setInterval(processWaJobs, waIntervalMs)
  52. batchTimer = setInterval(processBatchJobs, batchIntervalMs)
  53. }
  54. const stopWorker = () => {
  55. if (waTimer) clearInterval(waTimer)
  56. if (batchTimer) clearInterval(batchTimer)
  57. logInfo('WORKER', 'Stopped Background Workers')
  58. }
  59. module.exports = {
  60. startWorker,
  61. stopWorker,
  62. }