WebAssembly 런타임
WASM 런타임은 실험적 확장 기능입니다. 설정은 안정적이나, 런타임 내부 구현은 릴리스 간에 변경될 수 있습니다.
Wippy는 WebAssembly 모듈을 Lua 코드와 함께 일급 레지스트리 엔트리로 실행합니다. WASM 함수와 프로세스는 동일한 스케줄러 내에서 실행되고, 동일한 보안 모델을 공유하며, 함수 레지스트리를 통해 Lua와 상호 운용됩니다.
엔트리 종류
| Kind | Description |
|---|---|
function.wat |
YAML에서 정의된 인라인 WebAssembly Text 형식 함수 |
function.wasm |
파일시스템 엔트리에서 로드된 사전 컴파일된 WASM 바이너리 |
process.wasm |
프로세스로 실행되는 WASM 바이너리 (CLI 명령 또는 장기 실행) |
동작 방식
- WASM 모듈은
_index.yaml에서 레지스트리 엔트리로 선언됩니다 - 부팅 시 모듈이 컴파일되어 워커 풀에 배치됩니다
- Lua (또는 다른 WASM) 코드가
funcs.call()을 통해 호출합니다 - 인자와 반환값은 Lua 테이블과 WIT 타입 간에 자동으로 매핑됩니다
- 비동기 작업 (I/O, sleep, HTTP)은 Lua와 동일하게 디스패처를 통해 양보(yield)합니다
컴포넌트 모델
Wippy는 WIT (WebAssembly Interface Types)를 사용하는 WebAssembly 컴포넌트 모델을 지원합니다. 컴포넌트 모듈은 호스트와 게스트 간에 완전한 타입 매핑을 제공합니다:
- Record는 이름이 있는 필드를 가진 Lua 테이블로 매핑됩니다
- List는 Lua 배열로 매핑됩니다
- Result는
(value, error)반환 튜플로 매핑됩니다 - 프리미티브 (
s32,f64,string등)는 직접 매핑됩니다
명시적 WIT 시그니처를 사용하는 Raw/Core WASM 모듈도 지원됩니다.
Lua에서 WASM 호출하기
WASM 함수는 레지스트리의 다른 함수와 동일한 방식으로 호출됩니다:
local funcs = require("funcs")
-- No arguments
local result, err = funcs.call("myns:answer_wat")
-- With arguments
local result, err = funcs.call("myns:compute", 6, 7)
-- With complex data
local users = {
{id = 1, name = "Alice", tags = {"admin"}, active = true},
{id = 2, name = "Bob", tags = {"user"}, active = false},
}
local transformed, err = funcs.call("myns:transform_users", users)
보안
WASM 실행은 기본적으로 호출자의 보안 컨텍스트를 상속합니다:
- 액터 아이덴티티가 상속됩니다
- 스코프가 상속됩니다
- 요청 컨텍스트가 상속됩니다
호스트 기능은 명시적 임포트를 통해 옵트인됩니다. 각 엔트리는 필요한 WASI 인터페이스 (wasi:cli, wasi:filesystem 등)를 정확히 선언하여 모듈의 접근 범위를 제한합니다.