@goliapkg/sentori-react-native 4.0.0 → 5.0.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 (284) hide show
  1. package/android/build.gradle +21 -0
  2. package/android/src/main/java/com/sentori/SentoriCrashHandler.kt +29 -0
  3. package/android/src/test/java/com/sentori/SentoriCrashHandlerTest.kt +7 -2
  4. package/android/src/test/resources/robolectric.properties +10 -0
  5. package/lib/config.d.ts +16 -47
  6. package/lib/config.d.ts.map +1 -1
  7. package/lib/config.js +3 -0
  8. package/lib/config.js.map +1 -1
  9. package/lib/device.d.ts +5 -0
  10. package/lib/device.d.ts.map +1 -0
  11. package/lib/device.js +29 -0
  12. package/lib/device.js.map +1 -0
  13. package/lib/emit-hooks.d.ts +7 -0
  14. package/lib/emit-hooks.d.ts.map +1 -0
  15. package/lib/emit-hooks.js +24 -0
  16. package/lib/emit-hooks.js.map +1 -0
  17. package/lib/error-boundary.d.ts.map +1 -1
  18. package/lib/error-boundary.js +1 -1
  19. package/lib/error-boundary.js.map +1 -1
  20. package/lib/feature-flags.d.ts.map +1 -1
  21. package/lib/handlers/dev-symbolicate.d.ts +1 -1
  22. package/lib/handlers/dev-symbolicate.d.ts.map +1 -1
  23. package/lib/handlers/dev-symbolicate.js +2 -0
  24. package/lib/handlers/dev-symbolicate.js.map +1 -1
  25. package/lib/handlers/global.js +1 -1
  26. package/lib/handlers/global.js.map +1 -1
  27. package/lib/handlers/lifecycle.js +3 -3
  28. package/lib/handlers/lifecycle.js.map +1 -1
  29. package/lib/handlers/network.d.ts +2 -2
  30. package/lib/handlers/network.d.ts.map +1 -1
  31. package/lib/handlers/network.js +69 -187
  32. package/lib/handlers/network.js.map +1 -1
  33. package/lib/handlers/promise.js +1 -1
  34. package/lib/handlers/promise.js.map +1 -1
  35. package/lib/handlers/screenshot.d.ts.map +1 -1
  36. package/lib/handlers/screenshot.js +3 -12
  37. package/lib/handlers/screenshot.js.map +1 -1
  38. package/lib/index.d.ts +31 -109
  39. package/lib/index.d.ts.map +1 -1
  40. package/lib/index.js +51 -103
  41. package/lib/index.js.map +1 -1
  42. package/lib/init.d.ts +3 -150
  43. package/lib/init.d.ts.map +1 -1
  44. package/lib/init.js +88 -261
  45. package/lib/init.js.map +1 -1
  46. package/lib/long-task-monitor.d.ts +1 -7
  47. package/lib/long-task-monitor.d.ts.map +1 -1
  48. package/lib/long-task-monitor.js +37 -58
  49. package/lib/long-task-monitor.js.map +1 -1
  50. package/lib/mobile-vitals.d.ts +3 -31
  51. package/lib/mobile-vitals.d.ts.map +1 -1
  52. package/lib/mobile-vitals.js +22 -61
  53. package/lib/mobile-vitals.js.map +1 -1
  54. package/lib/native-pending.d.ts +3 -0
  55. package/lib/native-pending.d.ts.map +1 -0
  56. package/lib/native-pending.js +64 -0
  57. package/lib/native-pending.js.map +1 -0
  58. package/lib/navigation.d.ts +3 -17
  59. package/lib/navigation.d.ts.map +1 -1
  60. package/lib/navigation.js +32 -133
  61. package/lib/navigation.js.map +1 -1
  62. package/lib/netinfo.d.ts +1 -1
  63. package/lib/netinfo.d.ts.map +1 -1
  64. package/lib/netinfo.js +2 -2
  65. package/lib/netinfo.js.map +1 -1
  66. package/lib/push.d.ts.map +1 -1
  67. package/lib/push.js +2 -4
  68. package/lib/push.js.map +1 -1
  69. package/lib/rage-tap.d.ts.map +1 -1
  70. package/lib/rage-tap.js +28 -23
  71. package/lib/rage-tap.js.map +1 -1
  72. package/lib/replay.d.ts.map +1 -1
  73. package/lib/replay.js +3 -24
  74. package/lib/replay.js.map +1 -1
  75. package/lib/scope.d.ts +7 -0
  76. package/lib/scope.d.ts.map +1 -0
  77. package/lib/scope.js +41 -0
  78. package/lib/scope.js.map +1 -0
  79. package/lib/transport.d.ts +19 -92
  80. package/lib/transport.d.ts.map +1 -1
  81. package/lib/transport.js +75 -288
  82. package/lib/transport.js.map +1 -1
  83. package/lib/verbs.d.ts +16 -0
  84. package/lib/verbs.d.ts.map +1 -0
  85. package/lib/verbs.js +153 -0
  86. package/lib/verbs.js.map +1 -0
  87. package/package.json +3 -3
  88. package/src/__tests__/iron-rule.test.ts +128 -0
  89. package/src/__tests__/screenshot.test.ts +0 -2
  90. package/src/__tests__/transport.test.ts +66 -213
  91. package/src/__tests__/verbs.test.ts +91 -0
  92. package/src/config.ts +19 -47
  93. package/src/device.ts +36 -0
  94. package/src/emit-hooks.ts +30 -0
  95. package/src/error-boundary.tsx +1 -1
  96. package/src/handlers/dev-symbolicate.ts +2 -1
  97. package/src/handlers/global.ts +1 -1
  98. package/src/handlers/lifecycle.ts +3 -3
  99. package/src/handlers/network.ts +95 -211
  100. package/src/handlers/promise.ts +1 -1
  101. package/src/handlers/screenshot.ts +3 -11
  102. package/src/index.ts +81 -215
  103. package/src/init.ts +94 -446
  104. package/src/long-task-monitor.ts +42 -64
  105. package/src/mobile-vitals.ts +22 -82
  106. package/src/native-pending.ts +92 -0
  107. package/src/navigation.ts +34 -142
  108. package/src/netinfo.ts +3 -3
  109. package/src/push.ts +2 -5
  110. package/src/rage-tap.tsx +29 -26
  111. package/src/replay.ts +3 -20
  112. package/src/scope.ts +50 -0
  113. package/src/transport.ts +84 -371
  114. package/src/verbs.ts +198 -0
  115. package/lib/breadcrumbs.d.ts +0 -18
  116. package/lib/breadcrumbs.d.ts.map +0 -1
  117. package/lib/breadcrumbs.js +0 -42
  118. package/lib/breadcrumbs.js.map +0 -1
  119. package/lib/bundle-info.d.ts +0 -12
  120. package/lib/bundle-info.d.ts.map +0 -1
  121. package/lib/bundle-info.js +0 -73
  122. package/lib/bundle-info.js.map +0 -1
  123. package/lib/capture.d.ts +0 -140
  124. package/lib/capture.d.ts.map +0 -1
  125. package/lib/capture.js +0 -511
  126. package/lib/capture.js.map +0 -1
  127. package/lib/compat/sentry.d.ts +0 -126
  128. package/lib/compat/sentry.d.ts.map +0 -1
  129. package/lib/compat/sentry.js +0 -332
  130. package/lib/compat/sentry.js.map +0 -1
  131. package/lib/control-channel.d.ts +0 -6
  132. package/lib/control-channel.d.ts.map +0 -1
  133. package/lib/control-channel.js +0 -96
  134. package/lib/control-channel.js.map +0 -1
  135. package/lib/expo-compat.d.ts +0 -270
  136. package/lib/expo-compat.d.ts.map +0 -1
  137. package/lib/expo-compat.js +0 -500
  138. package/lib/expo-compat.js.map +0 -1
  139. package/lib/feedback-widget.d.ts +0 -35
  140. package/lib/feedback-widget.d.ts.map +0 -1
  141. package/lib/feedback-widget.js +0 -193
  142. package/lib/feedback-widget.js.map +0 -1
  143. package/lib/feedback.d.ts +0 -2
  144. package/lib/feedback.d.ts.map +0 -1
  145. package/lib/feedback.js +0 -17
  146. package/lib/feedback.js.map +0 -1
  147. package/lib/heartbeat.d.ts +0 -9
  148. package/lib/heartbeat.d.ts.map +0 -1
  149. package/lib/heartbeat.js +0 -138
  150. package/lib/heartbeat.js.map +0 -1
  151. package/lib/index.js.bak +0 -64
  152. package/lib/install-id.d.ts +0 -17
  153. package/lib/install-id.d.ts.map +0 -1
  154. package/lib/install-id.js +0 -125
  155. package/lib/install-id.js.map +0 -1
  156. package/lib/lifecycle.d.ts +0 -28
  157. package/lib/lifecycle.d.ts.map +0 -1
  158. package/lib/lifecycle.js +0 -73
  159. package/lib/lifecycle.js.map +0 -1
  160. package/lib/mask.d.ts +0 -16
  161. package/lib/mask.d.ts.map +0 -1
  162. package/lib/mask.js +0 -36
  163. package/lib/mask.js.map +0 -1
  164. package/lib/measure.d.ts +0 -4
  165. package/lib/measure.d.ts.map +0 -1
  166. package/lib/measure.js +0 -25
  167. package/lib/measure.js.map +0 -1
  168. package/lib/metrics.d.ts +0 -24
  169. package/lib/metrics.d.ts.map +0 -1
  170. package/lib/metrics.js +0 -81
  171. package/lib/metrics.js.map +0 -1
  172. package/lib/pre-crash-sentinel.d.ts +0 -12
  173. package/lib/pre-crash-sentinel.d.ts.map +0 -1
  174. package/lib/pre-crash-sentinel.js +0 -116
  175. package/lib/pre-crash-sentinel.js.map +0 -1
  176. package/lib/report-security.d.ts +0 -40
  177. package/lib/report-security.d.ts.map +0 -1
  178. package/lib/report-security.js +0 -159
  179. package/lib/report-security.js.map +0 -1
  180. package/lib/runtime-metrics-fps.d.ts +0 -19
  181. package/lib/runtime-metrics-fps.d.ts.map +0 -1
  182. package/lib/runtime-metrics-fps.js +0 -128
  183. package/lib/runtime-metrics-fps.js.map +0 -1
  184. package/lib/runtime-metrics-heap.d.ts +0 -13
  185. package/lib/runtime-metrics-heap.d.ts.map +0 -1
  186. package/lib/runtime-metrics-heap.js +0 -67
  187. package/lib/runtime-metrics-heap.js.map +0 -1
  188. package/lib/runtime-metrics-network.d.ts +0 -23
  189. package/lib/runtime-metrics-network.d.ts.map +0 -1
  190. package/lib/runtime-metrics-network.js +0 -99
  191. package/lib/runtime-metrics-network.js.map +0 -1
  192. package/lib/runtime-metrics.d.ts +0 -43
  193. package/lib/runtime-metrics.d.ts.map +0 -1
  194. package/lib/runtime-metrics.js +0 -115
  195. package/lib/runtime-metrics.js.map +0 -1
  196. package/lib/sample-profiler.d.ts +0 -21
  197. package/lib/sample-profiler.d.ts.map +0 -1
  198. package/lib/sample-profiler.js +0 -152
  199. package/lib/sample-profiler.js.map +0 -1
  200. package/lib/sentinel-context.d.ts +0 -4
  201. package/lib/sentinel-context.d.ts.map +0 -1
  202. package/lib/sentinel-context.js +0 -52
  203. package/lib/sentinel-context.js.map +0 -1
  204. package/lib/session-tracker.d.ts +0 -6
  205. package/lib/session-tracker.d.ts.map +0 -1
  206. package/lib/session-tracker.js +0 -50
  207. package/lib/session-tracker.js.map +0 -1
  208. package/lib/stack.d.ts +0 -3
  209. package/lib/stack.d.ts.map +0 -1
  210. package/lib/stack.js +0 -7
  211. package/lib/stack.js.map +0 -1
  212. package/lib/state-snapshots.d.ts +0 -33
  213. package/lib/state-snapshots.d.ts.map +0 -1
  214. package/lib/state-snapshots.js +0 -109
  215. package/lib/state-snapshots.js.map +0 -1
  216. package/lib/track.d.ts +0 -34
  217. package/lib/track.d.ts.map +0 -1
  218. package/lib/track.js +0 -107
  219. package/lib/track.js.map +0 -1
  220. package/lib/trail.d.ts +0 -12
  221. package/lib/trail.d.ts.map +0 -1
  222. package/lib/trail.js +0 -28
  223. package/lib/trail.js.map +0 -1
  224. package/lib/trust-score.d.ts +0 -20
  225. package/lib/trust-score.d.ts.map +0 -1
  226. package/lib/trust-score.js +0 -151
  227. package/lib/trust-score.js.map +0 -1
  228. package/lib/types.d.ts +0 -2
  229. package/lib/types.d.ts.map +0 -1
  230. package/lib/types.js +0 -4
  231. package/lib/types.js.map +0 -1
  232. package/lib/uuid.d.ts +0 -2
  233. package/lib/uuid.d.ts.map +0 -1
  234. package/lib/uuid.js +0 -3
  235. package/lib/uuid.js.map +0 -1
  236. package/src/__tests__/before-send.test.ts +0 -72
  237. package/src/__tests__/breadcrumbs.test.ts +0 -44
  238. package/src/__tests__/capture-replay.test.ts +0 -150
  239. package/src/__tests__/compat-sentry.test.ts +0 -121
  240. package/src/__tests__/control-channel.test.ts +0 -111
  241. package/src/__tests__/install-id.test.ts +0 -60
  242. package/src/__tests__/long-task-monitor.test.ts +0 -59
  243. package/src/__tests__/measure.test.ts +0 -45
  244. package/src/__tests__/navigation.test.ts +0 -175
  245. package/src/__tests__/push.test.ts +0 -238
  246. package/src/__tests__/report-security.test.ts +0 -106
  247. package/src/__tests__/runtime-metrics-instruments.test.ts +0 -109
  248. package/src/__tests__/runtime-metrics-network.test.ts +0 -78
  249. package/src/__tests__/sample-profiler.test.ts +0 -59
  250. package/src/__tests__/stack.test.ts +0 -45
  251. package/src/__tests__/state-snapshots.test.ts +0 -119
  252. package/src/__tests__/tracing.test.ts +0 -201
  253. package/src/__tests__/track.test.ts +0 -91
  254. package/src/__tests__/uuid.test.ts +0 -41
  255. package/src/breadcrumbs.ts +0 -57
  256. package/src/bundle-info.ts +0 -95
  257. package/src/capture.ts +0 -660
  258. package/src/compat/sentry.ts +0 -490
  259. package/src/control-channel.ts +0 -98
  260. package/src/expo-compat.ts +0 -698
  261. package/src/feedback-widget.tsx +0 -316
  262. package/src/feedback.ts +0 -21
  263. package/src/heartbeat.ts +0 -157
  264. package/src/install-id.ts +0 -146
  265. package/src/lifecycle.ts +0 -76
  266. package/src/mask.ts +0 -41
  267. package/src/measure.ts +0 -28
  268. package/src/metrics.ts +0 -94
  269. package/src/pre-crash-sentinel.ts +0 -140
  270. package/src/report-security.ts +0 -165
  271. package/src/runtime-metrics-fps.ts +0 -137
  272. package/src/runtime-metrics-heap.ts +0 -78
  273. package/src/runtime-metrics-network.ts +0 -103
  274. package/src/runtime-metrics.ts +0 -122
  275. package/src/sample-profiler.ts +0 -169
  276. package/src/sentinel-context.ts +0 -60
  277. package/src/session-tracker.ts +0 -53
  278. package/src/stack.ts +0 -10
  279. package/src/state-snapshots.ts +0 -133
  280. package/src/track.ts +0 -123
  281. package/src/trail.ts +0 -32
  282. package/src/trust-score.ts +0 -176
  283. package/src/types.ts +0 -21
  284. package/src/uuid.ts +0 -2
