Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/ostcar/roc-wasm-platform
Example repo to call roc from go
https://github.com/ostcar/roc-wasm-platform
Last synced: 3 months ago
JSON representation
Example repo to call roc from go
- Host: GitHub
- URL: https://github.com/ostcar/roc-wasm-platform
- Owner: ostcar
- License: mit
- Created: 2023-06-24T21:33:30.000Z (over 1 year ago)
- Default Branch: main
- Last Pushed: 2023-07-10T21:14:53.000Z (over 1 year ago)
- Last Synced: 2024-02-12T15:17:49.781Z (9 months ago)
- Language: Go
- Size: 68.4 KB
- Stars: 4
- Watchers: 3
- Forks: 1
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
- roc-awesome - ostcar/roc-wasm-platform
README
# Roc WASM Platform
roc wasm platform can be used by [roc](https://www.roc-lang.org/) to build wasm modules.
It creates a wasm module, where the wasm runtime and the roc code can use any
types as arguments, that can be decoded by
[json](https://github.com/lukewilliamboswell/roc-json).The encoding format will probably change in the future.
## How to use it
With the current wasm standard, it is not possible to send custom types between
the wasm runtime and the wasm module. Only numbers can be transferred directly.To send other data, the wasm runtime has to convert it to raw bytes, allocate
enough memory in wasm and call the wasm function with the pointer to that memory
as argument.The roc wasm platform reads the memory from the given pointer, decodes it (as
json) and calls the roc function with the decoded data.For the return value, the same happens the other way around.
For this to work, the wasm runtime and the roc app have to use the same type.
The wasm-module exports this two functions:
(TODO: Get the wasm signature)
```
allocUint8(length: u32) [*]u8;
run_roc(pointer: [*]u8, length: usize) [*]const u8
```## Issues
There are currently some issues with roc you have to know about:
### Build from source
You have to build the roc binary from source. See https://github.com/roc-lang/roc/issues/5573
One way to do it is by running from the roc source code with:
```bash
cargo run -- build /PATH/TO/YOUR/main.roc --target=wasm32
```### Zig Version
You can use zig 0.9.1 or zig 0.10.1. Both versions have issues.
#### 0.9.1
There is a caching bug in zig 0.9.1. To work around it, you have to remove the
zig cache before running `roc build`. Every time! See:
https://github.com/ziglang/zig/issues/12864```bash
find ~/.cache/roc/ -name zig-cache -exec rm -r {} \;
```#### 0.10.1
To use zig 0.10.1, there are two small required changes to the roc sourcecode:
https://github.com/roc-lang/roc/compare/main...ostcar:zig_0.10
To use zig 0.10.1 is possible, but there will be warnings like
```
wasm-ld: warning: Linking two modules of different data layouts: '/home/max/src/roc/target/debug/build/wasi_libc_sys-661fd49d43379bb3/out/wasi-libc.a(llrintl.o at 2476264)' is 'e-m:e-p:32:32-i64:64-n32:64-S128-ni:1:10:20' whereas 'ld-temp.o' is 'e-m:e-p:32:32-p10:8:8-p20:8:8-i64:64-n32:64-S128-ni:1:10:20'
```It seems, that they can be ignored.