fix: remove outdated webhook client (#555)

* fix: remove outdated webhook client

* feat: destroy client
This commit is contained in:
SKINMAKER 2023-04-16 15:02:14 +09:00 committed by GitHub
parent 59dbf74466
commit a3173609dd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 22 additions and 2 deletions

View File

@ -8,7 +8,8 @@ import RequestHandler from '@utils/RequestHandler'
import { User, WebhookStatus } from '@types' import { User, WebhookStatus } from '@types'
import { parseWebhookURL } from 'discord.js' import { parseWebhookURL } from 'discord.js'
import { verifyWebhook } from '@utils/Webhook' import { destroyWebhookClient, verifyWebhook } from '@utils/Webhook'
import { webhookClients } from '@utils/DiscordBot'
const BotApplications = RequestHandler().patch(async (req: ApiRequest, res) => { const BotApplications = RequestHandler().patch(async (req: ApiRequest, res) => {
const user = await get.Authorization(req.cookies.token) const user = await get.Authorization(req.cookies.token)
@ -31,6 +32,10 @@ const BotApplications = RequestHandler().patch(async (req: ApiRequest, res) => {
if(key === false) { if(key === false) {
return ResponseWrapper(res, { code: 400, message: '웹후크 주소를 검증할 수 없습니다.', errors: ['웹후크 주소가 올바른지 확인해주세요.\n웹후크 주소 검증에 대한 자세한 내용은 API 문서를 참고해주세요.'] }) return ResponseWrapper(res, { code: 400, message: '웹후크 주소를 검증할 수 없습니다.', errors: ['웹후크 주소가 올바른지 확인해주세요.\n웹후크 주소 검증에 대한 자세한 내용은 API 문서를 참고해주세요.'] })
} }
const client = webhookClients.bot.get(req.query.id)
if(client && validated.webhookURL !== client.url) {
destroyWebhookClient(req.query.id, 'bot')
}
await update.webhook(req.query.id, 'bots', { await update.webhook(req.query.id, 'bots', {
url: validated.webhookURL, url: validated.webhookURL,
status: parseWebhookURL(validated.webhookURL) ? WebhookStatus.Discord : WebhookStatus.HTTP, status: parseWebhookURL(validated.webhookURL) ? WebhookStatus.Discord : WebhookStatus.HTTP,
@ -38,6 +43,7 @@ const BotApplications = RequestHandler().patch(async (req: ApiRequest, res) => {
secret: key, secret: key,
}) })
} else { } else {
destroyWebhookClient(req.query.id, 'bot')
await update.webhook(req.query.id, 'bots', { await update.webhook(req.query.id, 'bots', {
url: null, url: null,
status: WebhookStatus.None, status: WebhookStatus.None,

View File

@ -8,7 +8,8 @@ import RequestHandler from '@utils/RequestHandler'
import { WebhookStatus } from '@types' import { WebhookStatus } from '@types'
import { parseWebhookURL } from 'discord.js' import { parseWebhookURL } from 'discord.js'
import { verifyWebhook } from '@utils/Webhook' import { destroyWebhookClient, verifyWebhook } from '@utils/Webhook'
import { webhookClients } from '@utils/DiscordBot'
const ServerApplications = RequestHandler().patch(async (req: ApiRequest, res) => { const ServerApplications = RequestHandler().patch(async (req: ApiRequest, res) => {
const user = await get.Authorization(req.cookies.token) const user = await get.Authorization(req.cookies.token)
@ -31,6 +32,10 @@ const ServerApplications = RequestHandler().patch(async (req: ApiRequest, res) =
if(key === false) { if(key === false) {
return ResponseWrapper(res, { code: 400, message: '웹후크 주소를 검증할 수 없습니다.', errors: ['웹후크 주소가 올바른지 확인해주세요.\n웹후크 주소 검증에 대한 자세한 내용은 API 문서를 참고해주세요.'] }) return ResponseWrapper(res, { code: 400, message: '웹후크 주소를 검증할 수 없습니다.', errors: ['웹후크 주소가 올바른지 확인해주세요.\n웹후크 주소 검증에 대한 자세한 내용은 API 문서를 참고해주세요.'] })
} }
const client = webhookClients.server.get(req.query.id)
if(client && validated.webhookURL !== client.url) {
destroyWebhookClient(req.query.id, 'server')
}
await update.webhook(req.query.id, 'servers', { await update.webhook(req.query.id, 'servers', {
url: validated.webhookURL, url: validated.webhookURL,
status: parseWebhookURL(validated.webhookURL) ? WebhookStatus.Discord : WebhookStatus.HTTP, status: parseWebhookURL(validated.webhookURL) ? WebhookStatus.Discord : WebhookStatus.HTTP,
@ -38,6 +43,7 @@ const ServerApplications = RequestHandler().patch(async (req: ApiRequest, res) =
secret: key, secret: key,
}) })
} else { } else {
destroyWebhookClient(req.query.id, 'server')
await update.webhook(req.query.id, 'servers', { await update.webhook(req.query.id, 'servers', {
url: null, url: null,
status: WebhookStatus.None, status: WebhookStatus.None,

View File

@ -15,6 +15,14 @@ type RelayOptions = {
secret: string, secret: string,
} }
export function destroyWebhookClient(id: string, type: 'bot' | 'server') {
const client = webhookClients[type].get(id)
if(client) {
client.destroy()
webhookClients[type].delete(id)
}
}
function relayedFetch(options: RelayOptions): Promise<Response> { function relayedFetch(options: RelayOptions): Promise<Response> {
return fetch(process.env.WEBHOOK_RELAY_URL, { return fetch(process.env.WEBHOOK_RELAY_URL, {
method: 'POST', method: 'POST',