mirror of
https://github.com/tursodatabase/libsql.git
synced 2024-11-23 17:56:18 +00:00
127 lines
5.0 KiB
JavaScript
127 lines
5.0 KiB
JavaScript
|
|
/* ^^^^ ACHTUNG: blank line at the start is necessary because
|
|
Emscripten will not add a newline in some cases and we need
|
|
a blank line for a sed-based kludge for the ES6 build. */
|
|
/* extern-post-js.js must be appended to the resulting sqlite3.js
|
|
file. It gets its name from being used as the value for the
|
|
--extern-post-js=... Emscripten flag. Note that this code, unlike
|
|
most of the associated JS code, runs outside of the
|
|
Emscripten-generated module init scope, in the current
|
|
global scope. */
|
|
//#if target=es6-module
|
|
const toExportForESM =
|
|
//#endif
|
|
(function(){
|
|
/**
|
|
In order to hide the sqlite3InitModule()'s resulting
|
|
Emscripten module from downstream clients (and simplify our
|
|
documentation by being able to elide those details), we hide that
|
|
function and expose a hand-written sqlite3InitModule() to return
|
|
the sqlite3 object (most of the time).
|
|
|
|
Unfortunately, we cannot modify the module-loader/exporter-based
|
|
impls which Emscripten installs at some point in the file above
|
|
this.
|
|
*/
|
|
const originalInit = sqlite3InitModule;
|
|
if(!originalInit){
|
|
throw new Error("Expecting globalThis.sqlite3InitModule to be defined by the Emscripten build.");
|
|
}
|
|
/**
|
|
We need to add some state which our custom Module.locateFile()
|
|
can see, but an Emscripten limitation currently prevents us from
|
|
attaching it to the sqlite3InitModule function object:
|
|
|
|
https://github.com/emscripten-core/emscripten/issues/18071
|
|
|
|
The only(?) current workaround is to temporarily stash this state
|
|
into the global scope and delete it when sqlite3InitModule()
|
|
is called.
|
|
*/
|
|
const initModuleState = globalThis.sqlite3InitModuleState = Object.assign(Object.create(null),{
|
|
moduleScript: globalThis?.document?.currentScript,
|
|
isWorker: ('undefined' !== typeof WorkerGlobalScope),
|
|
location: globalThis.location,
|
|
urlParams: globalThis?.location?.href
|
|
? new URL(globalThis.location.href).searchParams
|
|
: new URLSearchParams()
|
|
});
|
|
initModuleState.debugModule =
|
|
initModuleState.urlParams.has('sqlite3.debugModule')
|
|
? (...args)=>console.warn('sqlite3.debugModule:',...args)
|
|
: ()=>{};
|
|
|
|
if(initModuleState.urlParams.has('sqlite3.dir')){
|
|
initModuleState.sqlite3Dir = initModuleState.urlParams.get('sqlite3.dir') +'/';
|
|
}else if(initModuleState.moduleScript){
|
|
const li = initModuleState.moduleScript.src.split('/');
|
|
li.pop();
|
|
initModuleState.sqlite3Dir = li.join('/') + '/';
|
|
}
|
|
|
|
globalThis.sqlite3InitModule = function ff(...args){
|
|
//console.warn("Using replaced sqlite3InitModule()",globalThis.location);
|
|
return originalInit(...args).then((EmscriptenModule)=>{
|
|
//#if wasmfs
|
|
if('undefined'!==typeof WorkerGlobalScope &&
|
|
EmscriptenModule['ENVIRONMENT_IS_PTHREAD']){
|
|
/** Workaround for wasmfs-generated worker, which calls this
|
|
routine from each individual thread and requires that its
|
|
argument be returned. The conditional criteria above are
|
|
fragile, based solely on inspection of the offending code,
|
|
not public Emscripten details. */
|
|
//console.warn("sqlite3InitModule() returning E-module.",EmscriptenModule);
|
|
return EmscriptenModule;
|
|
}
|
|
//#endif
|
|
//console.warn("sqlite3InitModule() returning sqlite3 object.");
|
|
const s = EmscriptenModule.sqlite3;
|
|
s.scriptInfo = initModuleState;
|
|
//console.warn("sqlite3.scriptInfo =",s.scriptInfo);
|
|
if(ff.__isUnderTest) s.__isUnderTest = true;
|
|
const f = s.asyncPostInit;
|
|
delete s.asyncPostInit;
|
|
return f();
|
|
}).catch((e)=>{
|
|
console.error("Exception loading sqlite3 module:",e);
|
|
throw e;
|
|
});
|
|
};
|
|
globalThis.sqlite3InitModule.ready = originalInit.ready;
|
|
|
|
if(globalThis.sqlite3InitModuleState.moduleScript){
|
|
const sim = globalThis.sqlite3InitModuleState;
|
|
let src = sim.moduleScript.src.split('/');
|
|
src.pop();
|
|
sim.scriptDir = src.join('/') + '/';
|
|
}
|
|
initModuleState.debugModule('sqlite3InitModuleState =',initModuleState);
|
|
if(0){
|
|
console.warn("Replaced sqlite3InitModule()");
|
|
console.warn("globalThis.location.href =",globalThis.location.href);
|
|
if('undefined' !== typeof document){
|
|
console.warn("document.currentScript.src =",
|
|
document?.currentScript?.src);
|
|
}
|
|
}
|
|
//#ifnot target=es6-module
|
|
// Emscripten does not inject these module-loader bits in ES6 module
|
|
// builds and including them here breaks JS bundlers, so elide them
|
|
// from ESM builds.
|
|
/* Replace the various module exports performed by the Emscripten
|
|
glue... */
|
|
if (typeof exports === 'object' && typeof module === 'object'){
|
|
module.exports = sqlite3InitModule;
|
|
}else if (typeof exports === 'object'){
|
|
exports["sqlite3InitModule"] = sqlite3InitModule;
|
|
}
|
|
/* AMD modules get injected in a way we cannot override,
|
|
so we can't handle those here. */
|
|
//#endif // !target=es6-module
|
|
return globalThis.sqlite3InitModule /* required for ESM */;
|
|
})();
|
|
//#if target=es6-module
|
|
sqlite3InitModule = toExportForESM;
|
|
export default sqlite3InitModule;
|
|
//#endif
|