@goliapkg/sentori-react-native 4.0.0 → 5.1.0

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.
Files changed (308) hide show
  1. package/MIGRATION.md +131 -0
  2. package/README.md +40 -30
  3. package/android/build.gradle +21 -0
  4. package/android/src/main/java/com/sentori/SentoriCrashHandler.kt +29 -0
  5. package/android/src/main/java/com/sentori/SentoriModule.kt +8 -0
  6. package/android/src/main/java/com/sentori/SentoriScreenshotCapture.kt +36 -4
  7. package/android/src/test/java/com/sentori/SentoriCrashHandlerTest.kt +7 -2
  8. package/android/src/test/resources/robolectric.properties +10 -0
  9. package/ios/SentoriCrashHandler.swift +48 -4
  10. package/ios/SentoriModule.swift +12 -0
  11. package/ios/SentoriScreenshotCapture.swift +34 -3
  12. package/lib/config.d.ts +17 -47
  13. package/lib/config.d.ts.map +1 -1
  14. package/lib/config.js +3 -0
  15. package/lib/config.js.map +1 -1
  16. package/lib/device.d.ts +5 -0
  17. package/lib/device.d.ts.map +1 -0
  18. package/lib/device.js +29 -0
  19. package/lib/device.js.map +1 -0
  20. package/lib/emit-hooks.d.ts +7 -0
  21. package/lib/emit-hooks.d.ts.map +1 -0
  22. package/lib/emit-hooks.js +24 -0
  23. package/lib/emit-hooks.js.map +1 -0
  24. package/lib/error-boundary.d.ts.map +1 -1
  25. package/lib/error-boundary.js +1 -1
  26. package/lib/error-boundary.js.map +1 -1
  27. package/lib/feature-flags.d.ts.map +1 -1
  28. package/lib/handlers/dev-symbolicate.d.ts +1 -1
  29. package/lib/handlers/dev-symbolicate.d.ts.map +1 -1
  30. package/lib/handlers/dev-symbolicate.js +2 -0
  31. package/lib/handlers/dev-symbolicate.js.map +1 -1
  32. package/lib/handlers/global.js +1 -1
  33. package/lib/handlers/global.js.map +1 -1
  34. package/lib/handlers/lifecycle.js +3 -3
  35. package/lib/handlers/lifecycle.js.map +1 -1
  36. package/lib/handlers/network.d.ts +2 -2
  37. package/lib/handlers/network.d.ts.map +1 -1
  38. package/lib/handlers/network.js +69 -187
  39. package/lib/handlers/network.js.map +1 -1
  40. package/lib/handlers/promise.js +1 -1
  41. package/lib/handlers/promise.js.map +1 -1
  42. package/lib/handlers/screenshot.d.ts.map +1 -1
  43. package/lib/handlers/screenshot.js +3 -12
  44. package/lib/handlers/screenshot.js.map +1 -1
  45. package/lib/index.d.ts +32 -109
  46. package/lib/index.d.ts.map +1 -1
  47. package/lib/index.js +54 -103
  48. package/lib/index.js.map +1 -1
  49. package/lib/init.d.ts +3 -150
  50. package/lib/init.d.ts.map +1 -1
  51. package/lib/init.js +100 -261
  52. package/lib/init.js.map +1 -1
  53. package/lib/long-task-monitor.d.ts +1 -7
  54. package/lib/long-task-monitor.d.ts.map +1 -1
  55. package/lib/long-task-monitor.js +37 -58
  56. package/lib/long-task-monitor.js.map +1 -1
  57. package/lib/mask.d.ts +5 -13
  58. package/lib/mask.d.ts.map +1 -1
  59. package/lib/mask.js +29 -30
  60. package/lib/mask.js.map +1 -1
  61. package/lib/mobile-vitals.d.ts +3 -31
  62. package/lib/mobile-vitals.d.ts.map +1 -1
  63. package/lib/mobile-vitals.js +22 -61
  64. package/lib/mobile-vitals.js.map +1 -1
  65. package/lib/native-pending.d.ts +3 -0
  66. package/lib/native-pending.d.ts.map +1 -0
  67. package/lib/native-pending.js +64 -0
  68. package/lib/native-pending.js.map +1 -0
  69. package/lib/native.d.ts +4 -11
  70. package/lib/native.d.ts.map +1 -1
  71. package/lib/native.js +23 -0
  72. package/lib/native.js.map +1 -1
  73. package/lib/navigation.d.ts +3 -17
  74. package/lib/navigation.d.ts.map +1 -1
  75. package/lib/navigation.js +32 -133
  76. package/lib/navigation.js.map +1 -1
  77. package/lib/netinfo.d.ts +1 -1
  78. package/lib/netinfo.d.ts.map +1 -1
  79. package/lib/netinfo.js +2 -2
  80. package/lib/netinfo.js.map +1 -1
  81. package/lib/push.d.ts.map +1 -1
  82. package/lib/push.js +2 -4
  83. package/lib/push.js.map +1 -1
  84. package/lib/rage-tap.d.ts.map +1 -1
  85. package/lib/rage-tap.js +56 -23
  86. package/lib/rage-tap.js.map +1 -1
  87. package/lib/replay-screens.d.ts +15 -0
  88. package/lib/replay-screens.d.ts.map +1 -0
  89. package/lib/replay-screens.js +87 -0
  90. package/lib/replay-screens.js.map +1 -0
  91. package/lib/replay.d.ts.map +1 -1
  92. package/lib/replay.js +3 -24
  93. package/lib/replay.js.map +1 -1
  94. package/lib/responsiveness-detector.d.ts +18 -0
  95. package/lib/responsiveness-detector.d.ts.map +1 -0
  96. package/lib/responsiveness-detector.js +55 -0
  97. package/lib/responsiveness-detector.js.map +1 -0
  98. package/lib/scope.d.ts +7 -0
  99. package/lib/scope.d.ts.map +1 -0
  100. package/lib/scope.js +41 -0
  101. package/lib/scope.js.map +1 -0
  102. package/lib/transport.d.ts +19 -92
  103. package/lib/transport.d.ts.map +1 -1
  104. package/lib/transport.js +75 -288
  105. package/lib/transport.js.map +1 -1
  106. package/lib/verbs.d.ts +16 -0
  107. package/lib/verbs.d.ts.map +1 -0
  108. package/lib/verbs.js +153 -0
  109. package/lib/verbs.js.map +1 -0
  110. package/package.json +4 -3
  111. package/src/__tests__/iron-rule.test.ts +128 -0
  112. package/src/__tests__/replay-screens.test.ts +63 -0
  113. package/src/__tests__/responsiveness-detector.test.ts +74 -0
  114. package/src/__tests__/screenshot.test.ts +0 -2
  115. package/src/__tests__/transport.test.ts +66 -213
  116. package/src/__tests__/verbs.test.ts +91 -0
  117. package/src/config.ts +20 -47
  118. package/src/device.ts +36 -0
  119. package/src/emit-hooks.ts +30 -0
  120. package/src/error-boundary.tsx +1 -1
  121. package/src/handlers/dev-symbolicate.ts +2 -1
  122. package/src/handlers/global.ts +1 -1
  123. package/src/handlers/lifecycle.ts +3 -3
  124. package/src/handlers/network.ts +95 -211
  125. package/src/handlers/promise.ts +1 -1
  126. package/src/handlers/screenshot.ts +3 -11
  127. package/src/index.ts +84 -215
  128. package/src/init.ts +115 -449
  129. package/src/long-task-monitor.ts +42 -64
  130. package/src/mask.ts +29 -31
  131. package/src/mobile-vitals.ts +22 -82
  132. package/src/native-pending.ts +92 -0
  133. package/src/native.ts +33 -0
  134. package/src/navigation.ts +34 -142
  135. package/src/netinfo.ts +3 -3
  136. package/src/push.ts +2 -5
  137. package/src/rage-tap.tsx +72 -25
  138. package/src/replay-screens.ts +95 -0
  139. package/src/replay.ts +3 -20
  140. package/src/responsiveness-detector.ts +66 -0
  141. package/src/scope.ts +50 -0
  142. package/src/transport.ts +84 -371
  143. package/src/verbs.ts +198 -0
  144. package/lib/breadcrumbs.d.ts +0 -18
  145. package/lib/breadcrumbs.d.ts.map +0 -1
  146. package/lib/breadcrumbs.js +0 -42
  147. package/lib/breadcrumbs.js.map +0 -1
  148. package/lib/bundle-info.d.ts +0 -12
  149. package/lib/bundle-info.d.ts.map +0 -1
  150. package/lib/bundle-info.js +0 -73
  151. package/lib/bundle-info.js.map +0 -1
  152. package/lib/capture.d.ts +0 -140
  153. package/lib/capture.d.ts.map +0 -1
  154. package/lib/capture.js +0 -511
  155. package/lib/capture.js.map +0 -1
  156. package/lib/compat/sentry.d.ts +0 -126
  157. package/lib/compat/sentry.d.ts.map +0 -1
  158. package/lib/compat/sentry.js +0 -332
  159. package/lib/compat/sentry.js.map +0 -1
  160. package/lib/control-channel.d.ts +0 -6
  161. package/lib/control-channel.d.ts.map +0 -1
  162. package/lib/control-channel.js +0 -96
  163. package/lib/control-channel.js.map +0 -1
  164. package/lib/expo-compat.d.ts +0 -270
  165. package/lib/expo-compat.d.ts.map +0 -1
  166. package/lib/expo-compat.js +0 -500
  167. package/lib/expo-compat.js.map +0 -1
  168. package/lib/feedback-widget.d.ts +0 -35
  169. package/lib/feedback-widget.d.ts.map +0 -1
  170. package/lib/feedback-widget.js +0 -193
  171. package/lib/feedback-widget.js.map +0 -1
  172. package/lib/feedback.d.ts +0 -2
  173. package/lib/feedback.d.ts.map +0 -1
  174. package/lib/feedback.js +0 -17
  175. package/lib/feedback.js.map +0 -1
  176. package/lib/heartbeat.d.ts +0 -9
  177. package/lib/heartbeat.d.ts.map +0 -1
  178. package/lib/heartbeat.js +0 -138
  179. package/lib/heartbeat.js.map +0 -1
  180. package/lib/index.js.bak +0 -64
  181. package/lib/install-id.d.ts +0 -17
  182. package/lib/install-id.d.ts.map +0 -1
  183. package/lib/install-id.js +0 -125
  184. package/lib/install-id.js.map +0 -1
  185. package/lib/lifecycle.d.ts +0 -28
  186. package/lib/lifecycle.d.ts.map +0 -1
  187. package/lib/lifecycle.js +0 -73
  188. package/lib/lifecycle.js.map +0 -1
  189. package/lib/measure.d.ts +0 -4
  190. package/lib/measure.d.ts.map +0 -1
  191. package/lib/measure.js +0 -25
  192. package/lib/measure.js.map +0 -1
  193. package/lib/metrics.d.ts +0 -24
  194. package/lib/metrics.d.ts.map +0 -1
  195. package/lib/metrics.js +0 -81
  196. package/lib/metrics.js.map +0 -1
  197. package/lib/pre-crash-sentinel.d.ts +0 -12
  198. package/lib/pre-crash-sentinel.d.ts.map +0 -1
  199. package/lib/pre-crash-sentinel.js +0 -116
  200. package/lib/pre-crash-sentinel.js.map +0 -1
  201. package/lib/report-security.d.ts +0 -40
  202. package/lib/report-security.d.ts.map +0 -1
  203. package/lib/report-security.js +0 -159
  204. package/lib/report-security.js.map +0 -1
  205. package/lib/runtime-metrics-fps.d.ts +0 -19
  206. package/lib/runtime-metrics-fps.d.ts.map +0 -1
  207. package/lib/runtime-metrics-fps.js +0 -128
  208. package/lib/runtime-metrics-fps.js.map +0 -1
  209. package/lib/runtime-metrics-heap.d.ts +0 -13
  210. package/lib/runtime-metrics-heap.d.ts.map +0 -1
  211. package/lib/runtime-metrics-heap.js +0 -67
  212. package/lib/runtime-metrics-heap.js.map +0 -1
  213. package/lib/runtime-metrics-network.d.ts +0 -23
  214. package/lib/runtime-metrics-network.d.ts.map +0 -1
  215. package/lib/runtime-metrics-network.js +0 -99
  216. package/lib/runtime-metrics-network.js.map +0 -1
  217. package/lib/runtime-metrics.d.ts +0 -43
  218. package/lib/runtime-metrics.d.ts.map +0 -1
  219. package/lib/runtime-metrics.js +0 -115
  220. package/lib/runtime-metrics.js.map +0 -1
  221. package/lib/sample-profiler.d.ts +0 -21
  222. package/lib/sample-profiler.d.ts.map +0 -1
  223. package/lib/sample-profiler.js +0 -152
  224. package/lib/sample-profiler.js.map +0 -1
  225. package/lib/sentinel-context.d.ts +0 -4
  226. package/lib/sentinel-context.d.ts.map +0 -1
  227. package/lib/sentinel-context.js +0 -52
  228. package/lib/sentinel-context.js.map +0 -1
  229. package/lib/session-tracker.d.ts +0 -6
  230. package/lib/session-tracker.d.ts.map +0 -1
  231. package/lib/session-tracker.js +0 -50
  232. package/lib/session-tracker.js.map +0 -1
  233. package/lib/stack.d.ts +0 -3
  234. package/lib/stack.d.ts.map +0 -1
  235. package/lib/stack.js +0 -7
  236. package/lib/stack.js.map +0 -1
  237. package/lib/state-snapshots.d.ts +0 -33
  238. package/lib/state-snapshots.d.ts.map +0 -1
  239. package/lib/state-snapshots.js +0 -109
  240. package/lib/state-snapshots.js.map +0 -1
  241. package/lib/track.d.ts +0 -34
  242. package/lib/track.d.ts.map +0 -1
  243. package/lib/track.js +0 -107
  244. package/lib/track.js.map +0 -1
  245. package/lib/trail.d.ts +0 -12
  246. package/lib/trail.d.ts.map +0 -1
  247. package/lib/trail.js +0 -28
  248. package/lib/trail.js.map +0 -1
  249. package/lib/trust-score.d.ts +0 -20
  250. package/lib/trust-score.d.ts.map +0 -1
  251. package/lib/trust-score.js +0 -151
  252. package/lib/trust-score.js.map +0 -1
  253. package/lib/types.d.ts +0 -2
  254. package/lib/types.d.ts.map +0 -1
  255. package/lib/types.js +0 -4
  256. package/lib/types.js.map +0 -1
  257. package/lib/uuid.d.ts +0 -2
  258. package/lib/uuid.d.ts.map +0 -1
  259. package/lib/uuid.js +0 -3
  260. package/lib/uuid.js.map +0 -1
  261. package/src/__tests__/before-send.test.ts +0 -72
  262. package/src/__tests__/breadcrumbs.test.ts +0 -44
  263. package/src/__tests__/capture-replay.test.ts +0 -150
  264. package/src/__tests__/compat-sentry.test.ts +0 -121
  265. package/src/__tests__/control-channel.test.ts +0 -111
  266. package/src/__tests__/install-id.test.ts +0 -60
  267. package/src/__tests__/long-task-monitor.test.ts +0 -59
  268. package/src/__tests__/measure.test.ts +0 -45
  269. package/src/__tests__/navigation.test.ts +0 -175
  270. package/src/__tests__/push.test.ts +0 -238
  271. package/src/__tests__/report-security.test.ts +0 -106
  272. package/src/__tests__/runtime-metrics-instruments.test.ts +0 -109
  273. package/src/__tests__/runtime-metrics-network.test.ts +0 -78
  274. package/src/__tests__/sample-profiler.test.ts +0 -59
  275. package/src/__tests__/stack.test.ts +0 -45
  276. package/src/__tests__/state-snapshots.test.ts +0 -119
  277. package/src/__tests__/tracing.test.ts +0 -201
  278. package/src/__tests__/track.test.ts +0 -91
  279. package/src/__tests__/uuid.test.ts +0 -41
  280. package/src/breadcrumbs.ts +0 -57
  281. package/src/bundle-info.ts +0 -95
  282. package/src/capture.ts +0 -660
  283. package/src/compat/sentry.ts +0 -490
  284. package/src/control-channel.ts +0 -98
  285. package/src/expo-compat.ts +0 -698
  286. package/src/feedback-widget.tsx +0 -316
  287. package/src/feedback.ts +0 -21
  288. package/src/heartbeat.ts +0 -157
  289. package/src/install-id.ts +0 -146
  290. package/src/lifecycle.ts +0 -76
  291. package/src/measure.ts +0 -28
  292. package/src/metrics.ts +0 -94
  293. package/src/pre-crash-sentinel.ts +0 -140
  294. package/src/report-security.ts +0 -165
  295. package/src/runtime-metrics-fps.ts +0 -137
  296. package/src/runtime-metrics-heap.ts +0 -78
  297. package/src/runtime-metrics-network.ts +0 -103
  298. package/src/runtime-metrics.ts +0 -122
  299. package/src/sample-profiler.ts +0 -169
  300. package/src/sentinel-context.ts +0 -60
  301. package/src/session-tracker.ts +0 -53
  302. package/src/stack.ts +0 -10
  303. package/src/state-snapshots.ts +0 -133
  304. package/src/track.ts +0 -123
  305. package/src/trail.ts +0 -32
  306. package/src/trust-score.ts +0 -176
  307. package/src/types.ts +0 -21
  308. package/src/uuid.ts +0 -2
