import { AxiosRequestConfig } from "axios";
export declare const ClientCredentialsGrant: (scopes?: string[]) => OAuthGrant;
/** Representa um par de tokens */
export interface Token {
    accessToken: string;
    refreshToken: string;
    expires: number;
}
/** Configurações do cliente */
export interface OAuthClientOptions {
    tokenUrl: string;
    clientId: string;
    clientSecret: string;
    storage?: OAuthStorage;
}
/** Interface para estratégia de armazenamento de tokens */
export interface OAuthStorage {
    get(): Promise<Token>;
    save(token: Token): Promise<Token>;
    clear(): Promise<void>;
}
/** Interface de função para requisição de grantTypes customizados */
export declare type OAuthGrant = (request: AxiosRequestConfig, options?: OAuthClientOptions) => AxiosRequestConfig;
/**
 * Obtém um token utilizando login e senha
 * @param username nome de usuário
 * @param password senha
 * @param scopes escopos do token
 */
export declare function PasswordGrant(username: string, password: string, scopes?: string[]): OAuthGrant;
/**
 * Obtém um novo token de acesso utilizando um token de atualização
 * @param refreshToken token de atualização
 */
export declare function RefreshTokenGrant(refreshToken: string): OAuthGrant;
/**
 * Obtém um novo ticket para conexão com o Socket.io
 * @param accessToken token de acesso
 */
export declare function TicketGrant(accessToken: string): OAuthGrant;
interface TokenPayload {
    sub: string;
    exp: number;
}
/**
 * Cria um cliente OAuth para gerenciar tokens
 */
export declare class OAuthClient {
    readonly options: Required<OAuthClientOptions>;
    tokenRequest: Promise<any> | null;
    offset: number;
    delay: number;
    constructor(options: OAuthClientOptions);
    /**
     * Get current token from storage
     * @returns Access and refresh token
     */
    getToken(): Promise<Token>;
    getTokenPayload(): Promise<TokenPayload | null>;
    isTokenExpired(): Promise<boolean>;
    isAuthenticated(): Promise<boolean>;
    updateOffset(): Promise<number>;
    fetchOrRefreshAccessToken(): Promise<string | null>;
    /**
     * Obtém um novo token de acesso utilizando uma granType customizado
     * @param grantType Função de grantType
     */
    requestToken(grantType: OAuthGrant): Promise<Token>;
    /**
     * Obtém um novo token de acesso utilizando uma granType customizado e salva no storage
     * @param grantType Função de grantType
     */
    requestTokenAndSave(grant: OAuthGrant): Promise<Token>;
    /**
     * Faz login e salva os tokens
     * @param username Nome de usuário
     * @param password Senha
     * @param scopes Escopos do token
     */
    login(username: string, password: string, scopes?: string[]): Promise<Token>;
    /**
     * Revoga os tokens atuais e desconecta o usuário do socket
     */
    revoke(): Promise<void>;
    /**
     * Atualiza os tokens e salva
     */
    refreshAccessToken(): Promise<Token>;
}
export {};
