@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,332 +0,0 @@
1
- /**
2
- * v2.3 W6.3 — Sentry-compatible API surface.
3
- *
4
- * Drop-in for code (or LLM-generated code) written against
5
- * `@sentry/react-native`. Every Sentry call maps to exactly one
6
- * Sentori-native call internally. Translation differences (e.g.
7
- * `Sentry.setUser({ ip_address })` — Sentori never stores IP) fire
8
- * a one-shot console hint at `info` level, deduplicated per
9
- * (api, dropped_field).
10
- *
11
- * Why this exists: LLMs have seen a LOT of Sentry code; letting
12
- * them write the same syntax against Sentori is one less thing
13
- * Sentori asks the host to think about. Combined with the v2.3
14
- * "free bonus" stance — host adds Sentori without unlearning
15
- * anything.
16
- *
17
- * Usage:
18
- *
19
- * import * as Sentry from '@goliapkg/sentori-react-native/compat'
20
- *
21
- * Sentry.init({ dsn: 'https://<token>@<host>/<projectId>', ... })
22
- * Sentry.captureException(err)
23
- * Sentry.setUser({ id, email }) // email → linkBy.email (hashed)
24
- *
25
- * The compat layer holds NO state of its own — it's a thin shim
26
- * over the same Sentori internals. Mixing `Sentry.*` and
27
- * `sentori.*` calls in the same app works fine.
28
- *
29
- * See `docs/design/sdk-v2.3-redesign.md` §4 for the full
30
- * translation table + design rationale.
31
- */
32
- import { logger } from '@goliapkg/sentori-core';
33
- import { addBreadcrumb as nativeAddBreadcrumb } from '../breadcrumbs';
34
- import { captureException as nativeCaptureException, captureMessage as nativeCaptureMessage, setTag as nativeSetTag, setTags as nativeSetTags, setUser as nativeSetUser, } from '../capture';
35
- import { init as nativeInit } from '../init';
36
- // ── one-shot warn dedup ───────────────────────────────────────────────────
37
- const _warnedOnce = new Set();
38
- function warnOnce(key, msg) {
39
- if (_warnedOnce.has(key))
40
- return;
41
- _warnedOnce.add(key);
42
- logger.info('compat', msg);
43
- }
44
- /** Exported for tests only — direct callers should use `Sentry.init`,
45
- * which threads the parsed DSN through the rest of the init machinery. */
46
- export const __parseDsnForTests = parseDsn;
47
- function parseDsn(dsn) {
48
- // Sentry DSN shape: `https://<key>@<host>[:port][/<projectId>]`
49
- // Sentori cares about `<key>` (must be `st_pk_…`) and `<host>`.
50
- let url;
51
- try {
52
- url = new URL(dsn);
53
- }
54
- catch {
55
- throw new Error(`Sentory compat: dsn is not a valid URL: ${dsn}`);
56
- }
57
- const key = url.username;
58
- if (!key) {
59
- throw new Error(`Sentory compat: dsn missing token in user-info component`);
60
- }
61
- if (!key.startsWith('st_pk_')) {
62
- throw new Error(`Sentory compat: dsn token must start with 'st_pk_' (got prefix '${key.slice(0, 8)}…'). ` +
63
- `Sentori does not parse Sentry-issued tokens — generate a Sentori project token via the dashboard.`);
64
- }
65
- // strip user-info to reconstruct the ingest origin
66
- const ingestUrl = `${url.protocol}//${url.host}`;
67
- return { token: key, ingestUrl };
68
- }
69
- // ── Sentry.init ───────────────────────────────────────────────────────────
70
- export function init(opts) {
71
- const { token, ingestUrl } = parseDsn(opts.dsn);
72
- const sentoriOpts = {
73
- token,
74
- release: opts.release ?? '',
75
- ingestUrl,
76
- ...(opts.environment ? { environment: opts.environment } : {}),
77
- sample: {
78
- ...(opts.tracesSampleRate !== undefined ? { traces: opts.tracesSampleRate } : {}),
79
- ...(opts.sampleRate !== undefined ? { errors: opts.sampleRate } : {}),
80
- },
81
- ...(opts.debug ? { logLevel: 'debug' } : {}),
82
- };
83
- // Empty release is the most common Sentry-init mistake; warn but
84
- // continue.
85
- if (!sentoriOpts.release) {
86
- warnOnce('init:no-release', 'Sentry.init() with no `release` — Sentori requires release for grouping + drop-down menus to make sense. Set `release: "myapp@1.2.3"` for production cuts.');
87
- // Sentori's init throws when release is empty; provide a
88
- // reasonable fallback so the rest of the code path works in dev.
89
- sentoriOpts.release = `unspecified@${Date.now()}`;
90
- }
91
- // Pass-through informational hints for ignored fields.
92
- for (const ignored of [
93
- 'attachStacktrace',
94
- 'autoSessionTracking',
95
- 'integrations',
96
- 'beforeSend',
97
- 'beforeBreadcrumb',
98
- 'maxBreadcrumbs',
99
- ]) {
100
- if (ignored in opts) {
101
- warnOnce(`init:ignored:${ignored}`, `Sentry.init({ ${ignored} }) ignored. ` +
102
- `${getIgnoredHint(ignored)}`);
103
- }
104
- }
105
- nativeInit(sentoriOpts);
106
- }
107
- function getIgnoredHint(field) {
108
- switch (field) {
109
- case 'attachStacktrace':
110
- return 'Sentori always sends stack traces — no toggle.';
111
- case 'autoSessionTracking':
112
- return "Sentori sessions are on by default; toggle via `init({ capture: { sessions: true|false } })`.";
113
- case 'integrations':
114
- return 'Sentori uses `init({ capture: {...} })` toggles instead of Integration classes — see the docs.';
115
- case 'beforeSend':
116
- case 'beforeBreadcrumb':
117
- return 'Sentori does not support an arbitrary beforeSend hook today. Server-side PII scrubbing is automatic.';
118
- case 'maxBreadcrumbs':
119
- return 'Sentori uses a fixed 100-slot ring buffer.';
120
- default:
121
- return '';
122
- }
123
- }
124
- // ── Severity / level enum ─────────────────────────────────────────────────
125
- /** Sentry's severity values, surfaced as strings (Sentori only
126
- * uses 5 levels). `Log` and `Critical` collapse to `'info'` and
127
- * `'fatal'` respectively. */
128
- export const Severity = {
129
- Fatal: 'fatal',
130
- Critical: 'fatal',
131
- Error: 'error',
132
- Warning: 'warning',
133
- Log: 'info',
134
- Info: 'info',
135
- Debug: 'debug',
136
- };
137
- function mapLevel(level) {
138
- if (!level)
139
- return undefined;
140
- switch (level) {
141
- case 'critical':
142
- warnOnce('severity:critical', "Sentry.Severity.Critical → mapped to 'fatal' (Sentori's 5-level syslog-style scale).");
143
- return 'fatal';
144
- case 'log':
145
- warnOnce('severity:log', "Sentry.Severity.Log → mapped to 'info' (Sentori's 5-level scale has no separate Log).");
146
- return 'info';
147
- default:
148
- return level;
149
- }
150
- }
151
- export function captureException(err, hint) {
152
- // Sentry v8+ takes the context inline (Hint); earlier versions
153
- // wrapped it in `{ captureContext: {...} }`. Accept both.
154
- const ctx = (() => {
155
- if (!hint)
156
- return undefined;
157
- if ('captureContext' in hint) {
158
- return hint.captureContext;
159
- }
160
- return hint;
161
- })();
162
- if (ctx?.extra) {
163
- warnOnce('captureException:extra', 'Sentry.captureException(err, { extra }) → `extra` mapped to `tags` (Sentori does not have a separate extra namespace).');
164
- }
165
- if (ctx?.user) {
166
- // Apply the per-call user via setUser (Sentori takes the
167
- // current scope user automatically).
168
- setUser(ctx.user);
169
- }
170
- const mergedTags = {
171
- ...(ctx?.tags ?? {}),
172
- ...(ctx?.extra
173
- ? Object.fromEntries(Object.entries(ctx.extra).map(([k, v]) => [k, String(v)]))
174
- : {}),
175
- };
176
- nativeCaptureException(err, {
177
- ...(Object.keys(mergedTags).length > 0 ? { tags: mergedTags } : {}),
178
- ...(ctx?.fingerprint ? { fingerprint: ctx.fingerprint } : {}),
179
- });
180
- }
181
- // ── captureMessage ────────────────────────────────────────────────────────
182
- export function captureMessage(msg, levelOrCtx) {
183
- let level;
184
- let tags;
185
- if (typeof levelOrCtx === 'string') {
186
- level = mapLevel(levelOrCtx);
187
- }
188
- else if (levelOrCtx) {
189
- level = mapLevel(levelOrCtx.level);
190
- tags = levelOrCtx.tags;
191
- }
192
- nativeCaptureMessage(msg, {
193
- ...(level ? { level } : {}),
194
- ...(tags ? { tags } : {}),
195
- });
196
- }
197
- export function setUser(user) {
198
- if (user == null) {
199
- nativeSetUser(null);
200
- return;
201
- }
202
- const { id, email, username, ip_address, segment, ...rest } = user;
203
- if (ip_address !== undefined) {
204
- warnOnce('setUser:ip_address', 'Sentry.setUser({ ip_address }) → dropped. Sentori never stores IP (privacy by design).');
205
- }
206
- if (segment !== undefined) {
207
- warnOnce('setUser:segment', 'Sentry.setUser({ segment }) → mapped to tag `user.segment`. Set via setTag for clarity.');
208
- if (typeof segment === 'string')
209
- nativeSetTag('user.segment', segment);
210
- }
211
- const linkBy = {};
212
- if (email)
213
- linkBy.email = email;
214
- if (username)
215
- linkBy.username = username;
216
- // Surface any other fields the host bolted on (Sentry historically
217
- // accepted arbitrary keys) — they pass through as tags.
218
- for (const [k, v] of Object.entries(rest)) {
219
- if (v !== undefined && v !== null)
220
- nativeSetTag(`user.${k}`, String(v));
221
- }
222
- nativeSetUser({
223
- ...(id ? { id } : {}),
224
- ...(Object.keys(linkBy).length > 0 ? { linkBy } : {}),
225
- });
226
- }
227
- // ── setTag / setTags ──────────────────────────────────────────────────────
228
- // Re-export Sentori-native semantics; identical signatures.
229
- export const setTag = nativeSetTag;
230
- export const setTags = nativeSetTags;
231
- /** Exported for tests only. */
232
- export const __mapCategoryToTypeForTests = mapCategoryToType;
233
- export const __mapLevelForTests = mapLevel;
234
- function mapCategoryToType(category) {
235
- if (!category)
236
- return undefined;
237
- if (['auth', 'click', 'gesture', 'input', 'touch', 'ui'].includes(category))
238
- return 'user';
239
- if (['fetch', 'http', 'xhr'].includes(category))
240
- return 'net';
241
- if (['nav', 'navigation', 'route'].includes(category))
242
- return 'nav';
243
- if (['console', 'log', 'sentry'].includes(category))
244
- return 'log';
245
- return 'custom';
246
- }
247
- function mapSentryType(t) {
248
- if (!t)
249
- return undefined;
250
- switch (t) {
251
- case 'http':
252
- return 'net';
253
- case 'navigation':
254
- return 'nav';
255
- case 'user':
256
- case 'log':
257
- case 'custom':
258
- return t;
259
- default:
260
- return 'custom';
261
- }
262
- }
263
- export function addBreadcrumb(crumb) {
264
- if (!crumb.message) {
265
- crumb.message = crumb.category ?? crumb.type ?? '(no message)';
266
- }
267
- if (crumb.category && !crumb.type) {
268
- warnOnce('breadcrumb:category', 'Sentry.addBreadcrumb({ category }) → mapped to `type` via well-known table; the category string itself is preserved under `data.category`.');
269
- }
270
- // RN SDK shape: { type, data }. No top-level `message` —
271
- // Sentry's message goes into data.message.
272
- nativeAddBreadcrumb({
273
- type: mapSentryType(crumb.type) ?? mapCategoryToType(crumb.category) ?? 'custom',
274
- data: {
275
- message: crumb.message,
276
- ...(crumb.data ?? {}),
277
- ...(crumb.category ? { category: crumb.category } : {}),
278
- ...(crumb.level ? { level: mapLevel(crumb.level) } : {}),
279
- },
280
- });
281
- }
282
- // ── flush / close ─────────────────────────────────────────────────────────
283
- // Re-export Sentori native flush + close — same signatures.
284
- export { close, flush } from '../lifecycle';
285
- // ── startTransaction / startSpan / withScope ──────────────────────────────
286
- // Trace mapping is non-trivial (Sentry's transaction object exposes
287
- // startChild, etc.). v2.3 ships a minimum-viable Sentry trace
288
- // surface that supports startTransaction returning a Sentori Span
289
- // object with a partial Sentry-style API (.startChild, .finish).
290
- // Anything beyond that throws a clear error directing to the native
291
- // `sentori.startSpan` / `sentori.withScopedSpan`.
292
- import { startSpan } from '@goliapkg/sentori-core';
293
- export function startTransaction(opts) {
294
- warnOnce('startTransaction', 'Sentry.startTransaction() → mapped to sentori.startSpan() with op as name. Native equivalent: sentori.startTrace(name) or sentori.startSpan({ name }).');
295
- const name = opts.name ?? opts.op ?? 'transaction';
296
- const span = startSpan(name, {
297
- parent: null,
298
- tags: opts.tags,
299
- });
300
- return {
301
- finish: (status) => span.finish({ status: status === 'ok' ? 'ok' : 'error' }),
302
- setStatus: (status) => { span.setTag('status', status); },
303
- setTag: (k, v) => { span.setTag(k, v); },
304
- startChild: (childOpts) => {
305
- return startSpan(childOpts.name ?? childOpts.op ?? 'child', {
306
- tags: childOpts.tags,
307
- });
308
- },
309
- };
310
- }
311
- function scopeProxy() {
312
- return {
313
- setTag: nativeSetTag,
314
- setTags: nativeSetTags,
315
- setUser,
316
- setExtra: (k, v) => nativeSetTag(`extra.${k}`, String(v)),
317
- setLevel: () => {
318
- warnOnce('scope:setLevel', 'Sentry.withScope(s => s.setLevel(…)) → not supported. Sentori levels travel on capture call, not on scope.');
319
- },
320
- };
321
- }
322
- export function withScope(fn) {
323
- // Sentori has no Hub; tags set inside `fn` persist (best-effort
324
- // approximation of Sentry semantics). For most callers this is
325
- // fine; tighter isolation needs an actual Hub which we don't ship.
326
- warnOnce('withScope', 'Sentry.withScope() → tag mutations are NOT auto-reverted on scope exit. Use sentori.setTag/clearTags explicitly for tight isolation.');
327
- return fn(scopeProxy());
328
- }
329
- export function configureScope(fn) {
330
- fn(scopeProxy());
331
- }
332
- //# sourceMappingURL=sentry.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sentry.js","sourceRoot":"","sources":["../../src/compat/sentry.ts"],"names":[],"mappings":"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"}
@@ -1,6 +0,0 @@
1
- export declare function isLiveMode(): boolean;
2
- export declare function startControlChannel(): void;
3
- export declare function stopControlChannel(): void;
4
- /** Test-only. */
5
- export declare function __resetControlChannelForTests(): void;
6
- //# sourceMappingURL=control-channel.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"control-channel.d.ts","sourceRoot":"","sources":["../src/control-channel.ts"],"names":[],"mappings":"AAiCA,wBAAgB,UAAU,IAAI,OAAO,CAQpC;AAED,wBAAgB,mBAAmB,IAAI,IAAI,CAS1C;AAED,wBAAgB,kBAAkB,IAAI,IAAI,CAOzC;AAiCD,iBAAiB;AACjB,wBAAgB,6BAA6B,IAAI,IAAI,CAEpD"}
@@ -1,96 +0,0 @@
1
- // v1.1 +S7 升级 — SDK control channel for sub-second live debug.
2
- //
3
- // Every 30 s the SDK polls `/v1/control/poll?userId=<current>` and
4
- // reads back `{ liveMode: boolean, ttlMs: number }`. While live mode
5
- // is on, the transport flushes events immediately (BATCH_SIZE = 1,
6
- // FLUSH_INTERVAL = 0) so dashboard's live-debug viewer sees each
7
- // event with sub-second latency instead of waiting for the 5 s
8
- // batch tick.
9
- //
10
- // When live mode goes off the SDK reverts to its normal batching —
11
- // no permanent overhead, no state to clean up.
12
- //
13
- // Implementation note: the control channel is purely advisory.
14
- // transport.ts reads `isLiveMode()` before each enqueue and decides
15
- // whether to wait for batch or flush right now.
16
- import { getConfig } from './config';
17
- import { getCurrentUserId } from './capture';
18
- const POLL_INTERVAL_MS = 30_000;
19
- /** Cap on the live-mode window even if the server reports a longer
20
- * TTL. Defense-in-depth: an unbounded `ttlMs` (server bug, clock
21
- * skew, malicious server) would otherwise pin the SDK into flush-
22
- * every-event mode indefinitely, which is expensive on slow
23
- * networks. 15 min matches the dashboard's default arm length so
24
- * normal operation stays uncapped. */
25
- const MAX_LIVE_MODE_TTL_MS = 15 * 60_000;
26
- let _liveMode = false;
27
- let _liveModeUntil = 0;
28
- let _timer = null;
29
- export function isLiveMode() {
30
- if (!_liveMode)
31
- return false;
32
- // Self-expire if the server-side TTL has passed without a refresh.
33
- if (Date.now() > _liveModeUntil) {
34
- _liveMode = false;
35
- return false;
36
- }
37
- return true;
38
- }
39
- export function startControlChannel() {
40
- if (_timer !== null)
41
- return;
42
- // Fire one poll right away so init → setUser → quick captureException
43
- // can already pick up an existing live-debug session.
44
- void pollOnce();
45
- _timer = setInterval(() => {
46
- void pollOnce();
47
- }, POLL_INTERVAL_MS);
48
- _timer.unref?.();
49
- }
50
- export function stopControlChannel() {
51
- if (_timer !== null) {
52
- clearInterval(_timer);
53
- _timer = null;
54
- }
55
- _liveMode = false;
56
- _liveModeUntil = 0;
57
- }
58
- async function pollOnce() {
59
- const config = getConfig();
60
- if (!config)
61
- return;
62
- const userId = getCurrentUserId();
63
- if (!userId) {
64
- // Without setUser we have no key. Live mode is per-user-id.
65
- _liveMode = false;
66
- _liveModeUntil = 0;
67
- return;
68
- }
69
- try {
70
- const url = `${config.ingestUrl}/v1/control/poll?userId=${encodeURIComponent(userId)}`;
71
- const resp = await fetch(url, {
72
- headers: { Authorization: `Bearer ${config.token}` },
73
- method: 'GET',
74
- });
75
- if (!resp.ok)
76
- return;
77
- const body = (await resp.json());
78
- if (body.liveMode === true) {
79
- _liveMode = true;
80
- _liveModeUntil = Date.now() + Math.max(0, Math.min(body.ttlMs ?? 0, MAX_LIVE_MODE_TTL_MS));
81
- }
82
- else {
83
- _liveMode = false;
84
- _liveModeUntil = 0;
85
- }
86
- }
87
- catch {
88
- // Network failure → leave the previous state. Self-expiring TTL
89
- // handles "didn't reach server" gracefully.
90
- }
91
- }
92
- /** Test-only. */
93
- export function __resetControlChannelForTests() {
94
- stopControlChannel();
95
- }
96
- //# sourceMappingURL=control-channel.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"control-channel.js","sourceRoot":"","sources":["../src/control-channel.ts"],"names":[],"mappings":"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"}