@bota-dev/react-native-sdk 0.0.2
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 +279 -0
- package/lib/commonjs/BotaClient.js +223 -0
- package/lib/commonjs/BotaClient.js.map +1 -0
- package/lib/commonjs/ble/BleManager.js +494 -0
- package/lib/commonjs/ble/BleManager.js.map +1 -0
- package/lib/commonjs/ble/constants.js +166 -0
- package/lib/commonjs/ble/constants.js.map +1 -0
- package/lib/commonjs/ble/index.js +54 -0
- package/lib/commonjs/ble/index.js.map +1 -0
- package/lib/commonjs/ble/parsers.js +345 -0
- package/lib/commonjs/ble/parsers.js.map +1 -0
- package/lib/commonjs/index.js +81 -0
- package/lib/commonjs/index.js.map +1 -0
- package/lib/commonjs/managers/DeviceManager.js +437 -0
- package/lib/commonjs/managers/DeviceManager.js.map +1 -0
- package/lib/commonjs/managers/OTAManager.js +227 -0
- package/lib/commonjs/managers/OTAManager.js.map +1 -0
- package/lib/commonjs/managers/RecordingManager.js +384 -0
- package/lib/commonjs/managers/RecordingManager.js.map +1 -0
- package/lib/commonjs/managers/index.js +27 -0
- package/lib/commonjs/managers/index.js.map +1 -0
- package/lib/commonjs/models/Device.js +2 -0
- package/lib/commonjs/models/Device.js.map +1 -0
- package/lib/commonjs/models/Recording.js +2 -0
- package/lib/commonjs/models/Recording.js.map +1 -0
- package/lib/commonjs/models/Status.js +6 -0
- package/lib/commonjs/models/Status.js.map +1 -0
- package/lib/commonjs/models/index.js +39 -0
- package/lib/commonjs/models/index.js.map +1 -0
- package/lib/commonjs/protocol/ProtocolHandler.js +343 -0
- package/lib/commonjs/protocol/ProtocolHandler.js.map +1 -0
- package/lib/commonjs/protocol/index.js +13 -0
- package/lib/commonjs/protocol/index.js.map +1 -0
- package/lib/commonjs/storage/StorageManager.js +333 -0
- package/lib/commonjs/storage/StorageManager.js.map +1 -0
- package/lib/commonjs/storage/index.js +19 -0
- package/lib/commonjs/storage/index.js.map +1 -0
- package/lib/commonjs/upload/S3Uploader.js +133 -0
- package/lib/commonjs/upload/S3Uploader.js.map +1 -0
- package/lib/commonjs/upload/UploadQueue.js +280 -0
- package/lib/commonjs/upload/UploadQueue.js.map +1 -0
- package/lib/commonjs/upload/index.js +20 -0
- package/lib/commonjs/upload/index.js.map +1 -0
- package/lib/commonjs/utils/errors.js +187 -0
- package/lib/commonjs/utils/errors.js.map +1 -0
- package/lib/commonjs/utils/index.js +40 -0
- package/lib/commonjs/utils/index.js.map +1 -0
- package/lib/commonjs/utils/logger.js +135 -0
- package/lib/commonjs/utils/logger.js.map +1 -0
- package/lib/commonjs/utils/retry.js +160 -0
- package/lib/commonjs/utils/retry.js.map +1 -0
- package/lib/module/BotaClient.js +216 -0
- package/lib/module/BotaClient.js.map +1 -0
- package/lib/module/ble/BleManager.js +484 -0
- package/lib/module/ble/BleManager.js.map +1 -0
- package/lib/module/ble/constants.js +159 -0
- package/lib/module/ble/constants.js.map +1 -0
- package/lib/module/ble/index.js +8 -0
- package/lib/module/ble/index.js.map +1 -0
- package/lib/module/ble/parsers.js +328 -0
- package/lib/module/ble/parsers.js.map +1 -0
- package/lib/module/index.js +22 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/managers/DeviceManager.js +429 -0
- package/lib/module/managers/DeviceManager.js.map +1 -0
- package/lib/module/managers/OTAManager.js +219 -0
- package/lib/module/managers/OTAManager.js.map +1 -0
- package/lib/module/managers/RecordingManager.js +376 -0
- package/lib/module/managers/RecordingManager.js.map +1 -0
- package/lib/module/managers/index.js +8 -0
- package/lib/module/managers/index.js.map +1 -0
- package/lib/module/models/Device.js +2 -0
- package/lib/module/models/Device.js.map +1 -0
- package/lib/module/models/Recording.js +2 -0
- package/lib/module/models/Recording.js.map +1 -0
- package/lib/module/models/Status.js +2 -0
- package/lib/module/models/Status.js.map +1 -0
- package/lib/module/models/index.js +8 -0
- package/lib/module/models/index.js.map +1 -0
- package/lib/module/protocol/ProtocolHandler.js +336 -0
- package/lib/module/protocol/ProtocolHandler.js.map +1 -0
- package/lib/module/protocol/index.js +6 -0
- package/lib/module/protocol/index.js.map +1 -0
- package/lib/module/storage/StorageManager.js +324 -0
- package/lib/module/storage/StorageManager.js.map +1 -0
- package/lib/module/storage/index.js +6 -0
- package/lib/module/storage/index.js.map +1 -0
- package/lib/module/upload/S3Uploader.js +126 -0
- package/lib/module/upload/S3Uploader.js.map +1 -0
- package/lib/module/upload/UploadQueue.js +272 -0
- package/lib/module/upload/UploadQueue.js.map +1 -0
- package/lib/module/upload/index.js +7 -0
- package/lib/module/upload/index.js.map +1 -0
- package/lib/module/utils/errors.js +173 -0
- package/lib/module/utils/errors.js.map +1 -0
- package/lib/module/utils/index.js +8 -0
- package/lib/module/utils/index.js.map +1 -0
- package/lib/module/utils/logger.js +129 -0
- package/lib/module/utils/logger.js.map +1 -0
- package/lib/module/utils/retry.js +149 -0
- package/lib/module/utils/retry.js.map +1 -0
- package/lib/typescript/src/BotaClient.d.ts +77 -0
- package/lib/typescript/src/BotaClient.d.ts.map +1 -0
- package/lib/typescript/src/ble/BleManager.d.ts +111 -0
- package/lib/typescript/src/ble/BleManager.d.ts.map +1 -0
- package/lib/typescript/src/ble/constants.d.ts +111 -0
- package/lib/typescript/src/ble/constants.d.ts.map +1 -0
- package/lib/typescript/src/ble/index.d.ts +7 -0
- package/lib/typescript/src/ble/index.d.ts.map +1 -0
- package/lib/typescript/src/ble/parsers.d.ts +100 -0
- package/lib/typescript/src/ble/parsers.d.ts.map +1 -0
- package/lib/typescript/src/index.d.ts +16 -0
- package/lib/typescript/src/index.d.ts.map +1 -0
- package/lib/typescript/src/managers/DeviceManager.d.ts +84 -0
- package/lib/typescript/src/managers/DeviceManager.d.ts.map +1 -0
- package/lib/typescript/src/managers/OTAManager.d.ts +78 -0
- package/lib/typescript/src/managers/OTAManager.d.ts.map +1 -0
- package/lib/typescript/src/managers/RecordingManager.d.ts +90 -0
- package/lib/typescript/src/managers/RecordingManager.d.ts.map +1 -0
- package/lib/typescript/src/managers/index.d.ts +7 -0
- package/lib/typescript/src/managers/index.d.ts.map +1 -0
- package/lib/typescript/src/models/Device.d.ts +139 -0
- package/lib/typescript/src/models/Device.d.ts.map +1 -0
- package/lib/typescript/src/models/Recording.d.ts +110 -0
- package/lib/typescript/src/models/Recording.d.ts.map +1 -0
- package/lib/typescript/src/models/Status.d.ts +104 -0
- package/lib/typescript/src/models/Status.d.ts.map +1 -0
- package/lib/typescript/src/models/index.d.ts +7 -0
- package/lib/typescript/src/models/index.d.ts.map +1 -0
- package/lib/typescript/src/protocol/ProtocolHandler.d.ts +69 -0
- package/lib/typescript/src/protocol/ProtocolHandler.d.ts.map +1 -0
- package/lib/typescript/src/protocol/index.d.ts +5 -0
- package/lib/typescript/src/protocol/index.d.ts.map +1 -0
- package/lib/typescript/src/storage/StorageManager.d.ts +116 -0
- package/lib/typescript/src/storage/StorageManager.d.ts.map +1 -0
- package/lib/typescript/src/storage/index.d.ts +5 -0
- package/lib/typescript/src/storage/index.d.ts.map +1 -0
- package/lib/typescript/src/upload/S3Uploader.d.ts +38 -0
- package/lib/typescript/src/upload/S3Uploader.d.ts.map +1 -0
- package/lib/typescript/src/upload/UploadQueue.d.ts +95 -0
- package/lib/typescript/src/upload/UploadQueue.d.ts.map +1 -0
- package/lib/typescript/src/upload/index.d.ts +6 -0
- package/lib/typescript/src/upload/index.d.ts.map +1 -0
- package/lib/typescript/src/utils/errors.d.ts +82 -0
- package/lib/typescript/src/utils/errors.d.ts.map +1 -0
- package/lib/typescript/src/utils/index.d.ts +7 -0
- package/lib/typescript/src/utils/index.d.ts.map +1 -0
- package/lib/typescript/src/utils/logger.d.ts +68 -0
- package/lib/typescript/src/utils/logger.d.ts.map +1 -0
- package/lib/typescript/src/utils/retry.d.ts +53 -0
- package/lib/typescript/src/utils/retry.d.ts.map +1 -0
- package/package.json +95 -0
- package/src/BotaClient.ts +238 -0
- package/src/ble/BleManager.ts +573 -0
- package/src/ble/constants.ts +158 -0
- package/src/ble/index.ts +7 -0
- package/src/ble/parsers.ts +395 -0
- package/src/index.ts +64 -0
- package/src/managers/DeviceManager.ts +545 -0
- package/src/managers/OTAManager.ts +263 -0
- package/src/managers/RecordingManager.ts +434 -0
- package/src/managers/index.ts +12 -0
- package/src/models/Device.ts +164 -0
- package/src/models/Recording.ts +123 -0
- package/src/models/Status.ts +126 -0
- package/src/models/index.ts +7 -0
- package/src/protocol/ProtocolHandler.ts +459 -0
- package/src/protocol/index.ts +5 -0
- package/src/storage/StorageManager.ts +343 -0
- package/src/storage/index.ts +5 -0
- package/src/upload/S3Uploader.ts +164 -0
- package/src/upload/UploadQueue.ts +310 -0
- package/src/upload/index.ts +6 -0
- package/src/utils/errors.ts +310 -0
- package/src/utils/index.ts +7 -0
- package/src/utils/logger.ts +137 -0
- package/src/utils/retry.ts +177 -0
|
@@ -0,0 +1,333 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.StorageManager = void 0;
|
|
7
|
+
exports.generateTaskId = generateTaskId;
|
|
8
|
+
var _asyncStorage = _interopRequireDefault(require("@react-native-async-storage/async-storage"));
|
|
9
|
+
var _buffer = require("buffer");
|
|
10
|
+
var _logger = require("../utils/logger");
|
|
11
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
12
|
+
/**
|
|
13
|
+
* Storage Manager - Local persistence for recordings and upload queue
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
const log = _logger.logger.tag('StorageManager');
|
|
17
|
+
|
|
18
|
+
// Storage keys
|
|
19
|
+
const STORAGE_PREFIX = '@bota_sdk:';
|
|
20
|
+
const UPLOAD_QUEUE_KEY = `${STORAGE_PREFIX}upload_queue`;
|
|
21
|
+
const SDK_STATE_KEY = `${STORAGE_PREFIX}sdk_state`;
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* SDK persistent state
|
|
25
|
+
*/
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Storage Manager class
|
|
29
|
+
*/
|
|
30
|
+
class StorageManager {
|
|
31
|
+
uploadQueue = [];
|
|
32
|
+
sdkState = {
|
|
33
|
+
lastSyncTimes: {},
|
|
34
|
+
deviceInfo: {}
|
|
35
|
+
};
|
|
36
|
+
isInitialized = false;
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Initialize storage manager
|
|
40
|
+
*/
|
|
41
|
+
async initialize() {
|
|
42
|
+
if (this.isInitialized) {
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
log.debug('Initializing StorageManager');
|
|
46
|
+
try {
|
|
47
|
+
// Load upload queue
|
|
48
|
+
const queueData = await _asyncStorage.default.getItem(UPLOAD_QUEUE_KEY);
|
|
49
|
+
if (queueData) {
|
|
50
|
+
this.uploadQueue = JSON.parse(queueData);
|
|
51
|
+
// Restore dates
|
|
52
|
+
this.uploadQueue = this.uploadQueue.map(task => ({
|
|
53
|
+
...task,
|
|
54
|
+
createdAt: new Date(task.createdAt),
|
|
55
|
+
updatedAt: new Date(task.updatedAt)
|
|
56
|
+
}));
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// Load SDK state
|
|
60
|
+
const stateData = await _asyncStorage.default.getItem(SDK_STATE_KEY);
|
|
61
|
+
if (stateData) {
|
|
62
|
+
this.sdkState = JSON.parse(stateData);
|
|
63
|
+
}
|
|
64
|
+
this.isInitialized = true;
|
|
65
|
+
log.info('StorageManager initialized', {
|
|
66
|
+
pendingUploads: this.uploadQueue.length
|
|
67
|
+
});
|
|
68
|
+
} catch (error) {
|
|
69
|
+
log.error('Failed to initialize storage', error);
|
|
70
|
+
// Continue with empty state
|
|
71
|
+
this.isInitialized = true;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// Upload Queue Methods
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Get all upload tasks
|
|
79
|
+
*/
|
|
80
|
+
getUploadQueue() {
|
|
81
|
+
return [...this.uploadQueue];
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Get pending upload tasks
|
|
86
|
+
*/
|
|
87
|
+
getPendingUploads() {
|
|
88
|
+
return this.uploadQueue.filter(task => task.status === 'pending' || task.status === 'uploading');
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Get failed upload tasks
|
|
93
|
+
*/
|
|
94
|
+
getFailedUploads() {
|
|
95
|
+
return this.uploadQueue.filter(task => task.status === 'failed');
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Add a task to the upload queue
|
|
100
|
+
*/
|
|
101
|
+
async addUploadTask(task) {
|
|
102
|
+
log.debug('Adding upload task', {
|
|
103
|
+
taskId: task.id,
|
|
104
|
+
recordingId: task.recordingId
|
|
105
|
+
});
|
|
106
|
+
this.uploadQueue.push(task);
|
|
107
|
+
await this.saveUploadQueue();
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Update an upload task
|
|
112
|
+
*/
|
|
113
|
+
async updateUploadTask(taskId, updates) {
|
|
114
|
+
const index = this.uploadQueue.findIndex(t => t.id === taskId);
|
|
115
|
+
if (index === -1) {
|
|
116
|
+
log.warn('Upload task not found', {
|
|
117
|
+
taskId
|
|
118
|
+
});
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
this.uploadQueue[index] = {
|
|
122
|
+
...this.uploadQueue[index],
|
|
123
|
+
...updates,
|
|
124
|
+
updatedAt: new Date()
|
|
125
|
+
};
|
|
126
|
+
await this.saveUploadQueue();
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* Update task status
|
|
131
|
+
*/
|
|
132
|
+
async updateTaskStatus(taskId, status, errorMessage) {
|
|
133
|
+
await this.updateUploadTask(taskId, {
|
|
134
|
+
status,
|
|
135
|
+
errorMessage
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Increment retry count for a task
|
|
141
|
+
*/
|
|
142
|
+
async incrementRetryCount(taskId) {
|
|
143
|
+
const task = this.uploadQueue.find(t => t.id === taskId);
|
|
144
|
+
if (task) {
|
|
145
|
+
await this.updateUploadTask(taskId, {
|
|
146
|
+
retryCount: task.retryCount + 1
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Remove a task from the queue
|
|
153
|
+
*/
|
|
154
|
+
async removeUploadTask(taskId) {
|
|
155
|
+
log.debug('Removing upload task', {
|
|
156
|
+
taskId
|
|
157
|
+
});
|
|
158
|
+
this.uploadQueue = this.uploadQueue.filter(t => t.id !== taskId);
|
|
159
|
+
await this.saveUploadQueue();
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* Clear all completed tasks
|
|
164
|
+
*/
|
|
165
|
+
async clearCompletedTasks() {
|
|
166
|
+
this.uploadQueue = this.uploadQueue.filter(t => t.status !== 'completed');
|
|
167
|
+
await this.saveUploadQueue();
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* Clear all tasks
|
|
172
|
+
*/
|
|
173
|
+
async clearAllTasks() {
|
|
174
|
+
this.uploadQueue = [];
|
|
175
|
+
await this.saveUploadQueue();
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* Get a specific upload task
|
|
180
|
+
*/
|
|
181
|
+
getUploadTask(taskId) {
|
|
182
|
+
return this.uploadQueue.find(t => t.id === taskId);
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* Save upload queue to storage
|
|
187
|
+
*/
|
|
188
|
+
async saveUploadQueue() {
|
|
189
|
+
try {
|
|
190
|
+
await _asyncStorage.default.setItem(UPLOAD_QUEUE_KEY, JSON.stringify(this.uploadQueue));
|
|
191
|
+
} catch (error) {
|
|
192
|
+
log.error('Failed to save upload queue', error);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
// SDK State Methods
|
|
197
|
+
|
|
198
|
+
/**
|
|
199
|
+
* Get last sync time for a device
|
|
200
|
+
*/
|
|
201
|
+
getLastSyncTime(deviceId) {
|
|
202
|
+
const timestamp = this.sdkState.lastSyncTimes[deviceId];
|
|
203
|
+
return timestamp ? new Date(timestamp) : null;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
/**
|
|
207
|
+
* Set last sync time for a device
|
|
208
|
+
*/
|
|
209
|
+
async setLastSyncTime(deviceId, time = new Date()) {
|
|
210
|
+
this.sdkState.lastSyncTimes[deviceId] = time.getTime();
|
|
211
|
+
await this.saveSdkState();
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
/**
|
|
215
|
+
* Get cached device info
|
|
216
|
+
*/
|
|
217
|
+
getDeviceInfo(deviceId) {
|
|
218
|
+
return this.sdkState.deviceInfo[deviceId];
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
/**
|
|
222
|
+
* Cache device info
|
|
223
|
+
*/
|
|
224
|
+
async setDeviceInfo(deviceId, info) {
|
|
225
|
+
this.sdkState.deviceInfo[deviceId] = info;
|
|
226
|
+
await this.saveSdkState();
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
/**
|
|
230
|
+
* Save SDK state to storage
|
|
231
|
+
*/
|
|
232
|
+
async saveSdkState() {
|
|
233
|
+
try {
|
|
234
|
+
await _asyncStorage.default.setItem(SDK_STATE_KEY, JSON.stringify(this.sdkState));
|
|
235
|
+
} catch (error) {
|
|
236
|
+
log.error('Failed to save SDK state', error);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
// Recording File Methods
|
|
241
|
+
// Note: For actual file storage, we'd need react-native-fs or similar
|
|
242
|
+
// For now, we'll store base64 encoded audio in AsyncStorage for small files
|
|
243
|
+
|
|
244
|
+
/**
|
|
245
|
+
* Save recording data locally
|
|
246
|
+
*/
|
|
247
|
+
async saveRecordingData(deviceId, recordingUuid, data) {
|
|
248
|
+
const key = `${STORAGE_PREFIX}recording:${deviceId}:${recordingUuid}`;
|
|
249
|
+
try {
|
|
250
|
+
// Store as base64 (not ideal for large files, but works for demo)
|
|
251
|
+
await _asyncStorage.default.setItem(key, data.toString('base64'));
|
|
252
|
+
log.debug('Saved recording data', {
|
|
253
|
+
deviceId,
|
|
254
|
+
recordingUuid,
|
|
255
|
+
size: data.length
|
|
256
|
+
});
|
|
257
|
+
return key;
|
|
258
|
+
} catch (error) {
|
|
259
|
+
log.error('Failed to save recording data', error);
|
|
260
|
+
throw error;
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
/**
|
|
265
|
+
* Load recording data
|
|
266
|
+
*/
|
|
267
|
+
async loadRecordingData(localPath) {
|
|
268
|
+
try {
|
|
269
|
+
const data = await _asyncStorage.default.getItem(localPath);
|
|
270
|
+
if (!data) {
|
|
271
|
+
throw new Error(`Recording not found: ${localPath}`);
|
|
272
|
+
}
|
|
273
|
+
return _buffer.Buffer.from(data, 'base64');
|
|
274
|
+
} catch (error) {
|
|
275
|
+
log.error('Failed to load recording data', error);
|
|
276
|
+
throw error;
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
/**
|
|
281
|
+
* Delete recording data
|
|
282
|
+
*/
|
|
283
|
+
async deleteRecordingData(localPath) {
|
|
284
|
+
try {
|
|
285
|
+
await _asyncStorage.default.removeItem(localPath);
|
|
286
|
+
log.debug('Deleted recording data', {
|
|
287
|
+
localPath
|
|
288
|
+
});
|
|
289
|
+
} catch (error) {
|
|
290
|
+
log.error('Failed to delete recording data', error);
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
/**
|
|
295
|
+
* Clear all SDK storage
|
|
296
|
+
*/
|
|
297
|
+
async clearAll() {
|
|
298
|
+
log.info('Clearing all SDK storage');
|
|
299
|
+
try {
|
|
300
|
+
const keys = await _asyncStorage.default.getAllKeys();
|
|
301
|
+
const botaKeys = keys.filter(k => k.startsWith(STORAGE_PREFIX));
|
|
302
|
+
await _asyncStorage.default.multiRemove(botaKeys);
|
|
303
|
+
this.uploadQueue = [];
|
|
304
|
+
this.sdkState = {
|
|
305
|
+
lastSyncTimes: {},
|
|
306
|
+
deviceInfo: {}
|
|
307
|
+
};
|
|
308
|
+
} catch (error) {
|
|
309
|
+
log.error('Failed to clear storage', error);
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
/**
|
|
314
|
+
* Clean up resources
|
|
315
|
+
*/
|
|
316
|
+
destroy() {
|
|
317
|
+
this.uploadQueue = [];
|
|
318
|
+
this.sdkState = {
|
|
319
|
+
lastSyncTimes: {},
|
|
320
|
+
deviceInfo: {}
|
|
321
|
+
};
|
|
322
|
+
this.isInitialized = false;
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
/**
|
|
327
|
+
* Generate a unique task ID
|
|
328
|
+
*/
|
|
329
|
+
exports.StorageManager = StorageManager;
|
|
330
|
+
function generateTaskId() {
|
|
331
|
+
return `task_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;
|
|
332
|
+
}
|
|
333
|
+
//# sourceMappingURL=StorageManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_asyncStorage","_interopRequireDefault","require","_buffer","_logger","e","__esModule","default","log","logger","tag","STORAGE_PREFIX","UPLOAD_QUEUE_KEY","SDK_STATE_KEY","StorageManager","uploadQueue","sdkState","lastSyncTimes","deviceInfo","isInitialized","initialize","debug","queueData","AsyncStorage","getItem","JSON","parse","map","task","createdAt","Date","updatedAt","stateData","info","pendingUploads","length","error","getUploadQueue","getPendingUploads","filter","status","getFailedUploads","addUploadTask","taskId","id","recordingId","push","saveUploadQueue","updateUploadTask","updates","index","findIndex","t","warn","updateTaskStatus","errorMessage","incrementRetryCount","find","retryCount","removeUploadTask","clearCompletedTasks","clearAllTasks","getUploadTask","setItem","stringify","getLastSyncTime","deviceId","timestamp","setLastSyncTime","time","getTime","saveSdkState","getDeviceInfo","setDeviceInfo","saveRecordingData","recordingUuid","data","key","toString","size","loadRecordingData","localPath","Error","Buffer","from","deleteRecordingData","removeItem","clearAll","keys","getAllKeys","botaKeys","k","startsWith","multiRemove","destroy","exports","generateTaskId","now","Math","random","substring"],"sourceRoot":"../../../src","sources":["storage/StorageManager.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
Object.defineProperty(exports, "StorageManager", {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
get: function () {
|
|
9
|
+
return _StorageManager.StorageManager;
|
|
10
|
+
}
|
|
11
|
+
});
|
|
12
|
+
Object.defineProperty(exports, "generateTaskId", {
|
|
13
|
+
enumerable: true,
|
|
14
|
+
get: function () {
|
|
15
|
+
return _StorageManager.generateTaskId;
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
var _StorageManager = require("./StorageManager");
|
|
19
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_StorageManager","require"],"sourceRoot":"../../../src","sources":["storage/index.ts"],"mappings":";;;;;;;;;;;;;;;;;AAIA,IAAAA,eAAA,GAAAC,OAAA","ignoreList":[]}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.S3Uploader = void 0;
|
|
7
|
+
var _errors = require("../utils/errors");
|
|
8
|
+
var _logger = require("../utils/logger");
|
|
9
|
+
/**
|
|
10
|
+
* S3 Uploader - Handles uploading audio files to S3 using pre-signed URLs
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
const log = _logger.logger.tag('S3Uploader');
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Upload progress callback
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Upload options
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* S3 Uploader class
|
|
25
|
+
*/
|
|
26
|
+
class S3Uploader {
|
|
27
|
+
/**
|
|
28
|
+
* Upload a file to S3 using a pre-signed URL
|
|
29
|
+
*/
|
|
30
|
+
async upload(data, uploadUrl, options = {}) {
|
|
31
|
+
const {
|
|
32
|
+
contentType = 'audio/opus',
|
|
33
|
+
onProgress,
|
|
34
|
+
abortSignal
|
|
35
|
+
} = options;
|
|
36
|
+
log.info('Starting S3 upload', {
|
|
37
|
+
size: data.length,
|
|
38
|
+
contentType
|
|
39
|
+
});
|
|
40
|
+
try {
|
|
41
|
+
// For React Native, we use fetch with the PUT method
|
|
42
|
+
const response = await fetch(uploadUrl, {
|
|
43
|
+
method: 'PUT',
|
|
44
|
+
headers: {
|
|
45
|
+
'Content-Type': contentType,
|
|
46
|
+
'Content-Length': data.length.toString()
|
|
47
|
+
},
|
|
48
|
+
body: data,
|
|
49
|
+
signal: abortSignal
|
|
50
|
+
});
|
|
51
|
+
if (!response.ok) {
|
|
52
|
+
const errorText = await response.text().catch(() => 'Unknown error');
|
|
53
|
+
log.error('S3 upload failed', undefined, {
|
|
54
|
+
status: response.status,
|
|
55
|
+
statusText: response.statusText,
|
|
56
|
+
error: errorText
|
|
57
|
+
});
|
|
58
|
+
if (response.status === 403) {
|
|
59
|
+
throw _errors.UploadError.urlExpired('');
|
|
60
|
+
}
|
|
61
|
+
throw new _errors.UploadError(`S3 upload failed: ${response.status} ${response.statusText}`, 'S3_UPLOAD_FAILED');
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// Report completion
|
|
65
|
+
onProgress?.(1.0);
|
|
66
|
+
log.info('S3 upload completed', {
|
|
67
|
+
size: data.length
|
|
68
|
+
});
|
|
69
|
+
} catch (error) {
|
|
70
|
+
if (error instanceof _errors.UploadError) {
|
|
71
|
+
throw error;
|
|
72
|
+
}
|
|
73
|
+
const err = error;
|
|
74
|
+
|
|
75
|
+
// Check for abort
|
|
76
|
+
if (err.name === 'AbortError') {
|
|
77
|
+
throw new _errors.UploadError('Upload was cancelled', 'UPLOAD_CANCELLED');
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// Check for network errors
|
|
81
|
+
if (err.message?.includes('Network request failed')) {
|
|
82
|
+
throw _errors.UploadError.networkUnavailable();
|
|
83
|
+
}
|
|
84
|
+
throw new _errors.UploadError(`Upload failed: ${err.message}`, 'UPLOAD_FAILED', undefined, err);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Upload a file in chunks (for larger files)
|
|
90
|
+
* Note: This requires multipart upload support from the pre-signed URL
|
|
91
|
+
*/
|
|
92
|
+
async uploadChunked(data, uploadUrl, options = {}) {
|
|
93
|
+
// For now, delegate to simple upload
|
|
94
|
+
// In production, you'd implement S3 multipart upload here
|
|
95
|
+
return this.upload(data, uploadUrl, options);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Notify the backend that upload is complete
|
|
100
|
+
*/
|
|
101
|
+
async notifyCompletion(completeUrl, recordingId, uploadToken) {
|
|
102
|
+
log.debug('Notifying upload completion', {
|
|
103
|
+
recordingId
|
|
104
|
+
});
|
|
105
|
+
try {
|
|
106
|
+
const response = await fetch(completeUrl, {
|
|
107
|
+
method: 'POST',
|
|
108
|
+
headers: {
|
|
109
|
+
'Content-Type': 'application/json',
|
|
110
|
+
Authorization: `Bearer ${uploadToken}`
|
|
111
|
+
},
|
|
112
|
+
body: JSON.stringify({
|
|
113
|
+
recording_id: recordingId
|
|
114
|
+
})
|
|
115
|
+
});
|
|
116
|
+
if (!response.ok) {
|
|
117
|
+
const errorText = await response.text().catch(() => 'Unknown error');
|
|
118
|
+
throw new _errors.UploadError(`Completion notification failed: ${response.status} - ${errorText}`, 'COMPLETION_FAILED');
|
|
119
|
+
}
|
|
120
|
+
log.info('Upload completion notified', {
|
|
121
|
+
recordingId
|
|
122
|
+
});
|
|
123
|
+
} catch (error) {
|
|
124
|
+
if (error instanceof _errors.UploadError) {
|
|
125
|
+
throw error;
|
|
126
|
+
}
|
|
127
|
+
const err = error;
|
|
128
|
+
throw _errors.UploadError.completionFailed('', err);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
exports.S3Uploader = S3Uploader;
|
|
133
|
+
//# sourceMappingURL=S3Uploader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_errors","require","_logger","log","logger","tag","S3Uploader","upload","data","uploadUrl","options","contentType","onProgress","abortSignal","info","size","length","response","fetch","method","headers","toString","body","signal","ok","errorText","text","catch","error","undefined","status","statusText","UploadError","urlExpired","err","name","message","includes","networkUnavailable","uploadChunked","notifyCompletion","completeUrl","recordingId","uploadToken","debug","Authorization","JSON","stringify","recording_id","completionFailed","exports"],"sourceRoot":"../../../src","sources":["upload/S3Uploader.ts"],"mappings":"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","ignoreList":[]}
|