mirror of
https://github.com/yu-i-i/overleaf-cep.git
synced 2026-11-12 21:23:45 +01:00
72 lines
2.1 KiB
JavaScript
72 lines
2.1 KiB
JavaScript
import Metrics from '@overleaf/metrics'
|
|
import logger from '@overleaf/logger'
|
|
import OError from '@overleaf/o-error'
|
|
import express from 'express'
|
|
import * as Errors from './Errors.js'
|
|
import * as Router from './Router.js'
|
|
import { handleValidationError } from '@overleaf/validation-tools'
|
|
|
|
const HistoryLogger = logger.initialize('project-history').logger
|
|
|
|
Metrics.event_loop.monitor(logger)
|
|
Metrics.memory.monitor(logger)
|
|
Metrics.leaked_sockets.monitor(logger)
|
|
Metrics.open_sockets.monitor()
|
|
|
|
// log updates as truncated strings
|
|
function truncateFn(updates) {
|
|
return JSON.parse(
|
|
JSON.stringify(updates, function (key, value) {
|
|
let len
|
|
if (typeof value === 'string' && (len = value.length) > 80) {
|
|
return (
|
|
value.substr(0, 32) +
|
|
`...(message of length ${len} truncated)...` +
|
|
value.substr(-32)
|
|
)
|
|
} else {
|
|
return value
|
|
}
|
|
})
|
|
)
|
|
}
|
|
|
|
HistoryLogger.addSerializers({
|
|
rawUpdate: truncateFn,
|
|
rawUpdates: truncateFn,
|
|
newUpdates: truncateFn,
|
|
lastUpdate: truncateFn,
|
|
})
|
|
|
|
export const app = express()
|
|
app.use(express.json())
|
|
app.use(express.urlencoded({ extended: true }))
|
|
app.use(Metrics.http.monitor(logger))
|
|
Router.initialize(app)
|
|
Metrics.injectMetricsRoute(app)
|
|
app.use(handleValidationError)
|
|
app.use(function (error, req, res, next) {
|
|
if (error instanceof Errors.NotFoundError) {
|
|
res.sendStatus(404)
|
|
} else if (error instanceof Errors.BadRequestError) {
|
|
res.sendStatus(400)
|
|
} else if (error instanceof Errors.InconsistentChunkError) {
|
|
res.sendStatus(422)
|
|
} else if (error instanceof Errors.SyncOngoingError) {
|
|
logger.error({ err: error, req }, error.message)
|
|
res.sendStatus(409)
|
|
} else if (error instanceof Errors.TooManyRequestsError) {
|
|
res.status(429).set('Retry-After', 300).end()
|
|
} else if (
|
|
error instanceof OError &&
|
|
error.message === 'Timeout' &&
|
|
error.info?.key
|
|
) {
|
|
logger.warn({ error, req }, error.message)
|
|
res.status(423).json({ message: 'redis lock is taken' })
|
|
} else {
|
|
logger.error({ err: error, req }, error.message)
|
|
res.status(500).json({ message: 'an internal error occurred' })
|
|
}
|
|
})
|