obsyncd 1.0.0
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 +920 -0
- package/dist/cli/commands/init.d.ts +8 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +104 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/status.d.ts +8 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/status.js +117 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/commands/sync.d.ts +13 -0
- package/dist/cli/commands/sync.d.ts.map +1 -0
- package/dist/cli/commands/sync.js +225 -0
- package/dist/cli/commands/sync.js.map +1 -0
- package/dist/cli/prompts/conflictPrompt.d.ts +10 -0
- package/dist/cli/prompts/conflictPrompt.d.ts.map +1 -0
- package/dist/cli/prompts/conflictPrompt.js +51 -0
- package/dist/cli/prompts/conflictPrompt.js.map +1 -0
- package/dist/cli/prompts/fileBrowser.d.ts +6 -0
- package/dist/cli/prompts/fileBrowser.d.ts.map +1 -0
- package/dist/cli/prompts/fileBrowser.js +91 -0
- package/dist/cli/prompts/fileBrowser.js.map +1 -0
- package/dist/cli/prompts/vaultSelector.d.ts +13 -0
- package/dist/cli/prompts/vaultSelector.d.ts.map +1 -0
- package/dist/cli/prompts/vaultSelector.js +63 -0
- package/dist/cli/prompts/vaultSelector.js.map +1 -0
- package/dist/cli/ui/colors.d.ts +50 -0
- package/dist/cli/ui/colors.d.ts.map +1 -0
- package/dist/cli/ui/colors.js +62 -0
- package/dist/cli/ui/colors.js.map +1 -0
- package/dist/cli/ui/output.d.ts +45 -0
- package/dist/cli/ui/output.d.ts.map +1 -0
- package/dist/cli/ui/output.js +116 -0
- package/dist/cli/ui/output.js.map +1 -0
- package/dist/cli/ui/spinner.d.ts +29 -0
- package/dist/cli/ui/spinner.d.ts.map +1 -0
- package/dist/cli/ui/spinner.js +80 -0
- package/dist/cli/ui/spinner.js.map +1 -0
- package/dist/cli/ui/table.d.ts +28 -0
- package/dist/cli/ui/table.d.ts.map +1 -0
- package/dist/cli/ui/table.js +123 -0
- package/dist/cli/ui/table.js.map +1 -0
- package/dist/cli/utils/terminal.d.ts +21 -0
- package/dist/cli/utils/terminal.d.ts.map +1 -0
- package/dist/cli/utils/terminal.js +59 -0
- package/dist/cli/utils/terminal.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +32 -0
- package/dist/cli.js.map +1 -0
- package/dist/config/index.d.ts +45 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +112 -0
- package/dist/config/index.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/storage/index.d.ts +35 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +97 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/sync/changeDetector.d.ts +29 -0
- package/dist/sync/changeDetector.d.ts.map +1 -0
- package/dist/sync/changeDetector.js +259 -0
- package/dist/sync/changeDetector.js.map +1 -0
- package/dist/sync/conflictResolver.d.ts +29 -0
- package/dist/sync/conflictResolver.d.ts.map +1 -0
- package/dist/sync/conflictResolver.js +116 -0
- package/dist/sync/conflictResolver.js.map +1 -0
- package/dist/sync/directoryLister.d.ts +18 -0
- package/dist/sync/directoryLister.d.ts.map +1 -0
- package/dist/sync/directoryLister.js +39 -0
- package/dist/sync/directoryLister.js.map +1 -0
- package/dist/sync/index.d.ts +29 -0
- package/dist/sync/index.d.ts.map +1 -0
- package/dist/sync/index.js +212 -0
- package/dist/sync/index.js.map +1 -0
- package/dist/sync/manifest.d.ts +48 -0
- package/dist/sync/manifest.d.ts.map +1 -0
- package/dist/sync/manifest.js +137 -0
- package/dist/sync/manifest.js.map +1 -0
- package/dist/sync/types.d.ts +109 -0
- package/dist/sync/types.d.ts.map +1 -0
- package/dist/sync/types.js +5 -0
- package/dist/sync/types.js.map +1 -0
- package/dist/sync/watchMode.d.ts +84 -0
- package/dist/sync/watchMode.d.ts.map +1 -0
- package/dist/sync/watchMode.js +364 -0
- package/dist/sync/watchMode.js.map +1 -0
- package/dist/sync/watcher.d.ts +114 -0
- package/dist/sync/watcher.d.ts.map +1 -0
- package/dist/sync/watcher.js +293 -0
- package/dist/sync/watcher.js.map +1 -0
- package/dist/utils/index.d.ts +8 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +25 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/vault/index.d.ts +38 -0
- package/dist/vault/index.d.ts.map +1 -0
- package/dist/vault/index.js +106 -0
- package/dist/vault/index.js.map +1 -0
- package/package.json +68 -0
|
@@ -0,0 +1,364 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WatchModeSync - Orchestrates continuous file watching and automatic synchronization.
|
|
3
|
+
* Coordinates between FileWatcher and SyncEngine for real-time vault synchronization.
|
|
4
|
+
*/
|
|
5
|
+
import path from 'path';
|
|
6
|
+
import { EventEmitter } from 'events';
|
|
7
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
8
|
+
import { SyncEngine } from './index.js';
|
|
9
|
+
import { BatchFileWatcher } from './watcher.js';
|
|
10
|
+
export class WatchModeSync extends EventEmitter {
|
|
11
|
+
watcher = null;
|
|
12
|
+
syncEngine;
|
|
13
|
+
options;
|
|
14
|
+
state = 'idle';
|
|
15
|
+
syncCount = 0;
|
|
16
|
+
totalFilesSynced = 0;
|
|
17
|
+
lastSyncTime = null;
|
|
18
|
+
lastSyncResult = null;
|
|
19
|
+
currentError = null;
|
|
20
|
+
isSyncing = false;
|
|
21
|
+
pendingSyncRequest = false;
|
|
22
|
+
session = null;
|
|
23
|
+
maxWaitTimer = null;
|
|
24
|
+
pendingChangesCount = 0;
|
|
25
|
+
constructor(options) {
|
|
26
|
+
super();
|
|
27
|
+
this.syncEngine = new SyncEngine();
|
|
28
|
+
this.options = {
|
|
29
|
+
source: path.resolve(options.source),
|
|
30
|
+
destination: path.resolve(options.destination),
|
|
31
|
+
conflictResolution: options.conflictResolution ?? 'newest',
|
|
32
|
+
remoteMode: options.remoteMode ?? false,
|
|
33
|
+
debounceMs: options.debounceMs ?? 300,
|
|
34
|
+
batchDelayMs: options.batchDelayMs ?? 500,
|
|
35
|
+
maxWaitMs: options.maxWaitMs ?? 5000,
|
|
36
|
+
initialSync: options.initialSync ?? true,
|
|
37
|
+
onSync: options.onSync,
|
|
38
|
+
onError: options.onError,
|
|
39
|
+
onStatusChange: options.onStatusChange,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Start watch mode synchronization
|
|
44
|
+
*/
|
|
45
|
+
async start() {
|
|
46
|
+
if (this.state === 'watching' || this.state === 'syncing') {
|
|
47
|
+
throw new Error('Watch mode is already running');
|
|
48
|
+
}
|
|
49
|
+
// Initialize session
|
|
50
|
+
this.session = {
|
|
51
|
+
sessionId: uuidv4(),
|
|
52
|
+
startTime: new Date(),
|
|
53
|
+
endTime: null,
|
|
54
|
+
syncCount: 0,
|
|
55
|
+
errorCount: 0,
|
|
56
|
+
syncHistory: [],
|
|
57
|
+
};
|
|
58
|
+
// Reset state
|
|
59
|
+
this.syncCount = 0;
|
|
60
|
+
this.totalFilesSynced = 0;
|
|
61
|
+
this.lastSyncTime = null;
|
|
62
|
+
this.lastSyncResult = null;
|
|
63
|
+
this.currentError = null;
|
|
64
|
+
// Perform initial sync if enabled
|
|
65
|
+
if (this.options.initialSync) {
|
|
66
|
+
this.setState('syncing');
|
|
67
|
+
try {
|
|
68
|
+
await this.performSync('Initial sync');
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
this.handleError(error instanceof Error ? error : new Error(String(error)));
|
|
72
|
+
throw error;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
// Create and start the file watcher
|
|
76
|
+
this.watcher = new BatchFileWatcher({
|
|
77
|
+
debounceMs: this.options.debounceMs,
|
|
78
|
+
batchDelayMs: this.options.batchDelayMs,
|
|
79
|
+
ignorePatterns: [
|
|
80
|
+
'.obsidian/**',
|
|
81
|
+
'.trash/**',
|
|
82
|
+
'.git/**',
|
|
83
|
+
'.obsync/**',
|
|
84
|
+
'.DS_Store',
|
|
85
|
+
'Thumbs.db',
|
|
86
|
+
'*.tmp',
|
|
87
|
+
'*.temp',
|
|
88
|
+
],
|
|
89
|
+
});
|
|
90
|
+
// Listen for batched changes
|
|
91
|
+
this.watcher.on('batch', (events) => {
|
|
92
|
+
this.handleBatchChanges(events);
|
|
93
|
+
});
|
|
94
|
+
// Listen for individual changes for UI updates
|
|
95
|
+
this.watcher.on('change', () => {
|
|
96
|
+
this.pendingChangesCount++;
|
|
97
|
+
this.emitStatusChange();
|
|
98
|
+
// Set max wait timer if not already set
|
|
99
|
+
if (!this.maxWaitTimer && !this.isSyncing) {
|
|
100
|
+
this.maxWaitTimer = setTimeout(() => {
|
|
101
|
+
this.maxWaitTimer = null;
|
|
102
|
+
if (this.pendingChangesCount > 0) {
|
|
103
|
+
this.triggerSync('Max wait timeout');
|
|
104
|
+
}
|
|
105
|
+
}, this.options.maxWaitMs);
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
this.watcher.on('error', (error) => {
|
|
109
|
+
this.handleError(error);
|
|
110
|
+
});
|
|
111
|
+
// Wait for watcher to be ready
|
|
112
|
+
await new Promise((resolve, reject) => {
|
|
113
|
+
const timeout = setTimeout(() => {
|
|
114
|
+
reject(new Error('Watcher initialization timeout'));
|
|
115
|
+
}, 10000);
|
|
116
|
+
this.watcher.once('ready', () => {
|
|
117
|
+
clearTimeout(timeout);
|
|
118
|
+
resolve();
|
|
119
|
+
});
|
|
120
|
+
// Start watching both directories
|
|
121
|
+
this.watcher.watchMultiple([this.options.source, this.options.destination]);
|
|
122
|
+
});
|
|
123
|
+
this.setState('watching');
|
|
124
|
+
this.emitEvent({ type: 'status_change', timestamp: new Date(), data: this.getStatus() });
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Stop watch mode synchronization
|
|
128
|
+
*/
|
|
129
|
+
async stop() {
|
|
130
|
+
if (this.state === 'stopped' || this.state === 'idle') {
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
// Clear max wait timer
|
|
134
|
+
if (this.maxWaitTimer) {
|
|
135
|
+
clearTimeout(this.maxWaitTimer);
|
|
136
|
+
this.maxWaitTimer = null;
|
|
137
|
+
}
|
|
138
|
+
// Stop the watcher
|
|
139
|
+
if (this.watcher) {
|
|
140
|
+
await this.watcher.stop();
|
|
141
|
+
this.watcher = null;
|
|
142
|
+
}
|
|
143
|
+
// Update session
|
|
144
|
+
if (this.session) {
|
|
145
|
+
this.session.endTime = new Date();
|
|
146
|
+
}
|
|
147
|
+
this.setState('stopped');
|
|
148
|
+
this.emitEvent({ type: 'status_change', timestamp: new Date(), data: this.getStatus() });
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Pause watch mode (stop watching but keep state)
|
|
152
|
+
*/
|
|
153
|
+
async pause() {
|
|
154
|
+
if (this.watcher) {
|
|
155
|
+
await this.watcher.stop();
|
|
156
|
+
this.watcher = null;
|
|
157
|
+
}
|
|
158
|
+
this.setState('idle');
|
|
159
|
+
this.emitStatusChange();
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Resume watch mode after pause
|
|
163
|
+
*/
|
|
164
|
+
async resume() {
|
|
165
|
+
if (this.state !== 'idle') {
|
|
166
|
+
throw new Error('Can only resume from idle state');
|
|
167
|
+
}
|
|
168
|
+
// Recreate watcher
|
|
169
|
+
this.watcher = new BatchFileWatcher({
|
|
170
|
+
debounceMs: this.options.debounceMs,
|
|
171
|
+
batchDelayMs: this.options.batchDelayMs,
|
|
172
|
+
});
|
|
173
|
+
this.watcher.on('batch', (events) => {
|
|
174
|
+
this.handleBatchChanges(events);
|
|
175
|
+
});
|
|
176
|
+
this.watcher.on('change', () => {
|
|
177
|
+
this.pendingChangesCount++;
|
|
178
|
+
this.emitStatusChange();
|
|
179
|
+
});
|
|
180
|
+
this.watcher.on('error', (error) => {
|
|
181
|
+
this.handleError(error);
|
|
182
|
+
});
|
|
183
|
+
await new Promise((resolve, reject) => {
|
|
184
|
+
const timeout = setTimeout(() => {
|
|
185
|
+
reject(new Error('Watcher initialization timeout'));
|
|
186
|
+
}, 10000);
|
|
187
|
+
this.watcher.once('ready', () => {
|
|
188
|
+
clearTimeout(timeout);
|
|
189
|
+
resolve();
|
|
190
|
+
});
|
|
191
|
+
this.watcher.watchMultiple([this.options.source, this.options.destination]);
|
|
192
|
+
});
|
|
193
|
+
this.setState('watching');
|
|
194
|
+
this.emitStatusChange();
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Force an immediate sync
|
|
198
|
+
*/
|
|
199
|
+
async forceSync() {
|
|
200
|
+
return this.performSync('Manual trigger');
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Get current status
|
|
204
|
+
*/
|
|
205
|
+
getStatus() {
|
|
206
|
+
return {
|
|
207
|
+
state: this.state,
|
|
208
|
+
isActive: this.state === 'watching' || this.state === 'syncing',
|
|
209
|
+
pendingChanges: this.pendingChangesCount,
|
|
210
|
+
lastSyncTime: this.lastSyncTime,
|
|
211
|
+
lastSyncResult: this.lastSyncResult,
|
|
212
|
+
syncCount: this.syncCount,
|
|
213
|
+
totalFilesSynced: this.totalFilesSynced,
|
|
214
|
+
currentError: this.currentError,
|
|
215
|
+
watchedPaths: [this.options.source, this.options.destination],
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Get current session information
|
|
220
|
+
*/
|
|
221
|
+
getSession() {
|
|
222
|
+
return this.session;
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Handle batched file changes
|
|
226
|
+
*/
|
|
227
|
+
handleBatchChanges(events) {
|
|
228
|
+
if (events.length === 0)
|
|
229
|
+
return;
|
|
230
|
+
// Clear pending changes count since we're processing them
|
|
231
|
+
this.pendingChangesCount = 0;
|
|
232
|
+
this.emitStatusChange();
|
|
233
|
+
// Clear max wait timer
|
|
234
|
+
if (this.maxWaitTimer) {
|
|
235
|
+
clearTimeout(this.maxWaitTimer);
|
|
236
|
+
this.maxWaitTimer = null;
|
|
237
|
+
}
|
|
238
|
+
this.triggerSync(`${events.length} file(s) changed`);
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Trigger a sync operation
|
|
242
|
+
*/
|
|
243
|
+
triggerSync(reason) {
|
|
244
|
+
if (this.isSyncing) {
|
|
245
|
+
this.pendingSyncRequest = true;
|
|
246
|
+
return;
|
|
247
|
+
}
|
|
248
|
+
this.performSync(reason).catch((error) => {
|
|
249
|
+
this.handleError(error instanceof Error ? error : new Error(String(error)));
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Perform the actual sync operation
|
|
254
|
+
*/
|
|
255
|
+
async performSync(_reason) {
|
|
256
|
+
if (this.isSyncing) {
|
|
257
|
+
throw new Error('Sync already in progress');
|
|
258
|
+
}
|
|
259
|
+
this.isSyncing = true;
|
|
260
|
+
const previousState = this.state;
|
|
261
|
+
this.setState('syncing');
|
|
262
|
+
this.emitEvent({ type: 'sync_start', timestamp: new Date() });
|
|
263
|
+
const startTime = Date.now();
|
|
264
|
+
try {
|
|
265
|
+
const result = await this.syncEngine.sync({
|
|
266
|
+
source: this.options.source,
|
|
267
|
+
destination: this.options.destination,
|
|
268
|
+
conflictResolution: this.options.conflictResolution,
|
|
269
|
+
dryRun: false,
|
|
270
|
+
remoteMode: this.options.remoteMode,
|
|
271
|
+
});
|
|
272
|
+
const duration = Date.now() - startTime;
|
|
273
|
+
// Update state
|
|
274
|
+
this.syncCount++;
|
|
275
|
+
this.lastSyncTime = new Date();
|
|
276
|
+
this.lastSyncResult = result;
|
|
277
|
+
this.totalFilesSynced += result.filesAdded + result.filesUpdated + result.filesDeleted;
|
|
278
|
+
this.currentError = null;
|
|
279
|
+
// Update session
|
|
280
|
+
if (this.session) {
|
|
281
|
+
this.session.syncCount++;
|
|
282
|
+
this.session.syncHistory.push({
|
|
283
|
+
timestamp: new Date(),
|
|
284
|
+
result,
|
|
285
|
+
duration,
|
|
286
|
+
});
|
|
287
|
+
}
|
|
288
|
+
// Emit events
|
|
289
|
+
this.emitEvent({ type: 'sync_complete', timestamp: new Date(), data: result });
|
|
290
|
+
this.options.onSync?.(result);
|
|
291
|
+
this.isSyncing = false;
|
|
292
|
+
// Check for pending sync request
|
|
293
|
+
if (this.pendingSyncRequest) {
|
|
294
|
+
this.pendingSyncRequest = false;
|
|
295
|
+
// Schedule another sync
|
|
296
|
+
setImmediate(() => {
|
|
297
|
+
this.triggerSync('Pending changes');
|
|
298
|
+
});
|
|
299
|
+
}
|
|
300
|
+
else {
|
|
301
|
+
// Restore to watching state if we were watching before
|
|
302
|
+
if (previousState === 'watching' || this.watcher) {
|
|
303
|
+
this.setState('watching');
|
|
304
|
+
}
|
|
305
|
+
else {
|
|
306
|
+
this.setState('idle');
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
return result;
|
|
310
|
+
}
|
|
311
|
+
catch (error) {
|
|
312
|
+
this.isSyncing = false;
|
|
313
|
+
this.pendingSyncRequest = false;
|
|
314
|
+
const err = error instanceof Error ? error : new Error(String(error));
|
|
315
|
+
this.handleError(err);
|
|
316
|
+
// Update session
|
|
317
|
+
if (this.session) {
|
|
318
|
+
this.session.errorCount++;
|
|
319
|
+
}
|
|
320
|
+
this.emitEvent({ type: 'sync_error', timestamp: new Date(), data: err });
|
|
321
|
+
throw err;
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* Handle errors
|
|
326
|
+
*/
|
|
327
|
+
handleError(error) {
|
|
328
|
+
this.currentError = error;
|
|
329
|
+
this.setState('error');
|
|
330
|
+
this.options.onError?.(error);
|
|
331
|
+
this.emit('error', error);
|
|
332
|
+
}
|
|
333
|
+
/**
|
|
334
|
+
* Set state and emit status change
|
|
335
|
+
*/
|
|
336
|
+
setState(newState) {
|
|
337
|
+
if (this.state !== newState) {
|
|
338
|
+
this.state = newState;
|
|
339
|
+
this.emitStatusChange();
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
/**
|
|
343
|
+
* Emit status change event
|
|
344
|
+
*/
|
|
345
|
+
emitStatusChange() {
|
|
346
|
+
const status = this.getStatus();
|
|
347
|
+
this.options.onStatusChange?.(status);
|
|
348
|
+
this.emit('statusChange', status);
|
|
349
|
+
}
|
|
350
|
+
/**
|
|
351
|
+
* Emit an event
|
|
352
|
+
*/
|
|
353
|
+
emitEvent(event) {
|
|
354
|
+
this.emit('event', event);
|
|
355
|
+
this.emit(event.type, event.data);
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
/**
|
|
359
|
+
* Create a watch mode sync instance with default options
|
|
360
|
+
*/
|
|
361
|
+
export function createWatchModeSync(options) {
|
|
362
|
+
return new WatchModeSync(options);
|
|
363
|
+
}
|
|
364
|
+
//# sourceMappingURL=watchMode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watchMode.js","sourceRoot":"","sources":["../../src/sync/watchMode.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FileWatcher - Watches directories for file changes with debouncing.
|
|
3
|
+
* Uses chokidar for cross-platform file watching.
|
|
4
|
+
*/
|
|
5
|
+
import { EventEmitter } from 'events';
|
|
6
|
+
export interface WatcherOptions {
|
|
7
|
+
/** Debounce delay in milliseconds (default: 300) */
|
|
8
|
+
debounceMs?: number;
|
|
9
|
+
/** Patterns to ignore (glob patterns) */
|
|
10
|
+
ignorePatterns?: string[];
|
|
11
|
+
/** Whether to ignore initial scan events (default: true) */
|
|
12
|
+
ignoreInitial?: boolean;
|
|
13
|
+
/** Whether to use polling (slower but more compatible) */
|
|
14
|
+
usePolling?: boolean;
|
|
15
|
+
/** Polling interval in milliseconds (only if usePolling is true) */
|
|
16
|
+
pollInterval?: number;
|
|
17
|
+
/** Depth to watch (undefined = infinite) */
|
|
18
|
+
depth?: number;
|
|
19
|
+
}
|
|
20
|
+
export interface FileChangeEvent {
|
|
21
|
+
type: 'add' | 'change' | 'unlink';
|
|
22
|
+
path: string;
|
|
23
|
+
relativePath: string;
|
|
24
|
+
watchedPath: string;
|
|
25
|
+
}
|
|
26
|
+
export interface WatcherStatus {
|
|
27
|
+
isWatching: boolean;
|
|
28
|
+
watchedPaths: string[];
|
|
29
|
+
pendingChanges: number;
|
|
30
|
+
lastEventTime: Date | null;
|
|
31
|
+
}
|
|
32
|
+
export declare class FileWatcher extends EventEmitter {
|
|
33
|
+
private watchers;
|
|
34
|
+
private pendingChanges;
|
|
35
|
+
private debounceTimers;
|
|
36
|
+
private debounceMs;
|
|
37
|
+
private ignorePatterns;
|
|
38
|
+
private ignoreMatchers;
|
|
39
|
+
private ignoreInitial;
|
|
40
|
+
private usePolling;
|
|
41
|
+
private pollInterval;
|
|
42
|
+
private depth;
|
|
43
|
+
private isReady;
|
|
44
|
+
private lastEventTime;
|
|
45
|
+
private isStopped;
|
|
46
|
+
constructor(options?: WatcherOptions);
|
|
47
|
+
/**
|
|
48
|
+
* Start watching a directory for file changes
|
|
49
|
+
*/
|
|
50
|
+
watch(watchPath: string): void;
|
|
51
|
+
/**
|
|
52
|
+
* Watch multiple directories
|
|
53
|
+
*/
|
|
54
|
+
watchMultiple(paths: string[]): void;
|
|
55
|
+
/**
|
|
56
|
+
* Stop watching a specific directory
|
|
57
|
+
*/
|
|
58
|
+
unwatch(watchPath: string): Promise<void>;
|
|
59
|
+
/**
|
|
60
|
+
* Stop watching all directories and clean up
|
|
61
|
+
*/
|
|
62
|
+
stop(): Promise<void>;
|
|
63
|
+
/**
|
|
64
|
+
* Get current watcher status
|
|
65
|
+
*/
|
|
66
|
+
getStatus(): WatcherStatus;
|
|
67
|
+
/**
|
|
68
|
+
* Check if all watchers are ready
|
|
69
|
+
*/
|
|
70
|
+
areAllWatchersReady(): boolean;
|
|
71
|
+
/**
|
|
72
|
+
* Force flush all pending changes immediately
|
|
73
|
+
*/
|
|
74
|
+
flushPendingChanges(): FileChangeEvent[];
|
|
75
|
+
/**
|
|
76
|
+
* Get count of pending changes
|
|
77
|
+
*/
|
|
78
|
+
getPendingCount(): number;
|
|
79
|
+
/**
|
|
80
|
+
* Handle file system events with debouncing
|
|
81
|
+
*/
|
|
82
|
+
private handleEvent;
|
|
83
|
+
/**
|
|
84
|
+
* Check if a path should be ignored (for the ignored option passed to chokidar)
|
|
85
|
+
*/
|
|
86
|
+
private shouldIgnore;
|
|
87
|
+
/**
|
|
88
|
+
* Check if an event should be skipped (for internal filtering)
|
|
89
|
+
*/
|
|
90
|
+
private shouldSkipEvent;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Create a debounced batch watcher that collects multiple changes
|
|
94
|
+
* and emits them as a batch after a delay
|
|
95
|
+
*/
|
|
96
|
+
export declare class BatchFileWatcher extends FileWatcher {
|
|
97
|
+
private batchTimer;
|
|
98
|
+
private batchedChanges;
|
|
99
|
+
private batchDelayMs;
|
|
100
|
+
constructor(options?: WatcherOptions & {
|
|
101
|
+
batchDelayMs?: number;
|
|
102
|
+
});
|
|
103
|
+
private scheduleBatchEmit;
|
|
104
|
+
/**
|
|
105
|
+
* Get current batch
|
|
106
|
+
*/
|
|
107
|
+
getCurrentBatch(): FileChangeEvent[];
|
|
108
|
+
/**
|
|
109
|
+
* Force emit current batch immediately
|
|
110
|
+
*/
|
|
111
|
+
flushBatch(): FileChangeEvent[];
|
|
112
|
+
stop(): Promise<void>;
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=watcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watcher.d.ts","sourceRoot":"","sources":["../../src/sync/watcher.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAGtC,MAAM,WAAW,cAAc;IAC7B,oDAAoD;IACpD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yCAAyC;IACzC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,4DAA4D;IAC5D,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,0DAA0D;IAC1D,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,oEAAoE;IACpE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,4CAA4C;IAC5C,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,KAAK,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,OAAO,CAAC;IACpB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,IAAI,GAAG,IAAI,CAAC;CAC5B;AAGD,qBAAa,WAAY,SAAQ,YAAY;IAC3C,OAAO,CAAC,QAAQ,CAAqC;IACrD,OAAO,CAAC,cAAc,CAA2C;IACjE,OAAO,CAAC,cAAc,CAA0C;IAChE,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,cAAc,CAAW;IACjC,OAAO,CAAC,cAAc,CAAgC;IACtD,OAAO,CAAC,aAAa,CAAU;IAC/B,OAAO,CAAC,UAAU,CAAU;IAC5B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,KAAK,CAAqB;IAClC,OAAO,CAAC,OAAO,CAAmC;IAClD,OAAO,CAAC,aAAa,CAAqB;IAC1C,OAAO,CAAC,SAAS,CAAkB;gBAEvB,OAAO,GAAE,cAAmB;IAuBxC;;OAEG;IACH,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IA8C9B;;OAEG;IACH,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI;IAMpC;;OAEG;IACG,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA0B/C;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAoB3B;;OAEG;IACH,SAAS,IAAI,aAAa;IAS1B;;OAEG;IACH,mBAAmB,IAAI,OAAO;IAK9B;;OAEG;IACH,mBAAmB,IAAI,eAAe,EAAE;IAaxC;;OAEG;IACH,eAAe,IAAI,MAAM;IAIzB;;OAEG;IACH,OAAO,CAAC,WAAW;IAqDnB;;OAEG;IACH,OAAO,CAAC,YAAY;IAYpB;;OAEG;IACH,OAAO,CAAC,eAAe;CAYxB;AAED;;;GAGG;AACH,qBAAa,gBAAiB,SAAQ,WAAW;IAC/C,OAAO,CAAC,UAAU,CAA+B;IACjD,OAAO,CAAC,cAAc,CAA2C;IACjE,OAAO,CAAC,YAAY,CAAS;gBAEjB,OAAO,GAAE,cAAc,GAAG;QAAE,YAAY,CAAC,EAAE,MAAM,CAAA;KAAO;IAYpE,OAAO,CAAC,iBAAiB;IAgBzB;;OAEG;IACH,eAAe,IAAI,eAAe,EAAE;IAIpC;;OAEG;IACH,UAAU,IAAI,eAAe,EAAE;IAWzB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAU5B"}
|