Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/platform/files/node/watcher/watcher.ts
3296 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
6
import { Disposable } from '../../../../base/common/lifecycle.js';
7
import { ILogMessage, isRecursiveWatchRequest, IUniversalWatcher, IUniversalWatchRequest } from '../../common/watcher.js';
8
import { Emitter, Event } from '../../../../base/common/event.js';
9
import { ParcelWatcher } from './parcel/parcelWatcher.js';
10
import { NodeJSWatcher } from './nodejs/nodejsWatcher.js';
11
import { Promises } from '../../../../base/common/async.js';
12
import { computeStats } from './watcherStats.js';
13
14
export class UniversalWatcher extends Disposable implements IUniversalWatcher {
15
16
private readonly recursiveWatcher = this._register(new ParcelWatcher());
17
private readonly nonRecursiveWatcher = this._register(new NodeJSWatcher(this.recursiveWatcher));
18
19
readonly onDidChangeFile = Event.any(this.recursiveWatcher.onDidChangeFile, this.nonRecursiveWatcher.onDidChangeFile);
20
readonly onDidError = Event.any(this.recursiveWatcher.onDidError, this.nonRecursiveWatcher.onDidError);
21
22
private readonly _onDidLogMessage = this._register(new Emitter<ILogMessage>());
23
readonly onDidLogMessage = Event.any(this._onDidLogMessage.event, this.recursiveWatcher.onDidLogMessage, this.nonRecursiveWatcher.onDidLogMessage);
24
25
private requests: IUniversalWatchRequest[] = [];
26
private failedRecursiveRequests = 0;
27
28
constructor() {
29
super();
30
31
this._register(this.recursiveWatcher.onDidError(e => {
32
if (e.request) {
33
this.failedRecursiveRequests++;
34
}
35
}));
36
}
37
38
async watch(requests: IUniversalWatchRequest[]): Promise<void> {
39
this.requests = requests;
40
this.failedRecursiveRequests = 0;
41
42
// Watch recursively first to give recursive watchers a chance
43
// to step in for non-recursive watch requests, thus reducing
44
// watcher duplication.
45
46
let error: Error | undefined;
47
try {
48
await this.recursiveWatcher.watch(requests.filter(request => isRecursiveWatchRequest(request)));
49
} catch (e) {
50
error = e;
51
}
52
53
try {
54
await this.nonRecursiveWatcher.watch(requests.filter(request => !isRecursiveWatchRequest(request)));
55
} catch (e) {
56
if (!error) {
57
error = e;
58
}
59
}
60
61
if (error) {
62
throw error;
63
}
64
}
65
66
async setVerboseLogging(enabled: boolean): Promise<void> {
67
68
// Log stats
69
if (enabled && this.requests.length > 0) {
70
this._onDidLogMessage.fire({ type: 'trace', message: computeStats(this.requests, this.failedRecursiveRequests, this.recursiveWatcher, this.nonRecursiveWatcher) });
71
}
72
73
// Forward to watchers
74
await Promises.settled([
75
this.recursiveWatcher.setVerboseLogging(enabled),
76
this.nonRecursiveWatcher.setVerboseLogging(enabled)
77
]);
78
}
79
80
async stop(): Promise<void> {
81
await Promises.settled([
82
this.recursiveWatcher.stop(),
83
this.nonRecursiveWatcher.stop()
84
]);
85
}
86
}
87
88