Server that compiles Rust, C, and C++ into WebAssembly.
We have a docker image available on Docker Hub (jacoblincool/compilet), the latest tag supports to compile Rust, C, and C++ out of the box.
You can also use the
rstag (~500MB compressed) to compile Rust only, or thectag (~150MB compressed) to compile C and C++ only.
Also, you can build your own image with the following command:
docker build -t compilet .You can run the image with the following command:
docker run -p 8000:8000 jacoblincool/compiletOr use the docker compose file to run the image:
docker compose upYou may need a
.envfile to set the environment variables. Check the.env.examplefile for more information.
Both of the commands above will run the server on port 8000, so you can access the server at http://localhost:8000. You can also change the port by setting the PORT environment variable.
You can also install the Compilet through Cargo:
cargo install compiletIt is more convenient to run is as a cli tool:
compilet compile <file>
# compilet compile -h for more informationCompilet uses JWT to validate the request. You can set the APP_SECRET environment variable to set the secret key for the JWT token, default is APP_SECRET.
You should pass the JWT token in the Authorization header with the Bearer scheme.
-
GET /validateendpoint to validate if the JWT token is valid. Status code200means the token is valid, otherwise the token is invalid.
Compilet should be able to queue the compile request in the future. But currently, it just compiles the source code directly.
-
POST /compileendpoint to compile the source code into WebAssembly
POST body:
{
"lang": "rs",
"code": "fn main() { println!(\"Hello, world!\"); }"
}Response:
{
"success": true,
"message": "Compiled successfully",
"hash": "bb343b0950832ccd077f1515e842196f2ae4bb9e9261b0935ac57916c3cf305d",
"wasm": "<base64 encoded wasm binary>"
}-
POST /submissionendpoint to compile the source code into WebAssembly, but return immediately and compile the source code in the background.
POST body:
{
"lang": "rs",
"code": "fn main() { println!(\"Hello, world!\"); }"
}Response:
{
"message": "Submitted",
"hash": "bb343b0950832ccd077f1515e842196f2ae4bb9e9261b0935ac57916c3cf305d"
}-
GET /submission/{hash}endpoint to get the status of the submission, and the compiled WebAssembly binary if the compilation is finished.
Response:
{
"status": "pending",
"message": "Waiting for compilation",
"wasm": null
}{
"status": "success",
"message": "Compiled successfully",
"wasm": "<base64 encoded wasm binary>"
}{
"status": "failed",
"message": "Compilation failed (error message)",
"wasm": null
}-
GET /systemendpoint to get the system information (currently only thecapabilitiesis implemented)
Response:
{
"capabilities": {
"rs": "rust 2021 edition + rand 0.8.5, release build",
"c": "clang 16, level 3 optimizations",
"cpp": "clang++ 16, level 3 optimizations"
},
"status": {
"compiling": 0,
"pending": 0
}
}After cloning the repository, you need to:
- Run
./scripts/stdlib.shto download the WASI standard library for C, and C++. - Copy
libclang_rt.builtins-wasm32.ato somewhere that Clang can find it. (e.g./usr/lib/llvm16/lib/clang/16/lib/wasi) (You can do it later, the error message will tell you where to put it.)
You can run the server in development mode with the following command:
cargo runBuild the server with the following command:
cargo build --release