/// <reference types="node" />
/// <reference types="node" />
import { ClientOptions } from 'ws';
import { Response } from './Response';
import { StructuredMessage } from './StructuredMessage';
import { EventEmitter } from 'events';
import { ClientRequestArgs } from 'http';
import { MessageDelayer } from './message-delayer/MessageDelayer';
export interface WebMessengerSession extends EventEmitter {
    /**
     * The Web Messenger server can sometimes return responses out of order. To cater for this
     * we have to have a delay after every message is received before passing it to any listeners
     * of the implementation. This delay hopefully provides enough time for any messages that should
     * have preceded the other to be received and ordered.
     *
     * This delay should be taken into account for any timeout values of downstream functionality.
     */
    get messageDelayInMs(): number;
    sendText(message: string): void;
    close(): void;
}
export interface SessionConfig {
    readonly deploymentId: string;
    readonly region: string;
    readonly origin?: string | undefined;
}
export declare function isStructuredMessage(message: Response<unknown>): message is StructuredMessage;
/**
 * @see https://developer.genesys.cloud/api/digital/webmessaging/websocketapi#configure-a-guest-session
 */
export declare class WebMessengerGuestSession extends EventEmitter {
    private readonly config;
    private readonly participantData;
    private readonly messageDelayer;
    readonly wsFactory: (url: string, options?: ClientOptions | ClientRequestArgs) => import("ws");
    private static readonly debugger;
    private readonly sessionToken;
    private readonly ws;
    constructor(config: SessionConfig, participantData?: Record<string, string>, messageDelayer?: MessageDelayer, wsFactory?: (url: string, options?: ClientOptions | ClientRequestArgs) => import("ws"));
    get messageDelayInMs(): number;
    private connected;
    private processMessage;
    private messageReceived;
    sendText(message: string): void;
    close(): void;
}
