@face-detector/report-processor
Version:
Face Detector Web SDK Report Processor Package
1 lines • 13.1 kB
Source Map (JSON)
{"version":3,"file":"index.cjs","sources":["../../types/dist/index.es.js","../src/ReportProcessor.ts"],"sourcesContent":["var i = /* @__PURE__ */ ((n) => (n.INITIALIZING = \"initializing\", n.READY = \"ready\", n.RUNNING = \"running\", n.MEASURING = \"measuring\", n.COMPLETED = \"completed\", n.FAILED = \"failed\", n))(i || {}), N = /* @__PURE__ */ ((n) => (n.WEB = \"web\", n.ANDROID = \"android\", n.IOS = \"ios\", n))(N || {}), I = /* @__PURE__ */ ((n) => (n.OPTION1 = \"option1\", n.OPTION2 = \"option2\", n.OPTION3 = \"option3\", n))(I || {});\nconst O = I;\nexport {\n I as FilterOption,\n N as Platform,\n i as ProcessState,\n O as fitlerOption\n};\n//# sourceMappingURL=index.es.js.map\n","import type { Report, FilteredReport } from '@face-detector/types';\r\nimport { FilterOption, Platform } from '@face-detector/types';\r\n\r\nexport class ReportProcessor {\r\n\r\n private _report: Report | FilteredReport;\r\n private _parsedReport: string | undefined;\r\n\r\n constructor(report: Report | FilteredReport) {\r\n this._report = report;\r\n this._parsedReport = undefined;\r\n }\r\n \r\n private set report(report: Report | FilteredReport) {\r\n this._report = report;\r\n }\r\n \r\n private set parsedReport(parsedReport: string | undefined) {\r\n this._parsedReport = parsedReport;\r\n }\r\n\r\n get report(): Report | FilteredReport {\r\n return this._report;\r\n }\r\n\r\n get parsedReport(): string | undefined {\r\n return this._parsedReport;\r\n }\r\n\r\n\r\n private detectEnvironment(): Platform {\r\n const ua = navigator.userAgent;\r\n\r\n const browser = /chrome|crios/i.test(ua)\r\n ? \"Chrome\"\r\n : /safari/i.test(ua) && !/chrome|crios/i.test(ua)\r\n ? \"Safari\"\r\n : /firefox/i.test(ua)\r\n ? \"Firefox\"\r\n : /edg/i.test(ua)\r\n ? \"Edge\"\r\n : \"Other\";\r\n \r\n const os = /windows/i.test(ua)\r\n ? \"Windows\"\r\n : /macintosh|mac os x/i.test(ua)\r\n ? \"MacOS\"\r\n : /android/i.test(ua)\r\n ? \"Android\"\r\n : /iphone|ipad|ipod/i.test(ua)\r\n ? \"iOS\"\r\n : \"Other\";\r\n \r\n const device = /mobile/i.test(ua)\r\n ? \"Mobile\"\r\n : /tablet/i.test(ua)\r\n ? \"Tablet\"\r\n : \"Desktop\";\r\n \r\n if ((os === \"Windows\" || os === \"MacOS\") || device === \"Desktop\") {\r\n return Platform.WEB;\r\n } else if (os === \"iOS\" || browser === \"Safari\") {\r\n return Platform.IOS;\r\n } else if (os === \"Android\") {\r\n return Platform.ANDROID;\r\n } else {\r\n return Platform.WEB;\r\n }\r\n }\r\n\r\n filterReportWithOptions(options: FilterOption[]): ReportProcessor {\r\n if (this.report === undefined) {\r\n throw new Error('Report is not defined');\r\n }\r\n // TODO: 리포트 필터링 로직 구현\r\n console.log('Filtering report with options:', options);\r\n return this;\r\n }\r\n\r\n parseReport(): ReportProcessor {\r\n // TODO: 리포트 파싱 로직 구현\r\n if (this.report === undefined) {\r\n throw new Error('Report is not defined');\r\n }\r\n const { rawData } = this.report;\r\n const { timestamps, sigR, sigG, sigB } = rawData;\r\n \r\n const lines = timestamps.map((timestamp: number, index: number) => {\r\n const r = sigR[index];\r\n const g = sigG[index];\r\n const b = sigB[index];\r\n return `${timestamp}\\t${r}\\t${g}\\t${b}`;\r\n });\r\n this.parsedReport = lines.join('\\n');\r\n return this;\r\n }\r\n\r\n createDownloadFunction(filename: string): () => void {\r\n if (this.report === undefined) {\r\n throw new Error('Report is not defined');\r\n }\r\n // TODO: 리포트 다운로드 함수 생성 로직 구현\r\n const platform = this.detectEnvironment();\r\n let downloadFunction: () => void;\r\n\r\n if (this.parsedReport === undefined) {\r\n this.parseReport();\r\n }\r\n\r\n switch (platform) {\r\n case Platform.WEB:\r\n downloadFunction = this.downloadFileInWeb(filename);\r\n break;\r\n case Platform.ANDROID:\r\n downloadFunction = this.downloadFileInAndroid(filename);\r\n break;\r\n case Platform.IOS:\r\n downloadFunction = this.downloadFileInIOS(filename);\r\n break;\r\n default:\r\n downloadFunction = this.downloadFileInWeb(filename);\r\n break;\r\n }\r\n return downloadFunction;\r\n }\r\n\r\n private downloadFileInWeb(filename: string):() => void {\r\n return () => {\r\n if (!this.parsedReport) {\r\n console.error('Parsed report is not available');\r\n return;\r\n }\r\n \r\n const blob = new Blob([this.parsedReport], { type: 'text/plain' });\r\n const url = URL.createObjectURL(blob);\r\n \r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.download = filename.endsWith('.txt') ? filename : `${filename}.txt`;\r\n a.style.display = 'none';\r\n \r\n document.body.appendChild(a);\r\n a.click();\r\n document.body.removeChild(a);\r\n \r\n URL.revokeObjectURL(url);\r\n };\r\n }\r\n\r\n private downloadFileInAndroid(filename: string):() => void {\r\n return () => {\r\n if (!this.parsedReport) {\r\n console.error('Parsed report is not available');\r\n return;\r\n }\r\n \r\n const finalFilename = filename.endsWith('.txt') ? filename : `${filename}.txt`;\r\n \r\n // Android WebView JavaScript Interface를 통한 다운로드\r\n if (typeof (window as any).AndroidBridge !== 'undefined') {\r\n try {\r\n (window as any).AndroidBridge.downloadFile(this.parsedReport, finalFilename);\r\n } catch (error) {\r\n console.error('Android download failed:', error);\r\n }\r\n } else {\r\n // Fallback: Web 방식으로 다운로드 시도\r\n console.warn('Android Bridge not available, falling back to web download');\r\n const blob = new Blob([this.parsedReport], { type: 'text/plain' });\r\n const url = URL.createObjectURL(blob);\r\n \r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.download = finalFilename;\r\n a.style.display = 'none';\r\n \r\n document.body.appendChild(a);\r\n a.click();\r\n document.body.removeChild(a);\r\n \r\n URL.revokeObjectURL(url);\r\n }\r\n };\r\n }\r\n\r\n private downloadFileInIOS(filename: string):() => void {\r\n return () => {\r\n if (!this.parsedReport) {\r\n console.error('Parsed report is not available');\r\n return;\r\n }\r\n \r\n const finalFilename = filename.endsWith('.txt') ? filename : `${filename}.txt`;\r\n \r\n // iOS WKWebView Message Handler를 통한 다운로드\r\n if (typeof (window as any).webkit !== 'undefined' && \r\n (window as any).webkit.messageHandlers && \r\n (window as any).webkit.messageHandlers.downloadFile) {\r\n try {\r\n (window as any).webkit.messageHandlers.downloadFile.postMessage({\r\n content: this.parsedReport,\r\n filename: finalFilename\r\n });\r\n } catch (error) {\r\n console.error('iOS download failed:', error);\r\n }\r\n } else {\r\n // Fallback: Web 방식으로 다운로드 시도 (Safari에서 동작)\r\n console.warn('iOS Message Handler not available, falling back to web download');\r\n const blob = new Blob([this.parsedReport], { type: 'text/plain' });\r\n const url = URL.createObjectURL(blob);\r\n \r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.download = finalFilename;\r\n a.style.display = 'none';\r\n \r\n document.body.appendChild(a);\r\n a.click();\r\n document.body.removeChild(a);\r\n \r\n URL.revokeObjectURL(url);\r\n }\r\n };\r\n }\r\n}"],"names":["N","n","WEB","ANDROID","IOS","constructor","report","__publicField","this","_report","_parsedReport","parsedReport","detectEnvironment","ua","navigator","userAgent","browser","test","os","device","Platform","filterReportWithOptions","options","Error","console","log","parseReport","rawData","timestamps","sigR","sigG","sigB","lines","map","timestamp","index","join","createDownloadFunction","filename","platform","downloadFunction","downloadFileInWeb","downloadFileInAndroid","downloadFileInIOS","error","blob","Blob","type","url","URL","createObjectURL","a","document","createElement","href","download","endsWith","style","display","body","appendChild","click","removeChild","revokeObjectURL","finalFilename","window","AndroidBridge","downloadFile","warn","webkit","messageHandlers","postMessage","content"],"mappings":"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"}