@filen/sync 0.1.4 → 0.1.6
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 +59 -1
- package/dist/ignorer.d.ts +1 -0
- package/dist/ignorer.js +26 -18
- package/dist/ignorer.js.map +1 -1
- package/dist/index.d.ts +18 -14
- package/dist/index.js +129 -60
- package/dist/index.js.map +1 -1
- package/dist/lib/filesystems/local.d.ts +5 -1
- package/dist/lib/filesystems/local.js +93 -63
- package/dist/lib/filesystems/local.js.map +1 -1
- package/dist/lib/filesystems/remote.d.ts +3 -1
- package/dist/lib/filesystems/remote.js +48 -34
- package/dist/lib/filesystems/remote.js.map +1 -1
- package/dist/lib/sync.d.ts +2 -8
- package/dist/lib/sync.js +47 -147
- package/dist/lib/sync.js.map +1 -1
- package/dist/lib/tasks.js +48 -2
- package/dist/lib/tasks.js.map +1 -1
- package/dist/types.d.ts +6 -11
- package/dist/utils.js +0 -3
- package/dist/utils.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1 +1,59 @@
|
|
|
1
|
-
|
|
1
|
+
<br/>
|
|
2
|
+
<p align="center">
|
|
3
|
+
<h3 align="center">Filen Sync</h3>
|
|
4
|
+
|
|
5
|
+
<p align="center">
|
|
6
|
+
A package to sync local and remote directories.
|
|
7
|
+
<br/>
|
|
8
|
+
<br/>
|
|
9
|
+
</p>
|
|
10
|
+
</p>
|
|
11
|
+
|
|
12
|
+
    
