@pulseboard/react-native 0.1.1 → 0.2.1

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
@@ -1,10 +1,9 @@
1
1
  type EventType = "error" | "event" | "metric";
2
2
  type Platform = "ios" | "android" | "unknown";
3
3
  type NetworkType = "wifi" | "cellular" | "offline" | "unknown";
4
+ type Environment = "production" | "staging" | "development" | string;
4
5
  type AppContext = {
5
- appVersion?: string;
6
- buildNumber?: string;
7
- environment?: "production" | "staging" | "development";
6
+ environment?: Environment;
8
7
  };
9
8
  type UserContext = {
10
9
  userId?: string;
@@ -57,10 +56,9 @@ type PulseEvent = {
57
56
  };
58
57
  type SDKConfig = {
59
58
  apiKey: string;
60
- host: string;
61
- app?: AppContext;
62
- autoCapture?: boolean;
59
+ environment: Environment;
63
60
  debug?: boolean;
61
+ autoCapture?: boolean;
64
62
  flushInterval?: number;
65
63
  maxQueueSize?: number;
66
64
  };
@@ -80,6 +78,7 @@ declare class PulseBoardSDK {
80
78
  private contextCollector;
81
79
  private flushTimer;
82
80
  private initialized;
81
+ private readonly PULSEBOARD_API;
83
82
  init(config: SDKConfig): void;
84
83
  getContext(): Promise<EnrichedContext>;
85
84
  identify(user: UserContext): void;
package/dist/index.d.ts CHANGED
@@ -1,10 +1,9 @@
1
1
  type EventType = "error" | "event" | "metric";
2
2
  type Platform = "ios" | "android" | "unknown";
3
3
  type NetworkType = "wifi" | "cellular" | "offline" | "unknown";
4
+ type Environment = "production" | "staging" | "development" | string;
4
5
  type AppContext = {
5
- appVersion?: string;
6
- buildNumber?: string;
7
- environment?: "production" | "staging" | "development";
6
+ environment?: Environment;
8
7
  };
9
8
  type UserContext = {
10
9
  userId?: string;
@@ -57,10 +56,9 @@ type PulseEvent = {
57
56
  };
58
57
  type SDKConfig = {
59
58
  apiKey: string;
60
- host: string;
61
- app?: AppContext;
62
- autoCapture?: boolean;
59
+ environment: Environment;
63
60
  debug?: boolean;
61
+ autoCapture?: boolean;
64
62
  flushInterval?: number;
65
63
  maxQueueSize?: number;
66
64
  };
@@ -80,6 +78,7 @@ declare class PulseBoardSDK {
80
78
  private contextCollector;
81
79
  private flushTimer;
82
80
  private initialized;
81
+ private readonly PULSEBOARD_API;
83
82
  init(config: SDKConfig): void;
84
83
  getContext(): Promise<EnrichedContext>;
85
84
  identify(user: UserContext): void;
package/dist/index.js CHANGED
@@ -287,6 +287,42 @@ var require_rejection_tracking = __commonJS({
287
287
  }
288
288
  });
289
289
 
290
+ // src/auto-capture.ts
291
+ var AutoCapture = class {
292
+ constructor(handler) {
293
+ this.attached = false;
294
+ this.previousHandler = null;
295
+ this.handler = handler;
296
+ }
297
+ attach() {
298
+ if (this.attached) return;
299
+ this.previousHandler = ErrorUtils.getGlobalHandler();
300
+ ErrorUtils.setGlobalHandler((error, isFatal) => {
301
+ this.handler("uncaughtException", error, { isFatal: isFatal ?? false });
302
+ if (this.previousHandler) {
303
+ this.previousHandler(error, isFatal);
304
+ }
305
+ });
306
+ const tracking = require_rejection_tracking();
307
+ tracking.enable({
308
+ allRejections: true,
309
+ onUnhandled: (_id, error) => {
310
+ const err = error instanceof Error ? error : new Error(String(error));
311
+ this.handler("unhandledRejection", err, { fatal: false });
312
+ }
313
+ });
314
+ this.attached = true;
315
+ }
316
+ detach() {
317
+ if (!this.attached) return;
318
+ if (this.previousHandler) {
319
+ ErrorUtils.setGlobalHandler(this.previousHandler);
320
+ this.previousHandler = null;
321
+ }
322
+ this.attached = false;
323
+ }
324
+ };
325
+
290
326
  // src/client.ts
291
327
  var PulseBoardClient = class {
292
328
  constructor(host, debug = false) {
@@ -355,68 +391,6 @@ var PulseBoardClient = class {
355
391
  }
356
392
  }
357
393
  };
358
-
359
- // src/queue.ts
360
- var EventQueue = class {
361
- constructor(maxSize = 100) {
362
- this.queue = [];
363
- this.maxSize = maxSize;
364
- }
365
- enqueue(event) {
366
- if (this.queue.length >= this.maxSize) {
367
- this.queue.shift();
368
- }
369
- this.queue.push(event);
370
- }
371
- dequeue(count) {
372
- return this.queue.splice(0, count);
373
- }
374
- get size() {
375
- return this.queue.length;
376
- }
377
- get isEmpty() {
378
- return this.queue.length === 0;
379
- }
380
- clear() {
381
- this.queue = [];
382
- }
383
- };
384
-
385
- // src/auto-capture.ts
386
- var AutoCapture = class {
387
- constructor(handler) {
388
- this.attached = false;
389
- this.previousHandler = null;
390
- this.handler = handler;
391
- }
392
- attach() {
393
- if (this.attached) return;
394
- this.previousHandler = ErrorUtils.getGlobalHandler();
395
- ErrorUtils.setGlobalHandler((error, isFatal) => {
396
- this.handler("uncaughtException", error, { isFatal: isFatal ?? false });
397
- if (this.previousHandler) {
398
- this.previousHandler(error, isFatal);
399
- }
400
- });
401
- const tracking = require_rejection_tracking();
402
- tracking.enable({
403
- allRejections: true,
404
- onUnhandled: (_id, error) => {
405
- const err = error instanceof Error ? error : new Error(String(error));
406
- this.handler("unhandledRejection", err, { fatal: false });
407
- }
408
- });
409
- this.attached = true;
410
- }
411
- detach() {
412
- if (!this.attached) return;
413
- if (this.previousHandler) {
414
- ErrorUtils.setGlobalHandler(this.previousHandler);
415
- this.previousHandler = null;
416
- }
417
- this.attached = false;
418
- }
419
- };
420
394
  var NativePulseBoardDevice_default = reactNative.TurboModuleRegistry.getEnforcing("PulseBoardDevice");
421
395
  var NativePulseBoardNetwork_default = reactNative.TurboModuleRegistry.getEnforcing("PulseBoardNetwork");
422
396
 
@@ -493,8 +467,8 @@ var ContextCollector = class {
493
467
  manufacturer: deviceInfo?.manufacturer ?? "unknown",
494
468
  brand: deviceInfo?.brand ?? "unknown",
495
469
  isTablet: deviceInfo?.isTablet ?? false,
496
- appVersion: this.appContext.appVersion ?? deviceInfo?.appVersion ?? "unknown",
497
- buildNumber: this.appContext.buildNumber ?? deviceInfo?.buildNumber ?? "unknown",
470
+ appVersion: deviceInfo?.appVersion ?? "unknown",
471
+ buildNumber: deviceInfo?.buildNumber ?? "unknown",
498
472
  bundleId: deviceInfo?.bundleId ?? "unknown",
499
473
  screenWidth: deviceInfo?.screenWidth ?? width,
500
474
  screenHeight: deviceInfo?.screenHeight ?? height,
@@ -520,6 +494,32 @@ var ContextCollector = class {
520
494
  }
521
495
  };
522
496
 
497
+ // src/queue.ts
498
+ var EventQueue = class {
499
+ constructor(maxSize = 100) {
500
+ this.queue = [];
501
+ this.maxSize = maxSize;
502
+ }
503
+ enqueue(event) {
504
+ if (this.queue.length >= this.maxSize) {
505
+ this.queue.shift();
506
+ }
507
+ this.queue.push(event);
508
+ }
509
+ dequeue(count) {
510
+ return this.queue.splice(0, count);
511
+ }
512
+ get size() {
513
+ return this.queue.length;
514
+ }
515
+ get isEmpty() {
516
+ return this.queue.length === 0;
517
+ }
518
+ clear() {
519
+ this.queue = [];
520
+ }
521
+ };
522
+
523
523
  // src/index.ts
524
524
  var PulseBoardSDK = class {
525
525
  constructor() {
@@ -530,6 +530,7 @@ var PulseBoardSDK = class {
530
530
  this.contextCollector = null;
531
531
  this.flushTimer = null;
532
532
  this.initialized = false;
533
+ this.PULSEBOARD_API = "https://pulseboard-production.up.railway.app/";
533
534
  }
534
535
  // ─── Public API ───────────────────────────────────────────────────
535
536
  init(config) {
@@ -544,9 +545,11 @@ var PulseBoardSDK = class {
544
545
  maxQueueSize: 100,
545
546
  ...config
546
547
  };
547
- this.client = new PulseBoardClient(this.config.host, this.config.debug);
548
+ this.client = new PulseBoardClient(this.PULSEBOARD_API, this.config.debug);
548
549
  this.queue = new EventQueue(this.config.maxQueueSize);
549
- this.contextCollector = new ContextCollector(this.config.app ?? {});
550
+ this.contextCollector = new ContextCollector({
551
+ environment: config.environment
552
+ });
550
553
  this.flushTimer = setInterval(
551
554
  () => this.flush(),
552
555
  this.config.flushInterval
@@ -558,7 +561,7 @@ var PulseBoardSDK = class {
558
561
  this.autoCapture.attach();
559
562
  }
560
563
  this.initialized = true;
561
- this.log(`Initialized \u2014 host: ${this.config.host}`);
564
+ this.log(`Initialized \u2014 host: ${this.PULSEBOARD_API}`);
562
565
  }
563
566
  async getContext() {
564
567
  this.assertInitialized("getContext");
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/client.ts","../src/queue.ts","../src/auto-capture.ts","../src/specs/NativePulseBoardDevice.ts","../src/specs/NativePulseBoardNetwork.ts","../src/context.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}","import { 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 // ─── 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 { PulseEvent } from \"./types\";\n\nexport class EventQueue {\n private queue: PulseEvent[] = [];\n private maxSize: number;\n\n constructor(maxSize = 100) {\n this.maxSize = maxSize;\n }\n\n enqueue(event: PulseEvent): void {\n if (this.queue.length >= this.maxSize) {\n this.queue.shift();\n }\n\n this.queue.push(event);\n }\n\n dequeue(count: number): PulseEvent[] {\n return this.queue.splice(0, count);\n }\n\n get size(): number {\n return this.queue.length;\n }\n\n get isEmpty(): boolean {\n return this.queue.length === 0;\n }\n\n clear(): void {\n this.queue = [];\n }\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 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 { Platform, Dimensions, I18nManager } from \"react-native\";\nimport NativePulseBoardDevice from \"./specs/NativePulseBoardDevice\";\nimport NativePulseBoardNetwork from \"./specs/NativePulseBoardNetwork\";\nimport {\n Platform as PlatformType,\n NetworkType,\n DeviceContext,\n NetworkContext,\n SessionContext,\n AppContext,\n UserContext,\n EnrichedContext,\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:\n this.appContext.appVersion ?? deviceInfo?.appVersion ?? \"unknown\",\n buildNumber:\n this.appContext.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 {\n SDKConfig,\n TrackOptions,\n CaptureErrorOptions,\n PulseEvent,\n UserContext,\n EnrichedContext,\n} from \"./types\";\nimport { PulseBoardClient } from \"./client\";\nimport { EventQueue } from \"./queue\";\nimport { AutoCapture } from \"./auto-capture\";\nimport { ContextCollector } from \"./context\";\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\n // ─── Public API ───────────────────────────────────────────────────\n\n init(config: SDKConfig): void {\n if (this.initialized) {\n this.log(\"SDK already initialized — skipping\");\n return;\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.config.host, this.config.debug);\n this.queue = new EventQueue(this.config.maxQueueSize);\n this.contextCollector = new ContextCollector(this.config.app ?? {});\n\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.log(`Initialized — host: ${this.config.host}`);\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.log(`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 // ─── 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.log(`Session started: ${context.session.sessionId}`);\n })\n .catch((err) => {\n this.log(`Failed to start session: ${err}`);\n });\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.log(`Session ended: ${context.session.sessionId}`);\n })\n .catch((err) => {\n this.log(`Failed to end session: ${err}`);\n });\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.log(`Screen tracked: ${screenName}`);\n })\n .catch((err) => {\n this.log(`Failed to track screen: ${err}`);\n });\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.log(`API call tracked: ${httpMethod} ${endpoint} ${statusCode}`);\n })\n .catch((err) => {\n this.log(`Failed to track API call: ${err}`);\n });\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.log(`Crash tracked: ${error.name} — fatal: ${isFatal}`);\n })\n .catch((err) => {\n this.log(`Failed to track crash: ${err}`);\n });\n }\n\n // ─── Flush & Destroy ─────────────────────────────────────────────\n\n async flush(): Promise<void> {\n if (!this.queue || this.queue.isEmpty) return;\n if (!this.client) return;\n\n const events = this.queue.dequeue(10);\n this.log(`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.autoCapture?.detach();\n this.queue?.clear();\n\n this.initialized = false;\n this.config = null;\n this.client = null;\n this.queue = null;\n this.contextCollector = null;\n\n this.log(\"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\n this.queue!.enqueue(event);\n this.log(`Queued: ${type} — ${name}`);\n\n if (type === \"error\") {\n this.flush();\n }\n })\n .catch((err) => {\n this.log(`Failed to collect context: ${err}`);\n });\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 log(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 SDKConfig,\n TrackOptions,\n CaptureErrorOptions,\n PulseEvent,\n EventType,\n UserContext,\n AppContext,\n DeviceContext,\n NetworkContext,\n SessionContext,\n EnrichedContext,\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":";;;;;;;;;;AAAA,IAAA,YAAA,GAAA,UAAA,CAAA;AAAA,EAAA,2CAAA,CAAAA,SAAA,EAAA,MAAA,EAAA;AAIA,IAAA,SAAS,IAAA,GAAO;AAAA,IAAC;AAmBjB,IAAA,IAAI,UAAA,GAAa,IAAA;AACjB,IAAA,IAAI,WAAW,EAAC;AAChB,IAAA,SAAS,QAAQ,GAAA,EAAK;AACpB,MAAA,IAAI;AACF,QAAA,OAAO,GAAA,CAAI,IAAA;AAAA,MACb,SAAS,EAAA,EAAI;AACX,QAAA,UAAA,GAAa,EAAA;AACb,QAAA,OAAO,QAAA;AAAA,MACT;AAAA,IACF;AAEA,IAAA,SAAS,UAAA,CAAW,IAAI,CAAA,EAAG;AACzB,MAAA,IAAI;AACF,QAAA,OAAO,GAAG,CAAC,CAAA;AAAA,MACb,SAAS,EAAA,EAAI;AACX,QAAA,UAAA,GAAa,EAAA;AACb,QAAA,OAAO,QAAA;AAAA,MACT;AAAA,IACF;AACA,IAAA,SAAS,UAAA,CAAW,EAAA,EAAI,CAAA,EAAG,CAAA,EAAG;AAC5B,MAAA,IAAI;AACF,QAAA,EAAA,CAAG,GAAG,CAAC,CAAA;AAAA,MACT,SAAS,EAAA,EAAI;AACX,QAAA,UAAA,GAAa,EAAA;AACb,QAAA,OAAO,QAAA;AAAA,MACT;AAAA,IACF;AAEA,IAAA,MAAA,CAAO,OAAA,GAAUC,QAAAA;AAEjB,IAAA,SAASA,SAAQ,EAAA,EAAI;AACnB,MAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAC5B,QAAA,MAAM,IAAI,UAAU,sCAAsC,CAAA;AAAA,MAC5D;AACA,MAAA,IAAI,OAAO,OAAO,UAAA,EAAY;AAC5B,QAAA,MAAM,IAAI,UAAU,kDAAmD,CAAA;AAAA,MACzE;AACA,MAAA,IAAA,CAAK,EAAA,GAAK,CAAA;AACV,MAAA,IAAA,CAAK,EAAA,GAAK,CAAA;AACV,MAAA,IAAA,CAAK,EAAA,GAAK,IAAA;AACV,MAAA,IAAA,CAAK,EAAA,GAAK,IAAA;AACV,MAAA,IAAI,OAAO,IAAA,EAAM;AACjB,MAAA,SAAA,CAAU,IAAI,IAAI,CAAA;AAAA,IACpB;AACA,IAAAA,SAAQ,EAAA,GAAK,IAAA;AACb,IAAAA,SAAQ,EAAA,GAAK,IAAA;AACb,IAAAA,SAAQ,EAAA,GAAK,IAAA;AAEb,IAAAA,QAAAA,CAAQ,SAAA,CAAU,IAAA,GAAO,SAAS,aAAa,UAAA,EAAY;AACzD,MAAA,IAAI,IAAA,CAAK,gBAAgBA,QAAAA,EAAS;AAChC,QAAA,OAAO,QAAA,CAAS,IAAA,EAAM,WAAA,EAAa,UAAU,CAAA;AAAA,MAC/C;AACA,MAAA,IAAI,GAAA,GAAM,IAAIA,QAAAA,CAAQ,IAAI,CAAA;AAC1B,MAAA,MAAA,CAAO,MAAM,IAAI,OAAA,CAAQ,WAAA,EAAa,UAAA,EAAY,GAAG,CAAC,CAAA;AACtD,MAAA,OAAO,GAAA;AAAA,IACT,CAAA;AAEA,IAAA,SAAS,QAAA,CAAS,IAAA,EAAM,WAAA,EAAa,UAAA,EAAY;AAC/C,MAAA,OAAO,IAAI,IAAA,CAAK,WAAA,CAAY,SAAUC,UAASC,OAAAA,EAAQ;AACrD,QAAA,IAAI,GAAA,GAAM,IAAIF,QAAAA,CAAQ,IAAI,CAAA;AAC1B,QAAA,GAAA,CAAI,IAAA,CAAKC,UAASC,OAAM,CAAA;AACxB,QAAA,MAAA,CAAO,MAAM,IAAI,OAAA,CAAQ,WAAA,EAAa,UAAA,EAAY,GAAG,CAAC,CAAA;AAAA,MACxD,CAAC,CAAA;AAAA,IACH;AACA,IAAA,SAAS,MAAA,CAAO,MAAM,QAAA,EAAU;AAC9B,MAAA,OAAO,IAAA,CAAK,OAAO,CAAA,EAAG;AACpB,QAAA,IAAA,GAAO,IAAA,CAAK,EAAA;AAAA,MACd;AACA,MAAA,IAAIF,SAAQ,EAAA,EAAI;AACd,QAAAA,QAAAA,CAAQ,GAAG,IAAI,CAAA;AAAA,MACjB;AACA,MAAA,IAAI,IAAA,CAAK,OAAO,CAAA,EAAG;AACjB,QAAA,IAAI,IAAA,CAAK,OAAO,CAAA,EAAG;AACjB,UAAA,IAAA,CAAK,EAAA,GAAK,CAAA;AACV,UAAA,IAAA,CAAK,EAAA,GAAK,QAAA;AACV,UAAA;AAAA,QACF;AACA,QAAA,IAAI,IAAA,CAAK,OAAO,CAAA,EAAG;AACjB,UAAA,IAAA,CAAK,EAAA,GAAK,CAAA;AACV,UAAA,IAAA,CAAK,EAAA,GAAK,CAAC,IAAA,CAAK,EAAA,EAAI,QAAQ,CAAA;AAC5B,UAAA;AAAA,QACF;AACA,QAAA,IAAA,CAAK,EAAA,CAAG,KAAK,QAAQ,CAAA;AACrB,QAAA;AAAA,MACF;AACA,MAAA,cAAA,CAAe,MAAM,QAAQ,CAAA;AAAA,IAC/B;AAEA,IAAA,SAAS,cAAA,CAAe,MAAM,QAAA,EAAU;AACtC,MAAA,YAAA,CAAa,WAAW;AACtB,QAAA,IAAI,KAAK,IAAA,CAAK,EAAA,KAAO,CAAA,GAAI,QAAA,CAAS,cAAc,QAAA,CAAS,UAAA;AACzD,QAAA,IAAI,OAAO,IAAA,EAAM;AACf,UAAA,IAAI,IAAA,CAAK,OAAO,CAAA,EAAG;AACjB,YAAA,OAAA,CAAQ,QAAA,CAAS,OAAA,EAAS,IAAA,CAAK,EAAE,CAAA;AAAA,UACnC,CAAA,MAAO;AACL,YAAA,MAAA,CAAO,QAAA,CAAS,OAAA,EAAS,IAAA,CAAK,EAAE,CAAA;AAAA,UAClC;AACA,UAAA;AAAA,QACF;AACA,QAAA,IAAI,GAAA,GAAM,UAAA,CAAW,EAAA,EAAI,IAAA,CAAK,EAAE,CAAA;AAChC,QAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,UAAA,MAAA,CAAO,QAAA,CAAS,SAAS,UAAU,CAAA;AAAA,QACrC,CAAA,MAAO;AACL,UAAA,OAAA,CAAQ,QAAA,CAAS,SAAS,GAAG,CAAA;AAAA,QAC/B;AAAA,MACF,CAAC,CAAA;AAAA,IACH;AACA,IAAA,SAAS,OAAA,CAAQ,MAAM,QAAA,EAAU;AAE/B,MAAA,IAAI,aAAa,IAAA,EAAM;AACrB,QAAA,OAAO,MAAA;AAAA,UACL,IAAA;AAAA,UACA,IAAI,UAAU,2CAA2C;AAAA,SAC3D;AAAA,MACF;AACA,MAAA,IACE,aACC,OAAO,QAAA,KAAa,QAAA,IAAY,OAAO,aAAa,UAAA,CAAA,EACrD;AACA,QAAA,IAAI,IAAA,GAAO,QAAQ,QAAQ,CAAA;AAC3B,QAAA,IAAI,SAAS,QAAA,EAAU;AACrB,UAAA,OAAO,MAAA,CAAO,MAAM,UAAU,CAAA;AAAA,QAChC;AACA,QAAA,IACE,IAAA,KAAS,IAAA,CAAK,IAAA,IACd,QAAA,YAAoBA,QAAAA,EACpB;AACA,UAAA,IAAA,CAAK,EAAA,GAAK,CAAA;AACV,UAAA,IAAA,CAAK,EAAA,GAAK,QAAA;AACV,UAAA,MAAA,CAAO,IAAI,CAAA;AACX,UAAA;AAAA,QACF,CAAA,MAAA,IAAW,OAAO,IAAA,KAAS,UAAA,EAAY;AACrC,UAAA,SAAA,CAAU,IAAA,CAAK,IAAA,CAAK,QAAQ,CAAA,EAAG,IAAI,CAAA;AACnC,UAAA;AAAA,QACF;AAAA,MACF;AACA,MAAA,IAAA,CAAK,EAAA,GAAK,CAAA;AACV,MAAA,IAAA,CAAK,EAAA,GAAK,QAAA;AACV,MAAA,MAAA,CAAO,IAAI,CAAA;AAAA,IACb;AAEA,IAAA,SAAS,MAAA,CAAO,MAAM,QAAA,EAAU;AAC9B,MAAA,IAAA,CAAK,EAAA,GAAK,CAAA;AACV,MAAA,IAAA,CAAK,EAAA,GAAK,QAAA;AACV,MAAA,IAAIA,SAAQ,EAAA,EAAI;AACd,QAAAA,QAAAA,CAAQ,EAAA,CAAG,IAAA,EAAM,QAAQ,CAAA;AAAA,MAC3B;AACA,MAAA,MAAA,CAAO,IAAI,CAAA;AAAA,IACb;AACA,IAAA,SAAS,OAAO,IAAA,EAAM;AACpB,MAAA,IAAI,IAAA,CAAK,OAAO,CAAA,EAAG;AACjB,QAAA,MAAA,CAAO,IAAA,EAAM,KAAK,EAAE,CAAA;AACpB,QAAA,IAAA,CAAK,EAAA,GAAK,IAAA;AAAA,MACZ;AACA,MAAA,IAAI,IAAA,CAAK,OAAO,CAAA,EAAG;AACjB,QAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,EAAA,CAAG,QAAQ,CAAA,EAAA,EAAK;AACvC,UAAA,MAAA,CAAO,IAAA,EAAM,IAAA,CAAK,EAAA,CAAG,CAAC,CAAC,CAAA;AAAA,QACzB;AACA,QAAA,IAAA,CAAK,EAAA,GAAK,IAAA;AAAA,MACZ;AAAA,IACF;AAEA,IAAA,SAAS,OAAA,CAAQ,WAAA,EAAa,UAAA,EAAY,OAAA,EAAQ;AAChD,MAAA,IAAA,CAAK,WAAA,GAAc,OAAO,WAAA,KAAgB,UAAA,GAAa,WAAA,GAAc,IAAA;AACrE,MAAA,IAAA,CAAK,UAAA,GAAa,OAAO,UAAA,KAAe,UAAA,GAAa,UAAA,GAAa,IAAA;AAClE,MAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AAAA,IACjB;AAQA,IAAA,SAAS,SAAA,CAAU,IAAI,OAAA,EAAS;AAC9B,MAAA,IAAI,IAAA,GAAO,KAAA;AACX,MAAA,IAAI,GAAA,GAAM,UAAA,CAAW,EAAA,EAAI,SAAU,KAAA,EAAO;AACxC,QAAA,IAAI,IAAA,EAAM;AACV,QAAA,IAAA,GAAO,IAAA;AACP,QAAA,OAAA,CAAQ,SAAS,KAAK,CAAA;AAAA,MACxB,CAAA,EAAG,SAAU,MAAA,EAAQ;AACnB,QAAA,IAAI,IAAA,EAAM;AACV,QAAA,IAAA,GAAO,IAAA;AACP,QAAA,MAAA,CAAO,SAAS,MAAM,CAAA;AAAA,MACxB,CAAC,CAAA;AACD,MAAA,IAAI,CAAC,IAAA,IAAQ,GAAA,KAAQ,QAAA,EAAU;AAC7B,QAAA,IAAA,GAAO,IAAA;AACP,QAAA,MAAA,CAAO,SAAS,UAAU,CAAA;AAAA,MAC5B;AAAA,IACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACpNA,IAAA,0BAAA,GAAA,UAAA,CAAA;AAAA,EAAA,yDAAA,CAAAD,SAAA,EAAA;AAEA,IAAA,IAAIC,QAAAA,GAAU,YAAA,EAAA;AAEd,IAAA,IAAI,iBAAA,GAAoB;AAAA,MACtB,cAAA;AAAA,MACA,SAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,IAAI,OAAA,GAAU,KAAA;AACd,IAAAD,SAAA,CAAQ,OAAA,GAAU,OAAA;AAClB,IAAA,SAAS,OAAA,GAAU;AACjB,MAAA,OAAA,GAAU,KAAA;AACV,MAAAC,SAAQ,EAAA,GAAK,IAAA;AACb,MAAAA,SAAQ,EAAA,GAAK,IAAA;AAAA,IACf;AAEA,IAAAD,SAAA,CAAQ,MAAA,GAAS,MAAA;AACjB,IAAA,SAAS,OAAO,OAAA,EAAS;AACvB,MAAA,OAAA,GAAU,WAAW,EAAC;AACtB,MAAA,IAAI,SAAS,OAAA,EAAQ;AACrB,MAAA,OAAA,GAAU,IAAA;AACV,MAAA,IAAI,EAAA,GAAK,CAAA;AACT,MAAA,IAAI,SAAA,GAAY,CAAA;AAChB,MAAA,IAAI,aAAa,EAAC;AAClB,MAAAC,QAAAA,CAAQ,EAAA,GAAK,SAAU,OAAA,EAAS;AAC9B,QAAA,IACE,QAAQ,EAAA,KAAO,CAAA;AAAA,QACf,UAAA,CAAW,OAAA,CAAQ,EAAE,CAAA,EACrB;AACA,UAAA,IAAI,UAAA,CAAW,OAAA,CAAQ,EAAE,CAAA,CAAE,MAAA,EAAQ;AACjC,YAAA,SAAA,CAAU,QAAQ,EAAE,CAAA;AAAA,UACtB,CAAA,MAAO;AACL,YAAA,YAAA,CAAa,UAAA,CAAW,OAAA,CAAQ,EAAE,CAAA,CAAE,OAAO,CAAA;AAAA,UAC7C;AACA,UAAA,OAAO,UAAA,CAAW,QAAQ,EAAE,CAAA;AAAA,QAC9B;AAAA,MACF,CAAA;AACA,MAAAA,QAAAA,CAAQ,EAAA,GAAK,SAAU,OAAA,EAAS,GAAA,EAAK;AACnC,QAAA,IAAI,OAAA,CAAQ,OAAO,CAAA,EAAG;AACpB,UAAA,OAAA,CAAQ,EAAA,GAAK,EAAA,EAAA;AACb,UAAA,UAAA,CAAW,OAAA,CAAQ,EAAE,CAAA,GAAI;AAAA,YACvB,SAAA,EAAW,IAAA;AAAA,YACX,KAAA,EAAO,GAAA;AAAA,YACP,OAAA,EAAS,UAAA;AAAA,cACP,WAAA,CAAY,IAAA,CAAK,IAAA,EAAM,OAAA,CAAQ,EAAE,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAKjC,cAAA,CAAe,GAAA,EAAK,iBAAiB,CAAA,GACjC,GAAA,GACA;AAAA,aACN;AAAA,YACA,MAAA,EAAQ;AAAA,WACV;AAAA,QACF;AAAA,MACF,CAAA;AACA,MAAA,SAAS,YAAYG,GAAAA,EAAI;AACvB,QAAA,IACE,QAAQ,aAAA,IACR,cAAA;AAAA,UACE,UAAA,CAAWA,GAAE,CAAA,CAAE,KAAA;AAAA,UACf,QAAQ,SAAA,IAAa;AAAA,SACvB,EACA;AACA,UAAA,UAAA,CAAWA,GAAE,EAAE,SAAA,GAAY,SAAA,EAAA;AAC3B,UAAA,IAAI,QAAQ,WAAA,EAAa;AACvB,YAAA,UAAA,CAAWA,GAAE,EAAE,MAAA,GAAS,IAAA;AACxB,YAAA,OAAA,CAAQ,WAAA;AAAA,cACN,UAAA,CAAWA,GAAE,CAAA,CAAE,SAAA;AAAA,cACf,UAAA,CAAWA,GAAE,CAAA,CAAE;AAAA,aACjB;AAAA,UACF,CAAA,MAAO;AACL,YAAA,UAAA,CAAWA,GAAE,EAAE,MAAA,GAAS,IAAA;AACxB,YAAA,QAAA;AAAA,cACE,UAAA,CAAWA,GAAE,CAAA,CAAE,SAAA;AAAA,cACf,UAAA,CAAWA,GAAE,CAAA,CAAE;AAAA,aACjB;AAAA,UACF;AAAA,QACF;AAAA,MACF;AACA,MAAA,SAAS,UAAUA,GAAAA,EAAI;AACrB,QAAA,IAAI,UAAA,CAAWA,GAAE,CAAA,CAAE,MAAA,EAAQ;AACzB,UAAA,IAAI,QAAQ,SAAA,EAAW;AACrB,YAAA,OAAA,CAAQ,SAAA,CAAU,WAAWA,GAAE,CAAA,CAAE,WAAW,UAAA,CAAWA,GAAE,EAAE,KAAK,CAAA;AAAA,UAClE,CAAA,MAAA,IAAW,CAAC,UAAA,CAAWA,GAAE,EAAE,WAAA,EAAa;AACtC,YAAA,OAAA,CAAQ,IAAA;AAAA,cACN,iCAAA,GAAoC,UAAA,CAAWA,GAAE,CAAA,CAAE,SAAA,GAAY;AAAA,aACjE;AACA,YAAA,OAAA,CAAQ,IAAA;AAAA,cACN,+GAAA,GACA,UAAA,CAAWA,GAAE,CAAA,CAAE,SAAA,GAAY;AAAA,aAC7B;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,IAAA,SAAS,QAAA,CAAS,IAAI,KAAA,EAAO;AAC3B,MAAA,OAAA,CAAQ,IAAA,CAAK,4CAAA,GAA+C,EAAA,GAAK,IAAI,CAAA;AACrE,MAAA,IAAI,MAAA,GAAA,CAAU,KAAA,KAAU,KAAA,CAAM,KAAA,IAAS,KAAA,CAAA,IAAU,EAAA;AACjD,MAAA,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA,CAAE,OAAA,CAAQ,SAAU,IAAA,EAAM;AACzC,QAAA,OAAA,CAAQ,IAAA,CAAK,OAAO,IAAI,CAAA;AAAA,MAC1B,CAAC,CAAA;AAAA,IACH;AAEA,IAAA,SAAS,cAAA,CAAe,OAAO,IAAA,EAAM;AACnC,MAAA,OAAO,IAAA,CAAK,IAAA,CAAK,SAAU,GAAA,EAAK;AAC9B,QAAA,OAAO,KAAA,YAAiB,GAAA;AAAA,MAC1B,CAAC,CAAA;AAAA,IACH;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC1GO,IAAM,cAAN,MAAkB;AAAA,EAMvB,YAAY,OAAA,EAAuB;AAJnC,IAAA,IAAA,CAAQ,QAAA,GAAoB,KAAA;AAC5B,IAAA,IAAA,CAAQ,eAAA,GACN,IAAA;AAGA,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AAAA,EACjB;AAAA,EAEA,MAAA,GAAe;AACb,IAAA,IAAI,KAAK,QAAA,EAAU;AAGnB,IAAA,IAAA,CAAK,eAAA,GAAkB,WAAW,gBAAA,EAAiB;AAEnD,IAAA,UAAA,CAAW,gBAAA,CAAiB,CAAC,KAAA,EAAc,OAAA,KAAsB;AAC/D,MAAA,IAAA,CAAK,QAAQ,mBAAA,EAAqB,KAAA,EAAO,EAAE,OAAA,EAAS,OAAA,IAAW,OAAO,CAAA;AAGtE,MAAA,IAAI,KAAK,eAAA,EAAiB;AACxB,QAAA,IAAA,CAAK,eAAA,CAAgB,OAAO,OAAO,CAAA;AAAA,MACrC;AAAA,IACF,CAAC,CAAA;AAGD,IAAA,MAAM,QAAA,GAAW,0BAAA,EAAA;AACjB,IAAA,QAAA,CAAS,MAAA,CAAO;AAAA,MACd,aAAA,EAAe,IAAA;AAAA,MACf,WAAA,EAAa,CAAC,GAAA,EAAa,KAAA,KAAmB;AAC5C,QAAA,MAAM,GAAA,GAAM,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA;AACpE,QAAA,IAAA,CAAK,QAAQ,oBAAA,EAAsB,GAAA,EAAK,EAAE,KAAA,EAAO,OAAO,CAAA;AAAA,MAC1D;AAAA,KACD,CAAA;AAED,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAAA,EAClB;AAAA,EAEA,MAAA,GAAe;AACb,IAAA,IAAI,CAAC,KAAK,QAAA,EAAU;AAGpB,IAAA,IAAI,KAAK,eAAA,EAAiB;AACxB,MAAA,UAAA,CAAW,gBAAA,CAAiB,KAAK,eAAe,CAAA;AAChD,MAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AAAA,IACzB;AAEA,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAAA,EAClB;AACF,CAAA;;;ACnDO,IAAM,mBAAN,MAAuB;AAAA,EAI5B,WAAA,CAAY,IAAA,EAAc,KAAA,GAAQ,KAAA,EAAO;AACvC,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AAClC,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AAAA,EACf;AAAA;AAAA,EAIA,MAAM,KAAK,KAAA,EAAqC;AAC9C,IAAA,IAAI;AACF,MAAA,MAAM,WAAW,MAAM,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,OAAA,CAAA,EAAW;AAAA,QAClD,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,QAC9C,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,KAAK;AAAA,OAC3B,CAAA;AAED,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,IAAA,CAAK,GAAA;AAAA,UACH,CAAA,sBAAA,EAAyB,QAAA,CAAS,MAAM,CAAA,CAAA,EAAI,SAAS,UAAU,CAAA;AAAA,SACjE;AACA,QAAA,OAAO,KAAA;AAAA,MACT;AAEA,MAAA,IAAA,CAAK,IAAI,CAAA,YAAA,EAAe,KAAA,CAAM,IAAI,CAAA,QAAA,EAAM,KAAA,CAAM,IAAI,CAAA,CAAE,CAAA;AACpD,MAAA,OAAO,IAAA;AAAA,IACT,SAAS,GAAA,EAAK;AACZ,MAAA,IAAA,CAAK,GAAA,CAAI,CAAA,6BAAA,EAAgC,GAAG,CAAA,CAAE,CAAA;AAC9C,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,UAAU,MAAA,EAAwC;AACtD,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,MAAA,EAAQ,CAAC,CAAA;AAEnC,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,MAAM,OAAA,CAAQ,GAAA,CAAI,KAAA,CAAM,GAAA,CAAI,CAAC,MAAM,IAAA,CAAK,IAAA,CAAK,CAAC,CAAC,CAAC,CAAA;AAAA,IAClD;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAIA,MAAM,aAAA,CACJ,IAAA,EACA,OAAA,EACkB;AAClB,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,CAAA,EAAG,KAAK,IAAI,CAAA,WAAA,EAAc,IAAI,CAAA,CAAA,EAAI;AAAA,QAC7D,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,QAC9C,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,OAAO;AAAA,OAC7B,CAAA;AAED,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,IAAA,CAAK,GAAA;AAAA,UACH,CAAA,0BAAA,EAA6B,QAAA,CAAS,MAAM,CAAA,CAAA,EAAI,SAAS,UAAU,CAAA;AAAA,SACrE;AACA,QAAA,OAAO,KAAA;AAAA,MACT;AAEA,MAAA,IAAA,CAAK,GAAA,CAAI,CAAA,gBAAA,EAAmB,IAAI,CAAA,CAAE,CAAA;AAClC,MAAA,OAAO,IAAA;AAAA,IACT,SAAS,GAAA,EAAK;AACZ,MAAA,IAAA,CAAK,GAAA,CAAI,CAAA,iCAAA,EAAoC,GAAG,CAAA,CAAE,CAAA;AAClD,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA,EAIQ,KAAA,CAAS,KAAU,IAAA,EAAqB;AAC9C,IAAA,OAAO,KAAA,CAAM,IAAA;AAAA,MAAK,EAAE,MAAA,EAAQ,IAAA,CAAK,KAAK,GAAA,CAAI,MAAA,GAAS,IAAI,CAAA,EAAE;AAAA,MAAG,CAAC,GAAG,CAAA,KAC9D,GAAA,CAAI,MAAM,CAAA,GAAI,IAAA,EAAM,CAAA,GAAI,IAAA,GAAO,IAAI;AAAA,KACrC;AAAA,EACF;AAAA,EAEQ,IAAI,OAAA,EAAuB;AACjC,IAAA,IAAI,KAAK,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,aAAA,EAAgB,OAAO,CAAA,CAAE,CAAA;AAAA,IACvC;AAAA,EACF;AACF,CAAA;ACnEA,IAAO,8BAAA,GAAQC,+BAAA,CAAoB,YAAA,CAAmB,kBAAkB,CAAA;ACPxE,IAAO,+BAAA,GAAQA,+BAAAA,CAAoB,YAAA,CAAmB,mBAAmB,CAAA;;;ACFzE,SAAS,iBAAA,GAA4B;AACnC,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,EAAI,CAAE,SAAS,EAAE,CAAA;AACxC,EAAA,MAAM,MAAA,GAAS,KAAK,MAAA,EAAO,CAAE,SAAS,EAAE,CAAA,CAAE,SAAA,CAAU,CAAA,EAAG,EAAE,CAAA;AACzD,EAAA,OAAO,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA;AAC/B;AAEA,SAAS,eAAe,IAAA,EAA2B;AACjD,EAAA,QAAQ,IAAA;AAAM,IACZ,KAAK,MAAA;AACH,MAAA,OAAO,MAAA;AAAA,IACT,KAAK,UAAA;AACH,MAAA,OAAO,UAAA;AAAA,IACT,KAAK,SAAA;AACH,MAAA,OAAO,SAAA;AAAA,IACT;AACE,MAAA,OAAO,SAAA;AAAA;AAEb;AAEA,SAAS,WAAA,GAAsB;AAC7B,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,CAAK,cAAA,EAAe,CAAE,eAAA,EAAgB,CAAE,QAAA;AAAA,EACjD,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,SAAA;AAAA,EACT;AACF;AAEA,SAAS,WAAA,GAAsB;AAC7B,EAAA,IAAI;AACF,IAAA,OACEC,uBAAA,CAAY,YAAA,IAAe,EAAG,gBAAA,EAAkB,OAAA,CAAQ,GAAA,EAAK,GAAG,CAAA,IAChE,IAAA,CAAK,cAAA,EAAe,CAAE,eAAA,GAAkB,MAAA,IACxC,SAAA;AAAA,EAEJ,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,SAAA;AAAA,EACT;AACF;AAEO,IAAM,mBAAN,MAAuB;AAAA,EAK5B,WAAA,CAAY,UAAA,GAAyB,EAAC,EAAG;AAFzC,IAAA,IAAA,CAAQ,cAA2B,EAAC;AAGlC,IAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAClB,IAAA,IAAA,CAAK,cAAA,GAAiB;AAAA,MACpB,WAAW,iBAAA,EAAkB;AAAA,MAC7B,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,KACpC;AAAA,EACF;AAAA,EAEA,SAAS,IAAA,EAAyB;AAChC,IAAA,IAAA,CAAK,cAAc,EAAE,GAAG,IAAA,CAAK,WAAA,EAAa,GAAG,IAAA,EAAK;AAAA,EACpD;AAAA,EAEA,SAAA,GAAkB;AAChB,IAAA,IAAA,CAAK,cAAc,EAAC;AAAA,EACtB;AAAA,EAEA,MAAM,OAAA,GAAoC;AACxC,IAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAO,GAAIC,sBAAA,CAAW,IAAI,QAAQ,CAAA;AAGjD,IAAA,IAAI,UAAA,GAAa,IAAA;AACjB,IAAA,IAAI,WAAA,GAAc,IAAA;AAElB,IAAA,IAAI;AACF,MAAA,IAAI,8BAAA,EAAwB;AAC1B,QAAA,UAAA,GAAa,MAAM,+BAAuB,aAAA,EAAc;AAAA,MAC1D;AAAA,IACF,SAAS,CAAA,EAAG;AACV,MAAA,OAAA,CAAQ,IAAA,CAAK,+CAA+C,CAAC,CAAA;AAAA,IAC/D;AAEA,IAAA,IAAI;AACF,MAAA,IAAI,+BAAA,EAAyB;AAC3B,QAAA,WAAA,GAAc,MAAM,gCAAwB,cAAA,EAAe;AAAA,MAC7D;AAAA,IACF,SAAS,CAAA,EAAG;AACV,MAAA,OAAA,CAAQ,IAAA,CAAK,gDAAgD,CAAC,CAAA;AAAA,IAChE;AAEA,IAAA,MAAM,MAAA,GAAwB;AAAA,MAC5B,QAAA,EAAUC,oBAAA,CAAS,EAAA,KAAO,KAAA,GAAQ,KAAA,GAAQ,SAAA;AAAA,MAC1C,IAAI,UAAA,EAAY,EAAA,KAAOA,oBAAA,CAAS,EAAA,KAAO,QAAQ,KAAA,GAAQ,SAAA,CAAA;AAAA,MACvD,WACE,UAAA,EAAY,SAAA,IAAaA,oBAAA,CAAS,OAAA,EAAS,UAAS,IAAK,SAAA;AAAA,MAC3D,KAAA,EAAO,YAAY,KAAA,IAAS,SAAA;AAAA,MAC5B,YAAA,EAAc,YAAY,YAAA,IAAgB,SAAA;AAAA,MAC1C,KAAA,EAAO,YAAY,KAAA,IAAS,SAAA;AAAA,MAC5B,QAAA,EAAU,YAAY,QAAA,IAAY,KAAA;AAAA,MAClC,UAAA,EAAY,YAAY,UAAA,IAAc,SAAA;AAAA,MACtC,WAAA,EAAa,YAAY,WAAA,IAAe,SAAA;AAAA,MACxC,QAAA,EAAU,YAAY,QAAA,IAAY,SAAA;AAAA,MAClC,WAAA,EAAa,YAAY,WAAA,IAAe,KAAA;AAAA,MACxC,YAAA,EAAc,YAAY,YAAA,IAAgB,MAAA;AAAA,MAC1C,SAAA,EAAWD,sBAAA,CAAW,GAAA,CAAI,QAAQ,EAAE,SAAA,IAAa,CAAA;AAAA,MACjD,UAAA,EAAY,YAAY,UAAA,IAAc,KAAA;AAAA,MACtC,UAAU,WAAA,EAAY;AAAA,MACtB,UAAU,WAAA;AAAY,KACxB;AAEA,IAAA,MAAM,OAAA,GAA0B;AAAA,MAC9B,IAAA,EAAM,cAAA,CAAe,WAAA,EAAa,IAAA,IAAQ,SAAS,CAAA;AAAA,MACnD,WAAA,EAAa,aAAa,WAAA,IAAe,KAAA;AAAA,MACzC,aAAA,EAAe,aAAa,aAAA,IAAiB,KAAA;AAAA,MAC7C,OAAA,EAAS,aAAa,OAAA,IAAW,SAAA;AAAA,MACjC,SAAA,EAAW,aAAa,SAAA,IAAa;AAAA,KACvC;AAEA,IAAA,OAAO;AAAA,MACL,KAAK,IAAA,CAAK,UAAA;AAAA,MACV,MAAA;AAAA,MACA,OAAA;AAAA,MACA,SAAS,IAAA,CAAK,cAAA;AAAA,MACd,MAAM,IAAA,CAAK;AAAA,KACb;AAAA,EACF;AACF,CAAA;;;AClIO,IAAM,aAAN,MAAiB;AAAA,EAItB,WAAA,CAAY,UAAU,GAAA,EAAK;AAH3B,IAAA,IAAA,CAAQ,QAAsB,EAAC;AAI7B,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AAAA,EACjB;AAAA,EAEA,QAAQ,KAAA,EAAyB;AAC/B,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,MAAA,IAAU,IAAA,CAAK,OAAA,EAAS;AACrC,MAAA,IAAA,CAAK,MAAM,KAAA,EAAM;AAAA,IACnB;AAEA,IAAA,IAAA,CAAK,KAAA,CAAM,KAAK,KAAK,CAAA;AAAA,EACvB;AAAA,EAEA,QAAQ,KAAA,EAA6B;AACnC,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,CAAA,EAAG,KAAK,CAAA;AAAA,EACnC;AAAA,EAEA,IAAI,IAAA,GAAe;AACjB,IAAA,OAAO,KAAK,KAAA,CAAM,MAAA;AAAA,EACpB;AAAA,EAEA,IAAI,OAAA,GAAmB;AACrB,IAAA,OAAO,IAAA,CAAK,MAAM,MAAA,KAAW,CAAA;AAAA,EAC/B;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,QAAQ,EAAC;AAAA,EAChB;AACF,CAAA;;;ACpBA,IAAM,gBAAN,MAAoB;AAAA,EAApB,WAAA,GAAA;AACE,IAAA,IAAA,CAAQ,MAAA,GAA2B,IAAA;AACnC,IAAA,IAAA,CAAQ,MAAA,GAAkC,IAAA;AAC1C,IAAA,IAAA,CAAQ,KAAA,GAA2B,IAAA;AACnC,IAAA,IAAA,CAAQ,WAAA,GAAkC,IAAA;AAC1C,IAAA,IAAA,CAAQ,gBAAA,GAA4C,IAAA;AACpD,IAAA,IAAA,CAAQ,UAAA,GAAoD,IAAA;AAC5D,IAAA,IAAA,CAAQ,WAAA,GAAuB,KAAA;AAC/B,IAAA,IAAA,CAAiB,cAAA,GACf,+CAAA;AAAA,EAAA;AAAA;AAAA,EAIF,KAAK,MAAA,EAAyB;AAC5B,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA,IAAA,CAAK,IAAI,yCAAoC,CAAA;AAC7C,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,MAAA,GAAS;AAAA,MACZ,WAAA,EAAa,IAAA;AAAA,MACb,KAAA,EAAO,KAAA;AAAA,MACP,aAAA,EAAe,GAAA;AAAA,MACf,YAAA,EAAc,GAAA;AAAA,MACd,GAAG;AAAA,KACL;AAEA,IAAA,IAAA,CAAK,SAAS,IAAI,gBAAA,CAAiB,KAAK,cAAA,EAAgB,IAAA,CAAK,OAAO,KAAK,CAAA;AACzE,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,UAAA,CAAW,IAAA,CAAK,OAAO,YAAY,CAAA;AACpD,IAAA,IAAA,CAAK,gBAAA,GAAmB,IAAI,gBAAA,CAAiB;AAAA,MAC3C,aAAa,MAAA,CAAO;AAAA,KACrB,CAAA;AAED,IAAA,IAAA,CAAK,UAAA,GAAa,WAAA;AAAA,MAChB,MAAM,KAAK,KAAA,EAAM;AAAA,MACjB,KAAK,MAAA,CAAO;AAAA,KACd;AAEA,IAAA,IAAI,IAAA,CAAK,OAAO,WAAA,EAAa;AAC3B,MAAA,IAAA,CAAK,cAAc,IAAI,WAAA,CAAY,CAAC,IAAA,EAAM,OAAO,OAAA,KAAY;AAC3D,QAAA,IAAA,CAAK,YAAA,CAAa,KAAA,EAAO,EAAE,OAAA,EAAS,SAAS,CAAA;AAAA,MAC/C,CAAC,CAAA;AACD,MAAA,IAAA,CAAK,YAAY,MAAA,EAAO;AAAA,IAC1B;AAEA,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AACnB,IAAA,IAAA,CAAK,GAAA,CAAI,CAAA,yBAAA,EAAuB,IAAA,CAAK,cAAc,CAAA,CAAE,CAAA;AAAA,EACvD;AAAA,EAEA,MAAM,UAAA,GAAuC;AAC3C,IAAA,IAAA,CAAK,kBAAkB,YAAY,CAAA;AACnC,IAAA,OAAO,IAAA,CAAK,iBAAkB,OAAA,EAAQ;AAAA,EACxC;AAAA,EAEA,SAAS,IAAA,EAAyB;AAChC,IAAA,IAAA,CAAK,kBAAkB,UAAU,CAAA;AACjC,IAAA,IAAA,CAAK,gBAAA,CAAkB,SAAS,IAAI,CAAA;AACpC,IAAA,IAAA,CAAK,IAAI,CAAA,iBAAA,EAAoB,IAAA,CAAK,SAAA,CAAU,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,EACrD;AAAA,EAEA,SAAA,GAAkB;AAChB,IAAA,IAAA,CAAK,kBAAkB,WAAW,CAAA;AAClC,IAAA,IAAA,CAAK,iBAAkB,SAAA,EAAU;AAAA,EACnC;AAAA,EAEA,KAAA,CAAM,IAAA,EAAc,OAAA,GAAwB,EAAC,EAAS;AACpD,IAAA,IAAA,CAAK,kBAAkB,OAAO,CAAA;AAC9B,IAAA,IAAA,CAAK,eAAA;AAAA,MACH,OAAA;AAAA,MACA,IAAA;AAAA,MACA,OAAA,CAAQ,WAAW,EAAC;AAAA,MACpB,OAAA,CAAQ;AAAA,KACV;AAAA,EACF;AAAA,EAEA,MAAA,CAAO,IAAA,EAAc,KAAA,EAAe,OAAA,GAAwB,EAAC,EAAS;AACpE,IAAA,IAAA,CAAK,kBAAkB,QAAQ,CAAA;AAC/B,IAAA,IAAA,CAAK,eAAA;AAAA,MACH,QAAA;AAAA,MACA,IAAA;AAAA,MACA,EAAE,KAAA,EAAO,GAAG,OAAA,CAAQ,OAAA,EAAQ;AAAA,MAC5B,OAAA,CAAQ;AAAA,KACV;AAAA,EACF;AAAA,EAEA,YAAA,CAAa,KAAA,EAAc,OAAA,GAA+B,EAAC,EAAS;AAClE,IAAA,IAAA,CAAK,kBAAkB,cAAc,CAAA;AACrC,IAAA,IAAA,CAAK,eAAA,CAAgB,OAAA,EAAS,KAAA,CAAM,IAAA,IAAQ,cAAA,EAAgB;AAAA,MAC1D,SAAS,KAAA,CAAM,OAAA;AAAA,MACf,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,GAAG,OAAA,CAAQ;AAAA,KACZ,CAAA;AAAA,EACH;AAAA;AAAA,EAIA,YAAA,GAAqB;AACnB,IAAA,IAAA,CAAK,kBAAkB,cAAc,CAAA;AACrC,IAAA,IAAA,CAAK,gBAAA,CAAkB,OAAA,EAAQ,CAC5B,IAAA,CAAK,CAAC,OAAA,KAAY;AACjB,MAAA,IAAA,CAAK,MAAA,CAAQ,cAAc,SAAA,EAAW;AAAA,QACpC,MAAA,EAAQ,KAAK,MAAA,CAAQ,MAAA;AAAA,QACrB,SAAA,EAAW,QAAQ,OAAA,CAAQ,SAAA;AAAA,QAC3B,SAAA,EAAW,QAAQ,OAAA,CAAQ,SAAA;AAAA,QAC3B;AAAA,OACD,CAAA;AACD,MAAA,IAAA,CAAK,GAAA,CAAI,CAAA,iBAAA,EAAoB,OAAA,CAAQ,OAAA,CAAQ,SAAS,CAAA,CAAE,CAAA;AAAA,IAC1D,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,GAAA,KAAQ;AACd,MAAA,IAAA,CAAK,GAAA,CAAI,CAAA,yBAAA,EAA4B,GAAG,CAAA,CAAE,CAAA;AAAA,IAC5C,CAAC,CAAA;AAAA,EACL;AAAA,EAEA,WAAW,QAAA,EAAyB;AAClC,IAAA,IAAA,CAAK,kBAAkB,YAAY,CAAA;AACnC,IAAA,IAAA,CAAK,gBAAA,CAAkB,OAAA,EAAQ,CAC5B,IAAA,CAAK,CAAC,OAAA,KAAY;AACjB,MAAA,IAAA,CAAK,MAAA,CAAQ,cAAc,SAAA,EAAW;AAAA,QACpC,MAAA,EAAQ,KAAK,MAAA,CAAQ,MAAA;AAAA,QACrB,SAAA,EAAW,QAAQ,OAAA,CAAQ,SAAA;AAAA,QAC3B,SAAA,EAAW,QAAQ,OAAA,CAAQ,SAAA;AAAA,QAC3B,OAAA,EAAA,iBAAS,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,QAChC,QAAA;AAAA,QACA;AAAA,OACD,CAAA;AACD,MAAA,IAAA,CAAK,KAAA,EAAM;AACX,MAAA,IAAA,CAAK,GAAA,CAAI,CAAA,eAAA,EAAkB,OAAA,CAAQ,OAAA,CAAQ,SAAS,CAAA,CAAE,CAAA;AAAA,IACxD,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,GAAA,KAAQ;AACd,MAAA,IAAA,CAAK,GAAA,CAAI,CAAA,uBAAA,EAA0B,GAAG,CAAA,CAAE,CAAA;AAAA,IAC1C,CAAC,CAAA;AAAA,EACL;AAAA,EAEA,WAAA,CAAY,YAAoB,QAAA,EAAyB;AACvD,IAAA,IAAA,CAAK,kBAAkB,aAAa,CAAA;AACpC,IAAA,IAAA,CAAK,gBAAA,CAAkB,OAAA,EAAQ,CAC5B,IAAA,CAAK,CAAC,OAAA,KAAY;AACjB,MAAA,IAAA,CAAK,MAAA,CAAQ,cAAc,aAAA,EAAe;AAAA,QACxC,MAAA,EAAQ,KAAK,MAAA,CAAQ,MAAA;AAAA,QACrB,UAAA;AAAA,QACA,QAAA;AAAA,QACA,SAAA,EAAW,QAAQ,OAAA,CAAQ,SAAA;AAAA,QAC3B;AAAA,OACD,CAAA;AACD,MAAA,IAAA,CAAK,GAAA,CAAI,CAAA,gBAAA,EAAmB,UAAU,CAAA,CAAE,CAAA;AAAA,IAC1C,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,GAAA,KAAQ;AACd,MAAA,IAAA,CAAK,GAAA,CAAI,CAAA,wBAAA,EAA2B,GAAG,CAAA,CAAE,CAAA;AAAA,IAC3C,CAAC,CAAA;AAAA,EACL;AAAA,EAEA,YAAA,CACE,QAAA,EACA,UAAA,EACA,UAAA,EACA,UACA,WAAA,EACM;AACN,IAAA,IAAA,CAAK,kBAAkB,cAAc,CAAA;AACrC,IAAA,IAAA,CAAK,gBAAA,CAAkB,OAAA,EAAQ,CAC5B,IAAA,CAAK,CAAC,OAAA,KAAY;AACjB,MAAA,IAAA,CAAK,MAAA,CAAQ,cAAc,UAAA,EAAY;AAAA,QACrC,MAAA,EAAQ,KAAK,MAAA,CAAQ,MAAA;AAAA,QACrB,QAAA;AAAA,QACA,UAAA;AAAA,QACA,UAAA;AAAA,QACA,QAAA;AAAA,QACA,WAAA;AAAA,QACA,SAAA,EAAW,QAAQ,OAAA,CAAQ,SAAA;AAAA,QAC3B;AAAA,OACD,CAAA;AACD,MAAA,IAAA,CAAK,IAAI,CAAA,kBAAA,EAAqB,UAAU,IAAI,QAAQ,CAAA,CAAA,EAAI,UAAU,CAAA,CAAE,CAAA;AAAA,IACtE,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,GAAA,KAAQ;AACd,MAAA,IAAA,CAAK,GAAA,CAAI,CAAA,0BAAA,EAA6B,GAAG,CAAA,CAAE,CAAA;AAAA,IAC7C,CAAC,CAAA;AAAA,EACL;AAAA,EAEA,UAAA,CAAW,KAAA,EAAc,OAAA,GAAU,KAAA,EAAa;AAC9C,IAAA,IAAA,CAAK,kBAAkB,YAAY,CAAA;AACnC,IAAA,IAAA,CAAK,gBAAA,CAAkB,OAAA,EAAQ,CAC5B,IAAA,CAAK,CAAC,OAAA,KAAY;AACjB,MAAA,IAAA,CAAK,MAAA,CAAQ,cAAc,OAAA,EAAS;AAAA,QAClC,MAAA,EAAQ,KAAK,MAAA,CAAQ,MAAA;AAAA,QACrB,WAAW,KAAA,CAAM,IAAA;AAAA,QACjB,cAAc,KAAA,CAAM,OAAA;AAAA,QACpB,UAAA,EAAY,MAAM,KAAA,IAAS,EAAA;AAAA,QAC3B,OAAA;AAAA,QACA,SAAA,EAAW,QAAQ,OAAA,CAAQ,SAAA;AAAA,QAC3B;AAAA,OACD,CAAA;AACD,MAAA,IAAA,CAAK,IAAI,CAAA,eAAA,EAAkB,KAAA,CAAM,IAAI,CAAA,eAAA,EAAa,OAAO,CAAA,CAAE,CAAA;AAAA,IAC7D,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,GAAA,KAAQ;AACd,MAAA,IAAA,CAAK,GAAA,CAAI,CAAA,uBAAA,EAA0B,GAAG,CAAA,CAAE,CAAA;AAAA,IAC1C,CAAC,CAAA;AAAA,EACL;AAAA;AAAA,EAIA,MAAM,KAAA,GAAuB;AAC3B,IAAA,IAAI,CAAC,IAAA,CAAK,KAAA,IAAS,IAAA,CAAK,MAAM,OAAA,EAAS;AACvC,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAElB,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,EAAE,CAAA;AACpC,IAAA,IAAA,CAAK,GAAA,CAAI,CAAA,SAAA,EAAY,MAAA,CAAO,MAAM,CAAA,SAAA,CAAW,CAAA;AAC7C,IAAA,MAAM,IAAA,CAAK,MAAA,CAAO,SAAA,CAAU,MAAM,CAAA;AAAA,EACpC;AAAA,EAEA,OAAA,GAAgB;AACd,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA,aAAA,CAAc,KAAK,UAAU,CAAA;AAC7B,MAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAAA,IACpB;AAEA,IAAA,IAAA,CAAK,aAAa,MAAA,EAAO;AACzB,IAAA,IAAA,CAAK,OAAO,KAAA,EAAM;AAElB,IAAA,IAAA,CAAK,WAAA,GAAc,KAAA;AACnB,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AACd,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AACd,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AACb,IAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA;AAExB,IAAA,IAAA,CAAK,IAAI,eAAe,CAAA;AAAA,EAC1B;AAAA;AAAA,EAIQ,eAAA,CACN,IAAA,EACA,IAAA,EACA,OAAA,EACA,SAAA,EACM;AACN,IAAA,IAAA,CAAK,gBAAA,CAAkB,OAAA,EAAQ,CAC5B,IAAA,CAAK,CAAC,OAAA,KAAY;AACjB,MAAA,MAAM,KAAA,GAAoB;AAAA,QACxB,MAAA,EAAQ,KAAK,MAAA,CAAQ,MAAA;AAAA,QACrB,IAAA;AAAA,QACA,IAAA;AAAA,QACA,OAAA;AAAA,QACA,SAAA,EAAW,SAAA,IAAA,iBAAa,IAAI,IAAA,IAAO,WAAA,EAAY;AAAA,QAC/C;AAAA,OACF;AAEA,MAAA,IAAA,CAAK,KAAA,CAAO,QAAQ,KAAK,CAAA;AACzB,MAAA,IAAA,CAAK,GAAA,CAAI,CAAA,QAAA,EAAW,IAAI,CAAA,QAAA,EAAM,IAAI,CAAA,CAAE,CAAA;AAEpC,MAAA,IAAI,SAAS,OAAA,EAAS;AACpB,QAAA,IAAA,CAAK,KAAA,EAAM;AAAA,MACb;AAAA,IACF,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,GAAA,KAAQ;AACd,MAAA,IAAA,CAAK,GAAA,CAAI,CAAA,2BAAA,EAA8B,GAAG,CAAA,CAAE,CAAA;AAAA,IAC9C,CAAC,CAAA;AAAA,EACL;AAAA,EAEQ,kBAAkB,MAAA,EAAsB;AAC9C,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACrB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,WAAA,EAAc,MAAM,CAAA,kCAAA,CAAoC,CAAA;AAAA,IAC1E;AAAA,EACF;AAAA,EAEQ,IAAI,OAAA,EAAuB;AACjC,IAAA,IAAI,IAAA,CAAK,QAAQ,KAAA,EAAO;AACtB,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,aAAA,EAAgB,OAAO,CAAA,CAAE,CAAA;AAAA,IACvC;AAAA,EACF;AACF,CAAA;AAEO,IAAM,UAAA,GAAa,IAAI,aAAA","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 { 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 // ─── 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 } from \"./types\";\n\nexport class EventQueue {\n private queue: PulseEvent[] = [];\n private maxSize: number;\n\n constructor(maxSize = 100) {\n this.maxSize = maxSize;\n }\n\n enqueue(event: PulseEvent): void {\n if (this.queue.length >= this.maxSize) {\n this.queue.shift();\n }\n\n this.queue.push(event);\n }\n\n dequeue(count: number): PulseEvent[] {\n return this.queue.splice(0, count);\n }\n\n get size(): number {\n return this.queue.length;\n }\n\n get isEmpty(): boolean {\n return this.queue.length === 0;\n }\n\n clear(): void {\n this.queue = [];\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 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 // ─── Public API ───────────────────────────────────────────────────\n\n init(config: SDKConfig): void {\n if (this.initialized) {\n this.log(\"SDK already initialized — skipping\");\n return;\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);\n this.contextCollector = new ContextCollector({\n environment: config.environment,\n });\n\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.log(`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.log(`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 // ─── 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.log(`Session started: ${context.session.sessionId}`);\n })\n .catch((err) => {\n this.log(`Failed to start session: ${err}`);\n });\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.log(`Session ended: ${context.session.sessionId}`);\n })\n .catch((err) => {\n this.log(`Failed to end session: ${err}`);\n });\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.log(`Screen tracked: ${screenName}`);\n })\n .catch((err) => {\n this.log(`Failed to track screen: ${err}`);\n });\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.log(`API call tracked: ${httpMethod} ${endpoint} ${statusCode}`);\n })\n .catch((err) => {\n this.log(`Failed to track API call: ${err}`);\n });\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.log(`Crash tracked: ${error.name} — fatal: ${isFatal}`);\n })\n .catch((err) => {\n this.log(`Failed to track crash: ${err}`);\n });\n }\n\n // ─── Flush & Destroy ─────────────────────────────────────────────\n\n async flush(): Promise<void> {\n if (!this.queue || this.queue.isEmpty) return;\n if (!this.client) return;\n\n const events = this.queue.dequeue(10);\n this.log(`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.autoCapture?.detach();\n this.queue?.clear();\n\n this.initialized = false;\n this.config = null;\n this.client = null;\n this.queue = null;\n this.contextCollector = null;\n\n this.log(\"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\n this.queue!.enqueue(event);\n this.log(`Queued: ${type} — ${name}`);\n\n if (type === \"error\") {\n this.flush();\n }\n })\n .catch((err) => {\n this.log(`Failed to collect context: ${err}`);\n });\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 log(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 NetworkContext,\n PulseEvent,\n SDKConfig,\n SessionContext,\n TrackOptions,\n UserContext,\n} from \"./types\";\n"]}
package/dist/index.mjs CHANGED
@@ -285,6 +285,42 @@ var require_rejection_tracking = __commonJS({
285
285
  }
286
286
  });
287
287
 
288
+ // src/auto-capture.ts
289
+ var AutoCapture = class {
290
+ constructor(handler) {
291
+ this.attached = false;
292
+ this.previousHandler = null;
293
+ this.handler = handler;
294
+ }
295
+ attach() {
296
+ if (this.attached) return;
297
+ this.previousHandler = ErrorUtils.getGlobalHandler();
298
+ ErrorUtils.setGlobalHandler((error, isFatal) => {
299
+ this.handler("uncaughtException", error, { isFatal: isFatal ?? false });
300
+ if (this.previousHandler) {
301
+ this.previousHandler(error, isFatal);
302
+ }
303
+ });
304
+ const tracking = require_rejection_tracking();
305
+ tracking.enable({
306
+ allRejections: true,
307
+ onUnhandled: (_id, error) => {
308
+ const err = error instanceof Error ? error : new Error(String(error));
309
+ this.handler("unhandledRejection", err, { fatal: false });
310
+ }
311
+ });
312
+ this.attached = true;
313
+ }
314
+ detach() {
315
+ if (!this.attached) return;
316
+ if (this.previousHandler) {
317
+ ErrorUtils.setGlobalHandler(this.previousHandler);
318
+ this.previousHandler = null;
319
+ }
320
+ this.attached = false;
321
+ }
322
+ };
323
+
288
324
  // src/client.ts
289
325
  var PulseBoardClient = class {
290
326
  constructor(host, debug = false) {
@@ -353,68 +389,6 @@ var PulseBoardClient = class {
353
389
  }
354
390
  }
355
391
  };
356
-
357
- // src/queue.ts
358
- var EventQueue = class {
359
- constructor(maxSize = 100) {
360
- this.queue = [];
361
- this.maxSize = maxSize;
362
- }
363
- enqueue(event) {
364
- if (this.queue.length >= this.maxSize) {
365
- this.queue.shift();
366
- }
367
- this.queue.push(event);
368
- }
369
- dequeue(count) {
370
- return this.queue.splice(0, count);
371
- }
372
- get size() {
373
- return this.queue.length;
374
- }
375
- get isEmpty() {
376
- return this.queue.length === 0;
377
- }
378
- clear() {
379
- this.queue = [];
380
- }
381
- };
382
-
383
- // src/auto-capture.ts
384
- var AutoCapture = class {
385
- constructor(handler) {
386
- this.attached = false;
387
- this.previousHandler = null;
388
- this.handler = handler;
389
- }
390
- attach() {
391
- if (this.attached) return;
392
- this.previousHandler = ErrorUtils.getGlobalHandler();
393
- ErrorUtils.setGlobalHandler((error, isFatal) => {
394
- this.handler("uncaughtException", error, { isFatal: isFatal ?? false });
395
- if (this.previousHandler) {
396
- this.previousHandler(error, isFatal);
397
- }
398
- });
399
- const tracking = require_rejection_tracking();
400
- tracking.enable({
401
- allRejections: true,
402
- onUnhandled: (_id, error) => {
403
- const err = error instanceof Error ? error : new Error(String(error));
404
- this.handler("unhandledRejection", err, { fatal: false });
405
- }
406
- });
407
- this.attached = true;
408
- }
409
- detach() {
410
- if (!this.attached) return;
411
- if (this.previousHandler) {
412
- ErrorUtils.setGlobalHandler(this.previousHandler);
413
- this.previousHandler = null;
414
- }
415
- this.attached = false;
416
- }
417
- };
418
392
  var NativePulseBoardDevice_default = TurboModuleRegistry.getEnforcing("PulseBoardDevice");
419
393
  var NativePulseBoardNetwork_default = TurboModuleRegistry.getEnforcing("PulseBoardNetwork");
420
394
 
@@ -491,8 +465,8 @@ var ContextCollector = class {
491
465
  manufacturer: deviceInfo?.manufacturer ?? "unknown",
492
466
  brand: deviceInfo?.brand ?? "unknown",
493
467
  isTablet: deviceInfo?.isTablet ?? false,
494
- appVersion: this.appContext.appVersion ?? deviceInfo?.appVersion ?? "unknown",
495
- buildNumber: this.appContext.buildNumber ?? deviceInfo?.buildNumber ?? "unknown",
468
+ appVersion: deviceInfo?.appVersion ?? "unknown",
469
+ buildNumber: deviceInfo?.buildNumber ?? "unknown",
496
470
  bundleId: deviceInfo?.bundleId ?? "unknown",
497
471
  screenWidth: deviceInfo?.screenWidth ?? width,
498
472
  screenHeight: deviceInfo?.screenHeight ?? height,
@@ -518,6 +492,32 @@ var ContextCollector = class {
518
492
  }
519
493
  };
520
494
 
495
+ // src/queue.ts
496
+ var EventQueue = class {
497
+ constructor(maxSize = 100) {
498
+ this.queue = [];
499
+ this.maxSize = maxSize;
500
+ }
501
+ enqueue(event) {
502
+ if (this.queue.length >= this.maxSize) {
503
+ this.queue.shift();
504
+ }
505
+ this.queue.push(event);
506
+ }
507
+ dequeue(count) {
508
+ return this.queue.splice(0, count);
509
+ }
510
+ get size() {
511
+ return this.queue.length;
512
+ }
513
+ get isEmpty() {
514
+ return this.queue.length === 0;
515
+ }
516
+ clear() {
517
+ this.queue = [];
518
+ }
519
+ };
520
+
521
521
  // src/index.ts
522
522
  var PulseBoardSDK = class {
523
523
  constructor() {
@@ -528,6 +528,7 @@ var PulseBoardSDK = class {
528
528
  this.contextCollector = null;
529
529
  this.flushTimer = null;
530
530
  this.initialized = false;
531
+ this.PULSEBOARD_API = "https://pulseboard-production.up.railway.app/";
531
532
  }
532
533
  // ─── Public API ───────────────────────────────────────────────────
533
534
  init(config) {
@@ -542,9 +543,11 @@ var PulseBoardSDK = class {
542
543
  maxQueueSize: 100,
543
544
  ...config
544
545
  };
545
- this.client = new PulseBoardClient(this.config.host, this.config.debug);
546
+ this.client = new PulseBoardClient(this.PULSEBOARD_API, this.config.debug);
546
547
  this.queue = new EventQueue(this.config.maxQueueSize);
547
- this.contextCollector = new ContextCollector(this.config.app ?? {});
548
+ this.contextCollector = new ContextCollector({
549
+ environment: config.environment
550
+ });
548
551
  this.flushTimer = setInterval(
549
552
  () => this.flush(),
550
553
  this.config.flushInterval
@@ -556,7 +559,7 @@ var PulseBoardSDK = class {
556
559
  this.autoCapture.attach();
557
560
  }
558
561
  this.initialized = true;
559
- this.log(`Initialized \u2014 host: ${this.config.host}`);
562
+ this.log(`Initialized \u2014 host: ${this.PULSEBOARD_API}`);
560
563
  }
561
564
  async getContext() {
562
565
  this.assertInitialized("getContext");
@@ -1 +1 @@
1
- {"version":3,"sources":["../node_modules/promise/setimmediate/core.js","../node_modules/promise/setimmediate/rejection-tracking.js","../src/client.ts","../src/queue.ts","../src/auto-capture.ts","../src/specs/NativePulseBoardDevice.ts","../src/specs/NativePulseBoardNetwork.ts","../src/context.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}","import { 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 // ─── 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 { PulseEvent } from \"./types\";\n\nexport class EventQueue {\n private queue: PulseEvent[] = [];\n private maxSize: number;\n\n constructor(maxSize = 100) {\n this.maxSize = maxSize;\n }\n\n enqueue(event: PulseEvent): void {\n if (this.queue.length >= this.maxSize) {\n this.queue.shift();\n }\n\n this.queue.push(event);\n }\n\n dequeue(count: number): PulseEvent[] {\n return this.queue.splice(0, count);\n }\n\n get size(): number {\n return this.queue.length;\n }\n\n get isEmpty(): boolean {\n return this.queue.length === 0;\n }\n\n clear(): void {\n this.queue = [];\n }\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 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 { Platform, Dimensions, I18nManager } from \"react-native\";\nimport NativePulseBoardDevice from \"./specs/NativePulseBoardDevice\";\nimport NativePulseBoardNetwork from \"./specs/NativePulseBoardNetwork\";\nimport {\n Platform as PlatformType,\n NetworkType,\n DeviceContext,\n NetworkContext,\n SessionContext,\n AppContext,\n UserContext,\n EnrichedContext,\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:\n this.appContext.appVersion ?? deviceInfo?.appVersion ?? \"unknown\",\n buildNumber:\n this.appContext.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 {\n SDKConfig,\n TrackOptions,\n CaptureErrorOptions,\n PulseEvent,\n UserContext,\n EnrichedContext,\n} from \"./types\";\nimport { PulseBoardClient } from \"./client\";\nimport { EventQueue } from \"./queue\";\nimport { AutoCapture } from \"./auto-capture\";\nimport { ContextCollector } from \"./context\";\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\n // ─── Public API ───────────────────────────────────────────────────\n\n init(config: SDKConfig): void {\n if (this.initialized) {\n this.log(\"SDK already initialized — skipping\");\n return;\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.config.host, this.config.debug);\n this.queue = new EventQueue(this.config.maxQueueSize);\n this.contextCollector = new ContextCollector(this.config.app ?? {});\n\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.log(`Initialized — host: ${this.config.host}`);\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.log(`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 // ─── 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.log(`Session started: ${context.session.sessionId}`);\n })\n .catch((err) => {\n this.log(`Failed to start session: ${err}`);\n });\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.log(`Session ended: ${context.session.sessionId}`);\n })\n .catch((err) => {\n this.log(`Failed to end session: ${err}`);\n });\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.log(`Screen tracked: ${screenName}`);\n })\n .catch((err) => {\n this.log(`Failed to track screen: ${err}`);\n });\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.log(`API call tracked: ${httpMethod} ${endpoint} ${statusCode}`);\n })\n .catch((err) => {\n this.log(`Failed to track API call: ${err}`);\n });\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.log(`Crash tracked: ${error.name} — fatal: ${isFatal}`);\n })\n .catch((err) => {\n this.log(`Failed to track crash: ${err}`);\n });\n }\n\n // ─── Flush & Destroy ─────────────────────────────────────────────\n\n async flush(): Promise<void> {\n if (!this.queue || this.queue.isEmpty) return;\n if (!this.client) return;\n\n const events = this.queue.dequeue(10);\n this.log(`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.autoCapture?.detach();\n this.queue?.clear();\n\n this.initialized = false;\n this.config = null;\n this.client = null;\n this.queue = null;\n this.contextCollector = null;\n\n this.log(\"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\n this.queue!.enqueue(event);\n this.log(`Queued: ${type} — ${name}`);\n\n if (type === \"error\") {\n this.flush();\n }\n })\n .catch((err) => {\n this.log(`Failed to collect context: ${err}`);\n });\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 log(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 SDKConfig,\n TrackOptions,\n CaptureErrorOptions,\n PulseEvent,\n EventType,\n UserContext,\n AppContext,\n DeviceContext,\n NetworkContext,\n SessionContext,\n EnrichedContext,\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":";;;;;;;;AAAA,IAAA,YAAA,GAAA,UAAA,CAAA;AAAA,EAAA,2CAAA,CAAAA,SAAA,EAAA,MAAA,EAAA;AAIA,IAAA,SAAS,IAAA,GAAO;AAAA,IAAC;AAmBjB,IAAA,IAAI,UAAA,GAAa,IAAA;AACjB,IAAA,IAAI,WAAW,EAAC;AAChB,IAAA,SAAS,QAAQ,GAAA,EAAK;AACpB,MAAA,IAAI;AACF,QAAA,OAAO,GAAA,CAAI,IAAA;AAAA,MACb,SAAS,EAAA,EAAI;AACX,QAAA,UAAA,GAAa,EAAA;AACb,QAAA,OAAO,QAAA;AAAA,MACT;AAAA,IACF;AAEA,IAAA,SAAS,UAAA,CAAW,IAAI,CAAA,EAAG;AACzB,MAAA,IAAI;AACF,QAAA,OAAO,GAAG,CAAC,CAAA;AAAA,MACb,SAAS,EAAA,EAAI;AACX,QAAA,UAAA,GAAa,EAAA;AACb,QAAA,OAAO,QAAA;AAAA,MACT;AAAA,IACF;AACA,IAAA,SAAS,UAAA,CAAW,EAAA,EAAI,CAAA,EAAG,CAAA,EAAG;AAC5B,MAAA,IAAI;AACF,QAAA,EAAA,CAAG,GAAG,CAAC,CAAA;AAAA,MACT,SAAS,EAAA,EAAI;AACX,QAAA,UAAA,GAAa,EAAA;AACb,QAAA,OAAO,QAAA;AAAA,MACT;AAAA,IACF;AAEA,IAAA,MAAA,CAAO,OAAA,GAAUC,QAAAA;AAEjB,IAAA,SAASA,SAAQ,EAAA,EAAI;AACnB,MAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAC5B,QAAA,MAAM,IAAI,UAAU,sCAAsC,CAAA;AAAA,MAC5D;AACA,MAAA,IAAI,OAAO,OAAO,UAAA,EAAY;AAC5B,QAAA,MAAM,IAAI,UAAU,kDAAmD,CAAA;AAAA,MACzE;AACA,MAAA,IAAA,CAAK,EAAA,GAAK,CAAA;AACV,MAAA,IAAA,CAAK,EAAA,GAAK,CAAA;AACV,MAAA,IAAA,CAAK,EAAA,GAAK,IAAA;AACV,MAAA,IAAA,CAAK,EAAA,GAAK,IAAA;AACV,MAAA,IAAI,OAAO,IAAA,EAAM;AACjB,MAAA,SAAA,CAAU,IAAI,IAAI,CAAA;AAAA,IACpB;AACA,IAAAA,SAAQ,EAAA,GAAK,IAAA;AACb,IAAAA,SAAQ,EAAA,GAAK,IAAA;AACb,IAAAA,SAAQ,EAAA,GAAK,IAAA;AAEb,IAAAA,QAAAA,CAAQ,SAAA,CAAU,IAAA,GAAO,SAAS,aAAa,UAAA,EAAY;AACzD,MAAA,IAAI,IAAA,CAAK,gBAAgBA,QAAAA,EAAS;AAChC,QAAA,OAAO,QAAA,CAAS,IAAA,EAAM,WAAA,EAAa,UAAU,CAAA;AAAA,MAC/C;AACA,MAAA,IAAI,GAAA,GAAM,IAAIA,QAAAA,CAAQ,IAAI,CAAA;AAC1B,MAAA,MAAA,CAAO,MAAM,IAAI,OAAA,CAAQ,WAAA,EAAa,UAAA,EAAY,GAAG,CAAC,CAAA;AACtD,MAAA,OAAO,GAAA;AAAA,IACT,CAAA;AAEA,IAAA,SAAS,QAAA,CAAS,IAAA,EAAM,WAAA,EAAa,UAAA,EAAY;AAC/C,MAAA,OAAO,IAAI,IAAA,CAAK,WAAA,CAAY,SAAUC,UAASC,OAAAA,EAAQ;AACrD,QAAA,IAAI,GAAA,GAAM,IAAIF,QAAAA,CAAQ,IAAI,CAAA;AAC1B,QAAA,GAAA,CAAI,IAAA,CAAKC,UAASC,OAAM,CAAA;AACxB,QAAA,MAAA,CAAO,MAAM,IAAI,OAAA,CAAQ,WAAA,EAAa,UAAA,EAAY,GAAG,CAAC,CAAA;AAAA,MACxD,CAAC,CAAA;AAAA,IACH;AACA,IAAA,SAAS,MAAA,CAAO,MAAM,QAAA,EAAU;AAC9B,MAAA,OAAO,IAAA,CAAK,OAAO,CAAA,EAAG;AACpB,QAAA,IAAA,GAAO,IAAA,CAAK,EAAA;AAAA,MACd;AACA,MAAA,IAAIF,SAAQ,EAAA,EAAI;AACd,QAAAA,QAAAA,CAAQ,GAAG,IAAI,CAAA;AAAA,MACjB;AACA,MAAA,IAAI,IAAA,CAAK,OAAO,CAAA,EAAG;AACjB,QAAA,IAAI,IAAA,CAAK,OAAO,CAAA,EAAG;AACjB,UAAA,IAAA,CAAK,EAAA,GAAK,CAAA;AACV,UAAA,IAAA,CAAK,EAAA,GAAK,QAAA;AACV,UAAA;AAAA,QACF;AACA,QAAA,IAAI,IAAA,CAAK,OAAO,CAAA,EAAG;AACjB,UAAA,IAAA,CAAK,EAAA,GAAK,CAAA;AACV,UAAA,IAAA,CAAK,EAAA,GAAK,CAAC,IAAA,CAAK,EAAA,EAAI,QAAQ,CAAA;AAC5B,UAAA;AAAA,QACF;AACA,QAAA,IAAA,CAAK,EAAA,CAAG,KAAK,QAAQ,CAAA;AACrB,QAAA;AAAA,MACF;AACA,MAAA,cAAA,CAAe,MAAM,QAAQ,CAAA;AAAA,IAC/B;AAEA,IAAA,SAAS,cAAA,CAAe,MAAM,QAAA,EAAU;AACtC,MAAA,YAAA,CAAa,WAAW;AACtB,QAAA,IAAI,KAAK,IAAA,CAAK,EAAA,KAAO,CAAA,GAAI,QAAA,CAAS,cAAc,QAAA,CAAS,UAAA;AACzD,QAAA,IAAI,OAAO,IAAA,EAAM;AACf,UAAA,IAAI,IAAA,CAAK,OAAO,CAAA,EAAG;AACjB,YAAA,OAAA,CAAQ,QAAA,CAAS,OAAA,EAAS,IAAA,CAAK,EAAE,CAAA;AAAA,UACnC,CAAA,MAAO;AACL,YAAA,MAAA,CAAO,QAAA,CAAS,OAAA,EAAS,IAAA,CAAK,EAAE,CAAA;AAAA,UAClC;AACA,UAAA;AAAA,QACF;AACA,QAAA,IAAI,GAAA,GAAM,UAAA,CAAW,EAAA,EAAI,IAAA,CAAK,EAAE,CAAA;AAChC,QAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,UAAA,MAAA,CAAO,QAAA,CAAS,SAAS,UAAU,CAAA;AAAA,QACrC,CAAA,MAAO;AACL,UAAA,OAAA,CAAQ,QAAA,CAAS,SAAS,GAAG,CAAA;AAAA,QAC/B;AAAA,MACF,CAAC,CAAA;AAAA,IACH;AACA,IAAA,SAAS,OAAA,CAAQ,MAAM,QAAA,EAAU;AAE/B,MAAA,IAAI,aAAa,IAAA,EAAM;AACrB,QAAA,OAAO,MAAA;AAAA,UACL,IAAA;AAAA,UACA,IAAI,UAAU,2CAA2C;AAAA,SAC3D;AAAA,MACF;AACA,MAAA,IACE,aACC,OAAO,QAAA,KAAa,QAAA,IAAY,OAAO,aAAa,UAAA,CAAA,EACrD;AACA,QAAA,IAAI,IAAA,GAAO,QAAQ,QAAQ,CAAA;AAC3B,QAAA,IAAI,SAAS,QAAA,EAAU;AACrB,UAAA,OAAO,MAAA,CAAO,MAAM,UAAU,CAAA;AAAA,QAChC;AACA,QAAA,IACE,IAAA,KAAS,IAAA,CAAK,IAAA,IACd,QAAA,YAAoBA,QAAAA,EACpB;AACA,UAAA,IAAA,CAAK,EAAA,GAAK,CAAA;AACV,UAAA,IAAA,CAAK,EAAA,GAAK,QAAA;AACV,UAAA,MAAA,CAAO,IAAI,CAAA;AACX,UAAA;AAAA,QACF,CAAA,MAAA,IAAW,OAAO,IAAA,KAAS,UAAA,EAAY;AACrC,UAAA,SAAA,CAAU,IAAA,CAAK,IAAA,CAAK,QAAQ,CAAA,EAAG,IAAI,CAAA;AACnC,UAAA;AAAA,QACF;AAAA,MACF;AACA,MAAA,IAAA,CAAK,EAAA,GAAK,CAAA;AACV,MAAA,IAAA,CAAK,EAAA,GAAK,QAAA;AACV,MAAA,MAAA,CAAO,IAAI,CAAA;AAAA,IACb;AAEA,IAAA,SAAS,MAAA,CAAO,MAAM,QAAA,EAAU;AAC9B,MAAA,IAAA,CAAK,EAAA,GAAK,CAAA;AACV,MAAA,IAAA,CAAK,EAAA,GAAK,QAAA;AACV,MAAA,IAAIA,SAAQ,EAAA,EAAI;AACd,QAAAA,QAAAA,CAAQ,EAAA,CAAG,IAAA,EAAM,QAAQ,CAAA;AAAA,MAC3B;AACA,MAAA,MAAA,CAAO,IAAI,CAAA;AAAA,IACb;AACA,IAAA,SAAS,OAAO,IAAA,EAAM;AACpB,MAAA,IAAI,IAAA,CAAK,OAAO,CAAA,EAAG;AACjB,QAAA,MAAA,CAAO,IAAA,EAAM,KAAK,EAAE,CAAA;AACpB,QAAA,IAAA,CAAK,EAAA,GAAK,IAAA;AAAA,MACZ;AACA,MAAA,IAAI,IAAA,CAAK,OAAO,CAAA,EAAG;AACjB,QAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,EAAA,CAAG,QAAQ,CAAA,EAAA,EAAK;AACvC,UAAA,MAAA,CAAO,IAAA,EAAM,IAAA,CAAK,EAAA,CAAG,CAAC,CAAC,CAAA;AAAA,QACzB;AACA,QAAA,IAAA,CAAK,EAAA,GAAK,IAAA;AAAA,MACZ;AAAA,IACF;AAEA,IAAA,SAAS,OAAA,CAAQ,WAAA,EAAa,UAAA,EAAY,OAAA,EAAQ;AAChD,MAAA,IAAA,CAAK,WAAA,GAAc,OAAO,WAAA,KAAgB,UAAA,GAAa,WAAA,GAAc,IAAA;AACrE,MAAA,IAAA,CAAK,UAAA,GAAa,OAAO,UAAA,KAAe,UAAA,GAAa,UAAA,GAAa,IAAA;AAClE,MAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AAAA,IACjB;AAQA,IAAA,SAAS,SAAA,CAAU,IAAI,OAAA,EAAS;AAC9B,MAAA,IAAI,IAAA,GAAO,KAAA;AACX,MAAA,IAAI,GAAA,GAAM,UAAA,CAAW,EAAA,EAAI,SAAU,KAAA,EAAO;AACxC,QAAA,IAAI,IAAA,EAAM;AACV,QAAA,IAAA,GAAO,IAAA;AACP,QAAA,OAAA,CAAQ,SAAS,KAAK,CAAA;AAAA,MACxB,CAAA,EAAG,SAAU,MAAA,EAAQ;AACnB,QAAA,IAAI,IAAA,EAAM;AACV,QAAA,IAAA,GAAO,IAAA;AACP,QAAA,MAAA,CAAO,SAAS,MAAM,CAAA;AAAA,MACxB,CAAC,CAAA;AACD,MAAA,IAAI,CAAC,IAAA,IAAQ,GAAA,KAAQ,QAAA,EAAU;AAC7B,QAAA,IAAA,GAAO,IAAA;AACP,QAAA,MAAA,CAAO,SAAS,UAAU,CAAA;AAAA,MAC5B;AAAA,IACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACpNA,IAAA,0BAAA,GAAA,UAAA,CAAA;AAAA,EAAA,yDAAA,CAAAD,SAAA,EAAA;AAEA,IAAA,IAAIC,QAAAA,GAAU,YAAA,EAAA;AAEd,IAAA,IAAI,iBAAA,GAAoB;AAAA,MACtB,cAAA;AAAA,MACA,SAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,IAAI,OAAA,GAAU,KAAA;AACd,IAAAD,SAAA,CAAQ,OAAA,GAAU,OAAA;AAClB,IAAA,SAAS,OAAA,GAAU;AACjB,MAAA,OAAA,GAAU,KAAA;AACV,MAAAC,SAAQ,EAAA,GAAK,IAAA;AACb,MAAAA,SAAQ,EAAA,GAAK,IAAA;AAAA,IACf;AAEA,IAAAD,SAAA,CAAQ,MAAA,GAAS,MAAA;AACjB,IAAA,SAAS,OAAO,OAAA,EAAS;AACvB,MAAA,OAAA,GAAU,WAAW,EAAC;AACtB,MAAA,IAAI,SAAS,OAAA,EAAQ;AACrB,MAAA,OAAA,GAAU,IAAA;AACV,MAAA,IAAI,EAAA,GAAK,CAAA;AACT,MAAA,IAAI,SAAA,GAAY,CAAA;AAChB,MAAA,IAAI,aAAa,EAAC;AAClB,MAAAC,QAAAA,CAAQ,EAAA,GAAK,SAAU,OAAA,EAAS;AAC9B,QAAA,IACE,QAAQ,EAAA,KAAO,CAAA;AAAA,QACf,UAAA,CAAW,OAAA,CAAQ,EAAE,CAAA,EACrB;AACA,UAAA,IAAI,UAAA,CAAW,OAAA,CAAQ,EAAE,CAAA,CAAE,MAAA,EAAQ;AACjC,YAAA,SAAA,CAAU,QAAQ,EAAE,CAAA;AAAA,UACtB,CAAA,MAAO;AACL,YAAA,YAAA,CAAa,UAAA,CAAW,OAAA,CAAQ,EAAE,CAAA,CAAE,OAAO,CAAA;AAAA,UAC7C;AACA,UAAA,OAAO,UAAA,CAAW,QAAQ,EAAE,CAAA;AAAA,QAC9B;AAAA,MACF,CAAA;AACA,MAAAA,QAAAA,CAAQ,EAAA,GAAK,SAAU,OAAA,EAAS,GAAA,EAAK;AACnC,QAAA,IAAI,OAAA,CAAQ,OAAO,CAAA,EAAG;AACpB,UAAA,OAAA,CAAQ,EAAA,GAAK,EAAA,EAAA;AACb,UAAA,UAAA,CAAW,OAAA,CAAQ,EAAE,CAAA,GAAI;AAAA,YACvB,SAAA,EAAW,IAAA;AAAA,YACX,KAAA,EAAO,GAAA;AAAA,YACP,OAAA,EAAS,UAAA;AAAA,cACP,WAAA,CAAY,IAAA,CAAK,IAAA,EAAM,OAAA,CAAQ,EAAE,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAKjC,cAAA,CAAe,GAAA,EAAK,iBAAiB,CAAA,GACjC,GAAA,GACA;AAAA,aACN;AAAA,YACA,MAAA,EAAQ;AAAA,WACV;AAAA,QACF;AAAA,MACF,CAAA;AACA,MAAA,SAAS,YAAYG,GAAAA,EAAI;AACvB,QAAA,IACE,QAAQ,aAAA,IACR,cAAA;AAAA,UACE,UAAA,CAAWA,GAAE,CAAA,CAAE,KAAA;AAAA,UACf,QAAQ,SAAA,IAAa;AAAA,SACvB,EACA;AACA,UAAA,UAAA,CAAWA,GAAE,EAAE,SAAA,GAAY,SAAA,EAAA;AAC3B,UAAA,IAAI,QAAQ,WAAA,EAAa;AACvB,YAAA,UAAA,CAAWA,GAAE,EAAE,MAAA,GAAS,IAAA;AACxB,YAAA,OAAA,CAAQ,WAAA;AAAA,cACN,UAAA,CAAWA,GAAE,CAAA,CAAE,SAAA;AAAA,cACf,UAAA,CAAWA,GAAE,CAAA,CAAE;AAAA,aACjB;AAAA,UACF,CAAA,MAAO;AACL,YAAA,UAAA,CAAWA,GAAE,EAAE,MAAA,GAAS,IAAA;AACxB,YAAA,QAAA;AAAA,cACE,UAAA,CAAWA,GAAE,CAAA,CAAE,SAAA;AAAA,cACf,UAAA,CAAWA,GAAE,CAAA,CAAE;AAAA,aACjB;AAAA,UACF;AAAA,QACF;AAAA,MACF;AACA,MAAA,SAAS,UAAUA,GAAAA,EAAI;AACrB,QAAA,IAAI,UAAA,CAAWA,GAAE,CAAA,CAAE,MAAA,EAAQ;AACzB,UAAA,IAAI,QAAQ,SAAA,EAAW;AACrB,YAAA,OAAA,CAAQ,SAAA,CAAU,WAAWA,GAAE,CAAA,CAAE,WAAW,UAAA,CAAWA,GAAE,EAAE,KAAK,CAAA;AAAA,UAClE,CAAA,MAAA,IAAW,CAAC,UAAA,CAAWA,GAAE,EAAE,WAAA,EAAa;AACtC,YAAA,OAAA,CAAQ,IAAA;AAAA,cACN,iCAAA,GAAoC,UAAA,CAAWA,GAAE,CAAA,CAAE,SAAA,GAAY;AAAA,aACjE;AACA,YAAA,OAAA,CAAQ,IAAA;AAAA,cACN,+GAAA,GACA,UAAA,CAAWA,GAAE,CAAA,CAAE,SAAA,GAAY;AAAA,aAC7B;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,IAAA,SAAS,QAAA,CAAS,IAAI,KAAA,EAAO;AAC3B,MAAA,OAAA,CAAQ,IAAA,CAAK,4CAAA,GAA+C,EAAA,GAAK,IAAI,CAAA;AACrE,MAAA,IAAI,MAAA,GAAA,CAAU,KAAA,KAAU,KAAA,CAAM,KAAA,IAAS,KAAA,CAAA,IAAU,EAAA;AACjD,MAAA,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA,CAAE,OAAA,CAAQ,SAAU,IAAA,EAAM;AACzC,QAAA,OAAA,CAAQ,IAAA,CAAK,OAAO,IAAI,CAAA;AAAA,MAC1B,CAAC,CAAA;AAAA,IACH;AAEA,IAAA,SAAS,cAAA,CAAe,OAAO,IAAA,EAAM;AACnC,MAAA,OAAO,IAAA,CAAK,IAAA,CAAK,SAAU,GAAA,EAAK;AAC9B,QAAA,OAAO,KAAA,YAAiB,GAAA;AAAA,MAC1B,CAAC,CAAA;AAAA,IACH;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC1GO,IAAM,cAAN,MAAkB;AAAA,EAMvB,YAAY,OAAA,EAAuB;AAJnC,IAAA,IAAA,CAAQ,QAAA,GAAoB,KAAA;AAC5B,IAAA,IAAA,CAAQ,eAAA,GACN,IAAA;AAGA,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AAAA,EACjB;AAAA,EAEA,MAAA,GAAe;AACb,IAAA,IAAI,KAAK,QAAA,EAAU;AAGnB,IAAA,IAAA,CAAK,eAAA,GAAkB,WAAW,gBAAA,EAAiB;AAEnD,IAAA,UAAA,CAAW,gBAAA,CAAiB,CAAC,KAAA,EAAc,OAAA,KAAsB;AAC/D,MAAA,IAAA,CAAK,QAAQ,mBAAA,EAAqB,KAAA,EAAO,EAAE,OAAA,EAAS,OAAA,IAAW,OAAO,CAAA;AAGtE,MAAA,IAAI,KAAK,eAAA,EAAiB;AACxB,QAAA,IAAA,CAAK,eAAA,CAAgB,OAAO,OAAO,CAAA;AAAA,MACrC;AAAA,IACF,CAAC,CAAA;AAGD,IAAA,MAAM,QAAA,GAAW,0BAAA,EAAA;AACjB,IAAA,QAAA,CAAS,MAAA,CAAO;AAAA,MACd,aAAA,EAAe,IAAA;AAAA,MACf,WAAA,EAAa,CAAC,GAAA,EAAa,KAAA,KAAmB;AAC5C,QAAA,MAAM,GAAA,GAAM,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA;AACpE,QAAA,IAAA,CAAK,QAAQ,oBAAA,EAAsB,GAAA,EAAK,EAAE,KAAA,EAAO,OAAO,CAAA;AAAA,MAC1D;AAAA,KACD,CAAA;AAED,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAAA,EAClB;AAAA,EAEA,MAAA,GAAe;AACb,IAAA,IAAI,CAAC,KAAK,QAAA,EAAU;AAGpB,IAAA,IAAI,KAAK,eAAA,EAAiB;AACxB,MAAA,UAAA,CAAW,gBAAA,CAAiB,KAAK,eAAe,CAAA;AAChD,MAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AAAA,IACzB;AAEA,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAAA,EAClB;AACF,CAAA;;;ACnDO,IAAM,mBAAN,MAAuB;AAAA,EAI5B,WAAA,CAAY,IAAA,EAAc,KAAA,GAAQ,KAAA,EAAO;AACvC,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AAClC,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AAAA,EACf;AAAA;AAAA,EAIA,MAAM,KAAK,KAAA,EAAqC;AAC9C,IAAA,IAAI;AACF,MAAA,MAAM,WAAW,MAAM,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,OAAA,CAAA,EAAW;AAAA,QAClD,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,QAC9C,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,KAAK;AAAA,OAC3B,CAAA;AAED,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,IAAA,CAAK,GAAA;AAAA,UACH,CAAA,sBAAA,EAAyB,QAAA,CAAS,MAAM,CAAA,CAAA,EAAI,SAAS,UAAU,CAAA;AAAA,SACjE;AACA,QAAA,OAAO,KAAA;AAAA,MACT;AAEA,MAAA,IAAA,CAAK,IAAI,CAAA,YAAA,EAAe,KAAA,CAAM,IAAI,CAAA,QAAA,EAAM,KAAA,CAAM,IAAI,CAAA,CAAE,CAAA;AACpD,MAAA,OAAO,IAAA;AAAA,IACT,SAAS,GAAA,EAAK;AACZ,MAAA,IAAA,CAAK,GAAA,CAAI,CAAA,6BAAA,EAAgC,GAAG,CAAA,CAAE,CAAA;AAC9C,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,UAAU,MAAA,EAAwC;AACtD,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,MAAA,EAAQ,CAAC,CAAA;AAEnC,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,MAAM,OAAA,CAAQ,GAAA,CAAI,KAAA,CAAM,GAAA,CAAI,CAAC,MAAM,IAAA,CAAK,IAAA,CAAK,CAAC,CAAC,CAAC,CAAA;AAAA,IAClD;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAIA,MAAM,aAAA,CACJ,IAAA,EACA,OAAA,EACkB;AAClB,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,CAAA,EAAG,KAAK,IAAI,CAAA,WAAA,EAAc,IAAI,CAAA,CAAA,EAAI;AAAA,QAC7D,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,QAC9C,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,OAAO;AAAA,OAC7B,CAAA;AAED,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,IAAA,CAAK,GAAA;AAAA,UACH,CAAA,0BAAA,EAA6B,QAAA,CAAS,MAAM,CAAA,CAAA,EAAI,SAAS,UAAU,CAAA;AAAA,SACrE;AACA,QAAA,OAAO,KAAA;AAAA,MACT;AAEA,MAAA,IAAA,CAAK,GAAA,CAAI,CAAA,gBAAA,EAAmB,IAAI,CAAA,CAAE,CAAA;AAClC,MAAA,OAAO,IAAA;AAAA,IACT,SAAS,GAAA,EAAK;AACZ,MAAA,IAAA,CAAK,GAAA,CAAI,CAAA,iCAAA,EAAoC,GAAG,CAAA,CAAE,CAAA;AAClD,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA,EAIQ,KAAA,CAAS,KAAU,IAAA,EAAqB;AAC9C,IAAA,OAAO,KAAA,CAAM,IAAA;AAAA,MAAK,EAAE,MAAA,EAAQ,IAAA,CAAK,KAAK,GAAA,CAAI,MAAA,GAAS,IAAI,CAAA,EAAE;AAAA,MAAG,CAAC,GAAG,CAAA,KAC9D,GAAA,CAAI,MAAM,CAAA,GAAI,IAAA,EAAM,CAAA,GAAI,IAAA,GAAO,IAAI;AAAA,KACrC;AAAA,EACF;AAAA,EAEQ,IAAI,OAAA,EAAuB;AACjC,IAAA,IAAI,KAAK,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,aAAA,EAAgB,OAAO,CAAA,CAAE,CAAA;AAAA,IACvC;AAAA,EACF;AACF,CAAA;ACnEA,IAAO,8BAAA,GAAQ,mBAAA,CAAoB,YAAA,CAAmB,kBAAkB,CAAA;ACPxE,IAAO,+BAAA,GAAQC,mBAAAA,CAAoB,YAAA,CAAmB,mBAAmB,CAAA;;;ACFzE,SAAS,iBAAA,GAA4B;AACnC,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,EAAI,CAAE,SAAS,EAAE,CAAA;AACxC,EAAA,MAAM,MAAA,GAAS,KAAK,MAAA,EAAO,CAAE,SAAS,EAAE,CAAA,CAAE,SAAA,CAAU,CAAA,EAAG,EAAE,CAAA;AACzD,EAAA,OAAO,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA;AAC/B;AAEA,SAAS,eAAe,IAAA,EAA2B;AACjD,EAAA,QAAQ,IAAA;AAAM,IACZ,KAAK,MAAA;AACH,MAAA,OAAO,MAAA;AAAA,IACT,KAAK,UAAA;AACH,MAAA,OAAO,UAAA;AAAA,IACT,KAAK,SAAA;AACH,MAAA,OAAO,SAAA;AAAA,IACT;AACE,MAAA,OAAO,SAAA;AAAA;AAEb;AAEA,SAAS,WAAA,GAAsB;AAC7B,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,CAAK,cAAA,EAAe,CAAE,eAAA,EAAgB,CAAE,QAAA;AAAA,EACjD,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,SAAA;AAAA,EACT;AACF;AAEA,SAAS,WAAA,GAAsB;AAC7B,EAAA,IAAI;AACF,IAAA,OACE,WAAA,CAAY,YAAA,IAAe,EAAG,gBAAA,EAAkB,OAAA,CAAQ,GAAA,EAAK,GAAG,CAAA,IAChE,IAAA,CAAK,cAAA,EAAe,CAAE,eAAA,GAAkB,MAAA,IACxC,SAAA;AAAA,EAEJ,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,SAAA;AAAA,EACT;AACF;AAEO,IAAM,mBAAN,MAAuB;AAAA,EAK5B,WAAA,CAAY,UAAA,GAAyB,EAAC,EAAG;AAFzC,IAAA,IAAA,CAAQ,cAA2B,EAAC;AAGlC,IAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAClB,IAAA,IAAA,CAAK,cAAA,GAAiB;AAAA,MACpB,WAAW,iBAAA,EAAkB;AAAA,MAC7B,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,KACpC;AAAA,EACF;AAAA,EAEA,SAAS,IAAA,EAAyB;AAChC,IAAA,IAAA,CAAK,cAAc,EAAE,GAAG,IAAA,CAAK,WAAA,EAAa,GAAG,IAAA,EAAK;AAAA,EACpD;AAAA,EAEA,SAAA,GAAkB;AAChB,IAAA,IAAA,CAAK,cAAc,EAAC;AAAA,EACtB;AAAA,EAEA,MAAM,OAAA,GAAoC;AACxC,IAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAO,GAAI,UAAA,CAAW,IAAI,QAAQ,CAAA;AAGjD,IAAA,IAAI,UAAA,GAAa,IAAA;AACjB,IAAA,IAAI,WAAA,GAAc,IAAA;AAElB,IAAA,IAAI;AACF,MAAA,IAAI,8BAAA,EAAwB;AAC1B,QAAA,UAAA,GAAa,MAAM,+BAAuB,aAAA,EAAc;AAAA,MAC1D;AAAA,IACF,SAAS,CAAA,EAAG;AACV,MAAA,OAAA,CAAQ,IAAA,CAAK,+CAA+C,CAAC,CAAA;AAAA,IAC/D;AAEA,IAAA,IAAI;AACF,MAAA,IAAI,+BAAA,EAAyB;AAC3B,QAAA,WAAA,GAAc,MAAM,gCAAwB,cAAA,EAAe;AAAA,MAC7D;AAAA,IACF,SAAS,CAAA,EAAG;AACV,MAAA,OAAA,CAAQ,IAAA,CAAK,gDAAgD,CAAC,CAAA;AAAA,IAChE;AAEA,IAAA,MAAM,MAAA,GAAwB;AAAA,MAC5B,QAAA,EAAU,QAAA,CAAS,EAAA,KAAO,KAAA,GAAQ,KAAA,GAAQ,SAAA;AAAA,MAC1C,IAAI,UAAA,EAAY,EAAA,KAAO,QAAA,CAAS,EAAA,KAAO,QAAQ,KAAA,GAAQ,SAAA,CAAA;AAAA,MACvD,WACE,UAAA,EAAY,SAAA,IAAa,QAAA,CAAS,OAAA,EAAS,UAAS,IAAK,SAAA;AAAA,MAC3D,KAAA,EAAO,YAAY,KAAA,IAAS,SAAA;AAAA,MAC5B,YAAA,EAAc,YAAY,YAAA,IAAgB,SAAA;AAAA,MAC1C,KAAA,EAAO,YAAY,KAAA,IAAS,SAAA;AAAA,MAC5B,QAAA,EAAU,YAAY,QAAA,IAAY,KAAA;AAAA,MAClC,UAAA,EAAY,YAAY,UAAA,IAAc,SAAA;AAAA,MACtC,WAAA,EAAa,YAAY,WAAA,IAAe,SAAA;AAAA,MACxC,QAAA,EAAU,YAAY,QAAA,IAAY,SAAA;AAAA,MAClC,WAAA,EAAa,YAAY,WAAA,IAAe,KAAA;AAAA,MACxC,YAAA,EAAc,YAAY,YAAA,IAAgB,MAAA;AAAA,MAC1C,SAAA,EAAW,UAAA,CAAW,GAAA,CAAI,QAAQ,EAAE,SAAA,IAAa,CAAA;AAAA,MACjD,UAAA,EAAY,YAAY,UAAA,IAAc,KAAA;AAAA,MACtC,UAAU,WAAA,EAAY;AAAA,MACtB,UAAU,WAAA;AAAY,KACxB;AAEA,IAAA,MAAM,OAAA,GAA0B;AAAA,MAC9B,IAAA,EAAM,cAAA,CAAe,WAAA,EAAa,IAAA,IAAQ,SAAS,CAAA;AAAA,MACnD,WAAA,EAAa,aAAa,WAAA,IAAe,KAAA;AAAA,MACzC,aAAA,EAAe,aAAa,aAAA,IAAiB,KAAA;AAAA,MAC7C,OAAA,EAAS,aAAa,OAAA,IAAW,SAAA;AAAA,MACjC,SAAA,EAAW,aAAa,SAAA,IAAa;AAAA,KACvC;AAEA,IAAA,OAAO;AAAA,MACL,KAAK,IAAA,CAAK,UAAA;AAAA,MACV,MAAA;AAAA,MACA,OAAA;AAAA,MACA,SAAS,IAAA,CAAK,cAAA;AAAA,MACd,MAAM,IAAA,CAAK;AAAA,KACb;AAAA,EACF;AACF,CAAA;;;AClIO,IAAM,aAAN,MAAiB;AAAA,EAItB,WAAA,CAAY,UAAU,GAAA,EAAK;AAH3B,IAAA,IAAA,CAAQ,QAAsB,EAAC;AAI7B,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AAAA,EACjB;AAAA,EAEA,QAAQ,KAAA,EAAyB;AAC/B,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,MAAA,IAAU,IAAA,CAAK,OAAA,EAAS;AACrC,MAAA,IAAA,CAAK,MAAM,KAAA,EAAM;AAAA,IACnB;AAEA,IAAA,IAAA,CAAK,KAAA,CAAM,KAAK,KAAK,CAAA;AAAA,EACvB;AAAA,EAEA,QAAQ,KAAA,EAA6B;AACnC,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,CAAA,EAAG,KAAK,CAAA;AAAA,EACnC;AAAA,EAEA,IAAI,IAAA,GAAe;AACjB,IAAA,OAAO,KAAK,KAAA,CAAM,MAAA;AAAA,EACpB;AAAA,EAEA,IAAI,OAAA,GAAmB;AACrB,IAAA,OAAO,IAAA,CAAK,MAAM,MAAA,KAAW,CAAA;AAAA,EAC/B;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,QAAQ,EAAC;AAAA,EAChB;AACF,CAAA;;;ACpBA,IAAM,gBAAN,MAAoB;AAAA,EAApB,WAAA,GAAA;AACE,IAAA,IAAA,CAAQ,MAAA,GAA2B,IAAA;AACnC,IAAA,IAAA,CAAQ,MAAA,GAAkC,IAAA;AAC1C,IAAA,IAAA,CAAQ,KAAA,GAA2B,IAAA;AACnC,IAAA,IAAA,CAAQ,WAAA,GAAkC,IAAA;AAC1C,IAAA,IAAA,CAAQ,gBAAA,GAA4C,IAAA;AACpD,IAAA,IAAA,CAAQ,UAAA,GAAoD,IAAA;AAC5D,IAAA,IAAA,CAAQ,WAAA,GAAuB,KAAA;AAC/B,IAAA,IAAA,CAAiB,cAAA,GACf,+CAAA;AAAA,EAAA;AAAA;AAAA,EAIF,KAAK,MAAA,EAAyB;AAC5B,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA,IAAA,CAAK,IAAI,yCAAoC,CAAA;AAC7C,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,MAAA,GAAS;AAAA,MACZ,WAAA,EAAa,IAAA;AAAA,MACb,KAAA,EAAO,KAAA;AAAA,MACP,aAAA,EAAe,GAAA;AAAA,MACf,YAAA,EAAc,GAAA;AAAA,MACd,GAAG;AAAA,KACL;AAEA,IAAA,IAAA,CAAK,SAAS,IAAI,gBAAA,CAAiB,KAAK,cAAA,EAAgB,IAAA,CAAK,OAAO,KAAK,CAAA;AACzE,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,UAAA,CAAW,IAAA,CAAK,OAAO,YAAY,CAAA;AACpD,IAAA,IAAA,CAAK,gBAAA,GAAmB,IAAI,gBAAA,CAAiB;AAAA,MAC3C,aAAa,MAAA,CAAO;AAAA,KACrB,CAAA;AAED,IAAA,IAAA,CAAK,UAAA,GAAa,WAAA;AAAA,MAChB,MAAM,KAAK,KAAA,EAAM;AAAA,MACjB,KAAK,MAAA,CAAO;AAAA,KACd;AAEA,IAAA,IAAI,IAAA,CAAK,OAAO,WAAA,EAAa;AAC3B,MAAA,IAAA,CAAK,cAAc,IAAI,WAAA,CAAY,CAAC,IAAA,EAAM,OAAO,OAAA,KAAY;AAC3D,QAAA,IAAA,CAAK,YAAA,CAAa,KAAA,EAAO,EAAE,OAAA,EAAS,SAAS,CAAA;AAAA,MAC/C,CAAC,CAAA;AACD,MAAA,IAAA,CAAK,YAAY,MAAA,EAAO;AAAA,IAC1B;AAEA,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AACnB,IAAA,IAAA,CAAK,GAAA,CAAI,CAAA,yBAAA,EAAuB,IAAA,CAAK,cAAc,CAAA,CAAE,CAAA;AAAA,EACvD;AAAA,EAEA,MAAM,UAAA,GAAuC;AAC3C,IAAA,IAAA,CAAK,kBAAkB,YAAY,CAAA;AACnC,IAAA,OAAO,IAAA,CAAK,iBAAkB,OAAA,EAAQ;AAAA,EACxC;AAAA,EAEA,SAAS,IAAA,EAAyB;AAChC,IAAA,IAAA,CAAK,kBAAkB,UAAU,CAAA;AACjC,IAAA,IAAA,CAAK,gBAAA,CAAkB,SAAS,IAAI,CAAA;AACpC,IAAA,IAAA,CAAK,IAAI,CAAA,iBAAA,EAAoB,IAAA,CAAK,SAAA,CAAU,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,EACrD;AAAA,EAEA,SAAA,GAAkB;AAChB,IAAA,IAAA,CAAK,kBAAkB,WAAW,CAAA;AAClC,IAAA,IAAA,CAAK,iBAAkB,SAAA,EAAU;AAAA,EACnC;AAAA,EAEA,KAAA,CAAM,IAAA,EAAc,OAAA,GAAwB,EAAC,EAAS;AACpD,IAAA,IAAA,CAAK,kBAAkB,OAAO,CAAA;AAC9B,IAAA,IAAA,CAAK,eAAA;AAAA,MACH,OAAA;AAAA,MACA,IAAA;AAAA,MACA,OAAA,CAAQ,WAAW,EAAC;AAAA,MACpB,OAAA,CAAQ;AAAA,KACV;AAAA,EACF;AAAA,EAEA,MAAA,CAAO,IAAA,EAAc,KAAA,EAAe,OAAA,GAAwB,EAAC,EAAS;AACpE,IAAA,IAAA,CAAK,kBAAkB,QAAQ,CAAA;AAC/B,IAAA,IAAA,CAAK,eAAA;AAAA,MACH,QAAA;AAAA,MACA,IAAA;AAAA,MACA,EAAE,KAAA,EAAO,GAAG,OAAA,CAAQ,OAAA,EAAQ;AAAA,MAC5B,OAAA,CAAQ;AAAA,KACV;AAAA,EACF;AAAA,EAEA,YAAA,CAAa,KAAA,EAAc,OAAA,GAA+B,EAAC,EAAS;AAClE,IAAA,IAAA,CAAK,kBAAkB,cAAc,CAAA;AACrC,IAAA,IAAA,CAAK,eAAA,CAAgB,OAAA,EAAS,KAAA,CAAM,IAAA,IAAQ,cAAA,EAAgB;AAAA,MAC1D,SAAS,KAAA,CAAM,OAAA;AAAA,MACf,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,GAAG,OAAA,CAAQ;AAAA,KACZ,CAAA;AAAA,EACH;AAAA;AAAA,EAIA,YAAA,GAAqB;AACnB,IAAA,IAAA,CAAK,kBAAkB,cAAc,CAAA;AACrC,IAAA,IAAA,CAAK,gBAAA,CAAkB,OAAA,EAAQ,CAC5B,IAAA,CAAK,CAAC,OAAA,KAAY;AACjB,MAAA,IAAA,CAAK,MAAA,CAAQ,cAAc,SAAA,EAAW;AAAA,QACpC,MAAA,EAAQ,KAAK,MAAA,CAAQ,MAAA;AAAA,QACrB,SAAA,EAAW,QAAQ,OAAA,CAAQ,SAAA;AAAA,QAC3B,SAAA,EAAW,QAAQ,OAAA,CAAQ,SAAA;AAAA,QAC3B;AAAA,OACD,CAAA;AACD,MAAA,IAAA,CAAK,GAAA,CAAI,CAAA,iBAAA,EAAoB,OAAA,CAAQ,OAAA,CAAQ,SAAS,CAAA,CAAE,CAAA;AAAA,IAC1D,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,GAAA,KAAQ;AACd,MAAA,IAAA,CAAK,GAAA,CAAI,CAAA,yBAAA,EAA4B,GAAG,CAAA,CAAE,CAAA;AAAA,IAC5C,CAAC,CAAA;AAAA,EACL;AAAA,EAEA,WAAW,QAAA,EAAyB;AAClC,IAAA,IAAA,CAAK,kBAAkB,YAAY,CAAA;AACnC,IAAA,IAAA,CAAK,gBAAA,CAAkB,OAAA,EAAQ,CAC5B,IAAA,CAAK,CAAC,OAAA,KAAY;AACjB,MAAA,IAAA,CAAK,MAAA,CAAQ,cAAc,SAAA,EAAW;AAAA,QACpC,MAAA,EAAQ,KAAK,MAAA,CAAQ,MAAA;AAAA,QACrB,SAAA,EAAW,QAAQ,OAAA,CAAQ,SAAA;AAAA,QAC3B,SAAA,EAAW,QAAQ,OAAA,CAAQ,SAAA;AAAA,QAC3B,OAAA,EAAA,iBAAS,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,QAChC,QAAA;AAAA,QACA;AAAA,OACD,CAAA;AACD,MAAA,IAAA,CAAK,KAAA,EAAM;AACX,MAAA,IAAA,CAAK,GAAA,CAAI,CAAA,eAAA,EAAkB,OAAA,CAAQ,OAAA,CAAQ,SAAS,CAAA,CAAE,CAAA;AAAA,IACxD,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,GAAA,KAAQ;AACd,MAAA,IAAA,CAAK,GAAA,CAAI,CAAA,uBAAA,EAA0B,GAAG,CAAA,CAAE,CAAA;AAAA,IAC1C,CAAC,CAAA;AAAA,EACL;AAAA,EAEA,WAAA,CAAY,YAAoB,QAAA,EAAyB;AACvD,IAAA,IAAA,CAAK,kBAAkB,aAAa,CAAA;AACpC,IAAA,IAAA,CAAK,gBAAA,CAAkB,OAAA,EAAQ,CAC5B,IAAA,CAAK,CAAC,OAAA,KAAY;AACjB,MAAA,IAAA,CAAK,MAAA,CAAQ,cAAc,aAAA,EAAe;AAAA,QACxC,MAAA,EAAQ,KAAK,MAAA,CAAQ,MAAA;AAAA,QACrB,UAAA;AAAA,QACA,QAAA;AAAA,QACA,SAAA,EAAW,QAAQ,OAAA,CAAQ,SAAA;AAAA,QAC3B;AAAA,OACD,CAAA;AACD,MAAA,IAAA,CAAK,GAAA,CAAI,CAAA,gBAAA,EAAmB,UAAU,CAAA,CAAE,CAAA;AAAA,IAC1C,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,GAAA,KAAQ;AACd,MAAA,IAAA,CAAK,GAAA,CAAI,CAAA,wBAAA,EAA2B,GAAG,CAAA,CAAE,CAAA;AAAA,IAC3C,CAAC,CAAA;AAAA,EACL;AAAA,EAEA,YAAA,CACE,QAAA,EACA,UAAA,EACA,UAAA,EACA,UACA,WAAA,EACM;AACN,IAAA,IAAA,CAAK,kBAAkB,cAAc,CAAA;AACrC,IAAA,IAAA,CAAK,gBAAA,CAAkB,OAAA,EAAQ,CAC5B,IAAA,CAAK,CAAC,OAAA,KAAY;AACjB,MAAA,IAAA,CAAK,MAAA,CAAQ,cAAc,UAAA,EAAY;AAAA,QACrC,MAAA,EAAQ,KAAK,MAAA,CAAQ,MAAA;AAAA,QACrB,QAAA;AAAA,QACA,UAAA;AAAA,QACA,UAAA;AAAA,QACA,QAAA;AAAA,QACA,WAAA;AAAA,QACA,SAAA,EAAW,QAAQ,OAAA,CAAQ,SAAA;AAAA,QAC3B;AAAA,OACD,CAAA;AACD,MAAA,IAAA,CAAK,IAAI,CAAA,kBAAA,EAAqB,UAAU,IAAI,QAAQ,CAAA,CAAA,EAAI,UAAU,CAAA,CAAE,CAAA;AAAA,IACtE,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,GAAA,KAAQ;AACd,MAAA,IAAA,CAAK,GAAA,CAAI,CAAA,0BAAA,EAA6B,GAAG,CAAA,CAAE,CAAA;AAAA,IAC7C,CAAC,CAAA;AAAA,EACL;AAAA,EAEA,UAAA,CAAW,KAAA,EAAc,OAAA,GAAU,KAAA,EAAa;AAC9C,IAAA,IAAA,CAAK,kBAAkB,YAAY,CAAA;AACnC,IAAA,IAAA,CAAK,gBAAA,CAAkB,OAAA,EAAQ,CAC5B,IAAA,CAAK,CAAC,OAAA,KAAY;AACjB,MAAA,IAAA,CAAK,MAAA,CAAQ,cAAc,OAAA,EAAS;AAAA,QAClC,MAAA,EAAQ,KAAK,MAAA,CAAQ,MAAA;AAAA,QACrB,WAAW,KAAA,CAAM,IAAA;AAAA,QACjB,cAAc,KAAA,CAAM,OAAA;AAAA,QACpB,UAAA,EAAY,MAAM,KAAA,IAAS,EAAA;AAAA,QAC3B,OAAA;AAAA,QACA,SAAA,EAAW,QAAQ,OAAA,CAAQ,SAAA;AAAA,QAC3B;AAAA,OACD,CAAA;AACD,MAAA,IAAA,CAAK,IAAI,CAAA,eAAA,EAAkB,KAAA,CAAM,IAAI,CAAA,eAAA,EAAa,OAAO,CAAA,CAAE,CAAA;AAAA,IAC7D,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,GAAA,KAAQ;AACd,MAAA,IAAA,CAAK,GAAA,CAAI,CAAA,uBAAA,EAA0B,GAAG,CAAA,CAAE,CAAA;AAAA,IAC1C,CAAC,CAAA;AAAA,EACL;AAAA;AAAA,EAIA,MAAM,KAAA,GAAuB;AAC3B,IAAA,IAAI,CAAC,IAAA,CAAK,KAAA,IAAS,IAAA,CAAK,MAAM,OAAA,EAAS;AACvC,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAElB,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,EAAE,CAAA;AACpC,IAAA,IAAA,CAAK,GAAA,CAAI,CAAA,SAAA,EAAY,MAAA,CAAO,MAAM,CAAA,SAAA,CAAW,CAAA;AAC7C,IAAA,MAAM,IAAA,CAAK,MAAA,CAAO,SAAA,CAAU,MAAM,CAAA;AAAA,EACpC;AAAA,EAEA,OAAA,GAAgB;AACd,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA,aAAA,CAAc,KAAK,UAAU,CAAA;AAC7B,MAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAAA,IACpB;AAEA,IAAA,IAAA,CAAK,aAAa,MAAA,EAAO;AACzB,IAAA,IAAA,CAAK,OAAO,KAAA,EAAM;AAElB,IAAA,IAAA,CAAK,WAAA,GAAc,KAAA;AACnB,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AACd,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AACd,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AACb,IAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA;AAExB,IAAA,IAAA,CAAK,IAAI,eAAe,CAAA;AAAA,EAC1B;AAAA;AAAA,EAIQ,eAAA,CACN,IAAA,EACA,IAAA,EACA,OAAA,EACA,SAAA,EACM;AACN,IAAA,IAAA,CAAK,gBAAA,CAAkB,OAAA,EAAQ,CAC5B,IAAA,CAAK,CAAC,OAAA,KAAY;AACjB,MAAA,MAAM,KAAA,GAAoB;AAAA,QACxB,MAAA,EAAQ,KAAK,MAAA,CAAQ,MAAA;AAAA,QACrB,IAAA;AAAA,QACA,IAAA;AAAA,QACA,OAAA;AAAA,QACA,SAAA,EAAW,SAAA,IAAA,iBAAa,IAAI,IAAA,IAAO,WAAA,EAAY;AAAA,QAC/C;AAAA,OACF;AAEA,MAAA,IAAA,CAAK,KAAA,CAAO,QAAQ,KAAK,CAAA;AACzB,MAAA,IAAA,CAAK,GAAA,CAAI,CAAA,QAAA,EAAW,IAAI,CAAA,QAAA,EAAM,IAAI,CAAA,CAAE,CAAA;AAEpC,MAAA,IAAI,SAAS,OAAA,EAAS;AACpB,QAAA,IAAA,CAAK,KAAA,EAAM;AAAA,MACb;AAAA,IACF,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,GAAA,KAAQ;AACd,MAAA,IAAA,CAAK,GAAA,CAAI,CAAA,2BAAA,EAA8B,GAAG,CAAA,CAAE,CAAA;AAAA,IAC9C,CAAC,CAAA;AAAA,EACL;AAAA,EAEQ,kBAAkB,MAAA,EAAsB;AAC9C,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACrB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,WAAA,EAAc,MAAM,CAAA,kCAAA,CAAoC,CAAA;AAAA,IAC1E;AAAA,EACF;AAAA,EAEQ,IAAI,OAAA,EAAuB;AACjC,IAAA,IAAI,IAAA,CAAK,QAAQ,KAAA,EAAO;AACtB,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,aAAA,EAAgB,OAAO,CAAA,CAAE,CAAA;AAAA,IACvC;AAAA,EACF;AACF,CAAA;AAEO,IAAM,UAAA,GAAa,IAAI,aAAA","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 { 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 // ─── 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 } from \"./types\";\n\nexport class EventQueue {\n private queue: PulseEvent[] = [];\n private maxSize: number;\n\n constructor(maxSize = 100) {\n this.maxSize = maxSize;\n }\n\n enqueue(event: PulseEvent): void {\n if (this.queue.length >= this.maxSize) {\n this.queue.shift();\n }\n\n this.queue.push(event);\n }\n\n dequeue(count: number): PulseEvent[] {\n return this.queue.splice(0, count);\n }\n\n get size(): number {\n return this.queue.length;\n }\n\n get isEmpty(): boolean {\n return this.queue.length === 0;\n }\n\n clear(): void {\n this.queue = [];\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 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 // ─── Public API ───────────────────────────────────────────────────\n\n init(config: SDKConfig): void {\n if (this.initialized) {\n this.log(\"SDK already initialized — skipping\");\n return;\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);\n this.contextCollector = new ContextCollector({\n environment: config.environment,\n });\n\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.log(`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.log(`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 // ─── 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.log(`Session started: ${context.session.sessionId}`);\n })\n .catch((err) => {\n this.log(`Failed to start session: ${err}`);\n });\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.log(`Session ended: ${context.session.sessionId}`);\n })\n .catch((err) => {\n this.log(`Failed to end session: ${err}`);\n });\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.log(`Screen tracked: ${screenName}`);\n })\n .catch((err) => {\n this.log(`Failed to track screen: ${err}`);\n });\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.log(`API call tracked: ${httpMethod} ${endpoint} ${statusCode}`);\n })\n .catch((err) => {\n this.log(`Failed to track API call: ${err}`);\n });\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.log(`Crash tracked: ${error.name} — fatal: ${isFatal}`);\n })\n .catch((err) => {\n this.log(`Failed to track crash: ${err}`);\n });\n }\n\n // ─── Flush & Destroy ─────────────────────────────────────────────\n\n async flush(): Promise<void> {\n if (!this.queue || this.queue.isEmpty) return;\n if (!this.client) return;\n\n const events = this.queue.dequeue(10);\n this.log(`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.autoCapture?.detach();\n this.queue?.clear();\n\n this.initialized = false;\n this.config = null;\n this.client = null;\n this.queue = null;\n this.contextCollector = null;\n\n this.log(\"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\n this.queue!.enqueue(event);\n this.log(`Queued: ${type} — ${name}`);\n\n if (type === \"error\") {\n this.flush();\n }\n })\n .catch((err) => {\n this.log(`Failed to collect context: ${err}`);\n });\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 log(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 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.1.1",
3
+ "version": "0.2.1",
4
4
  "description": "Official PulseBoard SDK for React Native",
5
5
  "main": "./dist/index.cjs",
6
6
  "module": "./dist/index.mjs",