JavaScript-Wasm Bridge — WebAssembly

JavaScript ↔ Wasm Bridge WebAssembly dan JavaScript berkomunikasi melalui mekanisme imports dan exports. Memahami bridge ini krusial karena ini adalah…

JavaScript ↔ Wasm Bridge

WebAssembly dan JavaScript berkomunikasi melalui mekanisme imports dan exports. Memahami bridge ini krusial karena ini adalah "gerbang" antara dua dunia.

Exports: Wasm → JavaScript

;; WAT: export fungsi dan memory
(module
  (memory (export "memory") 1)  ;; 1 page = 64KB

  (func $multiply (param $a i32) (param $b i32) (result i32)
    local.get $a
    local.get $b
    i32.mul
  )
  (export "multiply" (func $multiply))
)
// JavaScript memanggil fungsi Wasm
const { instance } = await WebAssembly.instantiateStreaming(
  fetch("module.wasm")
);

const result = instance.exports.multiply(6, 7);
console.log(result); // 42

// Akses memory Wasm dari JS
const memory = new Uint8Array(instance.exports.memory.buffer);
console.log(memory.length); // 65536 (64KB)

Imports: JavaScript → Wasm

;; WAT: import fungsi dari JavaScript
(module
  (import "env" "log" (func $log (param i32)))
  (import "env" "getTime" (func $getTime (result f64)))

  (func $benchmark (export "benchmark")
    ;; Panggil JS function dari Wasm
    call $getTime
    drop
    i32.const 42
    call $log
  )
)
// Sediakan import object saat instantiate
const importObject = {
  env: {
    log: (value) => console.log("Dari Wasm:", value),
    getTime: () => performance.now(),
  },
};

const { instance } = await WebAssembly.instantiateStreaming(
  fetch("module.wasm"),
  importObject
);

instance.exports.benchmark();

Passing Strings

Wasm hanya mengerti angka (i32, i64, f32, f64). Untuk string, kamu harus encode ke memory buffer:

// Tulis string ke Wasm memory
function writeString(instance, str) {
  const memory = new Uint8Array(instance.exports.memory.buffer);
  const encoder = new TextEncoder();
  const encoded = encoder.encode(str);
  // Tulis ke offset tertentu di linear memory
  memory.set(encoded, 0);
  return { ptr: 0, len: encoded.length };
}

// Baca string dari Wasm memory
function readString(instance, ptr, len) {
  const memory = new Uint8Array(instance.exports.memory.buffer);
  const decoder = new TextDecoder();
  return decoder.decode(memory.slice(ptr, ptr + len));
}

Tips

Yang akan kamu pelajari