@peopl-health/nexus 3.13.10 → 3.13.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,5 @@
1
1
  const axios = require('axios');
2
+ const sharp = require('sharp');
2
3
  const { v4: uuidv4 } = require('uuid');
3
4
  const twilio = require('twilio');
4
5
 
@@ -6,7 +7,7 @@ const runtimeConfig = require('../config/runtimeConfig');
6
7
  const { generatePresignedUrl } = require('../config/awsConfig');
7
8
 
8
9
  const { sanitizeMediaFilename } = require('../utils/sanitizerUtils');
9
- const { validateMedia, getMediaType } = require('../utils/mediaValidator');
10
+ const { validateMedia, getMediaType, MEDIA_LIMITS, STICKER_DIMENSIONS } = require('../utils/mediaValidator');
10
11
  const { logger } = require('../utils/logger');
11
12
  const { calculateDelay } = require('../utils/scheduleUtils');
12
13
 
@@ -292,7 +293,7 @@ class TwilioProvider extends MessageProvider {
292
293
 
293
294
  try {
294
295
  const response = await axios.get(fileUrl, { responseType: 'arraybuffer' });
295
- const buffer = Buffer.from(response.data);
296
+ let buffer = Buffer.from(response.data);
296
297
  let contentType = messageData.contentType || response.headers['content-type'];
297
298
  const declaredType = messageData.fileType || null;
298
299
 
@@ -306,6 +307,23 @@ class TwilioProvider extends MessageProvider {
306
307
  contentType = fallbackType || 'application/octet-stream';
307
308
  }
308
309
 
310
+ if (contentType === 'image/webp') {
311
+ const { width, height } = await sharp(buffer).metadata();
312
+ const isSticker = buffer.length < MEDIA_LIMITS.sticker
313
+ && width === STICKER_DIMENSIONS.width
314
+ && height === STICKER_DIMENSIONS.height;
315
+ if (!isSticker) {
316
+ buffer = await sharp(buffer)
317
+ .flatten({ background: '#ffffff' })
318
+ .jpeg({ quality: 85 })
319
+ .toBuffer();
320
+ contentType = 'image/jpeg';
321
+ if (messageData.fileName) {
322
+ messageData.fileName = messageData.fileName.replace(/\.[^.]+$/, '.jpg');
323
+ }
324
+ }
325
+ }
326
+
309
327
  const validation = validateMedia(buffer, contentType);
310
328
  const mediaType = validation.valid ? validation.mediaType : (declaredType || getMediaType(contentType));
311
329
 
@@ -459,42 +459,6 @@ const markMessagesAsReadController = async (req, res) => {
459
459
  }
460
460
  };
461
461
 
462
- const sendTemplateToNewNumberController = async (req, res) => {
463
- try {
464
- const { phoneNumber, templateId, variables, triggeredBy } = req.body;
465
-
466
- if (!phoneNumber || !templateId) {
467
- return res.status(400).json({
468
- success: false,
469
- error: 'Phone number and template ID are required'
470
- });
471
- }
472
-
473
- const messageData = {
474
- code: ensureWhatsAppFormat(phoneNumber),
475
- contentSid: templateId,
476
- triggeredBy: triggeredBy || null
477
- };
478
-
479
- if (variables && Object.keys(variables).length > 0) {
480
- messageData.variables = variables;
481
- }
482
-
483
- const message = await sendMessage(messageData);
484
- res.status(200).json({
485
- success: true,
486
- message: 'Template sent successfully',
487
- messageId: message.sid
488
- });
489
- } catch (error) {
490
- logger.error('Error sending template:', { error: error.message });
491
- res.status(500).json({
492
- success: false,
493
- error: error.message || 'Failed to send template'
494
- });
495
- }
496
- };
497
-
498
462
  const getOpenAIThreadMessagesController = async (req, res) => {
499
463
  try {
500
464
  const { phoneNumber } = req.params;
@@ -736,7 +700,6 @@ module.exports = {
736
700
  getNewMessagesController,
737
701
  markMessagesAsReadController,
738
702
  searchConversationsController,
739
- sendTemplateToNewNumberController,
740
703
  startConversationController,
741
704
  getOpenAIThreadMessagesController,
742
705
  updateReviewStatusController,
@@ -23,7 +23,6 @@ const conversationRouteDefinitions = {
23
23
  'GET /:phoneNumber/openai': 'getOpenAIThreadMessagesController',
24
24
  'GET /:phoneNumber/search': 'searchMessagesByNumberController',
25
25
  'POST /reply': 'getConversationReplyController',
26
- 'POST /send-template': 'sendTemplateToNewNumberController',
27
26
  'POST /start': 'startConversationController',
28
27
  'POST /:phoneNumber/read': 'markMessagesAsReadController',
29
28
  'POST /case-documentation': 'caseDocumentationController',
@@ -138,7 +137,6 @@ const builtInControllers = {
138
137
  getNewMessagesController: conversationController.getNewMessagesController,
139
138
  getOpenAIThreadMessagesController: conversationController.getOpenAIThreadMessagesController,
140
139
  getConversationReplyController: conversationController.getConversationReplyController,
141
- sendTemplateToNewNumberController: conversationController.sendTemplateToNewNumberController,
142
140
  startConversationController: conversationController.startConversationController,
143
141
  markMessagesAsReadController: conversationController.markMessagesAsReadController,
144
142
  searchMessagesByNumberController: conversationController.searchMessagesByNumberController,
@@ -3,9 +3,11 @@ const MEDIA_LIMITS = {
3
3
  video: 16 * 1024 * 1024, // 16MB
4
4
  audio: 16 * 1024 * 1024, // 16MB
5
5
  document: 100 * 1024 * 1024, // 100MB (PDFs, etc.)
6
- sticker: 500 * 1024 // 500KB
6
+ sticker: 100 * 1024 // 100KB
7
7
  };
8
8
 
9
+ const STICKER_DIMENSIONS = { width: 512, height: 512 };
10
+
9
11
  const ALLOWED_FORMATS = {
10
12
  image: ['image/jpeg', 'image/png', 'image/webp'],
11
13
  video: ['video/mp4', 'video/3gpp'],
@@ -94,5 +96,6 @@ module.exports = {
94
96
  validateMediaFormat,
95
97
  getMediaType,
96
98
  MEDIA_LIMITS,
97
- ALLOWED_FORMATS
99
+ ALLOWED_FORMATS,
100
+ STICKER_DIMENSIONS
98
101
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@peopl-health/nexus",
3
- "version": "3.13.10",
3
+ "version": "3.13.12",
4
4
  "description": "Core messaging and assistant library for WhatsApp communication platforms",
5
5
  "keywords": [
6
6
  "whatsapp",
@@ -78,6 +78,7 @@
78
78
  "pdf-lib": "1.17.1",
79
79
  "pino": "10.0.0",
80
80
  "pino-pretty": "^10.2.0",
81
+ "sharp": "0.32.6",
81
82
  "uuid": "^9.0.0"
82
83
  },
83
84
  "devDependencies": {
@@ -85,7 +86,6 @@
85
86
  "eslint": "^8.47.0",
86
87
  "eslint-plugin-import": "^2.32.0",
87
88
  "jest": "^29.6.2",
88
- "sharp": "0.32.6",
89
89
  "typescript": "^5.1.6"
90
90
  },
91
91
  "peerDependencies": {