UNPKG

@microsoft/dev-tunnels-connections

Version:

Tunnels library for Visual Studio tools

108 lines 3.63 kB
"use strict"; // Copyright (c) Microsoft Corporation. // Licensed under the MIT license. Object.defineProperty(exports, "__esModule", { value: true }); exports.TrackingEmitter = exports.withCancellation = exports.getError = exports.getErrorMessage = exports.delay = exports.List = void 0; const dev_tunnels_ssh_1 = require("@microsoft/dev-tunnels-ssh"); const vscode_jsonrpc_1 = require("vscode-jsonrpc"); class List { static groupBy(list, keyGetter) { const map = new Map(); list.forEach((item) => { const key = keyGetter(item); const collection = map.get(key); if (!collection) { map.set(key, [item]); } else { collection.push(item); } }); return map; } } exports.List = List; /** * Resolves the promise after {@link milliseconds} have passed, or reject if {@link cancellation} is canceled. */ function delay(milliseconds, cancellation) { return new Promise((resolve, reject) => { let cancellationDisposable; let timeout = undefined; if (cancellation) { if (cancellation.isCancellationRequested) { reject(new dev_tunnels_ssh_1.CancellationError()); return; } cancellationDisposable = cancellation.onCancellationRequested(() => { if (timeout) { clearTimeout(timeout); } cancellationDisposable === null || cancellationDisposable === void 0 ? void 0 : cancellationDisposable.dispose(); reject(new dev_tunnels_ssh_1.CancellationError()); }); } timeout = setTimeout(() => { cancellationDisposable === null || cancellationDisposable === void 0 ? void 0 : cancellationDisposable.dispose(); resolve(); }, milliseconds); }); } exports.delay = delay; /** * Gets the error message. */ function getErrorMessage(e) { var _a; return String((_a = e === null || e === void 0 ? void 0 : e.message) !== null && _a !== void 0 ? _a : e); } exports.getErrorMessage = getErrorMessage; /** * Wraps e in Error object if e is not Error. If e is Error, returns e as is. */ function getError(e, messagePrefix) { return e instanceof Error ? e : new Error(`${messagePrefix !== null && messagePrefix !== void 0 ? messagePrefix : ''}${e}`); } exports.getError = getError; /** * Races a promise and cancellation. */ function withCancellation(promise, cancellation) { if (!cancellation) { return promise; } return Promise.race([ promise, new Promise((resolve, reject) => { if (cancellation.isCancellationRequested) { reject(new dev_tunnels_ssh_1.CancellationError()); } else { cancellation.onCancellationRequested(() => { reject(new dev_tunnels_ssh_1.CancellationError()); }); } }), ]); } exports.withCancellation = withCancellation; /** * Tracking event emitter. */ class TrackingEmitter extends vscode_jsonrpc_1.Emitter { constructor() { super({ onFirstListenerAdd: () => this.subscribed = true, onLastListenerRemove: () => this.subscribed = false, }); this.subscribed = false; } /** * A value indicating whether there event handlers subscribed to the event emitter. */ get isSubscribed() { return this.subscribed; } } exports.TrackingEmitter = TrackingEmitter; //# sourceMappingURL=utils.js.map