-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.ts
142 lines (115 loc) · 4.15 KB
/
index.ts
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
140
141
import express from 'express'
import bodyParser from 'body-parser'
import swaggerUi from 'swagger-ui-express'
import router from './routes/index';
let swaggerDocument = require('./swagger');
let mongoose = require('mongoose');
require('./models/user');
require('./models/base');
require('./models/post');
const port: number = 3000;
const app: express.Application = express();
const server = app.listen(port, eventListener);
const io = require('socket.io').listen(server);
let MONGO_URI : string = '';
let env = process.argv[2];
if(env == 'local') {
console.log("Despliegue local");
MONGO_URI = 'mongodb://localhost:27017/erasmus';
}
else {
console.log("Despliegue en producción");
MONGO_URI = 'mongodb://root:root@mongo:27017/erasmus?authSource=admin';
}
app.use((req, res, next) => {
res.header("Access-Control-Allow-Origin", "*");
res.header(
"Access-Control-Allow-Headers",
"Origin, X-Requested-With, Content-Type, Accept, Authorization"
);
res.header("Access-Control-Allow-Credentials", "true");
if (req.method === 'OPTIONS') {
res.header("Access-Control-Allow-Methods", 'PUT, POST, PATCH, DELETE, GET')
}
next()
});
app.use( express.json({limit: '50mb'}) );
app.use( '', router );
app.use('/api-docs', swaggerUi.serve, swaggerUi.setup(swaggerDocument));
mongoose.connect(MONGO_URI, {
useNewUrlParser: true,
reconnectTries : Number.MAX_VALUE,
autoReconnect : true,
useUnifiedTopology: true,
reconnectInterval: 500
}).then(() => {
console.log('Connected to DB');
}).catch(error => {
console.error('Connection to DB Failed');
console.error(error.message);
process.exit(-1);
});
mongoose.connection.on('reconnected', () => {
console.log('Database reconnected');
});
mongoose.connection.on('error', (err: any) => {
console.log(`Database error: ${err.message}`);
});
mongoose.connection.on('disconnected', () => {
console.log('Database disconnected');
});
mongoose.set('useNewUrlParser', true);
mongoose.set('useFindAndModify', false);
mongoose.set('useCreateIndex', true);
mongoose.set('useUnifiedTopology', true);
function eventListener() {
if(env == 'local') {
console.log('Listening on http://localhost:' + port);
}
else {
console.log('Listening on http://147.83.7.156:' + port);
}
}
/* Socket IO */
//Let us define a hashMap being the key the username and the values its socketId
let userList: Map<string, string> = new Map();
//Event listener when a socket is connected
io.on('connection', onConnection);
function onConnection(socket) {
console.log('a user connected');
//Once connected, the socket is attached with a query param email
let email: string = socket.handshake.query.email;
//We store it in the hashMap with the corresponding socketId
userList.set(email, socket.id);
console.log(userList);
io.emit('userList', Array.from(userList));
//Private message user-to-user if both are online, otherwise store it
socket.on('message', function (data) {
console.log(data.message + " by " + email + " to " + data.destination);
let message = data.message;
if (userList.get(data.destination)) {
io.to(<string>userList.get(data.destination)).emit('message', {message, email});
} else if (data.destination === 'everyone') {
socket.broadcast.emit('message', {message, email, everyone: true});
}
});
socket.on('postnoti', function (postId) {
console.log('postnoti from ' + email + ' data: ' + postId);
socket.broadcast.emit('postnoti', {postId, author: email});
});
socket.on('giveMeUserList', function () {
socket.emit('userList', Array.from(userList));
});
socket.on('ACK', function (sender) {
console.log(email + 'confirms read messages from ' + sender);
if (userList.get(sender)) {
io.to(<string>userList.get(sender)).emit('ACK', email);
}
});
//On a disconnection, delete its socketId from the hashMap
socket.on('disconnect', function() {
console.log(email + ' disconnected');
userList.delete(email);
io.emit('userList', Array.from(userList));
});
}