aspect-sync 0.1.11 → 0.1.13
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 +8 -6
- package/dist/index.js +12 -169
- package/package.json +11 -7
- package/dist/batchManager.d.ts +0 -21
- package/dist/batchManager.d.ts.map +0 -1
- package/dist/batchManager.js +0 -121
- package/dist/batchManager.js.map +0 -1
- package/dist/cliDisplay.d.ts +0 -9
- package/dist/cliDisplay.d.ts.map +0 -1
- package/dist/cliDisplay.js +0 -302
- package/dist/cliDisplay.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/lib/weightedAsyncQueue.d.ts +0 -153
- package/dist/lib/weightedAsyncQueue.d.ts.map +0 -1
- package/dist/lib/weightedAsyncQueue.js +0 -322
- package/dist/lib/weightedAsyncQueue.js.map +0 -1
- package/dist/rclone.d.ts +0 -28
- package/dist/rclone.d.ts.map +0 -1
- package/dist/rclone.js +0 -397
- package/dist/rclone.js.map +0 -1
- package/dist/statusTracker.d.ts +0 -46
- package/dist/statusTracker.d.ts.map +0 -1
- package/dist/statusTracker.js +0 -272
- package/dist/statusTracker.js.map +0 -1
- package/dist/sync.d.ts +0 -9
- package/dist/sync.d.ts.map +0 -1
- package/dist/sync.js +0 -531
- package/dist/sync.js.map +0 -1
- package/dist/types.d.ts +0 -135
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -18
- package/dist/types.js.map +0 -1
- package/dist/uploader.d.ts +0 -7
- package/dist/uploader.d.ts.map +0 -1
- package/dist/uploader.js +0 -203
- package/dist/uploader.js.map +0 -1
- package/dist/util.d.ts +0 -4
- package/dist/util.d.ts.map +0 -1
- package/dist/util.js +0 -41
- package/dist/util.js.map +0 -1
package/dist/types.d.ts
DELETED
|
@@ -1,135 +0,0 @@
|
|
|
1
|
-
export declare enum UploadStatus {
|
|
2
|
-
QUEUED = "queued",
|
|
3
|
-
IN_PROGRESS = "in_progress",
|
|
4
|
-
SUCCESS = "success",
|
|
5
|
-
FAILED = "failed",
|
|
6
|
-
SKIPPED = "skipped"
|
|
7
|
-
}
|
|
8
|
-
export interface UploadFileState {
|
|
9
|
-
fileId: string;
|
|
10
|
-
filePath: string;
|
|
11
|
-
fileName: string;
|
|
12
|
-
relativePath: string;
|
|
13
|
-
totalBytesToUpload: number;
|
|
14
|
-
bytesUploaded: number;
|
|
15
|
-
uploadStatus: UploadStatus;
|
|
16
|
-
createdAt: Date;
|
|
17
|
-
errorMessage?: string;
|
|
18
|
-
retryCount: number;
|
|
19
|
-
assetId?: string;
|
|
20
|
-
uploadId?: string;
|
|
21
|
-
}
|
|
22
|
-
export interface MultipartInitiateResponse {
|
|
23
|
-
upload_id: string;
|
|
24
|
-
asset_id: string;
|
|
25
|
-
}
|
|
26
|
-
export interface MultipartPartUrlResponse {
|
|
27
|
-
url: string;
|
|
28
|
-
url_expires_at: string;
|
|
29
|
-
}
|
|
30
|
-
export interface MultipartUploadPart {
|
|
31
|
-
part_number: number;
|
|
32
|
-
etag: string;
|
|
33
|
-
}
|
|
34
|
-
export interface UploadTotals {
|
|
35
|
-
totalBytesToUpload: number;
|
|
36
|
-
totalBytesUploaded: number;
|
|
37
|
-
totalFileCount: number;
|
|
38
|
-
queuedFileCount: number;
|
|
39
|
-
inProgressFileCount: number;
|
|
40
|
-
successFileCount: number;
|
|
41
|
-
failedFileCount: number;
|
|
42
|
-
skippedFileCount: number;
|
|
43
|
-
}
|
|
44
|
-
export interface RcloneOptions {
|
|
45
|
-
transfers: number;
|
|
46
|
-
checkers: number;
|
|
47
|
-
multiThreadStreams: number;
|
|
48
|
-
multiThreadChunkSize: string;
|
|
49
|
-
multiThreadCutoff: string;
|
|
50
|
-
bufferSize: string;
|
|
51
|
-
useMmap: boolean;
|
|
52
|
-
extraRcloneArgs?: string[];
|
|
53
|
-
}
|
|
54
|
-
export interface SyncConfig {
|
|
55
|
-
remote: string;
|
|
56
|
-
remotePath: string;
|
|
57
|
-
directoryId: string;
|
|
58
|
-
projectId: string;
|
|
59
|
-
apiUrl: string;
|
|
60
|
-
apiKey: string;
|
|
61
|
-
maxConcurrent: number;
|
|
62
|
-
keepLocal: boolean;
|
|
63
|
-
localTempDir: string;
|
|
64
|
-
sessionName: string;
|
|
65
|
-
rcloneOptions: RcloneOptions;
|
|
66
|
-
batchSizeBytes?: number;
|
|
67
|
-
chunkSizeBytes: number;
|
|
68
|
-
}
|
|
69
|
-
export interface DirectoryMapping {
|
|
70
|
-
remotePath: string;
|
|
71
|
-
aspectDirectoryId: string;
|
|
72
|
-
}
|
|
73
|
-
export interface FileToUpload {
|
|
74
|
-
localPath: string;
|
|
75
|
-
fileName: string;
|
|
76
|
-
relativePath: string;
|
|
77
|
-
directoryId: string;
|
|
78
|
-
size: number;
|
|
79
|
-
}
|
|
80
|
-
export interface DirectoryTreeNode {
|
|
81
|
-
id: string;
|
|
82
|
-
name: string;
|
|
83
|
-
parent_id: string;
|
|
84
|
-
children: DirectoryTreeNode[];
|
|
85
|
-
}
|
|
86
|
-
export interface AssetCheckExistsRequestItem {
|
|
87
|
-
directory_id: string;
|
|
88
|
-
name: string;
|
|
89
|
-
size_bytes: number;
|
|
90
|
-
}
|
|
91
|
-
export interface AssetCheckExistsRequest {
|
|
92
|
-
items: AssetCheckExistsRequestItem[];
|
|
93
|
-
delete_if_not_exist: boolean;
|
|
94
|
-
}
|
|
95
|
-
export interface AssetCheckExistsResponseItem {
|
|
96
|
-
exists: boolean;
|
|
97
|
-
asset_id?: string;
|
|
98
|
-
}
|
|
99
|
-
export interface AssetCheckExistsResponse {
|
|
100
|
-
items: AssetCheckExistsResponseItem[];
|
|
101
|
-
}
|
|
102
|
-
export interface RemoteFileListing {
|
|
103
|
-
path: string;
|
|
104
|
-
size: number;
|
|
105
|
-
}
|
|
106
|
-
export interface DownloadProgress {
|
|
107
|
-
bytesTransferred: number;
|
|
108
|
-
totalBytes: number;
|
|
109
|
-
speed: number;
|
|
110
|
-
eta: number;
|
|
111
|
-
percentComplete: number;
|
|
112
|
-
}
|
|
113
|
-
export declare enum BatchPhase {
|
|
114
|
-
DOWNLOADING = "downloading",
|
|
115
|
-
SCANNING = "scanning",
|
|
116
|
-
SYNCING_FOLDERS = "syncing_folders",
|
|
117
|
-
UPLOADING = "uploading",
|
|
118
|
-
CLEANING = "cleaning",
|
|
119
|
-
COMPLETE = "complete"
|
|
120
|
-
}
|
|
121
|
-
export interface BatchProgress {
|
|
122
|
-
currentBatch: number;
|
|
123
|
-
totalBatches: number;
|
|
124
|
-
batchFilesCompleted: number;
|
|
125
|
-
batchFilesTotal: number;
|
|
126
|
-
batchBytesTransferred: number;
|
|
127
|
-
batchBytesTotal: number;
|
|
128
|
-
overallFilesCompleted: number;
|
|
129
|
-
overallFilesTotal: number;
|
|
130
|
-
overallBytesTransferred: number;
|
|
131
|
-
overallBytesTotal: number;
|
|
132
|
-
currentPhase: BatchPhase;
|
|
133
|
-
extraDetails?: string;
|
|
134
|
-
}
|
|
135
|
-
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
export var UploadStatus;
|
|
2
|
-
(function (UploadStatus) {
|
|
3
|
-
UploadStatus["QUEUED"] = "queued";
|
|
4
|
-
UploadStatus["IN_PROGRESS"] = "in_progress";
|
|
5
|
-
UploadStatus["SUCCESS"] = "success";
|
|
6
|
-
UploadStatus["FAILED"] = "failed";
|
|
7
|
-
UploadStatus["SKIPPED"] = "skipped";
|
|
8
|
-
})(UploadStatus || (UploadStatus = {}));
|
|
9
|
-
export var BatchPhase;
|
|
10
|
-
(function (BatchPhase) {
|
|
11
|
-
BatchPhase["DOWNLOADING"] = "downloading";
|
|
12
|
-
BatchPhase["SCANNING"] = "scanning";
|
|
13
|
-
BatchPhase["SYNCING_FOLDERS"] = "syncing_folders";
|
|
14
|
-
BatchPhase["UPLOADING"] = "uploading";
|
|
15
|
-
BatchPhase["CLEANING"] = "cleaning";
|
|
16
|
-
BatchPhase["COMPLETE"] = "complete";
|
|
17
|
-
})(BatchPhase || (BatchPhase = {}));
|
|
18
|
-
//# sourceMappingURL=types.js.map
|
package/dist/types.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,YAMX;AAND,WAAY,YAAY;IACtB,iCAAiB,CAAA;IACjB,2CAA2B,CAAA;IAC3B,mCAAmB,CAAA;IACnB,iCAAiB,CAAA;IACjB,mCAAmB,CAAA;AACrB,CAAC,EANW,YAAY,KAAZ,YAAY,QAMvB;AA2HD,MAAM,CAAN,IAAY,UAOX;AAPD,WAAY,UAAU;IACpB,yCAA2B,CAAA;IAC3B,mCAAqB,CAAA;IACrB,iDAAmC,CAAA;IACnC,qCAAuB,CAAA;IACvB,mCAAqB,CAAA;IACrB,mCAAqB,CAAA;AACvB,CAAC,EAPW,UAAU,KAAV,UAAU,QAOrB"}
|
package/dist/uploader.d.ts
DELETED
package/dist/uploader.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"uploader.d.ts","sourceRoot":"","sources":["../src/uploader.ts"],"names":[],"mappings":"AAKA,OAAO,EAAyG,KAAK,UAAU,EAAE,MAAM,YAAY,CAAA;AAqCnJ,qBAAa,QAAQ;;gBAMP,MAAM,EAAE,UAAU;IAexB,UAAU,CACd,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC;CA4MjB"}
|
package/dist/uploader.js
DELETED
|
@@ -1,203 +0,0 @@
|
|
|
1
|
-
import axios from "axios";
|
|
2
|
-
import * as fs from "fs";
|
|
3
|
-
import * as path from "path";
|
|
4
|
-
import { Readable } from "stream";
|
|
5
|
-
import { statusTracker } from "./statusTracker.js";
|
|
6
|
-
import { WeightedAsyncQueue } from "./lib/weightedAsyncQueue.js";
|
|
7
|
-
const MAX_PART_UPLOAD_RETRIES = 3;
|
|
8
|
-
const MAX_FILE_UPLOAD_RETRIES = 3;
|
|
9
|
-
const sleep = (milliseconds) => {
|
|
10
|
-
return new Promise(resolve => setTimeout(resolve, milliseconds));
|
|
11
|
-
};
|
|
12
|
-
// Helper function to create a readable stream with progress tracking
|
|
13
|
-
function createProgressStream(buffer, onProgress) {
|
|
14
|
-
const PROGRESS_CHUNK_SIZE = 512 * 1024; // Report progress every 512KB
|
|
15
|
-
let offset = 0;
|
|
16
|
-
return new Readable({
|
|
17
|
-
read() {
|
|
18
|
-
if (offset >= buffer.length) {
|
|
19
|
-
this.push(null); // Signal end of stream
|
|
20
|
-
return;
|
|
21
|
-
}
|
|
22
|
-
const end = Math.min(offset + PROGRESS_CHUNK_SIZE, buffer.length);
|
|
23
|
-
const chunk = buffer.subarray(offset, end);
|
|
24
|
-
offset = end;
|
|
25
|
-
// Report progress
|
|
26
|
-
onProgress(offset);
|
|
27
|
-
this.push(chunk);
|
|
28
|
-
}
|
|
29
|
-
});
|
|
30
|
-
}
|
|
31
|
-
export class Uploader {
|
|
32
|
-
#config;
|
|
33
|
-
#apiClient;
|
|
34
|
-
#uploadQueue;
|
|
35
|
-
#chunkSizeBytes;
|
|
36
|
-
constructor(config) {
|
|
37
|
-
this.#config = config;
|
|
38
|
-
this.#apiClient = axios.create({
|
|
39
|
-
baseURL: config.apiUrl,
|
|
40
|
-
headers: {
|
|
41
|
-
"Authorization": `${config.apiKey}`,
|
|
42
|
-
"Content-Type": "application/json",
|
|
43
|
-
}
|
|
44
|
-
});
|
|
45
|
-
this.#uploadQueue = new WeightedAsyncQueue({
|
|
46
|
-
maxConcurrency: config.maxConcurrent
|
|
47
|
-
});
|
|
48
|
-
this.#chunkSizeBytes = config.chunkSizeBytes;
|
|
49
|
-
}
|
|
50
|
-
async uploadFile(fileId, filePath, directoryId) {
|
|
51
|
-
// Proceed with upload
|
|
52
|
-
let retryCount = 0;
|
|
53
|
-
while (retryCount <= MAX_FILE_UPLOAD_RETRIES) {
|
|
54
|
-
try {
|
|
55
|
-
await this.#uploadFileAttempt(fileId, filePath, directoryId);
|
|
56
|
-
statusTracker.markUploadSuccess(fileId);
|
|
57
|
-
return;
|
|
58
|
-
}
|
|
59
|
-
catch (error) {
|
|
60
|
-
retryCount++;
|
|
61
|
-
if (retryCount > MAX_FILE_UPLOAD_RETRIES) {
|
|
62
|
-
const errorMessage = error instanceof Error ? error.message : "Unknown error";
|
|
63
|
-
statusTracker.markUploadFailed(fileId, errorMessage);
|
|
64
|
-
throw error;
|
|
65
|
-
}
|
|
66
|
-
const backoffMs = 2000 * Math.pow(2, retryCount - 1);
|
|
67
|
-
console.error(`File ${fileId} upload attempt ${retryCount}/${MAX_FILE_UPLOAD_RETRIES} failed, retrying in ${backoffMs}ms...`, error);
|
|
68
|
-
statusTracker.resetFileForRetry(fileId);
|
|
69
|
-
await sleep(backoffMs);
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
async #uploadFileAttempt(fileId, filePath, directoryId) {
|
|
74
|
-
const fileStats = await fs.promises.stat(filePath);
|
|
75
|
-
const fileName = path.basename(filePath);
|
|
76
|
-
// Calculate weight based on file size
|
|
77
|
-
const totalChunks = Math.max(1, Math.ceil(fileStats.size / this.#chunkSizeBytes)); // some files are 0 bytes, so we need to set a minimum of 1 chunk
|
|
78
|
-
const weight = totalChunks;
|
|
79
|
-
// Enqueue the upload task with proper weight
|
|
80
|
-
await this.#uploadQueue.enqueue(weight, async (taskController) => {
|
|
81
|
-
const { upload_id, asset_id } = await this.#initiateMultipartUpload(directoryId, fileName, fileStats.size);
|
|
82
|
-
const fileHandle = await fs.promises.open(filePath, "r");
|
|
83
|
-
const parts = [];
|
|
84
|
-
const uploadedChunkBytes = new Array(totalChunks).fill(0);
|
|
85
|
-
const calculateTotalProgress = () => {
|
|
86
|
-
return uploadedChunkBytes.reduce((sum, bytes) => sum + bytes, 0);
|
|
87
|
-
};
|
|
88
|
-
const uploadOneChunk = async (chunkIndex) => {
|
|
89
|
-
const partNumber = chunkIndex + 1;
|
|
90
|
-
const start = chunkIndex * this.#chunkSizeBytes;
|
|
91
|
-
const end = Math.min(start + this.#chunkSizeBytes, fileStats.size);
|
|
92
|
-
const chunkSize = end - start;
|
|
93
|
-
const buffer = Buffer.alloc(chunkSize);
|
|
94
|
-
await fileHandle.read(buffer, 0, chunkSize, start);
|
|
95
|
-
const { url } = await this.#getMultipartPartUrl(asset_id, upload_id, partNumber);
|
|
96
|
-
// Create progress-tracking stream
|
|
97
|
-
const stream = createProgressStream(buffer, (bytesUploaded) => {
|
|
98
|
-
uploadedChunkBytes[chunkIndex] = bytesUploaded;
|
|
99
|
-
const totalProgress = calculateTotalProgress();
|
|
100
|
-
statusTracker.updateUploadProgress(fileId, totalProgress);
|
|
101
|
-
});
|
|
102
|
-
// Use native fetch with streaming body
|
|
103
|
-
const response = await fetch(url, {
|
|
104
|
-
method: "PUT",
|
|
105
|
-
body: stream, // Node.js accepts Readable streams
|
|
106
|
-
headers: {
|
|
107
|
-
"Content-Type": "",
|
|
108
|
-
"Content-Length": chunkSize.toString(),
|
|
109
|
-
},
|
|
110
|
-
// @ts-ignore - duplex is required for streaming request body in Node.js
|
|
111
|
-
duplex: "half",
|
|
112
|
-
});
|
|
113
|
-
if (!response.ok) {
|
|
114
|
-
throw new Error(`Upload failed with status ${response.status}: ${await response.text()}`);
|
|
115
|
-
}
|
|
116
|
-
const etag = response.headers.get("etag");
|
|
117
|
-
if (!etag) {
|
|
118
|
-
throw new Error(`No ETag returned for part ${partNumber}`);
|
|
119
|
-
}
|
|
120
|
-
parts.push({
|
|
121
|
-
part_number: partNumber,
|
|
122
|
-
etag: etag.replace(/"/g, ""),
|
|
123
|
-
});
|
|
124
|
-
uploadedChunkBytes[chunkIndex] = chunkSize;
|
|
125
|
-
statusTracker.updateUploadProgress(fileId, calculateTotalProgress());
|
|
126
|
-
};
|
|
127
|
-
const uploadOneChunkWithRetry = async (chunkIndex) => {
|
|
128
|
-
let lastError;
|
|
129
|
-
for (let attempt = 0; attempt < MAX_PART_UPLOAD_RETRIES; attempt++) {
|
|
130
|
-
try {
|
|
131
|
-
uploadedChunkBytes[chunkIndex] = 0;
|
|
132
|
-
statusTracker.updateUploadProgress(fileId, calculateTotalProgress());
|
|
133
|
-
await uploadOneChunk(chunkIndex);
|
|
134
|
-
return;
|
|
135
|
-
}
|
|
136
|
-
catch (error) {
|
|
137
|
-
lastError = error instanceof Error ? error : new Error(String(error));
|
|
138
|
-
if (attempt === MAX_PART_UPLOAD_RETRIES - 1) {
|
|
139
|
-
throw lastError;
|
|
140
|
-
}
|
|
141
|
-
uploadedChunkBytes[chunkIndex] = 0;
|
|
142
|
-
statusTracker.updateUploadProgress(fileId, calculateTotalProgress());
|
|
143
|
-
const backoffMs = 1000 * Math.pow(2, attempt);
|
|
144
|
-
console.error(`Part ${chunkIndex + 1} failed (attempt ${attempt + 1}/${MAX_PART_UPLOAD_RETRIES}), retrying in ${backoffMs}ms...`, lastError);
|
|
145
|
-
await sleep(backoffMs);
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
throw lastError || new Error("Unknown error during chunk upload");
|
|
149
|
-
};
|
|
150
|
-
const promises = [];
|
|
151
|
-
try {
|
|
152
|
-
for (let chunkIndex = 0; chunkIndex < totalChunks; chunkIndex++) {
|
|
153
|
-
await taskController.acquire();
|
|
154
|
-
promises.push((async () => {
|
|
155
|
-
try {
|
|
156
|
-
await uploadOneChunkWithRetry(chunkIndex);
|
|
157
|
-
taskController.release();
|
|
158
|
-
}
|
|
159
|
-
catch (e) {
|
|
160
|
-
taskController.release();
|
|
161
|
-
throw e;
|
|
162
|
-
}
|
|
163
|
-
})());
|
|
164
|
-
}
|
|
165
|
-
await Promise.all(promises);
|
|
166
|
-
await this.#completeMultipartUpload(asset_id, upload_id, parts.sort((a, b) => a.part_number - b.part_number));
|
|
167
|
-
}
|
|
168
|
-
catch (error) {
|
|
169
|
-
await this.#abortMultipartUpload(asset_id, upload_id).catch(e => {
|
|
170
|
-
console.error("Failed to abort multipart upload:", e);
|
|
171
|
-
});
|
|
172
|
-
throw error;
|
|
173
|
-
}
|
|
174
|
-
finally {
|
|
175
|
-
await fileHandle.close();
|
|
176
|
-
}
|
|
177
|
-
}, fileId);
|
|
178
|
-
}
|
|
179
|
-
async #initiateMultipartUpload(directoryId, fileName, sizeBytes) {
|
|
180
|
-
const response = await this.#apiClient.post("/assets/multipart/initiate", {
|
|
181
|
-
directory_id: directoryId,
|
|
182
|
-
name: fileName,
|
|
183
|
-
size_bytes: sizeBytes,
|
|
184
|
-
});
|
|
185
|
-
return response.data;
|
|
186
|
-
}
|
|
187
|
-
async #getMultipartPartUrl(assetId, uploadId, partNumber) {
|
|
188
|
-
const response = await this.#apiClient.get(`/assets/${assetId}/multipart/part/${partNumber}?upload_id=${encodeURIComponent(uploadId)}`);
|
|
189
|
-
return response.data;
|
|
190
|
-
}
|
|
191
|
-
async #completeMultipartUpload(assetId, uploadId, parts) {
|
|
192
|
-
await this.#apiClient.post(`/assets/${assetId}/multipart/complete`, {
|
|
193
|
-
upload_id: uploadId,
|
|
194
|
-
parts: parts,
|
|
195
|
-
});
|
|
196
|
-
}
|
|
197
|
-
async #abortMultipartUpload(assetId, uploadId) {
|
|
198
|
-
await this.#apiClient.post(`/assets/${assetId}/multipart/abort`, {
|
|
199
|
-
upload_id: uploadId,
|
|
200
|
-
});
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
//# sourceMappingURL=uploader.js.map
|
package/dist/uploader.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"uploader.js","sourceRoot":"","sources":["../src/uploader.ts"],"names":[],"mappings":"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"}
|
package/dist/util.d.ts
DELETED
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
export declare const formatBytes: (bytes: number, decimals?: number) => string;
|
|
2
|
-
export declare const formatSpeed: (bytesPerSecond: number | null) => string | null;
|
|
3
|
-
export declare const formatTimeRemaining: (seconds: number | null) => string | null;
|
|
4
|
-
//# sourceMappingURL=util.d.ts.map
|
package/dist/util.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,WAAW,GAAI,OAAO,MAAM,EAAE,WAAU,MAAU,KAAG,MAajE,CAAA;AAED,eAAO,MAAM,WAAW,GAAI,gBAAgB,MAAM,GAAG,IAAI,KAAG,MAAM,GAAG,IAiBpE,CAAA;AAED,eAAO,MAAM,mBAAmB,GAAI,SAAS,MAAM,GAAG,IAAI,KAAG,MAAM,GAAG,IAkBrE,CAAA"}
|
package/dist/util.js
DELETED
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
export const formatBytes = (bytes, decimals = 2) => {
|
|
2
|
-
if (bytes === 0) {
|
|
3
|
-
return "0 B";
|
|
4
|
-
}
|
|
5
|
-
const k = 1024;
|
|
6
|
-
const dm = decimals < 0 ? 0 : decimals;
|
|
7
|
-
const sizes = ["B", "KB", "MB", "GB", "TB", "PB", "EB"];
|
|
8
|
-
const i = Math.floor(Math.log(bytes) / Math.log(k));
|
|
9
|
-
const size = bytes / Math.pow(k, i);
|
|
10
|
-
return `${size.toFixed(dm)} ${sizes[i]}`;
|
|
11
|
-
};
|
|
12
|
-
export const formatSpeed = (bytesPerSecond) => {
|
|
13
|
-
if (bytesPerSecond === null) {
|
|
14
|
-
return null;
|
|
15
|
-
}
|
|
16
|
-
// Convert bytes per second to bits per second
|
|
17
|
-
const bitsPerSecond = bytesPerSecond * 8;
|
|
18
|
-
// Convert to megabits per second
|
|
19
|
-
const mbps = bitsPerSecond / (1024 * 1024);
|
|
20
|
-
if (mbps < 1) {
|
|
21
|
-
const kbps = mbps * 1024;
|
|
22
|
-
return `${kbps.toFixed(0)} Kb/s`;
|
|
23
|
-
}
|
|
24
|
-
return `${mbps.toFixed(1)} Mb/s`;
|
|
25
|
-
};
|
|
26
|
-
export const formatTimeRemaining = (seconds) => {
|
|
27
|
-
if (seconds === null) {
|
|
28
|
-
return null;
|
|
29
|
-
}
|
|
30
|
-
const hours = Math.floor(seconds / 3600);
|
|
31
|
-
const minutes = Math.floor((seconds % 3600) / 60);
|
|
32
|
-
const secs = Math.floor(seconds % 60);
|
|
33
|
-
if (hours > 0) {
|
|
34
|
-
return `${hours}h ${minutes}m`;
|
|
35
|
-
}
|
|
36
|
-
if (minutes > 0) {
|
|
37
|
-
return `${minutes}m ${secs}s`;
|
|
38
|
-
}
|
|
39
|
-
return `${secs}s`;
|
|
40
|
-
};
|
|
41
|
-
//# sourceMappingURL=util.js.map
|
package/dist/util.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,KAAa,EAAE,WAAmB,CAAC,EAAU,EAAE;IACzE,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;QAChB,OAAO,KAAK,CAAA;IACd,CAAC;IAED,MAAM,CAAC,GAAG,IAAI,CAAA;IACd,MAAM,EAAE,GAAG,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAA;IACtC,MAAM,KAAK,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;IAEvD,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;IACnD,MAAM,IAAI,GAAG,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IAEnC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAA;AAC1C,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,cAA6B,EAAiB,EAAE;IAC1E,IAAI,cAAc,KAAK,IAAI,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAA;IACb,CAAC;IAED,8CAA8C;IAC9C,MAAM,aAAa,GAAG,cAAc,GAAG,CAAC,CAAA;IAExC,iCAAiC;IACjC,MAAM,IAAI,GAAG,aAAa,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAA;IAE1C,IAAI,IAAI,GAAG,CAAC,EAAE,CAAC;QACb,MAAM,IAAI,GAAG,IAAI,GAAG,IAAI,CAAA;QACxB,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAA;IAClC,CAAC;IAED,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAA;AAClC,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,OAAsB,EAAiB,EAAE;IAC3E,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACrB,OAAO,IAAI,CAAA;IACb,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,CAAA;IACxC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAA;IACjD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAA;IAErC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACd,OAAO,GAAG,KAAK,KAAK,OAAO,GAAG,CAAA;IAChC,CAAC;IAED,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;QAChB,OAAO,GAAG,OAAO,KAAK,IAAI,GAAG,CAAA;IAC/B,CAAC;IAED,OAAO,GAAG,IAAI,GAAG,CAAA;AACnB,CAAC,CAAA"}
|