Skip to content

Commit fd9a135

Browse files
committed
fix: writable map
1 parent d74230a commit fd9a135

File tree

1 file changed

+30
-10
lines changed

1 file changed

+30
-10
lines changed

packages/react-native-tracing/android/src/main/java/com/grafana/nativeinstrumentation/NativeInstrumentationModule.java

+30-10
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,10 @@
1616
public class NativeInstrumentationModule extends ReactContextBaseJavaModule implements RCTEventEmitter {
1717
public static final String NAME = "NativeInstrumentation";
1818
private static Long startTime = null;
19-
private static WritableMap cachedMetrics = null;
19+
20+
private static Double cachedStartStartupTime = null;
21+
private static Double cachedEndStartupTime = null;
22+
private static Double cachedStartupDuration = null;
2023

2124
static {
2225
ReactMarker.addListener((name, tag, instanceKey) -> {
@@ -41,11 +44,30 @@ public String getName() {
4144

4245
public static void initializeNativeInstrumentation() {
4346
android.util.Log.d(NAME, "Initializing native instrumentation...");
44-
cachedMetrics = null;
47+
cachedStartStartupTime = null;
48+
cachedEndStartupTime = null;
49+
cachedStartupDuration = null;
4550
startTime = System.currentTimeMillis();
4651
android.util.Log.d(NAME, String.format("Initialized with start time: %d (previous metrics cleared)", startTime));
4752
}
4853

54+
/**
55+
* Creates a fresh WritableMap with startup metrics.
56+
* Note: Each WritableMap can only be consumed once when passed through the React Native bridge.
57+
* This method ensures we always create a new instance for each request.
58+
*
59+
* Each map can be consumed once by the JS side (i.e., going through the bridge).
60+
*
61+
* @return A new WritableMap instance containing the startup metrics
62+
*/
63+
private WritableMap createStartupMetricsMap(double startStartupTime, double endStartupTime, double startupDuration) {
64+
WritableMap params = Arguments.createMap();
65+
params.putDouble("startStartupTime", startStartupTime);
66+
params.putDouble("endStartupTime", endStartupTime);
67+
params.putDouble("startupDuration", startupDuration);
68+
return params;
69+
}
70+
4971
@ReactMethod
5072
public void getStartupTime(Promise promise) {
5173
android.util.Log.d(NAME, "Getting startup time...");
@@ -56,9 +78,9 @@ public void getStartupTime(Promise promise) {
5678
return;
5779
}
5880

59-
if (cachedMetrics != null) {
81+
if (cachedStartupDuration != null) {
6082
android.util.Log.d(NAME, "Returning cached metrics");
61-
promise.resolve(cachedMetrics);
83+
promise.resolve(createStartupMetricsMap(cachedStartStartupTime, cachedEndStartupTime, cachedStartupDuration));
6284
return;
6385
}
6486

@@ -70,14 +92,12 @@ public void getStartupTime(Promise promise) {
7092
startTime, endTime, duration
7193
));
7294

73-
WritableMap params = Arguments.createMap();
74-
params.putDouble("startStartupTime", (double) startTime);
75-
params.putDouble("endStartupTime", (double) endTime);
76-
params.putDouble("startupDuration", duration);
95+
cachedStartStartupTime = (double) startTime;
96+
cachedEndStartupTime = (double) endTime;
97+
cachedStartupDuration = duration;
7798

78-
cachedMetrics = params;
7999
android.util.Log.d(NAME, "Metrics cached and being returned");
80-
promise.resolve(params);
100+
promise.resolve(createStartupMetricsMap(cachedStartStartupTime, cachedEndStartupTime, cachedStartupDuration));
81101
}
82102

83103
@ReactMethod

0 commit comments

Comments
 (0)