问题标签 [wasm-bindgen]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
793 浏览

javascript - Rust wasm:返回两个 `Uint8Array`

当我编写一个返回一个的函数时js_sys::Uint8Array(在 Rust 中):

然后使用 编译它wasm-pack,然后从 js/typescript 端以这种方式调用 wasm 函数:

结果 pubKey 正确地转换为Uint8Arrayby typescript。

现在,我怎样才能Uint8Array从 rust 函数返回两个 s 并让它们正确地转换到Uint8Arraytypescript 端?


我尝试了以下事情:

  • 将两个Uint8Arrays 放入一个结构并从gen_keypair()

这甚至没有编译,因为js_sys::Uint8Array没有实现IntoWasmAbi

  • *const Uint8Arrays 放入这个结构中,然后从gen_keypair()

这不起作用,因为*const Uint8Array它只是一个数字。在打字稿方面,它没有实现所有的方法Uint8Array

  • 创建一个既实现IntoWasmAbi又包含足够信息的类型,以便在内存中找到Uint8Array' 的内容,从打字稿端重新创建它:

在这里,我不确定如何访问当前 wasm 实例的内存缓冲区(来自 rust来自 typescript),我需要重新创建原始Uint8Arrays

  • 其他的东西,比如返回元组,Uint8Arrays的数组,但没有任何成功
0 投票
2 回答
5912 浏览

rust - 尝试在 Wasm 堆中保存字符串然后将指针保存到结构中的字符串时出现“RuntimeError:内存访问越界”

我试图Uint8Array在编码后将字符串保存在 Wasm 堆中,并将指向字符串的指针和长度保存在 Struct 中,以便以后可以访问该字符串。下面是我的代码rust

我的 JS 端代码如下:

理想情况下,它应该打印给定的字符串,但它会显示一些不相关的垃圾值。无法弄清楚出了什么问题,因为我对 rust 和 wasm 还很陌生。

这是我在运行此程序时收到的控制台消息,有时是内存错误。 控制台日志

0 投票
0 回答
642 浏览

typescript - 汇总:从外部模块捆绑/嵌入 wasm 代码

使用汇总,我试图捆绑一个打字稿库,该库导入和调用一个包含 wasm 文件的 npm 模块。

只有生成的包不包含任何 wasm 文件内容的痕迹。如何强制它也捆绑 webassembly?


这是我尝试过的关键文件:

我的 package.json 是

最后汇总配置是

