Add ability to run a https server

This commit is contained in:
Jerko Steiner 2017-10-29 14:22:51 -04:00
parent 795d31f89f
commit b7314643cc
6 changed files with 149 additions and 5 deletions

52
config/cert.example.key Normal file
View File

@ -0,0 +1,52 @@
-----BEGIN PRIVATE KEY-----
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
4MxVSbHK6i+Bkr05nxAvsYbvTy7Nlw==
-----END PRIVATE KEY-----

34
config/cert.example.pem Normal file
View File

@ -0,0 +1,34 @@
-----BEGIN CERTIFICATE-----
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
-----END CERTIFICATE-----

View File

@ -7,5 +7,16 @@ if (!process.env.DEBUG) {
const app = require('./server/app.js')
const debug = require('debug')('peercalls')
let port = process.env.PORT || 3000
app.listen(port, () => debug('Listening on: %s', port))
const port = process.env.PORT || 3000
const server = app.listen(port, () => debug('Listening on: %s', port))
function close () {
debug('Closing server...')
server.close(() => {
debug('Bye!')
process.exit()
})
}
process.on('SIGINT', close)
process.on('SIGTERM', close)

View File

@ -0,0 +1,29 @@
const express = require('express')
const http = require('http')
const https = require('https')
const { createServer } = require('../server.js')
describe('server', () => {
let app, config
beforeEach(() => {
config = {}
app = express()
})
describe('createServer', () => {
it('creates https server when config.ssl', () => {
config.ssl = {
cert: 'config/cert.example.pem',
key: 'config/cert.example.key'
}
const s = createServer(config, app)
expect(s).toEqual(jasmine.any(https.Server))
})
it('creates http server when no ssl config', () => {
const s = createServer(config, app)
expect(s).toEqual(jasmine.any(http.Server))
})
})
})

View File

@ -5,6 +5,7 @@ const debug = require('debug')('peercalls')
const express = require('express')
const handleSocket = require('./socket.js')
const path = require('path')
const { createServer } = require('./server.js')
const BASE_URL = config.get('baseUrl')
const SOCKET_URL = `${BASE_URL}/ws`
@ -12,8 +13,8 @@ const SOCKET_URL = `${BASE_URL}/ws`
debug(`WebSocket URL: ${SOCKET_URL}`)
const app = express()
const http = require('http').Server(app)
const io = require('socket.io')(http, { path: SOCKET_URL })
const server = createServer(config, app)
const io = require('socket.io')(server, { path: SOCKET_URL })
app.locals.version = require('../../package.json').version
app.locals.baseUrl = BASE_URL
@ -30,4 +31,4 @@ app.use(BASE_URL, router)
io.on('connection', socket => handleSocket(socket, io))
module.exports = http
module.exports = server

17
src/server/server.js Normal file
View File

@ -0,0 +1,17 @@
const fs = require('fs')
const path = require('path')
const projectRoot = path.resolve(path.join(__dirname, '../..'))
const readFile = file => fs.readFileSync(path.resolve(projectRoot, file))
function createServer (config, app) {
if (config.ssl) {
const key = readFile(config.ssl.key)
const cert = readFile(config.ssl.cert)
return require('https').createServer({ key, cert }, app)
}
return require('http').createServer(app)
}
module.exports = { createServer }