UNPKG

@sussudio/platform

Version:

Internal APIs for VS Code's service injection the base services.

236 lines (234 loc) 8.14 kB
/*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ import { CancelablePromise } from '@sussudio/base/common/async.mjs'; import { CancellationToken } from '@sussudio/base/common/cancellation.mjs'; import { Disposable } from '@sussudio/base/common/lifecycle.mjs'; import { IIPCLogger } from '@sussudio/base/parts/ipc/common/ipc.mjs'; import { Client, ConnectionHealth, ISocket, PersistentProtocol } from '@sussudio/base/parts/ipc/common/ipc.net.mjs'; import { ILogService } from '../../log/common/log.mjs'; import { RemoteAgentConnectionContext } from './remoteAgentEnvironment.mjs'; import { ISignService } from '../../sign/common/sign.mjs'; export declare const enum ConnectionType { Management = 1, ExtensionHost = 2, Tunnel = 3, } export interface AuthRequest { type: 'auth'; auth: string; data: string; } export interface SignRequest { type: 'sign'; data: string; signedData: string; } export interface ConnectionTypeRequest { type: 'connectionType'; commit?: string; signedData: string; desiredConnectionType?: ConnectionType; args?: any; } export interface ErrorMessage { type: 'error'; reason: string; } export interface OKMessage { type: 'ok'; } export type HandshakeMessage = AuthRequest | SignRequest | ConnectionTypeRequest | ErrorMessage | OKMessage; interface ISimpleConnectionOptions { commit: string | undefined; quality: string | undefined; host: string; port: number; connectionToken: string | undefined; reconnectionToken: string; reconnectionProtocol: PersistentProtocol | null; socketFactory: ISocketFactory; signService: ISignService; logService: ILogService; } export interface IConnectCallback { (err: any | undefined, socket: ISocket | undefined): void; } export interface ISocketFactory { connect( host: string, port: number, path: string, query: string, debugLabel: string, callback: IConnectCallback, ): void; } export interface IRemoteExtensionHostStartParams { language: string; debugId?: string; break?: boolean; port?: number | null; env?: { [key: string]: string | null; }; } export interface ITunnelConnectionStartParams { host: string; port: number; } export interface IConnectionOptions { commit: string | undefined; quality: string | undefined; socketFactory: ISocketFactory; addressProvider: IAddressProvider; signService: ISignService; logService: ILogService; ipcLogger: IIPCLogger | null; } export interface IAddress { host: string; port: number; connectionToken: string | undefined; } export interface IAddressProvider { getAddress(): Promise<IAddress>; } export declare function connectRemoteAgentManagement( options: IConnectionOptions, remoteAuthority: string, clientId: string, ): Promise<ManagementPersistentConnection>; export declare function connectRemoteAgentExtensionHost( options: IConnectionOptions, startArguments: IRemoteExtensionHostStartParams, ): Promise<ExtensionHostPersistentConnection>; export declare function connectRemoteAgentTunnel( options: IConnectionOptions, tunnelRemoteHost: string, tunnelRemotePort: number, ): Promise<PersistentProtocol>; export declare const enum PersistentConnectionEventType { ConnectionLost = 0, ReconnectionWait = 1, ReconnectionRunning = 2, ReconnectionPermanentFailure = 3, ConnectionGain = 4, ConnectionHealthChanged = 5, } export declare class ConnectionLostEvent { readonly reconnectionToken: string; readonly millisSinceLastIncomingData: number; readonly type = PersistentConnectionEventType.ConnectionLost; constructor(reconnectionToken: string, millisSinceLastIncomingData: number); } export declare class ReconnectionWaitEvent { readonly reconnectionToken: string; readonly millisSinceLastIncomingData: number; readonly durationSeconds: number; private readonly cancellableTimer; readonly type = PersistentConnectionEventType.ReconnectionWait; constructor( reconnectionToken: string, millisSinceLastIncomingData: number, durationSeconds: number, cancellableTimer: CancelablePromise<void>, ); skipWait(): void; } export declare class ReconnectionRunningEvent { readonly reconnectionToken: string; readonly millisSinceLastIncomingData: number; readonly attempt: number; readonly type = PersistentConnectionEventType.ReconnectionRunning; constructor(reconnectionToken: string, millisSinceLastIncomingData: number, attempt: number); } export declare class ConnectionGainEvent { readonly reconnectionToken: string; readonly millisSinceLastIncomingData: number; readonly attempt: number; readonly type = PersistentConnectionEventType.ConnectionGain; constructor(reconnectionToken: string, millisSinceLastIncomingData: number, attempt: number); } export declare class ConnectionHealthChangedEvent { readonly reconnectionToken: string; readonly connectionHealth: ConnectionHealth; readonly type = PersistentConnectionEventType.ConnectionHealthChanged; constructor(reconnectionToken: string, connectionHealth: ConnectionHealth); } export declare class ReconnectionPermanentFailureEvent { readonly reconnectionToken: string; readonly millisSinceLastIncomingData: number; readonly attempt: number; readonly handled: boolean; readonly type = PersistentConnectionEventType.ReconnectionPermanentFailure; constructor(reconnectionToken: string, millisSinceLastIncomingData: number, attempt: number, handled: boolean); } export type PersistentConnectionEvent = | ConnectionGainEvent | ConnectionHealthChangedEvent | ConnectionLostEvent | ReconnectionWaitEvent | ReconnectionRunningEvent | ReconnectionPermanentFailureEvent; export declare abstract class PersistentConnection extends Disposable { private readonly _connectionType; protected readonly _options: IConnectionOptions; readonly reconnectionToken: string; readonly protocol: PersistentProtocol; private readonly _reconnectionFailureIsFatal; static triggerPermanentFailure(millisSinceLastIncomingData: number, attempt: number, handled: boolean): void; static debugTriggerReconnection(): void; static debugPauseSocketWriting(): void; private static _permanentFailure; private static _permanentFailureMillisSinceLastIncomingData; private static _permanentFailureAttempt; private static _permanentFailureHandled; private static _instances; private readonly _onDidStateChange; readonly onDidStateChange: import('@sussudio/base/common/event.mjs').Event<PersistentConnectionEvent>; private _permanentFailure; private get _isPermanentFailure(); private _isReconnecting; constructor( _connectionType: ConnectionType, _options: IConnectionOptions, reconnectionToken: string, protocol: PersistentProtocol, _reconnectionFailureIsFatal: boolean, ); private _beginReconnecting; private _runReconnectingLoop; private _onReconnectionPermanentFailure; private _gotoPermanentFailure; private _pauseSocketWriting; protected abstract _reconnect( options: ISimpleConnectionOptions, timeoutCancellationToken: CancellationToken, ): Promise<void>; } export declare class ManagementPersistentConnection extends PersistentConnection { readonly client: Client<RemoteAgentConnectionContext>; constructor( options: IConnectionOptions, remoteAuthority: string, clientId: string, reconnectionToken: string, protocol: PersistentProtocol, ); protected _reconnect(options: ISimpleConnectionOptions, timeoutCancellationToken: CancellationToken): Promise<void>; } export declare class ExtensionHostPersistentConnection extends PersistentConnection { private readonly _startArguments; readonly debugPort: number | undefined; constructor( options: IConnectionOptions, startArguments: IRemoteExtensionHostStartParams, reconnectionToken: string, protocol: PersistentProtocol, debugPort: number | undefined, ); protected _reconnect(options: ISimpleConnectionOptions, timeoutCancellationToken: CancellationToken): Promise<void>; } export {};