mirror of
https://github.com/sqlite/sqlite.git
synced 2025-10-21 11:13:54 +03:00
136 lines
5.2 KiB
JavaScript
136 lines
5.2 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. This code, unlike most of the
|
|
associated JS code, runs outside of the Emscripten-generated module
|
|
init scope, in the current global scope.
|
|
|
|
At the time this is run, the global-scope sqlite3InitModule
|
|
function will have just been defined.
|
|
*/
|
|
//#if target:es6-module
|
|
const toExportForESM =
|
|
//#endif
|
|
(function(){
|
|
//console.warn("this is extern-post-js");
|
|
/**
|
|
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).
|
|
*/
|
|
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 sIMS = 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(),
|
|
/*
|
|
It is literally impossible to reliably get the name of _this_ script
|
|
at runtime, so impossible to reliably derive X.wasm from script name
|
|
X.js. (This is apparently why Emscripten hard-codes the name of the
|
|
wasm file into their output.) Thus we need, at build-time, to set
|
|
the name of the WASM file which our custom instantiateWasm() should to
|
|
load. The build process populates this.
|
|
|
|
Module.instantiateWasm() is found in pre-js.c-pp.js.
|
|
*/
|
|
wasmFilename: '@sqlite3.wasm@' /* replaced by the build process */
|
|
});
|
|
sIMS.debugModule =
|
|
sIMS.urlParams.has('sqlite3.debugModule')
|
|
? (...args)=>console.warn('sqlite3.debugModule:',...args)
|
|
: ()=>{};
|
|
|
|
if(sIMS.urlParams.has('sqlite3.dir')){
|
|
sIMS.sqlite3Dir = sIMS.urlParams.get('sqlite3.dir') +'/';
|
|
}else if(sIMS.moduleScript){
|
|
const li = sIMS.moduleScript.src.split('/');
|
|
li.pop();
|
|
sIMS.sqlite3Dir = li.join('/') + '/';
|
|
}
|
|
|
|
const sIM = globalThis.sqlite3InitModule = function ff(...args){
|
|
//console.warn("Using replaced sqlite3InitModule()",globalThis.location);
|
|
return originalInit(...args).then((EmscriptenModule)=>{
|
|
sIMS.debugModule("sqlite3InitModule() sIMS =",sIMS);
|
|
sIMS.debugModule("sqlite3InitModule() EmscriptenModule =",EmscriptenModule);
|
|
const s = EmscriptenModule.runSQLite3PostLoadInit(
|
|
sIMS,
|
|
EmscriptenModule /* see post-js-header/footer.js */,
|
|
!!ff.__isUnderTest
|
|
);
|
|
sIMS.debugModule("sqlite3InitModule() sqlite3 =",s);
|
|
//const rv = s.asyncPostInit();
|
|
//delete s.asyncPostInit;
|
|
//#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 if() condition above is fragile,
|
|
based solely on inspection of the offending code, not
|
|
public Emscripten details. */
|
|
//console.warn("sqlite3InitModule() returning E-module.",EmscriptenModule);
|
|
return EmscriptenModule;
|
|
}
|
|
//#endif
|
|
return s;
|
|
}).catch((e)=>{
|
|
console.error("Exception loading sqlite3 module:",e);
|
|
throw e;
|
|
});
|
|
};
|
|
sIM.ready = originalInit.ready;
|
|
|
|
if(sIMS.moduleScript){
|
|
let src = sIMS.moduleScript.src.split('/');
|
|
src.pop();
|
|
sIMS.scriptDir = src.join('/') + '/';
|
|
}
|
|
sIMS.debugModule('extern-post-js.c-pp.js sqlite3InitModuleState =',sIMS);
|
|
//#if not 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 = sIM;
|
|
module.exports.default = sIM;
|
|
}else if( 'function'===typeof define && define.amd ){
|
|
define([], ()=>sIM);
|
|
}else if (typeof exports === 'object'){
|
|
exports["sqlite3InitModule"] = sIM;
|
|
}
|
|
/* AMD modules get injected in a way we cannot override,
|
|
so we can't handle those here. */
|
|
//#endif // !target:es6-module
|
|
return sIM;
|
|
})();
|
|
//#if target:es6-module
|
|
sqlite3InitModule = toExportForESM;
|
|
export default sqlite3InitModule;
|
|
//#endif
|