{"version":3,"sources":["../src/utils/apiClient.ts"],"names":["ApiClient","accountApi","onRefreshTokenError","url","options","retried","accessToken","tokenStore","response","NaluriRefreshTokenError","refreshToken","error","version_default"],"mappings":";sHAKO,IAAMA,EAAN,KAAgB,CACrB,YACmBC,EACAC,EACjB,CAFiB,gBAAAD,EACA,yBAAAC,CAChB,CAEH,MAAa,MAAMC,EAAaC,EAAyC,CACvE,OAAO,MAAM,KAAK,OAAOD,EAAK,CAC5B,QAAS,KAAK,kBAAkB,EAChC,GAAGC,CACL,CAAC,CACH,CAEA,MAAc,OACZD,EACAC,EACAC,EAAU,GACS,CACnB,IAAMC,EAAcC,EAAW,QAAQ,aAAa,EAEhDD,IACFF,EAAQ,QAAU,CAChB,GAAGA,EAAQ,QACX,cAAe,UAAUE,CAAW,EACtC,GAGF,IAAME,EAAW,MAAM,MAAML,EAAKC,CAAO,EAEzC,GAAII,EAAS,SAAW,KAAOH,EAAS,CACtC,GAAI,KAAK,oBACP,aAAM,KAAK,oBAAoB,EAGxB,CACL,GAAI,GACJ,KAAM,KAAO,CACX,QAAS,kCACT,WAAY,IACd,GACA,OAAQ,GACV,EAGF,MAAM,IAAII,CACZ,CAEA,GAAID,EAAS,SAAW,IAAK,CAC3B,IAAME,EAAeH,EAAW,QAAQ,cAAc,EAEtD,GAAI,CAACG,EAAc,CACjB,GAAI,KAAK,oBACP,aAAM,KAAK,oBAAoB,EAExB,CACL,GAAI,GACJ,KAAM,KAAO,CACX,QAAS,wBACT,WAAY,IACd,GACA,OAAQ,GACV,EAGF,MAAM,IAAID,CACZ,CAEA,GAAI,CACF,GAAM,CAAE,YAAAH,CAAY,EAAI,MAAM,KAAK,WAAW,QAAQI,CAAY,EAElEH,EAAW,QAAQ,cAAeD,CAAW,CAC/C,OAASK,EAAO,CACd,GAAI,KAAK,oBACP,aAAM,KAAK,oBAAoB,EAExB,CACL,GAAI,GACJ,KAAM,KAAO,CACX,WAAY,KACZ,QAAS,uBACNA,EAAgB,SAAWA,CAC9B,EACF,GACA,OAAQ,GACV,EAEF,MAAM,IAAIF,CACZ,CAEA,OAAO,KAAK,OAAON,EAAKC,EAAS,EAAI,CACvC,CAEA,OAAOI,CACT,CAEQ,mBAAoB,CAC1B,MAAO,CACL,OAAQ,mBACR,eAAgB,mBAChB,aAAc,wBAAwBI,CAAO,KAC7C,mBAAoBA,CACtB,CACF,CACF","sourcesContent":["import { AccountApi } from '@/api/account.api';\nimport { NaluriRefreshTokenError } from '@/errors';\nimport { tokenStore } from '@/utils/tokenStore';\nimport version from './version';\n\nexport class ApiClient {\n  constructor(\n    private readonly accountApi: AccountApi,\n    private readonly onRefreshTokenError?: () => Promise<void>\n  ) {}\n\n  public async fetch(url: string, options: RequestInit): Promise<Response> {\n    return await this._fetch(url, {\n      headers: this.getDefaultHeaders(),\n      ...options,\n    });\n  }\n\n  private async _fetch(\n    url: string,\n    options: RequestInit,\n    retried = false\n  ): Promise<Response> {\n    const accessToken = tokenStore.getItem('accessToken');\n\n    if (accessToken) {\n      options.headers = {\n        ...options.headers,\n        Authorization: `Bearer ${accessToken}`,\n      };\n    }\n\n    const response = await fetch(url, options);\n\n    if (response.status === 401 && retried) {\n      if (this.onRefreshTokenError) {\n        await this.onRefreshTokenError();\n\n        // @ts-expect-error refresh token error\n        return {\n          ok: false,\n          json: () => ({\n            message: 'Refresh flow retried but failed',\n            statusCode: 8888,\n          }),\n          status: 401,\n        } as Response;\n      }\n\n      throw new NaluriRefreshTokenError();\n    }\n\n    if (response.status === 401) {\n      const refreshToken = tokenStore.getItem('refreshToken');\n\n      if (!refreshToken) {\n        if (this.onRefreshTokenError) {\n          await this.onRefreshTokenError();\n          // @ts-expect-error refresh token error\n          return {\n            ok: false,\n            json: () => ({\n              message: 'Missing refresh token',\n              statusCode: 8888,\n            }),\n            status: 401,\n          } as Response;\n        }\n\n        throw new NaluriRefreshTokenError();\n      }\n\n      try {\n        const { accessToken } = await this.accountApi.refresh(refreshToken);\n\n        tokenStore.setItem('accessToken', accessToken);\n      } catch (error) {\n        if (this.onRefreshTokenError) {\n          await this.onRefreshTokenError();\n          // @ts-expect-error refresh token error\n          return {\n            ok: false,\n            json: () => ({\n              statusCode: 8888,\n              message: `Refresh API failed: ${\n                (error as Error).message || error\n              }`,\n            }),\n            status: 401,\n          } as Response;\n        }\n        throw new NaluriRefreshTokenError();\n      }\n\n      return this._fetch(url, options, true);\n    }\n\n    return response;\n  }\n\n  private getDefaultHeaders() {\n    return {\n      Accept: 'application/json',\n      'Content-Type': 'application/json',\n      'User-Agent': `Naluri Chat SDK /JS (${version}})`,\n      'x-nl-sdk-version': version,\n    };\n  }\n}\n"]}