jz 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/wasi.js CHANGED
@@ -17,16 +17,35 @@
17
17
  * Create WASI import object for WebAssembly instantiation.
18
18
  * @param {object} [opts]
19
19
  * @param {function} [opts.write] - Custom write: (fd, text) => void
20
+ * @param {function} [opts.read] - Custom read: (fd, buf: Uint8Array) => bytesRead
20
21
  */
21
22
  export function wasi(opts = {}) {
22
23
  let mem = null
23
- const write = opts.write || ((fd, text) => {
24
- if (fd === 1) typeof process !== 'undefined' && process.stdout ? process.stdout.write(text) : console.log(text.replace(/\n$/, ''))
25
- else typeof process !== 'undefined' && process.stderr ? process.stderr.write(text) : console.warn(text.replace(/\n$/, ''))
26
- })
24
+ const fallbackWrite = (fd, text) => {
25
+ const stream = fd === 1 ? globalThis.process?.stdout : globalThis.process?.stderr
26
+ if (stream && typeof stream.write === 'function') {
27
+ try { stream.write(text); return }
28
+ catch {}
29
+ }
30
+ const msg = text.replace(/\n$/, '')
31
+ ;(fd === 1 ? console.log : console.warn)(msg)
32
+ }
33
+ const write = opts.write || fallbackWrite
27
34
 
28
35
  return {
29
36
  wasi_snapshot_preview1: {
37
+ fd_read(fd, iovs, iovs_len, nread) {
38
+ const dv = new DataView(mem.buffer)
39
+ let total = 0
40
+ for (let i = 0; i < iovs_len; i++) {
41
+ const ptr = dv.getUint32(iovs + i * 8, true)
42
+ const len = dv.getUint32(iovs + i * 8 + 4, true)
43
+ const buf = new Uint8Array(mem.buffer, ptr, len)
44
+ total += opts.read ? (opts.read(fd, buf) || 0) : 0
45
+ }
46
+ dv.setUint32(nread, total, true)
47
+ return 0
48
+ },
30
49
  fd_write(fd, iovs, iovs_len, nwritten) {
31
50
  const dv = new DataView(mem.buffer)
32
51
  let written = 0