(完整的示例 repo 可在https://github.com/nmrshll/ed25519获得)

然后通过以下方式生成捆绑包node node_modules/.bin/rollup -c

它包含一个function _loadWasmModule (sync, src, imports)但从未被调用的,并且没有嵌入 webassembly 的痕迹(我希望它是一个硬编码的 base64 字符串)。

我怎样才能解决这个问题 ?


编辑:“ed25519-raw”wasm-pack中包含的 wasm 文件是使用选项生成的--target web

这很重要,因为wasm-pack使用该选项--target browser(默认)运行会生成不同的输出(嵌入了 wasm 但编译问题)

0 投票
1 回答
134 浏览

rust - 如何为 web_sys::HtmlElement::from 函数设置特征绑定

使用e_textof typeweb_sys::HtmlDivElemente_buttonof typeweb_sys::HtmlButtonElement这个函数构建一个 on_click 回调的闭包。编译运行正常。

下一步是泛化并web_sys::HtmlElement::from进入buildCbClosure函数,但还没有找到e捕捉到这一点的 traitbound。尝试过类似下面的方法,这显然是一个From错误方向的特征。另一个方向就像来自 的不同子类型的一般向上转换web_sys::HtmlElement


给出:

0 投票
1 回答
742 浏览

rust - 使用 wasm-pack 构建时在 Rust 和 JavaScript 之间传递字符串

我正在构建一个 Chrome 扩展程序,并选择使用一些 WebAssembly 功能。我使用 wasm-pack 来构建源代码,因为它提供了一个--target web降低插入 Wasm 函数的复杂性的方法。在 Rust 和 JS 之间传递整数值可以无缝地工作,但我似乎无法将字符串传递给 Rust,反之亦然。

这是我正在使用的内容:

更新:有关我如何导入和实例化 wasm 的更多信息

在使用 wasm-pack 构建并将生成的 pkg 目录导入我的 JS 文件夹之后。我通过 manifest.json 文件将 pkg 目录的内容作为 web_resource 提供给项目。

这是我在 content_script.js 中加载脚本的方式

我还注意到我生成的 wasm_bg 文件在底部有一些 Rust 错误输出。 wasm_bg 中的错误输出

0 投票
2 回答
97 浏览

web-audio-api - 使用优化级别 02 和 03 编译 Wasm 模块以加载到 AudioWorlet?

我正在尝试编译一个带有额外优化的 .wasmmodule.js,以便在 AudioWorklet 中运行。

我使用 .post.js 文件将“导出默认模块”附加到已编译的 Wasm,使用 --post-js 编译标志。这适用于 01 优化,这是工作集设计模式示例中使用的当前编译配置。

我遇到了优化标志 02 和 03 的编译问题,因为我需要使用默认导出加载 Wasm。

如果我评论 --post.js 导出,编译运行良好,优化级别为 02 或 03。但是,我们无法将 Wasm 加载到工作集中,但有以下例外:

例如“加载工作集时出错:SyntaxError: 请求的模块 '../../build/m.wasmmodule.js' 不提供名为 'default 的导出

我尝试了不同的组合,但我无法克服这一点。

如果我可以尝试任何不同的配置,有什么想法吗?

非常感谢

0 投票
1 回答
603 浏览

promise - Rust/Webassembly/wasm-bindgen - 从 `js_sys' Promise 中获取值

出于好奇,我正在玩wasm-bindgenhttps://github.com/rustwasm/wasm-bindgen )。

在玩Navigatorweb_sys板条箱)时,我偶然发现了这种方法:

https://docs.rs/web-sys/0.3.36/web_sys/struct.MediaDevices.html#method.enumerate_devices

它返回一个Result<Promise, JsValue>..now,我是 Rust 的新手,我的问题是如何获取 的值Promise

效果如何Closure::wrap?如何使用then方法来获取结果?

我想知道是否有人可以这么好心地向我解释如何处理Promise

这是一个返回 a 的示例Promise

一切顺利,卢卡

0 投票
1 回答
278 浏览

rust - 为什么调用从 JavaScript 编译为 Wasm 的异步 Rust 函数时字符串参数为空?

我正在使用用 wasm-pack 构建的 wasm_bindgen。我有一个向 JS 公开的 Rust 函数:

在 HTML / JavaScript 中,我调用 Rust 函数:

启动应用程序时,单击Send按钮将调用我的 Rust 函数,但两个String参数似乎都是空白/丢失。

这是上面函数的控制台跟踪:

我不确定我在这里做错了什么。我应该改变从 JavaScript 调用 Rust 函数的方式吗?

这是重现的完整代码示例

0 投票
1 回答
416 浏览

rust - 如何从异步块中更改变量值而不获取它的所有权

我对 rust 很陌生,尝试使用 rust 和 wasm-bindgen 制作一个带有 web 组件的小游戏。我有一个事件监听器,它监听按键,并通过流返回一个方向。然后我想根据方向变量的值每 500 毫秒向画布元素绘制一些东西。

我的问题是我无法direction从异步块中改变变量,并在 Interval 闭包中使用它。

在 async 块和 Interval 闭包中使用move关键字可以编译代码,但是方向在间隔函数内永远不会改变。我认为方向变量然后被复制到块/闭包中,因为Direction枚举实现了Copy特征。

我已经包含了我的入口点函数的简化版本:

我的问题是;我可以将变量可变地借入异步块吗?我可以在不拥有它的情况下让它活得足够长吗?

提前致谢,

0 投票
0 回答
159 浏览

wasm-bindgen - 是否有更有效的方法来遍历 wasm-bindgen 中的 js 对象数组?

这是我的 wasm-bindgen 代码:

这是相同的 JS 代码:

但是 wasm-bindgen 版本慢了 2 倍。我明白为什么 - 因为我使用serde.

是否有更有效的方法来遍历对象数组wasm-bindgen