|
|
@ -10,10 +10,10 @@ import proxy from 'express-http-proxy'
|
|
|
|
import bodyParser from 'body-parser'
|
|
|
|
import bodyParser from 'body-parser'
|
|
|
|
import cookieParser from 'cookie-parser'
|
|
|
|
import cookieParser from 'cookie-parser'
|
|
|
|
import session from 'express-session'
|
|
|
|
import session from 'express-session'
|
|
|
|
import redis from 'redis'
|
|
|
|
|
|
|
|
import connectRedis from 'connect-redis'
|
|
|
|
import connectRedis from 'connect-redis'
|
|
|
|
|
|
|
|
|
|
|
|
import connectSocketIO from 'socket.io'
|
|
|
|
import { Server as SocketIO } from 'socket.io'
|
|
|
|
|
|
|
|
import { createAdapter } from 'socket.io-redis'
|
|
|
|
import passportSocketIo from 'passport.socketio'
|
|
|
|
import passportSocketIo from 'passport.socketio'
|
|
|
|
|
|
|
|
|
|
|
|
import morgan from 'morgan'
|
|
|
|
import morgan from 'morgan'
|
|
|
@ -23,23 +23,11 @@ import logger, { morganStream } from './logger'
|
|
|
|
import passport from 'passport'
|
|
|
|
import passport from 'passport'
|
|
|
|
import mongoose from 'mongoose'
|
|
|
|
import mongoose from 'mongoose'
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import redisClient, { asyncHEXISTS, asyncHGET, asyncHSET, asyncHDEL } from './redis'
|
|
|
|
|
|
|
|
|
|
|
|
import { authRouter, initPassport } from './auth/passport'
|
|
|
|
import { authRouter, initPassport } from './auth/passport'
|
|
|
|
|
|
|
|
|
|
|
|
const RedisStore = connectRedis(session)
|
|
|
|
const RedisStore = connectRedis(session)
|
|
|
|
const redisClient = redis.createClient({
|
|
|
|
|
|
|
|
host: '127.0.0.1',
|
|
|
|
|
|
|
|
port: 6379,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
password: process.env.REDIS_PASSWORD,
|
|
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
redisClient.on('error', (error) => {
|
|
|
|
|
|
|
|
console.error(error)
|
|
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
redisClient.on('connect', () => {
|
|
|
|
|
|
|
|
console.log('Connection to Redis has been established successfully.')
|
|
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
mongoose.connect(
|
|
|
|
mongoose.connect(
|
|
|
|
'mongodb://localhost:27017',
|
|
|
|
'mongodb://localhost:27017',
|
|
|
@ -52,15 +40,23 @@ mongoose.connect(
|
|
|
|
dbName: 'museum',
|
|
|
|
dbName: 'museum',
|
|
|
|
},
|
|
|
|
},
|
|
|
|
() => {
|
|
|
|
() => {
|
|
|
|
console.log('Connection to MongoDB has been established successfully.')
|
|
|
|
logger.info('Connection to MongoDB has been established successfully.')
|
|
|
|
},
|
|
|
|
},
|
|
|
|
)
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
const app = express()
|
|
|
|
const app = express()
|
|
|
|
app.set('trust proxy', 1)
|
|
|
|
app.set('trust proxy', 1)
|
|
|
|
const server = http.createServer(app)
|
|
|
|
const server = http.createServer(app)
|
|
|
|
// @ts-ignore
|
|
|
|
const io = new SocketIO(server, { serveClient: false })
|
|
|
|
const io = connectSocketIO(server)
|
|
|
|
|
|
|
|
|
|
|
|
const pubClient = redisClient
|
|
|
|
|
|
|
|
const subClient = pubClient.duplicate()
|
|
|
|
|
|
|
|
io.adapter(
|
|
|
|
|
|
|
|
createAdapter({
|
|
|
|
|
|
|
|
pubClient,
|
|
|
|
|
|
|
|
subClient,
|
|
|
|
|
|
|
|
}),
|
|
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
app.use(bodyParser.json())
|
|
|
|
app.use(bodyParser.json())
|
|
|
|
app.use(bodyParser.urlencoded({ extended: false }))
|
|
|
|
app.use(bodyParser.urlencoded({ extended: false }))
|
|
|
@ -81,17 +77,31 @@ app.use('/auth', authRouter)
|
|
|
|
|
|
|
|
|
|
|
|
app.use(morgan('short', { stream: morganStream }))
|
|
|
|
app.use(morgan('short', { stream: morganStream }))
|
|
|
|
|
|
|
|
|
|
|
|
function onAuthorizeSuccess(data, accept) {
|
|
|
|
async function onAuthorizeSuccess(data, accept) {
|
|
|
|
// console.log(data.user)
|
|
|
|
if (data.user._id) {
|
|
|
|
|
|
|
|
const userExists = await asyncHEXISTS('socket', String(data.user._id))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (userExists === 1) {
|
|
|
|
|
|
|
|
logger.debug(
|
|
|
|
|
|
|
|
`${data.user._id} (${data.user.email}) is already logged in. Kicking...`,
|
|
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
const socketId = await asyncHGET('socket', String(data.user._id))
|
|
|
|
|
|
|
|
const socket = io.of('/').sockets.get(socketId)
|
|
|
|
|
|
|
|
if (socket) {
|
|
|
|
|
|
|
|
logger.debug(`Disconnecting ${socketId}`)
|
|
|
|
|
|
|
|
socket.disconnect()
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
logger.debug(
|
|
|
|
logger.debug(
|
|
|
|
`Successful connection to socket.io from ${data.user._id} (${data.user.email})`,
|
|
|
|
`Successful connection to socket.io from ${data.user._id} (${data.user.email})`,
|
|
|
|
)
|
|
|
|
)
|
|
|
|
accept(null, true)
|
|
|
|
accept(null, true)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
function onAuthorizeFail(_, message, error, accept) {
|
|
|
|
function onAuthorizeFail(_, message, error, accept) {
|
|
|
|
if (error) throw new Error(message)
|
|
|
|
if (error) throw new Error(message)
|
|
|
|
logger.debug('failed connection to socket.io:', message)
|
|
|
|
logger.debug('Failed to connect to socket.io:', message)
|
|
|
|
accept(null, false)
|
|
|
|
accept(null, false)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -106,11 +116,16 @@ io.use(
|
|
|
|
}),
|
|
|
|
}),
|
|
|
|
)
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
io.on('connection', (socket) => {
|
|
|
|
io.on('connection', async (socket) => {
|
|
|
|
logger.debug('a user connected')
|
|
|
|
await asyncHSET('socket', String(socket.request.user._id), String(socket.id))
|
|
|
|
//console.log(socket.request.user)
|
|
|
|
logger.debug(`Assigned ${socket.id} to ${socket.request.user._id}`)
|
|
|
|
socket.on('disconnect', () => {
|
|
|
|
|
|
|
|
logger.debug('a user connected')
|
|
|
|
socket.on('kick', () => {
|
|
|
|
|
|
|
|
console.log('kicking')
|
|
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
socket.on('disconnect', async () => {
|
|
|
|
|
|
|
|
logger.debug(`User with id ${socket.id} disconnected`)
|
|
|
|
|
|
|
|
await asyncHDEL('socket', String(socket.request.user._id), String(socket.id))
|
|
|
|
})
|
|
|
|
})
|
|
|
|
})
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
@ -121,5 +136,5 @@ if (process.env.NODE_ENV !== 'PRODUCTION') {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
server.listen(3000, () => {
|
|
|
|
server.listen(3000, () => {
|
|
|
|
console.log('> Ready on http://localhost:3000')
|
|
|
|
logger.info('Server ready on http://localhost:3000')
|
|
|
|
})
|
|
|
|
})
|
|
|
|