4 ms·
bun:ffi is available in the current version of bun. Here's an example that uses raylib (GUI library), without any extra bindings/build step: https://github.com
by Jarred 4y ago
bun:ffi is available in the current version of bun.
Here's an example that uses raylib (GUI library), without any extra bindings/build step: https://github.com/theoparis/bunray/blob/main/src/example.ts https://github.com/theoparis/bunray/blob/main/src/example.ts
bun:ffi works by embedding TinyCC - https://github.com/TinyCC/tinycc https://github.com/TinyCC/tinycc and then just-in-time compiling C functions that perform type conversions from JavaScript <> C ABI and back. It's faster than node.js' napi (which bun also supports) because it avoids the dynamic library overhead via doing type conversions inline.
For bun, I really wanted something simpler than napi without the performance drawbacks of libffi.
If you want to see the generated C bindings, you can do this:
import { viewSource } from "bun:ffi";
console.log(
viewSource(
{
hello_world: {
returns: "float",
args: ["float"],
},
},
false
)[0]
);
- davedx 4y agoReally impressive and creative engineering. This pushes me over the edge to trying bun. Thanks!
- melony 4y agoCan bun:ffi deal with opaque pointers and C preprocessor generated types? For example can you embed a package like Guile in JS with bun:ffi? https://www.gnu.org/software/guile/docs/guile-tut/tutorial.html#Init-Guile https://www.gnu.org/software/guile/docs/guile-tut/tutorial.h... Opaque pointers and preprocessors often trip FFI up
- Jarred 4y agoopaque pointers yes - 'ptr' or 'void*' as the arg type/return type. if you need to create a pointer then you can use a Uint8Array or a BigUint64Array. generated types - not yet, though if it's a pointer you can pass that struct support isn't implemented yet - so just numbers, pointers and also strings. still not sure the best way to do structs efficiently. passing an object to the function call will be too slow.
- eyelidlessness 4y agoI haven’t looked in a while, what’s the status of Bun macros? For quite some time I’ve wanted a fast and ergonomic way to override built in runtime behavior for object/array literals. E.g. for an efficient implementation of the records/tuples proposal, for which I’ve thought Bun macros could be well suited. I think they’d be equally well suited to a specialized struct factory, which could bypass at least some of the overhead of JS runtime construction.
- refulgentis 4y agoIs WASM involved somehow? Or is this only for native apps?
- stoicjumbotron 4y agoDid not even think there would be bun bindings for Raylib. Insane!