The very basics of a Promise-based proxy for the Worker #1 API. Still requires considerable cleanup, testing, and a solution for the exec-callback-via-event-type-name problem.
FossilOrigin-Name: 1e447849fb65887e806e3348a8a68f70ea6802bc0a1e56c385a279f27cc0cdda
This commit is contained in:
parent
a9ac2ed069
commit
efeee19a95
@ -191,10 +191,7 @@
|
||||
*/
|
||||
initSqlite3: function(){
|
||||
self.sqlite3ApiConfig = this.sqlite3ApiConfig;
|
||||
return self.sqlite3InitModule(this).then(function(M){
|
||||
delete self.sqlite3ApiConfig;
|
||||
return M;
|
||||
});
|
||||
return self.sqlite3InitModule(this).finally(()=>delete self.sqlite3ApiConfig);
|
||||
}
|
||||
};
|
||||
})(self/*window or worker*/);
|
||||
|
33
ext/wasm/testing-worker-promise.html
Normal file
33
ext/wasm/testing-worker-promise.html
Normal file
@ -0,0 +1,33 @@
|
||||
<!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 tests</title>
|
||||
</head>
|
||||
<body>
|
||||
<header id='titlebar'><span>worker-promise 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="testing-worker-promise.js"></script>
|
||||
</body>
|
||||
</html>
|
139
ext/wasm/testing-worker-promise.js
Normal file
139
ext/wasm/testing-worker-promise.js
Normal file
@ -0,0 +1,139 @@
|
||||
/*
|
||||
2022-08-23
|
||||
|
||||
The author disclaims copyright to this source code. In place of a
|
||||
legal notice, here is a blessing:
|
||||
|
||||
* May you do good and not evil.
|
||||
* May you find forgiveness for yourself and forgive others.
|
||||
* May you share freely, never taking more than you give.
|
||||
|
||||
***********************************************************************
|
||||
|
||||
|
||||
UNDER CONSTRUCTION: a Promise-based proxy for for the sqlite3 Worker
|
||||
#1 API.
|
||||
*/
|
||||
'use strict';
|
||||
(function(){
|
||||
const T = self.SqliteTestUtil;
|
||||
const DbState = {
|
||||
id: undefined
|
||||
};
|
||||
const eOutput = document.querySelector('#test-output');
|
||||
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);
|
||||
};
|
||||
const warn = console.warn.bind(console);
|
||||
const error = console.error.bind(console);
|
||||
|
||||
let startTime;
|
||||
const logEventResult = async function(evd){
|
||||
logHtml(evd.errorClass ? 'error' : '',
|
||||
"response to",evd.messageId,"Worker time =",
|
||||
(evd.workerRespondTime - evd.workerReceivedTime),"ms.",
|
||||
"Round-trip event time =",
|
||||
(performance.now() - evd.departureTime),"ms.",
|
||||
(evd.errorClass ? evd.message : "")
|
||||
);
|
||||
};
|
||||
|
||||
const testCount = async ()=>{
|
||||
logHtml("","Total test count:",T.counter+". Total time =",(performance.now() - startTime),"ms");
|
||||
};
|
||||
|
||||
// Inspiration: https://stackoverflow.com/a/52439530
|
||||
const worker = new Worker("sqlite3-worker1.js");
|
||||
worker.onerror = function(event){
|
||||
error("worker.onerror",event);
|
||||
};
|
||||
const WorkerPromiseHandler = Object.create(null);
|
||||
WorkerPromiseHandler.nextId = function f(){
|
||||
return 'msg#'+(f._ = (f._ || 0) + 1);
|
||||
};
|
||||
|
||||
/** Posts a worker message as {type:eventType, data:eventData}. */
|
||||
const requestWork = async function(eventType, eventData){
|
||||
//log("requestWork", eventType, eventData);
|
||||
T.assert(eventData && 'object'===typeof eventData);
|
||||
/* ^^^ that is for the testing and messageId-related code, not
|
||||
a hard requirement of all of the Worker-exposed APIs. */
|
||||
const wph = WorkerPromiseHandler;
|
||||
const msgId = wph.nextId();
|
||||
const proxy = wph[msgId] = Object.create(null);
|
||||
proxy.promise = new Promise(function(resolve, reject){
|
||||
proxy.resolve = resolve;
|
||||
proxy.reject = reject;
|
||||
const msg = {
|
||||
type: eventType,
|
||||
args: eventData,
|
||||
dbId: DbState.id,
|
||||
messageId: msgId,
|
||||
departureTime: performance.now()
|
||||
};
|
||||
log("Posting",eventType,"message to worker dbId="+(DbState.id||'default')+':',msg);
|
||||
worker.postMessage(msg);
|
||||
});
|
||||
log("Set up promise",proxy);
|
||||
return proxy.promise;
|
||||
};
|
||||
|
||||
|
||||
const runOneTest = async function(eventType, eventData, callback){
|
||||
T.assert(eventData && 'object'===typeof eventData);
|
||||
/* ^^^ that is for the testing and messageId-related code, not
|
||||
a hard requirement of all of the Worker-exposed APIs. */
|
||||
let p = requestWork(eventType, eventData);
|
||||
if(callback) p.then(callback).finally(testCount);
|
||||
return p;
|
||||
};
|
||||
|
||||
const runTests = async function(){
|
||||
logHtml('',
|
||||
"Sending 'open' message and waiting for its response before continuing.");
|
||||
startTime = performance.now();
|
||||
runOneTest('open', {
|
||||
filename:'testing2.sqlite3',
|
||||
simulateError: 0 /* if true, fail the 'open' */
|
||||
}, function(ev){
|
||||
log("then open result",ev);
|
||||
T.assert('testing2.sqlite3'===ev.result.filename)
|
||||
.assert(ev.dbId)
|
||||
.assert(ev.messageId)
|
||||
.assert(DbState.id === ev.dbId);
|
||||
}).catch((err)=>error("error response:",err));
|
||||
};
|
||||
|
||||
worker.onmessage = function(ev){
|
||||
ev = ev.data;
|
||||
(('error'===ev.type) ? error : log)('worker.onmessage',ev);
|
||||
const msgHandler = WorkerPromiseHandler[ev.messageId];
|
||||
if(!msgHandler){
|
||||
if('worker1-ready'===ev.result) {
|
||||
/*sqlite3-api/worker1-ready is fired when the Worker1 API initializes*/
|
||||
self.sqlite3TestModule.setStatus(null)/*hide the HTML-side is-loading spinner*/;
|
||||
runTests();
|
||||
return;
|
||||
}
|
||||
error("Unhandled worker message:",ev);
|
||||
return;
|
||||
}
|
||||
logEventResult(ev);
|
||||
delete WorkerPromiseHandler[ev.messageId];
|
||||
if('error'===ev.type){
|
||||
msgHandler.reject(ev);
|
||||
}
|
||||
else{
|
||||
if(!DbState.id && ev.dbId) DbState.id = ev.dbId;
|
||||
msgHandler.resolve(ev); // async, so testCount() results on next line are out of order
|
||||
//testCount();
|
||||
}
|
||||
};
|
||||
|
||||
log("Init complete, but async init bits may still be running.");
|
||||
})();
|
14
manifest
14
manifest
@ -1,5 +1,5 @@
|
||||
C Significant\srestructuring\sof\sthe\sWorker\s#1\srequest/response\sobject\sstructures\sto\simprove\sreadability\sand\sclarity.
|
||||
D 2022-08-24T00:10:45.121
|
||||
C The\svery\sbasics\sof\sa\sPromise-based\sproxy\sfor\sthe\sWorker\s#1\sAPI.\sStill\srequires\sconsiderable\scleanup,\stesting,\sand\sa\ssolution\sfor\sthe\sexec-callback-via-event-type-name\sproblem.
|
||||
D 2022-08-24T00:51:39.887
|
||||
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
|
||||
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
|
||||
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
|
||||
@ -489,7 +489,7 @@ F ext/wasm/api/sqlite3-api-prologue.js 6e0e7787ed955ea2b6158e0bb7608f63b54236847
|
||||
F ext/wasm/api/sqlite3-api-worker1.js c9e4edb89f41a4fa65d136ae180c1bc0beb694eb95f7d9e6936fbb702914c160
|
||||
F ext/wasm/api/sqlite3-wasi.h 25356084cfe0d40458a902afb465df8c21fc4152c1d0a59b563a3fba59a068f9
|
||||
F ext/wasm/api/sqlite3-wasm.c 0d81282eaeff2a6e9fc5c28a388c5c5b45cf25a9393992fa511ac009b27df982
|
||||
F ext/wasm/common/SqliteTestUtil.js 04156a3b714b1b17a7261d21dd51341a8aeb9880a223e1e7519de98c2cceb414
|
||||
F ext/wasm/common/SqliteTestUtil.js eb96275bed43fdb364b7d65bcded0ca5e22aaacff120d593d1385f852f486247
|
||||
F ext/wasm/common/emscripten.css 3d253a6fdb8983a2ac983855bfbdd4b6fa1ff267c28d69513dd6ef1f289ada3f
|
||||
F ext/wasm/common/testing.css 572cf1ffae0b6eb7ca63684d3392bf350217a07b90e7a896e4fa850700c989b0
|
||||
F ext/wasm/common/whwasmutil.js 41b8e097e0a9cb07c24c0ede3c81b72470a63f4a4efb07f75586dc131569f5ae
|
||||
@ -509,6 +509,8 @@ F ext/wasm/scratchpad-opfs-worker.html 66c1d15d678f3bd306373d76b61c6c8aef988f61f
|
||||
F ext/wasm/scratchpad-opfs-worker.js 3ec2868c669713145c76eb5877c64a1b20741f741817b87c907a154b676283a9
|
||||
F ext/wasm/scratchpad-opfs-worker2.js 5f2237427ac537b8580b1c659ff14ad2621d1694043eaaf41ae18dbfef2e48c0
|
||||
F ext/wasm/sqlite3-worker1.js 0c1e7626304543969c3846573e080c082bf43bcaa47e87d416458af84f340a9e
|
||||
F ext/wasm/testing-worker-promise.html ba3d5423cfbdc96c332af3632dfcb61527ba8fd7e487b3bf3f07542f890c3e08
|
||||
F ext/wasm/testing-worker-promise.js c05c46a3a22b1910f6a1db11f3da6df701259eaa1277ddba085247b7f9059423
|
||||
F ext/wasm/testing1.html 528001c7e32ee567abc195aa071fd9820cc3c8ffc9c8a39a75e680db05f0c409
|
||||
F ext/wasm/testing1.js 2def7a86c52ff28b145cb86188d5c7a49d5993f9b78c50d140e1c31551220955
|
||||
F ext/wasm/testing2.html a66951c38137ff1d687df79466351f3c734fa9c6d9cce71d3cf97c291b2167e3
|
||||
@ -2006,8 +2008,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 c8eb3aa8e0f487f14791214caf70d1aa03866e01345c7fa1d5607c24c39dde1d
|
||||
R ea27eb9ac1a6ed815943946a889ca949
|
||||
P 03b9db9b98cb36faa7de5a8a64d2e13c4aeaadfefb33ac92bb41056f6be3f121
|
||||
R 5b16a785d8c414a8eb9d618c8d9d8cea
|
||||
U stephan
|
||||
Z 3af622548a101a1182c5d00aa6a9dd08
|
||||
Z fdaa5cf9f1bfd4215c6ebf07223819c1
|
||||
# Remove this line to create a well-formed Fossil manifest.
|
||||
|
@ -1 +1 @@
|
||||
03b9db9b98cb36faa7de5a8a64d2e13c4aeaadfefb33ac92bb41056f6be3f121
|
||||
1e447849fb65887e806e3348a8a68f70ea6802bc0a1e56c385a279f27cc0cdda
|
Loading…
Reference in New Issue
Block a user