aspect-sync 0.0.1
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 +278 -0
- package/dist/cliDisplay.d.ts +8 -0
- package/dist/cliDisplay.d.ts.map +1 -0
- package/dist/cliDisplay.js +101 -0
- package/dist/cliDisplay.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +55 -0
- package/dist/index.js.map +1 -0
- package/dist/rclone.d.ts +17 -0
- package/dist/rclone.d.ts.map +1 -0
- package/dist/rclone.js +164 -0
- package/dist/rclone.js.map +1 -0
- package/dist/statusTracker.d.ts +36 -0
- package/dist/statusTracker.d.ts.map +1 -0
- package/dist/statusTracker.js +205 -0
- package/dist/statusTracker.js.map +1 -0
- package/dist/sync.d.ts +7 -0
- package/dist/sync.d.ts.map +1 -0
- package/dist/sync.js +185 -0
- package/dist/sync.js.map +1 -0
- package/dist/types.d.ts +63 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +8 -0
- package/dist/types.js.map +1 -0
- package/dist/uploader.d.ts +13 -0
- package/dist/uploader.d.ts.map +1 -0
- package/dist/uploader.js +220 -0
- package/dist/uploader.js.map +1 -0
- package/package.json +47 -0
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { type UploadFileState, type UploadTotals } from "./types.js";
|
|
2
|
+
interface UploadDataPoint {
|
|
3
|
+
timestamp: number;
|
|
4
|
+
bytes: number;
|
|
5
|
+
}
|
|
6
|
+
interface UploadSpeedState {
|
|
7
|
+
dataPoints: UploadDataPoint[];
|
|
8
|
+
}
|
|
9
|
+
export interface UploadStats {
|
|
10
|
+
uploadSpeedMbps: number | null;
|
|
11
|
+
timeRemainingSeconds: number | null;
|
|
12
|
+
formattedSpeed: string;
|
|
13
|
+
formattedTime: string;
|
|
14
|
+
}
|
|
15
|
+
declare class StatusTrackerClass {
|
|
16
|
+
uploadFiles: Record<string, UploadFileState>;
|
|
17
|
+
uploadSpeedState: UploadSpeedState;
|
|
18
|
+
uploadStats: UploadStats;
|
|
19
|
+
addUploadFile(fileId: string, filePath: string, fileName: string, fileSize: number): void;
|
|
20
|
+
updateUploadProgress(fileId: string, bytesUploaded: number): void;
|
|
21
|
+
markUploadSuccess(fileId: string): void;
|
|
22
|
+
markUploadFailed(fileId: string, errorMessage: string): void;
|
|
23
|
+
resetFileForRetry(fileId: string): void;
|
|
24
|
+
getUploadFile(fileId: string): UploadFileState | undefined;
|
|
25
|
+
getUploadTotals(): UploadTotals;
|
|
26
|
+
getAllUploadFiles(): UploadFileState[];
|
|
27
|
+
getInProgressFiles(): UploadFileState[];
|
|
28
|
+
getUploadSpeedMbps(): number | null;
|
|
29
|
+
getTimeRemainingSeconds(): number | null;
|
|
30
|
+
updateUploadStats(): void;
|
|
31
|
+
private formatSpeed;
|
|
32
|
+
private formatTimeRemaining;
|
|
33
|
+
}
|
|
34
|
+
export declare const statusTracker: StatusTrackerClass;
|
|
35
|
+
export {};
|
|
36
|
+
//# sourceMappingURL=statusTracker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"statusTracker.d.ts","sourceRoot":"","sources":["../src/statusTracker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,eAAe,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAA;AAKlF,UAAU,eAAe;IACvB,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,MAAM,CAAA;CACd;AAED,UAAU,gBAAgB;IACxB,UAAU,EAAE,eAAe,EAAE,CAAA;CAC9B;AAED,MAAM,WAAW,WAAW;IAC1B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAA;IACnC,cAAc,EAAE,MAAM,CAAA;IACtB,aAAa,EAAE,MAAM,CAAA;CACtB;AAED,cAAM,kBAAkB;IACtB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAK;IACjD,gBAAgB,EAAE,gBAAgB,CAEjC;IACD,WAAW,EAAE,WAAW,CAKvB;IAED,aAAa,CACX,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GACf,IAAI;IAaP,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI;IA6BjE,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAmBvC,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI;IAoB5D,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAavC,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAI1D,eAAe,IAAI,YAAY;IAwC/B,iBAAiB,IAAI,eAAe,EAAE;IAItC,kBAAkB,IAAI,eAAe,EAAE;IAMvC,kBAAkB,IAAI,MAAM,GAAG,IAAI;IAsBnC,uBAAuB,IAAI,MAAM,GAAG,IAAI;IA6BxC,iBAAiB,IAAI,IAAI;IAYzB,OAAO,CAAC,WAAW;IAanB,OAAO,CAAC,mBAAmB;CAmB5B;AAED,eAAO,MAAM,aAAa,oBAA2B,CAAA"}
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
import { UploadStatus } from "./types.js";
|
|
2
|
+
const MAX_DATA_POINTS = 100;
|
|
3
|
+
const MIN_DATA_POINTS_FOR_STATS = 10;
|
|
4
|
+
class StatusTrackerClass {
|
|
5
|
+
uploadFiles = {};
|
|
6
|
+
uploadSpeedState = {
|
|
7
|
+
dataPoints: []
|
|
8
|
+
};
|
|
9
|
+
uploadStats = {
|
|
10
|
+
uploadSpeedMbps: null,
|
|
11
|
+
timeRemainingSeconds: null,
|
|
12
|
+
formattedSpeed: "Calculating...",
|
|
13
|
+
formattedTime: "Calculating..."
|
|
14
|
+
};
|
|
15
|
+
addUploadFile(fileId, filePath, fileName, fileSize) {
|
|
16
|
+
this.uploadFiles[fileId] = {
|
|
17
|
+
fileId,
|
|
18
|
+
filePath,
|
|
19
|
+
fileName,
|
|
20
|
+
totalBytesToUpload: fileSize,
|
|
21
|
+
bytesUploaded: 0,
|
|
22
|
+
uploadStatus: UploadStatus.QUEUED,
|
|
23
|
+
createdAt: new Date(),
|
|
24
|
+
retryCount: 0,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
updateUploadProgress(fileId, bytesUploaded) {
|
|
28
|
+
const currentFile = this.uploadFiles[fileId];
|
|
29
|
+
if (!currentFile)
|
|
30
|
+
return;
|
|
31
|
+
const newStatus = bytesUploaded > 0 && currentFile.uploadStatus === UploadStatus.QUEUED
|
|
32
|
+
? UploadStatus.IN_PROGRESS
|
|
33
|
+
: currentFile.uploadStatus;
|
|
34
|
+
const actualBytesUploaded = Math.min(bytesUploaded, currentFile.totalBytesToUpload);
|
|
35
|
+
const totals = this.getUploadTotals();
|
|
36
|
+
const currentTotalBytes = totals.totalBytesUploaded - currentFile.bytesUploaded + actualBytesUploaded;
|
|
37
|
+
const now = Date.now();
|
|
38
|
+
const newDataPoints = [...this.uploadSpeedState.dataPoints, { timestamp: now, bytes: currentTotalBytes }];
|
|
39
|
+
if (newDataPoints.length > MAX_DATA_POINTS) {
|
|
40
|
+
newDataPoints.shift();
|
|
41
|
+
}
|
|
42
|
+
this.uploadFiles[fileId] = {
|
|
43
|
+
...currentFile,
|
|
44
|
+
bytesUploaded: actualBytesUploaded,
|
|
45
|
+
uploadStatus: newStatus
|
|
46
|
+
};
|
|
47
|
+
this.uploadSpeedState.dataPoints = newDataPoints;
|
|
48
|
+
}
|
|
49
|
+
markUploadSuccess(fileId) {
|
|
50
|
+
const currentFile = this.uploadFiles[fileId];
|
|
51
|
+
if (!currentFile)
|
|
52
|
+
return;
|
|
53
|
+
this.uploadFiles[fileId] = {
|
|
54
|
+
...currentFile,
|
|
55
|
+
uploadStatus: UploadStatus.SUCCESS,
|
|
56
|
+
bytesUploaded: currentFile.totalBytesToUpload
|
|
57
|
+
};
|
|
58
|
+
const hasActiveUploads = Object.values(this.uploadFiles).some(file => file.uploadStatus === UploadStatus.QUEUED || file.uploadStatus === UploadStatus.IN_PROGRESS);
|
|
59
|
+
if (!hasActiveUploads) {
|
|
60
|
+
this.uploadSpeedState.dataPoints = [];
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
markUploadFailed(fileId, errorMessage) {
|
|
64
|
+
const currentFile = this.uploadFiles[fileId];
|
|
65
|
+
if (!currentFile)
|
|
66
|
+
return;
|
|
67
|
+
this.uploadFiles[fileId] = {
|
|
68
|
+
...currentFile,
|
|
69
|
+
uploadStatus: UploadStatus.FAILED,
|
|
70
|
+
errorMessage,
|
|
71
|
+
bytesUploaded: 0
|
|
72
|
+
};
|
|
73
|
+
const hasActiveUploads = Object.values(this.uploadFiles).some(file => file.uploadStatus === UploadStatus.QUEUED || file.uploadStatus === UploadStatus.IN_PROGRESS);
|
|
74
|
+
if (!hasActiveUploads) {
|
|
75
|
+
this.uploadSpeedState.dataPoints = [];
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
resetFileForRetry(fileId) {
|
|
79
|
+
const currentFile = this.uploadFiles[fileId];
|
|
80
|
+
if (!currentFile)
|
|
81
|
+
return;
|
|
82
|
+
this.uploadFiles[fileId] = {
|
|
83
|
+
...currentFile,
|
|
84
|
+
uploadStatus: UploadStatus.QUEUED,
|
|
85
|
+
bytesUploaded: 0,
|
|
86
|
+
errorMessage: undefined,
|
|
87
|
+
retryCount: currentFile.retryCount + 1,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
getUploadFile(fileId) {
|
|
91
|
+
return this.uploadFiles[fileId];
|
|
92
|
+
}
|
|
93
|
+
getUploadTotals() {
|
|
94
|
+
const files = Object.values(this.uploadFiles);
|
|
95
|
+
return files.reduce((totals, file) => {
|
|
96
|
+
if (file.uploadStatus !== UploadStatus.FAILED) {
|
|
97
|
+
totals.totalBytesToUpload += file.totalBytesToUpload;
|
|
98
|
+
totals.totalBytesUploaded += file.bytesUploaded;
|
|
99
|
+
}
|
|
100
|
+
totals.totalFileCount += 1;
|
|
101
|
+
switch (file.uploadStatus) {
|
|
102
|
+
case UploadStatus.QUEUED:
|
|
103
|
+
totals.queuedFileCount += 1;
|
|
104
|
+
break;
|
|
105
|
+
case UploadStatus.IN_PROGRESS:
|
|
106
|
+
totals.inProgressFileCount += 1;
|
|
107
|
+
break;
|
|
108
|
+
case UploadStatus.SUCCESS:
|
|
109
|
+
totals.successFileCount += 1;
|
|
110
|
+
break;
|
|
111
|
+
case UploadStatus.FAILED:
|
|
112
|
+
totals.failedFileCount += 1;
|
|
113
|
+
break;
|
|
114
|
+
}
|
|
115
|
+
return totals;
|
|
116
|
+
}, {
|
|
117
|
+
totalBytesToUpload: 0,
|
|
118
|
+
totalBytesUploaded: 0,
|
|
119
|
+
totalFileCount: 0,
|
|
120
|
+
queuedFileCount: 0,
|
|
121
|
+
inProgressFileCount: 0,
|
|
122
|
+
successFileCount: 0,
|
|
123
|
+
failedFileCount: 0
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
getAllUploadFiles() {
|
|
127
|
+
return Object.values(this.uploadFiles);
|
|
128
|
+
}
|
|
129
|
+
getInProgressFiles() {
|
|
130
|
+
return Object.values(this.uploadFiles).filter(file => file.uploadStatus === UploadStatus.IN_PROGRESS);
|
|
131
|
+
}
|
|
132
|
+
getUploadSpeedMbps() {
|
|
133
|
+
const dataPoints = this.uploadSpeedState.dataPoints;
|
|
134
|
+
if (dataPoints.length < 2) {
|
|
135
|
+
return null;
|
|
136
|
+
}
|
|
137
|
+
const firstPoint = dataPoints[0];
|
|
138
|
+
const lastPoint = dataPoints[dataPoints.length - 1];
|
|
139
|
+
const timeDeltaSeconds = (lastPoint.timestamp - firstPoint.timestamp) / 1000;
|
|
140
|
+
const bytesDelta = lastPoint.bytes - firstPoint.bytes;
|
|
141
|
+
if (timeDeltaSeconds < 0.1 && dataPoints.length < MIN_DATA_POINTS_FOR_STATS) {
|
|
142
|
+
return null;
|
|
143
|
+
}
|
|
144
|
+
const speedBps = bytesDelta / timeDeltaSeconds;
|
|
145
|
+
return (speedBps * 8) / (1024 * 1024);
|
|
146
|
+
}
|
|
147
|
+
getTimeRemainingSeconds() {
|
|
148
|
+
const totals = this.getUploadTotals();
|
|
149
|
+
const dataPoints = this.uploadSpeedState.dataPoints;
|
|
150
|
+
const hasActiveUploads = totals.queuedFileCount > 0 || totals.inProgressFileCount > 0;
|
|
151
|
+
if (!hasActiveUploads) {
|
|
152
|
+
return null;
|
|
153
|
+
}
|
|
154
|
+
if (dataPoints.length < 2) {
|
|
155
|
+
return null;
|
|
156
|
+
}
|
|
157
|
+
const firstPoint = dataPoints[0];
|
|
158
|
+
const lastPoint = dataPoints[dataPoints.length - 1];
|
|
159
|
+
const timeDeltaSeconds = (lastPoint.timestamp - firstPoint.timestamp) / 1000;
|
|
160
|
+
const bytesDelta = lastPoint.bytes - firstPoint.bytes;
|
|
161
|
+
if (timeDeltaSeconds < 0.1 && dataPoints.length < MIN_DATA_POINTS_FOR_STATS) {
|
|
162
|
+
return null;
|
|
163
|
+
}
|
|
164
|
+
const speedBps = bytesDelta / timeDeltaSeconds;
|
|
165
|
+
const bytesRemaining = totals.totalBytesToUpload - totals.totalBytesUploaded;
|
|
166
|
+
return bytesRemaining / speedBps;
|
|
167
|
+
}
|
|
168
|
+
updateUploadStats() {
|
|
169
|
+
const uploadSpeedMbps = this.getUploadSpeedMbps();
|
|
170
|
+
const timeRemainingSeconds = this.getTimeRemainingSeconds();
|
|
171
|
+
this.uploadStats = {
|
|
172
|
+
uploadSpeedMbps,
|
|
173
|
+
timeRemainingSeconds,
|
|
174
|
+
formattedSpeed: this.formatSpeed(uploadSpeedMbps),
|
|
175
|
+
formattedTime: this.formatTimeRemaining(timeRemainingSeconds)
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
formatSpeed(mbps) {
|
|
179
|
+
if (mbps === null) {
|
|
180
|
+
return "Calculating...";
|
|
181
|
+
}
|
|
182
|
+
if (mbps < 1) {
|
|
183
|
+
const kbps = mbps * 1000;
|
|
184
|
+
return `${kbps.toFixed(0)} Kb/s`;
|
|
185
|
+
}
|
|
186
|
+
return `${mbps.toFixed(1)} Mb/s`;
|
|
187
|
+
}
|
|
188
|
+
formatTimeRemaining(seconds) {
|
|
189
|
+
if (seconds === null) {
|
|
190
|
+
return "Calculating...";
|
|
191
|
+
}
|
|
192
|
+
const hours = Math.floor(seconds / 3600);
|
|
193
|
+
const minutes = Math.floor((seconds % 3600) / 60);
|
|
194
|
+
const secs = Math.floor(seconds % 60);
|
|
195
|
+
if (hours > 0) {
|
|
196
|
+
return `${hours}h ${minutes}m left`;
|
|
197
|
+
}
|
|
198
|
+
if (minutes > 0) {
|
|
199
|
+
return `${minutes}m ${secs}s left`;
|
|
200
|
+
}
|
|
201
|
+
return `${secs}s left`;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
export const statusTracker = new StatusTrackerClass();
|
|
205
|
+
//# sourceMappingURL=statusTracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"statusTracker.js","sourceRoot":"","sources":["../src/statusTracker.ts"],"names":[],"mappings":"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"}
|
package/dist/sync.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../src/sync.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,UAAU,EAAoB,MAAM,YAAY,CAAA;AAS9D,qBAAa,gBAAgB;;gBAOf,MAAM,EAAE,UAAU;IAaxB,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CA4M3B"}
|
package/dist/sync.js
ADDED
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import * as fs from "fs";
|
|
2
|
+
import * as path from "path";
|
|
3
|
+
import axios from "axios";
|
|
4
|
+
import { v4 as uuidv4 } from "uuid";
|
|
5
|
+
import { statusTracker } from "./statusTracker.js";
|
|
6
|
+
import { Uploader, createTaskController } from "./uploader.js";
|
|
7
|
+
import { cliDisplay } from "./cliDisplay.js";
|
|
8
|
+
import { checkRcloneInstalled, syncFromRemote, scanLocalDirectory, deleteLocalFile, deleteEmptyDirectories, } from "./rclone.js";
|
|
9
|
+
export class SyncOrchestrator {
|
|
10
|
+
#config;
|
|
11
|
+
#uploader;
|
|
12
|
+
#taskController;
|
|
13
|
+
#apiClient;
|
|
14
|
+
#directoryCache = new Map(); // relativePath -> directoryId
|
|
15
|
+
constructor(config) {
|
|
16
|
+
this.#config = config;
|
|
17
|
+
this.#uploader = new Uploader(config);
|
|
18
|
+
this.#taskController = createTaskController(config.maxConcurrent);
|
|
19
|
+
this.#apiClient = axios.create({
|
|
20
|
+
baseURL: config.apiUrl,
|
|
21
|
+
headers: {
|
|
22
|
+
"Authorization": `Bearer ${config.apiKey}`,
|
|
23
|
+
"Content-Type": "application/json",
|
|
24
|
+
},
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
async run() {
|
|
28
|
+
console.log("Starting data sync...");
|
|
29
|
+
console.log(`Remote: ${this.#config.remote}:${this.#config.remotePath}`);
|
|
30
|
+
console.log(`Root directory ID: ${this.#config.directoryId}`);
|
|
31
|
+
console.log(`Project ID: ${this.#config.projectId}`);
|
|
32
|
+
console.log("");
|
|
33
|
+
// Step 1: Check rclone is installed
|
|
34
|
+
console.log("Checking rclone installation...");
|
|
35
|
+
await checkRcloneInstalled();
|
|
36
|
+
console.log("✓ rclone is installed");
|
|
37
|
+
console.log("");
|
|
38
|
+
// Step 2: Ensure local temp directory exists
|
|
39
|
+
await fs.promises.mkdir(this.#config.localTempDir, { recursive: true });
|
|
40
|
+
// Step 3: Sync files from remote to local
|
|
41
|
+
console.log("Syncing files from remote...");
|
|
42
|
+
await syncFromRemote(this.#config.remote, this.#config.remotePath, this.#config.localTempDir);
|
|
43
|
+
console.log("");
|
|
44
|
+
// Step 4: Scan local directory for files
|
|
45
|
+
console.log("Scanning local directory...");
|
|
46
|
+
const localFiles = await scanLocalDirectory(this.#config.localTempDir);
|
|
47
|
+
console.log(`Found ${localFiles.length} files to upload`);
|
|
48
|
+
console.log("");
|
|
49
|
+
if (localFiles.length === 0) {
|
|
50
|
+
console.log("No files to upload. Exiting.");
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
// Step 5: Create directory structure in Aspect
|
|
54
|
+
console.log("Creating directory structure...");
|
|
55
|
+
await this.#createDirectoryStructure(localFiles);
|
|
56
|
+
console.log("");
|
|
57
|
+
// Step 6: Start CLI display
|
|
58
|
+
cliDisplay.start();
|
|
59
|
+
// Step 7: Upload all files
|
|
60
|
+
console.log(`Uploading ${localFiles.length} files...`);
|
|
61
|
+
console.log("");
|
|
62
|
+
const uploadPromises = localFiles.map(async (file) => {
|
|
63
|
+
const fileId = uuidv4();
|
|
64
|
+
const directoryId = this.#getDirectoryIdForFile(file.relativePath);
|
|
65
|
+
statusTracker.addUploadFile(fileId, file.absolutePath, file.fileName, file.size);
|
|
66
|
+
try {
|
|
67
|
+
await this.#uploader.uploadFile(fileId, file.absolutePath, directoryId, this.#taskController);
|
|
68
|
+
// Delete local file after successful upload (unless keepLocal is true)
|
|
69
|
+
if (!this.#config.keepLocal) {
|
|
70
|
+
await deleteLocalFile(file.absolutePath);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
console.error(`Failed to upload ${file.fileName}:`, error);
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
await Promise.all(uploadPromises);
|
|
78
|
+
// Step 8: Stop CLI display
|
|
79
|
+
cliDisplay.stop();
|
|
80
|
+
// Step 9: Clean up empty directories
|
|
81
|
+
if (!this.#config.keepLocal) {
|
|
82
|
+
console.log("");
|
|
83
|
+
console.log("Cleaning up empty directories...");
|
|
84
|
+
await deleteEmptyDirectories(this.#config.localTempDir);
|
|
85
|
+
}
|
|
86
|
+
// Step 10: Print summary
|
|
87
|
+
console.log("");
|
|
88
|
+
this.#printSummary();
|
|
89
|
+
}
|
|
90
|
+
async #createDirectoryStructure(files) {
|
|
91
|
+
// Extract unique directory paths from files
|
|
92
|
+
const directoryPaths = new Set();
|
|
93
|
+
for (const file of files) {
|
|
94
|
+
const dirPath = path.dirname(file.relativePath);
|
|
95
|
+
if (dirPath !== ".") {
|
|
96
|
+
// Add all parent directories
|
|
97
|
+
const parts = dirPath.split(path.sep);
|
|
98
|
+
for (let i = 0; i < parts.length; i++) {
|
|
99
|
+
const partialPath = parts.slice(0, i + 1).join(path.sep);
|
|
100
|
+
directoryPaths.add(partialPath);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
// Sort directories by depth (shallowest first)
|
|
105
|
+
const sortedDirectories = Array.from(directoryPaths).sort((a, b) => a.split(path.sep).length - b.split(path.sep).length);
|
|
106
|
+
// Create directories in order
|
|
107
|
+
for (const dirPath of sortedDirectories) {
|
|
108
|
+
const parentPath = path.dirname(dirPath);
|
|
109
|
+
const dirName = path.basename(dirPath);
|
|
110
|
+
const parentId = parentPath === "." ? this.#config.directoryId : this.#directoryCache.get(parentPath);
|
|
111
|
+
if (!parentId) {
|
|
112
|
+
throw new Error(`Parent directory ID not found for path: ${dirPath}`);
|
|
113
|
+
}
|
|
114
|
+
try {
|
|
115
|
+
const directory = await this.#createDirectory(parentId, dirName);
|
|
116
|
+
this.#directoryCache.set(dirPath, directory.id);
|
|
117
|
+
console.log(`Created directory: ${dirPath}`);
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
// If directory already exists, try to get it
|
|
121
|
+
if (error.response?.status === 409 || error.response?.status === 400) {
|
|
122
|
+
console.log(`Directory already exists: ${dirPath}`);
|
|
123
|
+
// For now, we'll need to list subdirectories to find the existing one
|
|
124
|
+
// This is a limitation - ideally we'd have a "get or create" API
|
|
125
|
+
const existingDir = await this.#findExistingDirectory(parentId, dirName);
|
|
126
|
+
if (existingDir) {
|
|
127
|
+
this.#directoryCache.set(dirPath, existingDir.id);
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
throw new Error(`Failed to find existing directory: ${dirPath}`);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
throw error;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
async #createDirectory(parentId, name) {
|
|
140
|
+
const response = await this.#apiClient.post(`/directories/${parentId}/directories`, { name });
|
|
141
|
+
return response.data;
|
|
142
|
+
}
|
|
143
|
+
async #findExistingDirectory(parentId, name) {
|
|
144
|
+
try {
|
|
145
|
+
const response = await this.#apiClient.get(`/directories/${parentId}/directories`);
|
|
146
|
+
const found = response.data.find((dir) => dir.name === name);
|
|
147
|
+
return found || null;
|
|
148
|
+
}
|
|
149
|
+
catch (error) {
|
|
150
|
+
return null;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
#getDirectoryIdForFile(relativePath) {
|
|
154
|
+
const dirPath = path.dirname(relativePath);
|
|
155
|
+
if (dirPath === ".") {
|
|
156
|
+
return this.#config.directoryId;
|
|
157
|
+
}
|
|
158
|
+
const directoryId = this.#directoryCache.get(dirPath);
|
|
159
|
+
if (!directoryId) {
|
|
160
|
+
throw new Error(`Directory ID not found for path: ${dirPath}`);
|
|
161
|
+
}
|
|
162
|
+
return directoryId;
|
|
163
|
+
}
|
|
164
|
+
#printSummary() {
|
|
165
|
+
const totals = statusTracker.getUploadTotals();
|
|
166
|
+
console.log("=".repeat(60));
|
|
167
|
+
console.log("Sync Summary");
|
|
168
|
+
console.log("=".repeat(60));
|
|
169
|
+
console.log(`Total files: ${totals.totalFileCount}`);
|
|
170
|
+
console.log(`Successful: ${totals.successFileCount}`);
|
|
171
|
+
console.log(`Failed: ${totals.failedFileCount}`);
|
|
172
|
+
console.log("=".repeat(60));
|
|
173
|
+
if (totals.failedFileCount > 0) {
|
|
174
|
+
console.log("");
|
|
175
|
+
console.log("Failed files:");
|
|
176
|
+
const failedFiles = statusTracker
|
|
177
|
+
.getAllUploadFiles()
|
|
178
|
+
.filter((f) => f.uploadStatus === "failed");
|
|
179
|
+
for (const file of failedFiles) {
|
|
180
|
+
console.log(` - ${file.fileName}: ${file.errorMessage}`);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
//# sourceMappingURL=sync.js.map
|
package/dist/sync.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../src/sync.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
export declare enum UploadStatus {
|
|
2
|
+
QUEUED = "queued",
|
|
3
|
+
IN_PROGRESS = "in_progress",
|
|
4
|
+
SUCCESS = "success",
|
|
5
|
+
FAILED = "failed"
|
|
6
|
+
}
|
|
7
|
+
export interface UploadFileState {
|
|
8
|
+
fileId: string;
|
|
9
|
+
filePath: string;
|
|
10
|
+
fileName: string;
|
|
11
|
+
totalBytesToUpload: number;
|
|
12
|
+
bytesUploaded: number;
|
|
13
|
+
uploadStatus: UploadStatus;
|
|
14
|
+
createdAt: Date;
|
|
15
|
+
errorMessage?: string;
|
|
16
|
+
retryCount: number;
|
|
17
|
+
assetId?: string;
|
|
18
|
+
uploadId?: string;
|
|
19
|
+
}
|
|
20
|
+
export interface MultipartInitiateResponse {
|
|
21
|
+
upload_id: string;
|
|
22
|
+
asset_id: string;
|
|
23
|
+
}
|
|
24
|
+
export interface MultipartPartUrlResponse {
|
|
25
|
+
url: string;
|
|
26
|
+
url_expires_at: string;
|
|
27
|
+
}
|
|
28
|
+
export interface MultipartUploadPart {
|
|
29
|
+
part_number: number;
|
|
30
|
+
etag: string;
|
|
31
|
+
}
|
|
32
|
+
export interface UploadTotals {
|
|
33
|
+
totalBytesToUpload: number;
|
|
34
|
+
totalBytesUploaded: number;
|
|
35
|
+
totalFileCount: number;
|
|
36
|
+
queuedFileCount: number;
|
|
37
|
+
inProgressFileCount: number;
|
|
38
|
+
successFileCount: number;
|
|
39
|
+
failedFileCount: number;
|
|
40
|
+
}
|
|
41
|
+
export interface SyncConfig {
|
|
42
|
+
remote: string;
|
|
43
|
+
remotePath: string;
|
|
44
|
+
directoryId: string;
|
|
45
|
+
projectId: string;
|
|
46
|
+
apiUrl: string;
|
|
47
|
+
apiKey: string;
|
|
48
|
+
maxConcurrent: number;
|
|
49
|
+
keepLocal: boolean;
|
|
50
|
+
localTempDir: string;
|
|
51
|
+
}
|
|
52
|
+
export interface DirectoryMapping {
|
|
53
|
+
remotePath: string;
|
|
54
|
+
aspectDirectoryId: string;
|
|
55
|
+
}
|
|
56
|
+
export interface FileToUpload {
|
|
57
|
+
localPath: string;
|
|
58
|
+
fileName: string;
|
|
59
|
+
relativePath: string;
|
|
60
|
+
directoryId: string;
|
|
61
|
+
size: number;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,oBAAY,YAAY;IACtB,MAAM,WAAW;IACjB,WAAW,gBAAgB;IAC3B,OAAO,YAAY;IACnB,MAAM,WAAW;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,kBAAkB,EAAE,MAAM,CAAA;IAC1B,aAAa,EAAE,MAAM,CAAA;IACrB,YAAY,EAAE,YAAY,CAAA;IAC1B,SAAS,EAAE,IAAI,CAAA;IACf,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,yBAAyB;IACxC,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,wBAAwB;IACvC,GAAG,EAAE,MAAM,CAAA;IACX,cAAc,EAAE,MAAM,CAAA;CACvB;AAED,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,MAAM,CAAA;IACnB,IAAI,EAAE,MAAM,CAAA;CACb;AAED,MAAM,WAAW,YAAY;IAC3B,kBAAkB,EAAE,MAAM,CAAA;IAC1B,kBAAkB,EAAE,MAAM,CAAA;IAC1B,cAAc,EAAE,MAAM,CAAA;IACtB,eAAe,EAAE,MAAM,CAAA;IACvB,mBAAmB,EAAE,MAAM,CAAA;IAC3B,gBAAgB,EAAE,MAAM,CAAA;IACxB,eAAe,EAAE,MAAM,CAAA;CACxB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,MAAM,CAAA;IAClB,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,aAAa,EAAE,MAAM,CAAA;IACrB,SAAS,EAAE,OAAO,CAAA;IAClB,YAAY,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAA;IAClB,iBAAiB,EAAE,MAAM,CAAA;CAC1B;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,YAAY,EAAE,MAAM,CAAA;IACpB,WAAW,EAAE,MAAM,CAAA;IACnB,IAAI,EAAE,MAAM,CAAA;CACb"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
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 || (UploadStatus = {}));
|
|
8
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,YAKX;AALD,WAAY,YAAY;IACtB,iCAAiB,CAAA;IACjB,2CAA2B,CAAA;IAC3B,mCAAmB,CAAA;IACnB,iCAAiB,CAAA;AACnB,CAAC,EALW,YAAY,KAAZ,YAAY,QAKvB"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type SyncConfig } from "./types.js";
|
|
2
|
+
interface WeightedTaskController {
|
|
3
|
+
acquire: () => Promise<void>;
|
|
4
|
+
release: () => void;
|
|
5
|
+
}
|
|
6
|
+
export declare class Uploader {
|
|
7
|
+
#private;
|
|
8
|
+
constructor(config: SyncConfig);
|
|
9
|
+
uploadFile(fileId: string, filePath: string, directoryId: string, taskController: WeightedTaskController): Promise<void>;
|
|
10
|
+
}
|
|
11
|
+
export declare function createTaskController(maxConcurrent: number): WeightedTaskController;
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=uploader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uploader.d.ts","sourceRoot":"","sources":["../src/uploader.ts"],"names":[],"mappings":"AAKA,OAAO,EAAyG,KAAK,UAAU,EAAE,MAAM,YAAY,CAAA;AAqCnJ,UAAU,sBAAsB;IAC9B,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IAC5B,OAAO,EAAE,MAAM,IAAI,CAAA;CACpB;AAgCD,qBAAa,QAAQ;;gBAIP,MAAM,EAAE,UAAU;IAWxB,UAAU,CACd,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,sBAAsB,GACrC,OAAO,CAAC,IAAI,CAAC;CAsMjB;AAED,wBAAgB,oBAAoB,CAAC,aAAa,EAAE,MAAM,GAAG,sBAAsB,CAElF"}
|