1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
/**
* drmUtils.ts
* 1. 복호화 엔드포인트 (/api/drm/decrypt)를 사용하는 함수
* 2. 복호화 서버액션을 제공한다.
*
* decryptWithServerAction(file): 서버액션을 사용하여 복호화한 파일을 응답하는 함수
* decryptWithRoute(file): 라우트를 사용하여 복호화한 파일을 응답하는 함수 (클라이언트용 함수는 drmClientUtils.ts에 구현됨)
*
*/
'use server';
// 서버 액션을 사용하여 복호화하는 함수
export async function decryptWithServerAction(file: File): Promise<ArrayBuffer> {
try {
const formData = new FormData();
formData.append('file', file);
// 로컬 6543 포트에 drm-proxy 서버가 실행되고 있어야 함
const backendUrl = "http://localhost:6543/api/drm-proxy/decrypt";
// 로깅은 스프링 자체적으로도 진행하지만(log 파일), 필요시 db 액션을 호출해 eVCP 데이터베이스에 저장
console.log(`[DRM] 파일 복호화 시도: ${file.name} (크기: ${file.size} bytes, 타입: ${file.type})`);
// 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로 받아서 리턴함
const data = await response.arrayBuffer();
console.log(`[DRM] 파일 복호화 성공: ${file.name} (결과 크기: ${data.byteLength} bytes)`);
return data;
} catch (error) {
// 오류 발생시 로깅하며, 폴백으로 복호화되지 않은 파일을 리턴
const errorMessage = error instanceof Error
? `${error.name}: ${error.message}`
: String(error);
console.error(`[DRM] 복호화 오류: ${errorMessage}`, {
fileName: file.name,
fileSize: file.size,
fileType: file.type,
remark: 'DTS 개발 서버라면 에러 발생이 정상입니다. (DRM 백엔드 없어서 CONNECTION_REJECTED 발생) 에러 발생시 원본 arrayBuffer를 그대로 리턴합니다.',
error
});
return await file.arrayBuffer();
}
}
// decryptWithRoute 함수는 클라이언트용이므로 drmClientUtils.ts로 이동함
// 클라이언트에서는 'components/drm/drmClientUtils'의 decryptWithRoute를 사용할 것
|