diff --git a/.vscode/launch.json b/.vscode/launch.json index 7fa2197..ff2e38a 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -15,6 +15,7 @@ "console": "integratedTerminal", "env": { "HTTP_BIND_PORT": "3010", + "HTTPS_ENABLE": "enabled", "HTTPS_BIND_PORT": "3410", } }, diff --git a/app/views/components/library.pug b/app/views/components/library.pug index d6ca080..20eb6b0 100644 --- a/app/views/components/library.pug +++ b/app/views/components/library.pug @@ -10,6 +10,30 @@ include section-title return (value < 1000) ? numeral(value).format('0,0') : numeral(value).format('0,0.0a'); } + function formatBitRate (value) { + if ((value !== 0) && !value) { return '---'; } + return numeral(value).format('0,0.0ib').slice(0, -2) + 'bps'; + } + + function formatDataSize (value) { + if ((value !== 0) && !value) { return '---'; } + return numeral(value).format('0,0.0b'); + } + + function formatTimestamp (value, withFractional = false) { + if (value !== 0 && !value) { + return withFractional ? '-:--:--.---' : '-:--:--'; + } + return numeral(value).format(withFractional ? 'h:mm:ss.sss' : 'h:mm:ss'); + } + + function formatDuration (value) { + let duration = formatTimestamp(value); + if (duration.startsWith('0:')) { duration = duration.slice(2); } + if (duration.startsWith('0')) { duration = duration.slice(1); } + return duration; + } + function displayIntegerValue (value) { return numeral(value).format(value > 1000 ? '0,0.0a' : '0,0'); } diff --git a/app/views/components/page-sidebar.pug b/app/views/components/page-sidebar.pug index 85b9383..623e0d1 100644 --- a/app/views/components/page-sidebar.pug +++ b/app/views/components/page-sidebar.pug @@ -1,4 +1,5 @@ include ../announcement/components/announcement +include ../newsroom/components/feed-entry-list-item mixin renderPageSidebar ( ) if Array.isArray(announcements) && (announcements.length > 0) @@ -17,14 +18,7 @@ mixin renderPageSidebar ( ) ul.uk-list each entry in newsfeed.entries li - div - a(href= entry.link, target="_blank").uk-link-reset= entry.title - .uk-text-small - div(uk-grid).uk-grid-small - .uk-width-expand - a(href= entry.feed.link, target="_blank").uk-link-reset= entry.feed.title - .uk-width-auto - div= moment(entry.published).fromNow() + +renderNewsroomFeedEntryListItem(entry) .uk-margin +renderSectionTitle('Widget', { diff --git a/app/views/components/social-card/facebook.pug b/app/views/components/social-card/facebook.pug index 20cb5fa..d3a7432 100644 --- a/app/views/components/social-card/facebook.pug +++ b/app/views/components/social-card/facebook.pug @@ -2,7 +2,7 @@ block facebook-card meta(property='og:site_name', content= site.name) meta(property='og:type', content='website') meta(property='og:image', content= `https://${site.domain}/img/social-cards/${site.domainKey}.png?v=${pkg.version}`) - meta(property='og:url', content= `https://${site.domain}${dtp.request.url}`) + meta(property='og:url', content= `https://${site.domain}${request.url}`) meta(property='og:title', content= pageTitle || site.name) meta(property='og:description', content= pageDescription || site.description) meta(property='og:image:alt', content= `${site.name} | ${site.description}`) diff --git a/app/views/newsroom/components/feed-entry-list-item.pug b/app/views/newsroom/components/feed-entry-list-item.pug new file mode 100644 index 0000000..da32d31 --- /dev/null +++ b/app/views/newsroom/components/feed-entry-list-item.pug @@ -0,0 +1,9 @@ +mixin renderNewsroomFeedEntryListItem (entry) + .uk-text-bold + a(href= entry.link, target="_blank").uk-link-reset= entry.title + .uk-text-small + div(uk-grid).uk-grid-small + .uk-width-expand + a(href= entry.feed.link, target="_blank").uk-link-reset= entry.feed.title + .uk-width-auto + div= moment(entry.published).fromNow() \ No newline at end of file diff --git a/config/limiter.js b/config/limiter.js index 63397cf..e49b258 100644 --- a/config/limiter.js +++ b/config/limiter.js @@ -117,6 +117,9 @@ module.exports = { }, }, + /* + * CommentController + */ comment: { deleteComment: { total: 1, @@ -305,6 +308,9 @@ module.exports = { }, }, + /* + * WelcomeController + */ welcome: { total: 12, expire: ONE_MINUTE, diff --git a/lib/site-platform.js b/lib/site-platform.js index 9080985..5d628a7 100644 --- a/lib/site-platform.js +++ b/lib/site-platform.js @@ -341,9 +341,7 @@ module.exports.startWebServer = async (dtp) => { module.app.use(async (req, res, next) => { const { cache: cacheService } = dtp.services; try { - res.locals.dtp = { - request: req, - }; + res.locals.request = req; const settingsKey = `settings:${dtp.config.site.domainKey}:site`; res.locals.site = Object.assign({ }, dtp.config.site); @@ -359,6 +357,16 @@ module.exports.startWebServer = async (dtp) => { } }); + /* + * Call out to application to register their custom middleware at the right + * point in the processing chain. + */ + module.log.debug('typeof dtp.config.registerMiddleware', { type: (typeof dtp.config.registerMiddleware) }); + if (dtp.config && (typeof dtp.config.registerMiddleware === 'function')) { + module.log.info('registering custom application middleware'); + await dtp.config.registerMiddleware(dtp, module.app); + } + /* * System Init */ @@ -382,12 +390,7 @@ module.exports.startWebServer = async (dtp) => { if (process.env.HTTP_ENABLE === 'enabled') { if (process.env.HTTP_REDIRECT_SSL === 'enabled') { - module.log.info('creating HTTP SSL redirect app'); - module.redirectApp = express(); - module.redirectApp.use((req, res) => { - module.log.info('redirecting to SSL', { host: req.host, url: req.url }); - res.redirect(`https://${process.env.DTP_SITE_DOMAIN}${req.url}`); - }); + await module.createSslRedirectApp(dtp); await module.createHttpServer(dtp, module.redirectApp); } else { await module.createHttpServer(dtp, module.app); @@ -434,6 +437,19 @@ module.createHttpsServer = async (dtp, app) => { return module.https; }; +module.createSslRedirectApp = async (/* dtp */) => { + module.log.info('creating HTTP SSL redirect app'); + + module.redirectApp = express(); + + module.redirectApp.use((req, res) => { + module.log.info('redirecting to SSL', { host: req.host, url: req.url }); + res.redirect(`https://${process.env.DTP_SITE_DOMAIN}${req.url}`); + }); + + return module.redirectApp; +}; + module.startHttpServer = async (dtp, server, config) => { return new Promise((resolve, reject) => { module.log.info('starting HTTP server', { port: config.port, bind: config.address });