diff --git a/lib/app.ts b/lib/app.ts index 0eb2c999d..38ad7c64e 100644 --- a/lib/app.ts +++ b/lib/app.ts @@ -1,46 +1,39 @@ -'use strict' +import { Revision, sequelize } from './models' +import { config } from './config' +import { logger } from './logger' -import { Revision } from "./models" -import { sequelize } from './models' +const express = require('express') -// app -// external modules -const express = require('express'); +const ejs = require('ejs') +const passport = require('passport') +const methodOverride = require('method-override') +const cookieParser = require('cookie-parser') +const compression = require('compression') +const session = require('express-session') +const SequelizeStore = require('connect-session-sequelize')(session.Store) +const fs = require('fs') +const path = require('path') -const ejs = require('ejs'); -const passport = require('passport'); -const methodOverride = require('method-override'); -const cookieParser = require('cookie-parser'); -const compression = require('compression'); -const session = require('express-session'); -const SequelizeStore = require('connect-session-sequelize')(session.Store); -const fs = require('fs'); -const path = require('path'); - -const morgan = require('morgan'); -const passportSocketIo = require('passport.socketio'); -const helmet = require('helmet'); -const i18n = require('i18n'); -const flash = require('connect-flash'); - -// core -const config = require('./config'); -const logger = require('./logger'); -const errors = require('./errors'); -const csp = require('./csp'); +const morgan = require('morgan') +const passportSocketIo = require('passport.socketio') +const helmet = require('helmet') +const i18n = require('i18n') +const flash = require('connect-flash') +const errors = require('./errors') +const csp = require('./csp') // server setup -const app = express(); -let server: any = null; +const app = express() +let server: any = null if (config.useSSL) { const ca = (function () { - let i, len, results; + let i, len, results results = [] for (i = 0, len = config.sslCAPath.length; i < len; i++) { results.push(fs.readFileSync(config.sslCAPath[i], 'utf8')) } return results - })(); + })() const options = { key: fs.readFileSync(config.sslKeyPath, 'utf8'), cert: fs.readFileSync(config.sslCertPath, 'utf8'), @@ -48,7 +41,7 @@ if (config.useSSL) { dhparam: fs.readFileSync(config.dhParamPath, 'utf8'), requestCert: false, rejectUnauthorized: false - }; + } server = require('https').createServer(options, app) } else { server = require('http').createServer(app) @@ -64,14 +57,14 @@ app.use(morgan('combined', { })) // socket io -const io = require('socket.io')(server); +const io = require('socket.io')(server) io.engine.ws = new (require('ws').Server)({ noServer: true, perMessageDeflate: false }) // others -const realtime = require('./realtime'); +const realtime = require('./realtime') // assign socket io to realtime realtime.io = io @@ -82,7 +75,7 @@ app.use(methodOverride('_method')) // session store const sessionStore = new SequelizeStore({ db: sequelize -}); +}) // compression app.use(compression()) @@ -152,7 +145,7 @@ app.use(session({ })) // session resumption -const tlsSessionStore = {}; +const tlsSessionStore = {} server.on('newSession', function (id, data, cb) { tlsSessionStore[id.toString('hex')] = data cb() @@ -243,12 +236,12 @@ io.sockets.on('connection', realtime.connection) // listen function startListen () { - let address; + let address const listenCallback = function () { - const schema = config.useSSL ? 'HTTPS' : 'HTTP'; + const schema = config.useSSL ? 'HTTPS' : 'HTTP' logger.info('%s Server listening at %s', schema, address) realtime.maintenance = false - }; + } // use unix domain socket if 'path' is specified if (config.path) { @@ -287,7 +280,7 @@ function handleTermSignals () { realtime.maintenance = true // disconnect all socket.io clients Object.keys(io.sockets.sockets).forEach(function (key) { - const socket = io.sockets.sockets[key]; + const socket = io.sockets.sockets[key] // notify client server going into maintenance status socket.emit('maintenance') setTimeout(function () { @@ -307,7 +300,7 @@ function handleTermSignals () { } }) } - }, 100); + }, 100) } process.on('SIGINT', handleTermSignals) process.on('SIGTERM', handleTermSignals) diff --git a/lib/csp.js b/lib/csp.js index fe8bea012..b778e7c32 100644 --- a/lib/csp.js +++ b/lib/csp.js @@ -1,4 +1,5 @@ -var config = require('./config') +import { config } from './config' + var uuid = require('uuid') var CspStrategy = {} diff --git a/lib/letter-avatars.ts b/lib/letter-avatars.ts index f5c27a9d5..2f9a27118 100644 --- a/lib/letter-avatars.ts +++ b/lib/letter-avatars.ts @@ -1,7 +1,7 @@ 'use strict' import { createHash } from 'crypto' import randomColor from 'randomcolor' -import config from './config' +import { config } from './config' // core export function generateAvatar (name: string): string { diff --git a/lib/models/index.ts b/lib/models/index.ts index c5eb80237..696547bf9 100644 --- a/lib/models/index.ts +++ b/lib/models/index.ts @@ -1,22 +1,20 @@ -import {Sequelize} from 'sequelize-typescript'; -import {Author} from './author'; -import {Note} from './note'; -import {Revision} from './revision'; -import {Temp} from './temp'; -import {User} from './user'; +import { Sequelize } from 'sequelize-typescript' +import { Author } from './author' +import { Note } from './note' +import { Revision } from './revision' +import { Temp } from './temp' +import { User } from './user' -const {cloneDeep} = require('lodash') +import { logger } from '../logger' +import { config } from '../config' -// core -var config = require('../config') -var logger = require('../logger') - -var dbconfig = cloneDeep(config.db) +const { cloneDeep } = require('lodash') +const dbconfig = cloneDeep(config.db) dbconfig.logging = config.debug ? (data) => { logger.info(data) } : false -export let sequelize: any; +export let sequelize: any // Heroku specific if (config.dbURL) { @@ -25,8 +23,6 @@ if (config.dbURL) { sequelize = new Sequelize(dbconfig.database, dbconfig.username, dbconfig.password, dbconfig) } -sequelize.addModels([Author, Note, Revision, Temp, User]); - - -export {Author, Note, Revision, Temp, User}; +sequelize.addModels([Author, Note, Revision, Temp, User]) +export { Author, Note, Revision, Temp, User } diff --git a/lib/models/note.ts b/lib/models/note.ts index 89fc2703f..a4f94076c 100644 --- a/lib/models/note.ts +++ b/lib/models/note.ts @@ -30,8 +30,8 @@ import moment from 'moment' // eslint-disable-next-line @typescript-eslint/camelcase import { diff_match_patch, patch_obj } from 'diff-match-patch' import S from 'string' -import config from '../config' -import logger from '../logger' +import { config } from '../config' +import { logger } from '../logger' import ot from '../ot' const md = markdownIt() diff --git a/lib/models/revision.ts b/lib/models/revision.ts index 76de7e0ff..e933bbaf8 100644 --- a/lib/models/revision.ts +++ b/lib/models/revision.ts @@ -4,13 +4,13 @@ import { Note } from './note' import { Utils } from '../utils' import Sequelize from 'sequelize' +// core +import { logger } from '../logger' import async = require('async'); import moment = require('moment'); import childProcess = require('child_process'); import shortId = require('shortid'); import path = require('path'); -// core -import logger = require('../logger'); const Op = Sequelize.Op diff --git a/lib/models/user.ts b/lib/models/user.ts index 69c2764cd..af827ba29 100644 --- a/lib/models/user.ts +++ b/lib/models/user.ts @@ -2,7 +2,7 @@ import { Note } from './note' import { Table, BeforeCreate, BeforeUpdate, HasMany, Unique, IsEmail, Column, DataType, PrimaryKey, Model, Default } from 'sequelize-typescript' import scrypt from 'scrypt-kdf' import { generateAvatarURL } from '../letter-avatars' -import logger from '../logger' +import { logger } from '../logger' import { UUIDV4 } from 'sequelize' // core diff --git a/lib/realtime.ts b/lib/realtime.ts index d4456eec2..b1469d352 100644 --- a/lib/realtime.ts +++ b/lib/realtime.ts @@ -2,8 +2,8 @@ import { Author, Note, Revision, User } from './models' import ot from './ot' import history from './history' -import logger from './logger' -import config from './config' +import { logger } from './logger' +import { config } from './config' import moment from 'moment' import randomcolor from 'randomcolor' import async from 'async' @@ -26,10 +26,8 @@ const realtime: any = { } /* eslint-enable @typescript-eslint/no-use-before-define */ - const disconnectSocketQueue: any = [] - function onAuthorizeSuccess (data, accept) { accept() } @@ -384,7 +382,6 @@ function failConnection (code, err, socket) { return socket.disconnect(true) } - function interruptConnection (socket, noteId, socketId) { if (notes[noteId]) delete notes[noteId] if (users[socketId]) delete users[socketId] @@ -537,7 +534,6 @@ function operationCallback (socket, operation) { }) } - function startConnection (socket) { if (isConnectionBusy) return isConnectionBusy = true @@ -715,7 +711,6 @@ setInterval(function () { }) }, 60000) - function updateUserData (socket, user) { // retrieve user data from passport if (socket.request.user && socket.request.user.logged_in) { @@ -731,7 +726,6 @@ function updateUserData (socket, user) { } } - function connection (socket) { if (realtime.maintenance) return parseNoteIdFromSocket(socket, function (err, noteId) { diff --git a/lib/response.js b/lib/response.js index 2e944e32e..6de70623a 100644 --- a/lib/response.js +++ b/lib/response.js @@ -1,11 +1,13 @@ 'use strict' // response // external modules + +// core +import { config } from './config' + var fs = require('fs') var path = require('path') var request = require('request') -// core -var config = require('./config') var logger = require('./logger') var models = require('./models') const noteUtil = require('./web/note/util') diff --git a/lib/web/note/actions.ts b/lib/web/note/actions.ts index 30db0f507..92cdea690 100644 --- a/lib/web/note/actions.ts +++ b/lib/web/note/actions.ts @@ -1,8 +1,8 @@ import { Response } from 'express' import { Note, Revision } from '../../models' -import logger from '../../logger' -import config from '../../config' +import { logger } from '../../logger' +import { config } from '../../config' import errors from '../../errors' import shortId from 'shortid' import moment from 'moment' diff --git a/lib/web/note/controller.ts b/lib/web/note/controller.ts index 3c29ce1ba..a44fd4ba8 100644 --- a/lib/web/note/controller.ts +++ b/lib/web/note/controller.ts @@ -1,9 +1,9 @@ -import { NextFunction, Response } from 'express' +import { NextFunction, Request, Response } from 'express' import { NoteUtils } from './util' import * as ActionController from './actions' import errors from '../../errors' -import config from '../../config' -import logger from '../../logger' +import { config } from '../../config' +import { logger } from '../../logger' import { User, Note } from '../../models' export module NoteController { diff --git a/lib/web/note/slide.ts b/lib/web/note/slide.ts index 52c2d8af2..6c9aa64a1 100644 --- a/lib/web/note/slide.ts +++ b/lib/web/note/slide.ts @@ -1,8 +1,8 @@ import { NextFunction, Response } from "express"; import { NoteUtils } from "./util"; import errors from '../../errors'; -import logger from '../../logger'; -import config from '../../config'; +import { logger } from '../../logger' +import { config } from '../../config' import { User } from "../../models/user"; import { Note } from "../../models/note"; diff --git a/lib/web/note/util.ts b/lib/web/note/util.ts index 778c82d32..f35a26e9a 100644 --- a/lib/web/note/util.ts +++ b/lib/web/note/util.ts @@ -1,20 +1,19 @@ -import { Includeable } from "sequelize"; -import { Response } from "express"; +import { Includeable } from 'sequelize' +import { Response } from 'express' -import path from "path"; -import fs from "fs"; -import errors from "../../errors"; -import config from "../../config"; -import logger from "../../logger"; -import { Note } from "../../models/note"; -import { User } from "../../models/user"; +import path from 'path' +import fs from 'fs' +import errors from '../../errors' +import { config } from '../../config' +import { logger } from '../../logger' +import { Note , User } from '../../models' export module NoteUtils { export function findNoteOrCreate(req, res, callback: (note: any) => void, include?: Includeable[]) { - const id = req.params.noteId || req.params.shortid; + const id = req.params.noteId || req.params.shortid Note.parseNoteId(id, function (err, _id) { if (err) { - logger.error(err); + logger.error(err) return errors.errorInternalError(res) } Note.findOne({ @@ -31,13 +30,13 @@ export module NoteUtils { return callback(note) } }).catch(function (err) { - logger.error(err); + logger.error(err) return errors.errorInternalError(res) }) }) } - export function checkViewPermission(req: any, note: any) { + export function checkViewPermission (req: any, note: any) { if (note.permission === 'private') { return req.isAuthenticated() && note.ownerId === req.user.id } else if (note.permission === 'limited' || note.permission === 'protected') { @@ -47,9 +46,9 @@ export module NoteUtils { } } - export function newNote(req: any, res: Response, body: string | null) { - let owner = null; - const noteId = req.params.noteId ? req.params.noteId : null; + export function newNote (req: any, res: Response, body: string | null) { + let owner = null + const noteId = req.params.noteId ? req.params.noteId : null if (req.isAuthenticated()) { owner = req.user.id } else if (!config.allowAnonymous) { @@ -67,21 +66,21 @@ export module NoteUtils { }).then(function (note) { return res.redirect(config.serverURL + '/' + (note.alias ? note.alias : Note.encodeNoteId(note.id))) }).catch(function (err) { - logger.error(err); + logger.error(err) return errors.errorInternalError(res) }) } - export function getPublishData(req: any, res: Response, note: any, callback: (data: any) => void) { - const body = note.content; - const extracted = Note.extractMeta(body); - const markdown = extracted.markdown; - const meta = Note.parseMeta(extracted.meta); - const createtime = note.createdAt; - const updatetime = note.lastchangeAt; - let title = Note.decodeTitle(note.title); - title = Note.generateWebTitle(meta.title || title); - const ogdata = Note.parseOpengraph(meta, title); + export function getPublishData (req: any, res: Response, note: any, callback: (data: any) => void) { + const body = note.content + const extracted = Note.extractMeta(body) + const markdown = extracted.markdown + const meta = Note.parseMeta(extracted.meta) + const createtime = note.createdAt + const updatetime = note.lastchangeAt + let title = Note.decodeTitle(note.title) + title = Note.generateWebTitle(meta.title || title) + const ogdata = Note.parseOpengraph(meta, title) const data = { title: title, description: meta.description || (markdown ? Note.generateDescription(markdown) : null), @@ -101,15 +100,14 @@ export module NoteUtils { cspNonce: res.locals.nonce, dnt: req.headers.dnt, opengraph: ogdata - }; + } callback(data) } - function isRevealTheme(theme: string) { + function isRevealTheme (theme: string) { if (fs.existsSync(path.join(__dirname, '..', '..', '..', 'public', 'build', 'reveal.js', 'css', 'theme', theme + '.css'))) { return theme } return undefined } } - diff --git a/lib/web/statusRouter.js b/lib/web/statusRouter.js index 025aafd41..1c6e8961c 100644 --- a/lib/web/statusRouter.js +++ b/lib/web/statusRouter.js @@ -1,10 +1,11 @@ 'use strict' +import { config } from '../config' + const Router = require('express').Router const errors = require('../errors') const realtime = require('../realtime') -const config = require('../config') const models = require('../models') const logger = require('../logger')