-
Notifications
You must be signed in to change notification settings - Fork 2.2k
/
file-watcher-sockets.ts
98 lines (86 loc) · 2.92 KB
/
file-watcher-sockets.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
import { Socket } from 'net';
import { ProjectGraph } from '../../../config/project-graph';
import { findAllProjectNodeDependencies } from '../../../utils/project-graph-utils';
import { PromisedBasedQueue } from '../../../utils/promised-based-queue';
import { currentProjectGraphCache } from '../project-graph-incremental-recomputation';
import { handleResult } from '../server';
import { getProjectsAndGlobalChanges } from './changed-projects';
const queue = new PromisedBasedQueue();
export let registeredFileWatcherSockets: {
socket: Socket;
config: {
watchProjects: string[] | 'all';
includeGlobalWorkspaceFiles: boolean;
includeDependentProjects: boolean;
};
}[] = [];
export function removeRegisteredFileWatcherSocket(socket: Socket) {
registeredFileWatcherSockets = registeredFileWatcherSockets.filter(
(watcher) => watcher.socket !== socket
);
}
export function hasRegisteredFileWatcherSockets() {
return registeredFileWatcherSockets.length > 0;
}
export function notifyFileWatcherSockets(
createdFiles: string[] | null,
updatedFiles: string[],
deletedFiles: string[]
) {
if (!hasRegisteredFileWatcherSockets()) {
return;
}
queue.sendToQueue(async () => {
const projectAndGlobalChanges = getProjectsAndGlobalChanges(
createdFiles,
updatedFiles,
deletedFiles
);
await Promise.all(
registeredFileWatcherSockets.map(({ socket, config }) => {
const changedProjects = [];
const changedFiles = [];
if (config.watchProjects === 'all') {
for (const [projectName, projectFiles] of Object.entries(
projectAndGlobalChanges.projects
)) {
changedProjects.push(projectName);
changedFiles.push(...projectFiles);
}
} else {
const watchedProjects = [...config.watchProjects];
if (config.includeDependentProjects) {
for (const project of watchedProjects) {
watchedProjects.push(
...findAllProjectNodeDependencies(
project,
currentProjectGraphCache as ProjectGraph
)
);
}
}
for (const watchedProject of new Set(watchedProjects)) {
if (!!projectAndGlobalChanges.projects[watchedProject]) {
changedProjects.push(watchedProject);
changedFiles.push(
...projectAndGlobalChanges.projects[watchedProject]
);
}
}
}
if (config.includeGlobalWorkspaceFiles) {
changedFiles.push(...projectAndGlobalChanges.globalFiles);
}
if (changedProjects.length > 0 || changedFiles.length > 0) {
return handleResult(socket, {
description: 'File watch changed',
response: JSON.stringify({
changedProjects,
changedFiles,
}),
});
}
})
);
});
}