标签: webassembly

如何在 TypeScript 中将 Astro 与 WASM 结合使用

我想在我的 Astro 应用程序中使用我用 Rust 编写的 Web-Assembly 模块。我正在使用 TypeScript 和以下内容astro.config.mjs

import { defineConfig } from "astro/config";
import wasm from "vite-plugin-wasm";
import topLevelAwait from "vite-plugin-top-level-await";

import tailwind from "@astrojs/tailwind";
import react from "@astrojs/react";

export default defineConfig({
  integrations: [wasm(), tailwind(), react()],
  vite: {
    plugins: [wasm(), topLevelAwait()],
  },
});
Run Code Online (Sandbox Code Playgroud)

在文件中使用 wasm 的代码functions.ts如下所示:

import { greet } from "dices";

export function hello(): void {
  let g: string = greet();
  console.log(g);
}
Run Code Online (Sandbox Code Playgroud)

类型检查一切正常,但是在运行时npm run dev遇到以下错误:

error   WebAssembly.instantiate(): BufferSource argument is …
Run Code Online (Sandbox Code Playgroud)

reactjs webassembly wasm-pack vite astrojs

3
推荐指数
1
解决办法
1165
查看次数

如何从 wasm 返回一个元组到前端?

我是网络组装新手。我想使用 canvas 和 来创建一个简单的贪吃蛇游戏wasm_bindgen

我的生锈代码:

#[wasm_bindgen]
impl CanvasData {
    pub fn index_to_coordinate(&self, index: usize) -> (usize, usize) {
      (index % self.cell_count, index / self.cell_count)
    }
}
Run Code Online (Sandbox Code Playgroud)

CanvasData是一个保存画布数据的结构体,cell_count属性为usizetype,代表方形画布上水平和垂直格子的数量。这里我把画布上所有的网格从左到右、从上到下看成一个一维数组。该方法的目的是将数组索引映射到x、y坐标。我想返回一个元组并在前端调用它,如下所示:

const [x, y] = canvasData.index_to_coordinate(100)
Run Code Online (Sandbox Code Playgroud)

然而,在构建过程中出现了错误。

构建脚本:

wasm-pack build -t web
Run Code Online (Sandbox Code Playgroud)

错误:

error[E0277]: the trait bound `(usize, usize): IntoWasmAbi` is not satisfied
[0]   --> src\lib.rs:16:1
[0]    |
[0] 16 | #[wasm_bindgen]
[0]    | ^^^^^^^^^^^^^^^ the trait `IntoWasmAbi` is not implemented for `(usize, usize)`
[0]    |
[0] …
Run Code Online (Sandbox Code Playgroud)

frontend rust webassembly wasm-bindgen wasm-pack

3
推荐指数
1
解决办法
768
查看次数

找不到全局类型 CallableFunction

这是一个基本汇编脚本项目。但我在 tsconfig.json 文件中遇到此错误消息。

{
    "extends": "assemblyscript/std/assembly.json",
    "include": [
    "./**/*.ts"
] 
}
Run Code Online (Sandbox Code Playgroud)

这是我的 package.json

