/********************************************************************************
 * Copyright (c) 2020-2023 EclipseSource and others.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0 which is available at
 * http://www.eclipse.org/legal/epl-2.0.
 *
 * This Source Code may also be made available under the following Secondary
 * Licenses when the conditions for such availability set forth in the Eclipse
 * Public License v. 2.0 are satisfied: GNU General Public License, version 2
 * with the GNU Classpath Exception which is available at
 * https://www.gnu.org/software/classpath/license.html.
 *
 * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
 ********************************************************************************/
import { Channel, Disposable, MaybePromise } from '@theia/core';
import { Deferred } from '@theia/core/lib/common/promise-util';
import { RawProcess } from '@theia/process/lib/node/raw-process';
import * as net from 'net';
import { WebSocket } from 'ws';
import { WebSocketConnectionInfo } from '../common';
import { BaseGLSPServerContribution, GLSPServerContributionOptions } from './glsp-server-contribution';
/**
 * Message that is expected to be printed by the embedded server process to the stdout once the
 * server process startup routine has been completed and is ready to accept incoming connections.
 */
export declare const START_UP_COMPLETE_MSG = "[GLSP-Server]:Startup completed";
export interface GLSPSocketServerContributionOptions extends GLSPServerContributionOptions {
    /**
     * Path to the location of the server executable that should be launched as process
     * Has to be either be a *.jar (Java) or *.js (Node ) file.
     */
    executable?: string;
    /** Socket connection options for new client connections */
    socketConnectionOptions: SocketConnectionOptions;
    /** Additional arguments that should be passed when starting the server process. */
    additionalArgs?: string[];
}
export type SocketConnectionOptions = net.TcpSocketConnectOpts | WebSocketConnectionInfo;
export declare namespace GLSPSocketServerContributionOptions {
    /** Default values for {@link JavaGLSPServerLaunchOptions }**/
    function createDefaultOptions(): GLSPSocketServerContributionOptions;
    /**
     * Utility function to partially set the launch options. Default values (from 'defaultOptions') are used for
     * options that are not specified.
     * @param options (partial) launch options that should be extended with default values (if necessary)
     */
    function configure(options?: Partial<GLSPSocketServerContributionOptions>): GLSPSocketServerContributionOptions;
}
/**
 *  A reusable base implementation for {@link GLSPServerContribution}s that are using a socket connection to communicate
 *  with a Java or Node based GLSP server.
 **/
export declare abstract class GLSPSocketServerContribution extends BaseGLSPServerContribution {
    options: GLSPSocketServerContributionOptions;
    protected onReadyDeferred: Deferred<void>;
    protected initialize(): void;
    abstract createContributionOptions(): Partial<GLSPSocketServerContributionOptions>;
    doConnect(clientChannel: Channel): MaybePromise<Disposable>;
    launch(): Promise<void>;
    protected getPortFromStartupMessage(message: string): number | undefined;
    protected launchJavaProcess(): Promise<RawProcess>;
    protected getJavaProcessJvmArgs(): string[];
    protected launchNodeProcess(): Promise<RawProcess>;
    protected processLogInfo(line: string): void;
    protected useWebSocket(): boolean;
    protected checkServerPort(): void;
    protected connectToSocketServer(clientChannel: Channel): Promise<Disposable>;
    protected forwardToSocketConnection(clientChannel: Channel, socket: net.Socket): Disposable;
    protected connectToWebSocketServer(clientChannel: Channel, webSocketAddress: string | undefined): Promise<Disposable>;
    protected forwardToWebSocketConnection(clientChannel: Channel, webSocket: WebSocket): Disposable;
}
/**
 * Utility function to parse a server port that is defined via command line arg.
 * @param argsKey Name/Key of the commandLine arg
 * @param defaultPort Default port that should be returned if no (valid) port was passed via CLI#
 * @returns the path value of the given argument if set, default value or `NaN` instead.
 */
export declare function getPort(argsKey: string, defaultPort?: number): number;
/**
 * Utility function to parse the WebSocket Server path if the GLSP Server should be started in WebSocket mode.#
 * @param argsKey Name/Key of the commandLine arg
 * @param defaultPath Default path that should be returned if no path was passed via CLI
 * @returns the path value of the given argument if set, default value or `undefined` instead.
 */
export declare function getWebSocketPath(argsKey: string, defaultPath?: string): string | undefined;
//# sourceMappingURL=glsp-socket-server-contribution.d.ts.map