forked from cdnjs/api-server
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathapp.js
More file actions
110 lines (89 loc) 路 3.02 KB
/
Copy pathapp.js
File metadata and controls
110 lines (89 loc) 路 3.02 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
// Library imports
const express = require('express');
const compress = require('compression');
const Sentry = require('@sentry/node');
const morgan = require('morgan');
// Local imports
const cache = require('./utils/cache');
const cors = require('./utils/cors');
const updateLoad = require('./update/load');
const updateJob = require('./update/job');
// Middleware imports
const timingMiddleware = require('./middleware/timing');
const errorsMiddleware = require('./middleware/errors');
// Routes imports
const librariesRoutes = require('./routes/libraries');
const tutorialsRoutes = require('./routes/tutorials');
const libraryRoutes = require('./routes/library');
const whitelistRoutes = require('./routes/whitelist');
const statsRoutes = require('./routes/stats');
const updateRoutes = require('./routes/update');
const testingRoutes = require('./routes/testing');
// App constants
const port = Number(process.env.PORT || 5050);
const args = process.argv.slice(2);
const started = Date.now();
// Local mode state
let localMode = false;
if (process.env.LOCAL === 'true' || (args.length > 0 && (args[0] === '--local' || args[2] === '--local'))) {
console.log('local mode: on, gc() and updater disabled!');
localMode = true;
} else {
console.log('local mode: off');
}
// Garbage collection
if (!localMode && (typeof global.gc !== 'undefined')) {
global.gc();
}
// Start sentry
if (process.env.SENTRY_DSN) {
Sentry.init({ dsn: process.env.SENTRY_DSN });
console.log('sentry: enabled');
} else {
console.log('sentry: disabled');
}
module.exports = async () => {
// Basic app configuration
const app = express();
app.disable('x-powered-by');
// Setup timing middleware
app.use(timingMiddleware);
// Enable sentry
if (process.env.SENTRY_DSN) app.use(Sentry.Handlers.requestHandler());
// Request logging
app.use(morgan('combined'));
// Load the update data and set recurring job
updateLoad(app, localMode);
updateJob(app, localMode);
// Set up cors headers
cors(app);
// Always compress whatever we return
app.use(compress());
// Setup our routes
librariesRoutes(app);
tutorialsRoutes(app);
libraryRoutes(app);
whitelistRoutes(app);
statsRoutes(app);
updateRoutes(app);
if (localMode) testingRoutes(app);
// Redirect root the API docs
app.get('/', (req, res) => {
// Set a 355 day (same as CDN) life on this response
// This is also immutable
cache(res, 355 * 24 * 60 * 60, true);
// Redirect to the API docs
res.redirect(301, 'https://cdnjs.com/api');
});
// Catch-all errors
if (process.env.SENTRY_DSN) app.use(Sentry.Handlers.errorHandler());
// Handle 404s cleanly
app.use(errorsMiddleware.notFound);
// Handle error responses
app.use(errorsMiddleware.error);
// START!
app.listen(port, () => {
console.log('Listening on ' + (localMode ? 'http://0.0.0.0:' : '') + port
+ ' after ' + (Date.now() - started).toLocaleString() + 'ms');
});
};