{"version":3,"sources":["../src/UberDirectAuth.ts"],"sourcesContent":["import axios, { AxiosError, AxiosInstance } from 'axios'\nimport { AuthCredentials, AuthInstance, Method } from './types/AuthTypes'\nimport { UberDirectTypeProtectErrorHandling } from './UberDirectTypeProtect'\nimport AxiosErrorToString from './axiosError'\nimport { UberDirectLogger } from './UberDirectLogger'\n\n/*\n * UberDirectAuth\n * @class\n * @classdesc UberDirectAuth is a class to handle authentication with Uber Direct API and used by all Services of the uber-direct-sdk\n * @param {AuthCredentials} credentials\n * @param {string} credentials.clientId\n * @param {string} credentials.clientSecret\n * @param {string} credentials.customerId\n */\nexport class UberDirectAuth extends UberDirectTypeProtectErrorHandling {\n    httpClient: AxiosInstance\n    private _clientId: string\n    private _clientSecret: string\n    private _customerId: string\n\n    constructor(credentials: AuthCredentials, private readonly scope: 'eats.deliveries' | 'direct.organizations' = 'eats.deliveries') {\n        super()\n        this._clientId = credentials.clientId\n        this._clientSecret = credentials.clientSecret\n        this._customerId = credentials.customerId\n        this.httpClient = axios.create({\n            baseURL: 'https://api.uber.com/v1/',\n            headers: {\n                Authorization: `Bearer ${ this._accessToken }`,\n                'Content-Type': 'application/json',\n            },\n        })\n    }\n\n    private _logger: UberDirectLogger | undefined\n\n    set logger(logger: UberDirectLogger | undefined) {\n        this.logger = logger\n    }\n\n    private _accessToken?: string\n\n    get accessToken(): string | undefined {\n        return this._accessToken\n    }\n\n    private _tokenExpirationTime?: number\n\n    get tokenExpirationTime(): number | undefined {\n        return this._tokenExpirationTime\n    }\n\n    /**\n     * reload new instance from saved instance\n     * @param savedInstance\n     */\n    static reloadInstance(savedInstance: AuthInstance): UberDirectAuth {\n        const auth = new UberDirectAuth({\n            clientId: savedInstance.clientId,\n            clientSecret: savedInstance.clientSecret,\n            customerId: savedInstance.customerId,\n        })\n        auth._accessToken = savedInstance.accessToken\n        auth._tokenExpirationTime = savedInstance.tokenExpirationTime\n        return auth\n    }\n\n    /**\n     * get customer id\n     */\n    getCustomerId(): string {\n        return this._customerId\n    }\n\n    /**\n     * make api request\n     * @param method\n     * @param endpoint\n     * @param data\n     * @param logger\n     * @param retryCount\n     */\n    async makeApiRequest<ResponseType>(\n        method: Method,\n        endpoint: string,\n        data?: Record<string, unknown>,\n        logger?: UberDirectLogger,\n        retryCount = 0,\n    ): Promise<ResponseType> {\n        const accessToken = await this.getAccessToken()\n\n        try {\n            if (logger)\n                logger.debug(`Making ${ method } request to ${ endpoint }`, {\n                    method,\n                    url: endpoint,\n                    data,\n                })\n            const response = await this.httpClient.request({\n                method,\n                url: endpoint,\n                data,\n                headers: {\n                    Authorization: `Bearer ${ accessToken }`,\n                    'Content-Type': 'application/json',\n                },\n            })\n            if (logger)\n                logger.debug(`Response from ${ method } ${ endpoint }`, {\n                    status: response.status,\n                    data: response.data,\n                })\n            return response.data\n        } catch (e) {\n            if ((e as AxiosError).isAxiosError)\n                logger?.error(AxiosErrorToString(e as AxiosError))\n            else\n                logger?.error('Error while making api request', e)\n            const error = e as AxiosError\n            //  if error is 504 retry request in 5seconds\n            if (error.response?.status === 504) {\n                if (retryCount > 3) throw error\n                await new Promise(resolve => setTimeout(resolve, 5000))\n                return this.makeApiRequest<ResponseType>(method, endpoint, data, logger, retryCount + 1)\n            }\n            throw new Error(AxiosErrorToString(error))\n        }\n    }\n\n    /**\n     * save current instance\n     */\n    exportInstance(): AuthInstance {\n        return {\n            clientId: this._clientId,\n            clientSecret: this._clientSecret,\n            customerId: this._customerId,\n            accessToken: this._accessToken,\n            tokenExpirationTime: this._tokenExpirationTime,\n        }\n    }\n\n    /**\n     * authenticate and get access token\n     * @private\n     */\n    private async getAccessToken(): Promise<string> {\n        if (\n            !this._accessToken ||\n            (this._tokenExpirationTime && Date.now() >= this._tokenExpirationTime)\n        ) {\n            const data = new URLSearchParams()\n            data.append('grant_type', 'client_credentials')\n            data.append('client_id', this._clientId)\n            data.append('client_secret', this._clientSecret)\n            data.append('scope', this.scope)\n            try {\n                if (this._logger)\n                    this._logger.debug('Getting access token', {\n                        data,\n                    })\n\n                const response = await axios.post(\n                    'https://login.uber.com/oauth/v2/token', data,\n                    {\n                        headers: {\n                            'Content-Type': 'application/x-www-form-urlencoded',\n                        },\n                    },\n                )\n                if (this._logger)\n                    this._logger.debug('Response from getting access token', {\n                        status: response.status,\n                        data: response.data,\n                    })\n                if (response.data.token_type !== 'Bearer')\n                    throw new Error('Invalid token type')\n                this._accessToken = response.data.access_token\n                this._tokenExpirationTime =\n                    Date.now() + response.data.expires_in * 1000 - 300000\n            } catch (e) {\n                const error = e as AxiosError\n                throw new Error(AxiosErrorToString(error))\n            }\n        }\n\n        if (!this._accessToken)\n            throw new Error('Unable to get access token')\n\n        return this._accessToken\n    }\n}\n"],"mappings":"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","names":[]}