@filen/sync 0.2.1 → 0.3.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.
Files changed (152) hide show
  1. package/.node-version +1 -1
  2. package/dist/ignorer.d.ts +6 -0
  3. package/dist/ignorer.js +43 -24
  4. package/dist/ignorer.js.map +1 -1
  5. package/dist/index.d.ts +4 -1
  6. package/dist/index.js +3 -1
  7. package/dist/index.js.map +1 -1
  8. package/dist/lib/deltas.d.ts +58 -2
  9. package/dist/lib/deltas.js +693 -108
  10. package/dist/lib/deltas.js.map +1 -1
  11. package/dist/lib/environment.d.ts +47 -0
  12. package/dist/lib/environment.js +71 -0
  13. package/dist/lib/environment.js.map +1 -0
  14. package/dist/lib/filesystems/dirTree.d.ts +70 -0
  15. package/dist/lib/filesystems/dirTree.js +157 -0
  16. package/dist/lib/filesystems/dirTree.js.map +1 -0
  17. package/dist/lib/filesystems/local.d.ts +18 -8
  18. package/dist/lib/filesystems/local.js +166 -160
  19. package/dist/lib/filesystems/local.js.map +1 -1
  20. package/dist/lib/filesystems/remote.d.ts +12 -5
  21. package/dist/lib/filesystems/remote.js +226 -172
  22. package/dist/lib/filesystems/remote.js.map +1 -1
  23. package/dist/lib/ipc.js +1 -2
  24. package/dist/lib/ipc.js.map +1 -1
  25. package/dist/lib/lock.js +19 -12
  26. package/dist/lib/lock.js.map +1 -1
  27. package/dist/lib/logger.js +9 -7
  28. package/dist/lib/logger.js.map +1 -1
  29. package/dist/lib/state.js +159 -63
  30. package/dist/lib/state.js.map +1 -1
  31. package/dist/lib/sync.d.ts +18 -0
  32. package/dist/lib/sync.js +165 -96
  33. package/dist/lib/sync.js.map +1 -1
  34. package/dist/lib/tasks.d.ts +7 -8
  35. package/dist/lib/tasks.js +38 -45
  36. package/dist/lib/tasks.js.map +1 -1
  37. package/dist/semaphore.d.ts +1 -0
  38. package/dist/semaphore.js +22 -5
  39. package/dist/semaphore.js.map +1 -1
  40. package/dist/utils.js +51 -35
  41. package/dist/utils.js.map +1 -1
  42. package/eslint.config.mjs +36 -0
  43. package/package.json +19 -15
  44. package/tests/bench/collapse.bench.ts +114 -0
  45. package/tests/bench/cycle.bench.ts +111 -0
  46. package/tests/bench/deltas.bench.ts +151 -0
  47. package/tests/bench/harness/fake-sync.ts +32 -0
  48. package/tests/bench/harness/measure.ts +276 -0
  49. package/tests/bench/harness/scale-world.ts +160 -0
  50. package/tests/bench/harness/trees.ts +275 -0
  51. package/tests/bench/local-scan.bench.ts +74 -0
  52. package/tests/bench/longrun.bench.ts +130 -0
  53. package/tests/bench/profile-incremental.ts +90 -0
  54. package/tests/bench/remote-build.bench.ts +104 -0
  55. package/tests/bench/render.ts +14 -0
  56. package/tests/bench/semaphore.bench.ts +79 -0
  57. package/tests/bench/state.bench.ts +85 -0
  58. package/tests/bench/tasks-dispatch.bench.ts +156 -0
  59. package/tests/conformance/virtual-fs.test.ts +213 -0
  60. package/tests/e2e/backup.e2e.test.ts +130 -0
  61. package/tests/e2e/confirm.e2e.test.ts +191 -0
  62. package/tests/e2e/conflict.e2e.test.ts +261 -0
  63. package/tests/e2e/edge.e2e.test.ts +339 -0
  64. package/tests/e2e/harness/account.ts +104 -0
  65. package/tests/e2e/harness/assert.ts +127 -0
  66. package/tests/e2e/harness/drive.ts +88 -0
  67. package/tests/e2e/harness/mutations.ts +249 -0
  68. package/tests/e2e/harness/world.ts +222 -0
  69. package/tests/e2e/ignore.e2e.test.ts +123 -0
  70. package/tests/e2e/lifecycle.e2e.test.ts +290 -0
  71. package/tests/e2e/modes.e2e.test.ts +215 -0
  72. package/tests/e2e/platform.e2e.test.ts +157 -0
  73. package/tests/e2e/property.e2e.test.ts +163 -0
  74. package/tests/e2e/races.e2e.test.ts +90 -0
  75. package/tests/e2e/regressions.e2e.test.ts +212 -0
  76. package/tests/e2e/resilience.e2e.test.ts +231 -0
  77. package/tests/e2e/special.e2e.test.ts +185 -0
  78. package/tests/e2e/state.e2e.test.ts +229 -0
  79. package/tests/e2e/sync.e2e.test.ts +222 -0
  80. package/tests/fakes/fake-cloud.test.ts +267 -0
  81. package/tests/fakes/fake-cloud.ts +1094 -0
  82. package/tests/fakes/virtual-fs.ts +354 -0
  83. package/tests/harness/known-bug.ts +17 -0
  84. package/tests/harness/mutations.ts +65 -0
  85. package/tests/harness/runner.ts +141 -0
  86. package/tests/harness/snapshot.ts +113 -0
  87. package/tests/harness/world.ts +187 -0
  88. package/tests/scenarios/a-baseline.test.ts +107 -0
  89. package/tests/scenarios/aa-races.test.ts +258 -0
  90. package/tests/scenarios/ab-mode-property.test.ts +189 -0
  91. package/tests/scenarios/ac-platform.test.ts +320 -0
  92. package/tests/scenarios/ad-unicode-normalization.test.ts +67 -0
  93. package/tests/scenarios/b-additions.test.ts +160 -0
  94. package/tests/scenarios/c-modifications.test.ts +194 -0
  95. package/tests/scenarios/d-deletions.test.ts +259 -0
  96. package/tests/scenarios/e-rename-move.test.ts +288 -0
  97. package/tests/scenarios/f-ignore-filter.test.ts +346 -0
  98. package/tests/scenarios/g-large-deletion.test.ts +277 -0
  99. package/tests/scenarios/h-resilience.test.ts +167 -0
  100. package/tests/scenarios/i-lifecycle.test.ts +353 -0
  101. package/tests/scenarios/j-state-cache.test.ts +264 -0
  102. package/tests/scenarios/k-scale.test.ts +202 -0
  103. package/tests/scenarios/l-property.test.ts +145 -0
  104. package/tests/scenarios/m-golden.test.ts +452 -0
  105. package/tests/scenarios/o-task-errors.test.ts +497 -0
  106. package/tests/scenarios/p-remote-originated.test.ts +306 -0
  107. package/tests/scenarios/q-cycle-lifecycle.test.ts +234 -0
  108. package/tests/scenarios/r-rename-stress.test.ts +208 -0
  109. package/tests/scenarios/s-upgrade-transition.test.ts +171 -0
  110. package/tests/scenarios/t-type-change.test.ts +144 -0
  111. package/tests/scenarios/u-mode-local-to-cloud.test.ts +347 -0
  112. package/tests/scenarios/v-mode-local-backup.test.ts +201 -0
  113. package/tests/scenarios/w-mode-cloud-to-local.test.ts +304 -0
  114. package/tests/scenarios/x-mode-cloud-backup.test.ts +201 -0
  115. package/tests/scenarios/y-conflict-matrix.test.ts +292 -0
  116. package/tests/scenarios/z-cross-ops.test.ts +285 -0
  117. package/tests/scenarios/zb-dir-rename-cross.test.ts +296 -0
  118. package/tests/scenarios/zc-crash-recovery.test.ts +189 -0
  119. package/tests/scenarios/zd-inode-reuse.test.ts +118 -0
  120. package/tests/scenarios/ze-move-into-new-dir.test.ts +130 -0
  121. package/tests/scenarios/zf-remote-change-unchanged-local.test.ts +81 -0
  122. package/tests/scenarios/zg-edit-during-scan.test.ts +68 -0
  123. package/tests/scenarios/zh-dir-delete-vs-child.test.ts +104 -0
  124. package/tests/scenarios/zi-smoke-test-outage.test.ts +78 -0
  125. package/tests/scenarios/zj-trash-cleanup.test.ts +133 -0
  126. package/tests/scenarios/zk-ignore-asymmetry.test.ts +150 -0
  127. package/tests/scenarios/zl-mode-atomicity.test.ts +104 -0
  128. package/tests/scenarios/zm-scan-concurrency.test.ts +78 -0
  129. package/tests/scenarios/zn-delta-ordering.test.ts +130 -0
  130. package/tests/scenarios/zo-download-temp-cleanup.test.ts +65 -0
  131. package/tests/unit/collapse-deltas.test.ts +276 -0
  132. package/tests/unit/dir-tree.test.ts +159 -0
  133. package/tests/unit/icloud.test.ts +115 -0
  134. package/tests/unit/ignorer-cache-regression.test.ts +70 -0
  135. package/tests/unit/ignorer.test.ts +63 -0
  136. package/tests/unit/ipc-lock.test.ts +438 -0
  137. package/tests/unit/lock.test.ts +135 -0
  138. package/tests/unit/n-unit.test.ts +632 -0
  139. package/tests/unit/remote-tree-unordered-regression.test.ts +101 -0
  140. package/tests/unit/semaphore-regression.test.ts +140 -0
  141. package/tests/unit/state-refencode-regression.test.ts +224 -0
  142. package/tests/unit/state.test.ts +809 -0
  143. package/tests/unit/tasks-dispatch-order-regression.test.ts +53 -0
  144. package/tests/unit/worker-api.test.ts +379 -0
  145. package/tsconfig.json +10 -1
  146. package/tsconfig.test.json +12 -0
  147. package/tsconfig.tsbuildinfo +1 -0
  148. package/vitest.bench.config.ts +32 -0
  149. package/vitest.config.ts +27 -0
  150. package/vitest.e2e.config.ts +68 -0
  151. package/.eslintrc +0 -16
  152. package/jest.config.js +0 -5
