import { Decoder } from "../../internal/common/Codec";
import { Storage } from "../../internal/common/Storage";
import Response from "../../internal/net/Response";
import Stream from "../../internal/net/Stream";
import EventStream from "../../internal/net/EventStream";
import { StitchAuthRequest } from "../../internal/net/StitchAuthRequest";
import StitchRequestClient from "../../internal/net/StitchRequestClient";
import StitchCredential from "../StitchCredential";
import AuthInfo from "./AuthInfo";
import CoreStitchUser from "./CoreStitchUser";
import StitchAuthRequestClient from "./StitchAuthRequestClient";
import { StitchAuthRoutes } from "./StitchAuthRoutes";
import StitchUserFactory from "./StitchUserFactory";
export default abstract class CoreStitchAuth<TStitchUser extends CoreStitchUser> implements StitchAuthRequestClient {
    authInfo: AuthInfo;
    protected readonly requestClient: StitchRequestClient;
    protected readonly authRoutes: StitchAuthRoutes;
    protected abstract userFactory: StitchUserFactory<TStitchUser>;
    protected abstract deviceInfo: {
        [key: string]: string;
    };
    private readonly storage;
    private currentUser?;
    private readonly accessTokenRefresher;
    protected constructor(requestClient: StitchRequestClient, authRoutes: StitchAuthRoutes, storage: Storage, useTokenRefresher?: boolean);
    readonly isLoggedIn: boolean;
    readonly user: TStitchUser | undefined;
    doAuthenticatedRequest(stitchReq: StitchAuthRequest): Promise<Response>;
    doAuthenticatedRequestWithDecoder<T>(stitchReq: StitchAuthRequest, decoder?: Decoder<T>): Promise<T>;
    openAuthenticatedEventStream(stitchReq: StitchAuthRequest, open?: boolean): Promise<EventStream>;
    openAuthenticatedStreamWithDecoder<T>(stitchReq: StitchAuthRequest, decoder?: Decoder<T>): Promise<Stream<T>>;
    refreshAccessToken(): Promise<void>;
    loginWithCredentialInternal(credential: StitchCredential): Promise<TStitchUser>;
    linkUserWithCredentialInternal(user: CoreStitchUser, credential: StitchCredential): Promise<TStitchUser>;
    logoutInternal(): Promise<void>;
    readonly hasDeviceId: boolean;
    protected readonly deviceId: string | undefined;
    protected abstract onAuthEvent(): any;
    private prepareAuthRequest;
    private handleAuthFailureForEventStream;
    private handleAuthFailure;
    private tryRefreshAccessToken;
    private prepUser;
    private attachAuthOptions;
    private doLogin;
    private doLoginRequest;
    private processLogin;
    private processLoginResponse;
    private doGetUserProfile;
    private doLogout;
    private clearAuth;
    close(): void;
}
