@bitblit/ratchet-common
Version:
Common tools for general use
70 lines • 3.47 kB
JavaScript
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