aspect-sync 0.0.1 → 0.0.2
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 +86 -10
- package/dist/cliDisplay.d.ts.map +1 -1
- package/dist/cliDisplay.js +12 -6
- package/dist/cliDisplay.js.map +1 -1
- package/dist/index.js +27 -1
- package/dist/index.js.map +1 -1
- package/dist/rclone.d.ts.map +1 -1
- package/dist/rclone.js +6 -15
- package/dist/rclone.js.map +1 -1
- package/dist/statusTracker.d.ts +2 -1
- package/dist/statusTracker.d.ts.map +1 -1
- package/dist/statusTracker.js +23 -3
- package/dist/statusTracker.js.map +1 -1
- package/dist/sync.d.ts.map +1 -1
- package/dist/sync.js +70 -50
- package/dist/sync.js.map +1 -1
- package/dist/types.d.ts +15 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +1 -0
- package/dist/types.js.map +1 -1
- package/dist/uploader.d.ts +4 -0
- package/dist/uploader.d.ts.map +1 -1
- package/dist/uploader.js +25 -1
- package/dist/uploader.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -6,9 +6,11 @@ A CLI tool to sync files from external services (via rclone) to the Aspect platf
|
|
|
6
6
|
|
|
7
7
|
- **Rclone Integration**: Sync files from any rclone-supported remote (Dropbox, Google Drive, S3, etc.)
|
|
8
8
|
- **Directory Structure Preservation**: Maintains folder hierarchy from source to destination
|
|
9
|
+
- **Idempotent Syncs**: Safe to re-run - automatically skips already-uploaded files and reuses existing directories
|
|
9
10
|
- **Multipart Upload**: Efficient chunked uploads with retry logic (20MB chunks)
|
|
10
11
|
- **Dynamic CLI Progress**: Real-time upload progress display with in-place updates
|
|
11
12
|
- **Concurrent Uploads**: Configurable parallel chunk uploads for optimal performance
|
|
13
|
+
- **Session Isolation**: Auto-generated nanosecond-precision sessions for safe concurrent syncs
|
|
12
14
|
- **Automatic Cleanup**: Removes local files after successful upload
|
|
13
15
|
- **Retry Logic**: Automatic retry for failed uploads (part-level and file-level)
|
|
14
16
|
|
|
@@ -123,10 +125,11 @@ npx aspect-sync \
|
|
|
123
125
|
| `--directory-id <id>` | Aspect directory ID to upload to | Yes | - |
|
|
124
126
|
| `--project-id <id>` | Aspect project ID | Yes | - |
|
|
125
127
|
| `--api-key <key>` | Aspect API key (or set `ASPECT_API_KEY` env var) | Yes | - |
|
|
126
|
-
| `--api-url <url>` | Aspect API URL (or set `ASPECT_API_URL` env var) | No | `
|
|
128
|
+
| `--api-url <url>` | Aspect API URL (or set `ASPECT_API_URL` env var) | No | `https://api.aspect.inc` |
|
|
127
129
|
| `--concurrent <number>` | Max concurrent chunk uploads | No | `4` |
|
|
128
130
|
| `--keep-local` | Keep local files after upload (for debugging) | No | `false` |
|
|
129
|
-
| `--temp-dir <path>` |
|
|
131
|
+
| `--temp-dir <path>` | Base temporary directory for synced files | No | `~/.aspect/sync` |
|
|
132
|
+
| `--session <name>` | Session name for isolation. If not provided, auto-generates timestamp with nanosecond precision (YYYY-MM-DD_HHh-MMm-SSs-NNNNNNNNNns). Creates subdirectory in temp-dir. | No | Auto-generated |
|
|
130
133
|
|
|
131
134
|
### Environment Variables
|
|
132
135
|
|
|
@@ -179,13 +182,83 @@ aspect-sync \
|
|
|
179
182
|
--api-key your-api-key
|
|
180
183
|
```
|
|
181
184
|
|
|
185
|
+
### Concurrent Syncs
|
|
186
|
+
|
|
187
|
+
Multiple syncs can run simultaneously using sessions for isolation. Each session gets its own subdirectory.
|
|
188
|
+
|
|
189
|
+
**Auto-generated sessions (default):**
|
|
190
|
+
|
|
191
|
+
Each sync automatically gets a unique nanosecond-precision timestamp, allowing unlimited concurrent syncs without conflicts.
|
|
192
|
+
|
|
193
|
+
```bash
|
|
194
|
+
# Terminal 1
|
|
195
|
+
aspect-sync --remote dropbox --path /project-a --directory-id abc-123 --project-id p1 --api-key key
|
|
196
|
+
# Session: 2025-10-21_20h-15m-30s-487123456ns
|
|
197
|
+
|
|
198
|
+
# Terminal 2
|
|
199
|
+
aspect-sync --remote dropbox --path /project-b --directory-id def-456 --project-id p2 --api-key key
|
|
200
|
+
# Session: 2025-10-21_20h-15m-30s-487945821ns
|
|
201
|
+
|
|
202
|
+
# Terminal 3
|
|
203
|
+
aspect-sync --remote gdrive --path /project-c --directory-id ghi-789 --project-id p3 --api-key key
|
|
204
|
+
# Session: 2025-10-21_20h-15m-30s-488201937ns
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
**Custom sessions:**
|
|
208
|
+
```bash
|
|
209
|
+
# Terminal 1
|
|
210
|
+
aspect-sync --remote dropbox --path /videos --directory-id abc-123 --project-id p1 --session prod-sync --api-key key
|
|
211
|
+
# Session: prod-sync
|
|
212
|
+
|
|
213
|
+
# Terminal 2
|
|
214
|
+
aspect-sync --remote gdrive --path /images --directory-id def-456 --project-id p2 --session dev-sync --api-key key
|
|
215
|
+
# Session: dev-sync
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
**Finding your temp files:**
|
|
219
|
+
|
|
220
|
+
Sessions are stored in `~/.aspect/sync/{session-name}` by default. The full path is shown in the logs at startup.
|
|
221
|
+
|
|
182
222
|
## How It Works
|
|
183
223
|
|
|
184
|
-
1. **
|
|
185
|
-
2. **
|
|
186
|
-
3. **
|
|
187
|
-
4. **
|
|
188
|
-
5. **
|
|
224
|
+
1. **Session Creation**: Creates isolated session directory with nanosecond-precision timestamp
|
|
225
|
+
2. **Rclone Sync**: Downloads files from the remote to the session directory
|
|
226
|
+
3. **Directory Discovery**: Fetches existing directory tree from Aspect to avoid duplicates
|
|
227
|
+
4. **Directory Creation**: Creates only missing directories, reuses existing ones
|
|
228
|
+
5. **Asset Deduplication**: Checks if each asset already exists before uploading
|
|
229
|
+
6. **File Upload**: Uploads new assets using multipart upload (20MB chunks)
|
|
230
|
+
7. **Progress Display**: Shows real-time upload progress in the CLI
|
|
231
|
+
8. **Cleanup**: Deletes local files after successful upload (unless `--keep-local` is set)
|
|
232
|
+
|
|
233
|
+
## Idempotent Behavior
|
|
234
|
+
|
|
235
|
+
The syncer is **fully idempotent** - you can safely re-run the same sync multiple times:
|
|
236
|
+
|
|
237
|
+
✅ **Existing directories are reused** - The tool fetches the directory tree first and only creates missing directories
|
|
238
|
+
|
|
239
|
+
✅ **Existing assets are skipped** - Before uploading, checks if an asset with the same name, size, and location already exists
|
|
240
|
+
- If found and fully uploaded: Skips upload
|
|
241
|
+
- If found but incomplete: Deletes incomplete asset and re-uploads
|
|
242
|
+
- If not found: Proceeds with upload
|
|
243
|
+
|
|
244
|
+
✅ **Clean re-runs** - If a sync fails halfway:
|
|
245
|
+
```bash
|
|
246
|
+
# First run - uploads 50 of 100 files then crashes
|
|
247
|
+
aspect-sync --remote dropbox --path /videos --directory-id abc --project-id xyz --api-key key
|
|
248
|
+
|
|
249
|
+
# Re-run - skips the 50 uploaded files, uploads remaining 50
|
|
250
|
+
aspect-sync --remote dropbox --path /videos --directory-id abc --project-id xyz --api-key key
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
**Output on re-run:**
|
|
254
|
+
```
|
|
255
|
+
✓ video1.mp4 (100%)
|
|
256
|
+
⊘ video2.mp4 (Skipped - already uploaded) ← Already uploaded
|
|
257
|
+
⊘ video3.mp4 (Skipped - already uploaded) ← Already uploaded
|
|
258
|
+
↑ video4.mp4 (45%) ← Uploading now
|
|
259
|
+
|
|
260
|
+
Total: 100 | Success: 1 | Failed: 0 | Skipped: 98 | In Progress: 1 | Queued: 0
|
|
261
|
+
```
|
|
189
262
|
|
|
190
263
|
## CLI Progress Display
|
|
191
264
|
|
|
@@ -194,14 +267,17 @@ The tool shows dynamic, in-place progress updates:
|
|
|
194
267
|
```
|
|
195
268
|
✓ video1.mp4 (100%)
|
|
196
269
|
✓ video2.mp4 (100%)
|
|
197
|
-
|
|
198
|
-
↑ video4.mp4 (
|
|
270
|
+
⊘ video3.mp4 (Skipped - already uploaded)
|
|
271
|
+
↑ video4.mp4 (47%)
|
|
272
|
+
↑ video5.mp4 (23%)
|
|
199
273
|
|
|
200
|
-
Total: 10 | Success: 2 | Failed: 0 | In Progress: 2 | Queued:
|
|
274
|
+
Total: 10 | Success: 2 | Failed: 0 | Skipped: 1 | In Progress: 2 | Queued: 5 | Speed: 45.3 Mb/s | Time remaining: 2m 15s
|
|
201
275
|
```
|
|
202
276
|
|
|
277
|
+
**Status Indicators:**
|
|
203
278
|
- `✓` = Successfully uploaded
|
|
204
279
|
- `✗` = Failed upload
|
|
280
|
+
- `⊘` = Skipped (already exists on server)
|
|
205
281
|
- `↑` = Currently uploading
|
|
206
282
|
|
|
207
283
|
Only files that are actively uploading are shown (not the entire queue).
|
package/dist/cliDisplay.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cliDisplay.d.ts","sourceRoot":"","sources":["../src/cliDisplay.ts"],"names":[],"mappings":"AAKA,cAAM,UAAU;;IAOd,KAAK,IAAI,IAAI;IAkBb,IAAI,IAAI,IAAI;
|
|
1
|
+
{"version":3,"file":"cliDisplay.d.ts","sourceRoot":"","sources":["../src/cliDisplay.ts"],"names":[],"mappings":"AAKA,cAAM,UAAU;;IAOd,KAAK,IAAI,IAAI;IAkBb,IAAI,IAAI,IAAI;CA4Gb;AAED,eAAO,MAAM,UAAU,YAAmB,CAAA"}
|
package/dist/cliDisplay.js
CHANGED
|
@@ -44,9 +44,11 @@ class CliDisplay {
|
|
|
44
44
|
const inProgressFiles = statusTracker.getInProgressFiles();
|
|
45
45
|
const allFiles = statusTracker.getAllUploadFiles();
|
|
46
46
|
const totals = statusTracker.getUploadTotals();
|
|
47
|
-
// Check for newly completed/failed files since last render
|
|
47
|
+
// Check for newly completed/failed/skipped files since last render
|
|
48
48
|
for (const file of allFiles) {
|
|
49
|
-
if ((file.uploadStatus === UploadStatus.SUCCESS ||
|
|
49
|
+
if ((file.uploadStatus === UploadStatus.SUCCESS ||
|
|
50
|
+
file.uploadStatus === UploadStatus.FAILED ||
|
|
51
|
+
file.uploadStatus === UploadStatus.SKIPPED) &&
|
|
50
52
|
!this.#completedFileIds.has(file.fileId)) {
|
|
51
53
|
this.#addCompletedLine(file);
|
|
52
54
|
this.#completedFileIds.add(file.fileId);
|
|
@@ -68,17 +70,20 @@ class CliDisplay {
|
|
|
68
70
|
}
|
|
69
71
|
#addCompletedLine(file) {
|
|
70
72
|
if (file.uploadStatus === UploadStatus.SUCCESS) {
|
|
71
|
-
this.#completedLines.push(`${chalk.green("✓")} ${file.
|
|
73
|
+
this.#completedLines.push(`${chalk.green("✓")} ${file.relativePath} ${chalk.green("(100%)")}`);
|
|
72
74
|
}
|
|
73
75
|
else if (file.uploadStatus === UploadStatus.FAILED) {
|
|
74
|
-
this.#completedLines.push(`${chalk.red("✗")} ${file.
|
|
76
|
+
this.#completedLines.push(`${chalk.red("✗")} ${file.relativePath} ${chalk.red(`(Failed: ${file.errorMessage || "Unknown error"})`)}`);
|
|
77
|
+
}
|
|
78
|
+
else if (file.uploadStatus === UploadStatus.SKIPPED) {
|
|
79
|
+
this.#completedLines.push(`${chalk.yellow("⊘")} ${file.relativePath} ${chalk.yellow("(Skipped - already exists)")}`);
|
|
75
80
|
}
|
|
76
81
|
}
|
|
77
82
|
#formatInProgressFile(file) {
|
|
78
83
|
const percentage = file.totalBytesToUpload > 0
|
|
79
84
|
? Math.floor((file.bytesUploaded / file.totalBytesToUpload) * 100)
|
|
80
85
|
: 0;
|
|
81
|
-
return `${chalk.blue("↑")} ${file.
|
|
86
|
+
return `${chalk.blue("↑")} ${file.relativePath} ${chalk.blue(`(${percentage}%)`)}`;
|
|
82
87
|
}
|
|
83
88
|
#formatSummary(totals) {
|
|
84
89
|
// Stats are updated by the 1-second interval, just read cached values
|
|
@@ -87,10 +92,11 @@ class CliDisplay {
|
|
|
87
92
|
`Total: ${totals.totalFileCount}`,
|
|
88
93
|
chalk.green(`Success: ${totals.successFileCount}`),
|
|
89
94
|
chalk.red(`Failed: ${totals.failedFileCount}`),
|
|
95
|
+
chalk.yellow(`Skipped: ${totals.skippedFileCount}`),
|
|
90
96
|
chalk.blue(`In Progress: ${totals.inProgressFileCount}`),
|
|
91
97
|
chalk.gray(`Queued: ${totals.queuedFileCount}`),
|
|
92
98
|
];
|
|
93
|
-
const statsLine = stats.
|
|
99
|
+
const statsLine = stats.uploadSpeedMbps !== null && stats.timeRemainingSeconds !== null ? [
|
|
94
100
|
chalk.cyan(`Speed: ${stats.formattedSpeed}`),
|
|
95
101
|
chalk.magenta(`Time remaining: ${stats.formattedTime}`),
|
|
96
102
|
] : [];
|
package/dist/cliDisplay.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cliDisplay.js","sourceRoot":"","sources":["../src/cliDisplay.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,YAAY,CAAA;AAClC,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,EAAE,YAAY,EAAwB,MAAM,YAAY,CAAA;AAE/D,MAAM,UAAU;IACd,eAAe,GAAa,EAAE,CAAA;IAC9B,iBAAiB,GAAgB,IAAI,GAAG,EAAE,CAAA;IAC1C,eAAe,GAA0B,IAAI,CAAA;IAC7C,cAAc,GAA0B,IAAI,CAAA;IAC5C,UAAU,GAAY,KAAK,CAAA;IAE3B,KAAK;QACH,IAAI,IAAI,CAAC,UAAU;YAAE,OAAM;QAC3B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAA;QAEtB,sDAAsD;QACtD,IAAI,CAAC,eAAe,GAAG,WAAW,CAAC,GAAG,EAAE;YACtC,IAAI,CAAC,OAAO,EAAE,CAAA;QAChB,CAAC,EAAE,GAAG,CAAC,CAAA;QAEP,iEAAiE;QACjE,IAAI,CAAC,cAAc,GAAG,WAAW,CAAC,GAAG,EAAE;YACrC,aAAa,CAAC,iBAAiB,EAAE,CAAA;QACnC,CAAC,EAAE,IAAI,CAAC,CAAA;QAER,uCAAuC;QACvC,aAAa,CAAC,iBAAiB,EAAE,CAAA;IACnC,CAAC;IAED,IAAI;QACF,IAAI,CAAC,IAAI,CAAC,UAAU;YAAE,OAAM;QAC5B,IAAI,CAAC,UAAU,GAAG,KAAK,CAAA;QAEvB,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,aAAa,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;YACnC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAA;QAC7B,CAAC;QAED,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;YAClC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAA;QAC5B,CAAC;QAED,yDAAyD;QACzD,aAAa,CAAC,iBAAiB,EAAE,CAAA;QACjC,IAAI,CAAC,OAAO,EAAE,CAAA;QACd,SAAS,CAAC,IAAI,EAAE,CAAA;IAClB,CAAC;IAED,OAAO;QACL,MAAM,eAAe,GAAG,aAAa,CAAC,kBAAkB,EAAE,CAAA;QAC1D,MAAM,QAAQ,GAAG,aAAa,CAAC,iBAAiB,EAAE,CAAA;QAClD,MAAM,MAAM,GAAG,aAAa,CAAC,eAAe,EAAE,CAAA;QAE9C,
|
|
1
|
+
{"version":3,"file":"cliDisplay.js","sourceRoot":"","sources":["../src/cliDisplay.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -18,12 +18,37 @@ program
|
|
|
18
18
|
.option("--concurrent <number>", "Maximum concurrent chunk uploads", "4")
|
|
19
19
|
.option("--keep-local", "Keep local files after upload (for debugging)", false)
|
|
20
20
|
.option("--temp-dir <path>", "Local temporary directory for synced files", path.join(os.homedir(), ".aspect", "sync"))
|
|
21
|
+
.option("--session <name>", "Session name for isolation (default: auto-generated timestamp)")
|
|
21
22
|
.action(async (options) => {
|
|
22
23
|
// Validate required options
|
|
23
24
|
if (!options.apiKey) {
|
|
24
25
|
console.error("Error: --api-key is required (or set ASPECT_API_KEY env variable)");
|
|
25
26
|
process.exit(1);
|
|
26
27
|
}
|
|
28
|
+
// Build base temp directory
|
|
29
|
+
const baseTempDir = options.tempDir || path.join(os.homedir(), ".aspect", "sync");
|
|
30
|
+
// Generate or use provided session name
|
|
31
|
+
let sessionName;
|
|
32
|
+
if (options.session) {
|
|
33
|
+
sessionName = options.session;
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
// Auto-generate: YYYY-MM-DD_HHh-MMm-SSs-NNNNNNNNNns (nanosecond precision)
|
|
37
|
+
const now = new Date();
|
|
38
|
+
const year = now.getFullYear();
|
|
39
|
+
const month = String(now.getMonth() + 1).padStart(2, '0');
|
|
40
|
+
const day = String(now.getDate()).padStart(2, '0');
|
|
41
|
+
const hours = String(now.getHours()).padStart(2, '0');
|
|
42
|
+
const minutes = String(now.getMinutes()).padStart(2, '0');
|
|
43
|
+
const seconds = String(now.getSeconds()).padStart(2, '0');
|
|
44
|
+
// Get nanoseconds from high-resolution time
|
|
45
|
+
const hrtime = process.hrtime.bigint();
|
|
46
|
+
// Extract the sub-second portion (last 9 digits = nanoseconds within the second)
|
|
47
|
+
const nanos = hrtime % 1000000000n;
|
|
48
|
+
const nanosStr = String(nanos).padStart(9, '0');
|
|
49
|
+
sessionName = `${year}-${month}-${day}_${hours}h-${minutes}m-${seconds}s-${nanosStr}ns`;
|
|
50
|
+
}
|
|
51
|
+
const localTempDir = path.join(baseTempDir, sessionName);
|
|
27
52
|
// Build config
|
|
28
53
|
const config = {
|
|
29
54
|
remote: options.remote,
|
|
@@ -34,7 +59,8 @@ program
|
|
|
34
59
|
apiKey: options.apiKey,
|
|
35
60
|
maxConcurrent: parseInt(options.concurrent, 10),
|
|
36
61
|
keepLocal: options.keepLocal,
|
|
37
|
-
localTempDir:
|
|
62
|
+
localTempDir: localTempDir,
|
|
63
|
+
sessionName: sessionName,
|
|
38
64
|
};
|
|
39
65
|
// Validate config
|
|
40
66
|
if (isNaN(config.maxConcurrent) || config.maxConcurrent < 1) {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;AAC5B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/rclone.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rclone.d.ts","sourceRoot":"","sources":["../src/rclone.ts"],"names":[],"mappings":"AAIA,qBAAa,WAAY,SAAQ,KAAK;aACS,MAAM,EAAE,MAAM;gBAA/C,OAAO,EAAE,MAAM,EAAkB,MAAM,EAAE,MAAM;CAI5D;AAED,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC,CAoB1D;AAED,wBAAsB,cAAc,CAClC,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"rclone.d.ts","sourceRoot":"","sources":["../src/rclone.ts"],"names":[],"mappings":"AAIA,qBAAa,WAAY,SAAQ,KAAK;aACS,MAAM,EAAE,MAAM;gBAA/C,OAAO,EAAE,MAAM,EAAkB,MAAM,EAAE,MAAM;CAI5D;AAED,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC,CAoB1D;AAED,wBAAsB,cAAc,CAClC,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CA4Cf;AAED,wBAAsB,eAAe,CACnC,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,EAAE,CAAC,CA0CnB;AAED,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,MAAM,CAAA;IACpB,YAAY,EAAE,MAAM,CAAA;IACpB,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;CACb;AAED,wBAAsB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CA0BpF;AAED,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAMrE;AAED,wBAAsB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA+B5E"}
|
package/dist/rclone.js
CHANGED
|
@@ -38,29 +38,20 @@ export async function syncFromRemote(remote, remotePath, localPath) {
|
|
|
38
38
|
"--stats", "1s",
|
|
39
39
|
"--stats-one-line",
|
|
40
40
|
"-v"
|
|
41
|
-
]
|
|
42
|
-
|
|
43
|
-
// Stream stdout to console in real-time
|
|
44
|
-
rcloneProcess.stdout.on("data", (data) => {
|
|
45
|
-
process.stdout.write(data);
|
|
46
|
-
});
|
|
47
|
-
// Capture stderr for error reporting
|
|
48
|
-
rcloneProcess.stderr.on("data", (data) => {
|
|
49
|
-
const text = data.toString();
|
|
50
|
-
stderrOutput += text;
|
|
51
|
-
process.stderr.write(data);
|
|
41
|
+
], {
|
|
42
|
+
stdio: 'inherit' // Inherit all streams for native terminal behavior
|
|
52
43
|
});
|
|
44
|
+
// All output goes directly to terminal - no manual handling needed
|
|
53
45
|
// Handle process completion
|
|
54
46
|
rcloneProcess.on("close", (code) => {
|
|
47
|
+
console.log("");
|
|
55
48
|
if (code === 0) {
|
|
56
|
-
console.log(
|
|
57
|
-
console.log(`✓ Sync complete: ${remoteSource} -> ${localPath}`);
|
|
49
|
+
console.log(`✓ Rclone sync complete`);
|
|
58
50
|
resolve();
|
|
59
51
|
}
|
|
60
52
|
else {
|
|
61
|
-
console.log("");
|
|
62
53
|
console.log(`✗ Failed to sync from ${remoteSource}`);
|
|
63
|
-
reject(new RcloneError(`rclone exited with code ${code}`,
|
|
54
|
+
reject(new RcloneError(`rclone exited with code ${code}`, "(output shown above)"));
|
|
64
55
|
}
|
|
65
56
|
});
|
|
66
57
|
// Handle spawn errors (e.g., rclone not found)
|
package/dist/rclone.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rclone.js","sourceRoot":"","sources":["../src/rclone.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AACrC,OAAO,KAAK,EAAE,MAAM,IAAI,CAAA;AACxB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;AAE5B,MAAM,OAAO,WAAY,SAAQ,KAAK;IACS;IAA7C,YAAY,OAAe,EAAkB,MAAc;QACzD,KAAK,CAAC,OAAO,CAAC,CAAA;QAD6B,WAAM,GAAN,MAAM,CAAQ;QAEzD,IAAI,CAAC,IAAI,GAAG,aAAa,CAAA;IAC3B,CAAC;CACF;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB;IACxC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC,SAAS,CAAC,CAAC,CAAA;QAE5C,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YACvB,MAAM,CAAC,IAAI,KAAK,CACd,kGAAkG,CACnG,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;QAEF,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YAC3B,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;gBACf,OAAO,EAAE,CAAA;YACX,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,KAAK,CACd,kGAAkG,CACnG,CAAC,CAAA;YACJ,CAAC;QACH,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,MAAc,EACd,UAAkB,EAClB,SAAiB;IAEjB,MAAM,YAAY,GAAG,GAAG,MAAM,IAAI,UAAU,EAAE,CAAA;IAE9C,OAAO,CAAC,GAAG,CAAC,gBAAgB,YAAY,OAAO,SAAS,KAAK,CAAC,CAAA;IAC9D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IAEf,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,aAAa,GAAG,KAAK,CAAC,QAAQ,EAAE;YACpC,MAAM;YACN,YAAY;YACZ,SAAS;YACT,YAAY;YACZ,SAAS,EAAE,IAAI;YACf,kBAAkB;YAClB,IAAI;SACL,
|
|
1
|
+
{"version":3,"file":"rclone.js","sourceRoot":"","sources":["../src/rclone.ts"],"names":[],"mappings":"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"}
|
package/dist/statusTracker.d.ts
CHANGED
|
@@ -16,10 +16,11 @@ declare class StatusTrackerClass {
|
|
|
16
16
|
uploadFiles: Record<string, UploadFileState>;
|
|
17
17
|
uploadSpeedState: UploadSpeedState;
|
|
18
18
|
uploadStats: UploadStats;
|
|
19
|
-
addUploadFile(fileId: string, filePath: string, fileName: string, fileSize: number): void;
|
|
19
|
+
addUploadFile(fileId: string, filePath: string, fileName: string, relativePath: string, fileSize: number): void;
|
|
20
20
|
updateUploadProgress(fileId: string, bytesUploaded: number): void;
|
|
21
21
|
markUploadSuccess(fileId: string): void;
|
|
22
22
|
markUploadFailed(fileId: string, errorMessage: string): void;
|
|
23
|
+
markUploadSkipped(fileId: string): void;
|
|
23
24
|
resetFileForRetry(fileId: string): void;
|
|
24
25
|
getUploadFile(fileId: string): UploadFileState | undefined;
|
|
25
26
|
getUploadTotals(): UploadTotals;
|
|
@@ -1 +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;
|
|
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,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,GACf,IAAI;IAcP,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;IAmBvC,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAavC,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAI1D,eAAe,IAAI,YAAY;IA6C/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"}
|
package/dist/statusTracker.js
CHANGED
|
@@ -12,11 +12,12 @@ class StatusTrackerClass {
|
|
|
12
12
|
formattedSpeed: "Calculating...",
|
|
13
13
|
formattedTime: "Calculating..."
|
|
14
14
|
};
|
|
15
|
-
addUploadFile(fileId, filePath, fileName, fileSize) {
|
|
15
|
+
addUploadFile(fileId, filePath, fileName, relativePath, fileSize) {
|
|
16
16
|
this.uploadFiles[fileId] = {
|
|
17
17
|
fileId,
|
|
18
18
|
filePath,
|
|
19
19
|
fileName,
|
|
20
|
+
relativePath,
|
|
20
21
|
totalBytesToUpload: fileSize,
|
|
21
22
|
bytesUploaded: 0,
|
|
22
23
|
uploadStatus: UploadStatus.QUEUED,
|
|
@@ -75,6 +76,20 @@ class StatusTrackerClass {
|
|
|
75
76
|
this.uploadSpeedState.dataPoints = [];
|
|
76
77
|
}
|
|
77
78
|
}
|
|
79
|
+
markUploadSkipped(fileId) {
|
|
80
|
+
const currentFile = this.uploadFiles[fileId];
|
|
81
|
+
if (!currentFile)
|
|
82
|
+
return;
|
|
83
|
+
this.uploadFiles[fileId] = {
|
|
84
|
+
...currentFile,
|
|
85
|
+
uploadStatus: UploadStatus.SKIPPED,
|
|
86
|
+
bytesUploaded: 0
|
|
87
|
+
};
|
|
88
|
+
const hasActiveUploads = Object.values(this.uploadFiles).some(file => file.uploadStatus === UploadStatus.QUEUED || file.uploadStatus === UploadStatus.IN_PROGRESS);
|
|
89
|
+
if (!hasActiveUploads) {
|
|
90
|
+
this.uploadSpeedState.dataPoints = [];
|
|
91
|
+
}
|
|
92
|
+
}
|
|
78
93
|
resetFileForRetry(fileId) {
|
|
79
94
|
const currentFile = this.uploadFiles[fileId];
|
|
80
95
|
if (!currentFile)
|
|
@@ -93,7 +108,8 @@ class StatusTrackerClass {
|
|
|
93
108
|
getUploadTotals() {
|
|
94
109
|
const files = Object.values(this.uploadFiles);
|
|
95
110
|
return files.reduce((totals, file) => {
|
|
96
|
-
if (file.uploadStatus !== UploadStatus.FAILED
|
|
111
|
+
if (file.uploadStatus !== UploadStatus.FAILED &&
|
|
112
|
+
file.uploadStatus !== UploadStatus.SKIPPED) {
|
|
97
113
|
totals.totalBytesToUpload += file.totalBytesToUpload;
|
|
98
114
|
totals.totalBytesUploaded += file.bytesUploaded;
|
|
99
115
|
}
|
|
@@ -111,6 +127,9 @@ class StatusTrackerClass {
|
|
|
111
127
|
case UploadStatus.FAILED:
|
|
112
128
|
totals.failedFileCount += 1;
|
|
113
129
|
break;
|
|
130
|
+
case UploadStatus.SKIPPED:
|
|
131
|
+
totals.skippedFileCount += 1;
|
|
132
|
+
break;
|
|
114
133
|
}
|
|
115
134
|
return totals;
|
|
116
135
|
}, {
|
|
@@ -120,7 +139,8 @@ class StatusTrackerClass {
|
|
|
120
139
|
queuedFileCount: 0,
|
|
121
140
|
inProgressFileCount: 0,
|
|
122
141
|
successFileCount: 0,
|
|
123
|
-
failedFileCount: 0
|
|
142
|
+
failedFileCount: 0,
|
|
143
|
+
skippedFileCount: 0
|
|
124
144
|
});
|
|
125
145
|
}
|
|
126
146
|
getAllUploadFiles() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"statusTracker.js","sourceRoot":"","sources":["../src/statusTracker.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"statusTracker.js","sourceRoot":"","sources":["../src/statusTracker.ts"],"names":[],"mappings":"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"}
|
package/dist/sync.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../src/sync.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../src/sync.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,UAAU,EAAqB,MAAM,YAAY,CAAA;AAS/D,qBAAa,gBAAgB;;gBAOf,MAAM,EAAE,UAAU;IAaxB,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAqO3B"}
|
package/dist/sync.js
CHANGED
|
@@ -3,9 +3,9 @@ import * as path from "path";
|
|
|
3
3
|
import axios from "axios";
|
|
4
4
|
import { v4 as uuidv4 } from "uuid";
|
|
5
5
|
import { statusTracker } from "./statusTracker.js";
|
|
6
|
-
import { Uploader, createTaskController } from "./uploader.js";
|
|
6
|
+
import { Uploader, createTaskController, SkippedError } from "./uploader.js";
|
|
7
7
|
import { cliDisplay } from "./cliDisplay.js";
|
|
8
|
-
import { checkRcloneInstalled, syncFromRemote, scanLocalDirectory,
|
|
8
|
+
import { checkRcloneInstalled, syncFromRemote, scanLocalDirectory, } from "./rclone.js";
|
|
9
9
|
export class SyncOrchestrator {
|
|
10
10
|
#config;
|
|
11
11
|
#uploader;
|
|
@@ -26,9 +26,11 @@ export class SyncOrchestrator {
|
|
|
26
26
|
}
|
|
27
27
|
async run() {
|
|
28
28
|
console.log("Starting data sync...");
|
|
29
|
+
console.log(`Session: ${this.#config.sessionName}`);
|
|
29
30
|
console.log(`Remote: ${this.#config.remote}:${this.#config.remotePath}`);
|
|
30
31
|
console.log(`Root directory ID: ${this.#config.directoryId}`);
|
|
31
32
|
console.log(`Project ID: ${this.#config.projectId}`);
|
|
33
|
+
console.log(`Temp directory: ${this.#config.localTempDir}`);
|
|
32
34
|
console.log("");
|
|
33
35
|
// Step 1: Check rclone is installed
|
|
34
36
|
console.log("Checking rclone installation...");
|
|
@@ -36,7 +38,10 @@ export class SyncOrchestrator {
|
|
|
36
38
|
console.log("✓ rclone is installed");
|
|
37
39
|
console.log("");
|
|
38
40
|
// Step 2: Ensure local temp directory exists
|
|
41
|
+
console.log("Creating session directory...");
|
|
39
42
|
await fs.promises.mkdir(this.#config.localTempDir, { recursive: true });
|
|
43
|
+
console.log(`✓ Session directory: ${this.#config.localTempDir}`);
|
|
44
|
+
console.log("");
|
|
40
45
|
// Step 3: Sync files from remote to local
|
|
41
46
|
console.log("Syncing files from remote...");
|
|
42
47
|
await syncFromRemote(this.#config.remote, this.#config.remotePath, this.#config.localTempDir);
|
|
@@ -50,9 +55,9 @@ export class SyncOrchestrator {
|
|
|
50
55
|
console.log("No files to upload. Exiting.");
|
|
51
56
|
return;
|
|
52
57
|
}
|
|
53
|
-
// Step 5:
|
|
54
|
-
console.log("
|
|
55
|
-
await this.#
|
|
58
|
+
// Step 5: Fetch existing directory tree and create missing directories
|
|
59
|
+
console.log("Fetching existing directory structure...");
|
|
60
|
+
await this.#fetchAndCreateDirectories(localFiles);
|
|
56
61
|
console.log("");
|
|
57
62
|
// Step 6: Start CLI display
|
|
58
63
|
cliDisplay.start();
|
|
@@ -62,33 +67,40 @@ export class SyncOrchestrator {
|
|
|
62
67
|
const uploadPromises = localFiles.map(async (file) => {
|
|
63
68
|
const fileId = uuidv4();
|
|
64
69
|
const directoryId = this.#getDirectoryIdForFile(file.relativePath);
|
|
65
|
-
statusTracker.addUploadFile(fileId, file.absolutePath, file.fileName, file.size);
|
|
70
|
+
statusTracker.addUploadFile(fileId, file.absolutePath, file.fileName, file.relativePath, file.size);
|
|
66
71
|
try {
|
|
67
72
|
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
|
}
|
|
73
74
|
catch (error) {
|
|
74
|
-
|
|
75
|
+
if (error instanceof SkippedError) {
|
|
76
|
+
// Mark as skipped (not an error)
|
|
77
|
+
statusTracker.markUploadSkipped(fileId);
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
console.error(`Failed to upload ${file.fileName}:`, error);
|
|
81
|
+
}
|
|
75
82
|
}
|
|
76
83
|
});
|
|
77
84
|
await Promise.all(uploadPromises);
|
|
78
85
|
// Step 8: Stop CLI display
|
|
79
86
|
cliDisplay.stop();
|
|
80
|
-
// Step 9: Clean up
|
|
87
|
+
// Step 9: Clean up entire session directory (unless keepLocal is true)
|
|
81
88
|
if (!this.#config.keepLocal) {
|
|
82
89
|
console.log("");
|
|
83
|
-
console.log("Cleaning up
|
|
84
|
-
await
|
|
90
|
+
console.log("Cleaning up session directory...");
|
|
91
|
+
await fs.promises.rm(this.#config.localTempDir, { recursive: true, force: true });
|
|
92
|
+
console.log(`✓ Deleted session directory: ${this.#config.localTempDir}`);
|
|
85
93
|
}
|
|
86
94
|
// Step 10: Print summary
|
|
87
95
|
console.log("");
|
|
88
96
|
this.#printSummary();
|
|
89
97
|
}
|
|
90
|
-
async #
|
|
91
|
-
//
|
|
98
|
+
async #fetchAndCreateDirectories(files) {
|
|
99
|
+
// Step 1: Fetch existing directory tree from server
|
|
100
|
+
const tree = await this.#fetchDirectoryTree(this.#config.directoryId);
|
|
101
|
+
// Step 2: Flatten tree into cache (relativePath -> directoryId)
|
|
102
|
+
this.#flattenDirectoryTree(tree, "");
|
|
103
|
+
// Step 3: Extract unique directory paths from files
|
|
92
104
|
const directoryPaths = new Set();
|
|
93
105
|
for (const file of files) {
|
|
94
106
|
const dirPath = path.dirname(file.relativePath);
|
|
@@ -101,54 +113,62 @@ export class SyncOrchestrator {
|
|
|
101
113
|
}
|
|
102
114
|
}
|
|
103
115
|
}
|
|
104
|
-
// Sort directories by depth (shallowest first)
|
|
116
|
+
// Step 4: Sort directories by depth (shallowest first)
|
|
105
117
|
const sortedDirectories = Array.from(directoryPaths).sort((a, b) => a.split(path.sep).length - b.split(path.sep).length);
|
|
106
|
-
// Create directories
|
|
118
|
+
// Step 5: Create missing directories (skip existing ones)
|
|
107
119
|
for (const dirPath of sortedDirectories) {
|
|
120
|
+
// Check if directory already exists in cache
|
|
121
|
+
if (this.#directoryCache.has(dirPath)) {
|
|
122
|
+
console.log(`Using existing directory: ${dirPath}`);
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
125
|
+
// Directory doesn't exist, create it
|
|
108
126
|
const parentPath = path.dirname(dirPath);
|
|
109
127
|
const dirName = path.basename(dirPath);
|
|
110
128
|
const parentId = parentPath === "." ? this.#config.directoryId : this.#directoryCache.get(parentPath);
|
|
111
129
|
if (!parentId) {
|
|
112
130
|
throw new Error(`Parent directory ID not found for path: ${dirPath}`);
|
|
113
131
|
}
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
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
|
-
}
|
|
132
|
+
const directory = await this.#createDirectory(parentId, dirName);
|
|
133
|
+
this.#directoryCache.set(dirPath, directory.id);
|
|
134
|
+
console.log(`Created directory: ${dirPath}`);
|
|
137
135
|
}
|
|
138
136
|
}
|
|
139
|
-
async #
|
|
140
|
-
const response = await this.#apiClient.
|
|
137
|
+
async #fetchDirectoryTree(directoryId) {
|
|
138
|
+
const response = await this.#apiClient.get(`/directories/${directoryId}/tree`);
|
|
141
139
|
return response.data;
|
|
142
140
|
}
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
141
|
+
#flattenDirectoryTree(node, parentPath) {
|
|
142
|
+
// For root node (parentPath is empty), don't add to cache - it's the sync root
|
|
143
|
+
// For child nodes, build relative path from root
|
|
144
|
+
let currentPath = "";
|
|
145
|
+
if (parentPath === "") {
|
|
146
|
+
// This is the root directory - don't cache it, but process children
|
|
147
|
+
currentPath = "";
|
|
148
|
+
}
|
|
149
|
+
else if (parentPath === ".") {
|
|
150
|
+
// First level child - just use the name
|
|
151
|
+
currentPath = node.name;
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
// Nested child - append to parent path
|
|
155
|
+
currentPath = `${parentPath}${path.sep}${node.name}`;
|
|
148
156
|
}
|
|
149
|
-
|
|
150
|
-
|
|
157
|
+
// Add to cache if not root
|
|
158
|
+
if (currentPath && currentPath !== "") {
|
|
159
|
+
this.#directoryCache.set(currentPath, node.id);
|
|
151
160
|
}
|
|
161
|
+
// Recursively process children
|
|
162
|
+
for (const child of node.children) {
|
|
163
|
+
// First level: pass "." so children know they're at root level
|
|
164
|
+
// Nested levels: pass the current path
|
|
165
|
+
const childParentPath = parentPath === "" ? "." : currentPath;
|
|
166
|
+
this.#flattenDirectoryTree(child, childParentPath);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
async #createDirectory(parentId, name) {
|
|
170
|
+
const response = await this.#apiClient.post(`/directories/${parentId}/directories`, { name });
|
|
171
|
+
return response.data;
|
|
152
172
|
}
|
|
153
173
|
#getDirectoryIdForFile(relativePath) {
|
|
154
174
|
const dirPath = path.dirname(relativePath);
|
package/dist/sync.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../src/sync.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAA;AACxB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;AAC5B,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,EAAE,IAAI,MAAM,EAAE,MAAM,MAAM,CAAA;AACnC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,EAAE,QAAQ,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../src/sync.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -2,12 +2,14 @@ export declare enum UploadStatus {
|
|
|
2
2
|
QUEUED = "queued",
|
|
3
3
|
IN_PROGRESS = "in_progress",
|
|
4
4
|
SUCCESS = "success",
|
|
5
|
-
FAILED = "failed"
|
|
5
|
+
FAILED = "failed",
|
|
6
|
+
SKIPPED = "skipped"
|
|
6
7
|
}
|
|
7
8
|
export interface UploadFileState {
|
|
8
9
|
fileId: string;
|
|
9
10
|
filePath: string;
|
|
10
11
|
fileName: string;
|
|
12
|
+
relativePath: string;
|
|
11
13
|
totalBytesToUpload: number;
|
|
12
14
|
bytesUploaded: number;
|
|
13
15
|
uploadStatus: UploadStatus;
|
|
@@ -37,6 +39,7 @@ export interface UploadTotals {
|
|
|
37
39
|
inProgressFileCount: number;
|
|
38
40
|
successFileCount: number;
|
|
39
41
|
failedFileCount: number;
|
|
42
|
+
skippedFileCount: number;
|
|
40
43
|
}
|
|
41
44
|
export interface SyncConfig {
|
|
42
45
|
remote: string;
|
|
@@ -48,6 +51,7 @@ export interface SyncConfig {
|
|
|
48
51
|
maxConcurrent: number;
|
|
49
52
|
keepLocal: boolean;
|
|
50
53
|
localTempDir: string;
|
|
54
|
+
sessionName: string;
|
|
51
55
|
}
|
|
52
56
|
export interface DirectoryMapping {
|
|
53
57
|
remotePath: string;
|
|
@@ -60,4 +64,14 @@ export interface FileToUpload {
|
|
|
60
64
|
directoryId: string;
|
|
61
65
|
size: number;
|
|
62
66
|
}
|
|
67
|
+
export interface DirectoryTreeNode {
|
|
68
|
+
id: string;
|
|
69
|
+
name: string;
|
|
70
|
+
parent_id: string;
|
|
71
|
+
children: DirectoryTreeNode[];
|
|
72
|
+
}
|
|
73
|
+
export interface AssetCheckExistsResponse {
|
|
74
|
+
exists: boolean;
|
|
75
|
+
asset_id?: string;
|
|
76
|
+
}
|
|
63
77
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +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;
|
|
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;IACjB,OAAO,YAAY;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,YAAY,EAAE,MAAM,CAAA;IACpB,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;IACvB,gBAAgB,EAAE,MAAM,CAAA;CACzB;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;IACpB,WAAW,EAAE,MAAM,CAAA;CACpB;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;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,iBAAiB,EAAE,CAAA;CAC9B;AAED,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,OAAO,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB"}
|
package/dist/types.js
CHANGED
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,
|
|
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"}
|
package/dist/uploader.d.ts
CHANGED
|
@@ -1,4 +1,8 @@
|
|
|
1
1
|
import { type SyncConfig } from "./types.js";
|
|
2
|
+
export declare class SkippedError extends Error {
|
|
3
|
+
readonly assetId: string;
|
|
4
|
+
constructor(assetId: string, message?: string);
|
|
5
|
+
}
|
|
2
6
|
interface WeightedTaskController {
|
|
3
7
|
acquire: () => Promise<void>;
|
|
4
8
|
release: () => void;
|
package/dist/uploader.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uploader.d.ts","sourceRoot":"","sources":["../src/uploader.ts"],"names":[],"mappings":"AAKA,OAAO,EAAyG,KAAK,UAAU,
|
|
1
|
+
{"version":3,"file":"uploader.d.ts","sourceRoot":"","sources":["../src/uploader.ts"],"names":[],"mappings":"AAKA,OAAO,EAAyG,KAAK,UAAU,EAAiC,MAAM,YAAY,CAAA;AAElL,qBAAa,YAAa,SAAQ,KAAK;aACT,OAAO,EAAE,MAAM;gBAAf,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,MAA+B;CAItF;AAqCD,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;CA8NjB;AAED,wBAAgB,oBAAoB,CAAC,aAAa,EAAE,MAAM,GAAG,sBAAsB,CAElF"}
|
package/dist/uploader.js
CHANGED
|
@@ -3,6 +3,14 @@ import * as fs from "fs";
|
|
|
3
3
|
import * as path from "path";
|
|
4
4
|
import { Readable } from "stream";
|
|
5
5
|
import { statusTracker } from "./statusTracker.js";
|
|
6
|
+
export class SkippedError extends Error {
|
|
7
|
+
assetId;
|
|
8
|
+
constructor(assetId, message = "Asset already exists") {
|
|
9
|
+
super(message);
|
|
10
|
+
this.assetId = assetId;
|
|
11
|
+
this.name = "SkippedError";
|
|
12
|
+
}
|
|
13
|
+
}
|
|
6
14
|
const CHUNK_SIZE = 20 * 1024 * 1024; // 20MB per part
|
|
7
15
|
const MAX_PART_UPLOAD_RETRIES = 3;
|
|
8
16
|
const MAX_FILE_UPLOAD_RETRIES = 3;
|
|
@@ -62,12 +70,20 @@ export class Uploader {
|
|
|
62
70
|
this.#apiClient = axios.create({
|
|
63
71
|
baseURL: config.apiUrl,
|
|
64
72
|
headers: {
|
|
65
|
-
"Authorization":
|
|
73
|
+
"Authorization": `${config.apiKey}`,
|
|
66
74
|
"Content-Type": "application/json",
|
|
67
75
|
}
|
|
68
76
|
});
|
|
69
77
|
}
|
|
70
78
|
async uploadFile(fileId, filePath, directoryId, taskController) {
|
|
79
|
+
const fileStats = await fs.promises.stat(filePath);
|
|
80
|
+
const fileName = path.basename(filePath);
|
|
81
|
+
// Check if asset already exists before attempting upload
|
|
82
|
+
const existsResult = await this.#checkAssetExists(directoryId, fileName, fileStats.size);
|
|
83
|
+
if (existsResult.exists) {
|
|
84
|
+
throw new SkippedError(existsResult.asset_id, `Asset already exists`);
|
|
85
|
+
}
|
|
86
|
+
// Proceed with upload
|
|
71
87
|
let retryCount = 0;
|
|
72
88
|
while (retryCount <= MAX_FILE_UPLOAD_RETRIES) {
|
|
73
89
|
try {
|
|
@@ -213,6 +229,14 @@ export class Uploader {
|
|
|
213
229
|
upload_id: uploadId,
|
|
214
230
|
});
|
|
215
231
|
}
|
|
232
|
+
async #checkAssetExists(directoryId, fileName, sizeBytes) {
|
|
233
|
+
const response = await this.#apiClient.post("/assets/check-exists", {
|
|
234
|
+
directory_id: directoryId,
|
|
235
|
+
name: fileName,
|
|
236
|
+
size_bytes: sizeBytes,
|
|
237
|
+
});
|
|
238
|
+
return response.data;
|
|
239
|
+
}
|
|
216
240
|
}
|
|
217
241
|
export function createTaskController(maxConcurrent) {
|
|
218
242
|
return new SimpleWeightedTaskController(maxConcurrent);
|
package/dist/uploader.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uploader.js","sourceRoot":"","sources":["../src/uploader.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,KAAK,EAAE,MAAM,IAAI,CAAA;AACxB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;AAC5B,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAGlD,MAAM,UAAU,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAA,CAAC,gBAAgB;AACpD,MAAM,uBAAuB,GAAG,CAAC,CAAA;AACjC,MAAM,uBAAuB,GAAG,CAAC,CAAA;AAEjC,MAAM,KAAK,GAAG,CAAC,YAAoB,EAAiB,EAAE;IACpD,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,CAAA;AAClE,CAAC,CAAA;AAED,qEAAqE;AACrE,SAAS,oBAAoB,CAC3B,MAAc,EACd,UAA2C;IAE3C,MAAM,mBAAmB,GAAG,EAAE,GAAG,IAAI,CAAA,CAAC,6BAA6B;IACnE,IAAI,MAAM,GAAG,CAAC,CAAA;IAEd,OAAO,IAAI,QAAQ,CAAC;QAClB,IAAI;YACF,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gBAC5B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA,CAAC,uBAAuB;gBACvC,OAAM;YACR,CAAC;YAED,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,mBAAmB,EAAE,MAAM,CAAC,MAAM,CAAC,CAAA;YACjE,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;YAC1C,MAAM,GAAG,GAAG,CAAA;YAEZ,kBAAkB;YAClB,UAAU,CAAC,MAAM,CAAC,CAAA;YAElB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAClB,CAAC;KACF,CAAC,CAAA;AACJ,CAAC;AAOD,MAAM,4BAA4B;IAChC,cAAc,CAAQ;IACtB,aAAa,GAAW,CAAC,CAAA;IACzB,MAAM,GAAsB,EAAE,CAAA;IAE9B,YAAY,aAAqB;QAC/B,IAAI,CAAC,cAAc,GAAG,aAAa,CAAA;IACrC,CAAC;IAED,KAAK,CAAC,OAAO;QACX,IAAI,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;YAC7C,IAAI,CAAC,aAAa,EAAE,CAAA;YACpB,OAAM;QACR,CAAC;QAED,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YACnC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QAC3B,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,OAAO;QACL,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAA;QACvC,IAAI,WAAW,EAAE,CAAC;YAChB,WAAW,EAAE,CAAA;QACf,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,aAAa,EAAE,CAAA;QACtB,CAAC;IACH,CAAC;CACF;AAED,MAAM,OAAO,QAAQ;IACnB,OAAO,CAAY;IACnB,UAAU,CAAiC;IAE3C,YAAY,MAAkB;QAC5B,IAAI,CAAC,OAAO,GAAG,MAAM,CAAA;QACrB,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC;YAC7B,OAAO,EAAE,MAAM,CAAC,MAAM;YACtB,OAAO,EAAE;gBACP,eAAe,EAAE,
|
|
1
|
+
{"version":3,"file":"uploader.js","sourceRoot":"","sources":["../src/uploader.ts"],"names":[],"mappings":"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"}
|