import {BleProtocolService} from './BleProtocolService'; import {APP_COMMAND_TYPES, COMMAND_TYPES} from '../protocol/Constants'; export class FileTransferService { private static instance: FileTransferService; private protocol = BleProtocolService.getInstance(); private constructor() { } public static getInstance(): FileTransferService { if (!FileTransferService.instance) { FileTransferService.instance = new FileTransferService(); } return FileTransferService.instance; } public async transferFile(deviceId: string, file: string | ArrayBuffer, type: APP_COMMAND_TYPES, onProgress?: (progress: number) => void): Promise { try { const startAt = Date.now(); let arrayBuffer: ArrayBuffer; if (file instanceof ArrayBuffer) { arrayBuffer = file } else { const response = await fetch(file); if (!response.ok) { throw new Error(`Failed to load file: ${response.statusText}`); } const blob = await response.blob(); const reader = new FileReader(); arrayBuffer = await new Promise((resolve, reject) => { reader.onload = () => resolve(reader.result as ArrayBuffer); reader.onerror = reject; reader.readAsArrayBuffer(blob); }); } await this.protocol.send(deviceId, type, arrayBuffer, onProgress); const transferredAt = Date.now(); console.debug(`File transferred in ${(transferredAt - startAt) / 1000} s`); } catch (e) { console.error("File transfer failed", e); throw e; } } public async transferTestPackage(deviceId: string, onProgress?: (progress: number) => void) { const arrayBuffer = new Uint8Array(512); console.debug(`test package size = ${arrayBuffer.byteLength}`) await this.protocol.send(deviceId, COMMAND_TYPES.TRANSFER_ANI_VIDEO, arrayBuffer, onProgress); } public async transferOta(deviceId: string, filePath: string) { return this.transferFile(deviceId, filePath, COMMAND_TYPES.OTA_PACKAGE); } public async transferBootAnimation(deviceId: string, filePath: string) { return this.transferFile(deviceId, filePath, COMMAND_TYPES.TRANSFER_BOOT_ANIMATION); } public async transferWatchfaceStyle(deviceId: string, filePath: string) { return this.transferFile(deviceId, filePath, COMMAND_TYPES.TRANSFER_AVI_VIDEO); } }