diff options
-rw-r--r-- | server/controllers/activitypub/client.ts | 4 | ||||
-rw-r--r-- | server/controllers/feeds.ts | 6 | ||||
-rw-r--r-- | server/controllers/static.ts | 12 | ||||
-rw-r--r-- | server/helpers/utils.ts | 5 | ||||
-rw-r--r-- | server/middlewares/cache.ts | 73 |
5 files changed, 50 insertions, 50 deletions
diff --git a/server/controllers/activitypub/client.ts b/server/controllers/activitypub/client.ts index ebb2c06a2..c90c3f931 100644 --- a/server/controllers/activitypub/client.ts +++ b/server/controllers/activitypub/client.ts | |||
@@ -16,7 +16,7 @@ import { VideoModel } from '../../models/video/video' | |||
16 | import { VideoChannelModel } from '../../models/video/video-channel' | 16 | import { VideoChannelModel } from '../../models/video/video-channel' |
17 | import { VideoCommentModel } from '../../models/video/video-comment' | 17 | import { VideoCommentModel } from '../../models/video/video-comment' |
18 | import { VideoShareModel } from '../../models/video/video-share' | 18 | import { VideoShareModel } from '../../models/video/video-share' |
19 | import { cache } from '../../middlewares/cache' | 19 | import { cacheRoute } from '../../middlewares/cache' |
20 | import { activityPubResponse } from './utils' | 20 | import { activityPubResponse } from './utils' |
21 | import { AccountVideoRateModel } from '../../models/account/account-video-rate' | 21 | import { AccountVideoRateModel } from '../../models/account/account-video-rate' |
22 | import { | 22 | import { |
@@ -43,7 +43,7 @@ activityPubClientRouter.get('/accounts?/:name/following', | |||
43 | ) | 43 | ) |
44 | 44 | ||
45 | activityPubClientRouter.get('/videos/watch/:id', | 45 | activityPubClientRouter.get('/videos/watch/:id', |
46 | executeIfActivityPub(asyncMiddleware(cache(ROUTE_CACHE_LIFETIME.ACTIVITY_PUB.VIDEOS))), | 46 | executeIfActivityPub(asyncMiddleware(cacheRoute(ROUTE_CACHE_LIFETIME.ACTIVITY_PUB.VIDEOS))), |
47 | executeIfActivityPub(asyncMiddleware(videosGetValidator)), | 47 | executeIfActivityPub(asyncMiddleware(videosGetValidator)), |
48 | executeIfActivityPub(asyncMiddleware(videoController)) | 48 | executeIfActivityPub(asyncMiddleware(videoController)) |
49 | ) | 49 | ) |
diff --git a/server/controllers/feeds.ts b/server/controllers/feeds.ts index 6cbe42a2a..682f4abda 100644 --- a/server/controllers/feeds.ts +++ b/server/controllers/feeds.ts | |||
@@ -5,7 +5,7 @@ import { asyncMiddleware, setDefaultSort, videoCommentsFeedsValidator, videoFeed | |||
5 | import { VideoModel } from '../models/video/video' | 5 | import { VideoModel } from '../models/video/video' |
6 | import * as Feed from 'pfeed' | 6 | import * as Feed from 'pfeed' |
7 | import { AccountModel } from '../models/account/account' | 7 | import { AccountModel } from '../models/account/account' |
8 | import { cache } from '../middlewares/cache' | 8 | import { cacheRoute } from '../middlewares/cache' |
9 | import { VideoChannelModel } from '../models/video/video-channel' | 9 | import { VideoChannelModel } from '../models/video/video-channel' |
10 | import { VideoCommentModel } from '../models/video/video-comment' | 10 | import { VideoCommentModel } from '../models/video/video-comment' |
11 | import { buildNSFWFilter } from '../helpers/express-utils' | 11 | import { buildNSFWFilter } from '../helpers/express-utils' |
@@ -13,7 +13,7 @@ import { buildNSFWFilter } from '../helpers/express-utils' | |||
13 | const feedsRouter = express.Router() | 13 | const feedsRouter = express.Router() |
14 | 14 | ||
15 | feedsRouter.get('/feeds/video-comments.:format', | 15 | feedsRouter.get('/feeds/video-comments.:format', |
16 | asyncMiddleware(cache(ROUTE_CACHE_LIFETIME.FEEDS)), | 16 | asyncMiddleware(cacheRoute(ROUTE_CACHE_LIFETIME.FEEDS)), |
17 | asyncMiddleware(videoCommentsFeedsValidator), | 17 | asyncMiddleware(videoCommentsFeedsValidator), |
18 | asyncMiddleware(generateVideoCommentsFeed) | 18 | asyncMiddleware(generateVideoCommentsFeed) |
19 | ) | 19 | ) |
@@ -21,7 +21,7 @@ feedsRouter.get('/feeds/video-comments.:format', | |||
21 | feedsRouter.get('/feeds/videos.:format', | 21 | feedsRouter.get('/feeds/videos.:format', |
22 | videosSortValidator, | 22 | videosSortValidator, |
23 | setDefaultSort, | 23 | setDefaultSort, |
24 | asyncMiddleware(cache(ROUTE_CACHE_LIFETIME.FEEDS)), | 24 | asyncMiddleware(cacheRoute(ROUTE_CACHE_LIFETIME.FEEDS)), |
25 | asyncMiddleware(videoFeedsValidator), | 25 | asyncMiddleware(videoFeedsValidator), |
26 | asyncMiddleware(generateVideoFeed) | 26 | asyncMiddleware(generateVideoFeed) |
27 | ) | 27 | ) |
diff --git a/server/controllers/static.ts b/server/controllers/static.ts index ce5d0c5fa..f10427f3e 100644 --- a/server/controllers/static.ts +++ b/server/controllers/static.ts | |||
@@ -2,7 +2,7 @@ import * as cors from 'cors' | |||
2 | import * as express from 'express' | 2 | import * as express from 'express' |
3 | import { CONFIG, STATIC_DOWNLOAD_PATHS, STATIC_MAX_AGE, STATIC_PATHS, ROUTE_CACHE_LIFETIME } from '../initializers' | 3 | import { CONFIG, STATIC_DOWNLOAD_PATHS, STATIC_MAX_AGE, STATIC_PATHS, ROUTE_CACHE_LIFETIME } from '../initializers' |
4 | import { VideosPreviewCache } from '../lib/cache' | 4 | import { VideosPreviewCache } from '../lib/cache' |
5 | import { cache } from '../middlewares/cache' | 5 | import { cacheRoute } from '../middlewares/cache' |
6 | import { asyncMiddleware, videosGetValidator } from '../middlewares' | 6 | import { asyncMiddleware, videosGetValidator } from '../middlewares' |
7 | import { VideoModel } from '../models/video/video' | 7 | import { VideoModel } from '../models/video/video' |
8 | import { VideosCaptionCache } from '../lib/cache/videos-caption-cache' | 8 | import { VideosCaptionCache } from '../lib/cache/videos-caption-cache' |
@@ -71,7 +71,7 @@ staticRouter.use( | |||
71 | 71 | ||
72 | // robots.txt service | 72 | // robots.txt service |
73 | staticRouter.get('/robots.txt', | 73 | staticRouter.get('/robots.txt', |
74 | asyncMiddleware(cache(ROUTE_CACHE_LIFETIME.ROBOTS)), | 74 | asyncMiddleware(cacheRoute(ROUTE_CACHE_LIFETIME.ROBOTS)), |
75 | (_, res: express.Response) => { | 75 | (_, res: express.Response) => { |
76 | res.type('text/plain') | 76 | res.type('text/plain') |
77 | return res.send(CONFIG.INSTANCE.ROBOTS) | 77 | return res.send(CONFIG.INSTANCE.ROBOTS) |
@@ -80,7 +80,7 @@ staticRouter.get('/robots.txt', | |||
80 | 80 | ||
81 | // nodeinfo service | 81 | // nodeinfo service |
82 | staticRouter.use('/.well-known/nodeinfo', | 82 | staticRouter.use('/.well-known/nodeinfo', |
83 | asyncMiddleware(cache(ROUTE_CACHE_LIFETIME.NODEINFO)), | 83 | asyncMiddleware(cacheRoute(ROUTE_CACHE_LIFETIME.NODEINFO)), |
84 | (_, res: express.Response) => { | 84 | (_, res: express.Response) => { |
85 | return res.json({ | 85 | return res.json({ |
86 | links: [ | 86 | links: [ |
@@ -93,7 +93,7 @@ staticRouter.use('/.well-known/nodeinfo', | |||
93 | } | 93 | } |
94 | ) | 94 | ) |
95 | staticRouter.use('/nodeinfo/:version.json', | 95 | staticRouter.use('/nodeinfo/:version.json', |
96 | asyncMiddleware(cache(ROUTE_CACHE_LIFETIME.NODEINFO)), | 96 | // asyncMiddleware(cacheRoute(ROUTE_CACHE_LIFETIME.NODEINFO)), |
97 | asyncMiddleware(generateNodeinfo) | 97 | asyncMiddleware(generateNodeinfo) |
98 | ) | 98 | ) |
99 | 99 | ||
@@ -161,13 +161,13 @@ async function generateNodeinfo (req: express.Request, res: express.Response, ne | |||
161 | nodeDescription: CONFIG.INSTANCE.SHORT_DESCRIPTION | 161 | nodeDescription: CONFIG.INSTANCE.SHORT_DESCRIPTION |
162 | } | 162 | } |
163 | } as HttpNodeinfoDiasporaSoftwareNsSchema20 | 163 | } as HttpNodeinfoDiasporaSoftwareNsSchema20 |
164 | res.set('Content-Type', 'application/json; profile=http://nodeinfo.diaspora.software/ns/schema/2.0#; charset=utf-8') | 164 | res.contentType('application/json; profile="http://nodeinfo.diaspora.software/ns/schema/2.0#"') |
165 | } else { | 165 | } else { |
166 | json = { error: 'Nodeinfo schema version not handled' } | 166 | json = { error: 'Nodeinfo schema version not handled' } |
167 | res.status(404) | 167 | res.status(404) |
168 | } | 168 | } |
169 | 169 | ||
170 | return res.end(JSON.stringify(json)) | 170 | return res.send(json).end() |
171 | } | 171 | } |
172 | 172 | ||
173 | async function downloadTorrent (req: express.Request, res: express.Response, next: express.NextFunction) { | 173 | async function downloadTorrent (req: express.Request, res: express.Response, next: express.NextFunction) { |
diff --git a/server/helpers/utils.ts b/server/helpers/utils.ts index 834d788c8..9efc89d92 100644 --- a/server/helpers/utils.ts +++ b/server/helpers/utils.ts | |||
@@ -113,7 +113,7 @@ const timeTable = { | |||
113 | week: 3600000 * 24 * 7, | 113 | week: 3600000 * 24 * 7, |
114 | month: 3600000 * 24 * 30 | 114 | month: 3600000 * 24 * 30 |
115 | } | 115 | } |
116 | export function parseDuration (duration: number | string, defaultDuration: number): number { | 116 | export function parseDuration (duration: number | string): number { |
117 | if (typeof duration === 'number') return duration | 117 | if (typeof duration === 'number') return duration |
118 | 118 | ||
119 | if (typeof duration === 'string') { | 119 | if (typeof duration === 'string') { |
@@ -130,8 +130,7 @@ export function parseDuration (duration: number | string, defaultDuration: numbe | |||
130 | } | 130 | } |
131 | } | 131 | } |
132 | 132 | ||
133 | logger.error('Duration could not be properly parsed, defaulting to ' + defaultDuration) | 133 | throw new Error('Duration could not be properly parsed') |
134 | return defaultDuration | ||
135 | } | 134 | } |
136 | 135 | ||
137 | function resetSequelizeInstance (instance: Model<any>, savedFields: object) { | 136 | function resetSequelizeInstance (instance: Model<any>, savedFields: object) { |
diff --git a/server/middlewares/cache.ts b/server/middlewares/cache.ts index 1e5a13b2e..c671b88c9 100644 --- a/server/middlewares/cache.ts +++ b/server/middlewares/cache.ts | |||
@@ -6,59 +6,60 @@ import { logger } from '../helpers/logger' | |||
6 | 6 | ||
7 | const lock = new AsyncLock({ timeout: 5000 }) | 7 | const lock = new AsyncLock({ timeout: 5000 }) |
8 | 8 | ||
9 | function cacheRoute (lifetime: number) { | 9 | function cacheRoute (lifetimeArg: string | number) { |
10 | return async function (req: express.Request, res: express.Response, next: express.NextFunction) { | 10 | return async function (req: express.Request, res: express.Response, next: express.NextFunction) { |
11 | const redisKey = Redis.Instance.buildCachedRouteKey(req) | 11 | const redisKey = Redis.Instance.buildCachedRouteKey(req) |
12 | 12 | ||
13 | await lock.acquire(redisKey, async (done) => { | 13 | try { |
14 | const cached = await Redis.Instance.getCachedRoute(req) | 14 | await lock.acquire(redisKey, async (done) => { |
15 | const cached = await Redis.Instance.getCachedRoute(req) | ||
15 | 16 | ||
16 | // Not cached | 17 | // Not cached |
17 | if (!cached) { | 18 | if (!cached) { |
18 | logger.debug('No cached results for route %s.', req.originalUrl) | 19 | logger.debug('No cached results for route %s.', req.originalUrl) |
19 | 20 | ||
20 | const sendSave = res.send.bind(res) | 21 | const sendSave = res.send.bind(res) |
21 | 22 | ||
22 | res.send = (body) => { | 23 | res.send = (body) => { |
23 | if (res.statusCode >= 200 && res.statusCode < 400) { | 24 | if (res.statusCode >= 200 && res.statusCode < 400) { |
24 | const contentType = res.get('content-type') | 25 | const contentType = res.get('content-type') |
25 | Redis.Instance.setCachedRoute(req, body, lifetime, contentType, res.statusCode) | 26 | const lifetime = parseDuration(lifetimeArg) |
26 | .then(() => done()) | 27 | |
27 | .catch(err => { | 28 | Redis.Instance.setCachedRoute(req, body, lifetime, contentType, res.statusCode) |
28 | logger.error('Cannot cache route.', { err }) | 29 | .then(() => done()) |
29 | return done(err) | 30 | .catch(err => { |
30 | }) | 31 | logger.error('Cannot cache route.', { err }) |
32 | return done(err) | ||
33 | }) | ||
34 | } | ||
35 | |||
36 | return sendSave(body) | ||
31 | } | 37 | } |
32 | 38 | ||
33 | return sendSave(body) | 39 | return next() |
34 | } | 40 | } |
35 | 41 | ||
36 | return next() | 42 | if (cached.contentType) res.set('content-type', cached.contentType) |
37 | } | ||
38 | |||
39 | if (cached.contentType) res.set('content-type', cached.contentType) | ||
40 | 43 | ||
41 | if (cached.statusCode) { | 44 | if (cached.statusCode) { |
42 | const statusCode = parseInt(cached.statusCode, 10) | 45 | const statusCode = parseInt(cached.statusCode, 10) |
43 | if (!isNaN(statusCode)) res.status(statusCode) | 46 | if (!isNaN(statusCode)) res.status(statusCode) |
44 | } | 47 | } |
45 | 48 | ||
46 | logger.debug('Use cached result for %s.', req.originalUrl) | 49 | logger.debug('Use cached result for %s.', req.originalUrl) |
47 | res.send(cached.body).end() | 50 | res.send(cached.body).end() |
48 | 51 | ||
49 | return done() | 52 | return done() |
50 | }) | 53 | }) |
54 | } catch (err) { | ||
55 | logger.error('Cannot serve cached route.', err) | ||
56 | return next() | ||
57 | } | ||
51 | } | 58 | } |
52 | } | 59 | } |
53 | 60 | ||
54 | const cache = (duration: number | string) => { | ||
55 | const _lifetime = parseDuration(duration, 3600000) | ||
56 | return cacheRoute(_lifetime) | ||
57 | } | ||
58 | |||
59 | // --------------------------------------------------------------------------- | 61 | // --------------------------------------------------------------------------- |
60 | 62 | ||
61 | export { | 63 | export { |
62 | cacheRoute, | 64 | cacheRoute |
63 | cache | ||
64 | } | 65 | } |