SvelteKit Endpoints middleware for WhatsAppAPI

Hierarchy

Constructors

  • Main entry point for the API.

    It's highly recommended reading the named parameters docs at types.TheBasicConstructorArguments, at least for token, appSecret and webhookVerifyToken properties, which are the most common in normal usage.

    The other parameters are used for fine tunning the framework, such as ponyfill, which allows the code to execute on platforms that are missing standard APIs such as fetch and crypto.

    Parameters

    Returns SvelteKitMiddleware

    Throws

    If fetch is not defined in the enviroment and the provided ponyfill isn't a function

    Throws

    If secure is true, crypto.subtle is not defined in the enviroment and the provided ponyfill isn't an object

Properties

on: {
    message?: OnMessage;
    sent?: OnSent;
    status?: OnStatus;
} = {}

The callbacks for the events (message, sent, status)

Type declaration

Example

const Whatsapp = new WhatsAppAPI({
token: "my-token",
appSecret: "my-app-secret"
});

// Set the callback
Whatsapp.on.message = ({ from, phoneID }) => console.log(`Message from ${from} to bot ${phoneID}`);

// Remove the callback
Whatsapp.on.message = undefined;

Methods

  • Send the same Whatsapp message to multiple phone numbers.

    In order to avoid reaching the API rate limit, this method will send the messages in batches of 50 per second by default, but this can be changed using the batch_size and delay parameters.

    The API rate limit can be increased by contacting Facebook as explained here.

    Parameters

    • phoneID: string

      The bot's phone ID

    • to: string[]

      The users' phone numbers

    • message: ClientMessage

      A Whatsapp message, built using the corresponding module for each type of message.

    • batch_size: number = 50

      The number of messages to send per batch

    • delay: number = 1000

      The delay between each batch of messages in milliseconds

    Returns Promise<Promise<ServerMessageResponse | Response>[]>

    The server response

    Example

    import WhatsAppAPI from "whatsapp-api-js";
    import Text from "whatsapp-api-js/messages/text";

    const Whatsapp = new WhatsAppAPI({
    token: "YOUR_TOKEN",
    appSecret: "YOUR_APP_SECRET"
    });

    const phoneID = "YOUR_BOT_NUMBER";
    const users = ["YOUR_USER1_NUMBER", "YOUR_USER2_NUMBER"];
    const message = new Text("Hello World");

    const responses = Whatsapp.broadcastMessage(phoneID, users, message);

    Promise.all(responses).then(console.log);

    Throws

    if batch_size is lower than 1

    Throws

    if delay is lower than 0

  • Get a Media fetch from an url. When using this method, be sure to pass a trusted url, since the request will be authenticated with the token.

    Parameters

    • url: string

      The Media's url

    Returns Promise<Response>

    The fetch raw response

    Throws

    If url is not a valid url

    Example

    import WhatsAppAPI from "whatsapp-api-js";

    const token = "token";
    const appSecret = "appSecret";

    const Whatsapp = new WhatsAppAPI({ token, appSecret });

    const id = "mediaID";
    const { url } = await Whatsapp.retrieveMedia(id);
    const response = Whatsapp.fetchMedia(url);
  • GET helper, must be called inside the get function of your code. Used once at the first webhook setup.

    Parameters

    • params: GetParams

      The request object sent by Whatsapp

    Returns string

    The challenge string, it must be the http response body

    Throws

    500 if webhookVerifyToken is not specified

    Throws

    400 if the request is missing data

    Throws

    403 if the verification tokens don't match

  • GET request handler for SvelteKit RequestHandler

    Parameters

    • req: Request

      The request object

    Returns string

    The challenge string to be sent to the client

    Example

    import WhatsAppAPI from 'whatsapp-api-js/middleware/sveltekit';

    import type { RequestHandler } from './$types';

    const Whatsapp = new WhatsAppAPI({
    token: "YOUR_TOKEN",
    appSecret: "YOUR_APP_SECRET",
    webhookVerifyToken: "YOUR_WEBHOOK_VERIFY_TOKEN"
    });

    export const GET: RequestHandler = ({ request, url }) => {
    try {
    // eslint-disable-next-line @typescript-eslint/ban-ts-comment
    // @ts-ignore - Unfortunately, undici's Request and SvelteKit's Request types are not fully compatible
    return new Response(Whatsapp.handle_get(request));
    } catch (e) {
    return new Response(null, { status: e as number });
    }
    };

    Throws

    The error code

  • handle_post(req): Promise<number>
  • POST request handler for SvelteKit RequestHandler

    Parameters

    • req: Request

      The request object

    Returns Promise<number>

    The status code to be sent to the client

    Example

    import WhatsAppAPI from 'whatsapp-api-js/middleware/sveltekit';

    import type { RequestHandler } from './$types';

    const Whatsapp = new WhatsAppAPI({
    token: "YOUR_TOKEN",
    appSecret: "YOUR_APP_SECRET",
    webhookVerifyToken: "YOUR_WEBHOOK_VERIFY_TOKEN"
    });

    export const POST: RequestHandler = async ({ request }) => {
    return new Response(null, {
    // eslint-disable-next-line @typescript-eslint/ban-ts-comment
    // @ts-ignore - Unfortunately, undici request type and SvelteKit request type are not fully compatible
    status: await Whatsapp.handle_post(request)
    });
    };
  • POST helper, must be called inside the post function of your code. When setting up the webhook, only subscribe to messages. Other subscritions support might be added later.

    Parameters

    • data: PostData

      The POSTed data object sent by Whatsapp

    • Optional raw_body: string

      The raw body of the POST request

    • Optional signature: string

      The x-hub-signature-256 (all lowercase) header signature sent by Whatsapp

    Returns Promise<200>

    200, it's the expected http/s response code

    Example

    // author arivanbastos on issue #114
    // Simple http example implementation with Whatsapp.post() on Node@^19
    import WhatsAppAPI from "whatsapp-api-js";
    import { NodeNext } from "whatsapp-api-js/setup/node";

    import { createServer } from "http";

    const token = "token";
    const appSecret = "appSecret";
    const Whatsapp = new WhatsAppAPI(NodeNext({ token, appSecret }));

    function handler(req, res) {
    if (req.method == "POST") {
    const chunks = [];
    req.on("data", (chunk) => chunks.push(chunk));

    req.on("end", async () => {
    const body = Buffer.concat(chunks).toString();

    try {
    const response = await Whatsapp.post(JSON.parse(body), body, req.headers["x-hub-signature-256"]);
    res.writeHead(response);
    } catch (err) {
    res.writeHead(err);
    }

    res.end();
    });
    } else res.writeHead(501).end();
    };

    Whatsapp.on.message = ({ phoneID, from, message, name }) => {
    console.log(`User ${name} (${from}) sent to bot ${phoneID} a(n) ${message.type}`);
    };

    const server = createServer(handler);
    server.listen(3000);

    Throws

    500 if secure and the appSecret isn't specified

    Throws

    501 if secure and crypto.subtle or ponyfill isn't available

    Throws

    400 if secure and the raw body is missing

    Throws

    401 if secure and the signature is missing

    Throws

    401 if secure and the signature doesn't match the hash

    Throws

    400 if the POSTed data is not a valid Whatsapp API request

  • Send a Whatsapp message

    Parameters

    • phoneID: string

      The bot's phone ID

    • to: string

      The user's phone number

    • message: ClientMessage

      A Whatsapp message, built using the corresponding module for each type of message.

    • Optional context: string

      The message ID of the message to reply to

    Returns Promise<ServerMessageResponse | Response>

    The server response

    Example

    import WhatsAppAPI from "whatsapp-api-js";
    import Text from "whatsapp-api-js/messages/text";

    const Whatsapp = new WhatsAppAPI({
    token: "YOUR_TOKEN",
    appSecret: "YOUR_APP_SECRET"
    });

    Whatsapp.sendMessage(
    "BOT_PHONE_ID",
    "USER_PHONE",
    new Text("Hello World")
    ).then(console.log);
  • Upload a Media to the server

    Parameters

    • phoneID: string

      The bot's phone ID

    • form: unknown

      The Media's FormData. Must have a 'file' property with the file to upload as a blob and a valid mime-type in the 'type' field of the blob. Example for Node ^18: new FormData().set("file", new Blob([stringOrFileBuffer], "image/png")); Previous versions of Node will need an external FormData, such as undici's. To use non spec complaints versions of FormData (eg: form-data) or Blob set the 'check' parameter to false.

    • check: boolean = true

      If the FormData should be checked before uploading. The FormData must have the method .get("name") to work with the checks. If it doesn't (for example, using the module "form-data"), set this to false.

    Returns Promise<ServerMediaUploadResponse | Response>

    The server response

    Throws

    If check is set to true and form is not a FormData

    Throws

    If check is set to true and the form doesn't have valid required properties (file, type)

    Throws

    If check is set to true and the form file is too big for the file type

    Example

    import WhatsAppAPI from "whatsapp-api-js";

    const token = "token";
    const appSecret = "appSecret";

    const Whatsapp = new WhatsAppAPI({ token, appSecret });

    // If required:
    // import FormData from "undici";
    // import { Blob } from "node:buffer";

    const form = new FormData();

    // If you don't mind reading the whole file into memory:
    form.set("file", new Blob([fs.readFileSync("image.png")], "image/png"));

    // If you do, you will need to use streams. The module "form-data",
    // although not spec compliant (hence needing to set check to false),
    // has an easy way to do this:
    // form.append("file", fs.createReadStream("image.png"), { contentType: "image/png" });

    console.log(await Whatsapp.uploadMedia("phoneID", form));
    // Expected output: { id: "mediaID" }

Generated using TypeDoc