serializers.js 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. const OError = require('@overleaf/o-error')
  2. function errSerializer(err) {
  3. if (!err) {
  4. return err
  5. }
  6. let message = err.message
  7. if (err.path) {
  8. // filter paths from the message to avoid duplicate errors with different path in message
  9. // (e.g. errors from `fs` methods which have a path attribute)
  10. message = message.replace(` '${err.path}'`, '')
  11. }
  12. return {
  13. message,
  14. name: err.name,
  15. stack: OError.getFullStack(err),
  16. info: OError.getFullInfo(err),
  17. code: err.code,
  18. signal: err.signal,
  19. path: err.path,
  20. }
  21. }
  22. function reqSerializer(req) {
  23. if (!req) {
  24. return req
  25. }
  26. const headers = req.headers || {}
  27. const entry = {
  28. method: req.method,
  29. url: req.originalUrl || req.url,
  30. remoteAddress: getRemoteIp(req),
  31. headers: {
  32. referer: headers.referer || headers.referrer,
  33. 'user-agent': headers['user-agent'],
  34. 'content-length': headers['content-length'],
  35. },
  36. }
  37. if (req.params) {
  38. const projectId =
  39. req.params.projectId || req.params.project_id || req.params.Project_id
  40. const userId = req.params.userId || req.params.user_id
  41. const docId = req.params.docId || req.params.doc_id
  42. if (projectId) {
  43. entry.projectId = projectId
  44. }
  45. if (userId) {
  46. entry.userId = userId
  47. }
  48. if (docId) {
  49. entry.docId = docId
  50. }
  51. }
  52. return entry
  53. }
  54. function resSerializer(res) {
  55. if (!res) {
  56. return res
  57. }
  58. return {
  59. statusCode: res.statusCode,
  60. headers: {
  61. 'content-length': res.getHeader && res.getHeader('content-length'),
  62. },
  63. }
  64. }
  65. function getRemoteIp(req) {
  66. if (req.ip) {
  67. return req.ip
  68. }
  69. if (req.socket) {
  70. if (req.socket.socket && req.socket.socket.remoteAddress) {
  71. return req.socket.socket.remoteAddress
  72. } else if (req.socket.remoteAddress) {
  73. return req.socket.remoteAddress
  74. }
  75. }
  76. return null
  77. }
  78. module.exports = {
  79. err: errSerializer,
  80. error: errSerializer,
  81. req: reqSerializer,
  82. res: resSerializer,
  83. }