@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.
Files changed (204) hide show
  1. package/LICENSE +55 -0
  2. package/README.md +67 -0
  3. package/docs/IOS_NOTIFICATION_EXTENSION_SETUP.md +335 -0
  4. package/ios/README.md +64 -0
  5. package/ios/SwanNotificationServiceExtension/Info.plist +31 -0
  6. package/ios/SwanNotificationServiceExtension/NotificationService.swift +337 -0
  7. package/ios/SwanNotificationServiceExtension/SwanNotificationServiceExtension.entitlements +10 -0
  8. package/lib/commonjs/components/FooterView.js +125 -0
  9. package/lib/commonjs/components/FooterView.js.map +1 -0
  10. package/lib/commonjs/components/FullScreenView.js +172 -0
  11. package/lib/commonjs/components/FullScreenView.js.map +1 -0
  12. package/lib/commonjs/components/HeaderView.js +205 -0
  13. package/lib/commonjs/components/HeaderView.js.map +1 -0
  14. package/lib/commonjs/components/PopUpView.js +186 -0
  15. package/lib/commonjs/components/PopUpView.js.map +1 -0
  16. package/lib/commonjs/config/BatchConfig.js +53 -0
  17. package/lib/commonjs/config/BatchConfig.js.map +1 -0
  18. package/lib/commonjs/constants/ApiUrls.js +56 -0
  19. package/lib/commonjs/constants/ApiUrls.js.map +1 -0
  20. package/lib/commonjs/core/EventQueueManager.js +345 -0
  21. package/lib/commonjs/core/EventQueueManager.js.map +1 -0
  22. package/lib/commonjs/core/FlushManager.js +245 -0
  23. package/lib/commonjs/core/FlushManager.js.map +1 -0
  24. package/lib/commonjs/core/NetworkMonitor.js +97 -0
  25. package/lib/commonjs/core/NetworkMonitor.js.map +1 -0
  26. package/lib/commonjs/index.js +3506 -0
  27. package/lib/commonjs/index.js.map +1 -0
  28. package/lib/commonjs/providers/FirebasePushProvider.js +130 -0
  29. package/lib/commonjs/providers/FirebasePushProvider.js.map +1 -0
  30. package/lib/commonjs/providers/NullPushProvider.js +59 -0
  31. package/lib/commonjs/providers/NullPushProvider.js.map +1 -0
  32. package/lib/commonjs/providers/PushNotificationProvider.js +30 -0
  33. package/lib/commonjs/providers/PushNotificationProvider.js.map +1 -0
  34. package/lib/commonjs/services/DeviceRegistrationService.js +248 -0
  35. package/lib/commonjs/services/DeviceRegistrationService.js.map +1 -0
  36. package/lib/commonjs/services/PushTokenService.js +284 -0
  37. package/lib/commonjs/services/PushTokenService.js.map +1 -0
  38. package/lib/commonjs/state/AuthStateMachine.js +161 -0
  39. package/lib/commonjs/state/AuthStateMachine.js.map +1 -0
  40. package/lib/commonjs/state/DeviceStateMachine.js +104 -0
  41. package/lib/commonjs/state/DeviceStateMachine.js.map +1 -0
  42. package/lib/commonjs/state/PushStateMachine.js +129 -0
  43. package/lib/commonjs/state/PushStateMachine.js.map +1 -0
  44. package/lib/commonjs/types/EventQueue.js +50 -0
  45. package/lib/commonjs/types/EventQueue.js.map +1 -0
  46. package/lib/commonjs/types/SDK.js +2 -0
  47. package/lib/commonjs/types/SDK.js.map +1 -0
  48. package/lib/commonjs/utils/FirebaseNotificationManager.js +492 -0
  49. package/lib/commonjs/utils/FirebaseNotificationManager.js.map +1 -0
  50. package/lib/commonjs/utils/Logger.js +56 -0
  51. package/lib/commonjs/utils/Logger.js.map +1 -0
  52. package/lib/commonjs/utils/SharedCredentialsManager.js +146 -0
  53. package/lib/commonjs/utils/SharedCredentialsManager.js.map +1 -0
  54. package/lib/commonjs/version.js +12 -0
  55. package/lib/commonjs/version.js.map +1 -0
  56. package/lib/module/components/FooterView.js +121 -0
  57. package/lib/module/components/FooterView.js.map +1 -0
  58. package/lib/module/components/FullScreenView.js +167 -0
  59. package/lib/module/components/FullScreenView.js.map +1 -0
  60. package/lib/module/components/HeaderView.js +199 -0
  61. package/lib/module/components/HeaderView.js.map +1 -0
  62. package/lib/module/components/PopUpView.js +181 -0
  63. package/lib/module/components/PopUpView.js.map +1 -0
  64. package/lib/module/config/BatchConfig.js +49 -0
  65. package/lib/module/config/BatchConfig.js.map +1 -0
  66. package/lib/module/constants/ApiUrls.js +52 -0
  67. package/lib/module/constants/ApiUrls.js.map +1 -0
  68. package/lib/module/core/EventQueueManager.js +340 -0
  69. package/lib/module/core/EventQueueManager.js.map +1 -0
  70. package/lib/module/core/FlushManager.js +240 -0
  71. package/lib/module/core/FlushManager.js.map +1 -0
  72. package/lib/module/core/NetworkMonitor.js +92 -0
  73. package/lib/module/core/NetworkMonitor.js.map +1 -0
  74. package/lib/module/index.js +3494 -0
  75. package/lib/module/index.js.map +1 -0
  76. package/lib/module/providers/FirebasePushProvider.js +124 -0
  77. package/lib/module/providers/FirebasePushProvider.js.map +1 -0
  78. package/lib/module/providers/NullPushProvider.js +53 -0
  79. package/lib/module/providers/NullPushProvider.js.map +1 -0
  80. package/lib/module/providers/PushNotificationProvider.js +26 -0
  81. package/lib/module/providers/PushNotificationProvider.js.map +1 -0
  82. package/lib/module/services/DeviceRegistrationService.js +243 -0
  83. package/lib/module/services/DeviceRegistrationService.js.map +1 -0
  84. package/lib/module/services/PushTokenService.js +278 -0
  85. package/lib/module/services/PushTokenService.js.map +1 -0
  86. package/lib/module/state/AuthStateMachine.js +155 -0
  87. package/lib/module/state/AuthStateMachine.js.map +1 -0
  88. package/lib/module/state/DeviceStateMachine.js +98 -0
  89. package/lib/module/state/DeviceStateMachine.js.map +1 -0
  90. package/lib/module/state/PushStateMachine.js +123 -0
  91. package/lib/module/state/PushStateMachine.js.map +1 -0
  92. package/lib/module/types/EventQueue.js +46 -0
  93. package/lib/module/types/EventQueue.js.map +1 -0
  94. package/lib/module/types/SDK.js +2 -0
  95. package/lib/module/types/SDK.js.map +1 -0
  96. package/lib/module/utils/FirebaseNotificationManager.js +486 -0
  97. package/lib/module/utils/FirebaseNotificationManager.js.map +1 -0
  98. package/lib/module/utils/Logger.js +52 -0
  99. package/lib/module/utils/Logger.js.map +1 -0
  100. package/lib/module/utils/SharedCredentialsManager.js +140 -0
  101. package/lib/module/utils/SharedCredentialsManager.js.map +1 -0
  102. package/lib/module/version.js +8 -0
  103. package/lib/module/version.js.map +1 -0
  104. package/lib/typescript/commonjs/package.json +1 -0
  105. package/lib/typescript/commonjs/src/components/FooterView.d.ts +3 -0
  106. package/lib/typescript/commonjs/src/components/FooterView.d.ts.map +1 -0
  107. package/lib/typescript/commonjs/src/components/FullScreenView.d.ts +3 -0
  108. package/lib/typescript/commonjs/src/components/FullScreenView.d.ts.map +1 -0
  109. package/lib/typescript/commonjs/src/components/HeaderView.d.ts +3 -0
  110. package/lib/typescript/commonjs/src/components/HeaderView.d.ts.map +1 -0
  111. package/lib/typescript/commonjs/src/components/PopUpView.d.ts +3 -0
  112. package/lib/typescript/commonjs/src/components/PopUpView.d.ts.map +1 -0
  113. package/lib/typescript/commonjs/src/config/BatchConfig.d.ts +7 -0
  114. package/lib/typescript/commonjs/src/config/BatchConfig.d.ts.map +1 -0
  115. package/lib/typescript/commonjs/src/constants/ApiUrls.d.ts +56 -0
  116. package/lib/typescript/commonjs/src/constants/ApiUrls.d.ts.map +1 -0
  117. package/lib/typescript/commonjs/src/core/EventQueueManager.d.ts +63 -0
  118. package/lib/typescript/commonjs/src/core/EventQueueManager.d.ts.map +1 -0
  119. package/lib/typescript/commonjs/src/core/FlushManager.d.ts +63 -0
  120. package/lib/typescript/commonjs/src/core/FlushManager.d.ts.map +1 -0
  121. package/lib/typescript/commonjs/src/core/NetworkMonitor.d.ts +38 -0
  122. package/lib/typescript/commonjs/src/core/NetworkMonitor.d.ts.map +1 -0
  123. package/lib/typescript/commonjs/src/index.d.ts +663 -0
  124. package/lib/typescript/commonjs/src/index.d.ts.map +1 -0
  125. package/lib/typescript/commonjs/src/providers/FirebasePushProvider.d.ts +28 -0
  126. package/lib/typescript/commonjs/src/providers/FirebasePushProvider.d.ts.map +1 -0
  127. package/lib/typescript/commonjs/src/providers/NullPushProvider.d.ts +25 -0
  128. package/lib/typescript/commonjs/src/providers/NullPushProvider.d.ts.map +1 -0
  129. package/lib/typescript/commonjs/src/providers/PushNotificationProvider.d.ts +105 -0
  130. package/lib/typescript/commonjs/src/providers/PushNotificationProvider.d.ts.map +1 -0
  131. package/lib/typescript/commonjs/src/services/DeviceRegistrationService.d.ts +60 -0
  132. package/lib/typescript/commonjs/src/services/DeviceRegistrationService.d.ts.map +1 -0
  133. package/lib/typescript/commonjs/src/services/PushTokenService.d.ts +82 -0
  134. package/lib/typescript/commonjs/src/services/PushTokenService.d.ts.map +1 -0
  135. package/lib/typescript/commonjs/src/state/AuthStateMachine.d.ts +61 -0
  136. package/lib/typescript/commonjs/src/state/AuthStateMachine.d.ts.map +1 -0
  137. package/lib/typescript/commonjs/src/state/DeviceStateMachine.d.ts +51 -0
  138. package/lib/typescript/commonjs/src/state/DeviceStateMachine.d.ts.map +1 -0
  139. package/lib/typescript/commonjs/src/state/PushStateMachine.d.ts +61 -0
  140. package/lib/typescript/commonjs/src/state/PushStateMachine.d.ts.map +1 -0
  141. package/lib/typescript/commonjs/src/types/EventQueue.d.ts +85 -0
  142. package/lib/typescript/commonjs/src/types/EventQueue.d.ts.map +1 -0
  143. package/lib/typescript/commonjs/src/types/SDK.d.ts +54 -0
  144. package/lib/typescript/commonjs/src/types/SDK.d.ts.map +1 -0
  145. package/lib/typescript/commonjs/src/utils/FirebaseNotificationManager.d.ts +169 -0
  146. package/lib/typescript/commonjs/src/utils/FirebaseNotificationManager.d.ts.map +1 -0
  147. package/lib/typescript/commonjs/src/utils/Logger.d.ts +32 -0
  148. package/lib/typescript/commonjs/src/utils/Logger.d.ts.map +1 -0
  149. package/lib/typescript/commonjs/src/utils/SharedCredentialsManager.d.ts +54 -0
  150. package/lib/typescript/commonjs/src/utils/SharedCredentialsManager.d.ts.map +1 -0
  151. package/lib/typescript/commonjs/src/version.d.ts +2 -0
  152. package/lib/typescript/commonjs/src/version.d.ts.map +1 -0
  153. package/lib/typescript/module/package.json +1 -0
  154. package/lib/typescript/module/src/components/FooterView.d.ts +3 -0
  155. package/lib/typescript/module/src/components/FooterView.d.ts.map +1 -0
  156. package/lib/typescript/module/src/components/FullScreenView.d.ts +3 -0
  157. package/lib/typescript/module/src/components/FullScreenView.d.ts.map +1 -0
  158. package/lib/typescript/module/src/components/HeaderView.d.ts +3 -0
  159. package/lib/typescript/module/src/components/HeaderView.d.ts.map +1 -0
  160. package/lib/typescript/module/src/components/PopUpView.d.ts +3 -0
  161. package/lib/typescript/module/src/components/PopUpView.d.ts.map +1 -0
  162. package/lib/typescript/module/src/config/BatchConfig.d.ts +7 -0
  163. package/lib/typescript/module/src/config/BatchConfig.d.ts.map +1 -0
  164. package/lib/typescript/module/src/constants/ApiUrls.d.ts +56 -0
  165. package/lib/typescript/module/src/constants/ApiUrls.d.ts.map +1 -0
  166. package/lib/typescript/module/src/core/EventQueueManager.d.ts +63 -0
  167. package/lib/typescript/module/src/core/EventQueueManager.d.ts.map +1 -0
  168. package/lib/typescript/module/src/core/FlushManager.d.ts +63 -0
  169. package/lib/typescript/module/src/core/FlushManager.d.ts.map +1 -0
  170. package/lib/typescript/module/src/core/NetworkMonitor.d.ts +38 -0
  171. package/lib/typescript/module/src/core/NetworkMonitor.d.ts.map +1 -0
  172. package/lib/typescript/module/src/index.d.ts +663 -0
  173. package/lib/typescript/module/src/index.d.ts.map +1 -0
  174. package/lib/typescript/module/src/providers/FirebasePushProvider.d.ts +28 -0
  175. package/lib/typescript/module/src/providers/FirebasePushProvider.d.ts.map +1 -0
  176. package/lib/typescript/module/src/providers/NullPushProvider.d.ts +25 -0
  177. package/lib/typescript/module/src/providers/NullPushProvider.d.ts.map +1 -0
  178. package/lib/typescript/module/src/providers/PushNotificationProvider.d.ts +105 -0
  179. package/lib/typescript/module/src/providers/PushNotificationProvider.d.ts.map +1 -0
  180. package/lib/typescript/module/src/services/DeviceRegistrationService.d.ts +60 -0
  181. package/lib/typescript/module/src/services/DeviceRegistrationService.d.ts.map +1 -0
  182. package/lib/typescript/module/src/services/PushTokenService.d.ts +82 -0
  183. package/lib/typescript/module/src/services/PushTokenService.d.ts.map +1 -0
  184. package/lib/typescript/module/src/state/AuthStateMachine.d.ts +61 -0
  185. package/lib/typescript/module/src/state/AuthStateMachine.d.ts.map +1 -0
  186. package/lib/typescript/module/src/state/DeviceStateMachine.d.ts +51 -0
  187. package/lib/typescript/module/src/state/DeviceStateMachine.d.ts.map +1 -0
  188. package/lib/typescript/module/src/state/PushStateMachine.d.ts +61 -0
  189. package/lib/typescript/module/src/state/PushStateMachine.d.ts.map +1 -0
  190. package/lib/typescript/module/src/types/EventQueue.d.ts +85 -0
  191. package/lib/typescript/module/src/types/EventQueue.d.ts.map +1 -0
  192. package/lib/typescript/module/src/types/SDK.d.ts +54 -0
  193. package/lib/typescript/module/src/types/SDK.d.ts.map +1 -0
  194. package/lib/typescript/module/src/utils/FirebaseNotificationManager.d.ts +169 -0
  195. package/lib/typescript/module/src/utils/FirebaseNotificationManager.d.ts.map +1 -0
  196. package/lib/typescript/module/src/utils/Logger.d.ts +32 -0
  197. package/lib/typescript/module/src/utils/Logger.d.ts.map +1 -0
  198. package/lib/typescript/module/src/utils/SharedCredentialsManager.d.ts +54 -0
  199. package/lib/typescript/module/src/utils/SharedCredentialsManager.d.ts.map +1 -0
  200. package/lib/typescript/module/src/version.d.ts +2 -0
  201. package/lib/typescript/module/src/version.d.ts.map +1 -0
  202. package/package.json +230 -0
  203. package/scripts/generate-version.js +25 -0
  204. 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":[]}