diff --git a/config/cert.example.key b/config/cert.example.key new file mode 100644 index 0000000..246e59e --- /dev/null +++ b/config/cert.example.key @@ -0,0 +1,52 @@ +-----BEGIN PRIVATE KEY----- +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 +4MxVSbHK6i+Bkr05nxAvsYbvTy7Nlw== +-----END PRIVATE KEY----- diff --git a/config/cert.example.pem b/config/cert.example.pem new file mode 100644 index 0000000..129d21e --- /dev/null +++ b/config/cert.example.pem @@ -0,0 +1,34 @@ +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- diff --git a/src/index.js b/src/index.js index 8d75dea..eca5937 100644 --- a/src/index.js +++ b/src/index.js @@ -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) diff --git a/src/server/__tests__/server-test.js b/src/server/__tests__/server-test.js new file mode 100644 index 0000000..1e953f8 --- /dev/null +++ b/src/server/__tests__/server-test.js @@ -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)) + }) + }) + +}) diff --git a/src/server/app.js b/src/server/app.js index 010d900..7c64357 100644 --- a/src/server/app.js +++ b/src/server/app.js @@ -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 diff --git a/src/server/server.js b/src/server/server.js new file mode 100644 index 0000000..e7fe100 --- /dev/null +++ b/src/server/server.js @@ -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 }