|
|
13
|
+
|
|
14
|
+
# Attention
|
|
15
|
+
|
|
16
|
+
The package is still a work in progress. DO NOT USE IT IN PRODUCTION YET. Class names, function names, types, definitions, constants etc. are subject to change until we release a fully tested and stable version.
|
|
17
|
+
|
|
18
|
+
### Installation
|
|
19
|
+
|
|
20
|
+
1. Install using NPM
|
|
21
|
+
|
|
22
|
+
```sh
|
|
23
|
+
npm install @filen/sync@latest
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
2. Initialize the server and query it using aws-sdk
|
|
27
|
+
|
|
28
|
+
```typescript
|
|
29
|
+
import Sync from "@filen/sync"
|
|
30
|
+
|
|
31
|
+
const sync = new Sync({
|
|
32
|
+
syncPairs: [
|
|
33
|
+
{
|
|
34
|
+
uuid: "UUIDV4", // Only used locally to identify the sync pair
|
|
35
|
+
localPath: pathModule.join(__dirname, "sync"), // Local absolute path
|
|
36
|
+
remotePath: "/sync", // Remote absolute path (UNIX style)
|
|
37
|
+
remoteParentUUID: "UUIDV4", // UUIDv4 of the remote parent directory
|
|
38
|
+
mode: "twoWay", // Sync mode
|
|
39
|
+
paused: false,
|
|
40
|
+
excludeDotFiles: true,
|
|
41
|
+
name: "Sync" // Only used locally to identify the sync pair
|
|
42
|
+
}
|
|
43
|
+
],
|
|
44
|
+
sdk: new FilenSDK(), // You can either directly pass a configured FilenSDK instance or instantiate a new SDK instance when passing `sdkConfig` (optional)
|
|
45
|
+
sdkConfig, // FilenSDK config object (omit when SDK instance is passed, needed when no SDK instance is passed)
|
|
46
|
+
dbPath: pathModule.join(__dirname, "db"), // Used to store sync state and other data
|
|
47
|
+
runOnce: false, // Run the sync once
|
|
48
|
+
onMessage(message) {
|
|
49
|
+
console.log(message.type)
|
|
50
|
+
}
|
|
51
|
+
})
|
|
52
|
+
|
|
53
|
+
// Start the sync
|
|
54
|
+
await server.initialize()
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## License
|
|
58
|
+
|
|
59
|
+
Distributed under the AGPL-3.0 License. See [LICENSE](https://github.com/FilenCloudDienste/filen-sync/blob/main/LICENSE.md) for more information.
|
package/dist/ignorer.d.ts
CHANGED
package/dist/ignorer.js
CHANGED
|
@@ -9,13 +9,32 @@ const path_1 = __importDefault(require("path"));
|
|
|
9
9
|
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
10
10
|
exports.IGNORER_VERSION = 1;
|
|
11
11
|
class Ignorer {
|
|
12
|
-
constructor(sync, name = "
|
|
12
|
+
constructor(sync, name = "ignorer") {
|
|
13
13
|
this.instance = (0, ignore_1.default)();
|
|
14
|
-
this.name = "
|
|
14
|
+
this.name = "ignorer";
|
|
15
15
|
this.cache = {};
|
|
16
16
|
this.sync = sync;
|
|
17
17
|
this.name = name;
|
|
18
18
|
}
|
|
19
|
+
async fetch() {
|
|
20
|
+
const filePath = path_1.default.join(this.sync.dbPath, this.name, `v${exports.IGNORER_VERSION}`, this.sync.syncPair.uuid, "filenIgnore");
|
|
21
|
+
await fs_extra_1.default.ensureDir(path_1.default.dirname(filePath));
|
|
22
|
+
const exists = await fs_extra_1.default.exists(filePath);
|
|
23
|
+
if (!exists) {
|
|
24
|
+
return "";
|
|
25
|
+
}
|
|
26
|
+
const stats = await fs_extra_1.default.stat(filePath);
|
|
27
|
+
if (stats.size === 0) {
|
|
28
|
+
return "";
|
|
29
|
+
}
|
|
30
|
+
const readContent = await fs_extra_1.default.readFile(filePath, {
|
|
31
|
+
encoding: "utf-8"
|
|
32
|
+
});
|
|
33
|
+
if (readContent.length === 0) {
|
|
34
|
+
return "";
|
|
35
|
+
}
|
|
36
|
+
return readContent;
|
|
37
|
+
}
|
|
19
38
|
async initialize(passedContent) {
|
|
20
39
|
let content = "";
|
|
21
40
|
const filePath = path_1.default.join(this.sync.dbPath, this.name, `v${exports.IGNORER_VERSION}`, this.sync.syncPair.uuid, "filenIgnore");
|
|
@@ -27,23 +46,12 @@ class Ignorer {
|
|
|
27
46
|
content = passedContent;
|
|
28
47
|
}
|
|
29
48
|
else {
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
if (stats.size === 0) {
|
|
36
|
-
return;
|
|
37
|
-
}
|
|
38
|
-
const readContent = await fs_extra_1.default.readFile(filePath, {
|
|
39
|
-
encoding: "utf-8"
|
|
40
|
-
});
|
|
41
|
-
if (readContent.length === 0) {
|
|
42
|
-
return;
|
|
43
|
-
}
|
|
44
|
-
content = readContent;
|
|
49
|
+
content = await this.fetch();
|
|
50
|
+
}
|
|
51
|
+
this.instance = (0, ignore_1.default)();
|
|
52
|
+
if (content.length > 0) {
|
|
53
|
+
this.instance.add(content);
|
|
45
54
|
}
|
|
46
|
-
this.instance = (0, ignore_1.default)().add(content);
|
|
47
55
|
}
|
|
48
56
|
async update(content) {
|
|
49
57
|
await this.initialize(content);
|
package/dist/ignorer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ignorer.js","sourceRoot":"","sources":["../src/ignorer.ts"],"names":[],"mappings":";;;;;;AAAA,oDAA2B;AAE3B,gDAA6B;AAC7B,wDAAyB;AAEZ,QAAA,eAAe,GAAG,CAAC,CAAA;AAEhC,MAAa,OAAO;IAMnB,YAAmB,IAAU,EAAE,OAAe,
|
|
1
|
+
{"version":3,"file":"ignorer.js","sourceRoot":"","sources":["../src/ignorer.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type SyncPair, type SyncMessage } from "./types";
|
|
1
|
+
import { type SyncPair, type SyncMessage, type SyncMode } 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";
|
|
@@ -14,33 +14,37 @@ export declare class SyncWorker {
|
|
|
14
14
|
readonly syncPairs: SyncPair[];
|
|
15
15
|
readonly syncs: Record<string, Sync>;
|
|
16
16
|
readonly dbPath: string;
|
|
17
|
-
readonly
|
|
17
|
+
readonly updateSyncPairsMutex: import("./semaphore").ISemaphore;
|
|
18
18
|
readonly sdk: FilenSDK;
|
|
19
19
|
readonly logger: Logger;
|
|
20
20
|
readonly runOnce: boolean;
|
|
21
|
-
constructor({ syncPairs, dbPath, sdkConfig, onMessage, runOnce }: {
|
|
21
|
+
constructor({ syncPairs, dbPath, sdkConfig, onMessage, runOnce, sdk }: {
|
|
22
22
|
syncPairs: SyncPair[];
|
|
23
23
|
dbPath: string;
|
|
24
|
-
sdkConfig
|
|
24
|
+
sdkConfig?: FilenSDKConfig;
|
|
25
25
|
onMessage?: (message: SyncMessage) => void;
|
|
26
26
|
runOnce?: boolean;
|
|
27
|
+
sdk?: FilenSDK;
|
|
27
28
|
});
|
|
29
|
+
resetCache(uuid: string): void;
|
|
28
30
|
/**
|
|
29
|
-
*
|
|
31
|
+
* Update sync pairs.
|
|
30
32
|
*
|
|
31
|
-
* @
|
|
32
|
-
*/
|
|
33
|
-
private setupMainThreadListeners;
|
|
34
|
-
private resetSyncPairsCache;
|
|
35
|
-
/**
|
|
36
|
-
* Initialize sync pairs.
|
|
37
|
-
*
|
|
38
|
-
* @private
|
|
33
|
+
* @public
|
|
39
34
|
* @async
|
|
40
35
|
* @param {SyncPair[]} pairs
|
|
41
36
|
* @returns {Promise<void>}
|
|
42
37
|
*/
|
|
43
|
-
|
|
38
|
+
updateSyncPairs(pairs: SyncPair[]): Promise<void>;
|
|
39
|
+
updatePaused(uuid: string, paused: boolean): void;
|
|
40
|
+
updateRemoved(uuid: string, removed: boolean): void;
|
|
41
|
+
updateExcludeDotFiles(uuid: string, excludeDotFiles: boolean): void;
|
|
42
|
+
updateMode(uuid: string, mode: SyncMode): void;
|
|
43
|
+
updateIgnorerContent(uuid: string, content?: string): void;
|
|
44
|
+
fetchIgnorerContent(uuid: string): Promise<string>;
|
|
45
|
+
stopTransfer(uuid: string, type: "download" | "upload", relativePath: string): void;
|
|
46
|
+
pauseTransfer(uuid: string, type: "download" | "upload", relativePath: string): void;
|
|
47
|
+
resumeTransfer(uuid: string, type: "download" | "upload", relativePath: string): void;
|
|
44
48
|
/**
|
|
45
49
|
* Initialize the Sync worker.
|
|
46
50
|
* @date 2/23/2024 - 5:51:12 AM
|
package/dist/index.js
CHANGED
|
@@ -20,11 +20,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
20
20
|
exports.SyncWorker = void 0;
|
|
21
21
|
const sync_1 = __importDefault(require("./lib/sync"));
|
|
22
22
|
const sdk_1 = __importDefault(require("@filen/sdk"));
|
|
23
|
-
const worker_threads_1 = require("worker_threads");
|
|
24
|
-
const ipc_1 = require("./lib/ipc");
|
|
25
23
|
const semaphore_1 = require("./semaphore");
|
|
26
24
|
const constants_1 = require("./constants");
|
|
27
|
-
const utils_1 = require("./utils");
|
|
28
25
|
const logger_1 = __importDefault(require("./lib/logger"));
|
|
29
26
|
/**
|
|
30
27
|
* SyncWorker
|
|
@@ -35,9 +32,9 @@ const logger_1 = __importDefault(require("./lib/logger"));
|
|
|
35
32
|
* @typedef {SyncWorker}
|
|
36
33
|
*/
|
|
37
34
|
class SyncWorker {
|
|
38
|
-
constructor({ syncPairs, dbPath, sdkConfig, onMessage, runOnce = false }) {
|
|
35
|
+
constructor({ syncPairs, dbPath, sdkConfig, onMessage, runOnce = false, sdk }) {
|
|
39
36
|
this.syncs = {};
|
|
40
|
-
this.
|
|
37
|
+
this.updateSyncPairsMutex = new semaphore_1.Semaphore(1);
|
|
41
38
|
if (onMessage) {
|
|
42
39
|
process.onMessage = onMessage;
|
|
43
40
|
}
|
|
@@ -45,76 +42,43 @@ class SyncWorker {
|
|
|
45
42
|
this.syncPairs = syncPairs;
|
|
46
43
|
this.dbPath = dbPath;
|
|
47
44
|
this.logger = new logger_1.default(dbPath);
|
|
48
|
-
this.sdk =
|
|
49
|
-
|
|
45
|
+
this.sdk = sdk
|
|
46
|
+
? sdk
|
|
47
|
+
: new sdk_1.default(Object.assign(Object.assign({}, sdkConfig), { connectToSocket: true, metadataCache: true }));
|
|
50
48
|
}
|
|
51
|
-
|
|
52
|
-
* Sets up receiving message from the main thread.
|
|
53
|
-
*
|
|
54
|
-
* @private
|
|
55
|
-
*/
|
|
56
|
-
setupMainThreadListeners() {
|
|
57
|
-
const receiver = !worker_threads_1.isMainThread && worker_threads_1.parentPort ? worker_threads_1.parentPort : process;
|
|
58
|
-
receiver.on("message", async (message) => {
|
|
59
|
-
if (message.type === "updateSyncPairs") {
|
|
60
|
-
try {
|
|
61
|
-
await this.initSyncPairs(message.data.pairs);
|
|
62
|
-
if (message.data.resetCache) {
|
|
63
|
-
this.resetSyncPairsCache();
|
|
64
|
-
}
|
|
65
|
-
(0, ipc_1.postMessageToMain)({
|
|
66
|
-
type: "syncPairsUpdated"
|
|
67
|
-
});
|
|
68
|
-
}
|
|
69
|
-
catch (e) {
|
|
70
|
-
this.logger.log("error", e, "index.setupMainThreadListeners");
|
|
71
|
-
if (e instanceof Error) {
|
|
72
|
-
(0, ipc_1.postMessageToMain)({
|
|
73
|
-
type: "error",
|
|
74
|
-
data: {
|
|
75
|
-
error: (0, utils_1.serializeError)(e)
|
|
76
|
-
}
|
|
77
|
-
});
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
else if (message.type === "resetSyncPairCache") {
|
|
82
|
-
this.resetSyncPairsCache();
|
|
83
|
-
}
|
|
84
|
-
});
|
|
85
|
-
}
|
|
86
|
-
resetSyncPairsCache() {
|
|
49
|
+
resetCache(uuid) {
|
|
87
50
|
for (const pair of this.syncPairs) {
|
|
88
51
|
const sync = this.syncs[pair.uuid];
|
|
89
|
-
if (!sync) {
|
|
52
|
+
if (!sync || pair.uuid !== uuid) {
|
|
90
53
|
continue;
|
|
91
54
|
}
|
|
92
55
|
sync.localFileSystem.lastDirectoryChangeTimestamp = Date.now() - constants_1.SYNC_INTERVAL * 2;
|
|
93
56
|
sync.localFileSystem.getDirectoryTreeCache = {
|
|
94
57
|
timestamp: 0,
|
|
95
58
|
tree: {},
|
|
96
|
-
inodes: {}
|
|
59
|
+
inodes: {},
|
|
60
|
+
ignored: [],
|
|
61
|
+
errors: []
|
|
97
62
|
};
|
|
98
63
|
sync.remoteFileSystem.previousTreeRawResponse = "";
|
|
99
64
|
sync.remoteFileSystem.getDirectoryTreeCache = {
|
|
100
65
|
timestamp: 0,
|
|
101
66
|
tree: {},
|
|
102
|
-
uuids: {}
|
|
67
|
+
uuids: {},
|
|
68
|
+
ignored: []
|
|
103
69
|
};
|
|
104
70
|
}
|
|
105
71
|
}
|
|
106
72
|
/**
|
|
107
|
-
*
|
|
73
|
+
* Update sync pairs.
|
|
108
74
|
*
|
|
109
|
-
* @
|
|
75
|
+
* @public
|
|
110
76
|
* @async
|
|
111
77
|
* @param {SyncPair[]} pairs
|
|
112
78
|
* @returns {Promise<void>}
|
|
113
79
|
*/
|
|
114
|
-
async
|
|
115
|
-
await this.
|
|
116
|
-
const currentSyncPairsUUIDs = this.syncPairs.map(pair => pair.uuid);
|
|
117
|
-
const newSyncPairsUUIDs = pairs.map(pair => pair.uuid);
|
|
80
|
+
async updateSyncPairs(pairs) {
|
|
81
|
+
await this.updateSyncPairsMutex.acquire();
|
|
118
82
|
try {
|
|
119
83
|
const promises = [];
|
|
120
84
|
for (const pair of pairs) {
|
|
@@ -127,18 +91,123 @@ class SyncWorker {
|
|
|
127
91
|
}
|
|
128
92
|
}
|
|
129
93
|
await Promise.all(promises);
|
|
130
|
-
for (const uuid of currentSyncPairsUUIDs) {
|
|
131
|
-
if (!newSyncPairsUUIDs.includes(uuid) && this.syncs[uuid]) {
|
|
132
|
-
this.syncs[uuid].removed = true;
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
94
|
}
|
|
136
95
|
catch (e) {
|
|
137
|
-
this.logger.log("error", e, "index.
|
|
96
|
+
this.logger.log("error", e, "index.updateSyncPairs");
|
|
138
97
|
throw e;
|
|
139
98
|
}
|
|
140
99
|
finally {
|
|
141
|
-
this.
|
|
100
|
+
this.updateSyncPairsMutex.release();
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
updatePaused(uuid, paused) {
|
|
104
|
+
for (const syncUUID in this.syncs) {
|
|
105
|
+
if (syncUUID === uuid) {
|
|
106
|
+
this.syncs[syncUUID].paused = paused;
|
|
107
|
+
const pauseSignals = this.syncs[syncUUID].pauseSignals;
|
|
108
|
+
for (const signal in pauseSignals) {
|
|
109
|
+
const pauseSignal = pauseSignals[signal];
|
|
110
|
+
if (paused) {
|
|
111
|
+
if (!pauseSignal.isPaused()) {
|
|
112
|
+
pauseSignal.pause();
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
if (pauseSignal.isPaused()) {
|
|
117
|
+
pauseSignal.resume();
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
break;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
updateRemoved(uuid, removed) {
|
|
126
|
+
for (const syncUUID in this.syncs) {
|
|
127
|
+
if (syncUUID === uuid) {
|
|
128
|
+
this.syncs[syncUUID].removed = removed;
|
|
129
|
+
const abortControllers = this.syncs[syncUUID].abortControllers;
|
|
130
|
+
for (const controller in abortControllers) {
|
|
131
|
+
const abortController = abortControllers[controller];
|
|
132
|
+
if (removed) {
|
|
133
|
+
if (!abortController.signal.aborted) {
|
|
134
|
+
abortController.abort();
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
break;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
updateExcludeDotFiles(uuid, excludeDotFiles) {
|
|
143
|
+
for (const syncUUID in this.syncs) {
|
|
144
|
+
if (syncUUID === uuid) {
|
|
145
|
+
this.syncs[syncUUID].excludeDotFiles = excludeDotFiles;
|
|
146
|
+
break;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
updateMode(uuid, mode) {
|
|
151
|
+
for (const syncUUID in this.syncs) {
|
|
152
|
+
if (syncUUID === uuid) {
|
|
153
|
+
this.syncs[syncUUID].mode = mode;
|
|
154
|
+
break;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
updateIgnorerContent(uuid, content) {
|
|
159
|
+
for (const syncUUID in this.syncs) {
|
|
160
|
+
if (syncUUID === uuid) {
|
|
161
|
+
this.syncs[syncUUID].ignorer.update(content);
|
|
162
|
+
break;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
async fetchIgnorerContent(uuid) {
|
|
167
|
+
for (const syncUUID in this.syncs) {
|
|
168
|
+
if (syncUUID === uuid) {
|
|
169
|
+
return await this.syncs[syncUUID].ignorer.fetch();
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
return "";
|
|
173
|
+
}
|
|
174
|
+
stopTransfer(uuid, type, relativePath) {
|
|
175
|
+
for (const syncUUID in this.syncs) {
|
|
176
|
+
if (syncUUID === uuid) {
|
|
177
|
+
const abortControllers = this.syncs[syncUUID].abortControllers;
|
|
178
|
+
const signalKey = `${type}:${relativePath}`;
|
|
179
|
+
const abortController = abortControllers[signalKey];
|
|
180
|
+
if (abortController && !abortController.signal.aborted) {
|
|
181
|
+
abortController.abort();
|
|
182
|
+
}
|
|
183
|
+
break;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
pauseTransfer(uuid, type, relativePath) {
|
|
188
|
+
for (const syncUUID in this.syncs) {
|
|
189
|
+
if (syncUUID === uuid) {
|
|
190
|
+
const pauseSignals = this.syncs[syncUUID].pauseSignals;
|
|
191
|
+
const signalKey = `${type}:${relativePath}`;
|
|
192
|
+
const pauseSignal = pauseSignals[signalKey];
|
|
193
|
+
if (pauseSignal && !pauseSignal.isPaused()) {
|
|
194
|
+
pauseSignal.pause();
|
|
195
|
+
}
|
|
196
|
+
break;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
resumeTransfer(uuid, type, relativePath) {
|
|
201
|
+
for (const syncUUID in this.syncs) {
|
|
202
|
+
if (syncUUID === uuid) {
|
|
203
|
+
const pauseSignals = this.syncs[syncUUID].pauseSignals;
|
|
204
|
+
const signalKey = `${type}:${relativePath}`;
|
|
205
|
+
const pauseSignal = pauseSignals[signalKey];
|
|
206
|
+
if (pauseSignal && pauseSignal.isPaused()) {
|
|
207
|
+
pauseSignal.resume();
|
|
208
|
+
}
|
|
209
|
+
break;
|
|
210
|
+
}
|
|
142
211
|
}
|
|
143
212
|
}
|
|
144
213
|
/**
|
|
@@ -150,7 +219,7 @@ class SyncWorker {
|
|
|
150
219
|
* @returns {Promise<void>}
|
|
151
220
|
*/
|
|
152
221
|
async initialize() {
|
|
153
|
-
await this.
|
|
222
|
+
await this.updateSyncPairs(this.syncPairs);
|
|
154
223
|
}
|
|
155
224
|
}
|
|
156
225
|
exports.SyncWorker = SyncWorker;
|
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,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.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" | "duplicate" | "permissions";
|
|
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,12 +42,15 @@ 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;
|
|
47
50
|
readonly itemsMutex: import("../../semaphore").ISemaphore;
|
|
48
51
|
readonly mutex: import("../../semaphore").ISemaphore;
|
|
49
52
|
readonly mkdirMutex: import("../../semaphore").ISemaphore;
|
|
53
|
+
readonly listSemaphore: import("../../semaphore").ISemaphore;
|
|
50
54
|
/**
|
|
51
55
|
* Creates an instance of LocalFileSystem.
|
|
52
56
|
*
|