From f7ac03ee94d9d32e26bd712e8dc05a6109f5e835 Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Mon, 28 Feb 2022 15:13:56 +0100 Subject: [PATCH] Fix client html performance regression --- server/helpers/markdown.ts | 4 ++-- server/initializers/constants.ts | 4 +++- server/lib/client-html.ts | 14 +++++++++++--- 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/server/helpers/markdown.ts b/server/helpers/markdown.ts index 25685ec6d..41c1186ec 100644 --- a/server/helpers/markdown.ts +++ b/server/helpers/markdown.ts @@ -8,7 +8,7 @@ const markdownItEmoji = require('markdown-it-emoji/light') const MarkdownItClass = require('markdown-it') const markdownItWithHTML = new MarkdownItClass('default', { linkify: true, breaks: true, html: true }) -const markdownItWithoutHTML = new MarkdownItClass('default', { linkify: true, breaks: true, html: false }) +const markdownItWithoutHTML = new MarkdownItClass('default', { linkify: false, breaks: true, html: false }) const toSafeHtml = (text: string) => { if (!text) return '' @@ -66,7 +66,7 @@ function plainTextPlugin (markdownIt: any) { if (token.type === 'list_item_close') { lastSeparator = ', ' - } else if (/[a-zA-Z]+_close/.test(token.type)) { + } else if (token.type.endsWith('_close')) { lastSeparator = ' ' } else if (token.content) { text += lastSeparator diff --git a/server/initializers/constants.ts b/server/initializers/constants.ts index 4d2a6fc63..2367e7689 100644 --- a/server/initializers/constants.ts +++ b/server/initializers/constants.ts @@ -718,10 +718,12 @@ const MEMOIZE_TTL = { OVERVIEWS_SAMPLE: 1000 * 3600 * 4, // 4 hours INFO_HASH_EXISTS: 1000 * 3600 * 12, // 12 hours LIVE_ABLE_TO_UPLOAD: 1000 * 60, // 1 minute - LIVE_CHECK_SOCKET_HEALTH: 1000 * 60 // 1 minute + LIVE_CHECK_SOCKET_HEALTH: 1000 * 60, // 1 minute + MD_TO_PLAIN_TEXT_CLIENT_HTML: 1000 * 60 // 1 minute } const MEMOIZE_LENGTH = { + MD_TO_PLAIN_TEXT_CLIENT_HTML: 100, INFO_HASH_EXISTS: 200 } diff --git a/server/lib/client-html.ts b/server/lib/client-html.ts index c010f3c44..945bc712f 100644 --- a/server/lib/client-html.ts +++ b/server/lib/client-html.ts @@ -1,5 +1,6 @@ import express from 'express' import { readFile } from 'fs-extra' +import memoizee from 'memoizee' import { join } from 'path' import validator from 'validator' import { toCompleteUUID } from '@server/helpers/custom-validators/misc' @@ -20,6 +21,8 @@ import { CUSTOM_HTML_TAG_COMMENTS, EMBED_SIZE, FILES_CONTENT_HASH, + MEMOIZE_LENGTH, + MEMOIZE_TTL, PLUGIN_GLOBAL_CSS_PATH, WEBSERVER } from '../initializers/constants' @@ -32,6 +35,11 @@ import { MAccountActor, MChannelActor } from '../types/models' import { getBiggestActorImage } from './actor-image' import { ServerConfigManager } from './server-config-manager' +const getPlainTextDescriptionCached = memoizee(mdToOneLinePlainText, { + maxAge: MEMOIZE_TTL.MD_TO_PLAIN_TEXT_CLIENT_HTML, + max: MEMOIZE_LENGTH.MD_TO_PLAIN_TEXT_CLIENT_HTML +}) + type Tags = { ogType: string twitterCard: 'player' | 'summary' | 'summary_large_image' @@ -104,7 +112,7 @@ class ClientHtml { res.status(HttpStatusCode.NOT_FOUND_404) return html } - const description = mdToOneLinePlainText(video.description) + const description = getPlainTextDescriptionCached(video.description) let customHtml = ClientHtml.addTitleTag(html, video.name) customHtml = ClientHtml.addDescriptionTag(customHtml, description) @@ -165,7 +173,7 @@ class ClientHtml { return html } - const description = mdToOneLinePlainText(videoPlaylist.description) + const description = getPlainTextDescriptionCached(videoPlaylist.description) let customHtml = ClientHtml.addTitleTag(html, videoPlaylist.name) customHtml = ClientHtml.addDescriptionTag(customHtml, description) @@ -264,7 +272,7 @@ class ClientHtml { return ClientHtml.getIndexHTML(req, res) } - const description = mdToOneLinePlainText(entity.description) + const description = getPlainTextDescriptionCached(entity.description) let customHtml = ClientHtml.addTitleTag(html, entity.getDisplayName()) customHtml = ClientHtml.addDescriptionTag(customHtml, description)