@goliapkg/sentori-react-native 0.6.1 → 0.7.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/lib/capture.d.ts +1 -0
- package/lib/capture.d.ts.map +1 -1
- package/lib/capture.js +42 -0
- package/lib/capture.js.map +1 -1
- package/lib/config.d.ts +8 -0
- package/lib/config.d.ts.map +1 -1
- package/lib/config.js.map +1 -1
- package/lib/index.d.ts +2 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +3 -2
- package/lib/index.js.map +1 -1
- package/lib/init.d.ts +15 -0
- package/lib/init.d.ts.map +1 -1
- package/lib/init.js +3 -0
- package/lib/init.js.map +1 -1
- package/lib/navigation.d.ts.map +1 -1
- package/lib/navigation.js +7 -0
- package/lib/navigation.js.map +1 -1
- package/lib/trail.d.ts +12 -0
- package/lib/trail.d.ts.map +1 -0
- package/lib/trail.js +28 -0
- package/lib/trail.js.map +1 -0
- package/package.json +3 -3
- package/src/capture.ts +51 -0
- package/src/config.ts +8 -0
- package/src/index.ts +9 -2
- package/src/init.ts +18 -0
- package/src/navigation.ts +8 -0
- package/src/trail.ts +32 -0
package/lib/capture.d.ts
CHANGED
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":"AAWA,OAAO,KAAK,EAAoD,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,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,eAAO,MAAM,YAAY,GAAI,OAAO,KAAK,EAAE,SAAS,aAAa,KAAG,IAyDnE,CAAC;AAoCF,eAAO,MAAM,gBAAgB,UA7FO,KAAK,WAAW,aAAa,KAAG,IA6FxB,CAAC"}
|
package/lib/capture.js
CHANGED
|
@@ -1,11 +1,14 @@
|
|
|
1
|
+
import { sealTrail, shouldSample } from '@goliapkg/sentori-core';
|
|
1
2
|
import { addBreadcrumb, getBreadcrumbs } from './breadcrumbs';
|
|
2
3
|
import { getConfig, isInitialized } from './config';
|
|
3
4
|
import { symbolicateErrorViaMetro } from './handlers/dev-symbolicate';
|
|
4
5
|
import { captureScreenshot } from './handlers/screenshot';
|
|
5
6
|
import { markSessionErrored } from './session-tracker';
|
|
6
7
|
import { parseStack } from './stack';
|
|
8
|
+
import { getTrailBuffer } from './trail';
|
|
7
9
|
import { enqueue, uploadAttachment } from './transport';
|
|
8
10
|
import { uuidV7 } from './uuid';
|
|
11
|
+
export { captureStep, __resetTrailForTests } from './trail';
|
|
9
12
|
let _user = null;
|
|
10
13
|
// Phase 42 sub-D.08 — per-session screenshot quota. Defaults: 10 in
|
|
11
14
|
// prod, unlimited (-1 sentinel) in dev so test loops + react-error-
|
|
@@ -40,6 +43,13 @@ export const captureError = (error, extras) => {
|
|
|
40
43
|
const config = getConfig();
|
|
41
44
|
if (!config)
|
|
42
45
|
return;
|
|
46
|
+
// Phase 44 sub-B: client-side sampling. Skip the whole pipeline
|
|
47
|
+
// (no screenshot capture either) when the sample dice come up
|
|
48
|
+
// wrong. Default rate = null = keep, so existing callers unaffected.
|
|
49
|
+
if (!shouldSample(config.errorSampleRate)) {
|
|
50
|
+
addBreadcrumb({ type: 'custom', data: { reason: 'sampled-out', kind: 'error' } });
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
43
53
|
const event = {
|
|
44
54
|
id: uuidV7(),
|
|
45
55
|
timestamp: new Date().toISOString(),
|
|
@@ -73,10 +83,42 @@ export const captureError = (error, extras) => {
|
|
|
73
83
|
if (wantScreenshot) {
|
|
74
84
|
await captureAndAttachScreenshot(event);
|
|
75
85
|
}
|
|
86
|
+
const trail = getTrailBuffer();
|
|
87
|
+
if (config.sessionTrailEnabled && trail.size() > 0) {
|
|
88
|
+
await captureAndAttachSessionTrail(event);
|
|
89
|
+
}
|
|
76
90
|
enqueue(event);
|
|
77
91
|
};
|
|
78
92
|
void pipeline();
|
|
79
93
|
};
|
|
94
|
+
/**
|
|
95
|
+
* Phase 46 — seal the trail buffer, upload it as a `sessionTrail`
|
|
96
|
+
* attachment, attach the ref. Best-effort: any failure leaves a
|
|
97
|
+
* breadcrumb and lets the event ship without the trail.
|
|
98
|
+
*
|
|
99
|
+
* The trail is **always cleared** after `captureException`, even if
|
|
100
|
+
* upload fails — we don't want a stale 30-step buffer leaking into
|
|
101
|
+
* the next crash's trail.
|
|
102
|
+
*/
|
|
103
|
+
async function captureAndAttachSessionTrail(event) {
|
|
104
|
+
const trail = getTrailBuffer();
|
|
105
|
+
const payload = sealTrail(trail);
|
|
106
|
+
trail.clear();
|
|
107
|
+
const json = JSON.stringify(payload);
|
|
108
|
+
// base64 the JSON for the `data:` URI multipart bridge (same
|
|
109
|
+
// trick the screenshot path uses).
|
|
110
|
+
const base64 = typeof globalThis.btoa === 'function'
|
|
111
|
+
? globalThis.btoa(unescape(encodeURIComponent(json)))
|
|
112
|
+
: Buffer.from(json, 'utf-8').toString('base64');
|
|
113
|
+
const attachment = await uploadAttachment(event.id, 'sessionTrail', { base64, mediaType: 'application/json' }, { source: 'js' });
|
|
114
|
+
if (!attachment) {
|
|
115
|
+
addBreadcrumb({ type: 'custom', data: { reason: 'session-trail-upload-failed' } });
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
if (!event.attachments)
|
|
119
|
+
event.attachments = [];
|
|
120
|
+
event.attachments.push(attachment);
|
|
121
|
+
}
|
|
80
122
|
export const captureException = captureError;
|
|
81
123
|
/** Phase 42 sub-D.08: per-session screenshot quota gate. */
|
|
82
124
|
function allowScreenshot() {
|
package/lib/capture.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capture.js","sourceRoot":"","sources":["../src/capture.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACpD,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,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"capture.js","sourceRoot":"","sources":["../src/capture.ts"],"names":[],"mappings":"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"}
|
package/lib/config.d.ts
CHANGED
|
@@ -6,6 +6,14 @@ export type Config = {
|
|
|
6
6
|
enabled: boolean;
|
|
7
7
|
/** Phase 42 sub-D.07: opt-in screenshot capture on captureException. */
|
|
8
8
|
screenshotsEnabled: boolean;
|
|
9
|
+
/** Phase 44 sub-B: per-event-class sampling rates 0..1.
|
|
10
|
+
* `null` = keep everything (default). */
|
|
11
|
+
errorSampleRate: null | number;
|
|
12
|
+
traceSampleRate: null | number;
|
|
13
|
+
/** Phase 46: when true, every `captureException` seals the
|
|
14
|
+
* session-trail buffer and uploads it as a `sessionTrail`
|
|
15
|
+
* attachment. Defaults to false. */
|
|
16
|
+
sessionTrailEnabled: boolean;
|
|
9
17
|
};
|
|
10
18
|
export declare const setConfig: (config: Config) => void;
|
|
11
19
|
export declare const getConfig: () => Config | null;
|
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;
|
|
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"}
|
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":"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"}
|
package/lib/index.d.ts
CHANGED
|
@@ -7,6 +7,7 @@ export declare const sentori: {
|
|
|
7
7
|
getUser: () => import("@goliapkg/sentori-core").User | null;
|
|
8
8
|
captureError: (error: Error, extras?: import("./capture").CaptureExtras) => void;
|
|
9
9
|
captureException: (error: Error, extras?: import("./capture").CaptureExtras) => void;
|
|
10
|
+
captureStep: (label: string, opts?: Partial<import("@goliapkg/sentori-core").TrailStep>) => void;
|
|
10
11
|
ErrorBoundary: typeof ErrorBoundary;
|
|
11
12
|
MaskRegion: typeof MaskRegion;
|
|
12
13
|
setMaskedNode: typeof setMaskedNode;
|
|
@@ -18,7 +19,7 @@ export declare const sentori: {
|
|
|
18
19
|
export default sentori;
|
|
19
20
|
export { init, init as initSentori } from './init';
|
|
20
21
|
export { addBreadcrumb } from './breadcrumbs';
|
|
21
|
-
export {
|
|
22
|
+
export { captureError, captureException, captureStep, getUser, setUser, } from './capture';
|
|
22
23
|
export { ErrorBoundary } from './error-boundary';
|
|
23
24
|
export { MaskRegion, setMaskedNode, unsetMaskedNode } from './mask';
|
|
24
25
|
export { startAnrWatchdog, stopAnrWatchdog, triggerNativeCrash, } from './native';
|
package/lib/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC;AAOpE,eAAO,MAAM,OAAO
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC;AAOpE,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;CAenB,CAAC;AAEF,eAAe,OAAO,CAAC;AAEvB,OAAO,EAAE,IAAI,EAAE,IAAI,IAAI,WAAW,EAAE,MAAM,QAAQ,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,WAAW,EACX,OAAO,EACP,OAAO,GACR,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC;AACpE,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,kBAAkB,GACnB,MAAM,UAAU,CAAC;AAClB,OAAO,EACL,UAAU,EACV,kBAAkB,EAClB,YAAY,GACb,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,KAAK,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAE1E,YAAY,EACV,KAAK,EACL,YAAY,EACZ,KAAK,EACL,UAAU,EACV,cAAc,EACd,MAAM,EACN,QAAQ,EACR,GAAG,EACH,IAAI,EACJ,IAAI,EACJ,SAAS,EACT,QAAQ,GACT,MAAM,SAAS,CAAC"}
|
package/lib/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { init } from './init';
|
|
2
2
|
import { addBreadcrumb } from './breadcrumbs';
|
|
3
|
-
import { setUser, getUser, captureError, captureException } from './capture';
|
|
3
|
+
import { setUser, getUser, captureError, captureException, captureStep } from './capture';
|
|
4
4
|
import { ErrorBoundary } from './error-boundary';
|
|
5
5
|
import { MaskRegion, setMaskedNode, unsetMaskedNode } from './mask';
|
|
6
6
|
import { endSession, markSessionCrashed, startSession, } from './session-tracker';
|
|
@@ -11,6 +11,7 @@ export const sentori = {
|
|
|
11
11
|
getUser,
|
|
12
12
|
captureError,
|
|
13
13
|
captureException,
|
|
14
|
+
captureStep,
|
|
14
15
|
ErrorBoundary,
|
|
15
16
|
MaskRegion,
|
|
16
17
|
setMaskedNode,
|
|
@@ -22,7 +23,7 @@ export const sentori = {
|
|
|
22
23
|
export default sentori;
|
|
23
24
|
export { init, init as initSentori } from './init';
|
|
24
25
|
export { addBreadcrumb } from './breadcrumbs';
|
|
25
|
-
export {
|
|
26
|
+
export { captureError, captureException, captureStep, getUser, setUser, } from './capture';
|
|
26
27
|
export { ErrorBoundary } from './error-boundary';
|
|
27
28
|
export { MaskRegion, setMaskedNode, unsetMaskedNode } from './mask';
|
|
28
29
|
export { startAnrWatchdog, stopAnrWatchdog, triggerNativeCrash, } from './native';
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC1F,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC;AACpE,OAAO,EACL,UAAU,EACV,kBAAkB,EAClB,YAAY,GACb,MAAM,mBAAmB,CAAC;AAE3B,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,IAAI;IACJ,aAAa;IACb,OAAO;IACP,OAAO;IACP,YAAY;IACZ,gBAAgB;IAChB,WAAW;IACX,aAAa;IACb,UAAU;IACV,aAAa;IACb,eAAe;IACf,YAAY;IACZ,UAAU;IACV,kBAAkB;CACnB,CAAC;AAEF,eAAe,OAAO,CAAC;AAEvB,OAAO,EAAE,IAAI,EAAE,IAAI,IAAI,WAAW,EAAE,MAAM,QAAQ,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,WAAW,EACX,OAAO,EACP,OAAO,GACR,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC;AACpE,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,kBAAkB,GACnB,MAAM,UAAU,CAAC;AAClB,OAAO,EACL,UAAU,EACV,kBAAkB,EAClB,YAAY,GACb,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAA0B,kBAAkB,EAAE,MAAM,cAAc,CAAC"}
|
package/lib/init.d.ts
CHANGED
|
@@ -22,6 +22,21 @@ export type InitOptions = {
|
|
|
22
22
|
* installed and `<MaskRegion>` placed over any sensitive UI. The
|
|
23
23
|
* image is webp q=70 480 px max, < 100 KB typical. */
|
|
24
24
|
screenshot?: boolean;
|
|
25
|
+
/** Phase 46: record the last N steps (route changes, custom
|
|
26
|
+
* breadcrumbs) leading up to a crash. On `captureException`
|
|
27
|
+
* the buffer is sealed and uploaded as a `sessionTrail`
|
|
28
|
+
* attachment. Defaults to false. */
|
|
29
|
+
sessionTrail?: boolean;
|
|
30
|
+
};
|
|
31
|
+
/** Phase 44 sub-B: client-side sampling. Each rate is `[0, 1]`;
|
|
32
|
+
* absent / null keeps everything. Defaults to 1.0 for both
|
|
33
|
+
* (no drop). Set traces to e.g. 0.1 once the app's at user
|
|
34
|
+
* volume to keep ingest budget under control without changing
|
|
35
|
+
* the server-side quota. Decisions are made per-event for
|
|
36
|
+
* errors and per-trace (all spans together) for traces. */
|
|
37
|
+
sampling?: {
|
|
38
|
+
errors?: null | number;
|
|
39
|
+
traces?: null | number;
|
|
25
40
|
};
|
|
26
41
|
};
|
|
27
42
|
export declare const init: (options: InitOptions) => void;
|
package/lib/init.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAkB,cAAc,EAA2B,MAAM,SAAS,CAAC;AAIvF,MAAM,MAAM,WAAW,GAAG;IACxB,sDAAsD;IACtD,KAAK,EAAE,MAAM,CAAC;IACd,4DAA4D;IAC5D,OAAO,EAAE,MAAM,CAAC;IAChB,sEAAsE;IACtE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qFAAqF;IACrF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iEAAiE;IACjE,OAAO,CAAC,EAAE;QACR,YAAY,CAAC,EAAE,OAAO,CAAC;QACvB,iBAAiB,CAAC,EAAE,OAAO,CAAC;QAC5B,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB;;8DAEsD;QACtD,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB;;;+DAGuD;QACvD,UAAU,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAkB,cAAc,EAA2B,MAAM,SAAS,CAAC;AAIvF,MAAM,MAAM,WAAW,GAAG;IACxB,sDAAsD;IACtD,KAAK,EAAE,MAAM,CAAC;IACd,4DAA4D;IAC5D,OAAO,EAAE,MAAM,CAAC;IAChB,sEAAsE;IACtE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qFAAqF;IACrF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iEAAiE;IACjE,OAAO,CAAC,EAAE;QACR,YAAY,CAAC,EAAE,OAAO,CAAC;QACvB,iBAAiB,CAAC,EAAE,OAAO,CAAC;QAC5B,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB;;8DAEsD;QACtD,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB;;;+DAGuD;QACvD,UAAU,CAAC,EAAE,OAAO,CAAC;QACrB;;;6CAGqC;QACrC,YAAY,CAAC,EAAE,OAAO,CAAC;KACxB,CAAC;IACF;;;;;gEAK4D;IAC5D,QAAQ,CAAC,EAAE;QACT,MAAM,CAAC,EAAE,IAAI,GAAG,MAAM,CAAC;QACvB,MAAM,CAAC,EAAE,IAAI,GAAG,MAAM,CAAC;KACxB,CAAC;CACH,CAAC;AAIF,eAAO,MAAM,IAAI,GAAI,SAAS,WAAW,KAAG,IAoF3C,CAAC;AAiBF,YAAY,EAAE,cAAc,EAAE,CAAC"}
|
package/lib/init.js
CHANGED
|
@@ -23,6 +23,9 @@ export const init = (options) => {
|
|
|
23
23
|
ingestUrl: options.ingestUrl ?? DEFAULT_INGEST_URL,
|
|
24
24
|
enabled: true,
|
|
25
25
|
screenshotsEnabled: options.capture?.screenshot === true,
|
|
26
|
+
errorSampleRate: options.sampling?.errors ?? null,
|
|
27
|
+
traceSampleRate: options.sampling?.traces ?? null,
|
|
28
|
+
sessionTrailEnabled: options.capture?.sessionTrail === true,
|
|
26
29
|
});
|
|
27
30
|
// Tell the native crash handler about the config so the JSON it writes
|
|
28
31
|
// on the next NSException / Java uncaught carries release + env.
|
package/lib/init.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EACL,iBAAiB,EACjB,OAAO,EACP,cAAc,EACd,gBAAgB,GACjB,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"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"}
|
package/lib/navigation.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"navigation.d.ts","sourceRoot":"","sources":["../src/navigation.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"navigation.d.ts","sourceRoot":"","sources":["../src/navigation.ts"],"names":[],"mappings":"AA4BA;;kDAEkD;AAClD,MAAM,MAAM,iBAAiB,GAAG;IAC9B,WAAW,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,IAAI,KAAK,MAAM,IAAI,CAAC;IAClE,eAAe,EAAE,MAAM;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC;CACrD,CAAC;AAEF;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,kBAAkB,CAAC,aAAa,EAAE,iBAAiB,GAAG,IAAI,CAqDzE"}
|
package/lib/navigation.js
CHANGED
|
@@ -21,6 +21,7 @@
|
|
|
21
21
|
// `startSpan(op, { parent: activeSpan() })`.
|
|
22
22
|
import { useEffect, useRef } from 'react';
|
|
23
23
|
import { setActiveSpan, startSpan } from '@goliapkg/sentori-core';
|
|
24
|
+
import { captureStep } from './trail';
|
|
24
25
|
/**
|
|
25
26
|
* Subscribe to react-navigation state changes and emit a
|
|
26
27
|
* `react.navigation` span per screen (including the initial one),
|
|
@@ -61,6 +62,12 @@ export function useTraceNavigation(navigationRef) {
|
|
|
61
62
|
openSpanRef.current = span;
|
|
62
63
|
setActiveSpan(span);
|
|
63
64
|
lastRouteRef.current = to;
|
|
65
|
+
// Phase 46 — record the screen transition into the session trail.
|
|
66
|
+
// No-op when sessionTrail isn't enabled (the buffer just grows
|
|
67
|
+
// unbounded until cleared by captureException, but stays cheap).
|
|
68
|
+
captureStep(`screen:${to}`, {
|
|
69
|
+
breadcrumb: { type: 'navigation', message: from ? `${from} → ${to}` : to },
|
|
70
|
+
});
|
|
64
71
|
};
|
|
65
72
|
// Open a span for the initial screen so its requests are grouped
|
|
66
73
|
// too (auth / config / first data load are usually the busiest
|
package/lib/navigation.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"navigation.js","sourceRoot":"","sources":["../src/navigation.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,oEAAoE;AACpE,0DAA0D;AAC1D,qEAAqE;AACrE,iEAAiE;AACjE,EAAE;AACF,yDAAyD;AACzD,8DAA8D;AAC9D,mEAAmE;AACnE,4CAA4C;AAC5C,EAAE;AACF,oEAAoE;AACpE,gEAAgE;AAChE,mEAAmE;AACnE,kEAAkE;AAClE,EAAE;AACF,kEAAkE;AAClE,qEAAqE;AACrE,sEAAsE;AACtE,gEAAgE;AAChE,6CAA6C;AAE7C,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAE1C,OAAO,EAAE,aAAa,EAAE,SAAS,EAAmB,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"navigation.js","sourceRoot":"","sources":["../src/navigation.ts"],"names":[],"mappings":"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"}
|
package/lib/trail.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { TrailBuffer, type TrailStep } from '@goliapkg/sentori-core';
|
|
2
|
+
/**
|
|
3
|
+
* Phase 46 — record a step into the session-trail buffer. The buffer
|
|
4
|
+
* is a fixed-size FIFO (default 30 steps); pushing past capacity
|
|
5
|
+
* drops the oldest entry. Steps are only uploaded if
|
|
6
|
+
* `init({ capture: { sessionTrail: true } })` is on AND a
|
|
7
|
+
* `captureException` follows.
|
|
8
|
+
*/
|
|
9
|
+
export declare const captureStep: (label: string, opts?: Partial<TrailStep>) => void;
|
|
10
|
+
export declare const getTrailBuffer: () => TrailBuffer;
|
|
11
|
+
export declare const __resetTrailForTests: () => void;
|
|
12
|
+
//# sourceMappingURL=trail.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trail.d.ts","sourceRoot":"","sources":["../src/trail.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,WAAW,EAAE,KAAK,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAIrE;;;;;;GAMG;AACH,eAAO,MAAM,WAAW,GAAI,OAAO,MAAM,EAAE,OAAO,OAAO,CAAC,SAAS,CAAC,KAAG,IAMtE,CAAC;AAEF,eAAO,MAAM,cAAc,QAAO,WAAqB,CAAC;AAExD,eAAO,MAAM,oBAAoB,QAAO,IAEvC,CAAC"}
|
package/lib/trail.js
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
// Phase 46 — singleton TrailBuffer for the RN SDK.
|
|
2
|
+
//
|
|
3
|
+
// Kept in its own module so callers (including navigation.ts, which
|
|
4
|
+
// is intentionally lightweight) can record steps without pulling in
|
|
5
|
+
// capture.ts → handlers/screenshot.ts → react-native. The buffer is
|
|
6
|
+
// drained inside capture.ts when an event captures and
|
|
7
|
+
// `sessionTrailEnabled` is on.
|
|
8
|
+
import { TrailBuffer } from '@goliapkg/sentori-core';
|
|
9
|
+
const _trail = new TrailBuffer(30);
|
|
10
|
+
/**
|
|
11
|
+
* Phase 46 — record a step into the session-trail buffer. The buffer
|
|
12
|
+
* is a fixed-size FIFO (default 30 steps); pushing past capacity
|
|
13
|
+
* drops the oldest entry. Steps are only uploaded if
|
|
14
|
+
* `init({ capture: { sessionTrail: true } })` is on AND a
|
|
15
|
+
* `captureException` follows.
|
|
16
|
+
*/
|
|
17
|
+
export const captureStep = (label, opts) => {
|
|
18
|
+
_trail.push({
|
|
19
|
+
ts: Date.now(),
|
|
20
|
+
label,
|
|
21
|
+
...(opts ?? {}),
|
|
22
|
+
});
|
|
23
|
+
};
|
|
24
|
+
export const getTrailBuffer = () => _trail;
|
|
25
|
+
export const __resetTrailForTests = () => {
|
|
26
|
+
_trail.clear();
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=trail.js.map
|
package/lib/trail.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trail.js","sourceRoot":"","sources":["../src/trail.ts"],"names":[],"mappings":"AAAA,mDAAmD;AACnD,EAAE;AACF,oEAAoE;AACpE,oEAAoE;AACpE,oEAAoE;AACpE,uDAAuD;AACvD,+BAA+B;AAE/B,OAAO,EAAE,WAAW,EAAkB,MAAM,wBAAwB,CAAC;AAErE,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,EAAE,CAAC,CAAC;AAEnC;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,KAAa,EAAE,IAAyB,EAAQ,EAAE;IAC5E,MAAM,CAAC,IAAI,CAAC;QACV,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE;QACd,KAAK;QACL,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;KAChB,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,GAAgB,EAAE,CAAC,MAAM,CAAC;AAExD,MAAM,CAAC,MAAM,oBAAoB,GAAG,GAAS,EAAE;IAC7C,MAAM,CAAC,KAAK,EAAE,CAAC;AACjB,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@goliapkg/sentori-react-native",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "Sentori SDK for React Native
|
|
3
|
+
"version": "0.7.0",
|
|
4
|
+
"description": "Sentori SDK for React Native \u2014 JS-layer error capture, native crash handlers (iOS / Android), batched transport, fetch + react-navigation tracing.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"homepage": "https://sentori.golia.jp",
|
|
7
7
|
"repository": {
|
|
@@ -69,6 +69,6 @@
|
|
|
69
69
|
"access": "public"
|
|
70
70
|
},
|
|
71
71
|
"dependencies": {
|
|
72
|
-
"@goliapkg/sentori-core": "0.
|
|
72
|
+
"@goliapkg/sentori-core": "0.6.0"
|
|
73
73
|
}
|
|
74
74
|
}
|
package/src/capture.ts
CHANGED
|
@@ -1,13 +1,18 @@
|
|
|
1
|
+
import { sealTrail, shouldSample } from '@goliapkg/sentori-core';
|
|
2
|
+
|
|
1
3
|
import { addBreadcrumb, getBreadcrumbs } from './breadcrumbs';
|
|
2
4
|
import { getConfig, isInitialized } from './config';
|
|
3
5
|
import { symbolicateErrorViaMetro } from './handlers/dev-symbolicate';
|
|
4
6
|
import { captureScreenshot } from './handlers/screenshot';
|
|
5
7
|
import { markSessionErrored } from './session-tracker';
|
|
6
8
|
import { parseStack } from './stack';
|
|
9
|
+
import { getTrailBuffer } from './trail';
|
|
7
10
|
import { enqueue, uploadAttachment } from './transport';
|
|
8
11
|
import { uuidV7 } from './uuid';
|
|
9
12
|
import type { App, AttachmentMeta, Device, Event, SentoriError, Tags, User } from './types';
|
|
10
13
|
|
|
14
|
+
export { captureStep, __resetTrailForTests } from './trail';
|
|
15
|
+
|
|
11
16
|
declare const __DEV__: boolean | undefined;
|
|
12
17
|
|
|
13
18
|
let _user: User | null = null;
|
|
@@ -60,6 +65,14 @@ export const captureError = (error: Error, extras?: CaptureExtras): void => {
|
|
|
60
65
|
const config = getConfig();
|
|
61
66
|
if (!config) return;
|
|
62
67
|
|
|
68
|
+
// Phase 44 sub-B: client-side sampling. Skip the whole pipeline
|
|
69
|
+
// (no screenshot capture either) when the sample dice come up
|
|
70
|
+
// wrong. Default rate = null = keep, so existing callers unaffected.
|
|
71
|
+
if (!shouldSample(config.errorSampleRate)) {
|
|
72
|
+
addBreadcrumb({ type: 'custom', data: { reason: 'sampled-out', kind: 'error' } });
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
|
|
63
76
|
const event: Event = {
|
|
64
77
|
id: uuidV7(),
|
|
65
78
|
timestamp: new Date().toISOString(),
|
|
@@ -97,11 +110,49 @@ export const captureError = (error: Error, extras?: CaptureExtras): void => {
|
|
|
97
110
|
if (wantScreenshot) {
|
|
98
111
|
await captureAndAttachScreenshot(event);
|
|
99
112
|
}
|
|
113
|
+
const trail = getTrailBuffer();
|
|
114
|
+
if (config.sessionTrailEnabled && trail.size() > 0) {
|
|
115
|
+
await captureAndAttachSessionTrail(event);
|
|
116
|
+
}
|
|
100
117
|
enqueue(event);
|
|
101
118
|
};
|
|
102
119
|
void pipeline();
|
|
103
120
|
};
|
|
104
121
|
|
|
122
|
+
/**
|
|
123
|
+
* Phase 46 — seal the trail buffer, upload it as a `sessionTrail`
|
|
124
|
+
* attachment, attach the ref. Best-effort: any failure leaves a
|
|
125
|
+
* breadcrumb and lets the event ship without the trail.
|
|
126
|
+
*
|
|
127
|
+
* The trail is **always cleared** after `captureException`, even if
|
|
128
|
+
* upload fails — we don't want a stale 30-step buffer leaking into
|
|
129
|
+
* the next crash's trail.
|
|
130
|
+
*/
|
|
131
|
+
async function captureAndAttachSessionTrail(event: Event): Promise<void> {
|
|
132
|
+
const trail = getTrailBuffer();
|
|
133
|
+
const payload = sealTrail(trail);
|
|
134
|
+
trail.clear();
|
|
135
|
+
const json = JSON.stringify(payload);
|
|
136
|
+
// base64 the JSON for the `data:` URI multipart bridge (same
|
|
137
|
+
// trick the screenshot path uses).
|
|
138
|
+
const base64 =
|
|
139
|
+
typeof globalThis.btoa === 'function'
|
|
140
|
+
? globalThis.btoa(unescape(encodeURIComponent(json)))
|
|
141
|
+
: Buffer.from(json, 'utf-8').toString('base64');
|
|
142
|
+
const attachment = await uploadAttachment(
|
|
143
|
+
event.id,
|
|
144
|
+
'sessionTrail',
|
|
145
|
+
{ base64, mediaType: 'application/json' },
|
|
146
|
+
{ source: 'js' },
|
|
147
|
+
);
|
|
148
|
+
if (!attachment) {
|
|
149
|
+
addBreadcrumb({ type: 'custom', data: { reason: 'session-trail-upload-failed' } });
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
if (!event.attachments) event.attachments = [];
|
|
153
|
+
event.attachments.push(attachment);
|
|
154
|
+
}
|
|
155
|
+
|
|
105
156
|
export const captureException = captureError;
|
|
106
157
|
|
|
107
158
|
/** Phase 42 sub-D.08: per-session screenshot quota gate. */
|
package/src/config.ts
CHANGED
|
@@ -6,6 +6,14 @@ export type Config = {
|
|
|
6
6
|
enabled: boolean;
|
|
7
7
|
/** Phase 42 sub-D.07: opt-in screenshot capture on captureException. */
|
|
8
8
|
screenshotsEnabled: boolean;
|
|
9
|
+
/** Phase 44 sub-B: per-event-class sampling rates 0..1.
|
|
10
|
+
* `null` = keep everything (default). */
|
|
11
|
+
errorSampleRate: null | number;
|
|
12
|
+
traceSampleRate: null | number;
|
|
13
|
+
/** Phase 46: when true, every `captureException` seals the
|
|
14
|
+
* session-trail buffer and uploads it as a `sessionTrail`
|
|
15
|
+
* attachment. Defaults to false. */
|
|
16
|
+
sessionTrailEnabled: boolean;
|
|
9
17
|
};
|
|
10
18
|
|
|
11
19
|
let _config: Config | null = null;
|
package/src/index.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { init } from './init';
|
|
2
2
|
import { addBreadcrumb } from './breadcrumbs';
|
|
3
|
-
import { setUser, getUser, captureError, captureException } from './capture';
|
|
3
|
+
import { setUser, getUser, captureError, captureException, captureStep } from './capture';
|
|
4
4
|
import { ErrorBoundary } from './error-boundary';
|
|
5
5
|
import { MaskRegion, setMaskedNode, unsetMaskedNode } from './mask';
|
|
6
6
|
import {
|
|
@@ -16,6 +16,7 @@ export const sentori = {
|
|
|
16
16
|
getUser,
|
|
17
17
|
captureError,
|
|
18
18
|
captureException,
|
|
19
|
+
captureStep,
|
|
19
20
|
ErrorBoundary,
|
|
20
21
|
MaskRegion,
|
|
21
22
|
setMaskedNode,
|
|
@@ -29,7 +30,13 @@ export default sentori;
|
|
|
29
30
|
|
|
30
31
|
export { init, init as initSentori } from './init';
|
|
31
32
|
export { addBreadcrumb } from './breadcrumbs';
|
|
32
|
-
export {
|
|
33
|
+
export {
|
|
34
|
+
captureError,
|
|
35
|
+
captureException,
|
|
36
|
+
captureStep,
|
|
37
|
+
getUser,
|
|
38
|
+
setUser,
|
|
39
|
+
} from './capture';
|
|
33
40
|
export { ErrorBoundary } from './error-boundary';
|
|
34
41
|
export { MaskRegion, setMaskedNode, unsetMaskedNode } from './mask';
|
|
35
42
|
export {
|
package/src/init.ts
CHANGED
|
@@ -38,6 +38,21 @@ export type InitOptions = {
|
|
|
38
38
|
* installed and `<MaskRegion>` placed over any sensitive UI. The
|
|
39
39
|
* image is webp q=70 480 px max, < 100 KB typical. */
|
|
40
40
|
screenshot?: boolean;
|
|
41
|
+
/** Phase 46: record the last N steps (route changes, custom
|
|
42
|
+
* breadcrumbs) leading up to a crash. On `captureException`
|
|
43
|
+
* the buffer is sealed and uploaded as a `sessionTrail`
|
|
44
|
+
* attachment. Defaults to false. */
|
|
45
|
+
sessionTrail?: boolean;
|
|
46
|
+
};
|
|
47
|
+
/** Phase 44 sub-B: client-side sampling. Each rate is `[0, 1]`;
|
|
48
|
+
* absent / null keeps everything. Defaults to 1.0 for both
|
|
49
|
+
* (no drop). Set traces to e.g. 0.1 once the app's at user
|
|
50
|
+
* volume to keep ingest budget under control without changing
|
|
51
|
+
* the server-side quota. Decisions are made per-event for
|
|
52
|
+
* errors and per-trace (all spans together) for traces. */
|
|
53
|
+
sampling?: {
|
|
54
|
+
errors?: null | number;
|
|
55
|
+
traces?: null | number;
|
|
41
56
|
};
|
|
42
57
|
};
|
|
43
58
|
|
|
@@ -62,6 +77,9 @@ export const init = (options: InitOptions): void => {
|
|
|
62
77
|
ingestUrl: options.ingestUrl ?? DEFAULT_INGEST_URL,
|
|
63
78
|
enabled: true,
|
|
64
79
|
screenshotsEnabled: options.capture?.screenshot === true,
|
|
80
|
+
errorSampleRate: options.sampling?.errors ?? null,
|
|
81
|
+
traceSampleRate: options.sampling?.traces ?? null,
|
|
82
|
+
sessionTrailEnabled: options.capture?.sessionTrail === true,
|
|
65
83
|
});
|
|
66
84
|
|
|
67
85
|
// Tell the native crash handler about the config so the JSON it writes
|
package/src/navigation.ts
CHANGED
|
@@ -24,6 +24,8 @@ import { useEffect, useRef } from 'react';
|
|
|
24
24
|
|
|
25
25
|
import { setActiveSpan, startSpan, type SpanHandle } from '@goliapkg/sentori-core';
|
|
26
26
|
|
|
27
|
+
import { captureStep } from './trail';
|
|
28
|
+
|
|
27
29
|
/** Minimal contract: anything with `addListener('state', cb)` and
|
|
28
30
|
* `getCurrentRoute()` works. The real @react-navigation/native
|
|
29
31
|
* NavigationContainer ref matches this shape. */
|
|
@@ -72,6 +74,12 @@ export function useTraceNavigation(navigationRef: NavigationRefLike): void {
|
|
|
72
74
|
openSpanRef.current = span;
|
|
73
75
|
setActiveSpan(span);
|
|
74
76
|
lastRouteRef.current = to;
|
|
77
|
+
// Phase 46 — record the screen transition into the session trail.
|
|
78
|
+
// No-op when sessionTrail isn't enabled (the buffer just grows
|
|
79
|
+
// unbounded until cleared by captureException, but stays cheap).
|
|
80
|
+
captureStep(`screen:${to}`, {
|
|
81
|
+
breadcrumb: { type: 'navigation', message: from ? `${from} → ${to}` : to },
|
|
82
|
+
});
|
|
75
83
|
};
|
|
76
84
|
|
|
77
85
|
// Open a span for the initial screen so its requests are grouped
|
package/src/trail.ts
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
// Phase 46 — singleton TrailBuffer for the RN SDK.
|
|
2
|
+
//
|
|
3
|
+
// Kept in its own module so callers (including navigation.ts, which
|
|
4
|
+
// is intentionally lightweight) can record steps without pulling in
|
|
5
|
+
// capture.ts → handlers/screenshot.ts → react-native. The buffer is
|
|
6
|
+
// drained inside capture.ts when an event captures and
|
|
7
|
+
// `sessionTrailEnabled` is on.
|
|
8
|
+
|
|
9
|
+
import { TrailBuffer, type TrailStep } from '@goliapkg/sentori-core';
|
|
10
|
+
|
|
11
|
+
const _trail = new TrailBuffer(30);
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Phase 46 — record a step into the session-trail buffer. The buffer
|
|
15
|
+
* is a fixed-size FIFO (default 30 steps); pushing past capacity
|
|
16
|
+
* drops the oldest entry. Steps are only uploaded if
|
|
17
|
+
* `init({ capture: { sessionTrail: true } })` is on AND a
|
|
18
|
+
* `captureException` follows.
|
|
19
|
+
*/
|
|
20
|
+
export const captureStep = (label: string, opts?: Partial<TrailStep>): void => {
|
|
21
|
+
_trail.push({
|
|
22
|
+
ts: Date.now(),
|
|
23
|
+
label,
|
|
24
|
+
...(opts ?? {}),
|
|
25
|
+
});
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
export const getTrailBuffer = (): TrailBuffer => _trail;
|
|
29
|
+
|
|
30
|
+
export const __resetTrailForTests = (): void => {
|
|
31
|
+
_trail.clear();
|
|
32
|
+
};
|