@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/feedback-widget.js
DELETED
|
@@ -1,193 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
-
// v0.9.1 #9 — Feedback Widget.
|
|
3
|
-
//
|
|
4
|
-
// `<FeedbackButton trigger="shake|manual|fab" />` — drop into the
|
|
5
|
-
// app root, opens a modal prompt that submits via the existing
|
|
6
|
-
// `sentori.sendUserFeedback` API. Shake detection is opt-in and
|
|
7
|
-
// requires `expo-sensors` (Accelerometer) — falls back to manual
|
|
8
|
-
// trigger if not installed. The button can also be controlled
|
|
9
|
-
// programmatically via a ref: `feedbackRef.current.open()`.
|
|
10
|
-
//
|
|
11
|
-
// Aesthetic: very plain Modal + Text + TextInput so it adopts the
|
|
12
|
-
// host app's color scheme without forcing a sentori theme on it.
|
|
13
|
-
import { forwardRef, useCallback, useEffect, useImperativeHandle, useRef, useState, } from 'react';
|
|
14
|
-
import { Modal, Pressable, StyleSheet, Text, TextInput, View, } from 'react-native';
|
|
15
|
-
import { sendUserFeedback } from './capture';
|
|
16
|
-
import { isAnyNativeModuleLinked } from './native-loader';
|
|
17
|
-
export const FeedbackButton = forwardRef(function FeedbackButton(props, ref) {
|
|
18
|
-
const trigger = props.trigger ?? 'fab';
|
|
19
|
-
const [open, setOpen] = useState(false);
|
|
20
|
-
const [title, setTitle] = useState('');
|
|
21
|
-
const [body, setBody] = useState('');
|
|
22
|
-
const [email, setEmail] = useState('');
|
|
23
|
-
const [submitting, setSubmitting] = useState(false);
|
|
24
|
-
const [sent, setSent] = useState(false);
|
|
25
|
-
const eventIdRef = useRef(props.eventId);
|
|
26
|
-
useImperativeHandle(ref, () => ({
|
|
27
|
-
open: (defaults) => {
|
|
28
|
-
setTitle(defaults?.title ?? '');
|
|
29
|
-
setBody(defaults?.body ?? '');
|
|
30
|
-
eventIdRef.current = defaults?.eventId ?? props.eventId;
|
|
31
|
-
setSent(false);
|
|
32
|
-
setOpen(true);
|
|
33
|
-
},
|
|
34
|
-
close: () => setOpen(false),
|
|
35
|
-
}), [props.eventId]);
|
|
36
|
-
// Shake detection — opt-in. We load expo-sensors lazily so apps
|
|
37
|
-
// that don't install it never pay the bundle cost. Same native
|
|
38
|
-
// module guard as netinfo: if the JS package is in node_modules
|
|
39
|
-
// but native bridge isn't linked we'd otherwise crash inside the
|
|
40
|
-
// sensor emitter.
|
|
41
|
-
useEffect(() => {
|
|
42
|
-
if (trigger !== 'shake')
|
|
43
|
-
return;
|
|
44
|
-
if (!isAnyNativeModuleLinked(['ExponentAccelerometer', 'EXAccelerometer', 'ExpoAccelerometer'])) {
|
|
45
|
-
return;
|
|
46
|
-
}
|
|
47
|
-
let sub = null;
|
|
48
|
-
try {
|
|
49
|
-
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
50
|
-
const mod = require('expo-sensors');
|
|
51
|
-
const A = mod.Accelerometer;
|
|
52
|
-
if (!A)
|
|
53
|
-
return;
|
|
54
|
-
A.setUpdateInterval(100);
|
|
55
|
-
const thr = props.shakeThreshold ?? 18;
|
|
56
|
-
let lastTriggerAt = 0;
|
|
57
|
-
sub = A.addListener(({ x, y, z }) => {
|
|
58
|
-
const mag = Math.sqrt(x * x + y * y + z * z) * 9.81; // g → m/s²
|
|
59
|
-
const now = Date.now();
|
|
60
|
-
if (mag > thr && now - lastTriggerAt > 1500) {
|
|
61
|
-
lastTriggerAt = now;
|
|
62
|
-
setSent(false);
|
|
63
|
-
setOpen(true);
|
|
64
|
-
}
|
|
65
|
-
});
|
|
66
|
-
}
|
|
67
|
-
catch {
|
|
68
|
-
// expo-sensors not installed → silently fall back to manual
|
|
69
|
-
}
|
|
70
|
-
return () => {
|
|
71
|
-
if (sub)
|
|
72
|
-
sub.remove();
|
|
73
|
-
};
|
|
74
|
-
}, [trigger, props.shakeThreshold]);
|
|
75
|
-
const onSubmit = useCallback(async () => {
|
|
76
|
-
if (!title.trim() || !body.trim())
|
|
77
|
-
return;
|
|
78
|
-
setSubmitting(true);
|
|
79
|
-
try {
|
|
80
|
-
await sendUserFeedback({
|
|
81
|
-
title: title.trim().slice(0, 200),
|
|
82
|
-
body: body.trim().slice(0, 8000),
|
|
83
|
-
email: email.trim() || undefined,
|
|
84
|
-
eventId: eventIdRef.current,
|
|
85
|
-
});
|
|
86
|
-
setSent(true);
|
|
87
|
-
setTimeout(() => setOpen(false), 1200);
|
|
88
|
-
}
|
|
89
|
-
finally {
|
|
90
|
-
setSubmitting(false);
|
|
91
|
-
}
|
|
92
|
-
}, [title, body, email]);
|
|
93
|
-
const L = {
|
|
94
|
-
bodyPlaceholder: 'What happened?',
|
|
95
|
-
cancel: 'Cancel',
|
|
96
|
-
emailPlaceholder: 'email (optional)',
|
|
97
|
-
sent: 'Thanks — report sent.',
|
|
98
|
-
submit: 'Send',
|
|
99
|
-
title: 'Report a problem',
|
|
100
|
-
...props.labels,
|
|
101
|
-
};
|
|
102
|
-
return (_jsxs(_Fragment, { children: [trigger === 'fab' && (_jsx(Pressable, { accessibilityLabel: "Open feedback", onPress: () => {
|
|
103
|
-
setSent(false);
|
|
104
|
-
setOpen(true);
|
|
105
|
-
}, style: styles.fab, children: _jsx(Text, { style: styles.fabText, children: "?" }) })), _jsx(Modal, { animationType: "fade", transparent: true, visible: open, onRequestClose: () => setOpen(false), children: _jsx(View, { style: styles.backdrop, children: _jsx(View, { style: styles.card, children: sent ? (_jsx(Text, { style: styles.sentMessage, children: L.sent })) : (_jsxs(_Fragment, { children: [_jsx(Text, { style: styles.heading, children: L.title }), _jsx(TextInput, { autoCapitalize: "sentences", onChangeText: setTitle, placeholder: "Subject", placeholderTextColor: "#888", style: styles.titleInput, value: title }), _jsx(TextInput, { multiline: true, onChangeText: setBody, placeholder: L.bodyPlaceholder, placeholderTextColor: "#888", style: styles.bodyInput, textAlignVertical: "top", value: body }), _jsx(TextInput, { autoCapitalize: "none", keyboardType: "email-address", onChangeText: setEmail, placeholder: L.emailPlaceholder, placeholderTextColor: "#888", style: styles.emailInput, value: email }), _jsxs(View, { style: styles.actions, children: [_jsx(Pressable, { onPress: () => setOpen(false), style: styles.cancelBtn, children: _jsx(Text, { style: styles.cancelText, children: L.cancel }) }), _jsx(Pressable, { disabled: submitting || !title.trim() || !body.trim(), onPress: onSubmit, style: [styles.submitBtn, submitting && styles.submitBtnDisabled], children: _jsx(Text, { style: styles.submitText, children: submitting ? '…' : L.submit }) })] })] })) }) }) })] }));
|
|
106
|
-
});
|
|
107
|
-
const styles = StyleSheet.create({
|
|
108
|
-
actions: {
|
|
109
|
-
flexDirection: 'row',
|
|
110
|
-
gap: 8,
|
|
111
|
-
justifyContent: 'flex-end',
|
|
112
|
-
},
|
|
113
|
-
backdrop: {
|
|
114
|
-
alignItems: 'center',
|
|
115
|
-
backgroundColor: 'rgba(0,0,0,0.5)',
|
|
116
|
-
flex: 1,
|
|
117
|
-
justifyContent: 'center',
|
|
118
|
-
paddingHorizontal: 24,
|
|
119
|
-
},
|
|
120
|
-
bodyInput: {
|
|
121
|
-
backgroundColor: '#f7f7f8',
|
|
122
|
-
borderColor: '#e5e5e8',
|
|
123
|
-
borderRadius: 6,
|
|
124
|
-
borderWidth: 1,
|
|
125
|
-
color: '#111',
|
|
126
|
-
fontSize: 14,
|
|
127
|
-
marginBottom: 8,
|
|
128
|
-
minHeight: 100,
|
|
129
|
-
paddingHorizontal: 12,
|
|
130
|
-
paddingVertical: 10,
|
|
131
|
-
},
|
|
132
|
-
cancelBtn: {
|
|
133
|
-
paddingHorizontal: 14,
|
|
134
|
-
paddingVertical: 8,
|
|
135
|
-
},
|
|
136
|
-
cancelText: { color: '#666', fontSize: 14 },
|
|
137
|
-
card: {
|
|
138
|
-
backgroundColor: '#fff',
|
|
139
|
-
borderRadius: 10,
|
|
140
|
-
padding: 16,
|
|
141
|
-
width: '100%',
|
|
142
|
-
},
|
|
143
|
-
emailInput: {
|
|
144
|
-
backgroundColor: '#f7f7f8',
|
|
145
|
-
borderColor: '#e5e5e8',
|
|
146
|
-
borderRadius: 6,
|
|
147
|
-
borderWidth: 1,
|
|
148
|
-
color: '#111',
|
|
149
|
-
fontSize: 14,
|
|
150
|
-
marginBottom: 14,
|
|
151
|
-
paddingHorizontal: 12,
|
|
152
|
-
paddingVertical: 8,
|
|
153
|
-
},
|
|
154
|
-
fab: {
|
|
155
|
-
alignItems: 'center',
|
|
156
|
-
backgroundColor: '#111',
|
|
157
|
-
borderRadius: 24,
|
|
158
|
-
bottom: 28,
|
|
159
|
-
elevation: 4,
|
|
160
|
-
height: 48,
|
|
161
|
-
justifyContent: 'center',
|
|
162
|
-
position: 'absolute',
|
|
163
|
-
right: 18,
|
|
164
|
-
shadowColor: '#000',
|
|
165
|
-
shadowOffset: { height: 2, width: 0 },
|
|
166
|
-
shadowOpacity: 0.18,
|
|
167
|
-
shadowRadius: 4,
|
|
168
|
-
width: 48,
|
|
169
|
-
},
|
|
170
|
-
fabText: { color: '#fff', fontSize: 22, fontWeight: '500' },
|
|
171
|
-
heading: { color: '#111', fontSize: 18, fontWeight: '500', marginBottom: 12 },
|
|
172
|
-
sentMessage: { color: '#111', fontSize: 14, paddingVertical: 18, textAlign: 'center' },
|
|
173
|
-
submitBtn: {
|
|
174
|
-
backgroundColor: '#111',
|
|
175
|
-
borderRadius: 6,
|
|
176
|
-
paddingHorizontal: 16,
|
|
177
|
-
paddingVertical: 8,
|
|
178
|
-
},
|
|
179
|
-
submitBtnDisabled: { opacity: 0.5 },
|
|
180
|
-
submitText: { color: '#fff', fontSize: 14, fontWeight: '500' },
|
|
181
|
-
titleInput: {
|
|
182
|
-
backgroundColor: '#f7f7f8',
|
|
183
|
-
borderColor: '#e5e5e8',
|
|
184
|
-
borderRadius: 6,
|
|
185
|
-
borderWidth: 1,
|
|
186
|
-
color: '#111',
|
|
187
|
-
fontSize: 14,
|
|
188
|
-
marginBottom: 8,
|
|
189
|
-
paddingHorizontal: 12,
|
|
190
|
-
paddingVertical: 8,
|
|
191
|
-
},
|
|
192
|
-
});
|
|
193
|
-
//# sourceMappingURL=feedback-widget.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"feedback-widget.js","sourceRoot":"","sources":["../src/feedback-widget.tsx"],"names":[],"mappings":"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"}
|
package/lib/feedback.d.ts
DELETED
package/lib/feedback.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"feedback.d.ts","sourceRoot":"","sources":["../src/feedback.ts"],"names":[],"mappings":"AAgBA,OAAO,EACL,cAAc,EACd,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,GACzB,MAAM,mBAAmB,CAAA"}
|
package/lib/feedback.js
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
// v2.0 W3 — `feedback` subpath. The feedback widget pulls in a
|
|
2
|
-
// component tree (react + tsx) and an internal viewer route, so
|
|
3
|
-
// importing it eagerly from the SDK's top-level barrel pays a
|
|
4
|
-
// bundle cost every consumer pays — even ones that never render
|
|
5
|
-
// the widget.
|
|
6
|
-
//
|
|
7
|
-
// Subpath import `@goliapkg/sentori-react-native/feedback`
|
|
8
|
-
// resolves to just the widget surface. Hosts that don't render
|
|
9
|
-
// the feedback button pay zero bundle delta; hosts that do reach
|
|
10
|
-
// for it import via this module and get exactly what they need.
|
|
11
|
-
//
|
|
12
|
-
// Top-level (`index.ts`) still re-exports `FeedbackButton` for one
|
|
13
|
-
// more release cycle so v1 callsites don't break on upgrade. v3
|
|
14
|
-
// will drop the top-level re-export — see
|
|
15
|
-
// `docs/recipes/v1-to-v2-migration.md` for the deprecation timeline.
|
|
16
|
-
export { FeedbackButton, } from './feedback-widget';
|
|
17
|
-
//# sourceMappingURL=feedback.js.map
|
package/lib/feedback.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"feedback.js","sourceRoot":"","sources":["../src/feedback.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,gEAAgE;AAChE,8DAA8D;AAC9D,gEAAgE;AAChE,cAAc;AACd,EAAE;AACF,2DAA2D;AAC3D,+DAA+D;AAC/D,iEAAiE;AACjE,gEAAgE;AAChE,EAAE;AACF,mEAAmE;AACnE,gEAAgE;AAChE,0CAA0C;AAC1C,qEAAqE;AAErE,OAAO,EACL,cAAc,GAGf,MAAM,mBAAmB,CAAA"}
|
package/lib/heartbeat.d.ts
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
export type HeartbeatOptions = {
|
|
2
|
-
/** Override the default 60 s interval. Floor 10 s — anything below
|
|
3
|
-
* trips the perf rule and the server's rate-limit anyway. */
|
|
4
|
-
intervalMs?: number;
|
|
5
|
-
};
|
|
6
|
-
export declare function startHeartbeat(opts?: HeartbeatOptions): void;
|
|
7
|
-
export declare function stopHeartbeat(): void;
|
|
8
|
-
export declare function __resetHeartbeatForTests(): void;
|
|
9
|
-
//# sourceMappingURL=heartbeat.d.ts.map
|
package/lib/heartbeat.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"heartbeat.d.ts","sourceRoot":"","sources":["../src/heartbeat.ts"],"names":[],"mappings":"AAgDA,MAAM,MAAM,gBAAgB,GAAG;IAC7B;kEAC8D;IAC9D,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,wBAAgB,cAAc,CAAC,IAAI,GAAE,gBAAqB,GAAG,IAAI,CA2ChE;AAED,wBAAgB,aAAa,IAAI,IAAI,CAYpC;AA2CD,wBAAgB,wBAAwB,IAAI,IAAI,CAE/C"}
|
package/lib/heartbeat.js
DELETED
|
@@ -1,138 +0,0 @@
|
|
|
1
|
-
// Analytics v1 — concurrent-user heartbeat.
|
|
2
|
-
//
|
|
3
|
-
// Once per minute, while the app is in the foreground, POST a tiny
|
|
4
|
-
// `{ sessionId, userId?, release, route?, os?, ts }` body to
|
|
5
|
-
// `/v1/heartbeat`. The server keeps a per-project Valkey ZSET keyed
|
|
6
|
-
// by member (user.id when set, sessionId otherwise) and the
|
|
7
|
-
// dashboard's `Live` page reads the set to render concurrent-user
|
|
8
|
-
// count + per-dim breakdowns.
|
|
9
|
-
//
|
|
10
|
-
// Iron-rule budget (CLAUDE.md):
|
|
11
|
-
// - 1 POST / min foreground only — never fires when backgrounded
|
|
12
|
-
// - ~200 B body
|
|
13
|
-
// - fire-and-forget; never blocks the JS thread, no retries
|
|
14
|
-
// - bounce suppression: if AppState flaps active → inactive → active
|
|
15
|
-
// inside 30 s, we still fire at most one heartbeat per 30 s
|
|
16
|
-
//
|
|
17
|
-
// The heartbeat is independent of the session ping in
|
|
18
|
-
// `session-tracker.ts`. Session pings fire only at session close
|
|
19
|
-
// (transport-batched); the heartbeat exists *during* the session to
|
|
20
|
-
// signal presence.
|
|
21
|
-
import { logger } from '@goliapkg/sentori-core';
|
|
22
|
-
import { getConfig } from './config';
|
|
23
|
-
import { getUser } from './capture';
|
|
24
|
-
import { getLastRoute } from './navigation';
|
|
25
|
-
import { uuidV7 } from './uuid';
|
|
26
|
-
const DEFAULT_INTERVAL_MS = 60_000;
|
|
27
|
-
const MIN_GAP_MS = 30_000;
|
|
28
|
-
let _running = false;
|
|
29
|
-
let _timer = null;
|
|
30
|
-
let _appStateSub = null;
|
|
31
|
-
let _sessionId = null;
|
|
32
|
-
let _lastBeatTs = 0;
|
|
33
|
-
let _intervalMs = DEFAULT_INTERVAL_MS;
|
|
34
|
-
export function startHeartbeat(opts = {}) {
|
|
35
|
-
if (_running)
|
|
36
|
-
return;
|
|
37
|
-
_running = true;
|
|
38
|
-
_intervalMs = Math.max(10_000, opts.intervalMs ?? DEFAULT_INTERVAL_MS);
|
|
39
|
-
_sessionId = uuidV7();
|
|
40
|
-
// AppState gate — only beat while app is in the foreground.
|
|
41
|
-
let AppState;
|
|
42
|
-
try {
|
|
43
|
-
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
44
|
-
AppState = require('react-native').AppState;
|
|
45
|
-
}
|
|
46
|
-
catch {
|
|
47
|
-
// Not in RN runtime (tests). The interval still runs; the gate
|
|
48
|
-
// is just permissive. Suppression below still applies.
|
|
49
|
-
AppState = undefined;
|
|
50
|
-
}
|
|
51
|
-
const isForeground = () => {
|
|
52
|
-
if (!AppState)
|
|
53
|
-
return true;
|
|
54
|
-
return (AppState.currentState ?? 'active') === 'active';
|
|
55
|
-
};
|
|
56
|
-
const beat = () => {
|
|
57
|
-
if (!_running)
|
|
58
|
-
return;
|
|
59
|
-
if (!isForeground())
|
|
60
|
-
return;
|
|
61
|
-
const now = Date.now();
|
|
62
|
-
if (now - _lastBeatTs < MIN_GAP_MS)
|
|
63
|
-
return;
|
|
64
|
-
_lastBeatTs = now;
|
|
65
|
-
void send();
|
|
66
|
-
};
|
|
67
|
-
// First beat as soon as we start (so the dashboard sees the user
|
|
68
|
-
// immediately, not 60 s after launch). Subsequent fires on the
|
|
69
|
-
// interval. AppState transitions can poke an immediate beat too —
|
|
70
|
-
// an active resume is a meaningful presence event.
|
|
71
|
-
beat();
|
|
72
|
-
_timer = setInterval(beat, _intervalMs);
|
|
73
|
-
if (AppState && typeof AppState.addEventListener === 'function') {
|
|
74
|
-
_appStateSub = AppState.addEventListener('change', (state) => {
|
|
75
|
-
if (state === 'active')
|
|
76
|
-
beat();
|
|
77
|
-
});
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
export function stopHeartbeat() {
|
|
81
|
-
_running = false;
|
|
82
|
-
if (_timer !== null) {
|
|
83
|
-
clearInterval(_timer);
|
|
84
|
-
_timer = null;
|
|
85
|
-
}
|
|
86
|
-
if (_appStateSub) {
|
|
87
|
-
_appStateSub.remove();
|
|
88
|
-
_appStateSub = null;
|
|
89
|
-
}
|
|
90
|
-
_sessionId = null;
|
|
91
|
-
_lastBeatTs = 0;
|
|
92
|
-
}
|
|
93
|
-
async function send() {
|
|
94
|
-
const config = getConfig();
|
|
95
|
-
if (!config)
|
|
96
|
-
return;
|
|
97
|
-
const user = getUser();
|
|
98
|
-
const body = {
|
|
99
|
-
sessionId: _sessionId ?? '',
|
|
100
|
-
release: config.release,
|
|
101
|
-
ts: Date.now(),
|
|
102
|
-
};
|
|
103
|
-
if (user?.id)
|
|
104
|
-
body.userId = user.id;
|
|
105
|
-
const route = getLastRoute();
|
|
106
|
-
if (route)
|
|
107
|
-
body.route = route;
|
|
108
|
-
const os = readOsString();
|
|
109
|
-
if (os)
|
|
110
|
-
body.os = os;
|
|
111
|
-
try {
|
|
112
|
-
await fetch(`${config.ingestUrl}/v1/heartbeat`, {
|
|
113
|
-
body: JSON.stringify(body),
|
|
114
|
-
headers: {
|
|
115
|
-
Authorization: `Bearer ${config.token}`,
|
|
116
|
-
'Content-Type': 'application/json',
|
|
117
|
-
},
|
|
118
|
-
method: 'POST',
|
|
119
|
-
});
|
|
120
|
-
}
|
|
121
|
-
catch (e) {
|
|
122
|
-
logger.debug('heartbeat', 'failed (best-effort, normal on offline)', e);
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
function readOsString() {
|
|
126
|
-
try {
|
|
127
|
-
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
128
|
-
const RN = require('react-native');
|
|
129
|
-
return `${RN.Platform.OS} ${RN.Platform.Version}`;
|
|
130
|
-
}
|
|
131
|
-
catch {
|
|
132
|
-
return null;
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
export function __resetHeartbeatForTests() {
|
|
136
|
-
stopHeartbeat();
|
|
137
|
-
}
|
|
138
|
-
//# sourceMappingURL=heartbeat.js.map
|
package/lib/heartbeat.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"heartbeat.js","sourceRoot":"","sources":["../src/heartbeat.ts"],"names":[],"mappings":"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"}
|
package/lib/index.js.bak
DELETED
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
import { init } from './init';
|
|
2
|
-
import { addBreadcrumb } from './breadcrumbs';
|
|
3
|
-
import { captureError, captureException, captureStep, getUser, sendUserFeedback, setUser, } from './capture';
|
|
4
|
-
import { ErrorBoundary } from './error-boundary';
|
|
5
|
-
import { FeedbackButton } from './feedback-widget';
|
|
6
|
-
import { clearAllFeatureFlags, clearFeatureFlag, getFeatureFlags, setFeatureFlag, } from './feature-flags';
|
|
7
|
-
import { clearMaskQuery, registerMaskQuery } from './mask';
|
|
8
|
-
import { measureFn } from './measure';
|
|
9
|
-
import { getColdStartMs, markTimeToFullDisplay, } from './mobile-vitals';
|
|
10
|
-
import { bindState, recordState, unbindState } from './state-snapshots';
|
|
11
|
-
import { startMoment } from '@goliapkg/sentori-core';
|
|
12
|
-
import { flushMetrics, recordMetric } from './metrics';
|
|
13
|
-
import { RageTapCapture } from './rage-tap';
|
|
14
|
-
import { endSession, markSessionCrashed, startSession, } from './session-tracker';
|
|
15
|
-
export const sentori = {
|
|
16
|
-
init,
|
|
17
|
-
addBreadcrumb,
|
|
18
|
-
setUser,
|
|
19
|
-
getUser,
|
|
20
|
-
captureError,
|
|
21
|
-
captureException,
|
|
22
|
-
captureStep,
|
|
23
|
-
sendUserFeedback,
|
|
24
|
-
recordMetric,
|
|
25
|
-
flushMetrics,
|
|
26
|
-
measureFn,
|
|
27
|
-
startMoment,
|
|
28
|
-
bindState,
|
|
29
|
-
recordState,
|
|
30
|
-
unbindState,
|
|
31
|
-
markTimeToFullDisplay,
|
|
32
|
-
getColdStartMs,
|
|
33
|
-
setFeatureFlag,
|
|
34
|
-
clearFeatureFlag,
|
|
35
|
-
clearAllFeatureFlags,
|
|
36
|
-
getFeatureFlags,
|
|
37
|
-
ErrorBoundary,
|
|
38
|
-
FeedbackButton,
|
|
39
|
-
RageTapCapture,
|
|
40
|
-
registerMaskQuery,
|
|
41
|
-
clearMaskQuery,
|
|
42
|
-
startSession,
|
|
43
|
-
endSession,
|
|
44
|
-
markSessionCrashed,
|
|
45
|
-
};
|
|
46
|
-
export default sentori;
|
|
47
|
-
export { init, init as initSentori } from './init';
|
|
48
|
-
export { addBreadcrumb } from './breadcrumbs';
|
|
49
|
-
export { captureError, captureException, captureStep, getUser, sendUserFeedback, setUser, } from './capture';
|
|
50
|
-
export { ErrorBoundary } from './error-boundary';
|
|
51
|
-
export { FeedbackButton } from './feedback-widget';
|
|
52
|
-
export { clearAllFeatureFlags, clearFeatureFlag, getFeatureFlags, setFeatureFlag, } from './feature-flags';
|
|
53
|
-
export { clearMaskQuery, registerMaskQuery } from './mask';
|
|
54
|
-
export { flushMetrics, recordMetric } from './metrics';
|
|
55
|
-
export { measureFn } from './measure';
|
|
56
|
-
export { getColdStartMs, markTimeToFullDisplay, } from './mobile-vitals';
|
|
57
|
-
export { MomentHandle, startMoment } from '@goliapkg/sentori-core';
|
|
58
|
-
export { bindState, recordState, unbindState, } from './state-snapshots';
|
|
59
|
-
export { RageTapCapture } from './rage-tap';
|
|
60
|
-
export { probeNativeWireframe, startAnrWatchdog, stopAnrWatchdog, triggerNativeCrash, } from './native';
|
|
61
|
-
export { drainReplay, startReplay, stopReplay } from './replay';
|
|
62
|
-
export { endSession, markSessionCrashed, startSession, } from './session-tracker';
|
|
63
|
-
export { useTraceNavigation } from './navigation';
|
|
64
|
-
//# sourceMappingURL=index.js.map
|
package/lib/install-id.d.ts
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Resolve the device's stable install id, generating one if absent.
|
|
3
|
-
* Cached in memory after first resolve so subsequent calls are sync-
|
|
4
|
-
* adjacent (no storage I/O). Idempotent under concurrent calls — a
|
|
5
|
-
* second caller during the first resolve awaits the same promise.
|
|
6
|
-
*/
|
|
7
|
-
export declare function getInstallId(): Promise<string>;
|
|
8
|
-
/** Sync read of the currently-cached install id. `null` before the
|
|
9
|
-
* first `getInstallId()` resolves. Use this in hot paths (event
|
|
10
|
-
* payload assembly) that can't await storage; callers should kick
|
|
11
|
-
* off `getInstallId()` once at startup to warm the cache. */
|
|
12
|
-
export declare function peekInstallId(): null | string;
|
|
13
|
-
export declare function __resetInstallIdForTests(): void;
|
|
14
|
-
/** For tests + advanced operator flows that need to seed an id from
|
|
15
|
-
* an external secure-storage migration. */
|
|
16
|
-
export declare function __setInstallIdForTests(id: string): void;
|
|
17
|
-
//# sourceMappingURL=install-id.d.ts.map
|
package/lib/install-id.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"install-id.d.ts","sourceRoot":"","sources":["../src/install-id.ts"],"names":[],"mappings":"AA0EA;;;;;GAKG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC,CA8CpD;AAED;;;8DAG8D;AAC9D,wBAAgB,aAAa,IAAI,IAAI,GAAG,MAAM,CAE7C;AAED,wBAAgB,wBAAwB,IAAI,IAAI,CAG/C;AAED;4CAC4C;AAC5C,wBAAgB,sBAAsB,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAEvD"}
|
package/lib/install-id.js
DELETED
|
@@ -1,125 +0,0 @@
|
|
|
1
|
-
// v1.1 chunk S1 — stable per-install identifier.
|
|
2
|
-
//
|
|
3
|
-
// `getInstallId()` returns a UUIDv7 generated on first call and
|
|
4
|
-
// persisted to device storage. The id survives app restarts and, on
|
|
5
|
-
// iOS specifically, app reinstalls (because the Keychain backend is
|
|
6
|
-
// preserved across uninstall — that's the whole point).
|
|
7
|
-
//
|
|
8
|
-
// Storage tier order:
|
|
9
|
-
// 1. `react-native-keychain` (optional peer; iOS + Android Keystore)
|
|
10
|
-
// 2. AsyncStorage (host already needs this for launch-crash-guard /
|
|
11
|
-
// offline queue, so we don't add a hard new peer dep)
|
|
12
|
-
// 3. Process-memory only (no persistence — covers SSR / tests)
|
|
13
|
-
//
|
|
14
|
-
// Opaque to the host. The id is NOT tied to a `setUser` call; the
|
|
15
|
-
// server doesn't auto-correlate to user identity. It exists purely
|
|
16
|
-
// as a stable device key so the security posture engine (S3) can
|
|
17
|
-
// score per-install signals independently of authentication state.
|
|
18
|
-
import { uuidV7 } from '@goliapkg/sentori-core';
|
|
19
|
-
import { isAnyNativeModuleLinked } from './native-loader';
|
|
20
|
-
const KEYCHAIN_SERVICE = 'sentori.install-id';
|
|
21
|
-
const ASYNC_STORAGE_KEY = '@sentori/install-id';
|
|
22
|
-
let _cached = null;
|
|
23
|
-
let _inflight = null;
|
|
24
|
-
function loadKeychain() {
|
|
25
|
-
// react-native-keychain is the recommended secure-storage peer.
|
|
26
|
-
// Optional: if the host hasn't installed it we fall through to
|
|
27
|
-
// AsyncStorage. The Keychain backend is what gives the iOS
|
|
28
|
-
// "survives reinstall" guarantee.
|
|
29
|
-
try {
|
|
30
|
-
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
31
|
-
const mod = require('react-native-keychain');
|
|
32
|
-
if (typeof mod.getGenericPassword !== 'function')
|
|
33
|
-
return null;
|
|
34
|
-
return mod;
|
|
35
|
-
}
|
|
36
|
-
catch {
|
|
37
|
-
return null;
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
function loadAsyncStorage() {
|
|
41
|
-
if (!isAnyNativeModuleLinked(['RNCAsyncStorage', 'AsyncStorageModule'])) {
|
|
42
|
-
return null;
|
|
43
|
-
}
|
|
44
|
-
try {
|
|
45
|
-
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
46
|
-
const mod = require('@react-native-async-storage/async-storage');
|
|
47
|
-
return mod.default ?? mod;
|
|
48
|
-
}
|
|
49
|
-
catch {
|
|
50
|
-
return null;
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
/**
|
|
54
|
-
* Resolve the device's stable install id, generating one if absent.
|
|
55
|
-
* Cached in memory after first resolve so subsequent calls are sync-
|
|
56
|
-
* adjacent (no storage I/O). Idempotent under concurrent calls — a
|
|
57
|
-
* second caller during the first resolve awaits the same promise.
|
|
58
|
-
*/
|
|
59
|
-
export async function getInstallId() {
|
|
60
|
-
if (_cached !== null)
|
|
61
|
-
return _cached;
|
|
62
|
-
if (_inflight !== null)
|
|
63
|
-
return _inflight;
|
|
64
|
-
_inflight = (async () => {
|
|
65
|
-
try {
|
|
66
|
-
const kc = loadKeychain();
|
|
67
|
-
if (kc) {
|
|
68
|
-
const existing = await kc
|
|
69
|
-
.getGenericPassword({ service: KEYCHAIN_SERVICE })
|
|
70
|
-
.catch(() => false);
|
|
71
|
-
if (existing && existing.password) {
|
|
72
|
-
_cached = existing.password;
|
|
73
|
-
return existing.password;
|
|
74
|
-
}
|
|
75
|
-
const fresh = uuidV7();
|
|
76
|
-
await kc
|
|
77
|
-
.setGenericPassword('sentori', fresh, { service: KEYCHAIN_SERVICE })
|
|
78
|
-
.catch(() => undefined);
|
|
79
|
-
_cached = fresh;
|
|
80
|
-
return fresh;
|
|
81
|
-
}
|
|
82
|
-
const storage = loadAsyncStorage();
|
|
83
|
-
if (storage) {
|
|
84
|
-
const existing = await storage
|
|
85
|
-
.getItem(ASYNC_STORAGE_KEY)
|
|
86
|
-
.catch(() => null);
|
|
87
|
-
if (existing) {
|
|
88
|
-
_cached = existing;
|
|
89
|
-
return existing;
|
|
90
|
-
}
|
|
91
|
-
const fresh = uuidV7();
|
|
92
|
-
await storage.setItem(ASYNC_STORAGE_KEY, fresh).catch(() => undefined);
|
|
93
|
-
_cached = fresh;
|
|
94
|
-
return fresh;
|
|
95
|
-
}
|
|
96
|
-
// No storage available — generate but don't persist. The id is
|
|
97
|
-
// still stable for the lifetime of the process which is good
|
|
98
|
-
// enough for tests / SSR / no-native-modules contexts.
|
|
99
|
-
const fresh = uuidV7();
|
|
100
|
-
_cached = fresh;
|
|
101
|
-
return fresh;
|
|
102
|
-
}
|
|
103
|
-
finally {
|
|
104
|
-
_inflight = null;
|
|
105
|
-
}
|
|
106
|
-
})();
|
|
107
|
-
return _inflight;
|
|
108
|
-
}
|
|
109
|
-
/** Sync read of the currently-cached install id. `null` before the
|
|
110
|
-
* first `getInstallId()` resolves. Use this in hot paths (event
|
|
111
|
-
* payload assembly) that can't await storage; callers should kick
|
|
112
|
-
* off `getInstallId()` once at startup to warm the cache. */
|
|
113
|
-
export function peekInstallId() {
|
|
114
|
-
return _cached;
|
|
115
|
-
}
|
|
116
|
-
export function __resetInstallIdForTests() {
|
|
117
|
-
_cached = null;
|
|
118
|
-
_inflight = null;
|
|
119
|
-
}
|
|
120
|
-
/** For tests + advanced operator flows that need to seed an id from
|
|
121
|
-
* an external secure-storage migration. */
|
|
122
|
-
export function __setInstallIdForTests(id) {
|
|
123
|
-
_cached = id;
|
|
124
|
-
}
|
|
125
|
-
//# sourceMappingURL=install-id.js.map
|
package/lib/install-id.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"install-id.js","sourceRoot":"","sources":["../src/install-id.ts"],"names":[],"mappings":"AAAA,iDAAiD;AACjD,EAAE;AACF,gEAAgE;AAChE,oEAAoE;AACpE,oEAAoE;AACpE,wDAAwD;AACxD,EAAE;AACF,sBAAsB;AACtB,uEAAuE;AACvE,sEAAsE;AACtE,2DAA2D;AAC3D,iEAAiE;AACjE,EAAE;AACF,kEAAkE;AAClE,mEAAmE;AACnE,iEAAiE;AACjE,mEAAmE;AAEnE,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAEhD,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAE1D,MAAM,gBAAgB,GAAG,oBAAoB,CAAC;AAC9C,MAAM,iBAAiB,GAAG,qBAAqB,CAAC;AAkBhD,IAAI,OAAO,GAAkB,IAAI,CAAC;AAClC,IAAI,SAAS,GAA2B,IAAI,CAAC;AAE7C,SAAS,YAAY;IACnB,gEAAgE;IAChE,+DAA+D;IAC/D,2DAA2D;IAC3D,kCAAkC;IAClC,IAAI,CAAC;QACH,iEAAiE;QACjE,MAAM,GAAG,GAAG,OAAO,CAAC,uBAAuB,CAAmB,CAAC;QAC/D,IAAI,OAAO,GAAG,CAAC,kBAAkB,KAAK,UAAU;YAAE,OAAO,IAAI,CAAC;QAC9D,OAAO,GAAG,CAAC;IACb,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB;IACvB,IAAI,CAAC,uBAAuB,CAAC,CAAC,iBAAiB,EAAE,oBAAoB,CAAC,CAAC,EAAE,CAAC;QACxE,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC;QACH,iEAAiE;QACjE,MAAM,GAAG,GAAG,OAAO,CAAC,2CAA2C,CAE9D,CAAC;QACF,OAAO,GAAG,CAAC,OAAO,IAAK,GAAmC,CAAC;IAC7D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,IAAI,OAAO,KAAK,IAAI;QAAE,OAAO,OAAO,CAAC;IACrC,IAAI,SAAS,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IACzC,SAAS,GAAG,CAAC,KAAK,IAAI,EAAE;QACtB,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,YAAY,EAAE,CAAC;YAC1B,IAAI,EAAE,EAAE,CAAC;gBACP,MAAM,QAAQ,GAAG,MAAM,EAAE;qBACtB,kBAAkB,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC;qBACjD,KAAK,CAAC,GAAG,EAAE,CAAC,KAAc,CAAC,CAAC;gBAC/B,IAAI,QAAQ,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;oBAClC,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC;oBAC5B,OAAO,QAAQ,CAAC,QAAQ,CAAC;gBAC3B,CAAC;gBACD,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC;gBACvB,MAAM,EAAE;qBACL,kBAAkB,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC;qBACnE,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;gBAC1B,OAAO,GAAG,KAAK,CAAC;gBAChB,OAAO,KAAK,CAAC;YACf,CAAC;YACD,MAAM,OAAO,GAAG,gBAAgB,EAAE,CAAC;YACnC,IAAI,OAAO,EAAE,CAAC;gBACZ,MAAM,QAAQ,GAAG,MAAM,OAAO;qBAC3B,OAAO,CAAC,iBAAiB,CAAC;qBAC1B,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;gBACrB,IAAI,QAAQ,EAAE,CAAC;oBACb,OAAO,GAAG,QAAQ,CAAC;oBACnB,OAAO,QAAQ,CAAC;gBAClB,CAAC;gBACD,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC;gBACvB,MAAM,OAAO,CAAC,OAAO,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;gBACvE,OAAO,GAAG,KAAK,CAAC;gBAChB,OAAO,KAAK,CAAC;YACf,CAAC;YACD,+DAA+D;YAC/D,6DAA6D;YAC7D,uDAAuD;YACvD,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC;YACvB,OAAO,GAAG,KAAK,CAAC;YAChB,OAAO,KAAK,CAAC;QACf,CAAC;gBAAS,CAAC;YACT,SAAS,GAAG,IAAI,CAAC;QACnB,CAAC;IACH,CAAC,CAAC,EAAE,CAAC;IACL,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;8DAG8D;AAC9D,MAAM,UAAU,aAAa;IAC3B,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,wBAAwB;IACtC,OAAO,GAAG,IAAI,CAAC;IACf,SAAS,GAAG,IAAI,CAAC;AACnB,CAAC;AAED;4CAC4C;AAC5C,MAAM,UAAU,sBAAsB,CAAC,EAAU;IAC/C,OAAO,GAAG,EAAE,CAAC;AACf,CAAC"}
|
package/lib/lifecycle.d.ts
DELETED
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Force-flush every pending Sentori buffer (events, metrics,
|
|
3
|
-
* track). Returns when the flush settles or the timeout fires —
|
|
4
|
-
* whichever happens first.
|
|
5
|
-
*
|
|
6
|
-
* Never rejects: per the NEVER rule, individual flush failures
|
|
7
|
-
* are silently absorbed (and self-reported via the internal
|
|
8
|
-
* circuit-breaker), and the resolved promise's value is undefined.
|
|
9
|
-
*
|
|
10
|
-
* await sentori.flush(5_000) // wait up to 5 s, then move on
|
|
11
|
-
* process.exit(0)
|
|
12
|
-
*/
|
|
13
|
-
export declare function flush(timeoutMs?: number): Promise<void>;
|
|
14
|
-
/**
|
|
15
|
-
* Flush + shut down. After `close()`, further capture* calls remain
|
|
16
|
-
* silent no-ops via `_closed` gate. Idempotent — re-calling is safe.
|
|
17
|
-
*
|
|
18
|
-
* await sentori.close()
|
|
19
|
-
* // SDK is asleep; no more events go out.
|
|
20
|
-
*/
|
|
21
|
-
export declare function close(timeoutMs?: number): Promise<void>;
|
|
22
|
-
/** Test hook — reset the shutdown latch so unit tests don't have to
|
|
23
|
-
* re-init the whole SDK between cases. */
|
|
24
|
-
export declare function __resetLifecycleForTests(): void;
|
|
25
|
-
/** Internal — capture* implementations check this to short-circuit
|
|
26
|
-
* after `close()`. */
|
|
27
|
-
export declare function isClosed(): boolean;
|
|
28
|
-
//# sourceMappingURL=lifecycle.d.ts.map
|
package/lib/lifecycle.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../src/lifecycle.ts"],"names":[],"mappings":"AAiBA;;;;;;;;;;;GAWG;AACH,wBAAsB,KAAK,CAAC,SAAS,GAAE,MAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAsBpE;AAED;;;;;;GAMG;AACH,wBAAsB,KAAK,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAG7D;AAED;2CAC2C;AAC3C,wBAAgB,wBAAwB,IAAI,IAAI,CAE/C;AAED;uBACuB;AACvB,wBAAgB,QAAQ,IAAI,OAAO,CAElC"}
|