UNPKG

libpg-query

Version:
82 lines (81 loc) 2.34 kB
export * from "@pgsql/types"; // @ts-ignore import PgQueryModule from './libpg-query.js'; let wasmModule; const initPromise = PgQueryModule().then((module) => { wasmModule = module; }); function ensureLoaded() { if (!wasmModule) throw new Error("WASM module not initialized. Call `loadModule()` first."); } export async function loadModule() { if (!wasmModule) { await initPromise; } } function awaitInit(fn) { return (async (...args) => { await initPromise; return fn(...args); }); } function stringToPtr(str) { ensureLoaded(); if (typeof str !== 'string') { throw new TypeError(`Expected a string, got ${typeof str}`); } const len = wasmModule.lengthBytesUTF8(str) + 1; const ptr = wasmModule._malloc(len); try { wasmModule.stringToUTF8(str, ptr, len); return ptr; } catch (error) { wasmModule._free(ptr); throw error; } } function ptrToString(ptr) { ensureLoaded(); if (typeof ptr !== 'number') { throw new TypeError(`Expected a number, got ${typeof ptr}`); } return wasmModule.UTF8ToString(ptr); } export const parse = awaitInit(async (query) => { const queryPtr = stringToPtr(query); let resultPtr = 0; try { resultPtr = wasmModule._wasm_parse_query(queryPtr); const resultStr = ptrToString(resultPtr); if (resultStr.startsWith('syntax error') || resultStr.startsWith('deparse error') || resultStr.includes('ERROR')) { throw new Error(resultStr); } return JSON.parse(resultStr); } finally { wasmModule._free(queryPtr); if (resultPtr) { wasmModule._wasm_free_string(resultPtr); } } }); export function parseSync(query) { const queryPtr = stringToPtr(query); let resultPtr = 0; try { resultPtr = wasmModule._wasm_parse_query(queryPtr); const resultStr = ptrToString(resultPtr); if (resultStr.startsWith('syntax error') || resultStr.startsWith('deparse error') || resultStr.includes('ERROR')) { throw new Error(resultStr); } return JSON.parse(resultStr); } finally { wasmModule._free(queryPtr); if (resultPtr) { wasmModule._wasm_free_string(resultPtr); } } }