/**
 * Result of a successful Spotify authentication.
 *
 * The shape is identical across iOS and Android. On the Android implicit
 * (TOKEN) flow `refreshToken` is `null` and `scopes` reflects what was
 * *requested*, not granted — see the README's "Android implicit flow is not
 * recommended" section.
 */
export interface SpotifySession {
    /** OAuth access token. */
    accessToken: string;
    /**
     * OAuth refresh token. `null` on Android when no `tokenSwapURL` is provided
     * (the Spotify Android SDK does not expose a refresh token for implicit
     * grants — see the README).
     */
    refreshToken: string | null;
    /** Expiration timestamp as Unix epoch milliseconds. */
    expirationDate: number;
    /** Scopes the access token was granted (or requested, on Android implicit). */
    scopes: SpotifyScope[];
}
/**
 * Configuration accepted by `refreshSessionAsync`.
 */
export interface SpotifyRefreshConfig {
    /** The refresh token from a previous `authenticateAsync` call. */
    refreshToken: string;
    /** URL of your token refresh server endpoint. */
    tokenRefreshURL: string;
    /**
     * Scopes that were granted by the previous session. Used as a fallback
     * when the refresh response omits the `scope` field (which most
     * `accounts.spotify.com` refresh responses do — Spotify only returns
     * `scope` when the granted scope set has changed).
     *
     * If omitted, the returned `SpotifySession.scopes` will be `[]` whenever
     * the refresh response also omits `scope` — silently losing scope
     * information you held a moment ago. Pass through the previous session's
     * `scopes` to avoid that.
     */
    scopes?: SpotifyScope[];
}
/**
 * Configuration accepted by `authenticateAsync`.
 */
export interface SpotifyConfig {
    /** OAuth scopes to request. Must contain at least one entry. */
    scopes: SpotifyScope[];
    /**
     * If supplied, requests an authorization code rather than an implicit
     * token, then POSTs the code to this URL to exchange it for tokens.
     * **Required on Android** to receive a usable `refreshToken`.
     */
    tokenSwapURL?: string;
    /**
     * Used by the iOS SDK to refresh access tokens automatically, and by
     * `refreshSessionAsync` on both platforms.
     */
    tokenRefreshURL?: string;
    /**
     * If `true`, forces Spotify to show the authorization dialog even when
     * the user already has an active session. Defaults to `false`.
     *
     * Maps to `SPTSessionManager.alwaysShowAuthorizationDialog` on iOS and
     * `AuthorizationRequest.Builder.setShowDialog(true)` on Android.
     */
    showDialog?: boolean;
}
/**
 * Spotify OAuth scope identifiers that are valid through the iOS, Android
 * and Web auth flows. See https://developer.spotify.com/documentation/web-api/concepts/scopes
 */
export type SpotifyScope = "ugc-image-upload" | "user-read-playback-state" | "user-modify-playback-state" | "user-read-currently-playing" | "app-remote-control" | "streaming" | "playlist-read-private" | "playlist-read-collaborative" | "playlist-modify-private" | "playlist-modify-public" | "user-follow-modify" | "user-follow-read" | "user-top-read" | "user-read-recently-played" | "user-library-modify" | "user-library-read" | "user-read-email" | "user-read-private";
/**
 * JS-side error code constants thrown via `Promise.reject(new Error(...))`
 * by the native modules.
 */
export type SpotifyErrorCode = "USER_CANCELLED" | "AUTH_IN_PROGRESS" | "INVALID_CONFIG" | "NETWORK_ERROR" | "TOKEN_SWAP_FAILED" | "TOKEN_SWAP_PARSE_ERROR" | "SPOTIFY_NOT_INSTALLED" | "AUTH_ERROR" | "UNKNOWN";
/**
 * Payload delivered to `addSessionChangeListener` subscribers.
 *
 * - `didInitiate` — a new session was created by `authenticateAsync`
 * - `didRenew`    — an existing session was refreshed by `refreshSessionAsync`
 * - `didFail`     — an auth or refresh attempt failed
 */
export type SpotifySessionChangeEvent = {
    type: "didInitiate";
    session: SpotifySession;
} | {
    type: "didRenew";
    session: SpotifySession;
} | {
    type: "didFail";
    error: {
        code: SpotifyErrorCode;
        message: string;
    };
};
/**
 * Error subclass thrown by `authenticateAsync` and `refreshSessionAsync`
 * carrying a structured `code` field for branching.
 */
export declare class SpotifyError extends Error {
    readonly code: SpotifyErrorCode;
    constructor(code: SpotifyErrorCode, message: string);
}
//# sourceMappingURL=ExpoSpotifySDK.types.d.ts.map