-
Notifications
You must be signed in to change notification settings - Fork 42
Expand file tree
/
Copy pathserver.ts
More file actions
128 lines (106 loc) · 3.42 KB
/
Copy pathserver.ts
File metadata and controls
128 lines (106 loc) · 3.42 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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
import express from 'express';
import morgan from 'morgan';
import xmlbuilder from 'xmlbuilder';
import xmlparser from '@/middleware/xml-parser';
import { connect as connectCache } from '@/cache';
import { checkMarkedDeletions, connect as connectDatabase } from '@/database';
import { startGRPCServer } from '@/services/grpc/server';
import { fullUrl, getValueFromHeaders, setupScheduledTasks } from '@/util';
import { LOG_INFO, LOG_SUCCESS, LOG_WARN } from '@/logger';
import conntest from '@/services/conntest';
import cbvc from '@/services/cbvc';
import nnas from '@/services/nnas';
import nasc from '@/services/nasc';
import datastore from '@/services/datastore';
import api from '@/services/api';
import localcdn from '@/services/local-cdn';
import assets from '@/services/assets';
import { config, disabledFeatures } from '@/config-manager';
import { startProvisioner } from './provisioning';
process.title = 'Pretendo - Account';
process.on('uncaughtException', (err, origin) => {
console.log(err);
console.log(origin);
});
process.on('SIGTERM', () => {
process.exit(0);
});
const app = express();
// * START APPLICATION
app.set('view engine', 'ejs');
app.set('views', __dirname + '/views');
app.set('trust proxy', true); // TODO - Make this configurable
// * Create router
LOG_INFO('Setting up Middleware');
app.use(morgan('dev'));
app.use(express.json());
app.use(express.urlencoded({
extended: true
}));
app.use(xmlparser);
// * import the servers into one
app.use(conntest);
app.use(cbvc);
app.use(nnas);
app.use(nasc);
app.use(api);
app.use(localcdn);
app.use(assets);
if (!disabledFeatures.datastore) {
app.use(datastore);
}
// * 404 handler
LOG_INFO('Creating 404 status handler');
app.use((request: express.Request, response: express.Response): void => {
const url = fullUrl(request);
let deviceID = getValueFromHeaders(request.headers, 'X-Nintendo-Device-ID');
if (!deviceID) {
deviceID = 'Unknown';
}
LOG_WARN(`HTTP 404 at ${url} from ${deviceID}`);
response.set('Content-Type', 'text/xml');
response.set('Server', 'Nintendo 3DS (http)');
response.set('X-Nintendo-Date', new Date().getTime().toString());
response.status(404).send(xmlbuilder.create({
errors: {
error: {
cause: '',
code: '0008',
message: 'Not Found'
}
}
}).end());
});
// * non-404 error handler
LOG_INFO('Creating non-404 status handler');
app.use((error: any, request: express.Request, response: express.Response, _next: express.NextFunction): void => {
const status = error.status || 500;
const url = fullUrl(request);
let deviceID = getValueFromHeaders(request.headers, 'X-Nintendo-Device-ID');
if (!deviceID) {
deviceID = 'Unknown';
}
LOG_WARN(`HTTP ${status} at ${url} from ${deviceID}: ${error.message}`);
response.status(status).json({
app: 'api',
status,
error: error.message
});
});
async function main(): Promise<void> {
// * Starts the server
LOG_INFO('Starting server');
await connectDatabase();
LOG_SUCCESS('Database connected');
await connectCache();
LOG_SUCCESS('Cache enabled');
await startGRPCServer();
LOG_SUCCESS(`gRPC server started on port ${config.grpc.port}`);
startProvisioner();
await checkMarkedDeletions();
setupScheduledTasks();
app.listen(config.http.port, () => {
LOG_SUCCESS(`HTTP server started on port ${config.http.port}`);
});
}
main().catch(console.error);