summaryrefslogtreecommitdiff
path: root/server.js
diff options
context:
space:
mode:
authorTor Andersson <tor@ccxvii.net>2024-03-14 17:17:33 +0100
committerTor Andersson <tor@ccxvii.net>2024-03-14 17:18:51 +0100
commit68d86fe46b8182a043cfc31bac5ca42f2b52e622 (patch)
tree7dfd337fc0b624a594433b92baefc433eb303917 /server.js
parent16c60c721208e8cc971b2f84defb4ccc74e9ffe2 (diff)
downloadserver-68d86fe46b8182a043cfc31bac5ca42f2b52e622.tar.gz
Use fetch API for sending webhooks.
The Node https module started getting timeouts and not closing down after req.end for reasons unknown to me. Let's take this moment as an opportunity to move to the new fetch API instead.
Diffstat (limited to 'server.js')
-rw-r--r--server.js45
1 files changed, 10 insertions, 35 deletions
diff --git a/server.js b/server.js
index dcc6208..56a3413 100644
--- a/server.js
+++ b/server.js
@@ -5,7 +5,6 @@
const fs = require("fs")
const crypto = require("crypto")
const http = require("http")
-const https = require("https") // for webhook requests
const { WebSocketServer } = require("ws")
const express = require("express")
const url = require("url")
@@ -2278,19 +2277,11 @@ function mail_verification_token(user, token) {
*/
const webhook_json_options = {
- method: "POST",
- timeout: 6000,
- headers: {
- "Content-Type": "application/json"
- }
+ "Content-Type": "application/json"
}
const webhook_text_options = {
- method: "POST",
- timeout: 6000,
- headers: {
- "Content-Type": "text/plain"
- }
+ "Content-Type": "text/plain"
}
function on_webhook_success(user_id) {
@@ -2302,38 +2293,22 @@ function on_webhook_error(user_id, error) {
SQL_UPDATE_WEBHOOK_ERROR.run(error, user_id)
}
-function send_webhook(user_id, webhook, message, retry=2) {
+async function send_webhook(user_id, webhook, message, retry=2) {
if (!WEBHOOKS)
return
try {
const text = webhook.prefix + " " + message
const data = webhook.format ? JSON.stringify({ [webhook.format]: text }) : text
- const options = webhook.format ? webhook_json_options : webhook_text_options
- const req = https.request(webhook.url, options, res => {
- if (res.statusCode === 200 || res.statusCode === 204)
- on_webhook_success(user_id)
- else {
- if (retry > 0)
- retry_webhook(user_id, webhook, message, retry - 1)
- else
- on_webhook_error(user_id, res.statusCode + " " + http.STATUS_CODES[res.statusCode])
- }
- })
- req.on("timeout", () => {
+ const headers = webhook.format ? webhook_json_options : webhook_text_options
+ const res = await fetch(webhook.url, { method: "POST", headers: headers, body: data })
+ if (res.ok)
+ on_webhook_success(user_id)
+ else {
if (retry > 0)
retry_webhook(user_id, webhook, message, retry - 1)
else
- on_webhook_error(user_id, "Timeout")
- req.abort()
- })
- req.on("error", (err) => {
- if (retry > 0)
- retry_webhook(user_id, webhook, message, retry - 1)
- else
- on_webhook_error(user_id, err.toString())
- })
- req.write(data)
- req.end()
+ on_webhook_error(user_id, res.status + ": " + res.statusText)
+ }
} catch (err) {
if (retry > 0)
retry_webhook(user_id, webhook, message, retry - 1)