@goliapkg/sentori-react-native 1.0.0-rc.9 → 1.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 (74) hide show
  1. package/bin/sentori-rn-upload-source-bundle.cjs +193 -0
  2. package/lib/capture.d.ts +34 -0
  3. package/lib/capture.d.ts.map +1 -1
  4. package/lib/capture.js +96 -2
  5. package/lib/capture.js.map +1 -1
  6. package/lib/config.d.ts +3 -0
  7. package/lib/config.d.ts.map +1 -1
  8. package/lib/config.js.map +1 -1
  9. package/lib/heartbeat.d.ts +9 -0
  10. package/lib/heartbeat.d.ts.map +1 -0
  11. package/lib/heartbeat.js +140 -0
  12. package/lib/heartbeat.js.map +1 -0
  13. package/lib/index.d.ts +30 -3
  14. package/lib/index.d.ts.map +1 -1
  15. package/lib/index.js +30 -4
  16. package/lib/index.js.map +1 -1
  17. package/lib/init.d.ts +9 -0
  18. package/lib/init.d.ts.map +1 -1
  19. package/lib/init.js +19 -0
  20. package/lib/init.js.map +1 -1
  21. package/lib/install-id.d.ts +17 -0
  22. package/lib/install-id.d.ts.map +1 -0
  23. package/lib/install-id.js +125 -0
  24. package/lib/install-id.js.map +1 -0
  25. package/lib/lifecycle.d.ts +28 -0
  26. package/lib/lifecycle.d.ts.map +1 -0
  27. package/lib/lifecycle.js +73 -0
  28. package/lib/lifecycle.js.map +1 -0
  29. package/lib/metrics.d.ts +18 -1
  30. package/lib/metrics.d.ts.map +1 -1
  31. package/lib/metrics.js +19 -2
  32. package/lib/metrics.js.map +1 -1
  33. package/lib/navigation.d.ts +1 -0
  34. package/lib/navigation.d.ts.map +1 -1
  35. package/lib/navigation.js +20 -0
  36. package/lib/navigation.js.map +1 -1
  37. package/lib/replay.d.ts +3 -1
  38. package/lib/replay.d.ts.map +1 -1
  39. package/lib/replay.js +8 -3
  40. package/lib/replay.js.map +1 -1
  41. package/lib/report-security.d.ts +40 -0
  42. package/lib/report-security.d.ts.map +1 -0
  43. package/lib/report-security.js +159 -0
  44. package/lib/report-security.js.map +1 -0
  45. package/lib/track.d.ts +34 -0
  46. package/lib/track.d.ts.map +1 -0
  47. package/lib/track.js +98 -0
  48. package/lib/track.js.map +1 -0
  49. package/lib/transport.d.ts +15 -0
  50. package/lib/transport.d.ts.map +1 -1
  51. package/lib/transport.js +23 -0
  52. package/lib/transport.js.map +1 -1
  53. package/lib/trust-score.d.ts +20 -0
  54. package/lib/trust-score.d.ts.map +1 -0
  55. package/lib/trust-score.js +151 -0
  56. package/lib/trust-score.js.map +1 -0
  57. package/package.json +7 -3
  58. package/src/__tests__/install-id.test.ts +60 -0
  59. package/src/__tests__/report-security.test.ts +106 -0
  60. package/src/__tests__/track.test.ts +91 -0
  61. package/src/capture.ts +111 -3
  62. package/src/config.ts +3 -0
  63. package/src/heartbeat.ts +158 -0
  64. package/src/index.ts +59 -2
  65. package/src/init.ts +27 -0
  66. package/src/install-id.ts +146 -0
  67. package/src/lifecycle.ts +76 -0
  68. package/src/metrics.ts +19 -1
  69. package/src/navigation.ts +26 -0
  70. package/src/replay.ts +11 -4
  71. package/src/report-security.ts +165 -0
  72. package/src/track.ts +114 -0
  73. package/src/transport.ts +35 -0
  74. package/src/trust-score.ts +176 -0