package/dist/lib/sync.js CHANGED
@@ -15,7 +15,6 @@ const ignorer_1 = __importDefault(require("../ignorer"));
15
15
  const utils_1 = require("../utils");
16
16
  const lock_1 = __importDefault(require("./lock"));
17
17
  const path_1 = __importDefault(require("path"));
18
- const fs_extra_1 = __importDefault(require("fs-extra"));
19
18
  const uuid_1 = require("uuid");
20
19
  const fast_glob_1 = __importDefault(require("fast-glob"));
21
20
  /**
@@ -54,6 +53,7 @@ class Sync {
54
53
  this.taskErrors = [];
55
54
  this.localTreeErrors = [];
56
55
  this.cleaningLocalTrash = false;
56
+ this.cleanupLocalTrashInterval = undefined;
57
57
  this.isPreviousSavedTreeStateEmpty = true;
58
58
  this.deletionConfirmationResult = "waiting";
59
59
  this.worker = worker;
@@ -63,6 +63,7 @@ class Sync {
63
63
  this.excludeDotFiles = syncPair.excludeDotFiles;
64
64
  this.dbPath = worker.dbPath;
65
65
  this.sdk = worker.sdk;
66
+ this.environment = worker.environment;
66
67
  this.localTrashDisabled = syncPair.localTrashDisabled;
67
68
  this.requireConfirmationOnLargeDeletion =
68
69
  typeof syncPair.requireConfirmationOnLargeDeletion === "boolean" ? syncPair.requireConfirmationOnLargeDeletion : false;
@@ -79,80 +80,99 @@ class Sync {
79
80
  this.cleanupLocalTrash();
80
81
  }
81
82
  async smokeTest() {
82
- if (this.removed) {
83
- throw new Error("Aborted");
84
- }
85
- const localSmokeTest = this.mode === "cloudBackup" || this.mode === "cloudToLocal" || this.mode === "twoWay"
86
- ? await this.localFileSystem.isPathWritable(this.syncPair.localPath)
87
- : await this.localFileSystem.isPathReadable(this.syncPair.localPath);
88
- if (!localSmokeTest) {
89
- await this.localFileSystem.stopDirectoryWatcher();
90
- this.worker.logger.log("error", "Local smoke test failed, path not existing or not readable or writable", this.syncPair.localPath);
91
- (0, ipc_1.postMessageToMain)({
92
- type: "cycleLocalSmokeTestFailed",
93
- syncPair: this.syncPair
94
- });
95
- await new Promise(resolve => setTimeout(resolve, constants_1.SYNC_INTERVAL));
96
- return await this.smokeTest();
97
- }
98
- const remoteSmokeTest = await this.remoteFileSystem.remoteDirPathExisting();
99
- if (!remoteSmokeTest) {
100
- this.worker.logger.log("error", "Remote smoke test failed, path does not exist or is in the trash", this.syncPair.remotePath);
101
- (0, ipc_1.postMessageToMain)({
102
- type: "cycleRemoteSmokeTestFailed",
103
- syncPair: this.syncPair
104
- });
105
- await new Promise(resolve => setTimeout(resolve, constants_1.SYNC_INTERVAL));
106
- return await this.smokeTest();
83
+ // Loop rather than recurse: during a prolonged outage this retries once per SYNC_INTERVAL, and the
84
+ // old `return await this.smokeTest()` tail-recursion accumulated one suspended async frame per retry
85
+ // (unbounded memory growth over a long outage). `this.removed` is re-checked every iteration so a
86
+ // pair removed mid-outage aborts promptly. The caller runs this BEFORE acquiring the lock, so an
87
+ // outage stalls only this pair's cycle and never holds the account lock (cross-device starvation).
88
+ while (true) {
89
+ if (this.removed) {
90
+ throw new Error("Aborted");
91
+ }
92
+ const localSmokeTest = this.mode === "cloudBackup" || this.mode === "cloudToLocal" || this.mode === "twoWay"
93
+ ? await this.localFileSystem.isPathWritable(this.syncPair.localPath)
94
+ : await this.localFileSystem.isPathReadable(this.syncPair.localPath);
95
+ if (!localSmokeTest) {
96
+ await this.localFileSystem.stopDirectoryWatcher();
97
+ this.worker.logger.log("error", "Local smoke test failed, path not existing or not readable or writable", this.syncPair.localPath);
98
+ (0, ipc_1.postMessageToMain)({
99
+ type: "cycleLocalSmokeTestFailed",
100
+ syncPair: this.syncPair
101
+ });
102
+ await new Promise(resolve => setTimeout(resolve, constants_1.SYNC_INTERVAL));
103
+ continue;
104
+ }
105
+ const remoteSmokeTest = await this.remoteFileSystem.remoteDirPathExisting();
106
+ if (!remoteSmokeTest) {
107
+ this.worker.logger.log("error", "Remote smoke test failed, path does not exist or is in the trash", this.syncPair.remotePath);
108
+ (0, ipc_1.postMessageToMain)({
109
+ type: "cycleRemoteSmokeTestFailed",
110
+ syncPair: this.syncPair
111
+ });
112
+ await new Promise(resolve => setTimeout(resolve, constants_1.SYNC_INTERVAL));
113
+ continue;
114
+ }
115
+ return;
107
116
  }
108
117
  }
109
118
  cleanupLocalTrash() {
110
- setInterval(async () => {
111
- if (this.cleaningLocalTrash) {
112
- return;
113
- }
114
- this.cleaningLocalTrash = true;
115
- try {
116
- const localTrashPath = path_1.default.join(this.syncPair.localPath, constants_1.LOCAL_TRASH_NAME);
117
- if (await fs_extra_1.default.exists(localTrashPath)) {
118
- const now = Date.now();
119
- const dir = await fast_glob_1.default.async("**/*", {
120
- dot: true,
121
- onlyDirectories: false,
122
- onlyFiles: true,
123
- throwErrorOnBrokenSymbolicLink: false,
124
- cwd: localTrashPath,
125
- followSymbolicLinks: false,
126
- deep: 0,
127
- fs: fs_extra_1.default,
128
- suppressErrors: true,
129
- stats: true,
130
- unique: true,
131
- objectMode: true
132
- });
133
- for (const entry of dir) {
134
- if (!entry) {
135
- return;
136
- }
137
- if (entry.stats && entry.stats.atimeMs + 86400000 * 30 < now) {
138
- await fs_extra_1.default.rm(path_1.default.join(localTrashPath, entry.path), {
139
- force: true,
140
- maxRetries: 60 * 10,
141
- recursive: true,
142
- retryDelay: 100
143
- });
144
- }
119
+ // Keep the timer handle so cleanup() can clear it. Previously the handle was discarded, so a removed
120
+ // pair's interval kept firing every 5 minutes forever — pinning the whole Sync (and its trees) in
121
+ // memory and burning a periodic glob/stat on a dead pair.
122
+ this.cleanupLocalTrashInterval = setInterval(() => {
123
+ void this.cleanupLocalTrashOnce();
124
+ }, 300000);
125
+ }
126
+ async cleanupLocalTrashOnce() {
127
+ if (this.cleaningLocalTrash) {
128
+ return;
129
+ }
130
+ this.cleaningLocalTrash = true;
131
+ try {
132
+ const localTrashPath = path_1.default.join(this.syncPair.localPath, constants_1.LOCAL_TRASH_NAME);
133
+ if (await this.environment.fs.exists(localTrashPath)) {
134
+ const now = Date.now();
135
+ const dir = await fast_glob_1.default.async("**/*", {
136
+ dot: true,
137
+ onlyDirectories: false,
138
+ // Deletes move whole DIRECTORIES into the trash (by basename), so the eviction sweep must
139
+ // age out directories too. With onlyFiles:true the glob skipped every trashed directory and
140
+ // (because deep:0 also stops it descending) their contents — so trashed directories leaked
141
+ // and accumulated forever. The rm below already recurses, so an old top-level dir is removed
142
+ // wholesale.
143
+ onlyFiles: false,
144
+ throwErrorOnBrokenSymbolicLink: false,
145
+ cwd: localTrashPath,
146
+ followSymbolicLinks: false,
147
+ deep: 0,
148
+ fs: this.environment.globFs,
149
+ suppressErrors: true,
150
+ stats: true,
151
+ unique: true,
152
+ objectMode: true
153
+ });
154
+ for (const entry of dir) {
155
+ if (!entry) {
156
+ continue;
157
+ }
158
+ if (entry.stats && entry.stats.atimeMs + 86400000 * 30 < now) {
159
+ await this.environment.fs.rm(path_1.default.join(localTrashPath, entry.path), {
160
+ force: true,
161
+ maxRetries: 60 * 10,
162
+ recursive: true,
163
+ retryDelay: 100
164
+ });
145
165
  }
146
166
  }
147
167
  }
148
- catch (e) {
149
- this.worker.logger.log("error", e, "sync.cleanupLocalTrash");
150
- this.worker.logger.log("error", e);
151
- }
152
- finally {
153
- this.cleaningLocalTrash = false;
154
- }
155
- }, 300000);
168
+ }
169
+ catch (e) {
170
+ this.worker.logger.log("error", e, "sync.cleanupLocalTrash");
171
+ this.worker.logger.log("error", e);
172
+ }
173
+ finally {
174
+ this.cleaningLocalTrash = false;
175
+ }
156
176
  }
