///
///
///
import * as HTTP2 from 'http2';
import type { Duplex, Readable } from 'stream';
import type { InLogContext } from '../@log/index.js';
import type { TunnelId, TunnelStreamId } from '../common.js';
import type { ListeningHost, Port } from '../x.js';
import type { RouteCandidate, Router } from './router/index.js';
export type TunnelServerOptions = {
alias?: string;
host?: ListeningHost;
port?: Port;
cert: string | Buffer;
key: string | Buffer;
password?: string;
};
export declare class TunnelServer {
readonly router: Router;
readonly server: HTTP2.Http2SecureServer;
readonly alias: string | undefined;
readonly password: string | undefined;
private tunnelMap;
private sessionToTunnelIdMap;
constructor(router: Router, { alias, host, port, cert, key, password, }: TunnelServerOptions);
connect(upperContext: InLogContext, route: RouteCandidate | undefined, host: string, port: number): Promise;
private handleTunnel;
private handleOutInStream;
private lastTunnelIdNumber;
private getNextTunnelId;
private getContext;
}
export type TunnelConnection = {
context: InLogContext;
resolve(outInStream: Readable): void;
};
export type Tunnel = {
id: TunnelId;
context: InLogContext;
remoteAddress: string;
tunnelStream: HTTP2.ServerHttp2Stream;
connectionMap: Map;
lastStreamIdNumber: number;
};