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.
@@ -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,7 @@
1
+ import type { SyncConfig } from "./types.js";
2
+ export declare class SyncOrchestrator {
3
+ #private;
4
+ constructor(config: SyncConfig);
5
+ run(): Promise<void>;
6
+ }
7
+ //# sourceMappingURL=sync.d.ts.map
@@ -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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../src/sync.ts"],"names":[],"mappings":"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"}
@@ -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"}