@bota.dev/react-native-app-sdk 2.0.0-beta.0 → 2.0.0-beta.3
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 +66 -2
- package/android/build.gradle +1 -0
- package/android/src/main/java/dev/bota/sdk/reactnative/BotaDeviceSDKAndroidDiagnostics.kt +53 -0
- package/android/src/main/java/dev/bota/sdk/reactnative/BotaDeviceSDKAndroidLogs.kt +16 -0
- package/android/src/main/java/dev/bota/sdk/reactnative/BotaDeviceSDKAndroidRecordingUploads.kt +144 -14
- package/android/src/main/java/dev/bota/sdk/reactnative/BotaDeviceSDKAndroidRecordings.kt +150 -29
- package/android/src/main/java/dev/bota/sdk/reactnative/BotaDeviceSDKEncryptedUploadV2Materials.kt +27 -0
- package/android/src/main/java/dev/bota/sdk/reactnative/BotaDeviceSDKModule.kt +68 -3
- package/android/src/test/java/dev/bota/sdk/reactnative/BotaDeviceSDKAndroidLogsTest.kt +33 -0
- package/android/src/test/java/dev/bota/sdk/reactnative/BotaDeviceSDKAndroidRecordingUploadsTest.kt +135 -6
- package/android/src/test/java/dev/bota/sdk/reactnative/BotaDeviceSDKAndroidRecordingsTest.kt +236 -10
- package/generated/codegen-contract.json +495 -8
- package/ios/BotaDeviceSDK.mm +102 -0
- package/ios/BotaDeviceSDKAppleBridge.swift +126 -4
- package/ios/BotaDeviceSDKAppleDiagnostics.swift +40 -0
- package/ios/BotaDeviceSDKAppleLogs.swift +18 -0
- package/ios/BotaDeviceSDKAppleRecordingUploads.swift +138 -6
- package/ios/BotaDeviceSDKAppleRecordings.swift +113 -5
- package/ios/BotaDeviceSDKEncryptedUploadV2Materials.swift +40 -0
- package/lib/commonjs/BotaClient.js +13 -2
- package/lib/commonjs/BotaClient.js.map +1 -1
- package/lib/commonjs/ble/constants.js +5 -1
- package/lib/commonjs/ble/constants.js.map +1 -1
- package/lib/commonjs/ble/deviceDiagnostics.js +240 -0
- package/lib/commonjs/ble/deviceDiagnostics.js.map +1 -0
- package/lib/commonjs/client.js +163 -28
- package/lib/commonjs/client.js.map +1 -1
- package/lib/commonjs/index.js +15 -0
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/managers/DeviceManager.js +8 -0
- package/lib/commonjs/managers/DeviceManager.js.map +1 -1
- package/lib/commonjs/managers/NativeUploadQueue.js +386 -0
- package/lib/commonjs/managers/NativeUploadQueue.js.map +1 -0
- package/lib/commonjs/managers/RecordingManager.js +83 -102
- package/lib/commonjs/managers/RecordingManager.js.map +1 -1
- package/lib/commonjs/managers/uploadRecoveryMetadata.js +83 -0
- package/lib/commonjs/managers/uploadRecoveryMetadata.js.map +1 -0
- package/lib/commonjs/specs/NativeBotaDeviceSDK.js.map +1 -1
- package/lib/module/BotaClient.js +13 -2
- package/lib/module/BotaClient.js.map +1 -1
- package/lib/module/ble/constants.js +4 -0
- package/lib/module/ble/constants.js.map +1 -1
- package/lib/module/ble/deviceDiagnostics.js +234 -0
- package/lib/module/ble/deviceDiagnostics.js.map +1 -0
- package/lib/module/client.js +163 -28
- package/lib/module/client.js.map +1 -1
- package/lib/module/index.js +2 -0
- package/lib/module/index.js.map +1 -1
- package/lib/module/managers/DeviceManager.js +8 -0
- package/lib/module/managers/DeviceManager.js.map +1 -1
- package/lib/module/managers/NativeUploadQueue.js +380 -0
- package/lib/module/managers/NativeUploadQueue.js.map +1 -0
- package/lib/module/managers/RecordingManager.js +83 -102
- package/lib/module/managers/RecordingManager.js.map +1 -1
- package/lib/module/managers/uploadRecoveryMetadata.js +77 -0
- package/lib/module/managers/uploadRecoveryMetadata.js.map +1 -0
- package/lib/module/specs/NativeBotaDeviceSDK.js.map +1 -1
- package/lib/typescript/BotaClient.d.ts.map +1 -1
- package/lib/typescript/ble/constants.d.ts +4 -0
- package/lib/typescript/ble/constants.d.ts.map +1 -1
- package/lib/typescript/ble/deviceDiagnostics.d.ts +10 -0
- package/lib/typescript/ble/deviceDiagnostics.d.ts.map +1 -0
- package/lib/typescript/client.d.ts +18 -2
- package/lib/typescript/client.d.ts.map +1 -1
- package/lib/typescript/index.d.ts +6 -4
- package/lib/typescript/index.d.ts.map +1 -1
- package/lib/typescript/managers/DeviceManager.d.ts +3 -1
- package/lib/typescript/managers/DeviceManager.d.ts.map +1 -1
- package/lib/typescript/managers/NativeUploadQueue.d.ts +41 -0
- package/lib/typescript/managers/NativeUploadQueue.d.ts.map +1 -0
- package/lib/typescript/managers/RecordingManager.d.ts +3 -8
- package/lib/typescript/managers/RecordingManager.d.ts.map +1 -1
- package/lib/typescript/managers/types.d.ts +6 -1
- package/lib/typescript/managers/types.d.ts.map +1 -1
- package/lib/typescript/managers/uploadRecoveryMetadata.d.ts +6 -0
- package/lib/typescript/managers/uploadRecoveryMetadata.d.ts.map +1 -0
- package/lib/typescript/models/Device.d.ts +42 -0
- package/lib/typescript/models/Device.d.ts.map +1 -1
- package/lib/typescript/models/Recording.d.ts +47 -0
- package/lib/typescript/models/Recording.d.ts.map +1 -1
- package/lib/typescript/models/Status.d.ts +5 -1
- package/lib/typescript/models/Status.d.ts.map +1 -1
- package/lib/typescript/specs/NativeBotaDeviceSDK.d.ts +61 -0
- package/lib/typescript/specs/NativeBotaDeviceSDK.d.ts.map +1 -1
- package/package.json +1 -1
- package/scripts/bota_device_sdk_spm_workaround.rb +26 -15
- package/src/BotaClient.ts +13 -3
- package/src/ble/constants.ts +5 -0
- package/src/ble/deviceDiagnostics.ts +238 -0
- package/src/client.ts +166 -18
- package/src/index.ts +12 -0
- package/src/managers/DeviceManager.ts +11 -0
- package/src/managers/NativeUploadQueue.ts +330 -0
- package/src/managers/RecordingManager.ts +83 -116
- package/src/managers/types.ts +7 -1
- package/src/managers/uploadRecoveryMetadata.ts +59 -0
- package/src/models/Device.ts +43 -0
- package/src/models/Recording.ts +52 -0
- package/src/models/Status.ts +5 -1
- package/src/specs/NativeBotaDeviceSDK.ts +56 -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":[]}
|