-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathserver-setup.ts
87 lines (72 loc) · 3.14 KB
/
server-setup.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
import express, { Express, Request, Response } from 'express';
import { NextServer } from 'next/dist/server/next';
import onHeaders from 'on-headers';
import { validateSecret } from 'req-handlers/validate-secret';
import { getNextBuildId, getNextServer } from 'next-utils';
import { handleInvalidatePathsReq } from 'req-handlers/invalidate-paths';
import { setCacheKey } from 'req-handlers/set-cache-key';
import { handleInvalidateAllReq } from 'req-handlers/invalidate-all';
import { handleGetPendingResponses } from 'req-handlers/pending-responses';
import { serverSetupDev } from 'server-setup/server-setup-dev';
import { logger } from 'srcCommon/logger';
import PageCacheHandler, { redisCache } from 'cache/page-cache-handler';
import {
addDecoratorUpdateListener,
getDecoratorVersionId,
} from '@navikt/nav-dekoratoren-moduler/ssr';
import { decoratorEnvProps } from 'srcCommon/decorator-utils-serverside';
// Set the no-cache header on json files from the incremental cache to ensure
// data requested during client side navigation is always validated if cached
// by browsers/proxies/CDNs etc
const setJsonCacheHeaders = (req: Request, res: Response) => {
onHeaders(res, () => {
res.setHeader('Cache-Control', 'no-cache');
});
};
export const serverSetup = async (expressApp: Express, nextApp: NextServer) => {
const jsonBodyParser = express.json();
const validateSecretMiddleware = validateSecret(nextApp);
const nextRequestHandler = nextApp.getRequestHandler();
const nextServer = await getNextServer(nextApp);
const currentBuildId = getNextBuildId(nextServer);
const decoratorVersionId = await getDecoratorVersionId(decoratorEnvProps);
if (!decoratorVersionId) {
logger.error('Failed to fetch decorator version id!');
}
await redisCache.init(currentBuildId, decoratorVersionId);
addDecoratorUpdateListener(decoratorEnvProps, (versionId) => {
logger.info(`New decorator version: ${versionId} - clearing render caches`);
redisCache.updateRenderCacheKeyPrefix(versionId);
new PageCacheHandler().clear();
});
logger.info(`Current build id: ${currentBuildId}`);
expressApp.post(
'/invalidate',
validateSecretMiddleware,
jsonBodyParser,
setCacheKey,
handleInvalidatePathsReq
);
expressApp.get(
'/invalidate/wipe-all',
validateSecretMiddleware,
setCacheKey,
handleInvalidateAllReq
);
expressApp.get('/api/pending', validateSecretMiddleware, handleGetPendingResponses(nextServer));
if (process.env.ENV === 'dev1' || process.env.ENV === 'dev2') {
serverSetupDev(expressApp, nextApp);
}
expressApp.get('/_next/data/:buildId/*.json', (req, res) => {
const { buildId } = req.params;
if (buildId !== currentBuildId) {
logger.info(`Expected build-id ${currentBuildId}, got ${buildId} on ${req.path}`);
req.url = req.url.replace(buildId, currentBuildId);
}
setJsonCacheHeaders(req, res);
return nextRequestHandler(req, res);
});
expressApp.all('*', (req, res) => {
return nextRequestHandler(req, res);
});
};