@@ -0,0 +1,193 @@
1
+ #!/usr/bin/env node
2
+ // v1.4 W28 — RN build-time source-bundle uploader.
3
+ //
4
+ // Operators add this to their build scripts (or a CI step) so a fresh
5
+ // source bundle is uploaded for each release without remembering to
6
+ // run sentori-cli by hand. The CLI is small on purpose:
7
+ //
8
+ // sentori-rn-upload-source-bundle --platform ios|android \
9
+ // [--release <r>] [--config <path>]
10
+ //
11
+ // Config resolution order (first hit wins):
12
+ // 1. --release flag
13
+ // 2. SENTORI_RELEASE env var
14
+ // 3. Auto-derived from the host app's package.json `version`
15
+ // (falls back with a clear error if not readable).
16
+ //
17
+ // The token + project id + api url come from:
18
+ // 1. CLI flags (--token, --project, --api-url) — if any is set, use them
19
+ // 2. `sentori.config.json` in the cwd (the host app root) — keys:
20
+ // { token, projectId, apiUrl, sources: { ios: "...", android: "..." } }
21
+ // 3. Env vars: SENTORI_TOKEN, SENTORI_PROJECT_ID, SENTORI_API_URL
22
+ //
23
+ // Source-tree path resolution:
24
+ // - Default ios: `<cwd>/ios`
25
+ // - Default android: `<cwd>/android/app/src`
26
+ // - Overridable per-platform in sentori.config.json under
27
+ // `sources.ios` / `sources.android`.
28
+ //
29
+ // This script shells out to `sentori-cli upload source-bundle
30
+ // --from-dir <path>` — sentori-cli already knows how to walk the
31
+ // directory, build a tarball, and upload. We just wire the flags.
32
+
33
+ 'use strict'
34
+
35
+ const { spawnSync } = require('node:child_process')
36
+ const fs = require('node:fs')
37
+ const path = require('node:path')
38
+
39
+ const HELP = `\
40
+ sentori-rn-upload-source-bundle — upload native sources for inline source view
41
+
42
+ Usage:
43
+ sentori-rn-upload-source-bundle --platform ios|android \\
44
+ [--release <r>] [--module <label>] \\
45
+ [--project <uuid>] [--token <t>] [--api-url <url>] \\
46
+ [--config <path>]
47
+
48
+ Config (\`sentori.config.json\` in the app root):
49
+ {
50
+ "token": "...",
51
+ "projectId": "uuid",
52
+ "apiUrl": "https://sentori.golia.jp",
53
+ "sources": { "ios": "ios", "android": "android/app/src" }
54
+ }
55
+
56
+ Example (in package.json):
57
+ "scripts": {
58
+ "build:ios": "react-native bundle ... && sentori-rn-upload-source-bundle --platform ios",
59
+ "build:android": "react-native bundle ... && sentori-rn-upload-source-bundle --platform android"
60
+ }
61
+ `
62
+
63
+ const args = parseArgs(process.argv.slice(2))
64
+ if (args.help) {
65
+ console.log(HELP)
66
+ process.exit(0)
67
+ }
68
+
69
+ const cwd = process.cwd()
70
+ const config = loadConfig(args.config, cwd)
71
+ const platform = args.platform
72
+ if (platform !== 'ios' && platform !== 'android') {
73
+ fail(`--platform must be 'ios' or 'android' (got ${platform || '(missing)'})`)
74
+ }
75
+
76
+ const release =
77
+ args.release ||
78
+ process.env.SENTORI_RELEASE ||
79
+ deriveReleaseFromPackageJson(cwd) ||
80
+ fail('release not set: pass --release or set SENTORI_RELEASE, or add `version` to package.json')
81
+
82
+ const token = args.token || process.env.SENTORI_TOKEN || config.token
83
+ if (!token) fail('token not set: pass --token, set SENTORI_TOKEN, or add `token` to sentori.config.json')
84
+
85
+ const projectId = args.project || process.env.SENTORI_PROJECT_ID || config.projectId
86
+ if (!projectId)
87
+ fail(
88
+ 'project not set: pass --project, set SENTORI_PROJECT_ID, or add `projectId` to sentori.config.json'
89
+ )
90
+
91
+ const apiUrl =
92
+ args['api-url'] || process.env.SENTORI_API_URL || config.apiUrl || 'https://sentori.golia.jp'
93
+
94
+ const sourceDir = resolveSourceDir(platform, cwd, config)
95
+ if (!fs.existsSync(sourceDir)) {
96
+ fail(
97
+ `source directory not found: ${sourceDir}\n` +
98
+ `Set sources.${platform} in sentori.config.json if your tree lives elsewhere.`
99
+ )
100
+ }
101
+
102
+ const cliBin = resolveCliBin(cwd)
103
+ const cliArgs = [
104
+ 'upload',
105
+ 'source-bundle',
106
+ '--api-url',
107
+ apiUrl,
108
+ '--token',
109
+ token,
110
+ '--project',
111
+ projectId,
112
+ '--release',
113
+ release,
114
+ '--platform',
115
+ platform,
116
+ ]
117
+ if (args.module) {
118
+ cliArgs.push('--module', args.module)
119
+ }
120
+ cliArgs.push(sourceDir)
121
+
122
+ console.log(
123
+ `[sentori-rn-upload-source-bundle] ${platform} · release=${release} · src=${path.relative(cwd, sourceDir) || sourceDir}`
124
+ )
125
+ const result = spawnSync(cliBin, cliArgs, { stdio: 'inherit' })
126
+ if (result.error) {
127
+ fail(`failed to spawn sentori-cli: ${result.error.message}`)
128
+ }
129
+ process.exit(result.status ?? 1)
130
+
131
+ // ── helpers ────────────────────────────────────────────────────────
132
+
133
+ function parseArgs(argv) {
134
+ const out = {}
135
+ for (let i = 0; i < argv.length; i++) {
136
+ const a = argv[i]
137
+ if (a === '-h' || a === '--help') {
138
+ out.help = true
139
+ continue
140
+ }
141
+ if (!a.startsWith('--')) continue
142
+ const eq = a.indexOf('=')
143
+ if (eq >= 0) {
144
+ out[a.slice(2, eq)] = a.slice(eq + 1)
145
+ } else {
146
+ out[a.slice(2)] = argv[++i]
147
+ }
148
+ }
149
+ return out
150
+ }
151
+
152
+ function loadConfig(customPath, cwd) {
153
+ const file = customPath ? path.resolve(cwd, customPath) : path.join(cwd, 'sentori.config.json')
154
+ if (!fs.existsSync(file)) return {}
155
+ try {
156
+ return JSON.parse(fs.readFileSync(file, 'utf8'))
157
+ } catch (e) {
158
+ fail(`failed to parse ${file}: ${e.message}`)
159
+ }
160
+ }
161
+
162
+ function deriveReleaseFromPackageJson(cwd) {
163
+ const file = path.join(cwd, 'package.json')
164
+ if (!fs.existsSync(file)) return null
165
+ try {
166
+ const pkg = JSON.parse(fs.readFileSync(file, 'utf8'))
167
+ if (pkg.name && pkg.version) return `${pkg.name}@${pkg.version}`
168
+ return pkg.version ?? null
169
+ } catch {
170
+ return null
171
+ }
172
+ }
173
+
174
+ function resolveSourceDir(platform, cwd, config) {
175
+ const override = config.sources && config.sources[platform]
176
+ if (override) return path.resolve(cwd, override)
177
+ if (platform === 'ios') return path.join(cwd, 'ios')
178
+ return path.join(cwd, 'android', 'app', 'src')
179
+ }
180
+
181
+ function resolveCliBin(cwd) {
182
+ // Prefer the local install of `sentori-cli` so the operator's
183
+ // pinned version of `@goliapkg/sentori-cli` is what runs. Falls
184
+ // through to a global on PATH otherwise.
185
+ const local = path.join(cwd, 'node_modules', '.bin', 'sentori-cli')
186
+ if (fs.existsSync(local)) return local
187
+ return 'sentori-cli'
188
+ }
189
+
190
+ function fail(msg) {
191
+ console.error(`error: ${msg}\n${HELP}`)
192
+ process.exit(2)
193
+ }
package/lib/capture.d.ts CHANGED
@@ -1,5 +1,20 @@
1
+ import { type CaptureMessageOptions } from '@goliapkg/sentori-core';
1
2
  import type { Event, Tags, User } from './types';
2
3
  export { captureStep, __resetTrailForTests } from './trail';
4
+ /**
5
+ * v2.0 — set a single scope tag merged onto every subsequent
6
+ * capture. Per-call `extras.tags` / `opts.tags` win over scope tags.
7
+ *
8
+ * sentori.setTag('rollout', 'dark-mode-v2');
9
+ * sentori.captureException(err); // event.tags carries rollout
10
+ */
11
+ export declare const setTag: (key: string, value: string) => void;
12
+ /**
13
+ * v2.0 — bulk variant of setTag. Existing tags are merged with
14
+ * the input record (`Object.assign` style).
15
+ */
16
+ export declare const setTags: (record: Record<string, string>) => void;
17
+ export declare const __resetScopeForTests: () => void;
3
18
  export declare const __resetScreenshotBudgetForTests: () => void;
