@bota.dev/react-native-app-sdk 2.0.0-beta.1 → 2.0.0-beta.11

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 (152) hide show
  1. package/README.md +115 -4
  2. package/android/build.gradle +1 -0
  3. package/android/src/main/java/dev/bota/sdk/reactnative/BotaDeviceSDKAndroidDevices.kt +22 -0
  4. package/android/src/main/java/dev/bota/sdk/reactnative/BotaDeviceSDKAndroidDiagnostics.kt +53 -0
  5. package/android/src/main/java/dev/bota/sdk/reactnative/BotaDeviceSDKAndroidLogs.kt +16 -0
  6. package/android/src/main/java/dev/bota/sdk/reactnative/BotaDeviceSDKAndroidRecordingUploads.kt +144 -14
  7. package/android/src/main/java/dev/bota/sdk/reactnative/BotaDeviceSDKAndroidRecordings.kt +150 -29
  8. package/android/src/main/java/dev/bota/sdk/reactnative/BotaDeviceSDKEncryptedUploadV2Materials.kt +27 -0
  9. package/android/src/main/java/dev/bota/sdk/reactnative/BotaDeviceSDKModule.kt +86 -3
  10. package/android/src/main/java/dev/bota/sdk/reactnative/BotaDeviceSDKPackage.kt +9 -0
  11. package/android/src/main/java/dev/bota/sdk/reactnative/upload/BotaUploadV2BackendModule.kt +66 -0
  12. package/android/src/main/java/dev/bota/sdk/reactnative/upload/NativeUpload.kt +400 -0
  13. package/android/src/main/java/dev/bota/sdk/reactnative/upload/UploadHttp.kt +158 -0
  14. package/android/src/main/java/dev/bota/sdk/reactnative/upload/UploadJournal.kt +112 -0
  15. package/android/src/main/java/dev/bota/sdk/reactnative/upload/UploadModels.kt +171 -0
  16. package/android/src/test/java/dev/bota/sdk/reactnative/BotaDeviceSDKAndroidDevicesTest.kt +35 -0
  17. package/android/src/test/java/dev/bota/sdk/reactnative/BotaDeviceSDKAndroidLogsTest.kt +33 -0
  18. package/android/src/test/java/dev/bota/sdk/reactnative/BotaDeviceSDKAndroidRecordingUploadsTest.kt +135 -6
  19. package/android/src/test/java/dev/bota/sdk/reactnative/BotaDeviceSDKAndroidRecordingsTest.kt +236 -10
  20. package/generated/codegen-contract.json +751 -32
  21. package/ios/BotaDeviceSDK.mm +114 -0
  22. package/ios/BotaDeviceSDKAppleBridge.swift +141 -4
  23. package/ios/BotaDeviceSDKAppleDevices.swift +11 -0
  24. package/ios/BotaDeviceSDKAppleDiagnostics.swift +40 -0
  25. package/ios/BotaDeviceSDKAppleLogs.swift +18 -0
  26. package/ios/BotaDeviceSDKAppleRecordingUploads.swift +138 -6
  27. package/ios/BotaDeviceSDKAppleRecordings.swift +113 -5
  28. package/ios/BotaDeviceSDKEncryptedUploadV2Materials.swift +40 -0
  29. package/ios/BotaUploadV2Backend.mm +49 -0
  30. package/ios/UploadBackend/BotaUploadV2BackendBridge.swift +98 -0
  31. package/ios/UploadBackend/UploadCoordinator.swift +84 -0
  32. package/ios/UploadBackend/UploadHTTP.swift +82 -0
  33. package/ios/UploadBackend/UploadJournal.swift +187 -0
  34. package/ios/UploadBackend/UploadModels.swift +273 -0
  35. package/ios/UploadBackend/UploadOperation.swift +391 -0
  36. package/lib/commonjs/BotaClient.js +16 -2
  37. package/lib/commonjs/BotaClient.js.map +1 -1
  38. package/lib/commonjs/ble/constants.js +5 -1
  39. package/lib/commonjs/ble/constants.js.map +1 -1
  40. package/lib/commonjs/ble/deviceDiagnostics.js +240 -0
  41. package/lib/commonjs/ble/deviceDiagnostics.js.map +1 -0
  42. package/lib/commonjs/client.js +183 -28
  43. package/lib/commonjs/client.js.map +1 -1
  44. package/lib/commonjs/clientPresence.js +26 -0
  45. package/lib/commonjs/clientPresence.js.map +1 -0
  46. package/lib/commonjs/encryptedUploadV2Backend.js +200 -0
  47. package/lib/commonjs/encryptedUploadV2Backend.js.map +1 -0
  48. package/lib/commonjs/index.js +34 -0
  49. package/lib/commonjs/index.js.map +1 -1
  50. package/lib/commonjs/managers/DeviceManager.js +23 -0
  51. package/lib/commonjs/managers/DeviceManager.js.map +1 -1
  52. package/lib/commonjs/managers/NativeUploadQueue.js +386 -0
  53. package/lib/commonjs/managers/NativeUploadQueue.js.map +1 -0
  54. package/lib/commonjs/managers/RecordingManager.js +83 -102
  55. package/lib/commonjs/managers/RecordingManager.js.map +1 -1
  56. package/lib/commonjs/managers/uploadRecoveryMetadata.js +83 -0
  57. package/lib/commonjs/managers/uploadRecoveryMetadata.js.map +1 -0
  58. package/lib/commonjs/sdkIdentity.js +10 -0
  59. package/lib/commonjs/sdkIdentity.js.map +1 -0
  60. package/lib/commonjs/specs/NativeBotaDeviceSDK.js.map +1 -1
  61. package/lib/commonjs/specs/NativeBotaUploadV2Backend.js +11 -0
  62. package/lib/commonjs/specs/NativeBotaUploadV2Backend.js.map +1 -0
  63. package/lib/commonjs/uploadRecovery.js +68 -0
  64. package/lib/commonjs/uploadRecovery.js.map +1 -0
  65. package/lib/module/BotaClient.js +16 -2
  66. package/lib/module/BotaClient.js.map +1 -1
  67. package/lib/module/ble/constants.js +4 -0
  68. package/lib/module/ble/constants.js.map +1 -1
  69. package/lib/module/ble/deviceDiagnostics.js +234 -0
  70. package/lib/module/ble/deviceDiagnostics.js.map +1 -0
  71. package/lib/module/client.js +183 -28
  72. package/lib/module/client.js.map +1 -1
  73. package/lib/module/clientPresence.js +22 -0
  74. package/lib/module/clientPresence.js.map +1 -0
  75. package/lib/module/encryptedUploadV2Backend.js +196 -0
  76. package/lib/module/encryptedUploadV2Backend.js.map +1 -0
  77. package/lib/module/index.js +7 -0
  78. package/lib/module/index.js.map +1 -1
  79. package/lib/module/managers/DeviceManager.js +23 -0
  80. package/lib/module/managers/DeviceManager.js.map +1 -1
  81. package/lib/module/managers/NativeUploadQueue.js +380 -0
  82. package/lib/module/managers/NativeUploadQueue.js.map +1 -0
  83. package/lib/module/managers/RecordingManager.js +83 -102
  84. package/lib/module/managers/RecordingManager.js.map +1 -1
  85. package/lib/module/managers/uploadRecoveryMetadata.js +77 -0
  86. package/lib/module/managers/uploadRecoveryMetadata.js.map +1 -0
  87. package/lib/module/sdkIdentity.js +6 -0
  88. package/lib/module/sdkIdentity.js.map +1 -0
  89. package/lib/module/specs/NativeBotaDeviceSDK.js.map +1 -1
  90. package/lib/module/specs/NativeBotaUploadV2Backend.js +9 -0
  91. package/lib/module/specs/NativeBotaUploadV2Backend.js.map +1 -0
  92. package/lib/module/uploadRecovery.js +64 -0
  93. package/lib/module/uploadRecovery.js.map +1 -0
  94. package/lib/typescript/BotaClient.d.ts +2 -0
  95. package/lib/typescript/BotaClient.d.ts.map +1 -1
  96. package/lib/typescript/ble/constants.d.ts +4 -0
  97. package/lib/typescript/ble/constants.d.ts.map +1 -1
  98. package/lib/typescript/ble/deviceDiagnostics.d.ts +10 -0
  99. package/lib/typescript/ble/deviceDiagnostics.d.ts.map +1 -0
  100. package/lib/typescript/client.d.ts +24 -3
  101. package/lib/typescript/client.d.ts.map +1 -1
  102. package/lib/typescript/clientPresence.d.ts +26 -0
  103. package/lib/typescript/clientPresence.d.ts.map +1 -0
  104. package/lib/typescript/encryptedUploadV2Backend.d.ts +41 -0
  105. package/lib/typescript/encryptedUploadV2Backend.d.ts.map +1 -0
  106. package/lib/typescript/index.d.ts +13 -4
  107. package/lib/typescript/index.d.ts.map +1 -1
  108. package/lib/typescript/managers/DeviceManager.d.ts +5 -1
  109. package/lib/typescript/managers/DeviceManager.d.ts.map +1 -1
  110. package/lib/typescript/managers/NativeUploadQueue.d.ts +41 -0
  111. package/lib/typescript/managers/NativeUploadQueue.d.ts.map +1 -0
  112. package/lib/typescript/managers/RecordingManager.d.ts +3 -8
  113. package/lib/typescript/managers/RecordingManager.d.ts.map +1 -1
  114. package/lib/typescript/managers/types.d.ts +6 -1
  115. package/lib/typescript/managers/types.d.ts.map +1 -1
  116. package/lib/typescript/managers/uploadRecoveryMetadata.d.ts +6 -0
  117. package/lib/typescript/managers/uploadRecoveryMetadata.d.ts.map +1 -0
  118. package/lib/typescript/models/Device.d.ts +42 -0
  119. package/lib/typescript/models/Device.d.ts.map +1 -1
  120. package/lib/typescript/models/Recording.d.ts +47 -0
  121. package/lib/typescript/models/Recording.d.ts.map +1 -1
  122. package/lib/typescript/models/Status.d.ts +5 -1
  123. package/lib/typescript/models/Status.d.ts.map +1 -1
  124. package/lib/typescript/sdkIdentity.d.ts +3 -0
  125. package/lib/typescript/sdkIdentity.d.ts.map +1 -0
  126. package/lib/typescript/specs/NativeBotaDeviceSDK.d.ts +70 -0
  127. package/lib/typescript/specs/NativeBotaDeviceSDK.d.ts.map +1 -1
  128. package/lib/typescript/specs/NativeBotaUploadV2Backend.d.ts +18 -0
  129. package/lib/typescript/specs/NativeBotaUploadV2Backend.d.ts.map +1 -0
  130. package/lib/typescript/uploadRecovery.d.ts +27 -0
  131. package/lib/typescript/uploadRecovery.d.ts.map +1 -0
  132. package/package.json +1 -1
  133. package/scripts/bota_device_sdk_spm_workaround.rb +26 -15
  134. package/src/BotaClient.ts +17 -3
  135. package/src/ble/constants.ts +5 -0
  136. package/src/ble/deviceDiagnostics.ts +238 -0
  137. package/src/client.ts +189 -18
  138. package/src/clientPresence.ts +33 -0
  139. package/src/encryptedUploadV2Backend.ts +171 -0
  140. package/src/index.ts +24 -0
  141. package/src/managers/DeviceManager.ts +23 -0
  142. package/src/managers/NativeUploadQueue.ts +330 -0
  143. package/src/managers/RecordingManager.ts +83 -116
  144. package/src/managers/types.ts +7 -1
  145. package/src/managers/uploadRecoveryMetadata.ts +59 -0
  146. package/src/models/Device.ts +43 -0
  147. package/src/models/Recording.ts +52 -0
  148. package/src/models/Status.ts +5 -1
  149. package/src/sdkIdentity.ts +3 -0
  150. package/src/specs/NativeBotaDeviceSDK.ts +66 -0
  151. package/src/specs/NativeBotaUploadV2Backend.ts +19 -0
  152. package/src/uploadRecovery.ts +66 -0
