diff --git a/packages/api-client/src/internal/base-api.ts b/packages/api-client/src/internal/base-api.ts index 934d1a53..bd53fb39 100644 --- a/packages/api-client/src/internal/base-api.ts +++ b/packages/api-client/src/internal/base-api.ts @@ -1,22 +1,30 @@ import { CobaltResponseType, type CobaltResponse } from "../types/response"; import { CobaltReachabilityError } from "../types/errors"; import type { CobaltRequest } from "../types/request"; +import { CobaltAPIClient } from "../types/interface"; -export default class BaseCobaltAPI { - #baseURL: string; +export default class CobaltAPI implements CobaltAPIClient { + #baseURL: string | undefined; - constructor(baseURL: string) { + getBaseURL() { + return this.#baseURL; + } + + setBaseURL(baseURL: string) { const url = new URL(baseURL); if (baseURL !== url.origin && baseURL !== `${url.origin}/`) { throw new Error('Invalid cobalt instance URL'); } - this.#baseURL = url.origin; + return this.#baseURL = url.origin; } async request(data: CobaltRequest, headers?: Record) { - const response: CobaltResponse = await fetch(this.#baseURL, { + const baseURL = this.getBaseURL(); + if (!baseURL) throw "baseURL is undefined"; + + const response: CobaltResponse = await fetch(baseURL, { method: 'POST', redirect: 'manual', signal: AbortSignal.timeout(10000), diff --git a/packages/api-client/src/turnstile-api.ts b/packages/api-client/src/turnstile-api.ts index 0792c276..e52c97e1 100644 --- a/packages/api-client/src/turnstile-api.ts +++ b/packages/api-client/src/turnstile-api.ts @@ -1,23 +1,30 @@ import CobaltSessionHandler from "./internal/session"; -import BaseCobaltAPI from "./internal/base-api"; +import CobaltAPI from "./internal/base-api"; import { CobaltRequest } from "./types/request"; import { CobaltAuthError } from "./types/errors"; -import { CobaltAPIClient } from "./types/interface"; import type { TurnstileObject } from "turnstile-types"; -export default class TurnstileCobaltAPI extends BaseCobaltAPI implements CobaltAPIClient { +export class TurnstileCobaltAPI extends CobaltAPI { #session: CobaltSessionHandler; #instanceHasTurnstile = true; - constructor(baseURL: string, turnstile: TurnstileObject) { - super(baseURL); - this.#session = new CobaltSessionHandler(baseURL, turnstile); + constructor(turnstile: TurnstileObject) { + super(); + this.#session = new CobaltSessionHandler(this, turnstile); } needsSession() { return this.#instanceHasTurnstile && !this.#session.hasSession(); } + setBaseURL(baseURL: string): string { + if (this.#session && super.getBaseURL() !== super.setBaseURL(baseURL)) { + this.#session.reset(); + } + + return super.getBaseURL()!; + } + async request(data: CobaltRequest) { const sessionOrError = await this.#session.getSession(); const headers: Record = {}; diff --git a/packages/api-client/src/types/interface.ts b/packages/api-client/src/types/interface.ts index 8bea525c..5323c47d 100644 --- a/packages/api-client/src/types/interface.ts +++ b/packages/api-client/src/types/interface.ts @@ -3,4 +3,6 @@ import { CobaltResponse } from "./response"; export interface CobaltAPIClient { request(data: CobaltRequest): Promise; + getBaseURL(): string | undefined; + setBaseURL(baseURL: string): string; } diff --git a/packages/api-client/src/unauthenticated-api.ts b/packages/api-client/src/unauthenticated-api.ts index 3fa5dee1..58f75ce5 100644 --- a/packages/api-client/src/unauthenticated-api.ts +++ b/packages/api-client/src/unauthenticated-api.ts @@ -1,8 +1,8 @@ -import BaseCobaltAPI from "./internal/base-api"; +import CobaltAPI from "./internal/base-api"; import { CobaltRequest } from "./types/request"; import { CobaltAPIClient } from "./types/interface"; -export default class UnauthenticatedCobaltAPI extends BaseCobaltAPI implements CobaltAPIClient { +export class UnauthenticatedCobaltAPI extends CobaltAPI implements CobaltAPIClient { async request(data: CobaltRequest) { return super.request(data, {}); }