zen-fs / emscripten

Emscripten backend for ZenFS
https://zen-fs.github.io/emscripten/
MIT License
2 stars 1 forks source link

Idea: Using WASMFS #2

Open atty303 opened 2 months ago

atty303 commented 2 months ago

Emscripten has an experimental WASM-based FS implementation in addition to the current JS-based FS implementation. The main difference that I am aware of is that JS-FS only allows synchronous processing, while WASM-FS allows asynchronous processing. If you can do asynchronous processing, you can use ZenFS's asynchronous API and avoid all the problems associated with synchronizing asynchronous APIs.

I have implemented WASMFS Backend which uses ZenFS asynchronous API in my project.

atty303/pob-web:packages/driver/src/c/wasmfs/nodefs_js.cpp

It is closely tied to the user project and is not cut out to be generic. However, we thought it would be beneficial to have a generic ZenFS (or Node asynchronous API) backend. I think its implementation would need to be coordinated with the Emscripten project. Not sure if this is ZenFS work, but I'll leave it as an idea.

james-pre commented 2 months ago

@atty303,

Could you elaborate more? "it would be beneficial to have a generic ZenFS (or Node asynchronous API) backend" is generic and ambiguous...

Do you mean a backend that uses another backend, and translates the calls to the ZenFS FileSystem?

atty303 commented 2 months ago
  1. Emscripten JS FS --[node:fs Sync API] --> ZenFS
  2. Emscripten WASMFS NodeFS Backend --[node:fs Async API]--> ZenFS

The current option is (1), but I meant that it would be nice to have (2). My implementation is (2), but I have made the Emscripten WASMFS NodeFS Backend part tightly coupled with the project. I said "generic" in the sense of making it loosely coupled and encapsulating it in the Emscripten side. Is this an explanation?

james-pre commented 2 months ago

So, you would like a C++ API for ZenFS? I think that would be really cool, though potentially a longer term goal. If your talking about a way to use ZenFS from Emscripten in general, src/plugin.ts has what you are looking for.