• threema.js
  • const NotificationProvider = require("./notification-provider");
    const axios = require("axios");
    
    class Threema extends NotificationProvider {
        name = "threema";
    
        /**
         * @inheritdoc
         */
        async send(notification, msg, monitorJSON = null, heartbeatJSON = null) {
            const url = "https://msgapi.threema.ch/send_simple";
    
            const config = {
                headers: {
                    "Accept": "*/*",
                    "Content-Type": "application/x-www-form-urlencoded; charset=utf-8"
                }
            };
    
            const data = {
                from: notification.threemaSenderIdentity,
                secret: notification.threemaSecret,
                text: msg
            };
    
            switch (notification.threemaRecipientType) {
                case "identity":
                    data.to = notification.threemaRecipient;
                    break;
                case "phone":
                    data.phone = notification.threemaRecipient;
                    break;
                case "email":
                    data.email = notification.threemaRecipient;
                    break;
                default:
                    throw new Error(`Unsupported recipient type: ${notification.threemaRecipientType}`);
            }
    
            try {
                await axios.post(url, new URLSearchParams(data), config);
                return "Threema notification sent successfully.";
            } catch (error) {
                const errorMessage = this.handleApiError(error);
                this.throwGeneralAxiosError(errorMessage);
            }
        }
    
        /**
         * Handle Threema API errors
         * @param {any} error The error to handle
         * @returns {string} Additional error context
         */
        handleApiError(error) {
            if (!error.response) {
                return error.message;
            }
            switch (error.response.status) {
                case 400:
                    return "Invalid recipient identity or account not set up for basic mode (400).";
                case 401:
                    return "Incorrect API identity or secret (401).";
                case 402:
                    return "No credits remaining (402).";
                case 404:
                    return "Recipient not found (404).";
                case 413:
                    return "Message is too long (413).";
                case 500:
                    return "Temporary internal server error (500).";
                default:
                    return error.message;
            }
        }
    }
    
    module.exports = Threema;