@fixprompt/react-native 0.0.1 → 0.0.3
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 +10 -0
- package/dist/breadcrumbs.d.ts +22 -0
- package/dist/console.d.ts +9 -0
- package/dist/device.d.ts +10 -0
- package/dist/index.cjs +109 -5
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +109 -5
- package/dist/index.js.map +1 -1
- package/dist/state.d.ts +1 -0
- package/dist/version.d.ts +1 -1
- package/package.json +4 -2
package/README.md
CHANGED
|
@@ -87,11 +87,21 @@ Every event ships with:
|
|
|
87
87
|
| `platform` | `Platform.OS` (ios / android / web / ...) |
|
|
88
88
|
| `os_version` | `Platform.Version` |
|
|
89
89
|
| `rn_version` | `Platform.constants.reactNativeVersion` |
|
|
90
|
+
| `app_version` | `Constants.expoConfig.version` or `Constants.nativeAppVersion` (needs `expo-constants`) |
|
|
91
|
+
| `build_number` | `Constants.expoConfig.ios.buildNumber` / `android.versionCode` / `nativeBuildVersion` |
|
|
92
|
+
| `ota_id` | `Updates.updateId` from `expo-updates` — present iff an OTA bundle is active |
|
|
93
|
+
| `runtime_version` | `Updates.runtimeVersion` from `expo-updates` |
|
|
94
|
+
| `ota_channel` | `Updates.channel` from `expo-updates` — e.g. `production`, `preview` |
|
|
90
95
|
| `release` | passed to `initFixPrompt({ release })` or `null` |
|
|
91
96
|
| `session_id` | uuid per cold start, in-memory |
|
|
92
97
|
| `device_id` | uuid per device, persisted (SecureStore → AsyncStorage) |
|
|
93
98
|
| `user_id`, `user_email` | last `setUser({...})` call |
|
|
94
99
|
|
|
100
|
+
`expo-constants` and `expo-updates` are **optional peer deps** — install them and the SDK
|
|
101
|
+
auto-detects everything; skip them and the basic platform attrs still ship. Bare React
|
|
102
|
+
Native apps without Expo can pass `release` / `build_number` manually via
|
|
103
|
+
`initFixPrompt({ release: '1.2.3+47' })` or via env-var-driven values.
|
|
104
|
+
|
|
95
105
|
The broker promotes `sdk` + `sdk_version` into `project_sdk_installations`, so the dashboard's support copy ("you're on RN SDK 0.0.1") lights up automatically.
|
|
96
106
|
|
|
97
107
|
## Tag-based capture (advanced)
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-memory ring buffer of the most recent console log lines.
|
|
3
|
+
*
|
|
4
|
+
* NEVER streamed to Loki on its own (would balloon volume + cost). Every
|
|
5
|
+
* outgoing event attaches the current buffer as `attrs.breadcrumbs`, giving
|
|
6
|
+
* the broker the lines that ran in the seconds before the error fired.
|
|
7
|
+
*
|
|
8
|
+
* That context is what the Fix Prompt template surfaces to Cursor/Claude
|
|
9
|
+
* — "this error happened, and HERE'S WHAT THE APP WAS DOING right before
|
|
10
|
+
* it." Without it, the AI just sees a stack trace with no surrounding state.
|
|
11
|
+
*/
|
|
12
|
+
export interface Breadcrumb {
|
|
13
|
+
/** Wall-clock ms timestamp. */
|
|
14
|
+
ts: number;
|
|
15
|
+
/** One of the four console levels (log / info / warn / error). */
|
|
16
|
+
level: 'log' | 'info' | 'warn' | 'error';
|
|
17
|
+
/** Stringified console args, capped at 500 chars. */
|
|
18
|
+
message: string;
|
|
19
|
+
}
|
|
20
|
+
export declare function pushBreadcrumb(level: Breadcrumb['level'], args: any[]): void;
|
|
21
|
+
export declare function getBreadcrumbs(): Breadcrumb[];
|
|
22
|
+
export declare function clearBreadcrumbs(): void;
|
package/dist/console.d.ts
CHANGED
|
@@ -1,4 +1,13 @@
|
|
|
1
1
|
import type { ResolvedConfig } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Patches all four console levels (log / info / warn / error) to push entries
|
|
4
|
+
* into the breadcrumb ring buffer. Forwarding patches below are installed on
|
|
5
|
+
* top of these — they snapshot the buffer BEFORE pushing the current call,
|
|
6
|
+
* so the forwarded event sees the lines that ran before it.
|
|
7
|
+
*
|
|
8
|
+
* No-op-on-failure; never throws.
|
|
9
|
+
*/
|
|
10
|
+
export declare function patchConsoleForBreadcrumbs(): () => void;
|
|
2
11
|
/**
|
|
3
12
|
* Wrap console.error so tagged calls forward to the broker as warning-severity
|
|
4
13
|
* events. The original console.error still runs (so RedBox / Metro logs still
|
package/dist/device.d.ts
CHANGED
|
@@ -3,5 +3,15 @@ export interface DeviceAttrs {
|
|
|
3
3
|
os_version: string;
|
|
4
4
|
/** RN runtime version (Hermes / JSC). Used for triage. */
|
|
5
5
|
rn_version?: string;
|
|
6
|
+
/** App version (e.g. "1.2.3") from expo-constants or native build. */
|
|
7
|
+
app_version?: string;
|
|
8
|
+
/** Build number (CFBundleVersion / versionCode) from expo-constants. */
|
|
9
|
+
build_number?: string;
|
|
10
|
+
/** OTA bundle id (Updates.updateId) from expo-updates, if active. */
|
|
11
|
+
ota_id?: string;
|
|
12
|
+
/** OTA runtime version (Updates.runtimeVersion) from expo-updates. */
|
|
13
|
+
runtime_version?: string;
|
|
14
|
+
/** OTA channel (Updates.channel) — e.g. "production", "preview". */
|
|
15
|
+
ota_channel?: string;
|
|
6
16
|
}
|
|
7
17
|
export declare function getDeviceAttrs(): DeviceAttrs;
|
package/dist/index.cjs
CHANGED
|
@@ -455,17 +455,87 @@ var offlineBuffer = new OfflineBuffer();
|
|
|
455
455
|
|
|
456
456
|
// src/device.ts
|
|
457
457
|
var import_react_native = require("react-native");
|
|
458
|
+
function tryRequire(spec) {
|
|
459
|
+
try {
|
|
460
|
+
return require(spec);
|
|
461
|
+
} catch {
|
|
462
|
+
return null;
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
var ConstantsMod = tryRequire("expo-constants");
|
|
466
|
+
var Constants = ConstantsMod?.default ?? ConstantsMod ?? null;
|
|
467
|
+
var Updates = tryRequire("expo-updates");
|
|
458
468
|
function getDeviceAttrs() {
|
|
459
|
-
|
|
469
|
+
const attrs = {
|
|
460
470
|
platform: String(import_react_native.Platform.OS),
|
|
461
471
|
os_version: String(import_react_native.Platform.Version ?? "unknown"),
|
|
462
472
|
rn_version: import_react_native.Platform.constants?.reactNativeVersion ? Object.values(import_react_native.Platform.constants.reactNativeVersion).join(".") : void 0
|
|
463
473
|
};
|
|
474
|
+
if (Constants) {
|
|
475
|
+
const cfg = Constants.expoConfig ?? Constants.manifest ?? null;
|
|
476
|
+
if (cfg?.version) attrs.app_version = String(cfg.version);
|
|
477
|
+
if (cfg?.ios?.buildNumber) {
|
|
478
|
+
attrs.build_number = String(cfg.ios.buildNumber);
|
|
479
|
+
} else if (cfg?.android?.versionCode != null) {
|
|
480
|
+
attrs.build_number = String(cfg.android.versionCode);
|
|
481
|
+
}
|
|
482
|
+
if (!attrs.app_version && Constants.nativeAppVersion) {
|
|
483
|
+
attrs.app_version = String(Constants.nativeAppVersion);
|
|
484
|
+
}
|
|
485
|
+
if (!attrs.build_number && Constants.nativeBuildVersion) {
|
|
486
|
+
attrs.build_number = String(Constants.nativeBuildVersion);
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
if (Updates) {
|
|
490
|
+
if (Updates.updateId) attrs.ota_id = String(Updates.updateId);
|
|
491
|
+
if (Updates.runtimeVersion) attrs.runtime_version = String(Updates.runtimeVersion);
|
|
492
|
+
if (Updates.channel) attrs.ota_channel = String(Updates.channel);
|
|
493
|
+
}
|
|
494
|
+
return attrs;
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
// src/breadcrumbs.ts
|
|
498
|
+
var MAX_BREADCRUMBS = 50;
|
|
499
|
+
var MAX_MESSAGE_CHARS = 500;
|
|
500
|
+
var buffer = [];
|
|
501
|
+
function pushBreadcrumb(level, args) {
|
|
502
|
+
try {
|
|
503
|
+
const message = stringifyArgs(args);
|
|
504
|
+
buffer.push({ ts: Date.now(), level, message });
|
|
505
|
+
if (buffer.length > MAX_BREADCRUMBS) buffer.shift();
|
|
506
|
+
} catch {
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
function getBreadcrumbs() {
|
|
510
|
+
return [...buffer];
|
|
511
|
+
}
|
|
512
|
+
function clearBreadcrumbs() {
|
|
513
|
+
buffer.length = 0;
|
|
514
|
+
}
|
|
515
|
+
function stringifyArgs(args) {
|
|
516
|
+
const parts = [];
|
|
517
|
+
for (const a of args) {
|
|
518
|
+
if (a instanceof Error) {
|
|
519
|
+
parts.push(`${a.name}: ${a.message}`);
|
|
520
|
+
} else if (typeof a === "string") {
|
|
521
|
+
parts.push(a);
|
|
522
|
+
} else if (a == null) {
|
|
523
|
+
parts.push(String(a));
|
|
524
|
+
} else {
|
|
525
|
+
try {
|
|
526
|
+
parts.push(JSON.stringify(a));
|
|
527
|
+
} catch {
|
|
528
|
+
parts.push(String(a));
|
|
529
|
+
}
|
|
530
|
+
}
|
|
531
|
+
}
|
|
532
|
+
const joined = parts.join(" ");
|
|
533
|
+
return joined.length > MAX_MESSAGE_CHARS ? joined.slice(0, MAX_MESSAGE_CHARS) + "\u2026" : joined;
|
|
464
534
|
}
|
|
465
535
|
|
|
466
536
|
// src/version.ts
|
|
467
537
|
var SDK_NAME = "@fixprompt/react-native";
|
|
468
|
-
var SDK_VERSION = "0.0.
|
|
538
|
+
var SDK_VERSION = "0.0.3";
|
|
469
539
|
|
|
470
540
|
// src/transport.ts
|
|
471
541
|
var REQUEST_TIMEOUT_MS = 8e3;
|
|
@@ -487,7 +557,8 @@ function sendEvent(config, payload) {
|
|
|
487
557
|
session_id: state.sessionId,
|
|
488
558
|
device_id: state.deviceId,
|
|
489
559
|
user_id: state.user?.id,
|
|
490
|
-
user_email: state.user?.email
|
|
560
|
+
user_email: state.user?.email,
|
|
561
|
+
breadcrumbs: getBreadcrumbs()
|
|
491
562
|
},
|
|
492
563
|
synthetic: payload.synthetic
|
|
493
564
|
};
|
|
@@ -638,6 +709,36 @@ function safeJson(v) {
|
|
|
638
709
|
}
|
|
639
710
|
|
|
640
711
|
// src/console.ts
|
|
712
|
+
function patchConsoleForBreadcrumbs() {
|
|
713
|
+
const originals = {
|
|
714
|
+
log: console.log.bind(console),
|
|
715
|
+
info: console.info.bind(console),
|
|
716
|
+
warn: console.warn.bind(console),
|
|
717
|
+
error: console.error.bind(console)
|
|
718
|
+
};
|
|
719
|
+
console.log = (...args) => {
|
|
720
|
+
pushBreadcrumb("log", args);
|
|
721
|
+
return originals.log(...args);
|
|
722
|
+
};
|
|
723
|
+
console.info = (...args) => {
|
|
724
|
+
pushBreadcrumb("info", args);
|
|
725
|
+
return originals.info(...args);
|
|
726
|
+
};
|
|
727
|
+
console.warn = (...args) => {
|
|
728
|
+
pushBreadcrumb("warn", args);
|
|
729
|
+
return originals.warn(...args);
|
|
730
|
+
};
|
|
731
|
+
console.error = (...args) => {
|
|
732
|
+
pushBreadcrumb("error", args);
|
|
733
|
+
return originals.error(...args);
|
|
734
|
+
};
|
|
735
|
+
return () => {
|
|
736
|
+
console.log = originals.log;
|
|
737
|
+
console.info = originals.info;
|
|
738
|
+
console.warn = originals.warn;
|
|
739
|
+
console.error = originals.error;
|
|
740
|
+
};
|
|
741
|
+
}
|
|
641
742
|
function shouldCapture(args, patterns) {
|
|
642
743
|
if (patterns.length === 0) return true;
|
|
643
744
|
const first = typeof args[0] === "string" ? args[0] : "";
|
|
@@ -740,6 +841,7 @@ function initFixPrompt(opts) {
|
|
|
740
841
|
const config = resolveConfig(opts);
|
|
741
842
|
state.config = config;
|
|
742
843
|
state.sessionId = newSessionId();
|
|
844
|
+
state.cleanup.restoreBreadcrumbConsole = patchConsoleForBreadcrumbs();
|
|
743
845
|
state.cleanup.removeErrorHandler = installGlobalErrorHandler(config);
|
|
744
846
|
state.cleanup.removeRejectionHandler = installRejectionHandler(config);
|
|
745
847
|
if (config.patchConsoleError) {
|
|
@@ -802,16 +904,18 @@ function setUser(user) {
|
|
|
802
904
|
}
|
|
803
905
|
function _resetForTests() {
|
|
804
906
|
const state = getState();
|
|
805
|
-
state.cleanup.removeErrorHandler?.();
|
|
806
|
-
state.cleanup.removeRejectionHandler?.();
|
|
807
907
|
state.cleanup.restoreConsoleError?.();
|
|
808
908
|
state.cleanup.restoreConsoleWarn?.();
|
|
909
|
+
state.cleanup.restoreBreadcrumbConsole?.();
|
|
910
|
+
state.cleanup.removeErrorHandler?.();
|
|
911
|
+
state.cleanup.removeRejectionHandler?.();
|
|
809
912
|
state.initialized = false;
|
|
810
913
|
state.config = null;
|
|
811
914
|
state.sessionId = null;
|
|
812
915
|
state.deviceId = null;
|
|
813
916
|
state.user = null;
|
|
814
917
|
state.cleanup = {};
|
|
918
|
+
clearBreadcrumbs();
|
|
815
919
|
}
|
|
816
920
|
// Annotate the CommonJS export names for ESM import in node:
|
|
817
921
|
0 && (module.exports = {
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../node_modules/promise/setimmediate/core.js","../node_modules/promise/setimmediate/rejection-tracking.js","../src/index.ts","../src/state.ts","../src/session.ts","../src/buffer.ts","../src/device.ts","../src/version.ts","../src/transport.ts","../src/handlers.ts","../src/console.ts","../src/init.ts"],"sourcesContent":["'use strict';\n\n\n\nfunction noop() {}\n\n// States:\n//\n// 0 - pending\n// 1 - fulfilled with _value\n// 2 - rejected with _value\n// 3 - adopted the state of another promise, _value\n//\n// once the state is no longer pending (0) it is immutable\n\n// All `_` prefixed properties will be reduced to `_{random number}`\n// at build time to obfuscate them and discourage their use.\n// We don't use symbols or Object.defineProperty to fully hide them\n// because the performance isn't good enough.\n\n\n// to avoid using try/catch inside critical functions, we\n// extract them to here.\nvar LAST_ERROR = null;\nvar IS_ERROR = {};\nfunction getThen(obj) {\n try {\n return obj.then;\n } catch (ex) {\n LAST_ERROR = ex;\n return IS_ERROR;\n }\n}\n\nfunction tryCallOne(fn, a) {\n try {\n return fn(a);\n } catch (ex) {\n LAST_ERROR = ex;\n return IS_ERROR;\n }\n}\nfunction tryCallTwo(fn, a, b) {\n try {\n fn(a, b);\n } catch (ex) {\n LAST_ERROR = ex;\n return IS_ERROR;\n }\n}\n\nmodule.exports = Promise;\n\nfunction Promise(fn) {\n if (typeof this !== 'object') {\n throw new TypeError('Promises must be constructed via new');\n }\n if (typeof fn !== 'function') {\n throw new TypeError('Promise constructor\\'s argument is not a function');\n }\n this._x = 0;\n this._y = 0;\n this._z = null;\n this._A = null;\n if (fn === noop) return;\n doResolve(fn, this);\n}\nPromise._B = null;\nPromise._C = null;\nPromise._D = noop;\n\nPromise.prototype.then = function(onFulfilled, onRejected) {\n if (this.constructor !== Promise) {\n return safeThen(this, onFulfilled, onRejected);\n }\n var res = new Promise(noop);\n handle(this, new Handler(onFulfilled, onRejected, res));\n return res;\n};\n\nfunction safeThen(self, onFulfilled, onRejected) {\n return new self.constructor(function (resolve, reject) {\n var res = new Promise(noop);\n res.then(resolve, reject);\n handle(self, new Handler(onFulfilled, onRejected, res));\n });\n}\nfunction handle(self, deferred) {\n while (self._y === 3) {\n self = self._z;\n }\n if (Promise._B) {\n Promise._B(self);\n }\n if (self._y === 0) {\n if (self._x === 0) {\n self._x = 1;\n self._A = deferred;\n return;\n }\n if (self._x === 1) {\n self._x = 2;\n self._A = [self._A, deferred];\n return;\n }\n self._A.push(deferred);\n return;\n }\n handleResolved(self, deferred);\n}\n\nfunction handleResolved(self, deferred) {\n setImmediate(function() {\n var cb = self._y === 1 ? deferred.onFulfilled : deferred.onRejected;\n if (cb === null) {\n if (self._y === 1) {\n resolve(deferred.promise, self._z);\n } else {\n reject(deferred.promise, self._z);\n }\n return;\n }\n var ret = tryCallOne(cb, self._z);\n if (ret === IS_ERROR) {\n reject(deferred.promise, LAST_ERROR);\n } else {\n resolve(deferred.promise, ret);\n }\n });\n}\nfunction resolve(self, newValue) {\n // Promise Resolution Procedure: https://github.com/promises-aplus/promises-spec#the-promise-resolution-procedure\n if (newValue === self) {\n return reject(\n self,\n new TypeError('A promise cannot be resolved with itself.')\n );\n }\n if (\n newValue &&\n (typeof newValue === 'object' || typeof newValue === 'function')\n ) {\n var then = getThen(newValue);\n if (then === IS_ERROR) {\n return reject(self, LAST_ERROR);\n }\n if (\n then === self.then &&\n newValue instanceof Promise\n ) {\n self._y = 3;\n self._z = newValue;\n finale(self);\n return;\n } else if (typeof then === 'function') {\n doResolve(then.bind(newValue), self);\n return;\n }\n }\n self._y = 1;\n self._z = newValue;\n finale(self);\n}\n\nfunction reject(self, newValue) {\n self._y = 2;\n self._z = newValue;\n if (Promise._C) {\n Promise._C(self, newValue);\n }\n finale(self);\n}\nfunction finale(self) {\n if (self._x === 1) {\n handle(self, self._A);\n self._A = null;\n }\n if (self._x === 2) {\n for (var i = 0; i < self._A.length; i++) {\n handle(self, self._A[i]);\n }\n self._A = null;\n }\n}\n\nfunction Handler(onFulfilled, onRejected, promise){\n this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null;\n this.onRejected = typeof onRejected === 'function' ? onRejected : null;\n this.promise = promise;\n}\n\n/**\n * Take a potentially misbehaving resolver function and make sure\n * onFulfilled and onRejected are only called once.\n *\n * Makes no guarantees about asynchrony.\n */\nfunction doResolve(fn, promise) {\n var done = false;\n var res = tryCallTwo(fn, function (value) {\n if (done) return;\n done = true;\n resolve(promise, value);\n }, function (reason) {\n if (done) return;\n done = true;\n reject(promise, reason);\n });\n if (!done && res === IS_ERROR) {\n done = true;\n reject(promise, LAST_ERROR);\n }\n}\n","'use strict';\n\nvar Promise = require('./core');\n\nvar DEFAULT_WHITELIST = [\n ReferenceError,\n TypeError,\n RangeError\n];\n\nvar enabled = false;\nexports.disable = disable;\nfunction disable() {\n enabled = false;\n Promise._B = null;\n Promise._C = null;\n}\n\nexports.enable = enable;\nfunction enable(options) {\n options = options || {};\n if (enabled) disable();\n enabled = true;\n var id = 0;\n var displayId = 0;\n var rejections = {};\n Promise._B = function (promise) {\n if (\n promise._y === 2 && // IS REJECTED\n rejections[promise._E]\n ) {\n if (rejections[promise._E].logged) {\n onHandled(promise._E);\n } else {\n clearTimeout(rejections[promise._E].timeout);\n }\n delete rejections[promise._E];\n }\n };\n Promise._C = function (promise, err) {\n if (promise._x === 0) { // not yet handled\n promise._E = id++;\n rejections[promise._E] = {\n displayId: null,\n error: err,\n timeout: setTimeout(\n onUnhandled.bind(null, promise._E),\n // For reference errors and type errors, this almost always\n // means the programmer made a mistake, so log them after just\n // 100ms\n // otherwise, wait 2 seconds to see if they get handled\n matchWhitelist(err, DEFAULT_WHITELIST)\n ? 100\n : 2000\n ),\n logged: false\n };\n }\n };\n function onUnhandled(id) {\n if (\n options.allRejections ||\n matchWhitelist(\n rejections[id].error,\n options.whitelist || DEFAULT_WHITELIST\n )\n ) {\n rejections[id].displayId = displayId++;\n if (options.onUnhandled) {\n rejections[id].logged = true;\n options.onUnhandled(\n rejections[id].displayId,\n rejections[id].error\n );\n } else {\n rejections[id].logged = true;\n logError(\n rejections[id].displayId,\n rejections[id].error\n );\n }\n }\n }\n function onHandled(id) {\n if (rejections[id].logged) {\n if (options.onHandled) {\n options.onHandled(rejections[id].displayId, rejections[id].error);\n } else if (!rejections[id].onUnhandled) {\n console.warn(\n 'Promise Rejection Handled (id: ' + rejections[id].displayId + '):'\n );\n console.warn(\n ' This means you can ignore any previous messages of the form \"Possible Unhandled Promise Rejection\" with id ' +\n rejections[id].displayId + '.'\n );\n }\n }\n }\n}\n\nfunction logError(id, error) {\n console.warn('Possible Unhandled Promise Rejection (id: ' + id + '):');\n var errStr = (error && (error.stack || error)) + '';\n errStr.split('\\n').forEach(function (line) {\n console.warn(' ' + line);\n });\n}\n\nfunction matchWhitelist(error, list) {\n return list.some(function (cls) {\n return error instanceof cls;\n });\n}","export { initFixPrompt, captureException, setUser, _resetForTests } from './init';\nexport type {\n InitOptions,\n ResolvedConfig,\n EventPayload,\n Severity,\n LogLevel,\n} from './types';\nexport { SDK_NAME, SDK_VERSION } from './version';\n","import type { ResolvedConfig } from './types';\n\nexport interface UserContext {\n id?: string;\n email?: string;\n [k: string]: any;\n}\n\ninterface CleanupHooks {\n removeErrorHandler?: () => void;\n removeRejectionHandler?: () => void;\n restoreConsoleError?: () => void;\n restoreConsoleWarn?: () => void;\n}\n\ninterface SdkState {\n initialized: boolean;\n config: ResolvedConfig | null;\n sessionId: string | null;\n deviceId: string | null;\n user: UserContext | null;\n cleanup: CleanupHooks;\n}\n\nconst STATE_KEY = '__fixprompt_rn_state__';\n\nfunction globalScope(): any {\n if (typeof globalThis !== 'undefined') return globalThis;\n return {};\n}\n\nexport function getState(): SdkState {\n const g = globalScope();\n if (!g[STATE_KEY]) {\n g[STATE_KEY] = {\n initialized: false,\n config: null,\n sessionId: null,\n deviceId: null,\n user: null,\n cleanup: {},\n } satisfies SdkState;\n }\n return g[STATE_KEY] as SdkState;\n}\n\nexport function resetStateForTests(): void {\n const g = globalScope();\n delete g[STATE_KEY];\n}\n","import AsyncStorage from '@react-native-async-storage/async-storage';\n\nconst DEVICE_KEY = '@fixprompt/device_id';\n\nfunction uuid(): string {\n if (typeof globalThis.crypto?.randomUUID === 'function') {\n return globalThis.crypto.randomUUID();\n }\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n\n/**\n * One uuid per cold start. Lives in memory; resets when the app restarts.\n */\nexport function newSessionId(): string {\n return uuid();\n}\n\n/**\n * Stable per-device uuid. Tries expo-secure-store first (keychain-backed),\n * falls back to AsyncStorage. Generated lazily on first call.\n *\n * We deliberately don't use OS-provided device IDs (IDFV/Android ID) —\n * Apple flags them on review and they reset on reinstall anyway.\n */\nexport async function getDeviceId(): Promise<string> {\n // Optional expo-secure-store path\n try {\n // dynamic import so we don't crash when SecureStore isn't installed\n const SecureStore = await tryImport<any>('expo-secure-store');\n if (SecureStore) {\n const existing = await SecureStore.getItemAsync('fixprompt_device_id');\n if (existing) return existing;\n const fresh = uuid();\n await SecureStore.setItemAsync('fixprompt_device_id', fresh);\n return fresh;\n }\n } catch {\n // ignore — fall through to AsyncStorage\n }\n\n try {\n const existing = await AsyncStorage.getItem(DEVICE_KEY);\n if (existing) return existing;\n const fresh = uuid();\n await AsyncStorage.setItem(DEVICE_KEY, fresh);\n return fresh;\n } catch {\n // Final fallback — in-memory only (lost on reinstall)\n return uuid();\n }\n}\n\nasync function tryImport<T>(spec: string): Promise<T | null> {\n try {\n // require keeps Metro bundler quiet when the package isn't installed\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n return require(spec) as T;\n } catch {\n return null;\n }\n}\n","import AsyncStorage from '@react-native-async-storage/async-storage';\nimport type { EventPayload } from './types';\n\nconst STORAGE_KEY = '@fixprompt/buffer';\nconst MAX_BUFFER = 200;\nconst MAX_AGE_MS = 7 * 24 * 60 * 60 * 1000;\n\ninterface BufferedEvent {\n ts: number;\n payload: EventPayload;\n}\n\n/**\n * In-memory ring buffer with AsyncStorage persistence.\n *\n * Events accumulate when the broker is unreachable (network error / 5xx /\n * timeout). On the next successful send, the whole buffer drains in order.\n * On cold start, any persisted buffer from a prior crash is replayed.\n */\nclass OfflineBuffer {\n private items: BufferedEvent[] = [];\n private loaded = false;\n private persistTimer: ReturnType<typeof setTimeout> | null = null;\n\n /** Load the persisted buffer once, on first use. */\n async load(): Promise<void> {\n if (this.loaded) return;\n this.loaded = true;\n try {\n const raw = await AsyncStorage.getItem(STORAGE_KEY);\n if (!raw) return;\n const parsed = JSON.parse(raw) as BufferedEvent[];\n const cutoff = Date.now() - MAX_AGE_MS;\n this.items = parsed.filter((e) => e?.ts > cutoff).slice(-MAX_BUFFER);\n } catch {\n this.items = [];\n }\n }\n\n push(payload: EventPayload): void {\n this.items.push({ ts: Date.now(), payload });\n if (this.items.length > MAX_BUFFER) this.items.shift();\n this.schedulePersist();\n }\n\n async drain(): Promise<EventPayload[]> {\n if (!this.loaded) await this.load();\n const out = this.items.map((e) => e.payload);\n this.items = [];\n this.schedulePersist();\n return out;\n }\n\n size(): number {\n return this.items.length;\n }\n\n private schedulePersist() {\n if (this.persistTimer) return;\n this.persistTimer = setTimeout(async () => {\n this.persistTimer = null;\n try {\n await AsyncStorage.setItem(STORAGE_KEY, JSON.stringify(this.items));\n } catch {\n // swallow — buffer survives in memory at least\n }\n }, 500);\n }\n\n /** Tests only. */\n _resetForTests(): void {\n this.items = [];\n this.loaded = false;\n if (this.persistTimer) {\n clearTimeout(this.persistTimer);\n this.persistTimer = null;\n }\n }\n}\n\nexport const offlineBuffer = new OfflineBuffer();\n","import { Platform } from 'react-native';\n\nexport interface DeviceAttrs {\n platform: string; // 'ios' | 'android' | 'web' | 'windows' | 'macos'\n os_version: string;\n /** RN runtime version (Hermes / JSC). Used for triage. */\n rn_version?: string;\n}\n\nexport function getDeviceAttrs(): DeviceAttrs {\n return {\n platform: String(Platform.OS),\n os_version: String((Platform as any).Version ?? 'unknown'),\n rn_version: (Platform as any).constants?.reactNativeVersion\n ? Object.values((Platform as any).constants.reactNativeVersion).join('.')\n : undefined,\n };\n}\n","export const SDK_NAME = '@fixprompt/react-native';\nexport const SDK_VERSION = '0.0.1';\n","import type { EventPayload, ResolvedConfig } from './types';\nimport { offlineBuffer } from './buffer';\nimport { getState } from './state';\nimport { getDeviceAttrs } from './device';\nimport { SDK_NAME, SDK_VERSION } from './version';\n\nconst REQUEST_TIMEOUT_MS = 8_000;\n\n/**\n * Sends one event. On network failure (timeout / 5xx / no-network) the event\n * gets buffered; the buffer drains on the next successful send.\n *\n * Never throws — RN apps don't want their event loop killed by a logger.\n */\nexport function sendEvent(\n config: ResolvedConfig,\n payload: Omit<EventPayload, 'service' | 'app' | 'env' | 'attrs'> & {\n attrs?: Record<string, any>;\n service?: string;\n app?: string;\n env?: string;\n },\n): void {\n const state = getState();\n\n const event: EventPayload = {\n service: payload.service ?? config.service,\n app: payload.app ?? config.app,\n env: payload.env ?? config.env,\n level: payload.level,\n message: payload.message,\n stack: payload.stack,\n attrs: {\n ...(payload.attrs ?? {}),\n ...getDeviceAttrs(),\n sdk: SDK_NAME,\n sdk_version: SDK_VERSION,\n release: config.release,\n session_id: state.sessionId,\n device_id: state.deviceId,\n user_id: state.user?.id,\n user_email: state.user?.email,\n },\n synthetic: payload.synthetic,\n };\n\n // Strip undefined attrs (broker accepts strings/numbers, not nulls/undef)\n for (const k of Object.keys(event.attrs)) {\n if (event.attrs[k] === undefined || event.attrs[k] === null) {\n delete event.attrs[k];\n }\n }\n\n void postOrBuffer(config, event);\n}\n\nasync function postOrBuffer(\n config: ResolvedConfig,\n event: EventPayload,\n): Promise<void> {\n // Always drain the buffer first so order is preserved.\n if (!(await tryPost(config, event, /* throwOnFail */ true))) {\n offlineBuffer.push(event);\n return;\n }\n\n // Successfully delivered this one — try to drain any backlog too.\n if (offlineBuffer.size() === 0) return;\n const queued = await offlineBuffer.drain();\n for (const buffered of queued) {\n if (!(await tryPost(config, buffered, true))) {\n // Re-buffer the rest including this one\n offlineBuffer.push(buffered);\n for (let i = queued.indexOf(buffered) + 1; i < queued.length; i++) {\n offlineBuffer.push(queued[i]);\n }\n return;\n }\n }\n}\n\nasync function tryPost(\n config: ResolvedConfig,\n event: EventPayload,\n throwOnFail: boolean,\n): Promise<boolean> {\n try {\n const ctrl = new AbortController();\n const timer = setTimeout(() => ctrl.abort(), REQUEST_TIMEOUT_MS);\n try {\n const res = await fetch(`${config.endpoint.replace(/\\/$/, '')}/ingest/log`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-loghub-source': config.source,\n 'x-loghub-key': config.projectKey,\n },\n body: JSON.stringify(event),\n signal: ctrl.signal,\n });\n // 4xx → bug on our side; drop, don't buffer\n if (res.status >= 400 && res.status < 500) {\n if (config.debug) {\n // eslint-disable-next-line no-console\n console.warn(`[fixprompt] ${res.status} from broker — dropping event`);\n }\n return true; // \"delivered\" in the sense that we won't re-try\n }\n return res.ok;\n } finally {\n clearTimeout(timer);\n }\n } catch (err) {\n if (config.debug) {\n // eslint-disable-next-line no-console\n console.warn(`[fixprompt] transport error: ${(err as Error).message}`);\n }\n return false;\n }\n}\n","import { sendEvent } from './transport';\nimport type { ResolvedConfig } from './types';\n\n/**\n * Returns the project's user-code stack frame (skips node_modules and the\n * SDK itself). Falls back to the raw stack.\n */\nfunction topStackFrame(stack: string | undefined): string {\n if (!stack) return '';\n for (const raw of stack.split('\\n')) {\n const line = raw.trim();\n if (!line) continue;\n if (line.startsWith('Error')) continue;\n if (/node_modules|@fixprompt/.test(line)) continue;\n return line.slice(0, 200);\n }\n return stack.split('\\n')[0]?.slice(0, 200) ?? '';\n}\n\nexport function installGlobalErrorHandler(config: ResolvedConfig): () => void {\n // ErrorUtils is a React Native global; not present in plain Node tests.\n const ErrorUtils: any = (globalThis as any).ErrorUtils;\n if (!ErrorUtils?.setGlobalHandler) {\n return () => undefined;\n }\n\n const previous = ErrorUtils.getGlobalHandler?.();\n\n const handler = (error: Error, isFatal?: boolean) => {\n try {\n sendEvent(config, {\n level: isFatal ? 'error' : 'warn',\n message: error?.message ?? 'Uncaught error',\n stack: typeof error?.stack === 'string' ? error.stack : undefined,\n attrs: {\n kind: 'rn.globalError',\n severity: isFatal ? 'critical' : 'error',\n error_name: error?.name,\n top_frame: topStackFrame(error?.stack),\n fatal: !!isFatal,\n },\n });\n } catch {\n // never let logger crash propagate\n }\n previous?.(error, isFatal);\n };\n\n ErrorUtils.setGlobalHandler(handler);\n\n return () => {\n if (previous) ErrorUtils.setGlobalHandler(previous);\n };\n}\n\n/**\n * Hook unhandled-promise-rejection tracking. Uses the bundled\n * `promise/setimmediate/rejection-tracking` module that ships with RN.\n */\nexport function installRejectionHandler(config: ResolvedConfig): () => void {\n let tracking: any;\n try {\n // RN's bundled polyfill — present on every RN runtime.\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n tracking = require('promise/setimmediate/rejection-tracking');\n } catch {\n return () => undefined;\n }\n\n tracking.enable({\n allRejections: true,\n onUnhandled: (id: string, error: unknown) => {\n try {\n const isErr = error instanceof Error;\n sendEvent(config, {\n level: 'error',\n message: isErr ? error.message : safeJson(error),\n stack: isErr && typeof error.stack === 'string' ? error.stack : undefined,\n attrs: {\n kind: 'rn.unhandledrejection',\n severity: 'error',\n error_name: isErr ? error.name : typeof error,\n top_frame: isErr ? topStackFrame(error.stack) : '',\n },\n });\n } catch {\n // ignore\n }\n },\n onHandled: () => undefined,\n });\n\n return () => {\n try {\n tracking.disable();\n } catch {\n // ignore\n }\n };\n}\n\nfunction safeJson(v: unknown): string {\n try {\n return JSON.stringify(v);\n } catch {\n return String(v);\n }\n}\n","import { sendEvent } from './transport';\nimport type { ResolvedConfig } from './types';\n\nfunction shouldCapture(args: any[], patterns: RegExp[]): boolean {\n if (patterns.length === 0) return true; // empty list = capture everything\n const first = typeof args[0] === 'string' ? args[0] : '';\n return patterns.some((re) => re.test(first));\n}\n\nfunction stringify(args: any[]): { message: string; stack?: string } {\n const errArg = args.find((a) => a instanceof Error) as Error | undefined;\n const message = args\n .map((a) => {\n if (a instanceof Error) return a.message;\n if (typeof a === 'string') return a;\n try {\n return JSON.stringify(a);\n } catch {\n return String(a);\n }\n })\n .join(' ')\n .slice(0, 4000);\n return {\n message,\n stack: errArg && typeof errArg.stack === 'string' ? errArg.stack : undefined,\n };\n}\n\n/**\n * Wrap console.error so tagged calls forward to the broker as warning-severity\n * events. The original console.error still runs (so RedBox / Metro logs still\n * show up).\n *\n * Pattern is intentional — ProofPix's existing log lines look like\n * `console.error('[Analytics] tracking failure', err)`. Devs prefix their\n * intentional captures and the broker only sees tagged ones.\n */\nexport function patchConsoleError(config: ResolvedConfig): () => void {\n const original = console.error.bind(console);\n console.error = (...args: any[]) => {\n try {\n if (shouldCapture(args, config.captureTags)) {\n const { message, stack } = stringify(args);\n sendEvent(config, {\n level: 'warn',\n message,\n stack,\n attrs: {\n kind: 'console.error',\n severity: 'warning',\n },\n });\n }\n } catch {\n // never block user logs\n }\n return original(...args);\n };\n return () => {\n console.error = original;\n };\n}\n\nexport function patchConsoleWarn(config: ResolvedConfig): () => void {\n const original = console.warn.bind(console);\n console.warn = (...args: any[]) => {\n try {\n if (shouldCapture(args, config.captureTags)) {\n const { message, stack } = stringify(args);\n sendEvent(config, {\n level: 'warn',\n message,\n stack,\n attrs: {\n kind: 'console.warn',\n severity: 'warning',\n },\n });\n }\n } catch {\n // never block\n }\n return original(...args);\n };\n return () => {\n console.warn = original;\n };\n}\n","import { getState, type UserContext } from './state';\nimport { newSessionId, getDeviceId } from './session';\nimport { installGlobalErrorHandler, installRejectionHandler } from './handlers';\nimport { patchConsoleError, patchConsoleWarn } from './console';\nimport { sendEvent } from './transport';\nimport { offlineBuffer } from './buffer';\nimport type { InitOptions, ResolvedConfig } from './types';\n\nconst DEFAULT_ENDPOINT = 'https://geosloghub-production.up.railway.app';\n\nfunction resolveConfig(opts: InitOptions): ResolvedConfig {\n if (!opts?.projectKey) throw new Error('initFixPrompt: projectKey is required');\n if (!opts?.source) throw new Error('initFixPrompt: source is required');\n if (!opts?.service) throw new Error('initFixPrompt: service is required');\n if (!opts?.app) throw new Error('initFixPrompt: app is required');\n\n return {\n projectKey: opts.projectKey,\n source: opts.source,\n endpoint: (opts.endpoint ?? DEFAULT_ENDPOINT).replace(/\\/$/, ''),\n service: opts.service,\n app: opts.app,\n env: opts.env ?? 'prod',\n release: opts.release ?? null,\n captureTags: opts.captureTags ?? [],\n patchConsoleWarn: opts.patchConsoleWarn ?? false,\n patchConsoleError: opts.patchConsoleError ?? true,\n debug: opts.debug ?? false,\n };\n}\n\nexport function initFixPrompt(opts: InitOptions): void {\n const state = getState();\n if (state.initialized) {\n if (opts?.debug) {\n // eslint-disable-next-line no-console\n console.warn('[fixprompt] already initialized — call ignored');\n }\n return;\n }\n\n const config = resolveConfig(opts);\n state.config = config;\n state.sessionId = newSessionId();\n\n state.cleanup.removeErrorHandler = installGlobalErrorHandler(config);\n state.cleanup.removeRejectionHandler = installRejectionHandler(config);\n if (config.patchConsoleError) {\n state.cleanup.restoreConsoleError = patchConsoleError(config);\n }\n if (config.patchConsoleWarn) {\n state.cleanup.restoreConsoleWarn = patchConsoleWarn(config);\n }\n\n state.initialized = true;\n\n // Resolve device id + drain any pre-init buffer, async.\n void (async () => {\n try {\n state.deviceId = await getDeviceId();\n await offlineBuffer.load();\n if (offlineBuffer.size() > 0) {\n // Triggers a drain via the transport's natural retry path.\n const items = await offlineBuffer.drain();\n for (const ev of items) {\n // Re-buffer if delivery still fails — transport handles it\n offlineBuffer.push(ev);\n }\n // Kick a drain attempt\n sendEvent(config, {\n level: 'debug',\n message: '[fixprompt] resumed from offline buffer',\n attrs: { kind: 'sdk.startup', buffered: items.length },\n });\n }\n } catch (err) {\n if (config.debug) {\n // eslint-disable-next-line no-console\n console.warn(`[fixprompt] init async setup failed: ${(err as Error).message}`);\n }\n }\n })();\n\n if (config.debug) {\n // eslint-disable-next-line no-console\n console.log('[fixprompt] initialized', {\n endpoint: config.endpoint,\n service: config.service,\n env: config.env,\n session_id: state.sessionId,\n });\n }\n}\n\nexport function captureException(\n err: unknown,\n options: { synthetic?: boolean; attrs?: Record<string, any> } = {},\n): void {\n const state = getState();\n if (!state.initialized || !state.config) return;\n const isErr = err instanceof Error;\n sendEvent(state.config, {\n level: 'error',\n message: isErr ? err.message : String(err),\n stack: isErr && typeof err.stack === 'string' ? err.stack : undefined,\n attrs: {\n kind: 'captureException',\n severity: 'error',\n error_name: isErr ? err.name : typeof err,\n ...(options.attrs ?? {}),\n },\n synthetic: options.synthetic === true,\n });\n}\n\nexport function setUser(user: UserContext | null): void {\n const state = getState();\n state.user = user;\n}\n\n/** Tests + HMR only. Not part of the supported API. @internal */\nexport function _resetForTests(): void {\n const state = getState();\n state.cleanup.removeErrorHandler?.();\n state.cleanup.removeRejectionHandler?.();\n state.cleanup.restoreConsoleError?.();\n state.cleanup.restoreConsoleWarn?.();\n state.initialized = false;\n state.config = null;\n state.sessionId = null;\n state.deviceId = null;\n state.user = null;\n state.cleanup = {};\n}\n"],"mappings":"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","names":["exports","module","Promise","resolve","reject","exports","Promise","id","AsyncStorage","import_async_storage","AsyncStorage"]}
|
|
1
|
+
{"version":3,"sources":["../node_modules/promise/setimmediate/core.js","../node_modules/promise/setimmediate/rejection-tracking.js","../src/index.ts","../src/state.ts","../src/session.ts","../src/buffer.ts","../src/device.ts","../src/breadcrumbs.ts","../src/version.ts","../src/transport.ts","../src/handlers.ts","../src/console.ts","../src/init.ts"],"sourcesContent":["'use strict';\n\n\n\nfunction noop() {}\n\n// States:\n//\n// 0 - pending\n// 1 - fulfilled with _value\n// 2 - rejected with _value\n// 3 - adopted the state of another promise, _value\n//\n// once the state is no longer pending (0) it is immutable\n\n// All `_` prefixed properties will be reduced to `_{random number}`\n// at build time to obfuscate them and discourage their use.\n// We don't use symbols or Object.defineProperty to fully hide them\n// because the performance isn't good enough.\n\n\n// to avoid using try/catch inside critical functions, we\n// extract them to here.\nvar LAST_ERROR = null;\nvar IS_ERROR = {};\nfunction getThen(obj) {\n try {\n return obj.then;\n } catch (ex) {\n LAST_ERROR = ex;\n return IS_ERROR;\n }\n}\n\nfunction tryCallOne(fn, a) {\n try {\n return fn(a);\n } catch (ex) {\n LAST_ERROR = ex;\n return IS_ERROR;\n }\n}\nfunction tryCallTwo(fn, a, b) {\n try {\n fn(a, b);\n } catch (ex) {\n LAST_ERROR = ex;\n return IS_ERROR;\n }\n}\n\nmodule.exports = Promise;\n\nfunction Promise(fn) {\n if (typeof this !== 'object') {\n throw new TypeError('Promises must be constructed via new');\n }\n if (typeof fn !== 'function') {\n throw new TypeError('Promise constructor\\'s argument is not a function');\n }\n this._x = 0;\n this._y = 0;\n this._z = null;\n this._A = null;\n if (fn === noop) return;\n doResolve(fn, this);\n}\nPromise._B = null;\nPromise._C = null;\nPromise._D = noop;\n\nPromise.prototype.then = function(onFulfilled, onRejected) {\n if (this.constructor !== Promise) {\n return safeThen(this, onFulfilled, onRejected);\n }\n var res = new Promise(noop);\n handle(this, new Handler(onFulfilled, onRejected, res));\n return res;\n};\n\nfunction safeThen(self, onFulfilled, onRejected) {\n return new self.constructor(function (resolve, reject) {\n var res = new Promise(noop);\n res.then(resolve, reject);\n handle(self, new Handler(onFulfilled, onRejected, res));\n });\n}\nfunction handle(self, deferred) {\n while (self._y === 3) {\n self = self._z;\n }\n if (Promise._B) {\n Promise._B(self);\n }\n if (self._y === 0) {\n if (self._x === 0) {\n self._x = 1;\n self._A = deferred;\n return;\n }\n if (self._x === 1) {\n self._x = 2;\n self._A = [self._A, deferred];\n return;\n }\n self._A.push(deferred);\n return;\n }\n handleResolved(self, deferred);\n}\n\nfunction handleResolved(self, deferred) {\n setImmediate(function() {\n var cb = self._y === 1 ? deferred.onFulfilled : deferred.onRejected;\n if (cb === null) {\n if (self._y === 1) {\n resolve(deferred.promise, self._z);\n } else {\n reject(deferred.promise, self._z);\n }\n return;\n }\n var ret = tryCallOne(cb, self._z);\n if (ret === IS_ERROR) {\n reject(deferred.promise, LAST_ERROR);\n } else {\n resolve(deferred.promise, ret);\n }\n });\n}\nfunction resolve(self, newValue) {\n // Promise Resolution Procedure: https://github.com/promises-aplus/promises-spec#the-promise-resolution-procedure\n if (newValue === self) {\n return reject(\n self,\n new TypeError('A promise cannot be resolved with itself.')\n );\n }\n if (\n newValue &&\n (typeof newValue === 'object' || typeof newValue === 'function')\n ) {\n var then = getThen(newValue);\n if (then === IS_ERROR) {\n return reject(self, LAST_ERROR);\n }\n if (\n then === self.then &&\n newValue instanceof Promise\n ) {\n self._y = 3;\n self._z = newValue;\n finale(self);\n return;\n } else if (typeof then === 'function') {\n doResolve(then.bind(newValue), self);\n return;\n }\n }\n self._y = 1;\n self._z = newValue;\n finale(self);\n}\n\nfunction reject(self, newValue) {\n self._y = 2;\n self._z = newValue;\n if (Promise._C) {\n Promise._C(self, newValue);\n }\n finale(self);\n}\nfunction finale(self) {\n if (self._x === 1) {\n handle(self, self._A);\n self._A = null;\n }\n if (self._x === 2) {\n for (var i = 0; i < self._A.length; i++) {\n handle(self, self._A[i]);\n }\n self._A = null;\n }\n}\n\nfunction Handler(onFulfilled, onRejected, promise){\n this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null;\n this.onRejected = typeof onRejected === 'function' ? onRejected : null;\n this.promise = promise;\n}\n\n/**\n * Take a potentially misbehaving resolver function and make sure\n * onFulfilled and onRejected are only called once.\n *\n * Makes no guarantees about asynchrony.\n */\nfunction doResolve(fn, promise) {\n var done = false;\n var res = tryCallTwo(fn, function (value) {\n if (done) return;\n done = true;\n resolve(promise, value);\n }, function (reason) {\n if (done) return;\n done = true;\n reject(promise, reason);\n });\n if (!done && res === IS_ERROR) {\n done = true;\n reject(promise, LAST_ERROR);\n }\n}\n","'use strict';\n\nvar Promise = require('./core');\n\nvar DEFAULT_WHITELIST = [\n ReferenceError,\n TypeError,\n RangeError\n];\n\nvar enabled = false;\nexports.disable = disable;\nfunction disable() {\n enabled = false;\n Promise._B = null;\n Promise._C = null;\n}\n\nexports.enable = enable;\nfunction enable(options) {\n options = options || {};\n if (enabled) disable();\n enabled = true;\n var id = 0;\n var displayId = 0;\n var rejections = {};\n Promise._B = function (promise) {\n if (\n promise._y === 2 && // IS REJECTED\n rejections[promise._E]\n ) {\n if (rejections[promise._E].logged) {\n onHandled(promise._E);\n } else {\n clearTimeout(rejections[promise._E].timeout);\n }\n delete rejections[promise._E];\n }\n };\n Promise._C = function (promise, err) {\n if (promise._x === 0) { // not yet handled\n promise._E = id++;\n rejections[promise._E] = {\n displayId: null,\n error: err,\n timeout: setTimeout(\n onUnhandled.bind(null, promise._E),\n // For reference errors and type errors, this almost always\n // means the programmer made a mistake, so log them after just\n // 100ms\n // otherwise, wait 2 seconds to see if they get handled\n matchWhitelist(err, DEFAULT_WHITELIST)\n ? 100\n : 2000\n ),\n logged: false\n };\n }\n };\n function onUnhandled(id) {\n if (\n options.allRejections ||\n matchWhitelist(\n rejections[id].error,\n options.whitelist || DEFAULT_WHITELIST\n )\n ) {\n rejections[id].displayId = displayId++;\n if (options.onUnhandled) {\n rejections[id].logged = true;\n options.onUnhandled(\n rejections[id].displayId,\n rejections[id].error\n );\n } else {\n rejections[id].logged = true;\n logError(\n rejections[id].displayId,\n rejections[id].error\n );\n }\n }\n }\n function onHandled(id) {\n if (rejections[id].logged) {\n if (options.onHandled) {\n options.onHandled(rejections[id].displayId, rejections[id].error);\n } else if (!rejections[id].onUnhandled) {\n console.warn(\n 'Promise Rejection Handled (id: ' + rejections[id].displayId + '):'\n );\n console.warn(\n ' This means you can ignore any previous messages of the form \"Possible Unhandled Promise Rejection\" with id ' +\n rejections[id].displayId + '.'\n );\n }\n }\n }\n}\n\nfunction logError(id, error) {\n console.warn('Possible Unhandled Promise Rejection (id: ' + id + '):');\n var errStr = (error && (error.stack || error)) + '';\n errStr.split('\\n').forEach(function (line) {\n console.warn(' ' + line);\n });\n}\n\nfunction matchWhitelist(error, list) {\n return list.some(function (cls) {\n return error instanceof cls;\n });\n}","export { initFixPrompt, captureException, setUser, _resetForTests } from './init';\nexport type {\n InitOptions,\n ResolvedConfig,\n EventPayload,\n Severity,\n LogLevel,\n} from './types';\nexport { SDK_NAME, SDK_VERSION } from './version';\n","import type { ResolvedConfig } from './types';\n\nexport interface UserContext {\n id?: string;\n email?: string;\n [k: string]: any;\n}\n\ninterface CleanupHooks {\n removeErrorHandler?: () => void;\n removeRejectionHandler?: () => void;\n restoreConsoleError?: () => void;\n restoreConsoleWarn?: () => void;\n restoreBreadcrumbConsole?: () => void;\n}\n\ninterface SdkState {\n initialized: boolean;\n config: ResolvedConfig | null;\n sessionId: string | null;\n deviceId: string | null;\n user: UserContext | null;\n cleanup: CleanupHooks;\n}\n\nconst STATE_KEY = '__fixprompt_rn_state__';\n\nfunction globalScope(): any {\n if (typeof globalThis !== 'undefined') return globalThis;\n return {};\n}\n\nexport function getState(): SdkState {\n const g = globalScope();\n if (!g[STATE_KEY]) {\n g[STATE_KEY] = {\n initialized: false,\n config: null,\n sessionId: null,\n deviceId: null,\n user: null,\n cleanup: {},\n } satisfies SdkState;\n }\n return g[STATE_KEY] as SdkState;\n}\n\nexport function resetStateForTests(): void {\n const g = globalScope();\n delete g[STATE_KEY];\n}\n","import AsyncStorage from '@react-native-async-storage/async-storage';\n\nconst DEVICE_KEY = '@fixprompt/device_id';\n\nfunction uuid(): string {\n if (typeof globalThis.crypto?.randomUUID === 'function') {\n return globalThis.crypto.randomUUID();\n }\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n\n/**\n * One uuid per cold start. Lives in memory; resets when the app restarts.\n */\nexport function newSessionId(): string {\n return uuid();\n}\n\n/**\n * Stable per-device uuid. Tries expo-secure-store first (keychain-backed),\n * falls back to AsyncStorage. Generated lazily on first call.\n *\n * We deliberately don't use OS-provided device IDs (IDFV/Android ID) —\n * Apple flags them on review and they reset on reinstall anyway.\n */\nexport async function getDeviceId(): Promise<string> {\n // Optional expo-secure-store path\n try {\n // dynamic import so we don't crash when SecureStore isn't installed\n const SecureStore = await tryImport<any>('expo-secure-store');\n if (SecureStore) {\n const existing = await SecureStore.getItemAsync('fixprompt_device_id');\n if (existing) return existing;\n const fresh = uuid();\n await SecureStore.setItemAsync('fixprompt_device_id', fresh);\n return fresh;\n }\n } catch {\n // ignore — fall through to AsyncStorage\n }\n\n try {\n const existing = await AsyncStorage.getItem(DEVICE_KEY);\n if (existing) return existing;\n const fresh = uuid();\n await AsyncStorage.setItem(DEVICE_KEY, fresh);\n return fresh;\n } catch {\n // Final fallback — in-memory only (lost on reinstall)\n return uuid();\n }\n}\n\nasync function tryImport<T>(spec: string): Promise<T | null> {\n try {\n // require keeps Metro bundler quiet when the package isn't installed\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n return require(spec) as T;\n } catch {\n return null;\n }\n}\n","import AsyncStorage from '@react-native-async-storage/async-storage';\nimport type { EventPayload } from './types';\n\nconst STORAGE_KEY = '@fixprompt/buffer';\nconst MAX_BUFFER = 200;\nconst MAX_AGE_MS = 7 * 24 * 60 * 60 * 1000;\n\ninterface BufferedEvent {\n ts: number;\n payload: EventPayload;\n}\n\n/**\n * In-memory ring buffer with AsyncStorage persistence.\n *\n * Events accumulate when the broker is unreachable (network error / 5xx /\n * timeout). On the next successful send, the whole buffer drains in order.\n * On cold start, any persisted buffer from a prior crash is replayed.\n */\nclass OfflineBuffer {\n private items: BufferedEvent[] = [];\n private loaded = false;\n private persistTimer: ReturnType<typeof setTimeout> | null = null;\n\n /** Load the persisted buffer once, on first use. */\n async load(): Promise<void> {\n if (this.loaded) return;\n this.loaded = true;\n try {\n const raw = await AsyncStorage.getItem(STORAGE_KEY);\n if (!raw) return;\n const parsed = JSON.parse(raw) as BufferedEvent[];\n const cutoff = Date.now() - MAX_AGE_MS;\n this.items = parsed.filter((e) => e?.ts > cutoff).slice(-MAX_BUFFER);\n } catch {\n this.items = [];\n }\n }\n\n push(payload: EventPayload): void {\n this.items.push({ ts: Date.now(), payload });\n if (this.items.length > MAX_BUFFER) this.items.shift();\n this.schedulePersist();\n }\n\n async drain(): Promise<EventPayload[]> {\n if (!this.loaded) await this.load();\n const out = this.items.map((e) => e.payload);\n this.items = [];\n this.schedulePersist();\n return out;\n }\n\n size(): number {\n return this.items.length;\n }\n\n private schedulePersist() {\n if (this.persistTimer) return;\n this.persistTimer = setTimeout(async () => {\n this.persistTimer = null;\n try {\n await AsyncStorage.setItem(STORAGE_KEY, JSON.stringify(this.items));\n } catch {\n // swallow — buffer survives in memory at least\n }\n }, 500);\n }\n\n /** Tests only. */\n _resetForTests(): void {\n this.items = [];\n this.loaded = false;\n if (this.persistTimer) {\n clearTimeout(this.persistTimer);\n this.persistTimer = null;\n }\n }\n}\n\nexport const offlineBuffer = new OfflineBuffer();\n","import { Platform } from 'react-native';\n\nexport interface DeviceAttrs {\n platform: string; // 'ios' | 'android' | 'web' | 'windows' | 'macos'\n os_version: string;\n /** RN runtime version (Hermes / JSC). Used for triage. */\n rn_version?: string;\n\n /** App version (e.g. \"1.2.3\") from expo-constants or native build. */\n app_version?: string;\n /** Build number (CFBundleVersion / versionCode) from expo-constants. */\n build_number?: string;\n\n /** OTA bundle id (Updates.updateId) from expo-updates, if active. */\n ota_id?: string;\n /** OTA runtime version (Updates.runtimeVersion) from expo-updates. */\n runtime_version?: string;\n /** OTA channel (Updates.channel) — e.g. \"production\", \"preview\". */\n ota_channel?: string;\n}\n\nfunction tryRequire<T = any>(spec: string): T | null {\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n return require(spec) as T;\n } catch {\n return null;\n }\n}\n\n// Cache at module load. Both packages are optional peer deps — bare RN\n// (or sideloaded Expo) projects without them get the basic platform attrs.\nconst ConstantsMod: any = tryRequire('expo-constants');\nconst Constants: any = ConstantsMod?.default ?? ConstantsMod ?? null;\nconst Updates: any = tryRequire('expo-updates');\n\nexport function getDeviceAttrs(): DeviceAttrs {\n const attrs: DeviceAttrs = {\n platform: String(Platform.OS),\n os_version: String((Platform as any).Version ?? 'unknown'),\n rn_version: (Platform as any).constants?.reactNativeVersion\n ? Object.values((Platform as any).constants.reactNativeVersion).join('.')\n : undefined,\n };\n\n // expo-constants: app version + native build number\n if (Constants) {\n const cfg = Constants.expoConfig ?? Constants.manifest ?? null;\n if (cfg?.version) attrs.app_version = String(cfg.version);\n if (cfg?.ios?.buildNumber) {\n attrs.build_number = String(cfg.ios.buildNumber);\n } else if (cfg?.android?.versionCode != null) {\n attrs.build_number = String(cfg.android.versionCode);\n }\n // Fall back to native values when running on a binary build\n if (!attrs.app_version && Constants.nativeAppVersion) {\n attrs.app_version = String(Constants.nativeAppVersion);\n }\n if (!attrs.build_number && Constants.nativeBuildVersion) {\n attrs.build_number = String(Constants.nativeBuildVersion);\n }\n }\n\n // expo-updates: OTA bundle id + channel\n if (Updates) {\n if (Updates.updateId) attrs.ota_id = String(Updates.updateId);\n if (Updates.runtimeVersion) attrs.runtime_version = String(Updates.runtimeVersion);\n if (Updates.channel) attrs.ota_channel = String(Updates.channel);\n }\n\n return attrs;\n}\n","/**\n * In-memory ring buffer of the most recent console log lines.\n *\n * NEVER streamed to Loki on its own (would balloon volume + cost). Every\n * outgoing event attaches the current buffer as `attrs.breadcrumbs`, giving\n * the broker the lines that ran in the seconds before the error fired.\n *\n * That context is what the Fix Prompt template surfaces to Cursor/Claude\n * — \"this error happened, and HERE'S WHAT THE APP WAS DOING right before\n * it.\" Without it, the AI just sees a stack trace with no surrounding state.\n */\n\nconst MAX_BREADCRUMBS = 50;\nconst MAX_MESSAGE_CHARS = 500;\n\nexport interface Breadcrumb {\n /** Wall-clock ms timestamp. */\n ts: number;\n /** One of the four console levels (log / info / warn / error). */\n level: 'log' | 'info' | 'warn' | 'error';\n /** Stringified console args, capped at 500 chars. */\n message: string;\n}\n\nconst buffer: Breadcrumb[] = [];\n\nexport function pushBreadcrumb(level: Breadcrumb['level'], args: any[]): void {\n try {\n const message = stringifyArgs(args);\n buffer.push({ ts: Date.now(), level, message });\n if (buffer.length > MAX_BREADCRUMBS) buffer.shift();\n } catch {\n // never let breadcrumb collection crash user code\n }\n}\n\nexport function getBreadcrumbs(): Breadcrumb[] {\n return [...buffer];\n}\n\nexport function clearBreadcrumbs(): void {\n buffer.length = 0;\n}\n\nfunction stringifyArgs(args: any[]): string {\n const parts: string[] = [];\n for (const a of args) {\n if (a instanceof Error) {\n parts.push(`${a.name}: ${a.message}`);\n } else if (typeof a === 'string') {\n parts.push(a);\n } else if (a == null) {\n parts.push(String(a));\n } else {\n try {\n parts.push(JSON.stringify(a));\n } catch {\n parts.push(String(a));\n }\n }\n }\n const joined = parts.join(' ');\n return joined.length > MAX_MESSAGE_CHARS\n ? joined.slice(0, MAX_MESSAGE_CHARS) + '…'\n : joined;\n}\n","export const SDK_NAME = '@fixprompt/react-native';\nexport const SDK_VERSION = '0.0.3';\n","import type { EventPayload, ResolvedConfig } from './types';\nimport { offlineBuffer } from './buffer';\nimport { getState } from './state';\nimport { getDeviceAttrs } from './device';\nimport { getBreadcrumbs } from './breadcrumbs';\nimport { SDK_NAME, SDK_VERSION } from './version';\n\nconst REQUEST_TIMEOUT_MS = 8_000;\n\n/**\n * Sends one event. On network failure (timeout / 5xx / no-network) the event\n * gets buffered; the buffer drains on the next successful send.\n *\n * Never throws — RN apps don't want their event loop killed by a logger.\n */\nexport function sendEvent(\n config: ResolvedConfig,\n payload: Omit<EventPayload, 'service' | 'app' | 'env' | 'attrs'> & {\n attrs?: Record<string, any>;\n service?: string;\n app?: string;\n env?: string;\n },\n): void {\n const state = getState();\n\n const event: EventPayload = {\n service: payload.service ?? config.service,\n app: payload.app ?? config.app,\n env: payload.env ?? config.env,\n level: payload.level,\n message: payload.message,\n stack: payload.stack,\n attrs: {\n ...(payload.attrs ?? {}),\n ...getDeviceAttrs(),\n sdk: SDK_NAME,\n sdk_version: SDK_VERSION,\n release: config.release,\n session_id: state.sessionId,\n device_id: state.deviceId,\n user_id: state.user?.id,\n user_email: state.user?.email,\n breadcrumbs: getBreadcrumbs(),\n },\n synthetic: payload.synthetic,\n };\n\n // Strip undefined attrs (broker accepts strings/numbers, not nulls/undef)\n for (const k of Object.keys(event.attrs)) {\n if (event.attrs[k] === undefined || event.attrs[k] === null) {\n delete event.attrs[k];\n }\n }\n\n void postOrBuffer(config, event);\n}\n\nasync function postOrBuffer(\n config: ResolvedConfig,\n event: EventPayload,\n): Promise<void> {\n // Always drain the buffer first so order is preserved.\n if (!(await tryPost(config, event, /* throwOnFail */ true))) {\n offlineBuffer.push(event);\n return;\n }\n\n // Successfully delivered this one — try to drain any backlog too.\n if (offlineBuffer.size() === 0) return;\n const queued = await offlineBuffer.drain();\n for (const buffered of queued) {\n if (!(await tryPost(config, buffered, true))) {\n // Re-buffer the rest including this one\n offlineBuffer.push(buffered);\n for (let i = queued.indexOf(buffered) + 1; i < queued.length; i++) {\n offlineBuffer.push(queued[i]);\n }\n return;\n }\n }\n}\n\nasync function tryPost(\n config: ResolvedConfig,\n event: EventPayload,\n throwOnFail: boolean,\n): Promise<boolean> {\n try {\n const ctrl = new AbortController();\n const timer = setTimeout(() => ctrl.abort(), REQUEST_TIMEOUT_MS);\n try {\n const res = await fetch(`${config.endpoint.replace(/\\/$/, '')}/ingest/log`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-loghub-source': config.source,\n 'x-loghub-key': config.projectKey,\n },\n body: JSON.stringify(event),\n signal: ctrl.signal,\n });\n // 4xx → bug on our side; drop, don't buffer\n if (res.status >= 400 && res.status < 500) {\n if (config.debug) {\n // eslint-disable-next-line no-console\n console.warn(`[fixprompt] ${res.status} from broker — dropping event`);\n }\n return true; // \"delivered\" in the sense that we won't re-try\n }\n return res.ok;\n } finally {\n clearTimeout(timer);\n }\n } catch (err) {\n if (config.debug) {\n // eslint-disable-next-line no-console\n console.warn(`[fixprompt] transport error: ${(err as Error).message}`);\n }\n return false;\n }\n}\n","import { sendEvent } from './transport';\nimport type { ResolvedConfig } from './types';\n\n/**\n * Returns the project's user-code stack frame (skips node_modules and the\n * SDK itself). Falls back to the raw stack.\n */\nfunction topStackFrame(stack: string | undefined): string {\n if (!stack) return '';\n for (const raw of stack.split('\\n')) {\n const line = raw.trim();\n if (!line) continue;\n if (line.startsWith('Error')) continue;\n if (/node_modules|@fixprompt/.test(line)) continue;\n return line.slice(0, 200);\n }\n return stack.split('\\n')[0]?.slice(0, 200) ?? '';\n}\n\nexport function installGlobalErrorHandler(config: ResolvedConfig): () => void {\n // ErrorUtils is a React Native global; not present in plain Node tests.\n const ErrorUtils: any = (globalThis as any).ErrorUtils;\n if (!ErrorUtils?.setGlobalHandler) {\n return () => undefined;\n }\n\n const previous = ErrorUtils.getGlobalHandler?.();\n\n const handler = (error: Error, isFatal?: boolean) => {\n try {\n sendEvent(config, {\n level: isFatal ? 'error' : 'warn',\n message: error?.message ?? 'Uncaught error',\n stack: typeof error?.stack === 'string' ? error.stack : undefined,\n attrs: {\n kind: 'rn.globalError',\n severity: isFatal ? 'critical' : 'error',\n error_name: error?.name,\n top_frame: topStackFrame(error?.stack),\n fatal: !!isFatal,\n },\n });\n } catch {\n // never let logger crash propagate\n }\n previous?.(error, isFatal);\n };\n\n ErrorUtils.setGlobalHandler(handler);\n\n return () => {\n if (previous) ErrorUtils.setGlobalHandler(previous);\n };\n}\n\n/**\n * Hook unhandled-promise-rejection tracking. Uses the bundled\n * `promise/setimmediate/rejection-tracking` module that ships with RN.\n */\nexport function installRejectionHandler(config: ResolvedConfig): () => void {\n let tracking: any;\n try {\n // RN's bundled polyfill — present on every RN runtime.\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n tracking = require('promise/setimmediate/rejection-tracking');\n } catch {\n return () => undefined;\n }\n\n tracking.enable({\n allRejections: true,\n onUnhandled: (id: string, error: unknown) => {\n try {\n const isErr = error instanceof Error;\n sendEvent(config, {\n level: 'error',\n message: isErr ? error.message : safeJson(error),\n stack: isErr && typeof error.stack === 'string' ? error.stack : undefined,\n attrs: {\n kind: 'rn.unhandledrejection',\n severity: 'error',\n error_name: isErr ? error.name : typeof error,\n top_frame: isErr ? topStackFrame(error.stack) : '',\n },\n });\n } catch {\n // ignore\n }\n },\n onHandled: () => undefined,\n });\n\n return () => {\n try {\n tracking.disable();\n } catch {\n // ignore\n }\n };\n}\n\nfunction safeJson(v: unknown): string {\n try {\n return JSON.stringify(v);\n } catch {\n return String(v);\n }\n}\n","import { sendEvent } from './transport';\nimport { pushBreadcrumb } from './breadcrumbs';\nimport type { ResolvedConfig } from './types';\n\n/**\n * Patches all four console levels (log / info / warn / error) to push entries\n * into the breadcrumb ring buffer. Forwarding patches below are installed on\n * top of these — they snapshot the buffer BEFORE pushing the current call,\n * so the forwarded event sees the lines that ran before it.\n *\n * No-op-on-failure; never throws.\n */\nexport function patchConsoleForBreadcrumbs(): () => void {\n const originals = {\n log: console.log.bind(console),\n info: console.info.bind(console),\n warn: console.warn.bind(console),\n error: console.error.bind(console),\n };\n\n console.log = (...args: any[]) => {\n pushBreadcrumb('log', args);\n return originals.log(...args);\n };\n console.info = (...args: any[]) => {\n pushBreadcrumb('info', args);\n return originals.info(...args);\n };\n console.warn = (...args: any[]) => {\n pushBreadcrumb('warn', args);\n return originals.warn(...args);\n };\n console.error = (...args: any[]) => {\n pushBreadcrumb('error', args);\n return originals.error(...args);\n };\n\n return () => {\n console.log = originals.log;\n console.info = originals.info;\n console.warn = originals.warn;\n console.error = originals.error;\n };\n}\n\nfunction shouldCapture(args: any[], patterns: RegExp[]): boolean {\n if (patterns.length === 0) return true; // empty list = capture everything\n const first = typeof args[0] === 'string' ? args[0] : '';\n return patterns.some((re) => re.test(first));\n}\n\nfunction stringify(args: any[]): { message: string; stack?: string } {\n const errArg = args.find((a) => a instanceof Error) as Error | undefined;\n const message = args\n .map((a) => {\n if (a instanceof Error) return a.message;\n if (typeof a === 'string') return a;\n try {\n return JSON.stringify(a);\n } catch {\n return String(a);\n }\n })\n .join(' ')\n .slice(0, 4000);\n return {\n message,\n stack: errArg && typeof errArg.stack === 'string' ? errArg.stack : undefined,\n };\n}\n\n/**\n * Wrap console.error so tagged calls forward to the broker as warning-severity\n * events. The original console.error still runs (so RedBox / Metro logs still\n * show up).\n *\n * Pattern is intentional — ProofPix's existing log lines look like\n * `console.error('[Analytics] tracking failure', err)`. Devs prefix their\n * intentional captures and the broker only sees tagged ones.\n */\nexport function patchConsoleError(config: ResolvedConfig): () => void {\n const original = console.error.bind(console);\n console.error = (...args: any[]) => {\n try {\n if (shouldCapture(args, config.captureTags)) {\n const { message, stack } = stringify(args);\n sendEvent(config, {\n level: 'warn',\n message,\n stack,\n attrs: {\n kind: 'console.error',\n severity: 'warning',\n },\n });\n }\n } catch {\n // never block user logs\n }\n return original(...args);\n };\n return () => {\n console.error = original;\n };\n}\n\nexport function patchConsoleWarn(config: ResolvedConfig): () => void {\n const original = console.warn.bind(console);\n console.warn = (...args: any[]) => {\n try {\n if (shouldCapture(args, config.captureTags)) {\n const { message, stack } = stringify(args);\n sendEvent(config, {\n level: 'warn',\n message,\n stack,\n attrs: {\n kind: 'console.warn',\n severity: 'warning',\n },\n });\n }\n } catch {\n // never block\n }\n return original(...args);\n };\n return () => {\n console.warn = original;\n };\n}\n","import { getState, type UserContext } from './state';\nimport { newSessionId, getDeviceId } from './session';\nimport { installGlobalErrorHandler, installRejectionHandler } from './handlers';\nimport {\n patchConsoleError,\n patchConsoleWarn,\n patchConsoleForBreadcrumbs,\n} from './console';\nimport { sendEvent } from './transport';\nimport { offlineBuffer } from './buffer';\nimport { clearBreadcrumbs } from './breadcrumbs';\nimport type { InitOptions, ResolvedConfig } from './types';\n\nconst DEFAULT_ENDPOINT = 'https://geosloghub-production.up.railway.app';\n\nfunction resolveConfig(opts: InitOptions): ResolvedConfig {\n if (!opts?.projectKey) throw new Error('initFixPrompt: projectKey is required');\n if (!opts?.source) throw new Error('initFixPrompt: source is required');\n if (!opts?.service) throw new Error('initFixPrompt: service is required');\n if (!opts?.app) throw new Error('initFixPrompt: app is required');\n\n return {\n projectKey: opts.projectKey,\n source: opts.source,\n endpoint: (opts.endpoint ?? DEFAULT_ENDPOINT).replace(/\\/$/, ''),\n service: opts.service,\n app: opts.app,\n env: opts.env ?? 'prod',\n release: opts.release ?? null,\n captureTags: opts.captureTags ?? [],\n patchConsoleWarn: opts.patchConsoleWarn ?? false,\n patchConsoleError: opts.patchConsoleError ?? true,\n debug: opts.debug ?? false,\n };\n}\n\nexport function initFixPrompt(opts: InitOptions): void {\n const state = getState();\n if (state.initialized) {\n if (opts?.debug) {\n // eslint-disable-next-line no-console\n console.warn('[fixprompt] already initialized — call ignored');\n }\n return;\n }\n\n const config = resolveConfig(opts);\n state.config = config;\n state.sessionId = newSessionId();\n\n // Install breadcrumb capture FIRST so the forwarding patches below wrap\n // these. When ProofPix calls console.warn('[CRM] sync failed'), the\n // captureTags-gated forwarder runs (snapshotting the buffer pre-this-call),\n // then the breadcrumb wrapper pushes the line. Next event ships with this\n // line included.\n state.cleanup.restoreBreadcrumbConsole = patchConsoleForBreadcrumbs();\n\n state.cleanup.removeErrorHandler = installGlobalErrorHandler(config);\n state.cleanup.removeRejectionHandler = installRejectionHandler(config);\n if (config.patchConsoleError) {\n state.cleanup.restoreConsoleError = patchConsoleError(config);\n }\n if (config.patchConsoleWarn) {\n state.cleanup.restoreConsoleWarn = patchConsoleWarn(config);\n }\n\n state.initialized = true;\n\n // Resolve device id + drain any pre-init buffer, async.\n void (async () => {\n try {\n state.deviceId = await getDeviceId();\n await offlineBuffer.load();\n if (offlineBuffer.size() > 0) {\n // Triggers a drain via the transport's natural retry path.\n const items = await offlineBuffer.drain();\n for (const ev of items) {\n // Re-buffer if delivery still fails — transport handles it\n offlineBuffer.push(ev);\n }\n // Kick a drain attempt\n sendEvent(config, {\n level: 'debug',\n message: '[fixprompt] resumed from offline buffer',\n attrs: { kind: 'sdk.startup', buffered: items.length },\n });\n }\n } catch (err) {\n if (config.debug) {\n // eslint-disable-next-line no-console\n console.warn(`[fixprompt] init async setup failed: ${(err as Error).message}`);\n }\n }\n })();\n\n if (config.debug) {\n // eslint-disable-next-line no-console\n console.log('[fixprompt] initialized', {\n endpoint: config.endpoint,\n service: config.service,\n env: config.env,\n session_id: state.sessionId,\n });\n }\n}\n\nexport function captureException(\n err: unknown,\n options: { synthetic?: boolean; attrs?: Record<string, any> } = {},\n): void {\n const state = getState();\n if (!state.initialized || !state.config) return;\n const isErr = err instanceof Error;\n sendEvent(state.config, {\n level: 'error',\n message: isErr ? err.message : String(err),\n stack: isErr && typeof err.stack === 'string' ? err.stack : undefined,\n attrs: {\n kind: 'captureException',\n severity: 'error',\n error_name: isErr ? err.name : typeof err,\n ...(options.attrs ?? {}),\n },\n synthetic: options.synthetic === true,\n });\n}\n\nexport function setUser(user: UserContext | null): void {\n const state = getState();\n state.user = user;\n}\n\n/** Tests + HMR only. Not part of the supported API. @internal */\nexport function _resetForTests(): void {\n const state = getState();\n // Reverse order — forwarding patches were installed AFTER breadcrumbs.\n state.cleanup.restoreConsoleError?.();\n state.cleanup.restoreConsoleWarn?.();\n state.cleanup.restoreBreadcrumbConsole?.();\n state.cleanup.removeErrorHandler?.();\n state.cleanup.removeRejectionHandler?.();\n state.initialized = false;\n state.config = null;\n state.sessionId = null;\n state.deviceId = null;\n state.user = null;\n state.cleanup = {};\n clearBreadcrumbs();\n}\n"],"mappings":"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","names":["exports","module","Promise","resolve","reject","exports","Promise","id","AsyncStorage","import_async_storage","AsyncStorage"]}
|
package/dist/index.js
CHANGED
|
@@ -422,17 +422,87 @@ var offlineBuffer = new OfflineBuffer();
|
|
|
422
422
|
|
|
423
423
|
// src/device.ts
|
|
424
424
|
import { Platform } from "react-native";
|
|
425
|
+
function tryRequire(spec) {
|
|
426
|
+
try {
|
|
427
|
+
return __require(spec);
|
|
428
|
+
} catch {
|
|
429
|
+
return null;
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
var ConstantsMod = tryRequire("expo-constants");
|
|
433
|
+
var Constants = ConstantsMod?.default ?? ConstantsMod ?? null;
|
|
434
|
+
var Updates = tryRequire("expo-updates");
|
|
425
435
|
function getDeviceAttrs() {
|
|
426
|
-
|
|
436
|
+
const attrs = {
|
|
427
437
|
platform: String(Platform.OS),
|
|
428
438
|
os_version: String(Platform.Version ?? "unknown"),
|
|
429
439
|
rn_version: Platform.constants?.reactNativeVersion ? Object.values(Platform.constants.reactNativeVersion).join(".") : void 0
|
|
430
440
|
};
|
|
441
|
+
if (Constants) {
|
|
442
|
+
const cfg = Constants.expoConfig ?? Constants.manifest ?? null;
|
|
443
|
+
if (cfg?.version) attrs.app_version = String(cfg.version);
|
|
444
|
+
if (cfg?.ios?.buildNumber) {
|
|
445
|
+
attrs.build_number = String(cfg.ios.buildNumber);
|
|
446
|
+
} else if (cfg?.android?.versionCode != null) {
|
|
447
|
+
attrs.build_number = String(cfg.android.versionCode);
|
|
448
|
+
}
|
|
449
|
+
if (!attrs.app_version && Constants.nativeAppVersion) {
|
|
450
|
+
attrs.app_version = String(Constants.nativeAppVersion);
|
|
451
|
+
}
|
|
452
|
+
if (!attrs.build_number && Constants.nativeBuildVersion) {
|
|
453
|
+
attrs.build_number = String(Constants.nativeBuildVersion);
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
if (Updates) {
|
|
457
|
+
if (Updates.updateId) attrs.ota_id = String(Updates.updateId);
|
|
458
|
+
if (Updates.runtimeVersion) attrs.runtime_version = String(Updates.runtimeVersion);
|
|
459
|
+
if (Updates.channel) attrs.ota_channel = String(Updates.channel);
|
|
460
|
+
}
|
|
461
|
+
return attrs;
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
// src/breadcrumbs.ts
|
|
465
|
+
var MAX_BREADCRUMBS = 50;
|
|
466
|
+
var MAX_MESSAGE_CHARS = 500;
|
|
467
|
+
var buffer = [];
|
|
468
|
+
function pushBreadcrumb(level, args) {
|
|
469
|
+
try {
|
|
470
|
+
const message = stringifyArgs(args);
|
|
471
|
+
buffer.push({ ts: Date.now(), level, message });
|
|
472
|
+
if (buffer.length > MAX_BREADCRUMBS) buffer.shift();
|
|
473
|
+
} catch {
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
function getBreadcrumbs() {
|
|
477
|
+
return [...buffer];
|
|
478
|
+
}
|
|
479
|
+
function clearBreadcrumbs() {
|
|
480
|
+
buffer.length = 0;
|
|
481
|
+
}
|
|
482
|
+
function stringifyArgs(args) {
|
|
483
|
+
const parts = [];
|
|
484
|
+
for (const a of args) {
|
|
485
|
+
if (a instanceof Error) {
|
|
486
|
+
parts.push(`${a.name}: ${a.message}`);
|
|
487
|
+
} else if (typeof a === "string") {
|
|
488
|
+
parts.push(a);
|
|
489
|
+
} else if (a == null) {
|
|
490
|
+
parts.push(String(a));
|
|
491
|
+
} else {
|
|
492
|
+
try {
|
|
493
|
+
parts.push(JSON.stringify(a));
|
|
494
|
+
} catch {
|
|
495
|
+
parts.push(String(a));
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
const joined = parts.join(" ");
|
|
500
|
+
return joined.length > MAX_MESSAGE_CHARS ? joined.slice(0, MAX_MESSAGE_CHARS) + "\u2026" : joined;
|
|
431
501
|
}
|
|
432
502
|
|
|
433
503
|
// src/version.ts
|
|
434
504
|
var SDK_NAME = "@fixprompt/react-native";
|
|
435
|
-
var SDK_VERSION = "0.0.
|
|
505
|
+
var SDK_VERSION = "0.0.3";
|
|
436
506
|
|
|
437
507
|
// src/transport.ts
|
|
438
508
|
var REQUEST_TIMEOUT_MS = 8e3;
|
|
@@ -454,7 +524,8 @@ function sendEvent(config, payload) {
|
|
|
454
524
|
session_id: state.sessionId,
|
|
455
525
|
device_id: state.deviceId,
|
|
456
526
|
user_id: state.user?.id,
|
|
457
|
-
user_email: state.user?.email
|
|
527
|
+
user_email: state.user?.email,
|
|
528
|
+
breadcrumbs: getBreadcrumbs()
|
|
458
529
|
},
|
|
459
530
|
synthetic: payload.synthetic
|
|
460
531
|
};
|
|
@@ -605,6 +676,36 @@ function safeJson(v) {
|
|
|
605
676
|
}
|
|
606
677
|
|
|
607
678
|
// src/console.ts
|
|
679
|
+
function patchConsoleForBreadcrumbs() {
|
|
680
|
+
const originals = {
|
|
681
|
+
log: console.log.bind(console),
|
|
682
|
+
info: console.info.bind(console),
|
|
683
|
+
warn: console.warn.bind(console),
|
|
684
|
+
error: console.error.bind(console)
|
|
685
|
+
};
|
|
686
|
+
console.log = (...args) => {
|
|
687
|
+
pushBreadcrumb("log", args);
|
|
688
|
+
return originals.log(...args);
|
|
689
|
+
};
|
|
690
|
+
console.info = (...args) => {
|
|
691
|
+
pushBreadcrumb("info", args);
|
|
692
|
+
return originals.info(...args);
|
|
693
|
+
};
|
|
694
|
+
console.warn = (...args) => {
|
|
695
|
+
pushBreadcrumb("warn", args);
|
|
696
|
+
return originals.warn(...args);
|
|
697
|
+
};
|
|
698
|
+
console.error = (...args) => {
|
|
699
|
+
pushBreadcrumb("error", args);
|
|
700
|
+
return originals.error(...args);
|
|
701
|
+
};
|
|
702
|
+
return () => {
|
|
703
|
+
console.log = originals.log;
|
|
704
|
+
console.info = originals.info;
|
|
705
|
+
console.warn = originals.warn;
|
|
706
|
+
console.error = originals.error;
|
|
707
|
+
};
|
|
708
|
+
}
|
|
608
709
|
function shouldCapture(args, patterns) {
|
|
609
710
|
if (patterns.length === 0) return true;
|
|
610
711
|
const first = typeof args[0] === "string" ? args[0] : "";
|
|
@@ -707,6 +808,7 @@ function initFixPrompt(opts) {
|
|
|
707
808
|
const config = resolveConfig(opts);
|
|
708
809
|
state.config = config;
|
|
709
810
|
state.sessionId = newSessionId();
|
|
811
|
+
state.cleanup.restoreBreadcrumbConsole = patchConsoleForBreadcrumbs();
|
|
710
812
|
state.cleanup.removeErrorHandler = installGlobalErrorHandler(config);
|
|
711
813
|
state.cleanup.removeRejectionHandler = installRejectionHandler(config);
|
|
712
814
|
if (config.patchConsoleError) {
|
|
@@ -769,16 +871,18 @@ function setUser(user) {
|
|
|
769
871
|
}
|
|
770
872
|
function _resetForTests() {
|
|
771
873
|
const state = getState();
|
|
772
|
-
state.cleanup.removeErrorHandler?.();
|
|
773
|
-
state.cleanup.removeRejectionHandler?.();
|
|
774
874
|
state.cleanup.restoreConsoleError?.();
|
|
775
875
|
state.cleanup.restoreConsoleWarn?.();
|
|
876
|
+
state.cleanup.restoreBreadcrumbConsole?.();
|
|
877
|
+
state.cleanup.removeErrorHandler?.();
|
|
878
|
+
state.cleanup.removeRejectionHandler?.();
|
|
776
879
|
state.initialized = false;
|
|
777
880
|
state.config = null;
|
|
778
881
|
state.sessionId = null;
|
|
779
882
|
state.deviceId = null;
|
|
780
883
|
state.user = null;
|
|
781
884
|
state.cleanup = {};
|
|
885
|
+
clearBreadcrumbs();
|
|
782
886
|
}
|
|
783
887
|
export {
|
|
784
888
|
SDK_NAME,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../node_modules/promise/setimmediate/core.js","../node_modules/promise/setimmediate/rejection-tracking.js","../src/state.ts","../src/session.ts","../src/buffer.ts","../src/device.ts","../src/version.ts","../src/transport.ts","../src/handlers.ts","../src/console.ts","../src/init.ts"],"sourcesContent":["'use strict';\n\n\n\nfunction noop() {}\n\n// States:\n//\n// 0 - pending\n// 1 - fulfilled with _value\n// 2 - rejected with _value\n// 3 - adopted the state of another promise, _value\n//\n// once the state is no longer pending (0) it is immutable\n\n// All `_` prefixed properties will be reduced to `_{random number}`\n// at build time to obfuscate them and discourage their use.\n// We don't use symbols or Object.defineProperty to fully hide them\n// because the performance isn't good enough.\n\n\n// to avoid using try/catch inside critical functions, we\n// extract them to here.\nvar LAST_ERROR = null;\nvar IS_ERROR = {};\nfunction getThen(obj) {\n try {\n return obj.then;\n } catch (ex) {\n LAST_ERROR = ex;\n return IS_ERROR;\n }\n}\n\nfunction tryCallOne(fn, a) {\n try {\n return fn(a);\n } catch (ex) {\n LAST_ERROR = ex;\n return IS_ERROR;\n }\n}\nfunction tryCallTwo(fn, a, b) {\n try {\n fn(a, b);\n } catch (ex) {\n LAST_ERROR = ex;\n return IS_ERROR;\n }\n}\n\nmodule.exports = Promise;\n\nfunction Promise(fn) {\n if (typeof this !== 'object') {\n throw new TypeError('Promises must be constructed via new');\n }\n if (typeof fn !== 'function') {\n throw new TypeError('Promise constructor\\'s argument is not a function');\n }\n this._x = 0;\n this._y = 0;\n this._z = null;\n this._A = null;\n if (fn === noop) return;\n doResolve(fn, this);\n}\nPromise._B = null;\nPromise._C = null;\nPromise._D = noop;\n\nPromise.prototype.then = function(onFulfilled, onRejected) {\n if (this.constructor !== Promise) {\n return safeThen(this, onFulfilled, onRejected);\n }\n var res = new Promise(noop);\n handle(this, new Handler(onFulfilled, onRejected, res));\n return res;\n};\n\nfunction safeThen(self, onFulfilled, onRejected) {\n return new self.constructor(function (resolve, reject) {\n var res = new Promise(noop);\n res.then(resolve, reject);\n handle(self, new Handler(onFulfilled, onRejected, res));\n });\n}\nfunction handle(self, deferred) {\n while (self._y === 3) {\n self = self._z;\n }\n if (Promise._B) {\n Promise._B(self);\n }\n if (self._y === 0) {\n if (self._x === 0) {\n self._x = 1;\n self._A = deferred;\n return;\n }\n if (self._x === 1) {\n self._x = 2;\n self._A = [self._A, deferred];\n return;\n }\n self._A.push(deferred);\n return;\n }\n handleResolved(self, deferred);\n}\n\nfunction handleResolved(self, deferred) {\n setImmediate(function() {\n var cb = self._y === 1 ? deferred.onFulfilled : deferred.onRejected;\n if (cb === null) {\n if (self._y === 1) {\n resolve(deferred.promise, self._z);\n } else {\n reject(deferred.promise, self._z);\n }\n return;\n }\n var ret = tryCallOne(cb, self._z);\n if (ret === IS_ERROR) {\n reject(deferred.promise, LAST_ERROR);\n } else {\n resolve(deferred.promise, ret);\n }\n });\n}\nfunction resolve(self, newValue) {\n // Promise Resolution Procedure: https://github.com/promises-aplus/promises-spec#the-promise-resolution-procedure\n if (newValue === self) {\n return reject(\n self,\n new TypeError('A promise cannot be resolved with itself.')\n );\n }\n if (\n newValue &&\n (typeof newValue === 'object' || typeof newValue === 'function')\n ) {\n var then = getThen(newValue);\n if (then === IS_ERROR) {\n return reject(self, LAST_ERROR);\n }\n if (\n then === self.then &&\n newValue instanceof Promise\n ) {\n self._y = 3;\n self._z = newValue;\n finale(self);\n return;\n } else if (typeof then === 'function') {\n doResolve(then.bind(newValue), self);\n return;\n }\n }\n self._y = 1;\n self._z = newValue;\n finale(self);\n}\n\nfunction reject(self, newValue) {\n self._y = 2;\n self._z = newValue;\n if (Promise._C) {\n Promise._C(self, newValue);\n }\n finale(self);\n}\nfunction finale(self) {\n if (self._x === 1) {\n handle(self, self._A);\n self._A = null;\n }\n if (self._x === 2) {\n for (var i = 0; i < self._A.length; i++) {\n handle(self, self._A[i]);\n }\n self._A = null;\n }\n}\n\nfunction Handler(onFulfilled, onRejected, promise){\n this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null;\n this.onRejected = typeof onRejected === 'function' ? onRejected : null;\n this.promise = promise;\n}\n\n/**\n * Take a potentially misbehaving resolver function and make sure\n * onFulfilled and onRejected are only called once.\n *\n * Makes no guarantees about asynchrony.\n */\nfunction doResolve(fn, promise) {\n var done = false;\n var res = tryCallTwo(fn, function (value) {\n if (done) return;\n done = true;\n resolve(promise, value);\n }, function (reason) {\n if (done) return;\n done = true;\n reject(promise, reason);\n });\n if (!done && res === IS_ERROR) {\n done = true;\n reject(promise, LAST_ERROR);\n }\n}\n","'use strict';\n\nvar Promise = require('./core');\n\nvar DEFAULT_WHITELIST = [\n ReferenceError,\n TypeError,\n RangeError\n];\n\nvar enabled = false;\nexports.disable = disable;\nfunction disable() {\n enabled = false;\n Promise._B = null;\n Promise._C = null;\n}\n\nexports.enable = enable;\nfunction enable(options) {\n options = options || {};\n if (enabled) disable();\n enabled = true;\n var id = 0;\n var displayId = 0;\n var rejections = {};\n Promise._B = function (promise) {\n if (\n promise._y === 2 && // IS REJECTED\n rejections[promise._E]\n ) {\n if (rejections[promise._E].logged) {\n onHandled(promise._E);\n } else {\n clearTimeout(rejections[promise._E].timeout);\n }\n delete rejections[promise._E];\n }\n };\n Promise._C = function (promise, err) {\n if (promise._x === 0) { // not yet handled\n promise._E = id++;\n rejections[promise._E] = {\n displayId: null,\n error: err,\n timeout: setTimeout(\n onUnhandled.bind(null, promise._E),\n // For reference errors and type errors, this almost always\n // means the programmer made a mistake, so log them after just\n // 100ms\n // otherwise, wait 2 seconds to see if they get handled\n matchWhitelist(err, DEFAULT_WHITELIST)\n ? 100\n : 2000\n ),\n logged: false\n };\n }\n };\n function onUnhandled(id) {\n if (\n options.allRejections ||\n matchWhitelist(\n rejections[id].error,\n options.whitelist || DEFAULT_WHITELIST\n )\n ) {\n rejections[id].displayId = displayId++;\n if (options.onUnhandled) {\n rejections[id].logged = true;\n options.onUnhandled(\n rejections[id].displayId,\n rejections[id].error\n );\n } else {\n rejections[id].logged = true;\n logError(\n rejections[id].displayId,\n rejections[id].error\n );\n }\n }\n }\n function onHandled(id) {\n if (rejections[id].logged) {\n if (options.onHandled) {\n options.onHandled(rejections[id].displayId, rejections[id].error);\n } else if (!rejections[id].onUnhandled) {\n console.warn(\n 'Promise Rejection Handled (id: ' + rejections[id].displayId + '):'\n );\n console.warn(\n ' This means you can ignore any previous messages of the form \"Possible Unhandled Promise Rejection\" with id ' +\n rejections[id].displayId + '.'\n );\n }\n }\n }\n}\n\nfunction logError(id, error) {\n console.warn('Possible Unhandled Promise Rejection (id: ' + id + '):');\n var errStr = (error && (error.stack || error)) + '';\n errStr.split('\\n').forEach(function (line) {\n console.warn(' ' + line);\n });\n}\n\nfunction matchWhitelist(error, list) {\n return list.some(function (cls) {\n return error instanceof cls;\n });\n}","import type { ResolvedConfig } from './types';\n\nexport interface UserContext {\n id?: string;\n email?: string;\n [k: string]: any;\n}\n\ninterface CleanupHooks {\n removeErrorHandler?: () => void;\n removeRejectionHandler?: () => void;\n restoreConsoleError?: () => void;\n restoreConsoleWarn?: () => void;\n}\n\ninterface SdkState {\n initialized: boolean;\n config: ResolvedConfig | null;\n sessionId: string | null;\n deviceId: string | null;\n user: UserContext | null;\n cleanup: CleanupHooks;\n}\n\nconst STATE_KEY = '__fixprompt_rn_state__';\n\nfunction globalScope(): any {\n if (typeof globalThis !== 'undefined') return globalThis;\n return {};\n}\n\nexport function getState(): SdkState {\n const g = globalScope();\n if (!g[STATE_KEY]) {\n g[STATE_KEY] = {\n initialized: false,\n config: null,\n sessionId: null,\n deviceId: null,\n user: null,\n cleanup: {},\n } satisfies SdkState;\n }\n return g[STATE_KEY] as SdkState;\n}\n\nexport function resetStateForTests(): void {\n const g = globalScope();\n delete g[STATE_KEY];\n}\n","import AsyncStorage from '@react-native-async-storage/async-storage';\n\nconst DEVICE_KEY = '@fixprompt/device_id';\n\nfunction uuid(): string {\n if (typeof globalThis.crypto?.randomUUID === 'function') {\n return globalThis.crypto.randomUUID();\n }\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n\n/**\n * One uuid per cold start. Lives in memory; resets when the app restarts.\n */\nexport function newSessionId(): string {\n return uuid();\n}\n\n/**\n * Stable per-device uuid. Tries expo-secure-store first (keychain-backed),\n * falls back to AsyncStorage. Generated lazily on first call.\n *\n * We deliberately don't use OS-provided device IDs (IDFV/Android ID) —\n * Apple flags them on review and they reset on reinstall anyway.\n */\nexport async function getDeviceId(): Promise<string> {\n // Optional expo-secure-store path\n try {\n // dynamic import so we don't crash when SecureStore isn't installed\n const SecureStore = await tryImport<any>('expo-secure-store');\n if (SecureStore) {\n const existing = await SecureStore.getItemAsync('fixprompt_device_id');\n if (existing) return existing;\n const fresh = uuid();\n await SecureStore.setItemAsync('fixprompt_device_id', fresh);\n return fresh;\n }\n } catch {\n // ignore — fall through to AsyncStorage\n }\n\n try {\n const existing = await AsyncStorage.getItem(DEVICE_KEY);\n if (existing) return existing;\n const fresh = uuid();\n await AsyncStorage.setItem(DEVICE_KEY, fresh);\n return fresh;\n } catch {\n // Final fallback — in-memory only (lost on reinstall)\n return uuid();\n }\n}\n\nasync function tryImport<T>(spec: string): Promise<T | null> {\n try {\n // require keeps Metro bundler quiet when the package isn't installed\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n return require(spec) as T;\n } catch {\n return null;\n }\n}\n","import AsyncStorage from '@react-native-async-storage/async-storage';\nimport type { EventPayload } from './types';\n\nconst STORAGE_KEY = '@fixprompt/buffer';\nconst MAX_BUFFER = 200;\nconst MAX_AGE_MS = 7 * 24 * 60 * 60 * 1000;\n\ninterface BufferedEvent {\n ts: number;\n payload: EventPayload;\n}\n\n/**\n * In-memory ring buffer with AsyncStorage persistence.\n *\n * Events accumulate when the broker is unreachable (network error / 5xx /\n * timeout). On the next successful send, the whole buffer drains in order.\n * On cold start, any persisted buffer from a prior crash is replayed.\n */\nclass OfflineBuffer {\n private items: BufferedEvent[] = [];\n private loaded = false;\n private persistTimer: ReturnType<typeof setTimeout> | null = null;\n\n /** Load the persisted buffer once, on first use. */\n async load(): Promise<void> {\n if (this.loaded) return;\n this.loaded = true;\n try {\n const raw = await AsyncStorage.getItem(STORAGE_KEY);\n if (!raw) return;\n const parsed = JSON.parse(raw) as BufferedEvent[];\n const cutoff = Date.now() - MAX_AGE_MS;\n this.items = parsed.filter((e) => e?.ts > cutoff).slice(-MAX_BUFFER);\n } catch {\n this.items = [];\n }\n }\n\n push(payload: EventPayload): void {\n this.items.push({ ts: Date.now(), payload });\n if (this.items.length > MAX_BUFFER) this.items.shift();\n this.schedulePersist();\n }\n\n async drain(): Promise<EventPayload[]> {\n if (!this.loaded) await this.load();\n const out = this.items.map((e) => e.payload);\n this.items = [];\n this.schedulePersist();\n return out;\n }\n\n size(): number {\n return this.items.length;\n }\n\n private schedulePersist() {\n if (this.persistTimer) return;\n this.persistTimer = setTimeout(async () => {\n this.persistTimer = null;\n try {\n await AsyncStorage.setItem(STORAGE_KEY, JSON.stringify(this.items));\n } catch {\n // swallow — buffer survives in memory at least\n }\n }, 500);\n }\n\n /** Tests only. */\n _resetForTests(): void {\n this.items = [];\n this.loaded = false;\n if (this.persistTimer) {\n clearTimeout(this.persistTimer);\n this.persistTimer = null;\n }\n }\n}\n\nexport const offlineBuffer = new OfflineBuffer();\n","import { Platform } from 'react-native';\n\nexport interface DeviceAttrs {\n platform: string; // 'ios' | 'android' | 'web' | 'windows' | 'macos'\n os_version: string;\n /** RN runtime version (Hermes / JSC). Used for triage. */\n rn_version?: string;\n}\n\nexport function getDeviceAttrs(): DeviceAttrs {\n return {\n platform: String(Platform.OS),\n os_version: String((Platform as any).Version ?? 'unknown'),\n rn_version: (Platform as any).constants?.reactNativeVersion\n ? Object.values((Platform as any).constants.reactNativeVersion).join('.')\n : undefined,\n };\n}\n","export const SDK_NAME = '@fixprompt/react-native';\nexport const SDK_VERSION = '0.0.1';\n","import type { EventPayload, ResolvedConfig } from './types';\nimport { offlineBuffer } from './buffer';\nimport { getState } from './state';\nimport { getDeviceAttrs } from './device';\nimport { SDK_NAME, SDK_VERSION } from './version';\n\nconst REQUEST_TIMEOUT_MS = 8_000;\n\n/**\n * Sends one event. On network failure (timeout / 5xx / no-network) the event\n * gets buffered; the buffer drains on the next successful send.\n *\n * Never throws — RN apps don't want their event loop killed by a logger.\n */\nexport function sendEvent(\n config: ResolvedConfig,\n payload: Omit<EventPayload, 'service' | 'app' | 'env' | 'attrs'> & {\n attrs?: Record<string, any>;\n service?: string;\n app?: string;\n env?: string;\n },\n): void {\n const state = getState();\n\n const event: EventPayload = {\n service: payload.service ?? config.service,\n app: payload.app ?? config.app,\n env: payload.env ?? config.env,\n level: payload.level,\n message: payload.message,\n stack: payload.stack,\n attrs: {\n ...(payload.attrs ?? {}),\n ...getDeviceAttrs(),\n sdk: SDK_NAME,\n sdk_version: SDK_VERSION,\n release: config.release,\n session_id: state.sessionId,\n device_id: state.deviceId,\n user_id: state.user?.id,\n user_email: state.user?.email,\n },\n synthetic: payload.synthetic,\n };\n\n // Strip undefined attrs (broker accepts strings/numbers, not nulls/undef)\n for (const k of Object.keys(event.attrs)) {\n if (event.attrs[k] === undefined || event.attrs[k] === null) {\n delete event.attrs[k];\n }\n }\n\n void postOrBuffer(config, event);\n}\n\nasync function postOrBuffer(\n config: ResolvedConfig,\n event: EventPayload,\n): Promise<void> {\n // Always drain the buffer first so order is preserved.\n if (!(await tryPost(config, event, /* throwOnFail */ true))) {\n offlineBuffer.push(event);\n return;\n }\n\n // Successfully delivered this one — try to drain any backlog too.\n if (offlineBuffer.size() === 0) return;\n const queued = await offlineBuffer.drain();\n for (const buffered of queued) {\n if (!(await tryPost(config, buffered, true))) {\n // Re-buffer the rest including this one\n offlineBuffer.push(buffered);\n for (let i = queued.indexOf(buffered) + 1; i < queued.length; i++) {\n offlineBuffer.push(queued[i]);\n }\n return;\n }\n }\n}\n\nasync function tryPost(\n config: ResolvedConfig,\n event: EventPayload,\n throwOnFail: boolean,\n): Promise<boolean> {\n try {\n const ctrl = new AbortController();\n const timer = setTimeout(() => ctrl.abort(), REQUEST_TIMEOUT_MS);\n try {\n const res = await fetch(`${config.endpoint.replace(/\\/$/, '')}/ingest/log`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-loghub-source': config.source,\n 'x-loghub-key': config.projectKey,\n },\n body: JSON.stringify(event),\n signal: ctrl.signal,\n });\n // 4xx → bug on our side; drop, don't buffer\n if (res.status >= 400 && res.status < 500) {\n if (config.debug) {\n // eslint-disable-next-line no-console\n console.warn(`[fixprompt] ${res.status} from broker — dropping event`);\n }\n return true; // \"delivered\" in the sense that we won't re-try\n }\n return res.ok;\n } finally {\n clearTimeout(timer);\n }\n } catch (err) {\n if (config.debug) {\n // eslint-disable-next-line no-console\n console.warn(`[fixprompt] transport error: ${(err as Error).message}`);\n }\n return false;\n }\n}\n","import { sendEvent } from './transport';\nimport type { ResolvedConfig } from './types';\n\n/**\n * Returns the project's user-code stack frame (skips node_modules and the\n * SDK itself). Falls back to the raw stack.\n */\nfunction topStackFrame(stack: string | undefined): string {\n if (!stack) return '';\n for (const raw of stack.split('\\n')) {\n const line = raw.trim();\n if (!line) continue;\n if (line.startsWith('Error')) continue;\n if (/node_modules|@fixprompt/.test(line)) continue;\n return line.slice(0, 200);\n }\n return stack.split('\\n')[0]?.slice(0, 200) ?? '';\n}\n\nexport function installGlobalErrorHandler(config: ResolvedConfig): () => void {\n // ErrorUtils is a React Native global; not present in plain Node tests.\n const ErrorUtils: any = (globalThis as any).ErrorUtils;\n if (!ErrorUtils?.setGlobalHandler) {\n return () => undefined;\n }\n\n const previous = ErrorUtils.getGlobalHandler?.();\n\n const handler = (error: Error, isFatal?: boolean) => {\n try {\n sendEvent(config, {\n level: isFatal ? 'error' : 'warn',\n message: error?.message ?? 'Uncaught error',\n stack: typeof error?.stack === 'string' ? error.stack : undefined,\n attrs: {\n kind: 'rn.globalError',\n severity: isFatal ? 'critical' : 'error',\n error_name: error?.name,\n top_frame: topStackFrame(error?.stack),\n fatal: !!isFatal,\n },\n });\n } catch {\n // never let logger crash propagate\n }\n previous?.(error, isFatal);\n };\n\n ErrorUtils.setGlobalHandler(handler);\n\n return () => {\n if (previous) ErrorUtils.setGlobalHandler(previous);\n };\n}\n\n/**\n * Hook unhandled-promise-rejection tracking. Uses the bundled\n * `promise/setimmediate/rejection-tracking` module that ships with RN.\n */\nexport function installRejectionHandler(config: ResolvedConfig): () => void {\n let tracking: any;\n try {\n // RN's bundled polyfill — present on every RN runtime.\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n tracking = require('promise/setimmediate/rejection-tracking');\n } catch {\n return () => undefined;\n }\n\n tracking.enable({\n allRejections: true,\n onUnhandled: (id: string, error: unknown) => {\n try {\n const isErr = error instanceof Error;\n sendEvent(config, {\n level: 'error',\n message: isErr ? error.message : safeJson(error),\n stack: isErr && typeof error.stack === 'string' ? error.stack : undefined,\n attrs: {\n kind: 'rn.unhandledrejection',\n severity: 'error',\n error_name: isErr ? error.name : typeof error,\n top_frame: isErr ? topStackFrame(error.stack) : '',\n },\n });\n } catch {\n // ignore\n }\n },\n onHandled: () => undefined,\n });\n\n return () => {\n try {\n tracking.disable();\n } catch {\n // ignore\n }\n };\n}\n\nfunction safeJson(v: unknown): string {\n try {\n return JSON.stringify(v);\n } catch {\n return String(v);\n }\n}\n","import { sendEvent } from './transport';\nimport type { ResolvedConfig } from './types';\n\nfunction shouldCapture(args: any[], patterns: RegExp[]): boolean {\n if (patterns.length === 0) return true; // empty list = capture everything\n const first = typeof args[0] === 'string' ? args[0] : '';\n return patterns.some((re) => re.test(first));\n}\n\nfunction stringify(args: any[]): { message: string; stack?: string } {\n const errArg = args.find((a) => a instanceof Error) as Error | undefined;\n const message = args\n .map((a) => {\n if (a instanceof Error) return a.message;\n if (typeof a === 'string') return a;\n try {\n return JSON.stringify(a);\n } catch {\n return String(a);\n }\n })\n .join(' ')\n .slice(0, 4000);\n return {\n message,\n stack: errArg && typeof errArg.stack === 'string' ? errArg.stack : undefined,\n };\n}\n\n/**\n * Wrap console.error so tagged calls forward to the broker as warning-severity\n * events. The original console.error still runs (so RedBox / Metro logs still\n * show up).\n *\n * Pattern is intentional — ProofPix's existing log lines look like\n * `console.error('[Analytics] tracking failure', err)`. Devs prefix their\n * intentional captures and the broker only sees tagged ones.\n */\nexport function patchConsoleError(config: ResolvedConfig): () => void {\n const original = console.error.bind(console);\n console.error = (...args: any[]) => {\n try {\n if (shouldCapture(args, config.captureTags)) {\n const { message, stack } = stringify(args);\n sendEvent(config, {\n level: 'warn',\n message,\n stack,\n attrs: {\n kind: 'console.error',\n severity: 'warning',\n },\n });\n }\n } catch {\n // never block user logs\n }\n return original(...args);\n };\n return () => {\n console.error = original;\n };\n}\n\nexport function patchConsoleWarn(config: ResolvedConfig): () => void {\n const original = console.warn.bind(console);\n console.warn = (...args: any[]) => {\n try {\n if (shouldCapture(args, config.captureTags)) {\n const { message, stack } = stringify(args);\n sendEvent(config, {\n level: 'warn',\n message,\n stack,\n attrs: {\n kind: 'console.warn',\n severity: 'warning',\n },\n });\n }\n } catch {\n // never block\n }\n return original(...args);\n };\n return () => {\n console.warn = original;\n };\n}\n","import { getState, type UserContext } from './state';\nimport { newSessionId, getDeviceId } from './session';\nimport { installGlobalErrorHandler, installRejectionHandler } from './handlers';\nimport { patchConsoleError, patchConsoleWarn } from './console';\nimport { sendEvent } from './transport';\nimport { offlineBuffer } from './buffer';\nimport type { InitOptions, ResolvedConfig } from './types';\n\nconst DEFAULT_ENDPOINT = 'https://geosloghub-production.up.railway.app';\n\nfunction resolveConfig(opts: InitOptions): ResolvedConfig {\n if (!opts?.projectKey) throw new Error('initFixPrompt: projectKey is required');\n if (!opts?.source) throw new Error('initFixPrompt: source is required');\n if (!opts?.service) throw new Error('initFixPrompt: service is required');\n if (!opts?.app) throw new Error('initFixPrompt: app is required');\n\n return {\n projectKey: opts.projectKey,\n source: opts.source,\n endpoint: (opts.endpoint ?? DEFAULT_ENDPOINT).replace(/\\/$/, ''),\n service: opts.service,\n app: opts.app,\n env: opts.env ?? 'prod',\n release: opts.release ?? null,\n captureTags: opts.captureTags ?? [],\n patchConsoleWarn: opts.patchConsoleWarn ?? false,\n patchConsoleError: opts.patchConsoleError ?? true,\n debug: opts.debug ?? false,\n };\n}\n\nexport function initFixPrompt(opts: InitOptions): void {\n const state = getState();\n if (state.initialized) {\n if (opts?.debug) {\n // eslint-disable-next-line no-console\n console.warn('[fixprompt] already initialized — call ignored');\n }\n return;\n }\n\n const config = resolveConfig(opts);\n state.config = config;\n state.sessionId = newSessionId();\n\n state.cleanup.removeErrorHandler = installGlobalErrorHandler(config);\n state.cleanup.removeRejectionHandler = installRejectionHandler(config);\n if (config.patchConsoleError) {\n state.cleanup.restoreConsoleError = patchConsoleError(config);\n }\n if (config.patchConsoleWarn) {\n state.cleanup.restoreConsoleWarn = patchConsoleWarn(config);\n }\n\n state.initialized = true;\n\n // Resolve device id + drain any pre-init buffer, async.\n void (async () => {\n try {\n state.deviceId = await getDeviceId();\n await offlineBuffer.load();\n if (offlineBuffer.size() > 0) {\n // Triggers a drain via the transport's natural retry path.\n const items = await offlineBuffer.drain();\n for (const ev of items) {\n // Re-buffer if delivery still fails — transport handles it\n offlineBuffer.push(ev);\n }\n // Kick a drain attempt\n sendEvent(config, {\n level: 'debug',\n message: '[fixprompt] resumed from offline buffer',\n attrs: { kind: 'sdk.startup', buffered: items.length },\n });\n }\n } catch (err) {\n if (config.debug) {\n // eslint-disable-next-line no-console\n console.warn(`[fixprompt] init async setup failed: ${(err as Error).message}`);\n }\n }\n })();\n\n if (config.debug) {\n // eslint-disable-next-line no-console\n console.log('[fixprompt] initialized', {\n endpoint: config.endpoint,\n service: config.service,\n env: config.env,\n session_id: state.sessionId,\n });\n }\n}\n\nexport function captureException(\n err: unknown,\n options: { synthetic?: boolean; attrs?: Record<string, any> } = {},\n): void {\n const state = getState();\n if (!state.initialized || !state.config) return;\n const isErr = err instanceof Error;\n sendEvent(state.config, {\n level: 'error',\n message: isErr ? err.message : String(err),\n stack: isErr && typeof err.stack === 'string' ? err.stack : undefined,\n attrs: {\n kind: 'captureException',\n severity: 'error',\n error_name: isErr ? err.name : typeof err,\n ...(options.attrs ?? {}),\n },\n synthetic: options.synthetic === true,\n });\n}\n\nexport function setUser(user: UserContext | null): void {\n const state = getState();\n state.user = user;\n}\n\n/** Tests + HMR only. Not part of the supported API. @internal */\nexport function _resetForTests(): void {\n const state = getState();\n state.cleanup.removeErrorHandler?.();\n state.cleanup.removeRejectionHandler?.();\n state.cleanup.restoreConsoleError?.();\n state.cleanup.restoreConsoleWarn?.();\n state.initialized = false;\n state.config = null;\n state.sessionId = null;\n state.deviceId = null;\n state.user = null;\n state.cleanup = {};\n}\n"],"mappings":"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","names":["Promise","resolve","reject","Promise","id","AsyncStorage"]}
|
|
1
|
+
{"version":3,"sources":["../node_modules/promise/setimmediate/core.js","../node_modules/promise/setimmediate/rejection-tracking.js","../src/state.ts","../src/session.ts","../src/buffer.ts","../src/device.ts","../src/breadcrumbs.ts","../src/version.ts","../src/transport.ts","../src/handlers.ts","../src/console.ts","../src/init.ts"],"sourcesContent":["'use strict';\n\n\n\nfunction noop() {}\n\n// States:\n//\n// 0 - pending\n// 1 - fulfilled with _value\n// 2 - rejected with _value\n// 3 - adopted the state of another promise, _value\n//\n// once the state is no longer pending (0) it is immutable\n\n// All `_` prefixed properties will be reduced to `_{random number}`\n// at build time to obfuscate them and discourage their use.\n// We don't use symbols or Object.defineProperty to fully hide them\n// because the performance isn't good enough.\n\n\n// to avoid using try/catch inside critical functions, we\n// extract them to here.\nvar LAST_ERROR = null;\nvar IS_ERROR = {};\nfunction getThen(obj) {\n try {\n return obj.then;\n } catch (ex) {\n LAST_ERROR = ex;\n return IS_ERROR;\n }\n}\n\nfunction tryCallOne(fn, a) {\n try {\n return fn(a);\n } catch (ex) {\n LAST_ERROR = ex;\n return IS_ERROR;\n }\n}\nfunction tryCallTwo(fn, a, b) {\n try {\n fn(a, b);\n } catch (ex) {\n LAST_ERROR = ex;\n return IS_ERROR;\n }\n}\n\nmodule.exports = Promise;\n\nfunction Promise(fn) {\n if (typeof this !== 'object') {\n throw new TypeError('Promises must be constructed via new');\n }\n if (typeof fn !== 'function') {\n throw new TypeError('Promise constructor\\'s argument is not a function');\n }\n this._x = 0;\n this._y = 0;\n this._z = null;\n this._A = null;\n if (fn === noop) return;\n doResolve(fn, this);\n}\nPromise._B = null;\nPromise._C = null;\nPromise._D = noop;\n\nPromise.prototype.then = function(onFulfilled, onRejected) {\n if (this.constructor !== Promise) {\n return safeThen(this, onFulfilled, onRejected);\n }\n var res = new Promise(noop);\n handle(this, new Handler(onFulfilled, onRejected, res));\n return res;\n};\n\nfunction safeThen(self, onFulfilled, onRejected) {\n return new self.constructor(function (resolve, reject) {\n var res = new Promise(noop);\n res.then(resolve, reject);\n handle(self, new Handler(onFulfilled, onRejected, res));\n });\n}\nfunction handle(self, deferred) {\n while (self._y === 3) {\n self = self._z;\n }\n if (Promise._B) {\n Promise._B(self);\n }\n if (self._y === 0) {\n if (self._x === 0) {\n self._x = 1;\n self._A = deferred;\n return;\n }\n if (self._x === 1) {\n self._x = 2;\n self._A = [self._A, deferred];\n return;\n }\n self._A.push(deferred);\n return;\n }\n handleResolved(self, deferred);\n}\n\nfunction handleResolved(self, deferred) {\n setImmediate(function() {\n var cb = self._y === 1 ? deferred.onFulfilled : deferred.onRejected;\n if (cb === null) {\n if (self._y === 1) {\n resolve(deferred.promise, self._z);\n } else {\n reject(deferred.promise, self._z);\n }\n return;\n }\n var ret = tryCallOne(cb, self._z);\n if (ret === IS_ERROR) {\n reject(deferred.promise, LAST_ERROR);\n } else {\n resolve(deferred.promise, ret);\n }\n });\n}\nfunction resolve(self, newValue) {\n // Promise Resolution Procedure: https://github.com/promises-aplus/promises-spec#the-promise-resolution-procedure\n if (newValue === self) {\n return reject(\n self,\n new TypeError('A promise cannot be resolved with itself.')\n );\n }\n if (\n newValue &&\n (typeof newValue === 'object' || typeof newValue === 'function')\n ) {\n var then = getThen(newValue);\n if (then === IS_ERROR) {\n return reject(self, LAST_ERROR);\n }\n if (\n then === self.then &&\n newValue instanceof Promise\n ) {\n self._y = 3;\n self._z = newValue;\n finale(self);\n return;\n } else if (typeof then === 'function') {\n doResolve(then.bind(newValue), self);\n return;\n }\n }\n self._y = 1;\n self._z = newValue;\n finale(self);\n}\n\nfunction reject(self, newValue) {\n self._y = 2;\n self._z = newValue;\n if (Promise._C) {\n Promise._C(self, newValue);\n }\n finale(self);\n}\nfunction finale(self) {\n if (self._x === 1) {\n handle(self, self._A);\n self._A = null;\n }\n if (self._x === 2) {\n for (var i = 0; i < self._A.length; i++) {\n handle(self, self._A[i]);\n }\n self._A = null;\n }\n}\n\nfunction Handler(onFulfilled, onRejected, promise){\n this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null;\n this.onRejected = typeof onRejected === 'function' ? onRejected : null;\n this.promise = promise;\n}\n\n/**\n * Take a potentially misbehaving resolver function and make sure\n * onFulfilled and onRejected are only called once.\n *\n * Makes no guarantees about asynchrony.\n */\nfunction doResolve(fn, promise) {\n var done = false;\n var res = tryCallTwo(fn, function (value) {\n if (done) return;\n done = true;\n resolve(promise, value);\n }, function (reason) {\n if (done) return;\n done = true;\n reject(promise, reason);\n });\n if (!done && res === IS_ERROR) {\n done = true;\n reject(promise, LAST_ERROR);\n }\n}\n","'use strict';\n\nvar Promise = require('./core');\n\nvar DEFAULT_WHITELIST = [\n ReferenceError,\n TypeError,\n RangeError\n];\n\nvar enabled = false;\nexports.disable = disable;\nfunction disable() {\n enabled = false;\n Promise._B = null;\n Promise._C = null;\n}\n\nexports.enable = enable;\nfunction enable(options) {\n options = options || {};\n if (enabled) disable();\n enabled = true;\n var id = 0;\n var displayId = 0;\n var rejections = {};\n Promise._B = function (promise) {\n if (\n promise._y === 2 && // IS REJECTED\n rejections[promise._E]\n ) {\n if (rejections[promise._E].logged) {\n onHandled(promise._E);\n } else {\n clearTimeout(rejections[promise._E].timeout);\n }\n delete rejections[promise._E];\n }\n };\n Promise._C = function (promise, err) {\n if (promise._x === 0) { // not yet handled\n promise._E = id++;\n rejections[promise._E] = {\n displayId: null,\n error: err,\n timeout: setTimeout(\n onUnhandled.bind(null, promise._E),\n // For reference errors and type errors, this almost always\n // means the programmer made a mistake, so log them after just\n // 100ms\n // otherwise, wait 2 seconds to see if they get handled\n matchWhitelist(err, DEFAULT_WHITELIST)\n ? 100\n : 2000\n ),\n logged: false\n };\n }\n };\n function onUnhandled(id) {\n if (\n options.allRejections ||\n matchWhitelist(\n rejections[id].error,\n options.whitelist || DEFAULT_WHITELIST\n )\n ) {\n rejections[id].displayId = displayId++;\n if (options.onUnhandled) {\n rejections[id].logged = true;\n options.onUnhandled(\n rejections[id].displayId,\n rejections[id].error\n );\n } else {\n rejections[id].logged = true;\n logError(\n rejections[id].displayId,\n rejections[id].error\n );\n }\n }\n }\n function onHandled(id) {\n if (rejections[id].logged) {\n if (options.onHandled) {\n options.onHandled(rejections[id].displayId, rejections[id].error);\n } else if (!rejections[id].onUnhandled) {\n console.warn(\n 'Promise Rejection Handled (id: ' + rejections[id].displayId + '):'\n );\n console.warn(\n ' This means you can ignore any previous messages of the form \"Possible Unhandled Promise Rejection\" with id ' +\n rejections[id].displayId + '.'\n );\n }\n }\n }\n}\n\nfunction logError(id, error) {\n console.warn('Possible Unhandled Promise Rejection (id: ' + id + '):');\n var errStr = (error && (error.stack || error)) + '';\n errStr.split('\\n').forEach(function (line) {\n console.warn(' ' + line);\n });\n}\n\nfunction matchWhitelist(error, list) {\n return list.some(function (cls) {\n return error instanceof cls;\n });\n}","import type { ResolvedConfig } from './types';\n\nexport interface UserContext {\n id?: string;\n email?: string;\n [k: string]: any;\n}\n\ninterface CleanupHooks {\n removeErrorHandler?: () => void;\n removeRejectionHandler?: () => void;\n restoreConsoleError?: () => void;\n restoreConsoleWarn?: () => void;\n restoreBreadcrumbConsole?: () => void;\n}\n\ninterface SdkState {\n initialized: boolean;\n config: ResolvedConfig | null;\n sessionId: string | null;\n deviceId: string | null;\n user: UserContext | null;\n cleanup: CleanupHooks;\n}\n\nconst STATE_KEY = '__fixprompt_rn_state__';\n\nfunction globalScope(): any {\n if (typeof globalThis !== 'undefined') return globalThis;\n return {};\n}\n\nexport function getState(): SdkState {\n const g = globalScope();\n if (!g[STATE_KEY]) {\n g[STATE_KEY] = {\n initialized: false,\n config: null,\n sessionId: null,\n deviceId: null,\n user: null,\n cleanup: {},\n } satisfies SdkState;\n }\n return g[STATE_KEY] as SdkState;\n}\n\nexport function resetStateForTests(): void {\n const g = globalScope();\n delete g[STATE_KEY];\n}\n","import AsyncStorage from '@react-native-async-storage/async-storage';\n\nconst DEVICE_KEY = '@fixprompt/device_id';\n\nfunction uuid(): string {\n if (typeof globalThis.crypto?.randomUUID === 'function') {\n return globalThis.crypto.randomUUID();\n }\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n\n/**\n * One uuid per cold start. Lives in memory; resets when the app restarts.\n */\nexport function newSessionId(): string {\n return uuid();\n}\n\n/**\n * Stable per-device uuid. Tries expo-secure-store first (keychain-backed),\n * falls back to AsyncStorage. Generated lazily on first call.\n *\n * We deliberately don't use OS-provided device IDs (IDFV/Android ID) —\n * Apple flags them on review and they reset on reinstall anyway.\n */\nexport async function getDeviceId(): Promise<string> {\n // Optional expo-secure-store path\n try {\n // dynamic import so we don't crash when SecureStore isn't installed\n const SecureStore = await tryImport<any>('expo-secure-store');\n if (SecureStore) {\n const existing = await SecureStore.getItemAsync('fixprompt_device_id');\n if (existing) return existing;\n const fresh = uuid();\n await SecureStore.setItemAsync('fixprompt_device_id', fresh);\n return fresh;\n }\n } catch {\n // ignore — fall through to AsyncStorage\n }\n\n try {\n const existing = await AsyncStorage.getItem(DEVICE_KEY);\n if (existing) return existing;\n const fresh = uuid();\n await AsyncStorage.setItem(DEVICE_KEY, fresh);\n return fresh;\n } catch {\n // Final fallback — in-memory only (lost on reinstall)\n return uuid();\n }\n}\n\nasync function tryImport<T>(spec: string): Promise<T | null> {\n try {\n // require keeps Metro bundler quiet when the package isn't installed\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n return require(spec) as T;\n } catch {\n return null;\n }\n}\n","import AsyncStorage from '@react-native-async-storage/async-storage';\nimport type { EventPayload } from './types';\n\nconst STORAGE_KEY = '@fixprompt/buffer';\nconst MAX_BUFFER = 200;\nconst MAX_AGE_MS = 7 * 24 * 60 * 60 * 1000;\n\ninterface BufferedEvent {\n ts: number;\n payload: EventPayload;\n}\n\n/**\n * In-memory ring buffer with AsyncStorage persistence.\n *\n * Events accumulate when the broker is unreachable (network error / 5xx /\n * timeout). On the next successful send, the whole buffer drains in order.\n * On cold start, any persisted buffer from a prior crash is replayed.\n */\nclass OfflineBuffer {\n private items: BufferedEvent[] = [];\n private loaded = false;\n private persistTimer: ReturnType<typeof setTimeout> | null = null;\n\n /** Load the persisted buffer once, on first use. */\n async load(): Promise<void> {\n if (this.loaded) return;\n this.loaded = true;\n try {\n const raw = await AsyncStorage.getItem(STORAGE_KEY);\n if (!raw) return;\n const parsed = JSON.parse(raw) as BufferedEvent[];\n const cutoff = Date.now() - MAX_AGE_MS;\n this.items = parsed.filter((e) => e?.ts > cutoff).slice(-MAX_BUFFER);\n } catch {\n this.items = [];\n }\n }\n\n push(payload: EventPayload): void {\n this.items.push({ ts: Date.now(), payload });\n if (this.items.length > MAX_BUFFER) this.items.shift();\n this.schedulePersist();\n }\n\n async drain(): Promise<EventPayload[]> {\n if (!this.loaded) await this.load();\n const out = this.items.map((e) => e.payload);\n this.items = [];\n this.schedulePersist();\n return out;\n }\n\n size(): number {\n return this.items.length;\n }\n\n private schedulePersist() {\n if (this.persistTimer) return;\n this.persistTimer = setTimeout(async () => {\n this.persistTimer = null;\n try {\n await AsyncStorage.setItem(STORAGE_KEY, JSON.stringify(this.items));\n } catch {\n // swallow — buffer survives in memory at least\n }\n }, 500);\n }\n\n /** Tests only. */\n _resetForTests(): void {\n this.items = [];\n this.loaded = false;\n if (this.persistTimer) {\n clearTimeout(this.persistTimer);\n this.persistTimer = null;\n }\n }\n}\n\nexport const offlineBuffer = new OfflineBuffer();\n","import { Platform } from 'react-native';\n\nexport interface DeviceAttrs {\n platform: string; // 'ios' | 'android' | 'web' | 'windows' | 'macos'\n os_version: string;\n /** RN runtime version (Hermes / JSC). Used for triage. */\n rn_version?: string;\n\n /** App version (e.g. \"1.2.3\") from expo-constants or native build. */\n app_version?: string;\n /** Build number (CFBundleVersion / versionCode) from expo-constants. */\n build_number?: string;\n\n /** OTA bundle id (Updates.updateId) from expo-updates, if active. */\n ota_id?: string;\n /** OTA runtime version (Updates.runtimeVersion) from expo-updates. */\n runtime_version?: string;\n /** OTA channel (Updates.channel) — e.g. \"production\", \"preview\". */\n ota_channel?: string;\n}\n\nfunction tryRequire<T = any>(spec: string): T | null {\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n return require(spec) as T;\n } catch {\n return null;\n }\n}\n\n// Cache at module load. Both packages are optional peer deps — bare RN\n// (or sideloaded Expo) projects without them get the basic platform attrs.\nconst ConstantsMod: any = tryRequire('expo-constants');\nconst Constants: any = ConstantsMod?.default ?? ConstantsMod ?? null;\nconst Updates: any = tryRequire('expo-updates');\n\nexport function getDeviceAttrs(): DeviceAttrs {\n const attrs: DeviceAttrs = {\n platform: String(Platform.OS),\n os_version: String((Platform as any).Version ?? 'unknown'),\n rn_version: (Platform as any).constants?.reactNativeVersion\n ? Object.values((Platform as any).constants.reactNativeVersion).join('.')\n : undefined,\n };\n\n // expo-constants: app version + native build number\n if (Constants) {\n const cfg = Constants.expoConfig ?? Constants.manifest ?? null;\n if (cfg?.version) attrs.app_version = String(cfg.version);\n if (cfg?.ios?.buildNumber) {\n attrs.build_number = String(cfg.ios.buildNumber);\n } else if (cfg?.android?.versionCode != null) {\n attrs.build_number = String(cfg.android.versionCode);\n }\n // Fall back to native values when running on a binary build\n if (!attrs.app_version && Constants.nativeAppVersion) {\n attrs.app_version = String(Constants.nativeAppVersion);\n }\n if (!attrs.build_number && Constants.nativeBuildVersion) {\n attrs.build_number = String(Constants.nativeBuildVersion);\n }\n }\n\n // expo-updates: OTA bundle id + channel\n if (Updates) {\n if (Updates.updateId) attrs.ota_id = String(Updates.updateId);\n if (Updates.runtimeVersion) attrs.runtime_version = String(Updates.runtimeVersion);\n if (Updates.channel) attrs.ota_channel = String(Updates.channel);\n }\n\n return attrs;\n}\n","/**\n * In-memory ring buffer of the most recent console log lines.\n *\n * NEVER streamed to Loki on its own (would balloon volume + cost). Every\n * outgoing event attaches the current buffer as `attrs.breadcrumbs`, giving\n * the broker the lines that ran in the seconds before the error fired.\n *\n * That context is what the Fix Prompt template surfaces to Cursor/Claude\n * — \"this error happened, and HERE'S WHAT THE APP WAS DOING right before\n * it.\" Without it, the AI just sees a stack trace with no surrounding state.\n */\n\nconst MAX_BREADCRUMBS = 50;\nconst MAX_MESSAGE_CHARS = 500;\n\nexport interface Breadcrumb {\n /** Wall-clock ms timestamp. */\n ts: number;\n /** One of the four console levels (log / info / warn / error). */\n level: 'log' | 'info' | 'warn' | 'error';\n /** Stringified console args, capped at 500 chars. */\n message: string;\n}\n\nconst buffer: Breadcrumb[] = [];\n\nexport function pushBreadcrumb(level: Breadcrumb['level'], args: any[]): void {\n try {\n const message = stringifyArgs(args);\n buffer.push({ ts: Date.now(), level, message });\n if (buffer.length > MAX_BREADCRUMBS) buffer.shift();\n } catch {\n // never let breadcrumb collection crash user code\n }\n}\n\nexport function getBreadcrumbs(): Breadcrumb[] {\n return [...buffer];\n}\n\nexport function clearBreadcrumbs(): void {\n buffer.length = 0;\n}\n\nfunction stringifyArgs(args: any[]): string {\n const parts: string[] = [];\n for (const a of args) {\n if (a instanceof Error) {\n parts.push(`${a.name}: ${a.message}`);\n } else if (typeof a === 'string') {\n parts.push(a);\n } else if (a == null) {\n parts.push(String(a));\n } else {\n try {\n parts.push(JSON.stringify(a));\n } catch {\n parts.push(String(a));\n }\n }\n }\n const joined = parts.join(' ');\n return joined.length > MAX_MESSAGE_CHARS\n ? joined.slice(0, MAX_MESSAGE_CHARS) + '…'\n : joined;\n}\n","export const SDK_NAME = '@fixprompt/react-native';\nexport const SDK_VERSION = '0.0.3';\n","import type { EventPayload, ResolvedConfig } from './types';\nimport { offlineBuffer } from './buffer';\nimport { getState } from './state';\nimport { getDeviceAttrs } from './device';\nimport { getBreadcrumbs } from './breadcrumbs';\nimport { SDK_NAME, SDK_VERSION } from './version';\n\nconst REQUEST_TIMEOUT_MS = 8_000;\n\n/**\n * Sends one event. On network failure (timeout / 5xx / no-network) the event\n * gets buffered; the buffer drains on the next successful send.\n *\n * Never throws — RN apps don't want their event loop killed by a logger.\n */\nexport function sendEvent(\n config: ResolvedConfig,\n payload: Omit<EventPayload, 'service' | 'app' | 'env' | 'attrs'> & {\n attrs?: Record<string, any>;\n service?: string;\n app?: string;\n env?: string;\n },\n): void {\n const state = getState();\n\n const event: EventPayload = {\n service: payload.service ?? config.service,\n app: payload.app ?? config.app,\n env: payload.env ?? config.env,\n level: payload.level,\n message: payload.message,\n stack: payload.stack,\n attrs: {\n ...(payload.attrs ?? {}),\n ...getDeviceAttrs(),\n sdk: SDK_NAME,\n sdk_version: SDK_VERSION,\n release: config.release,\n session_id: state.sessionId,\n device_id: state.deviceId,\n user_id: state.user?.id,\n user_email: state.user?.email,\n breadcrumbs: getBreadcrumbs(),\n },\n synthetic: payload.synthetic,\n };\n\n // Strip undefined attrs (broker accepts strings/numbers, not nulls/undef)\n for (const k of Object.keys(event.attrs)) {\n if (event.attrs[k] === undefined || event.attrs[k] === null) {\n delete event.attrs[k];\n }\n }\n\n void postOrBuffer(config, event);\n}\n\nasync function postOrBuffer(\n config: ResolvedConfig,\n event: EventPayload,\n): Promise<void> {\n // Always drain the buffer first so order is preserved.\n if (!(await tryPost(config, event, /* throwOnFail */ true))) {\n offlineBuffer.push(event);\n return;\n }\n\n // Successfully delivered this one — try to drain any backlog too.\n if (offlineBuffer.size() === 0) return;\n const queued = await offlineBuffer.drain();\n for (const buffered of queued) {\n if (!(await tryPost(config, buffered, true))) {\n // Re-buffer the rest including this one\n offlineBuffer.push(buffered);\n for (let i = queued.indexOf(buffered) + 1; i < queued.length; i++) {\n offlineBuffer.push(queued[i]);\n }\n return;\n }\n }\n}\n\nasync function tryPost(\n config: ResolvedConfig,\n event: EventPayload,\n throwOnFail: boolean,\n): Promise<boolean> {\n try {\n const ctrl = new AbortController();\n const timer = setTimeout(() => ctrl.abort(), REQUEST_TIMEOUT_MS);\n try {\n const res = await fetch(`${config.endpoint.replace(/\\/$/, '')}/ingest/log`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-loghub-source': config.source,\n 'x-loghub-key': config.projectKey,\n },\n body: JSON.stringify(event),\n signal: ctrl.signal,\n });\n // 4xx → bug on our side; drop, don't buffer\n if (res.status >= 400 && res.status < 500) {\n if (config.debug) {\n // eslint-disable-next-line no-console\n console.warn(`[fixprompt] ${res.status} from broker — dropping event`);\n }\n return true; // \"delivered\" in the sense that we won't re-try\n }\n return res.ok;\n } finally {\n clearTimeout(timer);\n }\n } catch (err) {\n if (config.debug) {\n // eslint-disable-next-line no-console\n console.warn(`[fixprompt] transport error: ${(err as Error).message}`);\n }\n return false;\n }\n}\n","import { sendEvent } from './transport';\nimport type { ResolvedConfig } from './types';\n\n/**\n * Returns the project's user-code stack frame (skips node_modules and the\n * SDK itself). Falls back to the raw stack.\n */\nfunction topStackFrame(stack: string | undefined): string {\n if (!stack) return '';\n for (const raw of stack.split('\\n')) {\n const line = raw.trim();\n if (!line) continue;\n if (line.startsWith('Error')) continue;\n if (/node_modules|@fixprompt/.test(line)) continue;\n return line.slice(0, 200);\n }\n return stack.split('\\n')[0]?.slice(0, 200) ?? '';\n}\n\nexport function installGlobalErrorHandler(config: ResolvedConfig): () => void {\n // ErrorUtils is a React Native global; not present in plain Node tests.\n const ErrorUtils: any = (globalThis as any).ErrorUtils;\n if (!ErrorUtils?.setGlobalHandler) {\n return () => undefined;\n }\n\n const previous = ErrorUtils.getGlobalHandler?.();\n\n const handler = (error: Error, isFatal?: boolean) => {\n try {\n sendEvent(config, {\n level: isFatal ? 'error' : 'warn',\n message: error?.message ?? 'Uncaught error',\n stack: typeof error?.stack === 'string' ? error.stack : undefined,\n attrs: {\n kind: 'rn.globalError',\n severity: isFatal ? 'critical' : 'error',\n error_name: error?.name,\n top_frame: topStackFrame(error?.stack),\n fatal: !!isFatal,\n },\n });\n } catch {\n // never let logger crash propagate\n }\n previous?.(error, isFatal);\n };\n\n ErrorUtils.setGlobalHandler(handler);\n\n return () => {\n if (previous) ErrorUtils.setGlobalHandler(previous);\n };\n}\n\n/**\n * Hook unhandled-promise-rejection tracking. Uses the bundled\n * `promise/setimmediate/rejection-tracking` module that ships with RN.\n */\nexport function installRejectionHandler(config: ResolvedConfig): () => void {\n let tracking: any;\n try {\n // RN's bundled polyfill — present on every RN runtime.\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n tracking = require('promise/setimmediate/rejection-tracking');\n } catch {\n return () => undefined;\n }\n\n tracking.enable({\n allRejections: true,\n onUnhandled: (id: string, error: unknown) => {\n try {\n const isErr = error instanceof Error;\n sendEvent(config, {\n level: 'error',\n message: isErr ? error.message : safeJson(error),\n stack: isErr && typeof error.stack === 'string' ? error.stack : undefined,\n attrs: {\n kind: 'rn.unhandledrejection',\n severity: 'error',\n error_name: isErr ? error.name : typeof error,\n top_frame: isErr ? topStackFrame(error.stack) : '',\n },\n });\n } catch {\n // ignore\n }\n },\n onHandled: () => undefined,\n });\n\n return () => {\n try {\n tracking.disable();\n } catch {\n // ignore\n }\n };\n}\n\nfunction safeJson(v: unknown): string {\n try {\n return JSON.stringify(v);\n } catch {\n return String(v);\n }\n}\n","import { sendEvent } from './transport';\nimport { pushBreadcrumb } from './breadcrumbs';\nimport type { ResolvedConfig } from './types';\n\n/**\n * Patches all four console levels (log / info / warn / error) to push entries\n * into the breadcrumb ring buffer. Forwarding patches below are installed on\n * top of these — they snapshot the buffer BEFORE pushing the current call,\n * so the forwarded event sees the lines that ran before it.\n *\n * No-op-on-failure; never throws.\n */\nexport function patchConsoleForBreadcrumbs(): () => void {\n const originals = {\n log: console.log.bind(console),\n info: console.info.bind(console),\n warn: console.warn.bind(console),\n error: console.error.bind(console),\n };\n\n console.log = (...args: any[]) => {\n pushBreadcrumb('log', args);\n return originals.log(...args);\n };\n console.info = (...args: any[]) => {\n pushBreadcrumb('info', args);\n return originals.info(...args);\n };\n console.warn = (...args: any[]) => {\n pushBreadcrumb('warn', args);\n return originals.warn(...args);\n };\n console.error = (...args: any[]) => {\n pushBreadcrumb('error', args);\n return originals.error(...args);\n };\n\n return () => {\n console.log = originals.log;\n console.info = originals.info;\n console.warn = originals.warn;\n console.error = originals.error;\n };\n}\n\nfunction shouldCapture(args: any[], patterns: RegExp[]): boolean {\n if (patterns.length === 0) return true; // empty list = capture everything\n const first = typeof args[0] === 'string' ? args[0] : '';\n return patterns.some((re) => re.test(first));\n}\n\nfunction stringify(args: any[]): { message: string; stack?: string } {\n const errArg = args.find((a) => a instanceof Error) as Error | undefined;\n const message = args\n .map((a) => {\n if (a instanceof Error) return a.message;\n if (typeof a === 'string') return a;\n try {\n return JSON.stringify(a);\n } catch {\n return String(a);\n }\n })\n .join(' ')\n .slice(0, 4000);\n return {\n message,\n stack: errArg && typeof errArg.stack === 'string' ? errArg.stack : undefined,\n };\n}\n\n/**\n * Wrap console.error so tagged calls forward to the broker as warning-severity\n * events. The original console.error still runs (so RedBox / Metro logs still\n * show up).\n *\n * Pattern is intentional — ProofPix's existing log lines look like\n * `console.error('[Analytics] tracking failure', err)`. Devs prefix their\n * intentional captures and the broker only sees tagged ones.\n */\nexport function patchConsoleError(config: ResolvedConfig): () => void {\n const original = console.error.bind(console);\n console.error = (...args: any[]) => {\n try {\n if (shouldCapture(args, config.captureTags)) {\n const { message, stack } = stringify(args);\n sendEvent(config, {\n level: 'warn',\n message,\n stack,\n attrs: {\n kind: 'console.error',\n severity: 'warning',\n },\n });\n }\n } catch {\n // never block user logs\n }\n return original(...args);\n };\n return () => {\n console.error = original;\n };\n}\n\nexport function patchConsoleWarn(config: ResolvedConfig): () => void {\n const original = console.warn.bind(console);\n console.warn = (...args: any[]) => {\n try {\n if (shouldCapture(args, config.captureTags)) {\n const { message, stack } = stringify(args);\n sendEvent(config, {\n level: 'warn',\n message,\n stack,\n attrs: {\n kind: 'console.warn',\n severity: 'warning',\n },\n });\n }\n } catch {\n // never block\n }\n return original(...args);\n };\n return () => {\n console.warn = original;\n };\n}\n","import { getState, type UserContext } from './state';\nimport { newSessionId, getDeviceId } from './session';\nimport { installGlobalErrorHandler, installRejectionHandler } from './handlers';\nimport {\n patchConsoleError,\n patchConsoleWarn,\n patchConsoleForBreadcrumbs,\n} from './console';\nimport { sendEvent } from './transport';\nimport { offlineBuffer } from './buffer';\nimport { clearBreadcrumbs } from './breadcrumbs';\nimport type { InitOptions, ResolvedConfig } from './types';\n\nconst DEFAULT_ENDPOINT = 'https://geosloghub-production.up.railway.app';\n\nfunction resolveConfig(opts: InitOptions): ResolvedConfig {\n if (!opts?.projectKey) throw new Error('initFixPrompt: projectKey is required');\n if (!opts?.source) throw new Error('initFixPrompt: source is required');\n if (!opts?.service) throw new Error('initFixPrompt: service is required');\n if (!opts?.app) throw new Error('initFixPrompt: app is required');\n\n return {\n projectKey: opts.projectKey,\n source: opts.source,\n endpoint: (opts.endpoint ?? DEFAULT_ENDPOINT).replace(/\\/$/, ''),\n service: opts.service,\n app: opts.app,\n env: opts.env ?? 'prod',\n release: opts.release ?? null,\n captureTags: opts.captureTags ?? [],\n patchConsoleWarn: opts.patchConsoleWarn ?? false,\n patchConsoleError: opts.patchConsoleError ?? true,\n debug: opts.debug ?? false,\n };\n}\n\nexport function initFixPrompt(opts: InitOptions): void {\n const state = getState();\n if (state.initialized) {\n if (opts?.debug) {\n // eslint-disable-next-line no-console\n console.warn('[fixprompt] already initialized — call ignored');\n }\n return;\n }\n\n const config = resolveConfig(opts);\n state.config = config;\n state.sessionId = newSessionId();\n\n // Install breadcrumb capture FIRST so the forwarding patches below wrap\n // these. When ProofPix calls console.warn('[CRM] sync failed'), the\n // captureTags-gated forwarder runs (snapshotting the buffer pre-this-call),\n // then the breadcrumb wrapper pushes the line. Next event ships with this\n // line included.\n state.cleanup.restoreBreadcrumbConsole = patchConsoleForBreadcrumbs();\n\n state.cleanup.removeErrorHandler = installGlobalErrorHandler(config);\n state.cleanup.removeRejectionHandler = installRejectionHandler(config);\n if (config.patchConsoleError) {\n state.cleanup.restoreConsoleError = patchConsoleError(config);\n }\n if (config.patchConsoleWarn) {\n state.cleanup.restoreConsoleWarn = patchConsoleWarn(config);\n }\n\n state.initialized = true;\n\n // Resolve device id + drain any pre-init buffer, async.\n void (async () => {\n try {\n state.deviceId = await getDeviceId();\n await offlineBuffer.load();\n if (offlineBuffer.size() > 0) {\n // Triggers a drain via the transport's natural retry path.\n const items = await offlineBuffer.drain();\n for (const ev of items) {\n // Re-buffer if delivery still fails — transport handles it\n offlineBuffer.push(ev);\n }\n // Kick a drain attempt\n sendEvent(config, {\n level: 'debug',\n message: '[fixprompt] resumed from offline buffer',\n attrs: { kind: 'sdk.startup', buffered: items.length },\n });\n }\n } catch (err) {\n if (config.debug) {\n // eslint-disable-next-line no-console\n console.warn(`[fixprompt] init async setup failed: ${(err as Error).message}`);\n }\n }\n })();\n\n if (config.debug) {\n // eslint-disable-next-line no-console\n console.log('[fixprompt] initialized', {\n endpoint: config.endpoint,\n service: config.service,\n env: config.env,\n session_id: state.sessionId,\n });\n }\n}\n\nexport function captureException(\n err: unknown,\n options: { synthetic?: boolean; attrs?: Record<string, any> } = {},\n): void {\n const state = getState();\n if (!state.initialized || !state.config) return;\n const isErr = err instanceof Error;\n sendEvent(state.config, {\n level: 'error',\n message: isErr ? err.message : String(err),\n stack: isErr && typeof err.stack === 'string' ? err.stack : undefined,\n attrs: {\n kind: 'captureException',\n severity: 'error',\n error_name: isErr ? err.name : typeof err,\n ...(options.attrs ?? {}),\n },\n synthetic: options.synthetic === true,\n });\n}\n\nexport function setUser(user: UserContext | null): void {\n const state = getState();\n state.user = user;\n}\n\n/** Tests + HMR only. Not part of the supported API. @internal */\nexport function _resetForTests(): void {\n const state = getState();\n // Reverse order — forwarding patches were installed AFTER breadcrumbs.\n state.cleanup.restoreConsoleError?.();\n state.cleanup.restoreConsoleWarn?.();\n state.cleanup.restoreBreadcrumbConsole?.();\n state.cleanup.removeErrorHandler?.();\n state.cleanup.removeRejectionHandler?.();\n state.initialized = false;\n state.config = null;\n state.sessionId = null;\n state.deviceId = null;\n state.user = null;\n state.cleanup = {};\n clearBreadcrumbs();\n}\n"],"mappings":"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","names":["Promise","resolve","reject","Promise","id","AsyncStorage"]}
|
package/dist/state.d.ts
CHANGED
package/dist/version.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export declare const SDK_NAME = "@fixprompt/react-native";
|
|
2
|
-
export declare const SDK_VERSION = "0.0.
|
|
2
|
+
export declare const SDK_VERSION = "0.0.3";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fixprompt/react-native",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.3",
|
|
4
4
|
"description": "FixPrompt React Native SDK — captures uncaught JS errors, unhandled promise rejections, and tagged console output; buffers offline; forwards to the FixPrompt broker.",
|
|
5
5
|
"license": "UNLICENSED",
|
|
6
6
|
"repository": {
|
|
@@ -40,7 +40,9 @@
|
|
|
40
40
|
"@react-native-async-storage/async-storage": ">=1.18"
|
|
41
41
|
},
|
|
42
42
|
"peerDependenciesMeta": {
|
|
43
|
-
"expo-secure-store": { "optional": true }
|
|
43
|
+
"expo-secure-store": { "optional": true },
|
|
44
|
+
"expo-constants": { "optional": true },
|
|
45
|
+
"expo-updates": { "optional": true }
|
|
44
46
|
},
|
|
45
47
|
"devDependencies": {
|
|
46
48
|
"@react-native-async-storage/async-storage": "^1.21.0",
|