export type WebSocketMessage = string | Buffer;
export interface SendOptions {
    compress?: boolean;
}

export interface SocketAddress {
    remotePort: number;
    remoteAddress: string;
    remoteFamily: string;
}

export class WebSocket {
    constructor(external: any, compressEnabled?: boolean, compressThreshold?: number);
    external: any;
    readonly CONNECTING: number;
    readonly OPEN: number;
    readonly CLOSING: number;
    readonly CLOSED: number;
    readyState: number;
    compressEnabled: boolean;
    compressThreshold: number;
    internalOnMessage: (message: WebSocketMessage, isBinary: boolean) => void;
    internalOnClose: (code: number, message: string) => void;
    on(eventName: string, listener: (...args: any[]) => void): this;
    once(eventName: string, listener: (...args: any[]) => void): this;
    removeListener(eventName: string, listener: (...args: any[]) => void): this;
    readonly _socket: SocketAddress;
    send(message: string | Buffer | ArrayBuffer | ArrayBufferView, cb?: (err?: Error) => void): void;
    send(message: string | Buffer | ArrayBuffer | ArrayBufferView, options: SendOptions | null, cb?: (err?: Error) => void): void;
    close(code?: number, data?: string | Buffer | ArrayBuffer | ArrayBufferView): void;
}

export class Server {
    constructor(options: any);
    serverGroup: any;
    _pendingUpgradeCallbacks: Array<(socket: WebSocket) => void>;
    _noDelay: any;
    _compressEnabled: boolean;
    _compressThreshold: number;
    handleUpgrade(request: any, socket: any, upgradeHead: any, callback: (socket: WebSocket) => void): any;
    close(): void;
}

export const native: any;
export let compressThreshold: number;
export let PERMESSAGE_DEFLATE: number;
export let SERVER_NO_CONTEXT_TAKEOVER: number;
export let CLIENT_NO_CONTEXT_TAKEOVER: number;
export let SLIDING_DEFLATE_WINDOW: number;
export let CONNECTING: number;
export let OPCODE_TEXT: number;
export let OPCODE_BINARY: number;
export let OPCODE_PING: number;
export let OPEN: number;
export let CLOSING: number;
export let CLOSED: number;
