Skip to content

fix: not able to communicate sandbox dead errors properly #5

@predatorx7

Description

@predatorx7

Description

JavaScriptAndroid should let consumers know that it can't be used anymore and should let consumers make new sandbox if an earlier sandbox dies.

Stack Trace when sandbox dies
[Error] PlatformException(SandboxDeadException, androidx.javascriptengine.SandboxDeadException: sandbox dead: sandbox dead, Cause: null, Stacktrace: androidx.javascriptengine.SandboxDeadException: sandbox dead: sandbox dead
	at androidx.javascriptengine.TerminationInfo.toJavaScriptException(TerminationInfo.java:130)
	at androidx.javascriptengine.IsolateUsableState.onDied(IsolateUsableState.java:369)
	at androidx.javascriptengine.JavaScriptIsolate.maybeSetIsolateDead(JavaScriptIsolate.java:153)
	at androidx.javascriptengine.JavaScriptIsolate.maybeSetSandboxDead(JavaScriptIsolate.java:172)
	at androidx.javascriptengine.JavaScriptSandbox.notifyIsolatesAboutDeath(JavaScriptSandbox.java:695)
	at androidx.javascriptengine.JavaScriptSandbox.killImmediatelyOnThread(JavaScriptSandbox.java:646)
	at androidx.javascriptengine.JavaScriptSandbox$ConnectionSetup.runShutdownTasks(JavaScriptSandbox.java:313)
	at androidx.javascriptengine.JavaScriptSandbox$ConnectionSetup.onServiceDisconnected(JavaScriptSandbox.java:294)
05:36 +4 -2: end-to-end providers test start a verification flow, and wait for the proof to be generated for provider ac48fd75-02c0-4fd7-93e2-f2ada1732665                                                        
[before_finish] attempt 12
05:37 +4 -2: loading /Users/mushaheedsyed/Projects/reclaimprotocol.org/flutter/reclaim-verifier-app/integration_test/providers_test.dart                                                                          
	at android.app.LoadedApk$ServiceDispatcher.doDeath(LoadedApk.java:2208)
	at android.app.LoadedApk$ServiceDispatcher$RunConnection.run(LoadedApk.java:2223)
	at android.os.Handler.handleCallback(Handler.java:942)
	at android.os.Handler.dispatchMessage(Handler.java:99)
	at android.os.Looper.loopOnce(Looper.java:201)
	at android.os.Looper.loop(Looper.java:288)
	at android.app.ActivityThread.main(ActivityThread.java:7924)
	at java.lang.reflect.Method.invoke(Native Method)
	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936)
, null)
03:59:30 AM SEVERE reclaim_inapp_sdk.AttestorJsRuntimeClient#816292653.claim-client-2.AttestorJsRuntimeClient.postMessage (7731)
#0      JavaScriptAndroidPlatformApi.runJavaScriptReturningResult (package:javascript_android/src/pigeons/messages.pigeon.dart:131:7)
<asynchronous suspension>
#1      JavaScriptAndroid.runJavaScriptReturningResult (package:javascript_android/javascript_android.dart:77:20)
<asynchronous suspension>
Stack Trace when cannot inform consumer and cannot recover
PlatformException(IllegalStateException, java.lang.IllegalStateException: No active isolate with id 1054292910, Cause: null, Stacktrace: java.lang.IllegalStateException: No active isolate with id 1054292910
	at com.magnificsoftware.javascript_android.JavaScriptAndroid.requireJsIsolateById(JavaScriptAndroid.kt:72)
	at com.magnificsoftware.javascript_android.JavaScriptAndroid.runJavaScriptReturningResult(JavaScriptAndroid.kt:113)
	at com.magnificsoftware.javascript_android.JavaScriptAndroidPlatformApi$Companion.setUp$lambda$9$lambda$8(Messages.kt:125)
	at com.magnificsoftware.javascript_android.JavaScriptAndroidPlatformApi$Companion.$r8$lambda$VcCh4fXa5x77AyrU7MmgGUxFMK4(Unknown Source:0)
	at com.magnificsoftware.javascript_android.JavaScriptAndroidPlatformApi$Companion$$ExternalSyntheticLambda9.onMessage(D8$$SyntheticClass:0)
	at io.flutter.plugin.common.BasicMessageChannel$IncomingMessageHandler.onMessage(BasicMessageChannel.java:261)
	at io.flutter.embedding.engine.dart.DartMessenger.invokeHandler(DartMessenger.java:292)
	at io.flutter.embedding.engine.dart.DartMessenger.lambda$dispatchMessageToQueue$0$io-flutter-embedding-engine-dart-DartMessenger(DartMessenger.java:319)
	at io.flutter.embedding.engine.dart.DartMessenger$$ExternalSyntheticLambda0.run(D8$$SyntheticClass:0)
	at android.os.Handler.handleCallback(Handler.java:942)
	at android.os.Handler.dispatchMessage(Handler.java:99)
	at android.os.Looper.loopOnce(Looper.java:201)
	at android.os.Looper.loop(Looper.java:288)
	at android.app.ActivityThread.main(ActivityThread.java:7924)
	at java.lang.reflect.Method.invoke(Native Method)
	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936)
, null)
03:59:32 AM SEVERE reclaim_inapp_sdk.AttestorJsRuntimeClient#816292653.claim-client-2.AttestorJsRuntimeClient.postMessage (7868)
#0      JavaScriptAndroidPlatformApi.runJavaScriptReturningResult (package:javascript_android/src/pigeons/messages.pigeon.dart:131:7)
<asynchronous suspension>
#1      JavaScriptAndroid.runJavaScriptReturningResult (package:javascript_android/javascript_android.dart:77:20)
<asynchronous suspension>

Steps To Reproduce

  1. Try crashing the underlying javascript environment on android

You can try:

Array(1_000_000_000).fill(1)

Expected Behavior

API throws an error on crash and doesn't let further usage for javascript engine instance and creates a new sandbox (allows creation of new javascript instances).

Screenshots

If applicable, add screenshots to help explain your problem.

Additional Context

Add any other context about the problem here.

Metadata

Metadata

Assignees

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions