patchJavaScriptRuntime function
Extend the JavaScript runtime with some missing stuff so that it can work together with RxDB JavaScript code.
Implementation
Future<dynamic> patchJavaScriptRuntime(FlutterQjs engine) async {
final prefs = await SharedPreferences.getInstance();
await engine.evaluate('process = {};');
await engine.evaluate('window = {};');
await engine.evaluate('console = {};');
await engine.evaluate('BigInt = {};');
await engine.evaluate('BigInt64Array = {};');
await engine.evaluate('BigUint64Array = {};');
final setToGlobalObject =
await engine.evaluate("(key, val) => { this[key] = val; }");
await setToGlobalObject.invoke([
"setTimeoutWait",
(int time) async {
await Future.delayed(Duration(milliseconds: time));
}
]);
await engine.evaluate("""
let timeoutId = 0;
let runningTimeouts = new Set();
function setTimeout(fn, time) {
let id = timeoutId++;
runningTimeouts.add(id);
(async() => {
await setTimeoutWait(time);
if(!runningTimeouts.has(id)){
return;
}
clearTimeout(id);
fn();
})();
return id;
}
function clearTimeout(id) {
runningTimeouts.delete(id);
}
""");
await engine.evaluate("""
let intervalid = 0;
let intervalMap = {};
function setInterval(callback, delay = 0, ...args) {
let id = intervalid++;
function repeat() {
intervalMap[id] = setTimeout(() => {
callback(...args)
if(intervalMap[id]) {
repeat()
}
}, delay)
}
repeat();
return id;
}
function clearInterval(intervalid) {
clearTimeout(intervalMap[intervalid])
delete intervalMap[intervalid]
}
""");
await setToGlobalObject.invoke([
"persistKeyValue",
(String key, String value) async {
await prefs.setString(key, value);
}
]);
await setToGlobalObject.invoke([
"readKeyValue",
(String key) async {
final String? value = prefs.getString(key);
return value;
}
]);
return setToGlobalObject;
}