aspect-sync 0.1.10 → 0.1.12

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/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
@@ -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"}
@@ -1,7 +0,0 @@
1
- import { type SyncConfig } from "./types.js";
2
- export declare class Uploader {
3
- #private;
4
- constructor(config: SyncConfig);
5
- uploadFile(fileId: string, filePath: string, directoryId: string): Promise<void>;
6
- }
7
- //# sourceMappingURL=uploader.d.ts.map
@@ -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
@@ -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
@@ -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"}