@goliapkg/sentori-react-native 1.0.0-rc.3 → 1.0.0-rc.5
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/android/src/main/java/com/sentori/SentoriReplayCapture.kt +52 -2
- package/lib/base64.d.ts +25 -0
- package/lib/base64.d.ts.map +1 -0
- package/lib/base64.js +30 -0
- package/lib/base64.js.map +1 -0
- package/lib/capture.d.ts +20 -1
- package/lib/capture.d.ts.map +1 -1
- package/lib/capture.js +45 -21
- package/lib/capture.js.map +1 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/replay.d.ts +6 -0
- package/lib/replay.d.ts.map +1 -1
- package/lib/replay.js +8 -0
- package/lib/replay.js.map +1 -1
- package/package.json +1 -1
- package/src/__tests__/base64.test.ts +55 -0
- package/src/__tests__/capture-replay.test.ts +150 -0
- package/src/base64.ts +29 -0
- package/src/capture.ts +56 -22
- package/src/replay.ts +9 -0
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
package com.sentori
|
|
2
2
|
|
|
3
3
|
import android.app.Activity
|
|
4
|
+
import android.graphics.drawable.ColorDrawable
|
|
5
|
+
import android.graphics.drawable.Drawable
|
|
6
|
+
import android.graphics.drawable.GradientDrawable
|
|
7
|
+
import android.graphics.drawable.RippleDrawable
|
|
4
8
|
import android.view.View
|
|
5
9
|
import android.view.ViewGroup
|
|
6
10
|
import android.widget.EditText
|
|
@@ -214,8 +218,18 @@ object SentoriReplayCapture {
|
|
|
214
218
|
}
|
|
215
219
|
view.background != null -> {
|
|
216
220
|
node.put("kind", "rect")
|
|
217
|
-
//
|
|
218
|
-
//
|
|
221
|
+
// rc.5 — extract the fill colour from the
|
|
222
|
+
// background Drawable so wireframes show the host
|
|
223
|
+
// app's actual brand palette, not a uniform grey
|
|
224
|
+
// grid. iOS' UIView.backgroundColor already drives
|
|
225
|
+
// this path; the Android side had been emitting
|
|
226
|
+
// null since v0.9.6 and the dashboard fell back to
|
|
227
|
+
// a neutral fill for every coloured CTA. Insight
|
|
228
|
+
// 2026-05-18 verify event made the gap visible.
|
|
229
|
+
val color = extractDrawableColor(view.background)
|
|
230
|
+
if (color != null && (color shr 24 and 0xff) != 0) {
|
|
231
|
+
node.put("color", colorToHex(color))
|
|
232
|
+
}
|
|
219
233
|
kindEmitted = true
|
|
220
234
|
}
|
|
221
235
|
}
|
|
@@ -241,4 +255,40 @@ object SentoriReplayCapture {
|
|
|
241
255
|
val b = c and 0xff
|
|
242
256
|
return String.format("#%02X%02X%02X%02X", r, g, b, a)
|
|
243
257
|
}
|
|
258
|
+
|
|
259
|
+
/** rc.5 — best-effort fill-colour extraction for the View's
|
|
260
|
+
* background Drawable. RN's `backgroundColor: '#...'` style
|
|
261
|
+
* lands as a ColorDrawable in flat cases and a GradientDrawable
|
|
262
|
+
* whenever the View also carries `borderRadius` or
|
|
263
|
+
* `borderWidth`; Pressables wrap the painted child in a
|
|
264
|
+
* RippleDrawable layer list. We cover all three. Returns
|
|
265
|
+
* the packed ARGB int or null when nothing usable is exposed
|
|
266
|
+
* (StateListDrawable with no current state, opaque image
|
|
267
|
+
* drawables, etc.). */
|
|
268
|
+
private fun extractDrawableColor(drawable: Drawable?): Int? {
|
|
269
|
+
return when (drawable) {
|
|
270
|
+
null -> null
|
|
271
|
+
is ColorDrawable -> drawable.color
|
|
272
|
+
is GradientDrawable -> {
|
|
273
|
+
// API 24+ exposes the ColorStateList for the
|
|
274
|
+
// `setColor()` value. RN's typical solid-colour
|
|
275
|
+
// GradientDrawable returns a single default colour
|
|
276
|
+
// here; gradients with multiple stops still surface
|
|
277
|
+
// a reasonable representative colour.
|
|
278
|
+
val csl = drawable.color
|
|
279
|
+
csl?.defaultColor
|
|
280
|
+
}
|
|
281
|
+
is RippleDrawable -> {
|
|
282
|
+
// Iterate the layer list; the inner painted layer
|
|
283
|
+
// is what carries the brand colour.
|
|
284
|
+
for (i in 0 until drawable.numberOfLayers) {
|
|
285
|
+
val inner = drawable.getDrawable(i)
|
|
286
|
+
val c = extractDrawableColor(inner)
|
|
287
|
+
if (c != null && (c shr 24 and 0xff) != 0) return c
|
|
288
|
+
}
|
|
289
|
+
null
|
|
290
|
+
}
|
|
291
|
+
else -> null
|
|
292
|
+
}
|
|
293
|
+
}
|
|
244
294
|
}
|
package/lib/base64.d.ts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* UTF-8-safe base64 encoder used by every JSON attachment path
|
|
3
|
+
* (sessionTrail, stateSnapshot, replay).
|
|
4
|
+
*
|
|
5
|
+
* Why this needs its own helper:
|
|
6
|
+
* • Hermes' `globalThis.btoa` (and the WHATWG spec) is **Latin-1
|
|
7
|
+
* only** — it throws `InvalidCharacterError` on any code point
|
|
8
|
+
* > 0xFF. A wireframe NDJSON that includes a TextView with
|
|
9
|
+
* Japanese / Chinese / em-dash text triggers it; the JS-side
|
|
10
|
+
* `try / catch` then swallows the throw and the replay
|
|
11
|
+
* attachment silently never lands.
|
|
12
|
+
* • Insight 2026-05-18 rc.3 verify hit exactly this on Android —
|
|
13
|
+
* the walker fix in rc.3 surfaced deep TextView text, which
|
|
14
|
+
* then collided with the unsafe `btoa(ndjson)` path that had
|
|
15
|
+
* worked accidentally on rc.2's shallow (text-free) snapshots.
|
|
16
|
+
*
|
|
17
|
+
* The pattern `btoa(unescape(encodeURIComponent(s)))` rewrites the
|
|
18
|
+
* UTF-8 byte sequence into a Latin-1-equivalent string that btoa
|
|
19
|
+
* can chew. `unescape` is deprecated for HTML but its byte-level
|
|
20
|
+
* behaviour is stable across every JS engine we ship to.
|
|
21
|
+
*
|
|
22
|
+
* Node / bun test fallback uses `Buffer` directly.
|
|
23
|
+
*/
|
|
24
|
+
export declare function base64Utf8(s: string): string;
|
|
25
|
+
//# sourceMappingURL=base64.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base64.d.ts","sourceRoot":"","sources":["../src/base64.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAK5C"}
|
package/lib/base64.js
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* UTF-8-safe base64 encoder used by every JSON attachment path
|
|
3
|
+
* (sessionTrail, stateSnapshot, replay).
|
|
4
|
+
*
|
|
5
|
+
* Why this needs its own helper:
|
|
6
|
+
* • Hermes' `globalThis.btoa` (and the WHATWG spec) is **Latin-1
|
|
7
|
+
* only** — it throws `InvalidCharacterError` on any code point
|
|
8
|
+
* > 0xFF. A wireframe NDJSON that includes a TextView with
|
|
9
|
+
* Japanese / Chinese / em-dash text triggers it; the JS-side
|
|
10
|
+
* `try / catch` then swallows the throw and the replay
|
|
11
|
+
* attachment silently never lands.
|
|
12
|
+
* • Insight 2026-05-18 rc.3 verify hit exactly this on Android —
|
|
13
|
+
* the walker fix in rc.3 surfaced deep TextView text, which
|
|
14
|
+
* then collided with the unsafe `btoa(ndjson)` path that had
|
|
15
|
+
* worked accidentally on rc.2's shallow (text-free) snapshots.
|
|
16
|
+
*
|
|
17
|
+
* The pattern `btoa(unescape(encodeURIComponent(s)))` rewrites the
|
|
18
|
+
* UTF-8 byte sequence into a Latin-1-equivalent string that btoa
|
|
19
|
+
* can chew. `unescape` is deprecated for HTML but its byte-level
|
|
20
|
+
* behaviour is stable across every JS engine we ship to.
|
|
21
|
+
*
|
|
22
|
+
* Node / bun test fallback uses `Buffer` directly.
|
|
23
|
+
*/
|
|
24
|
+
export function base64Utf8(s) {
|
|
25
|
+
if (typeof globalThis.btoa === 'function') {
|
|
26
|
+
return globalThis.btoa(unescape(encodeURIComponent(s)));
|
|
27
|
+
}
|
|
28
|
+
return Buffer.from(s, 'utf8').toString('base64');
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=base64.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base64.js","sourceRoot":"","sources":["../src/base64.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,UAAU,UAAU,CAAC,CAAS;IAClC,IAAI,OAAO,UAAU,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QAC1C,OAAO,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1D,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AACnD,CAAC"}
|
package/lib/capture.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Tags, User } from './types';
|
|
1
|
+
import type { Event, Tags, User } from './types';
|
|
2
2
|
export { captureStep, __resetTrailForTests } from './trail';
|
|
3
3
|
export declare const __resetScreenshotBudgetForTests: () => void;
|
|
4
4
|
/**
|
|
@@ -49,5 +49,24 @@ export declare const sendUserFeedback: (input: {
|
|
|
49
49
|
issueId: null | string;
|
|
50
50
|
}>;
|
|
51
51
|
export declare const captureError: (error: Error, extras?: CaptureExtras) => void;
|
|
52
|
+
/** v0.9.6 #2 — upload the wireframe replay ring as a `replay`
|
|
53
|
+
* attachment. Plain NDJSON (one snapshot per line) — server may
|
|
54
|
+
* gzip on storage; the network upload is base64.
|
|
55
|
+
*
|
|
56
|
+
* rc.4: route through `base64Utf8` so non-Latin-1 text inside any
|
|
57
|
+
* walked TextView (Japanese / Chinese / em-dash etc.) doesn't blow
|
|
58
|
+
* up the Hermes-spec `btoa`. The pre-rc.4 inline `btoa(ndjson)` path
|
|
59
|
+
* threw `InvalidCharacterError` on those code points, the
|
|
60
|
+
* surrounding catch swallowed it silently, and the replay
|
|
61
|
+
* attachment never landed. Insight 2026-05-18 verify caught it
|
|
62
|
+
* after rc.3's walker fix surfaced deep TextView content. Dev
|
|
63
|
+
* logs replace the silent catch so the next failure shape is
|
|
64
|
+
* visible. */
|
|
65
|
+
declare function captureAndAttachReplay(event: Event, ndjson: string): Promise<void>;
|
|
52
66
|
export declare const captureException: (error: Error, extras?: CaptureExtras) => void;
|
|
67
|
+
/** rc.4 — test hook. The real replay attach path is internal so we
|
|
68
|
+
* don't bloat the public surface, but the encoding bug Insight hit
|
|
69
|
+
* on 2026-05-18 needs a behaviour-level test that exercises the
|
|
70
|
+
* same code path captureException runs in production. */
|
|
71
|
+
export declare const __captureAndAttachReplayForTests: typeof captureAndAttachReplay;
|
|
53
72
|
//# sourceMappingURL=capture.d.ts.map
|
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":"AAsBA,OAAO,KAAK,EAA+B,KAAK,EAAgB,IAAI,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAE5F,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAgB5D,eAAO,MAAM,+BAA+B,QAAO,IAElD,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,OAAO,GAAI,MAAM,IAAI,GAAG,IAAI,KAAG,IAE3C,CAAC;AAEF,eAAO,MAAM,OAAO,QAAO,IAAI,GAAG,IAAa,CAAC;AAEhD;sEACsE;AACtE,eAAO,MAAM,gBAAgB,QAAO,MAAM,GAAG,SAAmC,CAAC;AAEjF,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB;;;qDAGiD;IACjD,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,gBAAgB,GAAU,OAAO;IAC5C,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf,KAAG,OAAO,CAAC,IAAI,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,IAAI,GAAG,MAAM,CAAA;CAAE,CAKxD,CAAC;AAEF,eAAO,MAAM,YAAY,GAAI,OAAO,KAAK,EAAE,SAAS,aAAa,KAAG,IAiHnE,CAAC;AAEF;;;;;;;;;;;;eAYe;AACf,iBAAe,sBAAsB,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAiCjF;AAwDD,eAAO,MAAM,gBAAgB,UAzNO,KAAK,WAAW,aAAa,KAAG,IAyNxB,CAAC;AAE7C;;;0DAG0D;AAC1D,eAAO,MAAM,gCAAgC,+BAAyB,CAAC"}
|
package/lib/capture.js
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { sealTrail, shouldSample } from '@goliapkg/sentori-core';
|
|
2
|
+
import { base64Utf8 } from './base64';
|
|
2
3
|
import { __peekBreadcrumbCount, addBreadcrumb, getBreadcrumbs, } from './breadcrumbs';
|
|
3
4
|
import { getBundleInfo } from './bundle-info';
|
|
4
5
|
import { getConfig, isInitialized } from './config';
|
|
5
6
|
import { getFeatureFlagSnapshot } from './feature-flags';
|
|
6
|
-
import { drainReplay } from './replay';
|
|
7
|
+
import { drainReplay, isReplayRunning } from './replay';
|
|
7
8
|
import { clearStateSnapshots, getStateSnapshots } from './state-snapshots';
|
|
8
9
|
import { symbolicateErrorViaMetro } from './handlers/dev-symbolicate';
|
|
9
10
|
import { captureScreenshot } from './handlers/screenshot';
|
|
@@ -104,7 +105,7 @@ export const captureError = (error, extras) => {
|
|
|
104
105
|
// been silently dropped on the wire. Production builds gate out.
|
|
105
106
|
if (typeof __DEV__ !== 'undefined' && __DEV__) {
|
|
106
107
|
// eslint-disable-next-line no-console
|
|
107
|
-
console.warn('[sentori] captureException', 'eventId=', event.id, 'breadcrumbs=', crumbs.length, 'wantScreenshot=', config.screenshotsEnabled && extras?.screenshot !== false, 'wantSessionTrail=', config.sessionTrailEnabled);
|
|
108
|
+
console.warn('[sentori] captureException', 'eventId=', event.id, 'breadcrumbs=', crumbs.length, 'wantScreenshot=', config.screenshotsEnabled && extras?.screenshot !== false, 'wantSessionTrail=', config.sessionTrailEnabled, 'wantReplay=', isReplayRunning());
|
|
108
109
|
}
|
|
109
110
|
// Phase 26 sub-B: a captured error promotes the current session to
|
|
110
111
|
// `errored` so the next AppState=background ping reports unhealthy.
|
|
@@ -142,6 +143,15 @@ export const captureError = (error, extras) => {
|
|
|
142
143
|
if (replayNdjson.length > 0) {
|
|
143
144
|
await captureAndAttachReplay(event, replayNdjson);
|
|
144
145
|
}
|
|
146
|
+
else if (typeof __DEV__ !== 'undefined' && __DEV__ && isReplayRunning()) {
|
|
147
|
+
// rc.4 — explicit "replay was on but ring drained empty" signal.
|
|
148
|
+
// Without this, "kinds=screenshot,sessionTrail" looks
|
|
149
|
+
// indistinguishable from `replay: off` even though the ticks
|
|
150
|
+
// were healthy upstream. Insight 2026-05-18 verify shape made
|
|
151
|
+
// this gap painful to triage.
|
|
152
|
+
// eslint-disable-next-line no-console
|
|
153
|
+
console.warn('[sentori] replay drain empty (no frames buffered at captureException)', 'eventId=', event.id);
|
|
154
|
+
}
|
|
145
155
|
if (typeof __DEV__ !== 'undefined' && __DEV__) {
|
|
146
156
|
// eslint-disable-next-line no-console
|
|
147
157
|
console.warn('[sentori] enqueue', 'eventId=', event.id, 'attachments=', event.attachments?.length ?? 0, 'kinds=', (event.attachments ?? []).map((a) => a.kind).join(',') || '(none)', 'breadcrumbsAtEnqueue=', __peekBreadcrumbCount());
|
|
@@ -152,21 +162,37 @@ export const captureError = (error, extras) => {
|
|
|
152
162
|
};
|
|
153
163
|
/** v0.9.6 #2 — upload the wireframe replay ring as a `replay`
|
|
154
164
|
* attachment. Plain NDJSON (one snapshot per line) — server may
|
|
155
|
-
* gzip on storage; the network upload is base64.
|
|
165
|
+
* gzip on storage; the network upload is base64.
|
|
166
|
+
*
|
|
167
|
+
* rc.4: route through `base64Utf8` so non-Latin-1 text inside any
|
|
168
|
+
* walked TextView (Japanese / Chinese / em-dash etc.) doesn't blow
|
|
169
|
+
* up the Hermes-spec `btoa`. The pre-rc.4 inline `btoa(ndjson)` path
|
|
170
|
+
* threw `InvalidCharacterError` on those code points, the
|
|
171
|
+
* surrounding catch swallowed it silently, and the replay
|
|
172
|
+
* attachment never landed. Insight 2026-05-18 verify caught it
|
|
173
|
+
* after rc.3's walker fix surfaced deep TextView content. Dev
|
|
174
|
+
* logs replace the silent catch so the next failure shape is
|
|
175
|
+
* visible. */
|
|
156
176
|
async function captureAndAttachReplay(event, ndjson) {
|
|
157
177
|
try {
|
|
158
|
-
const base64 =
|
|
159
|
-
? globalThis.btoa(ndjson)
|
|
160
|
-
: Buffer.from(ndjson, 'utf8').toString('base64');
|
|
178
|
+
const base64 = base64Utf8(ndjson);
|
|
161
179
|
const meta = await uploadAttachment(event.id, 'replay', { base64, mediaType: 'application/x-ndjson' }, { source: 'js' });
|
|
162
|
-
if (meta) {
|
|
163
|
-
if (
|
|
164
|
-
|
|
165
|
-
|
|
180
|
+
if (!meta) {
|
|
181
|
+
if (typeof __DEV__ !== 'undefined' && __DEV__) {
|
|
182
|
+
// eslint-disable-next-line no-console
|
|
183
|
+
console.warn('[sentori] replay upload returned null', 'eventId=', event.id, 'ndjsonBytes=', ndjson.length);
|
|
184
|
+
}
|
|
185
|
+
return;
|
|
166
186
|
}
|
|
187
|
+
if (!event.attachments)
|
|
188
|
+
event.attachments = [];
|
|
189
|
+
event.attachments.push(meta);
|
|
167
190
|
}
|
|
168
|
-
catch {
|
|
169
|
-
|
|
191
|
+
catch (e) {
|
|
192
|
+
if (typeof __DEV__ !== 'undefined' && __DEV__) {
|
|
193
|
+
// eslint-disable-next-line no-console
|
|
194
|
+
console.warn('[sentori] replay attachment threw', 'eventId=', event.id, 'ndjsonBytes=', ndjson.length, e);
|
|
195
|
+
}
|
|
170
196
|
}
|
|
171
197
|
}
|
|
172
198
|
/** v0.9.2 +S2 — upload the rolling state-snapshot ring as a
|
|
@@ -175,10 +201,7 @@ async function captureAndAttachReplay(event, ndjson) {
|
|
|
175
201
|
async function captureAndAttachStateSnapshots(event, snapshots) {
|
|
176
202
|
try {
|
|
177
203
|
const payload = JSON.stringify({ snapshots });
|
|
178
|
-
const base64 =
|
|
179
|
-
? globalThis.btoa(payload)
|
|
180
|
-
: // Bun / node fallback
|
|
181
|
-
Buffer.from(payload, 'utf8').toString('base64');
|
|
204
|
+
const base64 = base64Utf8(payload);
|
|
182
205
|
const meta = await uploadAttachment(event.id, 'stateSnapshot', { base64, mediaType: 'application/json' }, { source: 'js' });
|
|
183
206
|
if (meta) {
|
|
184
207
|
if (!event.attachments)
|
|
@@ -204,11 +227,7 @@ async function captureAndAttachSessionTrail(event) {
|
|
|
204
227
|
const payload = sealTrail(trail);
|
|
205
228
|
trail.clear();
|
|
206
229
|
const json = JSON.stringify(payload);
|
|
207
|
-
|
|
208
|
-
// trick the screenshot path uses).
|
|
209
|
-
const base64 = typeof globalThis.btoa === 'function'
|
|
210
|
-
? globalThis.btoa(unescape(encodeURIComponent(json)))
|
|
211
|
-
: Buffer.from(json, 'utf-8').toString('base64');
|
|
230
|
+
const base64 = base64Utf8(json);
|
|
212
231
|
const attachment = await uploadAttachment(event.id, 'sessionTrail', { base64, mediaType: 'application/json' }, { source: 'js' });
|
|
213
232
|
if (!attachment) {
|
|
214
233
|
addBreadcrumb({ type: 'custom', data: { reason: 'session-trail-upload-failed' } });
|
|
@@ -219,6 +238,11 @@ async function captureAndAttachSessionTrail(event) {
|
|
|
219
238
|
event.attachments.push(attachment);
|
|
220
239
|
}
|
|
221
240
|
export const captureException = captureError;
|
|
241
|
+
/** rc.4 — test hook. The real replay attach path is internal so we
|
|
242
|
+
* don't bloat the public surface, but the encoding bug Insight hit
|
|
243
|
+
* on 2026-05-18 needs a behaviour-level test that exercises the
|
|
244
|
+
* same code path captureException runs in production. */
|
|
245
|
+
export const __captureAndAttachReplayForTests = captureAndAttachReplay;
|
|
222
246
|
/** Phase 42 sub-D.08: per-session screenshot quota gate. */
|
|
223
247
|
function allowScreenshot() {
|
|
224
248
|
const budget = screenshotBudget();
|
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/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAkB,KAAK,oBAAoB,EAAE,KAAK,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAOxG,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EACL,cAAc,EACd,qBAAqB,EAEtB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACxE,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAO5C,eAAO,MAAM,OAAO;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAkB,KAAK,oBAAoB,EAAE,KAAK,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAOxG,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EACL,cAAc,EACd,qBAAqB,EAEtB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACxE,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAO5C,eAAO,MAAM,OAAO;;;;;;;;;;aAiGqT,CAAC;eAAmB,CAAC;YAAgB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;CAnE9W,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,gBAAgB,EAChB,OAAO,GACR,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,KAAK,oBAAoB,EAAE,KAAK,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxG,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,eAAe,EACf,cAAc,GACf,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EACL,cAAc,EACd,qBAAqB,EACrB,KAAK,uBAAuB,GAC7B,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,YAAY,EAAE,KAAK,gBAAgB,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC1F,OAAO,EACL,SAAS,EACT,WAAW,EACX,KAAK,aAAa,EAClB,WAAW,GACZ,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,gBAAgB,EAChB,eAAe,EACf,kBAAkB,GACnB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAChE,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/replay.d.ts
CHANGED
|
@@ -5,6 +5,12 @@ export type ReplayOptions = {
|
|
|
5
5
|
};
|
|
6
6
|
export declare function startReplay(opts: ReplayOptions): void;
|
|
7
7
|
export declare function stopReplay(): void;
|
|
8
|
+
/** rc.4 — surface "is replay subsystem alive" so the captureException
|
|
9
|
+
* debug log can label `wantReplay` alongside `wantScreenshot` /
|
|
10
|
+
* `wantSessionTrail`. Insight 2026-05-18 verify flagged that the
|
|
11
|
+
* pre-rc.4 log line was missing `wantReplay`, leaving the failure
|
|
12
|
+
* shape ambiguous (config-off vs. ring-empty vs. attach-failed). */
|
|
13
|
+
export declare function isReplayRunning(): boolean;
|
|
8
14
|
/** Drain the ring as NDJSON (one snapshot per line). Empty string
|
|
9
15
|
* when the ring is empty. Also clears the ring so the next session's
|
|
10
16
|
* replay starts fresh. */
|
package/lib/replay.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"replay.d.ts","sourceRoot":"","sources":["../src/replay.ts"],"names":[],"mappings":"AAkEA,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,CA+CrD;AAED,wBAAgB,UAAU,IAAI,IAAI,CAUjC;AAuKD;;2BAE2B;AAC3B,wBAAgB,WAAW,IAAI,MAAM,CAMpC;AAED,wBAAgB,qBAAqB,IAAI,IAAI,CAI5C"}
|
|
1
|
+
{"version":3,"file":"replay.d.ts","sourceRoot":"","sources":["../src/replay.ts"],"names":[],"mappings":"AAkEA,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,CA+CrD;AAED,wBAAgB,UAAU,IAAI,IAAI,CAUjC;AAuKD;;;;qEAIqE;AACrE,wBAAgB,eAAe,IAAI,OAAO,CAEzC;AAED;;2BAE2B;AAC3B,wBAAgB,WAAW,IAAI,MAAM,CAMpC;AAED,wBAAgB,qBAAqB,IAAI,IAAI,CAI5C"}
|
package/lib/replay.js
CHANGED
|
@@ -263,6 +263,14 @@ function loadNativeReplay() {
|
|
|
263
263
|
return null;
|
|
264
264
|
}
|
|
265
265
|
}
|
|
266
|
+
/** rc.4 — surface "is replay subsystem alive" so the captureException
|
|
267
|
+
* debug log can label `wantReplay` alongside `wantScreenshot` /
|
|
268
|
+
* `wantSessionTrail`. Insight 2026-05-18 verify flagged that the
|
|
269
|
+
* pre-rc.4 log line was missing `wantReplay`, leaving the failure
|
|
270
|
+
* shape ambiguous (config-off vs. ring-empty vs. attach-failed). */
|
|
271
|
+
export function isReplayRunning() {
|
|
272
|
+
return _running;
|
|
273
|
+
}
|
|
266
274
|
/** Drain the ring as NDJSON (one snapshot per line). Empty string
|
|
267
275
|
* when the ring is empty. Also clears the ring so the next session's
|
|
268
276
|
* replay starts fresh. */
|
package/lib/replay.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"replay.js","sourceRoot":"","sources":["../src/replay.ts"],"names":[],"mappings":"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"}
|
|
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": "1.0.0-rc.
|
|
3
|
+
"version": "1.0.0-rc.5",
|
|
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",
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { describe, expect, test } from 'bun:test';
|
|
2
|
+
|
|
3
|
+
import { base64Utf8 } from '../base64';
|
|
4
|
+
|
|
5
|
+
// Bun ships a spec-compliant `globalThis.btoa` (Latin-1 only — throws
|
|
6
|
+
// on code points > 0xFF). That makes bun:test a faithful stand-in
|
|
7
|
+
// for Hermes' behaviour, which is what runs in the RN app at runtime.
|
|
8
|
+
|
|
9
|
+
describe('base64Utf8', () => {
|
|
10
|
+
test('ASCII round-trips identically to plain btoa', () => {
|
|
11
|
+
const s = '{"ts":1,"nodes":[]}';
|
|
12
|
+
const encoded = base64Utf8(s);
|
|
13
|
+
expect(encoded).toBe(globalThis.btoa(s));
|
|
14
|
+
expect(globalThis.atob(encoded)).toBe(s);
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
test('handles Japanese text (the rc.3 Android crash repro)', () => {
|
|
18
|
+
// The wireframe NDJSON the rc.3 walker produces now includes
|
|
19
|
+
// deep TextView content. If any of that text has code points
|
|
20
|
+
// > 0xFF, the *unsafe* `btoa(s)` path throws and the attachment
|
|
21
|
+
// silently disappears. This is the bug Insight reported.
|
|
22
|
+
const s = '{"kind":"text","text":"こんにちは"}';
|
|
23
|
+
const encoded = base64Utf8(s);
|
|
24
|
+
// Round-trip through the standard decoder back to the same
|
|
25
|
+
// UTF-8 string. atob gives back the Latin-1-encoded byte
|
|
26
|
+
// sequence; decodeURIComponent + escape reverses it.
|
|
27
|
+
const decoded = decodeURIComponent(escape(globalThis.atob(encoded)));
|
|
28
|
+
expect(decoded).toBe(s);
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
test('handles em-dash / smart-quote / emoji', () => {
|
|
32
|
+
const s = 'label — "smart" 🎉';
|
|
33
|
+
const encoded = base64Utf8(s);
|
|
34
|
+
const decoded = decodeURIComponent(escape(globalThis.atob(encoded)));
|
|
35
|
+
expect(decoded).toBe(s);
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
test('the *unsafe* btoa(s) path that the SDK used pre-fix throws on the same input', () => {
|
|
39
|
+
// Locks in why we need this helper at all. If a future
|
|
40
|
+
// refactor reverts to plain `btoa(s)` on UTF-8 NDJSON, the
|
|
41
|
+
// call below will catch it — proving silently-broken
|
|
42
|
+
// attachments aren't acceptable.
|
|
43
|
+
expect(() => globalThis.btoa('こんにちは')).toThrow();
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
test('handles a full multi-line wireframe NDJSON with JP labels', () => {
|
|
47
|
+
const ndjson = [
|
|
48
|
+
'{"ts":1700000000,"width":390,"height":844,"nodes":[{"kind":"text","x":10,"y":20,"w":100,"h":20,"text":"設定"}]}',
|
|
49
|
+
'{"ts":1700000001,"width":390,"height":844,"nodes":[{"kind":"text","x":10,"y":20,"w":100,"h":20,"text":"ログアウト"}]}',
|
|
50
|
+
].join('\n');
|
|
51
|
+
const encoded = base64Utf8(ndjson);
|
|
52
|
+
const decoded = decodeURIComponent(escape(globalThis.atob(encoded)));
|
|
53
|
+
expect(decoded).toBe(ndjson);
|
|
54
|
+
});
|
|
55
|
+
});
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import { afterEach, beforeEach, describe, expect, mock, test } from 'bun:test';
|
|
2
|
+
|
|
3
|
+
import { __captureAndAttachReplayForTests } from '../capture';
|
|
4
|
+
import { setConfig, __resetForTests as resetConfig } from '../config';
|
|
5
|
+
import type { Event } from '../types';
|
|
6
|
+
|
|
7
|
+
// Insight 2026-05-18 rc.3 verify: walker is healthy, ticks land
|
|
8
|
+
// deep wireframe JSON with TextView text, but the `replay` kind
|
|
9
|
+
// never reaches `event.attachments`. Root cause was the inline
|
|
10
|
+
// `btoa(ndjson)` upload path — spec-compliant Hermes / Bun btoa
|
|
11
|
+
// throws `InvalidCharacterError` on any code point > 0xFF, and the
|
|
12
|
+
// surrounding catch swallowed the throw silently. rc.4 routes
|
|
13
|
+
// through `base64Utf8`, fixing both Latin-1 and UTF-8 inputs.
|
|
14
|
+
//
|
|
15
|
+
// These tests run the actual captureAndAttachReplay function the
|
|
16
|
+
// captureException pipeline runs. fetch is mocked at the
|
|
17
|
+
// transport.ts boundary so the upload landing isn't tested here
|
|
18
|
+
// (covered separately in screenshot.test.ts); what we care about
|
|
19
|
+
// is "does event.attachments grow when the input contains
|
|
20
|
+
// non-Latin-1 text?".
|
|
21
|
+
|
|
22
|
+
const origFetch = globalThis.fetch;
|
|
23
|
+
|
|
24
|
+
beforeEach(() => {
|
|
25
|
+
setConfig({
|
|
26
|
+
enabled: true,
|
|
27
|
+
environment: 'test',
|
|
28
|
+
errorSampleRate: null,
|
|
29
|
+
ingestUrl: 'http://localhost:18080',
|
|
30
|
+
release: 'app@1.0.0+1',
|
|
31
|
+
screenshotsEnabled: true,
|
|
32
|
+
sessionTrailEnabled: true,
|
|
33
|
+
token: 'st_pk_test',
|
|
34
|
+
traceSampleRate: null,
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
afterEach(() => {
|
|
39
|
+
globalThis.fetch = origFetch;
|
|
40
|
+
resetConfig();
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
function makeEvent(): Event {
|
|
44
|
+
return {
|
|
45
|
+
id: '019eaa00-0000-7000-8000-000000000001',
|
|
46
|
+
timestamp: '2026-05-18T05:15:24.000Z',
|
|
47
|
+
kind: 'error',
|
|
48
|
+
platform: 'javascript',
|
|
49
|
+
release: 'app@1.0.0+1',
|
|
50
|
+
environment: 'test',
|
|
51
|
+
device: { os: 'android', osVersion: '36' },
|
|
52
|
+
app: {
|
|
53
|
+
version: '1.0.0',
|
|
54
|
+
build: '1',
|
|
55
|
+
framework: { name: 'react-native', version: '0.80.0' },
|
|
56
|
+
},
|
|
57
|
+
user: null,
|
|
58
|
+
tags: undefined,
|
|
59
|
+
breadcrumbs: [],
|
|
60
|
+
error: { type: 'Error', message: 'boom', stack: [], cause: null },
|
|
61
|
+
fingerprint: undefined,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
function mockUploadSuccess(): { calls: { url: string; body: unknown }[] } {
|
|
66
|
+
const calls: { url: string; body: unknown }[] = [];
|
|
67
|
+
globalThis.fetch = mock(async (url: Request | string | URL, init?: RequestInit) => {
|
|
68
|
+
let body: unknown = undefined;
|
|
69
|
+
try {
|
|
70
|
+
body = init?.body ? JSON.parse(String(init.body)) : undefined;
|
|
71
|
+
} catch {
|
|
72
|
+
body = init?.body;
|
|
73
|
+
}
|
|
74
|
+
calls.push({ url: String(url), body });
|
|
75
|
+
return new Response(
|
|
76
|
+
JSON.stringify({
|
|
77
|
+
kind: 'replay',
|
|
78
|
+
mediaType: 'application/x-ndjson',
|
|
79
|
+
refId: '019e3000-7000-7000-8000-00000000aaaa',
|
|
80
|
+
sizeBytes: 200,
|
|
81
|
+
}),
|
|
82
|
+
{ headers: { 'content-type': 'application/json' }, status: 201 },
|
|
83
|
+
);
|
|
84
|
+
}) as typeof fetch;
|
|
85
|
+
return { calls };
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
describe('captureAndAttachReplay — Insight rc.3 regression', () => {
|
|
89
|
+
test('Latin-1 ndjson attaches replay kind (control)', async () => {
|
|
90
|
+
const { calls } = mockUploadSuccess();
|
|
91
|
+
const event = makeEvent();
|
|
92
|
+
const ndjson =
|
|
93
|
+
'{"ts":1700000000,"width":390,"height":844,"nodes":[' +
|
|
94
|
+
'{"kind":"text","x":10,"y":20,"w":100,"h":20,"text":"Settings"}]}';
|
|
95
|
+
await __captureAndAttachReplayForTests(event, ndjson);
|
|
96
|
+
expect(calls.length).toBe(1);
|
|
97
|
+
expect(event.attachments?.length).toBe(1);
|
|
98
|
+
expect(event.attachments?.[0]?.kind).toBe('replay');
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
test('UTF-8 ndjson attaches replay kind (the rc.3 Android crash repro)', async () => {
|
|
102
|
+
// This is the bug: pre-rc.4 `btoa(ndjson)` threw on the
|
|
103
|
+
// Japanese characters below, the catch swallowed it, the
|
|
104
|
+
// attachment silently never landed. Post-rc.4 the helper
|
|
105
|
+
// handles UTF-8 and the attachment lands normally.
|
|
106
|
+
const { calls } = mockUploadSuccess();
|
|
107
|
+
const event = makeEvent();
|
|
108
|
+
const ndjson =
|
|
109
|
+
'{"ts":1700000000,"width":390,"height":844,"nodes":[' +
|
|
110
|
+
'{"kind":"text","x":10,"y":20,"w":100,"h":20,"text":"設定"},' +
|
|
111
|
+
'{"kind":"text","x":10,"y":50,"w":100,"h":20,"text":"ログアウト"}]}';
|
|
112
|
+
await __captureAndAttachReplayForTests(event, ndjson);
|
|
113
|
+
expect(calls.length).toBe(1);
|
|
114
|
+
expect(event.attachments?.length).toBe(1);
|
|
115
|
+
expect(event.attachments?.[0]?.kind).toBe('replay');
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
test('mixed em-dash / smart-quote / emoji attaches replay kind', async () => {
|
|
119
|
+
const { calls } = mockUploadSuccess();
|
|
120
|
+
const event = makeEvent();
|
|
121
|
+
const ndjson =
|
|
122
|
+
'{"ts":1,"width":390,"height":844,"nodes":[' +
|
|
123
|
+
'{"kind":"text","x":0,"y":0,"w":50,"h":20,"text":"hello — world"},' +
|
|
124
|
+
'{"kind":"text","x":0,"y":30,"w":50,"h":20,"text":"\\"quoted\\""},' +
|
|
125
|
+
'{"kind":"text","x":0,"y":60,"w":50,"h":20,"text":"🎉"}]}';
|
|
126
|
+
await __captureAndAttachReplayForTests(event, ndjson);
|
|
127
|
+
expect(calls.length).toBe(1);
|
|
128
|
+
expect(event.attachments?.length).toBe(1);
|
|
129
|
+
expect(event.attachments?.[0]?.kind).toBe('replay');
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
test('upload returns null → no attachment, no throw', async () => {
|
|
133
|
+
globalThis.fetch = (async () =>
|
|
134
|
+
new Response('{"error":"tooLarge"}', { status: 413 })) as typeof fetch;
|
|
135
|
+
const event = makeEvent();
|
|
136
|
+
const ndjson = '{"ts":1,"nodes":[]}';
|
|
137
|
+
await __captureAndAttachReplayForTests(event, ndjson);
|
|
138
|
+
expect(event.attachments).toBeUndefined();
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
test('fetch throws (offline) → no attachment, no throw out of the function', async () => {
|
|
142
|
+
globalThis.fetch = (async () => {
|
|
143
|
+
throw new TypeError('Network request failed');
|
|
144
|
+
}) as typeof fetch;
|
|
145
|
+
const event = makeEvent();
|
|
146
|
+
const ndjson = '{"ts":1,"nodes":[]}';
|
|
147
|
+
await __captureAndAttachReplayForTests(event, ndjson);
|
|
148
|
+
expect(event.attachments).toBeUndefined();
|
|
149
|
+
});
|
|
150
|
+
});
|
package/src/base64.ts
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* UTF-8-safe base64 encoder used by every JSON attachment path
|
|
3
|
+
* (sessionTrail, stateSnapshot, replay).
|
|
4
|
+
*
|
|
5
|
+
* Why this needs its own helper:
|
|
6
|
+
* • Hermes' `globalThis.btoa` (and the WHATWG spec) is **Latin-1
|
|
7
|
+
* only** — it throws `InvalidCharacterError` on any code point
|
|
8
|
+
* > 0xFF. A wireframe NDJSON that includes a TextView with
|
|
9
|
+
* Japanese / Chinese / em-dash text triggers it; the JS-side
|
|
10
|
+
* `try / catch` then swallows the throw and the replay
|
|
11
|
+
* attachment silently never lands.
|
|
12
|
+
* • Insight 2026-05-18 rc.3 verify hit exactly this on Android —
|
|
13
|
+
* the walker fix in rc.3 surfaced deep TextView text, which
|
|
14
|
+
* then collided with the unsafe `btoa(ndjson)` path that had
|
|
15
|
+
* worked accidentally on rc.2's shallow (text-free) snapshots.
|
|
16
|
+
*
|
|
17
|
+
* The pattern `btoa(unescape(encodeURIComponent(s)))` rewrites the
|
|
18
|
+
* UTF-8 byte sequence into a Latin-1-equivalent string that btoa
|
|
19
|
+
* can chew. `unescape` is deprecated for HTML but its byte-level
|
|
20
|
+
* behaviour is stable across every JS engine we ship to.
|
|
21
|
+
*
|
|
22
|
+
* Node / bun test fallback uses `Buffer` directly.
|
|
23
|
+
*/
|
|
24
|
+
export function base64Utf8(s: string): string {
|
|
25
|
+
if (typeof globalThis.btoa === 'function') {
|
|
26
|
+
return globalThis.btoa(unescape(encodeURIComponent(s)));
|
|
27
|
+
}
|
|
28
|
+
return Buffer.from(s, 'utf8').toString('base64');
|
|
29
|
+
}
|
package/src/capture.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { sealTrail, shouldSample } from '@goliapkg/sentori-core';
|
|
2
2
|
|
|
3
|
+
import { base64Utf8 } from './base64';
|
|
3
4
|
import {
|
|
4
5
|
__peekBreadcrumbCount,
|
|
5
6
|
addBreadcrumb,
|
|
@@ -8,7 +9,7 @@ import {
|
|
|
8
9
|
import { getBundleInfo } from './bundle-info';
|
|
9
10
|
import { getConfig, isInitialized } from './config';
|
|
10
11
|
import { getFeatureFlagSnapshot } from './feature-flags';
|
|
11
|
-
import { drainReplay } from './replay';
|
|
12
|
+
import { drainReplay, isReplayRunning } from './replay';
|
|
12
13
|
import { clearStateSnapshots, getStateSnapshots } from './state-snapshots';
|
|
13
14
|
import { symbolicateErrorViaMetro } from './handlers/dev-symbolicate';
|
|
14
15
|
import { captureScreenshot } from './handlers/screenshot';
|
|
@@ -143,6 +144,7 @@ export const captureError = (error: Error, extras?: CaptureExtras): void => {
|
|
|
143
144
|
'breadcrumbs=', crumbs.length,
|
|
144
145
|
'wantScreenshot=', config.screenshotsEnabled && extras?.screenshot !== false,
|
|
145
146
|
'wantSessionTrail=', config.sessionTrailEnabled,
|
|
147
|
+
'wantReplay=', isReplayRunning(),
|
|
146
148
|
);
|
|
147
149
|
}
|
|
148
150
|
|
|
@@ -184,6 +186,17 @@ export const captureError = (error: Error, extras?: CaptureExtras): void => {
|
|
|
184
186
|
const replayNdjson = drainReplay();
|
|
185
187
|
if (replayNdjson.length > 0) {
|
|
186
188
|
await captureAndAttachReplay(event, replayNdjson);
|
|
189
|
+
} else if (typeof __DEV__ !== 'undefined' && __DEV__ && isReplayRunning()) {
|
|
190
|
+
// rc.4 — explicit "replay was on but ring drained empty" signal.
|
|
191
|
+
// Without this, "kinds=screenshot,sessionTrail" looks
|
|
192
|
+
// indistinguishable from `replay: off` even though the ticks
|
|
193
|
+
// were healthy upstream. Insight 2026-05-18 verify shape made
|
|
194
|
+
// this gap painful to triage.
|
|
195
|
+
// eslint-disable-next-line no-console
|
|
196
|
+
console.warn(
|
|
197
|
+
'[sentori] replay drain empty (no frames buffered at captureException)',
|
|
198
|
+
'eventId=', event.id,
|
|
199
|
+
);
|
|
187
200
|
}
|
|
188
201
|
if (typeof __DEV__ !== 'undefined' && __DEV__) {
|
|
189
202
|
// eslint-disable-next-line no-console
|
|
@@ -202,25 +215,49 @@ export const captureError = (error: Error, extras?: CaptureExtras): void => {
|
|
|
202
215
|
|
|
203
216
|
/** v0.9.6 #2 — upload the wireframe replay ring as a `replay`
|
|
204
217
|
* attachment. Plain NDJSON (one snapshot per line) — server may
|
|
205
|
-
* gzip on storage; the network upload is base64.
|
|
218
|
+
* gzip on storage; the network upload is base64.
|
|
219
|
+
*
|
|
220
|
+
* rc.4: route through `base64Utf8` so non-Latin-1 text inside any
|
|
221
|
+
* walked TextView (Japanese / Chinese / em-dash etc.) doesn't blow
|
|
222
|
+
* up the Hermes-spec `btoa`. The pre-rc.4 inline `btoa(ndjson)` path
|
|
223
|
+
* threw `InvalidCharacterError` on those code points, the
|
|
224
|
+
* surrounding catch swallowed it silently, and the replay
|
|
225
|
+
* attachment never landed. Insight 2026-05-18 verify caught it
|
|
226
|
+
* after rc.3's walker fix surfaced deep TextView content. Dev
|
|
227
|
+
* logs replace the silent catch so the next failure shape is
|
|
228
|
+
* visible. */
|
|
206
229
|
async function captureAndAttachReplay(event: Event, ndjson: string): Promise<void> {
|
|
207
230
|
try {
|
|
208
|
-
const base64 =
|
|
209
|
-
typeof globalThis.btoa === 'function'
|
|
210
|
-
? globalThis.btoa(ndjson)
|
|
211
|
-
: Buffer.from(ndjson, 'utf8').toString('base64');
|
|
231
|
+
const base64 = base64Utf8(ndjson);
|
|
212
232
|
const meta = await uploadAttachment(
|
|
213
233
|
event.id,
|
|
214
234
|
'replay',
|
|
215
235
|
{ base64, mediaType: 'application/x-ndjson' },
|
|
216
236
|
{ source: 'js' },
|
|
217
237
|
);
|
|
218
|
-
if (meta) {
|
|
219
|
-
if (
|
|
220
|
-
|
|
238
|
+
if (!meta) {
|
|
239
|
+
if (typeof __DEV__ !== 'undefined' && __DEV__) {
|
|
240
|
+
// eslint-disable-next-line no-console
|
|
241
|
+
console.warn(
|
|
242
|
+
'[sentori] replay upload returned null',
|
|
243
|
+
'eventId=', event.id,
|
|
244
|
+
'ndjsonBytes=', ndjson.length,
|
|
245
|
+
);
|
|
246
|
+
}
|
|
247
|
+
return;
|
|
248
|
+
}
|
|
249
|
+
if (!event.attachments) event.attachments = [];
|
|
250
|
+
event.attachments.push(meta);
|
|
251
|
+
} catch (e) {
|
|
252
|
+
if (typeof __DEV__ !== 'undefined' && __DEV__) {
|
|
253
|
+
// eslint-disable-next-line no-console
|
|
254
|
+
console.warn(
|
|
255
|
+
'[sentori] replay attachment threw',
|
|
256
|
+
'eventId=', event.id,
|
|
257
|
+
'ndjsonBytes=', ndjson.length,
|
|
258
|
+
e,
|
|
259
|
+
);
|
|
221
260
|
}
|
|
222
|
-
} catch {
|
|
223
|
-
// best-effort
|
|
224
261
|
}
|
|
225
262
|
}
|
|
226
263
|
|
|
@@ -233,11 +270,7 @@ async function captureAndAttachStateSnapshots(
|
|
|
233
270
|
): Promise<void> {
|
|
234
271
|
try {
|
|
235
272
|
const payload = JSON.stringify({ snapshots });
|
|
236
|
-
const base64 =
|
|
237
|
-
typeof globalThis.btoa === 'function'
|
|
238
|
-
? globalThis.btoa(payload)
|
|
239
|
-
: // Bun / node fallback
|
|
240
|
-
Buffer.from(payload, 'utf8').toString('base64');
|
|
273
|
+
const base64 = base64Utf8(payload);
|
|
241
274
|
const meta = await uploadAttachment(
|
|
242
275
|
event.id,
|
|
243
276
|
'stateSnapshot',
|
|
@@ -267,12 +300,7 @@ async function captureAndAttachSessionTrail(event: Event): Promise<void> {
|
|
|
267
300
|
const payload = sealTrail(trail);
|
|
268
301
|
trail.clear();
|
|
269
302
|
const json = JSON.stringify(payload);
|
|
270
|
-
|
|
271
|
-
// trick the screenshot path uses).
|
|
272
|
-
const base64 =
|
|
273
|
-
typeof globalThis.btoa === 'function'
|
|
274
|
-
? globalThis.btoa(unescape(encodeURIComponent(json)))
|
|
275
|
-
: Buffer.from(json, 'utf-8').toString('base64');
|
|
303
|
+
const base64 = base64Utf8(json);
|
|
276
304
|
const attachment = await uploadAttachment(
|
|
277
305
|
event.id,
|
|
278
306
|
'sessionTrail',
|
|
@@ -289,6 +317,12 @@ async function captureAndAttachSessionTrail(event: Event): Promise<void> {
|
|
|
289
317
|
|
|
290
318
|
export const captureException = captureError;
|
|
291
319
|
|
|
320
|
+
/** rc.4 — test hook. The real replay attach path is internal so we
|
|
321
|
+
* don't bloat the public surface, but the encoding bug Insight hit
|
|
322
|
+
* on 2026-05-18 needs a behaviour-level test that exercises the
|
|
323
|
+
* same code path captureException runs in production. */
|
|
324
|
+
export const __captureAndAttachReplayForTests = captureAndAttachReplay;
|
|
325
|
+
|
|
292
326
|
/** Phase 42 sub-D.08: per-session screenshot quota gate. */
|
|
293
327
|
function allowScreenshot(): boolean {
|
|
294
328
|
const budget = screenshotBudget();
|
package/src/replay.ts
CHANGED
|
@@ -296,6 +296,15 @@ function loadNativeReplay(): ReplayNativeModule | null {
|
|
|
296
296
|
}
|
|
297
297
|
}
|
|
298
298
|
|
|
299
|
+
/** rc.4 — surface "is replay subsystem alive" so the captureException
|
|
300
|
+
* debug log can label `wantReplay` alongside `wantScreenshot` /
|
|
301
|
+
* `wantSessionTrail`. Insight 2026-05-18 verify flagged that the
|
|
302
|
+
* pre-rc.4 log line was missing `wantReplay`, leaving the failure
|
|
303
|
+
* shape ambiguous (config-off vs. ring-empty vs. attach-failed). */
|
|
304
|
+
export function isReplayRunning(): boolean {
|
|
305
|
+
return _running;
|
|
306
|
+
}
|
|
307
|
+
|
|
299
308
|
/** Drain the ring as NDJSON (one snapshot per line). Empty string
|
|
300
309
|
* when the ring is empty. Also clears the ring so the next session's
|
|
301
310
|
* replay starts fresh. */
|