标签: wasm-bindgen

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

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

只有生成的包不包含 wasm 文件内容的痕迹。我怎样才能强制它也捆绑 webassembly?


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

// typescript/src/index.ts

import * as libEd from "ed25519-raw";

export const seed_from_phrase = libEd.seed_from_phrase;
export const gen_keypair = libEd.gen_keypair;
Run Code Online (Sandbox Code Playgroud)

我的 package.json 是

{
  "name": "ed25519",
  "version": "0.1.0",
  "description": "ed25519",
  "main": "typescript/dist/bundle.cjs.js",
  "types": "typescript/src/index.ts",
  "dependencies": {
    "ed25519-raw": "git+https://github.com/cmanteiga/ed25519-raw"
  },
  "devDependencies": {
    "@types/node": "^13.7.1",
    "typescript": "^3.7.5",
    "@rollup/plugin-commonjs": "^11.0.2",
    "@rollup/plugin-multi-entry": "^3.0.0",
    "@rollup/plugin-node-resolve": "^7.1.1",
    "@rollup/plugin-wasm": "^3.0.0",
    "rollup": "^1.31.1",
    "rollup-plugin-typescript2": "^0.26.0"
  }
}
Run Code Online (Sandbox Code Playgroud)

最后汇总配置是

{
  "name": "ed25519",
  "version": "0.1.0",
  "description": "ed25519",
  "main": "typescript/dist/bundle.cjs.js",
  "types": …
Run Code Online (Sandbox Code Playgroud)

rollup typescript webassembly wasm-bindgen

6
推荐指数
0
解决办法
508
查看次数

如何使用 wasm-bindgen 调用作为模块的 JavaScript 函数?

我正在尝试使用 Rust 中的 Web3 JavaScript 库,但我陷入了困境。该库的标准用法始于:

// In Node.js use: const Web3 = require('web3');

let web3 = new Web3(Web3.givenProvider || "ws://localhost:8545");
Run Code Online (Sandbox Code Playgroud)

您应该导入的模块是一个构造函数,它还有一些其他属性。我的 Rust 代码应该绑定这个 API,如下所示:

#[wasm_bindgen(module = "web3")]
extern "C" {
    type Web3;

    #[wasm_bindgen(constructor)]
    fn new(_: &Provider) -> Web3;

    type Provider;

    static givenProvider: Provider;
}
Run Code Online (Sandbox Code Playgroud)

最终输出import { Web3, givenProvider } from 'web3';并尝试运行new Web3(...)失败。它应该执行诸如import * as Web3 from 'web3';运行new Web3(...)和引用之类的操作Web3.givenProvider

我怎样才能让 wasm-bindgen 输出这样的代码?

rust webassembly wasm-bindgen

6
推荐指数
1
解决办法
2406
查看次数

如何使用 Rust 在 webview 中加载 WASM 模块?

我正在尝试在webview中托管一个 React 应用程序,它使用已编译的 Rust -> WebAssembly 模块。

我收到此错误:

Unhandled promise rejection: TypeError: URL is not valid or contains user credentials.
Run Code Online (Sandbox Code Playgroud)

WASM 模块在组件之一中被调用:

const { mymod } = require("../../wasm/mymod");
Run Code Online (Sandbox Code Playgroud)

然后我使用 webpack 将其全部打包。

const webpackConfig = {
  entry: "./frontend/bootstrap.js",
  output: {
    path: path.resolve(__dirname, "dist"),
    filename: "bundle.js",
  },
  mode: "development",
  module: {
    rules: [
    ]
  },
  plugins: [
    new HtmlWebPackPlugin({
      template: "./frontend/index.html"
    }),
    new MiniCssExtractPlugin(),
  ]
};
Run Code Online (Sandbox Code Playgroud)

然后我将其加载到 webview 中:

fn main() {
    let html = format!(r#"...");

    web_view::builder()
        .title("my app")
        .content(Content::Html(html))
        .size(320, …
Run Code Online (Sandbox Code Playgroud)

webview rust reactjs webassembly wasm-bindgen

5
推荐指数
0
解决办法
942
查看次数

当 webpack 加载 wasm 模块内存时,如何访问它

我正在努力追随

如何在 WebAssembly 中从 Rust 返回字符串(或类似的字符串)?

它允许访问 wasm 模块内的字符串数据。

我曾经wasm-pack build构建过 RUST 模块,我可以访问导出的方法,但不能直接访问内存。

webpack 生成的 JavScript 有一个方法可以让我读取字符串

function getStringFromWasm(ptr, len) {
    return cachedTextDecoder.decode(getUint8Memory().subarray(ptr, ptr + len));
}
Run Code Online (Sandbox Code Playgroud)

但如果我将这个生成的 .js 文件破解为

export function getStringFromWasm(ptr, len)
Run Code Online (Sandbox Code Playgroud)

我可以访问 RUST 代码返回的字符串。

如何配置 webpack 代码生成器以提供类似的访问权限,或者以其他方式公开模块的exports.memory

Webpack 似乎没有给我模块本身的处理。.wasm我找不到加载webpack 生成的文件的方法WebAssembly.instantiateStreaming(),因为它似乎依赖于其他生成的文件。

webpack webpack-dev-server wasm-bindgen

5
推荐指数
0
解决办法
353
查看次数

当 Rust wasm_bindgen 对象被添加到向量中时,该对象在 JS 端变为 null

我有两个导出到 Javascript 的结构。我可以创建实例并在 JavaScript 中使用它们,不会出现任何错误,但是当我将实例推入 Rust 端的向量时,出现错误“未捕获错误:空指针传递给 rust”

由于所有权已更改,JS 对象变为 null 是完全正常的,但我还需要保留 JavaScript 对象以便在 JavaScript 端更改内容。

有没有正确的方法来保持“vect”对象不为空并接受更改?

我添加了一个工作示例。您可以在浏览器的控制台中看到错误。

Rust 代码

use wasm_bindgen::prelude::*;

#[wasm_bindgen]
struct Vector3 {
    x: f32,
    y: f32,
    z: f32,
}

#[wasm_bindgen]
impl Vector3 {
    #[wasm_bindgen(constructor)]
    pub fn new() -> Vector3 {
        return Vector3 {
            x: 0.0,
            y: 0.0,
            z: 0.0,
        };
    }
    pub fn get_x(&self) -> f32 {
        self.x
    }
}

#[wasm_bindgen(extends = Object)]
struct Group {
    list: Vec<Vector3>,
}

#[wasm_bindgen]
impl Group {
    #[wasm_bindgen(constructor)] …
Run Code Online (Sandbox Code Playgroud)

rust webassembly wasm-bindgen

5
推荐指数
1
解决办法
1597
查看次数

如何摆脱 wasm_bindgen 包装结构中的生命周期

目前我有一些类似于以下的代码:

// Lifetime of child is enforced to be valid as far as Parent is valid
struct Child<'a> {
    some_data : i32,
    phantom_lifetime: PhantomData<&'a Parent>
}

struct Parent {

}

#[wasm_bindgen]
pub struct Foo<'a> {
    parent: Parent,
    children: Vec<Child<'a>>
}
Run Code Online (Sandbox Code Playgroud)

现在的问题是我必须摆脱生命周期,Foo因为wasm_bindgen不允许这样做。

直观上,生命周期应该仅通过 struct 的创建来强制执行Foo。然而编译器还是要求我提供生命周期。

无论如何,我不知道如何实现这一点。有人可以帮助我吗?

rust wasm-bindgen

5
推荐指数
0
解决办法
864
查看次数

无效或意外的令牌“导入” - jest/babel/webpack

我有一个 Rust 库,我正在尝试交叉编译并打包到 npm 脚本中。我一直在关注wasm包的使用过程。该过程构建了 es6 js,我编写了一些粗略的测试,然后决定尝试使用 jest 作为测试运行程序,因为我在另一个项目中使用它,没有什么问题。

我在尝试运行测试时遇到这个问题

    /Users/nsh/WebstormProjects/wasm-ed25519ph/pkg/index_bg.wasm:1
    ({"Object.<anonymous>":function(module,exports,require,__dirname,__filename,global,jest){


    SyntaxError: Invalid or unexpected token

    > 1 | import * as wasm from './index_bg.wasm';
Run Code Online (Sandbox Code Playgroud)

我运行笑话

jest --config ./jest.config.json --detectOpenHandles --debug
Run Code Online (Sandbox Code Playgroud)

笑话调试配置输出

{
  "configs": [
    {
      "automock": false,
      "browser": false,
      "cache": true,
      "cacheDirectory": "/var/folders/w1/hmxby_9x2h18qmm4fbgq3x1m0000gn/T/jest_dx",
      "clearMocks": false,
      "coveragePathIgnorePatterns": [
        "/node_modules/"
      ],
      "detectLeaks": false,
      "detectOpenHandles": true,
      "errorOnDeprecated": false,
      "filter": null,
      "forceCoverageMatch": [],
      "globals": {
        "NODE_ENV": "test"
      },
      "haste": {
        "providesModuleNodeModules": []
      },
      "moduleDirectories": [
        "node_modules",
        "pkg"
      ],
      "moduleFileExtensions": [
        "js"
      ], …
Run Code Online (Sandbox Code Playgroud)

javascript webpack jestjs wasm-bindgen wasm-pack

5
推荐指数
1
解决办法
1034
查看次数

如何使用 Vec&lt;T&gt; 作为返回类型并使用 wasm_bindgen 使其在 Javascript 中可读

我想编译以下代码。

use wasm_bindgen::prelude::*;

#[wasm_bindgen]
pub struct Dummy {}

#[wasm_bindgen]
pub fn test() -> Vec<Dummy> {
    vec![]
}
Run Code Online (Sandbox Code Playgroud)

但是,编译器不允许我这样做。

error[E0277]: the trait bound `std::boxed::Box<[Dummy]>: wasm_bindgen::convert::traits::IntoWasmAbi` is not satisfied
  --> xxxx
   |
XX | #[wasm_bindgen]
   | ^^^^^^^^^^^^^^^ the trait `wasm_bindgen::convert::traits::IntoWasmAbi` is not implemented for `std::boxed::Box<[Dummy]>`
   |
   = help: the following implementations were found:
             <std::boxed::Box<[f32]> as wasm_bindgen::convert::traits::IntoWasmAbi>
             <std::boxed::Box<[f64]> as wasm_bindgen::convert::traits::IntoWasmAbi>
             <std::boxed::Box<[i16]> as wasm_bindgen::convert::traits::IntoWasmAbi>
             <std::boxed::Box<[i32]> as wasm_bindgen::convert::traits::IntoWasmAbi>
           and 9 others
   = note: required because of the requirements on the impl of `wasm_bindgen::convert::traits::IntoWasmAbi` for `std::vec::Vec<Dummy>` …
Run Code Online (Sandbox Code Playgroud)

rust wasm-bindgen

5
推荐指数
1
解决办法
853
查看次数

如何在 WASM-Bindgen 和 Rust 中实际获取响应正文的文本

也许这是一个简单的问题,但我还没有在任何地方找到答案。我已经搜索了文档,但是我在整个互联网上找到的用于 web-sys fetch 的单个示例仍然没有解决这个问题(官方文档也同样如此)。

如何从 web-sys 请求中获取响应正文?它具有 JsFutures 和展开的所有开销,而且我实际上似乎无法找到正确的方法来将我的数据放入字符串中。我只是尝试从(localhost dev)服务器检索文件,然后将其解析为 WebGL 程序的顶点着色器,但我什至无法获取它的字符串或以任何方式从中读取。

rust wasm-bindgen

5
推荐指数
1
解决办法
2209
查看次数

Rust/Web assembly/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

let window = web_sys::window().expect("no global `window` exists");
let navigator = window.navigator();

if let Ok(devs) = navigator.media_devices() {
   if let Ok(prom) = devs.enumerate_devices() {
        //..??? how to list all devices 
   }
}
Run Code Online (Sandbox Code Playgroud)

祝你一切顺利,卢卡

promise rust webassembly wasm-bindgen

5
推荐指数
1
解决办法
1765
查看次数