gatsbie 1.0.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.mts CHANGED
@@ -21,14 +21,18 @@ interface RecaptchaV3Solution {
21
21
  token: string;
22
22
  userAgent: string;
23
23
  }
24
- /** Solution for Akamai challenges. */
25
- interface AkamaiSolution {
24
+ /** Cookies returned by Akamai. */
25
+ interface AkamaiCookies {
26
26
  abck: string;
27
27
  bmSz: string;
28
- userAgent: string;
29
28
  country?: string;
30
29
  usrLocale?: string;
31
30
  }
31
+ /** Solution for Akamai challenges. */
32
+ interface AkamaiSolution {
33
+ cookies: AkamaiCookies;
34
+ userAgent: string;
35
+ }
32
36
  /** Solution for Vercel challenges. */
33
37
  interface VercelSolution {
34
38
  vcrcs: string;
@@ -59,9 +63,13 @@ interface PerimeterXSolution {
59
63
  cookies: PerimeterXCookies;
60
64
  userAgent: string;
61
65
  }
66
+ /** Cookies returned by Cloudflare WAF. */
67
+ interface CloudflareWAFCookies {
68
+ cfClearance: string;
69
+ }
62
70
  /** Solution for Cloudflare WAF challenges. */
63
71
  interface CloudflareWAFSolution {
64
- cfClearance: string;
72
+ cookies: CloudflareWAFCookies;
65
73
  userAgent: string;
66
74
  }
67
75
  /** Solution for Datadome Slider challenges. */
package/dist/index.d.ts CHANGED
@@ -21,14 +21,18 @@ interface RecaptchaV3Solution {
21
21
  token: string;
22
22
  userAgent: string;
23
23
  }
24
- /** Solution for Akamai challenges. */
25
- interface AkamaiSolution {
24
+ /** Cookies returned by Akamai. */
25
+ interface AkamaiCookies {
26
26
  abck: string;
27
27
  bmSz: string;
28
- userAgent: string;
29
28
  country?: string;
30
29
  usrLocale?: string;
31
30
  }
31
+ /** Solution for Akamai challenges. */
32
+ interface AkamaiSolution {
33
+ cookies: AkamaiCookies;
34
+ userAgent: string;
35
+ }
32
36
  /** Solution for Vercel challenges. */
33
37
  interface VercelSolution {
34
38
  vcrcs: string;
@@ -59,9 +63,13 @@ interface PerimeterXSolution {
59
63
  cookies: PerimeterXCookies;
60
64
  userAgent: string;
61
65
  }
66
+ /** Cookies returned by Cloudflare WAF. */
67
+ interface CloudflareWAFCookies {
68
+ cfClearance: string;
69
+ }
62
70
  /** Solution for Cloudflare WAF challenges. */
63
71
  interface CloudflareWAFSolution {
64
- cfClearance: string;
72
+ cookies: CloudflareWAFCookies;
65
73
  userAgent: string;
66
74
  }
67
75
  /** Solution for Datadome Slider challenges. */
package/dist/index.js CHANGED
@@ -226,11 +226,13 @@ var Client = class {
226
226
  taskId: data.taskId,
227
227
  service: data.service,
228
228
  solution: {
229
- abck: data.solution._abck,
230
- bmSz: data.solution.bm_sz,
231
- userAgent: data.solution.ua,
232
- country: data.solution.Country,
233
- usrLocale: data.solution.UsrLocale
229
+ cookies: {
230
+ abck: data.solution.cookies_dict._abck,
231
+ bmSz: data.solution.cookies_dict.bm_sz,
232
+ country: data.solution.cookies_dict.Country,
233
+ usrLocale: data.solution.cookies_dict.UsrLocale
234
+ },
235
+ userAgent: data.solution.ua
234
236
  },
235
237
  cost: data.cost,
236
238
  solveTime: data.solveTime
@@ -272,14 +274,14 @@ var Client = class {
272
274
  method: request.method
273
275
  };
274
276
  const data = await this.request("POST", "/v1/solve/shape", body);
275
- const { ua, ...headers } = data.solution;
277
+ const { "User-Agent": userAgent, ...headers } = data.solution;
276
278
  return {
277
279
  success: data.success,
278
280
  taskId: data.taskId,
279
281
  service: data.service,
280
282
  solution: {
281
283
  headers,
282
- userAgent: ua
284
+ userAgent: userAgent || ""
283
285
  },
284
286
  cost: data.cost,
285
287
  solveTime: data.solveTime
@@ -353,7 +355,9 @@ var Client = class {
353
355
  taskId: data.taskId,
354
356
  service: data.service,
355
357
  solution: {
356
- cfClearance: data.solution.cf_clearance,
358
+ cookies: {
359
+ cfClearance: data.solution.cookies.cf_clearance
360
+ },
357
361
  userAgent: data.solution.ua
358
362
  },
359
363
  cost: data.cost,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/errors.ts","../src/client.ts"],"sourcesContent":["/**\n * Gatsbie SDK - Official Node.js SDK for the Gatsbie Captcha API.\n *\n * @example\n * ```typescript\n * import { Client } from \"gatsbie\";\n *\n * const client = new Client(\"gats_your_api_key\");\n *\n * const response = await client.solveTurnstile({\n * proxy: \"http://user:pass@proxy:8080\",\n * targetUrl: \"https://example.com\",\n * siteKey: \"0x4AAAAAAABS7TtLxsNa7Z2e\",\n * });\n *\n * console.log(response.solution.token);\n * ```\n */\n\nexport { Client } from \"./client\";\nexport {\n APIError,\n ErrorCode,\n GatsbieError,\n RequestError,\n} from \"./errors\";\nexport type {\n // Response types\n HealthResponse,\n SolveResponse,\n // Solution types\n AkamaiSolution,\n CloudflareWAFSolution,\n DatadomeSliderSolution,\n DatadomeSolution,\n PerimeterXCookies,\n PerimeterXSolution,\n RecaptchaV3Solution,\n ShapeSolution,\n TurnstileSolution,\n VercelSolution,\n // Request types\n AkamaiRequest,\n CloudflareWAFRequest,\n DatadomeRequest,\n DatadomeSliderRequest,\n PerimeterXRequest,\n RecaptchaV3Request,\n ShapeRequest,\n TurnstileRequest,\n VercelRequest,\n // Options\n ClientOptions,\n} from \"./types\";\n","/**\n * Error codes returned by the Gatsbie API.\n */\nexport const ErrorCode = {\n AUTH_FAILED: \"AUTH_FAILED\",\n INSUFFICIENT_CREDITS: \"INSUFFICIENT_CREDITS\",\n INVALID_REQUEST: \"INVALID_REQUEST\",\n UPSTREAM_ERROR: \"UPSTREAM_ERROR\",\n SOLVE_FAILED: \"SOLVE_FAILED\",\n INTERNAL_ERROR: \"INTERNAL_ERROR\",\n} as const;\n\nexport type ErrorCode = (typeof ErrorCode)[keyof typeof ErrorCode];\n\n/**\n * Base error class for Gatsbie SDK errors.\n */\nexport class GatsbieError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"GatsbieError\";\n Object.setPrototypeOf(this, GatsbieError.prototype);\n }\n}\n\n/**\n * Error thrown when the Gatsbie API returns an error response.\n */\nexport class APIError extends GatsbieError {\n readonly code: string;\n readonly details?: string;\n readonly timestamp?: number;\n readonly httpStatus?: number;\n\n constructor(options: {\n code: string;\n message: string;\n details?: string;\n timestamp?: number;\n httpStatus?: number;\n }) {\n const msg = options.details\n ? `gatsbie: ${options.code}: ${options.message} (${options.details})`\n : `gatsbie: ${options.code}: ${options.message}`;\n super(msg);\n this.name = \"APIError\";\n this.code = options.code;\n this.details = options.details;\n this.timestamp = options.timestamp;\n this.httpStatus = options.httpStatus;\n Object.setPrototypeOf(this, APIError.prototype);\n }\n\n /** Check if this is an authentication error. */\n isAuthError(): boolean {\n return this.code === ErrorCode.AUTH_FAILED;\n }\n\n /** Check if this error is due to insufficient credits. */\n isInsufficientCredits(): boolean {\n return this.code === ErrorCode.INSUFFICIENT_CREDITS;\n }\n\n /** Check if this error is due to an invalid request. */\n isInvalidRequest(): boolean {\n return this.code === ErrorCode.INVALID_REQUEST;\n }\n\n /** Check if this error is from an upstream service. */\n isUpstreamError(): boolean {\n return this.code === ErrorCode.UPSTREAM_ERROR;\n }\n\n /** Check if the captcha solving failed. */\n isSolveFailed(): boolean {\n return this.code === ErrorCode.SOLVE_FAILED;\n }\n\n /** Check if this is an internal server error. */\n isInternalError(): boolean {\n return this.code === ErrorCode.INTERNAL_ERROR;\n }\n}\n\n/**\n * Error thrown when a request fails (network error, timeout, etc.).\n */\nexport class RequestError extends GatsbieError {\n constructor(message: string, public readonly cause?: Error) {\n super(message);\n this.name = \"RequestError\";\n Object.setPrototypeOf(this, RequestError.prototype);\n }\n}\n","import { APIError, RequestError } from \"./errors\";\nimport type {\n AkamaiRequest,\n AkamaiSolution,\n ClientOptions,\n CloudflareWAFRequest,\n CloudflareWAFSolution,\n DatadomeRequest,\n DatadomeSliderRequest,\n DatadomeSliderSolution,\n DatadomeSolution,\n HealthResponse,\n PerimeterXRequest,\n PerimeterXSolution,\n RecaptchaV3Request,\n RecaptchaV3Solution,\n ShapeRequest,\n ShapeSolution,\n SolveResponse,\n TurnstileRequest,\n TurnstileSolution,\n VercelRequest,\n VercelSolution,\n} from \"./types\";\n\nconst DEFAULT_BASE_URL = \"https://api2.gatsbie.io\";\nconst DEFAULT_TIMEOUT = 120000;\n\n/**\n * Gatsbie API client.\n *\n * @example\n * ```typescript\n * const client = new Client(\"gats_your_api_key\");\n *\n * const response = await client.solveTurnstile({\n * proxy: \"http://user:pass@proxy:8080\",\n * targetUrl: \"https://example.com\",\n * siteKey: \"0x4AAAAAAABS7TtLxsNa7Z2e\",\n * });\n *\n * console.log(response.solution.token);\n * ```\n */\nexport class Client {\n private readonly apiKey: string;\n private readonly baseUrl: string;\n private readonly timeout: number;\n\n /**\n * Create a new Gatsbie API client.\n *\n * @param apiKey - Your Gatsbie API key (should start with 'gats_').\n * @param options - Optional client configuration.\n */\n constructor(apiKey: string, options: ClientOptions = {}) {\n this.apiKey = apiKey;\n this.baseUrl = (options.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/$/, \"\");\n this.timeout = options.timeout ?? DEFAULT_TIMEOUT;\n }\n\n private async request<T>(\n method: string,\n path: string,\n body?: Record<string, unknown>\n ): Promise<T> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(`${this.baseUrl}${path}`, {\n method,\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: body ? JSON.stringify(body) : undefined,\n signal: controller.signal,\n });\n\n const data = (await response.json()) as Record<string, unknown>;\n\n if (!response.ok) {\n const error = (data.error as Record<string, unknown>) || {};\n throw new APIError({\n code: (error.code as string) || \"UNKNOWN\",\n message: (error.message as string) || \"Unknown error\",\n details: error.details as string | undefined,\n timestamp: error.timestamp as number | undefined,\n httpStatus: response.status,\n });\n }\n\n return data as T;\n } catch (err) {\n if (err instanceof APIError) {\n throw err;\n }\n if (err instanceof Error) {\n if (err.name === \"AbortError\") {\n throw new RequestError(\"Request timed out\", err);\n }\n throw new RequestError(`Request failed: ${err.message}`, err);\n }\n throw new RequestError(\"Request failed\");\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n // ========================================================================\n // API Methods\n // ========================================================================\n\n /**\n * Check the API server health status.\n */\n async health(): Promise<HealthResponse> {\n return this.request<HealthResponse>(\"GET\", \"/health\");\n }\n\n /**\n * Solve a Datadome device check challenge.\n */\n async solveDatadome(\n request: DatadomeRequest\n ): Promise<SolveResponse<DatadomeSolution>> {\n const body = {\n task_type: \"datadome-device-check\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n target_method: request.targetMethod ?? \"GET\",\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: { datadome: string; ua: string };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/datadome-device-check\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n datadome: data.solution.datadome,\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a reCAPTCHA v3 challenge.\n */\n async solveRecaptchaV3(\n request: RecaptchaV3Request\n ): Promise<SolveResponse<RecaptchaV3Solution>> {\n const body: Record<string, unknown> = {\n task_type: \"recaptchav3\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n site_key: request.siteKey,\n };\n if (request.action) body.action = request.action;\n if (request.title) body.title = request.title;\n if (request.enterprise) body.enterprise = request.enterprise;\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: { token: string; ua: string };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/recaptchav3\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n token: data.solution.token,\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve an Akamai bot management challenge.\n */\n async solveAkamai(\n request: AkamaiRequest\n ): Promise<SolveResponse<AkamaiSolution>> {\n const body: Record<string, unknown> = {\n task_type: \"akamai\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n akamai_js_url: request.akamaiJsUrl,\n };\n if (request.pageFp) body.page_fp = request.pageFp;\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: {\n _abck: string;\n bm_sz: string;\n ua: string;\n Country?: string;\n UsrLocale?: string;\n };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/akamai\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n abck: data.solution._abck,\n bmSz: data.solution.bm_sz,\n userAgent: data.solution.ua,\n country: data.solution.Country,\n usrLocale: data.solution.UsrLocale,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a Vercel bot protection challenge.\n */\n async solveVercel(\n request: VercelRequest\n ): Promise<SolveResponse<VercelSolution>> {\n const body = {\n task_type: \"vercel\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: { _vcrcs: string; ua: string };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/vercel\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n vcrcs: data.solution._vcrcs,\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a Shape antibot challenge.\n */\n async solveShape(\n request: ShapeRequest\n ): Promise<SolveResponse<ShapeSolution>> {\n const body = {\n task_type: \"shape\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n target_api: request.targetApi,\n shape_js_url: request.shapeJsUrl,\n title: request.title,\n method: request.method,\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: Record<string, string>;\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/shape\", body);\n\n // Shape returns dynamic headers, extract ua separately\n const { ua, ...headers } = data.solution;\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n headers,\n userAgent: ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a Cloudflare Turnstile challenge.\n */\n async solveTurnstile(\n request: TurnstileRequest\n ): Promise<SolveResponse<TurnstileSolution>> {\n const body = {\n task_type: \"turnstile\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n site_key: request.siteKey,\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: { token: string; ua: string };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/turnstile\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n token: data.solution.token,\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a PerimeterX Invisible challenge.\n */\n async solvePerimeterX(\n request: PerimeterXRequest\n ): Promise<SolveResponse<PerimeterXSolution>> {\n const body = {\n task_type: \"perimeterx_invisible\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n perimeterx_js_url: request.perimeterxJsUrl,\n pxAppId: request.pxAppId,\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: {\n perimeterx_cookies: {\n _px3: string;\n _pxde: string;\n _pxvid: string;\n pxcts: string;\n };\n ua: string;\n };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/perimeterx-invisible\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n cookies: {\n px3: data.solution.perimeterx_cookies._px3,\n pxde: data.solution.perimeterx_cookies._pxde,\n pxvid: data.solution.perimeterx_cookies._pxvid,\n pxcts: data.solution.perimeterx_cookies.pxcts,\n },\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a Cloudflare WAF challenge.\n */\n async solveCloudflareWAF(\n request: CloudflareWAFRequest\n ): Promise<SolveResponse<CloudflareWAFSolution>> {\n const body = {\n task_type: \"cloudflare_waf\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n target_method: request.targetMethod ?? \"GET\",\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: { cf_clearance: string; ua: string };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/cloudflare-waf\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n cfClearance: data.solution.cf_clearance,\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a Datadome Slider CAPTCHA challenge.\n */\n async solveDatadomeSlider(\n request: DatadomeSliderRequest\n ): Promise<SolveResponse<DatadomeSliderSolution>> {\n const body = {\n task_type: \"datadome-slider\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n target_method: request.targetMethod ?? \"GET\",\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: { datadome: string; ua: string };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/datadome-slider\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n datadome: data.solution.datadome,\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACGO,IAAM,YAAY;AAAA,EACvB,aAAa;AAAA,EACb,sBAAsB;AAAA,EACtB,iBAAiB;AAAA,EACjB,gBAAgB;AAAA,EAChB,cAAc;AAAA,EACd,gBAAgB;AAClB;AAOO,IAAM,eAAN,MAAM,sBAAqB,MAAM;AAAA,EACtC,YAAY,SAAiB;AAC3B,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,WAAO,eAAe,MAAM,cAAa,SAAS;AAAA,EACpD;AACF;AAKO,IAAM,WAAN,MAAM,kBAAiB,aAAa;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAET,YAAY,SAMT;AACD,UAAM,MAAM,QAAQ,UAChB,YAAY,QAAQ,IAAI,KAAK,QAAQ,OAAO,KAAK,QAAQ,OAAO,MAChE,YAAY,QAAQ,IAAI,KAAK,QAAQ,OAAO;AAChD,UAAM,GAAG;AACT,SAAK,OAAO;AACZ,SAAK,OAAO,QAAQ;AACpB,SAAK,UAAU,QAAQ;AACvB,SAAK,YAAY,QAAQ;AACzB,SAAK,aAAa,QAAQ;AAC1B,WAAO,eAAe,MAAM,UAAS,SAAS;AAAA,EAChD;AAAA;AAAA,EAGA,cAAuB;AACrB,WAAO,KAAK,SAAS,UAAU;AAAA,EACjC;AAAA;AAAA,EAGA,wBAAiC;AAC/B,WAAO,KAAK,SAAS,UAAU;AAAA,EACjC;AAAA;AAAA,EAGA,mBAA4B;AAC1B,WAAO,KAAK,SAAS,UAAU;AAAA,EACjC;AAAA;AAAA,EAGA,kBAA2B;AACzB,WAAO,KAAK,SAAS,UAAU;AAAA,EACjC;AAAA;AAAA,EAGA,gBAAyB;AACvB,WAAO,KAAK,SAAS,UAAU;AAAA,EACjC;AAAA;AAAA,EAGA,kBAA2B;AACzB,WAAO,KAAK,SAAS,UAAU;AAAA,EACjC;AACF;AAKO,IAAM,eAAN,MAAM,sBAAqB,aAAa;AAAA,EAC7C,YAAY,SAAiC,OAAe;AAC1D,UAAM,OAAO;AAD8B;AAE3C,SAAK,OAAO;AACZ,WAAO,eAAe,MAAM,cAAa,SAAS;AAAA,EACpD;AACF;;;ACpEA,IAAM,mBAAmB;AACzB,IAAM,kBAAkB;AAkBjB,IAAM,SAAN,MAAa;AAAA,EACD;AAAA,EACA;AAAA,EACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQjB,YAAY,QAAgB,UAAyB,CAAC,GAAG;AACvD,SAAK,SAAS;AACd,SAAK,WAAW,QAAQ,WAAW,kBAAkB,QAAQ,OAAO,EAAE;AACtE,SAAK,UAAU,QAAQ,WAAW;AAAA,EACpC;AAAA,EAEA,MAAc,QACZ,QACA,MACA,MACY;AACZ,UAAM,aAAa,IAAI,gBAAgB;AACvC,UAAM,YAAY,WAAW,MAAM,WAAW,MAAM,GAAG,KAAK,OAAO;AAEnE,QAAI;AACF,YAAM,WAAW,MAAM,MAAM,GAAG,KAAK,OAAO,GAAG,IAAI,IAAI;AAAA,QACrD;AAAA,QACA,SAAS;AAAA,UACP,gBAAgB;AAAA,UAChB,eAAe,UAAU,KAAK,MAAM;AAAA,QACtC;AAAA,QACA,MAAM,OAAO,KAAK,UAAU,IAAI,IAAI;AAAA,QACpC,QAAQ,WAAW;AAAA,MACrB,CAAC;AAED,YAAM,OAAQ,MAAM,SAAS,KAAK;AAElC,UAAI,CAAC,SAAS,IAAI;AAChB,cAAM,QAAS,KAAK,SAAqC,CAAC;AAC1D,cAAM,IAAI,SAAS;AAAA,UACjB,MAAO,MAAM,QAAmB;AAAA,UAChC,SAAU,MAAM,WAAsB;AAAA,UACtC,SAAS,MAAM;AAAA,UACf,WAAW,MAAM;AAAA,UACjB,YAAY,SAAS;AAAA,QACvB,CAAC;AAAA,MACH;AAEA,aAAO;AAAA,IACT,SAAS,KAAK;AACZ,UAAI,eAAe,UAAU;AAC3B,cAAM;AAAA,MACR;AACA,UAAI,eAAe,OAAO;AACxB,YAAI,IAAI,SAAS,cAAc;AAC7B,gBAAM,IAAI,aAAa,qBAAqB,GAAG;AAAA,QACjD;AACA,cAAM,IAAI,aAAa,mBAAmB,IAAI,OAAO,IAAI,GAAG;AAAA,MAC9D;AACA,YAAM,IAAI,aAAa,gBAAgB;AAAA,IACzC,UAAE;AACA,mBAAa,SAAS;AAAA,IACxB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,SAAkC;AACtC,WAAO,KAAK,QAAwB,OAAO,SAAS;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cACJ,SAC0C;AAC1C,UAAM,OAAO;AAAA,MACX,WAAW;AAAA,MACX,OAAO,QAAQ;AAAA,MACf,YAAY,QAAQ;AAAA,MACpB,eAAe,QAAQ,gBAAgB;AAAA,IACzC;AAEA,UAAM,OAAO,MAAM,KAAK,QAOrB,QAAQ,mCAAmC,IAAI;AAElD,WAAO;AAAA,MACL,SAAS,KAAK;AAAA,MACd,QAAQ,KAAK;AAAA,MACb,SAAS,KAAK;AAAA,MACd,UAAU;AAAA,QACR,UAAU,KAAK,SAAS;AAAA,QACxB,WAAW,KAAK,SAAS;AAAA,MAC3B;AAAA,MACA,MAAM,KAAK;AAAA,MACX,WAAW,KAAK;AAAA,IAClB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBACJ,SAC6C;AAC7C,UAAM,OAAgC;AAAA,MACpC,WAAW;AAAA,MACX,OAAO,QAAQ;AAAA,MACf,YAAY,QAAQ;AAAA,MACpB,UAAU,QAAQ;AAAA,IACpB;AACA,QAAI,QAAQ,OAAQ,MAAK,SAAS,QAAQ;AAC1C,QAAI,QAAQ,MAAO,MAAK,QAAQ,QAAQ;AACxC,QAAI,QAAQ,WAAY,MAAK,aAAa,QAAQ;AAElD,UAAM,OAAO,MAAM,KAAK,QAOrB,QAAQ,yBAAyB,IAAI;AAExC,WAAO;AAAA,MACL,SAAS,KAAK;AAAA,MACd,QAAQ,KAAK;AAAA,MACb,SAAS,KAAK;AAAA,MACd,UAAU;AAAA,QACR,OAAO,KAAK,SAAS;AAAA,QACrB,WAAW,KAAK,SAAS;AAAA,MAC3B;AAAA,MACA,MAAM,KAAK;AAAA,MACX,WAAW,KAAK;AAAA,IAClB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YACJ,SACwC;AACxC,UAAM,OAAgC;AAAA,MACpC,WAAW;AAAA,MACX,OAAO,QAAQ;AAAA,MACf,YAAY,QAAQ;AAAA,MACpB,eAAe,QAAQ;AAAA,IACzB;AACA,QAAI,QAAQ,OAAQ,MAAK,UAAU,QAAQ;AAE3C,UAAM,OAAO,MAAM,KAAK,QAarB,QAAQ,oBAAoB,IAAI;AAEnC,WAAO;AAAA,MACL,SAAS,KAAK;AAAA,MACd,QAAQ,KAAK;AAAA,MACb,SAAS,KAAK;AAAA,MACd,UAAU;AAAA,QACR,MAAM,KAAK,SAAS;AAAA,QACpB,MAAM,KAAK,SAAS;AAAA,QACpB,WAAW,KAAK,SAAS;AAAA,QACzB,SAAS,KAAK,SAAS;AAAA,QACvB,WAAW,KAAK,SAAS;AAAA,MAC3B;AAAA,MACA,MAAM,KAAK;AAAA,MACX,WAAW,KAAK;AAAA,IAClB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YACJ,SACwC;AACxC,UAAM,OAAO;AAAA,MACX,WAAW;AAAA,MACX,OAAO,QAAQ;AAAA,MACf,YAAY,QAAQ;AAAA,IACtB;AAEA,UAAM,OAAO,MAAM,KAAK,QAOrB,QAAQ,oBAAoB,IAAI;AAEnC,WAAO;AAAA,MACL,SAAS,KAAK;AAAA,MACd,QAAQ,KAAK;AAAA,MACb,SAAS,KAAK;AAAA,MACd,UAAU;AAAA,QACR,OAAO,KAAK,SAAS;AAAA,QACrB,WAAW,KAAK,SAAS;AAAA,MAC3B;AAAA,MACA,MAAM,KAAK;AAAA,MACX,WAAW,KAAK;AAAA,IAClB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WACJ,SACuC;AACvC,UAAM,OAAO;AAAA,MACX,WAAW;AAAA,MACX,OAAO,QAAQ;AAAA,MACf,YAAY,QAAQ;AAAA,MACpB,YAAY,QAAQ;AAAA,MACpB,cAAc,QAAQ;AAAA,MACtB,OAAO,QAAQ;AAAA,MACf,QAAQ,QAAQ;AAAA,IAClB;AAEA,UAAM,OAAO,MAAM,KAAK,QAOrB,QAAQ,mBAAmB,IAAI;AAGlC,UAAM,EAAE,IAAI,GAAG,QAAQ,IAAI,KAAK;AAEhC,WAAO;AAAA,MACL,SAAS,KAAK;AAAA,MACd,QAAQ,KAAK;AAAA,MACb,SAAS,KAAK;AAAA,MACd,UAAU;AAAA,QACR;AAAA,QACA,WAAW;AAAA,MACb;AAAA,MACA,MAAM,KAAK;AAAA,MACX,WAAW,KAAK;AAAA,IAClB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eACJ,SAC2C;AAC3C,UAAM,OAAO;AAAA,MACX,WAAW;AAAA,MACX,OAAO,QAAQ;AAAA,MACf,YAAY,QAAQ;AAAA,MACpB,UAAU,QAAQ;AAAA,IACpB;AAEA,UAAM,OAAO,MAAM,KAAK,QAOrB,QAAQ,uBAAuB,IAAI;AAEtC,WAAO;AAAA,MACL,SAAS,KAAK;AAAA,MACd,QAAQ,KAAK;AAAA,MACb,SAAS,KAAK;AAAA,MACd,UAAU;AAAA,QACR,OAAO,KAAK,SAAS;AAAA,QACrB,WAAW,KAAK,SAAS;AAAA,MAC3B;AAAA,MACA,MAAM,KAAK;AAAA,MACX,WAAW,KAAK;AAAA,IAClB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBACJ,SAC4C;AAC5C,UAAM,OAAO;AAAA,MACX,WAAW;AAAA,MACX,OAAO,QAAQ;AAAA,MACf,YAAY,QAAQ;AAAA,MACpB,mBAAmB,QAAQ;AAAA,MAC3B,SAAS,QAAQ;AAAA,IACnB;AAEA,UAAM,OAAO,MAAM,KAAK,QAerB,QAAQ,kCAAkC,IAAI;AAEjD,WAAO;AAAA,MACL,SAAS,KAAK;AAAA,MACd,QAAQ,KAAK;AAAA,MACb,SAAS,KAAK;AAAA,MACd,UAAU;AAAA,QACR,SAAS;AAAA,UACP,KAAK,KAAK,SAAS,mBAAmB;AAAA,UACtC,MAAM,KAAK,SAAS,mBAAmB;AAAA,UACvC,OAAO,KAAK,SAAS,mBAAmB;AAAA,UACxC,OAAO,KAAK,SAAS,mBAAmB;AAAA,QAC1C;AAAA,QACA,WAAW,KAAK,SAAS;AAAA,MAC3B;AAAA,MACA,MAAM,KAAK;AAAA,MACX,WAAW,KAAK;AAAA,IAClB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,mBACJ,SAC+C;AAC/C,UAAM,OAAO;AAAA,MACX,WAAW;AAAA,MACX,OAAO,QAAQ;AAAA,MACf,YAAY,QAAQ;AAAA,MACpB,eAAe,QAAQ,gBAAgB;AAAA,IACzC;AAEA,UAAM,OAAO,MAAM,KAAK,QAOrB,QAAQ,4BAA4B,IAAI;AAE3C,WAAO;AAAA,MACL,SAAS,KAAK;AAAA,MACd,QAAQ,KAAK;AAAA,MACb,SAAS,KAAK;AAAA,MACd,UAAU;AAAA,QACR,aAAa,KAAK,SAAS;AAAA,QAC3B,WAAW,KAAK,SAAS;AAAA,MAC3B;AAAA,MACA,MAAM,KAAK;AAAA,MACX,WAAW,KAAK;AAAA,IAClB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,oBACJ,SACgD;AAChD,UAAM,OAAO;AAAA,MACX,WAAW;AAAA,MACX,OAAO,QAAQ;AAAA,MACf,YAAY,QAAQ;AAAA,MACpB,eAAe,QAAQ,gBAAgB;AAAA,IACzC;AAEA,UAAM,OAAO,MAAM,KAAK,QAOrB,QAAQ,6BAA6B,IAAI;AAE5C,WAAO;AAAA,MACL,SAAS,KAAK;AAAA,MACd,QAAQ,KAAK;AAAA,MACb,SAAS,KAAK;AAAA,MACd,UAAU;AAAA,QACR,UAAU,KAAK,SAAS;AAAA,QACxB,WAAW,KAAK,SAAS;AAAA,MAC3B;AAAA,MACA,MAAM,KAAK;AAAA,MACX,WAAW,KAAK;AAAA,IAClB;AAAA,EACF;AACF;","names":[]}
1
+ {"version":3,"sources":["../src/index.ts","../src/errors.ts","../src/client.ts"],"sourcesContent":["/**\n * Gatsbie SDK - Official Node.js SDK for the Gatsbie Captcha API.\n *\n * @example\n * ```typescript\n * import { Client } from \"gatsbie\";\n *\n * const client = new Client(\"gats_your_api_key\");\n *\n * const response = await client.solveTurnstile({\n * proxy: \"http://user:pass@proxy:8080\",\n * targetUrl: \"https://example.com\",\n * siteKey: \"0x4AAAAAAABS7TtLxsNa7Z2e\",\n * });\n *\n * console.log(response.solution.token);\n * ```\n */\n\nexport { Client } from \"./client\";\nexport {\n APIError,\n ErrorCode,\n GatsbieError,\n RequestError,\n} from \"./errors\";\nexport type {\n // Response types\n HealthResponse,\n SolveResponse,\n // Solution types\n AkamaiSolution,\n CloudflareWAFSolution,\n DatadomeSliderSolution,\n DatadomeSolution,\n PerimeterXCookies,\n PerimeterXSolution,\n RecaptchaV3Solution,\n ShapeSolution,\n TurnstileSolution,\n VercelSolution,\n // Request types\n AkamaiRequest,\n CloudflareWAFRequest,\n DatadomeRequest,\n DatadomeSliderRequest,\n PerimeterXRequest,\n RecaptchaV3Request,\n ShapeRequest,\n TurnstileRequest,\n VercelRequest,\n // Options\n ClientOptions,\n} from \"./types\";\n","/**\n * Error codes returned by the Gatsbie API.\n */\nexport const ErrorCode = {\n AUTH_FAILED: \"AUTH_FAILED\",\n INSUFFICIENT_CREDITS: \"INSUFFICIENT_CREDITS\",\n INVALID_REQUEST: \"INVALID_REQUEST\",\n UPSTREAM_ERROR: \"UPSTREAM_ERROR\",\n SOLVE_FAILED: \"SOLVE_FAILED\",\n INTERNAL_ERROR: \"INTERNAL_ERROR\",\n} as const;\n\nexport type ErrorCode = (typeof ErrorCode)[keyof typeof ErrorCode];\n\n/**\n * Base error class for Gatsbie SDK errors.\n */\nexport class GatsbieError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"GatsbieError\";\n Object.setPrototypeOf(this, GatsbieError.prototype);\n }\n}\n\n/**\n * Error thrown when the Gatsbie API returns an error response.\n */\nexport class APIError extends GatsbieError {\n readonly code: string;\n readonly details?: string;\n readonly timestamp?: number;\n readonly httpStatus?: number;\n\n constructor(options: {\n code: string;\n message: string;\n details?: string;\n timestamp?: number;\n httpStatus?: number;\n }) {\n const msg = options.details\n ? `gatsbie: ${options.code}: ${options.message} (${options.details})`\n : `gatsbie: ${options.code}: ${options.message}`;\n super(msg);\n this.name = \"APIError\";\n this.code = options.code;\n this.details = options.details;\n this.timestamp = options.timestamp;\n this.httpStatus = options.httpStatus;\n Object.setPrototypeOf(this, APIError.prototype);\n }\n\n /** Check if this is an authentication error. */\n isAuthError(): boolean {\n return this.code === ErrorCode.AUTH_FAILED;\n }\n\n /** Check if this error is due to insufficient credits. */\n isInsufficientCredits(): boolean {\n return this.code === ErrorCode.INSUFFICIENT_CREDITS;\n }\n\n /** Check if this error is due to an invalid request. */\n isInvalidRequest(): boolean {\n return this.code === ErrorCode.INVALID_REQUEST;\n }\n\n /** Check if this error is from an upstream service. */\n isUpstreamError(): boolean {\n return this.code === ErrorCode.UPSTREAM_ERROR;\n }\n\n /** Check if the captcha solving failed. */\n isSolveFailed(): boolean {\n return this.code === ErrorCode.SOLVE_FAILED;\n }\n\n /** Check if this is an internal server error. */\n isInternalError(): boolean {\n return this.code === ErrorCode.INTERNAL_ERROR;\n }\n}\n\n/**\n * Error thrown when a request fails (network error, timeout, etc.).\n */\nexport class RequestError extends GatsbieError {\n constructor(message: string, public readonly cause?: Error) {\n super(message);\n this.name = \"RequestError\";\n Object.setPrototypeOf(this, RequestError.prototype);\n }\n}\n","import { APIError, RequestError } from \"./errors\";\nimport type {\n AkamaiRequest,\n AkamaiSolution,\n ClientOptions,\n CloudflareWAFRequest,\n CloudflareWAFSolution,\n DatadomeRequest,\n DatadomeSliderRequest,\n DatadomeSliderSolution,\n DatadomeSolution,\n HealthResponse,\n PerimeterXRequest,\n PerimeterXSolution,\n RecaptchaV3Request,\n RecaptchaV3Solution,\n ShapeRequest,\n ShapeSolution,\n SolveResponse,\n TurnstileRequest,\n TurnstileSolution,\n VercelRequest,\n VercelSolution,\n} from \"./types\";\n\nconst DEFAULT_BASE_URL = \"https://api2.gatsbie.io\";\nconst DEFAULT_TIMEOUT = 120000;\n\n/**\n * Gatsbie API client.\n *\n * @example\n * ```typescript\n * const client = new Client(\"gats_your_api_key\");\n *\n * const response = await client.solveTurnstile({\n * proxy: \"http://user:pass@proxy:8080\",\n * targetUrl: \"https://example.com\",\n * siteKey: \"0x4AAAAAAABS7TtLxsNa7Z2e\",\n * });\n *\n * console.log(response.solution.token);\n * ```\n */\nexport class Client {\n private readonly apiKey: string;\n private readonly baseUrl: string;\n private readonly timeout: number;\n\n /**\n * Create a new Gatsbie API client.\n *\n * @param apiKey - Your Gatsbie API key (should start with 'gats_').\n * @param options - Optional client configuration.\n */\n constructor(apiKey: string, options: ClientOptions = {}) {\n this.apiKey = apiKey;\n this.baseUrl = (options.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/$/, \"\");\n this.timeout = options.timeout ?? DEFAULT_TIMEOUT;\n }\n\n private async request<T>(\n method: string,\n path: string,\n body?: Record<string, unknown>\n ): Promise<T> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(`${this.baseUrl}${path}`, {\n method,\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: body ? JSON.stringify(body) : undefined,\n signal: controller.signal,\n });\n\n const data = (await response.json()) as Record<string, unknown>;\n\n if (!response.ok) {\n const error = (data.error as Record<string, unknown>) || {};\n throw new APIError({\n code: (error.code as string) || \"UNKNOWN\",\n message: (error.message as string) || \"Unknown error\",\n details: error.details as string | undefined,\n timestamp: error.timestamp as number | undefined,\n httpStatus: response.status,\n });\n }\n\n return data as T;\n } catch (err) {\n if (err instanceof APIError) {\n throw err;\n }\n if (err instanceof Error) {\n if (err.name === \"AbortError\") {\n throw new RequestError(\"Request timed out\", err);\n }\n throw new RequestError(`Request failed: ${err.message}`, err);\n }\n throw new RequestError(\"Request failed\");\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n // ========================================================================\n // API Methods\n // ========================================================================\n\n /**\n * Check the API server health status.\n */\n async health(): Promise<HealthResponse> {\n return this.request<HealthResponse>(\"GET\", \"/health\");\n }\n\n /**\n * Solve a Datadome device check challenge.\n */\n async solveDatadome(\n request: DatadomeRequest\n ): Promise<SolveResponse<DatadomeSolution>> {\n const body = {\n task_type: \"datadome-device-check\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n target_method: request.targetMethod ?? \"GET\",\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: { datadome: string; ua: string };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/datadome-device-check\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n datadome: data.solution.datadome,\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a reCAPTCHA v3 challenge.\n */\n async solveRecaptchaV3(\n request: RecaptchaV3Request\n ): Promise<SolveResponse<RecaptchaV3Solution>> {\n const body: Record<string, unknown> = {\n task_type: \"recaptchav3\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n site_key: request.siteKey,\n };\n if (request.action) body.action = request.action;\n if (request.title) body.title = request.title;\n if (request.enterprise) body.enterprise = request.enterprise;\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: { token: string; ua: string };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/recaptchav3\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n token: data.solution.token,\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve an Akamai bot management challenge.\n */\n async solveAkamai(\n request: AkamaiRequest\n ): Promise<SolveResponse<AkamaiSolution>> {\n const body: Record<string, unknown> = {\n task_type: \"akamai\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n akamai_js_url: request.akamaiJsUrl,\n };\n if (request.pageFp) body.page_fp = request.pageFp;\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: {\n cookies_dict: {\n _abck: string;\n bm_sz: string;\n Country?: string;\n UsrLocale?: string;\n };\n ua: string;\n };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/akamai\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n cookies: {\n abck: data.solution.cookies_dict._abck,\n bmSz: data.solution.cookies_dict.bm_sz,\n country: data.solution.cookies_dict.Country,\n usrLocale: data.solution.cookies_dict.UsrLocale,\n },\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a Vercel bot protection challenge.\n */\n async solveVercel(\n request: VercelRequest\n ): Promise<SolveResponse<VercelSolution>> {\n const body = {\n task_type: \"vercel\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: { _vcrcs: string; ua: string };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/vercel\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n vcrcs: data.solution._vcrcs,\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a Shape antibot challenge.\n */\n async solveShape(\n request: ShapeRequest\n ): Promise<SolveResponse<ShapeSolution>> {\n const body = {\n task_type: \"shape\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n target_api: request.targetApi,\n shape_js_url: request.shapeJsUrl,\n title: request.title,\n method: request.method,\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: Record<string, string>;\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/shape\", body);\n\n // Shape returns dynamic headers, extract User-Agent separately\n const { \"User-Agent\": userAgent, ...headers } = data.solution;\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n headers,\n userAgent: userAgent || \"\",\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a Cloudflare Turnstile challenge.\n */\n async solveTurnstile(\n request: TurnstileRequest\n ): Promise<SolveResponse<TurnstileSolution>> {\n const body = {\n task_type: \"turnstile\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n site_key: request.siteKey,\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: { token: string; ua: string };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/turnstile\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n token: data.solution.token,\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a PerimeterX Invisible challenge.\n */\n async solvePerimeterX(\n request: PerimeterXRequest\n ): Promise<SolveResponse<PerimeterXSolution>> {\n const body = {\n task_type: \"perimeterx_invisible\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n perimeterx_js_url: request.perimeterxJsUrl,\n pxAppId: request.pxAppId,\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: {\n perimeterx_cookies: {\n _px3: string;\n _pxde: string;\n _pxvid: string;\n pxcts: string;\n };\n ua: string;\n };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/perimeterx-invisible\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n cookies: {\n px3: data.solution.perimeterx_cookies._px3,\n pxde: data.solution.perimeterx_cookies._pxde,\n pxvid: data.solution.perimeterx_cookies._pxvid,\n pxcts: data.solution.perimeterx_cookies.pxcts,\n },\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a Cloudflare WAF challenge.\n */\n async solveCloudflareWAF(\n request: CloudflareWAFRequest\n ): Promise<SolveResponse<CloudflareWAFSolution>> {\n const body = {\n task_type: \"cloudflare_waf\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n target_method: request.targetMethod ?? \"GET\",\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: {\n cookies: {\n cf_clearance: string;\n };\n ua: string;\n };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/cloudflare-waf\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n cookies: {\n cfClearance: data.solution.cookies.cf_clearance,\n },\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a Datadome Slider CAPTCHA challenge.\n */\n async solveDatadomeSlider(\n request: DatadomeSliderRequest\n ): Promise<SolveResponse<DatadomeSliderSolution>> {\n const body = {\n task_type: \"datadome-slider\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n target_method: request.targetMethod ?? \"GET\",\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: { datadome: string; ua: string };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/datadome-slider\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n datadome: data.solution.datadome,\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n}\n"],"mappings":"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","names":[]}
package/dist/index.mjs CHANGED
@@ -196,11 +196,13 @@ var Client = class {
196
196
  taskId: data.taskId,
197
197
  service: data.service,
198
198
  solution: {
199
- abck: data.solution._abck,
200
- bmSz: data.solution.bm_sz,
201
- userAgent: data.solution.ua,
202
- country: data.solution.Country,
203
- usrLocale: data.solution.UsrLocale
199
+ cookies: {
200
+ abck: data.solution.cookies_dict._abck,
201
+ bmSz: data.solution.cookies_dict.bm_sz,
202
+ country: data.solution.cookies_dict.Country,
203
+ usrLocale: data.solution.cookies_dict.UsrLocale
204
+ },
205
+ userAgent: data.solution.ua
204
206
  },
205
207
  cost: data.cost,
206
208
  solveTime: data.solveTime
@@ -242,14 +244,14 @@ var Client = class {
242
244
  method: request.method
243
245
  };
244
246
  const data = await this.request("POST", "/v1/solve/shape", body);
245
- const { ua, ...headers } = data.solution;
247
+ const { "User-Agent": userAgent, ...headers } = data.solution;
246
248
  return {
247
249
  success: data.success,
248
250
  taskId: data.taskId,
249
251
  service: data.service,
250
252
  solution: {
251
253
  headers,
252
- userAgent: ua
254
+ userAgent: userAgent || ""
253
255
  },
254
256
  cost: data.cost,
255
257
  solveTime: data.solveTime
@@ -323,7 +325,9 @@ var Client = class {
323
325
  taskId: data.taskId,
324
326
  service: data.service,
325
327
  solution: {
326
- cfClearance: data.solution.cf_clearance,
328
+ cookies: {
329
+ cfClearance: data.solution.cookies.cf_clearance
330
+ },
327
331
  userAgent: data.solution.ua
328
332
  },
329
333
  cost: data.cost,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/errors.ts","../src/client.ts"],"sourcesContent":["/**\n * Error codes returned by the Gatsbie API.\n */\nexport const ErrorCode = {\n AUTH_FAILED: \"AUTH_FAILED\",\n INSUFFICIENT_CREDITS: \"INSUFFICIENT_CREDITS\",\n INVALID_REQUEST: \"INVALID_REQUEST\",\n UPSTREAM_ERROR: \"UPSTREAM_ERROR\",\n SOLVE_FAILED: \"SOLVE_FAILED\",\n INTERNAL_ERROR: \"INTERNAL_ERROR\",\n} as const;\n\nexport type ErrorCode = (typeof ErrorCode)[keyof typeof ErrorCode];\n\n/**\n * Base error class for Gatsbie SDK errors.\n */\nexport class GatsbieError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"GatsbieError\";\n Object.setPrototypeOf(this, GatsbieError.prototype);\n }\n}\n\n/**\n * Error thrown when the Gatsbie API returns an error response.\n */\nexport class APIError extends GatsbieError {\n readonly code: string;\n readonly details?: string;\n readonly timestamp?: number;\n readonly httpStatus?: number;\n\n constructor(options: {\n code: string;\n message: string;\n details?: string;\n timestamp?: number;\n httpStatus?: number;\n }) {\n const msg = options.details\n ? `gatsbie: ${options.code}: ${options.message} (${options.details})`\n : `gatsbie: ${options.code}: ${options.message}`;\n super(msg);\n this.name = \"APIError\";\n this.code = options.code;\n this.details = options.details;\n this.timestamp = options.timestamp;\n this.httpStatus = options.httpStatus;\n Object.setPrototypeOf(this, APIError.prototype);\n }\n\n /** Check if this is an authentication error. */\n isAuthError(): boolean {\n return this.code === ErrorCode.AUTH_FAILED;\n }\n\n /** Check if this error is due to insufficient credits. */\n isInsufficientCredits(): boolean {\n return this.code === ErrorCode.INSUFFICIENT_CREDITS;\n }\n\n /** Check if this error is due to an invalid request. */\n isInvalidRequest(): boolean {\n return this.code === ErrorCode.INVALID_REQUEST;\n }\n\n /** Check if this error is from an upstream service. */\n isUpstreamError(): boolean {\n return this.code === ErrorCode.UPSTREAM_ERROR;\n }\n\n /** Check if the captcha solving failed. */\n isSolveFailed(): boolean {\n return this.code === ErrorCode.SOLVE_FAILED;\n }\n\n /** Check if this is an internal server error. */\n isInternalError(): boolean {\n return this.code === ErrorCode.INTERNAL_ERROR;\n }\n}\n\n/**\n * Error thrown when a request fails (network error, timeout, etc.).\n */\nexport class RequestError extends GatsbieError {\n constructor(message: string, public readonly cause?: Error) {\n super(message);\n this.name = \"RequestError\";\n Object.setPrototypeOf(this, RequestError.prototype);\n }\n}\n","import { APIError, RequestError } from \"./errors\";\nimport type {\n AkamaiRequest,\n AkamaiSolution,\n ClientOptions,\n CloudflareWAFRequest,\n CloudflareWAFSolution,\n DatadomeRequest,\n DatadomeSliderRequest,\n DatadomeSliderSolution,\n DatadomeSolution,\n HealthResponse,\n PerimeterXRequest,\n PerimeterXSolution,\n RecaptchaV3Request,\n RecaptchaV3Solution,\n ShapeRequest,\n ShapeSolution,\n SolveResponse,\n TurnstileRequest,\n TurnstileSolution,\n VercelRequest,\n VercelSolution,\n} from \"./types\";\n\nconst DEFAULT_BASE_URL = \"https://api2.gatsbie.io\";\nconst DEFAULT_TIMEOUT = 120000;\n\n/**\n * Gatsbie API client.\n *\n * @example\n * ```typescript\n * const client = new Client(\"gats_your_api_key\");\n *\n * const response = await client.solveTurnstile({\n * proxy: \"http://user:pass@proxy:8080\",\n * targetUrl: \"https://example.com\",\n * siteKey: \"0x4AAAAAAABS7TtLxsNa7Z2e\",\n * });\n *\n * console.log(response.solution.token);\n * ```\n */\nexport class Client {\n private readonly apiKey: string;\n private readonly baseUrl: string;\n private readonly timeout: number;\n\n /**\n * Create a new Gatsbie API client.\n *\n * @param apiKey - Your Gatsbie API key (should start with 'gats_').\n * @param options - Optional client configuration.\n */\n constructor(apiKey: string, options: ClientOptions = {}) {\n this.apiKey = apiKey;\n this.baseUrl = (options.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/$/, \"\");\n this.timeout = options.timeout ?? DEFAULT_TIMEOUT;\n }\n\n private async request<T>(\n method: string,\n path: string,\n body?: Record<string, unknown>\n ): Promise<T> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(`${this.baseUrl}${path}`, {\n method,\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: body ? JSON.stringify(body) : undefined,\n signal: controller.signal,\n });\n\n const data = (await response.json()) as Record<string, unknown>;\n\n if (!response.ok) {\n const error = (data.error as Record<string, unknown>) || {};\n throw new APIError({\n code: (error.code as string) || \"UNKNOWN\",\n message: (error.message as string) || \"Unknown error\",\n details: error.details as string | undefined,\n timestamp: error.timestamp as number | undefined,\n httpStatus: response.status,\n });\n }\n\n return data as T;\n } catch (err) {\n if (err instanceof APIError) {\n throw err;\n }\n if (err instanceof Error) {\n if (err.name === \"AbortError\") {\n throw new RequestError(\"Request timed out\", err);\n }\n throw new RequestError(`Request failed: ${err.message}`, err);\n }\n throw new RequestError(\"Request failed\");\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n // ========================================================================\n // API Methods\n // ========================================================================\n\n /**\n * Check the API server health status.\n */\n async health(): Promise<HealthResponse> {\n return this.request<HealthResponse>(\"GET\", \"/health\");\n }\n\n /**\n * Solve a Datadome device check challenge.\n */\n async solveDatadome(\n request: DatadomeRequest\n ): Promise<SolveResponse<DatadomeSolution>> {\n const body = {\n task_type: \"datadome-device-check\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n target_method: request.targetMethod ?? \"GET\",\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: { datadome: string; ua: string };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/datadome-device-check\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n datadome: data.solution.datadome,\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a reCAPTCHA v3 challenge.\n */\n async solveRecaptchaV3(\n request: RecaptchaV3Request\n ): Promise<SolveResponse<RecaptchaV3Solution>> {\n const body: Record<string, unknown> = {\n task_type: \"recaptchav3\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n site_key: request.siteKey,\n };\n if (request.action) body.action = request.action;\n if (request.title) body.title = request.title;\n if (request.enterprise) body.enterprise = request.enterprise;\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: { token: string; ua: string };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/recaptchav3\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n token: data.solution.token,\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve an Akamai bot management challenge.\n */\n async solveAkamai(\n request: AkamaiRequest\n ): Promise<SolveResponse<AkamaiSolution>> {\n const body: Record<string, unknown> = {\n task_type: \"akamai\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n akamai_js_url: request.akamaiJsUrl,\n };\n if (request.pageFp) body.page_fp = request.pageFp;\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: {\n _abck: string;\n bm_sz: string;\n ua: string;\n Country?: string;\n UsrLocale?: string;\n };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/akamai\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n abck: data.solution._abck,\n bmSz: data.solution.bm_sz,\n userAgent: data.solution.ua,\n country: data.solution.Country,\n usrLocale: data.solution.UsrLocale,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a Vercel bot protection challenge.\n */\n async solveVercel(\n request: VercelRequest\n ): Promise<SolveResponse<VercelSolution>> {\n const body = {\n task_type: \"vercel\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: { _vcrcs: string; ua: string };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/vercel\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n vcrcs: data.solution._vcrcs,\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a Shape antibot challenge.\n */\n async solveShape(\n request: ShapeRequest\n ): Promise<SolveResponse<ShapeSolution>> {\n const body = {\n task_type: \"shape\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n target_api: request.targetApi,\n shape_js_url: request.shapeJsUrl,\n title: request.title,\n method: request.method,\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: Record<string, string>;\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/shape\", body);\n\n // Shape returns dynamic headers, extract ua separately\n const { ua, ...headers } = data.solution;\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n headers,\n userAgent: ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a Cloudflare Turnstile challenge.\n */\n async solveTurnstile(\n request: TurnstileRequest\n ): Promise<SolveResponse<TurnstileSolution>> {\n const body = {\n task_type: \"turnstile\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n site_key: request.siteKey,\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: { token: string; ua: string };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/turnstile\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n token: data.solution.token,\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a PerimeterX Invisible challenge.\n */\n async solvePerimeterX(\n request: PerimeterXRequest\n ): Promise<SolveResponse<PerimeterXSolution>> {\n const body = {\n task_type: \"perimeterx_invisible\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n perimeterx_js_url: request.perimeterxJsUrl,\n pxAppId: request.pxAppId,\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: {\n perimeterx_cookies: {\n _px3: string;\n _pxde: string;\n _pxvid: string;\n pxcts: string;\n };\n ua: string;\n };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/perimeterx-invisible\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n cookies: {\n px3: data.solution.perimeterx_cookies._px3,\n pxde: data.solution.perimeterx_cookies._pxde,\n pxvid: data.solution.perimeterx_cookies._pxvid,\n pxcts: data.solution.perimeterx_cookies.pxcts,\n },\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a Cloudflare WAF challenge.\n */\n async solveCloudflareWAF(\n request: CloudflareWAFRequest\n ): Promise<SolveResponse<CloudflareWAFSolution>> {\n const body = {\n task_type: \"cloudflare_waf\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n target_method: request.targetMethod ?? \"GET\",\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: { cf_clearance: string; ua: string };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/cloudflare-waf\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n cfClearance: data.solution.cf_clearance,\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a Datadome Slider CAPTCHA challenge.\n */\n async solveDatadomeSlider(\n request: DatadomeSliderRequest\n ): Promise<SolveResponse<DatadomeSliderSolution>> {\n const body = {\n task_type: \"datadome-slider\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n target_method: request.targetMethod ?? \"GET\",\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: { datadome: string; ua: string };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/datadome-slider\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n datadome: data.solution.datadome,\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/errors.ts","../src/client.ts"],"sourcesContent":["/**\n * Error codes returned by the Gatsbie API.\n */\nexport const ErrorCode = {\n AUTH_FAILED: \"AUTH_FAILED\",\n INSUFFICIENT_CREDITS: \"INSUFFICIENT_CREDITS\",\n INVALID_REQUEST: \"INVALID_REQUEST\",\n UPSTREAM_ERROR: \"UPSTREAM_ERROR\",\n SOLVE_FAILED: \"SOLVE_FAILED\",\n INTERNAL_ERROR: \"INTERNAL_ERROR\",\n} as const;\n\nexport type ErrorCode = (typeof ErrorCode)[keyof typeof ErrorCode];\n\n/**\n * Base error class for Gatsbie SDK errors.\n */\nexport class GatsbieError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"GatsbieError\";\n Object.setPrototypeOf(this, GatsbieError.prototype);\n }\n}\n\n/**\n * Error thrown when the Gatsbie API returns an error response.\n */\nexport class APIError extends GatsbieError {\n readonly code: string;\n readonly details?: string;\n readonly timestamp?: number;\n readonly httpStatus?: number;\n\n constructor(options: {\n code: string;\n message: string;\n details?: string;\n timestamp?: number;\n httpStatus?: number;\n }) {\n const msg = options.details\n ? `gatsbie: ${options.code}: ${options.message} (${options.details})`\n : `gatsbie: ${options.code}: ${options.message}`;\n super(msg);\n this.name = \"APIError\";\n this.code = options.code;\n this.details = options.details;\n this.timestamp = options.timestamp;\n this.httpStatus = options.httpStatus;\n Object.setPrototypeOf(this, APIError.prototype);\n }\n\n /** Check if this is an authentication error. */\n isAuthError(): boolean {\n return this.code === ErrorCode.AUTH_FAILED;\n }\n\n /** Check if this error is due to insufficient credits. */\n isInsufficientCredits(): boolean {\n return this.code === ErrorCode.INSUFFICIENT_CREDITS;\n }\n\n /** Check if this error is due to an invalid request. */\n isInvalidRequest(): boolean {\n return this.code === ErrorCode.INVALID_REQUEST;\n }\n\n /** Check if this error is from an upstream service. */\n isUpstreamError(): boolean {\n return this.code === ErrorCode.UPSTREAM_ERROR;\n }\n\n /** Check if the captcha solving failed. */\n isSolveFailed(): boolean {\n return this.code === ErrorCode.SOLVE_FAILED;\n }\n\n /** Check if this is an internal server error. */\n isInternalError(): boolean {\n return this.code === ErrorCode.INTERNAL_ERROR;\n }\n}\n\n/**\n * Error thrown when a request fails (network error, timeout, etc.).\n */\nexport class RequestError extends GatsbieError {\n constructor(message: string, public readonly cause?: Error) {\n super(message);\n this.name = \"RequestError\";\n Object.setPrototypeOf(this, RequestError.prototype);\n }\n}\n","import { APIError, RequestError } from \"./errors\";\nimport type {\n AkamaiRequest,\n AkamaiSolution,\n ClientOptions,\n CloudflareWAFRequest,\n CloudflareWAFSolution,\n DatadomeRequest,\n DatadomeSliderRequest,\n DatadomeSliderSolution,\n DatadomeSolution,\n HealthResponse,\n PerimeterXRequest,\n PerimeterXSolution,\n RecaptchaV3Request,\n RecaptchaV3Solution,\n ShapeRequest,\n ShapeSolution,\n SolveResponse,\n TurnstileRequest,\n TurnstileSolution,\n VercelRequest,\n VercelSolution,\n} from \"./types\";\n\nconst DEFAULT_BASE_URL = \"https://api2.gatsbie.io\";\nconst DEFAULT_TIMEOUT = 120000;\n\n/**\n * Gatsbie API client.\n *\n * @example\n * ```typescript\n * const client = new Client(\"gats_your_api_key\");\n *\n * const response = await client.solveTurnstile({\n * proxy: \"http://user:pass@proxy:8080\",\n * targetUrl: \"https://example.com\",\n * siteKey: \"0x4AAAAAAABS7TtLxsNa7Z2e\",\n * });\n *\n * console.log(response.solution.token);\n * ```\n */\nexport class Client {\n private readonly apiKey: string;\n private readonly baseUrl: string;\n private readonly timeout: number;\n\n /**\n * Create a new Gatsbie API client.\n *\n * @param apiKey - Your Gatsbie API key (should start with 'gats_').\n * @param options - Optional client configuration.\n */\n constructor(apiKey: string, options: ClientOptions = {}) {\n this.apiKey = apiKey;\n this.baseUrl = (options.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/$/, \"\");\n this.timeout = options.timeout ?? DEFAULT_TIMEOUT;\n }\n\n private async request<T>(\n method: string,\n path: string,\n body?: Record<string, unknown>\n ): Promise<T> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(`${this.baseUrl}${path}`, {\n method,\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: body ? JSON.stringify(body) : undefined,\n signal: controller.signal,\n });\n\n const data = (await response.json()) as Record<string, unknown>;\n\n if (!response.ok) {\n const error = (data.error as Record<string, unknown>) || {};\n throw new APIError({\n code: (error.code as string) || \"UNKNOWN\",\n message: (error.message as string) || \"Unknown error\",\n details: error.details as string | undefined,\n timestamp: error.timestamp as number | undefined,\n httpStatus: response.status,\n });\n }\n\n return data as T;\n } catch (err) {\n if (err instanceof APIError) {\n throw err;\n }\n if (err instanceof Error) {\n if (err.name === \"AbortError\") {\n throw new RequestError(\"Request timed out\", err);\n }\n throw new RequestError(`Request failed: ${err.message}`, err);\n }\n throw new RequestError(\"Request failed\");\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n // ========================================================================\n // API Methods\n // ========================================================================\n\n /**\n * Check the API server health status.\n */\n async health(): Promise<HealthResponse> {\n return this.request<HealthResponse>(\"GET\", \"/health\");\n }\n\n /**\n * Solve a Datadome device check challenge.\n */\n async solveDatadome(\n request: DatadomeRequest\n ): Promise<SolveResponse<DatadomeSolution>> {\n const body = {\n task_type: \"datadome-device-check\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n target_method: request.targetMethod ?? \"GET\",\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: { datadome: string; ua: string };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/datadome-device-check\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n datadome: data.solution.datadome,\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a reCAPTCHA v3 challenge.\n */\n async solveRecaptchaV3(\n request: RecaptchaV3Request\n ): Promise<SolveResponse<RecaptchaV3Solution>> {\n const body: Record<string, unknown> = {\n task_type: \"recaptchav3\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n site_key: request.siteKey,\n };\n if (request.action) body.action = request.action;\n if (request.title) body.title = request.title;\n if (request.enterprise) body.enterprise = request.enterprise;\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: { token: string; ua: string };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/recaptchav3\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n token: data.solution.token,\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve an Akamai bot management challenge.\n */\n async solveAkamai(\n request: AkamaiRequest\n ): Promise<SolveResponse<AkamaiSolution>> {\n const body: Record<string, unknown> = {\n task_type: \"akamai\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n akamai_js_url: request.akamaiJsUrl,\n };\n if (request.pageFp) body.page_fp = request.pageFp;\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: {\n cookies_dict: {\n _abck: string;\n bm_sz: string;\n Country?: string;\n UsrLocale?: string;\n };\n ua: string;\n };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/akamai\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n cookies: {\n abck: data.solution.cookies_dict._abck,\n bmSz: data.solution.cookies_dict.bm_sz,\n country: data.solution.cookies_dict.Country,\n usrLocale: data.solution.cookies_dict.UsrLocale,\n },\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a Vercel bot protection challenge.\n */\n async solveVercel(\n request: VercelRequest\n ): Promise<SolveResponse<VercelSolution>> {\n const body = {\n task_type: \"vercel\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: { _vcrcs: string; ua: string };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/vercel\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n vcrcs: data.solution._vcrcs,\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a Shape antibot challenge.\n */\n async solveShape(\n request: ShapeRequest\n ): Promise<SolveResponse<ShapeSolution>> {\n const body = {\n task_type: \"shape\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n target_api: request.targetApi,\n shape_js_url: request.shapeJsUrl,\n title: request.title,\n method: request.method,\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: Record<string, string>;\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/shape\", body);\n\n // Shape returns dynamic headers, extract User-Agent separately\n const { \"User-Agent\": userAgent, ...headers } = data.solution;\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n headers,\n userAgent: userAgent || \"\",\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a Cloudflare Turnstile challenge.\n */\n async solveTurnstile(\n request: TurnstileRequest\n ): Promise<SolveResponse<TurnstileSolution>> {\n const body = {\n task_type: \"turnstile\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n site_key: request.siteKey,\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: { token: string; ua: string };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/turnstile\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n token: data.solution.token,\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a PerimeterX Invisible challenge.\n */\n async solvePerimeterX(\n request: PerimeterXRequest\n ): Promise<SolveResponse<PerimeterXSolution>> {\n const body = {\n task_type: \"perimeterx_invisible\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n perimeterx_js_url: request.perimeterxJsUrl,\n pxAppId: request.pxAppId,\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: {\n perimeterx_cookies: {\n _px3: string;\n _pxde: string;\n _pxvid: string;\n pxcts: string;\n };\n ua: string;\n };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/perimeterx-invisible\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n cookies: {\n px3: data.solution.perimeterx_cookies._px3,\n pxde: data.solution.perimeterx_cookies._pxde,\n pxvid: data.solution.perimeterx_cookies._pxvid,\n pxcts: data.solution.perimeterx_cookies.pxcts,\n },\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a Cloudflare WAF challenge.\n */\n async solveCloudflareWAF(\n request: CloudflareWAFRequest\n ): Promise<SolveResponse<CloudflareWAFSolution>> {\n const body = {\n task_type: \"cloudflare_waf\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n target_method: request.targetMethod ?? \"GET\",\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: {\n cookies: {\n cf_clearance: string;\n };\n ua: string;\n };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/cloudflare-waf\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n cookies: {\n cfClearance: data.solution.cookies.cf_clearance,\n },\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a Datadome Slider CAPTCHA challenge.\n */\n async solveDatadomeSlider(\n request: DatadomeSliderRequest\n ): Promise<SolveResponse<DatadomeSliderSolution>> {\n const body = {\n task_type: \"datadome-slider\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n target_method: request.targetMethod ?? \"GET\",\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: { datadome: string; ua: string };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/datadome-slider\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n datadome: data.solution.datadome,\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n}\n"],"mappings":";AAGO,IAAM,YAAY;AAAA,EACvB,aAAa;AAAA,EACb,sBAAsB;AAAA,EACtB,iBAAiB;AAAA,EACjB,gBAAgB;AAAA,EAChB,cAAc;AAAA,EACd,gBAAgB;AAClB;AAOO,IAAM,eAAN,MAAM,sBAAqB,MAAM;AAAA,EACtC,YAAY,SAAiB;AAC3B,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,WAAO,eAAe,MAAM,cAAa,SAAS;AAAA,EACpD;AACF;AAKO,IAAM,WAAN,MAAM,kBAAiB,aAAa;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAET,YAAY,SAMT;AACD,UAAM,MAAM,QAAQ,UAChB,YAAY,QAAQ,IAAI,KAAK,QAAQ,OAAO,KAAK,QAAQ,OAAO,MAChE,YAAY,QAAQ,IAAI,KAAK,QAAQ,OAAO;AAChD,UAAM,GAAG;AACT,SAAK,OAAO;AACZ,SAAK,OAAO,QAAQ;AACpB,SAAK,UAAU,QAAQ;AACvB,SAAK,YAAY,QAAQ;AACzB,SAAK,aAAa,QAAQ;AAC1B,WAAO,eAAe,MAAM,UAAS,SAAS;AAAA,EAChD;AAAA;AAAA,EAGA,cAAuB;AACrB,WAAO,KAAK,SAAS,UAAU;AAAA,EACjC;AAAA;AAAA,EAGA,wBAAiC;AAC/B,WAAO,KAAK,SAAS,UAAU;AAAA,EACjC;AAAA;AAAA,EAGA,mBAA4B;AAC1B,WAAO,KAAK,SAAS,UAAU;AAAA,EACjC;AAAA;AAAA,EAGA,kBAA2B;AACzB,WAAO,KAAK,SAAS,UAAU;AAAA,EACjC;AAAA;AAAA,EAGA,gBAAyB;AACvB,WAAO,KAAK,SAAS,UAAU;AAAA,EACjC;AAAA;AAAA,EAGA,kBAA2B;AACzB,WAAO,KAAK,SAAS,UAAU;AAAA,EACjC;AACF;AAKO,IAAM,eAAN,MAAM,sBAAqB,aAAa;AAAA,EAC7C,YAAY,SAAiC,OAAe;AAC1D,UAAM,OAAO;AAD8B;AAE3C,SAAK,OAAO;AACZ,WAAO,eAAe,MAAM,cAAa,SAAS;AAAA,EACpD;AACF;;;ACpEA,IAAM,mBAAmB;AACzB,IAAM,kBAAkB;AAkBjB,IAAM,SAAN,MAAa;AAAA,EACD;AAAA,EACA;AAAA,EACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQjB,YAAY,QAAgB,UAAyB,CAAC,GAAG;AACvD,SAAK,SAAS;AACd,SAAK,WAAW,QAAQ,WAAW,kBAAkB,QAAQ,OAAO,EAAE;AACtE,SAAK,UAAU,QAAQ,WAAW;AAAA,EACpC;AAAA,EAEA,MAAc,QACZ,QACA,MACA,MACY;AACZ,UAAM,aAAa,IAAI,gBAAgB;AACvC,UAAM,YAAY,WAAW,MAAM,WAAW,MAAM,GAAG,KAAK,OAAO;AAEnE,QAAI;AACF,YAAM,WAAW,MAAM,MAAM,GAAG,KAAK,OAAO,GAAG,IAAI,IAAI;AAAA,QACrD;AAAA,QACA,SAAS;AAAA,UACP,gBAAgB;AAAA,UAChB,eAAe,UAAU,KAAK,MAAM;AAAA,QACtC;AAAA,QACA,MAAM,OAAO,KAAK,UAAU,IAAI,IAAI;AAAA,QACpC,QAAQ,WAAW;AAAA,MACrB,CAAC;AAED,YAAM,OAAQ,MAAM,SAAS,KAAK;AAElC,UAAI,CAAC,SAAS,IAAI;AAChB,cAAM,QAAS,KAAK,SAAqC,CAAC;AAC1D,cAAM,IAAI,SAAS;AAAA,UACjB,MAAO,MAAM,QAAmB;AAAA,UAChC,SAAU,MAAM,WAAsB;AAAA,UACtC,SAAS,MAAM;AAAA,UACf,WAAW,MAAM;AAAA,UACjB,YAAY,SAAS;AAAA,QACvB,CAAC;AAAA,MACH;AAEA,aAAO;AAAA,IACT,SAAS,KAAK;AACZ,UAAI,eAAe,UAAU;AAC3B,cAAM;AAAA,MACR;AACA,UAAI,eAAe,OAAO;AACxB,YAAI,IAAI,SAAS,cAAc;AAC7B,gBAAM,IAAI,aAAa,qBAAqB,GAAG;AAAA,QACjD;AACA,cAAM,IAAI,aAAa,mBAAmB,IAAI,OAAO,IAAI,GAAG;AAAA,MAC9D;AACA,YAAM,IAAI,aAAa,gBAAgB;AAAA,IACzC,UAAE;AACA,mBAAa,SAAS;AAAA,IACxB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,SAAkC;AACtC,WAAO,KAAK,QAAwB,OAAO,SAAS;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cACJ,SAC0C;AAC1C,UAAM,OAAO;AAAA,MACX,WAAW;AAAA,MACX,OAAO,QAAQ;AAAA,MACf,YAAY,QAAQ;AAAA,MACpB,eAAe,QAAQ,gBAAgB;AAAA,IACzC;AAEA,UAAM,OAAO,MAAM,KAAK,QAOrB,QAAQ,mCAAmC,IAAI;AAElD,WAAO;AAAA,MACL,SAAS,KAAK;AAAA,MACd,QAAQ,KAAK;AAAA,MACb,SAAS,KAAK;AAAA,MACd,UAAU;AAAA,QACR,UAAU,KAAK,SAAS;AAAA,QACxB,WAAW,KAAK,SAAS;AAAA,MAC3B;AAAA,MACA,MAAM,KAAK;AAAA,MACX,WAAW,KAAK;AAAA,IAClB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBACJ,SAC6C;AAC7C,UAAM,OAAgC;AAAA,MACpC,WAAW;AAAA,MACX,OAAO,QAAQ;AAAA,MACf,YAAY,QAAQ;AAAA,MACpB,UAAU,QAAQ;AAAA,IACpB;AACA,QAAI,QAAQ,OAAQ,MAAK,SAAS,QAAQ;AAC1C,QAAI,QAAQ,MAAO,MAAK,QAAQ,QAAQ;AACxC,QAAI,QAAQ,WAAY,MAAK,aAAa,QAAQ;AAElD,UAAM,OAAO,MAAM,KAAK,QAOrB,QAAQ,yBAAyB,IAAI;AAExC,WAAO;AAAA,MACL,SAAS,KAAK;AAAA,MACd,QAAQ,KAAK;AAAA,MACb,SAAS,KAAK;AAAA,MACd,UAAU;AAAA,QACR,OAAO,KAAK,SAAS;AAAA,QACrB,WAAW,KAAK,SAAS;AAAA,MAC3B;AAAA,MACA,MAAM,KAAK;AAAA,MACX,WAAW,KAAK;AAAA,IAClB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YACJ,SACwC;AACxC,UAAM,OAAgC;AAAA,MACpC,WAAW;AAAA,MACX,OAAO,QAAQ;AAAA,MACf,YAAY,QAAQ;AAAA,MACpB,eAAe,QAAQ;AAAA,IACzB;AACA,QAAI,QAAQ,OAAQ,MAAK,UAAU,QAAQ;AAE3C,UAAM,OAAO,MAAM,KAAK,QAerB,QAAQ,oBAAoB,IAAI;AAEnC,WAAO;AAAA,MACL,SAAS,KAAK;AAAA,MACd,QAAQ,KAAK;AAAA,MACb,SAAS,KAAK;AAAA,MACd,UAAU;AAAA,QACR,SAAS;AAAA,UACP,MAAM,KAAK,SAAS,aAAa;AAAA,UACjC,MAAM,KAAK,SAAS,aAAa;AAAA,UACjC,SAAS,KAAK,SAAS,aAAa;AAAA,UACpC,WAAW,KAAK,SAAS,aAAa;AAAA,QACxC;AAAA,QACA,WAAW,KAAK,SAAS;AAAA,MAC3B;AAAA,MACA,MAAM,KAAK;AAAA,MACX,WAAW,KAAK;AAAA,IAClB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YACJ,SACwC;AACxC,UAAM,OAAO;AAAA,MACX,WAAW;AAAA,MACX,OAAO,QAAQ;AAAA,MACf,YAAY,QAAQ;AAAA,IACtB;AAEA,UAAM,OAAO,MAAM,KAAK,QAOrB,QAAQ,oBAAoB,IAAI;AAEnC,WAAO;AAAA,MACL,SAAS,KAAK;AAAA,MACd,QAAQ,KAAK;AAAA,MACb,SAAS,KAAK;AAAA,MACd,UAAU;AAAA,QACR,OAAO,KAAK,SAAS;AAAA,QACrB,WAAW,KAAK,SAAS;AAAA,MAC3B;AAAA,MACA,MAAM,KAAK;AAAA,MACX,WAAW,KAAK;AAAA,IAClB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WACJ,SACuC;AACvC,UAAM,OAAO;AAAA,MACX,WAAW;AAAA,MACX,OAAO,QAAQ;AAAA,MACf,YAAY,QAAQ;AAAA,MACpB,YAAY,QAAQ;AAAA,MACpB,cAAc,QAAQ;AAAA,MACtB,OAAO,QAAQ;AAAA,MACf,QAAQ,QAAQ;AAAA,IAClB;AAEA,UAAM,OAAO,MAAM,KAAK,QAOrB,QAAQ,mBAAmB,IAAI;AAGlC,UAAM,EAAE,cAAc,WAAW,GAAG,QAAQ,IAAI,KAAK;AAErD,WAAO;AAAA,MACL,SAAS,KAAK;AAAA,MACd,QAAQ,KAAK;AAAA,MACb,SAAS,KAAK;AAAA,MACd,UAAU;AAAA,QACR;AAAA,QACA,WAAW,aAAa;AAAA,MAC1B;AAAA,MACA,MAAM,KAAK;AAAA,MACX,WAAW,KAAK;AAAA,IAClB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eACJ,SAC2C;AAC3C,UAAM,OAAO;AAAA,MACX,WAAW;AAAA,MACX,OAAO,QAAQ;AAAA,MACf,YAAY,QAAQ;AAAA,MACpB,UAAU,QAAQ;AAAA,IACpB;AAEA,UAAM,OAAO,MAAM,KAAK,QAOrB,QAAQ,uBAAuB,IAAI;AAEtC,WAAO;AAAA,MACL,SAAS,KAAK;AAAA,MACd,QAAQ,KAAK;AAAA,MACb,SAAS,KAAK;AAAA,MACd,UAAU;AAAA,QACR,OAAO,KAAK,SAAS;AAAA,QACrB,WAAW,KAAK,SAAS;AAAA,MAC3B;AAAA,MACA,MAAM,KAAK;AAAA,MACX,WAAW,KAAK;AAAA,IAClB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBACJ,SAC4C;AAC5C,UAAM,OAAO;AAAA,MACX,WAAW;AAAA,MACX,OAAO,QAAQ;AAAA,MACf,YAAY,QAAQ;AAAA,MACpB,mBAAmB,QAAQ;AAAA,MAC3B,SAAS,QAAQ;AAAA,IACnB;AAEA,UAAM,OAAO,MAAM,KAAK,QAerB,QAAQ,kCAAkC,IAAI;AAEjD,WAAO;AAAA,MACL,SAAS,KAAK;AAAA,MACd,QAAQ,KAAK;AAAA,MACb,SAAS,KAAK;AAAA,MACd,UAAU;AAAA,QACR,SAAS;AAAA,UACP,KAAK,KAAK,SAAS,mBAAmB;AAAA,UACtC,MAAM,KAAK,SAAS,mBAAmB;AAAA,UACvC,OAAO,KAAK,SAAS,mBAAmB;AAAA,UACxC,OAAO,KAAK,SAAS,mBAAmB;AAAA,QAC1C;AAAA,QACA,WAAW,KAAK,SAAS;AAAA,MAC3B;AAAA,MACA,MAAM,KAAK;AAAA,MACX,WAAW,KAAK;AAAA,IAClB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,mBACJ,SAC+C;AAC/C,UAAM,OAAO;AAAA,MACX,WAAW;AAAA,MACX,OAAO,QAAQ;AAAA,MACf,YAAY,QAAQ;AAAA,MACpB,eAAe,QAAQ,gBAAgB;AAAA,IACzC;AAEA,UAAM,OAAO,MAAM,KAAK,QAYrB,QAAQ,4BAA4B,IAAI;AAE3C,WAAO;AAAA,MACL,SAAS,KAAK;AAAA,MACd,QAAQ,KAAK;AAAA,MACb,SAAS,KAAK;AAAA,MACd,UAAU;AAAA,QACR,SAAS;AAAA,UACP,aAAa,KAAK,SAAS,QAAQ;AAAA,QACrC;AAAA,QACA,WAAW,KAAK,SAAS;AAAA,MAC3B;AAAA,MACA,MAAM,KAAK;AAAA,MACX,WAAW,KAAK;AAAA,IAClB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,oBACJ,SACgD;AAChD,UAAM,OAAO;AAAA,MACX,WAAW;AAAA,MACX,OAAO,QAAQ;AAAA,MACf,YAAY,QAAQ;AAAA,MACpB,eAAe,QAAQ,gBAAgB;AAAA,IACzC;AAEA,UAAM,OAAO,MAAM,KAAK,QAOrB,QAAQ,6BAA6B,IAAI;AAE5C,WAAO;AAAA,MACL,SAAS,KAAK;AAAA,MACd,QAAQ,KAAK;AAAA,MACb,SAAS,KAAK;AAAA,MACd,UAAU;AAAA,QACR,UAAU,KAAK,SAAS;AAAA,QACxB,WAAW,KAAK,SAAS;AAAA,MAC3B;AAAA,MACA,MAAM,KAAK;AAAA,MACX,WAAW,KAAK;AAAA,IAClB;AAAA,EACF;AACF;","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gatsbie",
3
- "version": "1.0.0",
3
+ "version": "1.0.1",
4
4
  "description": "Official Node.js SDK for the Gatsbie Captcha API",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",