/** * More info about this file: * https://v2.quasar.dev/quasar-cli-vite/developing-ssr/ssr-webserver * * Runs in Node context. */ /** * Make sure to yarn add / npm install (in your project root) * anything you import here (except for express and compression). */ import express from 'express' import compression from 'compression' import { ssrClose, ssrCreate, ssrListen, ssrRenderPreloadTag, ssrServeStaticContent } from 'quasar/wrappers' /** * Create your webserver and return its instance. * If needed, prepare your webserver to receive * connect-like middlewares. * * Should NOT be async! */ export const create = ssrCreate((/* { ... } */) => { const app = express() // attackers can use this header to detect apps running Express // and then launch specifically-targeted attacks app.disable('x-powered-by') // place here any middlewares that // absolutely need to run before anything else if (process.env.PROD) { app.use(compression()) } return app }) /** * You need to make the server listen to the indicated port * and return the listening instance or whatever you need to * close the server with. * * The "listenResult" param for the "close()" definition below * is what you return here. * * For production, you can instead export your * handler for serverless use or whatever else fits your needs. */ export const listen = ssrListen(async ({ app, port, isReady }) => { await isReady() return app.listen(port, () => { if (process.env.PROD) { console.log('Server listening at port ' + port) } }) }) /** * Should close the server and free up any resources. * Will be used on development only when the server needs * to be rebooted. * * Should you need the result of the "listen()" call above, * you can use the "listenResult" param. * * Can be async. */ export const close = ssrClose(({ listenResult }) => { return listenResult.close() }) const maxAge = process.env.DEV ? 0 : 1000 * 60 * 60 * 24 * 30 /** * Should return middleware that serves the indicated path * with static content. */ export const serveStaticContent = ssrServeStaticContent((path, opts) => { return express.static(path, { maxAge, ...opts }) }) const jsRE = /\.js$/ const cssRE = /\.css$/ const woffRE = /\.woff$/ const woff2RE = /\.woff2$/ const gifRE = /\.gif$/ const jpgRE = /\.jpe?g$/ const pngRE = /\.png$/ /** * Should return a String with HTML output * (if any) for preloading indicated file */ export const renderPreloadTag = ssrRenderPreloadTag((file) => { if (jsRE.test(file) === true) { return `` } if (cssRE.test(file) === true) { return `` } if (woffRE.test(file) === true) { return `` } if (woff2RE.test(file) === true) { return `` } if (gifRE.test(file) === true) { return `` } if (jpgRE.test(file) === true) { return `` } if (pngRE.test(file) === true) { return `` } return '' })