@silexlabs/silex
Version:
Free and easy website builder for everyone.
71 lines (62 loc) • 2.27 kB
text/typescript
/*
* Silex website builder, free/libre no-code tool for makers.
* Copyright (c) 2023 lexoyo and Silex Labs foundation
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
import express, { Application } from 'express'
import bodyParser from 'body-parser'
import compression from 'compression'
import cookieParser from 'cookie-parser'
import session from 'cookie-session'
import cors from 'cors'
import { ServerConfig } from './config'
import { ServerEvent } from './events'
export function create(config: ServerConfig): Application {
// Express app
const app = express()
app.set('config', config)
// CORS
const options = config.expressOptions
if (options.cors) {
console.info('> CORS are ENABLED:', options.cors)
app.use(cors({
origin: options.cors,
}))
}
// compress gzip when possible
app.use(compression() as any)
// cookie & session
app.use(bodyParser.json({ limit: options.jsonLimit }))
app.use(bodyParser.text({ limit: options.textLimit }))
app.use(bodyParser.urlencoded({ limit: options.urlencodedLimit }))
console.info('> Session name:', options.sessionName)
app.use(cookieParser() as any)
app.use(session({
name: options.sessionName,
secret: options.sessionSecret,
}) as any)
return app
}
export async function start(app: Application): Promise<Application> {
const config = app.get('config') as ServerConfig
// Plugins hook to create API routes
config.emit(ServerEvent.STARTUP_START, { app })
// Start server
return new Promise((resolve, reject) => {
app.listen(config.port, () => {
config.emit(ServerEvent.STARTUP_END, { app })
resolve(app)
})
})
}