summary refs log tree commit diff
path: root/src/bundle/Server.ts
blob: dbd57abfc17ae721a7575eb2f92976d08b8eed72 (plain) (blame)
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
129
130
131
132
133
134
135
136
137
138
139
process.on("unhandledRejection", console.error);
process.on("uncaughtException", console.error);

import http from "http";
import * as Api from "@fosscord/api";
import * as Gateway from "@fosscord/gateway";
import { CDNServer } from "@fosscord/cdn";
import express from "express";
import { green, bold, yellow } from "picocolors";
import { Config, initDatabase, BannedWords } from "@fosscord/util";
import * as Sentry from "@sentry/node";
import * as Tracing from "@sentry/tracing";
import * as Integrations from "@sentry/integrations";

const app = express();
const server = http.createServer();
const port = Number(process.env.PORT) || 3001;
const production = process.env.NODE_ENV == "development" ? false : true;
server.on("request", app);

const api = new Api.FosscordServer({ server, port, production, app });
const cdn = new CDNServer({ server, port, production, app });
const gateway = new Gateway.Server({ server, port, production });

process.on("SIGTERM", async () => {
	console.log("Shutting down due to SIGTERM");
	server.close();
});

async function main() {
	await initDatabase();
	await Config.init();
	await BannedWords.init();
	// // only set endpointPublic, if not already set
	// await Config.set({
	// 	cdn: {
	// 		endpointClient: "${location.host}",
	// 		endpointPrivate: `http://localhost:${port}`,
	// 	},
	// 	gateway: {
	// 		endpointClient:
	// 			'${location.protocol === "https:" ? "wss://" : "ws://"}${location.host}',
	// 		endpointPrivate: `ws://localhost:${port}`,
	// 		...(!Config.get().gateway.endpointPublic && {
	// 			endpointPublic: `ws://localhost:${port}`,
	// 		}),
	// 	},
	// 	regions: {
	// 		default: "fosscord",
	// 		useDefaultAsOptimal: true,
	// 		available: [
	// 			{
	// 				id: "fosscord",
	// 				name: "Fosscord",
	// 				endpoint: "slowcord.maddy.k.vu:3004",
	// 				vip: false,
	// 				custom: false,
	// 				deprecated: false,
	// 			},
	// 		],
	// 	},
	// } as any);

	//Sentry
	if (Config.get().sentry.enabled) {
		console.log(
			`[Bundle] ${yellow(
				"You are using Sentry! This may slightly impact performance on large loads!",
			)}`,
		);
		Sentry.init({
			dsn: Config.get().sentry.endpoint,
			integrations: [
				new Sentry.Integrations.Http({ tracing: true }),
				new Tracing.Integrations.Express({ app }),
				new Tracing.Integrations.Mysql(),
				new Integrations.RewriteFrames({
					root: __dirname,
				}),
			],
			tracesSampleRate: Config.get().sentry.traceSampleRate,
			environment: Config.get().sentry.environment,
		});

		Sentry.addGlobalEventProcessor((event, hint) => {
			if (event.transaction) {
				event.transaction = event.transaction
					.split("/")
					.map((x) => (!parseInt(x) ? x : ":id"))
					.join("/");
			}

			delete event.request?.cookies;
			if (event.request?.headers) {
				delete event.request.headers["X-Real-Ip"];
				delete event.request.headers["X-Forwarded-For"];
				delete event.request.headers["X-Forwarded-Host"];
				delete event.request.headers["X-Super-Properties"];
			}

			if (event.breadcrumbs) {
				event.breadcrumbs = event.breadcrumbs.filter((x) => {
					if (x.message?.includes("identified as")) return false;
					if (x.message?.includes("[WebSocket] closed")) return false;
					if (
						x.message?.includes(
							"Got Resume -> cancel not implemented",
						)
					)
						return false;
					if (x.message?.includes("[Gateway] New connection from"))
						return false;

					return true;
				});
			}

			return event;
		});

		app.use(Sentry.Handlers.requestHandler());
		app.use(Sentry.Handlers.tracingHandler());
	}

	server.listen(port);
	await Promise.all([api.start(), cdn.start(), gateway.start()]);

	if (Config.get().sentry.enabled) {
		app.use(Sentry.Handlers.errorHandler());
		app.use(function onError(err: any, req: any, res: any, next: any) {
			res.statusCode = 500;
			res.end(res.sentry + "\n");
		});
	}

	console.log(`[Server] ${green(`listening on port ${bold(port)}`)}`);
}

main().catch(console.error);