mirror of
https://github.com/Chocobozzz/PeerTube.git
synced 2024-12-01 04:49:16 -06:00
Add plugin static files cache
This commit is contained in:
parent
7663e55a2c
commit
a8b666e9f1
@ -100,13 +100,13 @@ async function updateVideoBlacklistController (req: express.Request, res: expres
|
|||||||
return res.type('json').status(204).end()
|
return res.type('json').status(204).end()
|
||||||
}
|
}
|
||||||
|
|
||||||
async function listBlacklist (req: express.Request, res: express.Response, next: express.NextFunction) {
|
async function listBlacklist (req: express.Request, res: express.Response) {
|
||||||
const resultList = await VideoBlacklistModel.listForApi(req.query.start, req.query.count, req.query.sort, req.query.type)
|
const resultList = await VideoBlacklistModel.listForApi(req.query.start, req.query.count, req.query.sort, req.query.type)
|
||||||
|
|
||||||
return res.json(getFormattedObjects<VideoBlacklist, VideoBlacklistModel>(resultList.data, resultList.total))
|
return res.json(getFormattedObjects(resultList.data, resultList.total))
|
||||||
}
|
}
|
||||||
|
|
||||||
async function removeVideoFromBlacklistController (req: express.Request, res: express.Response, next: express.NextFunction) {
|
async function removeVideoFromBlacklistController (req: express.Request, res: express.Response) {
|
||||||
const videoBlacklist = res.locals.videoBlacklist
|
const videoBlacklist = res.locals.videoBlacklist
|
||||||
const video = res.locals.video
|
const video = res.locals.video
|
||||||
|
|
||||||
|
@ -5,6 +5,12 @@ import { RegisteredPlugin } from '../lib/plugins/plugin-manager'
|
|||||||
import { servePluginStaticDirectoryValidator } from '../middlewares/validators/plugins'
|
import { servePluginStaticDirectoryValidator } from '../middlewares/validators/plugins'
|
||||||
import { serveThemeCSSValidator } from '../middlewares/validators/themes'
|
import { serveThemeCSSValidator } from '../middlewares/validators/themes'
|
||||||
import { PluginType } from '../../shared/models/plugins/plugin.type'
|
import { PluginType } from '../../shared/models/plugins/plugin.type'
|
||||||
|
import { isTestInstance } from '../helpers/core-utils'
|
||||||
|
|
||||||
|
const sendFileOptions = {
|
||||||
|
maxAge: '30 days',
|
||||||
|
immutable: !isTestInstance()
|
||||||
|
}
|
||||||
|
|
||||||
const pluginsRouter = express.Router()
|
const pluginsRouter = express.Router()
|
||||||
|
|
||||||
@ -46,7 +52,12 @@ export {
|
|||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
|
|
||||||
function servePluginGlobalCSS (req: express.Request, res: express.Response) {
|
function servePluginGlobalCSS (req: express.Request, res: express.Response) {
|
||||||
return res.sendFile(PLUGIN_GLOBAL_CSS_PATH)
|
// Only cache requests that have a ?hash=... query param
|
||||||
|
const globalCSSOptions = req.query.hash
|
||||||
|
? sendFileOptions
|
||||||
|
: {}
|
||||||
|
|
||||||
|
return res.sendFile(PLUGIN_GLOBAL_CSS_PATH, globalCSSOptions)
|
||||||
}
|
}
|
||||||
|
|
||||||
function servePluginStaticDirectory (req: express.Request, res: express.Response) {
|
function servePluginStaticDirectory (req: express.Request, res: express.Response) {
|
||||||
@ -61,7 +72,7 @@ function servePluginStaticDirectory (req: express.Request, res: express.Response
|
|||||||
}
|
}
|
||||||
|
|
||||||
const filepath = file.join('/')
|
const filepath = file.join('/')
|
||||||
return res.sendFile(join(plugin.path, staticPath, filepath))
|
return res.sendFile(join(plugin.path, staticPath, filepath), sendFileOptions)
|
||||||
}
|
}
|
||||||
|
|
||||||
function servePluginClientScripts (req: express.Request, res: express.Response) {
|
function servePluginClientScripts (req: express.Request, res: express.Response) {
|
||||||
@ -73,7 +84,7 @@ function servePluginClientScripts (req: express.Request, res: express.Response)
|
|||||||
return res.sendStatus(404)
|
return res.sendStatus(404)
|
||||||
}
|
}
|
||||||
|
|
||||||
return res.sendFile(join(plugin.path, staticEndpoint))
|
return res.sendFile(join(plugin.path, staticEndpoint), sendFileOptions)
|
||||||
}
|
}
|
||||||
|
|
||||||
function serveThemeCSSDirectory (req: express.Request, res: express.Response) {
|
function serveThemeCSSDirectory (req: express.Request, res: express.Response) {
|
||||||
@ -84,5 +95,5 @@ function serveThemeCSSDirectory (req: express.Request, res: express.Response) {
|
|||||||
return res.sendStatus(404)
|
return res.sendStatus(404)
|
||||||
}
|
}
|
||||||
|
|
||||||
return res.sendFile(join(plugin.path, staticEndpoint))
|
return res.sendFile(join(plugin.path, staticEndpoint), sendFileOptions)
|
||||||
}
|
}
|
||||||
|
@ -19,18 +19,14 @@ async function generateRandomString (size: number) {
|
|||||||
return raw.toString('hex')
|
return raw.toString('hex')
|
||||||
}
|
}
|
||||||
|
|
||||||
interface FormattableToJSON { toFormattedJSON (args?: any) }
|
interface FormattableToJSON<U, V> { toFormattedJSON (args?: U): V }
|
||||||
function getFormattedObjects<U, T extends FormattableToJSON> (objects: T[], objectsTotal: number, formattedArg?: any) {
|
function getFormattedObjects<U, V, T extends FormattableToJSON<U, V>> (objects: T[], objectsTotal: number, formattedArg?: U) {
|
||||||
const formattedObjects: U[] = []
|
const formattedObjects = objects.map(o => o.toFormattedJSON(formattedArg))
|
||||||
|
|
||||||
objects.forEach(object => {
|
|
||||||
formattedObjects.push(object.toFormattedJSON(formattedArg))
|
|
||||||
})
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
total: objectsTotal,
|
total: objectsTotal,
|
||||||
data: formattedObjects
|
data: formattedObjects
|
||||||
} as ResultList<U>
|
} as ResultList<V>
|
||||||
}
|
}
|
||||||
|
|
||||||
const getServerActor = memoizee(async function () {
|
const getServerActor = memoizee(async function () {
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
import * as express from 'express'
|
import * as express from 'express'
|
||||||
import { buildFileLocale, getDefaultLocale, is18nLocale, POSSIBLE_LOCALES } from '../../shared/models/i18n/i18n'
|
import { buildFileLocale, getDefaultLocale, is18nLocale, POSSIBLE_LOCALES } from '../../shared/models/i18n/i18n'
|
||||||
import { CUSTOM_HTML_TAG_COMMENTS, EMBED_SIZE, WEBSERVER } from '../initializers/constants'
|
import { CUSTOM_HTML_TAG_COMMENTS, EMBED_SIZE, PLUGIN_GLOBAL_CSS_PATH, WEBSERVER } from '../initializers/constants'
|
||||||
import { join } from 'path'
|
import { join } from 'path'
|
||||||
import { escapeHTML } from '../helpers/core-utils'
|
import { escapeHTML, sha256 } from '../helpers/core-utils'
|
||||||
import { VideoModel } from '../models/video/video'
|
import { VideoModel } from '../models/video/video'
|
||||||
import * as validator from 'validator'
|
import * as validator from 'validator'
|
||||||
import { VideoPrivacy } from '../../shared/models/videos'
|
import { VideoPrivacy } from '../../shared/models/videos'
|
||||||
@ -92,7 +92,7 @@ export class ClientHtml {
|
|||||||
let html = buffer.toString()
|
let html = buffer.toString()
|
||||||
|
|
||||||
html = ClientHtml.addCustomCSS(html)
|
html = ClientHtml.addCustomCSS(html)
|
||||||
html = ClientHtml.addPluginCSS(html)
|
html = await ClientHtml.addAsyncPluginCSS(html)
|
||||||
|
|
||||||
ClientHtml.htmlCache[ path ] = html
|
ClientHtml.htmlCache[ path ] = html
|
||||||
|
|
||||||
@ -144,8 +144,12 @@ export class ClientHtml {
|
|||||||
return htmlStringPage.replace(CUSTOM_HTML_TAG_COMMENTS.CUSTOM_CSS, styleTag)
|
return htmlStringPage.replace(CUSTOM_HTML_TAG_COMMENTS.CUSTOM_CSS, styleTag)
|
||||||
}
|
}
|
||||||
|
|
||||||
private static addPluginCSS (htmlStringPage: string) {
|
private static async addAsyncPluginCSS (htmlStringPage: string) {
|
||||||
const linkTag = `<link rel="stylesheet" href="/plugins/global.css" />`
|
const globalCSSContent = await readFile(PLUGIN_GLOBAL_CSS_PATH)
|
||||||
|
if (!globalCSSContent) return htmlStringPage
|
||||||
|
|
||||||
|
const fileHash = sha256(globalCSSContent)
|
||||||
|
const linkTag = `<link rel="stylesheet" href="/plugins/global.css?hash=${fileHash}" />`
|
||||||
|
|
||||||
return htmlStringPage.replace('</head>', linkTag + '</head>')
|
return htmlStringPage.replace('</head>', linkTag + '</head>')
|
||||||
}
|
}
|
||||||
|
@ -17,6 +17,7 @@ import { ServerHook, ServerHookName, serverHookObject } from '../../../shared/mo
|
|||||||
import { getHookType, internalRunHook } from '../../../shared/core-utils/plugins/hooks'
|
import { getHookType, internalRunHook } from '../../../shared/core-utils/plugins/hooks'
|
||||||
import { RegisterOptions } from '../../typings/plugins/register-options.model'
|
import { RegisterOptions } from '../../typings/plugins/register-options.model'
|
||||||
import { PluginLibrary } from '../../typings/plugins'
|
import { PluginLibrary } from '../../typings/plugins'
|
||||||
|
import { ClientHtml } from '../client-html'
|
||||||
|
|
||||||
export interface RegisteredPlugin {
|
export interface RegisteredPlugin {
|
||||||
npmName: string
|
npmName: string
|
||||||
@ -323,6 +324,8 @@ export class PluginManager implements ServerHook {
|
|||||||
for (const cssPath of cssRelativePaths) {
|
for (const cssPath of cssRelativePaths) {
|
||||||
await this.concatFiles(join(pluginPath, cssPath), PLUGIN_GLOBAL_CSS_PATH)
|
await this.concatFiles(join(pluginPath, cssPath), PLUGIN_GLOBAL_CSS_PATH)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ClientHtml.invalidCache()
|
||||||
}
|
}
|
||||||
|
|
||||||
private concatFiles (input: string, output: string) {
|
private concatFiles (input: string, output: string) {
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
// {hookType}:{api?}.{location}.{subLocation?}.{actionType}.{target}
|
||||||
|
|
||||||
export const serverFilterHookObject = {
|
export const serverFilterHookObject = {
|
||||||
'filter:api.videos.list.params': true,
|
'filter:api.videos.list.params': true,
|
||||||
'filter:api.videos.list.result': true,
|
'filter:api.videos.list.result': true,
|
||||||
|
Loading…
Reference in New Issue
Block a user