bridge.ts (1783B)
1 import type { SqlJsParams, SqlJsValue } from "../sql/types.js"; 2 import { WebSqlEngine } from "../sql/web.js"; 3 4 const is_record = (value: unknown): value is Record<string, unknown> => 5 typeof value === "object" && value !== null && !Array.isArray(value); 6 7 const is_sql_value = (value: unknown): value is SqlJsValue => { 8 if (value === null) return true; 9 if (typeof value === "string") return true; 10 if (typeof value === "number") return Number.isFinite(value); 11 return value instanceof Uint8Array; 12 }; 13 14 const is_sql_value_array = (value: unknown): value is ReadonlyArray<SqlJsValue> => 15 Array.isArray(value) && value.every(is_sql_value); 16 17 const is_sql_value_record = (value: unknown): value is Readonly<Record<string, SqlJsValue>> => 18 is_record(value) && Object.values(value).every(is_sql_value); 19 20 function parse_sql_params(params_json: string): SqlJsParams { 21 const trimmed = params_json.trim(); 22 if (!trimmed) return []; 23 try { 24 const raw = JSON.parse(trimmed); 25 if (is_sql_value_array(raw)) return raw; 26 if (is_sql_value_record(raw)) return raw; 27 return []; 28 } catch { 29 return []; 30 } 31 } 32 33 export function radroots_sql_install_bridges(engine: WebSqlEngine): void { 34 Object.assign(globalThis, { 35 __radroots_sql_wasm_exec: (sql: string, params_json: string) => { 36 const params = parse_sql_params(params_json); 37 const res = engine.exec(sql, params); 38 return res; 39 }, 40 __radroots_sql_wasm_query: (sql: string, params_json: string) => { 41 const params = parse_sql_params(params_json); 42 const res = engine.query(sql, params); 43 return res; 44 }, 45 __radroots_sql_wasm_export_bytes: () => engine.export_bytes() 46 }); 47 }