@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.
Files changed (86) hide show
  1. package/README.md +5 -0
  2. package/SentoriReactNative.podspec +21 -0
  3. package/android/build.gradle +38 -0
  4. package/android/src/main/AndroidManifest.xml +1 -0
  5. package/android/src/main/java/com/sentori/SentoriCrashHandler.kt +213 -0
  6. package/android/src/main/java/com/sentori/SentoriModule.kt +39 -0
  7. package/android/src/test/java/com/sentori/SentoriCrashHandlerTest.kt +60 -0
  8. package/expo-module.config.json +9 -0
  9. package/ios/SentoriCrashHandler.swift +160 -0
  10. package/ios/SentoriModule.swift +43 -0
  11. package/ios/Tests/SentoriCrashHandlerTests.swift +59 -0
  12. package/lib/breadcrumbs.d.ts +11 -0
  13. package/lib/breadcrumbs.d.ts.map +1 -0
  14. package/lib/breadcrumbs.js +21 -0
  15. package/lib/breadcrumbs.js.map +1 -0
  16. package/lib/capture.d.ts +23 -0
  17. package/lib/capture.d.ts.map +1 -0
  18. package/lib/capture.js +91 -0
  19. package/lib/capture.js.map +1 -0
  20. package/lib/config.d.ts +12 -0
  21. package/lib/config.d.ts.map +1 -0
  22. package/lib/config.js +10 -0
  23. package/lib/config.js.map +1 -0
  24. package/lib/error-boundary.d.ts +17 -0
  25. package/lib/error-boundary.d.ts.map +1 -0
  26. package/lib/error-boundary.js +26 -0
  27. package/lib/error-boundary.js.map +1 -0
  28. package/lib/handlers/global.d.ts +2 -0
  29. package/lib/handlers/global.d.ts.map +1 -0
  30. package/lib/handlers/global.js +29 -0
  31. package/lib/handlers/global.js.map +1 -0
  32. package/lib/handlers/network.d.ts +2 -0
  33. package/lib/handlers/network.d.ts.map +1 -0
  34. package/lib/handlers/network.js +69 -0
  35. package/lib/handlers/network.js.map +1 -0
  36. package/lib/handlers/promise.d.ts +2 -0
  37. package/lib/handlers/promise.d.ts.map +1 -0
  38. package/lib/handlers/promise.js +27 -0
  39. package/lib/handlers/promise.js.map +1 -0
  40. package/lib/index.d.ts +18 -0
  41. package/lib/index.d.ts.map +1 -0
  42. package/lib/index.js +20 -0
  43. package/lib/index.js.map +1 -0
  44. package/lib/init.d.ts +18 -0
  45. package/lib/init.d.ts.map +1 -0
  46. package/lib/init.js +56 -0
  47. package/lib/init.js.map +1 -0
  48. package/lib/native.d.ts +23 -0
  49. package/lib/native.d.ts.map +1 -0
  50. package/lib/native.js +56 -0
  51. package/lib/native.js.map +1 -0
  52. package/lib/stack.d.ts +3 -0
  53. package/lib/stack.d.ts.map +1 -0
  54. package/lib/stack.js +69 -0
  55. package/lib/stack.js.map +1 -0
  56. package/lib/transport.d.ts +8 -0
  57. package/lib/transport.d.ts.map +1 -0
  58. package/lib/transport.js +143 -0
  59. package/lib/transport.js.map +1 -0
  60. package/lib/types.d.ts +62 -0
  61. package/lib/types.d.ts.map +1 -0
  62. package/lib/types.js +2 -0
  63. package/lib/types.js.map +1 -0
  64. package/lib/uuid.d.ts +11 -0
  65. package/lib/uuid.d.ts.map +1 -0
  66. package/lib/uuid.js +46 -0
  67. package/lib/uuid.js.map +1 -0
  68. package/package.json +66 -0
  69. package/src/__tests__/breadcrumbs.test.ts +44 -0
  70. package/src/__tests__/stack.test.ts +43 -0
  71. package/src/__tests__/transport.test.ts +112 -0
  72. package/src/__tests__/uuid.test.ts +41 -0
  73. package/src/breadcrumbs.ts +33 -0
  74. package/src/capture.ts +108 -0
  75. package/src/config.ts +21 -0
  76. package/src/error-boundary.tsx +38 -0
  77. package/src/handlers/global.ts +36 -0
  78. package/src/handlers/network.ts +70 -0
  79. package/src/handlers/promise.ts +38 -0
  80. package/src/index.ts +37 -0
  81. package/src/init.ts +80 -0
  82. package/src/native.ts +71 -0
  83. package/src/stack.ts +72 -0
  84. package/src/transport.ts +164 -0
  85. package/src/types.ts +63 -0
  86. 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"}
@@ -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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"}
@@ -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,2 @@
1
+ export declare const installGlobalHandler: () => void;
2
+ //# sourceMappingURL=global.d.ts.map
@@ -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,2 @@
1
+ export declare const installNetworkHandler: () => void;
2
+ //# sourceMappingURL=network.d.ts.map
@@ -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,2 @@
1
+ export declare const installPromiseHandler: () => void;
2
+ //# sourceMappingURL=promise.d.ts.map
@@ -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
@@ -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
@@ -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"}
@@ -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,3 @@
1
+ import type { Frame } from './types';
2
+ export declare const parseStack: (stack: string | undefined) => Frame[];
3
+ //# sourceMappingURL=stack.d.ts.map
@@ -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"}