UNPKG

@sapphire/plugin-api

Version:

Plugin for @sapphire/framework to expose a REST API

58 lines (56 loc) 2.16 kB
import { __name } from '../../chunk-S573YWRP.mjs'; import { sleep } from '@sapphire/utilities'; import { OAuth2Routes } from 'discord.js'; import { stringify } from 'querystring'; import { fetch } from 'undici'; import { Route } from '../../lib/structures/Route.mjs'; import { HttpCodes } from '../../lib/structures/http/HttpCodes.mjs'; var _PluginRoute = class _PluginRoute extends Route { constructor(context) { super(context, { route: "oauth/logout", methods: ["POST"] }); this.enabled = this.container.server.auth !== null; } async run(request, response) { if (!request.auth) return response.status(HttpCodes.Unauthorized).json({ error: "Unauthorized." }); const result = await this.revoke(request.auth.token); if (result.ok) return this.success(response); if (result.status === HttpCodes.ServiceUnavailable) { const retryAfter = this.processRetryAfter(result.headers.get("Retry-After")); if (retryAfter) { await sleep(retryAfter); const result2 = await this.revoke(request.auth.token); if (result2.ok) return this.success(response); } } return response.status(HttpCodes.InternalServerError).json({ error: "Unexpected error from server." }); } success(response) { response.cookies.remove(this.container.server.auth.cookie); return response.json({ success: true }); } async revoke(token) { const auth = this.container.server.auth; const result = await fetch(OAuth2Routes.tokenRevocationURL, { method: "POST", body: stringify({ token, /* eslint-disable @typescript-eslint/naming-convention */ client_id: auth.id, client_secret: auth.secret /* eslint-enable @typescript-eslint/naming-convention */ }), headers: { "content-type": "application/x-www-form-urlencoded" } }); return result; } processRetryAfter(retryAfter) { return retryAfter === null ? 5e3 : Number(retryAfter) * 1e3; } }; __name(_PluginRoute, "PluginRoute"); var PluginRoute = _PluginRoute; export { PluginRoute }; //# sourceMappingURL=logout.post.mjs.map //# sourceMappingURL=logout.post.mjs.map