@goliapkg/sentori-react-native 0.9.0 → 0.9.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/android/src/main/java/com/sentori/SentoriCrashHandler.kt +11 -1
- package/android/src/main/java/com/sentori/SentoriModule.kt +5 -0
- package/android/src/main/java/com/sentori/SentoriNativeExceptionBridge.kt +75 -0
- package/android/src/main/java/com/sentori/SentoriNativeSignals.kt +32 -0
- package/ios/SentoriModule.swift +6 -0
- package/ios/SentoriNativeExceptionBridge.swift +90 -0
- package/lib/capture.d.ts.map +1 -1
- package/lib/capture.js +21 -0
- package/lib/capture.js.map +1 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/native.d.ts +9 -0
- package/lib/native.d.ts.map +1 -1
- package/lib/native.js +11 -0
- package/lib/native.js.map +1 -1
- package/package.json +1 -1
- package/src/capture.ts +22 -0
- package/src/native.ts +28 -0
|
@@ -119,6 +119,16 @@ object SentoriCrashHandler {
|
|
|
119
119
|
|
|
120
120
|
val error = errorToJson(throwable)
|
|
121
121
|
|
|
122
|
+
// v0.9.5 #7 — detect crashes originating from native code (JNI
|
|
123
|
+
// / .so libs). Pure SIGSEGV in a stripped .so won't reach us
|
|
124
|
+
// without breakpad (queued for v1.1), but throws that surface
|
|
125
|
+
// as UnsatisfiedLinkError or have native frames in the stack
|
|
126
|
+
// are tagged so the dashboard can split them out.
|
|
127
|
+
val tags = JSONObject()
|
|
128
|
+
if (SentoriNativeOrigin.looksNative(throwable)) {
|
|
129
|
+
tags.put("native_signal", "true")
|
|
130
|
+
}
|
|
131
|
+
|
|
122
132
|
val event = JSONObject().apply {
|
|
123
133
|
put("id", uuidLower())
|
|
124
134
|
put("timestamp", iso8601Now())
|
|
@@ -129,7 +139,7 @@ object SentoriCrashHandler {
|
|
|
129
139
|
put("device", device)
|
|
130
140
|
put("app", app)
|
|
131
141
|
put("user", JSONObject.NULL)
|
|
132
|
-
put("tags",
|
|
142
|
+
put("tags", tags)
|
|
133
143
|
put("breadcrumbs", JSONArray())
|
|
134
144
|
put("error", error)
|
|
135
145
|
put("fingerprint", JSONArray())
|
|
@@ -24,6 +24,11 @@ class SentoriModule : Module() {
|
|
|
24
24
|
SentoriMobileVitals.startFrameWatch()
|
|
25
25
|
}
|
|
26
26
|
|
|
27
|
+
// v0.9.5 #8 — TurboModule exception bridge readout.
|
|
28
|
+
Function("getRecentNativeException") {
|
|
29
|
+
SentoriNativeExceptionBridge.getRecent()
|
|
30
|
+
}
|
|
31
|
+
|
|
27
32
|
// v0.9.4 #1 — Mobile Vitals exposure.
|
|
28
33
|
Function("markJsBridgeReady") {
|
|
29
34
|
SentoriMobileVitals.markJsBridgeReady()
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
package com.sentori
|
|
2
|
+
|
|
3
|
+
import java.util.concurrent.ConcurrentLinkedDeque
|
|
4
|
+
import java.util.concurrent.atomic.AtomicLong
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* v0.9.5 #8 — partial fix for TurboModule swallowing native
|
|
8
|
+
* exceptions into a generic JSError.
|
|
9
|
+
*
|
|
10
|
+
* Android side mirrors the iOS implementation. Host TurboModule code:
|
|
11
|
+
*
|
|
12
|
+
* try {
|
|
13
|
+
* riskyOperation()
|
|
14
|
+
* } catch (e: Exception) {
|
|
15
|
+
* SentoriNativeExceptionBridge.record(e)
|
|
16
|
+
* throw e
|
|
17
|
+
* }
|
|
18
|
+
*
|
|
19
|
+
* JS-side coerceError calls `getRecent()` and, if an exception
|
|
20
|
+
* within the last 1 s exists, attaches its stack to the resulting
|
|
21
|
+
* sentori event.
|
|
22
|
+
*/
|
|
23
|
+
object SentoriNativeExceptionBridge {
|
|
24
|
+
|
|
25
|
+
private const val RING_SIZE = 8
|
|
26
|
+
private const val WINDOW_MS = 1_000L
|
|
27
|
+
|
|
28
|
+
private data class Stash(
|
|
29
|
+
val timestamp: Long,
|
|
30
|
+
val name: String,
|
|
31
|
+
val reason: String,
|
|
32
|
+
val stack: List<String>,
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
private val ring = ConcurrentLinkedDeque<Stash>()
|
|
36
|
+
private val lastPurgeAt = AtomicLong(0)
|
|
37
|
+
|
|
38
|
+
@JvmStatic
|
|
39
|
+
fun record(t: Throwable) {
|
|
40
|
+
val frames = t.stackTrace.take(48).map { it.toString() }
|
|
41
|
+
val stash = Stash(
|
|
42
|
+
timestamp = System.currentTimeMillis(),
|
|
43
|
+
name = t.javaClass.simpleName,
|
|
44
|
+
reason = t.message ?: "",
|
|
45
|
+
stack = frames,
|
|
46
|
+
)
|
|
47
|
+
ring.addLast(stash)
|
|
48
|
+
while (ring.size > RING_SIZE) ring.pollFirst()
|
|
49
|
+
purgeIfDue()
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
@JvmStatic
|
|
53
|
+
fun getRecent(): Map<String, Any?>? {
|
|
54
|
+
purgeIfDue()
|
|
55
|
+
val latest = ring.peekLast() ?: return null
|
|
56
|
+
return mapOf(
|
|
57
|
+
"name" to latest.name,
|
|
58
|
+
"reason" to latest.reason,
|
|
59
|
+
"stack" to latest.stack,
|
|
60
|
+
"ageMs" to (System.currentTimeMillis() - latest.timestamp).toInt(),
|
|
61
|
+
)
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
private fun purgeIfDue() {
|
|
65
|
+
val now = System.currentTimeMillis()
|
|
66
|
+
val last = lastPurgeAt.get()
|
|
67
|
+
if (now - last < 100) return
|
|
68
|
+
lastPurgeAt.set(now)
|
|
69
|
+
val cutoff = now - WINDOW_MS
|
|
70
|
+
val it = ring.iterator()
|
|
71
|
+
while (it.hasNext()) {
|
|
72
|
+
if (it.next().timestamp < cutoff) it.remove()
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
package com.sentori
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* v0.9.5 #7 — Android NDK origin detection (stub).
|
|
5
|
+
*
|
|
6
|
+
* Pure-Kotlin heuristics to tag a Throwable as "originated in native
|
|
7
|
+
* code" so the dashboard can show NDK crashes separately from JVM
|
|
8
|
+
* crashes. Real breakpad/crashpad integration (with minidump +
|
|
9
|
+
* dump_syms symbolicator) is queued for v1.1 — see
|
|
10
|
+
* `docs/design/v1-roadmap.md` #7.
|
|
11
|
+
*/
|
|
12
|
+
object SentoriNativeOrigin {
|
|
13
|
+
|
|
14
|
+
/** Returns true iff this throwable likely originated in native
|
|
15
|
+
* (NDK / .so / JNI) code. Used by `SentoriCrashHandler.write` to
|
|
16
|
+
* flip the `native_signal` tag on the event. */
|
|
17
|
+
@JvmStatic
|
|
18
|
+
fun looksNative(t: Throwable): Boolean {
|
|
19
|
+
val name = t.javaClass.simpleName
|
|
20
|
+
if (name == "UnsatisfiedLinkError") return true
|
|
21
|
+
// OutOfMemoryError can be either JVM or native allocator;
|
|
22
|
+
// bias toward native since pure-JVM OOM is rare on modern
|
|
23
|
+
// Android with heap auto-growth.
|
|
24
|
+
if (name == "OutOfMemoryError") return true
|
|
25
|
+
return t.stackTrace.any { f ->
|
|
26
|
+
val cls = f.className
|
|
27
|
+
cls.contains("jni", ignoreCase = true) ||
|
|
28
|
+
cls.contains("native", ignoreCase = true) ||
|
|
29
|
+
f.fileName?.endsWith(".so") == true
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
package/ios/SentoriModule.swift
CHANGED
|
@@ -19,6 +19,12 @@ public class SentoriModule: Module {
|
|
|
19
19
|
SentoriMobileVitals.startFrameWatch()
|
|
20
20
|
}
|
|
21
21
|
|
|
22
|
+
// v0.9.5 #8 — TurboModule exception bridge readout for
|
|
23
|
+
// coerceError to attach native stack to wrapped JSError.
|
|
24
|
+
Function("getRecentNativeException") { () -> [String: Any]? in
|
|
25
|
+
return SentoriNativeExceptionBridge.getRecentException()
|
|
26
|
+
}
|
|
27
|
+
|
|
22
28
|
// v0.9.4 #1 — Mobile Vitals exposure.
|
|
23
29
|
Function("markJsBridgeReady") {
|
|
24
30
|
SentoriMobileVitals.markJsBridgeReady()
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import Foundation
|
|
2
|
+
|
|
3
|
+
/// v0.9.5 #8 — partial-fix for the "TurboModule swallows NSException
|
|
4
|
+
/// into a generic JSError" gap.
|
|
5
|
+
///
|
|
6
|
+
/// We can't easily swizzle the C++ ObjCTurboModule call site that does
|
|
7
|
+
/// the swallowing. What we *can* offer is an escape hatch: host code
|
|
8
|
+
/// inside a TurboModule method wraps its native call in `@try @catch`
|
|
9
|
+
/// and calls `SentoriNativeExceptionBridge.record(exception)` from the
|
|
10
|
+
/// catch block. We stash the exception (name + reason + callStackSymbols)
|
|
11
|
+
/// in a static ring with timestamps. When the JS side then receives
|
|
12
|
+
/// the generic JSError that RN wraps it into, `coerceError` checks the
|
|
13
|
+
/// ring for an exception within the last 1 s and attaches the native
|
|
14
|
+
/// stack to the JS error event.
|
|
15
|
+
///
|
|
16
|
+
/// Usage from a host TurboModule (Swift example):
|
|
17
|
+
///
|
|
18
|
+
/// @objc func mySensitiveMethod() {
|
|
19
|
+
/// do {
|
|
20
|
+
/// try riskyNativeOperation()
|
|
21
|
+
/// } catch let nsException as NSException {
|
|
22
|
+
/// SentoriNativeExceptionBridge.record(nsException)
|
|
23
|
+
/// throw nsException
|
|
24
|
+
/// }
|
|
25
|
+
/// }
|
|
26
|
+
///
|
|
27
|
+
/// Or Objective-C:
|
|
28
|
+
///
|
|
29
|
+
/// @try {
|
|
30
|
+
/// riskyOp();
|
|
31
|
+
/// } @catch (NSException *e) {
|
|
32
|
+
/// [SentoriNativeExceptionBridge recordException:e];
|
|
33
|
+
/// @throw;
|
|
34
|
+
/// }
|
|
35
|
+
|
|
36
|
+
@objc public final class SentoriNativeExceptionBridge: NSObject {
|
|
37
|
+
|
|
38
|
+
private static let RING_SIZE = 8
|
|
39
|
+
private static let WINDOW_MS: Double = 1000
|
|
40
|
+
|
|
41
|
+
private struct Stash {
|
|
42
|
+
let timestamp: Date
|
|
43
|
+
let name: String
|
|
44
|
+
let reason: String
|
|
45
|
+
let stack: [String]
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
private static var ring: [Stash] = []
|
|
49
|
+
private static let lock = NSLock()
|
|
50
|
+
|
|
51
|
+
/// Called from a `@catch` inside a TurboModule method. Records
|
|
52
|
+
/// the exception's name + reason + callStackSymbols for ~1 s so
|
|
53
|
+
/// the JS-side coerceError can pick it up.
|
|
54
|
+
@objc public static func recordException(_ exception: NSException) {
|
|
55
|
+
let stash = Stash(
|
|
56
|
+
timestamp: Date(),
|
|
57
|
+
name: exception.name.rawValue,
|
|
58
|
+
reason: exception.reason ?? "",
|
|
59
|
+
stack: exception.callStackSymbols
|
|
60
|
+
)
|
|
61
|
+
lock.lock()
|
|
62
|
+
defer { lock.unlock() }
|
|
63
|
+
ring.append(stash)
|
|
64
|
+
while ring.count > RING_SIZE {
|
|
65
|
+
ring.removeFirst()
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/// Called by JS-side bridge. Returns the most recent exception
|
|
70
|
+
/// within the last 1 s, or nil. Does NOT remove from the ring —
|
|
71
|
+
/// the same NSException may surface as multiple JSError frames
|
|
72
|
+
/// across the bridge. Ring is cleared by `purge()` on a timer.
|
|
73
|
+
@objc public static func getRecentException() -> [String: Any]? {
|
|
74
|
+
lock.lock()
|
|
75
|
+
defer { lock.unlock() }
|
|
76
|
+
purgeLocked()
|
|
77
|
+
guard let latest = ring.last else { return nil }
|
|
78
|
+
return [
|
|
79
|
+
"name": latest.name,
|
|
80
|
+
"reason": latest.reason,
|
|
81
|
+
"stack": latest.stack,
|
|
82
|
+
"ageMs": Int(Date().timeIntervalSince(latest.timestamp) * 1000),
|
|
83
|
+
]
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
private static func purgeLocked() {
|
|
87
|
+
let now = Date()
|
|
88
|
+
ring.removeAll { now.timeIntervalSince($0.timestamp) * 1000 > WINDOW_MS }
|
|
89
|
+
}
|
|
90
|
+
}
|
package/lib/capture.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capture.d.ts","sourceRoot":"","sources":["../src/capture.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"capture.d.ts","sourceRoot":"","sources":["../src/capture.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAoD,IAAI,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAE5F,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAgB5D,eAAO,MAAM,+BAA+B,QAAO,IAElD,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,OAAO,GAAI,MAAM,IAAI,GAAG,IAAI,KAAG,IAE3C,CAAC;AAEF,eAAO,MAAM,OAAO,QAAO,IAAI,GAAG,IAAa,CAAC;AAEhD,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB;;;qDAGiD;IACjD,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,gBAAgB,GAAU,OAAO;IAC5C,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf,KAAG,OAAO,CAAC,IAAI,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,IAAI,GAAG,MAAM,CAAA;CAAE,CAKxD,CAAC;AAEF,eAAO,MAAM,YAAY,GAAI,OAAO,KAAK,EAAE,SAAS,aAAa,KAAG,IAqEnE,CAAC;AAiEF,eAAO,MAAM,gBAAgB,UAtIO,KAAK,WAAW,aAAa,KAAG,IAsIxB,CAAC"}
|
package/lib/capture.js
CHANGED
|
@@ -12,6 +12,7 @@ import { getTrailBuffer } from './trail';
|
|
|
12
12
|
import { enqueue, sendUserReport, uploadAttachment } from './transport';
|
|
13
13
|
import { uuidV7 } from './uuid';
|
|
14
14
|
import { getCachedNetworkType } from './netinfo';
|
|
15
|
+
import { getRecentNativeException } from './native';
|
|
15
16
|
export { captureStep, __resetTrailForTests } from './trail';
|
|
16
17
|
let _user = null;
|
|
17
18
|
// Phase 42 sub-D.08 — per-session screenshot quota. Defaults: 10 in
|
|
@@ -219,6 +220,26 @@ const errorToObject = (error) => {
|
|
|
219
220
|
if (causeRaw instanceof Error) {
|
|
220
221
|
cause = errorToObject(causeRaw);
|
|
221
222
|
}
|
|
223
|
+
// v0.9.5 #8 — TurboModule swallowed-exception bridge. If the host
|
|
224
|
+
// wrapped a native call with `@try @catch + recordException`, the
|
|
225
|
+
// native ring may hold a fresh entry (< 1 s old). Synthesize that
|
|
226
|
+
// as a `cause` so the JS event includes the original native stack.
|
|
227
|
+
if (cause === null) {
|
|
228
|
+
const recent = getRecentNativeException();
|
|
229
|
+
if (recent && recent.ageMs <= 1500) {
|
|
230
|
+
cause = {
|
|
231
|
+
type: recent.name || 'NativeException',
|
|
232
|
+
message: recent.reason,
|
|
233
|
+
stack: recent.stack.map((line, i) => ({
|
|
234
|
+
function: line.trim(),
|
|
235
|
+
file: '<native>',
|
|
236
|
+
inApp: false,
|
|
237
|
+
line: i + 1,
|
|
238
|
+
})),
|
|
239
|
+
cause: null,
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
}
|
|
222
243
|
return {
|
|
223
244
|
type: error.name || 'Error',
|
|
224
245
|
message: error.message,
|
package/lib/capture.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capture.js","sourceRoot":"","sources":["../src/capture.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAEjE,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACpD,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC3E,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACxE,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"capture.js","sourceRoot":"","sources":["../src/capture.ts"],"names":[],"mappings":"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"}
|
package/lib/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAkB,KAAK,oBAAoB,EAAE,KAAK,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAOxG,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EACL,cAAc,EACd,qBAAqB,EAEtB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACxE,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAO5C,eAAO,MAAM,OAAO;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAkB,KAAK,oBAAoB,EAAE,KAAK,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAOxG,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EACL,cAAc,EACd,qBAAqB,EAEtB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACxE,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAO5C,eAAO,MAAM,OAAO;;;;;;;;;;aA8F+E,CAAC;eAAmB,CAAC;YAAgB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;CAhExI,CAAC;AAEF,eAAe,OAAO,CAAC;AAEvB,OAAO,EAAE,IAAI,EAAE,IAAI,IAAI,WAAW,EAAE,MAAM,QAAQ,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,WAAW,EACX,OAAO,EACP,gBAAgB,EAChB,OAAO,GACR,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,KAAK,oBAAoB,EAAE,KAAK,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxG,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,eAAe,EACf,cAAc,GACf,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EACL,cAAc,EACd,qBAAqB,EACrB,KAAK,uBAAuB,GAC7B,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,YAAY,EAAE,KAAK,gBAAgB,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC1F,OAAO,EACL,SAAS,EACT,WAAW,EACX,KAAK,aAAa,EAClB,WAAW,GACZ,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,kBAAkB,GACnB,MAAM,UAAU,CAAC;AAClB,OAAO,EACL,UAAU,EACV,kBAAkB,EAClB,YAAY,GACb,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,KAAK,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAE1E,YAAY,EACV,KAAK,EACL,YAAY,EACZ,KAAK,EACL,UAAU,EACV,cAAc,EACd,MAAM,EACN,QAAQ,EACR,GAAG,EACH,IAAI,EACJ,IAAI,EACJ,SAAS,EACT,QAAQ,GACT,MAAM,SAAS,CAAC"}
|
package/lib/native.d.ts
CHANGED
|
@@ -48,6 +48,15 @@ export declare function getNativeFrameCounters(): null | {
|
|
|
48
48
|
};
|
|
49
49
|
/** v0.9.4 #1 — reset frame counters on navigation transition. */
|
|
50
50
|
export declare function resetNativeFrameCounters(): void;
|
|
51
|
+
/** v0.9.5 #8 — fetch the most-recent native exception from
|
|
52
|
+
* SentoriNativeExceptionBridge (within last ~1 s). null if none or
|
|
53
|
+
* bridge not linked. */
|
|
54
|
+
export declare function getRecentNativeException(): null | {
|
|
55
|
+
ageMs: number;
|
|
56
|
+
name: string;
|
|
57
|
+
reason: string;
|
|
58
|
+
stack: string[];
|
|
59
|
+
};
|
|
51
60
|
/**
|
|
52
61
|
* v0.7.3 — drives the native screenshot path. JS side passes the
|
|
53
62
|
* current list of mask `nativeID`s (read from the consumer's
|
package/lib/native.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"native.d.ts","sourceRoot":"","sources":["../src/native.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"native.d.ts","sourceRoot":"","sources":["../src/native.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAyFH,wBAAgB,eAAe,CAAC,MAAM,EAAE;IACtC,WAAW,EAAE,MAAM,CAAA;IACnB,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;CACd,GAAG,IAAI,CAMP;AAED,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAQ5D;AAED;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,IAAI,IAAI,CAMzC;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,CAAC,EAAE;IACzC,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,GAAG,IAAI,CAMP;AAED,wBAAgB,eAAe,IAAI,IAAI,CAMtC;AAED,+DAA+D;AAC/D,wBAAgB,uBAAuB,IAAI,IAAI,CAM9C;AAED,yEAAyE;AACzE,wBAAgB,oBAAoB,IAAI,IAAI,GAAG,MAAM,CAOpD;AAED,oEAAoE;AACpE,wBAAgB,sBAAsB,IAAI,IAAI,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAMhF;AAED,iEAAiE;AACjE,wBAAgB,wBAAwB,IAAI,IAAI,CAM/C;AAED;;yBAEyB;AACzB,wBAAgB,wBAAwB,IAAI,IAAI,GAAG;IACjD,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,EAAE,CAAA;CAChB,CAMA;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,+BAA+B,CACnD,SAAS,EAAE,MAAM,EAAE,GAClB,OAAO,CAAC,IAAI,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CAQvD"}
|
package/lib/native.js
CHANGED
|
@@ -117,6 +117,17 @@ export function resetNativeFrameCounters() {
|
|
|
117
117
|
// ignore
|
|
118
118
|
}
|
|
119
119
|
}
|
|
120
|
+
/** v0.9.5 #8 — fetch the most-recent native exception from
|
|
121
|
+
* SentoriNativeExceptionBridge (within last ~1 s). null if none or
|
|
122
|
+
* bridge not linked. */
|
|
123
|
+
export function getRecentNativeException() {
|
|
124
|
+
try {
|
|
125
|
+
return native()?.getRecentNativeException?.() ?? null;
|
|
126
|
+
}
|
|
127
|
+
catch {
|
|
128
|
+
return null;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
120
131
|
/**
|
|
121
132
|
* v0.7.3 — drives the native screenshot path. JS side passes the
|
|
122
133
|
* current list of mask `nativeID`s (read from the consumer's
|
package/lib/native.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"native.js","sourceRoot":"","sources":["../src/native.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"native.js","sourceRoot":"","sources":["../src/native.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@goliapkg/sentori-react-native",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.1",
|
|
4
4
|
"description": "Sentori SDK for React Native \u2014 JS-layer error capture, native crash handlers (iOS / Android), batched transport, fetch + react-navigation tracing.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"homepage": "https://sentori.golia.jp",
|
package/src/capture.ts
CHANGED
|
@@ -13,6 +13,7 @@ import { getTrailBuffer } from './trail';
|
|
|
13
13
|
import { enqueue, sendUserReport, uploadAttachment } from './transport';
|
|
14
14
|
import { uuidV7 } from './uuid';
|
|
15
15
|
import { getCachedNetworkType } from './netinfo';
|
|
16
|
+
import { getRecentNativeException } from './native';
|
|
16
17
|
import type { App, AttachmentMeta, Device, Event, SentoriError, Tags, User } from './types';
|
|
17
18
|
|
|
18
19
|
export { captureStep, __resetTrailForTests } from './trail';
|
|
@@ -271,6 +272,27 @@ const errorToObject = (error: Error): SentoriError => {
|
|
|
271
272
|
cause = errorToObject(causeRaw);
|
|
272
273
|
}
|
|
273
274
|
|
|
275
|
+
// v0.9.5 #8 — TurboModule swallowed-exception bridge. If the host
|
|
276
|
+
// wrapped a native call with `@try @catch + recordException`, the
|
|
277
|
+
// native ring may hold a fresh entry (< 1 s old). Synthesize that
|
|
278
|
+
// as a `cause` so the JS event includes the original native stack.
|
|
279
|
+
if (cause === null) {
|
|
280
|
+
const recent = getRecentNativeException();
|
|
281
|
+
if (recent && recent.ageMs <= 1500) {
|
|
282
|
+
cause = {
|
|
283
|
+
type: recent.name || 'NativeException',
|
|
284
|
+
message: recent.reason,
|
|
285
|
+
stack: recent.stack.map((line, i) => ({
|
|
286
|
+
function: line.trim(),
|
|
287
|
+
file: '<native>',
|
|
288
|
+
inApp: false,
|
|
289
|
+
line: i + 1,
|
|
290
|
+
})),
|
|
291
|
+
cause: null,
|
|
292
|
+
};
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
|
|
274
296
|
return {
|
|
275
297
|
type: error.name || 'Error',
|
|
276
298
|
message: error.message,
|
package/src/native.ts
CHANGED
|
@@ -34,6 +34,18 @@ type SentoriNativeModule = {
|
|
|
34
34
|
getFrameCounters?: () => null | { frozen: number; slow: number }
|
|
35
35
|
/** Reset counters on navigation transition (called by useTraceNavigation). */
|
|
36
36
|
resetFrameCounters?: () => void
|
|
37
|
+
/**
|
|
38
|
+
* v0.9.5 #8 — read the most-recent native exception recorded by
|
|
39
|
+
* `SentoriNativeExceptionBridge` within the last 1 s. Used by the
|
|
40
|
+
* JS-side capture path to attach native stack info to a JSError
|
|
41
|
+
* that RN wrapped from a swallowed NSException / Java Exception.
|
|
42
|
+
*/
|
|
43
|
+
getRecentNativeException?: () => null | {
|
|
44
|
+
ageMs: number
|
|
45
|
+
name: string
|
|
46
|
+
reason: string
|
|
47
|
+
stack: string[]
|
|
48
|
+
}
|
|
37
49
|
/**
|
|
38
50
|
* v0.7.3 — JS-triggered screenshot with consumer-supplied mask IDs.
|
|
39
51
|
* `maskedIds` are RN `nativeID` strings; native walks the view
|
|
@@ -187,6 +199,22 @@ export function resetNativeFrameCounters(): void {
|
|
|
187
199
|
}
|
|
188
200
|
}
|
|
189
201
|
|
|
202
|
+
/** v0.9.5 #8 — fetch the most-recent native exception from
|
|
203
|
+
* SentoriNativeExceptionBridge (within last ~1 s). null if none or
|
|
204
|
+
* bridge not linked. */
|
|
205
|
+
export function getRecentNativeException(): null | {
|
|
206
|
+
ageMs: number
|
|
207
|
+
name: string
|
|
208
|
+
reason: string
|
|
209
|
+
stack: string[]
|
|
210
|
+
} {
|
|
211
|
+
try {
|
|
212
|
+
return native()?.getRecentNativeException?.() ?? null
|
|
213
|
+
} catch {
|
|
214
|
+
return null
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
|
|
190
218
|
/**
|
|
191
219
|
* v0.7.3 — drives the native screenshot path. JS side passes the
|
|
192
220
|
* current list of mask `nativeID`s (read from the consumer's
|