| |
| /* ^^^^ 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 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 |