{"version":3,"file":"api.mjs","sources":["../../src/api.ts"],"sourcesContent":["import axios, { AxiosError, AxiosInstance, AxiosRequestConfig } from \"axios\";\nimport axiosRetry from \"axios-retry\";\nimport { Socket } from \"phoenix\";\n\nimport { exponentialBackoffFullJitter } from \"./helpers\";\nimport { PageVisibilityManager } from \"./pageVisibility\";\n\ntype ApiClientOptions = {\n  host: string;\n  apiKey: string;\n  userToken: string | undefined;\n  branch?: string;\n  /** Automatically disconnect the socket when the page is hidden and reconnect when visible. Defaults to `true`. */\n  disconnectOnPageHidden?: boolean;\n};\n\nexport interface ApiResponse {\n  // eslint-disable-next-line\n  error?: any;\n  // eslint-disable-next-line\n  body?: any;\n  statusCode: \"ok\" | \"error\";\n  status: number;\n}\n\nclass ApiClient {\n  private host: string;\n  private apiKey: string;\n  private userToken: string | null;\n  private branch: string | null;\n  private axiosClient: AxiosInstance;\n\n  public socket: Socket | undefined;\n  private pageVisibility: PageVisibilityManager | undefined;\n\n  constructor(options: ApiClientOptions) {\n    this.host = options.host;\n    this.apiKey = options.apiKey;\n    this.userToken = options.userToken || null;\n    this.branch = options.branch || null;\n\n    // Create a retryable axios client\n    this.axiosClient = axios.create({\n      baseURL: this.host,\n      headers: {\n        Accept: \"application/json\",\n        \"Content-Type\": \"application/json\",\n        Authorization: `Bearer ${this.apiKey}`,\n        \"X-Knock-User-Token\": this.userToken,\n        \"X-Knock-Client\": this.getKnockClientHeader(),\n        \"X-Knock-Branch\": this.branch,\n      },\n    });\n\n    if (typeof window !== \"undefined\") {\n      this.socket = new Socket(`${this.host.replace(\"http\", \"ws\")}/ws/v1`, {\n        params: {\n          user_token: this.userToken,\n          api_key: this.apiKey,\n          branch_slug: this.branch,\n        },\n        reconnectAfterMs: (tries: number) => {\n          return exponentialBackoffFullJitter(tries, {\n            baseDelayMs: 1000,\n            maxDelayMs: 30_000,\n          });\n        },\n        rejoinAfterMs: (tries: number) => {\n          return exponentialBackoffFullJitter(tries, {\n            baseDelayMs: 1000,\n            maxDelayMs: 60_000,\n          });\n        },\n      });\n\n      if (options.disconnectOnPageHidden !== false) {\n        this.pageVisibility = new PageVisibilityManager(this.socket);\n      }\n    }\n\n    axiosRetry(this.axiosClient, {\n      retries: 3,\n      retryCondition: this.canRetryRequest,\n      retryDelay: axiosRetry.exponentialDelay,\n    });\n  }\n\n  async makeRequest(req: AxiosRequestConfig): Promise<ApiResponse> {\n    try {\n      const result = await this.axiosClient(req);\n\n      return {\n        statusCode: result.status < 300 ? \"ok\" : \"error\",\n        body: result.data,\n        error: undefined,\n        status: result.status,\n      };\n\n      // eslint:disable-next-line\n    } catch (e: unknown) {\n      console.error(e);\n\n      return {\n        statusCode: \"error\",\n        status: 500,\n        body: undefined,\n        error: e,\n      };\n    }\n  }\n\n  teardown() {\n    this.pageVisibility?.teardown();\n\n    if (this.socket?.isConnected()) {\n      this.socket.disconnect();\n    }\n  }\n\n  private canRetryRequest(error: AxiosError) {\n    // Retry Network Errors.\n    if (axiosRetry.isNetworkError(error)) {\n      return true;\n    }\n\n    if (!error.response) {\n      // Cannot determine if the request can be retried\n      return false;\n    }\n\n    // Retry Server Errors (5xx).\n    if (error.response.status >= 500 && error.response.status <= 599) {\n      return true;\n    }\n\n    // Retry if rate limited.\n    if (error.response.status === 429) {\n      return true;\n    }\n\n    return false;\n  }\n\n  private getKnockClientHeader() {\n    // Note: we're following format used in our Stainless SDKs:\n    // https://github.com/knocklabs/knock-node/blob/main/src/client.ts#L335\n    // If we add the env var to turbo.json, it caches it so the version\n    // never actually updates.\n    // eslint-disable-next-line turbo/no-undeclared-env-vars\n    return `Knock/ClientJS ${process.env.CLIENT_PACKAGE_VERSION}`;\n  }\n}\n\nexport default ApiClient;\n"],"names":["ApiClient","options","__publicField","axios","Socket","tries","exponentialBackoffFullJitter","PageVisibilityManager","axiosRetry","req","result","e","_a","_b","error"],"mappings":";;;;;;;;AAyBA,MAAMA,EAAU;AAAA,EAUd,YAAYC,GAA2B;AAT/B,IAAAC,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAED,IAAAA,EAAA;AACC,IAAAA,EAAA;AAGN,SAAK,OAAOD,EAAQ,MACpB,KAAK,SAASA,EAAQ,QACjB,KAAA,YAAYA,EAAQ,aAAa,MACjC,KAAA,SAASA,EAAQ,UAAU,MAG3B,KAAA,cAAcE,EAAM,OAAO;AAAA,MAC9B,SAAS,KAAK;AAAA,MACd,SAAS;AAAA,QACP,QAAQ;AAAA,QACR,gBAAgB;AAAA,QAChB,eAAe,UAAU,KAAK,MAAM;AAAA,QACpC,sBAAsB,KAAK;AAAA,QAC3B,kBAAkB,KAAK,qBAAqB;AAAA,QAC5C,kBAAkB,KAAK;AAAA,MAAA;AAAA,IACzB,CACD,GAEG,OAAO,SAAW,QACf,KAAA,SAAS,IAAIC,EAAO,GAAG,KAAK,KAAK,QAAQ,QAAQ,IAAI,CAAC,UAAU;AAAA,MACnE,QAAQ;AAAA,QACN,YAAY,KAAK;AAAA,QACjB,SAAS,KAAK;AAAA,QACd,aAAa,KAAK;AAAA,MACpB;AAAA,MACA,kBAAkB,CAACC,MACVC,EAA6BD,GAAO;AAAA,QACzC,aAAa;AAAA,QACb,YAAY;AAAA,MAAA,CACb;AAAA,MAEH,eAAe,CAACA,MACPC,EAA6BD,GAAO;AAAA,QACzC,aAAa;AAAA,QACb,YAAY;AAAA,MAAA,CACb;AAAA,IACH,CACD,GAEGJ,EAAQ,2BAA2B,OACrC,KAAK,iBAAiB,IAAIM,EAAsB,KAAK,MAAM,KAI/DC,EAAW,KAAK,aAAa;AAAA,MAC3B,SAAS;AAAA,MACT,gBAAgB,KAAK;AAAA,MACrB,YAAYA,EAAW;AAAA,IAAA,CACxB;AAAA,EAAA;AAAA,EAGH,MAAM,YAAYC,GAA+C;AAC3D,QAAA;AACF,YAAMC,IAAS,MAAM,KAAK,YAAYD,CAAG;AAElC,aAAA;AAAA,QACL,YAAYC,EAAO,SAAS,MAAM,OAAO;AAAA,QACzC,MAAMA,EAAO;AAAA,QACb,OAAO;AAAA,QACP,QAAQA,EAAO;AAAA,MACjB;AAAA,aAGOC,GAAY;AACnB,qBAAQ,MAAMA,CAAC,GAER;AAAA,QACL,YAAY;AAAA,QACZ,QAAQ;AAAA,QACR,MAAM;AAAA,QACN,OAAOA;AAAA,MACT;AAAA,IAAA;AAAA,EACF;AAAA,EAGF,WAAW;;AACT,KAAAC,IAAA,KAAK,mBAAL,QAAAA,EAAqB,aAEjBC,IAAA,KAAK,WAAL,QAAAA,EAAa,iBACf,KAAK,OAAO,WAAW;AAAA,EACzB;AAAA,EAGM,gBAAgBC,GAAmB;AAErC,WAAAN,EAAW,eAAeM,CAAK,IAC1B,KAGJA,EAAM,WAMPA,EAAM,SAAS,UAAU,OAAOA,EAAM,SAAS,UAAU,OAKzDA,EAAM,SAAS,WAAW,MATrB;AAAA,EAaF;AAAA,EAGD,uBAAuB;AAMtB,WAAA;AAAA,EAAoD;AAE/D;"}