@sapphire/plugin-api
Version:
Plugin for @sapphire/framework to expose a REST API
58 lines (56 loc) • 2.16 kB
JavaScript
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