server/util.ts (51 lines of code) (raw):
import type { IncomingMessage } from 'http';
import csrf from 'csurf';
import type {
Response as ExpressResponse,
NextFunction,
Request,
} from 'express';
export const CLIENTSIDE_CSRF_COOKIE_NAME = 'XSRF-TOKEN';
export const csrfSendTokenMiddleware = (
res: ExpressResponse,
req: Request,
next: NextFunction,
) => {
res.cookie(CLIENTSIDE_CSRF_COOKIE_NAME, req.csrfToken(), {
secure: true,
sameSite: 'strict',
});
next();
};
export const csrfValidateMiddleware = csrf({
cookie: {
key: '_csrf',
sameSite: true,
secure: true,
httpOnly: true,
},
});
export const handleError = (
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- assume we don't know the range of possible types for the error attribute?
error: any,
res: ExpressResponse,
next: NextFunction,
) => {
res.status(500).send({ status: 500, message: 'Internal service error' });
next(error);
};
export const mimicResponse = (
sourceResponse: IncomingMessage,
targetResponse: ExpressResponse,
) => {
if (sourceResponse.statusCode) {
targetResponse.status(sourceResponse.statusCode);
}
targetResponse.set(sourceResponse.headers);
};
export const jsonOrEmpty = async (response: Response) => {
try {
return await response.json();
} catch {
return {};
}
};