프로젝트 소개
qzjs는 C 애플리케이션을 위해 플랫폼 추상화 계층(PAL)을 탑재한 임베디드 QuickJS-ng 런타임을 제공합니다. 자체 내부 스레드에서 libuv 이벤트 루프와 함께 완전한 ES2023 엔진을 구동하므로, 호스트 측에서 이벤트 루프를 직접 펌핑해야 하는 필요성을 없앱니다. 이 런타임은 fetch, console, crypto.subtle, ReadableStream, setTimeout, fs, URL, TextEncoder 등을 포함한 21개의 WinterTC 호환 모듈을 구현합니다.
주요 기능:
- ES2023을 지원하며, 지연 WAMR 초기화 후 중앙값 기준 약 4.82ms의 빠른 시작 속도와 낮은 메모리 사용량을 특징으로 합니다
- libuv 기본 실행 구조: qzjs가 자체 내부 스레드와 libuv 루프를 소유하므로, 호스트가 JS에 직접 접근하지 않습니다
- mbedTLS를 통한 스트리밍 HTTP/TLS를 지원하며, 청크 전송 디코딩과 인증서 검증 기능을 포함합니다
- 압축(miniz), 암호화(mbedTLS), 텍스트 코덱(UTF-8/Base64), WebAssembly(기본 WAMR, 대체 옵션 wasm3)을 위한 네이티브 확장 기능을 제공합니다
- 디스크 기반 소프트 일시중단/재개 기능을 갖춘 다중 컨텍스트 실행을 지원합니다. Web Worker는 실제 병렬 스레드 또는 격리된 프로세스로 구동되며, 다중 프로세스 M-P2 마일스톤 이후로 후자가 기본 설정입니다
- JSON 기반의 스레드 안전한 호스트 ↔ 런타임 메시징을 지원하며, 호스트 측에서는 qz_post_message / message_cb를, JS 측에서는 postMessage/onmessage 인터페이스를 사용합니다
- WinterTC Web API를 직접 실행하기 위한 독립 실행형 CLI 바이너리를 제공하며, Node.js API는 포함하지 않습니다
- 라이브러리에 DAP 단계별 디버거가 내장되어 있으며, -DQZ_BUILD_DEBUGGER=ON 옵션으로 활성화할 수 있습니다
- GoogleTest 기반의 포괄적인 테스트 스위트를 제공하며, 결정론적 오프라인 테스트를 위한 mock_libuv, 오프라인·네트워크·벤치마크·test262로 구분된 라벨 기반 테스트 카테고리를 지원합니다
빌드 시스템은 CMake를 기반으로 하며, 선택적 확장 기능을 위한 QZ_WITH_* 형태의 기능 토글, 최소/표준 빌드 프로필, 테스트·예제·디버거를 위한 빌드 타겟을 제공합니다. 모든 의존성(QuickJS-ng, libuv, mbedTLS, miniz, WAMR, wasm3)은 엄격한 C99 표준 준수 하에서 git 서브모듈로서 소스로부터 직접 빌드됩니다. 폴리필 재구축에는 esbuild, urlpattern-polyfill, @ungap/structured-clone, web-streams-polyfill 등의 npm 개발 의존성이 사용되지만, 이들은 최종 바이너리에 포함되지 않습니다.
아키텍처: 호스트 애플리케이션은 스레드 안전한 JSON 메시징을 통해 qz_t 런타임과 통신합니다. 런타임은 libuv 루프, JSContext, I/O 브릿지와 함께 자체 스레드에서 구동됩니다. 기본 설정(QZ_PROCESS_MODEL=ISOLATED)에서는 호스트와 런타임이 별도 프로세스로 동작하며, 크래시 격리를 위해 소켓페어 위에서 FlatBuffers 프레이밍된 엔벨로프를 통해 통신합니다. MIT 라이선스로 제공됩니다.
Comments
0 Rating appears after 10 ratings
Sign in to join the discussion.