@goliapkg/sentori-react-native 4.0.0 → 5.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/MIGRATION.md +131 -0
- package/README.md +40 -30
- package/android/build.gradle +21 -0
- package/android/src/main/java/com/sentori/SentoriCrashHandler.kt +29 -0
- package/android/src/main/java/com/sentori/SentoriModule.kt +8 -0
- package/android/src/main/java/com/sentori/SentoriScreenshotCapture.kt +36 -4
- package/android/src/test/java/com/sentori/SentoriCrashHandlerTest.kt +7 -2
- package/android/src/test/resources/robolectric.properties +10 -0
- package/ios/SentoriCrashHandler.swift +48 -4
- package/ios/SentoriModule.swift +12 -0
- package/ios/SentoriScreenshotCapture.swift +34 -3
- package/lib/config.d.ts +17 -47
- package/lib/config.d.ts.map +1 -1
- package/lib/config.js +3 -0
- package/lib/config.js.map +1 -1
- package/lib/device.d.ts +5 -0
- package/lib/device.d.ts.map +1 -0
- package/lib/device.js +29 -0
- package/lib/device.js.map +1 -0
- package/lib/emit-hooks.d.ts +7 -0
- package/lib/emit-hooks.d.ts.map +1 -0
- package/lib/emit-hooks.js +24 -0
- package/lib/emit-hooks.js.map +1 -0
- package/lib/error-boundary.d.ts.map +1 -1
- package/lib/error-boundary.js +1 -1
- package/lib/error-boundary.js.map +1 -1
- package/lib/feature-flags.d.ts.map +1 -1
- package/lib/handlers/dev-symbolicate.d.ts +1 -1
- package/lib/handlers/dev-symbolicate.d.ts.map +1 -1
- package/lib/handlers/dev-symbolicate.js +2 -0
- package/lib/handlers/dev-symbolicate.js.map +1 -1
- package/lib/handlers/global.js +1 -1
- package/lib/handlers/global.js.map +1 -1
- package/lib/handlers/lifecycle.js +3 -3
- package/lib/handlers/lifecycle.js.map +1 -1
- package/lib/handlers/network.d.ts +2 -2
- package/lib/handlers/network.d.ts.map +1 -1
- package/lib/handlers/network.js +69 -187
- package/lib/handlers/network.js.map +1 -1
- package/lib/handlers/promise.js +1 -1
- package/lib/handlers/promise.js.map +1 -1
- package/lib/handlers/screenshot.d.ts.map +1 -1
- package/lib/handlers/screenshot.js +3 -12
- package/lib/handlers/screenshot.js.map +1 -1
- package/lib/index.d.ts +32 -109
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +54 -103
- package/lib/index.js.map +1 -1
- package/lib/init.d.ts +3 -150
- package/lib/init.d.ts.map +1 -1
- package/lib/init.js +100 -261
- package/lib/init.js.map +1 -1
- package/lib/long-task-monitor.d.ts +1 -7
- package/lib/long-task-monitor.d.ts.map +1 -1
- package/lib/long-task-monitor.js +37 -58
- package/lib/long-task-monitor.js.map +1 -1
- package/lib/mask.d.ts +5 -13
- package/lib/mask.d.ts.map +1 -1
- package/lib/mask.js +29 -30
- package/lib/mask.js.map +1 -1
- package/lib/mobile-vitals.d.ts +3 -31
- package/lib/mobile-vitals.d.ts.map +1 -1
- package/lib/mobile-vitals.js +22 -61
- package/lib/mobile-vitals.js.map +1 -1
- package/lib/native-pending.d.ts +3 -0
- package/lib/native-pending.d.ts.map +1 -0
- package/lib/native-pending.js +64 -0
- package/lib/native-pending.js.map +1 -0
- package/lib/native.d.ts +4 -11
- package/lib/native.d.ts.map +1 -1
- package/lib/native.js +23 -0
- package/lib/native.js.map +1 -1
- package/lib/navigation.d.ts +3 -17
- package/lib/navigation.d.ts.map +1 -1
- package/lib/navigation.js +32 -133
- package/lib/navigation.js.map +1 -1
- package/lib/netinfo.d.ts +1 -1
- package/lib/netinfo.d.ts.map +1 -1
- package/lib/netinfo.js +2 -2
- package/lib/netinfo.js.map +1 -1
- package/lib/push.d.ts.map +1 -1
- package/lib/push.js +2 -4
- package/lib/push.js.map +1 -1
- package/lib/rage-tap.d.ts.map +1 -1
- package/lib/rage-tap.js +56 -23
- package/lib/rage-tap.js.map +1 -1
- package/lib/replay-screens.d.ts +15 -0
- package/lib/replay-screens.d.ts.map +1 -0
- package/lib/replay-screens.js +87 -0
- package/lib/replay-screens.js.map +1 -0
- package/lib/replay.d.ts.map +1 -1
- package/lib/replay.js +3 -24
- package/lib/replay.js.map +1 -1
- package/lib/responsiveness-detector.d.ts +18 -0
- package/lib/responsiveness-detector.d.ts.map +1 -0
- package/lib/responsiveness-detector.js +55 -0
- package/lib/responsiveness-detector.js.map +1 -0
- package/lib/scope.d.ts +7 -0
- package/lib/scope.d.ts.map +1 -0
- package/lib/scope.js +41 -0
- package/lib/scope.js.map +1 -0
- package/lib/transport.d.ts +19 -92
- package/lib/transport.d.ts.map +1 -1
- package/lib/transport.js +75 -288
- package/lib/transport.js.map +1 -1
- package/lib/verbs.d.ts +16 -0
- package/lib/verbs.d.ts.map +1 -0
- package/lib/verbs.js +153 -0
- package/lib/verbs.js.map +1 -0
- package/package.json +4 -3
- package/src/__tests__/iron-rule.test.ts +128 -0
- package/src/__tests__/replay-screens.test.ts +63 -0
- package/src/__tests__/responsiveness-detector.test.ts +74 -0
- package/src/__tests__/screenshot.test.ts +0 -2
- package/src/__tests__/transport.test.ts +66 -213
- package/src/__tests__/verbs.test.ts +91 -0
- package/src/config.ts +20 -47
- package/src/device.ts +36 -0
- package/src/emit-hooks.ts +30 -0
- package/src/error-boundary.tsx +1 -1
- package/src/handlers/dev-symbolicate.ts +2 -1
- package/src/handlers/global.ts +1 -1
- package/src/handlers/lifecycle.ts +3 -3
- package/src/handlers/network.ts +95 -211
- package/src/handlers/promise.ts +1 -1
- package/src/handlers/screenshot.ts +3 -11
- package/src/index.ts +84 -215
- package/src/init.ts +115 -449
- package/src/long-task-monitor.ts +42 -64
- package/src/mask.ts +29 -31
- package/src/mobile-vitals.ts +22 -82
- package/src/native-pending.ts +92 -0
- package/src/native.ts +33 -0
- package/src/navigation.ts +34 -142
- package/src/netinfo.ts +3 -3
- package/src/push.ts +2 -5
- package/src/rage-tap.tsx +72 -25
- package/src/replay-screens.ts +95 -0
- package/src/replay.ts +3 -20
- package/src/responsiveness-detector.ts +66 -0
- package/src/scope.ts +50 -0
- package/src/transport.ts +84 -371
- package/src/verbs.ts +198 -0
- package/lib/breadcrumbs.d.ts +0 -18
- package/lib/breadcrumbs.d.ts.map +0 -1
- package/lib/breadcrumbs.js +0 -42
- package/lib/breadcrumbs.js.map +0 -1
- package/lib/bundle-info.d.ts +0 -12
- package/lib/bundle-info.d.ts.map +0 -1
- package/lib/bundle-info.js +0 -73
- package/lib/bundle-info.js.map +0 -1
- package/lib/capture.d.ts +0 -140
- package/lib/capture.d.ts.map +0 -1
- package/lib/capture.js +0 -511
- package/lib/capture.js.map +0 -1
- package/lib/compat/sentry.d.ts +0 -126
- package/lib/compat/sentry.d.ts.map +0 -1
- package/lib/compat/sentry.js +0 -332
- package/lib/compat/sentry.js.map +0 -1
- package/lib/control-channel.d.ts +0 -6
- package/lib/control-channel.d.ts.map +0 -1
- package/lib/control-channel.js +0 -96
- package/lib/control-channel.js.map +0 -1
- package/lib/expo-compat.d.ts +0 -270
- package/lib/expo-compat.d.ts.map +0 -1
- package/lib/expo-compat.js +0 -500
- package/lib/expo-compat.js.map +0 -1
- package/lib/feedback-widget.d.ts +0 -35
- package/lib/feedback-widget.d.ts.map +0 -1
- package/lib/feedback-widget.js +0 -193
- package/lib/feedback-widget.js.map +0 -1
- package/lib/feedback.d.ts +0 -2
- package/lib/feedback.d.ts.map +0 -1
- package/lib/feedback.js +0 -17
- package/lib/feedback.js.map +0 -1
- package/lib/heartbeat.d.ts +0 -9
- package/lib/heartbeat.d.ts.map +0 -1
- package/lib/heartbeat.js +0 -138
- package/lib/heartbeat.js.map +0 -1
- package/lib/index.js.bak +0 -64
- package/lib/install-id.d.ts +0 -17
- package/lib/install-id.d.ts.map +0 -1
- package/lib/install-id.js +0 -125
- package/lib/install-id.js.map +0 -1
- package/lib/lifecycle.d.ts +0 -28
- package/lib/lifecycle.d.ts.map +0 -1
- package/lib/lifecycle.js +0 -73
- package/lib/lifecycle.js.map +0 -1
- package/lib/measure.d.ts +0 -4
- package/lib/measure.d.ts.map +0 -1
- package/lib/measure.js +0 -25
- package/lib/measure.js.map +0 -1
- package/lib/metrics.d.ts +0 -24
- package/lib/metrics.d.ts.map +0 -1
- package/lib/metrics.js +0 -81
- package/lib/metrics.js.map +0 -1
- package/lib/pre-crash-sentinel.d.ts +0 -12
- package/lib/pre-crash-sentinel.d.ts.map +0 -1
- package/lib/pre-crash-sentinel.js +0 -116
- package/lib/pre-crash-sentinel.js.map +0 -1
- package/lib/report-security.d.ts +0 -40
- package/lib/report-security.d.ts.map +0 -1
- package/lib/report-security.js +0 -159
- package/lib/report-security.js.map +0 -1
- package/lib/runtime-metrics-fps.d.ts +0 -19
- package/lib/runtime-metrics-fps.d.ts.map +0 -1
- package/lib/runtime-metrics-fps.js +0 -128
- package/lib/runtime-metrics-fps.js.map +0 -1
- package/lib/runtime-metrics-heap.d.ts +0 -13
- package/lib/runtime-metrics-heap.d.ts.map +0 -1
- package/lib/runtime-metrics-heap.js +0 -67
- package/lib/runtime-metrics-heap.js.map +0 -1
- package/lib/runtime-metrics-network.d.ts +0 -23
- package/lib/runtime-metrics-network.d.ts.map +0 -1
- package/lib/runtime-metrics-network.js +0 -99
- package/lib/runtime-metrics-network.js.map +0 -1
- package/lib/runtime-metrics.d.ts +0 -43
- package/lib/runtime-metrics.d.ts.map +0 -1
- package/lib/runtime-metrics.js +0 -115
- package/lib/runtime-metrics.js.map +0 -1
- package/lib/sample-profiler.d.ts +0 -21
- package/lib/sample-profiler.d.ts.map +0 -1
- package/lib/sample-profiler.js +0 -152
- package/lib/sample-profiler.js.map +0 -1
- package/lib/sentinel-context.d.ts +0 -4
- package/lib/sentinel-context.d.ts.map +0 -1
- package/lib/sentinel-context.js +0 -52
- package/lib/sentinel-context.js.map +0 -1
- package/lib/session-tracker.d.ts +0 -6
- package/lib/session-tracker.d.ts.map +0 -1
- package/lib/session-tracker.js +0 -50
- package/lib/session-tracker.js.map +0 -1
- package/lib/stack.d.ts +0 -3
- package/lib/stack.d.ts.map +0 -1
- package/lib/stack.js +0 -7
- package/lib/stack.js.map +0 -1
- package/lib/state-snapshots.d.ts +0 -33
- package/lib/state-snapshots.d.ts.map +0 -1
- package/lib/state-snapshots.js +0 -109
- package/lib/state-snapshots.js.map +0 -1
- package/lib/track.d.ts +0 -34
- package/lib/track.d.ts.map +0 -1
- package/lib/track.js +0 -107
- package/lib/track.js.map +0 -1
- package/lib/trail.d.ts +0 -12
- package/lib/trail.d.ts.map +0 -1
- package/lib/trail.js +0 -28
- package/lib/trail.js.map +0 -1
- package/lib/trust-score.d.ts +0 -20
- package/lib/trust-score.d.ts.map +0 -1
- package/lib/trust-score.js +0 -151
- package/lib/trust-score.js.map +0 -1
- package/lib/types.d.ts +0 -2
- package/lib/types.d.ts.map +0 -1
- package/lib/types.js +0 -4
- package/lib/types.js.map +0 -1
- package/lib/uuid.d.ts +0 -2
- package/lib/uuid.d.ts.map +0 -1
- package/lib/uuid.js +0 -3
- package/lib/uuid.js.map +0 -1
- package/src/__tests__/before-send.test.ts +0 -72
- package/src/__tests__/breadcrumbs.test.ts +0 -44
- package/src/__tests__/capture-replay.test.ts +0 -150
- package/src/__tests__/compat-sentry.test.ts +0 -121
- package/src/__tests__/control-channel.test.ts +0 -111
- package/src/__tests__/install-id.test.ts +0 -60
- package/src/__tests__/long-task-monitor.test.ts +0 -59
- package/src/__tests__/measure.test.ts +0 -45
- package/src/__tests__/navigation.test.ts +0 -175
- package/src/__tests__/push.test.ts +0 -238
- package/src/__tests__/report-security.test.ts +0 -106
- package/src/__tests__/runtime-metrics-instruments.test.ts +0 -109
- package/src/__tests__/runtime-metrics-network.test.ts +0 -78
- package/src/__tests__/sample-profiler.test.ts +0 -59
- package/src/__tests__/stack.test.ts +0 -45
- package/src/__tests__/state-snapshots.test.ts +0 -119
- package/src/__tests__/tracing.test.ts +0 -201
- package/src/__tests__/track.test.ts +0 -91
- package/src/__tests__/uuid.test.ts +0 -41
- package/src/breadcrumbs.ts +0 -57
- package/src/bundle-info.ts +0 -95
- package/src/capture.ts +0 -660
- package/src/compat/sentry.ts +0 -490
- package/src/control-channel.ts +0 -98
- package/src/expo-compat.ts +0 -698
- package/src/feedback-widget.tsx +0 -316
- package/src/feedback.ts +0 -21
- package/src/heartbeat.ts +0 -157
- package/src/install-id.ts +0 -146
- package/src/lifecycle.ts +0 -76
- package/src/measure.ts +0 -28
- package/src/metrics.ts +0 -94
- package/src/pre-crash-sentinel.ts +0 -140
- package/src/report-security.ts +0 -165
- package/src/runtime-metrics-fps.ts +0 -137
- package/src/runtime-metrics-heap.ts +0 -78
- package/src/runtime-metrics-network.ts +0 -103
- package/src/runtime-metrics.ts +0 -122
- package/src/sample-profiler.ts +0 -169
- package/src/sentinel-context.ts +0 -60
- package/src/session-tracker.ts +0 -53
- package/src/stack.ts +0 -10
- package/src/state-snapshots.ts +0 -133
- package/src/track.ts +0 -123
- package/src/trail.ts +0 -32
- package/src/trust-score.ts +0 -176
- package/src/types.ts +0 -21
- package/src/uuid.ts +0 -2
package/lib/replay.js
CHANGED
|
@@ -14,8 +14,7 @@
|
|
|
14
14
|
// rather than a 1 Hz slideshow.
|
|
15
15
|
//
|
|
16
16
|
// Wire schema: docs/replay-encoding-v2.md.
|
|
17
|
-
import { logger
|
|
18
|
-
import { getRegisteredMaskQuery } from './mask';
|
|
17
|
+
import { logger } from '@goliapkg/sentori-core';
|
|
19
18
|
import { describeWireframeNative } from './native';
|
|
20
19
|
/** Default capture interval (2 Hz). Override via `replay.hz`. rc.10
|
|
21
20
|
* rolled this back from rc.9's 4 Hz default: iOS sim measured 1 ms
|
|
@@ -103,19 +102,11 @@ function captureTick() {
|
|
|
103
102
|
logger.debug('replay', 'tick: first invocation');
|
|
104
103
|
_firstTickLogged = true;
|
|
105
104
|
}
|
|
106
|
-
let tickSpan = null;
|
|
107
|
-
try {
|
|
108
|
-
tickSpan = startSpan('sentori.replay.tick', { name: 'tick' });
|
|
109
|
-
}
|
|
110
|
-
catch {
|
|
111
|
-
// never fatal
|
|
112
|
-
}
|
|
113
105
|
try {
|
|
114
106
|
const maskIds = readMaskIds();
|
|
115
107
|
const snapshotJson = _nativeMod?.captureWireframe?.(maskIds);
|
|
116
108
|
if (typeof snapshotJson !== 'string' || snapshotJson.length === 0) {
|
|
117
109
|
handleEmptyTick(snapshotJson);
|
|
118
|
-
tickSpan?.finish({ status: 'ok' });
|
|
119
110
|
return;
|
|
120
111
|
}
|
|
121
112
|
let snapshot;
|
|
@@ -124,7 +115,6 @@ function captureTick() {
|
|
|
124
115
|
}
|
|
125
116
|
catch (e) {
|
|
126
117
|
logger.warn('replay', 'tick: native JSON parse failed', e);
|
|
127
|
-
tickSpan?.finish({ status: 'error' });
|
|
128
118
|
return;
|
|
129
119
|
}
|
|
130
120
|
_emptyTickCount = 0;
|
|
@@ -133,12 +123,8 @@ function captureTick() {
|
|
|
133
123
|
if (typeof __DEV__ !== 'undefined' && __DEV__) {
|
|
134
124
|
diagnosticForTick(snapshot, snapshotJson.length);
|
|
135
125
|
}
|
|
136
|
-
tickSpan?.finish({ status: 'ok' });
|
|
137
126
|
}
|
|
138
127
|
catch (e) {
|
|
139
|
-
if (e instanceof Error)
|
|
140
|
-
tickSpan?.setTag('error.message', e.message);
|
|
141
|
-
tickSpan?.finish({ status: 'error' });
|
|
142
128
|
logger.warn('replay', 'tick threw', e);
|
|
143
129
|
}
|
|
144
130
|
}
|
|
@@ -257,15 +243,8 @@ function diagnosticForTick(snapshot, snapshotBytes) {
|
|
|
257
243
|
}
|
|
258
244
|
}
|
|
259
245
|
function readMaskIds() {
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
return [];
|
|
263
|
-
try {
|
|
264
|
-
return q();
|
|
265
|
-
}
|
|
266
|
-
catch {
|
|
267
|
-
return [];
|
|
268
|
-
}
|
|
246
|
+
// Masking returns with a v1 privacy pass; nothing masks today.
|
|
247
|
+
return [];
|
|
269
248
|
}
|
|
270
249
|
function loadNativeReplay() {
|
|
271
250
|
try {
|
package/lib/replay.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"replay.js","sourceRoot":"","sources":["../src/replay.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAC/C,EAAE;AACF,sEAAsE;AACtE,mEAAmE;AACnE,wEAAwE;AACxE,uEAAuE;AACvE,qEAAqE;AACrE,+CAA+C;AAC/C,mEAAmE;AACnE,EAAE;AACF,uEAAuE;AACvE,oEAAoE;AACpE,qEAAqE;AACrE,gCAAgC;AAChC,EAAE;AACF,2CAA2C;AAE3C,OAAO,EAAE,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"replay.js","sourceRoot":"","sources":["../src/replay.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export declare const RESPONSE_WINDOW_MS = 1500;
|
|
2
|
+
export declare const SLUGGISH_MS = 1000;
|
|
3
|
+
export declare const DEAD_THRESHOLD = 3;
|
|
4
|
+
export declare const DEAD_WINDOW_MS = 30000;
|
|
5
|
+
export declare const SLUGGISH_COOLDOWN_MS = 60000;
|
|
6
|
+
export type TapOutcome = 'dead' | 'responsive' | 'sluggish';
|
|
7
|
+
/** Judge one tap by the ring signals that followed it.
|
|
8
|
+
* `signalTimes` are the timestamps (ms) of every non-tap signal
|
|
9
|
+
* recorded after `tapAt`. */
|
|
10
|
+
export declare function classifyTap(tapAt: number, signalTimes: number[]): TapOutcome;
|
|
11
|
+
/** Per-target dead-tap bookkeeping. Returns true when this dead tap
|
|
12
|
+
* crosses the warn threshold (and clears the bucket so the next
|
|
13
|
+
* warn needs a fresh run of dead taps). */
|
|
14
|
+
export declare function recordDeadTap(buckets: Map<number, number[]>, target: number, now: number): boolean;
|
|
15
|
+
/** Per-target sluggish cooldown. Returns true when a warn should
|
|
16
|
+
* fire (and stamps the cooldown). */
|
|
17
|
+
export declare function recordSluggish(lastWarnAt: Map<number, number>, target: number, now: number): boolean;
|
|
18
|
+
//# sourceMappingURL=responsiveness-detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"responsiveness-detector.d.ts","sourceRoot":"","sources":["../src/responsiveness-detector.ts"],"names":[],"mappings":"AAiBA,eAAO,MAAM,kBAAkB,OAAQ,CAAC;AACxC,eAAO,MAAM,WAAW,OAAQ,CAAC;AACjC,eAAO,MAAM,cAAc,IAAI,CAAC;AAChC,eAAO,MAAM,cAAc,QAAS,CAAC;AACrC,eAAO,MAAM,oBAAoB,QAAS,CAAC;AAE3C,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,YAAY,GAAG,UAAU,CAAC;AAE5D;;8BAE8B;AAC9B,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,UAAU,CAM5E;AAED;;4CAE4C;AAC5C,wBAAgB,aAAa,CAC3B,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAC9B,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,GACV,OAAO,CAST;AAED;sCACsC;AACtC,wBAAgB,cAAc,CAC5B,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAC/B,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,GACV,OAAO,CAKT"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
// dead_button / sluggish_button — pure detection logic.
|
|
2
|
+
//
|
|
3
|
+
// A tap is judged by what the signal ring records after it: any
|
|
4
|
+
// non-tap signal (navigation, network, a trace point) inside the
|
|
5
|
+
// response window counts as the app reacting.
|
|
6
|
+
//
|
|
7
|
+
// - responsive: a reaction within SLUGGISH_MS.
|
|
8
|
+
// - sluggish: a reaction, but slower than SLUGGISH_MS.
|
|
9
|
+
// - dead: no reaction at all inside RESPONSE_WINDOW_MS.
|
|
10
|
+
//
|
|
11
|
+
// One dead tap is usually decoration (backgrounds, labels), so a
|
|
12
|
+
// dead_button warn needs DEAD_THRESHOLD dead taps on the SAME
|
|
13
|
+
// target inside DEAD_WINDOW_MS — a user repeatedly poking one
|
|
14
|
+
// unresponsive control, at a slower cadence than a rage tap.
|
|
15
|
+
// Sluggish warns are per-target cooldown-limited so one slow
|
|
16
|
+
// button files one issue, not one per tap.
|
|
17
|
+
export const RESPONSE_WINDOW_MS = 1_500;
|
|
18
|
+
export const SLUGGISH_MS = 1_000;
|
|
19
|
+
export const DEAD_THRESHOLD = 3;
|
|
20
|
+
export const DEAD_WINDOW_MS = 30_000;
|
|
21
|
+
export const SLUGGISH_COOLDOWN_MS = 60_000;
|
|
22
|
+
/** Judge one tap by the ring signals that followed it.
|
|
23
|
+
* `signalTimes` are the timestamps (ms) of every non-tap signal
|
|
24
|
+
* recorded after `tapAt`. */
|
|
25
|
+
export function classifyTap(tapAt, signalTimes) {
|
|
26
|
+
const first = signalTimes
|
|
27
|
+
.filter((t) => t > tapAt && t - tapAt <= RESPONSE_WINDOW_MS)
|
|
28
|
+
.sort((a, b) => a - b)[0];
|
|
29
|
+
if (first === undefined)
|
|
30
|
+
return 'dead';
|
|
31
|
+
return first - tapAt > SLUGGISH_MS ? 'sluggish' : 'responsive';
|
|
32
|
+
}
|
|
33
|
+
/** Per-target dead-tap bookkeeping. Returns true when this dead tap
|
|
34
|
+
* crosses the warn threshold (and clears the bucket so the next
|
|
35
|
+
* warn needs a fresh run of dead taps). */
|
|
36
|
+
export function recordDeadTap(buckets, target, now) {
|
|
37
|
+
const fresh = (buckets.get(target) ?? []).filter((t) => now - t <= DEAD_WINDOW_MS);
|
|
38
|
+
fresh.push(now);
|
|
39
|
+
if (fresh.length >= DEAD_THRESHOLD) {
|
|
40
|
+
buckets.delete(target);
|
|
41
|
+
return true;
|
|
42
|
+
}
|
|
43
|
+
buckets.set(target, fresh);
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
/** Per-target sluggish cooldown. Returns true when a warn should
|
|
47
|
+
* fire (and stamps the cooldown). */
|
|
48
|
+
export function recordSluggish(lastWarnAt, target, now) {
|
|
49
|
+
const last = lastWarnAt.get(target);
|
|
50
|
+
if (last !== undefined && now - last < SLUGGISH_COOLDOWN_MS)
|
|
51
|
+
return false;
|
|
52
|
+
lastWarnAt.set(target, now);
|
|
53
|
+
return true;
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=responsiveness-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"responsiveness-detector.js","sourceRoot":"","sources":["../src/responsiveness-detector.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,EAAE;AACF,gEAAgE;AAChE,iEAAiE;AACjE,8CAA8C;AAC9C,EAAE;AACF,iDAAiD;AACjD,2DAA2D;AAC3D,gEAAgE;AAChE,EAAE;AACF,iEAAiE;AACjE,8DAA8D;AAC9D,8DAA8D;AAC9D,6DAA6D;AAC7D,6DAA6D;AAC7D,2CAA2C;AAE3C,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,CAAC;AACxC,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,CAAC;AACjC,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC;AAChC,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,CAAC;AACrC,MAAM,CAAC,MAAM,oBAAoB,GAAG,MAAM,CAAC;AAI3C;;8BAE8B;AAC9B,MAAM,UAAU,WAAW,CAAC,KAAa,EAAE,WAAqB;IAC9D,MAAM,KAAK,GAAG,WAAW;SACtB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,GAAG,KAAK,IAAI,kBAAkB,CAAC;SAC3D,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5B,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC;IACvC,OAAO,KAAK,GAAG,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC;AACjE,CAAC;AAED;;4CAE4C;AAC5C,MAAM,UAAU,aAAa,CAC3B,OAA8B,EAC9B,MAAc,EACd,GAAW;IAEX,MAAM,KAAK,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,IAAI,cAAc,CAAC,CAAC;IACnF,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChB,IAAI,KAAK,CAAC,MAAM,IAAI,cAAc,EAAE,CAAC;QACnC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACvB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC3B,OAAO,KAAK,CAAC;AACf,CAAC;AAED;sCACsC;AACtC,MAAM,UAAU,cAAc,CAC5B,UAA+B,EAC/B,MAAc,EACd,GAAW;IAEX,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACpC,IAAI,IAAI,KAAK,SAAS,IAAI,GAAG,GAAG,IAAI,GAAG,oBAAoB;QAAE,OAAO,KAAK,CAAC;IAC1E,UAAU,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC5B,OAAO,IAAI,CAAC;AACd,CAAC"}
|
package/lib/scope.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { User } from '@goliapkg/sentori-core';
|
|
2
|
+
export declare const setUser: (u: User | null) => void | undefined;
|
|
3
|
+
export declare const patchContext: (patch: Record<string, unknown>) => void | undefined;
|
|
4
|
+
export declare const currentUserKey: () => string | undefined;
|
|
5
|
+
export declare const currentContext: () => Record<string, unknown> | undefined;
|
|
6
|
+
export declare const __resetForTests: () => void;
|
|
7
|
+
//# sourceMappingURL=scope.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scope.d.ts","sourceRoot":"","sources":["../src/scope.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAOnD,eAAO,MAAM,OAAO,sCAmBlB,CAAC;AAEH,eAAO,MAAM,YAAY,sDAIvB,CAAC;AAEH,eAAO,MAAM,cAAc,QAAO,MAAM,GAAG,SAAqB,CAAC;AAEjE,eAAO,MAAM,cAAc,QAAO,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SACI,CAAC;AAEjE,eAAO,MAAM,eAAe,QAAO,IAKlC,CAAC"}
|
package/lib/scope.js
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
// Ambient scope: the current user and the context patch, attached
|
|
2
|
+
// to every outgoing event. Two verbs own this state (user() and
|
|
3
|
+
// context()); everything else reads it.
|
|
4
|
+
import { hashIdentities, safeFn } from '@goliapkg/sentori-core';
|
|
5
|
+
let _user = null;
|
|
6
|
+
let _userKey;
|
|
7
|
+
let _context = {};
|
|
8
|
+
let _hashGeneration = 0;
|
|
9
|
+
export const setUser = safeFn('user', function setUser(u) {
|
|
10
|
+
_user = u;
|
|
11
|
+
_userKey = undefined;
|
|
12
|
+
const generation = ++_hashGeneration;
|
|
13
|
+
if (u === null)
|
|
14
|
+
return;
|
|
15
|
+
// The wire carries only a salted hash — raw identity never leaves
|
|
16
|
+
// the device (breadth × depth needs distinctness, not identity).
|
|
17
|
+
// Hashing is async (WebCrypto); the verb stays synchronous and the
|
|
18
|
+
// key lands a tick later. Events sent in that gap simply carry no
|
|
19
|
+
// userKey, which only under-counts breadth briefly.
|
|
20
|
+
void hashIdentities({ email: u.email, id: u.id })
|
|
21
|
+
.then((hashes) => {
|
|
22
|
+
if (generation === _hashGeneration) {
|
|
23
|
+
_userKey = hashes.id ?? hashes.email;
|
|
24
|
+
}
|
|
25
|
+
})
|
|
26
|
+
.catch(() => {
|
|
27
|
+
// NEVER rule: no key beats a raw identity on the wire.
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
export const patchContext = safeFn('context', function patchContext(patch) {
|
|
31
|
+
_context = { ..._context, ...patch };
|
|
32
|
+
});
|
|
33
|
+
export const currentUserKey = () => _userKey;
|
|
34
|
+
export const currentContext = () => Object.keys(_context).length > 0 ? { ..._context } : undefined;
|
|
35
|
+
export const __resetForTests = () => {
|
|
36
|
+
_user = null;
|
|
37
|
+
_userKey = undefined;
|
|
38
|
+
_context = {};
|
|
39
|
+
_hashGeneration++;
|
|
40
|
+
};
|
|
41
|
+
//# sourceMappingURL=scope.js.map
|
package/lib/scope.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scope.js","sourceRoot":"","sources":["../src/scope.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,gEAAgE;AAChE,wCAAwC;AAExC,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAGhE,IAAI,KAAK,GAAgB,IAAI,CAAC;AAC9B,IAAI,QAA4B,CAAC;AACjC,IAAI,QAAQ,GAA4B,EAAE,CAAC;AAC3C,IAAI,eAAe,GAAG,CAAC,CAAC;AAExB,MAAM,CAAC,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,SAAS,OAAO,CAAC,CAAc;IACnE,KAAK,GAAG,CAAC,CAAC;IACV,QAAQ,GAAG,SAAS,CAAC;IACrB,MAAM,UAAU,GAAG,EAAE,eAAe,CAAC;IACrC,IAAI,CAAC,KAAK,IAAI;QAAE,OAAO;IACvB,kEAAkE;IAClE,iEAAiE;IACjE,mEAAmE;IACnE,kEAAkE;IAClE,oDAAoD;IACpD,KAAK,cAAc,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;SAC9C,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;QACf,IAAI,UAAU,KAAK,eAAe,EAAE,CAAC;YACnC,QAAQ,GAAG,MAAM,CAAC,EAAE,IAAI,MAAM,CAAC,KAAK,CAAC;QACvC,CAAC;IACH,CAAC,CAAC;SACD,KAAK,CAAC,GAAG,EAAE;QACV,uDAAuD;IACzD,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,YAAY,GAAG,MAAM,CAAC,SAAS,EAAE,SAAS,YAAY,CACjE,KAA8B;IAE9B,QAAQ,GAAG,EAAE,GAAG,QAAQ,EAAE,GAAG,KAAK,EAAE,CAAC;AACvC,CAAC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,cAAc,GAAG,GAAuB,EAAE,CAAC,QAAQ,CAAC;AAEjE,MAAM,CAAC,MAAM,cAAc,GAAG,GAAwC,EAAE,CACtE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,QAAQ,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AAEjE,MAAM,CAAC,MAAM,eAAe,GAAG,GAAS,EAAE;IACxC,KAAK,GAAG,IAAI,CAAC;IACb,QAAQ,GAAG,SAAS,CAAC;IACrB,QAAQ,GAAG,EAAE,CAAC;IACd,eAAe,EAAE,CAAC;AACpB,CAAC,CAAC"}
|
package/lib/transport.d.ts
CHANGED
|
@@ -1,101 +1,28 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
export declare const enqueue: (event:
|
|
1
|
+
import type { AssertStat, WireEvent } from '@goliapkg/sentori-core';
|
|
2
|
+
export declare const enqueue: (event: WireEvent) => void;
|
|
3
|
+
/**
|
|
4
|
+
* Count an assert outcome. Pass-counts NEVER become events — they
|
|
5
|
+
* aggregate here and ride the next batch envelope (the liveness
|
|
6
|
+
* ledger without a heartbeat flood).
|
|
7
|
+
*/
|
|
8
|
+
export declare const countAssert: (name: string, ok: boolean, release: string) => void;
|
|
3
9
|
export declare const startTransport: () => void;
|
|
4
|
-
export declare const flushSpans: () => Promise<void>;
|
|
5
10
|
export declare const flush: () => Promise<void>;
|
|
6
11
|
export declare const drainOfflineQueue: () => Promise<void>;
|
|
7
|
-
export declare const __resetForTests: () => void;
|
|
8
|
-
export declare const __peekQueue: () => readonly Event[];
|
|
9
|
-
/**
|
|
10
|
-
* Phase 26 sub-B: session ping transport. Best-effort; we don't queue
|
|
11
|
-
* pings the way we queue events because they fire on background and
|
|
12
|
-
* AsyncStorage writes during background can be killed by the OS. If
|
|
13
|
-
* the network's down, the ping is lost — the session counters tolerate
|
|
14
|
-
* this.
|
|
15
|
-
*/
|
|
16
|
-
export declare const sendSessionPing: (ingestUrl: string, token: string, ping: unknown) => Promise<void>;
|
|
17
|
-
/**
|
|
18
|
-
* v1.1 chunk B — flush a batched set of `sentori.track()` analytics
|
|
19
|
-
* events. The host SDK batches calls into a fixed-size ring drained
|
|
20
|
-
* every 30 s. Best-effort; a failure drops the batch.
|
|
21
|
-
*/
|
|
22
|
-
export declare const sendTrackBatch: (ingestUrl: string, token: string, events: Array<{
|
|
23
|
-
environment?: string;
|
|
24
|
-
name: string;
|
|
25
|
-
props?: Record<string, unknown>;
|
|
26
|
-
release?: string;
|
|
27
|
-
route?: string;
|
|
28
|
-
sessionId?: string;
|
|
29
|
-
ts: string;
|
|
30
|
-
userId?: string;
|
|
31
|
-
}>) => Promise<void>;
|
|
32
12
|
/**
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
* up one fetch per point. Best-effort, no retry.
|
|
13
|
+
* Upload one attachment for an already-enqueued event. Returns null
|
|
14
|
+
* on any non-fatal failure — the event still ships without the
|
|
15
|
+
* attachment so the crash itself is never lost.
|
|
37
16
|
*/
|
|
38
|
-
export declare const
|
|
39
|
-
name: string;
|
|
40
|
-
tags?: Record<string, string>;
|
|
41
|
-
ts?: string;
|
|
42
|
-
value: number;
|
|
43
|
-
}>) => Promise<void>;
|
|
44
|
-
/**
|
|
45
|
-
* v2.1 W2 — POST a batched set of auto-instrument runtime metric
|
|
46
|
-
* points. Sibling of sendMetricsBatch; different endpoint
|
|
47
|
-
* (`/v1/runtime-metrics:batch`) because the storage shape +
|
|
48
|
-
* validation rules + rate-limit budget differ — see
|
|
49
|
-
* docs/design/v2-metrics.md.
|
|
50
|
-
*
|
|
51
|
-
* Returns true on 2xx so the caller can leave the batch drained;
|
|
52
|
-
* returns false on anything else (network error / non-2xx) so the
|
|
53
|
-
* caller rebuffer-and-retries on the next flush via
|
|
54
|
-
* `rebufferRuntimeMetrics(batch)`.
|
|
55
|
-
*/
|
|
56
|
-
export declare const sendRuntimeMetricsBatch: (ingestUrl: string, token: string, metrics: Array<{
|
|
57
|
-
name: string;
|
|
58
|
-
tags?: Record<string, string>;
|
|
59
|
-
ts: string;
|
|
60
|
-
value: number;
|
|
61
|
-
}>) => Promise<boolean>;
|
|
62
|
-
/**
|
|
63
|
-
* v0.8.2 — submit a user-supplied bug report. Fire-and-forget; resolves
|
|
64
|
-
* with the server-assigned id on success or `null` on any failure.
|
|
65
|
-
* The host app typically calls this from a "Report a problem" form;
|
|
66
|
-
* pass `eventId` if you're reporting a specific crash the user just
|
|
67
|
-
* saw so the report links to that event's issue automatically.
|
|
68
|
-
*/
|
|
69
|
-
export declare const sendUserReport: (ingestUrl: string, token: string, report: {
|
|
70
|
-
body: string;
|
|
71
|
-
email?: string;
|
|
72
|
-
eventId?: string;
|
|
73
|
-
name?: string;
|
|
74
|
-
title: string;
|
|
75
|
-
}) => Promise<null | {
|
|
76
|
-
id: string;
|
|
77
|
-
issueId: null | string;
|
|
78
|
-
}>;
|
|
79
|
-
/**
|
|
80
|
-
* Upload a base64-encoded binary blob as an attachment for a known
|
|
81
|
-
* event. The event must NOT have been POSTed yet — the server-side
|
|
82
|
-
* ingest validation in events.rs only honours `event.attachments[].ref`
|
|
83
|
-
* when the matching `event_attachments` row already exists for the
|
|
84
|
-
* same (event_id, project_id). Caller's contract:
|
|
85
|
-
*
|
|
86
|
-
* 1. Generate `event.id` (uuidV7).
|
|
87
|
-
* 2. Build the blob (e.g. via `captureScreenshot`).
|
|
88
|
-
* 3. `await uploadAttachment(...)` → get `{ ref, sizeBytes, mediaType }`.
|
|
89
|
-
* 4. Push `{ ref, kind, ... }` into `event.attachments` then enqueue.
|
|
90
|
-
*
|
|
91
|
-
* Returns `null` on any non-fatal failure (network down, store
|
|
92
|
-
* disabled, 4xx, timeout). The error event still ships without the
|
|
93
|
-
* attachment so we never lose the actual crash.
|
|
94
|
-
*/
|
|
95
|
-
export declare const uploadAttachment: (eventId: string, kind: import("./types").AttachmentMeta["kind"], blob: {
|
|
17
|
+
export declare const uploadAttachment: (eventId: string, kind: import('@goliapkg/sentori-core').AttachmentKind, blob: {
|
|
96
18
|
base64: string;
|
|
97
19
|
mediaType: string;
|
|
98
20
|
}, opts?: {
|
|
99
|
-
source?:
|
|
100
|
-
}) => Promise<
|
|
21
|
+
source?: 'android' | 'ios' | 'js';
|
|
22
|
+
}) => Promise<{
|
|
23
|
+
ref: string;
|
|
24
|
+
} | null>;
|
|
25
|
+
export declare const __resetForTests: () => void;
|
|
26
|
+
export declare const __peekQueue: () => readonly WireEvent[];
|
|
27
|
+
export declare const __peekAssertStats: () => readonly AssertStat[];
|
|
101
28
|
//# 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":"
|
|
1
|
+
{"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,UAAU,EAAiB,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAmBnF,eAAO,MAAM,OAAO,UAAW,SAAS,KAAG,IAU1C,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,WAAW,SAAU,MAAM,MAAM,OAAO,WAAW,MAAM,KAAG,IAcxE,CAAC;AAEF,eAAO,MAAM,cAAc,QAAO,IAEjC,CAAC;AAEF,eAAO,MAAM,KAAK,QAAa,OAAO,CAAC,IAAI,CAuB1C,CAAC;AAiGF,eAAO,MAAM,iBAAiB,QAAa,OAAO,CAAC,IAAI,CAatD,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,YAClB,MAAM,QACT,OAAO,wBAAwB,EAAE,cAAc,QAC/C;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,SACrC;IAAE,MAAM,CAAC,EAAE,SAAS,GAAG,KAAK,GAAG,IAAI,CAAA;CAAE,KAC1C,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAgChC,CAAC;AAEF,eAAO,MAAM,eAAe,QAAO,IAMlC,CAAC;AAEF,eAAO,MAAM,WAAW,QAAO,SAAS,SAAS,EAAY,CAAC;AAC9D,eAAO,MAAM,iBAAiB,QAAO,SAAS,UAAU,EAAgC,CAAC"}
|