continuwuity/packages/website/src/hooks.server.ts
2024-09-15 18:07:41 +01:00

61 lines
No EOL
2 KiB
TypeScript

import { sequence } from '@sveltejs/kit/hooks';
import { init as initSentry, handleErrorWithSentry, sentryHandle } from '@sentry/sveltekit';
import type { Handle } from "@sveltejs/kit";
import { randomBytes } from 'crypto';
import { SENTRY_DSN, SENTRY_REPORT_URL } from '$lib/config';
// import { nodeProfilingIntegration } from "@sentry/profiling-node";
initSentry({
dsn: SENTRY_DSN,
environment: import.meta.env.MODE,
tracesSampleRate: 1.0,
// profilesSampleRate: 1.0,
integrations: [
],
})
const securityHeaders = {
'X-Content-Type-Options': 'nosniff',
'X-XSS-Protection': '0',
"Referrer-Policy": "no-referrer-when-downgrade",
"Permissions-Policy": "payment=(), geolocation=(self), fullscreen=(self)",
'Cross-Origin-Embedder-Policy': 'require-corp',
'Cross-Origin-Opener-Policy': 'same-origin',
'Cross-Origin-Resource-Policy': 'same-origin',
'Report-To': '{"group":"csp-endpoint","max_age":10886400,"endpoints":[{"url":"' + SENTRY_REPORT_URL + '"}],"include_subdomains":true}',
}
export const handle: Handle = async (input) => {
const sentryNonce = randomBytes(16).toString('hex');
return await sequence(
sentryHandle({
// injectFetchProxyScript: false,
fetchProxyScriptNonce: sentryNonce,
}),
async ({ event, resolve }) => {
const response = await resolve(event);
const csp = response.headers.get("Content-Security-Policy");
if (csp) {
response.headers.set("Content-Security-Policy", csp.replace("script-src", "script-src 'nonce-" + sentryNonce + "'"));
}
Object.entries(securityHeaders).forEach(
([header, value]) => {
if (!response.headers.has(header)) {
response.headers.set(header, value)
}
}
);
response.headers.delete("x-sveltekit-page")
return response;
}
)(input)
}
export const handleError = handleErrorWithSentry();