{
   "devDependencies": {
   "assemblyscript": "^0.27.1"
}
Run Code Online (Sandbox Code Playgroud)

typescript webassembly assemblyscript

3
推荐指数
1
解决办法
373
查看次数

Golang 到 wasm 编译

我使用以下命令将 Golang 代码编译为 wasm

GOOS=js GOARCH=wasm go build -o main.wasm
Run Code Online (Sandbox Code Playgroud)

尝试使用 wasmtime 执行时出现以下错误

wasmtime main.wasm 
Error: failed to run main module `main.wasm`

Caused by:
    0: failed to instantiate "main.wasm"
    1: unknown import: `go::debug` has not been defined

Run Code Online (Sandbox Code Playgroud)

当使用 wasm3 执行时,我得到

wasm3 main.wasm 
Error: function lookup failed ('_start')
Run Code Online (Sandbox Code Playgroud)

这些错误意味着什么以及如何修复它们?

go webassembly

3
推荐指数
1
解决办法
1574
查看次数

调用从 Wasmtime 返回字符串的 WASM 函数

在较高级别上,我尝试创建一个 Rust 主机程序,该程序在运行时使用 Wasmtime 加载 WASM 模块并调用返回字符串的 WASM 函数。我可以使用数字类型(例如 )来实现此功能usize,但无法弄清楚如何处理字符串(或其他复杂类型)。

在我的插件箱中,我有一个lib.rs编译用的cargo build --target=wasm32-unknown-unknown --release

use std::ffi::CString;
use std::os::raw::c_char;

static PLUGIN_NAME: &'static str = "Test Plugin";

#[no_mangle]
pub extern "C" fn plugin_name() -> *mut c_char {
    let s = CString::new(PLUGIN_NAME).unwrap();
    s.into_raw()
}

#[no_mangle]
pub fn plugin_name_len() -> usize {
    PLUGIN_NAME.len()
}
Run Code Online (Sandbox Code Playgroud)

这是基于这个问题的答案之一中的代码,该代码与我正在寻找的内容很接近,但在主机端使用 JavaScript。

在我的主机箱中我有一个main.rs

use wasmtime::{Engine, Linker, Module, Store};
use wasmtime_wasi::WasiCtxBuilder;

fn main() -> anyhow::Result<()> {
    let engine = Engine::default();

    let …
Run Code Online (Sandbox Code Playgroud)

rust webassembly wasmtime rust-wasm

3
推荐指数
1
解决办法
1081
查看次数

webassembly可以成为一种强制执行drm的方法吗?

使用编译语言的想法可能是一种显着提高性能的好方法.

但它可以用来设置一个drm吗?

例如:某些网站提供浏览器游戏,不希望其他人使用源代码.将webassembly脚本深深嵌入到游戏机制中是否会用于检测它是否在另一个站点上使用并将其锁定而无法反编译并绕过它?

我不希望听起来像是一个海盗,但它可能涉及adblock-users,它也会阻止跟踪器.

例如,如果在没有检测到的情况下运行音频上下文指纹识别 -script,它怎么能被阻止?

javascript browser drm google-chrome webassembly

2
推荐指数
1
解决办法
592
查看次数

如何将字符串传递给使用emscripten为WebAssembly编译的C代码

我一直在寻找WebAssembly网站和教程,我觉得有点迷茫.

我有以下C代码:

void EMSCRIPTEN_KEEPALIVE hello(char * value){
    printf("%s\n", value);
}
Run Code Online (Sandbox Code Playgroud)

我编译它(我也不确定这部分是最好的方法):

emcc demo.c -s WASM=1 -s NO_EXIT_RUNTIME=1 -o demo.js
Run Code Online (Sandbox Code Playgroud)

根据我的理解,我现在可以在我的javascript类中使用demo.js粘合代码并以这种方式调用方法:

...
<script src="demo.js"></script>
<script>
    function hello(){        
        // Get the value 
        var value = document.getElementById("sample");
        _hello(value.innerHTML);
    }
</script>
...
Run Code Online (Sandbox Code Playgroud)

当我调用方法时,我看到在控制台中打印的内容是:

(null)
Run Code Online (Sandbox Code Playgroud)

有什么我缺少将字符串值传递给使用WebAssembly编译的C代码吗?

非常感谢

javascript webassembly

2
推荐指数
1
解决办法
2583
查看次数

WebAssembly:复制堆栈的顶部

没有dup指令,可以让我复制堆栈顶部的指令。我可以使用哪个指令序列来复制此行为?

bytecode webassembly

2
推荐指数
1
解决办法
111
查看次数

Golang的syscall / js js.NewCallback未定义

我和Wasm都是新手,看来这些项目进展很快。我正在阅读有关在旅途中使用wasm的介绍,看来虽然它是在一月份编写的,但已经过时了。

我正在尝试在调用JavaScript函数时调用单个go函数。该示例说要执行以下操作:

 js.Global().Set("jsFunctionName", js.NewCallback(goCallback))
Run Code Online (Sandbox Code Playgroud)

虽然在尝试编译时,会出现以下错误:

./webassembly.go:54:35: undefined: js.NewCallback
Run Code Online (Sandbox Code Playgroud)

我检查了文档,看不到参考NewCallback。当前应该执行的“正确”方法是什么?

javascript go webassembly

2
推荐指数
1
解决办法
814
查看次数

Web Assembly如何促进更少的可破解/更多不可信的浏览器内代码执行?

即,对于一个而言,预编译的代码更难阅读,因此很难有效地更改浏览器代码。

它比JS更“沙盒”化了,这使其更不容易被黑客入侵了吗?

“ WebAssembly被指定为在安全的沙盒执行环境中运行。” - https://developer.mozilla.org/en-US/docs/WebAssembly/Concepts

WASM VM内存格式的属性是否使其更具客户端抵抗性?

还要别的吗?

webassembly

2
推荐指数
2
解决办法
384
查看次数