mirror of
https://github.com/Chocobozzz/PeerTube.git
synced 2025-10-05 02:39:33 +02:00
Add ability to override client assets : logo - favicon - PWA icons - PWA manifest name and description (#2897)
* Add client-overrides storage to config * Add static-serve for client overrides * Move backgroun-image logo from bundle to css tag for runtime content hash * Add dynamic JSON manifest * Add content hash for manifest, favicon and logo Co-authored-by: kimsible <kimsible@users.noreply.github.com>
This commit is contained in:
parent
27647da17f
commit
caf2aaf4f9
15 changed files with 114 additions and 9 deletions
|
@ -1,3 +1,4 @@
|
|||
import { constants, promises as fs } from 'fs'
|
||||
import * as express from 'express'
|
||||
import { join } from 'path'
|
||||
import { root } from '../helpers/core-utils'
|
||||
|
@ -39,20 +40,40 @@ clientsRouter.use(
|
|||
)
|
||||
|
||||
// Static HTML/CSS/JS client files
|
||||
|
||||
const staticClientFiles = [
|
||||
'manifest.webmanifest',
|
||||
'ngsw-worker.js',
|
||||
'ngsw.json'
|
||||
]
|
||||
|
||||
for (const staticClientFile of staticClientFiles) {
|
||||
const path = join(root(), 'client', 'dist', staticClientFile)
|
||||
|
||||
clientsRouter.get('/' + staticClientFile, (req: express.Request, res: express.Response) => {
|
||||
clientsRouter.get(`/${staticClientFile}`, (req: express.Request, res: express.Response) => {
|
||||
res.sendFile(path, { maxAge: STATIC_MAX_AGE.SERVER })
|
||||
})
|
||||
}
|
||||
|
||||
// Dynamic PWA manifest
|
||||
clientsRouter.get('/manifest.webmanifest', asyncMiddleware(generateManifest))
|
||||
|
||||
// Static client overrides
|
||||
const staticClientOverrides = [
|
||||
'assets/images/logo.svg',
|
||||
'assets/images/favicon.png',
|
||||
'assets/images/icons/icon-36x36.png',
|
||||
'assets/images/icons/icon-48x48.png',
|
||||
'assets/images/icons/icon-72x72.png',
|
||||
'assets/images/icons/icon-96x96.png',
|
||||
'assets/images/icons/icon-144x144.png',
|
||||
'assets/images/icons/icon-192x192.png',
|
||||
'assets/images/icons/icon-512x512.png'
|
||||
]
|
||||
|
||||
for (const staticClientOverride of staticClientOverrides) {
|
||||
const overridePhysicalPath = join(CONFIG.STORAGE.CLIENT_OVERRIDES_DIR, staticClientOverride)
|
||||
clientsRouter.use(`/client/${staticClientOverride}`, asyncMiddleware(serveClientOverride(overridePhysicalPath)))
|
||||
}
|
||||
|
||||
clientsRouter.use('/client/locales/:locale/:file.json', serveServerTranslations)
|
||||
clientsRouter.use('/client', express.static(distPath, { maxAge: STATIC_MAX_AGE.CLIENT }))
|
||||
|
||||
|
@ -130,3 +151,28 @@ function sendHTML (html: string, res: express.Response) {
|
|||
|
||||
return res.send(html)
|
||||
}
|
||||
|
||||
async function generateManifest (req: express.Request, res: express.Response) {
|
||||
const manifestPhysicalPath = join(root(), 'client', 'dist', 'manifest.webmanifest')
|
||||
const manifestJson = await fs.readFile(manifestPhysicalPath, 'utf8')
|
||||
const manifest = JSON.parse(manifestJson)
|
||||
|
||||
manifest.name = CONFIG.INSTANCE.NAME
|
||||
manifest.short_name = CONFIG.INSTANCE.NAME
|
||||
manifest.description = CONFIG.INSTANCE.SHORT_DESCRIPTION
|
||||
|
||||
res.json(manifest)
|
||||
}
|
||||
|
||||
function serveClientOverride (path: string) {
|
||||
return async (req: express.Request, res: express.Response, next: express.NextFunction) => {
|
||||
try {
|
||||
await fs.access(path, constants.F_OK)
|
||||
// Serve override client
|
||||
res.sendFile(path, { maxAge: STATIC_MAX_AGE.SERVER })
|
||||
} catch {
|
||||
// Serve dist client
|
||||
next()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue