@bota.dev/react-native-app-sdk 2.0.0-beta.0
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/BotaDeviceSDK.podspec +55 -0
- package/LICENSE +21 -0
- package/README.md +101 -0
- package/android/build.gradle +76 -0
- package/android/src/main/AndroidManifest.xml +1 -0
- package/android/src/main/java/dev/bota/sdk/reactnative/BotaDeviceSDKAndroidDevices.kt +172 -0
- package/android/src/main/java/dev/bota/sdk/reactnative/BotaDeviceSDKAndroidLifecycle.kt +100 -0
- package/android/src/main/java/dev/bota/sdk/reactnative/BotaDeviceSDKAndroidLogs.kt +82 -0
- package/android/src/main/java/dev/bota/sdk/reactnative/BotaDeviceSDKAndroidModels.kt +476 -0
- package/android/src/main/java/dev/bota/sdk/reactnative/BotaDeviceSDKAndroidOTA.kt +58 -0
- package/android/src/main/java/dev/bota/sdk/reactnative/BotaDeviceSDKAndroidRecordingUploads.kt +180 -0
- package/android/src/main/java/dev/bota/sdk/reactnative/BotaDeviceSDKAndroidRecordings.kt +751 -0
- package/android/src/main/java/dev/bota/sdk/reactnative/BotaDeviceSDKAndroidSecurity.kt +509 -0
- package/android/src/main/java/dev/bota/sdk/reactnative/BotaDeviceSDKAndroidWiFi.kt +125 -0
- package/android/src/main/java/dev/bota/sdk/reactnative/BotaDeviceSDKEncryptedUploadV2Materials.kt +46 -0
- package/android/src/main/java/dev/bota/sdk/reactnative/BotaDeviceSDKModule.kt +723 -0
- package/android/src/main/java/dev/bota/sdk/reactnative/BotaDeviceSDKPackage.kt +33 -0
- package/android/src/test/java/dev/bota/sdk/reactnative/BotaDeviceSDKAndroidDevicesTest.kt +211 -0
- package/android/src/test/java/dev/bota/sdk/reactnative/BotaDeviceSDKAndroidLifecycleTest.kt +132 -0
- package/android/src/test/java/dev/bota/sdk/reactnative/BotaDeviceSDKAndroidLogsTest.kt +57 -0
- package/android/src/test/java/dev/bota/sdk/reactnative/BotaDeviceSDKAndroidOTATest.kt +75 -0
- package/android/src/test/java/dev/bota/sdk/reactnative/BotaDeviceSDKAndroidRecordingUploadsTest.kt +147 -0
- package/android/src/test/java/dev/bota/sdk/reactnative/BotaDeviceSDKAndroidRecordingsTest.kt +355 -0
- package/android/src/test/java/dev/bota/sdk/reactnative/BotaDeviceSDKAndroidSecurityTest.kt +523 -0
- package/android/src/test/java/dev/bota/sdk/reactnative/BotaDeviceSDKAndroidWiFiTest.kt +100 -0
- package/generated/codegen-contract.json +3593 -0
- package/ios/BotaDeviceSDK.mm +1300 -0
- package/ios/BotaDeviceSDKAppleBridge.swift +2260 -0
- package/ios/BotaDeviceSDKAppleDevices.swift +191 -0
- package/ios/BotaDeviceSDKAppleLifecycle.swift +167 -0
- package/ios/BotaDeviceSDKAppleLogs.swift +79 -0
- package/ios/BotaDeviceSDKAppleOTA.swift +73 -0
- package/ios/BotaDeviceSDKAppleRecordingUploads.swift +178 -0
- package/ios/BotaDeviceSDKAppleRecordings.swift +670 -0
- package/ios/BotaDeviceSDKAppleSecurity.swift +586 -0
- package/ios/BotaDeviceSDKAppleWiFi.swift +128 -0
- package/ios/BotaDeviceSDKEncryptedUploadV2Materials.swift +99 -0
- package/lib/commonjs/BotaClient.js +194 -0
- package/lib/commonjs/BotaClient.js.map +1 -0
- package/lib/commonjs/ble/constants.js +10 -0
- package/lib/commonjs/ble/constants.js.map +1 -0
- package/lib/commonjs/ble/deviceLogs.js +50 -0
- package/lib/commonjs/ble/deviceLogs.js.map +1 -0
- package/lib/commonjs/cache/DeviceStateCache.js +6 -0
- package/lib/commonjs/cache/DeviceStateCache.js.map +1 -0
- package/lib/commonjs/client.js +746 -0
- package/lib/commonjs/client.js.map +1 -0
- package/lib/commonjs/compatibility/runtime.js +44 -0
- package/lib/commonjs/compatibility/runtime.js.map +1 -0
- package/lib/commonjs/index.js +123 -0
- package/lib/commonjs/index.js.map +1 -0
- package/lib/commonjs/managers/DeviceManager.js +647 -0
- package/lib/commonjs/managers/DeviceManager.js.map +1 -0
- package/lib/commonjs/managers/OTAManager.js +140 -0
- package/lib/commonjs/managers/OTAManager.js.map +1 -0
- package/lib/commonjs/managers/RecordingManager.js +444 -0
- package/lib/commonjs/managers/RecordingManager.js.map +1 -0
- package/lib/commonjs/managers/StreamingSession.js +175 -0
- package/lib/commonjs/managers/StreamingSession.js.map +1 -0
- package/lib/commonjs/managers/types.js +6 -0
- package/lib/commonjs/managers/types.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/package.json +1 -0
- package/lib/commonjs/specs/NativeBotaDeviceSDK.js +9 -0
- package/lib/commonjs/specs/NativeBotaDeviceSDK.js.map +1 -0
- package/lib/commonjs/sync/syncStatus.js +178 -0
- package/lib/commonjs/sync/syncStatus.js.map +1 -0
- package/lib/commonjs/utils/errors.js +194 -0
- package/lib/commonjs/utils/errors.js.map +1 -0
- package/lib/commonjs/utils/logger.js +84 -0
- package/lib/commonjs/utils/logger.js.map +1 -0
- package/lib/module/BotaClient.js +189 -0
- package/lib/module/BotaClient.js.map +1 -0
- package/lib/module/ble/constants.js +6 -0
- package/lib/module/ble/constants.js.map +1 -0
- package/lib/module/ble/deviceLogs.js +45 -0
- package/lib/module/ble/deviceLogs.js.map +1 -0
- package/lib/module/cache/DeviceStateCache.js +4 -0
- package/lib/module/cache/DeviceStateCache.js.map +1 -0
- package/lib/module/client.js +740 -0
- package/lib/module/client.js.map +1 -0
- package/lib/module/compatibility/runtime.js +35 -0
- package/lib/module/compatibility/runtime.js.map +1 -0
- package/lib/module/index.js +17 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/managers/DeviceManager.js +641 -0
- package/lib/module/managers/DeviceManager.js.map +1 -0
- package/lib/module/managers/OTAManager.js +134 -0
- package/lib/module/managers/OTAManager.js.map +1 -0
- package/lib/module/managers/RecordingManager.js +438 -0
- package/lib/module/managers/RecordingManager.js.map +1 -0
- package/lib/module/managers/StreamingSession.js +168 -0
- package/lib/module/managers/StreamingSession.js.map +1 -0
- package/lib/module/managers/types.js +4 -0
- package/lib/module/managers/types.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 +4 -0
- package/lib/module/models/Status.js.map +1 -0
- package/lib/module/specs/NativeBotaDeviceSDK.js +5 -0
- package/lib/module/specs/NativeBotaDeviceSDK.js.map +1 -0
- package/lib/module/sync/syncStatus.js +174 -0
- package/lib/module/sync/syncStatus.js.map +1 -0
- package/lib/module/utils/errors.js +183 -0
- package/lib/module/utils/errors.js.map +1 -0
- package/lib/module/utils/logger.js +80 -0
- package/lib/module/utils/logger.js.map +1 -0
- package/lib/typescript/BotaClient.d.ts +40 -0
- package/lib/typescript/BotaClient.d.ts.map +1 -0
- package/lib/typescript/ble/constants.d.ts +4 -0
- package/lib/typescript/ble/constants.d.ts.map +1 -0
- package/lib/typescript/ble/deviceLogs.d.ts +10 -0
- package/lib/typescript/ble/deviceLogs.d.ts.map +1 -0
- package/lib/typescript/cache/DeviceStateCache.d.ts +14 -0
- package/lib/typescript/cache/DeviceStateCache.d.ts.map +1 -0
- package/lib/typescript/client.d.ts +208 -0
- package/lib/typescript/client.d.ts.map +1 -0
- package/lib/typescript/compatibility/runtime.d.ts +11 -0
- package/lib/typescript/compatibility/runtime.d.ts.map +1 -0
- package/lib/typescript/index.d.ts +19 -0
- package/lib/typescript/index.d.ts.map +1 -0
- package/lib/typescript/managers/DeviceManager.d.ts +117 -0
- package/lib/typescript/managers/DeviceManager.d.ts.map +1 -0
- package/lib/typescript/managers/OTAManager.d.ts +25 -0
- package/lib/typescript/managers/OTAManager.d.ts.map +1 -0
- package/lib/typescript/managers/RecordingManager.d.ts +54 -0
- package/lib/typescript/managers/RecordingManager.d.ts.map +1 -0
- package/lib/typescript/managers/StreamingSession.d.ts +35 -0
- package/lib/typescript/managers/StreamingSession.d.ts.map +1 -0
- package/lib/typescript/managers/types.d.ts +19 -0
- package/lib/typescript/managers/types.d.ts.map +1 -0
- package/lib/typescript/models/Device.d.ts +392 -0
- package/lib/typescript/models/Device.d.ts.map +1 -0
- package/lib/typescript/models/Recording.d.ts +259 -0
- package/lib/typescript/models/Recording.d.ts.map +1 -0
- package/lib/typescript/models/Status.d.ts +106 -0
- package/lib/typescript/models/Status.d.ts.map +1 -0
- package/lib/typescript/specs/NativeBotaDeviceSDK.d.ts +393 -0
- package/lib/typescript/specs/NativeBotaDeviceSDK.d.ts.map +1 -0
- package/lib/typescript/sync/syncStatus.d.ts +123 -0
- package/lib/typescript/sync/syncStatus.d.ts.map +1 -0
- package/lib/typescript/utils/errors.d.ts +83 -0
- package/lib/typescript/utils/errors.d.ts.map +1 -0
- package/lib/typescript/utils/logger.d.ts +36 -0
- package/lib/typescript/utils/logger.d.ts.map +1 -0
- package/package.json +100 -0
- package/scripts/bota_device_sdk_spm_workaround.rb +53 -0
- package/src/BotaClient.ts +231 -0
- package/src/ble/constants.ts +3 -0
- package/src/ble/deviceLogs.ts +61 -0
- package/src/cache/DeviceStateCache.ts +20 -0
- package/src/client.ts +1410 -0
- package/src/compatibility/runtime.ts +55 -0
- package/src/index.ts +146 -0
- package/src/managers/DeviceManager.ts +927 -0
- package/src/managers/OTAManager.ts +195 -0
- package/src/managers/RecordingManager.ts +578 -0
- package/src/managers/StreamingSession.ts +212 -0
- package/src/managers/types.ts +36 -0
- package/src/models/Device.ts +484 -0
- package/src/models/Recording.ts +281 -0
- package/src/models/Status.ts +128 -0
- package/src/specs/NativeBotaDeviceSDK.ts +542 -0
- package/src/sync/syncStatus.ts +243 -0
- package/src/utils/errors.ts +327 -0
- package/src/utils/logger.ts +122 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["EventEmitter","getCompatibilityClient","subscribeToCompatibilityDisconnections","DeviceError","ProvisioningError","DeviceManager","discoveredDevices","Map","connectedDevices","knownBleIds","cache","cacheListeners","Set","statusSubscriptions","statusCallbacks","wifiStatusSubscriptions","logSubscriptions","recordingStateCache","recordingStatePending","recordingStateSubscriptions","reconnectInFlight","reconnectChain","Promise","resolve","scanSubscription","scanActive","autoReconnectEnabled","autoReconnectSerial","autoReconnectTimer","autoReconnectAttempting","userDisconnected","destroyed","constructor","client","disconnectionSubscription","error","handleNativeDisconnection","initialize","startScan","options","assertAlive","emit","devices","device","set","id","asError","stopScan","remove","catch","getDiscoveredDevices","Array","from","values","getConnectedDevices","getKnownBleIds","Object","fromEntries","connect","priority","connected","rememberConnected","ensureStatusWatchdog","reconnect","serialNumber","existing","findConnectedBySerial","inFlight","get","run","undefined","then","finally","delete","disconnect","stopAutoReconnectLoop","removeOwned","isConnected","deviceId","connectionState","getStatus","requireConnected","readStatus","isProvisioned","controls","readPublicKey","readAuthNonce","setApiEndpoint","environment","deliverCert","certPem","privkeyPem","deliverCertificate","deliverBackendPubkey","pubkey","deliverBackendPublicKey","writeGrant","grantBlob","syncTime","provision","deviceToken","provisioning","apiEndpoint","String","fromCharCode","environmentCode","mtu","isAlreadyPaired","fetchDeprovisionGrant","provisioningError","nonce","result","deprovision","success","factoryReset","invalidToken","bleFactoryReset","persistResult","persisted","commandId","nextCompatibilityResetCommandId","bindingGeneration","rejected","factoryResetRejection","Error","resumeBleFactoryReset","resumePendingFactoryReset","requestStartRecording","grantOrFetcher","_options","runRecordingControl","fetchRecordingGrant","requestStopRecording","getRecordingState","pending","readAndCacheRecordingState","cachedRecordingState","subscribeToRecordingState","callback","promise","replaceOwned","idempotentRemoval","removeExpected","subscribeToStatus","callbacks","add","size","subscribeToDeviceLogs","logs","subscribe","readConnectionSettings","writeConnectionSettings","settings","configureWiFi","credentials","grant","wifi","configure","disconnectWiFi","getWiFiStatus","status","updateCachedDeviceState","wifiStatus","subscribeToWiFiStatus","scanWiFiNetworks","scanNetworks","getCachedDeviceState","getCachedWiFiStatus","patch","previous","mergeWiFiStatus","state","updatedAt","Date","now","listener","clearCachedDeviceState","clearAllCachedDeviceStates","clear","enableAutoReconnect","startAutoReconnectLoop","disableAutoReconnect","has","onCachedDeviceStateChanged","destroy","removeAllListeners","subscription","attempt","scanTimeout","setInterval","clearInterval","notConnected","fetcher","command","operation","pendingState","readRecordingState","active","initiatedBy","owner","next","expected","removed","signalStrength","ssid","lastError","nativeProtocolStatus","direct","Reflect","userInfo","nested","code","storageError","chunkError","alreadyPaired","compatibilityResetSequence","toString"],"sourceRoot":"../../../src","sources":["managers/DeviceManager.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import EventEmitter from 'eventemitter3';
|
|
4
|
+
import { getCompatibilityClient } from '../compatibility/runtime';
|
|
5
|
+
const stageForNativePhase = phase => {
|
|
6
|
+
switch (phase) {
|
|
7
|
+
case 'downloading':
|
|
8
|
+
return 'downloading';
|
|
9
|
+
case 'awaiting_device':
|
|
10
|
+
return 'preparing';
|
|
11
|
+
case 'transferring':
|
|
12
|
+
return 'updating';
|
|
13
|
+
case 'verifying':
|
|
14
|
+
return 'verifying';
|
|
15
|
+
case 'rebooting':
|
|
16
|
+
case 'reconnecting':
|
|
17
|
+
return 'restarting';
|
|
18
|
+
case 'complete':
|
|
19
|
+
return 'completed';
|
|
20
|
+
default:
|
|
21
|
+
throw new Error(`Unknown firmware update phase: ${phase}`);
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
export class OTAManager extends EventEmitter {
|
|
25
|
+
client = getCompatibilityClient();
|
|
26
|
+
destroyed = false;
|
|
27
|
+
constructor(deviceManager, firmwareCdnUrl = 'https://cdn.bota.dev/firmware') {
|
|
28
|
+
super();
|
|
29
|
+
this.deviceManager = deviceManager;
|
|
30
|
+
this.firmwareCdnUrl = firmwareCdnUrl;
|
|
31
|
+
}
|
|
32
|
+
async checkForUpdate(device) {
|
|
33
|
+
this.assertAlive();
|
|
34
|
+
this.emit('progress', device.id, {
|
|
35
|
+
stage: 'checking',
|
|
36
|
+
progress: 0
|
|
37
|
+
});
|
|
38
|
+
const response = await fetch(`${this.firmwareCdnUrl}/latest?device_type=${device.deviceType}¤t=${device.firmwareVersion}`);
|
|
39
|
+
if (!response.ok) {
|
|
40
|
+
if (response.status === 404) return null;
|
|
41
|
+
throw new Error(`Failed to check for updates: ${response.status}`);
|
|
42
|
+
}
|
|
43
|
+
const firmware = await response.json();
|
|
44
|
+
if (!this.isNewerVersion(firmware.version, device.firmwareVersion)) return null;
|
|
45
|
+
this.emit('updateAvailable', firmware);
|
|
46
|
+
return firmware;
|
|
47
|
+
}
|
|
48
|
+
async downloadFirmware(firmware, onProgress) {
|
|
49
|
+
this.assertAlive();
|
|
50
|
+
return new Promise((resolve, reject) => {
|
|
51
|
+
const Request = globalThis.XMLHttpRequest;
|
|
52
|
+
if (!Request) {
|
|
53
|
+
reject(new Error('Failed to download firmware: XMLHttpRequest is unavailable'));
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
const request = new Request();
|
|
57
|
+
request.open('GET', firmware.url);
|
|
58
|
+
request.responseType = 'arraybuffer';
|
|
59
|
+
request.onprogress = event => {
|
|
60
|
+
const total = event.lengthComputable && event.total > 0 ? event.total : firmware.size;
|
|
61
|
+
onProgress?.(event.loaded, total);
|
|
62
|
+
};
|
|
63
|
+
request.onload = () => {
|
|
64
|
+
if (request.status < 200 || request.status >= 300) {
|
|
65
|
+
reject(new Error(`Failed to download firmware: ${request.status}`));
|
|
66
|
+
} else if (!(request.response instanceof ArrayBuffer)) {
|
|
67
|
+
reject(new Error('Failed to download firmware: empty response'));
|
|
68
|
+
} else {
|
|
69
|
+
resolve(request.response);
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
request.onerror = () => reject(new Error('Failed to download firmware: network error'));
|
|
73
|
+
request.onabort = () => reject(new Error('Failed to download firmware: request aborted'));
|
|
74
|
+
request.send();
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
async performUpdate(device, firmware, grantBlob) {
|
|
78
|
+
this.assertAlive();
|
|
79
|
+
try {
|
|
80
|
+
if (grantBlob) await this.deviceManager.writeGrant(device, grantBlob);
|
|
81
|
+
await this.client.ota.updateFirmware(device, {
|
|
82
|
+
version: firmware.version,
|
|
83
|
+
sizeBytes: firmware.size,
|
|
84
|
+
crc32: 0,
|
|
85
|
+
url: firmware.url
|
|
86
|
+
}, nativeProgress => {
|
|
87
|
+
if (this.destroyed) return;
|
|
88
|
+
const total = nativeProgress.totalBytes;
|
|
89
|
+
const progress = {
|
|
90
|
+
stage: stageForNativePhase(nativeProgress.phase),
|
|
91
|
+
progress: total > 0 ? Math.min(nativeProgress.completedBytes / total, 1) : 0
|
|
92
|
+
};
|
|
93
|
+
if (nativeProgress.phase === 'downloading') {
|
|
94
|
+
progress.bytesTransferred = nativeProgress.completedBytes;
|
|
95
|
+
progress.totalBytes = total;
|
|
96
|
+
}
|
|
97
|
+
this.emit('progress', device.id, progress);
|
|
98
|
+
});
|
|
99
|
+
if (!this.destroyed) this.emit('completed', device.id, firmware.version);
|
|
100
|
+
} catch (error) {
|
|
101
|
+
const failure = error instanceof Error ? error : new Error(String(error));
|
|
102
|
+
if (!this.destroyed) {
|
|
103
|
+
this.emit('progress', device.id, {
|
|
104
|
+
stage: 'failed',
|
|
105
|
+
progress: 0,
|
|
106
|
+
error: failure.message
|
|
107
|
+
});
|
|
108
|
+
this.emit('failed', device.id, failure);
|
|
109
|
+
}
|
|
110
|
+
throw error;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
destroy() {
|
|
114
|
+
if (this.destroyed) return;
|
|
115
|
+
this.destroyed = true;
|
|
116
|
+
this.removeAllListeners();
|
|
117
|
+
void this.client.ota.cancelFirmwareUpdate();
|
|
118
|
+
}
|
|
119
|
+
isNewerVersion(newVersion, currentVersion) {
|
|
120
|
+
const newParts = newVersion.split('.').map(part => Number.parseInt(part, 10) || 0);
|
|
121
|
+
const currentParts = currentVersion.split('.').map(part => Number.parseInt(part, 10) || 0);
|
|
122
|
+
for (let index = 0; index < Math.max(newParts.length, currentParts.length); index += 1) {
|
|
123
|
+
const next = newParts[index] ?? 0;
|
|
124
|
+
const current = currentParts[index] ?? 0;
|
|
125
|
+
if (next > current) return true;
|
|
126
|
+
if (next < current) return false;
|
|
127
|
+
}
|
|
128
|
+
return false;
|
|
129
|
+
}
|
|
130
|
+
assertAlive() {
|
|
131
|
+
if (this.destroyed) throw new Error('OTAManager has been destroyed');
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=OTAManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["EventEmitter","getCompatibilityClient","stageForNativePhase","phase","Error","OTAManager","client","destroyed","constructor","deviceManager","firmwareCdnUrl","checkForUpdate","device","assertAlive","emit","id","stage","progress","response","fetch","deviceType","firmwareVersion","ok","status","firmware","json","isNewerVersion","version","downloadFirmware","onProgress","Promise","resolve","reject","Request","globalThis","XMLHttpRequest","request","open","url","responseType","onprogress","event","total","lengthComputable","size","loaded","onload","ArrayBuffer","onerror","onabort","send","performUpdate","grantBlob","writeGrant","ota","updateFirmware","sizeBytes","crc32","nativeProgress","totalBytes","Math","min","completedBytes","bytesTransferred","error","failure","String","message","destroy","removeAllListeners","cancelFirmwareUpdate","newVersion","currentVersion","newParts","split","map","part","Number","parseInt","currentParts","index","max","length","next","current"],"sourceRoot":"../../../src","sources":["managers/OTAManager.ts"],"mappings":";;AAAA,OAAOA,YAAY,MAAM,eAAe;AAExC,SAASC,sBAAsB,QAAQ,0BAA0B;AAqCjE,MAAMC,mBAAmB,GAAIC,KAAa,IAAe;EACvD,QAAQA,KAAK;IACX,KAAK,aAAa;MAChB,OAAO,aAAa;IACtB,KAAK,iBAAiB;MACpB,OAAO,WAAW;IACpB,KAAK,cAAc;MACjB,OAAO,UAAU;IACnB,KAAK,WAAW;MACd,OAAO,WAAW;IACpB,KAAK,WAAW;IAChB,KAAK,cAAc;MACjB,OAAO,YAAY;IACrB,KAAK,UAAU;MACb,OAAO,WAAW;IACpB;MACE,MAAM,IAAIC,KAAK,CAAC,kCAAkCD,KAAK,EAAE,CAAC;EAC9D;AACF,CAAC;AAED,OAAO,MAAME,UAAU,SAASL,YAAY,CAAmB;EAC5CM,MAAM,GAAGL,sBAAsB,CAAC,CAAC;EAC1CM,SAAS,GAAG,KAAK;EAEzBC,WAAWA,CACQC,aAA4B,EAC5BC,cAAc,GAAG,+BAA+B,EACjE;IACA,KAAK,CAAC,CAAC;IAAC,KAHSD,aAA4B,GAA5BA,aAA4B;IAAA,KAC5BC,cAAc,GAAdA,cAAc;EAGjC;EAEA,MAAMC,cAAcA,CAACC,MAAuB,EAAgC;IAC1E,IAAI,CAACC,WAAW,CAAC,CAAC;IAClB,IAAI,CAACC,IAAI,CAAC,UAAU,EAAEF,MAAM,CAACG,EAAE,EAAE;MAAEC,KAAK,EAAE,UAAU;MAAEC,QAAQ,EAAE;IAAE,CAAC,CAAC;IACpE,MAAMC,QAAQ,GAAG,MAAMC,KAAK,CAC1B,GAAG,IAAI,CAACT,cAAc,uBAAuBE,MAAM,CAACQ,UAAU,YAAYR,MAAM,CAACS,eAAe,EAClG,CAAC;IACD,IAAI,CAACH,QAAQ,CAACI,EAAE,EAAE;MAChB,IAAIJ,QAAQ,CAACK,MAAM,KAAK,GAAG,EAAE,OAAO,IAAI;MACxC,MAAM,IAAInB,KAAK,CAAC,gCAAgCc,QAAQ,CAACK,MAAM,EAAE,CAAC;IACpE;IACA,MAAMC,QAAQ,GAAI,MAAMN,QAAQ,CAACO,IAAI,CAAC,CAAkB;IACxD,IAAI,CAAC,IAAI,CAACC,cAAc,CAACF,QAAQ,CAACG,OAAO,EAAEf,MAAM,CAACS,eAAe,CAAC,EAAE,OAAO,IAAI;IAC/E,IAAI,CAACP,IAAI,CAAC,iBAAiB,EAAEU,QAAQ,CAAC;IACtC,OAAOA,QAAQ;EACjB;EAEA,MAAMI,gBAAgBA,CACpBJ,QAAsB,EACtBK,UAA6C,EACvB;IACtB,IAAI,CAAChB,WAAW,CAAC,CAAC;IAClB,OAAO,IAAIiB,OAAO,CAAc,CAACC,OAAO,EAAEC,MAAM,KAAK;MACnD,MAAMC,OAAO,GAAIC,UAAU,CAExBC,cAAc;MACjB,IAAI,CAACF,OAAO,EAAE;QACZD,MAAM,CAAC,IAAI5B,KAAK,CAAC,4DAA4D,CAAC,CAAC;QAC/E;MACF;MACA,MAAMgC,OAAO,GAAG,IAAIH,OAAO,CAAC,CAAC;MAC7BG,OAAO,CAACC,IAAI,CAAC,KAAK,EAAEb,QAAQ,CAACc,GAAG,CAAC;MACjCF,OAAO,CAACG,YAAY,GAAG,aAAa;MACpCH,OAAO,CAACI,UAAU,GAAIC,KAAK,IAAK;QAC9B,MAAMC,KAAK,GAAGD,KAAK,CAACE,gBAAgB,IAAIF,KAAK,CAACC,KAAK,GAAG,CAAC,GACnDD,KAAK,CAACC,KAAK,GACXlB,QAAQ,CAACoB,IAAI;QACjBf,UAAU,GAAGY,KAAK,CAACI,MAAM,EAAEH,KAAK,CAAC;MACnC,CAAC;MACDN,OAAO,CAACU,MAAM,GAAG,MAAM;QACrB,IAAIV,OAAO,CAACb,MAAM,GAAG,GAAG,IAAIa,OAAO,CAACb,MAAM,IAAI,GAAG,EAAE;UACjDS,MAAM,CAAC,IAAI5B,KAAK,CAAC,gCAAgCgC,OAAO,CAACb,MAAM,EAAE,CAAC,CAAC;QACrE,CAAC,MAAM,IAAI,EAAEa,OAAO,CAAClB,QAAQ,YAAY6B,WAAW,CAAC,EAAE;UACrDf,MAAM,CAAC,IAAI5B,KAAK,CAAC,6CAA6C,CAAC,CAAC;QAClE,CAAC,MAAM;UACL2B,OAAO,CAACK,OAAO,CAAClB,QAAQ,CAAC;QAC3B;MACF,CAAC;MACDkB,OAAO,CAACY,OAAO,GAAG,MAChBhB,MAAM,CAAC,IAAI5B,KAAK,CAAC,4CAA4C,CAAC,CAAC;MACjEgC,OAAO,CAACa,OAAO,GAAG,MAChBjB,MAAM,CAAC,IAAI5B,KAAK,CAAC,8CAA8C,CAAC,CAAC;MACnEgC,OAAO,CAACc,IAAI,CAAC,CAAC;IAChB,CAAC,CAAC;EACJ;EAEA,MAAMC,aAAaA,CACjBvC,MAAuB,EACvBY,QAAsB,EACtB4B,SAAkB,EACH;IACf,IAAI,CAACvC,WAAW,CAAC,CAAC;IAClB,IAAI;MACF,IAAIuC,SAAS,EAAE,MAAM,IAAI,CAAC3C,aAAa,CAAC4C,UAAU,CAACzC,MAAM,EAAEwC,SAAS,CAAC;MACrE,MAAM,IAAI,CAAC9C,MAAM,CAACgD,GAAG,CAACC,cAAc,CAClC3C,MAAM,EACN;QACEe,OAAO,EAAEH,QAAQ,CAACG,OAAO;QACzB6B,SAAS,EAAEhC,QAAQ,CAACoB,IAAI;QACxBa,KAAK,EAAE,CAAC;QACRnB,GAAG,EAAEd,QAAQ,CAACc;MAChB,CAAC,EACAoB,cAAc,IAAK;QAClB,IAAI,IAAI,CAACnD,SAAS,EAAE;QACpB,MAAMmC,KAAK,GAAGgB,cAAc,CAACC,UAAU;QACvC,MAAM1C,QAAqB,GAAG;UAC5BD,KAAK,EAAEd,mBAAmB,CAACwD,cAAc,CAACvD,KAAK,CAAC;UAChDc,QAAQ,EAAEyB,KAAK,GAAG,CAAC,GACfkB,IAAI,CAACC,GAAG,CAACH,cAAc,CAACI,cAAc,GAAGpB,KAAK,EAAE,CAAC,CAAC,GAClD;QACN,CAAC;QACD,IAAIgB,cAAc,CAACvD,KAAK,KAAK,aAAa,EAAE;UAC1Cc,QAAQ,CAAC8C,gBAAgB,GAAGL,cAAc,CAACI,cAAc;UACzD7C,QAAQ,CAAC0C,UAAU,GAAGjB,KAAK;QAC7B;QACA,IAAI,CAAC5B,IAAI,CAAC,UAAU,EAAEF,MAAM,CAACG,EAAE,EAAEE,QAAQ,CAAC;MAC5C,CACF,CAAC;MACD,IAAI,CAAC,IAAI,CAACV,SAAS,EAAE,IAAI,CAACO,IAAI,CAAC,WAAW,EAAEF,MAAM,CAACG,EAAE,EAAES,QAAQ,CAACG,OAAO,CAAC;IAC1E,CAAC,CAAC,OAAOqC,KAAK,EAAE;MACd,MAAMC,OAAO,GAAGD,KAAK,YAAY5D,KAAK,GAAG4D,KAAK,GAAG,IAAI5D,KAAK,CAAC8D,MAAM,CAACF,KAAK,CAAC,CAAC;MACzE,IAAI,CAAC,IAAI,CAACzD,SAAS,EAAE;QACnB,IAAI,CAACO,IAAI,CAAC,UAAU,EAAEF,MAAM,CAACG,EAAE,EAAE;UAC/BC,KAAK,EAAE,QAAQ;UACfC,QAAQ,EAAE,CAAC;UACX+C,KAAK,EAAEC,OAAO,CAACE;QACjB,CAAC,CAAC;QACF,IAAI,CAACrD,IAAI,CAAC,QAAQ,EAAEF,MAAM,CAACG,EAAE,EAAEkD,OAAO,CAAC;MACzC;MACA,MAAMD,KAAK;IACb;EACF;EAEAI,OAAOA,CAAA,EAAS;IACd,IAAI,IAAI,CAAC7D,SAAS,EAAE;IACpB,IAAI,CAACA,SAAS,GAAG,IAAI;IACrB,IAAI,CAAC8D,kBAAkB,CAAC,CAAC;IACzB,KAAK,IAAI,CAAC/D,MAAM,CAACgD,GAAG,CAACgB,oBAAoB,CAAC,CAAC;EAC7C;EAEQ5C,cAAcA,CAAC6C,UAAkB,EAAEC,cAAsB,EAAW;IAC1E,MAAMC,QAAQ,GAAGF,UAAU,CAACG,KAAK,CAAC,GAAG,CAAC,CAACC,GAAG,CAAEC,IAAI,IAAKC,MAAM,CAACC,QAAQ,CAACF,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;IACpF,MAAMG,YAAY,GAAGP,cAAc,CAACE,KAAK,CAAC,GAAG,CAAC,CAACC,GAAG,CAAEC,IAAI,IAAKC,MAAM,CAACC,QAAQ,CAACF,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;IAC5F,KAAK,IAAII,KAAK,GAAG,CAAC,EAAEA,KAAK,GAAGpB,IAAI,CAACqB,GAAG,CAACR,QAAQ,CAACS,MAAM,EAAEH,YAAY,CAACG,MAAM,CAAC,EAAEF,KAAK,IAAI,CAAC,EAAE;MACtF,MAAMG,IAAI,GAAGV,QAAQ,CAACO,KAAK,CAAC,IAAI,CAAC;MACjC,MAAMI,OAAO,GAAGL,YAAY,CAACC,KAAK,CAAC,IAAI,CAAC;MACxC,IAAIG,IAAI,GAAGC,OAAO,EAAE,OAAO,IAAI;MAC/B,IAAID,IAAI,GAAGC,OAAO,EAAE,OAAO,KAAK;IAClC;IACA,OAAO,KAAK;EACd;EAEQvE,WAAWA,CAAA,EAAS;IAC1B,IAAI,IAAI,CAACN,SAAS,EAAE,MAAM,IAAIH,KAAK,CAAC,+BAA+B,CAAC;EACtE;AACF","ignoreList":[]}
|
|
@@ -0,0 +1,438 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import EventEmitter from 'eventemitter3';
|
|
4
|
+
import { getCompatibilityClient } from '../compatibility/runtime';
|
|
5
|
+
import { StreamingSession, setStreamingSessionTerminalHandler } from './StreamingSession';
|
|
6
|
+
const createTaskId = () => `task_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`;
|
|
7
|
+
const createOpaqueId = () => 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, value => {
|
|
8
|
+
const random = Math.floor(Math.random() * 16);
|
|
9
|
+
const nibble = value === 'x' ? random : random & 0x3 | 0x8;
|
|
10
|
+
return nibble.toString(16);
|
|
11
|
+
});
|
|
12
|
+
const errorMessage = error => error instanceof Error ? error.message : String(error);
|
|
13
|
+
const observeProgress = start => {
|
|
14
|
+
const queued = [];
|
|
15
|
+
const waiting = [];
|
|
16
|
+
let result;
|
|
17
|
+
let failure;
|
|
18
|
+
let settled = false;
|
|
19
|
+
const wake = () => waiting.splice(0).forEach(resolve => resolve());
|
|
20
|
+
void start(progress => {
|
|
21
|
+
queued.push(progress);
|
|
22
|
+
wake();
|
|
23
|
+
}).then(value => {
|
|
24
|
+
result = value;
|
|
25
|
+
settled = true;
|
|
26
|
+
wake();
|
|
27
|
+
}, error => {
|
|
28
|
+
failure = error;
|
|
29
|
+
settled = true;
|
|
30
|
+
wake();
|
|
31
|
+
});
|
|
32
|
+
return {
|
|
33
|
+
async next() {
|
|
34
|
+
while (queued.length === 0 && !settled) {
|
|
35
|
+
await new Promise(resolve => waiting.push(resolve));
|
|
36
|
+
}
|
|
37
|
+
const progress = queued.shift();
|
|
38
|
+
if (progress) return {
|
|
39
|
+
done: false,
|
|
40
|
+
value: progress
|
|
41
|
+
};
|
|
42
|
+
if (failure !== undefined) throw failure;
|
|
43
|
+
return {
|
|
44
|
+
done: true,
|
|
45
|
+
value: result
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
};
|
|
50
|
+
export class RecordingManager extends EventEmitter {
|
|
51
|
+
tasks = [];
|
|
52
|
+
initialized = false;
|
|
53
|
+
paused = false;
|
|
54
|
+
destroyed = false;
|
|
55
|
+
activeStreamingSession = null;
|
|
56
|
+
constructor() {
|
|
57
|
+
super();
|
|
58
|
+
this.client = getCompatibilityClient();
|
|
59
|
+
}
|
|
60
|
+
async initialize() {
|
|
61
|
+
if (this.initialized) return;
|
|
62
|
+
this.assertAlive();
|
|
63
|
+
this.tasks = (await this.client.recordings.loadUploadQueue()).map(task => ({
|
|
64
|
+
...task,
|
|
65
|
+
createdAt: new Date(task.createdAt),
|
|
66
|
+
updatedAt: new Date(task.updatedAt),
|
|
67
|
+
status: task.status === 'uploading' ? 'pending' : task.status
|
|
68
|
+
}));
|
|
69
|
+
this.initialized = true;
|
|
70
|
+
}
|
|
71
|
+
async getStorageInfo(device) {
|
|
72
|
+
this.assertReady();
|
|
73
|
+
const [status, recordings] = await Promise.all([this.client.devices.readStatus(), this.client.recordings.listRecordings(device)]);
|
|
74
|
+
return {
|
|
75
|
+
totalKb: status.storageTotalMb * 1024,
|
|
76
|
+
usedKb: status.storageUsedMb * 1024,
|
|
77
|
+
totalRecordings: recordings.length,
|
|
78
|
+
pendingSyncCount: status.pendingRecordings
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
async listRecordings(device) {
|
|
82
|
+
this.assertReady();
|
|
83
|
+
return this.client.recordings.listRecordings(device);
|
|
84
|
+
}
|
|
85
|
+
async *syncRecording(device, recording, uploadInfo) {
|
|
86
|
+
this.assertReady();
|
|
87
|
+
this.emit('syncStarted', recording.uuid);
|
|
88
|
+
const sinkId = createOpaqueId();
|
|
89
|
+
const now = new Date();
|
|
90
|
+
const task = {
|
|
91
|
+
id: createTaskId(),
|
|
92
|
+
recordingId: uploadInfo.recordingId,
|
|
93
|
+
deviceId: device.id,
|
|
94
|
+
localPath: '',
|
|
95
|
+
uploadUrl: uploadInfo.uploadUrl,
|
|
96
|
+
...(uploadInfo.uploadToken ? {
|
|
97
|
+
uploadToken: uploadInfo.uploadToken
|
|
98
|
+
} : {}),
|
|
99
|
+
...(uploadInfo.completeUrl ? {
|
|
100
|
+
completeUrl: uploadInfo.completeUrl
|
|
101
|
+
} : {}),
|
|
102
|
+
...(uploadInfo.contentType ? {
|
|
103
|
+
contentType: uploadInfo.contentType
|
|
104
|
+
} : {}),
|
|
105
|
+
status: 'pending',
|
|
106
|
+
retryCount: 0,
|
|
107
|
+
createdAt: now,
|
|
108
|
+
updatedAt: now
|
|
109
|
+
};
|
|
110
|
+
this.tasks.push(task);
|
|
111
|
+
await this.persistTasks();
|
|
112
|
+
this.emitQueueUpdated();
|
|
113
|
+
try {
|
|
114
|
+
yield this.emitSyncProgress(recording.uuid, {
|
|
115
|
+
stage: 'preparing',
|
|
116
|
+
progress: 0,
|
|
117
|
+
totalBytes: recording.fileSizeBytes
|
|
118
|
+
});
|
|
119
|
+
const transfer = observeProgress(onProgress => this.client.recordings.syncRecording(device, recording, onProgress, sinkId));
|
|
120
|
+
let transferResult;
|
|
121
|
+
while (true) {
|
|
122
|
+
const value = await transfer.next();
|
|
123
|
+
if (value.done) {
|
|
124
|
+
transferResult = value.value;
|
|
125
|
+
break;
|
|
126
|
+
}
|
|
127
|
+
yield this.emitSyncProgress(recording.uuid, {
|
|
128
|
+
stage: 'transferring',
|
|
129
|
+
progress: value.value.totalBytes > 0 ? Math.min(value.value.completedBytes / value.value.totalBytes, 1) : 0,
|
|
130
|
+
bytesTransferred: value.value.completedBytes,
|
|
131
|
+
totalBytes: value.value.totalBytes
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
if (transferResult.e2eEncrypted && !uploadInfo.relay) {
|
|
135
|
+
throw new Error('Device delivered encrypted recording data without an upload relay');
|
|
136
|
+
}
|
|
137
|
+
await this.updateTask(task.id, {
|
|
138
|
+
localPath: transferResult.localPath,
|
|
139
|
+
contentSha256: transferResult.contentSha256,
|
|
140
|
+
relay: transferResult.e2eEncrypted ? uploadInfo.relay : undefined
|
|
141
|
+
});
|
|
142
|
+
yield this.emitSyncProgress(recording.uuid, {
|
|
143
|
+
stage: 'uploading',
|
|
144
|
+
progress: 0,
|
|
145
|
+
bytesUploaded: 0,
|
|
146
|
+
totalBytes: recording.fileSizeBytes,
|
|
147
|
+
contentSha256: transferResult.contentSha256
|
|
148
|
+
});
|
|
149
|
+
const upload = observeProgress(onProgress => this.runUpload(task.id, onProgress));
|
|
150
|
+
while (true) {
|
|
151
|
+
const value = await upload.next();
|
|
152
|
+
if (value.done) break;
|
|
153
|
+
const progress = value.value.totalBytes > 0 ? Math.min(value.value.completedBytes / value.value.totalBytes, 1) : 0;
|
|
154
|
+
yield this.emitSyncProgress(recording.uuid, {
|
|
155
|
+
stage: 'uploading',
|
|
156
|
+
progress,
|
|
157
|
+
bytesUploaded: value.value.completedBytes,
|
|
158
|
+
totalBytes: value.value.totalBytes
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
yield this.emitSyncProgress(recording.uuid, {
|
|
162
|
+
stage: 'completing',
|
|
163
|
+
progress: 0.5
|
|
164
|
+
});
|
|
165
|
+
await this.client.recordings.confirmRecording(device, recording.uuid);
|
|
166
|
+
const completed = this.emitSyncProgress(recording.uuid, {
|
|
167
|
+
stage: 'completed',
|
|
168
|
+
progress: 1,
|
|
169
|
+
recordingId: uploadInfo.recordingId,
|
|
170
|
+
contentSha256: transferResult.contentSha256
|
|
171
|
+
});
|
|
172
|
+
yield completed;
|
|
173
|
+
this.emit('syncCompleted', recording.uuid, uploadInfo.recordingId);
|
|
174
|
+
} catch (error) {
|
|
175
|
+
const failure = error instanceof Error ? error : new Error(String(error));
|
|
176
|
+
if (this.requireTask(task.id).status !== 'completed') {
|
|
177
|
+
await this.updateTask(task.id, {
|
|
178
|
+
status: 'failed',
|
|
179
|
+
errorMessage: failure.message
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
yield this.emitSyncProgress(recording.uuid, {
|
|
183
|
+
stage: 'failed',
|
|
184
|
+
progress: 0,
|
|
185
|
+
error: failure.message
|
|
186
|
+
});
|
|
187
|
+
this.emit('syncFailed', recording.uuid, failure);
|
|
188
|
+
throw failure;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
async triggerDeviceUpload(device) {
|
|
192
|
+
this.assertReady();
|
|
193
|
+
const result = await this.client.recordings.observeUploadOwnership(device, {
|
|
194
|
+
recordingUuid: '00000000-0000-0000-0000-000000000000',
|
|
195
|
+
uploadId: 'ownership-probe',
|
|
196
|
+
destinationId: 'ownership-probe'
|
|
197
|
+
});
|
|
198
|
+
return result.kind === 'bluetooth_fallback' ? {
|
|
199
|
+
accepted: false
|
|
200
|
+
} : {
|
|
201
|
+
accepted: true
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
async *monitorDeviceUpload(device, initialPendingCount) {
|
|
205
|
+
this.assertReady();
|
|
206
|
+
yield {
|
|
207
|
+
stage: 'device_uploading',
|
|
208
|
+
progress: 0,
|
|
209
|
+
recordingIndex: 0,
|
|
210
|
+
totalRecordings: initialPendingCount
|
|
211
|
+
};
|
|
212
|
+
try {
|
|
213
|
+
const result = await this.client.recordings.observeUploadOwnership(device, {
|
|
214
|
+
recordingUuid: '00000000-0000-0000-0000-000000000000',
|
|
215
|
+
uploadId: 'ownership-probe',
|
|
216
|
+
destinationId: 'ownership-probe'
|
|
217
|
+
});
|
|
218
|
+
if (result.kind === 'device_upload_completed') {
|
|
219
|
+
yield {
|
|
220
|
+
stage: 'completed',
|
|
221
|
+
progress: 1,
|
|
222
|
+
recordingIndex: initialPendingCount,
|
|
223
|
+
totalRecordings: initialPendingCount
|
|
224
|
+
};
|
|
225
|
+
return 'completed';
|
|
226
|
+
}
|
|
227
|
+
return result.kind === 'bluetooth_fallback' ? 'failed' : 'detached';
|
|
228
|
+
} catch {
|
|
229
|
+
return 'detached';
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
async *syncAllRecordings(device, uploadInfoProvider) {
|
|
233
|
+
this.assertReady();
|
|
234
|
+
const recordings = await this.listRecordings(device);
|
|
235
|
+
if (recordings.length === 0) return;
|
|
236
|
+
const ownership = observeProgress(onProgress => this.client.recordings.observeUploadOwnership(device, {
|
|
237
|
+
recordingUuid: recordings[0].uuid,
|
|
238
|
+
uploadId: 'ownership-probe',
|
|
239
|
+
destinationId: 'ownership-probe'
|
|
240
|
+
}, onProgress));
|
|
241
|
+
let result;
|
|
242
|
+
try {
|
|
243
|
+
while (true) {
|
|
244
|
+
const value = await ownership.next();
|
|
245
|
+
if (value.done) {
|
|
246
|
+
result = value.value;
|
|
247
|
+
break;
|
|
248
|
+
}
|
|
249
|
+
yield {
|
|
250
|
+
stage: 'device_uploading',
|
|
251
|
+
progress: value.value.totalBytes > 0 ? Math.min(value.value.completedBytes / value.value.totalBytes, 1) : 0,
|
|
252
|
+
recordingIndex: value.value.completedBytes,
|
|
253
|
+
totalRecordings: recordings.length
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
} catch {
|
|
257
|
+
yield {
|
|
258
|
+
stage: 'device_uploading',
|
|
259
|
+
progress: 0,
|
|
260
|
+
recordingIndex: 0,
|
|
261
|
+
totalRecordings: recordings.length
|
|
262
|
+
};
|
|
263
|
+
return;
|
|
264
|
+
}
|
|
265
|
+
if (result.kind === 'device_upload_completed') {
|
|
266
|
+
yield {
|
|
267
|
+
stage: 'completed',
|
|
268
|
+
progress: 1,
|
|
269
|
+
recordingIndex: recordings.length,
|
|
270
|
+
totalRecordings: recordings.length
|
|
271
|
+
};
|
|
272
|
+
return;
|
|
273
|
+
}
|
|
274
|
+
if (result.kind === 'device_upload_preserved') return;
|
|
275
|
+
for (let index = 0; index < recordings.length; index += 1) {
|
|
276
|
+
const recording = recordings[index];
|
|
277
|
+
try {
|
|
278
|
+
const uploadInfo = await uploadInfoProvider(recording);
|
|
279
|
+
for await (const progress of this.syncRecording(device, recording, uploadInfo)) {
|
|
280
|
+
yield {
|
|
281
|
+
...progress,
|
|
282
|
+
recordingIndex: index,
|
|
283
|
+
totalRecordings: recordings.length
|
|
284
|
+
};
|
|
285
|
+
}
|
|
286
|
+
} catch (error) {
|
|
287
|
+
yield {
|
|
288
|
+
stage: 'failed',
|
|
289
|
+
progress: 0,
|
|
290
|
+
error: errorMessage(error),
|
|
291
|
+
recordingIndex: index,
|
|
292
|
+
totalRecordings: recordings.length
|
|
293
|
+
};
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
getPendingUploads() {
|
|
298
|
+
return this.tasks.filter(task => task.status === 'pending' || task.status === 'uploading');
|
|
299
|
+
}
|
|
300
|
+
getAllUploads() {
|
|
301
|
+
return this.tasks.map(task => ({
|
|
302
|
+
...task
|
|
303
|
+
}));
|
|
304
|
+
}
|
|
305
|
+
startStreamingSync(device, recordingUuid, uploadInfoProvider, options = {}) {
|
|
306
|
+
this.assertReady();
|
|
307
|
+
if (this.activeStreamingSession?.isActive) {
|
|
308
|
+
throw new Error('A streaming session is already active');
|
|
309
|
+
}
|
|
310
|
+
const session = new StreamingSession(null, null, device, recordingUuid, uploadInfoProvider, options.chunkSizeKb, options.flushIntervalMs);
|
|
311
|
+
this.activeStreamingSession = session;
|
|
312
|
+
setStreamingSessionTerminalHandler(session, () => {
|
|
313
|
+
if (this.activeStreamingSession === session) {
|
|
314
|
+
this.activeStreamingSession = null;
|
|
315
|
+
}
|
|
316
|
+
});
|
|
317
|
+
void session.start().catch(() => undefined);
|
|
318
|
+
return session;
|
|
319
|
+
}
|
|
320
|
+
getActiveStreamingSession() {
|
|
321
|
+
return this.activeStreamingSession;
|
|
322
|
+
}
|
|
323
|
+
async cancelUpload(taskId) {
|
|
324
|
+
await this.client.recordings.cancelRecordingUpload(taskId);
|
|
325
|
+
this.tasks = this.tasks.filter(task => task.id !== taskId);
|
|
326
|
+
await this.persistTasks();
|
|
327
|
+
this.emitQueueUpdated();
|
|
328
|
+
}
|
|
329
|
+
async retryFailedUploads() {
|
|
330
|
+
this.assertReady();
|
|
331
|
+
if (this.paused) return;
|
|
332
|
+
for (const task of this.tasks.filter(value => value.status === 'failed')) {
|
|
333
|
+
await this.updateTask(task.id, {
|
|
334
|
+
status: 'pending',
|
|
335
|
+
retryCount: task.retryCount + 1,
|
|
336
|
+
errorMessage: undefined
|
|
337
|
+
});
|
|
338
|
+
try {
|
|
339
|
+
await this.runUpload(task.id);
|
|
340
|
+
} catch {
|
|
341
|
+
// Keep failed tasks available for the next explicit retry.
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
async clearCompletedUploads() {
|
|
346
|
+
this.tasks = this.tasks.filter(task => task.status !== 'completed');
|
|
347
|
+
await this.persistTasks();
|
|
348
|
+
this.emitQueueUpdated();
|
|
349
|
+
}
|
|
350
|
+
async clearAllUploads() {
|
|
351
|
+
const ids = this.tasks.map(task => task.id);
|
|
352
|
+
await Promise.all(ids.map(taskId => this.client.recordings.cancelRecordingUpload(taskId).catch(() => undefined)));
|
|
353
|
+
this.tasks = [];
|
|
354
|
+
await this.persistTasks();
|
|
355
|
+
this.emitQueueUpdated();
|
|
356
|
+
}
|
|
357
|
+
pauseUploads() {
|
|
358
|
+
this.paused = true;
|
|
359
|
+
}
|
|
360
|
+
resumeUploads() {
|
|
361
|
+
this.paused = false;
|
|
362
|
+
void this.retryFailedUploads();
|
|
363
|
+
}
|
|
364
|
+
destroy() {
|
|
365
|
+
if (this.destroyed) return;
|
|
366
|
+
this.destroyed = true;
|
|
367
|
+
this.activeStreamingSession?.abort();
|
|
368
|
+
this.activeStreamingSession = null;
|
|
369
|
+
void this.client.recordings.destroyCompatibilityOperations().catch(() => undefined);
|
|
370
|
+
this.removeAllListeners();
|
|
371
|
+
this.initialized = false;
|
|
372
|
+
}
|
|
373
|
+
async runUpload(taskId, onProgress) {
|
|
374
|
+
if (this.paused) throw new Error('Upload queue is paused');
|
|
375
|
+
const task = this.requireTask(taskId);
|
|
376
|
+
await this.updateTask(taskId, {
|
|
377
|
+
status: 'uploading',
|
|
378
|
+
errorMessage: undefined
|
|
379
|
+
});
|
|
380
|
+
this.emit('uploadStarted', taskId);
|
|
381
|
+
try {
|
|
382
|
+
await this.client.recordings.uploadRecordingFile(this.requireTask(taskId), progress => {
|
|
383
|
+
onProgress?.(progress);
|
|
384
|
+
const ratio = progress.totalBytes > 0 ? Math.min(progress.completedBytes / progress.totalBytes, 1) : 0;
|
|
385
|
+
this.emit('uploadProgress', taskId, ratio);
|
|
386
|
+
});
|
|
387
|
+
await this.updateTask(taskId, {
|
|
388
|
+
status: 'completed',
|
|
389
|
+
errorMessage: undefined
|
|
390
|
+
});
|
|
391
|
+
this.emit('uploadCompleted', taskId, task.recordingId);
|
|
392
|
+
} catch (error) {
|
|
393
|
+
const failure = error instanceof Error ? error : new Error(String(error));
|
|
394
|
+
await this.updateTask(taskId, {
|
|
395
|
+
status: 'failed',
|
|
396
|
+
errorMessage: failure.message
|
|
397
|
+
});
|
|
398
|
+
this.emit('uploadFailed', taskId, failure);
|
|
399
|
+
throw failure;
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
emitSyncProgress(recordingUuid, progress) {
|
|
403
|
+
this.emit('syncProgress', recordingUuid, progress);
|
|
404
|
+
return progress;
|
|
405
|
+
}
|
|
406
|
+
requireTask(taskId) {
|
|
407
|
+
const task = this.tasks.find(value => value.id === taskId);
|
|
408
|
+
if (!task) throw new Error(`Upload task not found: ${taskId}`);
|
|
409
|
+
return task;
|
|
410
|
+
}
|
|
411
|
+
async updateTask(taskId, patch) {
|
|
412
|
+
const index = this.tasks.findIndex(task => task.id === taskId);
|
|
413
|
+
if (index < 0) throw new Error(`Upload task not found: ${taskId}`);
|
|
414
|
+
this.tasks[index] = {
|
|
415
|
+
...this.tasks[index],
|
|
416
|
+
...patch,
|
|
417
|
+
updatedAt: new Date()
|
|
418
|
+
};
|
|
419
|
+
await this.persistTasks();
|
|
420
|
+
this.emitQueueUpdated();
|
|
421
|
+
}
|
|
422
|
+
async persistTasks() {
|
|
423
|
+
await this.client.recordings.saveUploadQueue(this.tasks);
|
|
424
|
+
}
|
|
425
|
+
emitQueueUpdated() {
|
|
426
|
+
this.emit('queueUpdated', this.getAllUploads());
|
|
427
|
+
}
|
|
428
|
+
assertReady() {
|
|
429
|
+
this.assertAlive();
|
|
430
|
+
if (!this.initialized) {
|
|
431
|
+
throw new Error('RecordingManager has not been initialized');
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
assertAlive() {
|
|
435
|
+
if (this.destroyed) throw new Error('RecordingManager has been destroyed');
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
//# sourceMappingURL=RecordingManager.js.map
|