d3ro-voice/src/main/ipc/meeting-mode-handlers.ts
Yun Chan d0c4f9ee53 Phase 14 구현: 회의 모드 (Meeting Mode)
실시간 녹음 + 타임스탬프 메모 + STT 전사 + LLM 구조화 회의록 + PDF/MD 내보내기.
CaptionService 연동, 동시 사용 충돌 방지, 긴 회의 2-pass 요약 지원.
DB 2테이블, IPC 15채널, UI 3뷰(목록/녹음/상세), 12개 locale i18n.
2026-04-08 01:16:52 +09:00

115 lines
4.2 KiB
TypeScript

// src/main/ipc/meeting-mode-handlers.ts
// Phase 14: Meeting Mode IPC 핸들러
import { ipcMain } from 'electron'
import { IPC_CHANNELS } from '@shared/ipc-channels'
import { ErrorCode, ipcSuccess, ipcError } from '@shared/errors'
import { getMeetingModeService } from '../services/MeetingModeService'
import { getLogger } from '../services/LoggerService'
import type {
MeetingAddMemoParams,
MeetingGetSessionsParams,
MeetingGetSessionParams,
MeetingDeleteSessionParams,
MeetingExportParams,
} from '@shared/types'
const logger = getLogger('meeting-mode-handlers')
export function registerMeetingModeHandlers(): void {
const ch = IPC_CHANNELS.MEETING_MODE
ipcMain.handle(ch.START_RECORDING, async () => {
try {
const result = await getMeetingModeService().startRecording()
return ipcSuccess(result)
} catch (err) {
logger.error(`startRecording 실패: ${err instanceof Error ? err.message : String(err)}`)
return ipcError(ErrorCode.MeetingAlreadyRecording, err instanceof Error ? err.message : String(err))
}
})
ipcMain.handle(ch.STOP_RECORDING, async () => {
try {
await getMeetingModeService().stopRecording()
return ipcSuccess(undefined)
} catch (err) {
logger.error(`stopRecording 실패: ${err instanceof Error ? err.message : String(err)}`)
return ipcError(ErrorCode.MeetingNotRecording, err instanceof Error ? err.message : String(err))
}
})
ipcMain.handle(ch.ADD_MEMO, async (_event, params: MeetingAddMemoParams) => {
try {
const memo = await getMeetingModeService().addMemo(params.content)
return ipcSuccess(memo)
} catch (err) {
logger.error(`addMemo 실패: ${err instanceof Error ? err.message : String(err)}`)
return ipcError(ErrorCode.MeetingNotRecording, err instanceof Error ? err.message : String(err))
}
})
ipcMain.handle(ch.GET_STATE, () => {
try {
return ipcSuccess(getMeetingModeService().getStateInfo())
} catch (err) {
return ipcError(ErrorCode.UnknownError, err instanceof Error ? err.message : String(err))
}
})
ipcMain.handle(ch.GET_SESSIONS, (_event, params: MeetingGetSessionsParams) => {
try {
return ipcSuccess(getMeetingModeService().getSessions(params.page, params.pageSize))
} catch (err) {
return ipcError(ErrorCode.UnknownError, err instanceof Error ? err.message : String(err))
}
})
ipcMain.handle(ch.GET_SESSION, (_event, params: MeetingGetSessionParams) => {
try {
return ipcSuccess(getMeetingModeService().getSession(params.sessionId))
} catch (err) {
return ipcError(ErrorCode.MeetingSessionNotFound, err instanceof Error ? err.message : String(err))
}
})
ipcMain.handle(ch.DELETE_SESSION, (_event, params: MeetingDeleteSessionParams) => {
try {
getMeetingModeService().deleteSession(params.sessionId)
return ipcSuccess(undefined)
} catch (err) {
return ipcError(ErrorCode.MeetingSessionNotFound, err instanceof Error ? err.message : String(err))
}
})
ipcMain.handle(ch.UPDATE_TITLE, (_event, params: { sessionId: string; title: string }) => {
try {
getMeetingModeService().updateTitle(params.sessionId, params.title)
return ipcSuccess(undefined)
} catch (err) {
return ipcError(ErrorCode.MeetingSessionNotFound, err instanceof Error ? err.message : String(err))
}
})
ipcMain.handle(ch.EXPORT_PDF, async (_event, params: MeetingExportParams) => {
try {
const filePath = await getMeetingModeService().exportPdf(params.sessionId)
return ipcSuccess(filePath)
} catch (err) {
logger.error(`exportPdf 실패: ${err instanceof Error ? err.message : String(err)}`)
return ipcError(ErrorCode.MeetingPdfFailed, err instanceof Error ? err.message : String(err))
}
})
ipcMain.handle(ch.EXPORT_MARKDOWN, async (_event, params: MeetingExportParams) => {
try {
const filePath = await getMeetingModeService().exportMarkdown(params.sessionId)
return ipcSuccess(filePath)
} catch (err) {
logger.error(`exportMarkdown 실패: ${err instanceof Error ? err.message : String(err)}`)
return ipcError(ErrorCode.MeetingExportFailed, err instanceof Error ? err.message : String(err))
}
})
logger.info('Meeting Mode IPC handlers registered')
}