ES /docs

FloorplanService::downloadFile | path: /tmp/workspace/88414/88414.jpg, error: {"errno":-110,"code":"

Fix Plan: FloorplanService::downloadFile ETIMEDOUT (errno -110, syscall read)

Changes#

cupixworks: applications/agents/packages/cupix-tesla-floorplan-agent/src/floorplan-service.ts#

  • What: downloadFileWithHeader 내부의 request.get(...) 기반 다운로드 본문을 @agents/basedownloadFile(url, path, headers) 호출로 교체한다. 메서드의 외부 시그니처와 호출 지점은 그대로 두고, 다음 흐름을 유지한다:
    1. setErrorCode(ErrorCode.Agent.FailedToDownloadOriginalFiles) 보존
    2. cupixAuth.checkToken() 선행 호출 보존
    3. headers 미지정 시 { 'X-CUPIX-AUTH': cupixAuth.accessToken } 기본값 적용 (현재 분기 그대로)
    4. 다운로드 실패 시 cupixAuth.handleError(err)로 변환해 reject (현재 동작 보존)
    5. 시작/완료 debug 로그 (FloorplanService::downloadFile | start ..., ... | complete path: ..., size: ...) 유지
    6. 실패 시 error 로그 형식 FloorplanService::downloadFile | path: %s, error: %s (cluster fingerprint 보존을 위해 메시지 형식을 그대로 유지)
  • What (import 정리): 파일 상단 import에서 * as request from 'request' 제거하고, @agents/base 에서 downloadFile을 추가로 import. 이미 존재하는 uploadFile import에 콤마로 합친다.
  • Why: RCA(### 즉시 조치 (Critical)) — 현재 request.get 호출은 timeout 옵션이 없어 OS TCP read timeout(~15분)까지 워커를 점유한 뒤 ETIMEDOUT으로 종료된다. @agents/base.downloadFileREQUEST_TIMEOUT_MS = 60000 + RETRYABLE_CODES(ETIMEDOUT 포함) + exponential backoff 재시도를 내장하므로, 마이그레이션만으로 본 클러스터의 근본 원인을 제거하고 develop의 uploadFile 패턴(TSLA-13233)과 일관성을 맞춘다.
  • Lines: 약 1-12(import) 및 237-276(downloadFileWithHeader 본문). 라인 수 net 변경량 ≤ 30라인.

Acceptance Criteria#

  • applications/agents/packages/cupix-tesla-floorplan-agent/src/floorplan-service.ts 안에서 request.get( 검색 결과 0건.
  • 동일 파일 안에서 from 'request' 또는 from "request" import 0건 (* as request from 'request' import 삭제 확인).
  • @agents/base import 라인에 downloadFile이 포함된다 (uploadFile와 함께).
  • downloadFileWithHeader 메서드 본문에서 @agents/basedownloadFile(url, path, headers) 호출이 1회 존재한다.
  • cupixAuth.checkToken() 호출과 cupixAuth.handleError(...)를 통한 에러 변환 흐름이 보존된다 (메서드 안에서 두 호출 모두 존재).
  • headers === undefined일 때 { 'X-CUPIX-AUTH': cupixAuth.accessToken } 기본값을 적용하는 분기가 유지된다.
  • floorplan-service.ts:51 (run), :76-80, :92-95this.downloadFileWithHeader(...) 두 호출 지점은 변경되지 않는다 (외부 호출 시그니처 보존).
  • pnpm exec eslint applications/agents/packages/cupix-tesla-floorplan-agent/src/floorplan-service.ts 결과 신규 lint 에러 0건.

Tests#

  • 기존 테스트: floorplan-agent 패키지에는 floorplan-service 단위 테스트가 존재하지 않음 (spec/, *.spec.ts, *.test.ts 부재 확인). 본 변경에 신규 테스트는 추가하지 않는다 — 기능 동작은 develop 트리에서 이미 사용 중인 @agents/base.downloadFile(episode 68df229b에서 추가된 100% coverage 유틸)에 위임된다.
  • Lint: cd applications/agents && pnpm exec eslint packages/cupix-tesla-floorplan-agent/src/floorplan-service.ts
  • Typecheck: cd applications/agents/packages/cupix-tesla-floorplan-agent && pnpm typecheck (best-effort — 과거 episode 68df229b에서 monorepo tsc --build 가 pre-existing 에러로 실패한 사례가 있음).