aboutsummaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
Diffstat (limited to 'ext')
-rw-r--r--ext/wasm/GNUmakefile18
-rw-r--r--ext/wasm/api/sqlite3-worker1-promiser.c-pp.js48
-rw-r--r--ext/wasm/demo-worker1-promiser.js24
3 files changed, 69 insertions, 21 deletions
diff --git a/ext/wasm/GNUmakefile b/ext/wasm/GNUmakefile
index 098a4330b..ff11ab655 100644
--- a/ext/wasm/GNUmakefile
+++ b/ext/wasm/GNUmakefile
@@ -307,8 +307,9 @@ DISTCLEAN_FILES += $(bin.stripccomments)
########################################################################
-# C-PP.FILTER: a $(call)able to transform $(1) to $(2) via ./c-pp -f
-# $(1) ...
+# C-PP.FILTER: a $(call)able to transform $(1) to $(2) via:
+#
+# ./c-pp -f $(1) -o $(2) $(3)
#
# Historical notes:
#
@@ -825,13 +826,13 @@ pre-post-jses.deps.common := $(extern-pre-js.js) $(sqlite3-license-version.js)
# $4 = resulting sqlite-api JS/MJS file
# $5 = resulting JS/MJS file
# $6 = -D... flags for $(bin.c-pp)
-# $7 = emcc -sXYZ flags (CURRENTLY UNUSED - was factored out)
+# $7 = optional extra flags for emcc
#
# Maintenance reminder: be careful not to introduce spaces around args
# ($1, $2), otherwise string concatenation will malfunction.
#
-# emcc.environment.$(2) must be set to a value for emcc's
-# -sENVIRONMENT flag.
+# Before calling this, emcc.environment.$(2) must be set to a value
+# for emcc's -sENVIRONMENT flag.
#
# $(cflags.$(1)) and $(cflags.$(1).$(2)) may be defined to append
# CFLAGS to a given build mode.
@@ -938,6 +939,7 @@ sqlite3-worker1.js.in := $(dir.api)/sqlite3-worker1.c-pp.js
sqlite3-worker1-promiser.js.in := $(dir.api)/sqlite3-worker1-promiser.c-pp.js
sqlite3-worker1.js := $(dir.dout)/sqlite3-worker1.js
sqlite3-worker1-promiser.js := $(dir.dout)/sqlite3-worker1-promiser.js
+sqlite3-worker1-promiser.mjs := $(dir.dout)/sqlite3-worker1-promiser.mjs
sqlite3-worker1-bundler-friendly.js := $(dir.dout)/sqlite3-worker1-bundler-friendly.mjs
sqlite3-worker1-promiser-bundler-friendly.js := $(dir.dout)/sqlite3-worker1-promiser-bundler-friendly.js
$(eval $(call C-PP.FILTER,$(sqlite3-worker1.js.in),$(sqlite3-worker1.js)))
@@ -947,10 +949,12 @@ $(eval $(call C-PP.FILTER,$(sqlite3-worker1-promiser.js.in),$(sqlite3-worker1-pr
$(eval $(call C-PP.FILTER,$(sqlite3-worker1-promiser.js.in),\
$(sqlite3-worker1-promiser-bundler-friendly.js),\
$(c-pp.D.sqlite3-bundler-friendly)))
+$(eval $(call C-PP.FILTER,$(sqlite3-worker1-promiser.js.in),$(sqlite3-worker1-promiser.mjs),\
+ -Dtarget=es6-module -Dtarget=es6-bundler-friendly))
$(sqlite3-bundler-friendly.mjs): $(sqlite3-worker1-bundler-friendly.js) \
$(sqlite3-worker1-promiser-bundler-friendly.js)
-$(sqlite3.js) $(sqlite3.mjs): $(sqlite3-worker1.js) $(sqlite3-worker1-promiser.js)
-
+$(sqlite3.js) $(sqlite3.mjs): $(sqlite3-worker1.js) \
+ $(sqlite3-worker1-promiser.js) $(sqlite3-worker1-promiser.mjs)
########################################################################
# batch-runner.js is part of one of the test apps which reads in SQL
# dumps generated by $(speedtest1) and executes them.
diff --git a/ext/wasm/api/sqlite3-worker1-promiser.c-pp.js b/ext/wasm/api/sqlite3-worker1-promiser.c-pp.js
index 68846209e..5e399cd34 100644
--- a/ext/wasm/api/sqlite3-worker1-promiser.c-pp.js
+++ b/ext/wasm/api/sqlite3-worker1-promiser.c-pp.js
@@ -42,9 +42,13 @@
- `onready` (optional, but...): this callback is called with no
arguments when the worker fires its initial
'sqlite3-api'/'worker1-ready' message, which it does when
- sqlite3.initWorker1API() completes its initialization. This is
- the simplest way to tell the worker to kick off work at the
- earliest opportunity.
+ sqlite3.initWorker1API() completes its initialization. This is the
+ simplest way to tell the worker to kick off work at the earliest
+ opportunity, and the only way to know when the worker module has
+ completed loading. The irony of using a callback for this, instead
+ of returning a promise from sqlite3Worker1Promiser() is not lost on
+ the developers, but initial attempts to return a promise resulted
+ in a much clumsier interface.
- `onunhandled` (optional): a callback which gets passed the
message event object for any worker.onmessage() events which
@@ -277,7 +281,45 @@ globalThis.sqlite3Worker1Promiser.defaultConfig = {
//#endif
,
onerror: (...args)=>console.error('worker1 promiser error',...args)
+}/*defaultConfig*/;
+
+/**
+ sqlite3Worker1Promiser.v2() works identically to
+ sqlite3Worker1Promiser() except that it returns a promise instead
+ of relying an an onready callback in the config object.
+*/
+sqlite3Worker1Promiser.v2 = function(config){
+ const x = Object.create(null);
+ let oldFunc;
+ if( 'function' == typeof config ){
+ oldFunc = config;
+ config = {};
+ }else if('function'===typeof config?.onready){
+ oldFunc = config.onready;
+ delete config.onready;
+ }
+ config = Object.assign((config || Object.create(null)),{
+ onready: function(func){
+ try {
+ if( oldFunc ){
+ oldFunc(func);
+ }
+ x.resolve(func);
+ }
+ catch(e){x.reject(e)}
+ }
+ });
+ const p = new Promise(function(resolve,reject){
+ x.resolve = resolve;
+ x.reject = reject;
+ });
+ sqlite3Worker1Promiser(config);
+ return p;
};
+
+//#if target=es6-module
+export default sqlite3Worker1Promiser.v2;
+//#endif /* target=es6-module */
//#else
/* Built with the omit-oo1 flag. */
//#endif ifnot omit-oo1
diff --git a/ext/wasm/demo-worker1-promiser.js b/ext/wasm/demo-worker1-promiser.js
index 4327f7487..19a7af114 100644
--- a/ext/wasm/demo-worker1-promiser.js
+++ b/ext/wasm/demo-worker1-promiser.js
@@ -14,8 +14,8 @@
proxy for for the sqlite3 Worker #1 API.
*/
'use strict';
-(function(){
- const T = self.SqliteTestUtil;
+(async function(){
+ const T = globalThis.SqliteTestUtil;
const eOutput = document.querySelector('#test-output');
const warn = console.warn.bind(console);
const error = console.error.bind(console);
@@ -48,18 +48,20 @@
onunhandled: function(ev){
error("Unhandled worker message:",ev.data);
},
- onready: function(){
- T.affirm(arguments[0] === workerPromise
- /* as of version 3.46. Prior to that this callback had no arguments */);
- self.sqlite3TestModule.setStatus(null)/*hide the HTML-side is-loading spinner*/;
- runTests();
- },
onerror: function(ev){
error("worker1 error:",ev);
+ },
+ onready: function(f){
+ warn("This is the v2 interface - don't pass an onready() function.");
}
};
- const workerPromise = self.sqlite3Worker1Promiser(promiserConfig);
- delete self.sqlite3Worker1Promiser;
+ const workerPromise = await globalThis.sqlite3Worker1Promiser.v2(promiserConfig)
+ .then((func)=>{
+ log("Init complete. Starting tests momentarily.");
+ globalThis.sqlite3TestModule.setStatus(null)/*hide the HTML-side is-loading spinner*/;
+ return func;
+ });
+ delete globalThis.sqlite3Worker1Promiser;
const wtest = async function(msgType, msgArgs, callback){
if(2===arguments.length && 'function'===typeof msgArgs){
@@ -273,5 +275,5 @@
}).finally(()=>logHtml('',"That's all, folks!"));
}/*runTests2()*/;
- log("Init complete, but async init bits may still be running.");
+ runTests();
})();