@formo/analytics-react-native 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +302 -0
- package/lib/commonjs/FormoAnalytics.js +526 -0
- package/lib/commonjs/FormoAnalytics.js.map +1 -0
- package/lib/commonjs/FormoAnalyticsProvider.js +265 -0
- package/lib/commonjs/FormoAnalyticsProvider.js.map +1 -0
- package/lib/commonjs/constants/config.js +69 -0
- package/lib/commonjs/constants/config.js.map +1 -0
- package/lib/commonjs/constants/events.js +30 -0
- package/lib/commonjs/constants/events.js.map +1 -0
- package/lib/commonjs/constants/index.js +39 -0
- package/lib/commonjs/constants/index.js.map +1 -0
- package/lib/commonjs/constants/storage.js +23 -0
- package/lib/commonjs/constants/storage.js.map +1 -0
- package/lib/commonjs/index.js +65 -0
- package/lib/commonjs/index.js.map +1 -0
- package/lib/commonjs/lib/consent/index.js +56 -0
- package/lib/commonjs/lib/consent/index.js.map +1 -0
- package/lib/commonjs/lib/event/EventFactory.js +493 -0
- package/lib/commonjs/lib/event/EventFactory.js.map +1 -0
- package/lib/commonjs/lib/event/EventManager.js +46 -0
- package/lib/commonjs/lib/event/EventManager.js.map +1 -0
- package/lib/commonjs/lib/event/EventQueue.js +290 -0
- package/lib/commonjs/lib/event/EventQueue.js.map +1 -0
- package/lib/commonjs/lib/event/index.js +50 -0
- package/lib/commonjs/lib/event/index.js.map +1 -0
- package/lib/commonjs/lib/event/types.js +6 -0
- package/lib/commonjs/lib/event/types.js.map +1 -0
- package/lib/commonjs/lib/lifecycle/index.js +196 -0
- package/lib/commonjs/lib/lifecycle/index.js.map +1 -0
- package/lib/commonjs/lib/logger/index.js +48 -0
- package/lib/commonjs/lib/logger/index.js.map +1 -0
- package/lib/commonjs/lib/session/index.js +109 -0
- package/lib/commonjs/lib/session/index.js.map +1 -0
- package/lib/commonjs/lib/storage/AsyncStorageAdapter.js +164 -0
- package/lib/commonjs/lib/storage/AsyncStorageAdapter.js.map +1 -0
- package/lib/commonjs/lib/storage/MemoryStorage.js +41 -0
- package/lib/commonjs/lib/storage/MemoryStorage.js.map +1 -0
- package/lib/commonjs/lib/storage/StorageBlueprint.js +24 -0
- package/lib/commonjs/lib/storage/StorageBlueprint.js.map +1 -0
- package/lib/commonjs/lib/storage/StorageManager.js +126 -0
- package/lib/commonjs/lib/storage/StorageManager.js.map +1 -0
- package/lib/commonjs/lib/storage/index.js +49 -0
- package/lib/commonjs/lib/storage/index.js.map +1 -0
- package/lib/commonjs/lib/storage/types.js +2 -0
- package/lib/commonjs/lib/storage/types.js.map +1 -0
- package/lib/commonjs/lib/wagmi/WagmiEventHandler.js +445 -0
- package/lib/commonjs/lib/wagmi/WagmiEventHandler.js.map +1 -0
- package/lib/commonjs/lib/wagmi/index.js +28 -0
- package/lib/commonjs/lib/wagmi/index.js.map +1 -0
- package/lib/commonjs/lib/wagmi/types.js +2 -0
- package/lib/commonjs/lib/wagmi/types.js.map +1 -0
- package/lib/commonjs/types/base.js +6 -0
- package/lib/commonjs/types/base.js.map +1 -0
- package/lib/commonjs/types/events.js +22 -0
- package/lib/commonjs/types/events.js.map +1 -0
- package/lib/commonjs/types/index.js +28 -0
- package/lib/commonjs/types/index.js.map +1 -0
- package/lib/commonjs/utils/address.js +82 -0
- package/lib/commonjs/utils/address.js.map +1 -0
- package/lib/commonjs/utils/hash.js +30 -0
- package/lib/commonjs/utils/hash.js.map +1 -0
- package/lib/commonjs/utils/helpers.js +116 -0
- package/lib/commonjs/utils/helpers.js.map +1 -0
- package/lib/commonjs/utils/index.js +61 -0
- package/lib/commonjs/utils/index.js.map +1 -0
- package/lib/commonjs/utils/timestamp.js +34 -0
- package/lib/commonjs/utils/timestamp.js.map +1 -0
- package/lib/commonjs/utils/trafficSource.js +147 -0
- package/lib/commonjs/utils/trafficSource.js.map +1 -0
- package/lib/commonjs/version.js +10 -0
- package/lib/commonjs/version.js.map +1 -0
- package/lib/module/FormoAnalytics.js +519 -0
- package/lib/module/FormoAnalytics.js.map +1 -0
- package/lib/module/FormoAnalyticsProvider.js +256 -0
- package/lib/module/FormoAnalyticsProvider.js.map +1 -0
- package/lib/module/constants/config.js +62 -0
- package/lib/module/constants/config.js.map +1 -0
- package/lib/module/constants/events.js +24 -0
- package/lib/module/constants/events.js.map +1 -0
- package/lib/module/constants/index.js +4 -0
- package/lib/module/constants/index.js.map +1 -0
- package/lib/module/constants/storage.js +17 -0
- package/lib/module/constants/storage.js.map +1 -0
- package/lib/module/index.js +51 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/lib/consent/index.js +49 -0
- package/lib/module/lib/consent/index.js.map +1 -0
- package/lib/module/lib/event/EventFactory.js +488 -0
- package/lib/module/lib/event/EventFactory.js.map +1 -0
- package/lib/module/lib/event/EventManager.js +41 -0
- package/lib/module/lib/event/EventManager.js.map +1 -0
- package/lib/module/lib/event/EventQueue.js +283 -0
- package/lib/module/lib/event/EventQueue.js.map +1 -0
- package/lib/module/lib/event/index.js +5 -0
- package/lib/module/lib/event/index.js.map +1 -0
- package/lib/module/lib/event/types.js +2 -0
- package/lib/module/lib/event/types.js.map +1 -0
- package/lib/module/lib/lifecycle/index.js +190 -0
- package/lib/module/lib/lifecycle/index.js.map +1 -0
- package/lib/module/lib/logger/index.js +42 -0
- package/lib/module/lib/logger/index.js.map +1 -0
- package/lib/module/lib/session/index.js +92 -0
- package/lib/module/lib/session/index.js.map +1 -0
- package/lib/module/lib/storage/AsyncStorageAdapter.js +158 -0
- package/lib/module/lib/storage/AsyncStorageAdapter.js.map +1 -0
- package/lib/module/lib/storage/MemoryStorage.js +35 -0
- package/lib/module/lib/storage/MemoryStorage.js.map +1 -0
- package/lib/module/lib/storage/StorageBlueprint.js +18 -0
- package/lib/module/lib/storage/StorageBlueprint.js.map +1 -0
- package/lib/module/lib/storage/StorageManager.js +115 -0
- package/lib/module/lib/storage/StorageManager.js.map +1 -0
- package/lib/module/lib/storage/index.js +5 -0
- package/lib/module/lib/storage/index.js.map +1 -0
- package/lib/module/lib/storage/types.js +2 -0
- package/lib/module/lib/storage/types.js.map +1 -0
- package/lib/module/lib/wagmi/WagmiEventHandler.js +439 -0
- package/lib/module/lib/wagmi/WagmiEventHandler.js.map +1 -0
- package/lib/module/lib/wagmi/index.js +3 -0
- package/lib/module/lib/wagmi/index.js.map +1 -0
- package/lib/module/lib/wagmi/types.js +2 -0
- package/lib/module/lib/wagmi/types.js.map +1 -0
- package/lib/module/types/base.js +2 -0
- package/lib/module/types/base.js.map +1 -0
- package/lib/module/types/events.js +17 -0
- package/lib/module/types/events.js.map +1 -0
- package/lib/module/types/index.js +3 -0
- package/lib/module/types/index.js.map +1 -0
- package/lib/module/utils/address.js +74 -0
- package/lib/module/utils/address.js.map +1 -0
- package/lib/module/utils/hash.js +24 -0
- package/lib/module/utils/hash.js.map +1 -0
- package/lib/module/utils/helpers.js +105 -0
- package/lib/module/utils/helpers.js.map +1 -0
- package/lib/module/utils/index.js +6 -0
- package/lib/module/utils/index.js.map +1 -0
- package/lib/module/utils/timestamp.js +26 -0
- package/lib/module/utils/timestamp.js.map +1 -0
- package/lib/module/utils/trafficSource.js +137 -0
- package/lib/module/utils/trafficSource.js.map +1 -0
- package/lib/module/version.js +4 -0
- package/lib/module/version.js.map +1 -0
- package/lib/typescript/FormoAnalytics.d.ts +163 -0
- package/lib/typescript/FormoAnalytics.d.ts.map +1 -0
- package/lib/typescript/FormoAnalyticsProvider.d.ts +29 -0
- package/lib/typescript/FormoAnalyticsProvider.d.ts.map +1 -0
- package/lib/typescript/constants/config.d.ts +8 -0
- package/lib/typescript/constants/config.d.ts.map +1 -0
- package/lib/typescript/constants/events.d.ts +23 -0
- package/lib/typescript/constants/events.d.ts.map +1 -0
- package/lib/typescript/constants/index.d.ts +4 -0
- package/lib/typescript/constants/index.d.ts.map +1 -0
- package/lib/typescript/constants/storage.d.ts +10 -0
- package/lib/typescript/constants/storage.d.ts.map +1 -0
- package/lib/typescript/index.d.ts +44 -0
- package/lib/typescript/index.d.ts.map +1 -0
- package/lib/typescript/lib/consent/index.d.ts +13 -0
- package/lib/typescript/lib/consent/index.d.ts.map +1 -0
- package/lib/typescript/lib/event/EventFactory.d.ts +61 -0
- package/lib/typescript/lib/event/EventFactory.d.ts.map +1 -0
- package/lib/typescript/lib/event/EventManager.d.ts +17 -0
- package/lib/typescript/lib/event/EventManager.d.ts.map +1 -0
- package/lib/typescript/lib/event/EventQueue.d.ts +74 -0
- package/lib/typescript/lib/event/EventQueue.d.ts.map +1 -0
- package/lib/typescript/lib/event/index.d.ts +5 -0
- package/lib/typescript/lib/event/index.d.ts.map +1 -0
- package/lib/typescript/lib/event/types.d.ts +23 -0
- package/lib/typescript/lib/event/types.d.ts.map +1 -0
- package/lib/typescript/lib/lifecycle/index.d.ts +46 -0
- package/lib/typescript/lib/lifecycle/index.d.ts.map +1 -0
- package/lib/typescript/lib/logger/index.d.ts +19 -0
- package/lib/typescript/lib/logger/index.d.ts.map +1 -0
- package/lib/typescript/lib/session/index.d.ts +41 -0
- package/lib/typescript/lib/session/index.d.ts.map +1 -0
- package/lib/typescript/lib/storage/AsyncStorageAdapter.d.ts +48 -0
- package/lib/typescript/lib/storage/AsyncStorageAdapter.d.ts.map +1 -0
- package/lib/typescript/lib/storage/MemoryStorage.d.ts +18 -0
- package/lib/typescript/lib/storage/MemoryStorage.d.ts.map +1 -0
- package/lib/typescript/lib/storage/StorageBlueprint.d.ts +21 -0
- package/lib/typescript/lib/storage/StorageBlueprint.d.ts.map +1 -0
- package/lib/typescript/lib/storage/StorageManager.d.ts +45 -0
- package/lib/typescript/lib/storage/StorageManager.d.ts.map +1 -0
- package/lib/typescript/lib/storage/index.d.ts +5 -0
- package/lib/typescript/lib/storage/index.d.ts.map +1 -0
- package/lib/typescript/lib/storage/types.d.ts +22 -0
- package/lib/typescript/lib/storage/types.d.ts.map +1 -0
- package/lib/typescript/lib/wagmi/WagmiEventHandler.d.ts +104 -0
- package/lib/typescript/lib/wagmi/WagmiEventHandler.d.ts.map +1 -0
- package/lib/typescript/lib/wagmi/index.d.ts +3 -0
- package/lib/typescript/lib/wagmi/index.d.ts.map +1 -0
- package/lib/typescript/lib/wagmi/types.d.ts +54 -0
- package/lib/typescript/lib/wagmi/types.d.ts.map +1 -0
- package/lib/typescript/types/base.d.ts +219 -0
- package/lib/typescript/types/base.d.ts.map +1 -0
- package/lib/typescript/types/events.d.ts +111 -0
- package/lib/typescript/types/events.d.ts.map +1 -0
- package/lib/typescript/types/index.d.ts +3 -0
- package/lib/typescript/types/index.d.ts.map +1 -0
- package/lib/typescript/utils/address.d.ts +25 -0
- package/lib/typescript/utils/address.d.ts.map +1 -0
- package/lib/typescript/utils/hash.d.ts +10 -0
- package/lib/typescript/utils/hash.d.ts.map +1 -0
- package/lib/typescript/utils/helpers.d.ts +26 -0
- package/lib/typescript/utils/helpers.d.ts.map +1 -0
- package/lib/typescript/utils/index.d.ts +6 -0
- package/lib/typescript/utils/index.d.ts.map +1 -0
- package/lib/typescript/utils/timestamp.d.ts +13 -0
- package/lib/typescript/utils/timestamp.d.ts.map +1 -0
- package/lib/typescript/utils/trafficSource.d.ts +30 -0
- package/lib/typescript/utils/trafficSource.d.ts.map +1 -0
- package/lib/typescript/version.d.ts +2 -0
- package/lib/typescript/version.d.ts.map +1 -0
- package/package.json +143 -0
- package/src/FormoAnalytics.ts +685 -0
- package/src/FormoAnalyticsProvider.tsx +296 -0
- package/src/constants/config.ts +62 -0
- package/src/constants/events.ts +26 -0
- package/src/constants/index.ts +3 -0
- package/src/constants/storage.ts +16 -0
- package/src/index.ts +55 -0
- package/src/lib/consent/index.ts +52 -0
- package/src/lib/event/EventFactory.ts +682 -0
- package/src/lib/event/EventManager.ts +50 -0
- package/src/lib/event/EventQueue.ts +371 -0
- package/src/lib/event/index.ts +4 -0
- package/src/lib/event/types.ts +107 -0
- package/src/lib/lifecycle/index.ts +215 -0
- package/src/lib/logger/index.ts +56 -0
- package/src/lib/session/index.ts +103 -0
- package/src/lib/storage/AsyncStorageAdapter.ts +173 -0
- package/src/lib/storage/MemoryStorage.ts +43 -0
- package/src/lib/storage/StorageBlueprint.ts +30 -0
- package/src/lib/storage/StorageManager.ts +121 -0
- package/src/lib/storage/index.ts +4 -0
- package/src/lib/storage/types.ts +23 -0
- package/src/lib/wagmi/WagmiEventHandler.ts +574 -0
- package/src/lib/wagmi/index.ts +2 -0
- package/src/lib/wagmi/types.ts +71 -0
- package/src/types/base.ts +287 -0
- package/src/types/events.ts +140 -0
- package/src/types/index.ts +2 -0
- package/src/utils/address.ts +84 -0
- package/src/utils/hash.ts +23 -0
- package/src/utils/helpers.ts +139 -0
- package/src/utils/index.ts +5 -0
- package/src/utils/timestamp.ts +25 -0
- package/src/utils/trafficSource.ts +153 -0
- package/src/version.ts +3 -0
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.EventQueue = void 0;
|
|
7
|
+
var _reactNative = require("react-native");
|
|
8
|
+
var _constants = require("../../constants");
|
|
9
|
+
var _utils = require("../../utils");
|
|
10
|
+
var _hash = require("../../utils/hash");
|
|
11
|
+
var _timestamp = require("../../utils/timestamp");
|
|
12
|
+
var _logger = require("../logger");
|
|
13
|
+
const DEFAULT_RETRY = 3;
|
|
14
|
+
const MAX_RETRY = 5;
|
|
15
|
+
const MIN_RETRY = 1;
|
|
16
|
+
const DEFAULT_FLUSH_AT = 20;
|
|
17
|
+
const MAX_FLUSH_AT = 20;
|
|
18
|
+
const MIN_FLUSH_AT = 1;
|
|
19
|
+
const DEFAULT_QUEUE_SIZE = 1_024 * 500; // 500kB
|
|
20
|
+
const MAX_QUEUE_SIZE = 1_024 * 500; // 500kB
|
|
21
|
+
const MIN_QUEUE_SIZE = 200; // 200 bytes
|
|
22
|
+
|
|
23
|
+
const DEFAULT_FLUSH_INTERVAL = 1_000 * 30; // 30 seconds
|
|
24
|
+
const MAX_FLUSH_INTERVAL = 1_000 * 300; // 5 minutes
|
|
25
|
+
const MIN_FLUSH_INTERVAL = 1_000 * 10; // 10 seconds
|
|
26
|
+
|
|
27
|
+
const noop = () => {};
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Event queue for React Native
|
|
31
|
+
* Handles batching, flushing, and retries with app lifecycle awareness
|
|
32
|
+
*/
|
|
33
|
+
class EventQueue {
|
|
34
|
+
queue = [];
|
|
35
|
+
timer = null;
|
|
36
|
+
payloadHashes = new Set();
|
|
37
|
+
flushMutex = Promise.resolve();
|
|
38
|
+
appStateSubscription = null;
|
|
39
|
+
constructor(writeKey, options) {
|
|
40
|
+
this.writeKey = writeKey;
|
|
41
|
+
this.apiHost = options.apiHost;
|
|
42
|
+
this.retryCount = (0, _utils.clampNumber)(options.retryCount || DEFAULT_RETRY, MAX_RETRY, MIN_RETRY);
|
|
43
|
+
this.flushAt = (0, _utils.clampNumber)(options.flushAt || DEFAULT_FLUSH_AT, MAX_FLUSH_AT, MIN_FLUSH_AT);
|
|
44
|
+
this.maxQueueSize = (0, _utils.clampNumber)(options.maxQueueSize || DEFAULT_QUEUE_SIZE, MAX_QUEUE_SIZE, MIN_QUEUE_SIZE);
|
|
45
|
+
this.flushIntervalMs = (0, _utils.clampNumber)(options.flushInterval || DEFAULT_FLUSH_INTERVAL, MAX_FLUSH_INTERVAL, MIN_FLUSH_INTERVAL);
|
|
46
|
+
// Set up app state listener for React Native
|
|
47
|
+
this.setupAppStateListener();
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Set up listener for app state changes
|
|
52
|
+
* Flush events when app goes to background
|
|
53
|
+
*/
|
|
54
|
+
setupAppStateListener() {
|
|
55
|
+
this.appStateSubscription = _reactNative.AppState.addEventListener("change", this.handleAppStateChange.bind(this));
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Handle app state changes
|
|
60
|
+
*/
|
|
61
|
+
handleAppStateChange(nextAppState) {
|
|
62
|
+
// Flush when app goes to background or becomes inactive
|
|
63
|
+
if (nextAppState === "background" || nextAppState === "inactive") {
|
|
64
|
+
_logger.logger.debug("EventQueue: App going to background, flushing events");
|
|
65
|
+
this.flush().catch(error => {
|
|
66
|
+
_logger.logger.error("EventQueue: Failed to flush on background", error);
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Generate message ID for deduplication
|
|
73
|
+
*/
|
|
74
|
+
async generateMessageId(event) {
|
|
75
|
+
const formattedTimestamp = (0, _timestamp.toDateHourMinute)(new Date(event.original_timestamp));
|
|
76
|
+
const eventForHashing = {
|
|
77
|
+
...event,
|
|
78
|
+
original_timestamp: formattedTimestamp
|
|
79
|
+
};
|
|
80
|
+
const eventString = JSON.stringify(eventForHashing);
|
|
81
|
+
return (0, _hash.hash)(eventString);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Check if event is a duplicate
|
|
86
|
+
*/
|
|
87
|
+
isDuplicate(eventId) {
|
|
88
|
+
if (this.payloadHashes.has(eventId)) return true;
|
|
89
|
+
this.payloadHashes.add(eventId);
|
|
90
|
+
return false;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Add event to queue
|
|
95
|
+
*/
|
|
96
|
+
async enqueue(event, callback) {
|
|
97
|
+
callback = callback || noop;
|
|
98
|
+
const message_id = await this.generateMessageId(event);
|
|
99
|
+
|
|
100
|
+
// Check for duplicate
|
|
101
|
+
if (this.isDuplicate(message_id)) {
|
|
102
|
+
_logger.logger.warn(`Event already enqueued, try again after ${(0, _utils.millisecondsToSecond)(this.flushIntervalMs)} seconds.`);
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
this.queue.push({
|
|
106
|
+
message: {
|
|
107
|
+
...event,
|
|
108
|
+
message_id
|
|
109
|
+
},
|
|
110
|
+
callback,
|
|
111
|
+
hash: message_id
|
|
112
|
+
});
|
|
113
|
+
_logger.logger.log(`Event enqueued: ${(0, _utils.getActionDescriptor)(event.type, event.properties)}`);
|
|
114
|
+
const hasReachedFlushAt = this.queue.length >= this.flushAt;
|
|
115
|
+
const hasReachedQueueSize = this.queue.reduce((acc, item) => acc + JSON.stringify(item).length, 0) >= this.maxQueueSize;
|
|
116
|
+
if (hasReachedFlushAt || hasReachedQueueSize) {
|
|
117
|
+
// Clear timer to prevent double flush
|
|
118
|
+
if (this.timer) {
|
|
119
|
+
clearTimeout(this.timer);
|
|
120
|
+
this.timer = null;
|
|
121
|
+
}
|
|
122
|
+
// Flush uses internal mutex to serialize operations
|
|
123
|
+
this.flush().catch(error => {
|
|
124
|
+
_logger.logger.error("EventQueue: Failed to flush on threshold", error);
|
|
125
|
+
});
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
if (this.flushIntervalMs && !this.timer) {
|
|
129
|
+
this.timer = setTimeout(this.flush.bind(this), this.flushIntervalMs);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Flush events to API
|
|
135
|
+
* Uses a mutex to ensure only one flush operation runs at a time,
|
|
136
|
+
* preventing race conditions with re-queued items on failure.
|
|
137
|
+
*/
|
|
138
|
+
async flush(callback) {
|
|
139
|
+
callback = callback || noop;
|
|
140
|
+
if (this.timer) {
|
|
141
|
+
clearTimeout(this.timer);
|
|
142
|
+
this.timer = null;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
// Use mutex to serialize flush operations and prevent race conditions
|
|
146
|
+
const previousMutex = this.flushMutex;
|
|
147
|
+
let resolveMutex;
|
|
148
|
+
this.flushMutex = new Promise(resolve => {
|
|
149
|
+
resolveMutex = resolve;
|
|
150
|
+
});
|
|
151
|
+
try {
|
|
152
|
+
// Wait for any previous flush to complete
|
|
153
|
+
await previousMutex;
|
|
154
|
+
if (!this.queue.length) {
|
|
155
|
+
callback();
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
const items = this.queue.splice(0, this.flushAt);
|
|
159
|
+
const sentAt = new Date().toISOString();
|
|
160
|
+
const data = items.map(item => ({
|
|
161
|
+
...item.message,
|
|
162
|
+
sent_at: sentAt
|
|
163
|
+
}));
|
|
164
|
+
const done = err => {
|
|
165
|
+
items.forEach(({
|
|
166
|
+
message,
|
|
167
|
+
callback: itemCallback
|
|
168
|
+
}) => itemCallback(err, message, data));
|
|
169
|
+
callback(err, data);
|
|
170
|
+
};
|
|
171
|
+
try {
|
|
172
|
+
await this.sendWithRetry(data);
|
|
173
|
+
// Only remove hashes after successful send
|
|
174
|
+
items.forEach(item => this.payloadHashes.delete(item.hash));
|
|
175
|
+
done();
|
|
176
|
+
_logger.logger.info(`Events sent successfully: ${data.length} events`);
|
|
177
|
+
} catch (err) {
|
|
178
|
+
// Re-add items to the front of the queue for retry on next flush
|
|
179
|
+
// Note: We intentionally keep hashes in payloadHashes to prevent duplicate
|
|
180
|
+
// events from being enqueued while these items are pending retry.
|
|
181
|
+
this.queue.unshift(...items);
|
|
182
|
+
done(err);
|
|
183
|
+
_logger.logger.error("Error sending events, re-queued for retry:", err);
|
|
184
|
+
throw err;
|
|
185
|
+
}
|
|
186
|
+
} finally {
|
|
187
|
+
resolveMutex();
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* Send events with retry logic
|
|
193
|
+
*/
|
|
194
|
+
async sendWithRetry(data, attempt = 0) {
|
|
195
|
+
try {
|
|
196
|
+
const response = await fetch(this.apiHost, {
|
|
197
|
+
method: "POST",
|
|
198
|
+
headers: (0, _constants.EVENTS_API_REQUEST_HEADER)(this.writeKey),
|
|
199
|
+
body: JSON.stringify(data)
|
|
200
|
+
});
|
|
201
|
+
if (!response.ok) {
|
|
202
|
+
const shouldRetry = this.shouldRetry(response.status);
|
|
203
|
+
if (shouldRetry && attempt < this.retryCount) {
|
|
204
|
+
const delay = Math.pow(2, attempt) * 1000;
|
|
205
|
+
await new Promise(resolve => setTimeout(() => resolve(), delay));
|
|
206
|
+
return this.sendWithRetry(data, attempt + 1);
|
|
207
|
+
}
|
|
208
|
+
throw new Error(`HTTP error! status: ${response.status}`);
|
|
209
|
+
}
|
|
210
|
+
} catch (error) {
|
|
211
|
+
if ((0, _utils.isNetworkError)(error) && attempt < this.retryCount) {
|
|
212
|
+
const delay = Math.pow(2, attempt) * 1000;
|
|
213
|
+
_logger.logger.warn(`Network error, retrying in ${delay}ms...`);
|
|
214
|
+
await new Promise(resolve => setTimeout(() => resolve(), delay));
|
|
215
|
+
return this.sendWithRetry(data, attempt + 1);
|
|
216
|
+
}
|
|
217
|
+
throw error;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
/**
|
|
222
|
+
* Check if error should be retried
|
|
223
|
+
*/
|
|
224
|
+
shouldRetry(status) {
|
|
225
|
+
// Retry on server errors (5xx) and rate limiting (429)
|
|
226
|
+
return status >= 500 && status <= 599 || status === 429;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
/**
|
|
230
|
+
* Discard all pending events without sending them.
|
|
231
|
+
* Used when the user opts out of tracking to prevent queued events
|
|
232
|
+
* from being sent after consent is revoked.
|
|
233
|
+
*/
|
|
234
|
+
clear() {
|
|
235
|
+
this.queue = [];
|
|
236
|
+
this.payloadHashes.clear();
|
|
237
|
+
if (this.timer) {
|
|
238
|
+
clearTimeout(this.timer);
|
|
239
|
+
this.timer = null;
|
|
240
|
+
}
|
|
241
|
+
_logger.logger.debug("EventQueue: Cleared all pending events");
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
/**
|
|
245
|
+
* Clean up resources, flushing any pending events first
|
|
246
|
+
*/
|
|
247
|
+
async cleanup() {
|
|
248
|
+
// Flush all remaining queued events before teardown
|
|
249
|
+
// Loop until queue is empty since flush() only sends flushAt events per call
|
|
250
|
+
// Safety limit prevents infinite loops if flush silently fails
|
|
251
|
+
const maxAttempts = Math.ceil(this.queue.length / this.flushAt) + 3;
|
|
252
|
+
let attempts = 0;
|
|
253
|
+
const initialQueueLength = this.queue.length;
|
|
254
|
+
while (this.queue.length > 0 && attempts < maxAttempts) {
|
|
255
|
+
const queueLengthBefore = this.queue.length;
|
|
256
|
+
try {
|
|
257
|
+
await this.flush();
|
|
258
|
+
} catch (error) {
|
|
259
|
+
_logger.logger.error("EventQueue: Failed to flush during cleanup", error);
|
|
260
|
+
// Break on error to avoid infinite loop if flush keeps failing
|
|
261
|
+
break;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
// If queue length didn't decrease, flush is silently failing
|
|
265
|
+
if (this.queue.length >= queueLengthBefore) {
|
|
266
|
+
_logger.logger.warn("EventQueue: Flush did not reduce queue size, aborting cleanup");
|
|
267
|
+
break;
|
|
268
|
+
}
|
|
269
|
+
attempts++;
|
|
270
|
+
}
|
|
271
|
+
if (attempts >= maxAttempts && this.queue.length > 0) {
|
|
272
|
+
_logger.logger.warn(`EventQueue: Cleanup safety limit reached. Discarding ${this.queue.length} events.`);
|
|
273
|
+
this.queue = [];
|
|
274
|
+
this.payloadHashes.clear();
|
|
275
|
+
}
|
|
276
|
+
if (initialQueueLength > 0) {
|
|
277
|
+
_logger.logger.debug(`EventQueue: Cleanup completed, flushed ${initialQueueLength - this.queue.length} events`);
|
|
278
|
+
}
|
|
279
|
+
if (this.timer) {
|
|
280
|
+
clearTimeout(this.timer);
|
|
281
|
+
this.timer = null;
|
|
282
|
+
}
|
|
283
|
+
if (this.appStateSubscription) {
|
|
284
|
+
this.appStateSubscription.remove();
|
|
285
|
+
this.appStateSubscription = null;
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
exports.EventQueue = EventQueue;
|
|
290
|
+
//# sourceMappingURL=EventQueue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_reactNative","require","_constants","_utils","_hash","_timestamp","_logger","DEFAULT_RETRY","MAX_RETRY","MIN_RETRY","DEFAULT_FLUSH_AT","MAX_FLUSH_AT","MIN_FLUSH_AT","DEFAULT_QUEUE_SIZE","MAX_QUEUE_SIZE","MIN_QUEUE_SIZE","DEFAULT_FLUSH_INTERVAL","MAX_FLUSH_INTERVAL","MIN_FLUSH_INTERVAL","noop","EventQueue","queue","timer","payloadHashes","Set","flushMutex","Promise","resolve","appStateSubscription","constructor","writeKey","options","apiHost","retryCount","clampNumber","flushAt","maxQueueSize","flushIntervalMs","flushInterval","setupAppStateListener","AppState","addEventListener","handleAppStateChange","bind","nextAppState","logger","debug","flush","catch","error","generateMessageId","event","formattedTimestamp","toDateHourMinute","Date","original_timestamp","eventForHashing","eventString","JSON","stringify","hash","isDuplicate","eventId","has","add","enqueue","callback","message_id","warn","millisecondsToSecond","push","message","log","getActionDescriptor","type","properties","hasReachedFlushAt","length","hasReachedQueueSize","reduce","acc","item","clearTimeout","setTimeout","previousMutex","resolveMutex","items","splice","sentAt","toISOString","data","map","sent_at","done","err","forEach","itemCallback","sendWithRetry","delete","info","unshift","attempt","response","fetch","method","headers","EVENTS_API_REQUEST_HEADER","body","ok","shouldRetry","status","delay","Math","pow","Error","isNetworkError","clear","cleanup","maxAttempts","ceil","attempts","initialQueueLength","queueLengthBefore","remove","exports"],"sourceRoot":"../../../../src","sources":["lib/event/EventQueue.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
var _EventFactory = require("./EventFactory");
|
|
7
|
+
Object.keys(_EventFactory).forEach(function (key) {
|
|
8
|
+
if (key === "default" || key === "__esModule") return;
|
|
9
|
+
if (key in exports && exports[key] === _EventFactory[key]) return;
|
|
10
|
+
Object.defineProperty(exports, key, {
|
|
11
|
+
enumerable: true,
|
|
12
|
+
get: function () {
|
|
13
|
+
return _EventFactory[key];
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
});
|
|
17
|
+
var _EventManager = require("./EventManager");
|
|
18
|
+
Object.keys(_EventManager).forEach(function (key) {
|
|
19
|
+
if (key === "default" || key === "__esModule") return;
|
|
20
|
+
if (key in exports && exports[key] === _EventManager[key]) return;
|
|
21
|
+
Object.defineProperty(exports, key, {
|
|
22
|
+
enumerable: true,
|
|
23
|
+
get: function () {
|
|
24
|
+
return _EventManager[key];
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
var _EventQueue = require("./EventQueue");
|
|
29
|
+
Object.keys(_EventQueue).forEach(function (key) {
|
|
30
|
+
if (key === "default" || key === "__esModule") return;
|
|
31
|
+
if (key in exports && exports[key] === _EventQueue[key]) return;
|
|
32
|
+
Object.defineProperty(exports, key, {
|
|
33
|
+
enumerable: true,
|
|
34
|
+
get: function () {
|
|
35
|
+
return _EventQueue[key];
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
var _types = require("./types");
|
|
40
|
+
Object.keys(_types).forEach(function (key) {
|
|
41
|
+
if (key === "default" || key === "__esModule") return;
|
|
42
|
+
if (key in exports && exports[key] === _types[key]) return;
|
|
43
|
+
Object.defineProperty(exports, key, {
|
|
44
|
+
enumerable: true,
|
|
45
|
+
get: function () {
|
|
46
|
+
return _types[key];
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_EventFactory","require","Object","keys","forEach","key","exports","defineProperty","enumerable","get","_EventManager","_EventQueue","_types"],"sourceRoot":"../../../../src","sources":["lib/event/index.ts"],"mappings":";;;;;AAAA,IAAAA,aAAA,GAAAC,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAH,aAAA,EAAAI,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAL,aAAA,CAAAK,GAAA;EAAAH,MAAA,CAAAK,cAAA,CAAAD,OAAA,EAAAD,GAAA;IAAAG,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAT,aAAA,CAAAK,GAAA;IAAA;EAAA;AAAA;AACA,IAAAK,aAAA,GAAAT,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAO,aAAA,EAAAN,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAK,aAAA,CAAAL,GAAA;EAAAH,MAAA,CAAAK,cAAA,CAAAD,OAAA,EAAAD,GAAA;IAAAG,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAC,aAAA,CAAAL,GAAA;IAAA;EAAA;AAAA;AACA,IAAAM,WAAA,GAAAV,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAQ,WAAA,EAAAP,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAM,WAAA,CAAAN,GAAA;EAAAH,MAAA,CAAAK,cAAA,CAAAD,OAAA,EAAAD,GAAA;IAAAG,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAE,WAAA,CAAAN,GAAA;IAAA;EAAA;AAAA;AACA,IAAAO,MAAA,GAAAX,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAS,MAAA,EAAAR,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAO,MAAA,CAAAP,GAAA;EAAAH,MAAA,CAAAK,cAAA,CAAAD,OAAA,EAAAD,GAAA;IAAAG,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAG,MAAA,CAAAP,GAAA;IAAA;EAAA;AAAA","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sourceRoot":"../../../../src","sources":["lib/event/types.ts"],"mappings":"","ignoreList":[]}
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.AppLifecycleManager = void 0;
|
|
7
|
+
var _reactNative = require("react-native");
|
|
8
|
+
var _logger = require("../logger");
|
|
9
|
+
var _storage = require("../storage");
|
|
10
|
+
var _storage2 = require("../../constants/storage");
|
|
11
|
+
/**
|
|
12
|
+
* Application Lifecycle Event Manager
|
|
13
|
+
*
|
|
14
|
+
* Tracks application lifecycle events following the Segment/RudderStack spec:
|
|
15
|
+
* - Application Installed (first launch)
|
|
16
|
+
* - Application Updated (version/build changed)
|
|
17
|
+
* - Application Opened (every cold start + foreground return)
|
|
18
|
+
* - Application Backgrounded (app goes to background)
|
|
19
|
+
*
|
|
20
|
+
* Detection is JS-side using AsyncStorage (no native modules required).
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
/** Interface for the analytics instance to avoid circular deps */
|
|
24
|
+
|
|
25
|
+
/** App version info resolved from device or config */
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Resolves current app version and build from device info modules or options.
|
|
29
|
+
* Uses the same fallback chain as EventFactory.getDeviceInfo().
|
|
30
|
+
*/
|
|
31
|
+
async function resolveAppVersionInfo(appOptions) {
|
|
32
|
+
// Use explicit options first
|
|
33
|
+
if (appOptions?.version && appOptions?.build) {
|
|
34
|
+
return {
|
|
35
|
+
version: appOptions.version,
|
|
36
|
+
build: appOptions.build
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// Try react-native-device-info
|
|
41
|
+
try {
|
|
42
|
+
const DeviceInfo = require("react-native-device-info").default;
|
|
43
|
+
return {
|
|
44
|
+
version: appOptions?.version || DeviceInfo.getVersion(),
|
|
45
|
+
build: appOptions?.build || DeviceInfo.getBuildNumber()
|
|
46
|
+
};
|
|
47
|
+
} catch {
|
|
48
|
+
// Not available
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// Try expo-application
|
|
52
|
+
try {
|
|
53
|
+
const ExpoApplication = require("expo-application");
|
|
54
|
+
return {
|
|
55
|
+
version: appOptions?.version || ExpoApplication.nativeApplicationVersion || "",
|
|
56
|
+
build: appOptions?.build || ExpoApplication.nativeBuildVersion || ""
|
|
57
|
+
};
|
|
58
|
+
} catch {
|
|
59
|
+
// Not available
|
|
60
|
+
}
|
|
61
|
+
return {
|
|
62
|
+
version: appOptions?.version || "",
|
|
63
|
+
build: appOptions?.build || ""
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
class AppLifecycleManager {
|
|
67
|
+
appStateSubscription = null;
|
|
68
|
+
lastAppState = _reactNative.AppState.currentState;
|
|
69
|
+
appVersionInfo = {
|
|
70
|
+
version: "",
|
|
71
|
+
build: ""
|
|
72
|
+
};
|
|
73
|
+
constructor(analytics) {
|
|
74
|
+
this.analytics = analytics;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Initialize lifecycle tracking.
|
|
79
|
+
* Detects install/update, fires Application Opened, and sets up AppState listener.
|
|
80
|
+
*/
|
|
81
|
+
async start(appOptions) {
|
|
82
|
+
this.appVersionInfo = await resolveAppVersionInfo(appOptions);
|
|
83
|
+
|
|
84
|
+
// Detect install vs update
|
|
85
|
+
await this.detectInstallOrUpdate();
|
|
86
|
+
|
|
87
|
+
// Fire Application Opened (cold start)
|
|
88
|
+
let initialUrl;
|
|
89
|
+
try {
|
|
90
|
+
const url = await _reactNative.Linking.getInitialURL();
|
|
91
|
+
if (url) {
|
|
92
|
+
initialUrl = url;
|
|
93
|
+
}
|
|
94
|
+
} catch {
|
|
95
|
+
// Linking not available
|
|
96
|
+
}
|
|
97
|
+
await this.analytics.track("Application Opened", {
|
|
98
|
+
version: this.appVersionInfo.version,
|
|
99
|
+
build: this.appVersionInfo.build,
|
|
100
|
+
from_background: false,
|
|
101
|
+
...(initialUrl && {
|
|
102
|
+
url: initialUrl
|
|
103
|
+
})
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
// Subscribe to AppState changes
|
|
107
|
+
this.appStateSubscription = _reactNative.AppState.addEventListener("change", this.handleAppStateChange.bind(this));
|
|
108
|
+
_logger.logger.info("AppLifecycleManager: Started");
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Compare stored version/build with current to detect install or update.
|
|
113
|
+
* Requires persistent storage (AsyncStorage) — skips if only MemoryStorage is available,
|
|
114
|
+
* since MemoryStorage is empty on every cold start and would false-positive as "installed".
|
|
115
|
+
*/
|
|
116
|
+
async detectInstallOrUpdate() {
|
|
117
|
+
const manager = (0, _storage.getStorageManager)();
|
|
118
|
+
const hasPersistentStorage = manager?.hasPersistentStorage() ?? false;
|
|
119
|
+
if (!hasPersistentStorage) {
|
|
120
|
+
_logger.logger.warn("AppLifecycleManager: AsyncStorage not available, skipping install/update detection. " + "Provide asyncStorage to FormoAnalyticsProvider for accurate lifecycle tracking.");
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
const previousVersion = (0, _storage.storage)().get(_storage2.LOCAL_APP_VERSION_KEY);
|
|
124
|
+
const previousBuild = (0, _storage.storage)().get(_storage2.LOCAL_APP_BUILD_KEY);
|
|
125
|
+
const {
|
|
126
|
+
version,
|
|
127
|
+
build
|
|
128
|
+
} = this.appVersionInfo;
|
|
129
|
+
if (previousVersion === null && previousBuild === null) {
|
|
130
|
+
// No stored version — first install
|
|
131
|
+
_logger.logger.info("AppLifecycleManager: Application Installed");
|
|
132
|
+
await this.analytics.track("Application Installed", {
|
|
133
|
+
version,
|
|
134
|
+
build
|
|
135
|
+
});
|
|
136
|
+
} else if (previousVersion !== version || previousBuild !== build) {
|
|
137
|
+
// Version or build changed — update
|
|
138
|
+
_logger.logger.info("AppLifecycleManager: Application Updated");
|
|
139
|
+
await this.analytics.track("Application Updated", {
|
|
140
|
+
version,
|
|
141
|
+
build,
|
|
142
|
+
previous_version: previousVersion || "",
|
|
143
|
+
previous_build: previousBuild || ""
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// Persist current version/build for next comparison
|
|
148
|
+
// Use setAsync to ensure data is written to AsyncStorage before continuing,
|
|
149
|
+
// preventing duplicate install events if the app is terminated before persistence completes
|
|
150
|
+
await (0, _storage.storage)().setAsync(_storage2.LOCAL_APP_VERSION_KEY, version);
|
|
151
|
+
await (0, _storage.storage)().setAsync(_storage2.LOCAL_APP_BUILD_KEY, build);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* Handle AppState transitions for foreground/background events.
|
|
156
|
+
*/
|
|
157
|
+
handleAppStateChange(nextAppState) {
|
|
158
|
+
// Ignore "inactive" (iOS transitional state) and "unknown"
|
|
159
|
+
if (nextAppState === "inactive" || nextAppState === "unknown") {
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
if (nextAppState === "active" && this.lastAppState === "background") {
|
|
163
|
+
// Returning from background
|
|
164
|
+
this.analytics.track("Application Opened", {
|
|
165
|
+
version: this.appVersionInfo.version,
|
|
166
|
+
build: this.appVersionInfo.build,
|
|
167
|
+
from_background: true
|
|
168
|
+
}).catch(error => {
|
|
169
|
+
_logger.logger.error("AppLifecycleManager: Error tracking Application Opened", error);
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
if (nextAppState === "background" && this.lastAppState === "active") {
|
|
173
|
+
// Going to background
|
|
174
|
+
this.analytics.track("Application Backgrounded", {
|
|
175
|
+
version: this.appVersionInfo.version,
|
|
176
|
+
build: this.appVersionInfo.build
|
|
177
|
+
}).catch(error => {
|
|
178
|
+
_logger.logger.error("AppLifecycleManager: Error tracking Application Backgrounded", error);
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
this.lastAppState = nextAppState;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* Clean up AppState listener.
|
|
186
|
+
*/
|
|
187
|
+
cleanup() {
|
|
188
|
+
if (this.appStateSubscription) {
|
|
189
|
+
this.appStateSubscription.remove();
|
|
190
|
+
this.appStateSubscription = null;
|
|
191
|
+
}
|
|
192
|
+
_logger.logger.info("AppLifecycleManager: Cleaned up");
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
exports.AppLifecycleManager = AppLifecycleManager;
|
|
196
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_reactNative","require","_logger","_storage","_storage2","resolveAppVersionInfo","appOptions","version","build","DeviceInfo","default","getVersion","getBuildNumber","ExpoApplication","nativeApplicationVersion","nativeBuildVersion","AppLifecycleManager","appStateSubscription","lastAppState","AppState","currentState","appVersionInfo","constructor","analytics","start","detectInstallOrUpdate","initialUrl","url","Linking","getInitialURL","track","from_background","addEventListener","handleAppStateChange","bind","logger","info","manager","getStorageManager","hasPersistentStorage","warn","previousVersion","storage","get","LOCAL_APP_VERSION_KEY","previousBuild","LOCAL_APP_BUILD_KEY","previous_version","previous_build","setAsync","nextAppState","catch","error","cleanup","remove","exports"],"sourceRoot":"../../../../src","sources":["lib/lifecycle/index.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.logger = exports.Logger = void 0;
|
|
7
|
+
class LoggerClass {
|
|
8
|
+
config = {
|
|
9
|
+
enabled: false,
|
|
10
|
+
enabledLevels: []
|
|
11
|
+
};
|
|
12
|
+
init(config) {
|
|
13
|
+
this.config = config;
|
|
14
|
+
}
|
|
15
|
+
shouldLog(level) {
|
|
16
|
+
if (!this.config.enabled) return false;
|
|
17
|
+
if (this.config.enabledLevels?.length === 0) return true;
|
|
18
|
+
return this.config.enabledLevels?.includes(level) ?? false;
|
|
19
|
+
}
|
|
20
|
+
debug(...args) {
|
|
21
|
+
if (this.shouldLog("debug")) {
|
|
22
|
+
console.debug("[Formo RN]", ...args);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
info(...args) {
|
|
26
|
+
if (this.shouldLog("info")) {
|
|
27
|
+
console.info("[Formo RN]", ...args);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
warn(...args) {
|
|
31
|
+
if (this.shouldLog("warn")) {
|
|
32
|
+
console.warn("[Formo RN]", ...args);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
error(...args) {
|
|
36
|
+
if (this.shouldLog("error")) {
|
|
37
|
+
console.error("[Formo RN]", ...args);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
log(...args) {
|
|
41
|
+
if (this.shouldLog("log")) {
|
|
42
|
+
console.log("[Formo RN]", ...args);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
const Logger = exports.Logger = new LoggerClass();
|
|
47
|
+
const logger = exports.logger = Logger;
|
|
48
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["LoggerClass","config","enabled","enabledLevels","init","shouldLog","level","length","includes","debug","args","console","info","warn","error","log","Logger","exports","logger"],"sourceRoot":"../../../../src","sources":["lib/logger/index.ts"],"mappings":";;;;;;AAOA,MAAMA,WAAW,CAAC;EACRC,MAAM,GAAiB;IAC7BC,OAAO,EAAE,KAAK;IACdC,aAAa,EAAE;EACjB,CAAC;EAEDC,IAAIA,CAACH,MAAoB,EAAE;IACzB,IAAI,CAACA,MAAM,GAAGA,MAAM;EACtB;EAEQI,SAASA,CAACC,KAAe,EAAW;IAC1C,IAAI,CAAC,IAAI,CAACL,MAAM,CAACC,OAAO,EAAE,OAAO,KAAK;IACtC,IAAI,IAAI,CAACD,MAAM,CAACE,aAAa,EAAEI,MAAM,KAAK,CAAC,EAAE,OAAO,IAAI;IACxD,OAAO,IAAI,CAACN,MAAM,CAACE,aAAa,EAAEK,QAAQ,CAACF,KAAK,CAAC,IAAI,KAAK;EAC5D;EAEAG,KAAKA,CAAC,GAAGC,IAAe,EAAE;IACxB,IAAI,IAAI,CAACL,SAAS,CAAC,OAAO,CAAC,EAAE;MAC3BM,OAAO,CAACF,KAAK,CAAC,YAAY,EAAE,GAAGC,IAAI,CAAC;IACtC;EACF;EAEAE,IAAIA,CAAC,GAAGF,IAAe,EAAE;IACvB,IAAI,IAAI,CAACL,SAAS,CAAC,MAAM,CAAC,EAAE;MAC1BM,OAAO,CAACC,IAAI,CAAC,YAAY,EAAE,GAAGF,IAAI,CAAC;IACrC;EACF;EAEAG,IAAIA,CAAC,GAAGH,IAAe,EAAE;IACvB,IAAI,IAAI,CAACL,SAAS,CAAC,MAAM,CAAC,EAAE;MAC1BM,OAAO,CAACE,IAAI,CAAC,YAAY,EAAE,GAAGH,IAAI,CAAC;IACrC;EACF;EAEAI,KAAKA,CAAC,GAAGJ,IAAe,EAAE;IACxB,IAAI,IAAI,CAACL,SAAS,CAAC,OAAO,CAAC,EAAE;MAC3BM,OAAO,CAACG,KAAK,CAAC,YAAY,EAAE,GAAGJ,IAAI,CAAC;IACtC;EACF;EAEAK,GAAGA,CAAC,GAAGL,IAAe,EAAE;IACtB,IAAI,IAAI,CAACL,SAAS,CAAC,KAAK,CAAC,EAAE;MACzBM,OAAO,CAACI,GAAG,CAAC,YAAY,EAAE,GAAGL,IAAI,CAAC;IACpC;EACF;AACF;AAEO,MAAMM,MAAM,GAAAC,OAAA,CAAAD,MAAA,GAAG,IAAIhB,WAAW,CAAC,CAAC;AAChC,MAAMkB,MAAM,GAAAD,OAAA,CAAAC,MAAA,GAAGF,MAAM","ignoreList":[]}
|