@goliapkg/sentori-react-native 0.3.1 → 0.5.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/ios/PRIVACY_AND_REVIEW.md +122 -0
- package/ios/SentoriHangWatchdog.swift +54 -29
- package/ios/SentoriThreadSampler.swift +149 -0
- package/ios/Tests/SentoriThreadSamplerTests.swift +96 -0
- package/lib/capture.d.ts.map +1 -1
- package/lib/capture.js +4 -0
- package/lib/capture.js.map +1 -1
- package/lib/handlers/lifecycle.d.ts +3 -0
- package/lib/handlers/lifecycle.d.ts.map +1 -0
- package/lib/handlers/lifecycle.js +48 -0
- package/lib/handlers/lifecycle.js.map +1 -0
- package/lib/handlers/network.d.ts.map +1 -1
- package/lib/handlers/network.js +44 -3
- package/lib/handlers/network.js.map +1 -1
- package/lib/index.d.ts +5 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +6 -0
- package/lib/index.js.map +1 -1
- package/lib/native.d.ts +5 -4
- package/lib/native.d.ts.map +1 -1
- package/lib/native.js +5 -4
- package/lib/native.js.map +1 -1
- package/lib/navigation.d.ts +29 -0
- package/lib/navigation.d.ts.map +1 -0
- package/lib/navigation.js +72 -0
- package/lib/navigation.js.map +1 -0
- package/lib/session-tracker.d.ts +6 -0
- package/lib/session-tracker.d.ts.map +1 -0
- package/lib/session-tracker.js +50 -0
- package/lib/session-tracker.js.map +1 -0
- package/lib/transport.d.ts +8 -0
- package/lib/transport.d.ts.map +1 -1
- package/lib/transport.js +23 -0
- package/lib/transport.js.map +1 -1
- package/package.json +3 -3
- package/src/__tests__/navigation.test.ts +148 -0
- package/src/__tests__/tracing.test.ts +108 -0
- package/src/__tests__/transport.test.ts +58 -0
- package/src/capture.ts +4 -0
- package/src/handlers/lifecycle.ts +54 -0
- package/src/handlers/network.ts +48 -3
- package/src/index.ts +14 -0
- package/src/native.ts +11 -8
- package/src/navigation.ts +85 -0
- package/src/session-tracker.ts +53 -0
- package/src/transport.ts +27 -0
package/lib/handlers/network.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { startSpan } from '@goliapkg/sentori-core';
|
|
1
2
|
import { addBreadcrumb } from '../breadcrumbs';
|
|
2
3
|
let _installed = false;
|
|
3
4
|
const AUTH_PARAMS = ['token', 'key', 'password', 'secret', 'access_token'];
|
|
@@ -11,17 +12,33 @@ export const installNetworkHandler = () => {
|
|
|
11
12
|
globalThis.fetch = (async (input, init) => {
|
|
12
13
|
const start = Date.now();
|
|
13
14
|
const url = extractUrl(input);
|
|
15
|
+
const scrubbed = scrubUrl(url);
|
|
14
16
|
const method = (init?.method ??
|
|
15
17
|
(typeof input !== 'string' && 'method' in input
|
|
16
18
|
? input.method
|
|
17
19
|
: 'GET'));
|
|
20
|
+
// Phase 35 sub-C: also open an http.client span so the request
|
|
21
|
+
// shows up in the trace waterfall. Breadcrumbs stay — they're
|
|
22
|
+
// attached to error events at capture time and serve a different
|
|
23
|
+
// surface (the "last 100 things" timeline on the issue page).
|
|
24
|
+
const span = startSpan('http.client', {
|
|
25
|
+
name: `${method.toUpperCase()} ${scrubbed}`,
|
|
26
|
+
tags: { 'http.method': method.toUpperCase(), 'http.url': scrubbed },
|
|
27
|
+
});
|
|
28
|
+
// Inject traceparent header on outbound requests.
|
|
29
|
+
const reqInit = { ...(init ?? {}) };
|
|
30
|
+
const headers = mergeHeaders(input, init);
|
|
31
|
+
headers.set('traceparent', toTraceparent(span.traceId, span.spanId));
|
|
32
|
+
reqInit.headers = headers;
|
|
18
33
|
try {
|
|
19
|
-
const resp = await original(input,
|
|
34
|
+
const resp = await original(input, reqInit);
|
|
35
|
+
span.setTag('http.status', String(resp.status));
|
|
36
|
+
span.finish({ status: resp.status >= 400 ? 'error' : 'ok' });
|
|
20
37
|
addBreadcrumb({
|
|
21
38
|
type: 'net',
|
|
22
39
|
data: {
|
|
23
40
|
method,
|
|
24
|
-
url:
|
|
41
|
+
url: scrubbed,
|
|
25
42
|
status: resp.status,
|
|
26
43
|
durationMs: Date.now() - start,
|
|
27
44
|
},
|
|
@@ -29,11 +46,15 @@ export const installNetworkHandler = () => {
|
|
|
29
46
|
return resp;
|
|
30
47
|
}
|
|
31
48
|
catch (e) {
|
|
49
|
+
const isAbort = isAbortError(e);
|
|
50
|
+
if (e instanceof Error)
|
|
51
|
+
span.setTag('error.message', e.message);
|
|
52
|
+
span.finish({ status: isAbort ? 'cancelled' : 'error' });
|
|
32
53
|
addBreadcrumb({
|
|
33
54
|
type: 'net',
|
|
34
55
|
data: {
|
|
35
56
|
method,
|
|
36
|
-
url:
|
|
57
|
+
url: scrubbed,
|
|
37
58
|
status: 0,
|
|
38
59
|
durationMs: Date.now() - start,
|
|
39
60
|
error: String(e),
|
|
@@ -43,6 +64,26 @@ export const installNetworkHandler = () => {
|
|
|
43
64
|
}
|
|
44
65
|
});
|
|
45
66
|
};
|
|
67
|
+
function mergeHeaders(input, init) {
|
|
68
|
+
const out = new Headers();
|
|
69
|
+
if (typeof input !== 'string' && !(input instanceof URL)) {
|
|
70
|
+
input.headers.forEach((v, k) => out.set(k, v));
|
|
71
|
+
}
|
|
72
|
+
if (init?.headers) {
|
|
73
|
+
new Headers(init.headers).forEach((v, k) => out.set(k, v));
|
|
74
|
+
}
|
|
75
|
+
return out;
|
|
76
|
+
}
|
|
77
|
+
function toTraceparent(traceId, spanId) {
|
|
78
|
+
const trace = traceId.replace(/-/g, '').toLowerCase();
|
|
79
|
+
const parent = spanId.replace(/-/g, '').toLowerCase().slice(0, 16);
|
|
80
|
+
return `00-${trace}-${parent}-01`;
|
|
81
|
+
}
|
|
82
|
+
function isAbortError(err) {
|
|
83
|
+
if (typeof err !== 'object' || err === null)
|
|
84
|
+
return false;
|
|
85
|
+
return err.name === 'AbortError';
|
|
86
|
+
}
|
|
46
87
|
const extractUrl = (input) => {
|
|
47
88
|
if (typeof input === 'string')
|
|
48
89
|
return input;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"network.js","sourceRoot":"","sources":["../../src/handlers/network.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE/C,IAAI,UAAU,GAAG,KAAK,CAAC;AAEvB,MAAM,WAAW,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAC;AAE3E,MAAM,CAAC,MAAM,qBAAqB,GAAG,GAAS,EAAE;IAC9C,IAAI,UAAU;QAAE,OAAO;IACvB,IAAI,OAAO,UAAU,CAAC,KAAK,KAAK,UAAU;QAAE,OAAO;IACnD,UAAU,GAAG,IAAI,CAAC;IAElB,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC;IAElC,UAAU,CAAC,KAAK,GAAG,CAAC,KAAK,EAAE,KAAwB,EAAE,IAAkB,EAAE,EAAE;QACzE,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACzB,MAAM,GAAG,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;QAC9B,MAAM,MAAM,GAAG,CAAC,IAAI,EAAE,MAAM;YAC1B,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,QAAQ,IAAK,KAAiB;gBAC1D,CAAC,CAAE,KAAiB,CAAC,MAAM;gBAC3B,CAAC,CAAC,KAAK,CAAC,CAAW,CAAC;QAExB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"network.js","sourceRoot":"","sources":["../../src/handlers/network.ts"],"names":[],"mappings":"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"}
|
package/lib/index.d.ts
CHANGED
|
@@ -7,6 +7,9 @@ export declare const sentori: {
|
|
|
7
7
|
captureError: (error: Error, extras?: import("./capture").CaptureExtras) => void;
|
|
8
8
|
captureException: (error: Error, extras?: import("./capture").CaptureExtras) => void;
|
|
9
9
|
ErrorBoundary: typeof ErrorBoundary;
|
|
10
|
+
startSession: () => void;
|
|
11
|
+
endSession: (status?: "exited") => void;
|
|
12
|
+
markSessionCrashed: () => void;
|
|
10
13
|
};
|
|
11
14
|
export default sentori;
|
|
12
15
|
export { init, init as initSentori } from './init';
|
|
@@ -14,5 +17,7 @@ export { addBreadcrumb } from './breadcrumbs';
|
|
|
14
17
|
export { setUser, getUser, captureError, captureException } from './capture';
|
|
15
18
|
export { ErrorBoundary } from './error-boundary';
|
|
16
19
|
export { startAnrWatchdog, stopAnrWatchdog, triggerNativeCrash, } from './native';
|
|
20
|
+
export { endSession, markSessionCrashed, startSession, } from './session-tracker';
|
|
21
|
+
export { type NavigationRefLike, useTraceNavigation } from './navigation';
|
|
17
22
|
export type { Event, SentoriError, Frame, Breadcrumb, BreadcrumbType, Device, DeviceOS, App, User, Tags, EventKind, Platform, } from './types';
|
|
18
23
|
//# sourceMappingURL=index.d.ts.map
|
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;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAOjD,eAAO,MAAM,OAAO;;;;;;;;;;;CAWnB,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,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7E,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,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
|
@@ -2,6 +2,7 @@ import { init } from './init';
|
|
|
2
2
|
import { addBreadcrumb } from './breadcrumbs';
|
|
3
3
|
import { setUser, getUser, captureError, captureException } from './capture';
|
|
4
4
|
import { ErrorBoundary } from './error-boundary';
|
|
5
|
+
import { endSession, markSessionCrashed, startSession, } from './session-tracker';
|
|
5
6
|
export const sentori = {
|
|
6
7
|
init,
|
|
7
8
|
addBreadcrumb,
|
|
@@ -10,6 +11,9 @@ export const sentori = {
|
|
|
10
11
|
captureError,
|
|
11
12
|
captureException,
|
|
12
13
|
ErrorBoundary,
|
|
14
|
+
startSession,
|
|
15
|
+
endSession,
|
|
16
|
+
markSessionCrashed,
|
|
13
17
|
};
|
|
14
18
|
export default sentori;
|
|
15
19
|
export { init, init as initSentori } from './init';
|
|
@@ -17,4 +21,6 @@ export { addBreadcrumb } from './breadcrumbs';
|
|
|
17
21
|
export { setUser, getUser, captureError, captureException } from './capture';
|
|
18
22
|
export { ErrorBoundary } from './error-boundary';
|
|
19
23
|
export { startAnrWatchdog, stopAnrWatchdog, triggerNativeCrash, } from './native';
|
|
24
|
+
export { endSession, markSessionCrashed, startSession, } from './session-tracker';
|
|
25
|
+
export { useTraceNavigation } from './navigation';
|
|
20
26
|
//# sourceMappingURL=index.js.map
|
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;AAC7E,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,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,MAAM,WAAW,CAAC;AAC7E,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,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,aAAa;IACb,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,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7E,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,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/native.d.ts
CHANGED
|
@@ -21,14 +21,15 @@ export declare function drainNativePending(): Promise<string[]>;
|
|
|
21
21
|
*/
|
|
22
22
|
export declare function triggerNativeCrash(): void;
|
|
23
23
|
/**
|
|
24
|
-
* Phase 22 sub-D
|
|
24
|
+
* Phase 22 sub-D / sub-E: cross-platform main-thread watchdog.
|
|
25
|
+
* Single JS call covers both Android ANR and iOS hang detection.
|
|
25
26
|
*
|
|
26
|
-
* startAnrWatchdog() //
|
|
27
|
+
* startAnrWatchdog() // platform defaults, prod-only
|
|
27
28
|
* startAnrWatchdog({ force: true }) // include debug builds
|
|
28
29
|
* startAnrWatchdog({ timeoutMs: 3000 }) // tighter threshold
|
|
29
30
|
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
31
|
+
* Defaults: Android 5 s / 1 s tick; iOS 2 s / 1 s tick. Returns
|
|
32
|
+
* silently on web / jest / unsupported runtimes.
|
|
32
33
|
*/
|
|
33
34
|
export declare function startAnrWatchdog(options?: {
|
|
34
35
|
force?: boolean;
|
package/lib/native.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"native.d.ts","sourceRoot":"","sources":["../src/native.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"native.d.ts","sourceRoot":"","sources":["../src/native.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA0CH,wBAAgB,eAAe,CAAC,MAAM,EAAE;IACtC,WAAW,EAAE,MAAM,CAAA;IACnB,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;CACd,GAAG,IAAI,CAMP;AAED,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAQ5D;AAED;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,IAAI,IAAI,CAMzC;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,CAAC,EAAE;IACzC,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,GAAG,IAAI,CAMP;AAED,wBAAgB,eAAe,IAAI,IAAI,CAMtC"}
|
package/lib/native.js
CHANGED
|
@@ -54,14 +54,15 @@ export function triggerNativeCrash() {
|
|
|
54
54
|
}
|
|
55
55
|
}
|
|
56
56
|
/**
|
|
57
|
-
* Phase 22 sub-D
|
|
57
|
+
* Phase 22 sub-D / sub-E: cross-platform main-thread watchdog.
|
|
58
|
+
* Single JS call covers both Android ANR and iOS hang detection.
|
|
58
59
|
*
|
|
59
|
-
* startAnrWatchdog() //
|
|
60
|
+
* startAnrWatchdog() // platform defaults, prod-only
|
|
60
61
|
* startAnrWatchdog({ force: true }) // include debug builds
|
|
61
62
|
* startAnrWatchdog({ timeoutMs: 3000 }) // tighter threshold
|
|
62
63
|
*
|
|
63
|
-
*
|
|
64
|
-
*
|
|
64
|
+
* Defaults: Android 5 s / 1 s tick; iOS 2 s / 1 s tick. Returns
|
|
65
|
+
* silently on web / jest / unsupported runtimes.
|
|
65
66
|
*/
|
|
66
67
|
export function startAnrWatchdog(options) {
|
|
67
68
|
try {
|
package/lib/native.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"native.js","sourceRoot":"","sources":["../src/native.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"native.js","sourceRoot":"","sources":["../src/native.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA2BH,IAAI,OAA+C,CAAA;AAEnD,SAAS,MAAM;IACb,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,OAAO,CAAA;IACzC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,OAAO,CAAC,mBAAmB,CAEvC,CAAA;QACD,OAAO,GAAG,IAAI,CAAC,mBAAmB,CAAsB,SAAS,CAAC,CAAA;IACpE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG,IAAI,CAAA;IAChB,CAAC;IACD,OAAO,OAAO,CAAA;AAChB,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,MAI/B;IACC,IAAI,CAAC;QACH,MAAM,EAAE,EAAE,SAAS,CAAC,MAAM,CAAC,CAAA;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,sBAAsB;IACxB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB;IACtC,MAAM,CAAC,GAAG,MAAM,EAAE,CAAA;IAClB,IAAI,CAAC,CAAC;QAAE,OAAO,EAAE,CAAA;IACjB,IAAI,CAAC;QACH,OAAO,MAAM,CAAC,CAAC,YAAY,EAAE,CAAA;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAA;IACX,CAAC;AACH,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,kBAAkB;IAChC,IAAI,CAAC;QACH,MAAM,EAAE,EAAE,sBAAsB,EAAE,EAAE,CAAA;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,sCAAsC;IACxC,CAAC;AACH,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAIhC;IACC,IAAI,CAAC;QACH,MAAM,EAAE,EAAE,gBAAgB,EAAE,CAAC,OAAO,CAAC,CAAA;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,gCAAgC;IAClC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,IAAI,CAAC;QACH,MAAM,EAAE,EAAE,eAAe,EAAE,EAAE,CAAA;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,SAAS;IACX,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/** Minimal contract: anything with `addListener('state', cb)` and
|
|
2
|
+
* `getCurrentRoute()` works. The real @react-navigation/native
|
|
3
|
+
* NavigationContainer ref matches this shape. */
|
|
4
|
+
export type NavigationRefLike = {
|
|
5
|
+
addListener: (event: 'state', listener: () => void) => () => void;
|
|
6
|
+
getCurrentRoute: () => {
|
|
7
|
+
name: string;
|
|
8
|
+
} | undefined;
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* Subscribe to react-navigation state changes and emit a
|
|
12
|
+
* `react.navigation` span per transition. First mount records the
|
|
13
|
+
* initial route as the start anchor but does NOT emit a span (the
|
|
14
|
+
* convention from `useSentoriRouter` in sentori-react).
|
|
15
|
+
*
|
|
16
|
+
* import { NavigationContainer, useNavigationContainerRef } from '@react-navigation/native'
|
|
17
|
+
* import { useTraceNavigation } from '@goliapkg/sentori-react-native'
|
|
18
|
+
*
|
|
19
|
+
* function App() {
|
|
20
|
+
* const navigationRef = useNavigationContainerRef()
|
|
21
|
+
* useTraceNavigation(navigationRef)
|
|
22
|
+
* return <NavigationContainer ref={navigationRef}>{...}</NavigationContainer>
|
|
23
|
+
* }
|
|
24
|
+
*
|
|
25
|
+
* Each span carries `{ from, to }` as tags and uses the destination
|
|
26
|
+
* route name as the span name.
|
|
27
|
+
*/
|
|
28
|
+
export declare function useTraceNavigation(navigationRef: NavigationRefLike): void;
|
|
29
|
+
//# sourceMappingURL=navigation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"navigation.d.ts","sourceRoot":"","sources":["../src/navigation.ts"],"names":[],"mappings":"AAiBA;;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;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,kBAAkB,CAAC,aAAa,EAAE,iBAAiB,GAAG,IAAI,CAyCzE"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
// Phase 35 sub-C: react-navigation auto-instrumentation.
|
|
2
|
+
//
|
|
3
|
+
// Mount `useTraceNavigation(navigationRef)` next to your
|
|
4
|
+
// `<NavigationContainer ref={navigationRef}>` and every route
|
|
5
|
+
// transition becomes a `react.navigation` span. Span names are
|
|
6
|
+
// `<from> → <to>` so the trace list reads as a navigation log.
|
|
7
|
+
//
|
|
8
|
+
// react-navigation is an OPTIONAL peer dependency — apps that
|
|
9
|
+
// don't use it never have to install it. The hook itself doesn't
|
|
10
|
+
// import from @react-navigation/native; consumers pass in the ref
|
|
11
|
+
// they already have, and we read its state via the public
|
|
12
|
+
// `getCurrentRoute()` API. That keeps the dep edge optional.
|
|
13
|
+
import { useEffect, useRef } from 'react';
|
|
14
|
+
import { startSpan } from '@goliapkg/sentori-core';
|
|
15
|
+
/**
|
|
16
|
+
* Subscribe to react-navigation state changes and emit a
|
|
17
|
+
* `react.navigation` span per transition. First mount records the
|
|
18
|
+
* initial route as the start anchor but does NOT emit a span (the
|
|
19
|
+
* convention from `useSentoriRouter` in sentori-react).
|
|
20
|
+
*
|
|
21
|
+
* import { NavigationContainer, useNavigationContainerRef } from '@react-navigation/native'
|
|
22
|
+
* import { useTraceNavigation } from '@goliapkg/sentori-react-native'
|
|
23
|
+
*
|
|
24
|
+
* function App() {
|
|
25
|
+
* const navigationRef = useNavigationContainerRef()
|
|
26
|
+
* useTraceNavigation(navigationRef)
|
|
27
|
+
* return <NavigationContainer ref={navigationRef}>{...}</NavigationContainer>
|
|
28
|
+
* }
|
|
29
|
+
*
|
|
30
|
+
* Each span carries `{ from, to }` as tags and uses the destination
|
|
31
|
+
* route name as the span name.
|
|
32
|
+
*/
|
|
33
|
+
export function useTraceNavigation(navigationRef) {
|
|
34
|
+
// Latest route name we've observed. `null` means "no transition
|
|
35
|
+
// recorded yet" (initial mount).
|
|
36
|
+
const lastRouteRef = useRef(null);
|
|
37
|
+
// Span that started when this route was entered. Finished when the
|
|
38
|
+
// NEXT route transition arrives.
|
|
39
|
+
const openSpanRef = useRef(null);
|
|
40
|
+
useEffect(() => {
|
|
41
|
+
if (typeof navigationRef.addListener !== 'function')
|
|
42
|
+
return;
|
|
43
|
+
if (typeof navigationRef.getCurrentRoute !== 'function')
|
|
44
|
+
return;
|
|
45
|
+
// Seed the "last route" reference from the current state so the
|
|
46
|
+
// first transition emits a span with the right `from`.
|
|
47
|
+
const initial = navigationRef.getCurrentRoute()?.name ?? null;
|
|
48
|
+
lastRouteRef.current = initial;
|
|
49
|
+
const unsubscribe = navigationRef.addListener('state', () => {
|
|
50
|
+
const next = navigationRef.getCurrentRoute()?.name ?? null;
|
|
51
|
+
const prev = lastRouteRef.current;
|
|
52
|
+
if (next === null || next === prev)
|
|
53
|
+
return;
|
|
54
|
+
// Close the prior span (if any) before opening the new one so
|
|
55
|
+
// the trace looks like a sequence, not nested.
|
|
56
|
+
openSpanRef.current?.finish({ status: 'ok' });
|
|
57
|
+
const span = startSpan('react.navigation', {
|
|
58
|
+
name: prev ? `${prev} → ${next}` : next,
|
|
59
|
+
tags: { 'nav.from': prev ?? '', 'nav.to': next },
|
|
60
|
+
});
|
|
61
|
+
openSpanRef.current = span;
|
|
62
|
+
lastRouteRef.current = next;
|
|
63
|
+
});
|
|
64
|
+
return () => {
|
|
65
|
+
unsubscribe();
|
|
66
|
+
// Close any still-open span on unmount so we don't leak it.
|
|
67
|
+
openSpanRef.current?.finish({ status: 'ok' });
|
|
68
|
+
openSpanRef.current = null;
|
|
69
|
+
};
|
|
70
|
+
}, [navigationRef]);
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=navigation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"navigation.js","sourceRoot":"","sources":["../src/navigation.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,EAAE;AACF,yDAAyD;AACzD,8DAA8D;AAC9D,+DAA+D;AAC/D,+DAA+D;AAC/D,EAAE;AACF,8DAA8D;AAC9D,iEAAiE;AACjE,kEAAkE;AAClE,0DAA0D;AAC1D,6DAA6D;AAE7D,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAE1C,OAAO,EAAE,SAAS,EAAmB,MAAM,wBAAwB,CAAC;AAUpE;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,kBAAkB,CAAC,aAAgC;IACjE,gEAAgE;IAChE,iCAAiC;IACjC,MAAM,YAAY,GAAG,MAAM,CAAgB,IAAI,CAAC,CAAC;IACjD,mEAAmE;IACnE,iCAAiC;IACjC,MAAM,WAAW,GAAG,MAAM,CAAoB,IAAI,CAAC,CAAC;IAEpD,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,OAAO,aAAa,CAAC,WAAW,KAAK,UAAU;YAAE,OAAO;QAC5D,IAAI,OAAO,aAAa,CAAC,eAAe,KAAK,UAAU;YAAE,OAAO;QAEhE,gEAAgE;QAChE,uDAAuD;QACvD,MAAM,OAAO,GAAG,aAAa,CAAC,eAAe,EAAE,EAAE,IAAI,IAAI,IAAI,CAAC;QAC9D,YAAY,CAAC,OAAO,GAAG,OAAO,CAAC;QAE/B,MAAM,WAAW,GAAG,aAAa,CAAC,WAAW,CAAC,OAAO,EAAE,GAAG,EAAE;YAC1D,MAAM,IAAI,GAAG,aAAa,CAAC,eAAe,EAAE,EAAE,IAAI,IAAI,IAAI,CAAC;YAC3D,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC;YAClC,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI;gBAAE,OAAO;YAE3C,8DAA8D;YAC9D,+CAA+C;YAC/C,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;YAE9C,MAAM,IAAI,GAAG,SAAS,CAAC,kBAAkB,EAAE;gBACzC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI;gBACvC,IAAI,EAAE,EAAE,UAAU,EAAE,IAAI,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE;aACjD,CAAC,CAAC;YACH,WAAW,CAAC,OAAO,GAAG,IAAI,CAAC;YAC3B,YAAY,CAAC,OAAO,GAAG,IAAI,CAAC;QAC9B,CAAC,CAAC,CAAC;QAEH,OAAO,GAAG,EAAE;YACV,WAAW,EAAE,CAAC;YACd,4DAA4D;YAC5D,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;YAC9C,WAAW,CAAC,OAAO,GAAG,IAAI,CAAC;QAC7B,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC;AACtB,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare const startSession: () => void;
|
|
2
|
+
export declare const endSession: (status?: "exited") => void;
|
|
3
|
+
export declare const markSessionErrored: () => void;
|
|
4
|
+
export declare const markSessionCrashed: () => void;
|
|
5
|
+
export declare const __resetSessionForTests: () => void;
|
|
6
|
+
//# sourceMappingURL=session-tracker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-tracker.d.ts","sourceRoot":"","sources":["../src/session-tracker.ts"],"names":[],"mappings":"AA0BA,eAAO,MAAM,YAAY,QAAO,IAS/B,CAAC;AAEF,eAAO,MAAM,UAAU,GAAI,SAAS,QAAQ,KAAG,IAG9C,CAAC;AAEF,eAAO,MAAM,kBAAkB,QAAO,IAErC,CAAC;AAEF,eAAO,MAAM,kBAAkB,QAAO,IAErC,CAAC;AAEF,eAAO,MAAM,sBAAsB,QAAO,IAEzC,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Phase 26 sub-B: RN session tracker glue.
|
|
3
|
+
*
|
|
4
|
+
* Mirrors the JS SDK's session-tracker but sends through the RN
|
|
5
|
+
* transport. AppState binding lives in `handlers/lifecycle.ts`; this
|
|
6
|
+
* file is just the singleton + the start/end/markErrored/markCrashed
|
|
7
|
+
* surface.
|
|
8
|
+
*/
|
|
9
|
+
import { SessionTracker } from '@goliapkg/sentori-core';
|
|
10
|
+
import { getConfig } from './config';
|
|
11
|
+
import { getUser } from './capture';
|
|
12
|
+
import { sendSessionPing } from './transport';
|
|
13
|
+
let _tracker = null;
|
|
14
|
+
const tracker = () => {
|
|
15
|
+
if (_tracker)
|
|
16
|
+
return _tracker;
|
|
17
|
+
_tracker = new SessionTracker((ping) => {
|
|
18
|
+
const cfg = getConfig();
|
|
19
|
+
if (!cfg)
|
|
20
|
+
return;
|
|
21
|
+
void sendSessionPing(cfg.ingestUrl, cfg.token, ping);
|
|
22
|
+
});
|
|
23
|
+
return _tracker;
|
|
24
|
+
};
|
|
25
|
+
export const startSession = () => {
|
|
26
|
+
const cfg = getConfig();
|
|
27
|
+
if (!cfg)
|
|
28
|
+
return;
|
|
29
|
+
const user = getUser();
|
|
30
|
+
tracker().start({
|
|
31
|
+
environment: cfg.environment,
|
|
32
|
+
release: cfg.release,
|
|
33
|
+
userId: user?.id ?? null,
|
|
34
|
+
});
|
|
35
|
+
};
|
|
36
|
+
export const endSession = (status) => {
|
|
37
|
+
if (!_tracker)
|
|
38
|
+
return;
|
|
39
|
+
_tracker.end(status);
|
|
40
|
+
};
|
|
41
|
+
export const markSessionErrored = () => {
|
|
42
|
+
_tracker?.markErrored();
|
|
43
|
+
};
|
|
44
|
+
export const markSessionCrashed = () => {
|
|
45
|
+
_tracker?.markCrashed();
|
|
46
|
+
};
|
|
47
|
+
export const __resetSessionForTests = () => {
|
|
48
|
+
_tracker = null;
|
|
49
|
+
};
|
|
50
|
+
//# sourceMappingURL=session-tracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-tracker.js","sourceRoot":"","sources":["../src/session-tracker.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,IAAI,QAAQ,GAA0B,IAAI,CAAC;AAE3C,MAAM,OAAO,GAAG,GAAmB,EAAE;IACnC,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC9B,QAAQ,GAAG,IAAI,cAAc,CAAC,CAAC,IAAI,EAAE,EAAE;QACrC,MAAM,GAAG,GAAG,SAAS,EAAE,CAAC;QACxB,IAAI,CAAC,GAAG;YAAE,OAAO;QACjB,KAAK,eAAe,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IACH,OAAO,QAAQ,CAAC;AAClB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,GAAS,EAAE;IACrC,MAAM,GAAG,GAAG,SAAS,EAAE,CAAC;IACxB,IAAI,CAAC,GAAG;QAAE,OAAO;IACjB,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,OAAO,EAAE,CAAC,KAAK,CAAC;QACd,WAAW,EAAE,GAAG,CAAC,WAAW;QAC5B,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,MAAM,EAAE,IAAI,EAAE,EAAE,IAAI,IAAI;KACzB,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,MAAiB,EAAQ,EAAE;IACpD,IAAI,CAAC,QAAQ;QAAE,OAAO;IACtB,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AACvB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAS,EAAE;IAC3C,QAAQ,EAAE,WAAW,EAAE,CAAC;AAC1B,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAS,EAAE;IAC3C,QAAQ,EAAE,WAAW,EAAE,CAAC;AAC1B,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAG,GAAS,EAAE;IAC/C,QAAQ,GAAG,IAAI,CAAC;AAClB,CAAC,CAAC"}
|
package/lib/transport.d.ts
CHANGED
|
@@ -5,4 +5,12 @@ export declare const flush: () => Promise<void>;
|
|
|
5
5
|
export declare const drainOfflineQueue: () => Promise<void>;
|
|
6
6
|
export declare const __resetForTests: () => void;
|
|
7
7
|
export declare const __peekQueue: () => readonly Event[];
|
|
8
|
+
/**
|
|
9
|
+
* Phase 26 sub-B: session ping transport. Best-effort; we don't queue
|
|
10
|
+
* pings the way we queue events because they fire on background and
|
|
11
|
+
* AsyncStorage writes during background can be killed by the OS. If
|
|
12
|
+
* the network's down, the ping is lost — the session counters tolerate
|
|
13
|
+
* this.
|
|
14
|
+
*/
|
|
15
|
+
export declare const sendSessionPing: (ingestUrl: string, token: string, ping: unknown) => Promise<void>;
|
|
8
16
|
//# sourceMappingURL=transport.d.ts.map
|
package/lib/transport.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAcrC,eAAO,MAAM,OAAO,GAAI,OAAO,KAAK,KAAG,IAUtC,CAAC;AAEF,eAAO,MAAM,cAAc,QAAO,IAEjC,CAAC;AAEF,eAAO,MAAM,KAAK,QAAa,OAAO,CAAC,IAAI,CAkB1C,CAAC;AA4FF,eAAO,MAAM,iBAAiB,QAAa,OAAO,CAAC,IAAI,CAatD,CAAC;AAEF,eAAO,MAAM,eAAe,QAAO,IAKlC,CAAC;AAEF,eAAO,MAAM,WAAW,QAAO,SAAS,KAAK,EAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAcrC,eAAO,MAAM,OAAO,GAAI,OAAO,KAAK,KAAG,IAUtC,CAAC;AAEF,eAAO,MAAM,cAAc,QAAO,IAEjC,CAAC;AAEF,eAAO,MAAM,KAAK,QAAa,OAAO,CAAC,IAAI,CAkB1C,CAAC;AA4FF,eAAO,MAAM,iBAAiB,QAAa,OAAO,CAAC,IAAI,CAatD,CAAC;AAEF,eAAO,MAAM,eAAe,QAAO,IAKlC,CAAC;AAEF,eAAO,MAAM,WAAW,QAAO,SAAS,KAAK,EAAY,CAAC;AAE1D;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,GAC1B,WAAW,MAAM,EACjB,OAAO,MAAM,EACb,MAAM,OAAO,KACZ,OAAO,CAAC,IAAI,CAcd,CAAC"}
|
package/lib/transport.js
CHANGED
|
@@ -140,4 +140,27 @@ export const __resetForTests = () => {
|
|
|
140
140
|
_started = false;
|
|
141
141
|
};
|
|
142
142
|
export const __peekQueue = () => _queue;
|
|
143
|
+
/**
|
|
144
|
+
* Phase 26 sub-B: session ping transport. Best-effort; we don't queue
|
|
145
|
+
* pings the way we queue events because they fire on background and
|
|
146
|
+
* AsyncStorage writes during background can be killed by the OS. If
|
|
147
|
+
* the network's down, the ping is lost — the session counters tolerate
|
|
148
|
+
* this.
|
|
149
|
+
*/
|
|
150
|
+
export const sendSessionPing = async (ingestUrl, token, ping) => {
|
|
151
|
+
try {
|
|
152
|
+
await fetch(`${ingestUrl}/v1/sessions`, {
|
|
153
|
+
body: JSON.stringify(ping),
|
|
154
|
+
headers: {
|
|
155
|
+
Authorization: `Bearer ${token}`,
|
|
156
|
+
'Content-Type': 'application/json',
|
|
157
|
+
'Sentori-Sdk': `react-native/${SDK_VERSION}`,
|
|
158
|
+
},
|
|
159
|
+
method: 'POST',
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
catch {
|
|
163
|
+
// best-effort
|
|
164
|
+
}
|
|
165
|
+
};
|
|
143
166
|
//# sourceMappingURL=transport.js.map
|
package/lib/transport.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transport.js","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"transport.js","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"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"}
|
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.5.0",
|
|
4
|
+
"description": "Sentori SDK for React Native — 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": {
|
|
@@ -64,6 +64,6 @@
|
|
|
64
64
|
"access": "public"
|
|
65
65
|
},
|
|
66
66
|
"dependencies": {
|
|
67
|
-
"@goliapkg/sentori-core": "0.
|
|
67
|
+
"@goliapkg/sentori-core": "0.3.0"
|
|
68
68
|
}
|
|
69
69
|
}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import { clearSpans, drainSpans } from '@goliapkg/sentori-core';
|
|
2
|
+
import { afterEach, beforeEach, describe, expect, test } from 'bun:test';
|
|
3
|
+
|
|
4
|
+
import { type NavigationRefLike, useTraceNavigation } from '../navigation';
|
|
5
|
+
|
|
6
|
+
// We test the hook without a React renderer (sdk/react-native has no
|
|
7
|
+
// react-test-renderer or @testing-library dev-dep). Instead, we drive
|
|
8
|
+
// the same lifecycle by hand: the hook is a one-line useEffect, so
|
|
9
|
+
// we extract its effect body via a tiny harness that mirrors the
|
|
10
|
+
// observable behaviour.
|
|
11
|
+
|
|
12
|
+
// FakeNav mirrors @react-navigation/native's NavigationContainerRef
|
|
13
|
+
// surface — `addListener('state', cb)` + `getCurrentRoute()`.
|
|
14
|
+
class FakeNav implements NavigationRefLike {
|
|
15
|
+
private listeners: Array<() => void> = [];
|
|
16
|
+
private route: { name: string } | undefined;
|
|
17
|
+
|
|
18
|
+
setInitialRoute(name: string): void {
|
|
19
|
+
this.route = { name };
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
addListener(_event: 'state', listener: () => void): () => void {
|
|
23
|
+
this.listeners.push(listener);
|
|
24
|
+
return () => {
|
|
25
|
+
this.listeners = this.listeners.filter((l) => l !== listener);
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
getCurrentRoute(): { name: string } | undefined {
|
|
30
|
+
return this.route;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
go(name: string): void {
|
|
34
|
+
this.route = { name };
|
|
35
|
+
this.listeners.forEach((l) => l());
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// Re-implements the hook's effect body for test purposes. Mirroring
|
|
40
|
+
// the real hook 1:1 — when production code changes, this changes too.
|
|
41
|
+
// The point isn't to share the implementation but to verify the
|
|
42
|
+
// observable contract (spans pushed in the right order).
|
|
43
|
+
function harness(navigationRef: NavigationRefLike): () => void {
|
|
44
|
+
let lastRoute: null | string =
|
|
45
|
+
navigationRef.getCurrentRoute()?.name ?? null;
|
|
46
|
+
let openSpan: ReturnType<typeof import('@goliapkg/sentori-core').startSpan> | null = null;
|
|
47
|
+
|
|
48
|
+
// Inline import to avoid hoisting.
|
|
49
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
50
|
+
const { startSpan } = require('@goliapkg/sentori-core') as typeof import('@goliapkg/sentori-core');
|
|
51
|
+
|
|
52
|
+
const unsub = navigationRef.addListener('state', () => {
|
|
53
|
+
const next = navigationRef.getCurrentRoute()?.name ?? null;
|
|
54
|
+
if (next === null || next === lastRoute) return;
|
|
55
|
+
|
|
56
|
+
openSpan?.finish({ status: 'ok' });
|
|
57
|
+
const span = startSpan('react.navigation', {
|
|
58
|
+
name: lastRoute ? `${lastRoute} → ${next}` : next,
|
|
59
|
+
tags: { 'nav.from': lastRoute ?? '', 'nav.to': next },
|
|
60
|
+
});
|
|
61
|
+
openSpan = span;
|
|
62
|
+
lastRoute = next;
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
return () => {
|
|
66
|
+
unsub();
|
|
67
|
+
openSpan?.finish({ status: 'ok' });
|
|
68
|
+
openSpan = null;
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
beforeEach(() => clearSpans());
|
|
73
|
+
afterEach(() => clearSpans());
|
|
74
|
+
|
|
75
|
+
describe('useTraceNavigation', () => {
|
|
76
|
+
test('hook + production module both export', () => {
|
|
77
|
+
// Sanity: the exported symbol exists with the right shape.
|
|
78
|
+
expect(typeof useTraceNavigation).toBe('function');
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
test('initial mount does NOT emit a span', () => {
|
|
82
|
+
const nav = new FakeNav();
|
|
83
|
+
nav.setInitialRoute('Home');
|
|
84
|
+
const cleanup = harness(nav);
|
|
85
|
+
expect(drainSpans()).toHaveLength(0);
|
|
86
|
+
cleanup();
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
test('one transition + one more closes the first span', () => {
|
|
90
|
+
const nav = new FakeNav();
|
|
91
|
+
nav.setInitialRoute('Home');
|
|
92
|
+
const cleanup = harness(nav);
|
|
93
|
+
|
|
94
|
+
nav.go('Settings');
|
|
95
|
+
nav.go('Profile');
|
|
96
|
+
|
|
97
|
+
const spans = drainSpans();
|
|
98
|
+
expect(spans.length).toBeGreaterThanOrEqual(1);
|
|
99
|
+
const first = spans[0]!;
|
|
100
|
+
expect(first.op).toBe('react.navigation');
|
|
101
|
+
expect(first.name).toBe('Home → Settings');
|
|
102
|
+
expect(first.tags).toEqual({ 'nav.from': 'Home', 'nav.to': 'Settings' });
|
|
103
|
+
expect(first.status).toBe('ok');
|
|
104
|
+
|
|
105
|
+
cleanup();
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
test('same-route state event does not emit a span', () => {
|
|
109
|
+
const nav = new FakeNav();
|
|
110
|
+
nav.setInitialRoute('Home');
|
|
111
|
+
const cleanup = harness(nav);
|
|
112
|
+
|
|
113
|
+
nav.go('Home');
|
|
114
|
+
expect(drainSpans()).toHaveLength(0);
|
|
115
|
+
|
|
116
|
+
cleanup();
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
test('chained transitions emit per-hop spans', () => {
|
|
120
|
+
const nav = new FakeNav();
|
|
121
|
+
nav.setInitialRoute('A');
|
|
122
|
+
const cleanup = harness(nav);
|
|
123
|
+
|
|
124
|
+
nav.go('B');
|
|
125
|
+
nav.go('C');
|
|
126
|
+
nav.go('D');
|
|
127
|
+
|
|
128
|
+
const spans = drainSpans();
|
|
129
|
+
expect(spans.length).toBeGreaterThanOrEqual(2);
|
|
130
|
+
expect(spans[0]?.name).toBe('A → B');
|
|
131
|
+
expect(spans[1]?.name).toBe('B → C');
|
|
132
|
+
|
|
133
|
+
cleanup();
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
test('cleanup closes the still-open span', () => {
|
|
137
|
+
const nav = new FakeNav();
|
|
138
|
+
nav.setInitialRoute('Home');
|
|
139
|
+
const cleanup = harness(nav);
|
|
140
|
+
|
|
141
|
+
nav.go('Settings');
|
|
142
|
+
cleanup();
|
|
143
|
+
|
|
144
|
+
const spans = drainSpans();
|
|
145
|
+
expect(spans).toHaveLength(1);
|
|
146
|
+
expect(spans[0]?.name).toBe('Home → Settings');
|
|
147
|
+
});
|
|
148
|
+
});
|