@pulseboard/react-native 0.3.0 → 0.3.2

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/dist/index.d.mts CHANGED
@@ -46,6 +46,11 @@ type EnrichedContext = {
46
46
  session: SessionContext;
47
47
  user: UserContext;
48
48
  };
49
+ type StorageAdapter = {
50
+ getItem: (key: string) => Promise<string | null>;
51
+ setItem: (key: string, value: string) => Promise<void>;
52
+ removeItem: (key: string) => Promise<void>;
53
+ };
49
54
  type PulseEvent = {
50
55
  apiKey: string;
51
56
  type: EventType;
@@ -55,15 +60,13 @@ type PulseEvent = {
55
60
  context?: EnrichedContext;
56
61
  };
57
62
  type SDKConfig = {
58
- apiKey?: string;
59
- organisation?: string;
60
- product?: string;
61
- project?: string;
63
+ apiKey: string;
62
64
  environment: Environment;
63
65
  debug?: boolean;
64
66
  autoCapture?: boolean;
65
67
  flushInterval?: number;
66
68
  maxQueueSize?: number;
69
+ storage?: StorageAdapter;
67
70
  };
68
71
  type TrackOptions = {
69
72
  payload?: Record<string, unknown>;
@@ -107,9 +110,7 @@ declare class PulseBoardSDK {
107
110
  private logFlushTimer;
108
111
  private originalConsole;
109
112
  private consoleCapturing;
110
- private get apiKey();
111
113
  init(config: SDKConfig): void;
112
- private resolveApiKey;
113
114
  private completeInit;
114
115
  getContext(): Promise<EnrichedContext>;
115
116
  identify(user: UserContext): void;
package/dist/index.d.ts CHANGED
@@ -46,6 +46,11 @@ type EnrichedContext = {
46
46
  session: SessionContext;
47
47
  user: UserContext;
48
48
  };
49
+ type StorageAdapter = {
50
+ getItem: (key: string) => Promise<string | null>;
51
+ setItem: (key: string, value: string) => Promise<void>;
52
+ removeItem: (key: string) => Promise<void>;
53
+ };
49
54
  type PulseEvent = {
50
55
  apiKey: string;
51
56
  type: EventType;
@@ -55,15 +60,13 @@ type PulseEvent = {
55
60
  context?: EnrichedContext;
56
61
  };
57
62
  type SDKConfig = {
58
- apiKey?: string;
59
- organisation?: string;
60
- product?: string;
61
- project?: string;
63
+ apiKey: string;
62
64
  environment: Environment;
63
65
  debug?: boolean;
64
66
  autoCapture?: boolean;
65
67
  flushInterval?: number;
66
68
  maxQueueSize?: number;
69
+ storage?: StorageAdapter;
67
70
  };
68
71
  type TrackOptions = {
69
72
  payload?: Record<string, unknown>;
@@ -107,9 +110,7 @@ declare class PulseBoardSDK {
107
110
  private logFlushTimer;
108
111
  private originalConsole;
109
112
  private consoleCapturing;
110
- private get apiKey();
111
113
  init(config: SDKConfig): void;
112
- private resolveApiKey;
113
114
  private completeInit;
114
115
  getContext(): Promise<EnrichedContext>;
115
116
  identify(user: UserContext): void;
package/dist/index.js CHANGED
@@ -1,11 +1,6 @@
1
1
  'use strict';
2
2
 
3
3
  var reactNative = require('react-native');
4
- var AsyncStorage = require('@react-native-async-storage/async-storage');
5
-
6
- function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
7
-
8
- var AsyncStorage__default = /*#__PURE__*/_interopDefault(AsyncStorage);
9
4
 
10
5
  var __getOwnPropNames = Object.getOwnPropertyNames;
11
6
  var __commonJS = (cb, mod) => function __require() {
@@ -552,40 +547,43 @@ var ContextCollector = class {
552
547
  };
553
548
  }
554
549
  };
550
+
551
+ // src/queue.ts
555
552
  var QUEUE_KEY = "@pulseboard/event_queue";
556
553
  var MAX_QUEUE_SIZE = 100;
557
554
  var EventQueue = class {
558
- constructor(maxSize = MAX_QUEUE_SIZE) {
555
+ constructor(maxSize = MAX_QUEUE_SIZE, storage) {
559
556
  this.memoryQueue = [];
560
557
  this._hydrated = false;
558
+ this.storage = null;
561
559
  this.maxSize = maxSize;
560
+ this.storage = storage ?? null;
562
561
  this.hydrate();
563
562
  }
564
- // ─── Hydrate from storage on init ─────────────────────────────────
565
563
  async hydrate() {
566
564
  try {
567
- const raw = await AsyncStorage__default.default.getItem(QUEUE_KEY);
568
- if (raw) {
569
- const stored = JSON.parse(raw);
570
- this.memoryQueue = stored.slice(0, this.maxSize);
565
+ if (this.storage) {
566
+ const raw = await this.storage.getItem(QUEUE_KEY);
567
+ if (raw) {
568
+ const stored = JSON.parse(raw);
569
+ this.memoryQueue = stored.slice(0, this.maxSize);
570
+ }
571
571
  }
572
572
  } catch {
573
573
  } finally {
574
574
  this._hydrated = true;
575
575
  }
576
576
  }
577
- // ─── Persist to storage ────────────────────────────────────────────
578
577
  async persist() {
579
578
  try {
580
- await AsyncStorage__default.default.setItem(QUEUE_KEY, JSON.stringify(this.memoryQueue));
579
+ if (this.storage) {
580
+ await this.storage.setItem(QUEUE_KEY, JSON.stringify(this.memoryQueue));
581
+ }
581
582
  } catch {
582
583
  }
583
584
  }
584
- // ─── Public API ────────────────────────────────────────────────────
585
585
  enqueue(event) {
586
- if (this.memoryQueue.length >= this.maxSize) {
587
- this.memoryQueue.shift();
588
- }
586
+ if (this.memoryQueue.length >= this.maxSize) this.memoryQueue.shift();
589
587
  this.memoryQueue.push(event);
590
588
  this.persist();
591
589
  }
@@ -606,7 +604,7 @@ var EventQueue = class {
606
604
  async clear() {
607
605
  this.memoryQueue = [];
608
606
  try {
609
- await AsyncStorage__default.default.removeItem(QUEUE_KEY);
607
+ if (this.storage) await this.storage.removeItem(QUEUE_KEY);
610
608
  } catch {
611
609
  }
612
610
  }
@@ -629,62 +627,28 @@ var PulseBoardSDK = class {
629
627
  this.originalConsole = {};
630
628
  this.consoleCapturing = false;
631
629
  }
632
- get apiKey() {
633
- return this.config?.apiKey ?? "";
634
- }
635
630
  // ─── Public API ───────────────────────────────────────────────────
636
631
  init(config) {
637
632
  if (this.initialized) {
638
633
  this.debugLog("SDK already initialized \u2014 skipping");
639
634
  return;
640
635
  }
641
- const hasDirectKey = !!config.apiKey;
642
- const hasIdentifiers = !!(config.organisation && config.product && config.project);
643
- if (!hasDirectKey && !hasIdentifiers) {
644
- throw new Error(
645
- "[PulseBoard] init() requires either apiKey or (organisation + product + project)"
646
- );
636
+ if (!config.apiKey) {
637
+ throw new Error("[PulseBoard] init() requires an apiKey");
647
638
  }
648
639
  this.config = {
649
640
  autoCapture: true,
650
641
  debug: false,
651
642
  flushInterval: 5e3,
652
643
  maxQueueSize: 100,
653
- ...config,
654
- apiKey: config.apiKey ?? ""
655
- // resolved below if using identifiers
644
+ ...config
656
645
  };
657
646
  this.client = new PulseBoardClient(this.PULSEBOARD_API, this.config.debug);
658
- this.queue = new EventQueue(this.config.maxQueueSize);
647
+ this.queue = new EventQueue(this.config.maxQueueSize, this.config.storage);
659
648
  this.contextCollector = new ContextCollector({
660
649
  environment: config.environment
661
650
  });
662
- if (!hasDirectKey && hasIdentifiers) {
663
- this.resolveApiKey(
664
- config.organisation,
665
- config.product,
666
- config.project
667
- );
668
- } else {
669
- this.completeInit();
670
- }
671
- }
672
- async resolveApiKey(organisation, product, project) {
673
- try {
674
- const response = await fetch(
675
- `${this.PULSEBOARD_API}sdk/resolve?organisation=${encodeURIComponent(organisation)}&product=${encodeURIComponent(product)}&project=${encodeURIComponent(project)}`
676
- );
677
- if (!response.ok) {
678
- throw new Error(
679
- `[PulseBoard] Could not resolve project. Check your organisation, product and project values.`
680
- );
681
- }
682
- const data = await response.json();
683
- this.config.apiKey = data.data.apiKey;
684
- this.completeInit();
685
- } catch (err) {
686
- console.error("[PulseBoard] Failed to resolve API key:", err);
687
- }
651
+ this.completeInit();
688
652
  }
689
653
  completeInit() {
690
654
  this.flushTimer = setInterval(
@@ -800,14 +764,14 @@ var PulseBoardSDK = class {
800
764
  async flushLogs() {
801
765
  if (!this.client || !this.config || this.logQueue.length === 0) return;
802
766
  const batch = this.logQueue.splice(0, this.logQueue.length);
803
- await this.client.sendLogBatch(this.apiKey, batch);
767
+ await this.client.sendLogBatch(this.config.apiKey, batch);
804
768
  }
805
769
  // ─── Analytics API ────────────────────────────────────────────────
806
770
  startSession() {
807
771
  this.assertInitialized("startSession");
808
772
  this.contextCollector.collect().then((context) => {
809
773
  this.client.sendAnalytics("session", {
810
- apiKey: this.apiKey,
774
+ apiKey: this.config?.apiKey,
811
775
  sessionId: context.session.sessionId,
812
776
  startedAt: context.session.startedAt,
813
777
  context
@@ -819,7 +783,7 @@ var PulseBoardSDK = class {
819
783
  this.assertInitialized("endSession");
820
784
  this.contextCollector.collect().then((context) => {
821
785
  this.client.sendAnalytics("session", {
822
- apiKey: this.apiKey,
786
+ apiKey: this.config?.apiKey,
823
787
  sessionId: context.session.sessionId,
824
788
  startedAt: context.session.startedAt,
825
789
  endedAt: (/* @__PURE__ */ new Date()).toISOString(),
@@ -834,7 +798,7 @@ var PulseBoardSDK = class {
834
798
  this.assertInitialized("trackScreen");
835
799
  this.contextCollector.collect().then((context) => {
836
800
  this.client.sendAnalytics("screen-view", {
837
- apiKey: this.apiKey,
801
+ apiKey: this.config?.apiKey,
838
802
  screenName,
839
803
  loadTime,
840
804
  sessionId: context.session.sessionId,
@@ -847,7 +811,7 @@ var PulseBoardSDK = class {
847
811
  this.assertInitialized("trackApiCall");
848
812
  this.contextCollector.collect().then((context) => {
849
813
  this.client.sendAnalytics("api-call", {
850
- apiKey: this.apiKey,
814
+ apiKey: this.config?.apiKey,
851
815
  endpoint,
852
816
  httpMethod,
853
817
  statusCode,
@@ -865,7 +829,7 @@ var PulseBoardSDK = class {
865
829
  this.assertInitialized("trackCrash");
866
830
  this.contextCollector.collect().then((context) => {
867
831
  this.client.sendAnalytics("crash", {
868
- apiKey: this.apiKey,
832
+ apiKey: this.config?.apiKey,
869
833
  errorName: error.name,
870
834
  errorMessage: error.message,
871
835
  stackTrace: error.stack ?? "",
@@ -880,7 +844,7 @@ var PulseBoardSDK = class {
880
844
  this.assertInitialized("feedback");
881
845
  this.contextCollector.collect().then((context) => {
882
846
  this.client.sendFeedback({
883
- apiKey: this.apiKey,
847
+ apiKey: this.config?.apiKey,
884
848
  type: options.type ?? "general",
885
849
  message,
886
850
  meta: options.meta,
@@ -935,7 +899,7 @@ var PulseBoardSDK = class {
935
899
  buildAndEnqueue(type, name, payload, timestamp) {
936
900
  this.contextCollector.collect().then((context) => {
937
901
  const event = {
938
- apiKey: this.apiKey,
902
+ apiKey: this.config?.apiKey,
939
903
  type,
940
904
  name,
941
905
  payload,
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/auto-capture.ts","../src/client.ts","../src/specs/NativePulseBoardDevice.ts","../src/specs/NativePulseBoardNetwork.ts","../src/context.ts","../src/queue.ts","../src/index.ts"],"names":["exports","Promise","resolve","reject","id","TurboModuleRegistry","I18nManager","Dimensions","Platform","AsyncStorage"],"mappings":"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","file":"index.js","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}","type ErrorHandler = (\n name: string,\n error: Error,\n context?: Record<string, unknown>,\n) => void;\n\nexport class AutoCapture {\n private handler: ErrorHandler;\n private attached: boolean = false;\n private previousHandler: ((error: Error, isFatal?: boolean) => void) | null =\n null;\n\n constructor(handler: ErrorHandler) {\n this.handler = handler;\n }\n\n attach(): void {\n if (this.attached) return;\n\n // React Native's global error handler - catches all unhandled JS errors\n this.previousHandler = ErrorUtils.getGlobalHandler();\n\n ErrorUtils.setGlobalHandler((error: Error, isFatal?: boolean) => {\n this.handler(\"uncaughtException\", error, { isFatal: isFatal ?? false });\n\n // Always call the previous handler (React Native's default crash reporter)\n if (this.previousHandler) {\n this.previousHandler(error, isFatal);\n }\n });\n\n // Unhandled promise rejections\n const tracking = require(\"promise/setimmediate/rejection-tracking\");\n tracking.enable({\n allRejections: true,\n onUnhandled: (_id: number, error: unknown) => {\n const err = error instanceof Error ? error : new Error(String(error));\n this.handler(\"unhandledRejection\", err, { fatal: false });\n },\n });\n\n this.attached = true;\n }\n\n detach(): void {\n if (!this.attached) return;\n\n // Restore the previous error handler\n if (this.previousHandler) {\n ErrorUtils.setGlobalHandler(this.previousHandler);\n this.previousHandler = null;\n }\n\n this.attached = false;\n }\n}\n","import { LogEntry, PulseEvent } from \"./types\";\n\ntype AnalyticsType = \"crash\" | \"session\" | \"screen-view\" | \"api-call\";\n\nexport class PulseBoardClient {\n private host: string;\n private debug: boolean;\n\n constructor(host: string, debug = false) {\n this.host = host.replace(/\\/$/, \"\");\n this.debug = debug;\n }\n\n // ─── Event Ingest ─────────────────────────────────────────────────\n\n async send(event: PulseEvent): Promise<boolean> {\n try {\n const response = await fetch(`${this.host}/ingest`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(event),\n });\n\n if (!response.ok) {\n this.log(\n `Failed to send event: ${response.status} ${response.statusText}`,\n );\n return false;\n }\n\n this.log(`Event sent: ${event.type} — ${event.name}`);\n return true;\n } catch (err) {\n this.log(`Network error sending event: ${err}`);\n return false;\n }\n }\n\n async sendBatch(events: PulseEvent[]): Promise<boolean> {\n const chunks = this.chunk(events, 5);\n\n for (const chunk of chunks) {\n await Promise.all(chunk.map((e) => this.send(e)));\n }\n\n return true;\n }\n\n // ─── Analytics Ingest ─────────────────────────────────────────────\n\n async sendAnalytics(\n type: AnalyticsType,\n payload: Record<string, unknown>,\n ): Promise<boolean> {\n try {\n const response = await fetch(`${this.host}/analytics/${type}`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n this.log(\n `Failed to send analytics: ${response.status} ${response.statusText}`,\n );\n return false;\n }\n\n this.log(`Analytics sent: ${type}`);\n return true;\n } catch (err) {\n this.log(`Network error sending analytics: ${err}`);\n return false;\n }\n }\n\n // ─── Log Entry ─────────────────────────────────────────────\n\n async sendLog(entry: LogEntry): Promise<boolean> {\n try {\n const response = await fetch(`${this.host}/logs`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(entry),\n });\n if (!response.ok) {\n this.log(`Failed to send log: ${response.status}`);\n return false;\n }\n return true;\n } catch (err) {\n this.log(`Network error sending log: ${err}`);\n return false;\n }\n }\n\n async sendLogBatch(\n apiKey: string,\n logs: Omit<LogEntry, \"apiKey\">[],\n ): Promise<boolean> {\n try {\n const response = await fetch(`${this.host}/logs/batch`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ apiKey, logs }),\n });\n if (!response.ok) {\n this.log(`Failed to send log batch: ${response.status}`);\n return false;\n }\n return true;\n } catch (err) {\n this.log(`Network error sending log batch: ${err}`);\n return false;\n }\n }\n\n // ─── Feedback ─────────────────────────────────────────────────────\n\n async sendFeedback(payload: Record<string, unknown>): Promise<boolean> {\n try {\n const response = await fetch(`${this.host}/feedback`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(payload),\n });\n if (!response.ok) {\n this.log(`Failed to send feedback: ${response.status}`);\n return false;\n }\n this.log(\"Feedback sent\");\n return true;\n } catch (err) {\n this.log(`Network error sending feedback: ${err}`);\n return false;\n }\n }\n\n // ─── Private ──────────────────────────────────────────────────────\n\n private chunk<T>(arr: T[], size: number): T[][] {\n return Array.from({ length: Math.ceil(arr.length / size) }, (_, i) =>\n arr.slice(i * size, i * size + size),\n );\n }\n\n private log(message: string): void {\n if (this.debug) {\n console.log(`[PulseBoard] ${message}`);\n }\n }\n}\n","import type { TurboModule } from \"react-native\";\nimport { TurboModuleRegistry } from \"react-native\";\n\nexport type DeviceInfo = {\n model: string;\n manufacturer: string;\n brand: string;\n os: string;\n osVersion: string;\n appVersion: string;\n buildNumber: string;\n bundleId: string;\n screenWidth: number;\n screenHeight: number;\n isTablet: boolean;\n isEmulator: boolean;\n};\n\nexport interface Spec extends TurboModule {\n getDeviceInfo(): Promise<DeviceInfo>;\n}\n\nexport default TurboModuleRegistry.getEnforcing<Spec>(\"PulseBoardDevice\");\n","import type { TurboModule } from \"react-native\";\nimport { TurboModuleRegistry } from \"react-native\";\n\nexport type NetowrkInfo = {\n type: string;\n isConnected: boolean;\n isWifiEnabled: boolean;\n carrier: string;\n ipAddress: string;\n};\n\nexport interface Spec extends TurboModule {\n getNetworkInfo(): Promise<NetowrkInfo>;\n}\n\nexport default TurboModuleRegistry.getEnforcing<Spec>(\"PulseBoardNetwork\");\n","import { Dimensions, I18nManager, Platform } from \"react-native\";\nimport NativePulseBoardDevice from \"./specs/NativePulseBoardDevice\";\nimport NativePulseBoardNetwork from \"./specs/NativePulseBoardNetwork\";\nimport {\n AppContext,\n DeviceContext,\n EnrichedContext,\n NetworkContext,\n NetworkType,\n SessionContext,\n UserContext,\n} from \"./types\";\n\nfunction generateSessionId(): string {\n const timestamp = Date.now().toString(36);\n const random = Math.random().toString(36).substring(2, 10);\n return `${timestamp}-${random}`;\n}\n\nfunction mapNetworkType(type: string): NetworkType {\n switch (type) {\n case \"wifi\":\n return \"wifi\";\n case \"cellular\":\n return \"cellular\";\n case \"offline\":\n return \"offline\";\n default:\n return \"unknown\";\n }\n}\n\nfunction getTimezone(): string {\n try {\n return Intl.DateTimeFormat().resolvedOptions().timeZone;\n } catch {\n return \"unknown\";\n }\n}\n\nfunction getLanguage(): string {\n try {\n return (\n I18nManager.getConstants?.()?.localeIdentifier?.replace(\"_\", \"-\") ??\n Intl.DateTimeFormat().resolvedOptions().locale ??\n \"unknown\"\n );\n } catch {\n return \"unknown\";\n }\n}\n\nexport class ContextCollector {\n private sessionContext: SessionContext;\n private appContext: AppContext;\n private userContext: UserContext = {};\n\n constructor(appContext: AppContext = {}) {\n this.appContext = appContext;\n this.sessionContext = {\n sessionId: generateSessionId(),\n startedAt: new Date().toISOString(),\n };\n }\n\n identify(user: UserContext): void {\n this.userContext = { ...this.userContext, ...user };\n }\n\n clearUser(): void {\n this.userContext = {};\n }\n\n async collect(): Promise<EnrichedContext> {\n const { width, height } = Dimensions.get(\"window\");\n\n // Collect device info — fall back gracefully if native module unavailable\n let deviceInfo = null;\n let networkInfo = null;\n\n try {\n if (NativePulseBoardDevice) {\n deviceInfo = await NativePulseBoardDevice.getDeviceInfo();\n }\n } catch (e) {\n console.warn(\"[PulseBoard] Failed to collect device info:\", e);\n }\n\n try {\n if (NativePulseBoardNetwork) {\n networkInfo = await NativePulseBoardNetwork.getNetworkInfo();\n }\n } catch (e) {\n console.warn(\"[PulseBoard] Failed to collect network info:\", e);\n }\n\n const device: DeviceContext = {\n platform: Platform.OS === \"ios\" ? \"ios\" : \"android\",\n os: deviceInfo?.os ?? (Platform.OS === \"ios\" ? \"iOS\" : \"Android\"),\n osVersion:\n deviceInfo?.osVersion ?? Platform.Version?.toString() ?? \"unknown\",\n model: deviceInfo?.model ?? \"unknown\",\n manufacturer: deviceInfo?.manufacturer ?? \"unknown\",\n brand: deviceInfo?.brand ?? \"unknown\",\n isTablet: deviceInfo?.isTablet ?? false,\n appVersion: deviceInfo?.appVersion ?? \"unknown\",\n buildNumber: deviceInfo?.buildNumber ?? \"unknown\",\n bundleId: deviceInfo?.bundleId ?? \"unknown\",\n screenWidth: deviceInfo?.screenWidth ?? width,\n screenHeight: deviceInfo?.screenHeight ?? height,\n fontScale: Dimensions.get(\"window\").fontScale ?? 1,\n isEmulator: deviceInfo?.isEmulator ?? false,\n language: getLanguage(),\n timezone: getTimezone(),\n };\n\n const network: NetworkContext = {\n type: mapNetworkType(networkInfo?.type ?? \"unknown\"),\n isConnected: networkInfo?.isConnected ?? false,\n isWifiEnabled: networkInfo?.isWifiEnabled ?? false,\n carrier: networkInfo?.carrier ?? \"unknown\",\n ipAddress: networkInfo?.ipAddress ?? \"unknown\",\n };\n\n return {\n app: this.appContext,\n device,\n network,\n session: this.sessionContext,\n user: this.userContext,\n };\n }\n}\n","import AsyncStorage from \"@react-native-async-storage/async-storage\";\nimport { PulseEvent } from \"./types\";\n\nconst QUEUE_KEY = \"@pulseboard/event_queue\";\nconst MAX_QUEUE_SIZE = 100;\n\nexport class EventQueue {\n private memoryQueue: PulseEvent[] = [];\n private maxSize: number;\n private _hydrated: boolean = false;\n\n constructor(maxSize = MAX_QUEUE_SIZE) {\n this.maxSize = maxSize;\n this.hydrate();\n }\n\n // ─── Hydrate from storage on init ─────────────────────────────────\n\n private async hydrate(): Promise<void> {\n try {\n const raw = await AsyncStorage.getItem(QUEUE_KEY);\n if (raw) {\n const stored = JSON.parse(raw) as PulseEvent[];\n this.memoryQueue = stored.slice(0, this.maxSize);\n }\n } catch {\n // Storage unavailable — fall back to in-memory only\n } finally {\n this._hydrated = true;\n }\n }\n\n // ─── Persist to storage ────────────────────────────────────────────\n\n private async persist(): Promise<void> {\n try {\n await AsyncStorage.setItem(QUEUE_KEY, JSON.stringify(this.memoryQueue));\n } catch {\n // Non-fatal — events still in memory\n }\n }\n\n // ─── Public API ────────────────────────────────────────────────────\n\n enqueue(event: PulseEvent): void {\n if (this.memoryQueue.length >= this.maxSize) {\n this.memoryQueue.shift(); // Drop oldest\n }\n this.memoryQueue.push(event);\n this.persist();\n }\n\n dequeue(count: number): PulseEvent[] {\n const batch = this.memoryQueue.splice(0, count);\n this.persist();\n return batch;\n }\n\n get size(): number {\n return this.memoryQueue.length;\n }\n\n get isEmpty(): boolean {\n return this.memoryQueue.length === 0;\n }\n\n get hydrated(): boolean {\n return this._hydrated;\n }\n\n async clear(): Promise<void> {\n this.memoryQueue = [];\n try {\n await AsyncStorage.removeItem(QUEUE_KEY);\n } catch {\n // Non-fatal\n }\n }\n}\n","import { AutoCapture } from \"./auto-capture\";\nimport { PulseBoardClient } from \"./client\";\nimport { ContextCollector } from \"./context\";\nimport { EventQueue } from \"./queue\";\nimport {\n CaptureErrorOptions,\n EnrichedContext,\n FeedbackOptions,\n LogEntry,\n LogLevel,\n LogOptions,\n PulseEvent,\n SDKConfig,\n TrackOptions,\n UserContext,\n} from \"./types\";\n\nclass PulseBoardSDK {\n private config: SDKConfig | null = null;\n private client: PulseBoardClient | null = null;\n private queue: EventQueue | null = null;\n private autoCapture: AutoCapture | null = null;\n private contextCollector: ContextCollector | null = null;\n private flushTimer: ReturnType<typeof setInterval> | null = null;\n private initialized: boolean = false;\n private readonly PULSEBOARD_API: string =\n \"https://pulseboard-production.up.railway.app/\";\n\n // ─── Log queue ────────────────────────────────────────────────────\n private logQueue: Omit<LogEntry, \"apiKey\">[] = [];\n private logFlushTimer: ReturnType<typeof setInterval> | null = null;\n private originalConsole: Partial<typeof console> = {};\n private consoleCapturing: boolean = false;\n\n private get apiKey(): string {\n return this.config?.apiKey ?? \"\";\n }\n\n // ─── Public API ───────────────────────────────────────────────────\n\n init(config: SDKConfig): void {\n if (this.initialized) {\n this.debugLog(\"SDK already initialized — skipping\");\n return;\n }\n\n // Validate config\n const hasDirectKey = !!config.apiKey;\n const hasIdentifiers = !!(\n config.organisation &&\n config.product &&\n config.project\n );\n\n if (!hasDirectKey && !hasIdentifiers) {\n throw new Error(\n \"[PulseBoard] init() requires either apiKey or (organisation + product + project)\",\n );\n }\n\n this.config = {\n autoCapture: true,\n debug: false,\n flushInterval: 5000,\n maxQueueSize: 100,\n ...config,\n apiKey: config.apiKey ?? \"\", // resolved below if using identifiers\n };\n\n this.client = new PulseBoardClient(this.PULSEBOARD_API, this.config.debug);\n this.queue = new EventQueue(this.config.maxQueueSize);\n this.contextCollector = new ContextCollector({\n environment: config.environment,\n });\n\n // Resolve API key from identifiers if not provided directly\n if (!hasDirectKey && hasIdentifiers) {\n this.resolveApiKey(\n config.organisation!,\n config.product!,\n config.project!,\n );\n } else {\n this.completeInit();\n }\n }\n\n private async resolveApiKey(\n organisation: string,\n product: string,\n project: string,\n ): Promise<void> {\n try {\n const response = await fetch(\n `${this.PULSEBOARD_API}sdk/resolve?organisation=${encodeURIComponent(organisation)}&product=${encodeURIComponent(product)}&project=${encodeURIComponent(project)}`,\n );\n\n if (!response.ok) {\n throw new Error(\n `[PulseBoard] Could not resolve project. Check your organisation, product and project values.`,\n );\n }\n\n const data = (await response.json()) as {\n success: boolean;\n data: { apiKey: string };\n };\n this.config!.apiKey = data.data.apiKey;\n this.completeInit();\n } catch (err) {\n console.error(\"[PulseBoard] Failed to resolve API key:\", err);\n }\n }\n\n private completeInit(): void {\n this.flushTimer = setInterval(\n () => this.flush(),\n this.config!.flushInterval,\n );\n\n if (this.config!.autoCapture) {\n this.autoCapture = new AutoCapture((name, error, context) => {\n this.captureError(error, { payload: context });\n });\n this.autoCapture.attach();\n }\n\n this.initialized = true;\n this.debugLog(`Initialized — host: ${this.PULSEBOARD_API}`);\n }\n\n async getContext(): Promise<EnrichedContext> {\n this.assertInitialized(\"getContext\");\n return this.contextCollector!.collect();\n }\n\n identify(user: UserContext): void {\n this.assertInitialized(\"identify\");\n this.contextCollector!.identify(user);\n this.debugLog(`User identified: ${JSON.stringify(user)}`);\n }\n\n clearUser(): void {\n this.assertInitialized(\"clearUser\");\n this.contextCollector!.clearUser();\n }\n\n track(name: string, options: TrackOptions = {}): void {\n this.assertInitialized(\"track\");\n this.buildAndEnqueue(\n \"event\",\n name,\n options.payload ?? {},\n options.timestamp,\n );\n }\n\n metric(name: string, value: number, options: TrackOptions = {}): void {\n this.assertInitialized(\"metric\");\n this.buildAndEnqueue(\n \"metric\",\n name,\n { value, ...options.payload },\n options.timestamp,\n );\n }\n\n captureError(error: Error, options: CaptureErrorOptions = {}): void {\n this.assertInitialized(\"captureError\");\n this.buildAndEnqueue(\"error\", error.name ?? \"UnknownError\", {\n message: error.message,\n stack: error.stack,\n ...options.payload,\n });\n }\n\n // ─── Logging API ──────────────────────────────────────────────────\n\n log(level: LogLevel, message: string, options: LogOptions = {}): void {\n this.assertInitialized(\"log\");\n this.contextCollector!.collect()\n .then((context) => {\n this.logQueue.push({\n level,\n message,\n meta: options.meta,\n sessionId: context.session.sessionId,\n appVersion: context.device.appVersion,\n timestamp: new Date().toISOString(),\n });\n\n // Flush immediately for errors\n if (level === \"error\") this.flushLogs();\n })\n .catch(() => {});\n }\n\n captureConsole(): void {\n this.assertInitialized(\"captureConsole\");\n if (this.consoleCapturing) return;\n\n this.originalConsole = {\n log: console.log,\n warn: console.warn,\n error: console.error,\n debug: console.debug,\n };\n\n console.log = (...args: unknown[]) => {\n this.originalConsole.log?.(...args);\n this.log(\"info\", args.map(String).join(\" \"));\n };\n\n console.warn = (...args: unknown[]) => {\n this.originalConsole.warn?.(...args);\n this.log(\"warn\", args.map(String).join(\" \"));\n };\n\n console.error = (...args: unknown[]) => {\n this.originalConsole.error?.(...args);\n this.log(\"error\", args.map(String).join(\" \"));\n };\n\n console.debug = (...args: unknown[]) => {\n this.originalConsole.debug?.(...args);\n this.log(\"debug\", args.map(String).join(\" \"));\n };\n\n this.logFlushTimer = setInterval(() => this.flushLogs(), 10000);\n this.consoleCapturing = true;\n this.debugLog(\"Console capture enabled\");\n }\n\n releaseConsole(): void {\n if (!this.consoleCapturing) return;\n\n if (this.originalConsole.log) console.log = this.originalConsole.log;\n if (this.originalConsole.warn) console.warn = this.originalConsole.warn;\n if (this.originalConsole.error) console.error = this.originalConsole.error;\n if (this.originalConsole.debug) console.debug = this.originalConsole.debug;\n\n if (this.logFlushTimer) {\n clearInterval(this.logFlushTimer);\n this.logFlushTimer = null;\n }\n\n this.originalConsole = {};\n this.consoleCapturing = false;\n }\n\n async flushLogs(): Promise<void> {\n if (!this.client || !this.config || this.logQueue.length === 0) return;\n const batch = this.logQueue.splice(0, this.logQueue.length);\n await this.client.sendLogBatch(this.apiKey, batch);\n }\n\n // ─── Analytics API ────────────────────────────────────────────────\n\n startSession(): void {\n this.assertInitialized(\"startSession\");\n this.contextCollector!.collect()\n .then((context) => {\n this.client!.sendAnalytics(\"session\", {\n apiKey: this.apiKey,\n sessionId: context.session.sessionId,\n startedAt: context.session.startedAt,\n context,\n });\n this.debugLog(`Session started: ${context.session.sessionId}`);\n })\n .catch((err) => this.debugLog(`Failed to start session: ${err}`));\n }\n\n endSession(duration?: number): void {\n this.assertInitialized(\"endSession\");\n this.contextCollector!.collect()\n .then((context) => {\n this.client!.sendAnalytics(\"session\", {\n apiKey: this.apiKey,\n sessionId: context.session.sessionId,\n startedAt: context.session.startedAt,\n endedAt: new Date().toISOString(),\n duration,\n context,\n });\n this.flush();\n this.debugLog(`Session ended: ${context.session.sessionId}`);\n })\n .catch((err) => this.debugLog(`Failed to end session: ${err}`));\n }\n\n trackScreen(screenName: string, loadTime?: number): void {\n this.assertInitialized(\"trackScreen\");\n this.contextCollector!.collect()\n .then((context) => {\n this.client!.sendAnalytics(\"screen-view\", {\n apiKey: this.apiKey,\n screenName,\n loadTime,\n sessionId: context.session.sessionId,\n context,\n });\n this.debugLog(`Screen tracked: ${screenName}`);\n })\n .catch((err) => this.debugLog(`Failed to track screen: ${err}`));\n }\n\n trackApiCall(\n endpoint: string,\n httpMethod: string,\n statusCode: number,\n duration: number,\n payloadSize?: number,\n ): void {\n this.assertInitialized(\"trackApiCall\");\n this.contextCollector!.collect()\n .then((context) => {\n this.client!.sendAnalytics(\"api-call\", {\n apiKey: this.apiKey,\n endpoint,\n httpMethod,\n statusCode,\n duration,\n payloadSize,\n sessionId: context.session.sessionId,\n context,\n });\n this.debugLog(\n `API call tracked: ${httpMethod} ${endpoint} ${statusCode}`,\n );\n })\n .catch((err) => this.debugLog(`Failed to track API call: ${err}`));\n }\n\n trackCrash(error: Error, isFatal = false): void {\n this.assertInitialized(\"trackCrash\");\n this.contextCollector!.collect()\n .then((context) => {\n this.client!.sendAnalytics(\"crash\", {\n apiKey: this.apiKey,\n errorName: error.name,\n errorMessage: error.message,\n stackTrace: error.stack ?? \"\",\n isFatal,\n sessionId: context.session.sessionId,\n context,\n });\n this.debugLog(`Crash tracked: ${error.name} — fatal: ${isFatal}`);\n })\n .catch((err) => this.debugLog(`Failed to track crash: ${err}`));\n }\n\n feedback(message: string, options: FeedbackOptions = {}): void {\n this.assertInitialized(\"feedback\");\n this.contextCollector!.collect()\n .then((context) => {\n this.client!.sendFeedback({\n apiKey: this.apiKey,\n type: options.type ?? \"general\",\n message,\n meta: options.meta,\n userEmail: options.userEmail,\n userName: options.userName,\n screenshot: options.screenshot,\n sessionId: context.session.sessionId,\n appVersion: context.device.appVersion,\n });\n this.debugLog(`Feedback sent: ${options.type ?? \"general\"}`);\n })\n .catch((err) => this.debugLog(`Failed to send feedback: ${err}`));\n }\n\n // ─── Flush & Destroy ──────────────────────────────────────────────\n\n async flush(): Promise<void> {\n if (!this.queue || !this.client) return;\n\n // Wait up to 500ms for hydration before first flush\n if (!this.queue.hydrated) {\n await new Promise<void>((resolve) => {\n const interval = setInterval(() => {\n if (this.queue?.hydrated) {\n clearInterval(interval);\n resolve();\n }\n }, 50);\n setTimeout(() => {\n clearInterval(interval);\n resolve();\n }, 500);\n });\n }\n\n if (this.queue.isEmpty) return;\n\n const events = this.queue.dequeue(10);\n this.debugLog(`Flushing ${events.length} event(s)`);\n await this.client.sendBatch(events);\n }\n\n destroy(): void {\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n this.flushTimer = null;\n }\n\n this.releaseConsole();\n this.autoCapture?.detach();\n this.queue?.clear();\n this.logQueue = [];\n\n this.initialized = false;\n this.config = null;\n this.client = null;\n this.queue = null;\n this.contextCollector = null;\n\n this.debugLog(\"SDK destroyed\");\n }\n\n // ─── Private ──────────────────────────────────────────────────────\n\n private buildAndEnqueue(\n type: \"event\" | \"metric\" | \"error\",\n name: string,\n payload: Record<string, unknown>,\n timestamp?: string,\n ): void {\n this.contextCollector!.collect()\n .then((context) => {\n const event: PulseEvent = {\n apiKey: this.apiKey,\n type,\n name,\n payload,\n timestamp: timestamp ?? new Date().toISOString(),\n context,\n };\n this.queue!.enqueue(event);\n this.debugLog(`Queued: ${type} — ${name}`);\n if (type === \"error\") this.flush();\n })\n .catch((err) => this.debugLog(`Failed to collect context: ${err}`));\n }\n\n private assertInitialized(method: string): void {\n if (!this.initialized) {\n throw new Error(`PulseBoard.${method}() called before PulseBoard.init()`);\n }\n }\n\n private debugLog(message: string): void {\n if (this.config?.debug) {\n console.log(`[PulseBoard] ${message}`);\n }\n }\n}\n\nexport const PulseBoard = new PulseBoardSDK();\n\nexport type {\n AppContext,\n CaptureErrorOptions,\n DeviceContext,\n EnrichedContext,\n EventType,\n LogEntry,\n LogLevel,\n LogOptions,\n NetworkContext,\n PulseEvent,\n SDKConfig,\n SessionContext,\n TrackOptions,\n UserContext,\n} from \"./types\";\n"]}
1
+ {"version":3,"sources":["../node_modules/promise/setimmediate/core.js","../node_modules/promise/setimmediate/rejection-tracking.js","../src/auto-capture.ts","../src/client.ts","../src/specs/NativePulseBoardDevice.ts","../src/specs/NativePulseBoardNetwork.ts","../src/context.ts","../src/queue.ts","../src/index.ts"],"names":["exports","Promise","resolve","reject","id","TurboModuleRegistry","I18nManager","Dimensions","Platform"],"mappings":"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","file":"index.js","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}","type ErrorHandler = (\n name: string,\n error: Error,\n context?: Record<string, unknown>,\n) => void;\n\nexport class AutoCapture {\n private handler: ErrorHandler;\n private attached: boolean = false;\n private previousHandler: ((error: Error, isFatal?: boolean) => void) | null =\n null;\n\n constructor(handler: ErrorHandler) {\n this.handler = handler;\n }\n\n attach(): void {\n if (this.attached) return;\n\n // React Native's global error handler - catches all unhandled JS errors\n this.previousHandler = ErrorUtils.getGlobalHandler();\n\n ErrorUtils.setGlobalHandler((error: Error, isFatal?: boolean) => {\n this.handler(\"uncaughtException\", error, { isFatal: isFatal ?? false });\n\n // Always call the previous handler (React Native's default crash reporter)\n if (this.previousHandler) {\n this.previousHandler(error, isFatal);\n }\n });\n\n // Unhandled promise rejections\n const tracking = require(\"promise/setimmediate/rejection-tracking\");\n tracking.enable({\n allRejections: true,\n onUnhandled: (_id: number, error: unknown) => {\n const err = error instanceof Error ? error : new Error(String(error));\n this.handler(\"unhandledRejection\", err, { fatal: false });\n },\n });\n\n this.attached = true;\n }\n\n detach(): void {\n if (!this.attached) return;\n\n // Restore the previous error handler\n if (this.previousHandler) {\n ErrorUtils.setGlobalHandler(this.previousHandler);\n this.previousHandler = null;\n }\n\n this.attached = false;\n }\n}\n","import { LogEntry, PulseEvent } from \"./types\";\n\ntype AnalyticsType = \"crash\" | \"session\" | \"screen-view\" | \"api-call\";\n\nexport class PulseBoardClient {\n private host: string;\n private debug: boolean;\n\n constructor(host: string, debug = false) {\n this.host = host.replace(/\\/$/, \"\");\n this.debug = debug;\n }\n\n // ─── Event Ingest ─────────────────────────────────────────────────\n\n async send(event: PulseEvent): Promise<boolean> {\n try {\n const response = await fetch(`${this.host}/ingest`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(event),\n });\n\n if (!response.ok) {\n this.log(\n `Failed to send event: ${response.status} ${response.statusText}`,\n );\n return false;\n }\n\n this.log(`Event sent: ${event.type} — ${event.name}`);\n return true;\n } catch (err) {\n this.log(`Network error sending event: ${err}`);\n return false;\n }\n }\n\n async sendBatch(events: PulseEvent[]): Promise<boolean> {\n const chunks = this.chunk(events, 5);\n\n for (const chunk of chunks) {\n await Promise.all(chunk.map((e) => this.send(e)));\n }\n\n return true;\n }\n\n // ─── Analytics Ingest ─────────────────────────────────────────────\n\n async sendAnalytics(\n type: AnalyticsType,\n payload: Record<string, unknown>,\n ): Promise<boolean> {\n try {\n const response = await fetch(`${this.host}/analytics/${type}`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n this.log(\n `Failed to send analytics: ${response.status} ${response.statusText}`,\n );\n return false;\n }\n\n this.log(`Analytics sent: ${type}`);\n return true;\n } catch (err) {\n this.log(`Network error sending analytics: ${err}`);\n return false;\n }\n }\n\n // ─── Log Entry ─────────────────────────────────────────────\n\n async sendLog(entry: LogEntry): Promise<boolean> {\n try {\n const response = await fetch(`${this.host}/logs`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(entry),\n });\n if (!response.ok) {\n this.log(`Failed to send log: ${response.status}`);\n return false;\n }\n return true;\n } catch (err) {\n this.log(`Network error sending log: ${err}`);\n return false;\n }\n }\n\n async sendLogBatch(\n apiKey: string,\n logs: Omit<LogEntry, \"apiKey\">[],\n ): Promise<boolean> {\n try {\n const response = await fetch(`${this.host}/logs/batch`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ apiKey, logs }),\n });\n if (!response.ok) {\n this.log(`Failed to send log batch: ${response.status}`);\n return false;\n }\n return true;\n } catch (err) {\n this.log(`Network error sending log batch: ${err}`);\n return false;\n }\n }\n\n // ─── Feedback ─────────────────────────────────────────────────────\n\n async sendFeedback(payload: Record<string, unknown>): Promise<boolean> {\n try {\n const response = await fetch(`${this.host}/feedback`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(payload),\n });\n if (!response.ok) {\n this.log(`Failed to send feedback: ${response.status}`);\n return false;\n }\n this.log(\"Feedback sent\");\n return true;\n } catch (err) {\n this.log(`Network error sending feedback: ${err}`);\n return false;\n }\n }\n\n // ─── Private ──────────────────────────────────────────────────────\n\n private chunk<T>(arr: T[], size: number): T[][] {\n return Array.from({ length: Math.ceil(arr.length / size) }, (_, i) =>\n arr.slice(i * size, i * size + size),\n );\n }\n\n private log(message: string): void {\n if (this.debug) {\n console.log(`[PulseBoard] ${message}`);\n }\n }\n}\n","import type { TurboModule } from \"react-native\";\nimport { TurboModuleRegistry } from \"react-native\";\n\nexport type DeviceInfo = {\n model: string;\n manufacturer: string;\n brand: string;\n os: string;\n osVersion: string;\n appVersion: string;\n buildNumber: string;\n bundleId: string;\n screenWidth: number;\n screenHeight: number;\n isTablet: boolean;\n isEmulator: boolean;\n};\n\nexport interface Spec extends TurboModule {\n getDeviceInfo(): Promise<DeviceInfo>;\n}\n\nexport default TurboModuleRegistry.getEnforcing<Spec>(\"PulseBoardDevice\");\n","import type { TurboModule } from \"react-native\";\nimport { TurboModuleRegistry } from \"react-native\";\n\nexport type NetowrkInfo = {\n type: string;\n isConnected: boolean;\n isWifiEnabled: boolean;\n carrier: string;\n ipAddress: string;\n};\n\nexport interface Spec extends TurboModule {\n getNetworkInfo(): Promise<NetowrkInfo>;\n}\n\nexport default TurboModuleRegistry.getEnforcing<Spec>(\"PulseBoardNetwork\");\n","import { Dimensions, I18nManager, Platform } from \"react-native\";\nimport NativePulseBoardDevice from \"./specs/NativePulseBoardDevice\";\nimport NativePulseBoardNetwork from \"./specs/NativePulseBoardNetwork\";\nimport {\n AppContext,\n DeviceContext,\n EnrichedContext,\n NetworkContext,\n NetworkType,\n SessionContext,\n UserContext,\n} from \"./types\";\n\nfunction generateSessionId(): string {\n const timestamp = Date.now().toString(36);\n const random = Math.random().toString(36).substring(2, 10);\n return `${timestamp}-${random}`;\n}\n\nfunction mapNetworkType(type: string): NetworkType {\n switch (type) {\n case \"wifi\":\n return \"wifi\";\n case \"cellular\":\n return \"cellular\";\n case \"offline\":\n return \"offline\";\n default:\n return \"unknown\";\n }\n}\n\nfunction getTimezone(): string {\n try {\n return Intl.DateTimeFormat().resolvedOptions().timeZone;\n } catch {\n return \"unknown\";\n }\n}\n\nfunction getLanguage(): string {\n try {\n return (\n I18nManager.getConstants?.()?.localeIdentifier?.replace(\"_\", \"-\") ??\n Intl.DateTimeFormat().resolvedOptions().locale ??\n \"unknown\"\n );\n } catch {\n return \"unknown\";\n }\n}\n\nexport class ContextCollector {\n private sessionContext: SessionContext;\n private appContext: AppContext;\n private userContext: UserContext = {};\n\n constructor(appContext: AppContext = {}) {\n this.appContext = appContext;\n this.sessionContext = {\n sessionId: generateSessionId(),\n startedAt: new Date().toISOString(),\n };\n }\n\n identify(user: UserContext): void {\n this.userContext = { ...this.userContext, ...user };\n }\n\n clearUser(): void {\n this.userContext = {};\n }\n\n async collect(): Promise<EnrichedContext> {\n const { width, height } = Dimensions.get(\"window\");\n\n // Collect device info — fall back gracefully if native module unavailable\n let deviceInfo = null;\n let networkInfo = null;\n\n try {\n if (NativePulseBoardDevice) {\n deviceInfo = await NativePulseBoardDevice.getDeviceInfo();\n }\n } catch (e) {\n console.warn(\"[PulseBoard] Failed to collect device info:\", e);\n }\n\n try {\n if (NativePulseBoardNetwork) {\n networkInfo = await NativePulseBoardNetwork.getNetworkInfo();\n }\n } catch (e) {\n console.warn(\"[PulseBoard] Failed to collect network info:\", e);\n }\n\n const device: DeviceContext = {\n platform: Platform.OS === \"ios\" ? \"ios\" : \"android\",\n os: deviceInfo?.os ?? (Platform.OS === \"ios\" ? \"iOS\" : \"Android\"),\n osVersion:\n deviceInfo?.osVersion ?? Platform.Version?.toString() ?? \"unknown\",\n model: deviceInfo?.model ?? \"unknown\",\n manufacturer: deviceInfo?.manufacturer ?? \"unknown\",\n brand: deviceInfo?.brand ?? \"unknown\",\n isTablet: deviceInfo?.isTablet ?? false,\n appVersion: deviceInfo?.appVersion ?? \"unknown\",\n buildNumber: deviceInfo?.buildNumber ?? \"unknown\",\n bundleId: deviceInfo?.bundleId ?? \"unknown\",\n screenWidth: deviceInfo?.screenWidth ?? width,\n screenHeight: deviceInfo?.screenHeight ?? height,\n fontScale: Dimensions.get(\"window\").fontScale ?? 1,\n isEmulator: deviceInfo?.isEmulator ?? false,\n language: getLanguage(),\n timezone: getTimezone(),\n };\n\n const network: NetworkContext = {\n type: mapNetworkType(networkInfo?.type ?? \"unknown\"),\n isConnected: networkInfo?.isConnected ?? false,\n isWifiEnabled: networkInfo?.isWifiEnabled ?? false,\n carrier: networkInfo?.carrier ?? \"unknown\",\n ipAddress: networkInfo?.ipAddress ?? \"unknown\",\n };\n\n return {\n app: this.appContext,\n device,\n network,\n session: this.sessionContext,\n user: this.userContext,\n };\n }\n}\n","import { PulseEvent, StorageAdapter } from \"./types\";\n\nconst QUEUE_KEY = \"@pulseboard/event_queue\";\nconst MAX_QUEUE_SIZE = 100;\n\nexport class EventQueue {\n private memoryQueue: PulseEvent[] = [];\n private maxSize: number;\n private _hydrated: boolean = false;\n private storage: StorageAdapter | null = null;\n\n constructor(maxSize = MAX_QUEUE_SIZE, storage?: StorageAdapter) {\n this.maxSize = maxSize;\n this.storage = storage ?? null;\n this.hydrate();\n }\n\n private async hydrate(): Promise<void> {\n try {\n if (this.storage) {\n const raw = await this.storage.getItem(QUEUE_KEY);\n if (raw) {\n const stored = JSON.parse(raw) as PulseEvent[];\n this.memoryQueue = stored.slice(0, this.maxSize);\n }\n }\n } catch {\n // Fall back to in-memory only\n } finally {\n this._hydrated = true;\n }\n }\n\n private async persist(): Promise<void> {\n try {\n if (this.storage) {\n await this.storage.setItem(QUEUE_KEY, JSON.stringify(this.memoryQueue));\n }\n } catch {\n // Non-fatal\n }\n }\n\n enqueue(event: PulseEvent): void {\n if (this.memoryQueue.length >= this.maxSize) this.memoryQueue.shift();\n this.memoryQueue.push(event);\n this.persist();\n }\n\n dequeue(count: number): PulseEvent[] {\n const batch = this.memoryQueue.splice(0, count);\n this.persist();\n return batch;\n }\n\n get size(): number {\n return this.memoryQueue.length;\n }\n get isEmpty(): boolean {\n return this.memoryQueue.length === 0;\n }\n get hydrated(): boolean {\n return this._hydrated;\n }\n\n async clear(): Promise<void> {\n this.memoryQueue = [];\n try {\n if (this.storage) await this.storage.removeItem(QUEUE_KEY);\n } catch {}\n }\n}\n","import { AutoCapture } from \"./auto-capture\";\nimport { PulseBoardClient } from \"./client\";\nimport { ContextCollector } from \"./context\";\nimport { EventQueue } from \"./queue\";\nimport {\n CaptureErrorOptions,\n EnrichedContext,\n FeedbackOptions,\n LogEntry,\n LogLevel,\n LogOptions,\n PulseEvent,\n SDKConfig,\n TrackOptions,\n UserContext,\n} from \"./types\";\n\nclass PulseBoardSDK {\n private config: SDKConfig | null = null;\n private client: PulseBoardClient | null = null;\n private queue: EventQueue | null = null;\n private autoCapture: AutoCapture | null = null;\n private contextCollector: ContextCollector | null = null;\n private flushTimer: ReturnType<typeof setInterval> | null = null;\n private initialized: boolean = false;\n private readonly PULSEBOARD_API: string =\n \"https://pulseboard-production.up.railway.app/\";\n\n // ─── Log queue ────────────────────────────────────────────────────\n private logQueue: Omit<LogEntry, \"apiKey\">[] = [];\n private logFlushTimer: ReturnType<typeof setInterval> | null = null;\n private originalConsole: Partial<typeof console> = {};\n private consoleCapturing: boolean = false;\n\n // ─── Public API ───────────────────────────────────────────────────\n\n init(config: SDKConfig): void {\n if (this.initialized) {\n this.debugLog(\"SDK already initialized — skipping\");\n return;\n }\n\n if (!config.apiKey) {\n throw new Error(\"[PulseBoard] init() requires an apiKey\");\n }\n\n this.config = {\n autoCapture: true,\n debug: false,\n flushInterval: 5000,\n maxQueueSize: 100,\n ...config,\n };\n\n this.client = new PulseBoardClient(this.PULSEBOARD_API, this.config.debug);\n this.queue = new EventQueue(this.config.maxQueueSize, this.config.storage);\n this.contextCollector = new ContextCollector({\n environment: config.environment,\n });\n\n this.completeInit();\n }\n\n private completeInit(): void {\n this.flushTimer = setInterval(\n () => this.flush(),\n this.config!.flushInterval,\n );\n\n if (this.config!.autoCapture) {\n this.autoCapture = new AutoCapture((name, error, context) => {\n this.captureError(error, { payload: context });\n });\n this.autoCapture.attach();\n }\n\n this.initialized = true;\n this.debugLog(`Initialized — host: ${this.PULSEBOARD_API}`);\n }\n\n async getContext(): Promise<EnrichedContext> {\n this.assertInitialized(\"getContext\");\n return this.contextCollector!.collect();\n }\n\n identify(user: UserContext): void {\n this.assertInitialized(\"identify\");\n this.contextCollector!.identify(user);\n this.debugLog(`User identified: ${JSON.stringify(user)}`);\n }\n\n clearUser(): void {\n this.assertInitialized(\"clearUser\");\n this.contextCollector!.clearUser();\n }\n\n track(name: string, options: TrackOptions = {}): void {\n this.assertInitialized(\"track\");\n this.buildAndEnqueue(\n \"event\",\n name,\n options.payload ?? {},\n options.timestamp,\n );\n }\n\n metric(name: string, value: number, options: TrackOptions = {}): void {\n this.assertInitialized(\"metric\");\n this.buildAndEnqueue(\n \"metric\",\n name,\n { value, ...options.payload },\n options.timestamp,\n );\n }\n\n captureError(error: Error, options: CaptureErrorOptions = {}): void {\n this.assertInitialized(\"captureError\");\n this.buildAndEnqueue(\"error\", error.name ?? \"UnknownError\", {\n message: error.message,\n stack: error.stack,\n ...options.payload,\n });\n }\n\n // ─── Logging API ──────────────────────────────────────────────────\n\n log(level: LogLevel, message: string, options: LogOptions = {}): void {\n this.assertInitialized(\"log\");\n this.contextCollector!.collect()\n .then((context) => {\n this.logQueue.push({\n level,\n message,\n meta: options.meta,\n sessionId: context.session.sessionId,\n appVersion: context.device.appVersion,\n timestamp: new Date().toISOString(),\n });\n\n // Flush immediately for errors\n if (level === \"error\") this.flushLogs();\n })\n .catch(() => {});\n }\n\n captureConsole(): void {\n this.assertInitialized(\"captureConsole\");\n if (this.consoleCapturing) return;\n\n this.originalConsole = {\n log: console.log,\n warn: console.warn,\n error: console.error,\n debug: console.debug,\n };\n\n console.log = (...args: unknown[]) => {\n this.originalConsole.log?.(...args);\n this.log(\"info\", args.map(String).join(\" \"));\n };\n\n console.warn = (...args: unknown[]) => {\n this.originalConsole.warn?.(...args);\n this.log(\"warn\", args.map(String).join(\" \"));\n };\n\n console.error = (...args: unknown[]) => {\n this.originalConsole.error?.(...args);\n this.log(\"error\", args.map(String).join(\" \"));\n };\n\n console.debug = (...args: unknown[]) => {\n this.originalConsole.debug?.(...args);\n this.log(\"debug\", args.map(String).join(\" \"));\n };\n\n this.logFlushTimer = setInterval(() => this.flushLogs(), 10000);\n this.consoleCapturing = true;\n this.debugLog(\"Console capture enabled\");\n }\n\n releaseConsole(): void {\n if (!this.consoleCapturing) return;\n\n if (this.originalConsole.log) console.log = this.originalConsole.log;\n if (this.originalConsole.warn) console.warn = this.originalConsole.warn;\n if (this.originalConsole.error) console.error = this.originalConsole.error;\n if (this.originalConsole.debug) console.debug = this.originalConsole.debug;\n\n if (this.logFlushTimer) {\n clearInterval(this.logFlushTimer);\n this.logFlushTimer = null;\n }\n\n this.originalConsole = {};\n this.consoleCapturing = false;\n }\n\n async flushLogs(): Promise<void> {\n if (!this.client || !this.config || this.logQueue.length === 0) return;\n const batch = this.logQueue.splice(0, this.logQueue.length);\n await this.client.sendLogBatch(this.config.apiKey, batch);\n }\n\n // ─── Analytics API ────────────────────────────────────────────────\n\n startSession(): void {\n this.assertInitialized(\"startSession\");\n this.contextCollector!.collect()\n .then((context) => {\n this.client!.sendAnalytics(\"session\", {\n apiKey: this.config?.apiKey,\n sessionId: context.session.sessionId,\n startedAt: context.session.startedAt,\n context,\n });\n this.debugLog(`Session started: ${context.session.sessionId}`);\n })\n .catch((err) => this.debugLog(`Failed to start session: ${err}`));\n }\n\n endSession(duration?: number): void {\n this.assertInitialized(\"endSession\");\n this.contextCollector!.collect()\n .then((context) => {\n this.client!.sendAnalytics(\"session\", {\n apiKey: this.config?.apiKey,\n sessionId: context.session.sessionId,\n startedAt: context.session.startedAt,\n endedAt: new Date().toISOString(),\n duration,\n context,\n });\n this.flush();\n this.debugLog(`Session ended: ${context.session.sessionId}`);\n })\n .catch((err) => this.debugLog(`Failed to end session: ${err}`));\n }\n\n trackScreen(screenName: string, loadTime?: number): void {\n this.assertInitialized(\"trackScreen\");\n this.contextCollector!.collect()\n .then((context) => {\n this.client!.sendAnalytics(\"screen-view\", {\n apiKey: this.config?.apiKey,\n screenName,\n loadTime,\n sessionId: context.session.sessionId,\n context,\n });\n this.debugLog(`Screen tracked: ${screenName}`);\n })\n .catch((err) => this.debugLog(`Failed to track screen: ${err}`));\n }\n\n trackApiCall(\n endpoint: string,\n httpMethod: string,\n statusCode: number,\n duration: number,\n payloadSize?: number,\n ): void {\n this.assertInitialized(\"trackApiCall\");\n this.contextCollector!.collect()\n .then((context) => {\n this.client!.sendAnalytics(\"api-call\", {\n apiKey: this.config?.apiKey,\n endpoint,\n httpMethod,\n statusCode,\n duration,\n payloadSize,\n sessionId: context.session.sessionId,\n context,\n });\n this.debugLog(\n `API call tracked: ${httpMethod} ${endpoint} ${statusCode}`,\n );\n })\n .catch((err) => this.debugLog(`Failed to track API call: ${err}`));\n }\n\n trackCrash(error: Error, isFatal = false): void {\n this.assertInitialized(\"trackCrash\");\n this.contextCollector!.collect()\n .then((context) => {\n this.client!.sendAnalytics(\"crash\", {\n apiKey: this.config?.apiKey,\n errorName: error.name,\n errorMessage: error.message,\n stackTrace: error.stack ?? \"\",\n isFatal,\n sessionId: context.session.sessionId,\n context,\n });\n this.debugLog(`Crash tracked: ${error.name} — fatal: ${isFatal}`);\n })\n .catch((err) => this.debugLog(`Failed to track crash: ${err}`));\n }\n\n feedback(message: string, options: FeedbackOptions = {}): void {\n this.assertInitialized(\"feedback\");\n this.contextCollector!.collect()\n .then((context) => {\n this.client!.sendFeedback({\n apiKey: this.config?.apiKey,\n type: options.type ?? \"general\",\n message,\n meta: options.meta,\n userEmail: options.userEmail,\n userName: options.userName,\n screenshot: options.screenshot,\n sessionId: context.session.sessionId,\n appVersion: context.device.appVersion,\n });\n this.debugLog(`Feedback sent: ${options.type ?? \"general\"}`);\n })\n .catch((err) => this.debugLog(`Failed to send feedback: ${err}`));\n }\n\n // ─── Flush & Destroy ──────────────────────────────────────────────\n\n async flush(): Promise<void> {\n if (!this.queue || !this.client) return;\n\n // Wait up to 500ms for hydration before first flush\n if (!this.queue.hydrated) {\n await new Promise<void>((resolve) => {\n const interval = setInterval(() => {\n if (this.queue?.hydrated) {\n clearInterval(interval);\n resolve();\n }\n }, 50);\n setTimeout(() => {\n clearInterval(interval);\n resolve();\n }, 500);\n });\n }\n\n if (this.queue.isEmpty) return;\n\n const events = this.queue.dequeue(10);\n this.debugLog(`Flushing ${events.length} event(s)`);\n await this.client.sendBatch(events);\n }\n\n destroy(): void {\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n this.flushTimer = null;\n }\n\n this.releaseConsole();\n this.autoCapture?.detach();\n this.queue?.clear();\n this.logQueue = [];\n\n this.initialized = false;\n this.config = null;\n this.client = null;\n this.queue = null;\n this.contextCollector = null;\n\n this.debugLog(\"SDK destroyed\");\n }\n\n // ─── Private ──────────────────────────────────────────────────────\n\n private buildAndEnqueue(\n type: \"event\" | \"metric\" | \"error\",\n name: string,\n payload: Record<string, unknown>,\n timestamp?: string,\n ): void {\n this.contextCollector!.collect()\n .then((context) => {\n const event: PulseEvent = {\n apiKey: this.config?.apiKey!,\n type,\n name,\n payload,\n timestamp: timestamp ?? new Date().toISOString(),\n context,\n };\n this.queue!.enqueue(event);\n this.debugLog(`Queued: ${type} — ${name}`);\n if (type === \"error\") this.flush();\n })\n .catch((err) => this.debugLog(`Failed to collect context: ${err}`));\n }\n\n private assertInitialized(method: string): void {\n if (!this.initialized) {\n throw new Error(`PulseBoard.${method}() called before PulseBoard.init()`);\n }\n }\n\n private debugLog(message: string): void {\n if (this.config?.debug) {\n console.log(`[PulseBoard] ${message}`);\n }\n }\n}\n\nexport const PulseBoard = new PulseBoardSDK();\n\nexport type {\n AppContext,\n CaptureErrorOptions,\n DeviceContext,\n EnrichedContext,\n EventType,\n LogEntry,\n LogLevel,\n LogOptions,\n NetworkContext,\n PulseEvent,\n SDKConfig,\n SessionContext,\n TrackOptions,\n UserContext,\n} from \"./types\";\n"]}
package/dist/index.mjs CHANGED
@@ -1,5 +1,4 @@
1
1
  import { TurboModuleRegistry, Dimensions, Platform, I18nManager } from 'react-native';
2
- import AsyncStorage from '@react-native-async-storage/async-storage';
3
2
 
4
3
  var __getOwnPropNames = Object.getOwnPropertyNames;
5
4
  var __commonJS = (cb, mod) => function __require() {
@@ -546,40 +545,43 @@ var ContextCollector = class {
546
545
  };
547
546
  }
548
547
  };
548
+
549
+ // src/queue.ts
549
550
  var QUEUE_KEY = "@pulseboard/event_queue";
550
551
  var MAX_QUEUE_SIZE = 100;
551
552
  var EventQueue = class {
552
- constructor(maxSize = MAX_QUEUE_SIZE) {
553
+ constructor(maxSize = MAX_QUEUE_SIZE, storage) {
553
554
  this.memoryQueue = [];
554
555
  this._hydrated = false;
556
+ this.storage = null;
555
557
  this.maxSize = maxSize;
558
+ this.storage = storage ?? null;
556
559
  this.hydrate();
557
560
  }
558
- // ─── Hydrate from storage on init ─────────────────────────────────
559
561
  async hydrate() {
560
562
  try {
561
- const raw = await AsyncStorage.getItem(QUEUE_KEY);
562
- if (raw) {
563
- const stored = JSON.parse(raw);
564
- this.memoryQueue = stored.slice(0, this.maxSize);
563
+ if (this.storage) {
564
+ const raw = await this.storage.getItem(QUEUE_KEY);
565
+ if (raw) {
566
+ const stored = JSON.parse(raw);
567
+ this.memoryQueue = stored.slice(0, this.maxSize);
568
+ }
565
569
  }
566
570
  } catch {
567
571
  } finally {
568
572
  this._hydrated = true;
569
573
  }
570
574
  }
571
- // ─── Persist to storage ────────────────────────────────────────────
572
575
  async persist() {
573
576
  try {
574
- await AsyncStorage.setItem(QUEUE_KEY, JSON.stringify(this.memoryQueue));
577
+ if (this.storage) {
578
+ await this.storage.setItem(QUEUE_KEY, JSON.stringify(this.memoryQueue));
579
+ }
575
580
  } catch {
576
581
  }
577
582
  }
578
- // ─── Public API ────────────────────────────────────────────────────
579
583
  enqueue(event) {
580
- if (this.memoryQueue.length >= this.maxSize) {
581
- this.memoryQueue.shift();
582
- }
584
+ if (this.memoryQueue.length >= this.maxSize) this.memoryQueue.shift();
583
585
  this.memoryQueue.push(event);
584
586
  this.persist();
585
587
  }
@@ -600,7 +602,7 @@ var EventQueue = class {
600
602
  async clear() {
601
603
  this.memoryQueue = [];
602
604
  try {
603
- await AsyncStorage.removeItem(QUEUE_KEY);
605
+ if (this.storage) await this.storage.removeItem(QUEUE_KEY);
604
606
  } catch {
605
607
  }
606
608
  }
@@ -623,62 +625,28 @@ var PulseBoardSDK = class {
623
625
  this.originalConsole = {};
624
626
  this.consoleCapturing = false;
625
627
  }
626
- get apiKey() {
627
- return this.config?.apiKey ?? "";
628
- }
629
628
  // ─── Public API ───────────────────────────────────────────────────
630
629
  init(config) {
631
630
  if (this.initialized) {
632
631
  this.debugLog("SDK already initialized \u2014 skipping");
633
632
  return;
634
633
  }
635
- const hasDirectKey = !!config.apiKey;
636
- const hasIdentifiers = !!(config.organisation && config.product && config.project);
637
- if (!hasDirectKey && !hasIdentifiers) {
638
- throw new Error(
639
- "[PulseBoard] init() requires either apiKey or (organisation + product + project)"
640
- );
634
+ if (!config.apiKey) {
635
+ throw new Error("[PulseBoard] init() requires an apiKey");
641
636
  }
642
637
  this.config = {
643
638
  autoCapture: true,
644
639
  debug: false,
645
640
  flushInterval: 5e3,
646
641
  maxQueueSize: 100,
647
- ...config,
648
- apiKey: config.apiKey ?? ""
649
- // resolved below if using identifiers
642
+ ...config
650
643
  };
651
644
  this.client = new PulseBoardClient(this.PULSEBOARD_API, this.config.debug);
652
- this.queue = new EventQueue(this.config.maxQueueSize);
645
+ this.queue = new EventQueue(this.config.maxQueueSize, this.config.storage);
653
646
  this.contextCollector = new ContextCollector({
654
647
  environment: config.environment
655
648
  });
656
- if (!hasDirectKey && hasIdentifiers) {
657
- this.resolveApiKey(
658
- config.organisation,
659
- config.product,
660
- config.project
661
- );
662
- } else {
663
- this.completeInit();
664
- }
665
- }
666
- async resolveApiKey(organisation, product, project) {
667
- try {
668
- const response = await fetch(
669
- `${this.PULSEBOARD_API}sdk/resolve?organisation=${encodeURIComponent(organisation)}&product=${encodeURIComponent(product)}&project=${encodeURIComponent(project)}`
670
- );
671
- if (!response.ok) {
672
- throw new Error(
673
- `[PulseBoard] Could not resolve project. Check your organisation, product and project values.`
674
- );
675
- }
676
- const data = await response.json();
677
- this.config.apiKey = data.data.apiKey;
678
- this.completeInit();
679
- } catch (err) {
680
- console.error("[PulseBoard] Failed to resolve API key:", err);
681
- }
649
+ this.completeInit();
682
650
  }
683
651
  completeInit() {
684
652
  this.flushTimer = setInterval(
@@ -794,14 +762,14 @@ var PulseBoardSDK = class {
794
762
  async flushLogs() {
795
763
  if (!this.client || !this.config || this.logQueue.length === 0) return;
796
764
  const batch = this.logQueue.splice(0, this.logQueue.length);
797
- await this.client.sendLogBatch(this.apiKey, batch);
765
+ await this.client.sendLogBatch(this.config.apiKey, batch);
798
766
  }
799
767
  // ─── Analytics API ────────────────────────────────────────────────
800
768
  startSession() {
801
769
  this.assertInitialized("startSession");
802
770
  this.contextCollector.collect().then((context) => {
803
771
  this.client.sendAnalytics("session", {
804
- apiKey: this.apiKey,
772
+ apiKey: this.config?.apiKey,
805
773
  sessionId: context.session.sessionId,
806
774
  startedAt: context.session.startedAt,
807
775
  context
@@ -813,7 +781,7 @@ var PulseBoardSDK = class {
813
781
  this.assertInitialized("endSession");
814
782
  this.contextCollector.collect().then((context) => {
815
783
  this.client.sendAnalytics("session", {
816
- apiKey: this.apiKey,
784
+ apiKey: this.config?.apiKey,
817
785
  sessionId: context.session.sessionId,
818
786
  startedAt: context.session.startedAt,
819
787
  endedAt: (/* @__PURE__ */ new Date()).toISOString(),
@@ -828,7 +796,7 @@ var PulseBoardSDK = class {
828
796
  this.assertInitialized("trackScreen");
829
797
  this.contextCollector.collect().then((context) => {
830
798
  this.client.sendAnalytics("screen-view", {
831
- apiKey: this.apiKey,
799
+ apiKey: this.config?.apiKey,
832
800
  screenName,
833
801
  loadTime,
834
802
  sessionId: context.session.sessionId,
@@ -841,7 +809,7 @@ var PulseBoardSDK = class {
841
809
  this.assertInitialized("trackApiCall");
842
810
  this.contextCollector.collect().then((context) => {
843
811
  this.client.sendAnalytics("api-call", {
844
- apiKey: this.apiKey,
812
+ apiKey: this.config?.apiKey,
845
813
  endpoint,
846
814
  httpMethod,
847
815
  statusCode,
@@ -859,7 +827,7 @@ var PulseBoardSDK = class {
859
827
  this.assertInitialized("trackCrash");
860
828
  this.contextCollector.collect().then((context) => {
861
829
  this.client.sendAnalytics("crash", {
862
- apiKey: this.apiKey,
830
+ apiKey: this.config?.apiKey,
863
831
  errorName: error.name,
864
832
  errorMessage: error.message,
865
833
  stackTrace: error.stack ?? "",
@@ -874,7 +842,7 @@ var PulseBoardSDK = class {
874
842
  this.assertInitialized("feedback");
875
843
  this.contextCollector.collect().then((context) => {
876
844
  this.client.sendFeedback({
877
- apiKey: this.apiKey,
845
+ apiKey: this.config?.apiKey,
878
846
  type: options.type ?? "general",
879
847
  message,
880
848
  meta: options.meta,
@@ -929,7 +897,7 @@ var PulseBoardSDK = class {
929
897
  buildAndEnqueue(type, name, payload, timestamp) {
930
898
  this.contextCollector.collect().then((context) => {
931
899
  const event = {
932
- apiKey: this.apiKey,
900
+ apiKey: this.config?.apiKey,
933
901
  type,
934
902
  name,
935
903
  payload,
@@ -1 +1 @@
1
- {"version":3,"sources":["../node_modules/promise/setimmediate/core.js","../node_modules/promise/setimmediate/rejection-tracking.js","../src/auto-capture.ts","../src/client.ts","../src/specs/NativePulseBoardDevice.ts","../src/specs/NativePulseBoardNetwork.ts","../src/context.ts","../src/queue.ts","../src/index.ts"],"names":["exports","Promise","resolve","reject","id","TurboModuleRegistry"],"mappings":"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","file":"index.mjs","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}","type ErrorHandler = (\n name: string,\n error: Error,\n context?: Record<string, unknown>,\n) => void;\n\nexport class AutoCapture {\n private handler: ErrorHandler;\n private attached: boolean = false;\n private previousHandler: ((error: Error, isFatal?: boolean) => void) | null =\n null;\n\n constructor(handler: ErrorHandler) {\n this.handler = handler;\n }\n\n attach(): void {\n if (this.attached) return;\n\n // React Native's global error handler - catches all unhandled JS errors\n this.previousHandler = ErrorUtils.getGlobalHandler();\n\n ErrorUtils.setGlobalHandler((error: Error, isFatal?: boolean) => {\n this.handler(\"uncaughtException\", error, { isFatal: isFatal ?? false });\n\n // Always call the previous handler (React Native's default crash reporter)\n if (this.previousHandler) {\n this.previousHandler(error, isFatal);\n }\n });\n\n // Unhandled promise rejections\n const tracking = require(\"promise/setimmediate/rejection-tracking\");\n tracking.enable({\n allRejections: true,\n onUnhandled: (_id: number, error: unknown) => {\n const err = error instanceof Error ? error : new Error(String(error));\n this.handler(\"unhandledRejection\", err, { fatal: false });\n },\n });\n\n this.attached = true;\n }\n\n detach(): void {\n if (!this.attached) return;\n\n // Restore the previous error handler\n if (this.previousHandler) {\n ErrorUtils.setGlobalHandler(this.previousHandler);\n this.previousHandler = null;\n }\n\n this.attached = false;\n }\n}\n","import { LogEntry, PulseEvent } from \"./types\";\n\ntype AnalyticsType = \"crash\" | \"session\" | \"screen-view\" | \"api-call\";\n\nexport class PulseBoardClient {\n private host: string;\n private debug: boolean;\n\n constructor(host: string, debug = false) {\n this.host = host.replace(/\\/$/, \"\");\n this.debug = debug;\n }\n\n // ─── Event Ingest ─────────────────────────────────────────────────\n\n async send(event: PulseEvent): Promise<boolean> {\n try {\n const response = await fetch(`${this.host}/ingest`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(event),\n });\n\n if (!response.ok) {\n this.log(\n `Failed to send event: ${response.status} ${response.statusText}`,\n );\n return false;\n }\n\n this.log(`Event sent: ${event.type} — ${event.name}`);\n return true;\n } catch (err) {\n this.log(`Network error sending event: ${err}`);\n return false;\n }\n }\n\n async sendBatch(events: PulseEvent[]): Promise<boolean> {\n const chunks = this.chunk(events, 5);\n\n for (const chunk of chunks) {\n await Promise.all(chunk.map((e) => this.send(e)));\n }\n\n return true;\n }\n\n // ─── Analytics Ingest ─────────────────────────────────────────────\n\n async sendAnalytics(\n type: AnalyticsType,\n payload: Record<string, unknown>,\n ): Promise<boolean> {\n try {\n const response = await fetch(`${this.host}/analytics/${type}`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n this.log(\n `Failed to send analytics: ${response.status} ${response.statusText}`,\n );\n return false;\n }\n\n this.log(`Analytics sent: ${type}`);\n return true;\n } catch (err) {\n this.log(`Network error sending analytics: ${err}`);\n return false;\n }\n }\n\n // ─── Log Entry ─────────────────────────────────────────────\n\n async sendLog(entry: LogEntry): Promise<boolean> {\n try {\n const response = await fetch(`${this.host}/logs`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(entry),\n });\n if (!response.ok) {\n this.log(`Failed to send log: ${response.status}`);\n return false;\n }\n return true;\n } catch (err) {\n this.log(`Network error sending log: ${err}`);\n return false;\n }\n }\n\n async sendLogBatch(\n apiKey: string,\n logs: Omit<LogEntry, \"apiKey\">[],\n ): Promise<boolean> {\n try {\n const response = await fetch(`${this.host}/logs/batch`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ apiKey, logs }),\n });\n if (!response.ok) {\n this.log(`Failed to send log batch: ${response.status}`);\n return false;\n }\n return true;\n } catch (err) {\n this.log(`Network error sending log batch: ${err}`);\n return false;\n }\n }\n\n // ─── Feedback ─────────────────────────────────────────────────────\n\n async sendFeedback(payload: Record<string, unknown>): Promise<boolean> {\n try {\n const response = await fetch(`${this.host}/feedback`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(payload),\n });\n if (!response.ok) {\n this.log(`Failed to send feedback: ${response.status}`);\n return false;\n }\n this.log(\"Feedback sent\");\n return true;\n } catch (err) {\n this.log(`Network error sending feedback: ${err}`);\n return false;\n }\n }\n\n // ─── Private ──────────────────────────────────────────────────────\n\n private chunk<T>(arr: T[], size: number): T[][] {\n return Array.from({ length: Math.ceil(arr.length / size) }, (_, i) =>\n arr.slice(i * size, i * size + size),\n );\n }\n\n private log(message: string): void {\n if (this.debug) {\n console.log(`[PulseBoard] ${message}`);\n }\n }\n}\n","import type { TurboModule } from \"react-native\";\nimport { TurboModuleRegistry } from \"react-native\";\n\nexport type DeviceInfo = {\n model: string;\n manufacturer: string;\n brand: string;\n os: string;\n osVersion: string;\n appVersion: string;\n buildNumber: string;\n bundleId: string;\n screenWidth: number;\n screenHeight: number;\n isTablet: boolean;\n isEmulator: boolean;\n};\n\nexport interface Spec extends TurboModule {\n getDeviceInfo(): Promise<DeviceInfo>;\n}\n\nexport default TurboModuleRegistry.getEnforcing<Spec>(\"PulseBoardDevice\");\n","import type { TurboModule } from \"react-native\";\nimport { TurboModuleRegistry } from \"react-native\";\n\nexport type NetowrkInfo = {\n type: string;\n isConnected: boolean;\n isWifiEnabled: boolean;\n carrier: string;\n ipAddress: string;\n};\n\nexport interface Spec extends TurboModule {\n getNetworkInfo(): Promise<NetowrkInfo>;\n}\n\nexport default TurboModuleRegistry.getEnforcing<Spec>(\"PulseBoardNetwork\");\n","import { Dimensions, I18nManager, Platform } from \"react-native\";\nimport NativePulseBoardDevice from \"./specs/NativePulseBoardDevice\";\nimport NativePulseBoardNetwork from \"./specs/NativePulseBoardNetwork\";\nimport {\n AppContext,\n DeviceContext,\n EnrichedContext,\n NetworkContext,\n NetworkType,\n SessionContext,\n UserContext,\n} from \"./types\";\n\nfunction generateSessionId(): string {\n const timestamp = Date.now().toString(36);\n const random = Math.random().toString(36).substring(2, 10);\n return `${timestamp}-${random}`;\n}\n\nfunction mapNetworkType(type: string): NetworkType {\n switch (type) {\n case \"wifi\":\n return \"wifi\";\n case \"cellular\":\n return \"cellular\";\n case \"offline\":\n return \"offline\";\n default:\n return \"unknown\";\n }\n}\n\nfunction getTimezone(): string {\n try {\n return Intl.DateTimeFormat().resolvedOptions().timeZone;\n } catch {\n return \"unknown\";\n }\n}\n\nfunction getLanguage(): string {\n try {\n return (\n I18nManager.getConstants?.()?.localeIdentifier?.replace(\"_\", \"-\") ??\n Intl.DateTimeFormat().resolvedOptions().locale ??\n \"unknown\"\n );\n } catch {\n return \"unknown\";\n }\n}\n\nexport class ContextCollector {\n private sessionContext: SessionContext;\n private appContext: AppContext;\n private userContext: UserContext = {};\n\n constructor(appContext: AppContext = {}) {\n this.appContext = appContext;\n this.sessionContext = {\n sessionId: generateSessionId(),\n startedAt: new Date().toISOString(),\n };\n }\n\n identify(user: UserContext): void {\n this.userContext = { ...this.userContext, ...user };\n }\n\n clearUser(): void {\n this.userContext = {};\n }\n\n async collect(): Promise<EnrichedContext> {\n const { width, height } = Dimensions.get(\"window\");\n\n // Collect device info — fall back gracefully if native module unavailable\n let deviceInfo = null;\n let networkInfo = null;\n\n try {\n if (NativePulseBoardDevice) {\n deviceInfo = await NativePulseBoardDevice.getDeviceInfo();\n }\n } catch (e) {\n console.warn(\"[PulseBoard] Failed to collect device info:\", e);\n }\n\n try {\n if (NativePulseBoardNetwork) {\n networkInfo = await NativePulseBoardNetwork.getNetworkInfo();\n }\n } catch (e) {\n console.warn(\"[PulseBoard] Failed to collect network info:\", e);\n }\n\n const device: DeviceContext = {\n platform: Platform.OS === \"ios\" ? \"ios\" : \"android\",\n os: deviceInfo?.os ?? (Platform.OS === \"ios\" ? \"iOS\" : \"Android\"),\n osVersion:\n deviceInfo?.osVersion ?? Platform.Version?.toString() ?? \"unknown\",\n model: deviceInfo?.model ?? \"unknown\",\n manufacturer: deviceInfo?.manufacturer ?? \"unknown\",\n brand: deviceInfo?.brand ?? \"unknown\",\n isTablet: deviceInfo?.isTablet ?? false,\n appVersion: deviceInfo?.appVersion ?? \"unknown\",\n buildNumber: deviceInfo?.buildNumber ?? \"unknown\",\n bundleId: deviceInfo?.bundleId ?? \"unknown\",\n screenWidth: deviceInfo?.screenWidth ?? width,\n screenHeight: deviceInfo?.screenHeight ?? height,\n fontScale: Dimensions.get(\"window\").fontScale ?? 1,\n isEmulator: deviceInfo?.isEmulator ?? false,\n language: getLanguage(),\n timezone: getTimezone(),\n };\n\n const network: NetworkContext = {\n type: mapNetworkType(networkInfo?.type ?? \"unknown\"),\n isConnected: networkInfo?.isConnected ?? false,\n isWifiEnabled: networkInfo?.isWifiEnabled ?? false,\n carrier: networkInfo?.carrier ?? \"unknown\",\n ipAddress: networkInfo?.ipAddress ?? \"unknown\",\n };\n\n return {\n app: this.appContext,\n device,\n network,\n session: this.sessionContext,\n user: this.userContext,\n };\n }\n}\n","import AsyncStorage from \"@react-native-async-storage/async-storage\";\nimport { PulseEvent } from \"./types\";\n\nconst QUEUE_KEY = \"@pulseboard/event_queue\";\nconst MAX_QUEUE_SIZE = 100;\n\nexport class EventQueue {\n private memoryQueue: PulseEvent[] = [];\n private maxSize: number;\n private _hydrated: boolean = false;\n\n constructor(maxSize = MAX_QUEUE_SIZE) {\n this.maxSize = maxSize;\n this.hydrate();\n }\n\n // ─── Hydrate from storage on init ─────────────────────────────────\n\n private async hydrate(): Promise<void> {\n try {\n const raw = await AsyncStorage.getItem(QUEUE_KEY);\n if (raw) {\n const stored = JSON.parse(raw) as PulseEvent[];\n this.memoryQueue = stored.slice(0, this.maxSize);\n }\n } catch {\n // Storage unavailable — fall back to in-memory only\n } finally {\n this._hydrated = true;\n }\n }\n\n // ─── Persist to storage ────────────────────────────────────────────\n\n private async persist(): Promise<void> {\n try {\n await AsyncStorage.setItem(QUEUE_KEY, JSON.stringify(this.memoryQueue));\n } catch {\n // Non-fatal — events still in memory\n }\n }\n\n // ─── Public API ────────────────────────────────────────────────────\n\n enqueue(event: PulseEvent): void {\n if (this.memoryQueue.length >= this.maxSize) {\n this.memoryQueue.shift(); // Drop oldest\n }\n this.memoryQueue.push(event);\n this.persist();\n }\n\n dequeue(count: number): PulseEvent[] {\n const batch = this.memoryQueue.splice(0, count);\n this.persist();\n return batch;\n }\n\n get size(): number {\n return this.memoryQueue.length;\n }\n\n get isEmpty(): boolean {\n return this.memoryQueue.length === 0;\n }\n\n get hydrated(): boolean {\n return this._hydrated;\n }\n\n async clear(): Promise<void> {\n this.memoryQueue = [];\n try {\n await AsyncStorage.removeItem(QUEUE_KEY);\n } catch {\n // Non-fatal\n }\n }\n}\n","import { AutoCapture } from \"./auto-capture\";\nimport { PulseBoardClient } from \"./client\";\nimport { ContextCollector } from \"./context\";\nimport { EventQueue } from \"./queue\";\nimport {\n CaptureErrorOptions,\n EnrichedContext,\n FeedbackOptions,\n LogEntry,\n LogLevel,\n LogOptions,\n PulseEvent,\n SDKConfig,\n TrackOptions,\n UserContext,\n} from \"./types\";\n\nclass PulseBoardSDK {\n private config: SDKConfig | null = null;\n private client: PulseBoardClient | null = null;\n private queue: EventQueue | null = null;\n private autoCapture: AutoCapture | null = null;\n private contextCollector: ContextCollector | null = null;\n private flushTimer: ReturnType<typeof setInterval> | null = null;\n private initialized: boolean = false;\n private readonly PULSEBOARD_API: string =\n \"https://pulseboard-production.up.railway.app/\";\n\n // ─── Log queue ────────────────────────────────────────────────────\n private logQueue: Omit<LogEntry, \"apiKey\">[] = [];\n private logFlushTimer: ReturnType<typeof setInterval> | null = null;\n private originalConsole: Partial<typeof console> = {};\n private consoleCapturing: boolean = false;\n\n private get apiKey(): string {\n return this.config?.apiKey ?? \"\";\n }\n\n // ─── Public API ───────────────────────────────────────────────────\n\n init(config: SDKConfig): void {\n if (this.initialized) {\n this.debugLog(\"SDK already initialized — skipping\");\n return;\n }\n\n // Validate config\n const hasDirectKey = !!config.apiKey;\n const hasIdentifiers = !!(\n config.organisation &&\n config.product &&\n config.project\n );\n\n if (!hasDirectKey && !hasIdentifiers) {\n throw new Error(\n \"[PulseBoard] init() requires either apiKey or (organisation + product + project)\",\n );\n }\n\n this.config = {\n autoCapture: true,\n debug: false,\n flushInterval: 5000,\n maxQueueSize: 100,\n ...config,\n apiKey: config.apiKey ?? \"\", // resolved below if using identifiers\n };\n\n this.client = new PulseBoardClient(this.PULSEBOARD_API, this.config.debug);\n this.queue = new EventQueue(this.config.maxQueueSize);\n this.contextCollector = new ContextCollector({\n environment: config.environment,\n });\n\n // Resolve API key from identifiers if not provided directly\n if (!hasDirectKey && hasIdentifiers) {\n this.resolveApiKey(\n config.organisation!,\n config.product!,\n config.project!,\n );\n } else {\n this.completeInit();\n }\n }\n\n private async resolveApiKey(\n organisation: string,\n product: string,\n project: string,\n ): Promise<void> {\n try {\n const response = await fetch(\n `${this.PULSEBOARD_API}sdk/resolve?organisation=${encodeURIComponent(organisation)}&product=${encodeURIComponent(product)}&project=${encodeURIComponent(project)}`,\n );\n\n if (!response.ok) {\n throw new Error(\n `[PulseBoard] Could not resolve project. Check your organisation, product and project values.`,\n );\n }\n\n const data = (await response.json()) as {\n success: boolean;\n data: { apiKey: string };\n };\n this.config!.apiKey = data.data.apiKey;\n this.completeInit();\n } catch (err) {\n console.error(\"[PulseBoard] Failed to resolve API key:\", err);\n }\n }\n\n private completeInit(): void {\n this.flushTimer = setInterval(\n () => this.flush(),\n this.config!.flushInterval,\n );\n\n if (this.config!.autoCapture) {\n this.autoCapture = new AutoCapture((name, error, context) => {\n this.captureError(error, { payload: context });\n });\n this.autoCapture.attach();\n }\n\n this.initialized = true;\n this.debugLog(`Initialized — host: ${this.PULSEBOARD_API}`);\n }\n\n async getContext(): Promise<EnrichedContext> {\n this.assertInitialized(\"getContext\");\n return this.contextCollector!.collect();\n }\n\n identify(user: UserContext): void {\n this.assertInitialized(\"identify\");\n this.contextCollector!.identify(user);\n this.debugLog(`User identified: ${JSON.stringify(user)}`);\n }\n\n clearUser(): void {\n this.assertInitialized(\"clearUser\");\n this.contextCollector!.clearUser();\n }\n\n track(name: string, options: TrackOptions = {}): void {\n this.assertInitialized(\"track\");\n this.buildAndEnqueue(\n \"event\",\n name,\n options.payload ?? {},\n options.timestamp,\n );\n }\n\n metric(name: string, value: number, options: TrackOptions = {}): void {\n this.assertInitialized(\"metric\");\n this.buildAndEnqueue(\n \"metric\",\n name,\n { value, ...options.payload },\n options.timestamp,\n );\n }\n\n captureError(error: Error, options: CaptureErrorOptions = {}): void {\n this.assertInitialized(\"captureError\");\n this.buildAndEnqueue(\"error\", error.name ?? \"UnknownError\", {\n message: error.message,\n stack: error.stack,\n ...options.payload,\n });\n }\n\n // ─── Logging API ──────────────────────────────────────────────────\n\n log(level: LogLevel, message: string, options: LogOptions = {}): void {\n this.assertInitialized(\"log\");\n this.contextCollector!.collect()\n .then((context) => {\n this.logQueue.push({\n level,\n message,\n meta: options.meta,\n sessionId: context.session.sessionId,\n appVersion: context.device.appVersion,\n timestamp: new Date().toISOString(),\n });\n\n // Flush immediately for errors\n if (level === \"error\") this.flushLogs();\n })\n .catch(() => {});\n }\n\n captureConsole(): void {\n this.assertInitialized(\"captureConsole\");\n if (this.consoleCapturing) return;\n\n this.originalConsole = {\n log: console.log,\n warn: console.warn,\n error: console.error,\n debug: console.debug,\n };\n\n console.log = (...args: unknown[]) => {\n this.originalConsole.log?.(...args);\n this.log(\"info\", args.map(String).join(\" \"));\n };\n\n console.warn = (...args: unknown[]) => {\n this.originalConsole.warn?.(...args);\n this.log(\"warn\", args.map(String).join(\" \"));\n };\n\n console.error = (...args: unknown[]) => {\n this.originalConsole.error?.(...args);\n this.log(\"error\", args.map(String).join(\" \"));\n };\n\n console.debug = (...args: unknown[]) => {\n this.originalConsole.debug?.(...args);\n this.log(\"debug\", args.map(String).join(\" \"));\n };\n\n this.logFlushTimer = setInterval(() => this.flushLogs(), 10000);\n this.consoleCapturing = true;\n this.debugLog(\"Console capture enabled\");\n }\n\n releaseConsole(): void {\n if (!this.consoleCapturing) return;\n\n if (this.originalConsole.log) console.log = this.originalConsole.log;\n if (this.originalConsole.warn) console.warn = this.originalConsole.warn;\n if (this.originalConsole.error) console.error = this.originalConsole.error;\n if (this.originalConsole.debug) console.debug = this.originalConsole.debug;\n\n if (this.logFlushTimer) {\n clearInterval(this.logFlushTimer);\n this.logFlushTimer = null;\n }\n\n this.originalConsole = {};\n this.consoleCapturing = false;\n }\n\n async flushLogs(): Promise<void> {\n if (!this.client || !this.config || this.logQueue.length === 0) return;\n const batch = this.logQueue.splice(0, this.logQueue.length);\n await this.client.sendLogBatch(this.apiKey, batch);\n }\n\n // ─── Analytics API ────────────────────────────────────────────────\n\n startSession(): void {\n this.assertInitialized(\"startSession\");\n this.contextCollector!.collect()\n .then((context) => {\n this.client!.sendAnalytics(\"session\", {\n apiKey: this.apiKey,\n sessionId: context.session.sessionId,\n startedAt: context.session.startedAt,\n context,\n });\n this.debugLog(`Session started: ${context.session.sessionId}`);\n })\n .catch((err) => this.debugLog(`Failed to start session: ${err}`));\n }\n\n endSession(duration?: number): void {\n this.assertInitialized(\"endSession\");\n this.contextCollector!.collect()\n .then((context) => {\n this.client!.sendAnalytics(\"session\", {\n apiKey: this.apiKey,\n sessionId: context.session.sessionId,\n startedAt: context.session.startedAt,\n endedAt: new Date().toISOString(),\n duration,\n context,\n });\n this.flush();\n this.debugLog(`Session ended: ${context.session.sessionId}`);\n })\n .catch((err) => this.debugLog(`Failed to end session: ${err}`));\n }\n\n trackScreen(screenName: string, loadTime?: number): void {\n this.assertInitialized(\"trackScreen\");\n this.contextCollector!.collect()\n .then((context) => {\n this.client!.sendAnalytics(\"screen-view\", {\n apiKey: this.apiKey,\n screenName,\n loadTime,\n sessionId: context.session.sessionId,\n context,\n });\n this.debugLog(`Screen tracked: ${screenName}`);\n })\n .catch((err) => this.debugLog(`Failed to track screen: ${err}`));\n }\n\n trackApiCall(\n endpoint: string,\n httpMethod: string,\n statusCode: number,\n duration: number,\n payloadSize?: number,\n ): void {\n this.assertInitialized(\"trackApiCall\");\n this.contextCollector!.collect()\n .then((context) => {\n this.client!.sendAnalytics(\"api-call\", {\n apiKey: this.apiKey,\n endpoint,\n httpMethod,\n statusCode,\n duration,\n payloadSize,\n sessionId: context.session.sessionId,\n context,\n });\n this.debugLog(\n `API call tracked: ${httpMethod} ${endpoint} ${statusCode}`,\n );\n })\n .catch((err) => this.debugLog(`Failed to track API call: ${err}`));\n }\n\n trackCrash(error: Error, isFatal = false): void {\n this.assertInitialized(\"trackCrash\");\n this.contextCollector!.collect()\n .then((context) => {\n this.client!.sendAnalytics(\"crash\", {\n apiKey: this.apiKey,\n errorName: error.name,\n errorMessage: error.message,\n stackTrace: error.stack ?? \"\",\n isFatal,\n sessionId: context.session.sessionId,\n context,\n });\n this.debugLog(`Crash tracked: ${error.name} — fatal: ${isFatal}`);\n })\n .catch((err) => this.debugLog(`Failed to track crash: ${err}`));\n }\n\n feedback(message: string, options: FeedbackOptions = {}): void {\n this.assertInitialized(\"feedback\");\n this.contextCollector!.collect()\n .then((context) => {\n this.client!.sendFeedback({\n apiKey: this.apiKey,\n type: options.type ?? \"general\",\n message,\n meta: options.meta,\n userEmail: options.userEmail,\n userName: options.userName,\n screenshot: options.screenshot,\n sessionId: context.session.sessionId,\n appVersion: context.device.appVersion,\n });\n this.debugLog(`Feedback sent: ${options.type ?? \"general\"}`);\n })\n .catch((err) => this.debugLog(`Failed to send feedback: ${err}`));\n }\n\n // ─── Flush & Destroy ──────────────────────────────────────────────\n\n async flush(): Promise<void> {\n if (!this.queue || !this.client) return;\n\n // Wait up to 500ms for hydration before first flush\n if (!this.queue.hydrated) {\n await new Promise<void>((resolve) => {\n const interval = setInterval(() => {\n if (this.queue?.hydrated) {\n clearInterval(interval);\n resolve();\n }\n }, 50);\n setTimeout(() => {\n clearInterval(interval);\n resolve();\n }, 500);\n });\n }\n\n if (this.queue.isEmpty) return;\n\n const events = this.queue.dequeue(10);\n this.debugLog(`Flushing ${events.length} event(s)`);\n await this.client.sendBatch(events);\n }\n\n destroy(): void {\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n this.flushTimer = null;\n }\n\n this.releaseConsole();\n this.autoCapture?.detach();\n this.queue?.clear();\n this.logQueue = [];\n\n this.initialized = false;\n this.config = null;\n this.client = null;\n this.queue = null;\n this.contextCollector = null;\n\n this.debugLog(\"SDK destroyed\");\n }\n\n // ─── Private ──────────────────────────────────────────────────────\n\n private buildAndEnqueue(\n type: \"event\" | \"metric\" | \"error\",\n name: string,\n payload: Record<string, unknown>,\n timestamp?: string,\n ): void {\n this.contextCollector!.collect()\n .then((context) => {\n const event: PulseEvent = {\n apiKey: this.apiKey,\n type,\n name,\n payload,\n timestamp: timestamp ?? new Date().toISOString(),\n context,\n };\n this.queue!.enqueue(event);\n this.debugLog(`Queued: ${type} — ${name}`);\n if (type === \"error\") this.flush();\n })\n .catch((err) => this.debugLog(`Failed to collect context: ${err}`));\n }\n\n private assertInitialized(method: string): void {\n if (!this.initialized) {\n throw new Error(`PulseBoard.${method}() called before PulseBoard.init()`);\n }\n }\n\n private debugLog(message: string): void {\n if (this.config?.debug) {\n console.log(`[PulseBoard] ${message}`);\n }\n }\n}\n\nexport const PulseBoard = new PulseBoardSDK();\n\nexport type {\n AppContext,\n CaptureErrorOptions,\n DeviceContext,\n EnrichedContext,\n EventType,\n LogEntry,\n LogLevel,\n LogOptions,\n NetworkContext,\n PulseEvent,\n SDKConfig,\n SessionContext,\n TrackOptions,\n UserContext,\n} from \"./types\";\n"]}
1
+ {"version":3,"sources":["../node_modules/promise/setimmediate/core.js","../node_modules/promise/setimmediate/rejection-tracking.js","../src/auto-capture.ts","../src/client.ts","../src/specs/NativePulseBoardDevice.ts","../src/specs/NativePulseBoardNetwork.ts","../src/context.ts","../src/queue.ts","../src/index.ts"],"names":["exports","Promise","resolve","reject","id","TurboModuleRegistry"],"mappings":"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","file":"index.mjs","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}","type ErrorHandler = (\n name: string,\n error: Error,\n context?: Record<string, unknown>,\n) => void;\n\nexport class AutoCapture {\n private handler: ErrorHandler;\n private attached: boolean = false;\n private previousHandler: ((error: Error, isFatal?: boolean) => void) | null =\n null;\n\n constructor(handler: ErrorHandler) {\n this.handler = handler;\n }\n\n attach(): void {\n if (this.attached) return;\n\n // React Native's global error handler - catches all unhandled JS errors\n this.previousHandler = ErrorUtils.getGlobalHandler();\n\n ErrorUtils.setGlobalHandler((error: Error, isFatal?: boolean) => {\n this.handler(\"uncaughtException\", error, { isFatal: isFatal ?? false });\n\n // Always call the previous handler (React Native's default crash reporter)\n if (this.previousHandler) {\n this.previousHandler(error, isFatal);\n }\n });\n\n // Unhandled promise rejections\n const tracking = require(\"promise/setimmediate/rejection-tracking\");\n tracking.enable({\n allRejections: true,\n onUnhandled: (_id: number, error: unknown) => {\n const err = error instanceof Error ? error : new Error(String(error));\n this.handler(\"unhandledRejection\", err, { fatal: false });\n },\n });\n\n this.attached = true;\n }\n\n detach(): void {\n if (!this.attached) return;\n\n // Restore the previous error handler\n if (this.previousHandler) {\n ErrorUtils.setGlobalHandler(this.previousHandler);\n this.previousHandler = null;\n }\n\n this.attached = false;\n }\n}\n","import { LogEntry, PulseEvent } from \"./types\";\n\ntype AnalyticsType = \"crash\" | \"session\" | \"screen-view\" | \"api-call\";\n\nexport class PulseBoardClient {\n private host: string;\n private debug: boolean;\n\n constructor(host: string, debug = false) {\n this.host = host.replace(/\\/$/, \"\");\n this.debug = debug;\n }\n\n // ─── Event Ingest ─────────────────────────────────────────────────\n\n async send(event: PulseEvent): Promise<boolean> {\n try {\n const response = await fetch(`${this.host}/ingest`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(event),\n });\n\n if (!response.ok) {\n this.log(\n `Failed to send event: ${response.status} ${response.statusText}`,\n );\n return false;\n }\n\n this.log(`Event sent: ${event.type} — ${event.name}`);\n return true;\n } catch (err) {\n this.log(`Network error sending event: ${err}`);\n return false;\n }\n }\n\n async sendBatch(events: PulseEvent[]): Promise<boolean> {\n const chunks = this.chunk(events, 5);\n\n for (const chunk of chunks) {\n await Promise.all(chunk.map((e) => this.send(e)));\n }\n\n return true;\n }\n\n // ─── Analytics Ingest ─────────────────────────────────────────────\n\n async sendAnalytics(\n type: AnalyticsType,\n payload: Record<string, unknown>,\n ): Promise<boolean> {\n try {\n const response = await fetch(`${this.host}/analytics/${type}`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n this.log(\n `Failed to send analytics: ${response.status} ${response.statusText}`,\n );\n return false;\n }\n\n this.log(`Analytics sent: ${type}`);\n return true;\n } catch (err) {\n this.log(`Network error sending analytics: ${err}`);\n return false;\n }\n }\n\n // ─── Log Entry ─────────────────────────────────────────────\n\n async sendLog(entry: LogEntry): Promise<boolean> {\n try {\n const response = await fetch(`${this.host}/logs`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(entry),\n });\n if (!response.ok) {\n this.log(`Failed to send log: ${response.status}`);\n return false;\n }\n return true;\n } catch (err) {\n this.log(`Network error sending log: ${err}`);\n return false;\n }\n }\n\n async sendLogBatch(\n apiKey: string,\n logs: Omit<LogEntry, \"apiKey\">[],\n ): Promise<boolean> {\n try {\n const response = await fetch(`${this.host}/logs/batch`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ apiKey, logs }),\n });\n if (!response.ok) {\n this.log(`Failed to send log batch: ${response.status}`);\n return false;\n }\n return true;\n } catch (err) {\n this.log(`Network error sending log batch: ${err}`);\n return false;\n }\n }\n\n // ─── Feedback ─────────────────────────────────────────────────────\n\n async sendFeedback(payload: Record<string, unknown>): Promise<boolean> {\n try {\n const response = await fetch(`${this.host}/feedback`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(payload),\n });\n if (!response.ok) {\n this.log(`Failed to send feedback: ${response.status}`);\n return false;\n }\n this.log(\"Feedback sent\");\n return true;\n } catch (err) {\n this.log(`Network error sending feedback: ${err}`);\n return false;\n }\n }\n\n // ─── Private ──────────────────────────────────────────────────────\n\n private chunk<T>(arr: T[], size: number): T[][] {\n return Array.from({ length: Math.ceil(arr.length / size) }, (_, i) =>\n arr.slice(i * size, i * size + size),\n );\n }\n\n private log(message: string): void {\n if (this.debug) {\n console.log(`[PulseBoard] ${message}`);\n }\n }\n}\n","import type { TurboModule } from \"react-native\";\nimport { TurboModuleRegistry } from \"react-native\";\n\nexport type DeviceInfo = {\n model: string;\n manufacturer: string;\n brand: string;\n os: string;\n osVersion: string;\n appVersion: string;\n buildNumber: string;\n bundleId: string;\n screenWidth: number;\n screenHeight: number;\n isTablet: boolean;\n isEmulator: boolean;\n};\n\nexport interface Spec extends TurboModule {\n getDeviceInfo(): Promise<DeviceInfo>;\n}\n\nexport default TurboModuleRegistry.getEnforcing<Spec>(\"PulseBoardDevice\");\n","import type { TurboModule } from \"react-native\";\nimport { TurboModuleRegistry } from \"react-native\";\n\nexport type NetowrkInfo = {\n type: string;\n isConnected: boolean;\n isWifiEnabled: boolean;\n carrier: string;\n ipAddress: string;\n};\n\nexport interface Spec extends TurboModule {\n getNetworkInfo(): Promise<NetowrkInfo>;\n}\n\nexport default TurboModuleRegistry.getEnforcing<Spec>(\"PulseBoardNetwork\");\n","import { Dimensions, I18nManager, Platform } from \"react-native\";\nimport NativePulseBoardDevice from \"./specs/NativePulseBoardDevice\";\nimport NativePulseBoardNetwork from \"./specs/NativePulseBoardNetwork\";\nimport {\n AppContext,\n DeviceContext,\n EnrichedContext,\n NetworkContext,\n NetworkType,\n SessionContext,\n UserContext,\n} from \"./types\";\n\nfunction generateSessionId(): string {\n const timestamp = Date.now().toString(36);\n const random = Math.random().toString(36).substring(2, 10);\n return `${timestamp}-${random}`;\n}\n\nfunction mapNetworkType(type: string): NetworkType {\n switch (type) {\n case \"wifi\":\n return \"wifi\";\n case \"cellular\":\n return \"cellular\";\n case \"offline\":\n return \"offline\";\n default:\n return \"unknown\";\n }\n}\n\nfunction getTimezone(): string {\n try {\n return Intl.DateTimeFormat().resolvedOptions().timeZone;\n } catch {\n return \"unknown\";\n }\n}\n\nfunction getLanguage(): string {\n try {\n return (\n I18nManager.getConstants?.()?.localeIdentifier?.replace(\"_\", \"-\") ??\n Intl.DateTimeFormat().resolvedOptions().locale ??\n \"unknown\"\n );\n } catch {\n return \"unknown\";\n }\n}\n\nexport class ContextCollector {\n private sessionContext: SessionContext;\n private appContext: AppContext;\n private userContext: UserContext = {};\n\n constructor(appContext: AppContext = {}) {\n this.appContext = appContext;\n this.sessionContext = {\n sessionId: generateSessionId(),\n startedAt: new Date().toISOString(),\n };\n }\n\n identify(user: UserContext): void {\n this.userContext = { ...this.userContext, ...user };\n }\n\n clearUser(): void {\n this.userContext = {};\n }\n\n async collect(): Promise<EnrichedContext> {\n const { width, height } = Dimensions.get(\"window\");\n\n // Collect device info — fall back gracefully if native module unavailable\n let deviceInfo = null;\n let networkInfo = null;\n\n try {\n if (NativePulseBoardDevice) {\n deviceInfo = await NativePulseBoardDevice.getDeviceInfo();\n }\n } catch (e) {\n console.warn(\"[PulseBoard] Failed to collect device info:\", e);\n }\n\n try {\n if (NativePulseBoardNetwork) {\n networkInfo = await NativePulseBoardNetwork.getNetworkInfo();\n }\n } catch (e) {\n console.warn(\"[PulseBoard] Failed to collect network info:\", e);\n }\n\n const device: DeviceContext = {\n platform: Platform.OS === \"ios\" ? \"ios\" : \"android\",\n os: deviceInfo?.os ?? (Platform.OS === \"ios\" ? \"iOS\" : \"Android\"),\n osVersion:\n deviceInfo?.osVersion ?? Platform.Version?.toString() ?? \"unknown\",\n model: deviceInfo?.model ?? \"unknown\",\n manufacturer: deviceInfo?.manufacturer ?? \"unknown\",\n brand: deviceInfo?.brand ?? \"unknown\",\n isTablet: deviceInfo?.isTablet ?? false,\n appVersion: deviceInfo?.appVersion ?? \"unknown\",\n buildNumber: deviceInfo?.buildNumber ?? \"unknown\",\n bundleId: deviceInfo?.bundleId ?? \"unknown\",\n screenWidth: deviceInfo?.screenWidth ?? width,\n screenHeight: deviceInfo?.screenHeight ?? height,\n fontScale: Dimensions.get(\"window\").fontScale ?? 1,\n isEmulator: deviceInfo?.isEmulator ?? false,\n language: getLanguage(),\n timezone: getTimezone(),\n };\n\n const network: NetworkContext = {\n type: mapNetworkType(networkInfo?.type ?? \"unknown\"),\n isConnected: networkInfo?.isConnected ?? false,\n isWifiEnabled: networkInfo?.isWifiEnabled ?? false,\n carrier: networkInfo?.carrier ?? \"unknown\",\n ipAddress: networkInfo?.ipAddress ?? \"unknown\",\n };\n\n return {\n app: this.appContext,\n device,\n network,\n session: this.sessionContext,\n user: this.userContext,\n };\n }\n}\n","import { PulseEvent, StorageAdapter } from \"./types\";\n\nconst QUEUE_KEY = \"@pulseboard/event_queue\";\nconst MAX_QUEUE_SIZE = 100;\n\nexport class EventQueue {\n private memoryQueue: PulseEvent[] = [];\n private maxSize: number;\n private _hydrated: boolean = false;\n private storage: StorageAdapter | null = null;\n\n constructor(maxSize = MAX_QUEUE_SIZE, storage?: StorageAdapter) {\n this.maxSize = maxSize;\n this.storage = storage ?? null;\n this.hydrate();\n }\n\n private async hydrate(): Promise<void> {\n try {\n if (this.storage) {\n const raw = await this.storage.getItem(QUEUE_KEY);\n if (raw) {\n const stored = JSON.parse(raw) as PulseEvent[];\n this.memoryQueue = stored.slice(0, this.maxSize);\n }\n }\n } catch {\n // Fall back to in-memory only\n } finally {\n this._hydrated = true;\n }\n }\n\n private async persist(): Promise<void> {\n try {\n if (this.storage) {\n await this.storage.setItem(QUEUE_KEY, JSON.stringify(this.memoryQueue));\n }\n } catch {\n // Non-fatal\n }\n }\n\n enqueue(event: PulseEvent): void {\n if (this.memoryQueue.length >= this.maxSize) this.memoryQueue.shift();\n this.memoryQueue.push(event);\n this.persist();\n }\n\n dequeue(count: number): PulseEvent[] {\n const batch = this.memoryQueue.splice(0, count);\n this.persist();\n return batch;\n }\n\n get size(): number {\n return this.memoryQueue.length;\n }\n get isEmpty(): boolean {\n return this.memoryQueue.length === 0;\n }\n get hydrated(): boolean {\n return this._hydrated;\n }\n\n async clear(): Promise<void> {\n this.memoryQueue = [];\n try {\n if (this.storage) await this.storage.removeItem(QUEUE_KEY);\n } catch {}\n }\n}\n","import { AutoCapture } from \"./auto-capture\";\nimport { PulseBoardClient } from \"./client\";\nimport { ContextCollector } from \"./context\";\nimport { EventQueue } from \"./queue\";\nimport {\n CaptureErrorOptions,\n EnrichedContext,\n FeedbackOptions,\n LogEntry,\n LogLevel,\n LogOptions,\n PulseEvent,\n SDKConfig,\n TrackOptions,\n UserContext,\n} from \"./types\";\n\nclass PulseBoardSDK {\n private config: SDKConfig | null = null;\n private client: PulseBoardClient | null = null;\n private queue: EventQueue | null = null;\n private autoCapture: AutoCapture | null = null;\n private contextCollector: ContextCollector | null = null;\n private flushTimer: ReturnType<typeof setInterval> | null = null;\n private initialized: boolean = false;\n private readonly PULSEBOARD_API: string =\n \"https://pulseboard-production.up.railway.app/\";\n\n // ─── Log queue ────────────────────────────────────────────────────\n private logQueue: Omit<LogEntry, \"apiKey\">[] = [];\n private logFlushTimer: ReturnType<typeof setInterval> | null = null;\n private originalConsole: Partial<typeof console> = {};\n private consoleCapturing: boolean = false;\n\n // ─── Public API ───────────────────────────────────────────────────\n\n init(config: SDKConfig): void {\n if (this.initialized) {\n this.debugLog(\"SDK already initialized — skipping\");\n return;\n }\n\n if (!config.apiKey) {\n throw new Error(\"[PulseBoard] init() requires an apiKey\");\n }\n\n this.config = {\n autoCapture: true,\n debug: false,\n flushInterval: 5000,\n maxQueueSize: 100,\n ...config,\n };\n\n this.client = new PulseBoardClient(this.PULSEBOARD_API, this.config.debug);\n this.queue = new EventQueue(this.config.maxQueueSize, this.config.storage);\n this.contextCollector = new ContextCollector({\n environment: config.environment,\n });\n\n this.completeInit();\n }\n\n private completeInit(): void {\n this.flushTimer = setInterval(\n () => this.flush(),\n this.config!.flushInterval,\n );\n\n if (this.config!.autoCapture) {\n this.autoCapture = new AutoCapture((name, error, context) => {\n this.captureError(error, { payload: context });\n });\n this.autoCapture.attach();\n }\n\n this.initialized = true;\n this.debugLog(`Initialized — host: ${this.PULSEBOARD_API}`);\n }\n\n async getContext(): Promise<EnrichedContext> {\n this.assertInitialized(\"getContext\");\n return this.contextCollector!.collect();\n }\n\n identify(user: UserContext): void {\n this.assertInitialized(\"identify\");\n this.contextCollector!.identify(user);\n this.debugLog(`User identified: ${JSON.stringify(user)}`);\n }\n\n clearUser(): void {\n this.assertInitialized(\"clearUser\");\n this.contextCollector!.clearUser();\n }\n\n track(name: string, options: TrackOptions = {}): void {\n this.assertInitialized(\"track\");\n this.buildAndEnqueue(\n \"event\",\n name,\n options.payload ?? {},\n options.timestamp,\n );\n }\n\n metric(name: string, value: number, options: TrackOptions = {}): void {\n this.assertInitialized(\"metric\");\n this.buildAndEnqueue(\n \"metric\",\n name,\n { value, ...options.payload },\n options.timestamp,\n );\n }\n\n captureError(error: Error, options: CaptureErrorOptions = {}): void {\n this.assertInitialized(\"captureError\");\n this.buildAndEnqueue(\"error\", error.name ?? \"UnknownError\", {\n message: error.message,\n stack: error.stack,\n ...options.payload,\n });\n }\n\n // ─── Logging API ──────────────────────────────────────────────────\n\n log(level: LogLevel, message: string, options: LogOptions = {}): void {\n this.assertInitialized(\"log\");\n this.contextCollector!.collect()\n .then((context) => {\n this.logQueue.push({\n level,\n message,\n meta: options.meta,\n sessionId: context.session.sessionId,\n appVersion: context.device.appVersion,\n timestamp: new Date().toISOString(),\n });\n\n // Flush immediately for errors\n if (level === \"error\") this.flushLogs();\n })\n .catch(() => {});\n }\n\n captureConsole(): void {\n this.assertInitialized(\"captureConsole\");\n if (this.consoleCapturing) return;\n\n this.originalConsole = {\n log: console.log,\n warn: console.warn,\n error: console.error,\n debug: console.debug,\n };\n\n console.log = (...args: unknown[]) => {\n this.originalConsole.log?.(...args);\n this.log(\"info\", args.map(String).join(\" \"));\n };\n\n console.warn = (...args: unknown[]) => {\n this.originalConsole.warn?.(...args);\n this.log(\"warn\", args.map(String).join(\" \"));\n };\n\n console.error = (...args: unknown[]) => {\n this.originalConsole.error?.(...args);\n this.log(\"error\", args.map(String).join(\" \"));\n };\n\n console.debug = (...args: unknown[]) => {\n this.originalConsole.debug?.(...args);\n this.log(\"debug\", args.map(String).join(\" \"));\n };\n\n this.logFlushTimer = setInterval(() => this.flushLogs(), 10000);\n this.consoleCapturing = true;\n this.debugLog(\"Console capture enabled\");\n }\n\n releaseConsole(): void {\n if (!this.consoleCapturing) return;\n\n if (this.originalConsole.log) console.log = this.originalConsole.log;\n if (this.originalConsole.warn) console.warn = this.originalConsole.warn;\n if (this.originalConsole.error) console.error = this.originalConsole.error;\n if (this.originalConsole.debug) console.debug = this.originalConsole.debug;\n\n if (this.logFlushTimer) {\n clearInterval(this.logFlushTimer);\n this.logFlushTimer = null;\n }\n\n this.originalConsole = {};\n this.consoleCapturing = false;\n }\n\n async flushLogs(): Promise<void> {\n if (!this.client || !this.config || this.logQueue.length === 0) return;\n const batch = this.logQueue.splice(0, this.logQueue.length);\n await this.client.sendLogBatch(this.config.apiKey, batch);\n }\n\n // ─── Analytics API ────────────────────────────────────────────────\n\n startSession(): void {\n this.assertInitialized(\"startSession\");\n this.contextCollector!.collect()\n .then((context) => {\n this.client!.sendAnalytics(\"session\", {\n apiKey: this.config?.apiKey,\n sessionId: context.session.sessionId,\n startedAt: context.session.startedAt,\n context,\n });\n this.debugLog(`Session started: ${context.session.sessionId}`);\n })\n .catch((err) => this.debugLog(`Failed to start session: ${err}`));\n }\n\n endSession(duration?: number): void {\n this.assertInitialized(\"endSession\");\n this.contextCollector!.collect()\n .then((context) => {\n this.client!.sendAnalytics(\"session\", {\n apiKey: this.config?.apiKey,\n sessionId: context.session.sessionId,\n startedAt: context.session.startedAt,\n endedAt: new Date().toISOString(),\n duration,\n context,\n });\n this.flush();\n this.debugLog(`Session ended: ${context.session.sessionId}`);\n })\n .catch((err) => this.debugLog(`Failed to end session: ${err}`));\n }\n\n trackScreen(screenName: string, loadTime?: number): void {\n this.assertInitialized(\"trackScreen\");\n this.contextCollector!.collect()\n .then((context) => {\n this.client!.sendAnalytics(\"screen-view\", {\n apiKey: this.config?.apiKey,\n screenName,\n loadTime,\n sessionId: context.session.sessionId,\n context,\n });\n this.debugLog(`Screen tracked: ${screenName}`);\n })\n .catch((err) => this.debugLog(`Failed to track screen: ${err}`));\n }\n\n trackApiCall(\n endpoint: string,\n httpMethod: string,\n statusCode: number,\n duration: number,\n payloadSize?: number,\n ): void {\n this.assertInitialized(\"trackApiCall\");\n this.contextCollector!.collect()\n .then((context) => {\n this.client!.sendAnalytics(\"api-call\", {\n apiKey: this.config?.apiKey,\n endpoint,\n httpMethod,\n statusCode,\n duration,\n payloadSize,\n sessionId: context.session.sessionId,\n context,\n });\n this.debugLog(\n `API call tracked: ${httpMethod} ${endpoint} ${statusCode}`,\n );\n })\n .catch((err) => this.debugLog(`Failed to track API call: ${err}`));\n }\n\n trackCrash(error: Error, isFatal = false): void {\n this.assertInitialized(\"trackCrash\");\n this.contextCollector!.collect()\n .then((context) => {\n this.client!.sendAnalytics(\"crash\", {\n apiKey: this.config?.apiKey,\n errorName: error.name,\n errorMessage: error.message,\n stackTrace: error.stack ?? \"\",\n isFatal,\n sessionId: context.session.sessionId,\n context,\n });\n this.debugLog(`Crash tracked: ${error.name} — fatal: ${isFatal}`);\n })\n .catch((err) => this.debugLog(`Failed to track crash: ${err}`));\n }\n\n feedback(message: string, options: FeedbackOptions = {}): void {\n this.assertInitialized(\"feedback\");\n this.contextCollector!.collect()\n .then((context) => {\n this.client!.sendFeedback({\n apiKey: this.config?.apiKey,\n type: options.type ?? \"general\",\n message,\n meta: options.meta,\n userEmail: options.userEmail,\n userName: options.userName,\n screenshot: options.screenshot,\n sessionId: context.session.sessionId,\n appVersion: context.device.appVersion,\n });\n this.debugLog(`Feedback sent: ${options.type ?? \"general\"}`);\n })\n .catch((err) => this.debugLog(`Failed to send feedback: ${err}`));\n }\n\n // ─── Flush & Destroy ──────────────────────────────────────────────\n\n async flush(): Promise<void> {\n if (!this.queue || !this.client) return;\n\n // Wait up to 500ms for hydration before first flush\n if (!this.queue.hydrated) {\n await new Promise<void>((resolve) => {\n const interval = setInterval(() => {\n if (this.queue?.hydrated) {\n clearInterval(interval);\n resolve();\n }\n }, 50);\n setTimeout(() => {\n clearInterval(interval);\n resolve();\n }, 500);\n });\n }\n\n if (this.queue.isEmpty) return;\n\n const events = this.queue.dequeue(10);\n this.debugLog(`Flushing ${events.length} event(s)`);\n await this.client.sendBatch(events);\n }\n\n destroy(): void {\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n this.flushTimer = null;\n }\n\n this.releaseConsole();\n this.autoCapture?.detach();\n this.queue?.clear();\n this.logQueue = [];\n\n this.initialized = false;\n this.config = null;\n this.client = null;\n this.queue = null;\n this.contextCollector = null;\n\n this.debugLog(\"SDK destroyed\");\n }\n\n // ─── Private ──────────────────────────────────────────────────────\n\n private buildAndEnqueue(\n type: \"event\" | \"metric\" | \"error\",\n name: string,\n payload: Record<string, unknown>,\n timestamp?: string,\n ): void {\n this.contextCollector!.collect()\n .then((context) => {\n const event: PulseEvent = {\n apiKey: this.config?.apiKey!,\n type,\n name,\n payload,\n timestamp: timestamp ?? new Date().toISOString(),\n context,\n };\n this.queue!.enqueue(event);\n this.debugLog(`Queued: ${type} — ${name}`);\n if (type === \"error\") this.flush();\n })\n .catch((err) => this.debugLog(`Failed to collect context: ${err}`));\n }\n\n private assertInitialized(method: string): void {\n if (!this.initialized) {\n throw new Error(`PulseBoard.${method}() called before PulseBoard.init()`);\n }\n }\n\n private debugLog(message: string): void {\n if (this.config?.debug) {\n console.log(`[PulseBoard] ${message}`);\n }\n }\n}\n\nexport const PulseBoard = new PulseBoardSDK();\n\nexport type {\n AppContext,\n CaptureErrorOptions,\n DeviceContext,\n EnrichedContext,\n EventType,\n LogEntry,\n LogLevel,\n LogOptions,\n NetworkContext,\n PulseEvent,\n SDKConfig,\n SessionContext,\n TrackOptions,\n UserContext,\n} from \"./types\";\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pulseboard/react-native",
3
- "version": "0.3.0",
3
+ "version": "0.3.2",
4
4
  "description": "Official PulseBoard SDK for React Native",
5
5
  "main": "./dist/index.cjs",
6
6
  "module": "./dist/index.mjs",
@@ -59,8 +59,5 @@
59
59
  "email": "m.arslanmushtaqahmed@gmail.com",
60
60
  "name": "Arslan Mushtaq",
61
61
  "url": "https://arslanmushtaq.com"
62
- },
63
- "dependencies": {
64
- "@react-native-async-storage/async-storage": "^3.0.1"
65
62
  }
66
63
  }