{"version":3,"sources":["../../../src/index.node.ts","../../../src/polyfills/node.ts","../../../src/Types.ts","../../../src/utils/ApiUtils.ts","../../../src/utils/Network.ts","../../../src/utils/SdkDevice.ts","../../../src/AccelByteSDK.ts","../../../src/constants/IamErrorCode.ts","../../../src/constants/LinkAccount.ts","../../../src/interceptors/AuthInterceptors.ts","../../../src/utils/DesktopChecker.ts","../../../src/utils/BrowserHelper.ts","../../../src/utils/RefreshSession.ts","../../../../sdk-iam/src/generated-definitions/TokenWithDeviceCookieResponseV3.ts","../../../../sdk-iam/src/generated-definitions/JwtBanV3.ts","../../../../sdk-iam/src/generated-definitions/NamespaceRole.ts","../../../../sdk-iam/src/generated-definitions/PermissionV3.ts","../../../src/utils/CodeGenUtil.ts","../../../src/utils/Validate.ts","../../../src/interceptors/AuthInterceptorDeps.ts","../../../src/constants/paths.ts","../../../src/interceptors/CustomPathInterceptor.ts","../../../src/interceptors/ErrorInterceptor.ts","../../../src/utils/Type.ts","../../../src/utils/UrlHelper.ts"],"sourcesContent":["/*\n * Copyright (c) 2022 AccelByte Inc. All Rights Reserved\n * This is licensed software from AccelByte Inc, for limitations\n * and restrictions contact your company contract manager.\n */\n\n// This needs to be imported otherwise the polyfill will appear after all of the code bundles.\nimport './polyfills/node'\nexport * from './index'\n","/*\n * Copyright (c) 2018-2024 AccelByte Inc. All Rights Reserved\n * This is licensed software from AccelByte Inc, for limitations\n * and restrictions contact your company contract manager.\n */\nimport { webcrypto } from 'crypto'\nimport WebSocket from 'ws'\n\nif (!global.crypto) {\n  global.crypto = webcrypto as unknown as Crypto\n}\n\nif (!global.WebSocket) {\n  global.WebSocket = WebSocket\n}\n","/*\n * Copyright (c) 2023-2024 AccelByte Inc. All Rights Reserved\n * This is licensed software from AccelByte Inc, for limitations\n * and restrictions contact your company contract manager.\n */\n\nimport { AxiosRequestConfig, AxiosResponse, InternalAxiosRequestConfig } from 'axios'\nimport { z } from 'zod'\n\nexport const CoreConfig = z.object({\n  /**\n   * The client ID for the SDK. This value is retrieved from Admin Portal, OAuth Clients.\n   */\n  clientId: z.string().min(1),\n  /**\n   * The redirect URI after logging in. This is used to generate the valid login URL to IAM.\n   * This value is retrieved from Admin Portal, OAuth Clients.\n   */\n  redirectURI: z.string().url(),\n  /**\n   * The base URL of your AGS deployment.\n   */\n  baseURL: z.string().url(),\n  /**\n   * The namespace of your AGS deployment.\n   */\n  namespace: z.string().min(1),\n  /**\n   * When \"false\" is provided, the SDK bypasses Zod Schema Validation.\n   * Default is \"true\".\n   */\n  useSchemaValidation: z.boolean().default(true)\n})\n\nexport type CoreConfig = z.infer<typeof CoreConfig>\n\nexport interface AxiosConfig {\n  interceptors?: Interceptor[]\n  request?: AxiosRequestConfig\n}\n\nexport interface WebSocketConfig {\n  /**\n   * Allow reconnect when upstream is abruptly disconnected.\n   * @default true\n   */\n  allowReconnect?: boolean\n  /**\n   * Maximum number of reconnect attempts. Positive value integer.\n   * Set 0 for unlimited attempts.\n   * @default 0\n   */\n  maxReconnectAttempts?: number\n}\n\nexport type Interceptor =\n  | {\n      type: 'request'\n      name: string\n      onRequest?: (config: InternalAxiosRequestConfig) => InternalAxiosRequestConfig | Promise<InternalAxiosRequestConfig>\n      onError?: (error: unknown) => unknown\n    }\n  | {\n      type: 'response'\n      name: string\n      onSuccess?: (response: AxiosResponse<unknown>) => AxiosResponse<unknown>\n      onError?: (error: unknown) => unknown\n    }\n\nexport interface SdkConstructorParam {\n  coreConfig: z.input<typeof CoreConfig>\n  axiosConfig?: AxiosConfig\n  webSocketConfig?: WebSocketConfig\n}\n\nexport interface SdkSetConfigParam {\n  coreConfig?: Partial<CoreConfig>\n  axiosConfig?: AxiosConfig\n  webSocketConfig?: WebSocketConfig\n}\n\nexport type ApiError = {\n  errorCode: number | string\n  errorMessage: string\n}\nexport type TokenConfig = { accessToken?: string; refreshToken?: string | null }\n","/*\n * Copyright (c) 2022-2024 AccelByte Inc. All Rights Reserved\n * This is licensed software from AccelByte Inc, for limitations\n * and restrictions contact your company contract manager.\n */\n\nimport axios, { AxiosRequestConfig } from 'axios'\n\nexport class ApiUtils {\n  static mergeAxiosConfigs = (config: AxiosRequestConfig, overrides?: AxiosRequestConfig): AxiosRequestConfig => {\n    return {\n      ...config,\n      ...overrides,\n      headers: {\n        ...config?.headers,\n        ...overrides?.headers\n      }\n    }\n  }\n\n  static is4xxError = (error: unknown): boolean => {\n    if (axios.isAxiosError(error) && error.response) {\n      return error.response.status >= 400 && error.response.status <= 499\n    }\n    return false\n  }\n}\n","/*\n * Copyright (c) 2022-2024 AccelByte Inc. All Rights Reserved\n * This is licensed software from AccelByte Inc, for limitations\n * and restrictions contact your company contract manager.\n */\nimport axios, { AxiosInstance, AxiosRequestConfig } from 'axios'\nimport qs from 'query-string'\nimport { SdkDevice } from './SdkDevice'\n\ndeclare const __SDK_VERSION__: string\n\nexport class Network {\n  static create(...configs: AxiosRequestConfig[]): AxiosInstance {\n    const defaultHeaders: Record<string, string> = {}\n\n    if (typeof window === 'undefined') {\n      defaultHeaders['User-Agent'] = `ags-typescript-sdk/${__SDK_VERSION__}`\n    }\n\n    const axiosInstance = axios.create(\n      Object.assign(\n        {\n          paramsSerializer: qs.stringify,\n          headers: defaultHeaders\n        },\n        ...configs\n      )\n    )\n\n    return axiosInstance\n  }\n\n  static withBearerToken(accessToken: string, config?: AxiosRequestConfig): AxiosInstance {\n    return Network.create(config || {}, {\n      headers: { Authorization: `Bearer ${accessToken}` }\n    })\n  }\n\n  static setDeviceTokenCookie = () => {\n    const deviceId = SdkDevice.getDeviceId()\n    document.cookie = `device_token=${deviceId}; path=/;`\n  }\n\n  static removeDeviceTokenCookie = () => {\n    document.cookie = `device_token=; expires=${new Date(0).toUTCString()}`\n  }\n\n  static getFormUrlEncodedData = (data: any): URLSearchParams => {\n    const formPayload = new URLSearchParams()\n    const formKeys = Object.keys(data) as []\n    formKeys.forEach(key => {\n      if (data[key]) formPayload.append(key, data[key])\n    })\n    return formPayload\n  }\n}\n","/*\n * Copyright (c) 2022 AccelByte Inc. All Rights Reserved\n * This is licensed software from AccelByte Inc, for limitations\n * and restrictions contact your company contract manager.\n */\nimport * as uuid from 'uuid'\n\nexport class SdkDevice {\n  static ID_KEY = 'deviceId'\n\n  static TYPE = {\n    MOBILE: 'mobile',\n    DESKTOP: 'desktop'\n  }\n\n  static getType = () => {\n    return isMobile() ? SdkDevice.TYPE.MOBILE : SdkDevice.TYPE.DESKTOP\n  }\n\n  static generateUUID = () => {\n    const deviceIdInUUID = uuid.v4().split('-').join('')\n    localStorage.setItem(SdkDevice.ID_KEY, deviceIdInUUID)\n    return deviceIdInUUID\n  }\n\n  static getDeviceId = () => {\n    return localStorage.getItem(this.ID_KEY) || this.generateUUID()\n  }\n}\n\n/*\n  Below function is copied from npm 'is-mobile'\n */\nconst mobileRE =\n  /(android|bb\\d+|meego).+mobile|armv7l|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|series[46]0|symbian|treo|up\\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i\nconst tabletRE = /android|ipad|playbook|silk/i\n\nconst isMobile = (opts?: any) => {\n  if (!opts) opts = {}\n  let ua = opts.ua\n  if (!ua && typeof navigator !== 'undefined') ua = navigator.userAgent\n  if (ua && ua.headers && typeof ua.headers['user-agent'] === 'string') {\n    ua = ua.headers['user-agent']\n  }\n  if (typeof ua !== 'string') return false\n\n  let result = mobileRE.test(ua) || (!!opts.tablet && tabletRE.test(ua))\n\n  if (\n    !result &&\n    opts.tablet &&\n    opts.featureDetect &&\n    navigator &&\n    navigator.maxTouchPoints > 1 &&\n    ua.indexOf('Macintosh') !== -1 &&\n    ua.indexOf('Safari') !== -1\n  ) {\n    result = true\n  }\n\n  return result\n}\n","/*\n * Copyright (c) 2022-2024 AccelByte Inc. All Rights Reserved\n * This is licensed software from AccelByte Inc, for limitations\n * and restrictions contact your company contract manager.\n */\n\nimport { AxiosInstance, AxiosRequestConfig } from 'axios'\nimport { AxiosConfig, CoreConfig, Interceptor, SdkConstructorParam, SdkSetConfigParam, TokenConfig, WebSocketConfig } from './Types'\nimport { ApiUtils } from './utils/ApiUtils'\nimport { Network } from './utils/Network'\nimport { MakeRequired } from './utils/Type'\n\nexport const AccelByte = {\n  SDK: (param: SdkConstructorParam) => {\n    return new AccelByteSDK(param)\n  }\n}\n\nexport class AccelByteSDK {\n  private coreConfig: CoreConfig\n  private axiosConfig: AxiosConfig\n  private axiosInstance: AxiosInstance\n  private webSocketConfig: WebSocketConfig\n  private token: TokenConfig\n\n  constructor({ coreConfig, axiosConfig, webSocketConfig }: SdkConstructorParam) {\n    this.coreConfig = CoreConfig.parse(coreConfig)\n\n    this.axiosConfig = {\n      /**\n       * when user create a variable to store intercepters and passed into sdk\n       * the sdk will use the variable as reference value,\n       * so when new interceptor added, reference value will also has the new interceptor,\n       * to avoid this we create shallow copy for the interceptors\n       */\n      interceptors: axiosConfig?.interceptors ? [...axiosConfig.interceptors] : undefined,\n      request: {\n        timeout: 60000,\n        withCredentials: true,\n        ...axiosConfig?.request,\n        headers: {\n          'Content-Type': 'application/json',\n          ...axiosConfig?.request?.headers\n        }\n      }\n    }\n    this.axiosInstance = this.createAxiosInstance()\n    this.webSocketConfig = {\n      allowReconnect: webSocketConfig?.allowReconnect ?? true,\n      maxReconnectAttempts: webSocketConfig?.maxReconnectAttempts ?? 0\n    }\n    this.token = {}\n  }\n\n  private createAxiosInstance() {\n    const axiosInstance = Network.create({ ...this.axiosConfig.request, baseURL: this.coreConfig.baseURL })\n    const interceptors = this.axiosConfig.interceptors\n\n    if (interceptors) {\n      for (const interceptor of interceptors) {\n        if (interceptor.type === 'request') {\n          axiosInstance.interceptors.request.use(interceptor?.onRequest, interceptor.onError)\n        }\n\n        if (interceptor.type === 'response') {\n          axiosInstance.interceptors.response.use(interceptor?.onSuccess, interceptor.onError)\n        }\n      }\n    }\n\n    return axiosInstance\n  }\n\n  /**\n   * Assembles and returns the current Axios instance along with core and Axios configurations.\n   */\n  assembly() {\n    return {\n      axiosInstance: this.axiosInstance,\n      coreConfig: this.coreConfig,\n      axiosConfig: this.axiosConfig as MakeRequired<AxiosConfig, 'request'>,\n      webSocketConfig: this.webSocketConfig\n    }\n  }\n\n  /**\n   * Creates a new instance of AccelByteSDK with a shallow copy of the current configurations.\n   * Optionally allows excluding interceptors.\n   * @param {boolean} [opts.interceptors] - Whether to include interceptors in the clone. Default is true.\n   * @returns {AccelByteSDK} A new instance of AccelByteSDK with the cloned configuration.\n   */\n  clone(opts?: { interceptors?: boolean }): AccelByteSDK {\n    const newConfigs = {\n      coreConfig: { ...this.coreConfig },\n      axiosConfig: { ...this.axiosConfig }\n    }\n\n    if (opts?.interceptors === false) {\n      delete newConfigs.axiosConfig.interceptors\n    }\n\n    const newSdkInstance = new AccelByteSDK(newConfigs)\n\n    newSdkInstance.setToken(this.token)\n\n    return newSdkInstance\n  }\n\n  /**\n   * Adds interceptors to the current Axios configuration.\n   */\n  addInterceptors(interceptors: Interceptor[]): AccelByteSDK {\n    if (!this.axiosConfig.interceptors) {\n      this.axiosConfig.interceptors = []\n    }\n\n    this.axiosConfig.interceptors.push(...interceptors)\n    this.axiosInstance = this.createAxiosInstance()\n\n    return this\n  }\n\n  /**\n   * Removes interceptors from the Axios configuration. Can remove all interceptors or filter specific ones.\n   * @param {function} [filterCallback] - Optional filter function to remove specific interceptors.\n   */\n  removeInterceptors(): AccelByteSDK\n  removeInterceptors(filterCallback: (interceptor: Interceptor) => boolean): AccelByteSDK\n\n  removeInterceptors(filterCallback?: (interceptor: Interceptor) => boolean) {\n    if (!this.axiosConfig?.interceptors) return this\n    if (!filterCallback) {\n      this.axiosConfig.interceptors = undefined\n      this.axiosInstance.interceptors.request.clear()\n      this.axiosInstance.interceptors.response.clear()\n      return this\n    }\n\n    this.axiosConfig.interceptors = this.axiosConfig.interceptors.filter(filterCallback)\n    this.axiosInstance = this.createAxiosInstance()\n    return this\n  }\n\n  /**\n   * Updates the SDK's core and Axios configurations.\n   * Merges the provided configurations with the current ones.\n   */\n  setConfig({ coreConfig, axiosConfig, webSocketConfig }: SdkSetConfigParam) {\n    this.coreConfig = {\n      ...this.coreConfig,\n      ...coreConfig\n    }\n    this.axiosConfig = {\n      ...this.axiosConfig,\n      ...axiosConfig?.interceptors,\n      request: ApiUtils.mergeAxiosConfigs(this.axiosConfig.request as AxiosRequestConfig, {\n        ...axiosConfig?.request,\n        baseURL: this.coreConfig.baseURL\n      })\n    }\n    this.webSocketConfig = {\n      ...this.webSocketConfig,\n      ...webSocketConfig\n    }\n    this.axiosInstance = this.createAxiosInstance()\n\n    return this\n  }\n\n  /**\n   * Set accessToken and refreshToken and updates the Axios request headers to use Bearer authentication.\n   */\n  setToken(token: TokenConfig) {\n    this.token = {\n      ...this.token,\n      ...token\n    }\n    const configOverride = { headers: { Authorization: this.token.accessToken ? `Bearer ${this.token.accessToken}` : '' } }\n    this.axiosConfig = {\n      ...this.axiosConfig,\n      request: ApiUtils.mergeAxiosConfigs(this.axiosInstance.defaults as AxiosRequestConfig, configOverride)\n    }\n    this.axiosInstance = this.createAxiosInstance()\n  }\n\n  /**\n   * Removes the currently set token.\n   */\n  removeToken() {\n    this.token = {}\n    const configOverride = { headers: { Authorization: undefined } }\n    this.axiosConfig = {\n      ...this.axiosConfig,\n      request: ApiUtils.mergeAxiosConfigs(this.axiosInstance.defaults as AxiosRequestConfig, configOverride)\n    }\n    this.axiosInstance = this.createAxiosInstance()\n  }\n\n  /**\n   * Retrieves the current token configuration.\n   */\n  getToken() {\n    return this.token\n  }\n}\n","/*\n * Copyright (c) 2024 AccelByte Inc. All Rights Reserved\n * This is licensed software from AccelByte Inc, for limitations\n * and restrictions contact your company contract manager.\n */\n\n// More detail: https://github.com/AccelByte/go-restful-plugins/blob/master/pkg/auth/iam/event.go\nexport enum IamErrorCode {\n  InternalServerError = 20000,\n  UnauthorizedAccess = 20001,\n  ValidationError = 20002,\n  ForbiddenAccess = 20003,\n  TooManyRequests = 20007,\n  UserNotFound = 20008,\n  TokenIsExpired = 20011,\n  InsufficientPermissions = 20013,\n  InvalidAudience = 20014,\n  InsufficientScope = 20015,\n  UnableToParseRequestBody = 20019,\n  InvalidPaginationParameters = 20021,\n  TokenIsNotUserToken = 20022,\n  InvalidRefererHeader = 20023,\n  SubdomainMismatch = 20030\n}\n","/*\n * Copyright (c) 2022-2024 AccelByte Inc. All Rights Reserved\n * This is licensed software from AccelByte Inc, for limitations\n * and restrictions contact your company contract manager.\n */\n\nexport const ERROR_LINK_ANOTHER_3RD_PARTY_ACCOUNT = 10200\nexport const ERROR_CODE_LINK_DELETION_ACCOUNT = 10135\nexport const ERROR_CODE_TOKEN_EXPIRED = 10196\nexport const ERROR_USER_BANNED = 10134\n","/*\n * Copyright (c) 2022-2024 AccelByte Inc. All Rights Reserved\n * This is licensed software from AccelByte Inc, for limitations\n * and restrictions contact your company contract manager.\n */\nimport axios, { AxiosError, AxiosRequestConfig } from 'axios'\nimport { Interceptor } from '../Types'\nimport { DesktopChecker } from '../utils/DesktopChecker'\nimport { Network } from '../utils/Network'\nimport { RefreshSession } from '../utils/RefreshSession'\nimport { OAuth20$, OAuth20V4$, TokenWithDeviceCookieResponseV3 } from './AuthInterceptorDeps'\n\nconst REFRESH_EXPIRY = 1000\nconst REFRESH_EXPIRY_UPDATE_RATE = 500\nconst REFRESH_EXPIRY_CHECK_RATE = 1000\n\nenum GrantTokenUrls {\n  GRANT_TOKEN = '/iam/v3/oauth/token',\n  GRANT_TOKEN_V4 = '/iam/v4/oauth/token'\n}\n\nenum LoginUrls {\n  REVOKE = '/iam/v3/oauth/revoke'\n}\n\ntype GrantTokenUrlString = `${GrantTokenUrls}`\n\ntype RefreshArgs = {\n  axiosConfig: AxiosRequestConfig\n  refreshToken?: string\n  clientId: string\n  tokenUrl?: GrantTokenUrlString\n}\n\nconst noOp = () => {}\n\nexport class RefreshToken {\n  private config: RefreshArgs\n  private interceptors: Interceptor[]\n\n  constructor({ config, interceptors }: { config: RefreshArgs; interceptors?: Interceptor[] }) {\n    this.config = config\n    this.interceptors = interceptors || []\n  }\n\n  // Return Promise<true> if refresh in any tab is successful;\n  runWithLock = (): Promise<Partial<TokenWithDeviceCookieResponseV3> | false> => {\n    //\n    if (RefreshSession.isLocked()) {\n      return Promise.resolve().then(async () => {\n        // This block is executed when other tab / request is refreshing\n        while (RefreshSession.isLocked()) {\n          await RefreshSession.sleepAsync(REFRESH_EXPIRY_CHECK_RATE)\n        }\n        return {}\n      })\n    }\n\n    RefreshSession.lock(REFRESH_EXPIRY)\n    let isLocallyRefreshingToken = true\n\n    ;(async () => {\n      // eslint-disable-next-line no-unmodified-loop-condition\n      while (isLocallyRefreshingToken) {\n        RefreshSession.lock(REFRESH_EXPIRY)\n        await RefreshSession.sleepAsync(REFRESH_EXPIRY_UPDATE_RATE)\n      }\n    })()\n\n    return Promise.resolve()\n      .then(() => this.run())\n      .finally(() => {\n        isLocallyRefreshingToken = false\n        RefreshSession.unlock()\n      })\n  }\n\n  run = async () => {\n    const { axiosConfig, refreshToken } = this.config\n    // we need this to check if app use “withCredentials: false” and don’t have refreshToken it should return false,\n    // because we track it as a logout user, if not do this even user logout on the desktop app (that use withCredentials: false)\n    // will automatically login with refreshSession\n    if (DesktopChecker.isDesktopApp() && !axiosConfig.withCredentials && !refreshToken) {\n      return false\n    }\n\n    const result = await this.refreshToken()\n    if (result.error) {\n      return false\n    }\n\n    return result.response.data\n  }\n\n  refreshToken = () => {\n    const { axiosConfig, refreshToken, clientId, tokenUrl } = this.config\n    const config = {\n      ...axiosConfig,\n      /**\n       * Ideally `withCredentials` should be `true` to make sure that\n       * cookies always included when refreshing token\n       * especially on cross-origin requests.\n       * But if `refreshToken` is provided (e.g. from Launcher),\n       * we can set it to false and send refresh_token via payload.\n       */\n      withCredentials: !refreshToken,\n      headers: {\n        'Content-Type': 'application/x-www-form-urlencoded',\n        Authorization: `Basic ${Buffer.from(`${clientId}:`).toString('base64')}`\n      }\n    }\n    const axios = Network.create(config)\n\n    for (const interceptor of this.interceptors) {\n      if (interceptor.type === 'request') {\n        axios.interceptors.request.use(interceptor?.onRequest, interceptor.onError)\n      }\n\n      if (interceptor.type === 'response') {\n        axios.interceptors.response.use(interceptor?.onSuccess, interceptor.onError)\n      }\n    }\n\n    const payload = {\n      refresh_token: refreshToken || undefined,\n      client_id: clientId,\n      grant_type: 'refresh_token'\n    } as const\n\n    if (tokenUrl === GrantTokenUrls.GRANT_TOKEN_V4) {\n      return new OAuth20V4$(axios).postOauthToken_v4(payload)\n    }\n\n    const oauth20 = new OAuth20$(axios)\n    return oauth20.postOauthToken(payload)\n  }\n}\n\nconst refreshComplete = (\n  error: AxiosError,\n  tokenResponse: Partial<TokenWithDeviceCookieResponseV3> | false,\n  onSessionExpired: (() => void) | undefined,\n  axiosConfig: AxiosRequestConfig,\n  errorConfig: AxiosRequestConfig\n) => {\n  //\n  if (tokenResponse) {\n    const { access_token } = tokenResponse\n\n    // desktop\n    if (!axiosConfig.withCredentials && access_token) {\n      return axios({\n        ...errorConfig,\n        headers: {\n          ...errorConfig.headers,\n          Authorization: `Bearer ${access_token}`\n        }\n      })\n      // web\n    } else {\n      return axios(errorConfig)\n    }\n  }\n\n  if (onSessionExpired) {\n    onSessionExpired()\n  }\n  throw error\n}\n\ntype SessionExpiredInterceptorOptions = {\n  /**\n   * The client ID used by the SDK, obtained from the Admin Portal under OAuth Clients.\n   */\n  clientId: string\n\n  /**\n   * An optional array of URLs that should be ignored when handling session expiration.\n   * Default to `['/iam/v3/oauth/token', '/iam/v4/oauth/token', '/iam/v3/oauth/revoke']`\n   */\n  expectedErrorUrls?: string[]\n\n  /**\n   * A callback function that retrieves the current refresh token.\n   */\n  getRefreshToken?: () => string | undefined\n\n  /**\n   * The URL endpoint for obtaining a new token. Defaults to `'/iam/v3/oauth/token'`.\n   */\n  tokenUrl?: GrantTokenUrlString\n  /**\n   * A callback function triggered when the session has expired.\n   */\n  onSessionExpired: () => void\n\n  /**\n   * A callback function triggered when successfully get new session.\n   */\n  onGetUserSession?: (accessToken: string, refreshToken: string) => void\n}\n\nexport const createAuthInterceptor = ({\n  clientId,\n  onSessionExpired,\n  onGetUserSession,\n  expectedErrorUrls = Object.values({ ...LoginUrls, ...GrantTokenUrls }),\n  getRefreshToken,\n  tokenUrl = GrantTokenUrls.GRANT_TOKEN\n}: SessionExpiredInterceptorOptions): Interceptor => {\n  return {\n    type: 'response',\n    name: 'session-expired',\n    onError: e => {\n      const error = e as AxiosError\n      const { config, response } = error\n\n      if (axios.isCancel(error)) {\n        // expected case, exit\n        return Promise.reject(error)\n      }\n\n      if (!response) {\n        console.warn(`sdk:ERR_INTERNET_DISCONNECTED ${config?.baseURL}${config?.url}. ${(error as AxiosError).message}\\n`)\n      }\n\n      if (response?.status === 401) {\n        const { url } = config || {}\n        const axiosConfig = config as AxiosRequestConfig\n        const refreshToken = getRefreshToken?.()\n\n        // expected business case, exit\n        if (!url || (url && expectedErrorUrls.includes(url))) {\n          return Promise.reject(error)\n        }\n\n        const refresh = new RefreshToken({\n          config: { axiosConfig, clientId, refreshToken, tokenUrl },\n          interceptors: [\n            createRefreshSessionInterceptor({ tokenUrl }),\n            createGetSessionInterceptor({ onGetUserSession: onGetUserSession || noOp, tokenUrl })\n          ]\n        })\n\n        // need to lock on the desktop as well to prevent multiple token request\n        return refresh.runWithLock().then(tokenResponse => {\n          return refreshComplete(error, tokenResponse, onSessionExpired, axiosConfig, config || {})\n        })\n      }\n\n      return Promise.reject(error)\n    }\n  }\n}\n\ntype RefreshSessioNInterceptorOptions = {\n  /**\n   * The URL endpoint for obtaining a new token. Defaults to `'/iam/v3/oauth/token'`.\n   */\n  tokenUrl?: GrantTokenUrlString\n}\n\nexport const createRefreshSessionInterceptor = (options?: RefreshSessioNInterceptorOptions): Interceptor => {\n  const { tokenUrl = GrantTokenUrls.GRANT_TOKEN } = options || {}\n\n  return {\n    type: 'request',\n    name: 'refresh-session',\n    onError: error => Promise.reject(error),\n    onRequest: async config => {\n      // need to lock on the desktop as well to sleep other request before refresh session is done\n      const isRefreshTokenUrl = config.url === tokenUrl\n      // eslint-disable-next-line no-unmodified-loop-condition\n      while (RefreshSession.isLocked() && !isRefreshTokenUrl) {\n        await RefreshSession.sleepAsync(200)\n      }\n      return config\n    }\n  }\n}\n\ntype GetSessionInterceptorOptions = {\n  /**\n   * The URL endpoint for obtaining a new token. Defaults to `'/iam/v3/oauth/token'`.\n   */\n  tokenUrl?: GrantTokenUrlString\n\n  /**\n   * A callback function triggered when successfully get new session.\n   */\n  onGetUserSession: (accessToken: string, refreshToken: string) => void\n}\n\nexport const createGetSessionInterceptor = ({\n  tokenUrl = GrantTokenUrls.GRANT_TOKEN,\n  onGetUserSession\n}: GetSessionInterceptorOptions): Interceptor => ({\n  type: 'response',\n  name: 'get-session',\n  onError: error => Promise.reject(error),\n  onSuccess: response => {\n    const { config, status } = response\n\n    if (config.url === tokenUrl && status === 200) {\n      // @ts-ignore\n      const { access_token, refresh_token } = response.data as TokenWithDeviceCookieResponseV3\n\n      if (access_token) {\n        onGetUserSession(access_token, refresh_token ?? '')\n      }\n    }\n\n    return response\n  }\n})\n","/*\n * Copyright (c) 2022 AccelByte Inc. All Rights Reserved\n * This is licensed software from AccelByte Inc, for limitations\n * and restrictions contact your company contract manager.\n */\nexport class DesktopChecker {\n  private static desktopApp = DesktopChecker.isElectron()\n\n  static isDesktopApp() {\n    return DesktopChecker.desktopApp && !DesktopChecker.isInIframe()\n  }\n\n  private static isInIframe() {\n    try {\n      return window.self !== window.top\n    } catch (error) {\n      return true\n    }\n  }\n\n  // borrowed from https://github.com/cheton/is-electron\n  private static isElectron() {\n    // @ts-ignore Renderer process\n    if (typeof window !== 'undefined' && typeof window.process === 'object' && window.process.type === 'renderer') {\n      return true\n    }\n    // Main process\n    if (typeof process !== 'undefined' && typeof process.versions === 'object' && !!process.versions.electron) {\n      return true\n    }\n    // Detect the user agent when the `nodeIntegration` option is set to false\n    if (typeof navigator === 'object' && typeof navigator.userAgent === 'string' && navigator.userAgent.indexOf('Electron') >= 0) {\n      return true\n    }\n    return false\n  }\n}\n","/*\n * Copyright (c) 2022 AccelByte Inc. All Rights Reserved\n * This is licensed software from AccelByte Inc, for limitations\n * and restrictions contact your company contract manager.\n */\nexport class BrowserHelper {\n  static isOnBrowser = () => {\n    return typeof window !== 'undefined' && window.document\n  }\n}\n","/*\n * Copyright (c) 2022-2024 AccelByte Inc. All Rights Reserved\n * This is licensed software from AccelByte Inc, for limitations\n * and restrictions contact your company contract manager.\n */\nimport { AxiosRequestConfig } from 'axios'\nimport { BrowserHelper } from './BrowserHelper'\n\nexport class RefreshSession {\n  // --\n  static KEY = 'RefreshSession.lock'\n\n  static isLocked = (): boolean => {\n    if (!BrowserHelper.isOnBrowser()) return false\n    const lockStatus = localStorage.getItem(RefreshSession.KEY)\n    if (!lockStatus) {\n      return false\n    }\n    const lockExpiry = Number(lockStatus)\n    if (isNaN(lockExpiry)) {\n      return false\n    }\n    return lockExpiry > new Date().getTime()\n  }\n\n  static lock = (expiry: number) => {\n    if (!BrowserHelper.isOnBrowser()) return\n    localStorage.setItem(RefreshSession.KEY, `${new Date().getTime() + expiry}`)\n  }\n\n  static unlock = () => {\n    if (!BrowserHelper.isOnBrowser()) return\n    localStorage.removeItem(RefreshSession.KEY)\n  }\n\n  static sleepAsync = (timeInMs: number) => new Promise(resolve => setTimeout(resolve, timeInMs))\n\n  static isBearerAuth = (config?: AxiosRequestConfig) => {\n    // @ts-ignore\n    if (config?.headers?.Authorization?.toLowerCase().indexOf('bearer') > -1) {\n      return true\n    }\n    return false\n  }\n}\n","/*\n * Copyright (c) 2022-2026 AccelByte Inc. All Rights Reserved\n * This is licensed software from AccelByte Inc, for limitations\n * and restrictions contact your company contract manager.\n */\nimport { z } from 'zod'\nimport { JwtBanV3 } from './JwtBanV3.js'\nimport { NamespaceRole } from './NamespaceRole.js'\nimport { PermissionV3 } from './PermissionV3.js'\n\nexport const TokenWithDeviceCookieResponseV3 = z.object({\n  access_token: z.string(),\n  auth_trust_id: z.string().nullish(),\n  bans: z.array(JwtBanV3).nullish(),\n  display_name: z.string().nullish(),\n  expires_in: z.number().int(),\n  is_comply: z.boolean().nullish(),\n  jflgs: z.number().int().nullish(),\n  namespace: z.string(),\n  namespace_roles: z.array(NamespaceRole).nullish(),\n  permissions: z.array(PermissionV3),\n  platform_id: z.string().nullish(),\n  platform_user_id: z.string().nullish(),\n  refresh_expires_in: z.number().int().nullish(),\n  refresh_token: z.string().nullish(),\n  roles: z.array(z.string()).nullish(),\n  scope: z.string(),\n  simultaneous_platform_id: z.string().nullish(),\n  simultaneous_platform_user_id: z.string().nullish(),\n  token_type: z.string(),\n  unique_display_name: z.string().nullish(),\n  user_id: z.string().nullish(),\n  xuid: z.string().nullish()\n})\n\nexport interface TokenWithDeviceCookieResponseV3 extends z.TypeOf<typeof TokenWithDeviceCookieResponseV3> {}\n","/*\n * Copyright (c) 2022-2026 AccelByte Inc. All Rights Reserved\n * This is licensed software from AccelByte Inc, for limitations\n * and restrictions contact your company contract manager.\n */\nimport { z } from 'zod'\n\nexport const JwtBanV3 = z.object({\n  ban: z.string(),\n  disabledDate: z.string().nullish(),\n  enabled: z.boolean(),\n  endDate: z.string(),\n  targetedNamespace: z.string()\n})\n\nexport interface JwtBanV3 extends z.TypeOf<typeof JwtBanV3> {}\n","/*\n * Copyright (c) 2022-2026 AccelByte Inc. All Rights Reserved\n * This is licensed software from AccelByte Inc, for limitations\n * and restrictions contact your company contract manager.\n */\nimport { z } from 'zod'\n\nexport const NamespaceRole = z.object({ namespace: z.string(), roleId: z.string() })\n\nexport interface NamespaceRole extends z.TypeOf<typeof NamespaceRole> {}\n","/*\n * Copyright (c) 2022-2026 AccelByte Inc. All Rights Reserved\n * This is licensed software from AccelByte Inc, for limitations\n * and restrictions contact your company contract manager.\n */\nimport { z } from 'zod'\n\nexport const PermissionV3 = z.object({\n  action: z.number().int(),\n  resource: z.string(),\n  schedAction: z.number().int().nullish(),\n  schedCron: z.string().nullish(),\n  schedRange: z.array(z.string()).nullish()\n})\n\nexport interface PermissionV3 extends z.TypeOf<typeof PermissionV3> {}\n","/*\n * Copyright (c) 2022 AccelByte Inc. All Rights Reserved\n * This is licensed software from AccelByte Inc, for limitations\n * and restrictions contact your company contract manager.\n */\nexport class CodeGenUtil {\n  /**\n   * Returns a hash code from a string\n   * @param  {String} str The string to hash.\n   * @return {Number} A 32bit integer\n   * @see http://werxltd.com/wp/2010/05/13/javascript-implementation-of-javas-string-hashcode-method/\n   */\n  static hashCode(str: string): number {\n    let hash = 0\n    for (let i = 0, len = str.length; i < len; i++) {\n      const chr = str.charCodeAt(i)\n      hash = (hash << 5) - hash + chr\n      hash |= 0 // Convert to 32bit integer\n    }\n    return hash\n  }\n\n  static getFormUrlEncodedData = (data: Record<string, any>): URLSearchParams => {\n    const formPayload = new URLSearchParams()\n    const formKeys = Object.keys(data) as []\n    formKeys.forEach(key => {\n      if (typeof data[key] !== 'undefined') formPayload.append(key, data[key])\n    })\n    return formPayload\n  }\n}\n","/*\n * Copyright (c) 2022-2024 AccelByte Inc. All Rights Reserved\n * This is licensed software from AccelByte Inc, for limitations\n * and restrictions contact your company contract manager.\n */\nimport { AxiosError, AxiosResponse } from 'axios'\nimport { z, ZodError } from 'zod'\n\nexport type ResponseError = Error | AxiosError\n\nexport type Response<T> =\n  | {\n      response: AxiosResponse<T>\n      error: null\n    }\n  | {\n      response: null\n      error: ResponseError\n    }\n\nexport class Validate {\n  static validateOrReturnResponse<D>(\n    useSchemaValidation: boolean,\n    networkCall: () => Promise<AxiosResponse<D>>,\n    Codec: z.ZodType<D>,\n    modelName: string\n  ) {\n    return useSchemaValidation ? Validate.responseType(() => networkCall(), Codec, modelName) : Validate.unsafeResponse(() => networkCall())\n  }\n\n  static responseType<D>(networkCall: () => Promise<AxiosResponse<D>>, Codec: z.ZodType<D>, modelName: string) {\n    return wrapNetworkCallSafely<D>(async () => {\n      const response = await networkCall()\n      const decodeResult = Codec.safeParse(response.data)\n      if (!decodeResult.success && response.status !== 204) {\n        throw new DecodeError({ error: decodeResult.error, response, modelName })\n      }\n      return response\n    })\n  }\n\n  static unsafeResponse<D>(networkCall: () => Promise<AxiosResponse<D>>) {\n    return wrapNetworkCallSafely<D>(() => networkCall())\n  }\n\n  static safeParse<D>(data: unknown, Codec: z.ZodType<D>): D | null {\n    const result = Codec.safeParse(data)\n    if (result.success) {\n      return result.data\n    }\n    return null\n  }\n}\n\nasync function wrapNetworkCallSafely<D>(networkCallFunction: () => Promise<AxiosResponse<D>>): Promise<Response<D>> {\n  try {\n    const response = await networkCallFunction()\n    return { response, error: null }\n  } catch (error) {\n    return { response: null, error: <Error>error }\n  }\n}\n\nexport class DecodeError extends Error {\n  zodError: ZodError\n\n  constructor({ error, response, modelName }: { error: ZodError; response: AxiosResponse; modelName: string }) {\n    const msg = `response from url \"${response.config.url}\" doesn't match model \"${modelName}\"`\n    super(msg)\n    console.error(msg, error)\n\n    this.zodError = error\n  }\n}\n","/*\n * Copyright (c) 2022-2024 AccelByte Inc. All Rights Reserved\n * This is licensed software from AccelByte Inc, for limitations\n * and restrictions contact your company contract manager.\n */\nimport { AxiosInstance, AxiosRequestConfig } from 'axios'\nimport { TokenWithDeviceCookieResponseV3 } from '~/iam-definitions/TokenWithDeviceCookieResponseV3'\nimport { CodeGenUtil } from '../utils/CodeGenUtil'\nimport { Response, Validate } from '../utils/Validate'\n\nexport { TokenWithDeviceCookieResponseV3 }\n\n/*\n * Copyright (c) 2022-2024 AccelByte Inc. All Rights Reserved\n * This is licensed software from AccelByte Inc, for limitations\n * and restrictions contact your company contract manager.\n */\n\nexport class OAuth20$ {\n  // @ts-ignore\n  constructor(private axiosInstance: AxiosInstance) {}\n\n  postOauthToken<T = TokenWithDeviceCookieResponseV3>(data: {\n    grant_type: 'authorization_code' | 'client_credentials' | 'password' | 'refresh_token'\n    username?: string | null\n    password?: string | null\n    code?: string | null\n    code_verifier?: string | null\n    client_id?: string | null\n    redirect_uri?: string | null\n    refresh_token?: string | null\n    extend_exp?: boolean | null\n  }): Promise<Response<T>> {\n    const params = {} as AxiosRequestConfig\n    const url = '/iam/v3/oauth/token'\n    const resultPromise = this.axiosInstance.post(url, CodeGenUtil.getFormUrlEncodedData(data), {\n      ...params,\n      headers: { ...params.headers, 'content-type': 'application/x-www-form-urlencoded' }\n    })\n\n    return Validate.responseType(() => resultPromise, TokenWithDeviceCookieResponseV3, 'TokenWithDeviceCookieResponseV3')\n  }\n}\n\nexport class OAuth20V4$ {\n  // @ts-ignore\n  // prettier-ignore\n  constructor(private axiosInstance: AxiosInstance) {}\n\n  /**\n   * This endpoint supports grant type: 1. Grant Type == &lt;code&gt;authorization_code&lt;/code&gt;: It generates the user token by given the authorization code which generated in &#34;/iam/v3/authenticate&#34; API response. It should also pass in the redirect_uri, which should be the same as generating the authorization code request. 2. Grant Type == &lt;code&gt;password&lt;/code&gt;: The grant type to use for authenticating a user, whether it&#39;s by email / username and password combination or through platform. 3. Grant Type == &lt;code&gt;refresh_token&lt;/code&gt;: Used to get a new access token for a valid refresh token. 4. Grant Type == &lt;code&gt;client_credentials&lt;/code&gt;: It generates a token by checking the client credentials provided through Authorization header. 5. Grant Type == &lt;code&gt;urn:ietf:params:oauth:grant-type:extend_client_credentials&lt;/code&gt;: It generates a token by checking the client credentials provided through Authorization header. It only allows publisher/studio namespace client. In generated token: 1. There wil be no roles, namespace_roles &amp; permission. 2. The scope will be fixed as &#39;extend&#39;. 3. There will have a new field &#39;extend_namespace&#39;, the value is from token request body. 6. Grant Type == &lt;code&gt;urn:ietf:params:oauth:grant-type:login_queue_ticket&lt;/code&gt;: It generates a token by validating the login queue ticket against login queue service. ## Access Token Content Following is the access token’s content: - **namespace**. It is the namespace the token was generated from. - **display_name**. The display name of the sub. It is empty if the token is generated from the client credential - **roles**. The sub’s roles. It is empty if the token is generated from the client credential - **namespace_roles**. The sub’s roles scoped to namespace. Improvement from roles, which make the role scoped to specific namespace instead of global to publisher namespace - **permissions**. The sub or aud’ permissions - **bans**. The sub’s list of bans. It is used by the IAM client for validating the token. - **jflgs**. It stands for Justice Flags. It is a special flag used for storing additional status information regarding the sub. It is implemented as a bit mask. Following explains what each bit represents: - 1: Email Address Verified - 2: Phone Number Verified - 4: Anonymous - 8: Suspicious Login - **aud**. The aud is the targeted resource server. - **iat**. The time the token issues at. It is in Epoch time format - **exp**. The time the token expires. It is in Epoch time format - **client_id**. The UserID. The sub is omitted if the token is generated from client credential - **scope**. The scope of the access request, expressed as a list of space-delimited, case-sensitive strings ## Bans The JWT contains user&#39;s active bans with its expiry date. List of ban types can be obtained from /bans. ## Device Cookie Validation _**For grant type &#34;password&#34; only**_ Device Cookie is used to protect the user account from brute force login attack, &lt;a target=&#34;_blank&#34; href=&#34;https://owasp.org/www-community/Slow_Down_Online_Guessing_Attacks_with_Device_Cookies&#34;&gt;more detail from OWASP&lt;a&gt;. This endpoint will read device cookie from request header **Auth-Trust-Id**. If device cookie not found, it will generate a new one and set it into response body **auth_trust_id** when successfully login. ## Track Login History This endpoint will track login history to detect suspicious login activity, please provide **Device-Id** (alphanumeric) in request header parameter otherwise it will set to &#34;unknown&#34;. Align with General Data Protection Regulation in Europe, user login history will be kept within 28 days by default&#34; ## 2FA remember device To remember device for 2FA, should provide cookie: device_token or header: Device-Token ## Response note If it is a user token request and user hasn&#39;t accepted required legal policy, the field &lt;code&gt;is_comply&lt;/code&gt; will be false in response and responsed token will have no permission. action code: 10703\n   */\n  postOauthToken_v4(\n    data: {\n      grant_type:\n        | 'authorization_code'\n        | 'client_credentials'\n        | 'password'\n        | 'refresh_token'\n        | 'urn:ietf:params:oauth:grant-type:extend_client_credentials'\n        | 'urn:ietf:params:oauth:grant-type:login_queue_ticket'\n      additionalData?: string | null\n      client_id?: string | null\n      client_secret?: string | null\n      code?: string | null\n      code_verifier?: string | null\n      extendNamespace?: string | null\n      extend_exp?: boolean | null\n      login_queue_ticket?: string | null\n      password?: string | null\n      redirect_uri?: string | null\n      refresh_token?: string | null\n      username?: string | null\n    },\n    queryParams?: { code_challenge?: string | null; code_challenge_method?: 'S256' | 'plain' }\n  ): Promise<Response<TokenWithDeviceCookieResponseV3>> {\n    const params = { code_challenge_method: 'plain', ...queryParams } as AxiosRequestConfig\n    const url = '/iam/v4/oauth/token'\n    const resultPromise = this.axiosInstance.post(url, CodeGenUtil.getFormUrlEncodedData(data), {\n      ...params,\n      headers: { ...params.headers, 'content-type': 'application/x-www-form-urlencoded' }\n    })\n\n    return Validate.responseType(() => resultPromise, TokenWithDeviceCookieResponseV3, 'TokenWithDeviceCookieResponseV3')\n  }\n}\n","/*\n * Copyright (c) 2024 AccelByte Inc. All Rights Reserved\n * This is licensed software from AccelByte Inc, for limitations\n * and restrictions contact your company contract manager.\n */\nexport const BASE_PATHS = [\n  '/achievement',\n  '/basic',\n  '/buildinfo',\n  '/chat',\n  '/cloudsave',\n  '/content-management',\n  '/differ',\n  '/dsmcontroller',\n  '/event',\n  '/game-telemetry',\n  '/gdpr',\n  '/group',\n  '/iam',\n  '/leaderboard',\n  '/agreement',\n  '/lobby',\n  '/match2',\n  '/matchmaking',\n  '/odin-config',\n  '/platform',\n  '/qosm',\n  '/reporting',\n  '/seasonpass',\n  '/session',\n  '/sessionbrowser',\n  '/social',\n  '/ugc',\n  '/config'\n] as const\n\nexport type BasePath = (typeof BASE_PATHS)[number] | (string & {})\n\nexport const INTERNAL_SERVICES = {\n  '/achievement': 'justice-achievement-service',\n  '/basic': 'justice-basic-service',\n  '/buildinfo': 'justice-buildinfo-service',\n  '/chat': 'justice-chat-service',\n  '/cloudsave': 'justice-cloudsave-service',\n  '/content-management': 'justice-odin-content-management-service',\n  '/differ': 'justice-differ',\n  '/dsmcontroller': 'justice-dsm-controller-service',\n  '/event': 'justice-event-log-service',\n  '/game-telemetry': 'analytics-game-telemetry-api',\n  '/gdpr': 'justice-gdpr-service',\n  '/group': 'justice-group-service',\n  '/iam': 'justice-iam-service',\n  '/leaderboard': 'justice-leaderboard-service',\n  '/agreement': 'justice-legal-service', // sdk-legal\n  '/lobby': 'justice-lobby-server',\n  '/match2': 'justice-matchmaking-v2', // sdk-matchmaking\n  '/odin-config': 'justice-odin-config-service',\n  '/platform': 'justice-platform-service',\n  '/qosm': 'justice-qos-manager-service',\n  '/reporting': 'justice-reporting-service',\n  '/seasonpass': 'justice-seasonpass-service',\n  '/session': 'justice-session-service',\n  '/social': 'justice-social-service',\n  '/ugc': 'justice-ugc-service',\n  '/config': 'justice-config-service'\n} as const\n","/*\n * Copyright (c) 2023-2024 AccelByte Inc. All Rights Reserved\n * This is licensed software from AccelByte Inc, for limitations\n * and restrictions contact your company contract manager.\n */\n\nimport { BasePath, INTERNAL_SERVICES } from '../constants/paths'\nimport { Interceptor } from '../Types'\n\ntype CreateCustomPathInterceptorOptions = {\n  /**\n   * A list of objects specifying which service base paths should be replaced.\n   * For example, providing `{'/iam': '/iam-test'}` will redirect all `'/iam'` requests to `'/iam-test'`.\n   */\n  basePath: Partial<Record<BasePath, string>>\n\n  /**\n   * Indicates whether to use the internal AccelByte network. This should only be used in a server environment.\n   * When set to true, requests will be made to `http://{service-name}/{path}` instead of the `baseURL`.\n   */\n  isInternalNetwork?: boolean\n}\n\nexport const createCustomPathInterceptor = ({ basePath, isInternalNetwork }: CreateCustomPathInterceptorOptions): Interceptor => {\n  return {\n    type: 'request',\n    name: 'custom-base-path',\n    onRequest: async config => {\n      const { url } = config\n      if (url) {\n        const firstPath = url.split('/')[1]\n        const servicePath = `/${firstPath}`\n        const newBasePath: string | undefined = basePath?.[servicePath]\n        const internalPath = INTERNAL_SERVICES?.[servicePath]\n\n        if (isInternalNetwork && internalPath) {\n          config.baseURL = `http://${internalPath}`\n        }\n\n        if (newBasePath) {\n          config.url = config.url?.replace(servicePath, newBasePath)\n        }\n      }\n      return config\n    },\n    onError: error => Promise.reject(error)\n  }\n}\n","/*\n * Copyright (c) 2022-2024 AccelByte Inc. All Rights Reserved\n * This is licensed software from AccelByte Inc, for limitations\n * and restrictions contact your company contract manager.\n */\nimport { AxiosError } from 'axios'\nimport { Interceptor } from '../Types'\n\nconst ERROR_ELIGIBILITY_CODE = 13130\n\nexport const ErrorInterceptors: Array<Interceptor> = [\n  {\n    type: 'response',\n    name: 'user-eligibilitiy-change',\n    onError: e => {\n      const error = e as AxiosError<any>\n      if (error.response) {\n        const { response } = error\n        if (response?.status === 403 && (response?.config as any).url.includes(process.env.BASE_URL) && response?.config.withCredentials) {\n          if (response.data.errorCode === ERROR_ELIGIBILITY_CODE) {\n            // onUserEligibilityChange()\n          }\n        }\n      }\n\n      return Promise.reject(error)\n    }\n  },\n  {\n    type: 'response',\n    name: 'too-many-request',\n    onError: e => {\n      const error = e as AxiosError<any>\n      if (error.response) {\n        const { response } = error\n        if (response?.status === 429 /* TooManyRequests */) {\n          // onTooManyRequest(error)\n        }\n      }\n\n      return Promise.reject(error)\n    }\n  }\n]\n","/*\n * Copyright (c) 2024 AccelByte Inc. All Rights Reserved\n * This is licensed software from AccelByte Inc, for limitations\n * and restrictions contact your company contract manager.\n */\n\nimport { z, ZodTypeAny } from 'zod'\n\nexport type MakeRequired<T, K extends keyof T> = T & { [P in K]-?: T[P] }\n\nexport function isType<T extends ZodTypeAny>(schema: T, data: unknown): data is z.infer<T> {\n  return schema.safeParse(data).success\n}\n","/*\n * Copyright (c) 2022-2024 AccelByte Inc. All Rights Reserved\n * This is licensed software from AccelByte Inc, for limitations\n * and restrictions contact your company contract manager.\n */\nexport class UrlHelper {\n  static isCompleteURLString = (urlString: string) => {\n    try {\n      const url = new URL(urlString)\n      return url.hostname !== ''\n    } catch (error) {}\n    return false\n  }\n\n  static trimSlashFromStringEnd(pathString: string) {\n    let newString = pathString\n    while (newString[newString.length - 1] === '/') {\n      newString = newString.slice(0, -1)\n    }\n    return newString\n  }\n\n  static trimSlashFromStringStart(pathString: string) {\n    let newString = pathString\n    while (newString[0] === '/') {\n      newString = newString.slice(1)\n    }\n    return newString\n  }\n\n  static trimSlashFromStringEdges(pathString: string) {\n    return UrlHelper.trimSlashFromStringStart(this.trimSlashFromStringEnd(pathString))\n  }\n\n  static combinePaths(...paths: string[]) {\n    const completePath = paths.join('/')\n    // Replace 2 or more consecutive slashes with a single slash.\n    // This is also the behavior from Node's `path.join`.\n    return completePath.replace(/\\/{2,}/g, '/')\n  }\n\n  static combineURLPaths(urlString: string, ...paths: string[]) {\n    const url = new URL(urlString)\n    const { origin } = url\n    const pathname = UrlHelper.trimSlashFromStringEdges(UrlHelper.combinePaths(url.pathname, ...paths))\n    return new URL(pathname, origin).toString()\n  }\n\n  static removeQueryParam(fullUrlString: string, param: string) {\n    const url = new URL(fullUrlString)\n    const params = url.searchParams\n    const pathname = this.trimSlashFromStringEnd(url.pathname)\n\n    // Remove the query parameter\n    params.delete(param)\n\n    // Preserving other URL attributes\n    let newUrlString: string\n    if (params.toString() === '') newUrlString = `${url.origin}${pathname}${url.hash}`\n    else newUrlString = `${url.origin}${pathname}?${params.toString()}${url.hash}`\n\n    return newUrlString\n  }\n}\n"],"mappings":"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","names":["WebSocket","axios","import_axios","axios","qs","IamErrorCode","import_axios","import_zod","import_zod","import_zod","import_zod","GrantTokenUrls","LoginUrls","axios"]}