ES /docs

cupixworks-api TLS connection reset during video download — ECONNRESET

Fix Plan: TransferManager::downloadFile ECONNRESET

Changes#

cupixworks: packages/base/src/manager/transfer.manager.ts (NEW)#

  • What: @agents/base에 공통 파일 전송 유틸리티 모듈 생성. downloadFile(url, path, headers) (axios responseType: 'stream' + pipe to fs.createWriteStream) 및 uploadFile(url, path, headers) (fs.createReadStream + axios PUT) 함수를 export. axios 인스턴스에 retry interceptor 적용 — ECONNRESET, ETIMEDOUT, ECONNABORTED, EPIPE, EAI_AGAIN 및 HTTP 5xx에 대해 exponential backoff (base 1s, max 3회). aerial-map-service/src/code/src/common/axios.ts 패턴 참조. 명시적 timeout 60초 설정.
  • Why: 4개 agent의 downloadFile/uploadFile이 deprecated request 라이브러리를 사용하며 거의 동일한 코드를 반복. @agents/base에 이미 axios@^1.6.5 의존성이 있으므로 추가 설치 불필요.
  • Lines: 새 파일 (~60줄)

cupixworks: packages/base/src/index.ts#

  • What: 새로 만든 transfer.manager 모듈을 re-export 추가 (export * from './manager/transfer.manager')
  • Why: 4개 agent에서 import { downloadFile, uploadFile } from '@agents/base'로 사용하기 위함
  • Lines: 기존 export 목록 끝에 1줄 추가

cupixworks: packages/cupix-capture-3d-reconstruction-agent/src/manager/transfer.manager.ts#

  • What: import * as request from 'request' 제거. downloadFile, uploadFile 메서드를 @agents/base의 공통모듈 함수 호출로 대체. checkStatusCode를 명시적 isRetryable 로직으로 변경 (RETRYABLE_CODES 배열 + HTTP 5xx). retryTask 로그 레벨을 logger.debuglogger.info로 변경. retry 간격을 고정 Constants.RetryInterval에서 exponential backoff (1000 * Math.pow(2, task.retryCount - 1))로 변경. failTask에 error.code, error.message 로깅 추가.
  • Why: deprecated request 제거 + retry 개선 + 모니터링 가시성 향상
  • Lines: 50-85 (downloadFile), 87-109 (uploadFile), 170-193 (checkStatusCode/retryTask), 160-168 (failTask)

cupixworks: packages/cupix-capture-postprocessor-agent/src/manager/transfer.manager.ts#

  • What: 동일 패턴 적용 — request@agents/base 공통모듈, checkStatusCodeisRetryable, retryTask 로그 info + exponential backoff, failTask 에러 상세 로깅
  • Why: 동일 근본 원인 — deprecated request + 부적절한 retry 로직
  • Lines: 44-79 (File/download), 81-107 (uploadFile), 168-191 (checkStatusCode/retryTask), 158-166 (failTask)

cupixworks: packages/cupix-capture-preprocessor-agent/src/manager/transfer.manager.ts#

  • What: 동일 패턴 적용 — request@agents/base 공통모듈, retry 개선, 로깅 개선. 단, 이 agent는 download npm 패키지도 사용하므로 downloadFile만 교체 대상 (download 패키지 사용 메서드는 이번 범위에서 제외)
  • Why: 동일 근본 원인
  • Lines: 50-85 (downloadFile), 87-109 (uploadFile), 170-193 (checkStatusCode/retryTask), 160-168 (failTask)

cupixworks: packages/cupix-tesla-room-agent/src/manager/transfer.manager.ts#

  • What: 동일 패턴 적용 — request@agents/base 공통모듈, retry 개선, 로깅 개선
  • Why: 동일 근본 원인
  • Lines: 39-74 (downloadFile), 76-98 (uploadFile), 159-182 (checkStatusCode/retryTask), 149-157 (failTask)

Acceptance Criteria#

  • 4개 agent의 transfer.manager.ts에서 import * as request from 'request' 구문이 없음
  • packages/base/src/manager/transfer.manager.ts가 존재하며 downloadFile, uploadFile 함수를 export
  • 공통모듈의 axios 인스턴스에 retry interceptor가 적용되어 있음 (ECONNRESET, ETIMEDOUT, ECONNABORTED, EPIPE, EAI_AGAIN + HTTP 5xx)
  • 공통모듈에 명시적 timeout 설정 (60초)
  • 4개 agent의 retryTask 로그가 logger.info 레벨
  • 4개 agent의 retry 간격이 exponential backoff (고정 10초가 아님)
  • 4개 agent의 checkStatusCode가 명시적 retryable 조건으로 변경됨
  • packages/base/src/index.ts에서 transfer.manager를 export
  • tsc --noEmit(또는 typecheck) 통과

Tests#

  • 기존 테스트: @agents/base에 manager/*.spec.ts 존재하나 transfer.manager에 대한 기존 테스트 없음
  • 신규 테스트: 이번 범위에서 추가하지 않음 (기존 코드에도 테스트 없는 패턴)