@20syldev/api 3.5.0 → 4.0.0
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/.prettierrc +7 -0
- package/README.md +32 -33
- package/dist/app.js +36 -0
- package/dist/app.js.map +1 -0
- package/dist/config/env.js +73 -0
- package/dist/config/env.js.map +1 -0
- package/dist/config/versions.js +72 -0
- package/dist/config/versions.js.map +1 -0
- package/dist/constants.js +42 -0
- package/dist/constants.js.map +1 -0
- package/dist/middleware/cors.js +15 -0
- package/dist/middleware/cors.js.map +1 -0
- package/dist/middleware/error.js +6 -0
- package/dist/middleware/error.js.map +1 -0
- package/dist/middleware/json.js +8 -0
- package/dist/middleware/json.js.map +1 -0
- package/dist/middleware/logger.js +26 -0
- package/dist/middleware/logger.js.map +1 -0
- package/dist/middleware/ratelimit.js +58 -0
- package/dist/middleware/ratelimit.js.map +1 -0
- package/dist/middleware/version.js +30 -0
- package/dist/middleware/version.js.map +1 -0
- package/dist/modules/v3/algorithms.js +221 -0
- package/dist/modules/v3/algorithms.js.map +1 -0
- package/{modules → dist/modules}/v3/captcha.js +4 -13
- package/dist/modules/v3/captcha.js.map +1 -0
- package/dist/modules/v3/chat.js +103 -0
- package/dist/modules/v3/chat.js.map +1 -0
- package/{modules → dist/modules}/v3/color.js +12 -13
- package/dist/modules/v3/color.js.map +1 -0
- package/dist/modules/v3/convert.js +41 -0
- package/dist/modules/v3/convert.js.map +1 -0
- package/dist/modules/v3/domain.js +83 -0
- package/dist/modules/v3/domain.js.map +1 -0
- package/dist/modules/v3/hash.js +16 -0
- package/dist/modules/v3/hash.js.map +1 -0
- package/dist/modules/v3/hyperplanning.js +50 -0
- package/dist/modules/v3/hyperplanning.js.map +1 -0
- package/dist/modules/v3/levenshtein.js +38 -0
- package/dist/modules/v3/levenshtein.js.map +1 -0
- package/dist/modules/v3/personal.js +129 -0
- package/dist/modules/v3/personal.js.map +1 -0
- package/dist/modules/v3/qrcode.js +21 -0
- package/dist/modules/v3/qrcode.js.map +1 -0
- package/dist/modules/v3/tic_tac_toe.js +221 -0
- package/dist/modules/v3/tic_tac_toe.js.map +1 -0
- package/dist/modules/v3/time.js +88 -0
- package/dist/modules/v3/time.js.map +1 -0
- package/{modules → dist/modules}/v3/token.js +10 -11
- package/dist/modules/v3/token.js.map +1 -0
- package/dist/modules/v3/username.js +92 -0
- package/dist/modules/v3/username.js.map +1 -0
- package/dist/modules/v3/utils.js +70 -0
- package/dist/modules/v3/utils.js.map +1 -0
- package/dist/modules/v3.js +16 -0
- package/dist/modules/v3.js.map +1 -0
- package/dist/modules/v4/algorithms.js +200 -0
- package/dist/modules/v4/algorithms.js.map +1 -0
- package/dist/modules/v4/captcha.js +35 -0
- package/dist/modules/v4/captcha.js.map +1 -0
- package/dist/modules/v4/chat.js +92 -0
- package/dist/modules/v4/chat.js.map +1 -0
- package/dist/modules/v4/color.js +43 -0
- package/dist/modules/v4/color.js.map +1 -0
- package/dist/modules/v4/convert.js +33 -0
- package/dist/modules/v4/convert.js.map +1 -0
- package/dist/modules/v4/dice.js +30 -0
- package/dist/modules/v4/dice.js.map +1 -0
- package/dist/modules/v4/domain.js +78 -0
- package/dist/modules/v4/domain.js.map +1 -0
- package/dist/modules/v4/encode.js +165 -0
- package/dist/modules/v4/encode.js.map +1 -0
- package/dist/modules/v4/geo.js +41 -0
- package/dist/modules/v4/geo.js.map +1 -0
- package/dist/modules/v4/hash.js +9 -0
- package/dist/modules/v4/hash.js.map +1 -0
- package/dist/modules/v4/hyperplanning.js +42 -0
- package/dist/modules/v4/hyperplanning.js.map +1 -0
- package/dist/modules/v4/levenshtein.js +29 -0
- package/dist/modules/v4/levenshtein.js.map +1 -0
- package/dist/modules/v4/palette.js +89 -0
- package/dist/modules/v4/palette.js.map +1 -0
- package/dist/modules/v4/personal.js +125 -0
- package/dist/modules/v4/personal.js.map +1 -0
- package/dist/modules/v4/placeholder.js +96 -0
- package/dist/modules/v4/placeholder.js.map +1 -0
- package/dist/modules/v4/qrcode.js +12 -0
- package/dist/modules/v4/qrcode.js.map +1 -0
- package/dist/modules/v4/statistics.js +41 -0
- package/dist/modules/v4/statistics.js.map +1 -0
- package/dist/modules/v4/text.js +293 -0
- package/dist/modules/v4/text.js.map +1 -0
- package/dist/modules/v4/tic_tac_toe.js +206 -0
- package/dist/modules/v4/tic_tac_toe.js.map +1 -0
- package/dist/modules/v4/time.js +73 -0
- package/dist/modules/v4/time.js.map +1 -0
- package/dist/modules/v4/token.js +36 -0
- package/dist/modules/v4/token.js.map +1 -0
- package/dist/modules/v4/username.js +87 -0
- package/dist/modules/v4/username.js.map +1 -0
- package/dist/modules/v4/utils.js +26 -0
- package/dist/modules/v4/utils.js.map +1 -0
- package/dist/modules/v4/validate.js +54 -0
- package/dist/modules/v4/validate.js.map +1 -0
- package/dist/modules/v4.js +18 -0
- package/dist/modules/v4.js.map +1 -0
- package/dist/routes/delete.js +65 -0
- package/dist/routes/delete.js.map +1 -0
- package/dist/routes/get.js +441 -0
- package/dist/routes/get.js.map +1 -0
- package/dist/routes/index.js +50 -0
- package/dist/routes/index.js.map +1 -0
- package/dist/routes/patch.js +41 -0
- package/dist/routes/patch.js.map +1 -0
- package/dist/routes/post.js +185 -0
- package/dist/routes/post.js.map +1 -0
- package/dist/storage/index.js +13 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/types/storage.js +2 -0
- package/dist/types/storage.js.map +1 -0
- package/dist/utils/response.js +10 -0
- package/dist/utils/response.js.map +1 -0
- package/dist/utils/version.js +3 -0
- package/dist/utils/version.js.map +1 -0
- package/eslint.config.js +20 -0
- package/package.json +30 -15
- package/src/app.ts +44 -0
- package/src/config/env.ts +81 -0
- package/src/config/versions.ts +80 -0
- package/src/constants.ts +28 -0
- package/src/middleware/cors.ts +17 -0
- package/src/middleware/error.ts +7 -0
- package/src/middleware/json.ts +9 -0
- package/src/middleware/logger.ts +31 -0
- package/src/middleware/ratelimit.ts +66 -0
- package/src/middleware/version.ts +39 -0
- package/{modules → src/modules}/v3/algorithms.js +1 -1
- package/src/modules/v3/captcha.js +60 -0
- package/{modules → src/modules}/v3/chat.js +6 -4
- package/src/modules/v3/color.js +60 -0
- package/{modules → src/modules}/v3/convert.js +5 -5
- package/{modules → src/modules}/v3/domain.js +51 -4
- package/{modules → src/modules}/v3/hash.js +1 -1
- package/{modules → src/modules}/v3/hyperplanning.js +11 -10
- package/{modules → src/modules}/v3/levenshtein.js +3 -3
- package/{modules → src/modules}/v3/personal.js +20 -8
- package/{modules → src/modules}/v3/qrcode.js +1 -1
- package/{modules → src/modules}/v3/tic_tac_toe.js +24 -18
- package/{modules → src/modules}/v3/time.js +22 -11
- package/src/modules/v3/token.js +54 -0
- package/src/modules/v3/username.js +94 -0
- package/{modules → src/modules}/v3/utils.js +2 -2
- package/{modules → src/modules}/v3.js +1 -1
- package/src/modules/v4/algorithms.ts +155 -0
- package/src/modules/v4/captcha.ts +49 -0
- package/src/modules/v4/chat.ts +99 -0
- package/src/modules/v4/color.ts +64 -0
- package/src/modules/v4/convert.ts +38 -0
- package/src/modules/v4/domain.ts +81 -0
- package/src/modules/v4/hash.ts +9 -0
- package/src/modules/v4/hyperplanning.ts +58 -0
- package/src/modules/v4/levenshtein.ts +38 -0
- package/src/modules/v4/personal.ts +147 -0
- package/src/modules/v4/qrcode.ts +11 -0
- package/src/modules/v4/tic_tac_toe.ts +223 -0
- package/src/modules/v4/time.ts +92 -0
- package/src/modules/v4/token.ts +43 -0
- package/src/modules/v4/username.ts +89 -0
- package/src/modules/v4/utils.ts +38 -0
- package/src/modules/v4.ts +15 -0
- package/src/routes/get.ts +461 -0
- package/src/routes/index.ts +58 -0
- package/src/routes/post.ts +200 -0
- package/src/storage/index.ts +16 -0
- package/src/types/express.d.ts +17 -0
- package/src/types/storage.ts +48 -0
- package/src/utils/response.ts +11 -0
- package/tsconfig.json +17 -0
- package/app.js +0 -865
- package/modules/v3/username.js +0 -32
package/.prettierrc
ADDED
package/README.md
CHANGED
|
@@ -2,16 +2,19 @@
|
|
|
2
2
|
<a href="https://api.sylvain.sh"><img src="https://api.sylvain.sh/favicon.ico" alt="Logo" width="25%" height="auto"/></a>
|
|
3
3
|
|
|
4
4
|
# API Personnelle
|
|
5
|
-
[](https://github.com/20syldev/api/releases/latest)
|
|
6
6
|
</div>
|
|
7
7
|
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
## À propos de l'API
|
|
11
11
|
Voici mon API personnelle, disponible sur le domaine [api.sylvain.sh](https://api.sylvain.sh).
|
|
12
|
-
L'API est développée avec Node.js et hébergée **24h/7j**. Elle est **simple d'utilisation** et a une **documentation** disponible sur [docs.sylvain.sh](https://docs.sylvain.sh) !
|
|
12
|
+
L'API est développée avec **TypeScript** et **Node.js**, et hébergée **24h/7j**. Elle est **simple d'utilisation** et a une **documentation** disponible sur [docs.sylvain.sh](https://docs.sylvain.sh) !
|
|
13
13
|
> *Une limite de **2000** requêtes **par heure** est fixée. Elle change pour certains endpoints nécessitant plus de ressources. Si vous souhaitez une **augmentation** de cette limite, n'hésitez pas à visiter la [documentation](https://docs.sylvain.sh/pricing).*
|
|
14
14
|
|
|
15
|
+
## Prérequis
|
|
16
|
+
- **Node.js** >= 22.0.0
|
|
17
|
+
|
|
15
18
|
## Installer le paquet de l'API sur votre machine
|
|
16
19
|
```console
|
|
17
20
|
$ sudo apt install nodejs npm
|
|
@@ -24,26 +27,34 @@ $ npm init
|
|
|
24
27
|
|
|
25
28
|
### Option 1 : Démarrer un serveur local
|
|
26
29
|
|
|
27
|
-
Pour démarrer un serveur local avec tous les endpoints
|
|
28
|
-
```
|
|
29
|
-
|
|
30
|
+
Pour démarrer un serveur local avec tous les endpoints :
|
|
31
|
+
```console
|
|
32
|
+
$ npm run build && npm start
|
|
30
33
|
```
|
|
31
|
-
|
|
32
|
-
Puis, **démarrez** un serveur [Node.js](https://nodejs.org) :
|
|
33
34
|
```console
|
|
34
|
-
|
|
35
|
+
> @20syldev/api@4.0.0 build
|
|
36
|
+
> tsc
|
|
37
|
+
|
|
38
|
+
> @20syldev/api@4.0.0 start
|
|
39
|
+
> node dist/app.js
|
|
40
|
+
|
|
35
41
|
API is running on
|
|
36
42
|
- http://127.0.0.1:3000
|
|
37
43
|
- http://localhost:3000
|
|
38
44
|
```
|
|
39
45
|
|
|
46
|
+
Pour le développement avec rechargement automatique :
|
|
47
|
+
```console
|
|
48
|
+
$ npm run dev
|
|
49
|
+
```
|
|
50
|
+
|
|
40
51
|
### Option 2 : Utiliser les modules directement dans votre code
|
|
41
52
|
|
|
42
53
|
Vous pouvez également importer les modules spécifiques dont vous avez besoin :
|
|
43
54
|
|
|
44
55
|
```js
|
|
45
|
-
// Importer des modules spécifiques depuis la
|
|
46
|
-
import { color, token, username } from '@20syldev/api/
|
|
56
|
+
// Importer des modules spécifiques depuis la v4
|
|
57
|
+
import { color, token, username } from '@20syldev/api/v4';
|
|
47
58
|
|
|
48
59
|
// Générer une couleur aléatoire
|
|
49
60
|
const couleur = color();
|
|
@@ -60,32 +71,20 @@ const jeton = token(16, 'hex');
|
|
|
60
71
|
console.log(`Jeton: ${jeton}`);
|
|
61
72
|
```
|
|
62
73
|
|
|
63
|
-
##
|
|
64
|
-
**Téléchargez** la [dernière mise à jour](https://github.com/20syldev/api/releases/latest) de l'API, puis **extrayez** le contenu du fichier `.zip` ou `.tar.gz` dans un de vos **répertoires**.
|
|
65
|
-
Ensuite, **déplacez-vous** dans le dossier du projet, via un terminal **Linux**, **Windows** ou **macOS** :
|
|
66
|
-
```console
|
|
67
|
-
$ cd /chemin/vers/le/projet
|
|
68
|
-
```
|
|
69
|
-
|
|
70
|
-
Enfin, **exécutez** le script de build, qui installera les **dépendances** et lancera le **serveur** de l'[API](https://api.sylvain.sh) :
|
|
71
|
-
```console
|
|
72
|
-
$ npm run build
|
|
73
|
-
```
|
|
74
|
-
```console
|
|
75
|
-
> @20syldev/api@3.5.0 build
|
|
76
|
-
> npm install && node app.js
|
|
77
|
-
|
|
78
|
-
[...]
|
|
74
|
+
## Scripts disponibles
|
|
79
75
|
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
76
|
+
| Commande | Description |
|
|
77
|
+
|----------|-------------|
|
|
78
|
+
| `npm run dev` | Serveur de développement avec rechargement automatique (tsx watch) |
|
|
79
|
+
| `npm run build` | Compilation TypeScript vers `dist/` |
|
|
80
|
+
| `npm start` | Démarrer le serveur de production (`node dist/app.js`) |
|
|
81
|
+
| `npm run lint` | Vérification ESLint |
|
|
82
|
+
| `npm run format` | Formatage avec Prettier |
|
|
83
|
+
| `npm run check` | Vérification TypeScript + ESLint |
|
|
85
84
|
|
|
86
85
|
## Modules disponibles
|
|
87
86
|
|
|
88
|
-
L'API
|
|
87
|
+
L'API v4 expose plusieurs modules que vous pouvez importer :
|
|
89
88
|
|
|
90
89
|
```js
|
|
91
90
|
import {
|
|
@@ -104,7 +103,7 @@ import {
|
|
|
104
103
|
time, // Informations temporelles
|
|
105
104
|
token, // Génération de jetons sécurisés
|
|
106
105
|
username // Génération de noms d'utilisateur
|
|
107
|
-
} from '@20syldev/api/
|
|
106
|
+
} from '@20syldev/api/v4';
|
|
108
107
|
```
|
|
109
108
|
|
|
110
109
|
*Visitez la [documentation](https://docs.sylvain.sh) dédiée, vous y retrouverez des exemples de requêtes et des codes simples pour tester l'[API](https://api.sylvain.sh) !*
|
package/dist/app.js
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import express from 'express';
|
|
2
|
+
import { env } from './config/env.js';
|
|
3
|
+
import { setupCors } from './middleware/cors.js';
|
|
4
|
+
import { jsonResponseMiddleware } from './middleware/json.js';
|
|
5
|
+
import { rateLimitMiddleware } from './middleware/ratelimit.js';
|
|
6
|
+
import { loggerMiddleware } from './middleware/logger.js';
|
|
7
|
+
import { errorHandler } from './middleware/error.js';
|
|
8
|
+
import { versionCheckMiddleware, endpointCheckMiddleware } from './middleware/version.js';
|
|
9
|
+
import indexRoutes from './routes/index.js';
|
|
10
|
+
import getRoutes from './routes/get.js';
|
|
11
|
+
import postRoutes from './routes/post.js';
|
|
12
|
+
const app = express();
|
|
13
|
+
// Setup CORS, body parsing, static files
|
|
14
|
+
setupCors(app);
|
|
15
|
+
// Custom JSON response
|
|
16
|
+
app.use(jsonResponseMiddleware);
|
|
17
|
+
// Rate limiting
|
|
18
|
+
app.use(rateLimitMiddleware);
|
|
19
|
+
// Request logging
|
|
20
|
+
app.use(loggerMiddleware);
|
|
21
|
+
// Error handling
|
|
22
|
+
app.use(errorHandler);
|
|
23
|
+
// Root routes (before version check)
|
|
24
|
+
app.use(indexRoutes);
|
|
25
|
+
// Version & endpoint validation
|
|
26
|
+
app.use('/:version', versionCheckMiddleware);
|
|
27
|
+
app.use('/:version/:endpoint', endpointCheckMiddleware);
|
|
28
|
+
// Versioned routes
|
|
29
|
+
app.use(getRoutes);
|
|
30
|
+
app.use(postRoutes);
|
|
31
|
+
// Start server
|
|
32
|
+
if (process.env.NODE_ENV !== 'test') {
|
|
33
|
+
app.listen(env.PORT, () => console.log(`API is running on\n - http://127.0.0.1:${env.PORT}\n - http://localhost:${env.PORT}`));
|
|
34
|
+
}
|
|
35
|
+
export default app;
|
|
36
|
+
//# sourceMappingURL=app.js.map
|
package/dist/app.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAC1F,OAAO,WAAW,MAAM,mBAAmB,CAAC;AAC5C,OAAO,SAAS,MAAM,iBAAiB,CAAC;AACxC,OAAO,UAAU,MAAM,kBAAkB,CAAC;AAE1C,MAAM,GAAG,GAAG,OAAO,EAAE,CAAC;AAEtB,yCAAyC;AACzC,SAAS,CAAC,GAAG,CAAC,CAAC;AAEf,uBAAuB;AACvB,GAAG,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;AAEhC,gBAAgB;AAChB,GAAG,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;AAE7B,kBAAkB;AAClB,GAAG,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;AAE1B,iBAAiB;AACjB,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;AAEtB,qCAAqC;AACrC,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;AAErB,gCAAgC;AAChC,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,sBAAsB,CAAC,CAAC;AAC7C,GAAG,CAAC,GAAG,CAAC,qBAAqB,EAAE,uBAAuB,CAAC,CAAC;AAExD,mBAAmB;AACnB,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AACnB,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;AAEpB,eAAe;AACf,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;IAClC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE,CACtB,OAAO,CAAC,GAAG,CAAC,6CAA6C,GAAG,CAAC,IAAI,4BAA4B,GAAG,CAAC,IAAI,EAAE,CAAC,CAC3G,CAAC;AACN,CAAC;AAED,eAAe,GAAG,CAAC"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import dotenv from 'dotenv';
|
|
2
|
+
import { DEFAULT_PORT } from '../constants.js';
|
|
3
|
+
dotenv.config();
|
|
4
|
+
function envList(key) {
|
|
5
|
+
const v = process.env[key];
|
|
6
|
+
return v && v !== 'undefined' ? v.split(' ') : null;
|
|
7
|
+
}
|
|
8
|
+
function envNumber(key, fallback) {
|
|
9
|
+
const v = parseInt(process.env[key] ?? '', 10);
|
|
10
|
+
return isNaN(v) ? fallback : v;
|
|
11
|
+
}
|
|
12
|
+
export const env = {
|
|
13
|
+
PORT: envNumber('PORT', DEFAULT_PORT),
|
|
14
|
+
GITHUB_TOKEN: process.env.GITHUB_TOKEN ?? '',
|
|
15
|
+
DEFAULT_LIMIT: envNumber('DEFAULT_LIMIT', 2000),
|
|
16
|
+
PRO_LIMIT: envNumber('PRO_LIMIT', 6000),
|
|
17
|
+
ADVANCED_LIMIT: envNumber('ADVANCED_LIMIT', 4000),
|
|
18
|
+
BUSINESS_LIMIT: envNumber('BUSINESS_LIMIT', 10000),
|
|
19
|
+
GLOBAL_LIMIT: envNumber('GLOBAL_LIMIT', 50000),
|
|
20
|
+
BUSINESS_TOKEN_LIST: envList('BUSINESS_TOKEN_LIST') ?? [],
|
|
21
|
+
PRO_TOKEN_LIST: envList('PRO_TOKEN_LIST') ?? [],
|
|
22
|
+
ADVANCED_TOKEN_LIST: envList('ADVANCED_TOKEN_LIST') ?? [],
|
|
23
|
+
// Website endpoint env vars
|
|
24
|
+
G_2048: process.env.G_2048,
|
|
25
|
+
API: process.env.API,
|
|
26
|
+
CDN: process.env.CDN,
|
|
27
|
+
COOP_API: process.env.COOP_API,
|
|
28
|
+
COOP_STATUS: process.env.COOP_STATUS,
|
|
29
|
+
CHAT: process.env.CHAT,
|
|
30
|
+
DIGIT: process.env.DIGIT,
|
|
31
|
+
DOC_COOPBOT: process.env.DOC_COOPBOT,
|
|
32
|
+
DOCS: process.env.DOCS,
|
|
33
|
+
DONUT: process.env.DONUT,
|
|
34
|
+
DRAWIO_PLUGIN: process.env.DRAWIO_PLUGIN,
|
|
35
|
+
FLOWERS: process.env.FLOWERS,
|
|
36
|
+
GEMSYNC: process.env.GEMSYNC,
|
|
37
|
+
GFT: process.env.GFT,
|
|
38
|
+
GITSITE: process.env.GITSITE,
|
|
39
|
+
LEBONCHAR: process.env.LEBONCHAR,
|
|
40
|
+
LOGGER: process.env.LOGGER,
|
|
41
|
+
LOGS: process.env.LOGS,
|
|
42
|
+
LOGVAULT: process.env.LOGVAULT,
|
|
43
|
+
LYAH: process.env.LYAH,
|
|
44
|
+
MINIFY: process.env.MINIFY,
|
|
45
|
+
MN: process.env.MN,
|
|
46
|
+
MONITORING: process.env.MONITORING,
|
|
47
|
+
MORPION: process.env.MORPION,
|
|
48
|
+
NITROGEN: process.env.NITROGEN,
|
|
49
|
+
OLD_DATABASE: process.env.OLD_DATABASE,
|
|
50
|
+
PASSWORD: process.env.PASSWORD,
|
|
51
|
+
PHP: process.env.PHP,
|
|
52
|
+
PLANNING: process.env.PLANNING,
|
|
53
|
+
PING: process.env.PING,
|
|
54
|
+
PORTFOLIO: process.env.PORTFOLIO,
|
|
55
|
+
PYTHON_API: process.env.PYTHON_API,
|
|
56
|
+
README: process.env.README,
|
|
57
|
+
TIMESTAMP: process.env.TIMESTAMP,
|
|
58
|
+
TERMINAL: process.env.TERMINAL,
|
|
59
|
+
VALENTINE: process.env.VALENTINE,
|
|
60
|
+
WRKIT: process.env.WRKIT,
|
|
61
|
+
ZPKI: process.env.ZPKI,
|
|
62
|
+
PATCH: envList('PATCH'),
|
|
63
|
+
RECENT: envList('RECENT'),
|
|
64
|
+
NEW: envList('NEW'),
|
|
65
|
+
DOMAINS: envList('DOMAINS'),
|
|
66
|
+
STATS1: process.env.STATS1,
|
|
67
|
+
STATS2: process.env.STATS2,
|
|
68
|
+
STATS3: process.env.STATS3,
|
|
69
|
+
STATS4: process.env.STATS4,
|
|
70
|
+
TAG: process.env.TAG,
|
|
71
|
+
ACTIVE: process.env.ACTIVE === 'true',
|
|
72
|
+
};
|
|
73
|
+
//# sourceMappingURL=env.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/config/env.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import * as apiv3 from '../modules/v3.js';
|
|
2
|
+
import * as apiv4 from '../modules/v4.js';
|
|
3
|
+
/**
|
|
4
|
+
* Merges a base list of endpoints with additions, deduplicating by `name`.
|
|
5
|
+
* If an addition has the same name as a base entry, it overrides it.
|
|
6
|
+
*/
|
|
7
|
+
const merge = (base, additions) => {
|
|
8
|
+
const map = new Map(base.map((e) => [e.name, e]));
|
|
9
|
+
for (const e of additions)
|
|
10
|
+
map.set(e.name, e);
|
|
11
|
+
return [...map.values()];
|
|
12
|
+
};
|
|
13
|
+
const v1 = {
|
|
14
|
+
get: [
|
|
15
|
+
{ name: 'algorithms', path: '/algorithms?method={algorithm}&value={value}(&value2={value2})' },
|
|
16
|
+
{ name: 'captcha', path: '/captcha?text={text}' },
|
|
17
|
+
{ name: 'color', path: '/color' },
|
|
18
|
+
{ name: 'convert', path: '/convert?value={value}&from={unit}&to={unit}' },
|
|
19
|
+
{ name: 'domain', path: '/domain' },
|
|
20
|
+
{ name: 'infos', path: '/infos' },
|
|
21
|
+
{ name: 'personal', path: '/personal' },
|
|
22
|
+
{ name: 'qrcode', path: '/qrcode?url={URL}' },
|
|
23
|
+
{ name: 'username', path: '/username' },
|
|
24
|
+
{ name: 'website', path: '/website' },
|
|
25
|
+
],
|
|
26
|
+
post: [{ name: 'token', path: '/token' }],
|
|
27
|
+
};
|
|
28
|
+
const v2 = {
|
|
29
|
+
get: merge(v1.get, [{ name: 'chat', path: '/chat' }]),
|
|
30
|
+
post: merge(v1.post, [
|
|
31
|
+
{
|
|
32
|
+
name: 'chat',
|
|
33
|
+
children: {
|
|
34
|
+
chat: '/chat',
|
|
35
|
+
private: '/chat/private',
|
|
36
|
+
},
|
|
37
|
+
},
|
|
38
|
+
{ name: 'hash', path: '/hash' },
|
|
39
|
+
{
|
|
40
|
+
name: 'tic_tac_toe',
|
|
41
|
+
children: {
|
|
42
|
+
tic_tac_toe: '/tic-tac-toe',
|
|
43
|
+
fetch: '/tic-tac-toe/fetch',
|
|
44
|
+
list: '/tic-tac-toe/list',
|
|
45
|
+
},
|
|
46
|
+
},
|
|
47
|
+
]),
|
|
48
|
+
};
|
|
49
|
+
const v3 = {
|
|
50
|
+
get: merge(v2.get, [
|
|
51
|
+
{ name: 'levenshtein', path: '/levenshtein?str1={string}&str2={string}' },
|
|
52
|
+
{
|
|
53
|
+
name: 'time',
|
|
54
|
+
path: '/time(?type={type}&start={timestamp}&end={timestamp}&format={format}&timezone={timezone})',
|
|
55
|
+
},
|
|
56
|
+
]),
|
|
57
|
+
post: merge(v2.post, [{ name: 'hyperplanning', path: '/hyperplanning' }]),
|
|
58
|
+
};
|
|
59
|
+
const v4 = {
|
|
60
|
+
get: merge(v3.get, [
|
|
61
|
+
{ name: 'dice', path: '/dice?roll={NdX+M}' },
|
|
62
|
+
{ name: 'statistics', path: '/statistics?values={n1,n2,n3,...}' },
|
|
63
|
+
]),
|
|
64
|
+
post: [...v3.post],
|
|
65
|
+
};
|
|
66
|
+
export const versions = {
|
|
67
|
+
v1: { endpoints: v1, modules: apiv3 },
|
|
68
|
+
v2: { endpoints: v2, modules: apiv3 },
|
|
69
|
+
v3: { endpoints: v3, modules: apiv3 },
|
|
70
|
+
v4: { endpoints: v4, modules: apiv4 },
|
|
71
|
+
};
|
|
72
|
+
//# sourceMappingURL=versions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"versions.js","sourceRoot":"","sources":["../../src/config/versions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
export const MAX_LOG_ENTRIES = 1000;
|
|
2
|
+
export const RATE_LIMIT_WINDOW = 10_000;
|
|
3
|
+
export const RATE_LIMIT_MAX = 50;
|
|
4
|
+
export const SESSION_TTL = 3_600_000;
|
|
5
|
+
export const GAME_CLEANUP_TTL = 600_000;
|
|
6
|
+
export const GITHUB_CACHE_TTL = 600_000;
|
|
7
|
+
export const MIN_TOKEN_LENGTH = 12;
|
|
8
|
+
export const MAX_TOKEN_LENGTH = 4096;
|
|
9
|
+
export const MAX_FACTORIAL = 170;
|
|
10
|
+
export const MAX_GCD_VALUE = 100_000;
|
|
11
|
+
export const MAX_PRIME_LIST = 10_000;
|
|
12
|
+
export const MAX_LEVENSHTEIN_LENGTH = 1000;
|
|
13
|
+
export const MAX_STRING_LENGTH = 1000;
|
|
14
|
+
export const MIN_TEMPERATURE = -273.15;
|
|
15
|
+
export const MAX_TEMPERATURE = 1_000_000;
|
|
16
|
+
export const DOCS_URL = 'https://docs.sylvain.sh';
|
|
17
|
+
export const DEFAULT_PORT = 3000;
|
|
18
|
+
export const STATUS_MESSAGES = {
|
|
19
|
+
400: 'Bad Request',
|
|
20
|
+
401: 'Unauthorized',
|
|
21
|
+
404: 'Not Found',
|
|
22
|
+
405: 'Method Not Allowed',
|
|
23
|
+
429: 'Too Many Requests',
|
|
24
|
+
500: 'Internal Server Error',
|
|
25
|
+
};
|
|
26
|
+
export const START_TIME = Date.now();
|
|
27
|
+
export const ROMAN_VALUES = [
|
|
28
|
+
[1000, 'M'],
|
|
29
|
+
[900, 'CM'],
|
|
30
|
+
[500, 'D'],
|
|
31
|
+
[400, 'CD'],
|
|
32
|
+
[100, 'C'],
|
|
33
|
+
[90, 'XC'],
|
|
34
|
+
[50, 'L'],
|
|
35
|
+
[40, 'XL'],
|
|
36
|
+
[10, 'X'],
|
|
37
|
+
[9, 'IX'],
|
|
38
|
+
[5, 'V'],
|
|
39
|
+
[4, 'IV'],
|
|
40
|
+
[1, 'I'],
|
|
41
|
+
];
|
|
42
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,CAAC;AACpC,MAAM,CAAC,MAAM,iBAAiB,GAAG,MAAM,CAAC;AACxC,MAAM,CAAC,MAAM,cAAc,GAAG,EAAE,CAAC;AACjC,MAAM,CAAC,MAAM,WAAW,GAAG,SAAS,CAAC;AACrC,MAAM,CAAC,MAAM,gBAAgB,GAAG,OAAO,CAAC;AACxC,MAAM,CAAC,MAAM,gBAAgB,GAAG,OAAO,CAAC;AACxC,MAAM,CAAC,MAAM,gBAAgB,GAAG,EAAE,CAAC;AACnC,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,CAAC;AACrC,MAAM,CAAC,MAAM,aAAa,GAAG,GAAG,CAAC;AACjC,MAAM,CAAC,MAAM,aAAa,GAAG,OAAO,CAAC;AACrC,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,CAAC;AACrC,MAAM,CAAC,MAAM,sBAAsB,GAAG,IAAI,CAAC;AAC3C,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,CAAC;AACtC,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,MAAM,CAAC;AACvC,MAAM,CAAC,MAAM,eAAe,GAAG,SAAS,CAAC;AACzC,MAAM,CAAC,MAAM,QAAQ,GAAG,yBAAyB,CAAC;AAClD,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,CAAC;AAEjC,MAAM,CAAC,MAAM,eAAe,GAA2B;IACnD,GAAG,EAAE,aAAa;IAClB,GAAG,EAAE,cAAc;IACnB,GAAG,EAAE,WAAW;IAChB,GAAG,EAAE,oBAAoB;IACzB,GAAG,EAAE,mBAAmB;IACxB,GAAG,EAAE,uBAAuB;CAC/B,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;AAErC,MAAM,CAAC,MAAM,YAAY,GAAuB;IAC5C,CAAC,IAAI,EAAE,GAAG,CAAC;IACX,CAAC,GAAG,EAAE,IAAI,CAAC;IACX,CAAC,GAAG,EAAE,GAAG,CAAC;IACV,CAAC,GAAG,EAAE,IAAI,CAAC;IACX,CAAC,GAAG,EAAE,GAAG,CAAC;IACV,CAAC,EAAE,EAAE,IAAI,CAAC;IACV,CAAC,EAAE,EAAE,GAAG,CAAC;IACT,CAAC,EAAE,EAAE,IAAI,CAAC;IACV,CAAC,EAAE,EAAE,GAAG,CAAC;IACT,CAAC,CAAC,EAAE,IAAI,CAAC;IACT,CAAC,CAAC,EAAE,GAAG,CAAC;IACR,CAAC,CAAC,EAAE,IAAI,CAAC;IACT,CAAC,CAAC,EAAE,GAAG,CAAC;CACX,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import cors from 'cors';
|
|
2
|
+
import express from 'express';
|
|
3
|
+
import { dirname, join } from 'path';
|
|
4
|
+
import { fileURLToPath } from 'url';
|
|
5
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
6
|
+
const __dirname = dirname(__filename);
|
|
7
|
+
export function setupCors(app) {
|
|
8
|
+
app.set('trust proxy', 1);
|
|
9
|
+
app.use(cors({ methods: ['GET', 'POST', 'PATCH', 'DELETE', 'OPTIONS'] }));
|
|
10
|
+
app.use(express.urlencoded({ extended: true }));
|
|
11
|
+
app.use(express.json());
|
|
12
|
+
app.use('/favicon.ico', express.static(join(__dirname, '..', '..', 'src', 'favicon.ico')));
|
|
13
|
+
app.use('/robots.txt', express.static(join(__dirname, '..', '..', 'robots.txt')));
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=cors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cors.js","sourceRoot":"","sources":["../../src/middleware/cors.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,OAAyB,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtC,MAAM,UAAU,SAAS,CAAC,GAAY;IAClC,GAAG,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;IAC1B,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1E,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAChD,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAExB,GAAG,CAAC,GAAG,CAAC,cAAc,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC;IAC3F,GAAG,CAAC,GAAG,CAAC,aAAa,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC;AACtF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error.js","sourceRoot":"","sources":["../../src/middleware/error.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAE7C,MAAM,UAAU,YAAY,CAAC,GAAU,EAAE,IAAa,EAAE,GAAa,EAAE,KAAmB;IACtF,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACzB,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;AACjC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/middleware/json.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,sBAAsB,CAAC,IAAa,EAAE,GAAa,EAAE,IAAkB;IACnF,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;IAClD,GAAG,CAAC,YAAY,GAAG,CAAC,IAAa,EAAE,EAAE;QACjC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC5C,CAAC,CAAC;IACF,IAAI,EAAE,CAAC;AACX,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { createLogger } from '@20syldev/logger.ts';
|
|
2
|
+
import { MAX_LOG_ENTRIES } from '../constants.js';
|
|
3
|
+
export const logger = createLogger({
|
|
4
|
+
maxEntries: MAX_LOG_ENTRIES,
|
|
5
|
+
console: true,
|
|
6
|
+
theme: 'colored',
|
|
7
|
+
});
|
|
8
|
+
export function loggerMiddleware(req, res, next) {
|
|
9
|
+
if (req.method === 'HEAD') {
|
|
10
|
+
next();
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
if (req.originalUrl === '/logs') {
|
|
14
|
+
next();
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
const startTime = Date.now();
|
|
18
|
+
const platform = req.headers['sec-ch-ua-platform']?.replace(/"/g, '');
|
|
19
|
+
res.on('finish', () => {
|
|
20
|
+
const status = res.statusCode === 304 ? 200 : res.statusCode;
|
|
21
|
+
const duration = `${Date.now() - startTime}ms`;
|
|
22
|
+
logger.log({ method: req.method, url: req.originalUrl, status, duration, platform });
|
|
23
|
+
});
|
|
24
|
+
next();
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/middleware/logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAElD,MAAM,CAAC,MAAM,MAAM,GAAG,YAAY,CAAC;IAC/B,UAAU,EAAE,eAAe;IAC3B,OAAO,EAAE,IAAI;IACb,KAAK,EAAE,SAAS;CACnB,CAAC,CAAC;AAEH,MAAM,UAAU,gBAAgB,CAAC,GAAY,EAAE,GAAa,EAAE,IAAkB;IAC5E,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QACxB,IAAI,EAAE,CAAC;QACP,OAAO;IACX,CAAC;IACD,IAAI,GAAG,CAAC,WAAW,KAAK,OAAO,EAAE,CAAC;QAC9B,IAAI,EAAE,CAAC;QACP,OAAO;IACX,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,MAAM,QAAQ,GAAI,GAAG,CAAC,OAAO,CAAC,oBAAoB,CAAY,EAAE,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAElF,GAAG,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;QAClB,MAAM,MAAM,GAAG,GAAG,CAAC,UAAU,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC;QAC7D,MAAM,QAAQ,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,IAAI,CAAC;QAE/C,MAAM,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;IACzF,CAAC,CAAC,CAAC;IACH,IAAI,EAAE,CAAC;AACX,CAAC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { env } from '../config/env.js';
|
|
2
|
+
import { ipLimits } from '../storage/index.js';
|
|
3
|
+
import { SESSION_TTL } from '../constants.js';
|
|
4
|
+
import { error } from '../utils/response.js';
|
|
5
|
+
let requests = 0;
|
|
6
|
+
let resetTime = Date.now() + SESSION_TTL;
|
|
7
|
+
export function rateLimitMiddleware(req, res, next) {
|
|
8
|
+
const ip = req.headers['cf-connecting-ip'] || req.socket.remoteAddress || '';
|
|
9
|
+
const token = req.headers.authorization?.split(' ')[1] || '';
|
|
10
|
+
const now = Date.now();
|
|
11
|
+
const minute = String(Math.floor(now / 60000) % 60);
|
|
12
|
+
const hour = String(Math.floor(now / 3600000) % 24);
|
|
13
|
+
if ((token && ![...env.BUSINESS_TOKEN_LIST, ...env.PRO_TOKEN_LIST, ...env.ADVANCED_TOKEN_LIST].includes(token)) ||
|
|
14
|
+
token === 'undefined') {
|
|
15
|
+
error(res, 401, 'Invalid token.');
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
let requestLimit;
|
|
19
|
+
if (env.BUSINESS_TOKEN_LIST.includes(token) && !env.BUSINESS_TOKEN_LIST.includes('undefined')) {
|
|
20
|
+
requestLimit = env.BUSINESS_LIMIT;
|
|
21
|
+
}
|
|
22
|
+
else if (env.PRO_TOKEN_LIST.includes(token) && !env.PRO_TOKEN_LIST.includes('undefined')) {
|
|
23
|
+
requestLimit = env.PRO_LIMIT;
|
|
24
|
+
}
|
|
25
|
+
else if (env.ADVANCED_TOKEN_LIST.includes(token) && !env.ADVANCED_TOKEN_LIST.includes('undefined')) {
|
|
26
|
+
requestLimit = env.ADVANCED_LIMIT;
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
requestLimit = env.DEFAULT_LIMIT;
|
|
30
|
+
}
|
|
31
|
+
if (now > resetTime) {
|
|
32
|
+
requests = 0;
|
|
33
|
+
resetTime = now + SESSION_TTL;
|
|
34
|
+
}
|
|
35
|
+
if (++requests > Math.max(env.GLOBAL_LIMIT, requestLimit)) {
|
|
36
|
+
error(res, 429, 'Global rate limit exceeded.');
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
if (['__proto__', 'constructor', 'prototype'].includes(ip)) {
|
|
40
|
+
error(res, 400, 'Invalid IP address.');
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
if (!ipLimits[ip])
|
|
44
|
+
ipLimits[ip] = {};
|
|
45
|
+
if (!ipLimits[ip][hour])
|
|
46
|
+
ipLimits[ip][hour] = {};
|
|
47
|
+
ipLimits[ip][hour][minute] = (ipLimits[ip][hour][minute] ?? 0) + 1;
|
|
48
|
+
if (ipLimits[ip][hour][minute] > requestLimit) {
|
|
49
|
+
error(res, 429, `You have exceeded the limit of ${requestLimit} requests per hour.`);
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
Object.keys(ipLimits[ip]).forEach((h) => {
|
|
53
|
+
if (h != hour)
|
|
54
|
+
delete ipLimits[ip][h];
|
|
55
|
+
});
|
|
56
|
+
next();
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=ratelimit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ratelimit.js","sourceRoot":"","sources":["../../src/middleware/ratelimit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { versions } from '../config/versions.js';
|
|
2
|
+
import { error } from '../utils/response.js';
|
|
3
|
+
export function versionCheckMiddleware(req, res, next) {
|
|
4
|
+
const version = req.params.version;
|
|
5
|
+
const latest = Object.keys(versions).pop();
|
|
6
|
+
req.version = version;
|
|
7
|
+
req.latest = latest;
|
|
8
|
+
if (!versions[version]) {
|
|
9
|
+
error(res, 404, `Invalid API version (${version}).`, latest);
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
req.module = versions[version].modules;
|
|
13
|
+
if (!req.module) {
|
|
14
|
+
error(res, 404, `Module not found for version ${version}.`, latest);
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
next();
|
|
18
|
+
}
|
|
19
|
+
export function endpointCheckMiddleware(req, res, next) {
|
|
20
|
+
const version = req.params.version;
|
|
21
|
+
const endpoint = req.params.endpoint;
|
|
22
|
+
req.version = version;
|
|
23
|
+
req.endpoint = endpoint;
|
|
24
|
+
if (!endpoint) {
|
|
25
|
+
error(res, 404, `Endpoint '${endpoint}' does not exist in ${req.version}.`);
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
next();
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=version.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/middleware/version.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAE7C,MAAM,UAAU,sBAAsB,CAAC,GAAY,EAAE,GAAa,EAAE,IAAkB;IAClF,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,OAAiB,CAAC;IAC7C,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,EAAG,CAAC;IAE5C,GAAG,CAAC,OAAO,GAAG,OAAO,CAAC;IACtB,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC;IAEpB,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QACrB,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,wBAAwB,OAAO,IAAI,EAAE,MAAM,CAAC,CAAC;QAC7D,OAAO;IACX,CAAC;IAED,GAAG,CAAC,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAE,CAAC,OAAO,CAAC;IAExC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;QACd,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,gCAAgC,OAAO,GAAG,EAAE,MAAM,CAAC,CAAC;QACpE,OAAO;IACX,CAAC;IAED,IAAI,EAAE,CAAC;AACX,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,GAAY,EAAE,GAAa,EAAE,IAAkB;IACnF,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,OAAiB,CAAC;IAC7C,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,QAAkB,CAAC;IAE/C,GAAG,CAAC,OAAO,GAAG,OAAO,CAAC;IACtB,GAAG,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAExB,IAAI,CAAC,QAAQ,EAAE,CAAC;QACZ,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,aAAa,QAAQ,uBAAuB,GAAG,CAAC,OAAO,GAAG,CAAC,CAAC;QAC5E,OAAO;IACX,CAAC;IACD,IAAI,EAAE,CAAC;AACX,CAAC"}
|