import { EventEmitter } from "eventemitter3"; import { TaskPriority, WorkerStatus, Task, TaskStatus } from "../types/index.js"; import { IWorker } from "../types/interfaces.js"; /** * 워커 초기화 옵션 */ export interface WorkerOptions { /** 워커 ID */ id: string; /** 워커 URL (웹 환경) */ url?: string; /** 워커 파일 경로 (Node.js 환경) */ file?: string; /** 워커 초기화 데이터 */ workerData?: any; /** 워커 메시지 큐 크기 제한 */ maxQueueSize?: number; } /** * 워커 어댑터 클래스 * 웹 워커와 Node.js 워커를 일관된 인터페이스로 제공 */ export declare class WorkerAdapter extends EventEmitter implements IWorker { /** 워커 ID */ readonly id: string; /** 웹 워커 인스턴스 */ private webWorker?; /** Node.js 워커 인스턴스 */ private nodeWorker?; /** 워커 상태 */ private _status; /** 메시지 처리 중 여부 */ private processing; /** 종료 여부 */ private terminated; /** 메시지 우선순위 큐 */ private messageQueue; /** 최대 큐 크기 */ private maxQueueSize; /** 워커 정보 */ info: { /** 상태 */ status: WorkerStatus; /** 태스크 수 */ tasks: number; /** 성능 정보 */ performance: { /** 평균 태스크 처리 시간 */ averageTaskTime: number; /** 완료한 태스크 수 */ completedTasks: number; /** 오류 발생 횟수 */ errors: number; }; }; /** 워커 유형 */ workerType: string; /** 워커 생성 시간 */ createdAt: number; /** 마지막 활동 시간 */ lastActiveAt: number; /** 현재 실행 중인 태스크 */ currentTask?: Task; /** * 워커 상태 속성 */ get state(): WorkerStatus; /** * 워커 어댑터 생성자 * @param options 워커 옵션 */ constructor(options: WorkerOptions); /** * 웹 워커 초기화 * @param url 워커 URL * @param workerData 초기화 데이터 */ private initWebWorker; /** * Node.js 워커 초기화 * @param file 워커 파일 경로 * @param workerData 초기화 데이터 */ private initNodeWorker; /** * 워커에 메시지 전송 * @param message 메시지 */ postMessage(message: any): void; /** * 우선순위 메시지 전송 * @param message 메시지 * @param priority 우선순위 */ postPrioritizedMessage(message: any, priority?: TaskPriority): void; /** * 메시지 큐 처리 */ private processMessageQueue; /** * 워커 종료 * @param force 강제 종료 여부 */ terminate(force?: boolean): Promise; /** * 태스크 시작 * @param task 시작할 태스크 */ startTask(task: Task): Promise; /** * 워커가 유휴 상태인지 확인 */ isIdle(): boolean; /** * 워커가 바쁜 상태인지 확인 */ isBusy(): boolean; /** * 워커가 사용 가능한지 확인 */ isAvailable(): boolean; /** * 태스크 상태 업데이트 * @param taskId 태스크 ID * @param status 새로운 상태 */ updateTaskStatus(taskId: string, status: TaskStatus): void; /** * 태스크 정보 가져오기 * @param taskId 태스크 ID */ getTask(taskId: string): Task | undefined; /** * 이벤트 리스너 등록 * @param event 이벤트 이름 * @param listener 리스너 함수 */ on(event: string | symbol, listener: (...args: any[]) => void): this; getId(): string; onMessage(callback: (message: any) => void): void; /** 워커가 종료되었는지 확인 */ isTerminated(): boolean; /** 마지막 활동 시간 가져오기 */ getLastActiveTime(): number; /** 메모리 사용량 가져오기 */ getMemoryUsage(): number; /** CPU 사용량 가져오기 */ getCPUUsage(): number; } /** * 워커 스크립트에 추가할 이벤트 스트림 처리 코드 */ export declare const streamHandlerCode = "\n// \uD65C\uC131 \uC2A4\uD2B8\uB9BC \uAD00\uB9AC\nconst activeStreams = new Set();\n\n// \uC2A4\uD2B8\uB9BC \uCC98\uB9AC \uD578\uB4E4\uB7EC\nfunction handleStreamMessage(message) {\n const { type, streamId, data } = message;\n \n if (!type || !streamId) return;\n \n switch (type) {\n case \"STREAM_INIT\":\n // \uC2A4\uD2B8\uB9BC \uCD08\uAE30\uD654\n activeStreams.add(streamId);\n \n // \uC900\uBE44 \uC644\uB8CC \uBA54\uC2DC\uC9C0 \uC751\uB2F5\n self.postMessage({\n type: \"STREAM_READY\",\n streamId,\n timestamp: Date.now()\n });\n break;\n \n case \"STREAM_MESSAGE\":\n // \uC2A4\uD2B8\uB9BC \uD65C\uC131 \uD655\uC778\n if (activeStreams.has(streamId)) {\n // \uB370\uC774\uD130 \uCC98\uB9AC \uBC0F \uC751\uB2F5\n // \uC2E4\uC81C \uAD6C\uD604\uC5D0\uC11C\uB294 \uB370\uC774\uD130 \uCC98\uB9AC \uB85C\uC9C1 \uCD94\uAC00\n self.postMessage({\n type: \"STREAM_MESSAGE\",\n streamId,\n data: data, // \uCC98\uB9AC\uB41C \uB370\uC774\uD130 \uBC18\uD658\n timestamp: Date.now()\n });\n }\n break;\n \n case \"STREAM_PAUSE\":\n // \uC2A4\uD2B8\uB9BC \uC77C\uC2DC \uC911\uC9C0 \uCC98\uB9AC\n if (activeStreams.has(streamId)) {\n // \uC77C\uC2DC \uC911\uC9C0 \uD655\uC778 \uC751\uB2F5\n self.postMessage({\n type: \"STREAM_PAUSE\",\n streamId,\n timestamp: Date.now()\n });\n }\n break;\n \n case \"STREAM_RESUME\":\n // \uC2A4\uD2B8\uB9BC \uC7AC\uAC1C \uCC98\uB9AC\n if (activeStreams.has(streamId)) {\n // \uC7AC\uAC1C \uD655\uC778 \uC751\uB2F5\n self.postMessage({\n type: \"STREAM_RESUME\",\n streamId,\n timestamp: Date.now()\n });\n }\n break;\n \n case \"STREAM_CLOSE\":\n // \uC2A4\uD2B8\uB9BC \uC885\uB8CC\n activeStreams.delete(streamId);\n break;\n }\n}\n\n// \uAE30\uC874 \uBA54\uC2DC\uC9C0 \uD578\uB4E4\uB7EC \uD655\uC7A5\nconst originalMessageHandler = self.onmessage;\n\nself.onmessage = function(event) {\n const message = event.data;\n \n // \uC2A4\uD2B8\uB9BC \uBA54\uC2DC\uC9C0 \uCC98\uB9AC\n if (\n message && \n typeof message === 'object' && \n message.type && \n message.type.startsWith('STREAM_')\n ) {\n handleStreamMessage(message);\n return;\n }\n \n // \uAE30\uC874 \uBA54\uC2DC\uC9C0 \uD578\uB4E4\uB7EC \uD638\uCD9C\n if (originalMessageHandler) {\n originalMessageHandler.call(self, event);\n }\n};\n";