api_api.js

// Require all needed types
const InteractionType = require("../structures/InteractionType");
const InteractionResponseType = require("../structures/InteractionResponseType");

// Require the interaction main class
const Interaction = require("../structures/Interaction.js");

const Member = require("../structures/Member.js");

const Application = require("../application/base");

// Require the fastify application
const Fastify = require('fastify');
let app = Fastify({
    logger: false,
    trustProxy: true
});

const express = require('express');

// Require the util class
const Utils = require("../utils/Utils.js");
const Util = new Utils();

module.exports = async (Client) => {
    Client.emit('debug', "[DEBUG] Starting Fastify Server");

    let isCustomInstance = false;
    if(Client.apiInstance !== null) {
        isCustomInstance = true;
        app = Client.apiInstance;
    } else {
        Client.apiInstance = app;
    }

    /**
     * Emitted the starting event.
     * @event Application#starting
     * @param {Application} c The Client
     */
    Client.emit('starting', Client);

    app.post('/interactions', async (req, res) => {
        if(req.body === null || req.body === undefined) {
            throw new Error("[Interactions.js => <Client>#interactionCreate] Your custom API Instance doesn't support the body-parser. Please use the default API Instance or install the body-parser package.");
        }

        Client.emit('debug', "[DEBUG] New Interaction " + req.body.id);

        const verifyPayload = await Util.InteractionsMiddleware(Client, req);
        if (!verifyPayload) return Client.emit('debug', "[DEBUG] Didn't passed the verification. ");

        if (req.body.type === InteractionType.PING) {
            Client.emit('debug', "[DEBUG] Response with Pong " + req.body.id);
            return res.send({type: InteractionResponseType.PONG});
        }

        const interaction = new Interaction(req, Client, res);

        Client.emit('debug', "[DEBUG] Forward Interaction " + req.body.id);

        /**
         * Emitted the interaction event.
         * @event Application#interactionCreate
         * @param {Interaction} interaction The Interaction to handle
         */
        Client.emit('interactionCreate', interaction);
    });

    if(!isCustomInstance) {
        const host = Client.runOnAllInterfaces ? '0.0.0.0' : 'localhost';
        app.listen({port: Client.port, host: host },  (err) => {
            Client.emit('debug', "[DEBUG] API Online on port " + Client.port);

            Client.readySince = Date.now();

            setTimeout(() => {
                /**
                 * Emitted the ready event.
                 * @event Application#ready
                 * @param {Application} Client The Client
                 */
                Client.emit('ready', Client);
            }, 0);
        });
    } else {
        Client.readySince = Date.now();

        /**
         * Emitted the ready event.
         * @event Application#ready
         * @param {Application} Client The Client
         */
        Client.emit('ready', Client);
    }
};