programmazione:bun:appunti
Indice
Appunti sparsi su Bun
Autore: Fabio Di Matteo
Ultima revisione: 13/07/2026 11:10
Alcuni appunti sparsi su Bun runtime javascript e typescrypt.
Prelevare percorso file eseguibile
Sia file.js che binario:
const exePath = Bun.main; //path completo eseguibile const exeDir = dirname(Bun.main); //cartella in cui risiede l'eseguibile
Applicazione a singola pagina
Bun usa mypage.html direttamente con l'import. Aggiunge inoltre alcuni script per compiti interni.
http.js
#!/usr/bin/env bun import mypage from "./views/mypage.html"; function echo (s,status=200){ let myheader={"Content-Type": "text/html; charset=utf-8",} return new Response(s,{headers: myheader, status: status}); } function json (j,status=200){ let myheader={"Content-Type": "application/json; charset=utf-8",} return new Response(JSON.stringify(j),{headers: myheader, status: status}); } async function calcola(req){ const { val } = req.params; const out=val*val; const res ={status : 'ok', output: out}; return json(res); } export const server = Bun.serve({routes:{ '/': mypage, '/calcola/:val': async req =>{ return calcola(req); } }}); console.log(`Server running at ${server.url}`);
mypage.html
<!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <script src="https://code.jquery.com/jquery-4.0.0.min.js"></script> <title>Hello</title> </head> <body> <h1>Calcola il quadrato del numero.</h1> <p>Il calcolo avviene lato server.</p> <input type="text" id="myval"/> <p id="out"></p> <button onclick="calcola()">Calcola</button> <script> function calcola(){ const e = $("#myval").val(); $.getJSON( `/calcola/${e}`, function( data ) { $("#out").text(data.output); }); } </script> </body> </html>
Riceve richieste post
httpd.js
... async function calcola_post(req){ const data = await req.json(); const val = data.val; const out= val*val; const res ={status : 'ok', output: out}; return json(res); } const server = Bun.serve({routes:{ '/': mypage, '/calcola_post': async req => {return calcola_post(req);}, }});
mypage.html
<!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <script src="https://code.jquery.com/jquery-4.0.0.min.js"></script> <title>Hello</title> </head> <body> <h1>Calcola il quadrato del numero.</h1> <p>Il calcolo avviene lato server.</p> <input type="text" id="myval"/> <p id="out"></p> <button onclick="calcola_post()">Calcola</button> <script> function calcola_post(){ const e = $("#myval").val(); $("#out").text("Caricamento..."); $.ajax({ url: "/calcola_post", method: "POST", contentType: "application/json", data: JSON.stringify({ val: e }), success: function (res) { console.log(res); $("#out").text(res.output); }, error: function (xhr) { console.error(xhr.responseText); } }); } </script> </body> </html>
Caricare librerie dinamiche con dlopen
Seguendo la documentazione riguardante ffi ho creato una libreria dinamica in rust e ho utilizzato la funzione rust add() in Bun.
Creare la libreria
la funzione add prende come argomenti due interi e restituisce la somma.
add.rs
#[no_mangle] pub extern "C" fn add(a: i32, b: i32) -> i32 { a + b }
Compilarla con :
rustc --crate-type cdylib add.rs
otteniamo libadd.so.
Carichiamo la libreria in bun e usiamo la funzione:
index.js
import { dlopen, FFIType, suffix } from "bun:ffi"; const { i32 } = FFIType; const path = `./rust/libadd.${suffix}`; const lib = dlopen(path, { add: { args: [i32, i32], returns: i32, }, }); console.log(lib.symbols.add(1, 2));
programmazione/bun/appunti.txt · Ultima modifica: 19/07/2026 18:44 da Fabio Di Matteo
