63 lines
1.8 KiB
TypeScript
63 lines
1.8 KiB
TypeScript
import {
|
|
GET_DASHBOARD_RECENT_PROJECTS,
|
|
normalizeDashboardRecentProjectsPayload,
|
|
} from '@features/recent-projects/contracts';
|
|
import { createLogger } from '@shared/utils/logger';
|
|
|
|
import type { RecentProjectsFeatureFacade } from '@features/recent-projects/main/composition/createRecentProjectsFeature';
|
|
import type { IpcMain } from 'electron';
|
|
|
|
const logger = createLogger('Feature:RecentProjects:IPC');
|
|
|
|
function getPayloadBytes(value: unknown): number {
|
|
try {
|
|
return Buffer.byteLength(JSON.stringify(value), 'utf8');
|
|
} catch {
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
function getMemoryDiagnostics(): {
|
|
rssBytes: number;
|
|
heapUsedBytes: number;
|
|
heapTotalBytes: number;
|
|
} {
|
|
const memory = process.memoryUsage();
|
|
return {
|
|
rssBytes: memory.rss,
|
|
heapUsedBytes: memory.heapUsed,
|
|
heapTotalBytes: memory.heapTotal,
|
|
};
|
|
}
|
|
|
|
export function registerRecentProjectsIpc(
|
|
ipcMain: IpcMain,
|
|
feature: RecentProjectsFeatureFacade
|
|
): void {
|
|
ipcMain.handle(GET_DASHBOARD_RECENT_PROJECTS, async () => {
|
|
const startedAt = Date.now();
|
|
try {
|
|
const payload = normalizeDashboardRecentProjectsPayload(
|
|
await feature.listDashboardRecentProjects()
|
|
) ?? {
|
|
projects: [],
|
|
degraded: true,
|
|
};
|
|
logger.info('dashboard recent-projects IPC loaded', {
|
|
count: payload.projects.length,
|
|
degraded: payload.degraded,
|
|
durationMs: Date.now() - startedAt,
|
|
payloadBytes: getPayloadBytes(payload),
|
|
...getMemoryDiagnostics(),
|
|
});
|
|
return payload;
|
|
} catch (error) {
|
|
logger.error('Failed to load dashboard recent projects via IPC', error);
|
|
return { projects: [], degraded: true };
|
|
}
|
|
});
|
|
}
|
|
|
|
export function removeRecentProjectsIpc(ipcMain: IpcMain): void {
|
|
ipcMain.removeHandler(GET_DASHBOARD_RECENT_PROJECTS);
|
|
}
|