@loyalytics/swan-react-native-sdk 2.0.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/LICENSE +55 -0
- package/README.md +67 -0
- package/docs/IOS_NOTIFICATION_EXTENSION_SETUP.md +335 -0
- package/ios/README.md +64 -0
- package/ios/SwanNotificationServiceExtension/Info.plist +31 -0
- package/ios/SwanNotificationServiceExtension/NotificationService.swift +337 -0
- package/ios/SwanNotificationServiceExtension/SwanNotificationServiceExtension.entitlements +10 -0
- package/lib/commonjs/components/FooterView.js +125 -0
- package/lib/commonjs/components/FooterView.js.map +1 -0
- package/lib/commonjs/components/FullScreenView.js +172 -0
- package/lib/commonjs/components/FullScreenView.js.map +1 -0
- package/lib/commonjs/components/HeaderView.js +205 -0
- package/lib/commonjs/components/HeaderView.js.map +1 -0
- package/lib/commonjs/components/PopUpView.js +186 -0
- package/lib/commonjs/components/PopUpView.js.map +1 -0
- package/lib/commonjs/config/BatchConfig.js +53 -0
- package/lib/commonjs/config/BatchConfig.js.map +1 -0
- package/lib/commonjs/constants/ApiUrls.js +56 -0
- package/lib/commonjs/constants/ApiUrls.js.map +1 -0
- package/lib/commonjs/core/EventQueueManager.js +345 -0
- package/lib/commonjs/core/EventQueueManager.js.map +1 -0
- package/lib/commonjs/core/FlushManager.js +245 -0
- package/lib/commonjs/core/FlushManager.js.map +1 -0
- package/lib/commonjs/core/NetworkMonitor.js +97 -0
- package/lib/commonjs/core/NetworkMonitor.js.map +1 -0
- package/lib/commonjs/index.js +3506 -0
- package/lib/commonjs/index.js.map +1 -0
- package/lib/commonjs/providers/FirebasePushProvider.js +130 -0
- package/lib/commonjs/providers/FirebasePushProvider.js.map +1 -0
- package/lib/commonjs/providers/NullPushProvider.js +59 -0
- package/lib/commonjs/providers/NullPushProvider.js.map +1 -0
- package/lib/commonjs/providers/PushNotificationProvider.js +30 -0
- package/lib/commonjs/providers/PushNotificationProvider.js.map +1 -0
- package/lib/commonjs/services/DeviceRegistrationService.js +248 -0
- package/lib/commonjs/services/DeviceRegistrationService.js.map +1 -0
- package/lib/commonjs/services/PushTokenService.js +284 -0
- package/lib/commonjs/services/PushTokenService.js.map +1 -0
- package/lib/commonjs/state/AuthStateMachine.js +161 -0
- package/lib/commonjs/state/AuthStateMachine.js.map +1 -0
- package/lib/commonjs/state/DeviceStateMachine.js +104 -0
- package/lib/commonjs/state/DeviceStateMachine.js.map +1 -0
- package/lib/commonjs/state/PushStateMachine.js +129 -0
- package/lib/commonjs/state/PushStateMachine.js.map +1 -0
- package/lib/commonjs/types/EventQueue.js +50 -0
- package/lib/commonjs/types/EventQueue.js.map +1 -0
- package/lib/commonjs/types/SDK.js +2 -0
- package/lib/commonjs/types/SDK.js.map +1 -0
- package/lib/commonjs/utils/FirebaseNotificationManager.js +492 -0
- package/lib/commonjs/utils/FirebaseNotificationManager.js.map +1 -0
- package/lib/commonjs/utils/Logger.js +56 -0
- package/lib/commonjs/utils/Logger.js.map +1 -0
- package/lib/commonjs/utils/SharedCredentialsManager.js +146 -0
- package/lib/commonjs/utils/SharedCredentialsManager.js.map +1 -0
- package/lib/commonjs/version.js +12 -0
- package/lib/commonjs/version.js.map +1 -0
- package/lib/module/components/FooterView.js +121 -0
- package/lib/module/components/FooterView.js.map +1 -0
- package/lib/module/components/FullScreenView.js +167 -0
- package/lib/module/components/FullScreenView.js.map +1 -0
- package/lib/module/components/HeaderView.js +199 -0
- package/lib/module/components/HeaderView.js.map +1 -0
- package/lib/module/components/PopUpView.js +181 -0
- package/lib/module/components/PopUpView.js.map +1 -0
- package/lib/module/config/BatchConfig.js +49 -0
- package/lib/module/config/BatchConfig.js.map +1 -0
- package/lib/module/constants/ApiUrls.js +52 -0
- package/lib/module/constants/ApiUrls.js.map +1 -0
- package/lib/module/core/EventQueueManager.js +340 -0
- package/lib/module/core/EventQueueManager.js.map +1 -0
- package/lib/module/core/FlushManager.js +240 -0
- package/lib/module/core/FlushManager.js.map +1 -0
- package/lib/module/core/NetworkMonitor.js +92 -0
- package/lib/module/core/NetworkMonitor.js.map +1 -0
- package/lib/module/index.js +3494 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/providers/FirebasePushProvider.js +124 -0
- package/lib/module/providers/FirebasePushProvider.js.map +1 -0
- package/lib/module/providers/NullPushProvider.js +53 -0
- package/lib/module/providers/NullPushProvider.js.map +1 -0
- package/lib/module/providers/PushNotificationProvider.js +26 -0
- package/lib/module/providers/PushNotificationProvider.js.map +1 -0
- package/lib/module/services/DeviceRegistrationService.js +243 -0
- package/lib/module/services/DeviceRegistrationService.js.map +1 -0
- package/lib/module/services/PushTokenService.js +278 -0
- package/lib/module/services/PushTokenService.js.map +1 -0
- package/lib/module/state/AuthStateMachine.js +155 -0
- package/lib/module/state/AuthStateMachine.js.map +1 -0
- package/lib/module/state/DeviceStateMachine.js +98 -0
- package/lib/module/state/DeviceStateMachine.js.map +1 -0
- package/lib/module/state/PushStateMachine.js +123 -0
- package/lib/module/state/PushStateMachine.js.map +1 -0
- package/lib/module/types/EventQueue.js +46 -0
- package/lib/module/types/EventQueue.js.map +1 -0
- package/lib/module/types/SDK.js +2 -0
- package/lib/module/types/SDK.js.map +1 -0
- package/lib/module/utils/FirebaseNotificationManager.js +486 -0
- package/lib/module/utils/FirebaseNotificationManager.js.map +1 -0
- package/lib/module/utils/Logger.js +52 -0
- package/lib/module/utils/Logger.js.map +1 -0
- package/lib/module/utils/SharedCredentialsManager.js +140 -0
- package/lib/module/utils/SharedCredentialsManager.js.map +1 -0
- package/lib/module/version.js +8 -0
- package/lib/module/version.js.map +1 -0
- package/lib/typescript/commonjs/package.json +1 -0
- package/lib/typescript/commonjs/src/components/FooterView.d.ts +3 -0
- package/lib/typescript/commonjs/src/components/FooterView.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/components/FullScreenView.d.ts +3 -0
- package/lib/typescript/commonjs/src/components/FullScreenView.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/components/HeaderView.d.ts +3 -0
- package/lib/typescript/commonjs/src/components/HeaderView.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/components/PopUpView.d.ts +3 -0
- package/lib/typescript/commonjs/src/components/PopUpView.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/config/BatchConfig.d.ts +7 -0
- package/lib/typescript/commonjs/src/config/BatchConfig.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/constants/ApiUrls.d.ts +56 -0
- package/lib/typescript/commonjs/src/constants/ApiUrls.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/core/EventQueueManager.d.ts +63 -0
- package/lib/typescript/commonjs/src/core/EventQueueManager.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/core/FlushManager.d.ts +63 -0
- package/lib/typescript/commonjs/src/core/FlushManager.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/core/NetworkMonitor.d.ts +38 -0
- package/lib/typescript/commonjs/src/core/NetworkMonitor.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/index.d.ts +663 -0
- package/lib/typescript/commonjs/src/index.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/providers/FirebasePushProvider.d.ts +28 -0
- package/lib/typescript/commonjs/src/providers/FirebasePushProvider.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/providers/NullPushProvider.d.ts +25 -0
- package/lib/typescript/commonjs/src/providers/NullPushProvider.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/providers/PushNotificationProvider.d.ts +105 -0
- package/lib/typescript/commonjs/src/providers/PushNotificationProvider.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/services/DeviceRegistrationService.d.ts +60 -0
- package/lib/typescript/commonjs/src/services/DeviceRegistrationService.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/services/PushTokenService.d.ts +82 -0
- package/lib/typescript/commonjs/src/services/PushTokenService.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/state/AuthStateMachine.d.ts +61 -0
- package/lib/typescript/commonjs/src/state/AuthStateMachine.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/state/DeviceStateMachine.d.ts +51 -0
- package/lib/typescript/commonjs/src/state/DeviceStateMachine.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/state/PushStateMachine.d.ts +61 -0
- package/lib/typescript/commonjs/src/state/PushStateMachine.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/types/EventQueue.d.ts +85 -0
- package/lib/typescript/commonjs/src/types/EventQueue.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/types/SDK.d.ts +54 -0
- package/lib/typescript/commonjs/src/types/SDK.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/utils/FirebaseNotificationManager.d.ts +169 -0
- package/lib/typescript/commonjs/src/utils/FirebaseNotificationManager.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/utils/Logger.d.ts +32 -0
- package/lib/typescript/commonjs/src/utils/Logger.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/utils/SharedCredentialsManager.d.ts +54 -0
- package/lib/typescript/commonjs/src/utils/SharedCredentialsManager.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/version.d.ts +2 -0
- package/lib/typescript/commonjs/src/version.d.ts.map +1 -0
- package/lib/typescript/module/package.json +1 -0
- package/lib/typescript/module/src/components/FooterView.d.ts +3 -0
- package/lib/typescript/module/src/components/FooterView.d.ts.map +1 -0
- package/lib/typescript/module/src/components/FullScreenView.d.ts +3 -0
- package/lib/typescript/module/src/components/FullScreenView.d.ts.map +1 -0
- package/lib/typescript/module/src/components/HeaderView.d.ts +3 -0
- package/lib/typescript/module/src/components/HeaderView.d.ts.map +1 -0
- package/lib/typescript/module/src/components/PopUpView.d.ts +3 -0
- package/lib/typescript/module/src/components/PopUpView.d.ts.map +1 -0
- package/lib/typescript/module/src/config/BatchConfig.d.ts +7 -0
- package/lib/typescript/module/src/config/BatchConfig.d.ts.map +1 -0
- package/lib/typescript/module/src/constants/ApiUrls.d.ts +56 -0
- package/lib/typescript/module/src/constants/ApiUrls.d.ts.map +1 -0
- package/lib/typescript/module/src/core/EventQueueManager.d.ts +63 -0
- package/lib/typescript/module/src/core/EventQueueManager.d.ts.map +1 -0
- package/lib/typescript/module/src/core/FlushManager.d.ts +63 -0
- package/lib/typescript/module/src/core/FlushManager.d.ts.map +1 -0
- package/lib/typescript/module/src/core/NetworkMonitor.d.ts +38 -0
- package/lib/typescript/module/src/core/NetworkMonitor.d.ts.map +1 -0
- package/lib/typescript/module/src/index.d.ts +663 -0
- package/lib/typescript/module/src/index.d.ts.map +1 -0
- package/lib/typescript/module/src/providers/FirebasePushProvider.d.ts +28 -0
- package/lib/typescript/module/src/providers/FirebasePushProvider.d.ts.map +1 -0
- package/lib/typescript/module/src/providers/NullPushProvider.d.ts +25 -0
- package/lib/typescript/module/src/providers/NullPushProvider.d.ts.map +1 -0
- package/lib/typescript/module/src/providers/PushNotificationProvider.d.ts +105 -0
- package/lib/typescript/module/src/providers/PushNotificationProvider.d.ts.map +1 -0
- package/lib/typescript/module/src/services/DeviceRegistrationService.d.ts +60 -0
- package/lib/typescript/module/src/services/DeviceRegistrationService.d.ts.map +1 -0
- package/lib/typescript/module/src/services/PushTokenService.d.ts +82 -0
- package/lib/typescript/module/src/services/PushTokenService.d.ts.map +1 -0
- package/lib/typescript/module/src/state/AuthStateMachine.d.ts +61 -0
- package/lib/typescript/module/src/state/AuthStateMachine.d.ts.map +1 -0
- package/lib/typescript/module/src/state/DeviceStateMachine.d.ts +51 -0
- package/lib/typescript/module/src/state/DeviceStateMachine.d.ts.map +1 -0
- package/lib/typescript/module/src/state/PushStateMachine.d.ts +61 -0
- package/lib/typescript/module/src/state/PushStateMachine.d.ts.map +1 -0
- package/lib/typescript/module/src/types/EventQueue.d.ts +85 -0
- package/lib/typescript/module/src/types/EventQueue.d.ts.map +1 -0
- package/lib/typescript/module/src/types/SDK.d.ts +54 -0
- package/lib/typescript/module/src/types/SDK.d.ts.map +1 -0
- package/lib/typescript/module/src/utils/FirebaseNotificationManager.d.ts +169 -0
- package/lib/typescript/module/src/utils/FirebaseNotificationManager.d.ts.map +1 -0
- package/lib/typescript/module/src/utils/Logger.d.ts +32 -0
- package/lib/typescript/module/src/utils/Logger.d.ts.map +1 -0
- package/lib/typescript/module/src/utils/SharedCredentialsManager.d.ts +54 -0
- package/lib/typescript/module/src/utils/SharedCredentialsManager.d.ts.map +1 -0
- package/lib/typescript/module/src/version.d.ts +2 -0
- package/lib/typescript/module/src/version.d.ts.map +1 -0
- package/package.json +230 -0
- package/scripts/generate-version.js +25 -0
- package/scripts/setup-ios-extension.js +275 -0
|
@@ -0,0 +1,345 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.EventQueueManager = void 0;
|
|
7
|
+
var _Logger = _interopRequireDefault(require("../utils/Logger.js"));
|
|
8
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
9
|
+
/**
|
|
10
|
+
* EventQueueManager
|
|
11
|
+
* Manages persistent event queue using SQLite
|
|
12
|
+
* Handles enqueue, dequeue, status updates, and cleanup operations
|
|
13
|
+
*/
|
|
14
|
+
class EventQueueManager {
|
|
15
|
+
constructor(db, maxRetries = 3) {
|
|
16
|
+
this.db = db;
|
|
17
|
+
this.maxRetries = maxRetries;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Create EventQueue table with indexes
|
|
22
|
+
* Called during SDK initialization
|
|
23
|
+
*/
|
|
24
|
+
async createTable() {
|
|
25
|
+
return new Promise((resolve, reject) => {
|
|
26
|
+
if (!this.db) {
|
|
27
|
+
return reject(new Error('Database not initialized'));
|
|
28
|
+
}
|
|
29
|
+
try {
|
|
30
|
+
this.db.transaction(txn => {
|
|
31
|
+
// Create main table
|
|
32
|
+
txn.executeSql(`CREATE TABLE IF NOT EXISTS EventQueue (
|
|
33
|
+
id TEXT PRIMARY KEY,
|
|
34
|
+
eventName TEXT NOT NULL,
|
|
35
|
+
eventData TEXT NOT NULL,
|
|
36
|
+
timestamp INTEGER NOT NULL,
|
|
37
|
+
priority INTEGER DEFAULT 0,
|
|
38
|
+
retryCount INTEGER DEFAULT 0,
|
|
39
|
+
status TEXT DEFAULT 'pending',
|
|
40
|
+
createdAt INTEGER NOT NULL,
|
|
41
|
+
lastAttemptAt INTEGER
|
|
42
|
+
)`, [], () => {
|
|
43
|
+
_Logger.default.log('EventQueue table created');
|
|
44
|
+
}, (_, error) => {
|
|
45
|
+
_Logger.default.error('EventQueue table creation error:', error);
|
|
46
|
+
reject(error);
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
// Create indexes for performance
|
|
50
|
+
txn.executeSql('CREATE INDEX IF NOT EXISTS idx_status ON EventQueue(status)', [], () => _Logger.default.log('Index idx_status created'), (_, error) => _Logger.default.error('Index creation error:', error));
|
|
51
|
+
txn.executeSql('CREATE INDEX IF NOT EXISTS idx_priority ON EventQueue(priority DESC)', [], () => _Logger.default.log('Index idx_priority created'), (_, error) => _Logger.default.error('Index creation error:', error));
|
|
52
|
+
txn.executeSql('CREATE INDEX IF NOT EXISTS idx_timestamp ON EventQueue(timestamp ASC)', [], () => {
|
|
53
|
+
_Logger.default.log('Index idx_timestamp created');
|
|
54
|
+
resolve();
|
|
55
|
+
}, (_, error) => {
|
|
56
|
+
_Logger.default.error('Index creation error:', error);
|
|
57
|
+
reject(error);
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
} catch (error) {
|
|
61
|
+
_Logger.default.error('Table creation error:', error);
|
|
62
|
+
reject(error);
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Add event to queue
|
|
69
|
+
* @param event Event to enqueue
|
|
70
|
+
*/
|
|
71
|
+
async enqueue(event) {
|
|
72
|
+
return new Promise((resolve, reject) => {
|
|
73
|
+
if (!this.db) {
|
|
74
|
+
return reject(new Error('Database not initialized'));
|
|
75
|
+
}
|
|
76
|
+
try {
|
|
77
|
+
this.db.transaction(txn => {
|
|
78
|
+
txn.executeSql(`INSERT INTO EventQueue (id, eventName, eventData, timestamp, priority, retryCount, status, createdAt, lastAttemptAt)
|
|
79
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`, [event.id, event.eventName, JSON.stringify(event.eventData), event.timestamp, event.priority, event.retryCount, event.status, event.createdAt, event.lastAttemptAt || null], () => {
|
|
80
|
+
_Logger.default.log(`Event enqueued: ${event.eventName} (${event.id})`);
|
|
81
|
+
resolve();
|
|
82
|
+
}, (_, error) => {
|
|
83
|
+
_Logger.default.error('Error enqueuing event:', error);
|
|
84
|
+
reject(error);
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
} catch (error) {
|
|
88
|
+
_Logger.default.error('Error in enqueue:', error);
|
|
89
|
+
reject(error);
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Retrieve events from queue for batch sending
|
|
96
|
+
* Priority events first, then FIFO
|
|
97
|
+
* @param batchSize Maximum number of events to retrieve
|
|
98
|
+
* @returns Array of queued events
|
|
99
|
+
*/
|
|
100
|
+
async dequeue(batchSize) {
|
|
101
|
+
return new Promise((resolve, reject) => {
|
|
102
|
+
if (!this.db) {
|
|
103
|
+
return reject(new Error('Database not initialized'));
|
|
104
|
+
}
|
|
105
|
+
try {
|
|
106
|
+
const events = [];
|
|
107
|
+
this.db.transaction(txn => {
|
|
108
|
+
// Step 1: SELECT pending events
|
|
109
|
+
txn.executeSql(`SELECT * FROM EventQueue
|
|
110
|
+
WHERE status = 'pending'
|
|
111
|
+
ORDER BY priority DESC, timestamp ASC
|
|
112
|
+
LIMIT ?`, [batchSize], (_, res) => {
|
|
113
|
+
// Collect events and their IDs
|
|
114
|
+
const eventIds = [];
|
|
115
|
+
for (let i = 0; i < res.rows.length; i++) {
|
|
116
|
+
const row = res.rows.item(i);
|
|
117
|
+
events.push({
|
|
118
|
+
id: row.id,
|
|
119
|
+
eventName: row.eventName,
|
|
120
|
+
eventData: JSON.parse(row.eventData),
|
|
121
|
+
timestamp: row.timestamp,
|
|
122
|
+
priority: row.priority,
|
|
123
|
+
retryCount: row.retryCount,
|
|
124
|
+
status: row.status,
|
|
125
|
+
createdAt: row.createdAt,
|
|
126
|
+
lastAttemptAt: row.lastAttemptAt
|
|
127
|
+
});
|
|
128
|
+
eventIds.push(row.id);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// Step 2: Atomically update status to 'sending' to prevent duplicate dequeues
|
|
132
|
+
if (eventIds.length > 0) {
|
|
133
|
+
const placeholders = eventIds.map(() => '?').join(',');
|
|
134
|
+
txn.executeSql(`UPDATE EventQueue SET status = 'sending', lastAttemptAt = ? WHERE id IN (${placeholders})`, [Date.now(), ...eventIds], () => {
|
|
135
|
+
_Logger.default.log(`Dequeued ${events.length} events and marked as sending`);
|
|
136
|
+
resolve(events);
|
|
137
|
+
}, (_, error) => {
|
|
138
|
+
_Logger.default.error('Error updating event status to sending:', error);
|
|
139
|
+
reject(error);
|
|
140
|
+
});
|
|
141
|
+
} else {
|
|
142
|
+
_Logger.default.log('Dequeued 0 events');
|
|
143
|
+
resolve(events);
|
|
144
|
+
}
|
|
145
|
+
}, (_, error) => {
|
|
146
|
+
_Logger.default.error('Error dequeuing events:', error);
|
|
147
|
+
reject(error);
|
|
148
|
+
});
|
|
149
|
+
});
|
|
150
|
+
} catch (error) {
|
|
151
|
+
_Logger.default.error('Error in dequeue:', error);
|
|
152
|
+
reject(error);
|
|
153
|
+
}
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* Mark events as successfully sent and remove from queue
|
|
159
|
+
* @param eventIds Array of event IDs to mark as sent
|
|
160
|
+
*/
|
|
161
|
+
async markAsSent(eventIds) {
|
|
162
|
+
return new Promise((resolve, reject) => {
|
|
163
|
+
if (!this.db) {
|
|
164
|
+
return reject(new Error('Database not initialized'));
|
|
165
|
+
}
|
|
166
|
+
if (eventIds.length === 0) {
|
|
167
|
+
return resolve();
|
|
168
|
+
}
|
|
169
|
+
try {
|
|
170
|
+
const placeholders = eventIds.map(() => '?').join(',');
|
|
171
|
+
this.db.transaction(txn => {
|
|
172
|
+
txn.executeSql(`DELETE FROM EventQueue WHERE id IN (${placeholders})`, eventIds, () => {
|
|
173
|
+
_Logger.default.log(`Marked ${eventIds.length} events as sent and deleted`);
|
|
174
|
+
resolve();
|
|
175
|
+
}, (_, error) => {
|
|
176
|
+
_Logger.default.error('Error marking events as sent:', error);
|
|
177
|
+
reject(error);
|
|
178
|
+
});
|
|
179
|
+
});
|
|
180
|
+
} catch (error) {
|
|
181
|
+
_Logger.default.error('Error in markAsSent:', error);
|
|
182
|
+
reject(error);
|
|
183
|
+
}
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* Mark events as failed and update retry count
|
|
189
|
+
* @param eventIds Array of event IDs that failed
|
|
190
|
+
* @param retryCount New retry count
|
|
191
|
+
*/
|
|
192
|
+
async markAsFailed(eventIds, retryCount) {
|
|
193
|
+
return new Promise((resolve, reject) => {
|
|
194
|
+
if (!this.db) {
|
|
195
|
+
return reject(new Error('Database not initialized'));
|
|
196
|
+
}
|
|
197
|
+
if (eventIds.length === 0) {
|
|
198
|
+
return resolve();
|
|
199
|
+
}
|
|
200
|
+
try {
|
|
201
|
+
const placeholders = eventIds.map(() => '?').join(',');
|
|
202
|
+
const now = Date.now();
|
|
203
|
+
this.db.transaction(txn => {
|
|
204
|
+
txn.executeSql(`UPDATE EventQueue
|
|
205
|
+
SET retryCount = ?, status = ?, lastAttemptAt = ?
|
|
206
|
+
WHERE id IN (${placeholders})`, [retryCount, retryCount >= this.maxRetries ? 'failed' : 'pending', now, ...eventIds], () => {
|
|
207
|
+
_Logger.default.log(`Marked ${eventIds.length} events as ${retryCount >= this.maxRetries ? 'failed' : 'pending'} (retry: ${retryCount})`);
|
|
208
|
+
resolve();
|
|
209
|
+
}, (_, error) => {
|
|
210
|
+
_Logger.default.error('Error marking events as failed:', error);
|
|
211
|
+
reject(error);
|
|
212
|
+
});
|
|
213
|
+
});
|
|
214
|
+
} catch (error) {
|
|
215
|
+
_Logger.default.error('Error in markAsFailed:', error);
|
|
216
|
+
reject(error);
|
|
217
|
+
}
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
/**
|
|
222
|
+
* Get current queue size (pending events only)
|
|
223
|
+
* @returns Number of pending events in queue
|
|
224
|
+
*/
|
|
225
|
+
async getQueueSize() {
|
|
226
|
+
return new Promise((resolve, reject) => {
|
|
227
|
+
if (!this.db) {
|
|
228
|
+
return reject(new Error('Database not initialized'));
|
|
229
|
+
}
|
|
230
|
+
try {
|
|
231
|
+
this.db.transaction(txn => {
|
|
232
|
+
txn.executeSql(`SELECT COUNT(*) as count FROM EventQueue WHERE status = 'pending'`, [], (_, res) => {
|
|
233
|
+
const count = res.rows.item(0).count;
|
|
234
|
+
resolve(count);
|
|
235
|
+
}, (_, error) => {
|
|
236
|
+
_Logger.default.error('Error getting queue size:', error);
|
|
237
|
+
reject(error);
|
|
238
|
+
});
|
|
239
|
+
});
|
|
240
|
+
} catch (error) {
|
|
241
|
+
_Logger.default.error('Error in getQueueSize:', error);
|
|
242
|
+
reject(error);
|
|
243
|
+
}
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
/**
|
|
248
|
+
* Clean up old failed events
|
|
249
|
+
* Deletes events older than specified days with status 'failed'
|
|
250
|
+
* @param daysOld Number of days old to consider for deletion
|
|
251
|
+
*/
|
|
252
|
+
async clearOldEvents(daysOld) {
|
|
253
|
+
return new Promise((resolve, reject) => {
|
|
254
|
+
if (!this.db) {
|
|
255
|
+
return reject(new Error('Database not initialized'));
|
|
256
|
+
}
|
|
257
|
+
try {
|
|
258
|
+
const cutoffTime = Date.now() - daysOld * 24 * 60 * 60 * 1000;
|
|
259
|
+
this.db.transaction(txn => {
|
|
260
|
+
txn.executeSql(`DELETE FROM EventQueue WHERE status = 'failed' AND createdAt < ?`, [cutoffTime], (_, res) => {
|
|
261
|
+
_Logger.default.log(`Cleaned up ${res.rowsAffected} old failed events`);
|
|
262
|
+
resolve();
|
|
263
|
+
}, (_, error) => {
|
|
264
|
+
_Logger.default.error('Error cleaning up old events:', error);
|
|
265
|
+
reject(error);
|
|
266
|
+
});
|
|
267
|
+
});
|
|
268
|
+
} catch (error) {
|
|
269
|
+
_Logger.default.error('Error in clearOldEvents:', error);
|
|
270
|
+
reject(error);
|
|
271
|
+
}
|
|
272
|
+
});
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
/**
|
|
276
|
+
* Drop oldest events when queue is full
|
|
277
|
+
* Keeps queue size within limits by removing oldest pending events
|
|
278
|
+
* @param maxSize Maximum queue size to maintain
|
|
279
|
+
*/
|
|
280
|
+
async enforceQueueLimit(maxSize) {
|
|
281
|
+
return new Promise((resolve, reject) => {
|
|
282
|
+
if (!this.db) {
|
|
283
|
+
return reject(new Error('Database not initialized'));
|
|
284
|
+
}
|
|
285
|
+
try {
|
|
286
|
+
this.db.transaction(txn => {
|
|
287
|
+
txn.executeSql(`DELETE FROM EventQueue
|
|
288
|
+
WHERE id IN (
|
|
289
|
+
SELECT id FROM EventQueue
|
|
290
|
+
WHERE status = 'pending'
|
|
291
|
+
ORDER BY timestamp ASC
|
|
292
|
+
LIMIT MAX(0, (SELECT COUNT(*) FROM EventQueue WHERE status = 'pending') - ?)
|
|
293
|
+
)`, [maxSize], (_, res) => {
|
|
294
|
+
if (res.rowsAffected > 0) {
|
|
295
|
+
_Logger.default.warn(`Queue limit reached! Dropped ${res.rowsAffected} oldest events`);
|
|
296
|
+
}
|
|
297
|
+
resolve();
|
|
298
|
+
}, (_, error) => {
|
|
299
|
+
_Logger.default.error('Error enforcing queue limit:', error);
|
|
300
|
+
reject(error);
|
|
301
|
+
});
|
|
302
|
+
});
|
|
303
|
+
} catch (error) {
|
|
304
|
+
_Logger.default.error('Error in enforceQueueLimit:', error);
|
|
305
|
+
reject(error);
|
|
306
|
+
}
|
|
307
|
+
});
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
/**
|
|
311
|
+
* Recover stale 'sending' events back to 'pending'
|
|
312
|
+
* Called on SDK initialization to handle app crashes during flush
|
|
313
|
+
* Resets events stuck in 'sending' status for more than 5 minutes
|
|
314
|
+
*/
|
|
315
|
+
async recoverStaleEvents() {
|
|
316
|
+
return new Promise((resolve, reject) => {
|
|
317
|
+
if (!this.db) {
|
|
318
|
+
return reject(new Error('Database not initialized'));
|
|
319
|
+
}
|
|
320
|
+
try {
|
|
321
|
+
// Reset events that have been in 'sending' status for more than 5 minutes
|
|
322
|
+
const staleThreshold = Date.now() - 5 * 60 * 1000; // 5 minutes
|
|
323
|
+
|
|
324
|
+
this.db.transaction(txn => {
|
|
325
|
+
txn.executeSql(`UPDATE EventQueue
|
|
326
|
+
SET status = 'pending'
|
|
327
|
+
WHERE status = 'sending' AND lastAttemptAt < ?`, [staleThreshold], (_, res) => {
|
|
328
|
+
if (res.rowsAffected > 0) {
|
|
329
|
+
_Logger.default.log(`Recovered ${res.rowsAffected} stale events from 'sending' to 'pending'`);
|
|
330
|
+
}
|
|
331
|
+
resolve();
|
|
332
|
+
}, (_, error) => {
|
|
333
|
+
_Logger.default.error('Error recovering stale events:', error);
|
|
334
|
+
reject(error);
|
|
335
|
+
});
|
|
336
|
+
});
|
|
337
|
+
} catch (error) {
|
|
338
|
+
_Logger.default.error('Error in recoverStaleEvents:', error);
|
|
339
|
+
reject(error);
|
|
340
|
+
}
|
|
341
|
+
});
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
exports.EventQueueManager = EventQueueManager;
|
|
345
|
+
//# sourceMappingURL=EventQueueManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_Logger","_interopRequireDefault","require","e","__esModule","default","EventQueueManager","constructor","db","maxRetries","createTable","Promise","resolve","reject","Error","transaction","txn","executeSql","Logger","log","_","error","enqueue","event","id","eventName","JSON","stringify","eventData","timestamp","priority","retryCount","status","createdAt","lastAttemptAt","dequeue","batchSize","events","res","eventIds","i","rows","length","row","item","push","parse","placeholders","map","join","Date","now","markAsSent","markAsFailed","getQueueSize","count","clearOldEvents","daysOld","cutoffTime","rowsAffected","enforceQueueLimit","maxSize","warn","recoverStaleEvents","staleThreshold","exports"],"sourceRoot":"../../../src","sources":["core/EventQueueManager.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.FlushManager = void 0;
|
|
7
|
+
var _reactNative = require("react-native");
|
|
8
|
+
var _Logger = _interopRequireDefault(require("../utils/Logger.js"));
|
|
9
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
10
|
+
/**
|
|
11
|
+
* FlushManager
|
|
12
|
+
* Orchestrates batch sending with multiple flush triggers:
|
|
13
|
+
* - Time interval (every 30s)
|
|
14
|
+
* - Queue size (when batchSize reached)
|
|
15
|
+
* - App lifecycle (on background)
|
|
16
|
+
* - Network restoration (when back online)
|
|
17
|
+
*/
|
|
18
|
+
class FlushManager {
|
|
19
|
+
flushTimer = null;
|
|
20
|
+
isFlushing = null;
|
|
21
|
+
appStateSubscription = null;
|
|
22
|
+
retryTimeouts = new Map();
|
|
23
|
+
constructor(queueManager, networkMonitor, config, sendBatchCallback) {
|
|
24
|
+
this.queueManager = queueManager;
|
|
25
|
+
this.networkMonitor = networkMonitor;
|
|
26
|
+
this.config = config;
|
|
27
|
+
this.sendBatchCallback = sendBatchCallback;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Start flush manager
|
|
32
|
+
* - Initializes timer-based flushing
|
|
33
|
+
* - Sets up AppState listener
|
|
34
|
+
* - Sets up network state listener
|
|
35
|
+
*/
|
|
36
|
+
start() {
|
|
37
|
+
_Logger.default.log('FlushManager starting...');
|
|
38
|
+
|
|
39
|
+
// Timer-based flush trigger
|
|
40
|
+
this.flushTimer = setInterval(() => {
|
|
41
|
+
this.flush(false);
|
|
42
|
+
}, this.config.flushInterval);
|
|
43
|
+
|
|
44
|
+
// App lifecycle flush trigger
|
|
45
|
+
this.appStateSubscription = _reactNative.AppState.addEventListener('change', nextAppState => {
|
|
46
|
+
if (nextAppState === 'background' || nextAppState === 'inactive') {
|
|
47
|
+
_Logger.default.log('App going to background, triggering flush');
|
|
48
|
+
this.flush(true); // Force flush on background
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
// Network restoration flush trigger
|
|
53
|
+
this.networkMonitor.addListener(isOnline => {
|
|
54
|
+
if (isOnline) {
|
|
55
|
+
_Logger.default.log('Network restored, triggering flush');
|
|
56
|
+
this.flush(false);
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
_Logger.default.log('FlushManager started');
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Stop flush manager
|
|
64
|
+
* - Clears timer
|
|
65
|
+
* - Removes listeners
|
|
66
|
+
* - Cancels pending retries
|
|
67
|
+
*/
|
|
68
|
+
stop() {
|
|
69
|
+
_Logger.default.log('FlushManager stopping...');
|
|
70
|
+
if (this.flushTimer) {
|
|
71
|
+
clearInterval(this.flushTimer);
|
|
72
|
+
this.flushTimer = null;
|
|
73
|
+
}
|
|
74
|
+
if (this.appStateSubscription) {
|
|
75
|
+
this.appStateSubscription.remove();
|
|
76
|
+
this.appStateSubscription = null;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// Cancel all pending retries
|
|
80
|
+
this.retryTimeouts.forEach(timeout => clearTimeout(timeout));
|
|
81
|
+
this.retryTimeouts.clear();
|
|
82
|
+
_Logger.default.log('FlushManager stopped');
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Trigger batch flush
|
|
87
|
+
* Prevents concurrent flushes using promise-based lock
|
|
88
|
+
* @param force If true, bypasses online check
|
|
89
|
+
* @returns Batch response from server
|
|
90
|
+
*/
|
|
91
|
+
async flush(force = false) {
|
|
92
|
+
// Prevent concurrent flushes
|
|
93
|
+
if (this.isFlushing) {
|
|
94
|
+
_Logger.default.log('Flush already in progress, skipping');
|
|
95
|
+
return this.isFlushing;
|
|
96
|
+
}
|
|
97
|
+
this.isFlushing = (async () => {
|
|
98
|
+
try {
|
|
99
|
+
// Check network status (unless forced)
|
|
100
|
+
if (!force && !this.networkMonitor.isConnected()) {
|
|
101
|
+
_Logger.default.log('Device offline, skipping flush');
|
|
102
|
+
return null;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// Get pending events from queue
|
|
106
|
+
const events = await this.queueManager.dequeue(this.config.batchSize);
|
|
107
|
+
if (events.length === 0) {
|
|
108
|
+
_Logger.default.log('No pending events to flush');
|
|
109
|
+
return null;
|
|
110
|
+
}
|
|
111
|
+
_Logger.default.log(`Flushing ${events.length} events...`);
|
|
112
|
+
try {
|
|
113
|
+
// Send batch and capture response
|
|
114
|
+
const batchResponse = await this.sendBatchCallback(events);
|
|
115
|
+
|
|
116
|
+
// Handle partial batch success/failure at event level
|
|
117
|
+
await this.handleBatchResponse(events, batchResponse);
|
|
118
|
+
_Logger.default.log(`Batch sent: ${batchResponse.processedCount || events.length} succeeded, ${batchResponse.failedCount || 0} failed`);
|
|
119
|
+
|
|
120
|
+
// Return batch response (contains results for each event)
|
|
121
|
+
return batchResponse;
|
|
122
|
+
} catch (error) {
|
|
123
|
+
// Network error or complete batch failure - retry all events
|
|
124
|
+
_Logger.default.error('Batch send failed (network/server error):', error);
|
|
125
|
+
await this.handleFailedBatch(events, error);
|
|
126
|
+
return null;
|
|
127
|
+
}
|
|
128
|
+
} finally {
|
|
129
|
+
this.isFlushing = null;
|
|
130
|
+
}
|
|
131
|
+
})();
|
|
132
|
+
return this.isFlushing;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* Handle batch response with granular event-level success/failure
|
|
137
|
+
* Parses individual event results and handles each one appropriately
|
|
138
|
+
* @param events Events that were sent in the batch
|
|
139
|
+
* @param batchResponse Response from server with individual event results
|
|
140
|
+
*/
|
|
141
|
+
async handleBatchResponse(events, batchResponse) {
|
|
142
|
+
// If no results array, assume all succeeded (backward compatibility)
|
|
143
|
+
if (!batchResponse.results || !Array.isArray(batchResponse.results)) {
|
|
144
|
+
_Logger.default.warn('No individual results in batch response, marking all as sent');
|
|
145
|
+
const eventIds = events.map(e => e.id);
|
|
146
|
+
await this.queueManager.markAsSent(eventIds);
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
const successfulEventIds = [];
|
|
150
|
+
const failedEvents = [];
|
|
151
|
+
|
|
152
|
+
// Parse individual event results
|
|
153
|
+
for (const result of batchResponse.results) {
|
|
154
|
+
if (result.success) {
|
|
155
|
+
successfulEventIds.push(result.id);
|
|
156
|
+
} else {
|
|
157
|
+
// Find the full event object for failed events
|
|
158
|
+
const failedEvent = events.find(e => e.id === result.id);
|
|
159
|
+
if (failedEvent) {
|
|
160
|
+
failedEvents.push(failedEvent);
|
|
161
|
+
_Logger.default.warn(`Event ${result.id} failed: ${result.error || 'Unknown error'}`);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
// Mark successful events as sent and delete from queue
|
|
167
|
+
if (successfulEventIds.length > 0) {
|
|
168
|
+
await this.queueManager.markAsSent(successfulEventIds);
|
|
169
|
+
_Logger.default.log(`Successfully sent ${successfulEventIds.length} events`);
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
// Handle failed events with retry logic (individual events, not entire batch)
|
|
173
|
+
if (failedEvents.length > 0) {
|
|
174
|
+
_Logger.default.warn(`${failedEvents.length} events failed, will retry individually`);
|
|
175
|
+
for (const failedEvent of failedEvents) {
|
|
176
|
+
const newRetryCount = (failedEvent.retryCount || 0) + 1;
|
|
177
|
+
await this.queueManager.markAsFailed([failedEvent.id], newRetryCount);
|
|
178
|
+
if (newRetryCount >= this.config.maxRetries) {
|
|
179
|
+
_Logger.default.error(`Event ${failedEvent.id} reached max retries (${this.config.maxRetries}). Marking as permanently failed.`);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
// Schedule a retry flush for failed events (only if some haven't exceeded max retries)
|
|
184
|
+
const retriableEvents = failedEvents.filter(e => (e.retryCount || 0) + 1 < this.config.maxRetries);
|
|
185
|
+
if (retriableEvents.length > 0) {
|
|
186
|
+
const retryCount = (retriableEvents[0]?.retryCount || 0) + 1;
|
|
187
|
+
const retryDelay = this.config.retryBaseDelay * Math.pow(2, retryCount - 1);
|
|
188
|
+
_Logger.default.log(`Scheduling retry for ${retriableEvents.length} failed events in ${retryDelay}ms (retry ${retryCount}/${this.config.maxRetries})`);
|
|
189
|
+
const timeoutId = setTimeout(() => {
|
|
190
|
+
this.flush(false);
|
|
191
|
+
this.retryTimeouts.delete('retry');
|
|
192
|
+
}, retryDelay);
|
|
193
|
+
this.retryTimeouts.set('retry', timeoutId);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
/**
|
|
199
|
+
* Handle failed batch with retry logic (entire batch failed due to network/server error)
|
|
200
|
+
* Implements exponential backoff: 2s, 4s, 8s, 16s, 32s
|
|
201
|
+
* @param events Events that failed to send
|
|
202
|
+
* @param error Error that occurred
|
|
203
|
+
*/
|
|
204
|
+
async handleFailedBatch(events, _error) {
|
|
205
|
+
// Increment retry count for all events
|
|
206
|
+
const newRetryCount = (events[0]?.retryCount || 0) + 1;
|
|
207
|
+
const eventIds = events.map(e => e.id);
|
|
208
|
+
|
|
209
|
+
// Mark events as failed with updated retry count
|
|
210
|
+
await this.queueManager.markAsFailed(eventIds, newRetryCount);
|
|
211
|
+
if (newRetryCount >= this.config.maxRetries) {
|
|
212
|
+
_Logger.default.error(`Max retries (${this.config.maxRetries}) reached for ${events.length} events. Marking as permanently failed.`);
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
// Calculate exponential backoff delay
|
|
217
|
+
const retryDelay = this.config.retryBaseDelay * Math.pow(2, newRetryCount - 1);
|
|
218
|
+
_Logger.default.log(`Scheduling retry ${newRetryCount}/${this.config.maxRetries} in ${retryDelay}ms`);
|
|
219
|
+
|
|
220
|
+
// Schedule retry
|
|
221
|
+
const timeoutId = setTimeout(() => {
|
|
222
|
+
this.flush(false);
|
|
223
|
+
this.retryTimeouts.delete('retry');
|
|
224
|
+
}, retryDelay);
|
|
225
|
+
this.retryTimeouts.set('retry', timeoutId);
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
/**
|
|
229
|
+
* Check if flush is needed based on queue size
|
|
230
|
+
* Called after each event is enqueued
|
|
231
|
+
*/
|
|
232
|
+
async checkFlushNeeded() {
|
|
233
|
+
try {
|
|
234
|
+
const queueSize = await this.queueManager.getQueueSize();
|
|
235
|
+
if (queueSize >= this.config.batchSize) {
|
|
236
|
+
_Logger.default.log(`Queue size (${queueSize}) reached batch size, triggering flush`);
|
|
237
|
+
this.flush(false);
|
|
238
|
+
}
|
|
239
|
+
} catch (error) {
|
|
240
|
+
_Logger.default.error('Error checking flush needed:', error);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
exports.FlushManager = FlushManager;
|
|
245
|
+
//# sourceMappingURL=FlushManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_reactNative","require","_Logger","_interopRequireDefault","e","__esModule","default","FlushManager","flushTimer","isFlushing","appStateSubscription","retryTimeouts","Map","constructor","queueManager","networkMonitor","config","sendBatchCallback","start","Logger","log","setInterval","flush","flushInterval","AppState","addEventListener","nextAppState","addListener","isOnline","stop","clearInterval","remove","forEach","timeout","clearTimeout","clear","force","isConnected","events","dequeue","batchSize","length","batchResponse","handleBatchResponse","processedCount","failedCount","error","handleFailedBatch","results","Array","isArray","warn","eventIds","map","id","markAsSent","successfulEventIds","failedEvents","result","success","push","failedEvent","find","newRetryCount","retryCount","markAsFailed","maxRetries","retriableEvents","filter","retryDelay","retryBaseDelay","Math","pow","timeoutId","setTimeout","delete","set","_error","checkFlushNeeded","queueSize","getQueueSize","exports"],"sourceRoot":"../../../src","sources":["core/FlushManager.ts"],"mappings":"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","ignoreList":[]}
|