@filen/sync 0.1.3 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +5 -12
- package/dist/index.js +17 -13
- package/dist/index.js.map +1 -1
- package/dist/lib/deltas.js +141 -40
- package/dist/lib/deltas.js.map +1 -1
- package/dist/lib/filesystems/local.d.ts +11 -24
- package/dist/lib/filesystems/local.js +213 -83
- package/dist/lib/filesystems/local.js.map +1 -1
- package/dist/lib/filesystems/remote.d.ts +6 -1
- package/dist/lib/filesystems/remote.js +174 -80
- package/dist/lib/filesystems/remote.js.map +1 -1
- package/dist/lib/ipc.js +4 -0
- package/dist/lib/ipc.js.map +1 -1
- package/dist/lib/lock.d.ts +13 -0
- package/dist/lib/lock.js +73 -0
- package/dist/lib/lock.js.map +1 -0
- package/dist/lib/state.js +91 -59
- package/dist/lib/state.js.map +1 -1
- package/dist/lib/sync.d.ts +8 -1
- package/dist/lib/sync.js +140 -62
- package/dist/lib/sync.js.map +1 -1
- package/dist/lib/tasks.d.ts +11 -9
- package/dist/lib/tasks.js +414 -42
- package/dist/lib/tasks.js.map +1 -1
- package/dist/types.d.ts +205 -45
- package/dist/utils.d.ts +18 -0
- package/dist/utils.js +43 -14
- package/dist/utils.js.map +1 -1
- package/index.d.ts +9 -0
- package/jest.config.js +5 -0
- package/package.json +5 -3
- package/tests/utils.test.ts +33 -0
- package/tsconfig.json +2 -2
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type SyncPair } from "./types";
|
|
1
|
+
import { type SyncPair, type SyncMessage } from "./types";
|
|
2
2
|
import Sync from "./lib/sync";
|
|
3
3
|
import FilenSDK, { type FilenSDKConfig } from "@filen/sdk";
|
|
4
4
|
import Logger from "./lib/logger";
|
|
@@ -17,20 +17,13 @@ export declare class SyncWorker {
|
|
|
17
17
|
readonly initSyncPairsMutex: import("./semaphore").ISemaphore;
|
|
18
18
|
readonly sdk: FilenSDK;
|
|
19
19
|
readonly logger: Logger;
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
*
|
|
23
|
-
* @constructor
|
|
24
|
-
* @public
|
|
25
|
-
* @param {{ syncPairs: SyncPair[]; dbPath: string; sdkConfig: FilenSDKConfig }} param0
|
|
26
|
-
* @param {{}} param0.syncPairs
|
|
27
|
-
* @param {string} param0.dbPath
|
|
28
|
-
* @param {FilenSDKConfig} param0.sdkConfig
|
|
29
|
-
*/
|
|
30
|
-
constructor({ syncPairs, dbPath, sdkConfig }: {
|
|
20
|
+
readonly runOnce: boolean;
|
|
21
|
+
constructor({ syncPairs, dbPath, sdkConfig, onMessage, runOnce }: {
|
|
31
22
|
syncPairs: SyncPair[];
|
|
32
23
|
dbPath: string;
|
|
33
24
|
sdkConfig: FilenSDKConfig;
|
|
25
|
+
onMessage?: (message: SyncMessage) => void;
|
|
26
|
+
runOnce?: boolean;
|
|
34
27
|
});
|
|
35
28
|
/**
|
|
36
29
|
* Sets up receiving message from the main thread.
|
package/dist/index.js
CHANGED
|
@@ -35,19 +35,13 @@ const logger_1 = __importDefault(require("./lib/logger"));
|
|
|
35
35
|
* @typedef {SyncWorker}
|
|
36
36
|
*/
|
|
37
37
|
class SyncWorker {
|
|
38
|
-
|
|
39
|
-
* Creates an instance of SyncWorker.
|
|
40
|
-
*
|
|
41
|
-
* @constructor
|
|
42
|
-
* @public
|
|
43
|
-
* @param {{ syncPairs: SyncPair[]; dbPath: string; sdkConfig: FilenSDKConfig }} param0
|
|
44
|
-
* @param {{}} param0.syncPairs
|
|
45
|
-
* @param {string} param0.dbPath
|
|
46
|
-
* @param {FilenSDKConfig} param0.sdkConfig
|
|
47
|
-
*/
|
|
48
|
-
constructor({ syncPairs, dbPath, sdkConfig }) {
|
|
38
|
+
constructor({ syncPairs, dbPath, sdkConfig, onMessage, runOnce = false }) {
|
|
49
39
|
this.syncs = {};
|
|
50
40
|
this.initSyncPairsMutex = new semaphore_1.Semaphore(1);
|
|
41
|
+
if (onMessage) {
|
|
42
|
+
process.onMessage = onMessage;
|
|
43
|
+
}
|
|
44
|
+
this.runOnce = runOnce;
|
|
51
45
|
this.syncPairs = syncPairs;
|
|
52
46
|
this.dbPath = dbPath;
|
|
53
47
|
this.logger = new logger_1.default(dbPath);
|
|
@@ -99,13 +93,16 @@ class SyncWorker {
|
|
|
99
93
|
sync.localFileSystem.getDirectoryTreeCache = {
|
|
100
94
|
timestamp: 0,
|
|
101
95
|
tree: {},
|
|
102
|
-
inodes: {}
|
|
96
|
+
inodes: {},
|
|
97
|
+
ignored: [],
|
|
98
|
+
errors: []
|
|
103
99
|
};
|
|
104
100
|
sync.remoteFileSystem.previousTreeRawResponse = "";
|
|
105
101
|
sync.remoteFileSystem.getDirectoryTreeCache = {
|
|
106
102
|
timestamp: 0,
|
|
107
103
|
tree: {},
|
|
108
|
-
uuids: {}
|
|
104
|
+
uuids: {},
|
|
105
|
+
ignored: []
|
|
109
106
|
};
|
|
110
107
|
}
|
|
111
108
|
}
|
|
@@ -119,6 +116,8 @@ class SyncWorker {
|
|
|
119
116
|
*/
|
|
120
117
|
async initSyncPairs(pairs) {
|
|
121
118
|
await this.initSyncPairsMutex.acquire();
|
|
119
|
+
const currentSyncPairsUUIDs = this.syncPairs.map(pair => pair.uuid);
|
|
120
|
+
const newSyncPairsUUIDs = pairs.map(pair => pair.uuid);
|
|
122
121
|
try {
|
|
123
122
|
const promises = [];
|
|
124
123
|
for (const pair of pairs) {
|
|
@@ -131,6 +130,11 @@ class SyncWorker {
|
|
|
131
130
|
}
|
|
132
131
|
}
|
|
133
132
|
await Promise.all(promises);
|
|
133
|
+
for (const uuid of currentSyncPairsUUIDs) {
|
|
134
|
+
if (!newSyncPairsUUIDs.includes(uuid) && this.syncs[uuid]) {
|
|
135
|
+
this.syncs[uuid].removed = true;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
134
138
|
}
|
|
135
139
|
catch (e) {
|
|
136
140
|
this.logger.log("error", e, "index.initSyncPairs");
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AACA,sDAA6B;AAC7B,qDAA0D;AAC1D,mDAAyD;AACzD,mCAA6C;AAC7C,2CAAuC;AACvC,2CAA2C;AAC3C,mCAAwC;AACxC,0DAAiC;AAEjC;;;;;;;GAOG;AACH,MAAa,UAAU;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/deltas.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.Deltas = void 0;
|
|
4
|
+
const utils_1 = require("../utils");
|
|
4
5
|
/**
|
|
5
6
|
* Deltas
|
|
6
7
|
* @date 3/1/2024 - 11:11:32 PM
|
|
@@ -43,9 +44,20 @@ class Deltas {
|
|
|
43
44
|
let deltas = [];
|
|
44
45
|
const pathsAdded = {};
|
|
45
46
|
const erroredLocalPaths = {};
|
|
47
|
+
const renamedRemoteDirectories = [];
|
|
48
|
+
const renamedLocalDirectories = [];
|
|
49
|
+
const deletedRemoteDirectories = [];
|
|
50
|
+
const deletedLocalDirectories = [];
|
|
46
51
|
for (const error of currentLocalTreeErrors) {
|
|
47
52
|
erroredLocalPaths[error.relativePath] = true;
|
|
48
53
|
}
|
|
54
|
+
// The order of delta processing:
|
|
55
|
+
// 1. Local directory/file move/rename
|
|
56
|
+
// 2. Remote directory/file move/rename
|
|
57
|
+
// 3. Local deletions
|
|
58
|
+
// 4. Remote deletions
|
|
59
|
+
// 5. Local additions/filemodifications
|
|
60
|
+
// 6. Remote additions/filemodifications
|
|
49
61
|
// Local file/directory move/rename
|
|
50
62
|
for (const inode in currentLocalTree.inodes) {
|
|
51
63
|
const currentItem = currentLocalTree.inodes[inode];
|
|
@@ -58,14 +70,18 @@ class Deltas {
|
|
|
58
70
|
erroredLocalPaths[previousItem.path]) {
|
|
59
71
|
continue;
|
|
60
72
|
}
|
|
61
|
-
// Path from current item changed, it was either renamed or moved
|
|
62
|
-
if (currentItem.path !== previousItem.path) {
|
|
63
|
-
|
|
73
|
+
// Path from current item changed, it was either renamed or moved (same type)
|
|
74
|
+
if (currentItem.path !== previousItem.path && currentItem.type === previousItem.type) {
|
|
75
|
+
const delta = {
|
|
64
76
|
type: currentItem.type === "directory" ? "renameRemoteDirectory" : "renameRemoteFile",
|
|
65
77
|
path: currentItem.path,
|
|
66
78
|
from: previousItem.path,
|
|
67
79
|
to: currentItem.path
|
|
68
|
-
}
|
|
80
|
+
};
|
|
81
|
+
deltas.push(delta);
|
|
82
|
+
if (currentItem.type === "directory") {
|
|
83
|
+
renamedRemoteDirectories.push(delta);
|
|
84
|
+
}
|
|
69
85
|
pathsAdded[currentItem.path] = true;
|
|
70
86
|
pathsAdded[previousItem.path] = true;
|
|
71
87
|
}
|
|
@@ -73,18 +89,22 @@ class Deltas {
|
|
|
73
89
|
// Remote file/directory move/rename
|
|
74
90
|
for (const uuid in currentRemoteTree.uuids) {
|
|
75
91
|
const currentItem = currentRemoteTree.uuids[uuid];
|
|
76
|
-
const previousItem =
|
|
92
|
+
const previousItem = previousRemoteTree.uuids[uuid];
|
|
77
93
|
if (!currentItem || !previousItem || pathsAdded[currentItem.path] || pathsAdded[previousItem.path]) {
|
|
78
94
|
continue;
|
|
79
95
|
}
|
|
80
|
-
// Path from current item changed, it was either renamed or moved
|
|
81
|
-
if (currentItem.path !== previousItem.path) {
|
|
82
|
-
|
|
83
|
-
type: currentItem.type === "directory" ? "
|
|
96
|
+
// Path from current item changed, it was either renamed or moved (same type)
|
|
97
|
+
if (currentItem.path !== previousItem.path && currentItem.type === previousItem.type) {
|
|
98
|
+
const delta = {
|
|
99
|
+
type: currentItem.type === "directory" ? "renameLocalDirectory" : "renameLocalFile",
|
|
84
100
|
path: currentItem.path,
|
|
85
101
|
from: previousItem.path,
|
|
86
102
|
to: currentItem.path
|
|
87
|
-
}
|
|
103
|
+
};
|
|
104
|
+
deltas.push(delta);
|
|
105
|
+
if (currentItem.type === "directory") {
|
|
106
|
+
renamedLocalDirectories.push(delta);
|
|
107
|
+
}
|
|
88
108
|
pathsAdded[currentItem.path] = true;
|
|
89
109
|
pathsAdded[previousItem.path] = true;
|
|
90
110
|
}
|
|
@@ -96,12 +116,19 @@ class Deltas {
|
|
|
96
116
|
}
|
|
97
117
|
const previousLocalItem = previousLocalTree.tree[path];
|
|
98
118
|
const currentLocalItem = currentLocalTree.tree[path];
|
|
99
|
-
|
|
100
|
-
|
|
119
|
+
// If the item does not exist in the current tree but does in the previous one, it has been deleted.
|
|
120
|
+
// We also check if the previous inode does not exist in the current tree.
|
|
121
|
+
if (!currentLocalItem && previousLocalItem && !currentLocalTree.inodes[previousLocalItem.inode]) {
|
|
122
|
+
const delta = {
|
|
101
123
|
type: previousLocalItem.type === "directory" ? "deleteRemoteDirectory" : "deleteRemoteFile",
|
|
102
124
|
path
|
|
103
|
-
}
|
|
125
|
+
};
|
|
126
|
+
deltas.push(delta);
|
|
127
|
+
if (previousLocalItem.type === "directory") {
|
|
128
|
+
deletedRemoteDirectories.push(delta);
|
|
129
|
+
}
|
|
104
130
|
pathsAdded[path] = true;
|
|
131
|
+
pathsAdded[previousLocalItem.path] = true;
|
|
105
132
|
}
|
|
106
133
|
}
|
|
107
134
|
// Remote deletions
|
|
@@ -111,12 +138,19 @@ class Deltas {
|
|
|
111
138
|
}
|
|
112
139
|
const previousRemoteItem = previousRemoteTree.tree[path];
|
|
113
140
|
const currentRemoteItem = currentRemoteTree.tree[path];
|
|
114
|
-
|
|
115
|
-
|
|
141
|
+
// If the item does not exist in the current tree but does in the previous one, it has been deleted.
|
|
142
|
+
// We also check if the previous UUID does not exist in the current tree.
|
|
143
|
+
if (!currentRemoteItem && previousRemoteItem && !currentRemoteTree.uuids[previousRemoteItem.uuid]) {
|
|
144
|
+
const delta = {
|
|
116
145
|
type: previousRemoteItem.type === "directory" ? "deleteLocalDirectory" : "deleteLocalFile",
|
|
117
146
|
path
|
|
118
|
-
}
|
|
147
|
+
};
|
|
148
|
+
deltas.push(delta);
|
|
149
|
+
if (previousRemoteItem.type === "directory") {
|
|
150
|
+
deletedLocalDirectories.push(delta);
|
|
151
|
+
}
|
|
119
152
|
pathsAdded[path] = true;
|
|
153
|
+
pathsAdded[previousRemoteItem.path] = true;
|
|
120
154
|
}
|
|
121
155
|
}
|
|
122
156
|
// Local additions/filemodifications
|
|
@@ -126,7 +160,9 @@ class Deltas {
|
|
|
126
160
|
}
|
|
127
161
|
const currentLocalItem = currentLocalTree.tree[path];
|
|
128
162
|
const currentRemoteItem = currentRemoteTree.tree[path];
|
|
129
|
-
|
|
163
|
+
// If the item does not exist in the current remote tree, but does in the local one, it should be uploaded.
|
|
164
|
+
// We also check if it in fact has existed before (the inode), if so, we skip it.
|
|
165
|
+
if (!currentRemoteItem && currentLocalItem && !previousLocalTree.inodes[currentLocalItem.inode]) {
|
|
130
166
|
deltas.push({
|
|
131
167
|
type: currentLocalItem.type === "directory" ? "createRemoteDirectory" : "uploadFile",
|
|
132
168
|
path
|
|
@@ -134,19 +170,20 @@ class Deltas {
|
|
|
134
170
|
pathsAdded[path] = true;
|
|
135
171
|
continue;
|
|
136
172
|
}
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
}
|
|
173
|
+
// If the item exists in both trees and has a different mod time + hash, we upload it again.
|
|
174
|
+
if (currentRemoteItem &&
|
|
175
|
+
currentRemoteItem.type === "file" &&
|
|
176
|
+
currentLocalItem &&
|
|
177
|
+
currentLocalItem.lastModified > currentRemoteItem.lastModified &&
|
|
178
|
+
(await this.sync.localFileSystem.createFileHash({
|
|
179
|
+
relativePath: path,
|
|
180
|
+
algorithm: "md5"
|
|
181
|
+
})) !== this.sync.localFileHashes[currentLocalItem.path]) {
|
|
182
|
+
deltas.push({
|
|
183
|
+
type: "uploadFile",
|
|
184
|
+
path
|
|
185
|
+
});
|
|
186
|
+
pathsAdded[path] = true;
|
|
150
187
|
}
|
|
151
188
|
}
|
|
152
189
|
// Remote additions/changes
|
|
@@ -156,7 +193,9 @@ class Deltas {
|
|
|
156
193
|
}
|
|
157
194
|
const currentLocalItem = currentLocalTree.tree[path];
|
|
158
195
|
const currentRemoteItem = currentRemoteTree.tree[path];
|
|
159
|
-
|
|
196
|
+
// If the item does not exist in the current local tree, but does in the remote one, it should be download.
|
|
197
|
+
// We also check if it in fact has existed before (the UUID), if so, we skip it.
|
|
198
|
+
if (!currentLocalItem && currentRemoteItem && !previousRemoteTree.uuids[currentRemoteItem.uuid]) {
|
|
160
199
|
deltas.push({
|
|
161
200
|
type: currentRemoteItem.type === "directory" ? "createLocalDirectory" : "downloadFile",
|
|
162
201
|
path
|
|
@@ -164,14 +203,16 @@ class Deltas {
|
|
|
164
203
|
pathsAdded[path] = true;
|
|
165
204
|
continue;
|
|
166
205
|
}
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
206
|
+
// If the item exists in both trees and the mod time changed, we download it.
|
|
207
|
+
if (currentRemoteItem &&
|
|
208
|
+
currentRemoteItem.type === "file" &&
|
|
209
|
+
currentLocalItem &&
|
|
210
|
+
currentRemoteItem.lastModified > currentLocalItem.lastModified) {
|
|
211
|
+
deltas.push({
|
|
212
|
+
type: "downloadFile",
|
|
213
|
+
path
|
|
214
|
+
});
|
|
215
|
+
pathsAdded[path] = true;
|
|
175
216
|
}
|
|
176
217
|
}
|
|
177
218
|
// Filter deltas by sync mode
|
|
@@ -203,7 +244,67 @@ class Deltas {
|
|
|
203
244
|
delta.type === "renameLocalFile" ||
|
|
204
245
|
delta.type === "downloadFile");
|
|
205
246
|
}
|
|
206
|
-
|
|
247
|
+
// Work on deltas from "left to right" (ascending order, path length).
|
|
248
|
+
const deltasSorted = deltas.sort((a, b) => a.path.split("/").length - b.path.split("/").length);
|
|
249
|
+
// Here we apply the done task to the delta state.
|
|
250
|
+
// E.g. when the user renames/moves a directory from "/sync/dir" to "/sync/dir2"
|
|
251
|
+
// we'll get all the rename/move deltas for the directory children aswell.
|
|
252
|
+
// This is pretty unecessary, hence we filter them here.
|
|
253
|
+
// Same for deletions. We only ever need to rename/move/delete the parent directory if the children did not change.
|
|
254
|
+
// This saves a lot of disk usage and API requests. This also saves time applying all done tasks to the overall state,
|
|
255
|
+
// since we need to loop through less doneTasks.
|
|
256
|
+
for (let i = 0; i < deltasSorted.length; i++) {
|
|
257
|
+
const delta = deltasSorted[i];
|
|
258
|
+
let moveUp = false;
|
|
259
|
+
if (delta.type === "renameLocalDirectory" || delta.type === "renameLocalFile") {
|
|
260
|
+
for (const directoryDelta of renamedLocalDirectories) {
|
|
261
|
+
if (directoryDelta.type === "renameLocalDirectory" && delta.from.startsWith(directoryDelta.from + "/")) {
|
|
262
|
+
const newFromPath = (0, utils_1.replacePathStartWithFromAndTo)(delta.from, directoryDelta.from, directoryDelta.to);
|
|
263
|
+
if (newFromPath === delta.to) {
|
|
264
|
+
deltasSorted.splice(i, 1);
|
|
265
|
+
moveUp = true;
|
|
266
|
+
}
|
|
267
|
+
else {
|
|
268
|
+
deltasSorted.splice(i, 1, Object.assign(Object.assign({}, delta), { from: newFromPath }));
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
else if (delta.type === "renameRemoteDirectory" || delta.type === "renameRemoteFile") {
|
|
274
|
+
for (const directoryDelta of renamedRemoteDirectories) {
|
|
275
|
+
if (directoryDelta.type === "renameRemoteDirectory" && delta.from.startsWith(directoryDelta.from + "/")) {
|
|
276
|
+
const newFromPath = (0, utils_1.replacePathStartWithFromAndTo)(delta.from, directoryDelta.from, directoryDelta.to);
|
|
277
|
+
if (newFromPath === delta.to) {
|
|
278
|
+
deltasSorted.splice(i, 1);
|
|
279
|
+
moveUp = true;
|
|
280
|
+
}
|
|
281
|
+
else {
|
|
282
|
+
deltasSorted.splice(i, 1, Object.assign(Object.assign({}, delta), { from: newFromPath }));
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
else if (delta.type === "deleteLocalDirectory" || delta.type === "deleteLocalFile") {
|
|
288
|
+
for (const directoryDelta of deletedLocalDirectories) {
|
|
289
|
+
if (directoryDelta.type === "deleteLocalDirectory" && delta.path.startsWith(directoryDelta.path + "/")) {
|
|
290
|
+
deltasSorted.splice(i, 1);
|
|
291
|
+
moveUp = true;
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
else if (delta.type === "deleteRemoteDirectory" || delta.type === "deleteRemoteFile") {
|
|
296
|
+
for (const directoryDelta of deletedRemoteDirectories) {
|
|
297
|
+
if (directoryDelta.type === "deleteRemoteDirectory" && delta.path.startsWith(directoryDelta.path + "/")) {
|
|
298
|
+
deltasSorted.splice(i, 1);
|
|
299
|
+
moveUp = true;
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
if (moveUp) {
|
|
304
|
+
i--;
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
return deltasSorted;
|
|
207
308
|
}
|
|
208
309
|
}
|
|
209
310
|
exports.Deltas = Deltas;
|
package/dist/lib/deltas.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deltas.js","sourceRoot":"","sources":["../../src/lib/deltas.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"deltas.js","sourceRoot":"","sources":["../../src/lib/deltas.ts"],"names":[],"mappings":"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"}
|
|
@@ -21,10 +21,11 @@ export type LocalTreeError = {
|
|
|
21
21
|
relativePath: string;
|
|
22
22
|
error: Error;
|
|
23
23
|
};
|
|
24
|
+
export type LocalTreeIgnoredReason = "dotFile" | "localIgnore" | "defaultIgnore" | "empty" | "symlink" | "invalidType";
|
|
24
25
|
export type LocalTreeIgnored = {
|
|
25
26
|
localPath: string;
|
|
26
27
|
relativePath: string;
|
|
27
|
-
reason:
|
|
28
|
+
reason: LocalTreeIgnoredReason;
|
|
28
29
|
};
|
|
29
30
|
/**
|
|
30
31
|
* LocalFileSystem
|
|
@@ -41,9 +42,14 @@ export declare class LocalFileSystem {
|
|
|
41
42
|
timestamp: number;
|
|
42
43
|
tree: LocalDirectoryTree;
|
|
43
44
|
inodes: LocalDirectoryINodes;
|
|
45
|
+
ignored: LocalTreeIgnored[];
|
|
46
|
+
errors: LocalTreeError[];
|
|
44
47
|
};
|
|
45
48
|
watcherRunning: boolean;
|
|
46
49
|
private watcherInstance;
|
|
50
|
+
readonly itemsMutex: import("../../semaphore").ISemaphore;
|
|
51
|
+
readonly mutex: import("../../semaphore").ISemaphore;
|
|
52
|
+
readonly mkdirMutex: import("../../semaphore").ISemaphore;
|
|
47
53
|
/**
|
|
48
54
|
* Creates an instance of LocalFileSystem.
|
|
49
55
|
*
|
|
@@ -118,32 +124,10 @@ export declare class LocalFileSystem {
|
|
|
118
124
|
mkdir({ relativePath }: {
|
|
119
125
|
relativePath: string;
|
|
120
126
|
}): Promise<fs.Stats>;
|
|
121
|
-
/**
|
|
122
|
-
* Delete a file/directory inside the local sync path.
|
|
123
|
-
* @date 3/3/2024 - 10:05:55 PM
|
|
124
|
-
*
|
|
125
|
-
* @public
|
|
126
|
-
* @async
|
|
127
|
-
* @param {{ relativePath: string; permanent?: boolean }} param0
|
|
128
|
-
* @param {string} param0.relativePath
|
|
129
|
-
* @param {boolean} [param0.permanent=false]
|
|
130
|
-
* @returns {Promise<void>}
|
|
131
|
-
*/
|
|
132
127
|
unlink({ relativePath, permanent }: {
|
|
133
128
|
relativePath: string;
|
|
134
129
|
permanent?: boolean;
|
|
135
130
|
}): Promise<void>;
|
|
136
|
-
/**
|
|
137
|
-
* Rename a file/directory inside the local sync path. Recursively creates intermediate directories if needed.
|
|
138
|
-
* @date 3/2/2024 - 12:41:15 PM
|
|
139
|
-
*
|
|
140
|
-
* @public
|
|
141
|
-
* @async
|
|
142
|
-
* @param {{ fromRelativePath: string; toRelativePath: string }} param0
|
|
143
|
-
* @param {string} param0.fromRelativePath
|
|
144
|
-
* @param {string} param0.toRelativePath
|
|
145
|
-
* @returns {Promise<fs.Stats>}
|
|
146
|
-
*/
|
|
147
131
|
rename({ fromRelativePath, toRelativePath }: {
|
|
148
132
|
fromRelativePath: string;
|
|
149
133
|
toRelativePath: string;
|
|
@@ -156,10 +140,13 @@ export declare class LocalFileSystem {
|
|
|
156
140
|
* @async
|
|
157
141
|
* @param {{ relativePath: string }} param0
|
|
158
142
|
* @param {string} param0.relativePath
|
|
159
|
-
* @returns {Promise<
|
|
143
|
+
* @returns {Promise<CloudItem>}
|
|
160
144
|
*/
|
|
161
145
|
upload({ relativePath }: {
|
|
162
146
|
relativePath: string;
|
|
163
147
|
}): Promise<CloudItem>;
|
|
148
|
+
isPathWritable(path: string): Promise<boolean>;
|
|
149
|
+
isPathReadable(path: string): Promise<boolean>;
|
|
150
|
+
pathExists(path: string): Promise<boolean>;
|
|
164
151
|
}
|
|
165
152
|
export default LocalFileSystem;
|