@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 +5 -6
- package/dist/index.d.ts +5 -6
- package/dist/index.js +70 -67
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +70 -67
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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:
|
|
497
|
-
buildNumber:
|
|
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.
|
|
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(
|
|
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.
|
|
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":"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","file":"index.js","sourcesContent":["'use strict';\n\n\n\nfunction noop() {}\n\n// States:\n//\n// 0 - pending\n// 1 - fulfilled with _value\n// 2 - rejected with _value\n// 3 - adopted the state of another promise, _value\n//\n// once the state is no longer pending (0) it is immutable\n\n// All `_` prefixed properties will be reduced to `_{random number}`\n// at build time to obfuscate them and discourage their use.\n// We don't use symbols or Object.defineProperty to fully hide them\n// because the performance isn't good enough.\n\n\n// to avoid using try/catch inside critical functions, we\n// extract them to here.\nvar LAST_ERROR = null;\nvar IS_ERROR = {};\nfunction getThen(obj) {\n try {\n return obj.then;\n } catch (ex) {\n LAST_ERROR = ex;\n return IS_ERROR;\n }\n}\n\nfunction tryCallOne(fn, a) {\n try {\n return fn(a);\n } catch (ex) {\n LAST_ERROR = ex;\n return IS_ERROR;\n }\n}\nfunction tryCallTwo(fn, a, b) {\n try {\n fn(a, b);\n } catch (ex) {\n LAST_ERROR = ex;\n return IS_ERROR;\n }\n}\n\nmodule.exports = Promise;\n\nfunction Promise(fn) {\n if (typeof this !== 'object') {\n throw new TypeError('Promises must be constructed via new');\n }\n if (typeof fn !== 'function') {\n throw new TypeError('Promise constructor\\'s argument is not a function');\n }\n this._x = 0;\n this._y = 0;\n this._z = null;\n this._A = null;\n if (fn === noop) return;\n doResolve(fn, this);\n}\nPromise._B = null;\nPromise._C = null;\nPromise._D = noop;\n\nPromise.prototype.then = function(onFulfilled, onRejected) {\n if (this.constructor !== Promise) {\n return safeThen(this, onFulfilled, onRejected);\n }\n var res = new Promise(noop);\n handle(this, new Handler(onFulfilled, onRejected, res));\n return res;\n};\n\nfunction safeThen(self, onFulfilled, onRejected) {\n return new self.constructor(function (resolve, reject) {\n var res = new Promise(noop);\n res.then(resolve, reject);\n handle(self, new Handler(onFulfilled, onRejected, res));\n });\n}\nfunction handle(self, deferred) {\n while (self._y === 3) {\n self = self._z;\n }\n if (Promise._B) {\n Promise._B(self);\n }\n if (self._y === 0) {\n if (self._x === 0) {\n self._x = 1;\n self._A = deferred;\n return;\n }\n if (self._x === 1) {\n self._x = 2;\n self._A = [self._A, deferred];\n return;\n }\n self._A.push(deferred);\n return;\n }\n handleResolved(self, deferred);\n}\n\nfunction handleResolved(self, deferred) {\n setImmediate(function() {\n var cb = self._y === 1 ? deferred.onFulfilled : deferred.onRejected;\n if (cb === null) {\n if (self._y === 1) {\n resolve(deferred.promise, self._z);\n } else {\n reject(deferred.promise, self._z);\n }\n return;\n }\n var ret = tryCallOne(cb, self._z);\n if (ret === IS_ERROR) {\n reject(deferred.promise, LAST_ERROR);\n } else {\n resolve(deferred.promise, ret);\n }\n });\n}\nfunction resolve(self, newValue) {\n // Promise Resolution Procedure: https://github.com/promises-aplus/promises-spec#the-promise-resolution-procedure\n if (newValue === self) {\n return reject(\n self,\n new TypeError('A promise cannot be resolved with itself.')\n );\n }\n if (\n newValue &&\n (typeof newValue === 'object' || typeof newValue === 'function')\n ) {\n var then = getThen(newValue);\n if (then === IS_ERROR) {\n return reject(self, LAST_ERROR);\n }\n if (\n then === self.then &&\n newValue instanceof Promise\n ) {\n self._y = 3;\n self._z = newValue;\n finale(self);\n return;\n } else if (typeof then === 'function') {\n doResolve(then.bind(newValue), self);\n return;\n }\n }\n self._y = 1;\n self._z = newValue;\n finale(self);\n}\n\nfunction reject(self, newValue) {\n self._y = 2;\n self._z = newValue;\n if (Promise._C) {\n Promise._C(self, newValue);\n }\n finale(self);\n}\nfunction finale(self) {\n if (self._x === 1) {\n handle(self, self._A);\n self._A = null;\n }\n if (self._x === 2) {\n for (var i = 0; i < self._A.length; i++) {\n handle(self, self._A[i]);\n }\n self._A = null;\n }\n}\n\nfunction Handler(onFulfilled, onRejected, promise){\n this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null;\n this.onRejected = typeof onRejected === 'function' ? onRejected : null;\n this.promise = promise;\n}\n\n/**\n * Take a potentially misbehaving resolver function and make sure\n * onFulfilled and onRejected are only called once.\n *\n * Makes no guarantees about asynchrony.\n */\nfunction doResolve(fn, promise) {\n var done = false;\n var res = tryCallTwo(fn, function (value) {\n if (done) return;\n done = true;\n resolve(promise, value);\n }, function (reason) {\n if (done) return;\n done = true;\n reject(promise, reason);\n });\n if (!done && res === IS_ERROR) {\n done = true;\n reject(promise, LAST_ERROR);\n }\n}\n","'use strict';\n\nvar Promise = require('./core');\n\nvar DEFAULT_WHITELIST = [\n ReferenceError,\n TypeError,\n RangeError\n];\n\nvar enabled = false;\nexports.disable = disable;\nfunction disable() {\n enabled = false;\n Promise._B = null;\n Promise._C = null;\n}\n\nexports.enable = enable;\nfunction enable(options) {\n options = options || {};\n if (enabled) disable();\n enabled = true;\n var id = 0;\n var displayId = 0;\n var rejections = {};\n Promise._B = function (promise) {\n if (\n promise._y === 2 && // IS REJECTED\n rejections[promise._E]\n ) {\n if (rejections[promise._E].logged) {\n onHandled(promise._E);\n } else {\n clearTimeout(rejections[promise._E].timeout);\n }\n delete rejections[promise._E];\n }\n };\n Promise._C = function (promise, err) {\n if (promise._x === 0) { // not yet handled\n promise._E = id++;\n rejections[promise._E] = {\n displayId: null,\n error: err,\n timeout: setTimeout(\n onUnhandled.bind(null, promise._E),\n // For reference errors and type errors, this almost always\n // means the programmer made a mistake, so log them after just\n // 100ms\n // otherwise, wait 2 seconds to see if they get handled\n matchWhitelist(err, DEFAULT_WHITELIST)\n ? 100\n : 2000\n ),\n logged: false\n };\n }\n };\n function onUnhandled(id) {\n if (\n options.allRejections ||\n matchWhitelist(\n rejections[id].error,\n options.whitelist || DEFAULT_WHITELIST\n )\n ) {\n rejections[id].displayId = displayId++;\n if (options.onUnhandled) {\n rejections[id].logged = true;\n options.onUnhandled(\n rejections[id].displayId,\n rejections[id].error\n );\n } else {\n rejections[id].logged = true;\n logError(\n rejections[id].displayId,\n rejections[id].error\n );\n }\n }\n }\n function onHandled(id) {\n if (rejections[id].logged) {\n if (options.onHandled) {\n options.onHandled(rejections[id].displayId, rejections[id].error);\n } else if (!rejections[id].onUnhandled) {\n console.warn(\n 'Promise Rejection Handled (id: ' + rejections[id].displayId + '):'\n );\n console.warn(\n ' This means you can ignore any previous messages of the form \"Possible Unhandled Promise Rejection\" with id ' +\n rejections[id].displayId + '.'\n );\n }\n }\n }\n}\n\nfunction logError(id, error) {\n console.warn('Possible Unhandled Promise Rejection (id: ' + id + '):');\n var errStr = (error && (error.stack || error)) + '';\n errStr.split('\\n').forEach(function (line) {\n console.warn(' ' + line);\n });\n}\n\nfunction matchWhitelist(error, list) {\n return list.some(function (cls) {\n return error instanceof cls;\n });\n}","type ErrorHandler = (\n name: string,\n error: Error,\n context?: Record<string, unknown>,\n) => void;\n\nexport class AutoCapture {\n private handler: ErrorHandler;\n private attached: boolean = false;\n private previousHandler: ((error: Error, isFatal?: boolean) => void) | null =\n null;\n\n constructor(handler: ErrorHandler) {\n this.handler = handler;\n }\n\n attach(): void {\n if (this.attached) return;\n\n // React Native's global error handler - catches all unhandled JS errors\n this.previousHandler = ErrorUtils.getGlobalHandler();\n\n ErrorUtils.setGlobalHandler((error: Error, isFatal?: boolean) => {\n this.handler(\"uncaughtException\", error, { isFatal: isFatal ?? false });\n\n // Always call the previous handler (React Native's default crash reporter)\n if (this.previousHandler) {\n this.previousHandler(error, isFatal);\n }\n });\n\n // Unhandled promise rejections\n const tracking = require(\"promise/setimmediate/rejection-tracking\");\n tracking.enable({\n allRejections: true,\n onUnhandled: (_id: number, error: unknown) => {\n const err = error instanceof Error ? error : new Error(String(error));\n this.handler(\"unhandledRejection\", err, { fatal: false });\n },\n });\n\n this.attached = true;\n }\n\n detach(): void {\n if (!this.attached) return;\n\n // Restore the previous error handler\n if (this.previousHandler) {\n ErrorUtils.setGlobalHandler(this.previousHandler);\n this.previousHandler = null;\n }\n\n this.attached = false;\n }\n}\n","import { 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:
|
|
495
|
-
buildNumber:
|
|
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.
|
|
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(
|
|
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.
|
|
562
|
+
this.log(`Initialized \u2014 host: ${this.PULSEBOARD_API}`);
|
|
560
563
|
}
|
|
561
564
|
async getContext() {
|
|
562
565
|
this.assertInitialized("getContext");
|
package/dist/index.mjs.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"],"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":"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","file":"index.mjs","sourcesContent":["'use strict';\n\n\n\nfunction noop() {}\n\n// States:\n//\n// 0 - pending\n// 1 - fulfilled with _value\n// 2 - rejected with _value\n// 3 - adopted the state of another promise, _value\n//\n// once the state is no longer pending (0) it is immutable\n\n// All `_` prefixed properties will be reduced to `_{random number}`\n// at build time to obfuscate them and discourage their use.\n// We don't use symbols or Object.defineProperty to fully hide them\n// because the performance isn't good enough.\n\n\n// to avoid using try/catch inside critical functions, we\n// extract them to here.\nvar LAST_ERROR = null;\nvar IS_ERROR = {};\nfunction getThen(obj) {\n try {\n return obj.then;\n } catch (ex) {\n LAST_ERROR = ex;\n return IS_ERROR;\n }\n}\n\nfunction tryCallOne(fn, a) {\n try {\n return fn(a);\n } catch (ex) {\n LAST_ERROR = ex;\n return IS_ERROR;\n }\n}\nfunction tryCallTwo(fn, a, b) {\n try {\n fn(a, b);\n } catch (ex) {\n LAST_ERROR = ex;\n return IS_ERROR;\n }\n}\n\nmodule.exports = Promise;\n\nfunction Promise(fn) {\n if (typeof this !== 'object') {\n throw new TypeError('Promises must be constructed via new');\n }\n if (typeof fn !== 'function') {\n throw new TypeError('Promise constructor\\'s argument is not a function');\n }\n this._x = 0;\n this._y = 0;\n this._z = null;\n this._A = null;\n if (fn === noop) return;\n doResolve(fn, this);\n}\nPromise._B = null;\nPromise._C = null;\nPromise._D = noop;\n\nPromise.prototype.then = function(onFulfilled, onRejected) {\n if (this.constructor !== Promise) {\n return safeThen(this, onFulfilled, onRejected);\n }\n var res = new Promise(noop);\n handle(this, new Handler(onFulfilled, onRejected, res));\n return res;\n};\n\nfunction safeThen(self, onFulfilled, onRejected) {\n return new self.constructor(function (resolve, reject) {\n var res = new Promise(noop);\n res.then(resolve, reject);\n handle(self, new Handler(onFulfilled, onRejected, res));\n });\n}\nfunction handle(self, deferred) {\n while (self._y === 3) {\n self = self._z;\n }\n if (Promise._B) {\n Promise._B(self);\n }\n if (self._y === 0) {\n if (self._x === 0) {\n self._x = 1;\n self._A = deferred;\n return;\n }\n if (self._x === 1) {\n self._x = 2;\n self._A = [self._A, deferred];\n return;\n }\n self._A.push(deferred);\n return;\n }\n handleResolved(self, deferred);\n}\n\nfunction handleResolved(self, deferred) {\n setImmediate(function() {\n var cb = self._y === 1 ? deferred.onFulfilled : deferred.onRejected;\n if (cb === null) {\n if (self._y === 1) {\n resolve(deferred.promise, self._z);\n } else {\n reject(deferred.promise, self._z);\n }\n return;\n }\n var ret = tryCallOne(cb, self._z);\n if (ret === IS_ERROR) {\n reject(deferred.promise, LAST_ERROR);\n } else {\n resolve(deferred.promise, ret);\n }\n });\n}\nfunction resolve(self, newValue) {\n // Promise Resolution Procedure: https://github.com/promises-aplus/promises-spec#the-promise-resolution-procedure\n if (newValue === self) {\n return reject(\n self,\n new TypeError('A promise cannot be resolved with itself.')\n );\n }\n if (\n newValue &&\n (typeof newValue === 'object' || typeof newValue === 'function')\n ) {\n var then = getThen(newValue);\n if (then === IS_ERROR) {\n return reject(self, LAST_ERROR);\n }\n if (\n then === self.then &&\n newValue instanceof Promise\n ) {\n self._y = 3;\n self._z = newValue;\n finale(self);\n return;\n } else if (typeof then === 'function') {\n doResolve(then.bind(newValue), self);\n return;\n }\n }\n self._y = 1;\n self._z = newValue;\n finale(self);\n}\n\nfunction reject(self, newValue) {\n self._y = 2;\n self._z = newValue;\n if (Promise._C) {\n Promise._C(self, newValue);\n }\n finale(self);\n}\nfunction finale(self) {\n if (self._x === 1) {\n handle(self, self._A);\n self._A = null;\n }\n if (self._x === 2) {\n for (var i = 0; i < self._A.length; i++) {\n handle(self, self._A[i]);\n }\n self._A = null;\n }\n}\n\nfunction Handler(onFulfilled, onRejected, promise){\n this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null;\n this.onRejected = typeof onRejected === 'function' ? onRejected : null;\n this.promise = promise;\n}\n\n/**\n * Take a potentially misbehaving resolver function and make sure\n * onFulfilled and onRejected are only called once.\n *\n * Makes no guarantees about asynchrony.\n */\nfunction doResolve(fn, promise) {\n var done = false;\n var res = tryCallTwo(fn, function (value) {\n if (done) return;\n done = true;\n resolve(promise, value);\n }, function (reason) {\n if (done) return;\n done = true;\n reject(promise, reason);\n });\n if (!done && res === IS_ERROR) {\n done = true;\n reject(promise, LAST_ERROR);\n }\n}\n","'use strict';\n\nvar Promise = require('./core');\n\nvar DEFAULT_WHITELIST = [\n ReferenceError,\n TypeError,\n RangeError\n];\n\nvar enabled = false;\nexports.disable = disable;\nfunction disable() {\n enabled = false;\n Promise._B = null;\n Promise._C = null;\n}\n\nexports.enable = enable;\nfunction enable(options) {\n options = options || {};\n if (enabled) disable();\n enabled = true;\n var id = 0;\n var displayId = 0;\n var rejections = {};\n Promise._B = function (promise) {\n if (\n promise._y === 2 && // IS REJECTED\n rejections[promise._E]\n ) {\n if (rejections[promise._E].logged) {\n onHandled(promise._E);\n } else {\n clearTimeout(rejections[promise._E].timeout);\n }\n delete rejections[promise._E];\n }\n };\n Promise._C = function (promise, err) {\n if (promise._x === 0) { // not yet handled\n promise._E = id++;\n rejections[promise._E] = {\n displayId: null,\n error: err,\n timeout: setTimeout(\n onUnhandled.bind(null, promise._E),\n // For reference errors and type errors, this almost always\n // means the programmer made a mistake, so log them after just\n // 100ms\n // otherwise, wait 2 seconds to see if they get handled\n matchWhitelist(err, DEFAULT_WHITELIST)\n ? 100\n : 2000\n ),\n logged: false\n };\n }\n };\n function onUnhandled(id) {\n if (\n options.allRejections ||\n matchWhitelist(\n rejections[id].error,\n options.whitelist || DEFAULT_WHITELIST\n )\n ) {\n rejections[id].displayId = displayId++;\n if (options.onUnhandled) {\n rejections[id].logged = true;\n options.onUnhandled(\n rejections[id].displayId,\n rejections[id].error\n );\n } else {\n rejections[id].logged = true;\n logError(\n rejections[id].displayId,\n rejections[id].error\n );\n }\n }\n }\n function onHandled(id) {\n if (rejections[id].logged) {\n if (options.onHandled) {\n options.onHandled(rejections[id].displayId, rejections[id].error);\n } else if (!rejections[id].onUnhandled) {\n console.warn(\n 'Promise Rejection Handled (id: ' + rejections[id].displayId + '):'\n );\n console.warn(\n ' This means you can ignore any previous messages of the form \"Possible Unhandled Promise Rejection\" with id ' +\n rejections[id].displayId + '.'\n );\n }\n }\n }\n}\n\nfunction logError(id, error) {\n console.warn('Possible Unhandled Promise Rejection (id: ' + id + '):');\n var errStr = (error && (error.stack || error)) + '';\n errStr.split('\\n').forEach(function (line) {\n console.warn(' ' + line);\n });\n}\n\nfunction matchWhitelist(error, list) {\n return list.some(function (cls) {\n return error instanceof cls;\n });\n}","type ErrorHandler = (\n name: string,\n error: Error,\n context?: Record<string, unknown>,\n) => void;\n\nexport class AutoCapture {\n private handler: ErrorHandler;\n private attached: boolean = false;\n private previousHandler: ((error: Error, isFatal?: boolean) => void) | null =\n null;\n\n constructor(handler: ErrorHandler) {\n this.handler = handler;\n }\n\n attach(): void {\n if (this.attached) return;\n\n // React Native's global error handler - catches all unhandled JS errors\n this.previousHandler = ErrorUtils.getGlobalHandler();\n\n ErrorUtils.setGlobalHandler((error: Error, isFatal?: boolean) => {\n this.handler(\"uncaughtException\", error, { isFatal: isFatal ?? false });\n\n // Always call the previous handler (React Native's default crash reporter)\n if (this.previousHandler) {\n this.previousHandler(error, isFatal);\n }\n });\n\n // Unhandled promise rejections\n const tracking = require(\"promise/setimmediate/rejection-tracking\");\n tracking.enable({\n allRejections: true,\n onUnhandled: (_id: number, error: unknown) => {\n const err = error instanceof Error ? error : new Error(String(error));\n this.handler(\"unhandledRejection\", err, { fatal: false });\n },\n });\n\n this.attached = true;\n }\n\n detach(): void {\n if (!this.attached) return;\n\n // Restore the previous error handler\n if (this.previousHandler) {\n ErrorUtils.setGlobalHandler(this.previousHandler);\n this.previousHandler = null;\n }\n\n this.attached = false;\n }\n}\n","import { 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"]}
|