diff options
Diffstat (limited to 'components/drm')
| -rw-r--r-- | components/drm/drmUtils.ts | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/components/drm/drmUtils.ts b/components/drm/drmUtils.ts index e0343535..4ba63090 100644 --- a/components/drm/drmUtils.ts +++ b/components/drm/drmUtils.ts @@ -64,3 +64,66 @@ export async function decryptWithServerAction(file: File): Promise<ArrayBuffer> return await file.arrayBuffer(); } } + +/** + * Buffer를 사용하여 복호화하는 함수 (서버 측 파일 처리용) + * @param fileBuffer - 복호화할 파일의 Buffer + * @param fileName - 원본 파일명 + * @returns 복호화된 Buffer + */ +export async function decryptBufferWithServerAction( + fileBuffer: Buffer, + fileName: string +): Promise<Buffer> { + try { + // Buffer를 Blob으로 변환하여 FormData에 추가 + const blob = new Blob([fileBuffer]); + const formData = new FormData(); + formData.append('file', blob, fileName); + + // 로컬 6543 포트에 drm-proxy 서버가 실행되고 있어야 함 + const backendUrl = "http://localhost:6543/api/drm-proxy/decrypt"; + + console.log(`[DRM] 파일 복호화 시도: ${fileName} (크기: ${fileBuffer.length} bytes)`); + + // POST 요청으로 파일을 file 이라는 키로 Body에 담아 전송하면, 복호화된 파일을 응답받음 + const response = await fetch(backendUrl, { + method: "POST", + body: formData, + }); + + if (!response.ok) { + const errorText = await response.text().catch(() => '응답 텍스트를 가져올 수 없음'); + throw new Error(`DRM 서버 응답 오류 [${response.status}]: ${errorText}`); + } + + // 응답을 ArrayBuffer로 받아서 Buffer로 변환 + const arrayBuffer = await response.arrayBuffer(); + const decryptedBuffer = Buffer.from(arrayBuffer); + console.log(`[DRM] 파일 복호화 성공: ${fileName} (결과 크기: ${decryptedBuffer.length} bytes)`); + + return decryptedBuffer; + } catch (error) { + // 오류 발생시 로깅하며, 폴백으로 복호화되지 않은 Buffer를 리턴 + const errorMessage = error instanceof Error + ? `${error.name}: ${error.message}` + : String(error); + + console.error(`[DRM] 복호화 오류: ${errorMessage}`, { + fileName: fileName, + fileSize: fileBuffer.length, + remark: ` + [정상 동작 안내] + DTS 개발 서버나 로컬 환경에서는 에러가 발생하는 것이 정상적인 동작입니다. + 이 경우 원본 Buffer가 그대로 반환됩니다. + + [발생 가능한 에러 케이스] + 1. DRM 백엔드 서버가 없는 경우 - CONNECTION_REJECTED 발생 + 2. DRM 중앙 서버와 통신 불가한 경우 - PARENT CERT 속성 추가 불가로 인한 백엔드측 500 에러 + `, + error + }); + + return fileBuffer; + } +}
\ No newline at end of file |