@@ -1,152 +0,0 @@
1
- // v1.1 #4 升级 — JS sample profiler (idle-tick sampler).
2
- //
3
- // What it does:
4
- // • setInterval(50ms) — captures `new Error().stack` of the tick
5
- // callback, parses out the top frames, increments per-frame
6
- // counts in a rolling window
7
- // • every 60 s, emits a `sentori.profile` span with the aggregated
8
- // flame-data (frame name → tick count) as span data
9
- //
10
- // What it does NOT do:
11
- // • Sample frames during a busy JS task. JS is single-threaded;
12
- // while the busy code is running, our setInterval can't fire,
13
- // so the busy stack never gets sampled. Long-task monitor (#4
14
- // v0.9.6) catches that case from a different angle (duration).
15
- //
16
- // Idle-tick sampling is still useful: shows which functions appear
17
- // most often between busy moments — typically the render hot path,
18
- // frequent timer callbacks, recurring middleware. Pairs with
19
- // long-task-monitor (catches the 200ms+ outliers).
20
- //
21
- // Real Hermes off-thread sampling profiler (which would catch busy
22
- // frames too) needs RN-internal HermesAPI access, deferred to v1.2.
23
- import { startSpan } from '@goliapkg/sentori-core';
24
- const SAMPLE_INTERVAL_MS = 50;
25
- const FLUSH_INTERVAL_MS = 60_000;
26
- const MAX_FRAMES = 200; // safety cap per profile
27
- const MAX_FRAME_NAME_LEN = 120;
28
- /** Floor on user-configured sample interval. Going below ~20 ms costs
29
- * measurable JS-thread time to `new Error().stack` + regex parse on
30
- * every tick — past that point you'd see the profile drag down the
31
- * thing you're profiling. */
32
- const MIN_SAMPLE_INTERVAL_MS = 20;
33
- /** Floor on flush interval. Sub-5s windows produce a span every few
34
- * seconds, which is just noise for an aggregator that's looking at
35
- * per-minute hotspot trends. */
36
- const MIN_FLUSH_INTERVAL_MS = 5_000;
37
- /** How many stack-trace lines to keep per tick (after dropping the
38
- * Error ctor + sampleTick frames). 10 is enough to see the JS-side
39
- * call shape; deeper than that the bottom frames are usually RN
40
- * runtime / event loop and not actionable. */
41
- const FRAMES_PER_TICK = 10;
42
- let _frameCounts = new Map();
43
- let _windowStartedAt = 0;
44
- let _sampleTimer = null;
45
- let _flushTimer = null;
46
- /**
47
- * Start the idle-tick sample profiler. Idempotent — calling twice
48
- * is a no-op after the first successful start.
49
- *
50
- * Pairs naturally with `longTaskMonitor` (≥200ms outliers): the
51
- * profiler shows the *distribution* of code that runs in idle gaps,
52
- * the long-task monitor catches the few outliers that are blocking
53
- * the thread. Together they cover the JS-side perf signal cheaply.
54
- */
55
- export function startSampleProfiler(opts) {
56
- if (!opts.enabled || _sampleTimer !== null)
57
- return;
58
- const sampleMs = Math.max(MIN_SAMPLE_INTERVAL_MS, opts.sampleMs ?? SAMPLE_INTERVAL_MS);
59
- const flushMs = Math.max(MIN_FLUSH_INTERVAL_MS, opts.flushMs ?? FLUSH_INTERVAL_MS);
60
- _windowStartedAt = Date.now();
61
- _sampleTimer = setInterval(() => sampleTick(), sampleMs);
62
- _flushTimer = setInterval(() => flushWindow(), flushMs);
63
- _sampleTimer.unref?.();
64
- _flushTimer.unref?.();
65
- }
66
- export function stopSampleProfiler() {
67
- if (_sampleTimer !== null) {
68
- clearInterval(_sampleTimer);
69
- _sampleTimer = null;
70
- }
71
- if (_flushTimer !== null) {
72
- clearInterval(_flushTimer);
73
- _flushTimer = null;
74
- }
75
- _frameCounts.clear();
76
- _windowStartedAt = 0;
77
- }
78
- function sampleTick() {
79
- const stack = new Error().stack;
80
- if (!stack)
81
- return;
82
- // Skip the first 2 frames — they're our `sampleTick` + `Error
83
- // ctor` which would dominate every sample.
84
- const lines = stack.split('\n').slice(2, 2 + FRAMES_PER_TICK);
85
- for (const line of lines) {
86
- const frame = parseFrameName(line);
87
- if (frame) {
88
- _frameCounts.set(frame, (_frameCounts.get(frame) ?? 0) + 1);
89
- }
90
- }
91
- }
92
- /** Pull a stable identifier from one stack-trace line. Handles:
93
- *
94
- * at FunctionName (file://path/Foo.js:123:45)
95
- * at file://path/Foo.js:123:45 (anonymous)
96
- * FunctionName@file://path/Foo.js:123:45 (Hermes style)
97
- *
98
- * Drops absolute path noise — keeps `Foo.js:Line` so re-deploys
99
- * with stable code paths bucket together. */
100
- function parseFrameName(line) {
101
- const trimmed = line.trim();
102
- if (trimmed.length === 0)
103
- return null;
104
- // Hermes / JSC: `FunctionName@file:line:col` or just `@file:line:col`.
105
- // Standard: `at FunctionName (file:line:col)`.
106
- let raw = trimmed.replace(/^at\s+/, '');
107
- raw = raw.replace(/\s*[(\[].*$/, ''); // strip the file part after `(`
108
- // Hermes: split on @
109
- if (raw.includes('@')) {
110
- raw = raw.split('@')[0] ?? raw;
111
- }
112
- raw = raw.trim();
113
- if (raw.length === 0 || raw.length > MAX_FRAME_NAME_LEN)
114
- return null;
115
- // Ignore the obvious noise frames.
116
- if (raw === 'Object.<anonymous>' || raw === '<anonymous>')
117
- return null;
118
- return raw;
119
- }
120
- function flushWindow() {
121
- if (_frameCounts.size === 0)
122
- return;
123
- const windowEndedAt = Date.now();
124
- const durationMs = windowEndedAt - _windowStartedAt;
125
- // Top-N frames so attachment doesn't bloat unboundedly.
126
- const top = Array.from(_frameCounts.entries())
127
- .sort((a, b) => b[1] - a[1])
128
- .slice(0, MAX_FRAMES);
129
- const span = startSpan('sentori.profile', {
130
- name: 'js.sample-profile',
131
- startNowMs: _windowStartedAt,
132
- tags: {
133
- 'profile.kind': 'sample',
134
- 'profile.sample_count': String(sampleCount(top)),
135
- 'profile.duration_ms': String(durationMs),
136
- },
137
- });
138
- span.setData('flameData', Object.fromEntries(top));
139
- span.finish({ endNowMs: windowEndedAt, status: 'ok' });
140
- _frameCounts.clear();
141
- _windowStartedAt = windowEndedAt;
142
- }
143
- function sampleCount(entries) {
144
- let total = 0;
145
- for (const [, n] of entries)
146
- total += n;
147
- return total;
148
- }
149
- export function __resetSampleProfilerForTests() {
150
- stopSampleProfiler();
151
- }
152
- //# sourceMappingURL=sample-profiler.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sample-profiler.js","sourceRoot":"","sources":["../src/sample-profiler.ts"],"names":[],"mappings":"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"}
@@ -1,4 +0,0 @@
1
- import type { App, Device } from './types';
2
- export declare const collectDeviceForSentinel: () => Device;
3
- export declare const getAppForSentinel: (release: string) => App;
4
- //# sourceMappingURL=sentinel-context.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sentinel-context.d.ts","sourceRoot":"","sources":["../src/sentinel-context.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAE3C,eAAO,MAAM,wBAAwB,QAAO,MAgC3C,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAAI,SAAS,MAAM,KAAG,GAkBnD,CAAC"}
@@ -1,52 +0,0 @@
1
- // Shared device + app collectors. Used by both capture.ts (errors)
2
- // and pre-crash-sentinel.ts (nearCrash). Same shape so the dashboard
3
- // can render both kinds of events through the same UI components.
4
- import { getCachedNetworkType } from './netinfo';
5
- export const collectDeviceForSentinel = () => {
6
- let os = 'other';
7
- let osVersion = '0';
8
- let locale;
9
- const networkType = getCachedNetworkType();
10
- try {
11
- // eslint-disable-next-line @typescript-eslint/no-require-imports
12
- const RN = require('react-native');
13
- const rnOS = RN.Platform.OS;
14
- os = rnOS === 'android' || rnOS === 'ios' || rnOS === 'web' ? rnOS : 'other';
15
- osVersion = String(RN.Platform.Version);
16
- if (rnOS === 'ios') {
17
- const s = RN.NativeModules.SettingsManager?.settings;
18
- locale = s?.AppleLocale ?? s?.AppleLanguages?.[0];
19
- }
20
- else if (rnOS === 'android') {
21
- locale = RN.NativeModules.I18nManager?.localeIdentifier;
22
- }
23
- }
24
- catch {
25
- // not in RN runtime
26
- }
27
- const device = { os, osVersion };
28
- if (locale)
29
- device.locale = locale;
30
- if (networkType)
31
- device.networkType = networkType;
32
- return device;
33
- };
34
- export const getAppForSentinel = (release) => {
35
- const m = /^(?:[^@]+@)?([^+]+)(?:\+(.+))?$/.exec(release);
36
- const version = m?.[1] ?? '0.0.0';
37
- const build = m?.[2];
38
- let rnVersion = 'unknown';
39
- try {
40
- // eslint-disable-next-line @typescript-eslint/no-require-imports
41
- rnVersion = require('react-native/package.json').version;
42
- }
43
- catch {
44
- // not in RN runtime
45
- }
46
- return {
47
- build,
48
- framework: { name: 'react-native', version: rnVersion },
49
- version,
50
- };
51
- };
52
- //# sourceMappingURL=sentinel-context.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sentinel-context.js","sourceRoot":"","sources":["../src/sentinel-context.ts"],"names":[],"mappings":"AAAA,mEAAmE;AACnE,qEAAqE;AACrE,kEAAkE;AAElE,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AAGjD,MAAM,CAAC,MAAM,wBAAwB,GAAG,GAAW,EAAE;IACnD,IAAI,EAAE,GAAiB,OAAO,CAAC;IAC/B,IAAI,SAAS,GAAG,GAAG,CAAC;IACpB,IAAI,MAA0B,CAAC;IAC/B,MAAM,WAAW,GAAG,oBAAoB,EAAE,CAAC;IAC3C,IAAI,CAAC;QACH,iEAAiE;QACjE,MAAM,EAAE,GAAG,OAAO,CAAC,cAAc,CAQhC,CAAC;QACF,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5B,EAAE,GAAG,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;QAC7E,SAAS,GAAG,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACxC,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;YACnB,MAAM,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,eAAe,EAAE,QAAQ,CAAC;YACrD,MAAM,GAAG,CAAC,EAAE,WAAW,IAAI,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,CAAC;QACpD,CAAC;aAAM,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YAC9B,MAAM,GAAG,EAAE,CAAC,aAAa,CAAC,WAAW,EAAE,gBAAgB,CAAC;QAC1D,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,oBAAoB;IACtB,CAAC;IACD,MAAM,MAAM,GAAW,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC;IACzC,IAAI,MAAM;QAAE,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;IACnC,IAAI,WAAW;QAAE,MAAM,CAAC,WAAW,GAAG,WAAW,CAAC;IAClD,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,OAAe,EAAO,EAAE;IACxD,MAAM,CAAC,GAAG,iCAAiC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC1D,MAAM,OAAO,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC;IAClC,MAAM,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAErB,IAAI,SAAS,GAAG,SAAS,CAAC;IAC1B,IAAI,CAAC;QACH,iEAAiE;QACjE,SAAS,GAAI,OAAO,CAAC,2BAA2B,CAAyB,CAAC,OAAO,CAAC;IACpF,CAAC;IAAC,MAAM,CAAC;QACP,oBAAoB;IACtB,CAAC;IAED,OAAO;QACL,KAAK;QACL,SAAS,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,SAAS,EAAE;QACvD,OAAO;KACR,CAAC;AACJ,CAAC,CAAC"}
@@ -1,6 +0,0 @@
1
- export declare const startSession: () => void;
2
- export declare const endSession: (status?: "exited") => void;
3
- export declare const markSessionErrored: () => void;
4
- export declare const markSessionCrashed: () => void;
5
- export declare const __resetSessionForTests: () => void;
6
- //# sourceMappingURL=session-tracker.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"session-tracker.d.ts","sourceRoot":"","sources":["../src/session-tracker.ts"],"names":[],"mappings":"AA0BA,eAAO,MAAM,YAAY,QAAO,IAS/B,CAAC;AAEF,eAAO,MAAM,UAAU,GAAI,SAAS,QAAQ,KAAG,IAG9C,CAAC;AAEF,eAAO,MAAM,kBAAkB,QAAO,IAErC,CAAC;AAEF,eAAO,MAAM,kBAAkB,QAAO,IAErC,CAAC;AAEF,eAAO,MAAM,sBAAsB,QAAO,IAEzC,CAAC"}
@@ -1,50 +0,0 @@
1
- /**
2
- * Phase 26 sub-B: RN session tracker glue.
3
- *
4
- * Mirrors the JS SDK's session-tracker but sends through the RN
5
- * transport. AppState binding lives in `handlers/lifecycle.ts`; this
6
- * file is just the singleton + the start/end/markErrored/markCrashed
7
- * surface.
8
- */
9
- import { SessionTracker } from '@goliapkg/sentori-core';
10
- import { getConfig } from './config';
11
- import { getUser } from './capture';
12
- import { sendSessionPing } from './transport';
13
- let _tracker = null;
14
- const tracker = () => {
15
- if (_tracker)
16
- return _tracker;
17
- _tracker = new SessionTracker((ping) => {
18
- const cfg = getConfig();
19
- if (!cfg)
20
- return;
21
- void sendSessionPing(cfg.ingestUrl, cfg.token, ping);
22
- });
23
- return _tracker;
24
- };
25
- export const startSession = () => {
26
- const cfg = getConfig();
27
- if (!cfg)
28
- return;
29
- const user = getUser();
30
- tracker().start({
31
- environment: cfg.environment,
32
- release: cfg.release,
33
- userId: user?.id ?? null,
34
- });
35
- };
36
- export const endSession = (status) => {
37
- if (!_tracker)
38
- return;
39
- _tracker.end(status);
40
- };
41
- export const markSessionErrored = () => {
42
- _tracker?.markErrored();
43
- };
44
- export const markSessionCrashed = () => {
45
- _tracker?.markCrashed();
46
- };
47
- export const __resetSessionForTests = () => {
48
- _tracker = null;
49
- };
50
- //# sourceMappingURL=session-tracker.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"session-tracker.js","sourceRoot":"","sources":["../src/session-tracker.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,IAAI,QAAQ,GAA0B,IAAI,CAAC;AAE3C,MAAM,OAAO,GAAG,GAAmB,EAAE;IACnC,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC9B,QAAQ,GAAG,IAAI,cAAc,CAAC,CAAC,IAAI,EAAE,EAAE;QACrC,MAAM,GAAG,GAAG,SAAS,EAAE,CAAC;QACxB,IAAI,CAAC,GAAG;YAAE,OAAO;QACjB,KAAK,eAAe,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IACH,OAAO,QAAQ,CAAC;AAClB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,GAAS,EAAE;IACrC,MAAM,GAAG,GAAG,SAAS,EAAE,CAAC;IACxB,IAAI,CAAC,GAAG;QAAE,OAAO;IACjB,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,OAAO,EAAE,CAAC,KAAK,CAAC;QACd,WAAW,EAAE,GAAG,CAAC,WAAW;QAC5B,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,MAAM,EAAE,IAAI,EAAE,EAAE,IAAI,IAAI;KACzB,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,MAAiB,EAAQ,EAAE;IACpD,IAAI,CAAC,QAAQ;QAAE,OAAO;IACtB,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AACvB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAS,EAAE;IAC3C,QAAQ,EAAE,WAAW,EAAE,CAAC;AAC1B,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAS,EAAE;IAC3C,QAAQ,EAAE,WAAW,EAAE,CAAC;AAC1B,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAG,GAAS,EAAE;IAC/C,QAAQ,GAAG,IAAI,CAAC;AAClB,CAAC,CAAC"}
package/lib/stack.d.ts DELETED
@@ -1,3 +0,0 @@
1
- import type { Frame } from './types';
2
- export declare const parseStack: (stack: string | undefined) => Frame[];
3
- //# sourceMappingURL=stack.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"stack.d.ts","sourceRoot":"","sources":["../src/stack.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAEpC,eAAO,MAAM,UAAU,GAAI,OAAO,MAAM,GAAG,SAAS,KAAG,KAAK,EACrC,CAAA"}
package/lib/stack.js DELETED
@@ -1,7 +0,0 @@
1
- // Phase 21: regex + parse loop moved to @goliapkg/sentori-core.
2
- // RN keeps the long path (no shortFilenames option) because Hermes
3
- // paths are already short and native symbolication needs the
4
- // absolute form.
5
- import { parseStack as parseStackCore } from '@goliapkg/sentori-core';
6
- export const parseStack = (stack) => parseStackCore(stack);
7
- //# sourceMappingURL=stack.js.map
package/lib/stack.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"stack.js","sourceRoot":"","sources":["../src/stack.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAChE,mEAAmE;AACnE,6DAA6D;AAC7D,iBAAiB;AACjB,OAAO,EAAE,UAAU,IAAI,cAAc,EAAE,MAAM,wBAAwB,CAAA;AAIrE,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,KAAyB,EAAW,EAAE,CAC/D,cAAc,CAAC,KAAK,CAAC,CAAA"}
@@ -1,33 +0,0 @@
1
- type StoreLike = {
2
- getState?: () => unknown;
3
- subscribe?: (cb: () => void) => () => void;
4
- };
5
- export type StateSnapshot = {
6
- /** Wall-clock when the diff fired. */
7
- ts: number;
8
- /** Top-level key/value diff vs the previous snapshot. Empty diff
9
- * doesn't get recorded. */
10
- diff: Record<string, unknown>;
11
- /** Source label so the viewer can show "Redux" / "Zustand" / "Manual". */
12
- source: string;
13
- };
14
- export declare function bindState(opts: {
15
- redux?: StoreLike;
16
- zustand?: StoreLike;
17
- /** Additional named stores. The label is used as the snapshot's
18
- * `source` and as the diff bucket key. */
19
- custom?: Record<string, StoreLike>;
20
- }): void;
21
- export declare function unbindState(): void;
22
- /** Manual recording for state not in a subscribed store. */
23
- export declare function recordState(snapshot: Record<string, unknown>, source?: string): void;
24
- export declare function getStateSnapshots(): StateSnapshot[];
25
- export declare function clearStateSnapshots(): void;
26
- /** Returns the top-level key/value diff (next has the value, prev
27
- * may not contain the key). Empty diff returns `{}` so callers can
28
- * no-op on empty. */
29
- export declare function shallowDiff(prev: unknown, next: unknown): null | Record<string, unknown>;
30
- /** Test-only. */
31
- export declare function __resetStateSnapshotsForTests(): void;
32
- export {};
33
- //# sourceMappingURL=state-snapshots.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"state-snapshots.d.ts","sourceRoot":"","sources":["../src/state-snapshots.ts"],"names":[],"mappings":"AAwBA,KAAK,SAAS,GAAG;IACf,QAAQ,CAAC,EAAE,MAAM,OAAO,CAAC;IACzB,SAAS,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,IAAI,KAAK,MAAM,IAAI,CAAC;CAC5C,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,sCAAsC;IACtC,EAAE,EAAE,MAAM,CAAC;IACX;gCAC4B;IAC5B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,0EAA0E;IAC1E,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAMF,wBAAgB,SAAS,CAAC,IAAI,EAAE;IAC9B,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB;+CAC2C;IAC3C,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;CACpC,GAAG,IAAI,CASP;AAsBD,wBAAgB,WAAW,IAAI,IAAI,CAUlC;AAED,4DAA4D;AAC5D,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,SAAW,GAAG,IAAI,CAEtF;AAED,wBAAgB,iBAAiB,IAAI,aAAa,EAAE,CAEnD;AAED,wBAAgB,mBAAmB,IAAI,IAAI,CAE1C;AAOD;;sBAEsB;AACtB,wBAAgB,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAaxF;AAED,iBAAiB;AACjB,wBAAgB,6BAA6B,IAAI,IAAI,CAGpD"}
@@ -1,109 +0,0 @@
1
- // v0.9.2 +S2 — State Time-travel (SDK side).
2
- //
3
- // `sentori.bindState({ redux, zustand })` subscribes to a store-like
4
- // object and records a shallow diff every time it emits a change.
5
- // A ring buffer of the last N snapshots travels with each
6
- // captureException as a `stateSnapshot` attachment — the dashboard's
7
- // time-travel viewer (v0.9.2.1) renders the timeline.
8
- //
9
- // Why diffs and not full snapshots:
10
- // • prod stores can be huge (carts, paginated lists, etc.)
11
- // • a diff drops to ~1% of full snapshot size in typical apps
12
- // • the viewer rehydrates by applying diffs forward from a baseline
13
- //
14
- // `recordState(obj)` is the manual escape hatch for state that isn't
15
- // in a redux/zustand store (e.g. `useState` in a deeply-nested
16
- // component, or React Context). The host calls it where it makes sense.
17
- //
18
- // Privacy: the same mask query that protects screenshots is consulted
19
- // before serializing — any path matching `nativeID` shape isn't yet,
20
- // but `mask.matchPath` can be added later. v0.9.2 ships without
21
- // path masking; consumers should keep PII out of bindState scopes.
22
- const MAX_SNAPSHOTS = 50;
23
- let _snapshots = [];
24
- let _unsubscribers = [];
25
- let _lastByLabel = {};
26
- export function bindState(opts) {
27
- unbindState();
28
- bindOne('redux', opts.redux);
29
- bindOne('zustand', opts.zustand);
30
- if (opts.custom) {
31
- for (const [label, store] of Object.entries(opts.custom)) {
32
- bindOne(label, store);
33
- }
34
- }
35
- }
36
- function bindOne(label, store) {
37
- if (!store)
38
- return;
39
- if (typeof store.getState !== 'function' || typeof store.subscribe !== 'function')
40
- return;
41
- try {
42
- _lastByLabel[label] = store.getState();
43
- const unsub = store.subscribe(() => {
44
- const next = store.getState();
45
- const prev = _lastByLabel[label];
46
- const diff = shallowDiff(prev, next);
47
- if (diff && Object.keys(diff).length > 0) {
48
- push({ diff, source: label, ts: Date.now() });
49
- }
50
- _lastByLabel[label] = next;
51
- });
52
- _unsubscribers.push(unsub);
53
- }
54
- catch {
55
- // ignore bad stores
56
- }
57
- }
58
- export function unbindState() {
59
- for (const u of _unsubscribers) {
60
- try {
61
- u();
62
- }
63
- catch {
64
- // ignore
65
- }
66
- }
67
- _unsubscribers = [];
68
- _lastByLabel = {};
69
- }
70
- /** Manual recording for state not in a subscribed store. */
71
- export function recordState(snapshot, source = 'manual') {
72
- push({ diff: snapshot, source, ts: Date.now() });
73
- }
74
- export function getStateSnapshots() {
75
- return _snapshots.slice();
76
- }
77
- export function clearStateSnapshots() {
78
- _snapshots = [];
79
- }
80
- function push(s) {
81
- _snapshots.push(s);
82
- while (_snapshots.length > MAX_SNAPSHOTS)
83
- _snapshots.shift();
84
- }
85
- /** Returns the top-level key/value diff (next has the value, prev
86
- * may not contain the key). Empty diff returns `{}` so callers can
87
- * no-op on empty. */
88
- export function shallowDiff(prev, next) {
89
- if (typeof next !== 'object' || next === null)
90
- return null;
91
- const nObj = next;
92
- if (typeof prev !== 'object' || prev === null) {
93
- return { ...nObj };
94
- }
95
- const pObj = prev;
96
- const out = {};
97
- const keys = new Set([...Object.keys(pObj), ...Object.keys(nObj)]);
98
- for (const k of keys) {
99
- if (pObj[k] !== nObj[k])
100
- out[k] = nObj[k];
101
- }
102
- return out;
103
- }
104
- /** Test-only. */
105
- export function __resetStateSnapshotsForTests() {
106
- unbindState();
107
- _snapshots = [];
108
- }
109
- //# sourceMappingURL=state-snapshots.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"state-snapshots.js","sourceRoot":"","sources":["../src/state-snapshots.ts"],"names":[],"mappings":"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"}
package/lib/track.d.ts DELETED
@@ -1,34 +0,0 @@
1
- export type TrackProps = Record<string, unknown>;
2
- export type TrackEvent = {
3
- environment?: string;
4
- name: string;
5
- props?: TrackProps;
6
- release?: string;
7
- route?: string;
8
- sessionId?: string;
9
- ts: string;
10
- userId?: string;
11
- };
12
- /**
13
- * Record a typed analytics event. Cheap to call from render hooks —
14
- * pushes into a 500-slot ring drained every 30 s (or on overflow) by
15
- * the transport flusher.
16
- *
17
- * Reserved names start with `$` (e.g. `$pageview`) and are emitted by
18
- * the SDK itself; you can still call `track('$pageview', …)` from app
19
- * code to backfill routes the auto-instrumentation missed.
20
- *
21
- * Server caps: name ≤ 200 chars, ≤ 40 prop keys. Calls exceeding the
22
- * cap are dropped client-side (no throw) so app code can fire-and-
23
- * forget without try/catch.
24
- */
25
- export declare function track(name: string, props?: TrackProps, route?: string): void;
26
- export declare function flushTrack(): Promise<void>;
27
- /**
28
- * Start the 30 s flush timer. Called once from `init()`. Idempotent.
29
- * `__resetTrackForTests` is exposed for vitest / bun:test teardown.
30
- */
31
- export declare function startTrackTimer(): void;
32
- export declare function __peekTrackBuffer(): readonly TrackEvent[];
33
- export declare function __resetTrackForTests(): void;
34
- //# sourceMappingURL=track.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"track.d.ts","sourceRoot":"","sources":["../src/track.ts"],"names":[],"mappings":"AAwBA,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEjD,MAAM,MAAM,UAAU,GAAG;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAUF;;;;;;;;;;;;GAYG;AACH,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CA8B5E;AAED,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAOhD;AAED;;;GAGG;AACH,wBAAgB,eAAe,IAAI,IAAI,CAOtC;AAED,wBAAgB,iBAAiB,IAAI,SAAS,UAAU,EAAE,CAEzD;AAED,wBAAgB,oBAAoB,IAAI,IAAI,CAM3C"}
package/lib/track.js DELETED
@@ -1,107 +0,0 @@
1
- // v1.1 chunk B — analytics `track` events on the SDK side.
2
- //
3
- // `sentori.track(name, props?)` pushes a single typed analytics event
4
- // into a fixed-size ring. A timer flushes the ring every 30 s (or
5
- // when the buffer hits 500) to `POST /v1/track:batch`. Best-effort;
6
- // a flush failure drops the batch — analytics aren't critical
7
- // telemetry.
8
- //
9
- // Why not one fetch per event: a busy app emitting `$pageview` +
10
- // custom funnel events every nav would saturate the JS thread and
11
- // the host's outbound connection pool. The same batching shape the
12
- // metrics module uses keeps `track()` cheap to call from render
13
- // hooks.
14
- //
15
- // Auto-pageview (`$pageview`) is emitted from `useTraceNavigation`
16
- // in navigation.ts whenever react-navigation swaps the active route.
17
- // Hosts that don't use react-navigation can call
18
- // `sentori.track('$pageview', { route: 'Cart' })` themselves.
19
- import { addInternalBreadcrumb } from './breadcrumbs';
20
- import { getCurrentUserId } from './capture';
21
- import { getConfig, isInitialized } from './config';
22
- import { sendTrackBatch } from './transport';
23
- const MAX_BUFFER = 500;
24
- const NAME_MAX = 200;
25
- const PROPS_KEYS_MAX = 40;
26
- const FLUSH_INTERVAL_MS = 30_000;
27
- let _buf = [];
28
- let _timer = null;
29
- /**
30
- * Record a typed analytics event. Cheap to call from render hooks —
31
- * pushes into a 500-slot ring drained every 30 s (or on overflow) by
32
- * the transport flusher.
33
- *
34
- * Reserved names start with `$` (e.g. `$pageview`) and are emitted by
35
- * the SDK itself; you can still call `track('$pageview', …)` from app
36
- * code to backfill routes the auto-instrumentation missed.
37
- *
38
- * Server caps: name ≤ 200 chars, ≤ 40 prop keys. Calls exceeding the
39
- * cap are dropped client-side (no throw) so app code can fire-and-
40
- * forget without try/catch.
41
- */
42
- export function track(name, props, route) {
43
- if (!isInitialized())
44
- return;
45
- if (typeof name !== 'string' || name.length === 0 || name.length > NAME_MAX) {
46
- return;
47
- }
48
- if (props && Object.keys(props).length > PROPS_KEYS_MAX) {
49
- return;
50
- }
51
- const config = getConfig();
52
- const ev = {
53
- name,
54
- props,
55
- release: config?.release,
56
- environment: config?.environment,
57
- route,
58
- ts: new Date().toISOString(),
59
- userId: getCurrentUserId(),
60
- };
61
- _buf.push(ev);
62
- // v2.0 W3 — auto-breadcrumb. When `init.capture.trackAutoBreadcrumb`
63
- // is `true`, push a `{ type: 'track', data: { name, props } }`
64
- // breadcrumb so the customer journey leading up to a later
65
- // `captureException` / `captureMessage` is visible in the dashboard.
66
- // Defaults off — see Config.trackAutoBreadcrumb docstring.
67
- if (config?.trackAutoBreadcrumb === true) {
68
- addInternalBreadcrumb('track', props ? { name, props } : { name });
69
- }
70
- if (_buf.length >= MAX_BUFFER) {
71
- void flushTrack();
72
- }
73
- }
74
- export async function flushTrack() {
75
- if (_buf.length === 0)
76
- return;
77
- const config = getConfig();
78
- if (!config)
79
- return;
80
- const batch = _buf;
81
- _buf = [];
82
- await sendTrackBatch(config.ingestUrl, config.token, batch);
83
- }
84
- /**
85
- * Start the 30 s flush timer. Called once from `init()`. Idempotent.
86
- * `__resetTrackForTests` is exposed for vitest / bun:test teardown.
87
- */
88
- export function startTrackTimer() {
89
- if (_timer !== null)
90
- return;
91
- _timer = setInterval(() => {
92
- void flushTrack();
93
- }, FLUSH_INTERVAL_MS);
94
- // Don't keep the process alive solely for this timer.
95
- _timer.unref?.();
96
- }
97
- export function __peekTrackBuffer() {
98
- return _buf;
99
- }
100
- export function __resetTrackForTests() {
101
- if (_timer !== null) {
102
- clearInterval(_timer);
103
- _timer = null;
104
- }
105
- _buf = [];
106
- }
107
- //# sourceMappingURL=track.js.map
package/lib/track.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"track.js","sourceRoot":"","sources":["../src/track.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,EAAE;AACF,sEAAsE;AACtE,kEAAkE;AAClE,oEAAoE;AACpE,8DAA8D;AAC9D,aAAa;AACb,EAAE;AACF,iEAAiE;AACjE,kEAAkE;AAClE,mEAAmE;AACnE,gEAAgE;AAChE,SAAS;AACT,EAAE;AACF,mEAAmE;AACnE,qEAAqE;AACrE,iDAAiD;AACjD,8DAA8D;AAE9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAe7C,MAAM,UAAU,GAAG,GAAG,CAAC;AACvB,MAAM,QAAQ,GAAG,GAAG,CAAC;AACrB,MAAM,cAAc,GAAG,EAAE,CAAC;AAC1B,MAAM,iBAAiB,GAAG,MAAM,CAAC;AAEjC,IAAI,IAAI,GAAiB,EAAE,CAAC;AAC5B,IAAI,MAAM,GAA0C,IAAI,CAAC;AAEzD;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,KAAK,CAAC,IAAY,EAAE,KAAkB,EAAE,KAAc;IACpE,IAAI,CAAC,aAAa,EAAE;QAAE,OAAO;IAC7B,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,QAAQ,EAAE,CAAC;QAC5E,OAAO;IACT,CAAC;IACD,IAAI,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,cAAc,EAAE,CAAC;QACxD,OAAO;IACT,CAAC;IACD,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,EAAE,GAAe;QACrB,IAAI;QACJ,KAAK;QACL,OAAO,EAAE,MAAM,EAAE,OAAO;QACxB,WAAW,EAAE,MAAM,EAAE,WAAW;QAChC,KAAK;QACL,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QAC5B,MAAM,EAAE,gBAAgB,EAAE;KAC3B,CAAC;IACF,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACd,qEAAqE;IACrE,+DAA+D;IAC/D,2DAA2D;IAC3D,qEAAqE;IACrE,2DAA2D;IAC3D,IAAI,MAAM,EAAE,mBAAmB,KAAK,IAAI,EAAE,CAAC;QACzC,qBAAqB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;IACrE,CAAC;IACD,IAAI,IAAI,CAAC,MAAM,IAAI,UAAU,EAAE,CAAC;QAC9B,KAAK,UAAU,EAAE,CAAC;IACpB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAC9B,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,IAAI,CAAC,MAAM;QAAE,OAAO;IACpB,MAAM,KAAK,GAAG,IAAI,CAAC;IACnB,IAAI,GAAG,EAAE,CAAC;IACV,MAAM,cAAc,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AAC9D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe;IAC7B,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO;IAC5B,MAAM,GAAG,WAAW,CAAC,GAAG,EAAE;QACxB,KAAK,UAAU,EAAE,CAAC;IACpB,CAAC,EAAE,iBAAiB,CAAC,CAAC;IACtB,sDAAsD;IACrD,MAA4C,CAAC,KAAK,EAAE,EAAE,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,oBAAoB;IAClC,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,aAAa,CAAC,MAAM,CAAC,CAAC;QACtB,MAAM,GAAG,IAAI,CAAC;IAChB,CAAC;IACD,IAAI,GAAG,EAAE,CAAC;AACZ,CAAC"}
package/lib/trail.d.ts DELETED
@@ -1,12 +0,0 @@
1
- import { TrailBuffer, type TrailStep } from '@goliapkg/sentori-core';
2
- /**
3
- * Phase 46 — record a step into the session-trail buffer. The buffer
4
- * is a fixed-size FIFO (default 30 steps); pushing past capacity
5
- * drops the oldest entry. Steps are only uploaded if
6
- * `init({ capture: { sessionTrail: true } })` is on AND a
7
- * `captureException` follows.
8
- */
9
- export declare const captureStep: (label: string, opts?: Partial<TrailStep>) => void;
10
- export declare const getTrailBuffer: () => TrailBuffer;
11
- export declare const __resetTrailForTests: () => void;
12
- //# sourceMappingURL=trail.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"trail.d.ts","sourceRoot":"","sources":["../src/trail.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,WAAW,EAAE,KAAK,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAIrE;;;;;;GAMG;AACH,eAAO,MAAM,WAAW,GAAI,OAAO,MAAM,EAAE,OAAO,OAAO,CAAC,SAAS,CAAC,KAAG,IAMtE,CAAC;AAEF,eAAO,MAAM,cAAc,QAAO,WAAqB,CAAC;AAExD,eAAO,MAAM,oBAAoB,QAAO,IAEvC,CAAC"}