@goliapkg/sentori-react-native 0.9.8 → 0.9.10
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/expo-module.config.json +2 -1
- package/lib/native.d.ts +7 -0
- package/lib/native.d.ts.map +1 -1
- package/lib/native.js +51 -6
- package/lib/native.js.map +1 -1
- package/lib/replay.d.ts.map +1 -1
- package/lib/replay.js +17 -7
- package/lib/replay.js.map +1 -1
- package/package.json +1 -1
- package/src/native.ts +69 -4
- package/src/replay.ts +25 -7
package/expo-module.config.json
CHANGED
package/lib/native.d.ts
CHANGED
|
@@ -72,4 +72,11 @@ export declare function captureNativeScreenshotWithMask(maskedIds: string[]): Pr
|
|
|
72
72
|
base64: string;
|
|
73
73
|
mediaType: string;
|
|
74
74
|
}>;
|
|
75
|
+
/** v0.9.9 — diagnostic peek used by the wireframe replay tick. Same
|
|
76
|
+
* four-way distinction as captureNativeScreenshotWithMask. Logged at
|
|
77
|
+
* most once per `startReplay()` (the wrapper in replay.ts gates). */
|
|
78
|
+
export declare function describeWireframeNative(): {
|
|
79
|
+
bound: boolean;
|
|
80
|
+
hasCaptureWireframe: boolean;
|
|
81
|
+
};
|
|
75
82
|
//# sourceMappingURL=native.d.ts.map
|
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;AAgHH,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;AAED,+DAA+D;AAC/D,wBAAgB,uBAAuB,IAAI,IAAI,CAM9C;AAED,yEAAyE;AACzE,wBAAgB,oBAAoB,IAAI,IAAI,GAAG,MAAM,CAOpD;AAED,oEAAoE;AACpE,wBAAgB,sBAAsB,IAAI,IAAI,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAMhF;AAED,iEAAiE;AACjE,wBAAgB,wBAAwB,IAAI,IAAI,CAM/C;AAED;;yBAEyB;AACzB,wBAAgB,wBAAwB,IAAI,IAAI,GAAG;IACjD,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,EAAE,CAAA;CAChB,CAMA;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,+BAA+B,CACnD,SAAS,EAAE,MAAM,EAAE,GAClB,OAAO,CAAC,IAAI,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CAoCvD;AAED;;sEAEsE;AACtE,wBAAgB,uBAAuB,IAAI;IACzC,KAAK,EAAE,OAAO,CAAA;IACd,mBAAmB,EAAE,OAAO,CAAA;CAC7B,CAMA"}
|
package/lib/native.js
CHANGED
|
@@ -10,9 +10,23 @@ function native() {
|
|
|
10
10
|
try {
|
|
11
11
|
const core = require('expo-modules-core');
|
|
12
12
|
_native = core.requireNativeModule('Sentori');
|
|
13
|
-
|
|
14
|
-
|
|
13
|
+
if (typeof __DEV__ !== 'undefined' && __DEV__ && _native !== null) {
|
|
14
|
+
// v0.9.9 — Insight asked for "tell me exactly which functions
|
|
15
|
+
// the iOS pod is currently exposing." Logged once per process
|
|
16
|
+
// (the cached _native short-circuits subsequent calls). Helps
|
|
17
|
+
// distinguish "pod is stale" from "method exists but throws
|
|
18
|
+
// at runtime" in one log line.
|
|
19
|
+
const keys = Object.keys(_native).sort();
|
|
20
|
+
// eslint-disable-next-line no-console
|
|
21
|
+
console.warn('[sentori] native module bound; exposed methods:', keys.join(', ') || '(none)');
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
catch (e) {
|
|
15
25
|
_native = null;
|
|
26
|
+
if (typeof __DEV__ !== 'undefined' && __DEV__) {
|
|
27
|
+
// eslint-disable-next-line no-console
|
|
28
|
+
console.warn('[sentori] requireNativeModule("Sentori") threw', e);
|
|
29
|
+
}
|
|
16
30
|
}
|
|
17
31
|
return _native;
|
|
18
32
|
}
|
|
@@ -141,13 +155,44 @@ export function getRecentNativeException() {
|
|
|
141
155
|
*/
|
|
142
156
|
export async function captureNativeScreenshotWithMask(maskedIds) {
|
|
143
157
|
const n = native();
|
|
144
|
-
if (!n
|
|
158
|
+
if (!n) {
|
|
159
|
+
if (typeof __DEV__ !== 'undefined' && __DEV__) {
|
|
160
|
+
// eslint-disable-next-line no-console
|
|
161
|
+
console.warn('[sentori] native module not bound — requireNativeModule("Sentori") threw');
|
|
162
|
+
}
|
|
145
163
|
return null;
|
|
146
|
-
try {
|
|
147
|
-
return await n.captureScreenshotWithMask(maskedIds);
|
|
148
164
|
}
|
|
149
|
-
|
|
165
|
+
if (!n.captureScreenshotWithMask) {
|
|
166
|
+
if (typeof __DEV__ !== 'undefined' && __DEV__) {
|
|
167
|
+
// eslint-disable-next-line no-console
|
|
168
|
+
console.warn('[sentori] native.captureScreenshotWithMask missing — pod install may be stale');
|
|
169
|
+
}
|
|
150
170
|
return null;
|
|
151
171
|
}
|
|
172
|
+
try {
|
|
173
|
+
const r = await n.captureScreenshotWithMask(maskedIds);
|
|
174
|
+
if (!r && typeof __DEV__ !== 'undefined' && __DEV__) {
|
|
175
|
+
// eslint-disable-next-line no-console
|
|
176
|
+
console.warn('[sentori] native screenshot returned null — no key window / render failed');
|
|
177
|
+
}
|
|
178
|
+
return r;
|
|
179
|
+
}
|
|
180
|
+
catch (e) {
|
|
181
|
+
if (typeof __DEV__ !== 'undefined' && __DEV__) {
|
|
182
|
+
// eslint-disable-next-line no-console
|
|
183
|
+
console.warn('[sentori] native screenshot threw', e);
|
|
184
|
+
}
|
|
185
|
+
return null;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
/** v0.9.9 — diagnostic peek used by the wireframe replay tick. Same
|
|
189
|
+
* four-way distinction as captureNativeScreenshotWithMask. Logged at
|
|
190
|
+
* most once per `startReplay()` (the wrapper in replay.ts gates). */
|
|
191
|
+
export function describeWireframeNative() {
|
|
192
|
+
const n = native();
|
|
193
|
+
return {
|
|
194
|
+
bound: n !== null,
|
|
195
|
+
hasCaptureWireframe: Boolean(n?.captureWireframe),
|
|
196
|
+
};
|
|
152
197
|
}
|
|
153
198
|
//# sourceMappingURL=native.js.map
|
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":"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"}
|
package/lib/replay.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"replay.d.ts","sourceRoot":"","sources":["../src/replay.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"replay.d.ts","sourceRoot":"","sources":["../src/replay.ts"],"names":[],"mappings":"AA8CA,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,CAAC,EAAE,KAAK,GAAG,WAAW,CAAC;IAC3B,mCAAmC;IACnC,EAAE,CAAC,EAAE,MAAM,CAAC;CACb,CAAC;AAEF,wBAAgB,WAAW,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI,CAkCrD;AAED,wBAAgB,UAAU,IAAI,IAAI,CAOjC;AA6CD;;2BAE2B;AAC3B,wBAAgB,WAAW,IAAI,MAAM,CAKpC;AAED,wBAAgB,qBAAqB,IAAI,IAAI,CAG5C"}
|
package/lib/replay.js
CHANGED
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
// screenshot strip.
|
|
19
19
|
import { startSpan } from '@goliapkg/sentori-core';
|
|
20
20
|
import { getRegisteredMaskQuery } from './mask';
|
|
21
|
-
import {
|
|
21
|
+
import { describeWireframeNative } from './native';
|
|
22
22
|
const TICK_INTERVAL_MS = 1000;
|
|
23
23
|
const RING_SIZE = 60;
|
|
24
24
|
/** Floor on tick period. < 250 ms (4 Hz) the native view-tree walk
|
|
@@ -40,14 +40,24 @@ export function startReplay(opts) {
|
|
|
40
40
|
return;
|
|
41
41
|
if (opts.mode !== 'wireframe')
|
|
42
42
|
return;
|
|
43
|
-
//
|
|
44
|
-
//
|
|
45
|
-
//
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
43
|
+
// v0.9.10 — gate via expo-modules-core's registry (same path the
|
|
44
|
+
// screenshot capture uses). The previous `isNativeModuleLinked`
|
|
45
|
+
// check looked at the legacy `RN.NativeModules` map, but the
|
|
46
|
+
// Sentori module is registered through expo-modules-core; the
|
|
47
|
+
// legacy map never sees it, so this branch returned "not linked"
|
|
48
|
+
// forever even with the pod correctly attached (Insight 2026-05-17).
|
|
49
|
+
const info = describeWireframeNative();
|
|
50
|
+
if (!info.bound) {
|
|
51
|
+
if (typeof __DEV__ !== 'undefined' && __DEV__) {
|
|
52
|
+
// eslint-disable-next-line no-console
|
|
53
|
+
console.warn('[sentori] replay: Sentori native module not bound (expo-modules-core) — replay attachments will stay empty');
|
|
54
|
+
}
|
|
49
55
|
return;
|
|
50
56
|
}
|
|
57
|
+
if (typeof __DEV__ !== 'undefined' && __DEV__) {
|
|
58
|
+
// eslint-disable-next-line no-console
|
|
59
|
+
console.warn('[sentori] replay: starting', 'bound=', info.bound, 'hasCaptureWireframe=', info.hasCaptureWireframe);
|
|
60
|
+
}
|
|
51
61
|
_running = true;
|
|
52
62
|
_nativeMod = loadNativeReplay();
|
|
53
63
|
const period = Math.max(MIN_TICK_PERIOD_MS, Math.floor(TICK_INTERVAL_MS / (opts.hz ?? 1)));
|
package/lib/replay.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"replay.js","sourceRoot":"","sources":["../src/replay.ts"],"names":[],"mappings":"AAAA,mDAAmD;AACnD,EAAE;AACF,mEAAmE;AACnE,mEAAmE;AACnE,kEAAkE;AAClE,kEAAkE;AAClE,4DAA4D;AAC5D,EAAE;AACF,gCAAgC;AAChC,kEAAkE;AAClE,iEAAiE;AACjE,+DAA+D;AAC/D,6DAA6D;AAC7D,wDAAwD;AACxD,iEAAiE;AACjE,iEAAiE;AACjE,4DAA4D;AAC5D,wBAAwB;AAExB,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAEnD,OAAO,EAAE,sBAAsB,EAAE,MAAM,QAAQ,CAAC;AAChD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"replay.js","sourceRoot":"","sources":["../src/replay.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@goliapkg/sentori-react-native",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.10",
|
|
4
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",
|
package/src/native.ts
CHANGED
|
@@ -4,6 +4,8 @@
|
|
|
4
4
|
* this keeps the SDK usable in pure-JS environments (jest, bun test, web).
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
+
declare const __DEV__: boolean | undefined
|
|
8
|
+
|
|
7
9
|
type SentoriNativeModule = {
|
|
8
10
|
drainPending: () => Promise<string[]>
|
|
9
11
|
setConfig: (config: {
|
|
@@ -58,6 +60,13 @@ type SentoriNativeModule = {
|
|
|
58
60
|
captureScreenshotWithMask?: (
|
|
59
61
|
maskedIds: string[],
|
|
60
62
|
) => Promise<null | { base64: string; mediaType: string }>
|
|
63
|
+
/**
|
|
64
|
+
* v0.9.6 #2 — wireframe view-tree snapshot. iOS walks the
|
|
65
|
+
* UIView hierarchy, paints each node as a rect/text descriptor,
|
|
66
|
+
* intersects with masked nativeIDs. Returns an NDJSON-shaped
|
|
67
|
+
* snapshot string or null on failure.
|
|
68
|
+
*/
|
|
69
|
+
captureWireframe?: (maskedIds: string[]) => null | string
|
|
61
70
|
/**
|
|
62
71
|
* Phase 22 sub-D / sub-E: cross-platform main-thread watchdog.
|
|
63
72
|
* Android: 5 s / 1 s defaults (matches the OS ANR threshold).
|
|
@@ -85,8 +94,22 @@ function native(): SentoriNativeModule | null {
|
|
|
85
94
|
requireNativeModule: <T>(name: string) => T
|
|
86
95
|
}
|
|
87
96
|
_native = core.requireNativeModule<SentoriNativeModule>('Sentori')
|
|
88
|
-
|
|
97
|
+
if (typeof __DEV__ !== 'undefined' && __DEV__ && _native !== null) {
|
|
98
|
+
// v0.9.9 — Insight asked for "tell me exactly which functions
|
|
99
|
+
// the iOS pod is currently exposing." Logged once per process
|
|
100
|
+
// (the cached _native short-circuits subsequent calls). Helps
|
|
101
|
+
// distinguish "pod is stale" from "method exists but throws
|
|
102
|
+
// at runtime" in one log line.
|
|
103
|
+
const keys = Object.keys(_native as object).sort()
|
|
104
|
+
// eslint-disable-next-line no-console
|
|
105
|
+
console.warn('[sentori] native module bound; exposed methods:', keys.join(', ') || '(none)')
|
|
106
|
+
}
|
|
107
|
+
} catch (e) {
|
|
89
108
|
_native = null
|
|
109
|
+
if (typeof __DEV__ !== 'undefined' && __DEV__) {
|
|
110
|
+
// eslint-disable-next-line no-console
|
|
111
|
+
console.warn('[sentori] requireNativeModule("Sentori") threw', e)
|
|
112
|
+
}
|
|
90
113
|
}
|
|
91
114
|
return _native
|
|
92
115
|
}
|
|
@@ -230,10 +253,52 @@ export async function captureNativeScreenshotWithMask(
|
|
|
230
253
|
maskedIds: string[],
|
|
231
254
|
): Promise<null | { base64: string; mediaType: string }> {
|
|
232
255
|
const n = native()
|
|
233
|
-
if (!n
|
|
256
|
+
if (!n) {
|
|
257
|
+
if (typeof __DEV__ !== 'undefined' && __DEV__) {
|
|
258
|
+
// eslint-disable-next-line no-console
|
|
259
|
+
console.warn(
|
|
260
|
+
'[sentori] native module not bound — requireNativeModule("Sentori") threw',
|
|
261
|
+
)
|
|
262
|
+
}
|
|
263
|
+
return null
|
|
264
|
+
}
|
|
265
|
+
if (!n.captureScreenshotWithMask) {
|
|
266
|
+
if (typeof __DEV__ !== 'undefined' && __DEV__) {
|
|
267
|
+
// eslint-disable-next-line no-console
|
|
268
|
+
console.warn(
|
|
269
|
+
'[sentori] native.captureScreenshotWithMask missing — pod install may be stale',
|
|
270
|
+
)
|
|
271
|
+
}
|
|
272
|
+
return null
|
|
273
|
+
}
|
|
234
274
|
try {
|
|
235
|
-
|
|
236
|
-
|
|
275
|
+
const r = await n.captureScreenshotWithMask(maskedIds)
|
|
276
|
+
if (!r && typeof __DEV__ !== 'undefined' && __DEV__) {
|
|
277
|
+
// eslint-disable-next-line no-console
|
|
278
|
+
console.warn(
|
|
279
|
+
'[sentori] native screenshot returned null — no key window / render failed',
|
|
280
|
+
)
|
|
281
|
+
}
|
|
282
|
+
return r
|
|
283
|
+
} catch (e) {
|
|
284
|
+
if (typeof __DEV__ !== 'undefined' && __DEV__) {
|
|
285
|
+
// eslint-disable-next-line no-console
|
|
286
|
+
console.warn('[sentori] native screenshot threw', e)
|
|
287
|
+
}
|
|
237
288
|
return null
|
|
238
289
|
}
|
|
239
290
|
}
|
|
291
|
+
|
|
292
|
+
/** v0.9.9 — diagnostic peek used by the wireframe replay tick. Same
|
|
293
|
+
* four-way distinction as captureNativeScreenshotWithMask. Logged at
|
|
294
|
+
* most once per `startReplay()` (the wrapper in replay.ts gates). */
|
|
295
|
+
export function describeWireframeNative(): {
|
|
296
|
+
bound: boolean
|
|
297
|
+
hasCaptureWireframe: boolean
|
|
298
|
+
} {
|
|
299
|
+
const n = native()
|
|
300
|
+
return {
|
|
301
|
+
bound: n !== null,
|
|
302
|
+
hasCaptureWireframe: Boolean(n?.captureWireframe),
|
|
303
|
+
}
|
|
304
|
+
}
|
package/src/replay.ts
CHANGED
|
@@ -20,7 +20,9 @@
|
|
|
20
20
|
import { startSpan } from '@goliapkg/sentori-core';
|
|
21
21
|
|
|
22
22
|
import { getRegisteredMaskQuery } from './mask';
|
|
23
|
-
import {
|
|
23
|
+
import { describeWireframeNative } from './native';
|
|
24
|
+
|
|
25
|
+
declare const __DEV__: boolean | undefined;
|
|
24
26
|
|
|
25
27
|
const TICK_INTERVAL_MS = 1000;
|
|
26
28
|
const RING_SIZE = 60;
|
|
@@ -51,14 +53,30 @@ export type ReplayOptions = {
|
|
|
51
53
|
export function startReplay(opts: ReplayOptions): void {
|
|
52
54
|
if (_running) return;
|
|
53
55
|
if (opts.mode !== 'wireframe') return;
|
|
54
|
-
//
|
|
55
|
-
//
|
|
56
|
-
//
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
56
|
+
// v0.9.10 — gate via expo-modules-core's registry (same path the
|
|
57
|
+
// screenshot capture uses). The previous `isNativeModuleLinked`
|
|
58
|
+
// check looked at the legacy `RN.NativeModules` map, but the
|
|
59
|
+
// Sentori module is registered through expo-modules-core; the
|
|
60
|
+
// legacy map never sees it, so this branch returned "not linked"
|
|
61
|
+
// forever even with the pod correctly attached (Insight 2026-05-17).
|
|
62
|
+
const info = describeWireframeNative();
|
|
63
|
+
if (!info.bound) {
|
|
64
|
+
if (typeof __DEV__ !== 'undefined' && __DEV__) {
|
|
65
|
+
// eslint-disable-next-line no-console
|
|
66
|
+
console.warn(
|
|
67
|
+
'[sentori] replay: Sentori native module not bound (expo-modules-core) — replay attachments will stay empty',
|
|
68
|
+
);
|
|
69
|
+
}
|
|
60
70
|
return;
|
|
61
71
|
}
|
|
72
|
+
if (typeof __DEV__ !== 'undefined' && __DEV__) {
|
|
73
|
+
// eslint-disable-next-line no-console
|
|
74
|
+
console.warn(
|
|
75
|
+
'[sentori] replay: starting',
|
|
76
|
+
'bound=', info.bound,
|
|
77
|
+
'hasCaptureWireframe=', info.hasCaptureWireframe,
|
|
78
|
+
);
|
|
79
|
+
}
|
|
62
80
|
_running = true;
|
|
63
81
|
_nativeMod = loadNativeReplay();
|
|
64
82
|
const period = Math.max(MIN_TICK_PERIOD_MS, Math.floor(TICK_INTERVAL_MS / (opts.hz ?? 1)));
|