/// <reference types="express" />
/// <reference types="node" />
/// <reference types="ws" />
import * as express from 'express';
import { Server as HttpServer } from 'http';
import * as WebSocket from 'ws';
import { Handle } from '@dojo/core/interfaces';
import Node from './executors/Node';
import { Message } from './channels/Base';
export interface Context {
    readonly stopped: boolean;
    readonly basePath: string;
    readonly executor: Node;
    handleMessage(message: Message): Promise<any>;
}
export default class Server implements ServerProperties {
    readonly executor: Node;
    basePath: string;
    port: number;
    runInSync: boolean;
    socketPort: number;
    readonly stopped: boolean;
    protected _app: express.Express | undefined;
    protected _httpServer: HttpServer | undefined;
    protected _sessions: {
        [id: string]: {
            listeners: ServerListener[];
        };
    } | undefined;
    protected _wsServer: WebSocket.Server | undefined;
    constructor(options: ServerOptions);
    start(): Promise<void>;
    stop(): Promise<any[]>;
    subscribe(sessionId: string, listener: ServerListener): Handle;
    private _getSession(sessionId);
    private _handleMessage(message);
    private _handleWebSocket(client);
    private _publish(message);
}
export interface ServerProperties {
    basePath: string;
    executor: Node;
    port: number;
    runInSync: boolean;
    socketPort: number;
}
export interface ServerListener {
    (name: string, data?: any): void;
}
export declare type ServerOptions = Partial<ServerProperties> & {
    executor: Node;
};
