Strumenti Utente

Strumenti Sito


programmazione:bun:appunti

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.

Full stack docs

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