Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/extensions/copilot/src/util/node/ports.ts
13397 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 * as net from 'net';
7
import { CancellationToken } from '../vs/base/common/cancellation';
8
9
function dispose(socket: net.Socket): void {
10
try {
11
socket.removeAllListeners('connect');
12
socket.removeAllListeners('error');
13
socket.end();
14
socket.destroy();
15
socket.unref();
16
} catch (error) {
17
console.error(error); // otherwise this error would get lost in the callback chain
18
}
19
}
20
21
export async function waitForListenerOnPort(port: number, host: string | undefined, token: CancellationToken) {
22
while (!token.isCancellationRequested) {
23
try {
24
await new Promise<void>((resolve, reject) => {
25
const socket = new net.Socket();
26
const cleanup = () => {
27
clearTimeout(t);
28
dispose(socket);
29
};
30
socket.once('connect', () => {
31
cleanup();
32
resolve();
33
});
34
socket.once('error', (err) => {
35
cleanup();
36
reject(err);
37
});
38
const t = setTimeout(() => {
39
cleanup();
40
reject(new Error(`Timeout waiting for port ${port}`));
41
}, 1000);
42
socket.connect(port, host ?? '127.0.0.1');
43
});
44
return; // Successfully connected
45
} catch {
46
// Ignore errors and retry
47
await new Promise(resolve => setTimeout(resolve, 100)); // Wait before retrying
48
}
49
}
50
51
throw new Error(`Cancelled or unable to connect to port ${port}`);
52
}
53
54