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/README.md +8 -6
- package/dist/index.js +10 -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 -529
- 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/sync.js
DELETED
|
@@ -1,529 +0,0 @@
|
|
|
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 } from "./uploader.js";
|
|
7
|
-
import { cliDisplay } from "./cliDisplay.js";
|
|
8
|
-
import { formatBytes } from "./util.js";
|
|
9
|
-
import { checkRcloneInstalled, syncFromRemote, syncFromRemoteWithFiles, scanLocalDirectory, listRemoteFilesWithSize, } from "./rclone.js";
|
|
10
|
-
import { createBatches, writeBatchFile, cleanupBatchFile } from "./batchManager.js";
|
|
11
|
-
import { BatchPhase, UploadStatus } from "./types.js";
|
|
12
|
-
export class SyncOrchestrator {
|
|
13
|
-
#config;
|
|
14
|
-
#uploader;
|
|
15
|
-
#apiClient;
|
|
16
|
-
#directoryCache = new Map(); // relativePath -> directoryId
|
|
17
|
-
constructor(config) {
|
|
18
|
-
this.#config = config;
|
|
19
|
-
this.#uploader = new Uploader(config);
|
|
20
|
-
this.#apiClient = axios.create({
|
|
21
|
-
baseURL: config.apiUrl,
|
|
22
|
-
headers: {
|
|
23
|
-
"Authorization": `Bearer ${config.apiKey}`,
|
|
24
|
-
"Content-Type": "application/json",
|
|
25
|
-
},
|
|
26
|
-
});
|
|
27
|
-
}
|
|
28
|
-
async run() {
|
|
29
|
-
console.log("Starting data sync...");
|
|
30
|
-
console.log(`Session: ${this.#config.sessionName}`);
|
|
31
|
-
console.log(`Remote: ${this.#config.remote}:${this.#config.remotePath}`);
|
|
32
|
-
console.log(`Root directory ID: ${this.#config.directoryId}`);
|
|
33
|
-
console.log(`Project ID: ${this.#config.projectId}`);
|
|
34
|
-
console.log(`Temp directory: ${this.#config.localTempDir}`);
|
|
35
|
-
console.log("");
|
|
36
|
-
// Step 1: Check rclone is installed
|
|
37
|
-
console.log("Checking rclone installation...");
|
|
38
|
-
await checkRcloneInstalled();
|
|
39
|
-
console.log("✓ rclone is installed");
|
|
40
|
-
console.log("");
|
|
41
|
-
// Step 2: Ensure local temp directory exists
|
|
42
|
-
console.log("Creating session directory...");
|
|
43
|
-
await fs.promises.mkdir(this.#config.localTempDir, { recursive: true });
|
|
44
|
-
console.log(`✓ Session directory: ${this.#config.localTempDir}`);
|
|
45
|
-
console.log("");
|
|
46
|
-
// Step 3: Sync files from remote to local
|
|
47
|
-
console.log("Syncing files from remote...");
|
|
48
|
-
await syncFromRemote(this.#config.remote, this.#config.remotePath, this.#config.localTempDir, this.#config.rcloneOptions);
|
|
49
|
-
console.log("");
|
|
50
|
-
// Step 4: Scan local directory for files
|
|
51
|
-
console.log("Scanning local directory...");
|
|
52
|
-
const scanResult = await scanLocalDirectory(this.#config.localTempDir);
|
|
53
|
-
console.log(`Found ${scanResult.files.length} files to sync`);
|
|
54
|
-
console.log(`Found ${scanResult.directoryCount} folders to sync`);
|
|
55
|
-
console.log("");
|
|
56
|
-
if (scanResult.files.length === 0) {
|
|
57
|
-
console.log("No files to upload. Exiting.");
|
|
58
|
-
return;
|
|
59
|
-
}
|
|
60
|
-
// Step 5: Fetch existing directory tree and create missing directories
|
|
61
|
-
console.log("Syncing folder structure...");
|
|
62
|
-
await this.#fetchAndCreateDirectories(scanResult.files);
|
|
63
|
-
console.log("");
|
|
64
|
-
// Step 6: Start CLI display
|
|
65
|
-
cliDisplay.start();
|
|
66
|
-
// Step 7: Upload all files
|
|
67
|
-
console.log(`Syncing ${scanResult.files.length} files...`);
|
|
68
|
-
console.log("Checking for existing assets...");
|
|
69
|
-
const filesWithDirectories = scanResult.files.map((file) => ({
|
|
70
|
-
file,
|
|
71
|
-
directoryId: this.#getDirectoryIdForFile(file.relativePath),
|
|
72
|
-
}));
|
|
73
|
-
const existenceResults = await this.#checkAssetsExistence(filesWithDirectories.map(({ file, directoryId }) => ({
|
|
74
|
-
directory_id: directoryId,
|
|
75
|
-
name: file.fileName,
|
|
76
|
-
size_bytes: file.size,
|
|
77
|
-
})));
|
|
78
|
-
const uploadPromises = filesWithDirectories.map(async ({ file, directoryId }, index) => {
|
|
79
|
-
const fileId = uuidv4();
|
|
80
|
-
statusTracker.addUploadFile(fileId, file.absolutePath, file.fileName, file.relativePath, file.size);
|
|
81
|
-
const existsResult = existenceResults[index];
|
|
82
|
-
if (existsResult?.exists) {
|
|
83
|
-
statusTracker.markUploadSkipped(fileId);
|
|
84
|
-
return;
|
|
85
|
-
}
|
|
86
|
-
try {
|
|
87
|
-
await this.#uploader.uploadFile(fileId, file.absolutePath, directoryId);
|
|
88
|
-
}
|
|
89
|
-
catch (error) {
|
|
90
|
-
console.error(`Failed to upload ${file.fileName}:`, error);
|
|
91
|
-
}
|
|
92
|
-
});
|
|
93
|
-
await Promise.all(uploadPromises);
|
|
94
|
-
// Step 8: Stop CLI display
|
|
95
|
-
cliDisplay.stop();
|
|
96
|
-
// Step 9: Clean up entire session directory (unless keepLocal is true)
|
|
97
|
-
if (!this.#config.keepLocal) {
|
|
98
|
-
console.log("");
|
|
99
|
-
console.log("Cleaning up session directory...");
|
|
100
|
-
await fs.promises.rm(this.#config.localTempDir, { recursive: true, force: true });
|
|
101
|
-
console.log(`✓ Deleted session directory: ${this.#config.localTempDir}`);
|
|
102
|
-
}
|
|
103
|
-
// Step 10: Print summary
|
|
104
|
-
console.log("");
|
|
105
|
-
this.#printSummary();
|
|
106
|
-
}
|
|
107
|
-
async runBatched() {
|
|
108
|
-
if (!this.#config.batchSizeBytes) {
|
|
109
|
-
throw new Error("Batch size not configured. Use batchSizeBytes in config.");
|
|
110
|
-
}
|
|
111
|
-
console.log("Starting batched data sync...");
|
|
112
|
-
console.log(`Session: ${this.#config.sessionName}`);
|
|
113
|
-
console.log(`Remote: ${this.#config.remote}:${this.#config.remotePath}`);
|
|
114
|
-
console.log(`Root directory ID: ${this.#config.directoryId}`);
|
|
115
|
-
console.log(`Project ID: ${this.#config.projectId}`);
|
|
116
|
-
console.log(`Batch size: ${formatBytes(this.#config.batchSizeBytes)}`);
|
|
117
|
-
console.log("");
|
|
118
|
-
// Step 1: Check rclone is installed
|
|
119
|
-
console.log("Checking rclone installation...");
|
|
120
|
-
await checkRcloneInstalled();
|
|
121
|
-
console.log("✓ rclone is installed");
|
|
122
|
-
console.log("");
|
|
123
|
-
// Step 2: Create session directory
|
|
124
|
-
console.log("Creating session directory...");
|
|
125
|
-
const sessionDir = this.#config.localTempDir;
|
|
126
|
-
await fs.promises.mkdir(sessionDir, { recursive: true });
|
|
127
|
-
console.log(`✓ Session directory: ${sessionDir}`);
|
|
128
|
-
console.log("");
|
|
129
|
-
// Step 3: List all remote files and create batches
|
|
130
|
-
console.log("Listing all remote files...");
|
|
131
|
-
const allRemoteFiles = await listRemoteFilesWithSize(this.#config.remote, this.#config.remotePath, this.#config.rcloneOptions.extraRcloneArgs ?? []);
|
|
132
|
-
console.log(`Found ${allRemoteFiles.length} files`);
|
|
133
|
-
const totalSize = allRemoteFiles.reduce((sum, f) => sum + f.size, 0);
|
|
134
|
-
console.log(`Total size: ${formatBytes(totalSize)}`);
|
|
135
|
-
console.log("");
|
|
136
|
-
if (allRemoteFiles.length === 0) {
|
|
137
|
-
console.log("No files to sync. Exiting.");
|
|
138
|
-
return;
|
|
139
|
-
}
|
|
140
|
-
// Step 4: Create batches
|
|
141
|
-
console.log("Creating batches...");
|
|
142
|
-
const batches = createBatches(allRemoteFiles, this.#config.batchSizeBytes);
|
|
143
|
-
console.log(`Created ${batches.length} batches`);
|
|
144
|
-
console.log("");
|
|
145
|
-
// Step 5: Write batch files
|
|
146
|
-
console.log("Writing batch files...");
|
|
147
|
-
const batchFiles = [];
|
|
148
|
-
const batchSummaryLines = [];
|
|
149
|
-
for (const batch of batches) {
|
|
150
|
-
const line = `Batch ${batch.batchNumber}: ${batch.files.length} files, ${formatBytes(batch.totalSize)}`;
|
|
151
|
-
batchSummaryLines.push(line);
|
|
152
|
-
const batchFilePath = await writeBatchFile(sessionDir, batch.batchNumber, batch.files);
|
|
153
|
-
batchFiles.push(batchFilePath);
|
|
154
|
-
console.log(line);
|
|
155
|
-
}
|
|
156
|
-
await fs.promises.writeFile(path.join(sessionDir, "batches.txt"), `${batchSummaryLines.join("\n")}\n`, "utf-8");
|
|
157
|
-
console.log("");
|
|
158
|
-
// Step 6: Initialize batch progress tracking
|
|
159
|
-
statusTracker.initBatchProgress(batches.length, allRemoteFiles.length, totalSize);
|
|
160
|
-
// Step 7: Start CLI display
|
|
161
|
-
cliDisplay.start();
|
|
162
|
-
const THROTTLE_ASSET_EXISTENCE_CHECK_THRESHOLD = 3; // throttle after 3 in a row
|
|
163
|
-
const THROTTLE_ASSET_EXISTENCE_CHECK_TIME = 1000; // throttle for 1 second
|
|
164
|
-
let throttleAssetExistenceCheckCount = 0; // how many times in a row we've done the asset existence check
|
|
165
|
-
const summaryTotals = {
|
|
166
|
-
totalFileCount: 0,
|
|
167
|
-
successFileCount: 0,
|
|
168
|
-
skippedFileCount: 0,
|
|
169
|
-
failedFileCount: 0,
|
|
170
|
-
};
|
|
171
|
-
const summaryFailedFiles = [];
|
|
172
|
-
try {
|
|
173
|
-
// Step 8: Process each batch
|
|
174
|
-
for (let i = 0; i < batches.length; i++) {
|
|
175
|
-
if (throttleAssetExistenceCheckCount >= THROTTLE_ASSET_EXISTENCE_CHECK_THRESHOLD) {
|
|
176
|
-
await new Promise(resolve => setTimeout(resolve, THROTTLE_ASSET_EXISTENCE_CHECK_TIME));
|
|
177
|
-
throttleAssetExistenceCheckCount = 0;
|
|
178
|
-
}
|
|
179
|
-
const batch = batches[i];
|
|
180
|
-
const batchFilePath = batchFiles[i];
|
|
181
|
-
const batchDir = path.join(sessionDir, `batch${batch.batchNumber}`);
|
|
182
|
-
// Update batch info in tracker
|
|
183
|
-
statusTracker.setBatchInfo(batch.batchNumber, batch.files.length, batch.totalSize);
|
|
184
|
-
// Step 8a: Create batch directory and prepare planned files
|
|
185
|
-
await fs.promises.mkdir(batchDir, { recursive: true });
|
|
186
|
-
const plannedFiles = batch.files.map((remoteFile) => ({
|
|
187
|
-
relativePath: remoteFile.path,
|
|
188
|
-
absolutePath: path.join(batchDir, remoteFile.path),
|
|
189
|
-
fileName: path.basename(remoteFile.path),
|
|
190
|
-
size: remoteFile.size,
|
|
191
|
-
}));
|
|
192
|
-
const cleanUpBatchArtifacts = async () => {
|
|
193
|
-
if (!this.#config.keepLocal) {
|
|
194
|
-
await fs.promises.rm(batchDir, { recursive: true, force: true });
|
|
195
|
-
}
|
|
196
|
-
await cleanupBatchFile(batchFilePath);
|
|
197
|
-
};
|
|
198
|
-
statusTracker.setBatchPhase(BatchPhase.SCANNING, `Preparing ${plannedFiles.length} files...`);
|
|
199
|
-
statusTracker.setBatchPhase(BatchPhase.SYNCING_FOLDERS, "Ensuring target directories exist...");
|
|
200
|
-
await this.#fetchAndCreateDirectories(plannedFiles);
|
|
201
|
-
const plannedFilesWithDirectories = plannedFiles.map((file) => ({
|
|
202
|
-
file,
|
|
203
|
-
directoryId: this.#getDirectoryIdForFile(file.relativePath),
|
|
204
|
-
}));
|
|
205
|
-
statusTracker.setBatchPhase(BatchPhase.SCANNING, "Checking existing assets...");
|
|
206
|
-
const plannedExistenceResults = await this.#checkAssetsExistence(plannedFilesWithDirectories.map(({ file, directoryId }) => ({
|
|
207
|
-
directory_id: directoryId,
|
|
208
|
-
name: file.fileName,
|
|
209
|
-
size_bytes: file.size,
|
|
210
|
-
})));
|
|
211
|
-
const existenceByPath = new Map();
|
|
212
|
-
plannedFilesWithDirectories.forEach(({ file }, index) => {
|
|
213
|
-
existenceByPath.set(file.relativePath, plannedExistenceResults[index]);
|
|
214
|
-
});
|
|
215
|
-
const allFilesAlreadySynced = plannedFiles.length > 0 &&
|
|
216
|
-
plannedFiles.every((file) => existenceByPath.get(file.relativePath)?.exists === true);
|
|
217
|
-
if (allFilesAlreadySynced) {
|
|
218
|
-
statusTracker.incrementOverallProgress(plannedFiles.length, batch.totalSize);
|
|
219
|
-
statusTracker.setBatchPhase(BatchPhase.COMPLETE, "Everything already synced");
|
|
220
|
-
cliDisplay.persistCurrentBatchLine();
|
|
221
|
-
summaryTotals.totalFileCount += plannedFiles.length;
|
|
222
|
-
summaryTotals.skippedFileCount += plannedFiles.length;
|
|
223
|
-
await cleanUpBatchArtifacts();
|
|
224
|
-
statusTracker.resetBatchUploadState();
|
|
225
|
-
++throttleAssetExistenceCheckCount;
|
|
226
|
-
continue;
|
|
227
|
-
}
|
|
228
|
-
throttleAssetExistenceCheckCount = 0;
|
|
229
|
-
// Step 8b: Download files for this batch
|
|
230
|
-
statusTracker.setBatchPhase(BatchPhase.DOWNLOADING);
|
|
231
|
-
await syncFromRemoteWithFiles(this.#config.remote, this.#config.remotePath, batchDir, batchFilePath, this.#config.rcloneOptions, (progress) => {
|
|
232
|
-
statusTracker.updateDownloadProgress(progress);
|
|
233
|
-
});
|
|
234
|
-
// Clear download progress after download completes
|
|
235
|
-
statusTracker.updateDownloadProgress({
|
|
236
|
-
bytesTransferred: batch.totalSize,
|
|
237
|
-
totalBytes: batch.totalSize,
|
|
238
|
-
speed: 0,
|
|
239
|
-
eta: 0,
|
|
240
|
-
percentComplete: 100,
|
|
241
|
-
});
|
|
242
|
-
// Step 8c: Scan local files in batch directory
|
|
243
|
-
statusTracker.setBatchPhase(BatchPhase.SCANNING, "Scanning batch directory...");
|
|
244
|
-
const scanResult = await scanLocalDirectory(batchDir);
|
|
245
|
-
statusTracker.setBatchPhase(BatchPhase.SCANNING, `Found ${scanResult.files.length} files in batch`);
|
|
246
|
-
// Step 8d: Check directories are ready (already ensured above)
|
|
247
|
-
// Step 8e: Check asset existence results (using precomputed map) and upload files
|
|
248
|
-
statusTracker.setBatchPhase(BatchPhase.UPLOADING);
|
|
249
|
-
const filesWithDirectories = scanResult.files.map((file) => ({
|
|
250
|
-
file,
|
|
251
|
-
directoryId: this.#getDirectoryIdForFile(file.relativePath),
|
|
252
|
-
}));
|
|
253
|
-
const uploadPromises = filesWithDirectories.map(async ({ file, directoryId }) => {
|
|
254
|
-
const fileId = uuidv4();
|
|
255
|
-
statusTracker.addUploadFile(fileId, file.absolutePath, file.fileName, file.relativePath, file.size);
|
|
256
|
-
const existsResult = existenceByPath.get(file.relativePath);
|
|
257
|
-
if (existsResult?.exists) {
|
|
258
|
-
statusTracker.markUploadSkipped(fileId);
|
|
259
|
-
return;
|
|
260
|
-
}
|
|
261
|
-
try {
|
|
262
|
-
await this.#uploader.uploadFile(fileId, file.absolutePath, directoryId);
|
|
263
|
-
}
|
|
264
|
-
catch (error) {
|
|
265
|
-
console.error(`Failed to upload ${file.fileName}:`, error);
|
|
266
|
-
}
|
|
267
|
-
});
|
|
268
|
-
await Promise.all(uploadPromises);
|
|
269
|
-
// Step 8f: Update overall progress
|
|
270
|
-
const batchTotals = statusTracker.getUploadTotals();
|
|
271
|
-
statusTracker.incrementOverallProgress(batchTotals.successFileCount + batchTotals.skippedFileCount, batch.totalSize);
|
|
272
|
-
summaryTotals.totalFileCount += batchTotals.totalFileCount;
|
|
273
|
-
summaryTotals.successFileCount += batchTotals.successFileCount;
|
|
274
|
-
summaryTotals.skippedFileCount += batchTotals.skippedFileCount;
|
|
275
|
-
summaryTotals.failedFileCount += batchTotals.failedFileCount;
|
|
276
|
-
const batchFailedFiles = statusTracker
|
|
277
|
-
.getAllUploadFiles()
|
|
278
|
-
.filter((file) => file.uploadStatus === UploadStatus.FAILED)
|
|
279
|
-
.map((file) => ({
|
|
280
|
-
fileName: file.fileName,
|
|
281
|
-
errorMessage: file.errorMessage,
|
|
282
|
-
}));
|
|
283
|
-
if (batchFailedFiles.length > 0) {
|
|
284
|
-
summaryFailedFiles.push(...batchFailedFiles);
|
|
285
|
-
}
|
|
286
|
-
// Step 8g: Clean up batch directory
|
|
287
|
-
statusTracker.setBatchPhase(BatchPhase.CLEANING);
|
|
288
|
-
await cleanUpBatchArtifacts();
|
|
289
|
-
// Step 8i: Mark batch as complete
|
|
290
|
-
statusTracker.setBatchPhase(BatchPhase.COMPLETE);
|
|
291
|
-
cliDisplay.persistCurrentBatchLine();
|
|
292
|
-
// Step 8j: Reset batch upload state
|
|
293
|
-
statusTracker.resetBatchUploadState();
|
|
294
|
-
}
|
|
295
|
-
}
|
|
296
|
-
finally {
|
|
297
|
-
cliDisplay.stop();
|
|
298
|
-
}
|
|
299
|
-
// Step 9: Clean up session directory (unless keepLocal is true)
|
|
300
|
-
if (!this.#config.keepLocal) {
|
|
301
|
-
console.log("");
|
|
302
|
-
console.log("Cleaning up session directory...");
|
|
303
|
-
await fs.promises.rm(sessionDir, { recursive: true, force: true });
|
|
304
|
-
console.log(`✓ Deleted session directory: ${sessionDir}`);
|
|
305
|
-
}
|
|
306
|
-
// Step 10: Print final summary
|
|
307
|
-
console.log("");
|
|
308
|
-
this.#printSummary({
|
|
309
|
-
totals: summaryTotals,
|
|
310
|
-
failedFiles: summaryFailedFiles,
|
|
311
|
-
extraLines: [`Batches: ${batches.length}`],
|
|
312
|
-
});
|
|
313
|
-
}
|
|
314
|
-
async runCheckOnly() {
|
|
315
|
-
console.log("Running in check-only mode (no downloads/uploads)...");
|
|
316
|
-
await checkRcloneInstalled();
|
|
317
|
-
console.log(`Listing remote files from ${this.#config.remote}:${this.#config.remotePath}...`);
|
|
318
|
-
const remoteFiles = await listRemoteFilesWithSize(this.#config.remote, this.#config.remotePath, this.#config.rcloneOptions.extraRcloneArgs ?? []);
|
|
319
|
-
console.log(`Found ${remoteFiles.length} remote files to check`);
|
|
320
|
-
if (remoteFiles.length === 0) {
|
|
321
|
-
console.log("No remote files to check. Exiting.");
|
|
322
|
-
return;
|
|
323
|
-
}
|
|
324
|
-
console.log("Fetching existing directory structure...");
|
|
325
|
-
const tree = await this.#fetchDirectoryTree(this.#config.directoryId);
|
|
326
|
-
this.#directoryCache.clear();
|
|
327
|
-
this.#flattenDirectoryTree(tree, "");
|
|
328
|
-
const checkInputs = [];
|
|
329
|
-
const missingFiles = [];
|
|
330
|
-
const duplicateFiles = [];
|
|
331
|
-
const seenPaths = new Set();
|
|
332
|
-
for (const remoteFile of remoteFiles) {
|
|
333
|
-
const displayPath = remoteFile.path;
|
|
334
|
-
const normalizedPath = path.normalize(displayPath);
|
|
335
|
-
const dirPath = path.dirname(normalizedPath);
|
|
336
|
-
if (seenPaths.has(normalizedPath)) {
|
|
337
|
-
duplicateFiles.push(displayPath);
|
|
338
|
-
continue;
|
|
339
|
-
}
|
|
340
|
-
seenPaths.add(normalizedPath);
|
|
341
|
-
let directoryId;
|
|
342
|
-
if (dirPath === "." || dirPath === path.sep) {
|
|
343
|
-
directoryId = this.#config.directoryId;
|
|
344
|
-
}
|
|
345
|
-
else {
|
|
346
|
-
directoryId = this.#directoryCache.get(dirPath);
|
|
347
|
-
}
|
|
348
|
-
if (!directoryId) {
|
|
349
|
-
missingFiles.push(displayPath);
|
|
350
|
-
continue;
|
|
351
|
-
}
|
|
352
|
-
checkInputs.push({
|
|
353
|
-
displayPath,
|
|
354
|
-
request: {
|
|
355
|
-
directory_id: directoryId,
|
|
356
|
-
name: path.basename(normalizedPath),
|
|
357
|
-
size_bytes: remoteFile.size,
|
|
358
|
-
}
|
|
359
|
-
});
|
|
360
|
-
}
|
|
361
|
-
const existenceResults = await this.#checkAssetsExistence(checkInputs.map((input) => input.request), false);
|
|
362
|
-
let existingCount = 0;
|
|
363
|
-
let missingCount = missingFiles.length;
|
|
364
|
-
checkInputs.forEach((input, index) => {
|
|
365
|
-
const result = existenceResults[index];
|
|
366
|
-
if (result?.exists) {
|
|
367
|
-
existingCount += 1;
|
|
368
|
-
}
|
|
369
|
-
else {
|
|
370
|
-
missingCount += 1;
|
|
371
|
-
missingFiles.push(input.displayPath);
|
|
372
|
-
}
|
|
373
|
-
});
|
|
374
|
-
console.log("");
|
|
375
|
-
console.log("=".repeat(60));
|
|
376
|
-
console.log("Check Summary");
|
|
377
|
-
console.log("=".repeat(60));
|
|
378
|
-
console.log(`Total (remote): ${remoteFiles.length}`);
|
|
379
|
-
console.log(`Duplicates skipped: ${duplicateFiles.length}`);
|
|
380
|
-
console.log(`Already exist: ${existingCount}`);
|
|
381
|
-
console.log(`Missing: ${missingCount}`);
|
|
382
|
-
console.log("=".repeat(60));
|
|
383
|
-
if (missingFiles.length > 0) {
|
|
384
|
-
console.log("");
|
|
385
|
-
console.log("Files missing on server:");
|
|
386
|
-
for (const filePath of missingFiles) {
|
|
387
|
-
console.log(` - ${filePath}`);
|
|
388
|
-
}
|
|
389
|
-
}
|
|
390
|
-
if (duplicateFiles.length > 0) {
|
|
391
|
-
console.log("");
|
|
392
|
-
console.log("Duplicate remote files skipped:");
|
|
393
|
-
for (const filePath of duplicateFiles) {
|
|
394
|
-
console.log(` - ${filePath}`);
|
|
395
|
-
}
|
|
396
|
-
}
|
|
397
|
-
}
|
|
398
|
-
async #fetchAndCreateDirectories(files) {
|
|
399
|
-
// Step 1: Fetch existing directory tree from server
|
|
400
|
-
const tree = await this.#fetchDirectoryTree(this.#config.directoryId);
|
|
401
|
-
// Step 2: Flatten tree into cache (relativePath -> directoryId)
|
|
402
|
-
this.#flattenDirectoryTree(tree, "");
|
|
403
|
-
// Step 3: Extract unique directory paths from files
|
|
404
|
-
const directoryPaths = new Set();
|
|
405
|
-
for (const file of files) {
|
|
406
|
-
const dirPath = path.dirname(file.relativePath);
|
|
407
|
-
if (dirPath !== ".") {
|
|
408
|
-
// Add all parent directories
|
|
409
|
-
const parts = dirPath.split(path.sep);
|
|
410
|
-
for (let i = 0; i < parts.length; i++) {
|
|
411
|
-
const partialPath = parts.slice(0, i + 1).join(path.sep);
|
|
412
|
-
directoryPaths.add(partialPath);
|
|
413
|
-
}
|
|
414
|
-
}
|
|
415
|
-
}
|
|
416
|
-
// Step 4: Sort directories by depth (shallowest first)
|
|
417
|
-
const sortedDirectories = Array.from(directoryPaths).sort((a, b) => a.split(path.sep).length - b.split(path.sep).length);
|
|
418
|
-
// Step 5: Create missing directories (skip existing ones)
|
|
419
|
-
for (const dirPath of sortedDirectories) {
|
|
420
|
-
// Check if directory already exists in cache
|
|
421
|
-
if (this.#directoryCache.has(dirPath)) {
|
|
422
|
-
// console.log(`Using existing directory: ${dirPath}`)
|
|
423
|
-
continue;
|
|
424
|
-
}
|
|
425
|
-
// Directory doesn't exist, create it
|
|
426
|
-
const parentPath = path.dirname(dirPath);
|
|
427
|
-
const dirName = path.basename(dirPath);
|
|
428
|
-
const parentId = parentPath === "." ? this.#config.directoryId : this.#directoryCache.get(parentPath);
|
|
429
|
-
if (!parentId) {
|
|
430
|
-
throw new Error(`Parent directory ID not found for path: ${dirPath}`);
|
|
431
|
-
}
|
|
432
|
-
const directory = await this.#createDirectory(parentId, dirName);
|
|
433
|
-
this.#directoryCache.set(dirPath, directory.id);
|
|
434
|
-
// console.log(`Created directory: ${dirPath}`)
|
|
435
|
-
}
|
|
436
|
-
}
|
|
437
|
-
async #fetchDirectoryTree(directoryId) {
|
|
438
|
-
const response = await this.#apiClient.get(`/directories/${directoryId}/tree`);
|
|
439
|
-
return response.data;
|
|
440
|
-
}
|
|
441
|
-
#flattenDirectoryTree(node, parentPath) {
|
|
442
|
-
// For root node (parentPath is empty), don't add to cache - it's the sync root
|
|
443
|
-
// For child nodes, build relative path from root
|
|
444
|
-
let currentPath = "";
|
|
445
|
-
if (parentPath === "") {
|
|
446
|
-
// This is the root directory - don't cache it, but process children
|
|
447
|
-
currentPath = "";
|
|
448
|
-
}
|
|
449
|
-
else if (parentPath === ".") {
|
|
450
|
-
// First level child - just use the name
|
|
451
|
-
currentPath = node.name;
|
|
452
|
-
}
|
|
453
|
-
else {
|
|
454
|
-
// Nested child - append to parent path
|
|
455
|
-
currentPath = `${parentPath}${path.sep}${node.name}`;
|
|
456
|
-
}
|
|
457
|
-
// Add to cache if not root
|
|
458
|
-
if (currentPath && currentPath !== "") {
|
|
459
|
-
this.#directoryCache.set(currentPath, node.id);
|
|
460
|
-
}
|
|
461
|
-
// Recursively process children
|
|
462
|
-
for (const child of node.children) {
|
|
463
|
-
// First level: pass "." so children know they're at root level
|
|
464
|
-
// Nested levels: pass the current path
|
|
465
|
-
const childParentPath = parentPath === "" ? "." : currentPath;
|
|
466
|
-
this.#flattenDirectoryTree(child, childParentPath);
|
|
467
|
-
}
|
|
468
|
-
}
|
|
469
|
-
async #createDirectory(parentId, name) {
|
|
470
|
-
const response = await this.#apiClient.post(`/directories/${parentId}/directories`, { name });
|
|
471
|
-
return response.data;
|
|
472
|
-
}
|
|
473
|
-
async #checkAssetsExistence(items, deleteIfNotExist = true) {
|
|
474
|
-
if (items.length === 0) {
|
|
475
|
-
return [];
|
|
476
|
-
}
|
|
477
|
-
const response = await this.#apiClient.post("/assets/check-exists-and-uploaded", { items, delete_if_not_exist: deleteIfNotExist });
|
|
478
|
-
return response.data.items;
|
|
479
|
-
}
|
|
480
|
-
#getDirectoryIdForFile(relativePath) {
|
|
481
|
-
const dirPath = path.dirname(relativePath);
|
|
482
|
-
if (dirPath === ".") {
|
|
483
|
-
return this.#config.directoryId;
|
|
484
|
-
}
|
|
485
|
-
const directoryId = this.#directoryCache.get(dirPath);
|
|
486
|
-
if (!directoryId) {
|
|
487
|
-
throw new Error(`Directory ID not found for path: ${dirPath}`);
|
|
488
|
-
}
|
|
489
|
-
return directoryId;
|
|
490
|
-
}
|
|
491
|
-
#printSummary(options) {
|
|
492
|
-
const computedTotals = statusTracker.getUploadTotals();
|
|
493
|
-
const totals = options?.totals ?? {
|
|
494
|
-
totalFileCount: computedTotals.totalFileCount,
|
|
495
|
-
successFileCount: computedTotals.successFileCount,
|
|
496
|
-
skippedFileCount: computedTotals.skippedFileCount,
|
|
497
|
-
failedFileCount: computedTotals.failedFileCount,
|
|
498
|
-
};
|
|
499
|
-
const extraLines = options?.extraLines ?? [];
|
|
500
|
-
const failedFiles = options?.failedFiles ?? (options?.totals
|
|
501
|
-
? []
|
|
502
|
-
: statusTracker
|
|
503
|
-
.getAllUploadFiles()
|
|
504
|
-
.filter((file) => file.uploadStatus === UploadStatus.FAILED)
|
|
505
|
-
.map((file) => ({
|
|
506
|
-
fileName: file.fileName,
|
|
507
|
-
errorMessage: file.errorMessage,
|
|
508
|
-
})));
|
|
509
|
-
console.log("=".repeat(60));
|
|
510
|
-
console.log("Sync Summary");
|
|
511
|
-
console.log("=".repeat(60));
|
|
512
|
-
console.log(`Total files: ${totals.totalFileCount}`);
|
|
513
|
-
console.log(`Successful: ${totals.successFileCount}`);
|
|
514
|
-
console.log(`Skipped: ${totals.skippedFileCount}`);
|
|
515
|
-
console.log(`Failed: ${totals.failedFileCount}`);
|
|
516
|
-
for (const line of extraLines) {
|
|
517
|
-
console.log(line);
|
|
518
|
-
}
|
|
519
|
-
console.log("=".repeat(60));
|
|
520
|
-
if (failedFiles.length > 0) {
|
|
521
|
-
console.log("");
|
|
522
|
-
console.log("Failed files:");
|
|
523
|
-
for (const file of failedFiles) {
|
|
524
|
-
console.log(` - ${file.fileName}: ${file.errorMessage ?? "Unknown error"}`);
|
|
525
|
-
}
|
|
526
|
-
}
|
|
527
|
-
}
|
|
528
|
-
}
|
|
529
|
-
//# sourceMappingURL=sync.js.map
|
package/dist/sync.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../src/sync.ts"],"names":[],"mappings":"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"}
|