UNPKG

@bitblit/ratchet-common

Version:

Common tools for general use

70 lines 3.47 kB
import fetch from 'cross-fetch'; import { RequireRatchet } from '../../lang/require-ratchet.js'; import { Base64Ratchet } from '../../lang/base64-ratchet.js'; import { StringRatchet } from '../../lang/string-ratchet.js'; import { Logger } from '../../logger/logger.js'; export class TwilioRatchet { accountSid; authToken; outBoundNumber; static TWILLIO_BASE_API_URL = 'https://api.twilio.com/2010-04-01'; constructor(accountSid, authToken, outBoundNumber) { this.accountSid = accountSid; this.authToken = authToken; this.outBoundNumber = outBoundNumber; RequireRatchet.notNullOrUndefined(accountSid, 'accountSid'); RequireRatchet.notNullOrUndefined(authToken, 'authToken'); RequireRatchet.notNullOrUndefined(outBoundNumber, 'outBoundNumber'); RequireRatchet.true(TwilioRatchet.isValidE164Number(outBoundNumber), 'outBoundNumber invalid format'); } static async sendMessageDirect(accountSid, authToken, outBoundNumber, recipientPhoneNumbers, message) { const ratchet = new TwilioRatchet(accountSid, authToken, outBoundNumber); const rval = await ratchet.sendMessage(recipientPhoneNumbers, message); return rval; } static generateTwilioBasicAuth(sid, authToken) { const authHeader = 'Basic ' + Base64Ratchet.generateBase64VersionOfString(sid + ':' + authToken); return authHeader; } async sendMessage(recipientPhoneNumbers, message) { const rval = []; RequireRatchet.notNullOrUndefined(recipientPhoneNumbers, 'recipientPhoneNumbers'); RequireRatchet.notNullOrUndefined(StringRatchet.trimToNull(message), 'message'); RequireRatchet.true(recipientPhoneNumbers.length > 0, 'recipientPhoneNumbers non-empty'); if (!!recipientPhoneNumbers && recipientPhoneNumbers.length > 0 && !!StringRatchet.trimToNull(message)) { Logger.info('Sending %s to %j', message, recipientPhoneNumbers); for (const phoneNumber of recipientPhoneNumbers) { Logger.info('To: %s', phoneNumber); if (!TwilioRatchet.isValidE164Number(phoneNumber)) { throw new Error('number must be E164 format!'); } const body = 'Body=' + encodeURIComponent(message) + '&From=' + encodeURIComponent(this.outBoundNumber) + '&To=' + encodeURIComponent(phoneNumber); const post = { method: 'post', headers: { authorization: TwilioRatchet.generateTwilioBasicAuth(this.accountSid, this.authToken), 'Content-Type': 'application/x-www-form-urlencoded', }, body: body, }; const res = await fetch(TwilioRatchet.TWILLIO_BASE_API_URL + '/Accounts/' + this.accountSid + '/Messages.json', post); const parsedResponse = await res.json(); Logger.debug('TwilioRatchet: For %s got %j', phoneNumber, parsedResponse); rval.push(parsedResponse); } } else { Logger.warn('Not sending empty message / empty recipients'); } return rval; } static isValidE164Number(num) { return /^\+?[1-9]\d{1,14}$/.test(num); } } //# sourceMappingURL=twilio-ratchet.js.map