@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.
- package/bin/sentori-rn-upload-source-bundle.cjs +193 -0
- package/lib/capture.d.ts +34 -0
- package/lib/capture.d.ts.map +1 -1
- package/lib/capture.js +96 -2
- package/lib/capture.js.map +1 -1
- package/lib/config.d.ts +3 -0
- package/lib/config.d.ts.map +1 -1
- package/lib/config.js.map +1 -1
- package/lib/heartbeat.d.ts +9 -0
- package/lib/heartbeat.d.ts.map +1 -0
- package/lib/heartbeat.js +140 -0
- package/lib/heartbeat.js.map +1 -0
- package/lib/index.d.ts +30 -3
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +30 -4
- package/lib/index.js.map +1 -1
- package/lib/init.d.ts +9 -0
- package/lib/init.d.ts.map +1 -1
- package/lib/init.js +19 -0
- package/lib/init.js.map +1 -1
- package/lib/install-id.d.ts +17 -0
- package/lib/install-id.d.ts.map +1 -0
- package/lib/install-id.js +125 -0
- package/lib/install-id.js.map +1 -0
- package/lib/lifecycle.d.ts +28 -0
- package/lib/lifecycle.d.ts.map +1 -0
- package/lib/lifecycle.js +73 -0
- package/lib/lifecycle.js.map +1 -0
- package/lib/metrics.d.ts +18 -1
- package/lib/metrics.d.ts.map +1 -1
- package/lib/metrics.js +19 -2
- package/lib/metrics.js.map +1 -1
- package/lib/navigation.d.ts +1 -0
- package/lib/navigation.d.ts.map +1 -1
- package/lib/navigation.js +20 -0
- package/lib/navigation.js.map +1 -1
- package/lib/replay.d.ts +3 -1
- package/lib/replay.d.ts.map +1 -1
- package/lib/replay.js +8 -3
- package/lib/replay.js.map +1 -1
- package/lib/report-security.d.ts +40 -0
- package/lib/report-security.d.ts.map +1 -0
- package/lib/report-security.js +159 -0
- package/lib/report-security.js.map +1 -0
- package/lib/track.d.ts +34 -0
- package/lib/track.d.ts.map +1 -0
- package/lib/track.js +98 -0
- package/lib/track.js.map +1 -0
- package/lib/transport.d.ts +15 -0
- package/lib/transport.d.ts.map +1 -1
- package/lib/transport.js +23 -0
- package/lib/transport.js.map +1 -1
- package/lib/trust-score.d.ts +20 -0
- package/lib/trust-score.d.ts.map +1 -0
- package/lib/trust-score.js +151 -0
- package/lib/trust-score.js.map +1 -0
- package/package.json +7 -3
- package/src/__tests__/install-id.test.ts +60 -0
- package/src/__tests__/report-security.test.ts +106 -0
- package/src/__tests__/track.test.ts +91 -0
- package/src/capture.ts +111 -3
- package/src/config.ts +3 -0
- package/src/heartbeat.ts +158 -0
- package/src/index.ts +59 -2
- package/src/init.ts +27 -0
- package/src/install-id.ts +146 -0
- package/src/lifecycle.ts +76 -0
- package/src/metrics.ts +19 -1
- package/src/navigation.ts +26 -0
- package/src/replay.ts +11 -4
- package/src/report-security.ts +165 -0
- package/src/track.ts +114 -0
- package/src/transport.ts +35 -0
- 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
|
package/lib/capture.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capture.d.ts","sourceRoot":"","sources":["../src/capture.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"capture.d.ts","sourceRoot":"","sources":["../src/capture.ts"],"names":[],"mappings":"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) => {
|
package/lib/capture.js.map
CHANGED
|
@@ -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":"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"}
|
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. */
|
package/lib/config.d.ts.map
CHANGED
|
@@ -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":"
|
|
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"}
|
package/lib/heartbeat.js
ADDED
|
@@ -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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"}
|