실시간 녹음 + 타임스탬프 메모 + STT 전사 + LLM 구조화 회의록 + PDF/MD 내보내기. CaptionService 연동, 동시 사용 충돌 방지, 긴 회의 2-pass 요약 지원. DB 2테이블, IPC 15채널, UI 3뷰(목록/녹음/상세), 12개 locale i18n.
115 lines
4.2 KiB
TypeScript
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')
|
|
}
|