mirror of
https://github.com/microsoft/vscode.git
synced 2026-04-26 11:38:51 +01:00
* forwarding: add built-in tunnel forwarding extension - Support public/private ports, which accounts for most of the work in the CLI. Previously ports were only privat. - Make the extension built-in. Ported from the remote-containers extension with some tweaks for privacy and durability. - This also removes the opt-in flag, by not reimplementing it 😛 Fixes https://github.com/microsoft/vscode/issues/189677 Fixes https://github.com/microsoft/vscode/issues/189678 * fixup! comments --------- Co-authored-by: Raymond Zhao <7199958+rzhao271@users.noreply.github.com>
63 lines
1.6 KiB
TypeScript
63 lines
1.6 KiB
TypeScript
/*---------------------------------------------------------------------------------------------
|
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
* Licensed under the MIT License. See License.txt in the project root for license information.
|
|
*--------------------------------------------------------------------------------------------*/
|
|
|
|
export type ValueCallback<T = unknown> = (value: T | Promise<T>) => void;
|
|
|
|
const enum DeferredOutcome {
|
|
Resolved,
|
|
Rejected
|
|
}
|
|
|
|
/**
|
|
* Copied from src\vs\base\common\async.ts
|
|
*/
|
|
export class DeferredPromise<T> {
|
|
|
|
private completeCallback!: ValueCallback<T>;
|
|
private errorCallback!: (err: unknown) => void;
|
|
private outcome?: { outcome: DeferredOutcome.Rejected; value: any } | { outcome: DeferredOutcome.Resolved; value: T };
|
|
|
|
public get isRejected() {
|
|
return this.outcome?.outcome === DeferredOutcome.Rejected;
|
|
}
|
|
|
|
public get isResolved() {
|
|
return this.outcome?.outcome === DeferredOutcome.Resolved;
|
|
}
|
|
|
|
public get isSettled() {
|
|
return !!this.outcome;
|
|
}
|
|
|
|
public get value() {
|
|
return this.outcome?.outcome === DeferredOutcome.Resolved ? this.outcome?.value : undefined;
|
|
}
|
|
|
|
public readonly p: Promise<T>;
|
|
|
|
constructor() {
|
|
this.p = new Promise<T>((c, e) => {
|
|
this.completeCallback = c;
|
|
this.errorCallback = e;
|
|
});
|
|
}
|
|
|
|
public complete(value: T) {
|
|
return new Promise<void>(resolve => {
|
|
this.completeCallback(value);
|
|
this.outcome = { outcome: DeferredOutcome.Resolved, value };
|
|
resolve();
|
|
});
|
|
}
|
|
|
|
public error(err: unknown) {
|
|
return new Promise<void>(resolve => {
|
|
this.errorCallback(err);
|
|
this.outcome = { outcome: DeferredOutcome.Rejected, value: err };
|
|
resolve();
|
|
});
|
|
}
|
|
}
|