]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
wasm promiser.v2 is essentially working but the demo code is double-loading the modul...
authorstephan <stephan@noemail.net>
Thu, 7 Mar 2024 17:56:08 +0000 (17:56 +0000)
committerstephan <stephan@noemail.net>
Thu, 7 Mar 2024 17:56:08 +0000 (17:56 +0000)
FossilOrigin-Name: aa877ce0c3b3aa1accd6e5fcd722d1bfaa79bea28c04c6badd8a547cea4bbc63

ext/wasm/GNUmakefile
ext/wasm/api/sqlite3-worker1-promiser.c-pp.js
ext/wasm/demo-worker1-promiser-esm.html [new file with mode: 0644]
ext/wasm/dist.make
ext/wasm/index-dist.html
ext/wasm/index.html
manifest
manifest.uuid

index ff11ab6552ea272d5012abec7c7a300c96c3215d..922f3418578684d40c0f11100bac8f09b18b0927 100644 (file)
@@ -453,13 +453,14 @@ sqlite3-api.jses += $(dir.api)/sqlite3-api-cleanup.js
 # the first OPFS VFS and necessarily an external file.
 SOAP.js := $(dir.api)/sqlite3-opfs-async-proxy.js
 SOAP.js.bld := $(dir.dout)/$(notdir $(SOAP.js))
-sqlite3-api.ext.jses += $(SOAP.js.bld)
+#
+# $(sqlite3-api.ext.jses) = API-related files which are standalone files,
+#   not part of the amalgamation.
+#
+sqlite3-api.ext.jses := $(SOAP.js.bld)
 $(SOAP.js.bld): $(SOAP.js)
        cp $< $@
 
-all quick: $(sqlite3-api.ext.jses)
-q: quick
-
 ########################################################################
 # $(sqlite3-api*.*js) contain the core library code but not the
 # Emscripten-related glue which deals with loading sqlite3.wasm. In
