@sapphire/plugin-api 6.1.2-next.fc6b7cf.0 → 7.0.0-next.d27dc1c
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/index.cjs +1 -1
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/index.d.cts +7 -5
- package/dist/cjs/lib/structures/MediaParser.cjs +4 -8
- package/dist/cjs/lib/structures/MediaParser.cjs.map +1 -1
- package/dist/cjs/lib/structures/Middleware.cjs +1 -4
- package/dist/cjs/lib/structures/Middleware.cjs.map +1 -1
- package/dist/cjs/lib/structures/MiddlewareStore.cjs +6 -14
- package/dist/cjs/lib/structures/MiddlewareStore.cjs.map +1 -1
- package/dist/cjs/lib/structures/Route.cjs +5 -7
- package/dist/cjs/lib/structures/Route.cjs.map +1 -1
- package/dist/cjs/lib/structures/RouteStore.cjs +5 -12
- package/dist/cjs/lib/structures/RouteStore.cjs.map +1 -1
- package/dist/cjs/lib/structures/api/ApiRequest.cjs +1 -4
- package/dist/cjs/lib/structures/api/ApiRequest.cjs.map +1 -1
- package/dist/cjs/lib/structures/api/ApiResponse.cjs +1 -4
- package/dist/cjs/lib/structures/api/ApiResponse.cjs.map +1 -1
- package/dist/cjs/lib/structures/api/CookieStore.cjs +3 -8
- package/dist/cjs/lib/structures/api/CookieStore.cjs.map +1 -1
- package/dist/cjs/lib/structures/http/Auth.cjs +13 -31
- package/dist/cjs/lib/structures/http/Auth.cjs.map +1 -1
- package/dist/cjs/lib/structures/http/Server.cjs +1 -4
- package/dist/cjs/lib/structures/http/Server.cjs.map +1 -1
- package/dist/cjs/lib/utils/RouteData.cjs +10 -21
- package/dist/cjs/lib/utils/RouteData.cjs.map +1 -1
- package/dist/cjs/listeners/PluginRouteError.cjs +1 -2
- package/dist/cjs/listeners/PluginRouteError.cjs.map +1 -1
- package/dist/cjs/listeners/PluginServerMiddlewareError.cjs +1 -2
- package/dist/cjs/listeners/PluginServerMiddlewareError.cjs.map +1 -1
- package/dist/cjs/listeners/PluginServerNoMatch.cjs +1 -2
- package/dist/cjs/listeners/PluginServerNoMatch.cjs.map +1 -1
- package/dist/cjs/middlewares/auth.cjs +2 -6
- package/dist/cjs/middlewares/auth.cjs.map +1 -1
- package/dist/cjs/middlewares/body.cjs +3 -8
- package/dist/cjs/middlewares/body.cjs.map +1 -1
- package/dist/cjs/middlewares/cookies.cjs +1 -4
- package/dist/cjs/middlewares/cookies.cjs.map +1 -1
- package/dist/cjs/middlewares/headers.cjs +1 -4
- package/dist/cjs/middlewares/headers.cjs.map +1 -1
- package/dist/cjs/routes/oauth/callback.cjs +2 -6
- package/dist/cjs/routes/oauth/callback.cjs.map +1 -1
- package/dist/cjs/routes/oauth/logout.cjs +3 -6
- package/dist/cjs/routes/oauth/logout.cjs.map +1 -1
- package/dist/esm/chunk-JTFKMR4I.mjs +15 -0
- package/dist/esm/index.d.mts +7 -5
- package/dist/esm/index.mjs +2 -2
- package/dist/esm/index.mjs.map +1 -1
- package/dist/esm/lib/structures/MediaParser.mjs +5 -9
- package/dist/esm/lib/structures/MediaParser.mjs.map +1 -1
- package/dist/esm/lib/structures/MediaParserStore.mjs +1 -1
- package/dist/esm/lib/structures/Middleware.mjs +1 -1
- package/dist/esm/lib/structures/MiddlewareStore.mjs +6 -11
- package/dist/esm/lib/structures/MiddlewareStore.mjs.map +1 -1
- package/dist/esm/lib/structures/Route.mjs +5 -4
- package/dist/esm/lib/structures/Route.mjs.map +1 -1
- package/dist/esm/lib/structures/RouteStore.mjs +5 -9
- package/dist/esm/lib/structures/RouteStore.mjs.map +1 -1
- package/dist/esm/lib/structures/api/ApiRequest.mjs +1 -1
- package/dist/esm/lib/structures/api/ApiResponse.mjs +1 -1
- package/dist/esm/lib/structures/api/CookieStore.mjs +3 -5
- package/dist/esm/lib/structures/api/CookieStore.mjs.map +1 -1
- package/dist/esm/lib/structures/http/Auth.mjs +6 -10
- package/dist/esm/lib/structures/http/Auth.mjs.map +1 -1
- package/dist/esm/lib/structures/http/HttpCodes.mjs +1 -1
- package/dist/esm/lib/structures/http/HttpMethods.mjs +1 -1
- package/dist/esm/lib/structures/http/Server.mjs +1 -1
- package/dist/esm/lib/utils/MimeTypes.mjs +1 -1
- package/dist/esm/lib/utils/RouteData.mjs +10 -18
- package/dist/esm/lib/utils/RouteData.mjs.map +1 -1
- package/dist/esm/listeners/PluginRouteError.mjs +2 -3
- package/dist/esm/listeners/PluginRouteError.mjs.map +1 -1
- package/dist/esm/listeners/PluginServerMatch.mjs +1 -1
- package/dist/esm/listeners/PluginServerMiddlewareError.mjs +2 -3
- package/dist/esm/listeners/PluginServerMiddlewareError.mjs.map +1 -1
- package/dist/esm/listeners/PluginServerMiddlewareSuccess.mjs +1 -1
- package/dist/esm/listeners/PluginServerNoMatch.mjs +2 -3
- package/dist/esm/listeners/PluginServerNoMatch.mjs.map +1 -1
- package/dist/esm/listeners/PluginServerRequest.mjs +1 -1
- package/dist/esm/listeners/_load.mjs +1 -1
- package/dist/esm/mediaParsers/_load.mjs +1 -1
- package/dist/esm/mediaParsers/applicationFormUrlEncoded.mjs +1 -1
- package/dist/esm/mediaParsers/applicationJson.mjs +1 -1
- package/dist/esm/mediaParsers/textPlain.mjs +1 -1
- package/dist/esm/middlewares/_load.mjs +1 -1
- package/dist/esm/middlewares/auth.mjs +2 -3
- package/dist/esm/middlewares/auth.mjs.map +1 -1
- package/dist/esm/middlewares/body.mjs +3 -5
- package/dist/esm/middlewares/body.mjs.map +1 -1
- package/dist/esm/middlewares/cookies.mjs +1 -1
- package/dist/esm/middlewares/headers.mjs +1 -1
- package/dist/esm/register.mjs +1 -1
- package/dist/esm/routes/_load.mjs +1 -1
- package/dist/esm/routes/oauth/callback.mjs +2 -3
- package/dist/esm/routes/oauth/callback.mjs.map +1 -1
- package/dist/esm/routes/oauth/logout.mjs +4 -7
- package/dist/esm/routes/oauth/logout.mjs.map +1 -1
- package/package.json +7 -7
- package/dist/esm/chunk-PYETHG4R.mjs +0 -29
- /package/dist/esm/{chunk-PYETHG4R.mjs.map → chunk-JTFKMR4I.mjs.map} +0 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { __name } from '../chunk-
|
|
1
|
+
import { __name } from '../chunk-JTFKMR4I.mjs';
|
|
2
2
|
import { container } from '@sapphire/pieces';
|
|
3
3
|
import { PluginMediaParser } from './applicationFormUrlEncoded.mjs';
|
|
4
4
|
import { PluginMediaParser as PluginMediaParser$1 } from './applicationJson.mjs';
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { __name, __publicField } from '../chunk-
|
|
1
|
+
import { __name, __publicField } from '../chunk-JTFKMR4I.mjs';
|
|
2
2
|
import { Middleware } from '../lib/structures/Middleware.mjs';
|
|
3
3
|
|
|
4
4
|
var _PluginMiddleware = class _PluginMiddleware extends Middleware {
|
|
@@ -16,8 +16,7 @@ var _PluginMiddleware = class _PluginMiddleware extends Middleware {
|
|
|
16
16
|
return;
|
|
17
17
|
}
|
|
18
18
|
request.auth = this.container.server.auth.decrypt(authorization);
|
|
19
|
-
if (request.auth === null)
|
|
20
|
-
response.cookies.remove(this.cookieName);
|
|
19
|
+
if (request.auth === null) response.cookies.remove(this.cookieName);
|
|
21
20
|
}
|
|
22
21
|
};
|
|
23
22
|
__name(_PluginMiddleware, "PluginMiddleware");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/middlewares/auth.ts"],"names":[],"mappings":";;;;;;AAEA,SAAS,kBAAkB;AAEpB,IAAM,oBAAN,MAAM,0BAAyB,WAAW;AAAA,EAGzC,YAAY,SAAmC;AACrD,UAAM,SAAS,EAAE,UAAU,GAAG,CAAC;AAHhC,wBAAiB;AAKhB,UAAM,EAAE,OAAO,IAAI,KAAK;AACxB,SAAK,aAAa,OAAO,MAAM,UAAU;AACzC,SAAK,UAAU,OAAO,SAAS;AAAA,EAChC;AAAA,EAEgB,IAAI,SAAqB,UAAuB;AAE/D,UAAM,gBAAgB,SAAS,QAAQ,IAAI,KAAK,UAAU;AAC1D,QAAI,CAAC,eAAe;AACnB,cAAQ,OAAO;AACf;AAAA,IACD;AAGA,YAAQ,OAAO,KAAK,UAAU,OAAO,KAAM,QAAQ,aAAa;AAChE,QAAI,QAAQ,SAAS
|
|
1
|
+
{"version":3,"sources":["../../../src/middlewares/auth.ts"],"names":[],"mappings":";;;;;;AAEA,SAAS,kBAAkB;AAEpB,IAAM,oBAAN,MAAM,0BAAyB,WAAW;AAAA,EAGzC,YAAY,SAAmC;AACrD,UAAM,SAAS,EAAE,UAAU,GAAG,CAAC;AAHhC,wBAAiB;AAKhB,UAAM,EAAE,OAAO,IAAI,KAAK;AACxB,SAAK,aAAa,OAAO,MAAM,UAAU;AACzC,SAAK,UAAU,OAAO,SAAS;AAAA,EAChC;AAAA,EAEgB,IAAI,SAAqB,UAAuB;AAE/D,UAAM,gBAAgB,SAAS,QAAQ,IAAI,KAAK,UAAU;AAC1D,QAAI,CAAC,eAAe;AACnB,cAAQ,OAAO;AACf;AAAA,IACD;AAGA,YAAQ,OAAO,KAAK,UAAU,OAAO,KAAM,QAAQ,aAAa;AAChE,QAAI,QAAQ,SAAS,KAAM,UAAS,QAAQ,OAAO,KAAK,UAAU;AAAA,EACnE;AACD;AAvBiD;AAA1C,IAAM,mBAAN","sourcesContent":["import type { ApiRequest } from '../lib/structures/api/ApiRequest';\nimport type { ApiResponse } from '../lib/structures/api/ApiResponse';\nimport { Middleware } from '../lib/structures/Middleware';\n\nexport class PluginMiddleware extends Middleware {\n\tprivate readonly cookieName: string;\n\n\tpublic constructor(context: Middleware.LoaderContext) {\n\t\tsuper(context, { position: 40 });\n\n\t\tconst { server } = this.container;\n\t\tthis.cookieName = server.auth?.cookie ?? 'SAPPHIRE_AUTH';\n\t\tthis.enabled = server.auth !== null;\n\t}\n\n\tpublic override run(request: ApiRequest, response: ApiResponse) {\n\t\t// If there are no cookies, set auth as null:\n\t\tconst authorization = response.cookies.get(this.cookieName);\n\t\tif (!authorization) {\n\t\t\trequest.auth = null;\n\t\t\treturn;\n\t\t}\n\n\t\t// Decrypt the cookie, and if the token is invalid, remove the cookie:\n\t\trequest.auth = this.container.server.auth!.decrypt(authorization);\n\t\tif (request.auth === null) response.cookies.remove(this.cookieName);\n\t}\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { __name, __publicField } from '../chunk-
|
|
1
|
+
import { __name, __publicField } from '../chunk-JTFKMR4I.mjs';
|
|
2
2
|
import { HttpCodes } from '../lib/structures/http/HttpCodes.mjs';
|
|
3
3
|
import { Middleware } from '../lib/structures/Middleware.mjs';
|
|
4
4
|
|
|
@@ -10,11 +10,9 @@ var _PluginMiddleware = class _PluginMiddleware extends Middleware {
|
|
|
10
10
|
}
|
|
11
11
|
async run(request, response, route) {
|
|
12
12
|
const contentType = request.headers["content-type"];
|
|
13
|
-
if (typeof contentType !== "string")
|
|
14
|
-
return;
|
|
13
|
+
if (typeof contentType !== "string") return;
|
|
15
14
|
const lengthString = request.headers["content-length"];
|
|
16
|
-
if (typeof lengthString !== "string")
|
|
17
|
-
return;
|
|
15
|
+
if (typeof lengthString !== "string") return;
|
|
18
16
|
const length = Number(lengthString);
|
|
19
17
|
const maximumLength = route.maximumBodyLength;
|
|
20
18
|
if (length > maximumLength) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/middlewares/body.ts"],"names":[],"mappings":";;;;;;AAEA,SAAS,iBAAiB;AAE1B,SAAS,kBAAkB;AAGpB,IAAM,oBAAN,MAAM,0BAAyB,WAAW;AAAA,EAGzC,YAAY,SAAmC;AACrD,UAAM,SAAS,EAAE,UAAU,GAAG,CAAC;AAHhC,wBAAiB;AAIhB,SAAK,eAAe,KAAK,UAAU,OAAO;AAAA,EAC3C;AAAA,EAEA,MAAsB,IAAI,SAAqB,UAAuB,OAAc;AAEnF,UAAM,cAAc,QAAQ,QAAQ,cAAc;AAClD,QAAI,OAAO,gBAAgB;
|
|
1
|
+
{"version":3,"sources":["../../../src/middlewares/body.ts"],"names":[],"mappings":";;;;;;AAEA,SAAS,iBAAiB;AAE1B,SAAS,kBAAkB;AAGpB,IAAM,oBAAN,MAAM,0BAAyB,WAAW;AAAA,EAGzC,YAAY,SAAmC;AACrD,UAAM,SAAS,EAAE,UAAU,GAAG,CAAC;AAHhC,wBAAiB;AAIhB,SAAK,eAAe,KAAK,UAAU,OAAO;AAAA,EAC3C;AAAA,EAEA,MAAsB,IAAI,SAAqB,UAAuB,OAAc;AAEnF,UAAM,cAAc,QAAQ,QAAQ,cAAc;AAClD,QAAI,OAAO,gBAAgB,SAAU;AAGrC,UAAM,eAAe,QAAQ,QAAQ,gBAAgB;AACrD,QAAI,OAAO,iBAAiB,SAAU;AAGtC,UAAM,SAAS,OAAO,YAAY;AAClC,UAAM,gBAAgB,MAAM;AAC5B,QAAI,SAAS,eAAe;AAC3B,eAAS,OAAO,UAAU,eAAe,EAAE,KAAK,EAAE,OAAO,mCAAmC,CAAC;AAC7F;AAAA,IACD;AAGA,UAAM,OAAO,KAAK,aAAa,iBAAiB,WAAW;AAC3D,UAAM,SAAS,KAAK,aAAa,IAAI,IAAI;AACzC,QAAI,CAAC,UAAU,CAAC,OAAO,QAAQ,KAAK,GAAG;AACtC,eAAS,OAAO,UAAU,oBAAoB,EAAE,KAAK,EAAE,OAAO,oBAAoB,IAAI,IAAI,CAAC;AAC3F;AAAA,IACD;AAEA,QAAI;AAEH,cAAQ,OAAO,MAAM,OAAO,IAAI,OAAO;AAAA,IACxC,QAAQ;AACP,eAAS,OAAO,UAAU,UAAU,EAAE,KAAK,EAAE,OAAO,gBAAgB,IAAI,SAAS,CAAC;AAAA,IACnF;AAAA,EACD;AACD;AAxCiD;AAA1C,IAAM,mBAAN","sourcesContent":["import type { ApiRequest } from '../lib/structures/api/ApiRequest';\nimport type { ApiResponse } from '../lib/structures/api/ApiResponse';\nimport { HttpCodes } from '../lib/structures/http/HttpCodes';\nimport type { MediaParserStore } from '../lib/structures/MediaParserStore';\nimport { Middleware } from '../lib/structures/Middleware';\nimport type { Route } from '../lib/structures/Route';\n\nexport class PluginMiddleware extends Middleware {\n\tprivate readonly mediaParsers: MediaParserStore;\n\n\tpublic constructor(context: Middleware.LoaderContext) {\n\t\tsuper(context, { position: 20 });\n\t\tthis.mediaParsers = this.container.server.mediaParsers;\n\t}\n\n\tpublic override async run(request: ApiRequest, response: ApiResponse, route: Route) {\n\t\t// RFC 1341 4.\n\t\tconst contentType = request.headers['content-type'];\n\t\tif (typeof contentType !== 'string') return;\n\n\t\t// RFC 7230 3.3.2.\n\t\tconst lengthString = request.headers['content-length'];\n\t\tif (typeof lengthString !== 'string') return;\n\n\t\t// Verify if the content length is lower than accepted:\n\t\tconst length = Number(lengthString);\n\t\tconst maximumLength = route.maximumBodyLength;\n\t\tif (length > maximumLength) {\n\t\t\tresponse.status(HttpCodes.PayloadTooLarge).json({ error: 'Exceeded maximum content length.' });\n\t\t\treturn;\n\t\t}\n\n\t\t// Verify if the content type is supported by the parser:\n\t\tconst type = this.mediaParsers.parseContentType(contentType);\n\t\tconst parser = this.mediaParsers.get(type);\n\t\tif (!parser || !parser.accepts(route)) {\n\t\t\tresponse.status(HttpCodes.UnsupportedMediaType).json({ error: `Unsupported type ${type}.` });\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\t// Parse the content body:\n\t\t\trequest.body = await parser.run(request);\n\t\t} catch {\n\t\t\tresponse.status(HttpCodes.BadRequest).json({ error: `Cannot parse ${type} data.` });\n\t\t}\n\t}\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { __name, __publicField } from '../chunk-
|
|
1
|
+
import { __name, __publicField } from '../chunk-JTFKMR4I.mjs';
|
|
2
2
|
import { METHODS } from 'node:http';
|
|
3
3
|
import { Middleware } from '../lib/structures/Middleware.mjs';
|
|
4
4
|
import { HttpCodes } from '../lib/structures/http/HttpCodes.mjs';
|
package/dist/esm/register.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { __name } from './chunk-
|
|
1
|
+
import { __name } from './chunk-JTFKMR4I.mjs';
|
|
2
2
|
import { Server, loadListeners, loadMediaParsers, loadMiddlewares, loadRoutes } from './index.mjs';
|
|
3
3
|
import { SapphireClient, postInitialization, preLogin, Plugin } from '@sapphire/framework';
|
|
4
4
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { __publicField, __name } from '../../chunk-
|
|
1
|
+
import { __publicField, __name } from '../../chunk-JTFKMR4I.mjs';
|
|
2
2
|
import { OAuth2Routes } from 'discord.js';
|
|
3
3
|
import { stringify } from 'querystring';
|
|
4
4
|
import { fetch } from 'undici';
|
|
@@ -57,8 +57,7 @@ var _PluginRoute = class _PluginRoute extends Route {
|
|
|
57
57
|
}
|
|
58
58
|
});
|
|
59
59
|
const json = await result.json();
|
|
60
|
-
if (result.ok)
|
|
61
|
-
return json;
|
|
60
|
+
if (result.ok) return json;
|
|
62
61
|
this.container.logger.error(json);
|
|
63
62
|
return null;
|
|
64
63
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/routes/oauth/callback.ts"],"names":[],"mappings":";;;;;;AAAA,SAAS,oBAAwG;AACjH,SAAS,iBAAiB;AAC1B,SAAS,aAAa;AACtB,SAAS,aAAa;AAGtB,SAAS,iBAAiB;AAC1B,SAAS,eAAe;AAEjB,IAAM,eAAN,MAAM,qBAAoB,MAAM;AAAA,EAG/B,YAAY,SAA8B;AAChD,UAAM,SAAS,EAAE,OAAO,iBAAiB,CAAC;AAH3C,wBAAiB;AAKhB,UAAM,EAAE,OAAO,IAAI,KAAK;AACxB,SAAK,UAAU,OAAO,SAAS;AAC/B,SAAK,cAAc,OAAO,MAAM;AAAA,EACjC;AAAA,EAEA,OAAuB,QAAQ,IAAI,EAAE,SAAqB,UAAuB;AAChF,UAAM,OAAO,QAAQ;AACrB,QAAI,OAAO,MAAM,SAAS,UAAU;AACnC,aAAO,SAAS,WAAW;AAAA,IAC5B;AAEA,UAAM,QAAQ,MAAM,KAAK,UAAU,IAAI;AACvC,QAAI,UAAU,MAAM;AACnB,aAAO,SAAS,OAAO,UAAU,mBAAmB,EAAE,KAAK,EAAE,OAAO,6BAA6B,CAAC;AAAA,IACnG;AAEA,UAAM,MAAM,KAAK,IAAI;AACrB,UAAM,OAAO,KAAK,UAAU,OAAO;AACnC,UAAM,OAAO,MAAM,KAAK,UAAU,MAAM,YAAY;AACpD,QAAI,CAAC,KAAK,MAAM;AACf,aAAO,SAAS,OAAO,UAAU,mBAAmB,EAAE,KAAK,EAAE,OAAO,4BAA4B,CAAC;AAAA,IAClG;AAEA,UAAM,QAAQ,KAAK,QAAQ;AAAA,MAC1B,IAAI,KAAK,KAAK;AAAA,MACd,SAAS,MAAM,MAAM,aAAa;AAAA,MAClC,SAAS,MAAM;AAAA,MACf,OAAO,MAAM;AAAA,IACd,CAAC;AAED,aAAS,QAAQ,IAAI,KAAK,QAAQ,OAAO,EAAE,QAAQ,MAAM,WAAW,CAAC;AACrE,WAAO,SAAS,KAAK,IAAI;AAAA,EAC1B;AAAA,EAEA,MAAc,UAAU,MAAsB;AAC7C,UAAM,EAAE,IAAI,OAAO,IAAI,KAAK,UAAU,OAAO;AAE7C,UAAM,OAAgD;AAAA;AAAA,MAErD,WAAW;AAAA,MACX,eAAe;AAAA,MACf,MAAM,KAAK;AAAA,MACX,YAAY;AAAA,MACZ,cAAc,KAAK,eAAe,KAAK;AAAA;AAAA,IAExC;AAEA,UAAM,SAAS,MAAM,MAAM,aAAa,UAAU;AAAA,MACjD,QAAQ;AAAA,MACR,MAAM,UAAU,IAAW;AAAA,MAC3B,SAAS;AAAA,QACR,gBAAgB;AAAA,MACjB;AAAA,IACD,CAAC;AAED,UAAM,OAAO,MAAM,OAAO,KAAK;AAC/B,QAAI,OAAO
|
|
1
|
+
{"version":3,"sources":["../../../../src/routes/oauth/callback.ts"],"names":[],"mappings":";;;;;;AAAA,SAAS,oBAAwG;AACjH,SAAS,iBAAiB;AAC1B,SAAS,aAAa;AACtB,SAAS,aAAa;AAGtB,SAAS,iBAAiB;AAC1B,SAAS,eAAe;AAEjB,IAAM,eAAN,MAAM,qBAAoB,MAAM;AAAA,EAG/B,YAAY,SAA8B;AAChD,UAAM,SAAS,EAAE,OAAO,iBAAiB,CAAC;AAH3C,wBAAiB;AAKhB,UAAM,EAAE,OAAO,IAAI,KAAK;AACxB,SAAK,UAAU,OAAO,SAAS;AAC/B,SAAK,cAAc,OAAO,MAAM;AAAA,EACjC;AAAA,EAEA,OAAuB,QAAQ,IAAI,EAAE,SAAqB,UAAuB;AAChF,UAAM,OAAO,QAAQ;AACrB,QAAI,OAAO,MAAM,SAAS,UAAU;AACnC,aAAO,SAAS,WAAW;AAAA,IAC5B;AAEA,UAAM,QAAQ,MAAM,KAAK,UAAU,IAAI;AACvC,QAAI,UAAU,MAAM;AACnB,aAAO,SAAS,OAAO,UAAU,mBAAmB,EAAE,KAAK,EAAE,OAAO,6BAA6B,CAAC;AAAA,IACnG;AAEA,UAAM,MAAM,KAAK,IAAI;AACrB,UAAM,OAAO,KAAK,UAAU,OAAO;AACnC,UAAM,OAAO,MAAM,KAAK,UAAU,MAAM,YAAY;AACpD,QAAI,CAAC,KAAK,MAAM;AACf,aAAO,SAAS,OAAO,UAAU,mBAAmB,EAAE,KAAK,EAAE,OAAO,4BAA4B,CAAC;AAAA,IAClG;AAEA,UAAM,QAAQ,KAAK,QAAQ;AAAA,MAC1B,IAAI,KAAK,KAAK;AAAA,MACd,SAAS,MAAM,MAAM,aAAa;AAAA,MAClC,SAAS,MAAM;AAAA,MACf,OAAO,MAAM;AAAA,IACd,CAAC;AAED,aAAS,QAAQ,IAAI,KAAK,QAAQ,OAAO,EAAE,QAAQ,MAAM,WAAW,CAAC;AACrE,WAAO,SAAS,KAAK,IAAI;AAAA,EAC1B;AAAA,EAEA,MAAc,UAAU,MAAsB;AAC7C,UAAM,EAAE,IAAI,OAAO,IAAI,KAAK,UAAU,OAAO;AAE7C,UAAM,OAAgD;AAAA;AAAA,MAErD,WAAW;AAAA,MACX,eAAe;AAAA,MACf,MAAM,KAAK;AAAA,MACX,YAAY;AAAA,MACZ,cAAc,KAAK,eAAe,KAAK;AAAA;AAAA,IAExC;AAEA,UAAM,SAAS,MAAM,MAAM,aAAa,UAAU;AAAA,MACjD,QAAQ;AAAA,MACR,MAAM,UAAU,IAAW;AAAA,MAC3B,SAAS;AAAA,QACR,gBAAgB;AAAA,MACjB;AAAA,IACD,CAAC;AAED,UAAM,OAAO,MAAM,OAAO,KAAK;AAC/B,QAAI,OAAO,GAAI,QAAO;AAEtB,SAAK,UAAU,OAAO,MAAM,IAAI;AAChC,WAAO;AAAA,EACR;AACD;AAnEuC;AAAhC,IAAM,cAAN","sourcesContent":["import { OAuth2Routes, type RESTPostOAuth2AccessTokenResult, type RESTPostOAuth2AccessTokenURLEncodedData } from 'discord.js';\nimport { stringify } from 'querystring';\nimport { fetch } from 'undici';\nimport { Route } from '../../lib/structures/Route';\nimport type { ApiRequest } from '../../lib/structures/api/ApiRequest';\nimport type { ApiResponse } from '../../lib/structures/api/ApiResponse';\nimport { HttpCodes } from '../../lib/structures/http/HttpCodes';\nimport { methods } from '../../lib/structures/http/HttpMethods';\n\nexport class PluginRoute extends Route {\n\tprivate readonly redirectUri: string | undefined;\n\n\tpublic constructor(context: Route.LoaderContext) {\n\t\tsuper(context, { route: 'oauth/callback' });\n\n\t\tconst { server } = this.container;\n\t\tthis.enabled = server.auth !== null;\n\t\tthis.redirectUri = server.auth?.redirect;\n\t}\n\n\tpublic override async [methods.POST](request: ApiRequest, response: ApiResponse) {\n\t\tconst body = request.body as OAuth2BodyData;\n\t\tif (typeof body?.code !== 'string') {\n\t\t\treturn response.badRequest();\n\t\t}\n\n\t\tconst value = await this.fetchAuth(body);\n\t\tif (value === null) {\n\t\t\treturn response.status(HttpCodes.InternalServerError).json({ error: 'Failed to fetch the token.' });\n\t\t}\n\n\t\tconst now = Date.now();\n\t\tconst auth = this.container.server.auth!;\n\t\tconst data = await auth.fetchData(value.access_token);\n\t\tif (!data.user) {\n\t\t\treturn response.status(HttpCodes.InternalServerError).json({ error: 'Failed to fetch the user.' });\n\t\t}\n\n\t\tconst token = auth.encrypt({\n\t\t\tid: data.user.id,\n\t\t\texpires: now + value.expires_in * 1000,\n\t\t\trefresh: value.refresh_token,\n\t\t\ttoken: value.access_token\n\t\t});\n\n\t\tresponse.cookies.add(auth.cookie, token, { maxAge: value.expires_in });\n\t\treturn response.json(data);\n\t}\n\n\tprivate async fetchAuth(body: OAuth2BodyData) {\n\t\tconst { id, secret } = this.container.server.auth!;\n\n\t\tconst data: RESTPostOAuth2AccessTokenURLEncodedData = {\n\t\t\t/* eslint-disable @typescript-eslint/naming-convention */\n\t\t\tclient_id: id,\n\t\t\tclient_secret: secret,\n\t\t\tcode: body.code,\n\t\t\tgrant_type: 'authorization_code',\n\t\t\tredirect_uri: this.redirectUri ?? body.redirectUri\n\t\t\t/* eslint-enable @typescript-eslint/naming-convention */\n\t\t};\n\n\t\tconst result = await fetch(OAuth2Routes.tokenURL, {\n\t\t\tmethod: 'POST',\n\t\t\tbody: stringify(data as any),\n\t\t\theaders: {\n\t\t\t\t'content-type': 'application/x-www-form-urlencoded'\n\t\t\t}\n\t\t});\n\n\t\tconst json = await result.json();\n\t\tif (result.ok) return json as RESTPostOAuth2AccessTokenResult;\n\n\t\tthis.container.logger.error(json);\n\t\treturn null;\n\t}\n}\n\n/**\n * The OAuth2 body data sent to the callback.\n * @since 1.2.0\n */\nexport interface OAuth2BodyData {\n\t/**\n\t * The code sent by the client.\n\t * @since 1.2.0\n\t */\n\tcode: string;\n\n\t/**\n\t * The client's ID.\n\t * @since 1.2.0\n\t */\n\tclientId: string;\n\n\t/**\n\t * The redirect URI.\n\t * @since 1.2.0\n\t */\n\tredirectUri: string;\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { __name } from '../../chunk-
|
|
1
|
+
import { __name } from '../../chunk-JTFKMR4I.mjs';
|
|
2
2
|
import { OAuth2Routes } from 'discord.js';
|
|
3
3
|
import { stringify } from 'querystring';
|
|
4
4
|
import { fetch } from 'undici';
|
|
@@ -14,18 +14,15 @@ var _PluginRoute = class _PluginRoute extends Route {
|
|
|
14
14
|
this.enabled = this.container.server.auth !== null;
|
|
15
15
|
}
|
|
16
16
|
async [methods.POST](request, response) {
|
|
17
|
-
if (!request.auth)
|
|
18
|
-
return response.status(HttpCodes.Unauthorized).json({ error: "Unauthorized." });
|
|
17
|
+
if (!request.auth) return response.status(HttpCodes.Unauthorized).json({ error: "Unauthorized." });
|
|
19
18
|
const result = await this.revoke(request.auth.token);
|
|
20
|
-
if (result.ok)
|
|
21
|
-
return this.success(response);
|
|
19
|
+
if (result.ok) return this.success(response);
|
|
22
20
|
if (result.status === HttpCodes.ServiceUnavailable) {
|
|
23
21
|
const retryAfter = this.processRetryAfter(result.headers.get("Retry-After"));
|
|
24
22
|
if (retryAfter) {
|
|
25
23
|
await sleep(retryAfter);
|
|
26
24
|
const result2 = await this.revoke(request.auth.token);
|
|
27
|
-
if (result2.ok)
|
|
28
|
-
return this.success(response);
|
|
25
|
+
if (result2.ok) return this.success(response);
|
|
29
26
|
}
|
|
30
27
|
}
|
|
31
28
|
return response.status(HttpCodes.InternalServerError).json({ error: "Unexpected error from server." });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/routes/oauth/logout.ts"],"names":["result"],"mappings":";;;;;AAAA,SAAS,oBAAoB;AAC7B,SAAS,iBAAiB;AAC1B,SAAS,aAAa;AACtB,SAAS,iBAAiB;AAC1B,SAAS,aAAa;AAGtB,SAAS,iBAAiB;AAC1B,SAAS,eAAe;AAExB,IAAM,QAAQ,UAAU,UAAU;AAE3B,IAAM,eAAN,MAAM,qBAAoB,MAAM;AAAA,EAC/B,YAAY,SAA8B;AAChD,UAAM,SAAS,EAAE,OAAO,eAAe,CAAC;AACxC,SAAK,UAAU,KAAK,UAAU,OAAO,SAAS;AAAA,EAC/C;AAAA,EAEA,OAAuB,QAAQ,IAAI,EAAE,SAAqB,UAAuB;AAChF,QAAI,CAAC,QAAQ
|
|
1
|
+
{"version":3,"sources":["../../../../src/routes/oauth/logout.ts"],"names":["result"],"mappings":";;;;;AAAA,SAAS,oBAAoB;AAC7B,SAAS,iBAAiB;AAC1B,SAAS,aAAa;AACtB,SAAS,iBAAiB;AAC1B,SAAS,aAAa;AAGtB,SAAS,iBAAiB;AAC1B,SAAS,eAAe;AAExB,IAAM,QAAQ,UAAU,UAAU;AAE3B,IAAM,eAAN,MAAM,qBAAoB,MAAM;AAAA,EAC/B,YAAY,SAA8B;AAChD,UAAM,SAAS,EAAE,OAAO,eAAe,CAAC;AACxC,SAAK,UAAU,KAAK,UAAU,OAAO,SAAS;AAAA,EAC/C;AAAA,EAEA,OAAuB,QAAQ,IAAI,EAAE,SAAqB,UAAuB;AAChF,QAAI,CAAC,QAAQ,KAAM,QAAO,SAAS,OAAO,UAAU,YAAY,EAAE,KAAK,EAAE,OAAO,gBAAgB,CAAC;AAEjG,UAAM,SAAS,MAAM,KAAK,OAAO,QAAQ,KAAK,KAAK;AACnD,QAAI,OAAO,GAAI,QAAO,KAAK,QAAQ,QAAQ;AAM3C,QAAI,OAAO,WAAW,UAAU,oBAAoB;AAMnD,YAAM,aAAa,KAAK,kBAAkB,OAAO,QAAQ,IAAI,aAAa,CAAC;AAC3E,UAAI,YAAY;AACf,cAAM,MAAM,UAAU;AAEtB,cAAMA,UAAS,MAAM,KAAK,OAAO,QAAQ,KAAK,KAAK;AACnD,YAAIA,QAAO,GAAI,QAAO,KAAK,QAAQ,QAAQ;AAAA,MAC5C;AAAA,IACD;AAQA,WAAO,SAAS,OAAO,UAAU,mBAAmB,EAAE,KAAK,EAAE,OAAO,gCAAgC,CAAC;AAAA,EACtG;AAAA,EAEQ,QAAQ,UAAuB;AAEtC,aAAS,QAAQ,OAAO,KAAK,UAAU,OAAO,KAAM,MAAM;AAC1D,WAAO,SAAS,KAAK,EAAE,SAAS,KAAK,CAAC;AAAA,EACvC;AAAA,EAEA,MAAc,OAAO,OAAe;AACnC,UAAM,OAAO,KAAK,UAAU,OAAO;AAkBnC,UAAM,SAAS,MAAM,MAAM,aAAa,oBAAoB;AAAA,MAC3D,QAAQ;AAAA,MACR,MAAM,UAAU;AAAA,QACf;AAAA;AAAA,QAEA,WAAW,KAAK;AAAA,QAChB,eAAe,KAAK;AAAA;AAAA,MAErB,CAAC;AAAA,MACD,SAAS;AAAA,QACR,gBAAgB;AAAA,MACjB;AAAA,IACD,CAAC;AAED,WAAO;AAAA,EACR;AAAA,EAEQ,kBAAkB,YAA2B;AAGpD,WAAO,eAAe,OAAO,MAAO,OAAO,UAAU,IAAI;AAAA,EAC1D;AACD;AAvFuC;AAAhC,IAAM,cAAN","sourcesContent":["import { OAuth2Routes } from 'discord.js';\nimport { stringify } from 'querystring';\nimport { fetch } from 'undici';\nimport { promisify } from 'util';\nimport { Route } from '../../lib/structures/Route';\nimport type { ApiRequest } from '../../lib/structures/api/ApiRequest';\nimport type { ApiResponse } from '../../lib/structures/api/ApiResponse';\nimport { HttpCodes } from '../../lib/structures/http/HttpCodes';\nimport { methods } from '../../lib/structures/http/HttpMethods';\n\nconst sleep = promisify(setTimeout);\n\nexport class PluginRoute extends Route {\n\tpublic constructor(context: Route.LoaderContext) {\n\t\tsuper(context, { route: 'oauth/logout' });\n\t\tthis.enabled = this.container.server.auth !== null;\n\t}\n\n\tpublic override async [methods.POST](request: ApiRequest, response: ApiResponse) {\n\t\tif (!request.auth) return response.status(HttpCodes.Unauthorized).json({ error: 'Unauthorized.' });\n\n\t\tconst result = await this.revoke(request.auth.token);\n\t\tif (result.ok) return this.success(response);\n\n\t\t// RFC 7009 2.2.1. If the server responds with HTTP status code 503, the client must assume the token still\n\t\t// exists and may retry after a reasonable delay.\n\t\t// The server may include a \"Retry-After\" header in the response to indicate how long the service is expected to\n\t\t// be unavailable to the requesting client.\n\t\tif (result.status === HttpCodes.ServiceUnavailable) {\n\t\t\t// RFC 7231 7.1.3. Servers send the \"Retry-After\" header field to indicate how long the user agent ought to\n\t\t\t// wait before making a follow-up request.\n\t\t\t//\n\t\t\t// The value of this field can be either an HTTP-date or a number of seconds to delay after the response is\n\t\t\t// received.\n\t\t\tconst retryAfter = this.processRetryAfter(result.headers.get('Retry-After'));\n\t\t\tif (retryAfter) {\n\t\t\t\tawait sleep(retryAfter);\n\n\t\t\t\tconst result = await this.revoke(request.auth.token);\n\t\t\t\tif (result.ok) return this.success(response);\n\t\t\t}\n\t\t}\n\n\t\t// RFC 7009 2.2. The authorization server responds with HTTP status code 200 if the token has been revoked\n\t\t// successfully or if the client submitted an invalid token.\n\t\t//\n\t\t// Note: invalid tokens do not cause an error response since the client cannot handle such an error in a\n\t\t// reasonable way. Moreover, the purpose of the revocation request, invalidating the particular token, is\n\t\t// already achieved.\n\t\treturn response.status(HttpCodes.InternalServerError).json({ error: 'Unexpected error from server.' });\n\t}\n\n\tprivate success(response: ApiResponse) {\n\t\t// Sending an empty cookie with \"expires\" set to 1970-01-01 makes the browser instantly remove the cookie.\n\t\tresponse.cookies.remove(this.container.server.auth!.cookie);\n\t\treturn response.json({ success: true });\n\t}\n\n\tprivate async revoke(token: string) {\n\t\tconst auth = this.container.server.auth!;\n\n\t\t// RFC 7009 2.1.\n\t\t// The following parameters must be formatted as \"application/x-www-form-urlencoded\" in the HTTP request-body:\n\t\t//\n\t\t// - token: The token the client wants to be revoked.\n\t\t// - token_type_hint: [Optional]: `access_token` (RFC 6749 1.4), `refresh_token` (RFC 6749 1.5)\n\t\t//\n\t\t// The client also includes its authentication credentials, as described in RFC 6749 2.3.\n\t\t//\n\t\t// RFC 6749 2.3.1.\n\t\t// The authorization server MAY include the client credentials in the request - body using the following parameters:\n\t\t//\n\t\t// - client_id: The client identifier issued to the client during the registration process (RFC 6749 2.2)\n\t\t// - client_secret: The client secret.\n\t\t//\n\t\t// RFC 7009 2.2.\n\t\t// The content of the response body is ignored by the client as all necessary information is conveyed in the response code.\n\t\tconst result = await fetch(OAuth2Routes.tokenRevocationURL, {\n\t\t\tmethod: 'POST',\n\t\t\tbody: stringify({\n\t\t\t\ttoken,\n\t\t\t\t/* eslint-disable @typescript-eslint/naming-convention */\n\t\t\t\tclient_id: auth.id,\n\t\t\t\tclient_secret: auth.secret\n\t\t\t\t/* eslint-enable @typescript-eslint/naming-convention */\n\t\t\t}),\n\t\t\theaders: {\n\t\t\t\t'content-type': 'application/x-www-form-urlencoded'\n\t\t\t}\n\t\t});\n\n\t\treturn result;\n\t}\n\n\tprivate processRetryAfter(retryAfter: string | null) {\n\t\t// Discord sends Retry-After in seconds, never an HTTP-date, therefore, we will assume this behaviour.\n\t\t// Either way, if it's not present, we will retry in 5 seconds.\n\t\treturn retryAfter === null ? 5000 : Number(retryAfter) * 1000;\n\t}\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sapphire/plugin-api",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "7.0.0-next.d27dc1c",
|
|
4
4
|
"description": "Plugin for @sapphire/framework to expose a REST API",
|
|
5
5
|
"author": "@sapphire",
|
|
6
6
|
"license": "MIT",
|
|
@@ -51,8 +51,8 @@
|
|
|
51
51
|
},
|
|
52
52
|
"dependencies": {
|
|
53
53
|
"@types/ws": "^8.5.10",
|
|
54
|
-
"tldts": "^6.1.
|
|
55
|
-
"undici": "^6.
|
|
54
|
+
"tldts": "^6.1.29",
|
|
55
|
+
"undici": "^6.19.2"
|
|
56
56
|
},
|
|
57
57
|
"repository": {
|
|
58
58
|
"type": "git",
|
|
@@ -83,13 +83,13 @@
|
|
|
83
83
|
"access": "public"
|
|
84
84
|
},
|
|
85
85
|
"devDependencies": {
|
|
86
|
-
"@favware/cliff-jumper": "^
|
|
86
|
+
"@favware/cliff-jumper": "^4.0.2",
|
|
87
87
|
"@favware/rollup-type-bundler": "^3.3.0",
|
|
88
88
|
"concurrently": "^8.2.2",
|
|
89
|
-
"tsup": "^8.0
|
|
90
|
-
"tsx": "^4.
|
|
89
|
+
"tsup": "^8.1.0",
|
|
90
|
+
"tsx": "^4.15.7",
|
|
91
91
|
"typedoc": "^0.25.13",
|
|
92
92
|
"typedoc-json-parser": "^10.0.0",
|
|
93
|
-
"typescript": "
|
|
93
|
+
"typescript": "~5.4.5"
|
|
94
94
|
}
|
|
95
95
|
}
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
var __defProp = Object.defineProperty;
|
|
2
|
-
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
3
|
-
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
4
|
-
var __publicField = (obj, key, value) => {
|
|
5
|
-
__defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
6
|
-
return value;
|
|
7
|
-
};
|
|
8
|
-
var __accessCheck = (obj, member, msg) => {
|
|
9
|
-
if (!member.has(obj))
|
|
10
|
-
throw TypeError("Cannot " + msg);
|
|
11
|
-
};
|
|
12
|
-
var __privateGet = (obj, member, getter) => {
|
|
13
|
-
__accessCheck(obj, member, "read from private field");
|
|
14
|
-
return getter ? getter.call(obj) : member.get(obj);
|
|
15
|
-
};
|
|
16
|
-
var __privateAdd = (obj, member, value) => {
|
|
17
|
-
if (member.has(obj))
|
|
18
|
-
throw TypeError("Cannot add the same private member more than once");
|
|
19
|
-
member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
20
|
-
};
|
|
21
|
-
var __privateSet = (obj, member, value, setter) => {
|
|
22
|
-
__accessCheck(obj, member, "write to private field");
|
|
23
|
-
setter ? setter.call(obj, value) : member.set(obj, value);
|
|
24
|
-
return value;
|
|
25
|
-
};
|
|
26
|
-
|
|
27
|
-
export { __name, __privateAdd, __privateGet, __privateSet, __publicField };
|
|
28
|
-
//# sourceMappingURL=out.js.map
|
|
29
|
-
//# sourceMappingURL=chunk-PYETHG4R.mjs.map
|
|
File without changes
|