/// <reference types="@types/node/tls" />
/// <reference types="@types/node/events" />
import { EventEmitter } from 'events'
import tls from 'tls'
import { AppConnection } from './SocketConnect'
import { socketControl } from './SocketControl'
export declare namespace SocketApp {
  interface ProtocolCallback {
    (conn: AppConnection, protocols?: string[]): string | undefined
  }
  type Options = tls.TlsOptions & {
    secure?: boolean
    debugger?: boolean
  } & (
      | {
          selectProtocol: ProtocolCallback
        }
      | {
          validProtocols: string[]
        }
      | {}
    )
  type ConnectCallback<Data = any> = (
    data: Data,
    conn: AppConnection,
    next: () => void
  ) => void
  type SocketCallBack = (conn: AppConnection) => void
  interface ControlOptions
    extends Record<'default', Record<string, Record<string, any>>> {}
  type Roles = keyof ControlOptions & string
  type StoreNames<Role extends Roles> = keyof ControlOptions[Role] & string
  type Store<
    Role extends Roles,
    Name extends StoreNames<Role>
  > = ControlOptions[Role][Name] & Record<string, any>
  interface ConnectionExtraParams {
    keepRole?: () => void
  }
}
export declare class SocketApp extends EventEmitter {
  private readonly socket
  constructor(secure: boolean, options?: SocketApp.Options)
  _selectProtocol?: SocketApp.ProtocolCallback
  listen(port: number, callback?: () => void): void
  listen(port: number, host: string, callback?: () => void): void
  close(callback?: () => void): void
  private signs
  sign<Data = any>(
    sign: string,
    ...cbs: SocketApp.ConnectCallback<Data>[]
  ): this
  control: typeof socketControl
}