@@ -0,0 +1,380 @@
1
+ "use strict";
2
+
3
+ import EventEmitter from 'eventemitter3';
4
+ import { persistedUploadQueue, restoreUploadQueue } from './uploadRecoveryMetadata';
5
+ const journalOperations = new WeakMap();
6
+ const journalOwners = new WeakMap();
7
+ const retryDelays = [30_000, 120_000, 600_000, 3_600_000, 14_400_000];
8
+ const cancelled = () => new Error('Upload cancelled');
9
+ const dispose = info => {
10
+ try {
11
+ info?.dispose?.();
12
+ } catch {/* Cleanup cannot change an acknowledged result. */}
13
+ };
14
+ /** Races application callbacks, not native teardown. Late credentials still release their lease. */
15
+ const abortable = (promise, signal, late) => new Promise((resolve, reject) => {
16
+ let settled = false;
17
+ const abort = () => {
18
+ if (!settled) {
19
+ settled = true;
20
+ reject(cancelled());
21
+ }
22
+ };
23
+ signal.addEventListener('abort', abort, {
24
+ once: true
25
+ });
26
+ if (signal.aborted) abort();
27
+ void promise.then(value => {
28
+ signal.removeEventListener('abort', abort);
29
+ if (settled) {
30
+ late?.(value);
31
+ return;
32
+ }
33
+ settled = true;
34
+ resolve(value);
35
+ }, error => {
36
+ signal.removeEventListener('abort', abort);
37
+ if (!settled) {
38
+ settled = true;
39
+ reject(error);
40
+ }
41
+ });
42
+ });
43
+
44
+ /** Only metadata crosses this owner. Native hosts retain and upload every byte. */
45
+ export class NativeUploadQueue extends EventEmitter {
46
+ tasks = [];
47
+ active = new Map();
48
+ credentials = new Map();
49
+ cancelledTasks = new Set();
50
+ paused = false;
51
+ destroyed = false;
52
+ initialized = false;
53
+ constructor(client, provider) {
54
+ super();
55
+ this.client = client;
56
+ this.provider = provider;
57
+ }
58
+ initialize() {
59
+ if (this.initialization) return this.initialization;
60
+ if (this.destroyed) return Promise.reject(cancelled());
61
+ const owner = journalOwners.get(this.client);
62
+ if (owner && owner !== this) return Promise.reject(new Error('Upload recovery journal is already owned by another RecordingManager'));
63
+ journalOwners.set(this.client, this);
64
+ this.initialization = this.serialize(async () => {
65
+ this.checkAlive();
66
+ const loaded = await this.client.loadUploadQueue();
67
+ this.checkAlive();
68
+ const restored = restoreUploadQueue(loaded);
69
+ if (restored.length > 0) await this.client.saveUploadQueue(restored);
70
+ this.checkAlive();
71
+ this.tasks = restored;
72
+ this.initialized = true;
73
+ }).then(() => {
74
+ for (const task of this.tasks.filter(value => value.status === 'completed')) {
75
+ void this.release(task).catch(() => undefined);
76
+ }
77
+ this.schedule();
78
+ }).catch(error => {
79
+ if (journalOwners.get(this.client) === this) journalOwners.delete(this.client);
80
+ throw error;
81
+ });
82
+ return this.initialization;
83
+ }
84
+ all() {
85
+ return this.tasks.map(task => ({
86
+ ...task,
87
+ createdAt: new Date(task.createdAt),
88
+ updatedAt: new Date(task.updatedAt)
89
+ }));
90
+ }
91
+ get(id) {
92
+ return this.all().find(task => task.id === id);
93
+ }
94
+ async add(task, info) {
95
+ await this.mutate(tasks => [...tasks, ...persistedUploadQueue([task])]);
96
+ this.credentials.set(task.id, info);
97
+ }
98
+ offerCredentials(id, info) {
99
+ if (this.active.has(id) || this.get(id)?.status === 'completed' || this.paused) return false;
100
+ this.discardCredentials(id);
101
+ this.credentials.set(id, info);
102
+ return true;
103
+ }
104
+ async update(id, patch, check) {
105
+ await this.mutate(tasks => {
106
+ check?.();
107
+ if (!tasks.some(task => task.id === id) || this.cancelledTasks.has(id)) throw cancelled();
108
+ return tasks.map(task => task.id === id ? {
109
+ ...task,
110
+ ...patch,
111
+ updatedAt: new Date()
112
+ } : task);
113
+ });
114
+ const info = this.credentials.get(id);
115
+ if (info && patch.relayUpload === false) this.credentials.set(id, {
116
+ ...info,
117
+ relay: undefined
118
+ });
119
+ }
120
+ run(id, onProgress) {
121
+ if (this.active.has(id)) return this.active.get(id).promise;
122
+ if (this.get(id)?.status === 'completed') return Promise.resolve();
123
+ if (this.paused || this.destroyed || this.cancelledTasks.has(id)) return Promise.reject(cancelled());
124
+ const attempt = {
125
+ controller: new AbortController(),
126
+ nativeId: `${id}_${Date.now()}_${Math.random().toString(36).slice(2)}`,
127
+ promise: Promise.resolve()
128
+ };
129
+ this.active.set(id, attempt);
130
+ attempt.promise = this.perform(id, attempt, onProgress).finally(() => {
131
+ if (this.active.get(id) === attempt) this.active.delete(id);
132
+ this.schedule();
133
+ });
134
+ return attempt.promise;
135
+ }
136
+ async perform(id, attempt, onProgress) {
137
+ const signal = attempt.controller.signal;
138
+ const check = () => {
139
+ if (this.destroyed || signal.aborted || this.cancelledTasks.has(id) || !this.get(id) || this.active.get(id) !== attempt) throw cancelled();
140
+ };
141
+ let info;
142
+ let hostAbort;
143
+ let initialSignal;
144
+ const initialAbort = () => attempt.controller.abort();
145
+ let nativeStarted = false;
146
+ let nativeCancellation;
147
+ const cancelNative = () => {
148
+ if (nativeStarted && !nativeCancellation) {
149
+ nativeCancellation = this.client.cancelRecordingUpload(attempt.nativeId);
150
+ void nativeCancellation.catch(() => undefined);
151
+ }
152
+ };
153
+ signal.addEventListener('abort', cancelNative);
154
+ try {
155
+ check();
156
+ const task = this.get(id);
157
+ info = this.credentials.get(id);
158
+ this.credentials.delete(id);
159
+ initialSignal = info?.signal;
160
+ initialSignal?.addEventListener('abort', initialAbort, {
161
+ once: true
162
+ });
163
+ if (initialSignal?.aborted) initialAbort();
164
+ check();
165
+ if (info?.expiresAt && info.expiresAt.getTime() <= Date.now() && !info.alreadyUploaded && this.provider && !info.signal?.aborted) {
166
+ dispose(info);
167
+ info = undefined;
168
+ }
169
+ if (!info) {
170
+ if (!this.provider || !task.recordingUuid) throw new Error('Upload recovery requires a provider and recordingUuid');
171
+ info = await abortable(Promise.resolve().then(() => {
172
+ check();
173
+ return this.provider({
174
+ taskId: id,
175
+ recordingId: task.recordingId,
176
+ deviceId: task.deviceId,
177
+ recordingUuid: task.recordingUuid,
178
+ recoveryScope: task.recoveryScope,
179
+ fileSizeBytes: task.fileSizeBytes,
180
+ relayUpload: !!task.relayUpload,
181
+ contentType: task.contentType,
182
+ contentSha256: task.contentSha256,
183
+ signal
184
+ });
185
+ }), signal, dispose);
186
+ }
187
+ check();
188
+ if (!info) {
189
+ await this.update(id, {
190
+ status: 'pending',
191
+ nextAttemptAt: Date.now() + 30_000
192
+ }, check);
193
+ throw new Error('Upload waiting for its original account');
194
+ }
195
+ if (info.recordingId !== task.recordingId || info.recoveryScope !== task.recoveryScope) {
196
+ throw new Error('Upload recovery identity changed');
197
+ }
198
+ if (!info.alreadyUploaded && !!info.relay !== !!task.relayUpload) throw new Error('Upload recovery route changed');
199
+ hostAbort = () => attempt.controller.abort();
200
+ info.signal?.addEventListener('abort', hostAbort, {
201
+ once: true
202
+ });
203
+ if (info.signal?.aborted) hostAbort();
204
+ check();
205
+ if (info.expiresAt && info.expiresAt.getTime() <= Date.now() && !info.alreadyUploaded) throw new Error('Upload credentials expired');
206
+ await this.update(id, {
207
+ status: 'uploading',
208
+ errorMessage: undefined,
209
+ nextAttemptAt: undefined
210
+ }, check);
211
+ check();
212
+ this.emit('uploadStarted', id);
213
+ check();
214
+ if (!info.alreadyUploaded) {
215
+ nativeStarted = true;
216
+ await this.client.uploadRecordingFile({
217
+ ...task,
218
+ id: attempt.nativeId,
219
+ uploadUrl: info.uploadUrl,
220
+ contentType: info.contentType ?? task.contentType,
221
+ uploadToken: info.complete ? undefined : info.uploadToken,
222
+ completeUrl: info.complete ? undefined : info.completeUrl,
223
+ relay: info.relay
224
+ }, value => {
225
+ try {
226
+ check();
227
+ } catch {
228
+ return;
229
+ }
230
+ onProgress?.(value);
231
+ this.emit('uploadProgress', id, value.totalBytes > 0 ? Math.min(value.completedBytes / value.totalBytes, 1) : 0);
232
+ });
233
+ check();
234
+ }
235
+ if (info.complete) {
236
+ if (task.fileSizeBytes === undefined) throw new Error('Upload completion requires known file size');
237
+ await abortable(Promise.resolve().then(() => {
238
+ check();
239
+ return info.complete({
240
+ fileSizeBytes: task.fileSizeBytes,
241
+ contentSha256: task.contentSha256,
242
+ signal
243
+ });
244
+ }), signal);
245
+ } else if (info.alreadyUploaded || this.provider && !info.relay && !(info.completeUrl && info.uploadToken)) {
246
+ throw new Error('Recoverable upload requires durable host completion acknowledgement');
247
+ }
248
+ check();
249
+ await this.update(id, {
250
+ status: 'completed',
251
+ errorMessage: undefined,
252
+ nextAttemptAt: undefined
253
+ }, check);
254
+ check();
255
+ await this.release(this.get(id)).catch(() => undefined);
256
+ check();
257
+ this.emit('uploadCompleted', id, task.recordingId);
258
+ } catch (error) {
259
+ if (!this.destroyed && !this.cancelledTasks.has(id) && this.get(id)?.status !== 'completed') {
260
+ const task = this.get(id);
261
+ const parked = info === null || signal.aborted;
262
+ const retry = !!this.provider && task.retryCount < 6 && Date.now() - task.createdAt.getTime() < 86_400_000;
263
+ await this.update(id, {
264
+ status: parked || retry ? 'pending' : 'failed',
265
+ retryCount: task.retryCount + (parked ? 0 : 1),
266
+ nextAttemptAt: parked ? Date.now() + 30_000 : retry ? Date.now() + retryDelays[Math.min(task.retryCount, 4)] : undefined,
267
+ errorMessage: parked ? 'Upload waiting for its original account' : 'Upload attempt failed'
268
+ }).catch(() => {
269
+ this.pause();
270
+ });
271
+ if (!this.destroyed) this.emit('uploadFailed', id, new Error(parked ? 'Upload paused' : 'Upload attempt failed'));
272
+ }
273
+ throw error;
274
+ } finally {
275
+ signal.removeEventListener('abort', cancelNative);
276
+ initialSignal?.removeEventListener('abort', initialAbort);
277
+ if (hostAbort) info?.signal?.removeEventListener('abort', hostAbort);
278
+ // Credential-only legacy callers can explicitly retry during this process.
279
+ if (!this.provider && info && !info.dispose && !info.signal && !this.destroyed && !this.cancelledTasks.has(id) && this.get(id)?.status !== 'completed') this.credentials.set(id, info);
280
+ dispose(info);
281
+ await nativeCancellation?.catch(() => {
282
+ this.pause();
283
+ });
284
+ }
285
+ }
286
+ async release(task) {
287
+ this.checkAlive();
288
+ await this.client.releaseRecordingFile(task.id, task.localPath);
289
+ }
290
+ async cancel(id) {
291
+ this.cancelledTasks.add(id);
292
+ const active = this.active.get(id);
293
+ active?.controller.abort();
294
+ this.discardCredentials(id);
295
+ if (!active) await this.client.cancelRecordingUpload(id);
296
+ await this.mutate(tasks => tasks.filter(task => task.id !== id));
297
+ }
298
+ discardCredentials(id) {
299
+ const credential = this.credentials.get(id);
300
+ this.credentials.delete(id);
301
+ dispose(credential);
302
+ }
303
+ async clearCompleted() {
304
+ const snapshot = this.all().filter(value => value.status === 'completed');
305
+ for (const task of snapshot) await this.release(task);
306
+ await this.mutate(tasks => tasks.filter(task => !snapshot.some(released => task.status === 'completed' && task.id === released.id && task.localPath === released.localPath && task.recordingId === released.recordingId && task.deviceId === released.deviceId && task.recordingUuid === released.recordingUuid && task.recoveryScope === released.recoveryScope)));
307
+ }
308
+ async clearAll() {
309
+ for (const task of this.all()) await this.cancel(task.id);
310
+ }
311
+ async retryFailed() {
312
+ const retry = this.all().filter(task => (task.status === 'failed' || task.status === 'pending' && task.nextAttemptAt) && !this.active.has(task.id) && !!task.localPath);
313
+ for (const task of retry) await this.update(task.id, {
314
+ status: 'pending',
315
+ retryCount: 0,
316
+ nextAttemptAt: undefined,
317
+ createdAt: new Date()
318
+ });
319
+ if (!this.paused) for (const task of retry) await this.run(task.id).catch(() => undefined);
320
+ }
321
+ pause() {
322
+ this.paused = true;
323
+ if (this.timer) clearTimeout(this.timer);
324
+ }
325
+ resume() {
326
+ this.checkAlive();
327
+ this.paused = false;
328
+ this.schedule();
329
+ }
330
+ destroy() {
331
+ if (this.destroyed) return;
332
+ this.destroyed = true;
333
+ if (journalOwners.get(this.client) === this) {
334
+ // New owners must read only after old persistence and native stop have settled.
335
+ const stopped = this.client.destroyCompatibilityOperations();
336
+ void stopped.catch(() => undefined);
337
+ void this.serialize(() => stopped).catch(() => undefined);
338
+ journalOwners.delete(this.client);
339
+ }
340
+ this.pause();
341
+ for (const attempt of this.active.values()) attempt.controller.abort();
342
+ for (const info of this.credentials.values()) dispose(info);
343
+ this.credentials.clear();
344
+ this.removeAllListeners();
345
+ }
346
+ schedule() {
347
+ if (!this.initialized || this.destroyed || this.paused) return;
348
+ if (this.timer) clearTimeout(this.timer);
349
+ let wake = Infinity;
350
+ for (const task of this.tasks) {
351
+ if (task.status !== 'pending' || !task.localPath || this.active.has(task.id) || this.cancelledTasks.has(task.id) || !this.provider && !this.credentials.has(task.id)) continue;
352
+ if ((task.nextAttemptAt ?? 0) > Date.now()) {
353
+ wake = Math.min(wake, task.nextAttemptAt);
354
+ continue;
355
+ }
356
+ if (this.active.size >= 2) continue;
357
+ void this.run(task.id).catch(() => undefined);
358
+ }
359
+ if (Number.isFinite(wake)) this.timer = setTimeout(() => this.schedule(), Math.max(1, wake - Date.now()));
360
+ }
361
+ serialize(operation) {
362
+ const next = (journalOperations.get(this.client) ?? Promise.resolve()).catch(() => undefined).then(operation);
363
+ journalOperations.set(this.client, next.catch(() => undefined));
364
+ return next;
365
+ }
366
+ mutate(change) {
367
+ return this.serialize(async () => {
368
+ this.checkAlive();
369
+ const next = change(this.tasks);
370
+ await this.client.saveUploadQueue(persistedUploadQueue(next));
371
+ this.checkAlive();
372
+ this.tasks = next;
373
+ this.emit('queueUpdated', this.all());
374
+ });
375
+ }
376
+ checkAlive() {
377
+ if (this.destroyed) throw cancelled();
378
+ }
379
+ }
380
+ //# sourceMappingURL=NativeUploadQueue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["EventEmitter","persistedUploadQueue","restoreUploadQueue","journalOperations","WeakMap","journalOwners","retryDelays","cancelled","Error","dispose","info","abortable","promise","signal","late","Promise","resolve","reject","settled","abort","addEventListener","once","aborted","then","value","removeEventListener","error","NativeUploadQueue","tasks","active","Map","credentials","cancelledTasks","Set","paused","destroyed","initialized","constructor","client","provider","initialize","initialization","owner","get","set","serialize","checkAlive","loaded","loadUploadQueue","restored","length","saveUploadQueue","task","filter","status","release","catch","undefined","schedule","delete","all","map","createdAt","Date","updatedAt","id","find","add","mutate","offerCredentials","has","discardCredentials","update","patch","check","some","relayUpload","relay","run","onProgress","attempt","controller","AbortController","nativeId","now","Math","random","toString","slice","perform","finally","hostAbort","initialSignal","initialAbort","nativeStarted","nativeCancellation","cancelNative","cancelRecordingUpload","expiresAt","getTime","alreadyUploaded","recordingUuid","taskId","recordingId","deviceId","recoveryScope","fileSizeBytes","contentType","contentSha256","nextAttemptAt","errorMessage","emit","uploadRecordingFile","uploadUrl","uploadToken","complete","completeUrl","totalBytes","min","completedBytes","parked","retry","retryCount","pause","releaseRecordingFile","localPath","cancel","credential","clearCompleted","snapshot","released","clearAll","retryFailed","timer","clearTimeout","resume","destroy","stopped","destroyCompatibilityOperations","values","clear","removeAllListeners","wake","Infinity","size","Number","isFinite","setTimeout","max","operation","next","change"],"sourceRoot":"../../../src","sources":["managers/NativeUploadQueue.ts"],"mappings":"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","ignoreList":[]}