"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.defaultAdapter = exports.adapters = void 0;
const SECRET_HEADER = "X-Telegram-Bot-Api-Secret-Token";
/** Node.js native 'http' and 'https' modules */
const http = (req, res) => {
    const secretHeaderFromRequest = req.headers[SECRET_HEADER.toLowerCase()];
    return {
        update: new Promise((resolve, reject) => {
            const chunks = [];
            req.on("data", (chunk) => chunks.push(chunk))
                .once("end", () => {
                const raw = Buffer.concat(chunks).toString("utf-8");
                resolve(JSON.parse(raw));
            })
                .once("error", reject);
        }),
        header: Array.isArray(secretHeaderFromRequest)
            ? secretHeaderFromRequest[0]
            : secretHeaderFromRequest,
        end: () => res.end(),
        respond: (json) => res
            .writeHead(200, { "Content-Type": "application/json" })
            .end(json),
        unauthorized: () => res.writeHead(401).end("secret token is wrong"),
    };
};
/** express web framework */
const express = (req, res) => ({
    update: Promise.resolve(req.body),
    header: req.header(SECRET_HEADER),
    end: () => res.end(),
    respond: (json) => {
        res.set("Content-Type", "application/json");
        res.send(json);
    },
    unauthorized: () => {
        res.send(401, "secret token is wrong");
    },
});
/** koa web framework */
const koa = (ctx) => ({
    update: Promise.resolve(ctx.request.body),
    header: ctx.get(SECRET_HEADER),
    end: () => {
        ctx.body = "";
    },
    respond: (json) => {
        ctx.set("Content-Type", "application/json");
        ctx.response.body = json;
    },
    unauthorized: () => {
        ctx.status = 401;
    },
});
/** fastify web framework */
const fastify = (req, reply) => ({
    update: Promise.resolve(req.body),
    header: req.headers[SECRET_HEADER.toLowerCase()],
    end: () => reply.status(200).send(),
    respond: (json) => reply.send(json),
    unauthorized: () => reply.code(401).send("secret token is wrong"),
});
/** worktop CloudFlare workers framework */
const worktop = (req, res) => ({
    update: Promise.resolve(req.body.json()),
    header: req.headers.get(SECRET_HEADER),
    end: () => res.end(),
    respond: (json) => res.send(200, json),
    unauthorized: () => res.send(401, "secret token is wrong"),
});
/** AWS lambda serverless functions */
const awsLambda = (event, _context, callback) => ({
    update: JSON.parse(event.body),
    header: event.headers[SECRET_HEADER],
    end: () => callback(null, { statusCode: 200 }),
    respond: (json) => callback(null, { statusCode: 200, body: json }),
    unauthorized: () => callback(null, { statusCode: 401 }),
});
// please open a PR if you want to add another
exports.adapters = {
    http,
    https: http,
    express,
    koa,
    fastify,
    worktop,
    "aws-lambda": awsLambda,
};
exports.defaultAdapter = "express";
