Repository navigation
Support WebAssembly.instantiateStreaming #21130
Description
Activity
- addeddiscussIssues opened for discussion and feedback.Issues opened for discussion and feedback.feature requestIssues requesting new Node.js features.Issues requesting new Node.js features.
on Jun 5, 2018 - addedc++Issues and PRs that require attention from people who are familiar with C++.Issues and PRs that require attention from people who are familiar with C++.v8 engineIssues and PRs related to the V8 dependency.Issues and PRs related to the V8 dependency.
on Jun 5, 2018 The design of instantiateStreaming currently requires
Responseto perform proper checks for stuff like mimes and whatnot. While node could implement instantiateStreaming possibly taking a node Stream object i don't think its worth splintering the wasm api between browsers and node. For some reasons i won't go into here node might gain a Response object anyway (and we're already working on mimes over in #21128) so once we get that stuff in this could be done.Reacted by Shingo InoueWhile I understand that implementing WebAssembly for isomorphism might be good, but, for native modules, we already have Native and N-API addons. This would just be throwing another one into the mix.
@AyushG3112 we already support wasm, this would just be adding another method of loading it.
Reacted by Ayush Gupta@devsnek ah, I did not know that. Nevermind my comment then, and thanks!
What is the use case besides feature parity with browsers?
WebAssembly.instantiateStreaming()seems of limited usefulness in Node.js. LikewiseWebAssembly.compileStreaming().ex.
instantiateStreaming(fs.promises.readFile('./some.wasm'), importObject)That would be fairly straightforward to implement but I share @devsnek's sentiment that we shouldn't diverge from browsers lightly.
For some reasons i won't go into here node might gain a Response object
Pray tell!
@devsnek @bnoordhuis I totally agree.
I think it should be implemented the same API as browser.Okay, but can you speak to your use case? As I said, I don't really see when or why you'd use it with Node.js.
Reacted by Joakim L. Christiansen@bnoordhuis My use case is image processor what work on browser and Node.js implemented by WebAssembly.
And small wrapper for loading it.BTW, I think we decide to implement Fetch API or not prior to start this discussion.
It already discussing in this issue: #19393 (comment)image processor what work on browser and Node.js implemented by WebAssembly
I can see why you'd load it in streaming fashion in a browser but why in Node.js? If it's an on-disk file, just load it in one go.
@bnoordhuis
Personally, The most important reason is portability.
I want to use instantiateStreaming because Google recommended way of loading WebAssembly to use WebAssembly.*Streaming.
But cannot use instantiateStreaming if planned to run both Node.js and browser.Reacted by Sindre SorhusWhat if the WebAssembly loading and instantiation is done is a separate worker and posted to the main thread?
Also FYI https://github.com/wasm-tool/node-loader. I know that @bmeck is working a multi-threaded loading which would fit well to this use case.
11 remaining items
👀
Reacted by Shingo Inoue and Milan Raj- added a commit that references this issue
on Apr 23, 2022 - added a commit that references this issue
on Apr 25, 2022 - added a commit that references this issue
on Apr 28, 2022
I think it's better support
WebAssembly.instantiateStreaming.It makes more easy to use WebAssembly and we can get more compatibility for Web.
It already implemented in Google Chrome, Firefox and some browsers.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/instantiateStreaming
instantiateStreamingalready exists indeps/v8/src/wasm/wasm-js.ccbut cannot cover this branch.node/deps/v8/src/wasm/wasm-js.cc
Lines 1177 to 1182 in de73272
To cover this branch, we must call
SetWasmCompileStreamingCallback.node/deps/v8/include/v8.h
Line 7805 in de73272
node/deps/v8/src/api.cc
Lines 8876 to 8877 in de73272
In chromium, implemented here:
https://github.com/chromium/chromium/blob/51459d663d841c6430747aec97be9f7e7a7ca41f/third_party/blink/renderer/bindings/core/v8/v8_wasm_response_extensions.cc#L194-L222
And use it here:
https://github.com/chromium/chromium/blob/51459d663d841c6430747aec97be9f7e7a7ca41f/third_party/blink/renderer/bindings/core/v8/v8_wasm_response_extensions.cc#L228
Why we must inject the actual implementation,
It's said that this is for layering reasons.
WebAssembly/design#1085
Discussion
instantiateStreamingcompatible with design.instantiateStreaming(fs.promises.readFile('./some.wasm'), importObject)Buffer, notArrayBuffer.