@visionfi/desktop-sdk
Version:
Desktop SDK for VisionFI Cloud Run services with Azure AD authentication
89 lines (88 loc) • 3.3 kB
JavaScript
/**
* Document Client - handles document operations for packages in Desktop SDK
* Copyright (c) 2024-2025 VisionFI. All Rights Reserved.
*/
import { VisionFiError } from '@visionfi/core';
export class DocumentClient {
apiClient;
constructor(apiClient) {
this.apiClient = apiClient;
}
/**
* Add documents to a package
*/
async add(packageId, options) {
try {
const response = await this.apiClient.post(`/operations/packages/${packageId}/documents`, options);
return response.data;
}
catch (error) {
throw this.handleError(error, 'Failed to add documents to package');
}
}
/**
* Add a single file to a package with optional progress tracking
*/
async addFile(packageId, fileBase64, fileName, onProgress) {
try {
const totalBytes = Math.floor(fileBase64.length * 0.75); // Approximate size from base64
let bytesUploaded = 0;
const startTime = Date.now();
// Simulate progress for demo (in real implementation, use axios upload progress)
if (onProgress) {
const progressInterval = setInterval(() => {
bytesUploaded = Math.min(bytesUploaded + totalBytes / 10, totalBytes);
const percentage = Math.round((bytesUploaded / totalBytes) * 100);
const elapsedTime = (Date.now() - startTime) / 1000;
const speed = bytesUploaded / elapsedTime;
const remainingTime = (totalBytes - bytesUploaded) / speed;
onProgress({
fileName,
bytesUploaded,
totalBytes,
percentage,
speed,
remainingTime
});
if (bytesUploaded >= totalBytes) {
clearInterval(progressInterval);
}
}, 100);
}
const response = await this.apiClient.post(`/operations/packages/${packageId}/documents`, {
files: [{
fileName,
fileBase64
}]
});
return response.data;
}
catch (error) {
throw this.handleError(error, 'Failed to add file to package');
}
}
/**
* Delete a document from a package
*/
async delete(packageId, documentUuid) {
try {
const response = await this.apiClient.delete(`/operations/packages/${packageId}/documents/${documentUuid}`);
return response.data;
}
catch (error) {
throw this.handleError(error, 'Failed to delete document from package');
}
}
/**
* Handle errors consistently
*/
handleError(error, defaultMessage) {
if (error instanceof VisionFiError) {
return error;
}
const message = error.response?.data?.message || error.message || defaultMessage;
const statusCode = error.response?.status;
const code = error.response?.data?.code || 'unknown_error';
return new VisionFiError(message, statusCode, code);
}
}