mirror of
https://github.com/status-im/github-webhook-filter.git
synced 2025-02-26 11:55:48 +00:00
feat: handle ratelimits (kinda)
This commit is contained in:
parent
2c35c57c58
commit
37cc5f16de
@ -13,4 +13,6 @@ export default {
|
||||
hostname: get("HOSTNAME", "127.0.0.1"),
|
||||
port: parseInt(get("PORT", "8080")),
|
||||
signKey: get("SIGN_KEY"),
|
||||
maxWebhookRetries: parseInt(get("MAX_RETRIES", "3")),
|
||||
maxWebhookRetryMs: parseInt(get("MAX_RETRY_MS", "30000")),
|
||||
};
|
||||
|
@ -1,4 +1,5 @@
|
||||
import { http, log } from "../deps.ts";
|
||||
import config from "./config.ts";
|
||||
import { verify } from "./crypto.ts";
|
||||
import filterWebhook from "./filter.ts";
|
||||
import { UrlConfig } from "./types.d.ts";
|
||||
@ -65,11 +66,34 @@ async function sendWebhook(
|
||||
body: string,
|
||||
): Promise<Response> {
|
||||
const url = `https://discord.com/api/webhooks/${id}/${token}/github?wait=1`;
|
||||
log.info(`Sending webhook request to ${url}`);
|
||||
const req = new Request(url, {
|
||||
method: "POST",
|
||||
headers: headers,
|
||||
body: body,
|
||||
});
|
||||
return await fetch(req);
|
||||
|
||||
let res: Response;
|
||||
let retries = 0;
|
||||
do {
|
||||
const req = new Request(url, {
|
||||
method: "POST",
|
||||
headers: headers,
|
||||
body: body,
|
||||
});
|
||||
|
||||
log.info(`sending webhook request to ${url}`);
|
||||
res = await fetch(req);
|
||||
|
||||
// return response if everything's fine
|
||||
if (res.status !== 429) break;
|
||||
|
||||
const reset = res.headers.get("retry-after");
|
||||
// should always exist, even for cf bans, but checking anyway
|
||||
if (reset === null) break;
|
||||
|
||||
const resetms = parseFloat(reset);
|
||||
// if we'd wait longer than the configured limit, just return the 429
|
||||
if (resetms > config.maxWebhookRetryMs) break;
|
||||
|
||||
// wait and try again
|
||||
log.warning(`retrying after ${resetms}ms`);
|
||||
await util.sleep(resetms);
|
||||
retries++;
|
||||
} while (retries <= config.maxWebhookRetries);
|
||||
return res;
|
||||
}
|
||||
|
@ -1,3 +1,7 @@
|
||||
export function parseBool(s: string): boolean {
|
||||
return ["1", "true", "on", "y", "yes"].includes(s.toLowerCase());
|
||||
}
|
||||
|
||||
export function sleep(ms: number): Promise<void> {
|
||||
return new Promise((resolve) => setTimeout(resolve, ms));
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user