4
19
  /**
5
20
  * Attach a stable user identifier to events captured after this call.
@@ -64,6 +79,25 @@ export declare const captureError: (error: Error, extras?: CaptureExtras) => voi
64
79
  * visible. */
65
80
  declare function captureAndAttachReplay(event: Event, ndjson: string): Promise<void>;
66
81
  export declare const captureException: (error: Error, extras?: CaptureExtras) => void;
82
+ /**
83
+ * Manually report an issue without an Error instance.
84
+ *
85
+ * Routes to the dashboard Issues module — distinct from `track`
86
+ * (analytics) and `recordMetric` (numeric). Use for "operator should
87
+ * look at this" signals: a fallback that fired, an unexpected state,
88
+ * a feature flag rollout that crossed a threshold.
89
+ *
90
+ * sentori.captureMessage('Payment provider returned 500, used fallback')
91
+ * sentori.captureMessage('Detected impossible state in session reducer', {
92
+ * level: 'error',
93
+ * tags: { reducer: 'session' },
94
+ * })
95
+ *
96
+ * Wrapped in `safeFn` per the NEVER rule — any internal failure is
97
+ * swallowed and (optionally) self-reported; the host app never sees
98
+ * a thrown error.
99
+ */
100
+ export declare const captureMessage: (message: string, opts?: CaptureMessageOptions | undefined) => void | undefined;
67
101
  /** rc.4 — test hook. The real replay attach path is internal so we
68
102
  * don't bloat the public surface, but the encoding bug Insight hit
69
103
  * on 2026-05-18 needs a behaviour-level test that exercises the
@@ -1 +1 @@
1
- {"version":3,"file":"capture.d.ts","sourceRoot":"","sources":["../src/capture.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAA+B,KAAK,EAAgB,IAAI,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAE5F,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAgB5D,eAAO,MAAM,+BAA+B,QAAO,IAElD,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,OAAO,GAAI,MAAM,IAAI,GAAG,IAAI,KAAG,IAE3C,CAAC;AAEF,eAAO,MAAM,OAAO,QAAO,IAAI,GAAG,IAAa,CAAC;AAEhD;sEACsE;AACtE,eAAO,MAAM,gBAAgB,QAAO,MAAM,GAAG,SAAmC,CAAC;AAEjF,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB;;;qDAGiD;IACjD,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,gBAAgB,GAAU,OAAO;IAC5C,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf,KAAG,OAAO,CAAC,IAAI,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,IAAI,GAAG,MAAM,CAAA;CAAE,CAKxD,CAAC;AAEF,eAAO,MAAM,YAAY,GAAI,OAAO,KAAK,EAAE,SAAS,aAAa,KAAG,IAiHnE,CAAC;AAEF;;;;;;;;;;;;eAYe;AACf,iBAAe,sBAAsB,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAiCjF;AAwDD,eAAO,MAAM,gBAAgB,UAzNO,KAAK,WAAW,aAAa,KAAG,IAyNxB,CAAC;AAE7C;;;0DAG0D;AAC1D,eAAO,MAAM,gCAAgC,+BAAyB,CAAC"}
1
+ {"version":3,"file":"capture.d.ts","sourceRoot":"","sources":["../src/capture.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,qBAAqB,EAK3B,MAAM,wBAAwB,CAAC;AAuBhC,OAAO,KAAK,EAA+B,KAAK,EAAgB,IAAI,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAE5F,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAW5D;;;;;;GAMG;AACH,eAAO,MAAM,MAAM,GAAI,KAAK,MAAM,EAAE,OAAO,MAAM,KAAG,IAEnD,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,OAAO,GAAI,QAAQ,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAG,IAExD,CAAC;AAQF,eAAO,MAAM,oBAAoB,QAAO,IAGvC,CAAC;AAYF,eAAO,MAAM,+BAA+B,QAAO,IAElD,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,OAAO,GAAI,MAAM,IAAI,GAAG,IAAI,KAAG,IAE3C,CAAC;AAEF,eAAO,MAAM,OAAO,QAAO,IAAI,GAAG,IAAa,CAAC;AAEhD;sEACsE;AACtE,eAAO,MAAM,gBAAgB,QAAO,MAAM,GAAG,SAAmC,CAAC;AAEjF,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB;;;qDAGiD;IACjD,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,gBAAgB,GAAU,OAAO;IAC5C,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf,KAAG,OAAO,CAAC,IAAI,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,IAAI,GAAG,MAAM,CAAA;CAAE,CAKxD,CAAC;AAEF,eAAO,MAAM,YAAY,GAAI,OAAO,KAAK,EAAE,SAAS,aAAa,KAAG,IAiHnE,CAAC;AAEF;;;;;;;;;;;;eAYe;AACf,iBAAe,sBAAsB,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAiCjF;AAwDD,eAAO,MAAM,gBAAgB,UAzNO,KAAK,WAAW,aAAa,KAAG,IAyNxB,CAAC;AAI7C;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,cAAc,iFAqC1B,CAAC;AAEF;;;0DAG0D;AAC1D,eAAO,MAAM,gCAAgC,+BAAyB,CAAC"}
package/lib/capture.js CHANGED
@@ -1,4 +1,4 @@
1
- import { sealTrail, shouldSample } from '@goliapkg/sentori-core';
1
+ import { safeFn, sealTrail, shouldSample, } from '@goliapkg/sentori-core';
2
2
  import { base64Utf8 } from './base64';
3
3
  import { __peekBreadcrumbCount, addBreadcrumb, getBreadcrumbs, } from './breadcrumbs';
4
4
  import { getBundleInfo } from './bundle-info';
@@ -13,10 +13,43 @@ import { parseStack } from './stack';
13
13
  import { getTrailBuffer } from './trail';
14
14
  import { enqueue, sendUserReport, uploadAttachment } from './transport';
15
15
  import { uuidV7 } from './uuid';
16
+ import { peekInstallId } from './install-id';
16
17
  import { getCachedNetworkType } from './netinfo';
17
18
  import { getRecentNativeException } from './native';
18
19
  export { captureStep, __resetTrailForTests } from './trail';
19
20
  let _user = null;
21
+ /** v2.0 — global scope tags merged onto every captured event
22
+ * (captureException + captureMessage). Set via `setTag` /
23
+ * `setTags`; reset by passing `{}`. Per-call tags win on conflict. */
24
+ let _scopeTags = {};
25
+ /**
26
+ * v2.0 — set a single scope tag merged onto every subsequent
27
+ * capture. Per-call `extras.tags` / `opts.tags` win over scope tags.
28
+ *
29
+ * sentori.setTag('rollout', 'dark-mode-v2');
30
+ * sentori.captureException(err); // event.tags carries rollout
31
+ */
32
+ export const setTag = (key, value) => {
33
+ _scopeTags[key] = String(value);
34
+ };
35
+ /**
36
+ * v2.0 — bulk variant of setTag. Existing tags are merged with
37
+ * the input record (`Object.assign` style).
38
+ */
39
+ export const setTags = (record) => {
40
+ for (const [k, v] of Object.entries(record))
41
+ _scopeTags[k] = String(v);
42
+ };
43
+ /** Internal — merge global scope tags into a per-call tag record. */
44
+ function mergeScopeTags(perCall) {
45
+ if (Object.keys(_scopeTags).length === 0)
46
+ return perCall;
47
+ return { ..._scopeTags, ...(perCall ?? {}) };
48
+ }
49
+ export const __resetScopeForTests = () => {
50
+ _user = null;
51
+ _scopeTags = {};
52
+ };
20
53
  // Phase 42 sub-D.08 — per-session screenshot quota. Defaults: 10 in
