102
103
public watch(uri: URI, _opts: IWatchOptions): IDisposable {
105
>
const cap = server.capabilities.get();
106
>
if (cap !== undefined && !(cap & McpCapability.ResourcesSubscribe)) {
107
return Disposable.None;
108
}
110
>
server.start();
111
>
112
>
const store = new DisposableStore();
113
>
let watchedOnHandler: McpServerRequestHandler | undefined;
114
>
const watchListener = store.add(new MutableDisposable());
115
>
const callCts = store.add(new MutableDisposable<CancellationTokenSource>());
116
>
store.add(autorun(reader => {
117
>
const connection = server.connection.read(reader);
118
>
if (!connection) {
119
>
return;
120
>
}
121
>
122
>
const handler = connection.handler.read(reader);
123
>
if (!handler || watchedOnHandler === handler) {
124
>
return;
125
>
}
126
>
127
>
callCts.value?.dispose(true);
128
>
callCts.value = new CancellationTokenSource();
129
>
watchedOnHandler = handler;
130
>
131
>
const token = callCts.value.token;
132
>
handler.subscribe({ uri: resourceURI.toString() }, token).then(
133
>
() => {
134
>
if (!token.isCancellationRequested) {
135
>
watchListener.value = handler.onDidUpdateResource(e => {
136
>
if (equalsUrlPath(e.params.uri, resourceURI)) {
137
>
this._onDidChangeFile.fire([{ resource: uri, type: FileChangeType.UPDATED }]);
138
>
}
139
>
});
140
>
}
141
>
}, err => {
142
handler.logger.warn(`Failed to subscribe to resource changes for ${resourceURI}: ${err}`);
143
watchedOnHandler = undefined;
144
},
146
>
}));
147
>
148
>
return store;
149
>
}
150
151
public async stat(resource: URI): Promise<IStat> {