index.js 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. 'use strict'
  2. import WebSocket from 'ws'
  3. import { wsLogger } from '../../config'
  4. import messageHandler from './messageHandler'
  5. /**
  6. * @typedef {object} LogObj
  7. * @property {Date} date current date
  8. * @property {object|string} log anything to log
  9. */
  10. /**
  11. * Format a string or object to a log object
  12. *
  13. * @param {object|string} data any message or object
  14. * @param {('info'|'message'|'error')} event the type of event
  15. * @returns {LogObj} the log object
  16. */
  17. export const formatLog = (data, event = 'info') => ({
  18. event,
  19. log: typeof data === 'object' ? JSON.stringify(data) : data,
  20. date: new Date()
  21. })
  22. /**
  23. * @typedef {function} ErrorLogger
  24. * @param {Error} err an Error object
  25. */
  26. /**
  27. * Handle thrown errors
  28. *
  29. * @param {object} ws a WebSocket connected client
  30. * @returns {ErrorLogger} the actual error logger
  31. */
  32. export const errorHandler = ws => err => {
  33. ws.send(err.message)
  34. wsLogger.error(formatLog({ error: err.message, stack: err.stack }, 'error'))
  35. }
  36. /**
  37. * Create the WebSocket server
  38. *
  39. * @param {*} httpServer an HTTP node object (provided by Express here)
  40. * @returns {void}
  41. */
  42. const createWsServer = httpServer => {
  43. const wss = new WebSocket.Server({ server: httpServer })
  44. wss.on('listening', () => wsLogger.info(formatLog('The WebSocket server was started')))
  45. wss.on('error', err => wsLogger.error(formatLog('WebSocket server error - ' + err.message, 'error')))
  46. wss.on('connection', ws => {
  47. wsLogger.info(formatLog('New client connected.'))
  48. ws.on('message', data => messageHandler(ws)(data).catch(err => errorHandler(ws)(err)))
  49. ws.on('error', err => errorHandler(ws)(err))
  50. ws.on('close', () => wsLogger.info(formatLog('Client disconnected.')))
  51. })
  52. }
  53. errorHandler()()
  54. export default createWsServer