logo
Fork me on GitHub

tests codecov license npm npm

Cloud Native Notifications Library

Airhorn makes it easy to send SMS, SMTP, Webhooks, and mobile push notifications easily using templates through your standard cloud providers. We focused on making it cloud native by default (using cloud services).

Table of Contents

Features

Library API

send()

The send() function, located in airhorn.ts, is used to send notifications. It accepts the following parameters:

sendSMTP()

The sendSMTP() function, located in airhorn.ts, is used to send SMTP notifications. It accepts the following parameters:

sendSMS()

The sendSMS() function, located in airhorn.ts, is used to send SMS notifications. It accepts the following parameters:

sendWebhook()

The sendWebhook() function, located in airhorn.ts, is used to send Webhook notifications. It accepts the following parameters:

sendMobilePush()

The sendMobilePush() function, located in airhorn.ts, is used to send Mobile Push notifications. It accepts the following parameters:

options

The Options class, enables you to configure the settings of Airhorn. It accepts the following parameters:

These settings can be overridden by passing them in when you create a new instance of Airnorn:

const airhorn = new Airhorn({
        TEMPLATE_PATH: './templates',
        DEFAULT_TEMPLATE_LANGUAGE: 'en',
        ENVIRONMENT: 'development',
        TWILIO_SMS_ACCOUNT_SID: '',
        TWILIO_SMS_AUTH_TOKEN: '',
        TWILIO_SENDGRID_API_KEY: '',
        AWS_SES_REGION: '',
        AWS_SMS_REGION: '',
        AWS_SNS_REGION: '',
        FIREBASE_CERT: ''
        });
    });
    

You can also pass these settings via your process.env at the start of your application.

Templates

This library supports the use of templates to easily send formatted messages to different providers. Sample templates can be found in test/templates within the subdirectories cool-multi-lingual, generic-template-foo, and multiple-types-bar.

By default, Config will look for templates at ./templates. However, this path can be manually adjusted if needed.

Language Localization

With templates, users can easily send messages in different languages. A sample architecture for language localized templates can be found in the cool-multi-lingual directory within test/templates. This directory contains folders for English and Spanish language codes, 'en' and 'es' respectively. Each of these directories contains SMS, SMTP, and Webhook templates in the appropriate language. To send notifications in a specific language, users can simply provide the appropriate languageCode parameter to the send() function.

Template Overrides

When looking at the sample templates, we can see that some of them support word substitution. For example, the generic SMTP template looks like this:

---
    subject: Generic Hello
    ---
    <p>Hello {{ firstName }} {{ lastName }}</p>
    <p>Your email is {{ email }} and this is a generic template</p>
    

To substitute the appropriate text for firstName, lastName, and email, users can provide the appropriate data to the send() function. This data is then passed to the template and rendered automatically.

Examples for using this library

This library can be used to easily send a variety of notifications. In this section, we'll cover how to implement some simple use cases.

Sending a simple email

Using the send function, we can email '[email protected]' from '[email protected]' using the generic template 'generic-template-foo'. We'll also use the provider type ProviderType.SMTP to indicate that we're sending an email:

import { Airhorn, ProviderType } from 'airhorn';
    const airhorn = new Airhorn();
    await airhorn.send('[email protected]', '[email protected]', 'generic-template-foo', ProviderType.SMTP);
    

Sending a simple webhook

Here, we'll send a simple webhook to the URL 'https://httpbin.org/post':

const airhorn = new Airhorn();
    airhorn.send('https://httpbin.org/post', 'foo', 'bar', ProviderType.WEBHOOK);
    

Using multiple providers

In this example, we'll send a message using multiple email providers:

  1. Add in the AWS SES configuration
  2. Add in the Sendgrid configuration
  3. Send the message and it will randomly balance between the two providers.
const airhorn = new Airhorn({
            AWS_SES_REGION = 'us-east-1',
            TWILIO_SENDGRID_API_KEY = 'SENDGRID_API_KEY'
    	});
    
    await airhorn.send('[email protected]', '[email protected]', 'generic-template-foo', ProviderType.SMTP);
    
    

Supported Cloud Service Providers

This library supports sending notifications via email, SMS, and Mobile Push for the following providers:

In this section, we'll describe how to use each of these notification services.

Email providers

This library supports sending emails via AWS SES and Twilio Sendgrid.

AWS SES

After configuring your system to use AWS SES, you can easily use airhorn to send emails. In this example, we'll email '[email protected]' from '[email protected]' using the email template 'generic-template-foo'. We'll list the provider type as ProviderType.SMTP to indicate that we're sending an email:

