Path: blob/main/extensions/copilot/src/util/node/ports.ts
13397 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import * as net from 'net';6import { CancellationToken } from '../vs/base/common/cancellation';78function dispose(socket: net.Socket): void {9try {10socket.removeAllListeners('connect');11socket.removeAllListeners('error');12socket.end();13socket.destroy();14socket.unref();15} catch (error) {16console.error(error); // otherwise this error would get lost in the callback chain17}18}1920export async function waitForListenerOnPort(port: number, host: string | undefined, token: CancellationToken) {21while (!token.isCancellationRequested) {22try {23await new Promise<void>((resolve, reject) => {24const socket = new net.Socket();25const cleanup = () => {26clearTimeout(t);27dispose(socket);28};29socket.once('connect', () => {30cleanup();31resolve();32});33socket.once('error', (err) => {34cleanup();35reject(err);36});37const t = setTimeout(() => {38cleanup();39reject(new Error(`Timeout waiting for port ${port}`));40}, 1000);41socket.connect(port, host ?? '127.0.0.1');42});43return; // Successfully connected44} catch {45// Ignore errors and retry46await new Promise(resolve => setTimeout(resolve, 100)); // Wait before retrying47}48}4950throw new Error(`Cancelled or unable to connect to port ${port}`);51}525354