export type Options = {
    fetch: typeof fetch;
    endpoint: string;
    asPopup: boolean;
    redirectUri: string;
    store: typeof localStorage;
    scope: string;
};
export interface WxrUser {
    id: number;
    uname: string;
    email?: string;
}
export declare class OAuthClient extends EventTarget {
    readonly clientId: string;
    static USER_CANCELED_AUTH_ERROR: string;
    static USER_DECLINED_AUTH_ERROR: string;
    static USER_MUST_LOGIN: string;
    private static dicc;
    static get: (clientId: any, options: any) => OAuthClient;
    private options;
    readonly instanceID: string;
    private _pkceCodeVerifier;
    private _token;
    private store;
    private _user;
    private _onTokenUpdated;
    private _isLoading;
    private _error;
    get onLogged(): import("./signal").ReadOnlySignal<WxrUser>;
    get onLoading(): import("./signal").ReadOnlySignal<boolean>;
    get onError(): import("./signal").ReadOnlySignal<string>;
    private get pkceCodeVerifier();
    private set pkceCodeVerifier(value);
    private set token(value);
    private get token();
    getRequestHeadersAsync(loginIfNeeded?: boolean): Promise<{
        Authorization: string;
    }>;
    getRequestHeadersSync(): {
        Authorization: string;
    };
    constructor(clientId: string, options?: Options);
    private setup;
    /**
     * Check if the querystring has a `code` param which means we landed here with an authorization code provided...
     * @returns true if we are logged.
     */
    private continueLoginFlow;
    /**
     * request an access token using this authorization code.
     */
    private onAuthorizationCode;
    /**
     * Will activate in case the login opens a popup window and the popup will send us a message after login or error.
     */
    private onWindowMessage;
    /**
    * @see https://github.com/node-oauth/node-oauth2-server/blob/6a1cf188d5e19faa7ae7569faed1dd51f191a802/lib/token-types/bearer-token-type.js#L33
    */
    private onGetTokenResponse;
    /**
     * Fetchs a token. When a new token is fetched we also get the user info.
     */
    private fetchToken;
    /**
     * Get the token that will allow us to act on behalf of the user!
     */
    private getAccessToken;
    private refreshToken;
    private mustBeHTTPS;
    /**
     * Sends user to weigthxreps to login and grant us access so we can get an access token
     */
    private redirectUserToLogin;
    /**
     * Gets the access token and makes sure it is not expired.
     *
     * @param {boolean} loginIfNeeded If true, it will ask user to login if necesary, else, it will throw error if a login is needed...
     * @returns {string} a fresh access token
     */
    private getFreshToken;
    private getUser;
    /**
     * Connect with weightxreps user.
     */
    login(): Promise<void>;
    /**
     * Logout user from this client.
     */
    logout(): void;
}
