Update Next.js configuration and improve Sentry integration
- Added `serverExternalPackages` to the Next.js configuration to exclude Node-only packages from the webpack bundle, enhancing compatibility with React's RSC/client boundary. - Refactored Sentry initialization and exception capturing to be asynchronous, ensuring proper handling of the Sentry DSN and preventing potential issues during Next.js builds. - Updated the `Toaster` component import in the layout to improve UI consistency.
This commit is contained in:
@@ -1,17 +1,23 @@
|
||||
import * as Sentry from '@sentry/node';
|
||||
import { env } from './env';
|
||||
|
||||
let initialized = false;
|
||||
|
||||
export function initWebuiSentry(): void {
|
||||
if (initialized || !env.SENTRY_DSN) {
|
||||
export async function initWebuiSentry(): Promise<void> {
|
||||
if (initialized) {
|
||||
return;
|
||||
}
|
||||
const dsn = process.env.SENTRY_DSN?.trim();
|
||||
if (!dsn) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Import only when a DSN is configured. Loading `@sentry/node` at module
|
||||
// scope patches Node builtins and can break Next.js page-data collection
|
||||
// (`createContext is not a function`) during `next build`.
|
||||
const Sentry = await import('@sentry/node');
|
||||
Sentry.init({
|
||||
dsn: env.SENTRY_DSN,
|
||||
environment: env.NODE_ENV,
|
||||
dsn,
|
||||
environment: process.env.NODE_ENV ?? 'production',
|
||||
release: 'nexumi-webui@0.1.0',
|
||||
tracesSampleRate: env.NODE_ENV === 'production' ? 0.1 : 1.0,
|
||||
tracesSampleRate: process.env.NODE_ENV === 'production' ? 0.1 : 1.0,
|
||||
initialScope: {
|
||||
tags: { service: 'webui' }
|
||||
}
|
||||
@@ -19,10 +25,15 @@ export function initWebuiSentry(): void {
|
||||
initialized = true;
|
||||
}
|
||||
|
||||
export function captureWebuiException(error: unknown, context?: Record<string, unknown>): void {
|
||||
if (!env.SENTRY_DSN) {
|
||||
export async function captureWebuiException(
|
||||
error: unknown,
|
||||
context?: Record<string, unknown>
|
||||
): Promise<void> {
|
||||
const dsn = process.env.SENTRY_DSN?.trim();
|
||||
if (!dsn) {
|
||||
return;
|
||||
}
|
||||
const Sentry = await import('@sentry/node');
|
||||
Sentry.withScope((scope) => {
|
||||
if (context) {
|
||||
scope.setExtras(context);
|
||||
|
||||
Reference in New Issue
Block a user