배경
#407 은 "WASM 코어에는 exportHwp 가 있는데 npm/editor Wrapper에서 editor.exportHwp is not a function 으로 호출 실패" 사례였습니다. 본질은 WASM ↔ JS Wrapper 사이 노출 갭 이었고 해당 이슈는 closed 됐습니다.
조사 결과 동일한 갭이 두 함수에서 추가로 재현됩니다.
정적 증거 (현재 상태)
| 레이어 |
exportHwp |
exportHwpx |
exportHwpVerify |
WASM #[wasm_bindgen] |
✅ src/wasm_api.rs:3441 |
✅ src/wasm_api.rs:3447 |
✅ src/wasm_api.rs:3466 |
RPC switch (rhwp-studio/src/main.ts) |
✅ L698 |
❌ 없음 → Unknown method: exportHwpx |
❌ 없음 |
Wrapper (npm/editor/index.js) |
✅ L164 |
❌ → editor.exportHwpx is not a function |
❌ |
타입 (npm/editor/index.d.ts) |
✅ L26 |
❌ |
❌ |
| README API 표 |
✅ L104 |
❌ |
❌ |
즉 #407 과 같은 패턴의 갭이 두 함수에서 동일하게 남아 있습니다.
작업 범위
WASM 측은 손대지 않고 노출 레이어만 메웁니다.
rhwp-studio/src/main.ts 의 RPC switch 에 case 'exportHwpx' / case 'exportHwpVerify' 추가
npm/editor/index.js 의 RhwpEditor 에 exportHwpx() / exportHwpVerify() 메서드 추가
npm/editor/index.d.ts 에 두 메서드 + HwpVerifyResult 인터페이스 추가
npm/editor/README.md API 표/예제 갱신
rhwp-studio/e2e/export-hwpx.test.mjs 신규 추가 (라운드트립 검증, fail-first 로 작성 후 통과 전환)
exportHwpVerify 는 WASM 이 JSON 문자열을 반환하므로 RPC 단계에서 JSON.parse 후 객체로 흘립니다 (Wrapper 사용자는 객체 그대로 사용).
검증
- e2e (
node e2e/export-hwpx.test.mjs) — 빨강(미구현 상태)에서 시작해 초록(구현 완료)으로 전환
cargo build / cargo test 회귀 없음
- 브라우저 콘솔에서
editor.exportHwpx() → Uint8Array (ZIP 매직 PK\x03\x04) 반환 확인
editor.exportHwpVerify() → {bytesLen, pageCountBefore, pageCountAfter, recovered} 객체 반환 확인
- exportHwpx 결과를 다시
loadFile 로 로드 → 페이지 수 일치(라운드트립)
후속 제안 (별도 이슈)
본 PR 의 패턴을 템플릿으로 다음 묶음을 동일하게 노출 가능합니다.
getDocumentInfo + getSourceFormat + getValidationWarnings (단순 getter 3종)
searchText + replaceText 계열
saveSnapshot / restoreSnapshot / discardSnapshot
배경
#407 은 "WASM 코어에는
exportHwp가 있는데 npm/editor Wrapper에서editor.exportHwp is not a function으로 호출 실패" 사례였습니다. 본질은 WASM ↔ JS Wrapper 사이 노출 갭 이었고 해당 이슈는 closed 됐습니다.조사 결과 동일한 갭이 두 함수에서 추가로 재현됩니다.
정적 증거 (현재 상태)
exportHwpexportHwpxexportHwpVerify#[wasm_bindgen]rhwp-studio/src/main.ts)Unknown method: exportHwpxnpm/editor/index.js)editor.exportHwpx is not a functionnpm/editor/index.d.ts)즉 #407 과 같은 패턴의 갭이 두 함수에서 동일하게 남아 있습니다.
작업 범위
WASM 측은 손대지 않고 노출 레이어만 메웁니다.
rhwp-studio/src/main.ts의 RPC switch 에case 'exportHwpx'/case 'exportHwpVerify'추가npm/editor/index.js의RhwpEditor에exportHwpx()/exportHwpVerify()메서드 추가npm/editor/index.d.ts에 두 메서드 +HwpVerifyResult인터페이스 추가npm/editor/README.mdAPI 표/예제 갱신rhwp-studio/e2e/export-hwpx.test.mjs신규 추가 (라운드트립 검증, fail-first 로 작성 후 통과 전환)exportHwpVerify는 WASM 이 JSON 문자열을 반환하므로 RPC 단계에서JSON.parse후 객체로 흘립니다 (Wrapper 사용자는 객체 그대로 사용).검증
node e2e/export-hwpx.test.mjs) — 빨강(미구현 상태)에서 시작해 초록(구현 완료)으로 전환cargo build/cargo test회귀 없음editor.exportHwpx()→Uint8Array(ZIP 매직PK\x03\x04) 반환 확인editor.exportHwpVerify()→{bytesLen, pageCountBefore, pageCountAfter, recovered}객체 반환 확인loadFile로 로드 → 페이지 수 일치(라운드트립)후속 제안 (별도 이슈)
본 PR 의 패턴을 템플릿으로 다음 묶음을 동일하게 노출 가능합니다.
getDocumentInfo+getSourceFormat+getValidationWarnings(단순 getter 3종)searchText+replaceText계열saveSnapshot/restoreSnapshot/discardSnapshot