agent-ecosystem/src/features/recent-projects/main/adapters/input/ipc/registerRecentProjectsIpc.ts

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);
}