Fix socket.io websocket connection

pull/1458/head
Chocobozzz 2019-01-08 15:51:52 +01:00 committed by Chocobozzz
parent 43483d1296
commit 89ada4e26c
7 changed files with 34 additions and 14 deletions

View File

@ -6,6 +6,7 @@ import * as proxyAddr from 'proxy-addr'
import { Server as WebSocketServer } from 'ws' import { Server as WebSocketServer } from 'ws'
import { CONFIG, TRACKER_RATE_LIMITS } from '../initializers/constants' import { CONFIG, TRACKER_RATE_LIMITS } from '../initializers/constants'
import { VideoFileModel } from '../models/video/video-file' import { VideoFileModel } from '../models/video/video-file'
import { parse } from 'url'
const TrackerServer = bitTorrentTracker.Server const TrackerServer = bitTorrentTracker.Server
@ -61,14 +62,24 @@ trackerRouter.get('/tracker/scrape', (req, res) => onHttpRequest(req, res, { act
function createWebsocketTrackerServer (app: express.Application) { function createWebsocketTrackerServer (app: express.Application) {
const server = http.createServer(app) const server = http.createServer(app)
const wss = new WebSocketServer({ server: server, path: '/tracker/socket' }) const wss = new WebSocketServer({ noServer: true })
wss.on('connection', function (ws, req) { wss.on('connection', function (ws, req) {
const ip = proxyAddr(req, CONFIG.TRUST_PROXY) ws['ip'] = proxyAddr(req, CONFIG.TRUST_PROXY)
ws['ip'] = ip
trackerServer.onWebSocketConnection(ws) trackerServer.onWebSocketConnection(ws)
}) })
server.on('upgrade', (request, socket, head) => {
const pathname = parse(request.url).pathname
if (pathname === '/tracker/socket') {
wss.handleUpgrade(request, socket, head, ws => wss.emit('connection', ws, request))
}
// Don't destroy socket, we have Socket.IO too
})
return server return server
} }

View File

@ -22,7 +22,7 @@ describe('Test AP refresher', function () {
let videoUUID3: string let videoUUID3: string
before(async function () { before(async function () {
this.timeout(30000) this.timeout(60000)
servers = await flushAndRunMultipleServers(2) servers = await flushAndRunMultipleServers(2)

View File

@ -251,6 +251,7 @@ describe('Test emails', function () {
}) })
after(async function () { after(async function () {
MockSmtpServer.Instance.kill()
killallServers([ server ]) killallServers([ server ])
}) })
}) })

View File

@ -1,6 +1,6 @@
import './users-verification'
import './user-notifications'
import './blocklist' import './blocklist'
import './user-subscriptions' import './user-subscriptions'
import './user-notifications'
import './users' import './users'
import './users-multiple-servers' import './users-multiple-servers'
import './users-verification'

View File

@ -175,7 +175,7 @@ describe('Test users notifications', function () {
}) })
it('Should send a new video notification if the user follows the local video publisher', async function () { it('Should send a new video notification if the user follows the local video publisher', async function () {
this.timeout(10000) this.timeout(15000)
await addUserSubscription(servers[0].url, userAccessToken, 'root_channel@localhost:9001') await addUserSubscription(servers[0].url, userAccessToken, 'root_channel@localhost:9001')
await waitJobs(servers) await waitJobs(servers)
@ -1010,6 +1010,8 @@ describe('Test users notifications', function () {
}) })
after(async function () { after(async function () {
MockSmtpServer.Instance.kill()
killallServers(servers) killallServers(servers)
}) })
}) })

View File

@ -4,7 +4,7 @@ import * as chai from 'chai'
import 'mocha' import 'mocha'
import { import {
registerUser, flushTests, getUserInformation, getMyUserInformation, killallServers, registerUser, flushTests, getUserInformation, getMyUserInformation, killallServers,
userLogin, login, runServer, ServerInfo, verifyEmail, updateCustomSubConfig userLogin, login, runServer, ServerInfo, verifyEmail, updateCustomSubConfig, wait
} from '../../../../shared/utils' } from '../../../../shared/utils'
import { setAccessTokensToServers } from '../../../../shared/utils/users/login' import { setAccessTokensToServers } from '../../../../shared/utils/users/login'
import { MockSmtpServer } from '../../../../shared/utils/miscs/email' import { MockSmtpServer } from '../../../../shared/utils/miscs/email'
@ -123,6 +123,7 @@ describe('Test users account verification', function () {
}) })
after(async function () { after(async function () {
MockSmtpServer.Instance.kill()
killallServers([ server ]) killallServers([ server ])
// Keep the logs if the test failed // Keep the logs if the test failed

View File

@ -1,22 +1,20 @@
import * as child from 'child_process' import { fork, ChildProcess } from 'child_process'
class MockSmtpServer { class MockSmtpServer {
private static instance: MockSmtpServer private static instance: MockSmtpServer
private started = false private started = false
private emailChildProcess: child.ChildProcess private emailChildProcess: ChildProcess
private emails: object[] private emails: object[]
private constructor () { private constructor () {
this.emailChildProcess = child.fork(`${__dirname}/email-child-process`, [], { silent: true }) this.emailChildProcess = fork(`${__dirname}/email-child-process`, [])
this.emailChildProcess.on('message', (msg) => { this.emailChildProcess.on('message', (msg) => {
if (msg.email) { if (msg.email) {
return this.emails.push(msg.email) return this.emails.push(msg.email)
} }
}) })
process.on('exit', () => {
this.emailChildProcess.kill()
})
} }
collectEmails (emailsCollection: object[]) { collectEmails (emailsCollection: object[]) {
@ -43,6 +41,13 @@ class MockSmtpServer {
}) })
} }
kill () {
process.kill(this.emailChildProcess.pid)
this.emailChildProcess = null
MockSmtpServer.instance = null
}
static get Instance () { static get Instance () {
return this.instance || (this.instance = new this()) return this.instance || (this.instance = new this())
} }