import { Application, Binding, BindingFilter, Constructor, Context } from '@loopback/core';
import cors from 'cors';
import { Server, ServerOptions, Socket } from 'socket.io';
import { SocketIoMetadata } from './decorators';
export type SockIOMiddleware = (socket: Socket, fn: (err?: any) => void) => void;
export declare const getNamespaceKeyForName: (name: string) => string;
/**
 * A binding filter to match socket.io controllers
 * @param binding - Binding object
 */
export declare const socketIoControllers: BindingFilter;
export interface SocketIoServerOptions {
    httpServerOptions?: HttpServerResolvedOptions;
    socketIoOptions?: ServerOptions;
}
/**
 * A socketio server
 */
export declare class SocketIoServer extends Context {
    app: Application;
    protected options: SocketIoServerOptions;
    private controllers;
    private httpServer;
    private readonly io;
    readonly config: HttpServerResolvedOptions;
    constructor(app: Application, options?: SocketIoServerOptions);
    get listening(): boolean;
    /**
     * Register a sock.io middleware function
     * @param fn
     */
    use(fn: SockIOMiddleware): Server<import("socket.io").DefaultEventsMap, import("socket.io").DefaultEventsMap, import("socket.io").DefaultEventsMap, any>;
    get url(): string;
    /**
     * Register a socketio controller
     * @param controllerClass
     * @param meta
     */
    route(controllerClass: Constructor<object>, meta?: SocketIoMetadata | string | RegExp): Server<import("socket.io").DefaultEventsMap, import("socket.io").DefaultEventsMap, import("socket.io").DefaultEventsMap, any> | import("socket.io").Namespace<import("socket.io").DefaultEventsMap, import("socket.io").DefaultEventsMap, import("socket.io").DefaultEventsMap, any>;
    /**
     * Create socket handler from the controller class
     * @param controllerClass
     */
    private createSocketHandler;
    /**
     * Register a socket.io controller
     * @param controllerClass
     */
    controller(controllerClass: Constructor<unknown>): Binding<unknown>;
    /**
     * Discover all socket.io controllers and register routes
     */
    discoverAndRegister(): void;
    /**
     * Start the socketio server
     */
    start(): Promise<void>;
    /**
     * Stop the socketio server
     */
    stop(): Promise<void>;
}
/**
 * Valid configuration for the HttpServer constructor.
 */
export interface HttpServerResolvedOptions {
    host?: string;
    port: number;
    path?: string;
    basePath?: string;
    cors: cors.CorsOptions;
}
