Skip to content

fix: better-sqlite3 로드 격리 및 13.0.3 업그레이드 - #24

Merged
kobenlys merged 2 commits into
developfrom
feature/better-sqlite3-v13
Sep 3, 2026
Merged

kobenlys merged 2 commits into
developfrom
feature/better-sqlite3-v13

Conversation

@kobenlys

@kobenlys kobenlys commented Sep 3, 2026 •

Copy link
Copy Markdown
Contributor

🏷️ 작업 유형

  • 🐛 버그 픽스
  • ✨ 개발
  • 📝 문서 추가 및 수정
  • ♻️ 리팩터링
  • 🔧 ETC

📋 변경 사항

#22 후속. OpenCode SQLite 조회 도입 시 함께 들어온 네이티브 의존성 리스크 2건을 정리한다.

1. 로드 실패 격리 (src/parsers/opencode.js)

import Database from 'better-sqlite3'가 정적 import라 index.js → parser.js → parsers/opencode.js 체인에서 시동 시 무조건 평가된다. 네이티브 모듈이라 ABI 불일치·빌드 부재로 로드가 실패할 수 있고, 그 경우 queryOpencodeRows의 try/catch에 도달하기 전에 프로세스가 죽는다. OpenCode를 쓰지 않는 사용자도 tokenphage --help조차 실행되지 않는다.

격리 대상인 try 블록 안에서 동적으로 불러오도록 옮겼다. parseOpencodeDatabase가 이미 await로 호출하므로 시그니처 변경은 없다.

2. better-sqlite3 11.10.0 → 13.0.3 (package.json, package-lock.json)

11.10.0 13.0.3
prebuild Node 18/20/22/23 (ABI 108/115/127/131) 플랫폼 8종 동봉, ABI 무관
네이티브 방식 ABI 고정 (node-addon-api 미사용) Node-API (NAPI_VERSION=10)
install 스크립트 prebuild-install || node-gyp rebuild 없음
npm install 소요 1분 (컴파일) 4초
  • 11.10.0은 현재 LTS인 Node 24와 최신 26에 prebuild가 없어 소스 컴파일로 넘어간다. 빌드 툴체인이 없는 사용자는 npm install -g 자체가 실패한다. CI에서도 이미 재현되고 있었다 — npm ci가 Node 20/22는 1초, Node 24는 1분.
  • 11.x는 ABI가 고정된다. scheduler.js의 resolve_node()가 실행 시점에 최신 node를 동적으로 찾는 설계라, 사용자가 node를 올리면 설치 당시 ABI로 굳은 바이너리를 물어와 매일 조용히 실패한다.
  • 의존성 37개 제거(prebuild-install 체인), node-addon-api 1개 추가.

3. 지원 Node 범위 정리 (package.json, .github/workflows/ci.yml)

  • engines: ^20.17.0 || ^22.13.0 || >=23.5.0 → ^22.14.0 || >=23.6.0
    • 13.0.3이 요구하는 Node-API v10의 하한(22.14.0+, 23.6.0+)에 맞춤
    • Node 20은 2026-04-30 EOL
  • CI matrix: ['20','22','24'] → ['22','24','26'] (engines와 일치)

✅ 테스트

  • npm test — 185/185 통과, 실패 0
  • npm run test:coverage — opencode.js 라인 100% / 분기 92.6%, 전체 95.67% (게이트 80%)
  • 로드 실패 격리 실측: node_modules/better-sqlite3/prebuilds/darwin-arm64.node 제거 후
    • tokenphage --help → 정상 종료 (rc=0)
    • parseOpencodeDatabase() → 예외 없이 빈 배열

정적 import는 index.js -> parser.js -> parsers/opencode.js 체인에서
프로세스 시동 시 무조건 평가된다. better-sqlite3는 네이티브 모듈이라
ABI 불일치나 빌드 부재로 로드 자체가 실패할 수 있는데, 그 경우
queryOpencodeRows의 try/catch에 도달하기 전에 프로세스가 죽는다.
OpenCode를 쓰지 않는 사용자도 tokenphage --help조차 실행되지 않는다.

격리 대상인 try 블록 안에서 동적으로 불러오도록 옮겼다.
parseOpencodeDatabase가 이미 await로 호출하므로 시그니처 변경은 없다.

검증: 네이티브 바인딩 파일을 제거한 상태에서
  - tokenphage --help  -> 정상 종료(rc=0)
  - parseOpencodeDatabase() -> 예외 없이 빈 배열
11.10.0은 prebuild가 Node 18/20/22/23(ABI 108/115/127/131)까지만 있어
현재 LTS인 Node 24와 최신인 26에서는 소스 컴파일로 넘어간다.
빌드 툴체인이 없는 사용자는 npm install -g 자체가 실패한다.
CI에서도 이미 재현되고 있었다 - npm ci가 Node 20/22는 1초, Node 24는 1분.

또 11.x는 node-addon-api를 쓰지 않아 ABI가 고정된다. scheduler가 실행
시점에 최신 node를 동적으로 찾는 설계라(resolve_node), 사용자가 node를
올리면 설치 당시 ABI로 굳은 바이너리를 물어와 매일 조용히 실패한다.

13.0.3은 Node-API(NAPI_VERSION=10) 기반이라 ABI에 무관하고, prebuild
8종(darwin/linux/linuxmusl/win32 x x64/arm64)을 패키지에 동봉해
install 스크립트도 네트워크 왕복도 없다.

- engines: Node-API v10 하한(22.14.0+, 23.6.0+)에 맞춰 조정
- CI matrix: engines와 일치시켜 20 제거, 26 추가
- 의존성 37개 제거(prebuild-install 체인), node-addon-api 1개 추가
- npm install 소요 1분 -> 4초
@kobenlys kobenlys self-assigned this Sep 3, 2026
@kobenlys
kobenlys merged commit c5dbb3c into develop Sep 3, 2026
4 checks passed
@kobenlys
kobenlys deleted the feature/better-sqlite3-v13 branch September 3, 2026 14:55
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant