]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blob - server/controllers/object-storage-proxy.ts
Merge branch 'release/4.3.0' into develop
[github/Chocobozzz/PeerTube.git] / server / controllers / object-storage-proxy.ts
1 import cors from 'cors'
2 import express from 'express'
3 import { logger } from '@server/helpers/logger'
4 import { OBJECT_STORAGE_PROXY_PATHS } from '@server/initializers/constants'
5 import { getHLSFileReadStream, getWebTorrentFileReadStream } from '@server/lib/object-storage'
6 import {
7 asyncMiddleware,
8 ensureCanAccessPrivateVideoHLSFiles,
9 ensureCanAccessVideoPrivateWebTorrentFiles,
10 ensurePrivateObjectStorageProxyIsEnabled,
11 optionalAuthenticate
12 } from '@server/middlewares'
13 import { HttpStatusCode } from '@shared/models'
14
15 const objectStorageProxyRouter = express.Router()
16
17 objectStorageProxyRouter.use(cors())
18
19 objectStorageProxyRouter.get(OBJECT_STORAGE_PROXY_PATHS.PRIVATE_WEBSEED + ':filename',
20 ensurePrivateObjectStorageProxyIsEnabled,
21 optionalAuthenticate,
22 asyncMiddleware(ensureCanAccessVideoPrivateWebTorrentFiles),
23 asyncMiddleware(proxifyWebTorrent)
24 )
25
26 objectStorageProxyRouter.get(OBJECT_STORAGE_PROXY_PATHS.STREAMING_PLAYLISTS.PRIVATE_HLS + ':videoUUID/:filename',
27 ensurePrivateObjectStorageProxyIsEnabled,
28 optionalAuthenticate,
29 asyncMiddleware(ensureCanAccessPrivateVideoHLSFiles),
30 asyncMiddleware(proxifyHLS)
31 )
32
33 // ---------------------------------------------------------------------------
34
35 export {
36 objectStorageProxyRouter
37 }
38
39 async function proxifyWebTorrent (req: express.Request, res: express.Response) {
40 const filename = req.params.filename
41
42 logger.debug('Proxifying WebTorrent file %s from object storage.', filename)
43
44 try {
45 const stream = await getWebTorrentFileReadStream({
46 filename,
47 rangeHeader: req.header('range')
48 })
49
50 return stream.pipe(res)
51 } catch (err) {
52 return handleObjectStorageFailure(res, err)
53 }
54 }
55
56 async function proxifyHLS (req: express.Request, res: express.Response) {
57 const playlist = res.locals.videoStreamingPlaylist
58 const video = res.locals.onlyVideo
59 const filename = req.params.filename
60
61 logger.debug('Proxifying HLS file %s from object storage.', filename)
62
63 try {
64 const stream = await getHLSFileReadStream({
65 playlist: playlist.withVideo(video),
66 filename,
67 rangeHeader: req.header('range')
68 })
69
70 return stream.pipe(res)
71 } catch (err) {
72 return handleObjectStorageFailure(res, err)
73 }
74 }
75
76 function handleObjectStorageFailure (res: express.Response, err: Error) {
77 if (err.name === 'NoSuchKey') {
78 return res.sendStatus(HttpStatusCode.NOT_FOUND_404)
79 }
80
81 return res.fail({
82 status: HttpStatusCode.INTERNAL_SERVER_ERROR_500,
83 message: err.message,
84 type: err.name
85 })
86 }