@@ -940,10 +941,10 @@ 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-bundler-friendly.mjs := $(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)))
-$(eval $(call C-PP.FILTER,$(sqlite3-worker1.js.in),$(sqlite3-worker1-bundler-friendly.js),\
+$(eval $(call C-PP.FILTER,$(sqlite3-worker1.js.in),$(sqlite3-worker1-bundler-friendly.mjs),\
     $(c-pp.D.sqlite3-bundler-friendly)))
 $(eval $(call C-PP.FILTER,$(sqlite3-worker1-promiser.js.in),$(sqlite3-worker1-promiser.js)))
 $(eval $(call C-PP.FILTER,$(sqlite3-worker1-promiser.js.in),\
@@ -951,10 +952,17 @@ $(eval $(call C-PP.FILTER,$(sqlite3-worker1-promiser.js.in),\
     $(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-bundler-friendly.mjs): $(sqlite3-worker1-bundler-friendly.mjs) \
     $(sqlite3-worker1-promiser-bundler-friendly.js)
-$(sqlite3.js) $(sqlite3.mjs): $(sqlite3-worker1.js) \
+all: $(sqlite3-worker1.js) \
     $(sqlite3-worker1-promiser.js) $(sqlite3-worker1-promiser.mjs)
+
+sqlite3-api.ext.jses += \
+  $(sqlite3-worker1-promiser.mjs) \
+  $(sqlite3-worker1.js)
+all quick: $(sqlite3-api.ext.jses)
+q: quick
+
 ########################################################################
 # batch-runner.js is part of one of the test apps which reads in SQL
 # dumps generated by $(speedtest1) and executes them.
index 5e399cd34439e8432fbb79aa4409ac9b3f0e1a29..06eb0781c8db6517b4a1a9a196d32bee3a6108c8 100644 (file)
@@ -47,8 +47,8 @@
    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.
+   the developers: see sqlite3Worker1Promiser.v2() which uses a
+   Promise instead.
 
    - `onunhandled` (optional): a callback which gets passed the
    message event object for any worker.onmessage() events which
@@ -251,9 +251,10 @@ globalThis.sqlite3Worker1Promiser = function callee(config = callee.defaultConfi
     return p;
   };
 }/*sqlite3Worker1Promiser()*/;
+
 globalThis.sqlite3Worker1Promiser.defaultConfig = {
   worker: function(){
-//#if target=es6-bundler-friendly
+//#if target=es6-module
     return new Worker(new URL("sqlite3-worker1-bundler-friendly.mjs", import.meta.url),{
       type: 'module'
     });
@@ -274,7 +275,7 @@ globalThis.sqlite3Worker1Promiser.defaultConfig = {
     return new Worker(theJs + globalThis.location.search);
 //#endif
   }
-//#ifnot target=es6-bundler-friendly
+//#ifnot target=es6-module
   .bind({
     currentScript: globalThis?.document?.currentScript
   })
@@ -285,11 +286,17 @@ globalThis.sqlite3Worker1Promiser.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() except that it returns a Promise instead
+   of relying an an onready callback in the config object. The Promise
+   resolves to the same factory function which
+   sqlite3Worker1Promiser() returns.
+
+   If config is-a function or is an object which contains an onready
+   function, that function is replaced by a proxy which will resolve
+   after calling the original function and will reject if that
+   function throws.
 */
 sqlite3Worker1Promiser.v2 = function(config){
-  const x = Object.create(null);
   let oldFunc;
   if( 'function' == typeof config ){
     oldFunc = config;
@@ -298,26 +305,36 @@ sqlite3Worker1Promiser.v2 = function(config){
     oldFunc = config.onready;
     delete config.onready;
   }
+  const promiseProxy = Object.create(null);
   config = Object.assign((config || Object.create(null)),{
-    onready: function(func){
+    onready: async function(func){
       try {
-        if( oldFunc ){
-          oldFunc(func);
-        }
-        x.resolve(func);
+        if( oldFunc ) await oldFunc(func);
+        promiseProxy.resolve(func);
       }
-      catch(e){x.reject(e)}
+      catch(e){promiseProxy.reject(e)}
     }
   });
   const p = new Promise(function(resolve,reject){
-    x.resolve = resolve;
-    x.reject = reject;
+    promiseProxy.resolve = resolve;
+    promiseProxy.reject = reject;
   });
-  sqlite3Worker1Promiser(config);
+  try{
+    sqlite3Worker1Promiser(config);
+  }catch(e){
+    promiseProxy.reject(e);
+  }
   return p;
 };
 
 //#if target=es6-module
+/**
+  When built as a module, we export sqlite3Worker1Promiser.v2()
+  instead of sqlite3Worker1Promise() because (A) its interface is more
+  conventional for ESM usage and (B) the ESM option export option for
+  this API did not exist until v2 was created, so there's no backwards
+  incompatibility.
+*/
 export default sqlite3Worker1Promiser.v2;
 //#endif /* target=es6-module */
 //#else
diff --git a/ext/wasm/demo-worker1-promiser-esm.html b/ext/wasm/demo-worker1-promiser-esm.html
new file mode 100644 (file)
index 0000000..3995950
--- /dev/null
@@ -0,0 +1,311 @@
+<!doctype html>
+<html lang="en-us">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    <link rel="shortcut icon" href="data:image/x-icon;," type="image/x-icon">
+    <link rel="stylesheet" href="common/emscripten.css"/>
+    <link rel="stylesheet" href="common/testing.css"/>
+    <title>worker-promise (via ESM) tests</title>
+  </head>
+  <body>
+    <header id='titlebar'><span>worker-promise (via ESM) tests</span></header>
+    <!-- emscripten bits -->
+    <figure id="module-spinner">
+      <div class="spinner"></div>
+      <div class='center'><strong>Initializing app...</strong></div>
+      <div class='center'>
+        On a slow internet connection this may take a moment.  If this
+        message displays for "a long time", intialization may have
+        failed and the JavaScript console may contain clues as to why.
+      </div>
+    </figure>
+    <div class="emscripten" id="module-status">Downloading...</div>
+    <div class="emscripten">
+      <progress value="0" max="100" id="module-progress" hidden='1'></progress>
+    </div><!-- /emscripten bits -->
+    <div>Most stuff on this page happens in the dev console.</div>
+    <hr>
+    <div id='test-output'></div>
+    <script src="common/SqliteTestUtil.js"></script>
+    <!--script src="demo-worker1-promiser.mjs"></script-->
+    <script type="module">
+      const T = globalThis.SqliteTestUtil;
+      import {default as promiserFactory} from "./jswasm/sqlite3-worker1-promiser.mjs";
+      console.log("promiserFactory =",promiserFactory);
+      const promiserConfig = {
+        debug: 1 ? undefined : (...args)=>console.debug('worker debug',...args),
+        onunhandled: function(ev){
+          error("Unhandled worker message:",ev.data);
+        },
+        onerror: function(ev){
+          error("worker1 error:",ev);
+        },
+        /**
+           The v1 interfaces uses an onready function. The v2 interface optionally
+           accepts one but does not require it. If provided, it is called _before_
+           the promise is resolved, and the promise is rejected if onready() throws.
+        */
+        onready: function(f){
+          /* f === the function returned by promiserFactory().
+             Ostensibly (f === workerPromise) but this function is
+             called before the promiserFactory() Promise resolves, so
+             before workerPromise is set. */
+          console.warn("This is the v2 interface - you don't need an onready() function.");
+        }
+      };
+      const workerPromise = await promiserFactory(promiserConfig)
+        .then((func)=>{
+          console.log("Init complete. Starting tests momentarily.");
+          globalThis.sqlite3TestModule.setStatus(null)/*hide the HTML-side is-loading spinner*/;
+          return func;
+        });
+
+      // Just to demonstrate rejection via onready() throwing:
+      promiserFactory( function(f){
+        throw new Error("Testing onready throw..");
+      })
+      .catch(e=>{ console.log("caught expected promise rejection:",e); });
+      
+      
+(async function(){
+  const eOutput = document.querySelector('#test-output');
+  const warn = console.warn.bind(console);
+  const error = console.error.bind(console);
+  const log = console.log.bind(console);
+  const logHtml = async function(cssClass,...args){
+    log.apply(this, args);
+    const ln = document.createElement('div');
+    if(cssClass) ln.classList.add(cssClass);
+    ln.append(document.createTextNode(args.join(' ')));
+    eOutput.append(ln);
+  };
+
+  let startTime;
+  const testCount = async ()=>{
+    logHtml("","Total test count:",T.counter+". Total time =",(performance.now() - startTime),"ms");
+  };
+
+  //why is this triggered even when we catch() a Promise?
+  //window.addEventListener('unhandledrejection', function(event) {
+  //  warn('unhandledrejection',event);
+  //});
+
+
+  const wtest = async function(msgType, msgArgs, callback){
+    if(2===arguments.length && 'function'===typeof msgArgs){
+      callback = msgArgs;
+      msgArgs = undefined;
+    }
+    const p = 1
+          ? workerPromise({type: msgType, args:msgArgs})
+          : workerPromise(msgType, msgArgs);
+    return callback ? p.then(callback).finally(testCount) : p;
+  };
+
+  let sqConfig;
+  const runTests = async function(){
+    const dbFilename = '/testing2.sqlite3';
+    startTime = performance.now();
+
+    await wtest('config-get', (ev)=>{
+      const r = ev.result;
+      log('sqlite3.config subset:', r);
+      T.assert('boolean' === typeof r.bigIntEnabled);
+      sqConfig = r;
+    });
+    logHtml('',
+            "Sending 'open' message and waiting for its response before continuing...");
+
+    await wtest('open', {
+      filename: dbFilename,
+      simulateError: 0 /* if true, fail the 'open' */,
+    }, function(ev){
+      const r = ev.result;
+      log("then open result",r);
+      T.assert(ev.dbId === r.dbId)
+        .assert(ev.messageId)
+        .assert('string' === typeof r.vfs);
+      promiserConfig.dbId = ev.dbId;
+    }).then(runTests2);
+  };
+
+  const runTests2 = async function(){
+    const mustNotReach = ()=>toss("This is not supposed to be reached.");
+
+    await wtest('exec',{
+      sql: ["create table t(a,b)",
+            "insert into t(a,b) values(1,2),(3,4),(5,6)"
+           ].join(';'),
+      resultRows: [], columnNames: [],
+      countChanges: sqConfig.bigIntEnabled ? 64 : true
+    }, function(ev){
+      ev = ev.result;
+      T.assert(0===ev.resultRows.length)
+        .assert(0===ev.columnNames.length)
+        .assert(sqConfig.bigIntEnabled
+                ? (3n===ev.changeCount)
+                : (3===ev.changeCount));
+    });
+
+    await wtest('exec',{
+      sql: 'select a a, b b from t order by a',
+      resultRows: [], columnNames: [],
+    }, function(ev){
+      ev = ev.result;
+      T.assert(3===ev.resultRows.length)
+        .assert(1===ev.resultRows[0][0])
+        .assert(6===ev.resultRows[2][1])
+        .assert(2===ev.columnNames.length)
+        .assert('b'===ev.columnNames[1]);
+    });
+
+    await wtest('exec',{
+      sql: 'select a a, b b from t order by a',
+      resultRows: [], columnNames: [],
+      rowMode: 'object',
+      countChanges: true
+    }, function(ev){
+      ev = ev.result;
+      T.assert(3===ev.resultRows.length)
+        .assert(1===ev.resultRows[0].a)
+        .assert(6===ev.resultRows[2].b)
+        .assert(0===ev.changeCount);
+    });
+
+    await wtest(
+      'exec',
+      {sql:'intentional_error'},
+      mustNotReach
+    ).catch((e)=>{
+      warn("Intentional error:",e);
+    });
+
+    await wtest('exec',{
+      sql:'select 1 union all select 3',
+      resultRows: []
+    }, function(ev){
+      ev = ev.result;
+      T.assert(2 === ev.resultRows.length)
+        .assert(1 === ev.resultRows[0][0])
+        .assert(3 === ev.resultRows[1][0])
+        .assert(undefined === ev.changeCount);
+    });
+
+    const resultRowTest1 = function f(ev){
+      if(undefined === f.counter) f.counter = 0;
+      if(null === ev.rowNumber){
+        /* End of result set. */
+        T.assert(undefined === ev.row)
+          .assert(2===ev.columnNames.length)
+          .assert('a'===ev.columnNames[0])
+          .assert('B'===ev.columnNames[1]);
+      }else{
+        T.assert(ev.rowNumber > 0);
+        ++f.counter;
+      }
+      log("exec() result row:",ev);
+      T.assert(null === ev.rowNumber || 'number' === typeof ev.row.B);
+    };
+    await wtest('exec',{
+      sql: 'select a a, b B from t order by a limit 3',
+      callback: resultRowTest1,
+      rowMode: 'object'
+    }, function(ev){
+      T.assert(3===resultRowTest1.counter);
+      resultRowTest1.counter = 0;
+    });
+
+    const resultRowTest2 = function f(ev){
+      if(null === ev.rowNumber){
+        /* End of result set. */
+        T.assert(undefined === ev.row)
+          .assert(1===ev.columnNames.length)
+          .assert('a'===ev.columnNames[0])
+      }else{
+        T.assert(ev.rowNumber > 0);
+        f.counter = ev.rowNumber;
+      }
+      log("exec() result row:",ev);
+      T.assert(null === ev.rowNumber || 'number' === typeof ev.row);
+    };
+    await wtest('exec',{
+      sql: 'select a a from t limit 3',
+      callback: resultRowTest2,
+      rowMode: 0
+    }, function(ev){
+      T.assert(3===resultRowTest2.counter);
+    });
+
+    const resultRowTest3 = function f(ev){
+      if(null === ev.rowNumber){
+        T.assert(3===ev.columnNames.length)
+          .assert('foo'===ev.columnNames[0])
+          .assert('bar'===ev.columnNames[1])
+          .assert('baz'===ev.columnNames[2]);
+      }else{
+        f.counter = ev.rowNumber;
+        T.assert('number' === typeof ev.row);
+      }
+    };
+    await wtest('exec',{
+      sql: "select 'foo' foo, a bar, 'baz' baz  from t limit 2",
+      callback: resultRowTest3,
+      columnNames: [],
+      rowMode: '$bar'
+    }, function(ev){
+      log("exec() result row:",ev);
+      T.assert(2===resultRowTest3.counter);
+    });
+
+    await wtest('exec',{
+      sql:[
+        'pragma foreign_keys=0;',
+        // ^^^ arbitrary query with no result columns
+        'select a, b from t order by a desc; select a from t;'
+        // exec() only honors SELECT results from the first
+        // statement with result columns (regardless of whether
+        // it has any rows).
+      ],
+      rowMode: 1,
+      resultRows: []
+    },function(ev){
+      const rows = ev.result.resultRows;
+      T.assert(3===rows.length).
+        assert(6===rows[0]);
+    });
+
+    await wtest('exec',{sql: 'delete from t where a>3'});
+
+    await wtest('exec',{
+      sql: 'select count(a) from t',
+      resultRows: []
+    },function(ev){
+      ev = ev.result;
+      T.assert(1===ev.resultRows.length)
+        .assert(2===ev.resultRows[0][0]);
+    });
+
+    await wtest('export', function(ev){
+      ev = ev.result;
+      T.assert('string' === typeof ev.filename)
+        .assert(ev.byteArray instanceof Uint8Array)
+        .assert(ev.byteArray.length > 1024)
+        .assert('application/x-sqlite3' === ev.mimetype);
+    });
+
+    /***** close() tests must come last. *****/
+    await wtest('close',{},function(ev){
+      T.assert('string' === typeof ev.result.filename);
+    });
+
+    await wtest('close', (ev)=>{
+      T.assert(undefined === ev.result.filename);
+    }).finally(()=>logHtml('',"That's all, folks!"));
+  }/*runTests2()*/;
+
+  runTests();
+})();
+</script>
+  </body>
+</html>
index 5d610e37b19db260642a20b66401287debfc955c..5165a7ec4b7c3e7009a2699385c2a59a76e5bdc3 100644 (file)
@@ -49,12 +49,17 @@ dist.top.extras := \
     tester1.js tester1.mjs \
     demo-jsstorage.html demo-jsstorage.js \
     demo-worker1.html demo-worker1.js \
-    demo-worker1-promiser.html demo-worker1-promiser.js
+    demo-worker1-promiser.html demo-worker1-promiser.js \
+    demo-worker1-promiser-esm.html
 dist.jswasm.extras := $(sqlite3-api.ext.jses) $(sqlite3.wasm)
 dist.common.extras := \
     $(wildcard $(dir.common)/*.css) \
     $(dir.common)/SqliteTestUtil.js
 
+#$(info sqlite3-worker1-promiser.mjs = $(sqlite3-worker1-promiser.mjs))
+#$(info sqlite3-worker1.js = $(sqlite3-worker1.js))
+#$(info sqlite3-api.ext.jses = $(sqlite3-api.ext.jses))
+#$(info dist.jswasm.extras = $(dist.jswasm.extras))
 .PHONY: dist snapshot
 # DIST_STRIP_COMMENTS $(call)able to be used in stripping C-style
 # from the dist copies of certain files.
@@ -67,7 +72,8 @@ endef
 # STRIP_K1.js = list of JS files which need to be passed through
 # $(bin.stripcomments) with a single -k flag.
 STRIP_K1.js := $(sqlite3-worker1.js) $(sqlite3-worker1-promiser.js) \
-  $(sqlite3-worker1-bundler-friendly.js) $(sqlite3-worker1-promiser-bundler-friendly.js)
+  $(sqlite3-worker1-bundler-friendly.js) \
+  $(sqlite3-api.ext.jses)
 # STRIP_K2.js = list of JS files which need to be passed through
 # $(bin.stripcomments) with two -k flags.
 STRIP_K2.js := $(sqlite3.js) $(sqlite3.mjs) \
@@ -88,6 +94,7 @@ STRIP_K2.js := $(sqlite3.js) $(sqlite3.mjs) \
 dist: \
     $(bin.stripccomments) $(bin.version-info) \
     $(dist.build) $(STRIP_K1.js) $(STRIP_K2.js) \
+    $(dist.jswasm.extras) $(dist.common.extras) \
     $(MAKEFILE) $(MAKEFILE.dist)
        @echo "Making end-user deliverables..."
        @rm -fr $(dist-dir.top)
index f5bcdc1cb2e221cd835cea914d74ff5689ad5991..7b778b0205ed586e7985045ce653d2353c99329d 100644 (file)
@@ -97,6 +97,8 @@
               wrapper is significantly easier to use, however.</li>
             <li><a href='demo-worker1-promiser.html'>demo-worker1-promiser</a>:
               a demo of the Promise-based wrapper of the Worker1 API.</li>
+            <li><a href='demo-worker1-promiser-esm.html'>demo-worker1-promiser-esm</a>:
+              same as the previous demo except loads the promiser from an ESM module.</li>
           </ul>
         </li>
       </ul>
index ebbfd6763d90b4224f545c5cd08bb4709e8d8d65..d12a3aa03f60ba0a2360c62f6fc78f8a7799d828 100644 (file)
@@ -84,6 +84,8 @@
               wrapper is significantly easier to use, however.</li>
             <li><a href='demo-worker1-promiser.html'>demo-worker1-promiser</a>:
               a demo of the Promise-based wrapper of the Worker1 API.</li>
+            <li><a href='demo-worker1-promiser-esm.html'>demo-worker1-promiser-esm</a>:
+              same as the previous demo except loads the promiser from an ESM module.</li>
           </ul>
         </li>
         <li>speedtest1 ports (sqlite3's primary benchmarking tool)...
index 9d045f3c98e793365e5113eb22467e69de06de3a..199d0f3b07692d4858886e1bb734cc3915efef2f 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Initial\swork\sat\sgetting\ssqlite3Worker1Promiser.v2()\sto\sreturn\sa\sPromise\sinstead\sof\susing\san\sonready()\scallback,\sand\salso\screating\san\sESM\sbuild\sfor\spromiser1\sper\suser\srequest.\sIt\sseems\sto\swork\sbut\srequires\smore\stesting.
-D 2024-03-07T16:04:43.823
+C wasm\spromiser.v2\sis\sessentially\sworking\sbut\sthe\sdemo\scode\sis\sdouble-loading\sthe\smodule\sfor\sas-yet-undetermined\sreasons.
+D 2024-03-07T17:56:08.872
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -587,7 +587,7 @@ F ext/userauth/sqlite3userauth.h 7f3ea8c4686db8e40b0a0e7a8e0b00fac13aa7a3
 F ext/userauth/user-auth.txt ca7e9ee82ca4e1c1744295f8184dd70edfae1992865d26c64303f539eb6c084c
 F ext/userauth/userauth.c 7f00cded7dcaa5d47f54539b290a43d2e59f4b1eb5f447545fa865f002fc80cb
 F ext/wasm/EXPORTED_FUNCTIONS.fiddle.in 27450c8b8c70875a260aca55435ec927068b34cef801a96205adb81bdcefc65c
-F ext/wasm/GNUmakefile e04f36fec0ab949424622a906020902651bd8d17f9696c56ed572eebc63e2355
+F ext/wasm/GNUmakefile fc361b472fdbf1256931769339d6d6e866048f6fcdbbe4bc1a60bfe70034895f
 F ext/wasm/README-dist.txt 6382cb9548076fca472fb3330bbdba3a55c1ea0b180ff9253f084f07ff383576
 F ext/wasm/README.md a8a2962c3aebdf8d2104a9102e336c5554e78fc6072746e5daf9c61514e7d193
 F ext/wasm/SQLTester/GNUmakefile e0794f676d55819951bbfae45cc5e8d7818dc460492dc317ce7f0d2eca15caff
@@ -616,7 +616,7 @@ F ext/wasm/api/sqlite3-vfs-opfs-sahpool.c-pp.js 5a430874906ff3f4a6ca69aadf0c2aae
 F ext/wasm/api/sqlite3-vfs-opfs.c-pp.js fe427645e1499618f5fa7bc670af850577d8bcc132df982078690c9bf8400baa
 F ext/wasm/api/sqlite3-vtab-helper.c-pp.js a2fcbc3fecdd0eea229283584ebc122f29d98194083675dbe5cb2cf3a17fe309
 F ext/wasm/api/sqlite3-wasm.c d33a16495ca871781e78812d3a18fed78b797468fffee657b8d7199b277ff359
-F ext/wasm/api/sqlite3-worker1-promiser.c-pp.js c11220b21f748c955ca798ad43ba7fea75ca0bf8dba78f46508f09517de26c05
+F ext/wasm/api/sqlite3-worker1-promiser.c-pp.js aff58bf96c253451af02194bf883e1c4851ef4ddbbff0cdd6cfca8f04231ec5d
 F ext/wasm/api/sqlite3-worker1.c-pp.js 5e8706c2c4af2a57fbcdc02f4e7ef79869971bc21bb8ede777687786ce1c92d5
 F ext/wasm/batch-runner-sahpool.html e9a38fdeb36a13eac7b50241dfe7ae066fe3f51f5c0b0151e7baee5fce0d07a7
 F ext/wasm/batch-runner-sahpool.js 54a3ac228e6c4703fe72fb65c897e19156263a51fe9b7e21d2834a45e876aabd
@@ -632,19 +632,20 @@ F ext/wasm/demo-123.html 8c70a412ce386bd3796534257935eb1e3ea5c581e5d5aea0490b823
 F ext/wasm/demo-123.js c7b3cca50c55841c381a9ca4f9396e5bbdc6114273d0b10a43e378e32e7be5bf
 F ext/wasm/demo-jsstorage.html 409c4be4af5f207fb2877160724b91b33ea36a3cd8c204e8da1acb828ffe588e
 F ext/wasm/demo-jsstorage.js 44e3ae7ec2483b6c511384c3c290beb6f305c721186bcf5398ca4e00004a06b8
+F ext/wasm/demo-worker1-promiser-esm.html 181039b54e1d88181626d7e157f0f8832a532cf5c0ff6a62607cdbcc746649f3
 F ext/wasm/demo-worker1-promiser.html 1de7c248c7c2cfd4a5783d2aa154bce62d74c6de98ab22f5786620b3354ed15f
 F ext/wasm/demo-worker1-promiser.js e4cd1089269d106dd3bd20684eaddcd176c73baa31867ba0e445c8e7e29160b5
 F ext/wasm/demo-worker1.html 2c178c1890a2beb5a5fecb1453e796d067a4b8d3d2a04d65ca2eb1ab2c68ef5d
 F ext/wasm/demo-worker1.js 836bece8615b17b1b572584f7b15912236a5947fe8c68b98d2737d7e287447ef
-F ext/wasm/dist.make 3a851858aad72e246a5d9c5aaf6b6a144305f1bf898ac1846760ea7bab95c9a3
+F ext/wasm/dist.make 8a6e829868e88a67a82670c6bb5d7ffda5dc46aa3f227ba3563c346d246f96d5
 F ext/wasm/example_extra_init.c 2347cd69d19d839ef4e5e77b7855103a7fe3ef2af86f2e8c95839afd8b05862f
 F ext/wasm/fiddle.make 3c2eace29255d6ddd219f5d8cc2728cb28b9fe717ea80b6062c2a6178947a16b
 F ext/wasm/fiddle/emscripten.css 3d253a6fdb8983a2ac983855bfbdd4b6fa1ff267c28d69513dd6ef1f289ada3f
 F ext/wasm/fiddle/fiddle-worker.js 850e66fce39b89d59e161d1abac43a181a4caa89ddeea162765d660277cd84ce
 F ext/wasm/fiddle/fiddle.js 04a638e3ed8fc9ca7c05cbe73ac4196e4529ec564639a76fbcecaffdf62bd983
 F ext/wasm/fiddle/index.html 5daf54e8f3d7777cbb1ca4f93affe28858dbfff25841cb4ab81d694efed28ec2
-F ext/wasm/index-dist.html e91d76e4581185238fd3d42ed86ec600f7023ed3e3a944c5c356f25304bf1263
-F ext/wasm/index.html b31ce41c0da476d5ffcef23069b9d3415b419d65af5779096ebcfbcbade453a9
+F ext/wasm/index-dist.html 564b5ec5669676482c5a25dea9e721d8eafed426ecb155f93d29aeff8507511f
+F ext/wasm/index.html 4337f495416756802669f69f9f9f3df9f87ee4c1918e6718719b4b5718e4713a
 F ext/wasm/jaccwabyt/jaccwabyt.js 1264710db3cfbcb6887d95665b7aeba60c1126eaef789ca4cf1a4a17d5bc7f54
 F ext/wasm/jaccwabyt/jaccwabyt.md 59a20df389abcc3606eb4eaea7fb7ba14504beb3e345dbea9b99a0618ba3bec8
 F ext/wasm/module-symbols.html dc476b403369b26a1a23773e13b80f41b9a49f0825e81435fe3600a7cfbbe337
@@ -2176,11 +2177,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
 F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 483fa2969e1e10cd8e8d2f9e3027871c65b1360b6c23897efe3ce63a3a55ae13
-R fb2d3021442c55c82ff56e48b32fdd31
-T *branch * wasm-promiser1-v2
-T *sym-wasm-promiser1-v2 *
-T -sym-trunk * Cancelled\sby\sbranch.
+P 0e272123ace55ed63fe86632671cca48e8965a28fc3625324984028729fc203f
+R c8505d5644abe3c20f07eb87db82c9ac
 U stephan
-Z d10f630418c41733e8d0108d272da900
+Z 20c543fa694914574de31b908812d405
 # Remove this line to create a well-formed Fossil manifest.
index 145a2be6b8f31ba386e540e6abd4af537366effa..1bcbadbb823aa8faf6d20d9c1cd358033af6a66c 100644 (file)
@@ -1 +1 @@
-0e272123ace55ed63fe86632671cca48e8965a28fc3625324984028729fc203f
\ No newline at end of file
+aa877ce0c3b3aa1accd6e5fcd722d1bfaa79bea28c04c6badd8a547cea4bbc63
\ No newline at end of file