import { ISMSSender } from '../../interfaces/smsSender.interface'; import { Twilio } from 'twilio'; import { USERNAME, PASSWORD, FROM } from '../../utils/constants'; import { MessageInstance } from 'twilio/lib/rest/api/v2010/account/message'; import { SendResult } from '../../types/sendResult.type'; import { NotProvidedCredentialsError } from '../../errors'; export default class TwilioSMSSenderClient implements ISMSSender { private client: Twilio; constructor() { if (USERNAME && PASSWORD && FROM) this.client = new Twilio(USERNAME, PASSWORD); else throw new NotProvidedCredentialsError(); } public async send( phones: string[] = [], message: string, ): Promise { const result: SendResult = { sent: [], failed: [], }; await Promise.all( phones.map((phone) => this.sendOne(phone, message) .then(() => result.sent.push({ phone })) .catch((error) => result.failed.push({ phone, error: error.message }), ), ), ); return result; } private sendOne = ( phone: string, message: string, ): Promise => this.client.messages.create({ from: FROM, to: phone, body: message, }); }