
Product
Introducing Socket Fix for Safe, Automated Dependency Upgrades
Automatically fix and test dependency updates with socket fix—a new CLI tool that turns CVE alerts into safe, automated upgrades.
twr-wasm provides a simple way to run C/C++ code in a web browser using WebAssembly.
Version 2.5.0
twr-wasm is a simple, lightweight and easy to use library for building C/C++ WebAssembly code directly with clang. Run C/C++ code in a web browser. Legacy code, libraries, full applications, or single functions can be integrated with JavaScript and TypeScript. twr-wam solves some common use cases with less work than the more feature rich emscripten.
Key Features:
.wasm
modules using C/C++ using clang directly (no wrapper).wasm
modules, call C/C++ functions, and access wasm memorystdin
, stdio
, and stderr
.
<div>
tags in your HTML page<canvas>
based "terminal"class twrWasmModuleAsync
to:
await
on blocking/synchronous C/C++ functions.class twrLibrary
Name | View Live Link | Source Link |
---|---|---|
Bouncing Balls (C++) | View bouncing balls | Source for balls |
Maze Gen/Solve (Win32 C Port) | View live maze | Source for maze |
Input/Output with <div> | View square demo | Source |
I/O to terminal with <canvas> | View demo | Source |
CLI using libc++ and <canvas> ) | View console | Source |
The full documentation can be found here
npm install twr-wasm
.
For details see https://twiddlingbits.dev/docsite/gettingstarted/installation/
Here is the simplest twr-wasm example.
C code:
#include <stdio.h>
void hello() {
printf("hello world\n");
}
index.html:
<head>
<title>Hello World</title>
</head>
<body>
<div id="twr_iodiv"></div>
<script type="module">
import {twrWasmModule} from "twr-wasm";
const mod = new twrWasmModule();
await mod.loadWasm("./helloworld.wasm");
await mod.callC(["hello"]);
</script>
</body>
I/O can be directed to or from a <div> or a <canvas> tag. Here is a simple example using a <div> for stdio input and output.
#include <stdio.h>
#include <stdlib.h>
#include "twr-crt.h"
void stdio_div() {
char inbuf[64];
char *r;
int i;
printf("Square Calculator\n");
while (1) {
printf("Enter an integer: ");
r=twr_mbgets(inbuf); // r is NULL if esc entered. Otherwise r == inbuf
if (r) {
i=atoi(inbuf);
printf("%d squared is %d\n\n",i,i*i);
}
else {
printf("\n");
}
}
}
With an index.html like the following. This time we are using twrWasmModuleAsync which integrates blocking C code into Javascript. twrWasmModuleAsync can also be used to receive key input from a <div> or <canvas> tag.
<body>
<div id="stdioDiv"
tabindex="0"
style="color: DarkGreen; background-color: LightGray; font-size: 18px;font-family: Arial, sans-serif;" >
Loading... <br>
</div>
<script type="module">
import {twrWasmModuleAsync, twrConsoleDiv} from "twr-wasm";
const con = new twrConsoleDiv(document.getElementById("stdioDiv"));
const amod = new twrWasmModuleAsync({stdio: con});
// remove 'Loading...'
document.getElementById("stdioDiv").innerHTML ="<br>";
// send key events to twrConsoleDiv
document.getElementById("stdioDiv").addEventListener("keydown",(ev)=>{con.keyDown(ev)});
await amod.loadWasm("./divcon.wasm");
await amod.callC(["stdio_div"]);
</script>
</body>
The full documentation can be found here
FAQs
twr-wasm provides a simple way to run C/C++ code in a web browser using WebAssembly.
The npm package twr-wasm receives a total of 35 weekly downloads. As such, twr-wasm popularity was classified as not popular.
We found that twr-wasm demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 0 open source maintainers collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Product
Automatically fix and test dependency updates with socket fix—a new CLI tool that turns CVE alerts into safe, automated upgrades.
Security News
CISA denies CVE funding issues amid backlash over a new CVE foundation formed by board members, raising concerns about transparency and program governance.
Product
We’re excited to announce a powerful new capability in Socket: historical data and enhanced analytics.