21
54
  // prod, unlimited (-1 sentinel) in dev so test loops + react-error-
22
55
  // overlay reruns don't run out partway through the session.
@@ -91,7 +124,7 @@ export const captureError = (error, extras) => {
91
124
  device: collectDevice(),
92
125
  app: collectApp(config.release),
93
126
  user: extras?.user ?? _user,
94
- tags: extras?.tags,
127
+ tags: mergeScopeTags(extras?.tags),
95
128
  ...(flags ? { flags } : {}),
96
129
  ...(bundle ? { bundle } : {}),
97
130
  breadcrumbs: crumbs,
@@ -238,6 +271,59 @@ async function captureAndAttachSessionTrail(event) {
238
271
  event.attachments.push(attachment);
239
272
  }
240
273
  export const captureException = captureError;
274
+ const DEFAULT_MESSAGE_LEVEL = 'info';
275
+ /**
276
+ * Manually report an issue without an Error instance.
277
+ *
278
+ * Routes to the dashboard Issues module — distinct from `track`
279
+ * (analytics) and `recordMetric` (numeric). Use for "operator should
280
+ * look at this" signals: a fallback that fired, an unexpected state,
281
+ * a feature flag rollout that crossed a threshold.
282
+ *
283
+ * sentori.captureMessage('Payment provider returned 500, used fallback')
284
+ * sentori.captureMessage('Detected impossible state in session reducer', {
285
+ * level: 'error',
286
+ * tags: { reducer: 'session' },
287
+ * })
288
+ *
289
+ * Wrapped in `safeFn` per the NEVER rule — any internal failure is
290
+ * swallowed and (optionally) self-reported; the host app never sees
291
+ * a thrown error.
292
+ */
293
+ export const captureMessage = safeFn('captureMessage', (message, opts = {}) => {
294
+ if (!isInitialized())
295
+ return;
296
+ if (typeof message !== 'string' || message.length === 0)
297
+ return;
298
+ const config = getConfig();
299
+ if (!config)
300
+ return;
301
+ if (!shouldSample(config.messageSampleRate)) {
302
+ addBreadcrumb({ type: 'custom', data: { reason: 'sampled-out', kind: 'message' } });
303
+ return;
304
+ }
305
+ const flags = getFeatureFlagSnapshot();
306
+ const bundle = getBundleInfo();
307
+ const crumbs = opts.breadcrumbs ?? getBreadcrumbs();
308
+ const event = {
309
+ id: uuidV7(),
310
+ timestamp: new Date().toISOString(),
311
+ kind: 'message',
312
+ level: opts.level ?? DEFAULT_MESSAGE_LEVEL,
313
+ message,
314
+ platform: 'javascript',
315
+ release: config.release,
316
+ environment: config.environment,
317
+ device: collectDevice(),
318
+ app: collectApp(config.release),
319
+ user: opts.user ?? _user,
320
+ tags: mergeScopeTags(opts.tags),
321
+ ...(flags ? { flags } : {}),
322
+ ...(bundle ? { bundle } : {}),
323
+ breadcrumbs: crumbs,
324
+ };
325
+ enqueue(event);
326
+ });
241
327
  /** rc.4 — test hook. The real replay attach path is internal so we
242
328
  * don't bloat the public surface, but the encoding bug Insight hit
243
329
  * on 2026-05-18 needs a behaviour-level test that exercises the
@@ -361,6 +447,14 @@ const collectDevice = () => {
361
447
  device.locale = locale;
362
448
  if (networkType)
363
449
  device.networkType = networkType;
450
+ // v1.1 chunk S1 — stable per-install id. Read sync from the
451
+ // in-memory cache populated by the install-id module's first
452
+ // resolve (kicked off from init()). `null` before init resolves —
453
+ // the field is omitted in that case rather than blocking event
454
+ // assembly, which sits on the JS thread.
455
+ const installId = peekInstallId();
456
+ if (installId)
457
+ device.installId = installId;
364
458
  return device;
365
459
  };
366
460
  const collectApp = (release) => {
@@ -1 +1 @@
1
- {"version":3,"file":"capture.js","sourceRoot":"","sources":["../src/capture.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"capture.js","sourceRoot":"","sources":["../src/capture.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,MAAM,EACN,SAAS,EACT,YAAY,GACb,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EACL,qBAAqB,EACrB,aAAa,EACb,cAAc,GACf,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACpD,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC3E,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACxE,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,EAAE,wBAAwB,EAAE,MAAM,UAAU,CAAC;AAGpD,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAI5D,IAAI,KAAK,GAAgB,IAAI,CAAC;AAE9B;;uEAEuE;AACvE,IAAI,UAAU,GAA2B,EAAE,CAAC;AAE5C;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,GAAW,EAAE,KAAa,EAAQ,EAAE;IACzD,UAAU,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;AAClC,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,MAA8B,EAAQ,EAAE;IAC9D,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;QAAE,UAAU,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;AACzE,CAAC,CAAC;AAEF,qEAAqE;AACrE,SAAS,cAAc,CAAC,OAAyB;IAC/C,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,OAAO,CAAC;IACzD,OAAO,EAAE,GAAG,UAAU,EAAE,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,CAAC;AAC/C,CAAC;AAED,MAAM,CAAC,MAAM,oBAAoB,GAAG,GAAS,EAAE;IAC7C,KAAK,GAAG,IAAI,CAAC;IACb,UAAU,GAAG,EAAE,CAAC;AAClB,CAAC,CAAC;AAEF,oEAAoE;AACpE,oEAAoE;AACpE,4DAA4D;AAC5D,MAAM,qBAAqB,GAAG,EAAE,CAAC;AACjC,IAAI,iBAAiB,GAAG,CAAC,CAAC;AAE1B,SAAS,gBAAgB;IACvB,OAAO,OAAO,OAAO,KAAK,WAAW,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,qBAAqB,CAAC;AAChF,CAAC;AAED,MAAM,CAAC,MAAM,+BAA+B,GAAG,GAAS,EAAE;IACxD,iBAAiB,GAAG,CAAC,CAAC;AACxB,CAAC,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,IAAiB,EAAQ,EAAE;IACjD,KAAK,GAAG,IAAI,CAAC;AACf,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,OAAO,GAAG,GAAgB,EAAE,CAAC,KAAK,CAAC;AAEhD;sEACsE;AACtE,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAuB,EAAE,CAAC,KAAK,EAAE,EAAE,IAAI,SAAS,CAAC;AAajF;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,EAAE,KAMtC,EAA0D,EAAE;IAC3D,IAAI,CAAC,aAAa,EAAE;QAAE,OAAO,IAAI,CAAC;IAClC,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACzB,OAAO,cAAc,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AAC/D,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,KAAY,EAAE,MAAsB,EAAQ,EAAE;IACzE,IAAI,CAAC,aAAa,EAAE;QAAE,OAAO;IAC7B,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,IAAI,CAAC,MAAM;QAAE,OAAO;IAEpB,gEAAgE;IAChE,8DAA8D;IAC9D,qEAAqE;IACrE,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,eAAe,CAAC,EAAE,CAAC;QAC1C,aAAa,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;QAClF,OAAO;IACT,CAAC;IAED,MAAM,KAAK,GAAG,sBAAsB,EAAE,CAAC;IACvC,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;IAC/B,MAAM,MAAM,GAAG,cAAc,EAAE,CAAC;IAChC,MAAM,KAAK,GAAU;QACnB,EAAE,EAAE,MAAM,EAAE;QACZ,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,IAAI,EAAE,OAAO;QACb,QAAQ,EAAE,YAAY;QACtB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,MAAM,EAAE,aAAa,EAAE;QACvB,GAAG,EAAE,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC;QAC/B,IAAI,EAAE,MAAM,EAAE,IAAI,IAAI,KAAK;QAC3B,IAAI,EAAE,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC;QAClC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3B,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7B,WAAW,EAAE,MAAM;QACnB,KAAK,EAAE,aAAa,CAAC,KAAK,CAAC;QAC3B,WAAW,EAAE,MAAM,EAAE,WAAW;KACjC,CAAC;IACF,iEAAiE;IACjE,mEAAmE;IACnE,kEAAkE;IAClE,mEAAmE;IACnE,iEAAiE;IACjE,IAAI,OAAO,OAAO,KAAK,WAAW,IAAI,OAAO,EAAE,CAAC;QAC9C,sCAAsC;QACtC,OAAO,CAAC,IAAI,CACV,4BAA4B,EAC5B,UAAU,EAAE,KAAK,CAAC,EAAE,EACpB,cAAc,EAAE,MAAM,CAAC,MAAM,EAC7B,iBAAiB,EAAE,MAAM,CAAC,kBAAkB,IAAI,MAAM,EAAE,UAAU,KAAK,KAAK,EAC5E,mBAAmB,EAAE,MAAM,CAAC,mBAAmB,EAC/C,aAAa,EAAE,eAAe,EAAE,CACjC,CAAC;IACJ,CAAC;IAED,mEAAmE;IACnE,oEAAoE;IACpE,kBAAkB,EAAE,CAAC;IAErB,8DAA8D;IAC9D,gEAAgE;IAChE,yDAAyD;IACzD,MAAM,cAAc,GAClB,MAAM,CAAC,kBAAkB,IAAI,MAAM,EAAE,UAAU,KAAK,KAAK,IAAI,eAAe,EAAE,CAAC;IAEjF,gEAAgE;IAChE,iEAAiE;IACjE,kEAAkE;IAClE,6DAA6D;IAC7D,MAAM,QAAQ,GAAG,KAAK,IAAmB,EAAE;QACzC,IAAI,OAAO,OAAO,KAAK,WAAW,IAAI,OAAO,EAAE,CAAC;YAC9C,MAAM,wBAAwB,CAAC,KAAK,CAAC,KAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAC/D,CAAC;QACD,IAAI,cAAc,EAAE,CAAC;YACnB,MAAM,0BAA0B,CAAC,KAAK,CAAC,CAAC;QAC1C,CAAC;QACD,MAAM,KAAK,GAAG,cAAc,EAAE,CAAC;QAC/B,IAAI,MAAM,CAAC,mBAAmB,IAAI,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC;YACnD,MAAM,4BAA4B,CAAC,KAAK,CAAC,CAAC;QAC5C,CAAC;QACD,kEAAkE;QAClE,iEAAiE;QACjE,oCAAoC;QACpC,MAAM,cAAc,GAAG,iBAAiB,EAAE,CAAC;QAC3C,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,MAAM,8BAA8B,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;YAC5D,mBAAmB,EAAE,CAAC;QACxB,CAAC;QACD,kEAAkE;QAClE,+DAA+D;QAC/D,MAAM,YAAY,GAAG,WAAW,EAAE,CAAC;QACnC,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,MAAM,sBAAsB,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;QACpD,CAAC;aAAM,IAAI,OAAO,OAAO,KAAK,WAAW,IAAI,OAAO,IAAI,eAAe,EAAE,EAAE,CAAC;YAC1E,iEAAiE;YACjE,sDAAsD;YACtD,6DAA6D;YAC7D,8DAA8D;YAC9D,8BAA8B;YAC9B,sCAAsC;YACtC,OAAO,CAAC,IAAI,CACV,uEAAuE,EACvE,UAAU,EAAE,KAAK,CAAC,EAAE,CACrB,CAAC;QACJ,CAAC;QACD,IAAI,OAAO,OAAO,KAAK,WAAW,IAAI,OAAO,EAAE,CAAC;YAC9C,sCAAsC;YACtC,OAAO,CAAC,IAAI,CACV,mBAAmB,EACnB,UAAU,EAAE,KAAK,CAAC,EAAE,EACpB,cAAc,EAAE,KAAK,CAAC,WAAW,EAAE,MAAM,IAAI,CAAC,EAC9C,QAAQ,EAAE,CAAC,KAAK,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,QAAQ,EAC5E,uBAAuB,EAAE,qBAAqB,EAAE,CACjD,CAAC;QACJ,CAAC;QACD,OAAO,CAAC,KAAK,CAAC,CAAC;IACjB,CAAC,CAAC;IACF,KAAK,QAAQ,EAAE,CAAC;AAClB,CAAC,CAAC;AAEF;;;;;;;;;;;;eAYe;AACf,KAAK,UAAU,sBAAsB,CAAC,KAAY,EAAE,MAAc;IAChE,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;QAClC,MAAM,IAAI,GAAG,MAAM,gBAAgB,CACjC,KAAK,CAAC,EAAE,EACR,QAAQ,EACR,EAAE,MAAM,EAAE,SAAS,EAAE,sBAAsB,EAAE,EAC7C,EAAE,MAAM,EAAE,IAAI,EAAE,CACjB,CAAC;QACF,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,IAAI,OAAO,OAAO,KAAK,WAAW,IAAI,OAAO,EAAE,CAAC;gBAC9C,sCAAsC;gBACtC,OAAO,CAAC,IAAI,CACV,uCAAuC,EACvC,UAAU,EAAE,KAAK,CAAC,EAAE,EACpB,cAAc,EAAE,MAAM,CAAC,MAAM,CAC9B,CAAC;YACJ,CAAC;YACD,OAAO;QACT,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,WAAW;YAAE,KAAK,CAAC,WAAW,GAAG,EAAE,CAAC;QAC/C,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAI,OAAO,OAAO,KAAK,WAAW,IAAI,OAAO,EAAE,CAAC;YAC9C,sCAAsC;YACtC,OAAO,CAAC,IAAI,CACV,mCAAmC,EACnC,UAAU,EAAE,KAAK,CAAC,EAAE,EACpB,cAAc,EAAE,MAAM,CAAC,MAAM,EAC7B,CAAC,CACF,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC;AAED;;6DAE6D;AAC7D,KAAK,UAAU,8BAA8B,CAC3C,KAAY,EACZ,SAA+C;IAE/C,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;QAC9C,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;QACnC,MAAM,IAAI,GAAG,MAAM,gBAAgB,CACjC,KAAK,CAAC,EAAE,EACR,eAAe,EACf,EAAE,MAAM,EAAE,SAAS,EAAE,kBAAkB,EAAE,EACzC,EAAE,MAAM,EAAE,IAAI,EAAE,CACjB,CAAC;QACF,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,CAAC,KAAK,CAAC,WAAW;gBAAE,KAAK,CAAC,WAAW,GAAG,EAAE,CAAC;YAC/C,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,cAAc;IAChB,CAAC;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,KAAK,UAAU,4BAA4B,CAAC,KAAY;IACtD,MAAM,KAAK,GAAG,cAAc,EAAE,CAAC;IAC/B,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;IACjC,KAAK,CAAC,KAAK,EAAE,CAAC;IACd,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IACrC,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,UAAU,GAAG,MAAM,gBAAgB,CACvC,KAAK,CAAC,EAAE,EACR,cAAc,EACd,EAAE,MAAM,EAAE,SAAS,EAAE,kBAAkB,EAAE,EACzC,EAAE,MAAM,EAAE,IAAI,EAAE,CACjB,CAAC;IACF,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,aAAa,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,6BAA6B,EAAE,EAAE,CAAC,CAAC;QACnF,OAAO;IACT,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,WAAW;QAAE,KAAK,CAAC,WAAW,GAAG,EAAE,CAAC;IAC/C,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG,YAAY,CAAC;AAE7C,MAAM,qBAAqB,GAAiB,MAAM,CAAC;AAEnD;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,CAClC,gBAAgB,EAChB,CAAC,OAAe,EAAE,OAA8B,EAAE,EAAQ,EAAE;IAC1D,IAAI,CAAC,aAAa,EAAE;QAAE,OAAO;IAC7B,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAChE,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,IAAI,CAAC,MAAM;QAAE,OAAO;IAEpB,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,iBAAiB,CAAC,EAAE,CAAC;QAC5C,aAAa,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;QACpF,OAAO;IACT,CAAC;IAED,MAAM,KAAK,GAAG,sBAAsB,EAAE,CAAC;IACvC,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;IAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,IAAI,cAAc,EAAE,CAAC;IAEpD,MAAM,KAAK,GAAU;QACnB,EAAE,EAAE,MAAM,EAAE;QACZ,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,qBAAqB;QAC1C,OAAO;QACP,QAAQ,EAAE,YAAY;QACtB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,MAAM,EAAE,aAAa,EAAE;QACvB,GAAG,EAAE,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC;QAC/B,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,KAAK;QACxB,IAAI,EAAE,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;QAC/B,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3B,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7B,WAAW,EAAE,MAAM;KACpB,CAAC;IAEF,OAAO,CAAC,KAAK,CAAC,CAAC;AACjB,CAAC,CACF,CAAC;AAEF;;;0DAG0D;AAC1D,MAAM,CAAC,MAAM,gCAAgC,GAAG,sBAAsB,CAAC;AAEvE,4DAA4D;AAC5D,SAAS,eAAe;IACtB,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;IAClC,IAAI,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC,CAAC,iBAAiB;IAC9C,IAAI,iBAAiB,IAAI,MAAM;QAAE,OAAO,KAAK,CAAC;IAC9C,iBAAiB,IAAI,CAAC,CAAC;IACvB,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;GAKG;AACH,KAAK,UAAU,0BAA0B,CAAC,KAAY;IACpD,IAAI,IAAI,GAAkD,IAAI,CAAC;IAC/D,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,iBAAiB,EAAE,CAAC;IACnC,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAI,OAAO,OAAO,KAAK,WAAW,IAAI,OAAO,EAAE,CAAC;YAC9C,sCAAsC;YACtC,OAAO,CAAC,IAAI,CAAC,oCAAoC,EAAE,CAAC,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;IACD,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,IAAI,OAAO,OAAO,KAAK,WAAW,IAAI,OAAO,EAAE,CAAC;YAC9C,sCAAsC;YACtC,OAAO,CAAC,IAAI,CACV,iFAAiF,EACjF,UAAU,EAAE,KAAK,CAAC,EAAE,CACrB,CAAC;QACJ,CAAC;QACD,aAAa,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,2BAA2B,EAAE,EAAE,CAAC,CAAC;QACjF,OAAO;IACT,CAAC;IACD,IAAI,OAAO,OAAO,KAAK,WAAW,IAAI,OAAO,EAAE,CAAC;QAC9C,sCAAsC;QACtC,OAAO,CAAC,IAAI,CACV,yCAAyC,EACzC,UAAU,EAAE,KAAK,CAAC,EAAE,EACpB,YAAY,EAAE,IAAI,CAAC,SAAS,EAC5B,cAAc,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,CACnC,CAAC;IACJ,CAAC;IACD,MAAM,UAAU,GAA0B,MAAM,gBAAgB,CAC9D,KAAK,CAAC,EAAE,EACR,YAAY,EACZ,IAAI,EACJ,EAAE,MAAM,EAAE,IAAI,EAAE,CACjB,CAAC;IACF,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,IAAI,OAAO,OAAO,KAAK,WAAW,IAAI,OAAO,EAAE,CAAC;YAC9C,sCAAsC;YACtC,OAAO,CAAC,IAAI,CAAC,2CAA2C,EAAE,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;QAClF,CAAC;QACD,aAAa,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,0BAA0B,EAAE,EAAE,CAAC,CAAC;QAChF,OAAO;IACT,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,WAAW;QAAE,KAAK,CAAC,WAAW,GAAG,EAAE,CAAC;IAC/C,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,aAAa,GAAG,CAAC,KAAY,EAAgB,EAAE;IACnD,MAAM,QAAQ,GAAI,KAA6B,CAAC,KAAK,CAAC;IACtD,IAAI,KAAK,GAAwB,IAAI,CAAC;IACtC,IAAI,QAAQ,YAAY,KAAK,EAAE,CAAC;QAC9B,KAAK,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;IAClC,CAAC;IAED,kEAAkE;IAClE,kEAAkE;IAClE,kEAAkE;IAClE,mEAAmE;IACnE,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACnB,MAAM,MAAM,GAAG,wBAAwB,EAAE,CAAC;QAC1C,IAAI,MAAM,IAAI,MAAM,CAAC,KAAK,IAAI,IAAI,EAAE,CAAC;YACnC,KAAK,GAAG;gBACN,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,iBAAiB;gBACtC,OAAO,EAAE,MAAM,CAAC,MAAM;gBACtB,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;oBACpC,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE;oBACrB,IAAI,EAAE,UAAU;oBAChB,KAAK,EAAE,KAAK;oBACZ,IAAI,EAAE,CAAC,GAAG,CAAC;iBACZ,CAAC,CAAC;gBACH,KAAK,EAAE,IAAI;aACZ,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO;QACL,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,OAAO;QAC3B,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,KAAK,EAAE,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC;QAC9B,KAAK;KACN,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,GAAW,EAAE;IACjC,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,MAAM,EAAE,GAAG,OAAO,CAAC,cAAc,CAQhC,CAAC;QACF,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5B,EAAE,GAAG,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,SAAS,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,gEAAgE;QAChE,6DAA6D;QAC7D,+DAA+D;QAC/D,+DAA+D;QAC/D,+DAA+D;QAC/D,8DAA8D;QAC9D,yDAAyD;QACzD,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,qCAAqC;IACvC,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,4DAA4D;IAC5D,6DAA6D;IAC7D,kEAAkE;IAClE,+DAA+D;IAC/D,yCAAyC;IACzC,MAAM,SAAS,GAAG,aAAa,EAAE,CAAC;IAClC,IAAI,SAAS;QAAE,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC;IAC5C,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAEF,MAAM,UAAU,GAAG,CAAC,OAAe,EAAO,EAAE;IAC1C,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,SAAS,GAAI,OAAO,CAAC,2BAA2B,CAAyB,CAAC,OAAO,CAAC;IACpF,CAAC;IAAC,MAAM,CAAC;QACP,oBAAoB;IACtB,CAAC;IAED,OAAO;QACL,OAAO;QACP,KAAK;QACL,SAAS,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,SAAS,EAAE;KACxD,CAAC;AACJ,CAAC,CAAC"}
package/lib/config.d.ts CHANGED
@@ -10,6 +10,9 @@ export type Config = {
10
10
  * `null` = keep everything (default). */
11
11
  errorSampleRate: null | number;
12
12
  traceSampleRate: null | number;
13
+ /** v2.0 — sampling rate for `kind: 'message'` events emitted via
14
+ * `captureMessage`. `null` = keep all (default). */
15
+ messageSampleRate: null | number;
13
16
  /** Phase 46: when true, every `captureException` seals the
14
17
  * session-trail buffer and uploads it as a `sessionTrail`
15
18
  * attachment. Defaults to false. */
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,MAAM,GAAG;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,wEAAwE;IACxE,kBAAkB,EAAE,OAAO,CAAC;IAC5B;8CAC0C;IAC1C,eAAe,EAAE,IAAI,GAAG,MAAM,CAAC;IAC/B,eAAe,EAAE,IAAI,GAAG,MAAM,CAAC;IAC/B;;yCAEqC;IACrC,mBAAmB,EAAE,OAAO,CAAC;CAC9B,CAAC;AAIF,eAAO,MAAM,SAAS,GAAI,QAAQ,MAAM,KAAG,IAE1C,CAAC;AAEF,eAAO,MAAM,SAAS,QAAO,MAAM,GAAG,IAAe,CAAC;AAEtD,eAAO,MAAM,aAAa,QAAO,OAA2B,CAAC;AAE7D,eAAO,MAAM,eAAe,QAAO,IAElC,CAAC"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,MAAM,GAAG;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,wEAAwE;IACxE,kBAAkB,EAAE,OAAO,CAAC;IAC5B;8CAC0C;IAC1C,eAAe,EAAE,IAAI,GAAG,MAAM,CAAC;IAC/B,eAAe,EAAE,IAAI,GAAG,MAAM,CAAC;IAC/B;yDACqD;IACrD,iBAAiB,EAAE,IAAI,GAAG,MAAM,CAAC;IACjC;;yCAEqC;IACrC,mBAAmB,EAAE,OAAO,CAAC;CAC9B,CAAC;AAIF,eAAO,MAAM,SAAS,GAAI,QAAQ,MAAM,KAAG,IAE1C,CAAC;AAEF,eAAO,MAAM,SAAS,QAAO,MAAM,GAAG,IAAe,CAAC;AAEtD,eAAO,MAAM,aAAa,QAAO,OAA2B,CAAC;AAE7D,eAAO,MAAM,eAAe,QAAO,IAElC,CAAC"}
package/lib/config.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAkBA,IAAI,OAAO,GAAkB,IAAI,CAAC;AAElC,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,MAAc,EAAQ,EAAE;IAChD,OAAO,GAAG,MAAM,CAAC;AACnB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG,GAAkB,EAAE,CAAC,OAAO,CAAC;AAEtD,MAAM,CAAC,MAAM,aAAa,GAAG,GAAY,EAAE,CAAC,OAAO,KAAK,IAAI,CAAC;AAE7D,MAAM,CAAC,MAAM,eAAe,GAAG,GAAS,EAAE;IACxC,OAAO,GAAG,IAAI,CAAC;AACjB,CAAC,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAqBA,IAAI,OAAO,GAAkB,IAAI,CAAC;AAElC,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,MAAc,EAAQ,EAAE;IAChD,OAAO,GAAG,MAAM,CAAC;AACnB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG,GAAkB,EAAE,CAAC,OAAO,CAAC;AAEtD,MAAM,CAAC,MAAM,aAAa,GAAG,GAAY,EAAE,CAAC,OAAO,KAAK,IAAI,CAAC;AAE7D,MAAM,CAAC,MAAM,eAAe,GAAG,GAAS,EAAE;IACxC,OAAO,GAAG,IAAI,CAAC;AACjB,CAAC,CAAC"}
@@ -0,0 +1,9 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"heartbeat.d.ts","sourceRoot":"","sources":["../src/heartbeat.ts"],"names":[],"mappings":"AA8CA,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;AA8CD,wBAAgB,wBAAwB,IAAI,IAAI,CAE/C"}
@@ -0,0 +1,140 @@
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 { getConfig } from './config';
22
+ import { getUser } from './capture';
23
+ import { getLastRoute } from './navigation';
24
+ import { uuidV7 } from './uuid';
25
+ const DEFAULT_INTERVAL_MS = 60_000;
26
+ const MIN_GAP_MS = 30_000;
27
+ let _running = false;
28
+ let _timer = null;
29
+ let _appStateSub = null;
30
+ let _sessionId = null;
31
+ let _lastBeatTs = 0;
32
+ let _intervalMs = DEFAULT_INTERVAL_MS;
33
+ export function startHeartbeat(opts = {}) {
34
+ if (_running)
35
+ return;
36
+ _running = true;
37
+ _intervalMs = Math.max(10_000, opts.intervalMs ?? DEFAULT_INTERVAL_MS);
38
+ _sessionId = uuidV7();
39
+ // AppState gate — only beat while app is in the foreground.
40
+ let AppState;
41
+ try {
42
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
43
+ AppState = require('react-native').AppState;
44
+ }
45
+ catch {
46
+ // Not in RN runtime (tests). The interval still runs; the gate
47
+ // is just permissive. Suppression below still applies.
48
+ AppState = undefined;
49
+ }
50
+ const isForeground = () => {
51
+ if (!AppState)
52
+ return true;
53
+ return (AppState.currentState ?? 'active') === 'active';
54
+ };
55
+ const beat = () => {
56
+ if (!_running)
57
+ return;
58
+ if (!isForeground())
59
+ return;
60
+ const now = Date.now();
61
+ if (now - _lastBeatTs < MIN_GAP_MS)
62
+ return;
63
+ _lastBeatTs = now;
64
+ void send();
65
+ };
66
+ // First beat as soon as we start (so the dashboard sees the user
67
+ // immediately, not 60 s after launch). Subsequent fires on the
68
+ // interval. AppState transitions can poke an immediate beat too —
69
+ // an active resume is a meaningful presence event.
70
+ beat();
71
+ _timer = setInterval(beat, _intervalMs);
72
+ if (AppState && typeof AppState.addEventListener === 'function') {
73
+ _appStateSub = AppState.addEventListener('change', (state) => {
74
+ if (state === 'active')
75
+ beat();
76
+ });
77
+ }
78
+ }
79
+ export function stopHeartbeat() {
80
+ _running = false;
81
+ if (_timer !== null) {
82
+ clearInterval(_timer);
83
+ _timer = null;
84
+ }
85
+ if (_appStateSub) {
86
+ _appStateSub.remove();
87
+ _appStateSub = null;
88
+ }
89
+ _sessionId = null;
90
+ _lastBeatTs = 0;
91
+ }
92
+ async function send() {
93
+ const config = getConfig();
94
+ if (!config)
95
+ return;
96
+ const user = getUser();
97
+ const body = {
98
+ sessionId: _sessionId ?? '',
99
+ release: config.release,
100
+ ts: Date.now(),
101
+ };
102
+ if (user?.id)
103
+ body.userId = user.id;
104
+ const route = getLastRoute();
105
+ if (route)
106
+ body.route = route;
107
+ const os = readOsString();
108
+ if (os)
109
+ body.os = os;
110
+ try {
111
+ await fetch(`${config.ingestUrl}/v1/heartbeat`, {
112
+ body: JSON.stringify(body),
113
+ headers: {
114
+ Authorization: `Bearer ${config.token}`,
115
+ 'Content-Type': 'application/json',
116
+ },
117
+ method: 'POST',
118
+ });
119
+ }
120
+ catch (e) {
121
+ if (typeof __DEV__ !== 'undefined' && __DEV__) {
122
+ // eslint-disable-next-line no-console
123
+ console.warn('[sentori] heartbeat failed (best-effort)', e);
124
+ }
125
+ }
126
+ }
127
+ function readOsString() {
128
+ try {
129
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
130
+ const RN = require('react-native');
131
+ return `${RN.Platform.OS} ${RN.Platform.Version}`;
132
+ }
133
+ catch {
134
+ return null;
135
+ }
136
+ }
137
+ export function __resetHeartbeatForTests() {
138
+ stopHeartbeat();
139
+ }
140
+ //# sourceMappingURL=heartbeat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"heartbeat.js","sourceRoot":"","sources":["../src/heartbeat.ts"],"names":[],"mappings":"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"}