From b09f30e8df57db2a7dbb52ce62cfd88995818f14 Mon Sep 17 00:00:00 2001 From: Joey Pender Date: Wed, 18 Oct 2023 09:18:24 -0500 Subject: [PATCH] fix: JS Engine Fixes (#55) --- .changeset/violet-schools-tie.md | 8 + apps/example-app/ios/App/Podfile.lock | 4 +- apps/example-app/src/background.js | 35 +- apps/example-app/src/pages/Tab1.tsx | 47 +- .../androidTestResultsUserPreferences.xml | 156 +++++ .../src/main/AndroidManifest.xml | 1 + .../src/main/cpp/CMakeLists.txt | 19 +- .../src/main/cpp/android_js_engine.cpp | 8 - .../src/main/cpp/api/api_blob.cpp | 131 ++++ .../src/main/cpp/api/api_blob.h | 9 + .../src/main/cpp/{ => api}/api_console.cpp | 12 +- .../src/main/cpp/{ => api}/api_console.h | 11 +- .../src/main/cpp/api/api_crypto.cpp | 67 ++ .../src/main/cpp/{ => api}/api_crypto.h | 8 +- .../src/main/cpp/{ => api}/api_events.cpp | 12 +- .../src/main/cpp/api/api_events.h | 8 + .../src/main/cpp/api/api_fetch.cpp | 114 ++++ .../src/main/cpp/api/api_fetch.h | 9 + .../src/main/cpp/api/api_js_response.cpp | 359 +++++++++++ .../src/main/cpp/api/api_js_response.h | 11 + .../src/main/cpp/api/api_text.cpp | 191 ++++++ .../src/main/cpp/api/api_text.h | 9 + .../src/main/cpp/{ => api}/api_timeout.cpp | 43 +- .../src/main/cpp/{ => api}/api_timeout.h | 10 +- .../src/main/cpp/api_crypto.cpp | 96 --- .../src/main/cpp/api_device.cpp | 62 -- .../src/main/cpp/api_events.h | 8 - .../src/main/cpp/api_fetch.cpp | 257 -------- .../src/main/cpp/api_fetch.h | 18 - .../src/main/cpp/api_geolocation.cpp | 33 - .../src/main/cpp/api_geolocation.h | 8 - .../android-js-engine/src/main/cpp/api_kv.cpp | 107 ---- .../src/main/cpp/api_notifications.cpp | 27 - .../src/main/cpp/api_notifications.h | 8 - .../src/main/cpp/api_text.cpp | 234 ------- .../android-js-engine/src/main/cpp/api_text.h | 9 - .../src/main/cpp/cap_api/api_cap_device.cpp | 60 ++ .../api_cap_device.h} | 8 +- .../main/cpp/cap_api/api_cap_geolocation.cpp | 32 + .../main/cpp/cap_api/api_cap_geolocation.h | 8 + .../src/main/cpp/cap_api/api_cap_kv.cpp | 84 +++ .../cpp/{api_kv.h => cap_api/api_cap_kv.h} | 8 +- .../cpp/cap_api/api_cap_notifications.cpp | 31 + .../main/cpp/cap_api/api_cap_notifications.h | 8 + .../src/main/cpp/context.cpp | 589 ++++++++---------- .../android-js-engine/src/main/cpp/context.h | 87 +-- .../android-js-engine/src/main/cpp/errors.cpp | 53 +- .../android-js-engine/src/main/cpp/errors.h | 6 +- .../android-js-engine/src/main/cpp/java.cpp | 177 ++++++ .../android-js-engine/src/main/cpp/java.h | 51 ++ .../src/main/cpp/jni_classes.cpp | 118 ---- .../src/main/cpp/jni_classes.h | 38 -- .../src/main/cpp/native_context.cpp | 69 +- .../src/main/cpp/native_runner.cpp | 13 +- .../src/main/cpp/quickjs/quickjs.c | 14 +- .../src/main/cpp/quickjs/quickjs.h | 1 + .../android-js-engine/src/main/cpp/runner.cpp | 105 +++- .../android-js-engine/src/main/cpp/runner.h | 26 +- .../io/ionic/android_js_engine/Context.kt | 65 +- .../io/ionic/android_js_engine/ContextAPI.kt | 91 --- .../ionic/android_js_engine/EngineErrors.kt | 2 + .../io/ionic/android_js_engine/NativeLib.kt | 17 - .../java/io/ionic/android_js_engine/Runner.kt | 69 +- .../java/io/ionic/android_js_engine/WebAPI.kt | 98 +++ .../io/ionic/backgroundrunner/ContextTests.kt | 176 ++++-- .../io/ionic/backgroundrunner/RunnerTests.kt | 66 ++ .../android/src/main/AndroidManifest.xml | 1 + .../plugin/BackgroundRunner.kt | 53 +- .../plugin/BackgroundRunnerPlugin.kt | 3 +- .../backgroundrunner/plugin/RunnerWorker.kt | 3 + .../ios/Plugin/BackgroundRunner.swift | 65 +- .../ios/Plugin/BackgroundRunnerPlugin.swift | 3 +- .../ios/Plugin/Context+CapacitorAPI.swift | 10 +- .../Sources/RunnerEngine/Context.swift | 71 +-- .../Sources/RunnerEngine/Errors.swift | 1 + .../Sources/RunnerEngine/Runner.swift | 46 +- .../RunnerEngineTests/ContextTests.swift | 18 +- .../Tests/RunnerEngineTests/RunnerTests.swift | 49 +- 78 files changed, 2652 insertions(+), 1990 deletions(-) create mode 100644 .changeset/violet-schools-tie.md delete mode 100644 packages/android-engine/android-js-engine/src/main/cpp/android_js_engine.cpp create mode 100644 packages/android-engine/android-js-engine/src/main/cpp/api/api_blob.cpp create mode 100644 packages/android-engine/android-js-engine/src/main/cpp/api/api_blob.h rename packages/android-engine/android-js-engine/src/main/cpp/{ => api}/api_console.cpp (86%) rename packages/android-engine/android-js-engine/src/main/cpp/{ => api}/api_console.h (73%) create mode 100644 packages/android-engine/android-js-engine/src/main/cpp/api/api_crypto.cpp rename packages/android-engine/android-js-engine/src/main/cpp/{ => api}/api_crypto.h (53%) rename packages/android-engine/android-js-engine/src/main/cpp/{ => api}/api_events.cpp (65%) create mode 100644 packages/android-engine/android-js-engine/src/main/cpp/api/api_events.h create mode 100644 packages/android-engine/android-js-engine/src/main/cpp/api/api_fetch.cpp create mode 100644 packages/android-engine/android-js-engine/src/main/cpp/api/api_fetch.h create mode 100644 packages/android-engine/android-js-engine/src/main/cpp/api/api_js_response.cpp create mode 100644 packages/android-engine/android-js-engine/src/main/cpp/api/api_js_response.h create mode 100644 packages/android-engine/android-js-engine/src/main/cpp/api/api_text.cpp create mode 100644 packages/android-engine/android-js-engine/src/main/cpp/api/api_text.h rename packages/android-engine/android-js-engine/src/main/cpp/{ => api}/api_timeout.cpp (56%) rename packages/android-engine/android-js-engine/src/main/cpp/{ => api}/api_timeout.h (70%) delete mode 100644 packages/android-engine/android-js-engine/src/main/cpp/api_crypto.cpp delete mode 100644 packages/android-engine/android-js-engine/src/main/cpp/api_device.cpp delete mode 100644 packages/android-engine/android-js-engine/src/main/cpp/api_events.h delete mode 100644 packages/android-engine/android-js-engine/src/main/cpp/api_fetch.cpp delete mode 100644 packages/android-engine/android-js-engine/src/main/cpp/api_fetch.h delete mode 100644 packages/android-engine/android-js-engine/src/main/cpp/api_geolocation.cpp delete mode 100644 packages/android-engine/android-js-engine/src/main/cpp/api_geolocation.h delete mode 100644 packages/android-engine/android-js-engine/src/main/cpp/api_kv.cpp delete mode 100644 packages/android-engine/android-js-engine/src/main/cpp/api_notifications.cpp delete mode 100644 packages/android-engine/android-js-engine/src/main/cpp/api_notifications.h delete mode 100644 packages/android-engine/android-js-engine/src/main/cpp/api_text.cpp delete mode 100644 packages/android-engine/android-js-engine/src/main/cpp/api_text.h create mode 100644 packages/android-engine/android-js-engine/src/main/cpp/cap_api/api_cap_device.cpp rename packages/android-engine/android-js-engine/src/main/cpp/{api_device.h => cap_api/api_cap_device.h} (52%) create mode 100644 packages/android-engine/android-js-engine/src/main/cpp/cap_api/api_cap_geolocation.cpp create mode 100644 packages/android-engine/android-js-engine/src/main/cpp/cap_api/api_cap_geolocation.h create mode 100644 packages/android-engine/android-js-engine/src/main/cpp/cap_api/api_cap_kv.cpp rename packages/android-engine/android-js-engine/src/main/cpp/{api_kv.h => cap_api/api_cap_kv.h} (60%) create mode 100644 packages/android-engine/android-js-engine/src/main/cpp/cap_api/api_cap_notifications.cpp create mode 100644 packages/android-engine/android-js-engine/src/main/cpp/cap_api/api_cap_notifications.h create mode 100644 packages/android-engine/android-js-engine/src/main/cpp/java.cpp create mode 100644 packages/android-engine/android-js-engine/src/main/cpp/java.h delete mode 100644 packages/android-engine/android-js-engine/src/main/cpp/jni_classes.cpp delete mode 100644 packages/android-engine/android-js-engine/src/main/cpp/jni_classes.h delete mode 100644 packages/android-engine/android-js-engine/src/main/java/io/ionic/android_js_engine/ContextAPI.kt delete mode 100644 packages/android-engine/android-js-engine/src/main/java/io/ionic/android_js_engine/NativeLib.kt create mode 100644 packages/android-engine/android-js-engine/src/main/java/io/ionic/android_js_engine/WebAPI.kt create mode 100644 packages/android-engine/app/src/androidTest/java/io/ionic/backgroundrunner/RunnerTests.kt diff --git a/.changeset/violet-schools-tie.md b/.changeset/violet-schools-tie.md new file mode 100644 index 0000000..1cfc05c --- /dev/null +++ b/.changeset/violet-schools-tie.md @@ -0,0 +1,8 @@ +--- +"@capacitor/background-runner": minor +--- + +Reliability fixes for the JS Engine used in the Background Runner: +- (Android) Improvements to QuickJS integration +- (Android / iOS) Improvements in the handling of multiple dispatched events + diff --git a/apps/example-app/ios/App/Podfile.lock b/apps/example-app/ios/App/Podfile.lock index 6e70d0e..1451279 100644 --- a/apps/example-app/ios/App/Podfile.lock +++ b/apps/example-app/ios/App/Podfile.lock @@ -3,7 +3,7 @@ PODS: - CapacitorCordova - CapacitorApp (5.0.6): - Capacitor - - CapacitorBackgroundRunner (1.0.0): + - CapacitorBackgroundRunner (1.0.5): - Capacitor - CapacitorCordova (5.2.2) - CapacitorHaptics (5.0.6): @@ -41,7 +41,7 @@ EXTERNAL SOURCES: SPEC CHECKSUMS: Capacitor: 070b18988e0f566728ae9a5eb3a7a974595f1626 CapacitorApp: 024e1b1bea5f883d79f6330d309bc441c88ad04a - CapacitorBackgroundRunner: 40b23c5d087ed6ee582efae59784a4b2ec416962 + CapacitorBackgroundRunner: f2415aebbcea4e744eb45f785a50f07ba72f1d0b CapacitorCordova: 3773395d5331add072300ff6041ca2cf7b93cb0b CapacitorHaptics: 1fffc1217c7e64a472d7845be50fb0c2f7d4204c CapacitorKeyboard: b978154b024a5f65e044908e37d15b7de58b9d12 diff --git a/apps/example-app/src/background.js b/apps/example-app/src/background.js index dd4a604..c3dbcfb 100644 --- a/apps/example-app/src/background.js +++ b/apps/example-app/src/background.js @@ -61,13 +61,21 @@ addEventListener("fetchTest", async (resolve, reject, args) => { }); // capacitor APIs -addEventListener("testCapKV", async (resolve, reject, args) => { +addEventListener("testCapKVSet", async (resolve, reject, args) => { try { - CapacitorKV.set("testValue", "hello world"); + CapacitorKV.set("testValue", args.value); + resolve(); + } catch (err) { + console.error(err); + reject(err); + } +}); +addEventListener("testCapKVGet", async (resolve, reject, args) => { + try { const result = CapacitorKV.get("testValue"); - console.log("test value is: " + result); - + console.log(result); + console.log(JSON.stringify(result)); resolve(result); } catch (err) { console.error(err); @@ -75,10 +83,20 @@ addEventListener("testCapKV", async (resolve, reject, args) => { } }); +addEventListener("testCapKVRemove", async (resolve, reject, args) => { + try { + CapacitorKV.remove("testValue"); + resolve(); + } catch (err) { + console.error(err); + reject(err); + } +}); + addEventListener("testCapNotification", async (resolve, reject, args) => { try { let scheduleDate = new Date(); - scheduleDate.setSeconds(scheduleDate.getSeconds() + 30); + scheduleDate.setSeconds(scheduleDate.getSeconds() + 60); CapacitorNotifications.schedule([ { @@ -109,7 +127,7 @@ addEventListener("testCapacitorGeolocation", async (resolve, reject, args) => { addEventListener( "testCapacitorDeviceBatteryStatus", - async (resolve, reject, args) => { + (resolve, reject, args) => { try { const info = CapacitorDevice.getBatteryStatus(); console.log(JSON.stringify(info)); @@ -123,7 +141,7 @@ addEventListener( addEventListener( "testCapacitorDeviceNetworkStatus", - async (resolve, reject, args) => { + (resolve, reject, args) => { try { const info = CapacitorDevice.getNetworkStatus(); console.log(JSON.stringify(info)); @@ -153,7 +171,7 @@ addEventListener("remoteNotification", (resolve, reject, args) => { addEventListener("checkWatchReachability", (resolve, reject, args) => { const reachable = CapacitorWatch.isReachable(); - + try { resolve({ reachable: reachable, }); @@ -170,6 +188,7 @@ addEventListener("sendMessageToWatch", (resolve, reject, args) => { msg: "Hello World", }); + try { resolve(); } catch (err) { console.error(err); diff --git a/apps/example-app/src/pages/Tab1.tsx b/apps/example-app/src/pages/Tab1.tsx index c691cf9..9f6067d 100644 --- a/apps/example-app/src/pages/Tab1.tsx +++ b/apps/example-app/src/pages/Tab1.tsx @@ -37,21 +37,58 @@ const Tab1: React.FC = () => { } }; - const onTestCapKV = async () => { + const onTestCapKVSet = async () => { + setCommandOutput(""); + try { + await BackgroundRunner.dispatchEvent({ + label: "com.example.background.task", + event: "testCapKVSet", + details: { + value: "Hello World" + }, + }); + setCommandOutput( + `success: stored value 'Hello World'` + ); + } catch (err) { + setCommandOutput(`ERROR: ${err}`); + } + }; + + const onTestCapKVGet = async () => { setCommandOutput(""); try { const response = await BackgroundRunner.dispatchEvent({ label: "com.example.background.task", - event: "testCapKV", + event: "testCapKVGet", details: {}, }); setCommandOutput( - `success: stored and retrieved ${JSON.stringify(response)}` + `success: retrieved ${JSON.stringify(response)}` + ); + } catch (err) { + setCommandOutput(`ERROR: ${err}`); + } + }; + + const onTestCapKVRemove = async () => { + setCommandOutput(""); + try { + await BackgroundRunner.dispatchEvent({ + label: "com.example.background.task", + event: "testCapKVRemove", + details: { + + }, + }); + setCommandOutput( + `success: value removed` ); } catch (err) { setCommandOutput(`ERROR: ${err}`); } }; + const onTestCapNotification = async () => { setCommandOutput(""); @@ -135,7 +172,9 @@ const Tab1: React.FC = () => { Request API Permissions - Test Capacitor KV + Capacitor KV - Set + Capacitor KV - Get + Capacitor KV - Delete Test Capacitor Notification diff --git a/packages/android-engine/.idea/androidTestResultsUserPreferences.xml b/packages/android-engine/.idea/androidTestResultsUserPreferences.xml index e974d10..ce81574 100644 --- a/packages/android-engine/.idea/androidTestResultsUserPreferences.xml +++ b/packages/android-engine/.idea/androidTestResultsUserPreferences.xml @@ -3,6 +3,19 @@