const airhorn = new Airhorn({
            AWS_SES_REGION = 'us-east-1',
    	});
    await airhorn.send('[email protected]', '[email protected]', 'generic-template-foo', ProviderType.SMTP);
    

Twilio Sendgrid

To send emails via Twilio Sendgrid, first update the TWILIO_SENDGRID_API_KEY value in options.ts. Then, we can use the same syntax as above to send an email through Twilio Sendgrid:

const airhorn = new Airhorn({
            TWILIO_SENDGRID_API_KEY = 'SENDGRID_API_KEY'
    	});
    await airhorn.send('[email protected]', '[email protected]', 'generic-template-foo', ProviderType.SMTP);
    

SMS providers

This library supports sending SMS using AWS SMS and Twilio.

AWS SMS

Once your system is configured to use AWS SMS, you can send SMS notifications through AWS SMS. In this example, we'll send the notification to the phone number '5555555555' from the number '5552223333' with the raw text data 'Test message text'. Then, we'll list the provider type as ProviderType.SMS.

const airhorn = new Airhorn({
            AWS_SMS_REGION = 'us-east-1',
        });
    await airhorn.send('5555555555', '5552223333', 'Test message text', ProviderType.SMS);
    

Twilio SMS

To send SMS notifications via Twilio SMS, first update the TWILIO_SMS_ACCOUNT_SID and the TWILIO_SMS_AUTH_TOKEN values via the options as shown below. Then, we can send an SMS notification using the same syntax as above:

const airhorn = new Airhorn({
            TWILIO_SMS_ACCOUNT_SID = 'TWILIO_SMS_ACCOUNT_SID',
            TWILIO_SMS_AUTH_TOKEN = 'TWILIO_SMS_AUTH_TOKEN'
        });
    await airhorn.send('5555555555', '5552223333', 'Test message text', ProviderType.SMS);
    

Mobile push providers

This library supports sending Mobile Push notifications using AWS SNS and Google Firebase.

AWS SNS

To use AWS SNS you will need to create a new SNS application in the AWS console and integrate the AWS SNS SDK into your application.

  1. Obtain the credentials and device token for the mobile platforms that you want to support.
  2. Use the credentials to create a platform application object (PlatformApplicationArn) using Amazon SNS. For more information, see Creating a platform endpoint.
  3. Use the returned credentials to request a device token for your mobile app and device from the mobile platforms. The token you receive represents your mobile app and device.
  4. Use the device token and the PlatformApplicationArn to create a platform endpoint object (EndpointArn) using Amazon SNS. For more information, see Creating a platform endpoint.

Then, you can send the push message to the device endpoint using airhorn:

const airhorn = new Airhorn({
            AWS_SNS_REGION = 'us-east-1',
        });
    await airhorn.send('endpointArn', '', 'generic-template-foo', ProviderType.MOBILE_PUSH);
    

Firebase for Mobile Push

To use Firebase in your application, you will need to create a new project in the Firebase console and integrate the Firebase SDK according to the Firebase documentation.

In your Firebase Project Settings, go to the Service accounts tab to generate your private key as a json file and put the content of the file as FIREBASE_CERT environment variable.

Then, you can send the push message to the device endpoint using airhorn:

const airhorn = new Airhorn({
            FIREBASE_CERT = 'FIREBASE_CERT'
        });
    await airhorn.send('endpointArn', '', 'generic-template-foo', ProviderType.MOBILE_PUSH);
    

How to Contribute

Now that you've set up your workspace, you're ready to contribute changes to the airhorn repository you can refer to the CONTRIBUTING guide. If you have any questions please feel free to ask by creating an issue and label it question.

Licensing

This project is licensed under MIT and copyright by Jared Wray 2021-future.

Contributors

Latest's Releases

v3.0.2 May 06, 2024

What's Changed

Full Changelog: https://github.com/jaredwray/airhorn/compare/v3.0.1...v3.0.2

v3.0.1 April 06, 2024

What's Changed

Full Changelog: https://github.com/jaredwray/airhorn/compare/v3.0.0...v3.0.1

v3.0.0 March 07, 2024

Migration to ESM and Nodejs 18+ Support

This as a major upgrade moving the library to nodejs 18 and also ESM.

What's Changed

Full Changelog: https://github.com/jaredwray/airhorn/compare/v2.0.6...v3.0.0

All Releases