157
177
  async initialize() {
158
178
  if (this.isInitialized) {
@@ -173,6 +193,10 @@ class Sync {
173
193
  }
174
194
  }
175
195
  async cleanup({ deleteLocalDbFiles = false }) {
196
+ if (this.cleanupLocalTrashInterval) {
197
+ clearInterval(this.cleanupLocalTrashInterval);
198
+ this.cleanupLocalTrashInterval = undefined;
199
+ }
176
200
  try {
177
201
  await Promise.all([
178
202
  this.localFileSystem.stopDirectoryWatcher(),
@@ -201,6 +225,40 @@ class Sync {
201
225
  });
202
226
  return;
203
227
  }
228
+ try {
229
+ await this.runCycle();
230
+ }
231
+ finally {
232
+ if (this.worker.runOnce || this.removed) {
233
+ await this.cleanup({
234
+ deleteLocalDbFiles: this.removed
235
+ });
236
+ }
237
+ else {
238
+ (0, ipc_1.postMessageToMain)({
239
+ type: "cycleRestarting",
240
+ syncPair: this.syncPair
241
+ });
242
+ setTimeout(() => {
243
+ this.run();
244
+ }, constants_1.SYNC_INTERVAL);
245
+ }
246
+ }
247
+ }
248
+ /**
249
+ * Run exactly one synchronization cycle without scheduling the next one.
250
+ *
251
+ * This is the body of a single pass: error/pause gating, lock acquisition,
252
+ * tree diffing, delta processing, task execution and state persistence. It
253
+ * never throws (failures are caught and reported as a "cycleError" message)
254
+ * and never reschedules — {@link run} owns the self-scheduling loop. Exposed
255
+ * so a single cycle can be driven deterministically.
256
+ *
257
+ * @public
258
+ * @async
259
+ * @returns {Promise<void>}
260
+ */
261
+ async runCycle() {
204
262
  try {
205
263
  if (this.taskErrors.length > 0 || this.localTreeErrors.length > 0) {
206
264
  if (this.worker.runOnce) {
@@ -262,6 +320,11 @@ class Sync {
262
320
  type: "cycleStarted",
263
321
  syncPair: this.syncPair
264
322
  });
323
+ // Smoke-test BEFORE acquiring the lock. The local smoke test retries every SYNC_INTERVAL for as
324
+ // long as the local path is unavailable (an unmounted drive, a disconnected network FS). Under the
325
+ // lock that would hold the account lock for the WHOLE outage and starve every other device; run
326
+ // outside it, an outage stalls only this pair's cycle.
327
+ await this.smokeTest();
265
328
  const acquireLockMessageTimeout = setTimeout(() => {
266
329
  (0, ipc_1.postMessageToMain)({
267
330
  type: "cycleAcquiringLockStarted",
@@ -275,7 +338,6 @@ class Sync {
275
338
  syncPair: this.syncPair
276
339
  });
277
340
  try {
278
- await this.smokeTest();
279
341
  await this.localFileSystem.waitForLocalDirectoryChanges();
280
342
  (0, ipc_1.postMessageToMain)({
281
343
  type: "cycleWaitingForLocalDirectoryChangesDone",
@@ -338,12 +400,17 @@ class Sync {
338
400
  type: "cycleProcessingDeltasStarted",
339
401
  syncPair: this.syncPair
340
402
  });
341
- const { deltas, deleteLocalDirectoryCountRaw, deleteLocalFileCountRaw, deleteRemoteDirectoryCountRaw, deleteRemoteFileCountRaw } = await this.deltas.process({
403
+ const { deltas, deleteLocalDirectoryCountRaw, deleteLocalFileCountRaw, deleteRemoteDirectoryCountRaw, deleteRemoteFileCountRaw,
404
+ // The mode the deltas were computed under (snapshotted once inside process()). Use it for the
405
+ // deletion-confirmation gate below so the gate and the delta set never disagree when
406
+ // updateMode() races the cycle. (M6)
407
+ mode: cycleMode } = await this.deltas.process({
342
408
  currentLocalTree: currentLocalTree.result,
343
409
  currentRemoteTree: currentRemoteTree.result,
344
410
  previousLocalTree: this.previousLocalTree,
345
411
  previousRemoteTree: this.previousRemoteTree,
346
- currentLocalTreeErrors: currentLocalTree.errors
412
+ currentLocalTreeErrors: currentLocalTree.errors,
413
+ currentLocalTreeIgnored: currentLocalTree.ignored
347
414
  });
348
415
  (0, ipc_1.postMessageToMain)({
349
416
  type: "deltasCount",
@@ -367,12 +434,12 @@ class Sync {
367
434
  currentLocalTree.result.size === 0 &&
368
435
  deleteRemoteDirectoryCountRaw + deleteRemoteFileCountRaw > 0 &&
369
436
  this.previousLocalTree.size <= deleteRemoteDirectoryCountRaw + deleteRemoteFileCountRaw &&
370
- (this.mode === "twoWay" || this.mode === "localToCloud");
437
+ (cycleMode === "twoWay" || cycleMode === "localToCloud");
371
438
  const confirmRemoteDeletion = this.previousRemoteTree.size > 0 &&
372
439
  currentRemoteTree.result.size === 0 &&
373
- deleteLocalDirectoryCountRaw + deleteLocalFileCountRaw > 0;
374
- this.previousRemoteTree.size <= deleteLocalDirectoryCountRaw + deleteLocalFileCountRaw &&
375
- (this.mode === "twoWay" || this.mode === "cloudToLocal");
440
+ deleteLocalDirectoryCountRaw + deleteLocalFileCountRaw > 0 &&
441
+ this.previousRemoteTree.size <= deleteLocalDirectoryCountRaw + deleteLocalFileCountRaw &&
442
+ (cycleMode === "twoWay" || cycleMode === "cloudToLocal");
376
443
  let skipSyncDueToConfirmDeletionRestart = false;
377
444
  // If the previous tree has nodes and the current one is empty, we should prompt the user to confirm deletion
378
445
  if (this.requireConfirmationOnLargeDeletion && (confirmLocalDeletion || confirmRemoteDeletion)) {
@@ -399,7 +466,11 @@ class Sync {
399
466
  sendConfirmationMessage();
400
467
  await new Promise(resolve => {
401
468
  const interval = setInterval(() => {
402
- if (this.deletionConfirmationResult !== "waiting") {
469
+ // Also bail when the pair is paused or removed while we wait — otherwise the cycle
470
+ // spins here indefinitely (the user may never answer) while HOLDING the lock, which
471
+ // starves every other device on the account. A bail-out leaves the decision as
472
+ // "waiting", so the skip-and-restart path below releases the lock and exits cleanly.
473
+ if (this.deletionConfirmationResult !== "waiting" || this.paused || this.removed) {
403
474
  clearInterval(interval);
404
475
  resolve();
405
476
  }
@@ -489,9 +560,23 @@ class Sync {
489
560
  type: "cycleSavingStateStarted",
490
561
  syncPair: this.syncPair
491
562
  });
492
- // Deep cloning is needed, otherwise we just pass the reference
493
- this.previousLocalTree = structuredClone(currentLocalTree.result);
494
- this.previousRemoteTree = structuredClone(currentRemoteTree.result);
563
+ // Snapshot the trees as the next cycle's base. We need NEW tree/inode/uuid MAPS so the
564
+ // directory-tree cache's in-place incremental updates (the watcher add/remove/rename path)
565
+ // can never bleed into the base — but the item objects can be SHARED by reference: an item
566
+ // is always created fresh and replaced in the map, never mutated field-by-field, so the
567
+ // base's items are immutable once snapshotted. A full structuredClone instead deep-copied
568
+ // every item on every change-cycle — O(tree) CPU plus a second full copy of the tree in
569
+ // memory — for isolation a shallow map copy already provides. (P3)
570
+ this.previousLocalTree = {
571
+ tree: Object.assign({}, currentLocalTree.result.tree),
572
+ inodes: Object.assign({}, currentLocalTree.result.inodes),
573
+ size: currentLocalTree.result.size
574
+ };
575
+ this.previousRemoteTree = {
576
+ tree: Object.assign({}, currentRemoteTree.result.tree),
577
+ uuids: Object.assign({}, currentRemoteTree.result.uuids),
578
+ size: currentRemoteTree.result.size
579
+ };
495
580
  await this.state.save();
496
581
  (0, ipc_1.postMessageToMain)({
497
582
  type: "cycleSavingStateDone",
@@ -531,22 +616,6 @@ class Sync {
531
616
  });
532
617
  }
533
618
  }
534
- finally {
535
- if (this.worker.runOnce || this.removed) {
536
- await this.cleanup({
537
- deleteLocalDbFiles: this.removed
538
- });
539
- }
540
- else {
541
- (0, ipc_1.postMessageToMain)({
542
- type: "cycleRestarting",
543
- syncPair: this.syncPair
544
- });
545
- setTimeout(() => {
546
- this.run();
547
- }, constants_1.SYNC_INTERVAL);
548
- }
549
- }
550
619
  }
551
620
  }
552
621
  exports.Sync = Sync;
@@ -1 +1 @@
1
- {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/lib/sync.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/lib/sync.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,7 @@
1
- /// <reference types="node" />
2
1
  import type Sync from "./sync";
3
2
  import { type Delta } from "./deltas";
4
3
  import { type RemoteItem } from "./filesystems/remote";
5
- import fs from "fs-extra";
4
+ import { type Stats } from "fs-extra";
6
5
  import { Prettify } from "../types";
7
6
  export type TaskError = Prettify<{
8
7
  path: string;
@@ -20,14 +19,14 @@ export type DoneTask = {
20
19
  } & ({
21
20
  type: "uploadFile";
22
21
  item: RemoteItem;
23
- stats: fs.Stats;
22
+ stats: Stats;
24
23
  } | {
25
24
  type: "createRemoteDirectory";
26
25
  item: RemoteItem;
27
- stats: fs.Stats;
26
+ stats: Stats;
28
27
  } | {
29
28
  type: "createLocalDirectory";
30
- stats: fs.Stats;
29
+ stats: Stats;
31
30
  item: RemoteItem;
32
31
  } | {
33
32
  type: "deleteLocalFile";
@@ -39,13 +38,13 @@ export type DoneTask = {
39
38
  type: "deleteRemoteDirectory";
40
39
  } | {
41
40
  type: "downloadFile";
42
- stats: fs.Stats;
41
+ stats: Stats;
43
42
  item: RemoteItem;
44
43
  } | {
45
44
  type: "renameLocalFile";
46
45
  from: string;
47
46
  to: string;
48
- stats: fs.Stats;
47
+ stats: Stats;
49
48
  } | {
50
49
  type: "renameRemoteFile";
51
50
  from: string;
@@ -58,7 +57,7 @@ export type DoneTask = {
58
57
  type: "renameLocalDirectory";
59
58
  from: string;
60
59
  to: string;
61
- stats: fs.Stats;
60
+ stats: Stats;
62
61
  });
63
62
  /**
64
63
  * Tasks
package/dist/lib/tasks.js CHANGED
@@ -5,7 +5,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.Tasks = void 0;
7
7
  const utils_1 = require("../utils");
8
- const fs_extra_1 = __importDefault(require("fs-extra"));
9
8
  const ipc_1 = require("./ipc");
10
9
  const path_1 = __importDefault(require("path"));
11
10
  const semaphore_1 = require("../semaphore");
@@ -100,7 +99,7 @@ class Tasks {
100
99
  try {
101
100
  const [, stats] = await Promise.all([
102
101
  this.sync.remoteFileSystem.mkdir({ relativePath: delta.path }),
103
- fs_extra_1.default.stat(path_1.default.join(this.sync.syncPair.localPath, delta.path))
102
+ this.sync.environment.fs.stat(path_1.default.join(this.sync.syncPair.localPath, delta.path))
104
103
  ]);
105
104
  const item = this.sync.remoteFileSystem.getDirectoryTreeCache.tree[delta.path];
106
105
  if (!item) {
@@ -155,7 +154,7 @@ class Tasks {
155
154
  }
156
155
  catch (e) {
157
156
  // Don't throw if the file/directory does not exist anymore (it has been changed while we were inside the sync cycle, after deltas have been calculated).
158
- if (!(await this.sync.localFileSystem.pathExists(delta.path))) {
157
+ if (!(await this.sync.localFileSystem.pathExists(path_1.default.join(this.sync.syncPair.localPath, delta.path)))) {
159
158
  return delta;
160
159
  }
161
160
  if (e instanceof Error) {
@@ -360,7 +359,7 @@ class Tasks {
360
359
  relativePath: delta.path,
361
360
  passedMD5Hash: delta.md5Hash
362
361
  }),
363
- fs_extra_1.default.stat(path_1.default.join(this.sync.syncPair.localPath, delta.path))
362
+ this.sync.environment.fs.stat(path_1.default.join(this.sync.syncPair.localPath, delta.path))
364
363
  ]);
365
364
  const item = this.sync.remoteFileSystem.getDirectoryTreeCache.tree[delta.path];
366
365
  if (!item) {
@@ -483,68 +482,62 @@ class Tasks {
483
482
  // 10. Remote directory creations
484
483
  // 11. File uploads
485
484
  // 12. File downloads
485
+ // Partition the deltas into per-type buckets in ONE pass, then drain the buckets in the fixed order
486
+ // above — instead of scanning the whole deltasSorted array 12 times (10 sequential `if type !== X
487
+ // continue` passes + 2 filters), which is 12·O(deltas) just to order the work and costs real time on a
488
+ // bulk cycle (e.g. an initial sync of a huge tree). Each bucket keeps deltasSorted order (we push in
489
+ // iteration order), so the executed order — and therefore behavior — is identical. (perf)
490
+ const byType = {
491
+ renameLocalDirectory: [],
492
+ renameLocalFile: [],
493
+ renameRemoteDirectory: [],
494
+ renameRemoteFile: [],
495
+ deleteLocalDirectory: [],
496
+ deleteLocalFile: [],
497
+ deleteRemoteDirectory: [],
498
+ deleteRemoteFile: [],
499
+ createLocalDirectory: [],
500
+ createRemoteDirectory: [],
501
+ uploadFile: [],
502
+ downloadFile: []
503
+ };
486
504
  for (const delta of deltasSorted) {
487
- if (delta.type !== "renameLocalDirectory") {
488
- continue;
489
- }
505
+ byType[delta.type].push(delta);
506
+ }
507
+ // Sequential, in the documented type order (state-mutating ops one after another).
508
+ for (const delta of byType.renameLocalDirectory) {
490
509
  await process(delta);
491
510
  }
492
- for (const delta of deltasSorted) {
493
- if (delta.type !== "renameLocalFile") {
494
- continue;
495
- }
511
+ for (const delta of byType.renameLocalFile) {
496
512
  await process(delta);
497
513
  }
498
- for (const delta of deltasSorted) {
499
- if (delta.type !== "renameRemoteDirectory") {
500
- continue;
501
- }
514
+ for (const delta of byType.renameRemoteDirectory) {
502
515
  await process(delta);
503
516
  }
504
- for (const delta of deltasSorted) {
505
- if (delta.type !== "renameRemoteFile") {
506
- continue;
507
- }
517
+ for (const delta of byType.renameRemoteFile) {
508
518
  await process(delta);
509
519
  }
510
- for (const delta of deltasSorted) {
511
- if (delta.type !== "deleteLocalDirectory") {
512
- continue;
513
- }
520
+ for (const delta of byType.deleteLocalDirectory) {
514
521
  await process(delta);
515
522
  }
516
- for (const delta of deltasSorted) {
517
- if (delta.type !== "deleteLocalFile") {
518
- continue;
519
- }
523
+ for (const delta of byType.deleteLocalFile) {
520
524
  await process(delta);
521
525
  }
522
- for (const delta of deltasSorted) {
523
- if (delta.type !== "deleteRemoteDirectory") {
524
- continue;
525
- }
526
+ for (const delta of byType.deleteRemoteDirectory) {
526
527
  await process(delta);
527
528
  }
528
- for (const delta of deltasSorted) {
529
- if (delta.type !== "deleteRemoteFile") {
530
- continue;
531
- }
529
+ for (const delta of byType.deleteRemoteFile) {
532
530
  await process(delta);
533
531
  }
534
- for (const delta of deltasSorted) {
535
- if (delta.type !== "createLocalDirectory") {
536
- continue;
537
- }
532
+ for (const delta of byType.createLocalDirectory) {
538
533
  await process(delta);
539
534
  }
540
- for (const delta of deltasSorted) {
541
- if (delta.type !== "createRemoteDirectory") {
542
- continue;
543
- }
535
+ for (const delta of byType.createRemoteDirectory) {
544
536
  await process(delta);
545
537
  }
546
- await (0, utils_1.promiseAllChunked)(deltasSorted.filter(delta => delta.type === "uploadFile").map(process), 10000, false);
547
- await (0, utils_1.promiseAllChunked)(deltasSorted.filter(delta => delta.type === "downloadFile").map(process), 10000, false);
538
+ // Uploads then downloads, in parallel (bounded by the transfers semaphore inside `process`).
539
+ await (0, utils_1.promiseAllChunked)(byType.uploadFile.map(process), 10000, false);
540
+ await (0, utils_1.promiseAllChunked)(byType.downloadFile.map(process), 10000, false);
548
541
  return {
549
542
  doneTasks: executed,
550
543
  errors