80 lines
2.3 KiB
TypeScript
80 lines
2.3 KiB
TypeScript
import { type Instrumentation } from 'next';
|
|
|
|
const isEnabledInDev = process.env.ENABLE_LOCAL_JOBS === 'true';
|
|
|
|
export async function register() {
|
|
const { registerMonitoringInstrumentation } = await import(
|
|
'@kit/monitoring/instrumentation'
|
|
);
|
|
|
|
// Register monitoring instrumentation
|
|
// based on the MONITORING_PROVIDER environment variable.
|
|
await registerMonitoringInstrumentation();
|
|
|
|
// Register lightweight in-process job scheduler
|
|
await registerJobScheduler();
|
|
}
|
|
|
|
/**
|
|
* @name onRequestError
|
|
* @description This function is called when an error occurs during the request lifecycle.
|
|
* It is used to capture the error and send it to the monitoring service.
|
|
* @param err
|
|
*/
|
|
export const onRequestError: Instrumentation.onRequestError = async (err) => {
|
|
const { getServerMonitoringService } = await import('@kit/monitoring/server');
|
|
|
|
const service = await getServerMonitoringService();
|
|
|
|
await service.ready();
|
|
await service.captureException(err as Error);
|
|
};
|
|
|
|
async function registerJobScheduler() {
|
|
const isProd = process.env.NODE_ENV === 'production';
|
|
if (!isProd && !isEnabledInDev) {
|
|
console.info('Job scheduler disabled');
|
|
return;
|
|
}
|
|
|
|
// Prevent duplicate intervals on hot reloads/dev
|
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
const globalAny = globalThis as any;
|
|
if (globalAny.__mrJobSchedulerInitialized) {
|
|
console.info('Job scheduler already initialized');
|
|
return;
|
|
}
|
|
globalAny.__mrJobSchedulerInitialized = true;
|
|
|
|
let isRunning = false;
|
|
|
|
const runSyncAnalysisResults = async () => {
|
|
if (isRunning) {
|
|
console.info('Scheduled job syncAnalysisResults skipped: previous run still in progress');
|
|
return;
|
|
}
|
|
isRunning = true;
|
|
try {
|
|
try {
|
|
const { default: loadEnv } = await import('./app/api/job/handler/load-env');
|
|
loadEnv();
|
|
} catch {
|
|
// ignore if not available or already loaded
|
|
}
|
|
|
|
const { default: syncAnalysisResults } = await import(
|
|
'./app/api/job/handler/sync-analysis-results'
|
|
);
|
|
await syncAnalysisResults();
|
|
} catch (error) {
|
|
console.error('Scheduled job syncAnalysisResults failed:', error);
|
|
} finally {
|
|
isRunning = false;
|
|
}
|
|
};
|
|
|
|
// Run every 10 minutes
|
|
setTimeout(runSyncAnalysisResults, 15_000);
|
|
setInterval(runSyncAnalysisResults, 10 * 60 * 1000);
|
|
}
|