From 724f63930d2de3c81b9d9316ae70bbb9e1dcae49 Mon Sep 17 00:00:00 2001 From: Sung Jeon Date: Mon, 1 Sep 2025 20:52:17 +0900 Subject: [PATCH] feat(android): report full native stack trace on error (#4651) --- .../brentvatne/common/react/VideoEventEmitter.kt | 16 ++++++++++++++++ src/specs/VideoNativeComponent.ts | 1 + 2 files changed, 17 insertions(+) diff --git a/android/src/main/java/com/brentvatne/common/react/VideoEventEmitter.kt b/android/src/main/java/com/brentvatne/common/react/VideoEventEmitter.kt index fe469fca..628ff8e1 100644 --- a/android/src/main/java/com/brentvatne/common/react/VideoEventEmitter.kt +++ b/android/src/main/java/com/brentvatne/common/react/VideoEventEmitter.kt @@ -140,6 +140,22 @@ class VideoEventEmitter { putString("errorException", exception.toString()) putString("errorCode", errorCode) putString("errorStackTrace", stackTrace) + + // https://github.com/facebook/react-native/blob/v0.80.2/packages/react-native/ReactCommon/react/nativemodule/core/platform/android/ReactCommon/JavaTurboModule.cpp#L465 + putMap("cause", Arguments.createMap().apply { + putString("name", exception.javaClass.simpleName) + exception.message?.let { putString("message", it) } + putArray("stackElements", Arguments.createArray().apply { + exception.stackTrace.forEach { element -> + pushMap(Arguments.createMap().apply { + putString("className", element.className) + putString("fileName", element.fileName) + putInt("lineNumber", element.lineNumber) + putString("methodName", element.methodName) + }) + } + }) + }) } ) } diff --git a/src/specs/VideoNativeComponent.ts b/src/specs/VideoNativeComponent.ts index 493736d9..ea033f13 100644 --- a/src/specs/VideoNativeComponent.ts +++ b/src/specs/VideoNativeComponent.ts @@ -298,6 +298,7 @@ export type OnVideoErrorData = Readonly<{ localizedRecoverySuggestion?: string; // ios domain?: string; // ios }>; + cause?: object; // React Native convertThrowableToJSError/convertNSExceptionToJSError target?: Int32; // ios }>;