@goliapkg/sentori-react-native 0.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/README.md +5 -0
- package/SentoriReactNative.podspec +21 -0
- package/android/build.gradle +38 -0
- package/android/src/main/AndroidManifest.xml +1 -0
- package/android/src/main/java/com/sentori/SentoriCrashHandler.kt +213 -0
- package/android/src/main/java/com/sentori/SentoriModule.kt +39 -0
- package/android/src/test/java/com/sentori/SentoriCrashHandlerTest.kt +60 -0
- package/expo-module.config.json +9 -0
- package/ios/SentoriCrashHandler.swift +160 -0
- package/ios/SentoriModule.swift +43 -0
- package/ios/Tests/SentoriCrashHandlerTests.swift +59 -0
- package/lib/breadcrumbs.d.ts +11 -0
- package/lib/breadcrumbs.d.ts.map +1 -0
- package/lib/breadcrumbs.js +21 -0
- package/lib/breadcrumbs.js.map +1 -0
- package/lib/capture.d.ts +23 -0
- package/lib/capture.d.ts.map +1 -0
- package/lib/capture.js +91 -0
- package/lib/capture.js.map +1 -0
- package/lib/config.d.ts +12 -0
- package/lib/config.d.ts.map +1 -0
- package/lib/config.js +10 -0
- package/lib/config.js.map +1 -0
- package/lib/error-boundary.d.ts +17 -0
- package/lib/error-boundary.d.ts.map +1 -0
- package/lib/error-boundary.js +26 -0
- package/lib/error-boundary.js.map +1 -0
- package/lib/handlers/global.d.ts +2 -0
- package/lib/handlers/global.d.ts.map +1 -0
- package/lib/handlers/global.js +29 -0
- package/lib/handlers/global.js.map +1 -0
- package/lib/handlers/network.d.ts +2 -0
- package/lib/handlers/network.d.ts.map +1 -0
- package/lib/handlers/network.js +69 -0
- package/lib/handlers/network.js.map +1 -0
- package/lib/handlers/promise.d.ts +2 -0
- package/lib/handlers/promise.d.ts.map +1 -0
- package/lib/handlers/promise.js +27 -0
- package/lib/handlers/promise.js.map +1 -0
- package/lib/index.d.ts +18 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +20 -0
- package/lib/index.js.map +1 -0
- package/lib/init.d.ts +18 -0
- package/lib/init.d.ts.map +1 -0
- package/lib/init.js +56 -0
- package/lib/init.js.map +1 -0
- package/lib/native.d.ts +23 -0
- package/lib/native.d.ts.map +1 -0
- package/lib/native.js +56 -0
- package/lib/native.js.map +1 -0
- package/lib/stack.d.ts +3 -0
- package/lib/stack.d.ts.map +1 -0
- package/lib/stack.js +69 -0
- package/lib/stack.js.map +1 -0
- package/lib/transport.d.ts +8 -0
- package/lib/transport.d.ts.map +1 -0
- package/lib/transport.js +143 -0
- package/lib/transport.js.map +1 -0
- package/lib/types.d.ts +62 -0
- package/lib/types.d.ts.map +1 -0
- package/lib/types.js +2 -0
- package/lib/types.js.map +1 -0
- package/lib/uuid.d.ts +11 -0
- package/lib/uuid.d.ts.map +1 -0
- package/lib/uuid.js +46 -0
- package/lib/uuid.js.map +1 -0
- package/package.json +66 -0
- package/src/__tests__/breadcrumbs.test.ts +44 -0
- package/src/__tests__/stack.test.ts +43 -0
- package/src/__tests__/transport.test.ts +112 -0
- package/src/__tests__/uuid.test.ts +41 -0
- package/src/breadcrumbs.ts +33 -0
- package/src/capture.ts +108 -0
- package/src/config.ts +21 -0
- package/src/error-boundary.tsx +38 -0
- package/src/handlers/global.ts +36 -0
- package/src/handlers/network.ts +70 -0
- package/src/handlers/promise.ts +38 -0
- package/src/index.ts +37 -0
- package/src/init.ts +80 -0
- package/src/native.ts +71 -0
- package/src/stack.ts +72 -0
- package/src/transport.ts +164 -0
- package/src/types.ts +63 -0
- package/src/uuid.ts +56 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
const MAX_BREADCRUMBS = 100;
|
|
2
|
+
let _buffer = [];
|
|
3
|
+
export const addBreadcrumb = (input) => {
|
|
4
|
+
const crumb = {
|
|
5
|
+
timestamp: input.timestamp ?? new Date().toISOString(),
|
|
6
|
+
type: input.type,
|
|
7
|
+
data: input.data,
|
|
8
|
+
};
|
|
9
|
+
_buffer.push(crumb);
|
|
10
|
+
if (_buffer.length > MAX_BREADCRUMBS) {
|
|
11
|
+
_buffer.shift();
|
|
12
|
+
}
|
|
13
|
+
};
|
|
14
|
+
export const getBreadcrumbs = () => [..._buffer];
|
|
15
|
+
export const clearBreadcrumbs = () => {
|
|
16
|
+
_buffer = [];
|
|
17
|
+
};
|
|
18
|
+
export const __resetForTests = () => {
|
|
19
|
+
_buffer = [];
|
|
20
|
+
};
|
|
21
|
+
//# sourceMappingURL=breadcrumbs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"breadcrumbs.js","sourceRoot":"","sources":["../src/breadcrumbs.ts"],"names":[],"mappings":"AAEA,MAAM,eAAe,GAAG,GAAG,CAAC;AAE5B,IAAI,OAAO,GAAiB,EAAE,CAAC;AAQ/B,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,KAAyB,EAAQ,EAAE;IAC/D,MAAM,KAAK,GAAe;QACxB,SAAS,EAAE,KAAK,CAAC,SAAS,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACtD,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,IAAI,EAAE,KAAK,CAAC,IAAI;KACjB,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACpB,IAAI,OAAO,CAAC,MAAM,GAAG,eAAe,EAAE,CAAC;QACrC,OAAO,CAAC,KAAK,EAAE,CAAC;IAClB,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,GAAiB,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC;AAE/D,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAS,EAAE;IACzC,OAAO,GAAG,EAAE,CAAC;AACf,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG,GAAS,EAAE;IACxC,OAAO,GAAG,EAAE,CAAC;AACf,CAAC,CAAC"}
|
package/lib/capture.d.ts
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { Tags, User } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Attach a stable user identifier to events captured after this call.
|
|
4
|
+
*
|
|
5
|
+
* PII policy (Phase 16 sub-D): the User shape is intentionally limited
|
|
6
|
+
* to `{ id?, anonymous? }` — no email, name, IP, or other identifying
|
|
7
|
+
* fields. Use a hashed / pseudonymous id (e.g. uuid v4 stored in
|
|
8
|
+
* AsyncStorage on first launch). The server schema enforces the same
|
|
9
|
+
* shape, so any extra fields you tack on at the JS layer would be
|
|
10
|
+
* rejected with `validationFailed` and never persisted.
|
|
11
|
+
*
|
|
12
|
+
* Pass `null` to clear (e.g. on sign-out).
|
|
13
|
+
*/
|
|
14
|
+
export declare const setUser: (user: User | null) => void;
|
|
15
|
+
export declare const getUser: () => User | null;
|
|
16
|
+
export type CaptureExtras = {
|
|
17
|
+
tags?: Tags;
|
|
18
|
+
user?: User;
|
|
19
|
+
fingerprint?: string[];
|
|
20
|
+
};
|
|
21
|
+
export declare const captureError: (error: Error, extras?: CaptureExtras) => void;
|
|
22
|
+
export declare const captureException: (error: Error, extras?: CaptureExtras) => void;
|
|
23
|
+
//# sourceMappingURL=capture.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capture.d.ts","sourceRoot":"","sources":["../src/capture.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAoC,IAAI,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAI5E;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,OAAO,GAAI,MAAM,IAAI,GAAG,IAAI,KAAG,IAE3C,CAAC;AAEF,eAAO,MAAM,OAAO,QAAO,IAAI,GAAG,IAAa,CAAC;AAEhD,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB,CAAC;AAEF,eAAO,MAAM,YAAY,GAAI,OAAO,KAAK,EAAE,SAAS,aAAa,KAAG,IAsBnE,CAAC;AAEF,eAAO,MAAM,gBAAgB,UAxBO,KAAK,WAAW,aAAa,KAAG,IAwBxB,CAAC"}
|
package/lib/capture.js
ADDED
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { getConfig, isInitialized } from './config';
|
|
2
|
+
import { getBreadcrumbs } from './breadcrumbs';
|
|
3
|
+
import { parseStack } from './stack';
|
|
4
|
+
import { enqueue } from './transport';
|
|
5
|
+
import { uuidV7 } from './uuid';
|
|
6
|
+
let _user = null;
|
|
7
|
+
/**
|
|
8
|
+
* Attach a stable user identifier to events captured after this call.
|
|
9
|
+
*
|
|
10
|
+
* PII policy (Phase 16 sub-D): the User shape is intentionally limited
|
|
11
|
+
* to `{ id?, anonymous? }` — no email, name, IP, or other identifying
|
|
12
|
+
* fields. Use a hashed / pseudonymous id (e.g. uuid v4 stored in
|
|
13
|
+
* AsyncStorage on first launch). The server schema enforces the same
|
|
14
|
+
* shape, so any extra fields you tack on at the JS layer would be
|
|
15
|
+
* rejected with `validationFailed` and never persisted.
|
|
16
|
+
*
|
|
17
|
+
* Pass `null` to clear (e.g. on sign-out).
|
|
18
|
+
*/
|
|
19
|
+
export const setUser = (user) => {
|
|
20
|
+
_user = user;
|
|
21
|
+
};
|
|
22
|
+
export const getUser = () => _user;
|
|
23
|
+
export const captureError = (error, extras) => {
|
|
24
|
+
if (!isInitialized())
|
|
25
|
+
return;
|
|
26
|
+
const config = getConfig();
|
|
27
|
+
if (!config)
|
|
28
|
+
return;
|
|
29
|
+
const event = {
|
|
30
|
+
id: uuidV7(),
|
|
31
|
+
timestamp: new Date().toISOString(),
|
|
32
|
+
kind: 'error',
|
|
33
|
+
platform: 'javascript',
|
|
34
|
+
release: config.release,
|
|
35
|
+
environment: config.environment,
|
|
36
|
+
device: collectDevice(),
|
|
37
|
+
app: collectApp(config.release),
|
|
38
|
+
user: extras?.user ?? _user,
|
|
39
|
+
tags: extras?.tags,
|
|
40
|
+
breadcrumbs: getBreadcrumbs(),
|
|
41
|
+
error: errorToObject(error),
|
|
42
|
+
fingerprint: extras?.fingerprint,
|
|
43
|
+
};
|
|
44
|
+
enqueue(event);
|
|
45
|
+
};
|
|
46
|
+
export const captureException = captureError;
|
|
47
|
+
const errorToObject = (error) => {
|
|
48
|
+
const causeRaw = error.cause;
|
|
49
|
+
let cause = null;
|
|
50
|
+
if (causeRaw instanceof Error) {
|
|
51
|
+
cause = errorToObject(causeRaw);
|
|
52
|
+
}
|
|
53
|
+
return {
|
|
54
|
+
type: error.name || 'Error',
|
|
55
|
+
message: error.message,
|
|
56
|
+
stack: parseStack(error.stack),
|
|
57
|
+
cause,
|
|
58
|
+
};
|
|
59
|
+
};
|
|
60
|
+
const collectDevice = () => {
|
|
61
|
+
let os = 'other';
|
|
62
|
+
let osVersion = '0';
|
|
63
|
+
try {
|
|
64
|
+
const RN = require('react-native');
|
|
65
|
+
const rnOS = RN.Platform.OS;
|
|
66
|
+
os = rnOS === 'ios' || rnOS === 'android' || rnOS === 'web' ? rnOS : 'other';
|
|
67
|
+
osVersion = String(RN.Platform.Version);
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
// not in RN runtime (jest, bun test)
|
|
71
|
+
}
|
|
72
|
+
return { os, osVersion };
|
|
73
|
+
};
|
|
74
|
+
const collectApp = (release) => {
|
|
75
|
+
const m = /^(?:[^@]+@)?([^+]+)(?:\+(.+))?$/.exec(release);
|
|
76
|
+
const version = m?.[1] ?? '0.0.0';
|
|
77
|
+
const build = m?.[2];
|
|
78
|
+
let rnVersion = 'unknown';
|
|
79
|
+
try {
|
|
80
|
+
rnVersion = require('react-native/package.json').version;
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
// not in RN runtime
|
|
84
|
+
}
|
|
85
|
+
return {
|
|
86
|
+
version,
|
|
87
|
+
build,
|
|
88
|
+
framework: { name: 'react-native', version: rnVersion },
|
|
89
|
+
};
|
|
90
|
+
};
|
|
91
|
+
//# sourceMappingURL=capture.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capture.js","sourceRoot":"","sources":["../src/capture.ts"],"names":[],"mappings":"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"}
|
package/lib/config.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export type Config = {
|
|
2
|
+
token: string;
|
|
3
|
+
release: string;
|
|
4
|
+
environment: string;
|
|
5
|
+
ingestUrl: string;
|
|
6
|
+
enabled: boolean;
|
|
7
|
+
};
|
|
8
|
+
export declare const setConfig: (config: Config) => void;
|
|
9
|
+
export declare const getConfig: () => Config | null;
|
|
10
|
+
export declare const isInitialized: () => boolean;
|
|
11
|
+
export declare const __resetForTests: () => void;
|
|
12
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,MAAM,GAAG;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;CAClB,CAAC;AAIF,eAAO,MAAM,SAAS,GAAI,QAAQ,MAAM,KAAG,IAE1C,CAAC;AAEF,eAAO,MAAM,SAAS,QAAO,MAAM,GAAG,IAAe,CAAC;AAEtD,eAAO,MAAM,aAAa,QAAO,OAA2B,CAAC;AAE7D,eAAO,MAAM,eAAe,QAAO,IAElC,CAAC"}
|
package/lib/config.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
let _config = null;
|
|
2
|
+
export const setConfig = (config) => {
|
|
3
|
+
_config = config;
|
|
4
|
+
};
|
|
5
|
+
export const getConfig = () => _config;
|
|
6
|
+
export const isInitialized = () => _config !== null;
|
|
7
|
+
export const __resetForTests = () => {
|
|
8
|
+
_config = null;
|
|
9
|
+
};
|
|
10
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAQA,IAAI,OAAO,GAAkB,IAAI,CAAC;AAElC,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,MAAc,EAAQ,EAAE;IAChD,OAAO,GAAG,MAAM,CAAC;AACnB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG,GAAkB,EAAE,CAAC,OAAO,CAAC;AAEtD,MAAM,CAAC,MAAM,aAAa,GAAG,GAAY,EAAE,CAAC,OAAO,KAAK,IAAI,CAAC;AAE7D,MAAM,CAAC,MAAM,eAAe,GAAG,GAAS,EAAE;IACxC,OAAO,GAAG,IAAI,CAAC;AACjB,CAAC,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Component, type ErrorInfo, type ReactNode } from 'react';
|
|
2
|
+
export type ErrorBoundaryProps = {
|
|
3
|
+
fallback?: ReactNode | ((error: Error, reset: () => void) => ReactNode);
|
|
4
|
+
children: ReactNode;
|
|
5
|
+
};
|
|
6
|
+
type State = {
|
|
7
|
+
error: Error | null;
|
|
8
|
+
};
|
|
9
|
+
export declare class ErrorBoundary extends Component<ErrorBoundaryProps, State> {
|
|
10
|
+
state: State;
|
|
11
|
+
static getDerivedStateFromError(error: Error): State;
|
|
12
|
+
componentDidCatch(error: Error, _info: ErrorInfo): void;
|
|
13
|
+
reset: () => void;
|
|
14
|
+
render(): ReactNode;
|
|
15
|
+
}
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=error-boundary.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-boundary.d.ts","sourceRoot":"","sources":["../src/error-boundary.tsx"],"names":[],"mappings":"AAAA,OAAc,EAAE,SAAS,EAAE,KAAK,SAAS,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAIzE,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,IAAI,KAAK,SAAS,CAAC,CAAC;IACxE,QAAQ,EAAE,SAAS,CAAC;CACrB,CAAC;AAEF,KAAK,KAAK,GAAG;IAAE,KAAK,EAAE,KAAK,GAAG,IAAI,CAAA;CAAE,CAAC;AAErC,qBAAa,aAAc,SAAQ,SAAS,CAAC,kBAAkB,EAAE,KAAK,CAAC;IACrE,KAAK,EAAE,KAAK,CAAmB;IAE/B,MAAM,CAAC,wBAAwB,CAAC,KAAK,EAAE,KAAK,GAAG,KAAK;IAIpD,iBAAiB,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,GAAG,IAAI;IAIvD,KAAK,QAAO,IAAI,CAEd;IAEF,MAAM,IAAI,SAAS;CAWpB"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { Component } from 'react';
|
|
2
|
+
import { captureError } from './capture';
|
|
3
|
+
export class ErrorBoundary extends Component {
|
|
4
|
+
state = { error: null };
|
|
5
|
+
static getDerivedStateFromError(error) {
|
|
6
|
+
return { error };
|
|
7
|
+
}
|
|
8
|
+
componentDidCatch(error, _info) {
|
|
9
|
+
captureError(error);
|
|
10
|
+
}
|
|
11
|
+
reset = () => {
|
|
12
|
+
this.setState({ error: null });
|
|
13
|
+
};
|
|
14
|
+
render() {
|
|
15
|
+
const { error } = this.state;
|
|
16
|
+
const { fallback, children } = this.props;
|
|
17
|
+
if (error) {
|
|
18
|
+
if (typeof fallback === 'function') {
|
|
19
|
+
return fallback(error, this.reset);
|
|
20
|
+
}
|
|
21
|
+
return fallback ?? null;
|
|
22
|
+
}
|
|
23
|
+
return children;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=error-boundary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-boundary.js","sourceRoot":"","sources":["../src/error-boundary.tsx"],"names":[],"mappings":"AAAA,OAAc,EAAE,SAAS,EAAkC,MAAM,OAAO,CAAC;AAEzE,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AASzC,MAAM,OAAO,aAAc,SAAQ,SAAoC;IACrE,KAAK,GAAU,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IAE/B,MAAM,CAAC,wBAAwB,CAAC,KAAY;QAC1C,OAAO,EAAE,KAAK,EAAE,CAAC;IACnB,CAAC;IAED,iBAAiB,CAAC,KAAY,EAAE,KAAgB;QAC9C,YAAY,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC;IAED,KAAK,GAAG,GAAS,EAAE;QACjB,IAAI,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACjC,CAAC,CAAC;IAEF,MAAM;QACJ,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;QAC7B,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;QAC1C,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,OAAO,QAAQ,KAAK,UAAU,EAAE,CAAC;gBACnC,OAAO,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;YACrC,CAAC;YACD,OAAO,QAAQ,IAAI,IAAI,CAAC;QAC1B,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"global.d.ts","sourceRoot":"","sources":["../../src/handlers/global.ts"],"names":[],"mappings":"AAYA,eAAO,MAAM,oBAAoB,QAAO,IAuBvC,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { captureError } from '../capture';
|
|
2
|
+
let _previous;
|
|
3
|
+
let _installed = false;
|
|
4
|
+
export const installGlobalHandler = () => {
|
|
5
|
+
if (_installed)
|
|
6
|
+
return;
|
|
7
|
+
const utils = globalThis.ErrorUtils;
|
|
8
|
+
if (!utils || typeof utils.setGlobalHandler !== 'function')
|
|
9
|
+
return;
|
|
10
|
+
_installed = true;
|
|
11
|
+
_previous = utils.getGlobalHandler();
|
|
12
|
+
utils.setGlobalHandler((error, isFatal) => {
|
|
13
|
+
try {
|
|
14
|
+
captureError(error);
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
// never throw from the global handler
|
|
18
|
+
}
|
|
19
|
+
if (_previous) {
|
|
20
|
+
try {
|
|
21
|
+
_previous(error, isFatal);
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
// ignore previous handler error
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
};
|
|
29
|
+
//# sourceMappingURL=global.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"global.js","sourceRoot":"","sources":["../../src/handlers/global.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAS1C,IAAI,SAAwC,CAAC;AAC7C,IAAI,UAAU,GAAG,KAAK,CAAC;AAEvB,MAAM,CAAC,MAAM,oBAAoB,GAAG,GAAS,EAAE;IAC7C,IAAI,UAAU;QAAE,OAAO;IAEvB,MAAM,KAAK,GAAI,UAA8C,CAAC,UAAU,CAAC;IACzE,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,CAAC,gBAAgB,KAAK,UAAU;QAAE,OAAO;IAEnE,UAAU,GAAG,IAAI,CAAC;IAClB,SAAS,GAAG,KAAK,CAAC,gBAAgB,EAAE,CAAC;IAErC,KAAK,CAAC,gBAAgB,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxC,IAAI,CAAC;YACH,YAAY,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;QAAC,MAAM,CAAC;YACP,sCAAsC;QACxC,CAAC;QACD,IAAI,SAAS,EAAE,CAAC;YACd,IAAI,CAAC;gBACH,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YAC5B,CAAC;YAAC,MAAM,CAAC;gBACP,gCAAgC;YAClC,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"network.d.ts","sourceRoot":"","sources":["../../src/handlers/network.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,qBAAqB,QAAO,IAyCxC,CAAC"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { addBreadcrumb } from '../breadcrumbs';
|
|
2
|
+
let _installed = false;
|
|
3
|
+
const AUTH_PARAMS = ['token', 'key', 'password', 'secret', 'access_token'];
|
|
4
|
+
export const installNetworkHandler = () => {
|
|
5
|
+
if (_installed)
|
|
6
|
+
return;
|
|
7
|
+
if (typeof globalThis.fetch !== 'function')
|
|
8
|
+
return;
|
|
9
|
+
_installed = true;
|
|
10
|
+
const original = globalThis.fetch;
|
|
11
|
+
globalThis.fetch = (async (input, init) => {
|
|
12
|
+
const start = Date.now();
|
|
13
|
+
const url = extractUrl(input);
|
|
14
|
+
const method = (init?.method ??
|
|
15
|
+
(typeof input !== 'string' && 'method' in input
|
|
16
|
+
? input.method
|
|
17
|
+
: 'GET'));
|
|
18
|
+
try {
|
|
19
|
+
const resp = await original(input, init);
|
|
20
|
+
addBreadcrumb({
|
|
21
|
+
type: 'net',
|
|
22
|
+
data: {
|
|
23
|
+
method,
|
|
24
|
+
url: scrubUrl(url),
|
|
25
|
+
status: resp.status,
|
|
26
|
+
durationMs: Date.now() - start,
|
|
27
|
+
},
|
|
28
|
+
});
|
|
29
|
+
return resp;
|
|
30
|
+
}
|
|
31
|
+
catch (e) {
|
|
32
|
+
addBreadcrumb({
|
|
33
|
+
type: 'net',
|
|
34
|
+
data: {
|
|
35
|
+
method,
|
|
36
|
+
url: scrubUrl(url),
|
|
37
|
+
status: 0,
|
|
38
|
+
durationMs: Date.now() - start,
|
|
39
|
+
error: String(e),
|
|
40
|
+
},
|
|
41
|
+
});
|
|
42
|
+
throw e;
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
};
|
|
46
|
+
const extractUrl = (input) => {
|
|
47
|
+
if (typeof input === 'string')
|
|
48
|
+
return input;
|
|
49
|
+
if (input instanceof URL)
|
|
50
|
+
return input.href;
|
|
51
|
+
return input.url;
|
|
52
|
+
};
|
|
53
|
+
const scrubUrl = (url) => {
|
|
54
|
+
try {
|
|
55
|
+
const u = new URL(url);
|
|
56
|
+
let modified = false;
|
|
57
|
+
for (const p of AUTH_PARAMS) {
|
|
58
|
+
if (u.searchParams.has(p)) {
|
|
59
|
+
u.searchParams.set(p, '[redacted]');
|
|
60
|
+
modified = true;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return modified ? u.toString() : url;
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
return url;
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
//# sourceMappingURL=network.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"network.js","sourceRoot":"","sources":["../../src/handlers/network.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE/C,IAAI,UAAU,GAAG,KAAK,CAAC;AAEvB,MAAM,WAAW,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAC;AAE3E,MAAM,CAAC,MAAM,qBAAqB,GAAG,GAAS,EAAE;IAC9C,IAAI,UAAU;QAAE,OAAO;IACvB,IAAI,OAAO,UAAU,CAAC,KAAK,KAAK,UAAU;QAAE,OAAO;IACnD,UAAU,GAAG,IAAI,CAAC;IAElB,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC;IAElC,UAAU,CAAC,KAAK,GAAG,CAAC,KAAK,EAAE,KAAwB,EAAE,IAAkB,EAAE,EAAE;QACzE,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACzB,MAAM,GAAG,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;QAC9B,MAAM,MAAM,GAAG,CAAC,IAAI,EAAE,MAAM;YAC1B,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,QAAQ,IAAK,KAAiB;gBAC1D,CAAC,CAAE,KAAiB,CAAC,MAAM;gBAC3B,CAAC,CAAC,KAAK,CAAC,CAAW,CAAC;QAExB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YACzC,aAAa,CAAC;gBACZ,IAAI,EAAE,KAAK;gBACX,IAAI,EAAE;oBACJ,MAAM;oBACN,GAAG,EAAE,QAAQ,CAAC,GAAG,CAAC;oBAClB,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;iBAC/B;aACF,CAAC,CAAC;YACH,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,aAAa,CAAC;gBACZ,IAAI,EAAE,KAAK;gBACX,IAAI,EAAE;oBACJ,MAAM;oBACN,GAAG,EAAE,QAAQ,CAAC,GAAG,CAAC;oBAClB,MAAM,EAAE,CAAC;oBACT,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;oBAC9B,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;iBACjB;aACF,CAAC,CAAC;YACH,MAAM,CAAC,CAAC;QACV,CAAC;IACH,CAAC,CAAiB,CAAC;AACrB,CAAC,CAAC;AAEF,MAAM,UAAU,GAAG,CAAC,KAAwB,EAAU,EAAE;IACtD,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5C,IAAI,KAAK,YAAY,GAAG;QAAE,OAAO,KAAK,CAAC,IAAI,CAAC;IAC5C,OAAQ,KAAiB,CAAC,GAAG,CAAC;AAChC,CAAC,CAAC;AAEF,MAAM,QAAQ,GAAG,CAAC,GAAW,EAAU,EAAE;IACvC,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QACvB,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;YAC5B,IAAI,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC1B,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;gBACpC,QAAQ,GAAG,IAAI,CAAC;YAClB,CAAC;QACH,CAAC;QACD,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG,CAAC;IACb,CAAC;AACH,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"promise.d.ts","sourceRoot":"","sources":["../../src/handlers/promise.ts"],"names":[],"mappings":"AAaA,eAAO,MAAM,qBAAqB,QAAO,IAwBxC,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { captureError } from '../capture';
|
|
2
|
+
let _installed = false;
|
|
3
|
+
export const installPromiseHandler = () => {
|
|
4
|
+
if (_installed)
|
|
5
|
+
return;
|
|
6
|
+
const hermes = globalThis
|
|
7
|
+
.HermesInternal;
|
|
8
|
+
if (hermes?.enablePromiseRejectionTracker) {
|
|
9
|
+
_installed = true;
|
|
10
|
+
hermes.enablePromiseRejectionTracker({
|
|
11
|
+
allRejections: true,
|
|
12
|
+
onUnhandled: (_id, rejection) => {
|
|
13
|
+
try {
|
|
14
|
+
const err = rejection instanceof Error ? rejection : new Error(String(rejection));
|
|
15
|
+
captureError(err);
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
// never throw
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
});
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
// No-op fallback: on JSC or older Hermes the SDK can't track rejections
|
|
25
|
+
// without a polyfill. Users targeting these can call `captureError(err)` manually.
|
|
26
|
+
};
|
|
27
|
+
//# sourceMappingURL=promise.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"promise.js","sourceRoot":"","sources":["../../src/handlers/promise.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAW1C,IAAI,UAAU,GAAG,KAAK,CAAC;AAEvB,MAAM,CAAC,MAAM,qBAAqB,GAAG,GAAS,EAAE;IAC9C,IAAI,UAAU;QAAE,OAAO;IAEvB,MAAM,MAAM,GAAI,UAAsD;SACnE,cAAc,CAAC;IAClB,IAAI,MAAM,EAAE,6BAA6B,EAAE,CAAC;QAC1C,UAAU,GAAG,IAAI,CAAC;QAClB,MAAM,CAAC,6BAA6B,CAAC;YACnC,aAAa,EAAE,IAAI;YACnB,WAAW,EAAE,CAAC,GAAG,EAAE,SAAS,EAAE,EAAE;gBAC9B,IAAI,CAAC;oBACH,MAAM,GAAG,GACP,SAAS,YAAY,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;oBACxE,YAAY,CAAC,GAAG,CAAC,CAAC;gBACpB,CAAC;gBAAC,MAAM,CAAC;oBACP,cAAc;gBAChB,CAAC;YACH,CAAC;SACF,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IAED,wEAAwE;IACxE,mFAAmF;AACrF,CAAC,CAAC"}
|
package/lib/index.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { ErrorBoundary } from './error-boundary';
|
|
2
|
+
export declare const sentori: {
|
|
3
|
+
init: (options: import("./init").InitOptions) => void;
|
|
4
|
+
addBreadcrumb: (input: import("./breadcrumbs").AddBreadcrumbInput) => void;
|
|
5
|
+
setUser: (user: import("./types").User | null) => void;
|
|
6
|
+
getUser: () => import("./types").User | null;
|
|
7
|
+
captureError: (error: Error, extras?: import("./capture").CaptureExtras) => void;
|
|
8
|
+
captureException: (error: Error, extras?: import("./capture").CaptureExtras) => void;
|
|
9
|
+
ErrorBoundary: typeof ErrorBoundary;
|
|
10
|
+
};
|
|
11
|
+
export default sentori;
|
|
12
|
+
export { init } from './init';
|
|
13
|
+
export { addBreadcrumb } from './breadcrumbs';
|
|
14
|
+
export { setUser, getUser, captureError, captureException } from './capture';
|
|
15
|
+
export { ErrorBoundary } from './error-boundary';
|
|
16
|
+
export { triggerNativeCrash } from './native';
|
|
17
|
+
export type { Event, SentoriError, Frame, Breadcrumb, BreadcrumbType, Device, DeviceOS, App, User, Tags, EventKind, Platform, } from './types';
|
|
18
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD,eAAO,MAAM,OAAO;;;;;;;;CAQnB,CAAC;AAEF,eAAe,OAAO,CAAC;AAEvB,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7E,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAE9C,YAAY,EACV,KAAK,EACL,YAAY,EACZ,KAAK,EACL,UAAU,EACV,cAAc,EACd,MAAM,EACN,QAAQ,EACR,GAAG,EACH,IAAI,EACJ,IAAI,EACJ,SAAS,EACT,QAAQ,GACT,MAAM,SAAS,CAAC"}
|
package/lib/index.js
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { init } from './init';
|
|
2
|
+
import { addBreadcrumb } from './breadcrumbs';
|
|
3
|
+
import { setUser, getUser, captureError, captureException } from './capture';
|
|
4
|
+
import { ErrorBoundary } from './error-boundary';
|
|
5
|
+
export const sentori = {
|
|
6
|
+
init,
|
|
7
|
+
addBreadcrumb,
|
|
8
|
+
setUser,
|
|
9
|
+
getUser,
|
|
10
|
+
captureError,
|
|
11
|
+
captureException,
|
|
12
|
+
ErrorBoundary,
|
|
13
|
+
};
|
|
14
|
+
export default sentori;
|
|
15
|
+
export { init } from './init';
|
|
16
|
+
export { addBreadcrumb } from './breadcrumbs';
|
|
17
|
+
export { setUser, getUser, captureError, captureException } from './capture';
|
|
18
|
+
export { ErrorBoundary } from './error-boundary';
|
|
19
|
+
export { triggerNativeCrash } from './native';
|
|
20
|
+
//# sourceMappingURL=index.js.map
|
package/lib/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7E,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,IAAI;IACJ,aAAa;IACb,OAAO;IACP,OAAO;IACP,YAAY;IACZ,gBAAgB;IAChB,aAAa;CACd,CAAC;AAEF,eAAe,OAAO,CAAC;AAEvB,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7E,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC"}
|
package/lib/init.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export type InitOptions = {
|
|
2
|
+
/** Project token starting with `st_pk_`. Required. */
|
|
3
|
+
token: string;
|
|
4
|
+
/** Release identifier, e.g. `myapp@1.2.3+456`. Required. */
|
|
5
|
+
release: string;
|
|
6
|
+
/** Environment label. Defaults to `dev` if `__DEV__`, else `prod`. */
|
|
7
|
+
environment?: string;
|
|
8
|
+
/** Override ingestion URL (self-hosted). Default: https://ingest.sentori.golia.jp */
|
|
9
|
+
ingestUrl?: string;
|
|
10
|
+
/** Toggle individual capture sources. All enabled by default. */
|
|
11
|
+
capture?: {
|
|
12
|
+
globalErrors?: boolean;
|
|
13
|
+
promiseRejections?: boolean;
|
|
14
|
+
network?: boolean;
|
|
15
|
+
};
|
|
16
|
+
};
|
|
17
|
+
export declare const init: (options: InitOptions) => void;
|
|
18
|
+
//# sourceMappingURL=init.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAUA,MAAM,MAAM,WAAW,GAAG;IACxB,sDAAsD;IACtD,KAAK,EAAE,MAAM,CAAC;IACd,4DAA4D;IAC5D,OAAO,EAAE,MAAM,CAAC;IAChB,sEAAsE;IACtE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qFAAqF;IACrF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iEAAiE;IACjE,OAAO,CAAC,EAAE;QACR,YAAY,CAAC,EAAE,OAAO,CAAC;QACvB,iBAAiB,CAAC,EAAE,OAAO,CAAC;QAC5B,OAAO,CAAC,EAAE,OAAO,CAAC;KACnB,CAAC;CACH,CAAC;AAIF,eAAO,MAAM,IAAI,GAAI,SAAS,WAAW,KAAG,IAkD3C,CAAC"}
|
package/lib/init.js
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { setConfig } from './config';
|
|
2
|
+
import { installGlobalHandler } from './handlers/global';
|
|
3
|
+
import { installPromiseHandler } from './handlers/promise';
|
|
4
|
+
import { installNetworkHandler } from './handlers/network';
|
|
5
|
+
import { drainNativePending, setNativeConfig } from './native';
|
|
6
|
+
import { drainOfflineQueue, enqueue, startTransport } from './transport';
|
|
7
|
+
const DEFAULT_INGEST_URL = 'https://ingest.sentori.golia.jp';
|
|
8
|
+
export const init = (options) => {
|
|
9
|
+
if (!options.token || !options.token.startsWith('st_pk_')) {
|
|
10
|
+
throw new Error("Sentori: token is required and must start with 'st_pk_'");
|
|
11
|
+
}
|
|
12
|
+
if (!options.release) {
|
|
13
|
+
throw new Error('Sentori: release is required');
|
|
14
|
+
}
|
|
15
|
+
const env = options.environment ??
|
|
16
|
+
(typeof __DEV__ !== 'undefined' && __DEV__ ? 'dev' : 'prod');
|
|
17
|
+
setConfig({
|
|
18
|
+
token: options.token,
|
|
19
|
+
release: options.release,
|
|
20
|
+
environment: env,
|
|
21
|
+
ingestUrl: options.ingestUrl ?? DEFAULT_INGEST_URL,
|
|
22
|
+
enabled: true,
|
|
23
|
+
});
|
|
24
|
+
// Tell the native crash handler about the config so the JSON it writes
|
|
25
|
+
// on the next NSException / Java uncaught carries release + env.
|
|
26
|
+
setNativeConfig({
|
|
27
|
+
token: options.token,
|
|
28
|
+
release: options.release,
|
|
29
|
+
environment: env,
|
|
30
|
+
});
|
|
31
|
+
startTransport();
|
|
32
|
+
const capture = options.capture ?? {};
|
|
33
|
+
if (capture.globalErrors !== false)
|
|
34
|
+
installGlobalHandler();
|
|
35
|
+
if (capture.promiseRejections !== false)
|
|
36
|
+
installPromiseHandler();
|
|
37
|
+
if (capture.network !== false)
|
|
38
|
+
installNetworkHandler();
|
|
39
|
+
// Drain events persisted from previous session (best-effort):
|
|
40
|
+
// - native crashes from <Documents>/sentori/pending/*.json
|
|
41
|
+
// - JS transport offline queue from AsyncStorage
|
|
42
|
+
drainNativePending()
|
|
43
|
+
.then((items) => {
|
|
44
|
+
for (const json of items) {
|
|
45
|
+
try {
|
|
46
|
+
enqueue(JSON.parse(json));
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
// skip malformed
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
})
|
|
53
|
+
.catch(() => { });
|
|
54
|
+
drainOfflineQueue().catch(() => { });
|
|
55
|
+
};
|
|
56
|
+
//# sourceMappingURL=init.js.map
|
package/lib/init.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAsBzE,MAAM,kBAAkB,GAAG,iCAAiC,CAAC;AAE7D,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,OAAoB,EAAQ,EAAE;IACjD,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1D,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;IAC7E,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAClD,CAAC;IAED,MAAM,GAAG,GACP,OAAO,CAAC,WAAW;QACnB,CAAC,OAAO,OAAO,KAAK,WAAW,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAE/D,SAAS,CAAC;QACR,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,WAAW,EAAE,GAAG;QAChB,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,kBAAkB;QAClD,OAAO,EAAE,IAAI;KACd,CAAC,CAAC;IAEH,uEAAuE;IACvE,iEAAiE;IACjE,eAAe,CAAC;QACd,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,WAAW,EAAE,GAAG;KACjB,CAAC,CAAC;IAEH,cAAc,EAAE,CAAC;IAEjB,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;IACtC,IAAI,OAAO,CAAC,YAAY,KAAK,KAAK;QAAE,oBAAoB,EAAE,CAAC;IAC3D,IAAI,OAAO,CAAC,iBAAiB,KAAK,KAAK;QAAE,qBAAqB,EAAE,CAAC;IACjE,IAAI,OAAO,CAAC,OAAO,KAAK,KAAK;QAAE,qBAAqB,EAAE,CAAC;IAEvD,8DAA8D;IAC9D,2DAA2D;IAC3D,iDAAiD;IACjD,kBAAkB,EAAE;SACjB,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE;QACd,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC;gBACH,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAU,CAAC,CAAC;YACrC,CAAC;YAAC,MAAM,CAAC;gBACP,iBAAiB;YACnB,CAAC;QACH,CAAC;IACH,CAAC,CAAC;SACD,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACnB,iBAAiB,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;AACtC,CAAC,CAAC"}
|
package/lib/native.d.ts
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bridge to the native (iOS / Android) Sentori module.
|
|
3
|
+
* No-op when not running in an Expo runtime that has the module installed —
|
|
4
|
+
* this keeps the SDK usable in pure-JS environments (jest, bun test, web).
|
|
5
|
+
*/
|
|
6
|
+
export declare function setNativeConfig(config: {
|
|
7
|
+
environment: string;
|
|
8
|
+
release: string;
|
|
9
|
+
token: string;
|
|
10
|
+
}): void;
|
|
11
|
+
export declare function drainNativePending(): Promise<string[]>;
|
|
12
|
+
/**
|
|
13
|
+
* Dev-only helper. Triggers a real NSException (iOS) or RuntimeException
|
|
14
|
+
* (Android) after a short delay so the host app crashes for real and the
|
|
15
|
+
* native crash handler exercises the full write-to-disk path.
|
|
16
|
+
*
|
|
17
|
+
* Usage: tap a button in the example app, watch the app close, restart it,
|
|
18
|
+
* verify the server received the event.
|
|
19
|
+
*
|
|
20
|
+
* No-op when the native module isn't installed (jest, bun test, web).
|
|
21
|
+
*/
|
|
22
|
+
export declare function triggerNativeCrash(): void;
|
|
23
|
+
//# sourceMappingURL=native.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"native.d.ts","sourceRoot":"","sources":["../src/native.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA4BH,wBAAgB,eAAe,CAAC,MAAM,EAAE;IACtC,WAAW,EAAE,MAAM,CAAA;IACnB,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;CACd,GAAG,IAAI,CAMP;AAED,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAQ5D;AAED;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,IAAI,IAAI,CAMzC"}
|
package/lib/native.js
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bridge to the native (iOS / Android) Sentori module.
|
|
3
|
+
* No-op when not running in an Expo runtime that has the module installed —
|
|
4
|
+
* this keeps the SDK usable in pure-JS environments (jest, bun test, web).
|
|
5
|
+
*/
|
|
6
|
+
let _native;
|
|
7
|
+
function native() {
|
|
8
|
+
if (_native !== undefined)
|
|
9
|
+
return _native;
|
|
10
|
+
try {
|
|
11
|
+
const core = require('expo-modules-core');
|
|
12
|
+
_native = core.requireNativeModule('Sentori');
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
_native = null;
|
|
16
|
+
}
|
|
17
|
+
return _native;
|
|
18
|
+
}
|
|
19
|
+
export function setNativeConfig(config) {
|
|
20
|
+
try {
|
|
21
|
+
native()?.setConfig(config);
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
// never throw on init
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
export async function drainNativePending() {
|
|
28
|
+
const n = native();
|
|
29
|
+
if (!n)
|
|
30
|
+
return [];
|
|
31
|
+
try {
|
|
32
|
+
return await n.drainPending();
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
return [];
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Dev-only helper. Triggers a real NSException (iOS) or RuntimeException
|
|
40
|
+
* (Android) after a short delay so the host app crashes for real and the
|
|
41
|
+
* native crash handler exercises the full write-to-disk path.
|
|
42
|
+
*
|
|
43
|
+
* Usage: tap a button in the example app, watch the app close, restart it,
|
|
44
|
+
* verify the server received the event.
|
|
45
|
+
*
|
|
46
|
+
* No-op when the native module isn't installed (jest, bun test, web).
|
|
47
|
+
*/
|
|
48
|
+
export function triggerNativeCrash() {
|
|
49
|
+
try {
|
|
50
|
+
native()?.triggerTestNativeCrash?.();
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
// never throw from a debugging helper
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=native.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"native.js","sourceRoot":"","sources":["../src/native.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAaH,IAAI,OAA+C,CAAA;AAEnD,SAAS,MAAM;IACb,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,OAAO,CAAA;IACzC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,OAAO,CAAC,mBAAmB,CAEvC,CAAA;QACD,OAAO,GAAG,IAAI,CAAC,mBAAmB,CAAsB,SAAS,CAAC,CAAA;IACpE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG,IAAI,CAAA;IAChB,CAAC;IACD,OAAO,OAAO,CAAA;AAChB,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,MAI/B;IACC,IAAI,CAAC;QACH,MAAM,EAAE,EAAE,SAAS,CAAC,MAAM,CAAC,CAAA;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,sBAAsB;IACxB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB;IACtC,MAAM,CAAC,GAAG,MAAM,EAAE,CAAA;IAClB,IAAI,CAAC,CAAC;QAAE,OAAO,EAAE,CAAA;IACjB,IAAI,CAAC;QACH,OAAO,MAAM,CAAC,CAAC,YAAY,EAAE,CAAA;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAA;IACX,CAAC;AACH,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,kBAAkB;IAChC,IAAI,CAAC;QACH,MAAM,EAAE,EAAE,sBAAsB,EAAE,EAAE,CAAA;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,sCAAsC;IACxC,CAAC;AACH,CAAC"}
|
package/lib/stack.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stack.d.ts","sourceRoot":"","sources":["../src/stack.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAWrC,eAAO,MAAM,UAAU,GAAI,OAAO,MAAM,GAAG,SAAS,KAAG,KAAK,EAgB3D,CAAC"}
|