@@ -1,193 +0,0 @@
1
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
- // v0.9.1 #9 — Feedback Widget.
3
- //
4
- // `<FeedbackButton trigger="shake|manual|fab" />` — drop into the
5
- // app root, opens a modal prompt that submits via the existing
6
- // `sentori.sendUserFeedback` API. Shake detection is opt-in and
7
- // requires `expo-sensors` (Accelerometer) — falls back to manual
8
- // trigger if not installed. The button can also be controlled
9
- // programmatically via a ref: `feedbackRef.current.open()`.
10
- //
11
- // Aesthetic: very plain Modal + Text + TextInput so it adopts the
12
- // host app's color scheme without forcing a sentori theme on it.
13
- import { forwardRef, useCallback, useEffect, useImperativeHandle, useRef, useState, } from 'react';
14
- import { Modal, Pressable, StyleSheet, Text, TextInput, View, } from 'react-native';
15
- import { sendUserFeedback } from './capture';
16
- import { isAnyNativeModuleLinked } from './native-loader';
17
- export const FeedbackButton = forwardRef(function FeedbackButton(props, ref) {
18
- const trigger = props.trigger ?? 'fab';
19
- const [open, setOpen] = useState(false);
20
- const [title, setTitle] = useState('');
21
- const [body, setBody] = useState('');
22
- const [email, setEmail] = useState('');
23
- const [submitting, setSubmitting] = useState(false);
24
- const [sent, setSent] = useState(false);
25
- const eventIdRef = useRef(props.eventId);
26
- useImperativeHandle(ref, () => ({
27
- open: (defaults) => {
28
- setTitle(defaults?.title ?? '');
29
- setBody(defaults?.body ?? '');
30
- eventIdRef.current = defaults?.eventId ?? props.eventId;
31
- setSent(false);
32
- setOpen(true);
33
- },
34
- close: () => setOpen(false),
35
- }), [props.eventId]);
36
- // Shake detection — opt-in. We load expo-sensors lazily so apps
37
- // that don't install it never pay the bundle cost. Same native
38
- // module guard as netinfo: if the JS package is in node_modules
39
- // but native bridge isn't linked we'd otherwise crash inside the
40
- // sensor emitter.
41
- useEffect(() => {
42
- if (trigger !== 'shake')
43
- return;
44
- if (!isAnyNativeModuleLinked(['ExponentAccelerometer', 'EXAccelerometer', 'ExpoAccelerometer'])) {
45
- return;
46
- }
47
- let sub = null;
48
- try {
49
- // eslint-disable-next-line @typescript-eslint/no-require-imports
50
- const mod = require('expo-sensors');
51
- const A = mod.Accelerometer;
52
- if (!A)
53
- return;
54
- A.setUpdateInterval(100);
55
- const thr = props.shakeThreshold ?? 18;
56
- let lastTriggerAt = 0;
57
- sub = A.addListener(({ x, y, z }) => {
58
- const mag = Math.sqrt(x * x + y * y + z * z) * 9.81; // g → m/s²
59
- const now = Date.now();
60
- if (mag > thr && now - lastTriggerAt > 1500) {
61
- lastTriggerAt = now;
62
- setSent(false);
63
- setOpen(true);
64
- }
65
- });
66
- }
67
- catch {
68
- // expo-sensors not installed → silently fall back to manual
69
- }
70
- return () => {
71
- if (sub)
72
- sub.remove();
73
- };
74
- }, [trigger, props.shakeThreshold]);
75
- const onSubmit = useCallback(async () => {
76
- if (!title.trim() || !body.trim())
77
- return;
78
- setSubmitting(true);
79
- try {
80
- await sendUserFeedback({
81
- title: title.trim().slice(0, 200),
82
- body: body.trim().slice(0, 8000),
83
- email: email.trim() || undefined,
84
- eventId: eventIdRef.current,
85
- });
86
- setSent(true);
87
- setTimeout(() => setOpen(false), 1200);
88
- }
89
- finally {
90
- setSubmitting(false);
91
- }
92
- }, [title, body, email]);
93
- const L = {
94
- bodyPlaceholder: 'What happened?',
95
- cancel: 'Cancel',
96
- emailPlaceholder: 'email (optional)',
97
- sent: 'Thanks — report sent.',
98
- submit: 'Send',
99
- title: 'Report a problem',
100
- ...props.labels,
101
- };
102
- return (_jsxs(_Fragment, { children: [trigger === 'fab' && (_jsx(Pressable, { accessibilityLabel: "Open feedback", onPress: () => {
103
- setSent(false);
104
- setOpen(true);
105
- }, style: styles.fab, children: _jsx(Text, { style: styles.fabText, children: "?" }) })), _jsx(Modal, { animationType: "fade", transparent: true, visible: open, onRequestClose: () => setOpen(false), children: _jsx(View, { style: styles.backdrop, children: _jsx(View, { style: styles.card, children: sent ? (_jsx(Text, { style: styles.sentMessage, children: L.sent })) : (_jsxs(_Fragment, { children: [_jsx(Text, { style: styles.heading, children: L.title }), _jsx(TextInput, { autoCapitalize: "sentences", onChangeText: setTitle, placeholder: "Subject", placeholderTextColor: "#888", style: styles.titleInput, value: title }), _jsx(TextInput, { multiline: true, onChangeText: setBody, placeholder: L.bodyPlaceholder, placeholderTextColor: "#888", style: styles.bodyInput, textAlignVertical: "top", value: body }), _jsx(TextInput, { autoCapitalize: "none", keyboardType: "email-address", onChangeText: setEmail, placeholder: L.emailPlaceholder, placeholderTextColor: "#888", style: styles.emailInput, value: email }), _jsxs(View, { style: styles.actions, children: [_jsx(Pressable, { onPress: () => setOpen(false), style: styles.cancelBtn, children: _jsx(Text, { style: styles.cancelText, children: L.cancel }) }), _jsx(Pressable, { disabled: submitting || !title.trim() || !body.trim(), onPress: onSubmit, style: [styles.submitBtn, submitting && styles.submitBtnDisabled], children: _jsx(Text, { style: styles.submitText, children: submitting ? '…' : L.submit }) })] })] })) }) }) })] }));
106
- });
107
- const styles = StyleSheet.create({
108
- actions: {
109
- flexDirection: 'row',
110
- gap: 8,
111
- justifyContent: 'flex-end',
112
- },
113
- backdrop: {
114
- alignItems: 'center',
115
- backgroundColor: 'rgba(0,0,0,0.5)',
116
- flex: 1,
117
- justifyContent: 'center',
118
- paddingHorizontal: 24,
119
- },
120
- bodyInput: {
121
- backgroundColor: '#f7f7f8',
122
- borderColor: '#e5e5e8',
123
- borderRadius: 6,
124
- borderWidth: 1,
125
- color: '#111',
126
- fontSize: 14,
127
- marginBottom: 8,
128
- minHeight: 100,
129
- paddingHorizontal: 12,
130
- paddingVertical: 10,
131
- },
132
- cancelBtn: {
133
- paddingHorizontal: 14,
134
- paddingVertical: 8,
135
- },
136
- cancelText: { color: '#666', fontSize: 14 },
137
- card: {
138
- backgroundColor: '#fff',
139
- borderRadius: 10,
140
- padding: 16,
141
- width: '100%',
142
- },
143
- emailInput: {
144
- backgroundColor: '#f7f7f8',
145
- borderColor: '#e5e5e8',
146
- borderRadius: 6,
147
- borderWidth: 1,
148
- color: '#111',
149
- fontSize: 14,
150
- marginBottom: 14,
151
- paddingHorizontal: 12,
152
- paddingVertical: 8,
153
- },
154
- fab: {
155
- alignItems: 'center',
156
- backgroundColor: '#111',
157
- borderRadius: 24,
158
- bottom: 28,
159
- elevation: 4,
160
- height: 48,
161
- justifyContent: 'center',
162
- position: 'absolute',
163
- right: 18,
164
- shadowColor: '#000',
165
- shadowOffset: { height: 2, width: 0 },
166
- shadowOpacity: 0.18,
167
- shadowRadius: 4,
168
- width: 48,
169
- },
170
- fabText: { color: '#fff', fontSize: 22, fontWeight: '500' },
171
- heading: { color: '#111', fontSize: 18, fontWeight: '500', marginBottom: 12 },
172
- sentMessage: { color: '#111', fontSize: 14, paddingVertical: 18, textAlign: 'center' },
173
- submitBtn: {
174
- backgroundColor: '#111',
175
- borderRadius: 6,
176
- paddingHorizontal: 16,
177
- paddingVertical: 8,
178
- },
179
- submitBtnDisabled: { opacity: 0.5 },
180
- submitText: { color: '#fff', fontSize: 14, fontWeight: '500' },
181
- titleInput: {
182
- backgroundColor: '#f7f7f8',
183
- borderColor: '#e5e5e8',
184
- borderRadius: 6,
185
- borderWidth: 1,
186
- color: '#111',
187
- fontSize: 14,
188
- marginBottom: 8,
189
- paddingHorizontal: 12,
190
- paddingVertical: 8,
191
- },
192
- });
193
- //# sourceMappingURL=feedback-widget.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"feedback-widget.js","sourceRoot":"","sources":["../src/feedback-widget.tsx"],"names":[],"mappings":"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"}
package/lib/feedback.d.ts DELETED
@@ -1,2 +0,0 @@
1
- export { FeedbackButton, type FeedbackButtonHandle, type FeedbackButtonProps, } from './feedback-widget';
2
- //# sourceMappingURL=feedback.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"feedback.d.ts","sourceRoot":"","sources":["../src/feedback.ts"],"names":[],"mappings":"AAgBA,OAAO,EACL,cAAc,EACd,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,GACzB,MAAM,mBAAmB,CAAA"}
package/lib/feedback.js DELETED
@@ -1,17 +0,0 @@
1
- // v2.0 W3 — `feedback` subpath. The feedback widget pulls in a
2
- // component tree (react + tsx) and an internal viewer route, so
3
- // importing it eagerly from the SDK's top-level barrel pays a
4
- // bundle cost every consumer pays — even ones that never render
5
- // the widget.
6
- //
7
- // Subpath import `@goliapkg/sentori-react-native/feedback`
8
- // resolves to just the widget surface. Hosts that don't render
9
- // the feedback button pay zero bundle delta; hosts that do reach
10
- // for it import via this module and get exactly what they need.
11
- //
12
- // Top-level (`index.ts`) still re-exports `FeedbackButton` for one
13
- // more release cycle so v1 callsites don't break on upgrade. v3
14
- // will drop the top-level re-export — see
15
- // `docs/recipes/v1-to-v2-migration.md` for the deprecation timeline.
16
- export { FeedbackButton, } from './feedback-widget';
17
- //# sourceMappingURL=feedback.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"feedback.js","sourceRoot":"","sources":["../src/feedback.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,gEAAgE;AAChE,8DAA8D;AAC9D,gEAAgE;AAChE,cAAc;AACd,EAAE;AACF,2DAA2D;AAC3D,+DAA+D;AAC/D,iEAAiE;AACjE,gEAAgE;AAChE,EAAE;AACF,mEAAmE;AACnE,gEAAgE;AAChE,0CAA0C;AAC1C,qEAAqE;AAErE,OAAO,EACL,cAAc,GAGf,MAAM,mBAAmB,CAAA"}
@@ -1,9 +0,0 @@
1
- export type HeartbeatOptions = {
2
- /** Override the default 60 s interval. Floor 10 s — anything below
3
- * trips the perf rule and the server's rate-limit anyway. */
4
- intervalMs?: number;
5
- };
6
- export declare function startHeartbeat(opts?: HeartbeatOptions): void;
7
- export declare function stopHeartbeat(): void;
8
- export declare function __resetHeartbeatForTests(): void;
9
- //# sourceMappingURL=heartbeat.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"heartbeat.d.ts","sourceRoot":"","sources":["../src/heartbeat.ts"],"names":[],"mappings":"AAgDA,MAAM,MAAM,gBAAgB,GAAG;IAC7B;kEAC8D;IAC9D,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,wBAAgB,cAAc,CAAC,IAAI,GAAE,gBAAqB,GAAG,IAAI,CA2ChE;AAED,wBAAgB,aAAa,IAAI,IAAI,CAYpC;AA2CD,wBAAgB,wBAAwB,IAAI,IAAI,CAE/C"}
package/lib/heartbeat.js DELETED
@@ -1,138 +0,0 @@
1
- // Analytics v1 — concurrent-user heartbeat.
2
- //
3
- // Once per minute, while the app is in the foreground, POST a tiny
4
- // `{ sessionId, userId?, release, route?, os?, ts }` body to
5
- // `/v1/heartbeat`. The server keeps a per-project Valkey ZSET keyed
6
- // by member (user.id when set, sessionId otherwise) and the
7
- // dashboard's `Live` page reads the set to render concurrent-user
8
- // count + per-dim breakdowns.
9
- //
10
- // Iron-rule budget (CLAUDE.md):
11
- // - 1 POST / min foreground only — never fires when backgrounded
12
- // - ~200 B body
13
- // - fire-and-forget; never blocks the JS thread, no retries
14
- // - bounce suppression: if AppState flaps active → inactive → active
15
- // inside 30 s, we still fire at most one heartbeat per 30 s
16
- //
17
- // The heartbeat is independent of the session ping in
18
- // `session-tracker.ts`. Session pings fire only at session close
19
- // (transport-batched); the heartbeat exists *during* the session to
20
- // signal presence.
21
- import { logger } from '@goliapkg/sentori-core';
22
- import { getConfig } from './config';
23
- import { getUser } from './capture';
24
- import { getLastRoute } from './navigation';
25
- import { uuidV7 } from './uuid';
26
- const DEFAULT_INTERVAL_MS = 60_000;
27
- const MIN_GAP_MS = 30_000;
28
- let _running = false;
29
- let _timer = null;
30
- let _appStateSub = null;
31
- let _sessionId = null;
32
- let _lastBeatTs = 0;
33
- let _intervalMs = DEFAULT_INTERVAL_MS;
34
- export function startHeartbeat(opts = {}) {
35
- if (_running)
36
- return;
37
- _running = true;
38
- _intervalMs = Math.max(10_000, opts.intervalMs ?? DEFAULT_INTERVAL_MS);
39
- _sessionId = uuidV7();
40
- // AppState gate — only beat while app is in the foreground.
41
- let AppState;
42
- try {
43
- // eslint-disable-next-line @typescript-eslint/no-require-imports
44
- AppState = require('react-native').AppState;
45
- }
46
- catch {
47
- // Not in RN runtime (tests). The interval still runs; the gate
48
- // is just permissive. Suppression below still applies.
49
- AppState = undefined;
50
- }
51
- const isForeground = () => {
52
- if (!AppState)
53
- return true;
54
- return (AppState.currentState ?? 'active') === 'active';
55
- };
56
- const beat = () => {
57
- if (!_running)
58
- return;
59
- if (!isForeground())
60
- return;
61
- const now = Date.now();
62
- if (now - _lastBeatTs < MIN_GAP_MS)
63
- return;
64
- _lastBeatTs = now;
65
- void send();
66
- };
67
- // First beat as soon as we start (so the dashboard sees the user
68
- // immediately, not 60 s after launch). Subsequent fires on the
69
- // interval. AppState transitions can poke an immediate beat too —
70
- // an active resume is a meaningful presence event.
71
- beat();
72
- _timer = setInterval(beat, _intervalMs);
73
- if (AppState && typeof AppState.addEventListener === 'function') {
74
- _appStateSub = AppState.addEventListener('change', (state) => {
75
- if (state === 'active')
76
- beat();
77
- });
78
- }
79
- }
80
- export function stopHeartbeat() {
81
- _running = false;
82
- if (_timer !== null) {
83
- clearInterval(_timer);
84
- _timer = null;
85
- }
86
- if (_appStateSub) {
87
- _appStateSub.remove();
88
- _appStateSub = null;
89
- }
90
- _sessionId = null;
91
- _lastBeatTs = 0;
92
- }
93
- async function send() {
94
- const config = getConfig();
95
- if (!config)
96
- return;
97
- const user = getUser();
98
- const body = {
99
- sessionId: _sessionId ?? '',
100
- release: config.release,
101
- ts: Date.now(),
102
- };
103
- if (user?.id)
104
- body.userId = user.id;
105
- const route = getLastRoute();
106
- if (route)
107
- body.route = route;
108
- const os = readOsString();
109
- if (os)
110
- body.os = os;
111
- try {
112
- await fetch(`${config.ingestUrl}/v1/heartbeat`, {
113
- body: JSON.stringify(body),
114
- headers: {
115
- Authorization: `Bearer ${config.token}`,
116
- 'Content-Type': 'application/json',
117
- },
118
- method: 'POST',
119
- });
120
- }
121
- catch (e) {
122
- logger.debug('heartbeat', 'failed (best-effort, normal on offline)', e);
123
- }
124
- }
125
- function readOsString() {
126
- try {
127
- // eslint-disable-next-line @typescript-eslint/no-require-imports
128
- const RN = require('react-native');
129
- return `${RN.Platform.OS} ${RN.Platform.Version}`;
130
- }
131
- catch {
132
- return null;
133
- }
134
- }
135
- export function __resetHeartbeatForTests() {
136
- stopHeartbeat();
137
- }
138
- //# sourceMappingURL=heartbeat.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"heartbeat.js","sourceRoot":"","sources":["../src/heartbeat.ts"],"names":[],"mappings":"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"}
package/lib/index.js.bak DELETED
@@ -1,64 +0,0 @@
1
- import { init } from './init';
2
- import { addBreadcrumb } from './breadcrumbs';
3
- import { captureError, captureException, captureStep, getUser, sendUserFeedback, setUser, } from './capture';
4
- import { ErrorBoundary } from './error-boundary';
5
- import { FeedbackButton } from './feedback-widget';
6
- import { clearAllFeatureFlags, clearFeatureFlag, getFeatureFlags, setFeatureFlag, } from './feature-flags';
7
- import { clearMaskQuery, registerMaskQuery } from './mask';
8
- import { measureFn } from './measure';
9
- import { getColdStartMs, markTimeToFullDisplay, } from './mobile-vitals';
10
- import { bindState, recordState, unbindState } from './state-snapshots';
11
- import { startMoment } from '@goliapkg/sentori-core';
12
- import { flushMetrics, recordMetric } from './metrics';
13
- import { RageTapCapture } from './rage-tap';
14
- import { endSession, markSessionCrashed, startSession, } from './session-tracker';
15
- export const sentori = {
16
- init,
17
- addBreadcrumb,
18
- setUser,
19
- getUser,
20
- captureError,
21
- captureException,
22
- captureStep,
23
- sendUserFeedback,
24
- recordMetric,
25
- flushMetrics,
26
- measureFn,
27
- startMoment,
28
- bindState,
29
- recordState,
30
- unbindState,
31
- markTimeToFullDisplay,
32
- getColdStartMs,
33
- setFeatureFlag,
34
- clearFeatureFlag,
35
- clearAllFeatureFlags,
36
- getFeatureFlags,
37
- ErrorBoundary,
38
- FeedbackButton,
39
- RageTapCapture,
40
- registerMaskQuery,
41
- clearMaskQuery,
42
- startSession,
43
- endSession,
44
- markSessionCrashed,
45
- };
46
- export default sentori;
47
- export { init, init as initSentori } from './init';
48
- export { addBreadcrumb } from './breadcrumbs';
49
- export { captureError, captureException, captureStep, getUser, sendUserFeedback, setUser, } from './capture';
50
- export { ErrorBoundary } from './error-boundary';
51
- export { FeedbackButton } from './feedback-widget';
52
- export { clearAllFeatureFlags, clearFeatureFlag, getFeatureFlags, setFeatureFlag, } from './feature-flags';
53
- export { clearMaskQuery, registerMaskQuery } from './mask';
54
- export { flushMetrics, recordMetric } from './metrics';
55
- export { measureFn } from './measure';
56
- export { getColdStartMs, markTimeToFullDisplay, } from './mobile-vitals';
57
- export { MomentHandle, startMoment } from '@goliapkg/sentori-core';
58
- export { bindState, recordState, unbindState, } from './state-snapshots';
59
- export { RageTapCapture } from './rage-tap';
60
- export { probeNativeWireframe, startAnrWatchdog, stopAnrWatchdog, triggerNativeCrash, } from './native';
61
- export { drainReplay, startReplay, stopReplay } from './replay';
62
- export { endSession, markSessionCrashed, startSession, } from './session-tracker';
63
- export { useTraceNavigation } from './navigation';
64
- //# sourceMappingURL=index.js.map
@@ -1,17 +0,0 @@
1
- /**
2
- * Resolve the device's stable install id, generating one if absent.
3
- * Cached in memory after first resolve so subsequent calls are sync-
4
- * adjacent (no storage I/O). Idempotent under concurrent calls — a
5
- * second caller during the first resolve awaits the same promise.
6
- */
7
- export declare function getInstallId(): Promise<string>;
8
- /** Sync read of the currently-cached install id. `null` before the
9
- * first `getInstallId()` resolves. Use this in hot paths (event
10
- * payload assembly) that can't await storage; callers should kick
11
- * off `getInstallId()` once at startup to warm the cache. */
12
- export declare function peekInstallId(): null | string;
13
- export declare function __resetInstallIdForTests(): void;
14
- /** For tests + advanced operator flows that need to seed an id from
15
- * an external secure-storage migration. */
16
- export declare function __setInstallIdForTests(id: string): void;
17
- //# sourceMappingURL=install-id.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"install-id.d.ts","sourceRoot":"","sources":["../src/install-id.ts"],"names":[],"mappings":"AA0EA;;;;;GAKG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC,CA8CpD;AAED;;;8DAG8D;AAC9D,wBAAgB,aAAa,IAAI,IAAI,GAAG,MAAM,CAE7C;AAED,wBAAgB,wBAAwB,IAAI,IAAI,CAG/C;AAED;4CAC4C;AAC5C,wBAAgB,sBAAsB,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAEvD"}
package/lib/install-id.js DELETED
@@ -1,125 +0,0 @@
1
- // v1.1 chunk S1 — stable per-install identifier.
2
- //
3
- // `getInstallId()` returns a UUIDv7 generated on first call and
4
- // persisted to device storage. The id survives app restarts and, on
5
- // iOS specifically, app reinstalls (because the Keychain backend is
6
- // preserved across uninstall — that's the whole point).
7
- //
8
- // Storage tier order:
9
- // 1. `react-native-keychain` (optional peer; iOS + Android Keystore)
10
- // 2. AsyncStorage (host already needs this for launch-crash-guard /
11
- // offline queue, so we don't add a hard new peer dep)
12
- // 3. Process-memory only (no persistence — covers SSR / tests)
13
- //
14
- // Opaque to the host. The id is NOT tied to a `setUser` call; the
15
- // server doesn't auto-correlate to user identity. It exists purely
16
- // as a stable device key so the security posture engine (S3) can
17
- // score per-install signals independently of authentication state.
18
- import { uuidV7 } from '@goliapkg/sentori-core';
19
- import { isAnyNativeModuleLinked } from './native-loader';
20
- const KEYCHAIN_SERVICE = 'sentori.install-id';
21
- const ASYNC_STORAGE_KEY = '@sentori/install-id';
22
- let _cached = null;
23
- let _inflight = null;
24
- function loadKeychain() {
25
- // react-native-keychain is the recommended secure-storage peer.
26
- // Optional: if the host hasn't installed it we fall through to
27
- // AsyncStorage. The Keychain backend is what gives the iOS
28
- // "survives reinstall" guarantee.
29
- try {
30
- // eslint-disable-next-line @typescript-eslint/no-require-imports
31
- const mod = require('react-native-keychain');
32
- if (typeof mod.getGenericPassword !== 'function')
33
- return null;
34
- return mod;
35
- }
36
- catch {
37
- return null;
38
- }
39
- }
40
- function loadAsyncStorage() {
41
- if (!isAnyNativeModuleLinked(['RNCAsyncStorage', 'AsyncStorageModule'])) {
42
- return null;
43
- }
44
- try {
45
- // eslint-disable-next-line @typescript-eslint/no-require-imports
46
- const mod = require('@react-native-async-storage/async-storage');
47
- return mod.default ?? mod;
48
- }
49
- catch {
50
- return null;
51
- }
52
- }
53
- /**
54
- * Resolve the device's stable install id, generating one if absent.
55
- * Cached in memory after first resolve so subsequent calls are sync-
56
- * adjacent (no storage I/O). Idempotent under concurrent calls — a
57
- * second caller during the first resolve awaits the same promise.
58
- */
59
- export async function getInstallId() {
60
- if (_cached !== null)
61
- return _cached;
62
- if (_inflight !== null)
63
- return _inflight;
64
- _inflight = (async () => {
65
- try {
66
- const kc = loadKeychain();
67
- if (kc) {
68
- const existing = await kc
69
- .getGenericPassword({ service: KEYCHAIN_SERVICE })
70
- .catch(() => false);
71
- if (existing && existing.password) {
72
- _cached = existing.password;
73
- return existing.password;
74
- }
75
- const fresh = uuidV7();
76
- await kc
77
- .setGenericPassword('sentori', fresh, { service: KEYCHAIN_SERVICE })
78
- .catch(() => undefined);
79
- _cached = fresh;
80
- return fresh;
81
- }
82
- const storage = loadAsyncStorage();
83
- if (storage) {
84
- const existing = await storage
85
- .getItem(ASYNC_STORAGE_KEY)
86
- .catch(() => null);
87
- if (existing) {
88
- _cached = existing;
89
- return existing;
90
- }
91
- const fresh = uuidV7();
92
- await storage.setItem(ASYNC_STORAGE_KEY, fresh).catch(() => undefined);
93
- _cached = fresh;
94
- return fresh;
95
- }
96
- // No storage available — generate but don't persist. The id is
97
- // still stable for the lifetime of the process which is good
98
- // enough for tests / SSR / no-native-modules contexts.
99
- const fresh = uuidV7();
100
- _cached = fresh;
101
- return fresh;
102
- }
103
- finally {
104
- _inflight = null;
105
- }
106
- })();
107
- return _inflight;
108
- }
109
- /** Sync read of the currently-cached install id. `null` before the
110
- * first `getInstallId()` resolves. Use this in hot paths (event
111
- * payload assembly) that can't await storage; callers should kick
112
- * off `getInstallId()` once at startup to warm the cache. */
113
- export function peekInstallId() {
114
- return _cached;
115
- }
116
- export function __resetInstallIdForTests() {
117
- _cached = null;
118
- _inflight = null;
119
- }
120
- /** For tests + advanced operator flows that need to seed an id from
121
- * an external secure-storage migration. */
122
- export function __setInstallIdForTests(id) {
123
- _cached = id;
124
- }
125
- //# sourceMappingURL=install-id.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"install-id.js","sourceRoot":"","sources":["../src/install-id.ts"],"names":[],"mappings":"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"}
@@ -1,28 +0,0 @@
1
- /**
2
- * Force-flush every pending Sentori buffer (events, metrics,
3
- * track). Returns when the flush settles or the timeout fires —
4
- * whichever happens first.
5
- *
6
- * Never rejects: per the NEVER rule, individual flush failures
7
- * are silently absorbed (and self-reported via the internal
8
- * circuit-breaker), and the resolved promise's value is undefined.
9
- *
10
- * await sentori.flush(5_000) // wait up to 5 s, then move on
11
- * process.exit(0)
12
- */
13
- export declare function flush(timeoutMs?: number): Promise<void>;
14
- /**
15
- * Flush + shut down. After `close()`, further capture* calls remain
16
- * silent no-ops via `_closed` gate. Idempotent — re-calling is safe.
17
- *
18
- * await sentori.close()
19
- * // SDK is asleep; no more events go out.
20
- */
21
- export declare function close(timeoutMs?: number): Promise<void>;
22
- /** Test hook — reset the shutdown latch so unit tests don't have to
23
- * re-init the whole SDK between cases. */
24
- export declare function __resetLifecycleForTests(): void;
25
- /** Internal — capture* implementations check this to short-circuit
26
- * after `close()`. */
27
- export declare function isClosed(): boolean;
28
- //# sourceMappingURL=lifecycle.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../src/lifecycle.ts"],"names":[],"mappings":"AAiBA;;;;;;;;;;;GAWG;AACH,wBAAsB,KAAK,CAAC,SAAS,GAAE,MAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAsBpE;AAED;;;;;;GAMG;AACH,wBAAsB,KAAK,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAG7D;AAED;2CAC2C;AAC3C,wBAAgB,wBAAwB,IAAI,IAAI,CAE/C;AAED;uBACuB;AACvB,wBAAgB,QAAQ,IAAI,OAAO,CAElC"}