thordata-js-sdk 0.2.0 → 0.4.0

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.
Files changed (60) hide show
  1. package/LICENSE +20 -20
  2. package/README.md +55 -349
  3. package/dist/examples/basic_scraper_task.js +37 -24
  4. package/dist/examples/basic_scraper_task.js.map +1 -1
  5. package/dist/examples/basic_serp.js +3 -3
  6. package/dist/examples/basic_serp.js.map +1 -1
  7. package/dist/examples/location_api.js +47 -0
  8. package/dist/examples/location_api.js.map +1 -0
  9. package/dist/examples/proxy_datacenter.js +1 -1
  10. package/dist/examples/proxy_datacenter.js.map +1 -1
  11. package/dist/examples/proxy_isp.js +1 -1
  12. package/dist/examples/proxy_isp.js.map +1 -1
  13. package/dist/examples/proxy_mobile.js +1 -1
  14. package/dist/examples/proxy_mobile.js.map +1 -1
  15. package/dist/examples/proxy_residential.js +2 -2
  16. package/dist/examples/proxy_residential.js.map +1 -1
  17. package/dist/examples/serp_google_news.d.ts +0 -6
  18. package/dist/examples/serp_google_news.js +7 -10
  19. package/dist/examples/serp_google_news.js.map +1 -1
  20. package/dist/examples/verify_new_features.js +135 -0
  21. package/dist/examples/verify_new_features.js.map +1 -0
  22. package/dist/src/auth.d.ts +22 -0
  23. package/dist/src/auth.js +39 -0
  24. package/dist/src/auth.js.map +1 -0
  25. package/dist/src/client.d.ts +144 -6
  26. package/dist/src/client.js +396 -43
  27. package/dist/src/client.js.map +1 -1
  28. package/dist/src/endpoints.js +2 -2
  29. package/dist/src/endpoints.js.map +1 -1
  30. package/dist/src/enums.d.ts +219 -3
  31. package/dist/src/enums.js +289 -2
  32. package/dist/src/enums.js.map +1 -1
  33. package/dist/src/errors.d.ts +37 -5
  34. package/dist/src/errors.js +61 -17
  35. package/dist/src/errors.js.map +1 -1
  36. package/dist/src/index.d.ts +7 -5
  37. package/dist/src/index.js +21 -5
  38. package/dist/src/index.js.map +1 -1
  39. package/dist/src/models.d.ts +196 -12
  40. package/dist/src/models.js +1 -0
  41. package/dist/src/models.js.map +1 -1
  42. package/dist/src/proxy.d.ts +59 -0
  43. package/dist/src/proxy.js +83 -11
  44. package/dist/src/proxy.js.map +1 -1
  45. package/dist/src/retry.d.ts +25 -3
  46. package/dist/src/retry.js +16 -0
  47. package/dist/src/retry.js.map +1 -1
  48. package/dist/src/thordata.d.ts +5 -2
  49. package/dist/src/thordata.js +36 -6
  50. package/dist/src/thordata.js.map +1 -1
  51. package/dist/src/utils.d.ts +18 -13
  52. package/dist/src/utils.js +94 -43
  53. package/dist/src/utils.js.map +1 -1
  54. package/package.json +6 -6
  55. package/dist/examples/proxy_demo.js +0 -69
  56. package/dist/examples/proxy_demo.js.map +0 -1
  57. package/dist/examples/proxy_ip_check.js +0 -37
  58. package/dist/examples/proxy_ip_check.js.map +0 -1
  59. /package/dist/examples/{proxy_demo.d.ts → location_api.d.ts} +0 -0
  60. /package/dist/examples/{proxy_ip_check.d.ts → verify_new_features.d.ts} +0 -0
@@ -0,0 +1,47 @@
1
+ // examples/location_api.ts
2
+ import "dotenv/config";
3
+ import { Thordata } from "../src/thordata.js";
4
+ async function main() {
5
+ if (!process.env.THORDATA_PUBLIC_TOKEN || !process.env.THORDATA_PUBLIC_KEY) {
6
+ console.log("Location API Demo - Skipped");
7
+ console.log("Set THORDATA_PUBLIC_TOKEN and THORDATA_PUBLIC_KEY in .env");
8
+ return;
9
+ }
10
+ const client = new Thordata();
11
+ console.log("Location API Demo\n");
12
+ // List countries (now using string parameter)
13
+ console.log("1. Listing countries...");
14
+ const countries = await client.listCountries("residential");
15
+ console.log(` Found ${countries.length} countries`);
16
+ console.log(` First 5: ${countries
17
+ .slice(0, 5)
18
+ .map((c) => c.country_code)
19
+ .join(", ")}`);
20
+ // List states for US
21
+ console.log("\n2. Listing US states...");
22
+ const states = await client.listStates("US", "residential");
23
+ console.log(` Found ${states.length} states`);
24
+ console.log(` First 5: ${states
25
+ .slice(0, 5)
26
+ .map((s) => s.state_name)
27
+ .join(", ")}`);
28
+ // List cities for California
29
+ console.log("\n3. Listing California cities...");
30
+ const cities = await client.listCities("US", "california", "residential");
31
+ console.log(` Found ${cities.length} cities`);
32
+ console.log(` First 5: ${cities
33
+ .slice(0, 5)
34
+ .map((c) => c.city_name)
35
+ .join(", ")}`);
36
+ // List ASNs for US
37
+ console.log("\n4. Listing US ASNs...");
38
+ const asns = await client.listAsns("US", "residential");
39
+ console.log(` Found ${asns.length} ASNs`);
40
+ console.log(` First 3: ${asns
41
+ .slice(0, 3)
42
+ .map((a) => `${a.asn_code}: ${a.asn_name}`)
43
+ .join(", ")}`);
44
+ console.log("\nLocation API demo completed.");
45
+ }
46
+ main().catch(console.error);
47
+ //# sourceMappingURL=location_api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"location_api.js","sourceRoot":"","sources":["../../examples/location_api.ts"],"names":[],"mappings":"AAAA,2BAA2B;AAE3B,OAAO,eAAe,CAAC;AACvB,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C,KAAK,UAAU,IAAI;IACjB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,CAAC;QAC3E,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;QAC3C,OAAO,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAC;QACzE,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;IAE9B,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;IAEnC,8CAA8C;IAC9C,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;IACvC,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC;IAC5D,OAAO,CAAC,GAAG,CAAC,YAAY,SAAS,CAAC,MAAM,YAAY,CAAC,CAAC;IACtD,OAAO,CAAC,GAAG,CACT,eAAe,SAAS;SACrB,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;SACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC;SAC1B,IAAI,CAAC,IAAI,CAAC,EAAE,CAChB,CAAC;IAEF,qBAAqB;IACrB,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;IACzC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IAC5D,OAAO,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,MAAM,SAAS,CAAC,CAAC;IAChD,OAAO,CAAC,GAAG,CACT,eAAe,MAAM;SAClB,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;SACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC;SACxB,IAAI,CAAC,IAAI,CAAC,EAAE,CAChB,CAAC;IAEF,6BAA6B;IAC7B,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;IACjD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,YAAY,EAAE,aAAa,CAAC,CAAC;IAC1E,OAAO,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,MAAM,SAAS,CAAC,CAAC;IAChD,OAAO,CAAC,GAAG,CACT,eAAe,MAAM;SAClB,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;SACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;SACvB,IAAI,CAAC,IAAI,CAAC,EAAE,CAChB,CAAC;IAEF,mBAAmB;IACnB,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;IACvC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IACxD,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,CAAC,MAAM,OAAO,CAAC,CAAC;IAC5C,OAAO,CAAC,GAAG,CACT,eAAe,IAAI;SAChB,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;SACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC;SAC1C,IAAI,CAAC,IAAI,CAAC,EAAE,CAChB,CAAC;IAEF,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;AAChD,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC"}
@@ -11,7 +11,7 @@ async function main() {
11
11
  const testUrl = "http://httpbin.org/ip";
12
12
  console.log("Datacenter Proxy Demo\n");
13
13
  const proxy = Thordata.Proxy.datacenterFromEnv();
14
- const result = await client.request(testUrl, { proxy });
14
+ const result = (await client.request(testUrl, { proxy }));
15
15
  console.log("Datacenter IP:", result.origin);
16
16
  }
17
17
  main().catch(console.error);
@@ -1 +1 @@
1
- {"version":3,"file":"proxy_datacenter.js","sourceRoot":"","sources":["../../examples/proxy_datacenter.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,OAAO,eAAe,CAAC;AACvB,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C,KAAK,UAAU,IAAI;IACjB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,4BAA4B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,4BAA4B,EAAE,CAAC;QAC3F,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;QAC/C,OAAO,CAAC,GAAG,CAAC,2EAA2E,CAAC,CAAC;QACzF,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;IAC9B,MAAM,OAAO,GAAG,uBAAuB,CAAC;IAExC,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;IAEvC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,iBAAiB,EAAE,CAAC;IACjD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;IACxD,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;AAC/C,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC"}
1
+ {"version":3,"file":"proxy_datacenter.js","sourceRoot":"","sources":["../../examples/proxy_datacenter.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAE/B,OAAO,eAAe,CAAC;AACvB,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAM9C,KAAK,UAAU,IAAI;IACjB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,4BAA4B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,4BAA4B,EAAE,CAAC;QAC3F,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;QAC/C,OAAO,CAAC,GAAG,CAAC,2EAA2E,CAAC,CAAC;QACzF,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;IAC9B,MAAM,OAAO,GAAG,uBAAuB,CAAC;IAExC,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;IAEvC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,iBAAiB,EAAE,CAAC;IACjD,MAAM,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,CAAoB,CAAC;IAC7E,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;AAC/C,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC"}
@@ -13,7 +13,7 @@ async function main() {
13
13
  const testUrl = "http://httpbin.org/ip";
14
14
  console.log("Static ISP Proxy Demo\n");
15
15
  const proxy = Thordata.Proxy.ispFromEnv();
16
- const result = await client.request(testUrl, { proxy });
16
+ const result = (await client.request(testUrl, { proxy }));
17
17
  console.log("Static ISP IP:", result.origin);
18
18
  console.log("Expected IP :", process.env.THORDATA_ISP_HOST);
19
19
  }
@@ -1 +1 @@
1
- {"version":3,"file":"proxy_isp.js","sourceRoot":"","sources":["../../examples/proxy_isp.ts"],"names":[],"mappings":"AAAA,wBAAwB;AACxB,OAAO,eAAe,CAAC;AACvB,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C,KAAK,UAAU,IAAI;IACjB,IACE,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB;QAC9B,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB;QAClC,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAClC,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,iFAAiF,CAAC,CAAC;QAC/F,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;IAC9B,MAAM,OAAO,GAAG,uBAAuB,CAAC;IAExC,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;IAEvC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;IAC1C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;IACxD,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAC7C,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;AAC/D,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC"}
1
+ {"version":3,"file":"proxy_isp.js","sourceRoot":"","sources":["../../examples/proxy_isp.ts"],"names":[],"mappings":"AAAA,wBAAwB;AAExB,OAAO,eAAe,CAAC;AACvB,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAM9C,KAAK,UAAU,IAAI;IACjB,IACE,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB;QAC9B,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB;QAClC,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAClC,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,iFAAiF,CAAC,CAAC;QAC/F,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;IAC9B,MAAM,OAAO,GAAG,uBAAuB,CAAC;IAExC,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;IAEvC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;IAC1C,MAAM,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,CAAoB,CAAC;IAC7E,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAC7C,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;AAC/D,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC"}
@@ -11,7 +11,7 @@ async function main() {
11
11
  const testUrl = "http://httpbin.org/ip";
12
12
  console.log("Mobile Proxy Demo\n");
13
13
  const proxy = Thordata.Proxy.mobileFromEnv().country("gb");
14
- const result = await client.request(testUrl, { proxy });
14
+ const result = (await client.request(testUrl, { proxy }));
15
15
  console.log("UK Mobile IP:", result.origin);
16
16
  }
17
17
  main().catch(console.error);
@@ -1 +1 @@
1
- {"version":3,"file":"proxy_mobile.js","sourceRoot":"","sources":["../../examples/proxy_mobile.ts"],"names":[],"mappings":"AAAA,2BAA2B;AAC3B,OAAO,eAAe,CAAC;AACvB,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C,KAAK,UAAU,IAAI;IACjB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,wBAAwB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,CAAC;QACnF,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;QAC3C,OAAO,CAAC,GAAG,CAAC,mEAAmE,CAAC,CAAC;QACjF,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;IAC9B,MAAM,OAAO,GAAG,uBAAuB,CAAC;IAExC,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;IAEnC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3D,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;IACxD,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;AAC9C,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC"}
1
+ {"version":3,"file":"proxy_mobile.js","sourceRoot":"","sources":["../../examples/proxy_mobile.ts"],"names":[],"mappings":"AAAA,2BAA2B;AAE3B,OAAO,eAAe,CAAC;AACvB,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAM9C,KAAK,UAAU,IAAI;IACjB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,wBAAwB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,CAAC;QACnF,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;QAC3C,OAAO,CAAC,GAAG,CAAC,mEAAmE,CAAC,CAAC;QACjF,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;IAC9B,MAAM,OAAO,GAAG,uBAAuB,CAAC;IAExC,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;IAEnC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3D,MAAM,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,CAAoB,CAAC;IAC7E,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;AAC9C,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC"}
@@ -12,7 +12,7 @@ async function main() {
12
12
  console.log("Residential Proxy Demo\n");
13
13
  // Basic usage
14
14
  const proxy1 = Thordata.Proxy.residentialFromEnv().country("us");
15
- const r1 = await client.request(testUrl, { proxy: proxy1 });
15
+ const r1 = (await client.request(testUrl, { proxy: proxy1 }));
16
16
  console.log("US Residential IP:", r1.origin);
17
17
  // With sticky session
18
18
  const proxy2 = Thordata.Proxy.residentialFromEnv()
@@ -20,7 +20,7 @@ async function main() {
20
20
  .city("tokyo")
21
21
  .session("my_session")
22
22
  .sticky(30);
23
- const r2 = await client.request(testUrl, { proxy: proxy2 });
23
+ const r2 = (await client.request(testUrl, { proxy: proxy2 }));
24
24
  console.log("Tokyo Sticky IP :", r2.origin);
25
25
  }
26
26
  main().catch(console.error);
@@ -1 +1 @@
1
- {"version":3,"file":"proxy_residential.js","sourceRoot":"","sources":["../../examples/proxy_residential.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,OAAO,eAAe,CAAC;AACvB,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C,KAAK,UAAU,IAAI;IACjB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,6BAA6B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,6BAA6B,EAAE,CAAC;QAC7F,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,6EAA6E,CAAC,CAAC;QAC3F,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;IAC9B,MAAM,OAAO,GAAG,uBAAuB,CAAC;IAExC,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;IAExC,cAAc;IACd,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,kBAAkB,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACjE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IAC5D,OAAO,CAAC,GAAG,CAAC,oBAAoB,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC;IAE7C,sBAAsB;IACtB,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,kBAAkB,EAAE;SAC/C,OAAO,CAAC,IAAI,CAAC;SACb,IAAI,CAAC,OAAO,CAAC;SACb,OAAO,CAAC,YAAY,CAAC;SACrB,MAAM,CAAC,EAAE,CAAC,CAAC;IACd,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IAC5D,OAAO,CAAC,GAAG,CAAC,oBAAoB,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC;AAC/C,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC"}
1
+ {"version":3,"file":"proxy_residential.js","sourceRoot":"","sources":["../../examples/proxy_residential.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAEhC,OAAO,eAAe,CAAC;AACvB,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAM9C,KAAK,UAAU,IAAI;IACjB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,6BAA6B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,6BAA6B,EAAE,CAAC;QAC7F,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,6EAA6E,CAAC,CAAC;QAC3F,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;IAC9B,MAAM,OAAO,GAAG,uBAAuB,CAAC;IAExC,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;IAExC,cAAc;IACd,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,kBAAkB,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACjE,MAAM,EAAE,GAAG,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAoB,CAAC;IACjF,OAAO,CAAC,GAAG,CAAC,oBAAoB,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC;IAE7C,sBAAsB;IACtB,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,kBAAkB,EAAE;SAC/C,OAAO,CAAC,IAAI,CAAC;SACb,IAAI,CAAC,OAAO,CAAC;SACb,OAAO,CAAC,YAAY,CAAC;SACrB,MAAM,CAAC,EAAE,CAAC,CAAC;IACd,MAAM,EAAE,GAAG,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAoB,CAAC;IACjF,OAAO,CAAC,GAAG,CAAC,oBAAoB,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC;AAC/C,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC"}
@@ -1,7 +1 @@
1
- /**
2
- * SERP Google News Demo
3
- *
4
- * Usage:
5
- * npx ts-node examples/serp_google_news.ts
6
- */
7
1
  import "dotenv/config";
@@ -1,9 +1,4 @@
1
- /**
2
- * SERP Google News Demo
3
- *
4
- * Usage:
5
- * npx ts-node examples/serp_google_news.ts
6
- */
1
+ // examples/serp_google_news.ts
7
2
  import "dotenv/config";
8
3
  import { ThordataClient, Engine } from "../src/index.js";
9
4
  async function main() {
@@ -29,7 +24,8 @@ async function main() {
29
24
  printNewsResults(results);
30
25
  }
31
26
  catch (e) {
32
- console.error("❌ Search failed:", e.message);
27
+ const error = e;
28
+ console.error("❌ Search failed:", error.message);
33
29
  }
34
30
  // 2. Advanced News Filters
35
31
  console.log("\n📰 2. Advanced Filters (Sort by Date)");
@@ -40,16 +36,17 @@ async function main() {
40
36
  country: "us",
41
37
  language: "en",
42
38
  num: 5,
43
- so: 1, // Sort by date
39
+ so: 1,
44
40
  });
45
41
  printNewsResults(results);
46
42
  }
47
43
  catch (e) {
48
- console.error("❌ Advanced search failed:", e.message);
44
+ const error = e;
45
+ console.error("❌ Advanced search failed:", error.message);
49
46
  }
50
47
  }
51
48
  function printNewsResults(results) {
52
- const news = results?.news ?? [];
49
+ const news = (results?.news ?? []);
53
50
  console.log(`✅ Found ${news.length} news items:`);
54
51
  news.slice(0, 5).forEach((item) => {
55
52
  console.log(` ${item.rank}. [${item.source}] ${item.title}`);
@@ -1 +1 @@
1
- {"version":3,"file":"serp_google_news.js","sourceRoot":"","sources":["../../examples/serp_google_news.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,eAAe,CAAC;AACvB,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAEzD,KAAK,UAAU,IAAI;IACjB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC;IACjD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAC;QACnE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC;QAChC,YAAY,EAAE,KAAK;QACnB,UAAU,EAAE,CAAC;KACd,CAAC,CAAC;IAEH,uBAAuB;IACvB,OAAO,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC;IACjE,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC;YACtC,KAAK,EAAE,eAAe;YACtB,MAAM,EAAE,MAAM,CAAC,WAAW;YAC1B,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,IAAI;YACd,GAAG,EAAE,CAAC;SACP,CAAC,CAAC;QACH,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAC5B,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,CAAC,kBAAkB,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;IAC/C,CAAC;IAED,2BAA2B;IAC3B,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;IACvD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC;YACtC,KAAK,EAAE,yBAAyB;YAChC,MAAM,EAAE,MAAM,CAAC,WAAW;YAC1B,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,IAAI;YACd,GAAG,EAAE,CAAC;YACN,EAAE,EAAE,CAAC,EAAE,eAAe;SACvB,CAAC,CAAC;QACH,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAC5B,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;IACxD,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,OAAY;IACpC,MAAM,IAAI,GAAG,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC;IAEjC,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,CAAC,MAAM,cAAc,CAAC,CAAC;IAElD,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAS,EAAE,EAAE;QACrC,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;QAC/D,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QACrC,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IACH,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;AACrC,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"serp_google_news.js","sourceRoot":"","sources":["../../examples/serp_google_news.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAE/B,OAAO,eAAe,CAAC;AACvB,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAEzD,KAAK,UAAU,IAAI;IACjB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC;IACjD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAC;QACnE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC;QAChC,YAAY,EAAE,KAAK;QACnB,UAAU,EAAE,CAAC;KACd,CAAC,CAAC;IAEH,uBAAuB;IACvB,OAAO,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC;IACjE,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC;YACtC,KAAK,EAAE,eAAe;YACtB,MAAM,EAAE,MAAM,CAAC,WAAW;YAC1B,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,IAAI;YACd,GAAG,EAAE,CAAC;SACP,CAAC,CAAC;QACH,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAC5B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,KAAK,GAAG,CAAU,CAAC;QACzB,OAAO,CAAC,KAAK,CAAC,kBAAkB,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IACnD,CAAC;IAED,2BAA2B;IAC3B,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;IACvD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC;YACtC,KAAK,EAAE,yBAAyB;YAChC,MAAM,EAAE,MAAM,CAAC,WAAW;YAC1B,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,IAAI;YACd,GAAG,EAAE,CAAC;YACN,EAAE,EAAE,CAAC;SACN,CAAC,CAAC;QACH,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAC5B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,KAAK,GAAG,CAAU,CAAC;QACzB,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IAC5D,CAAC;AACH,CAAC;AAUD,SAAS,gBAAgB,CAAC,OAAgC;IACxD,MAAM,IAAI,GAAG,CAAC,OAAO,EAAE,IAAI,IAAI,EAAE,CAAe,CAAC;IAEjD,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,CAAC,MAAM,cAAc,CAAC,CAAC;IAElD,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;QAChC,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;QAC/D,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QACrC,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IACH,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;AACrC,CAAC,CAAC,CAAC"}
@@ -0,0 +1,135 @@
1
+ // examples/verify_new_features.ts
2
+ import "dotenv/config";
3
+ import { ThordataClient } from "../src/index.js";
4
+ async function main() {
5
+ const args = process.argv.slice(2);
6
+ const testName = args[0] || "all";
7
+ const scraperToken = process.env.THORDATA_SCRAPER_TOKEN;
8
+ const publicToken = process.env.THORDATA_PUBLIC_TOKEN;
9
+ const publicKey = process.env.THORDATA_PUBLIC_KEY;
10
+ const sign = process.env.THORDATA_SIGN || publicToken;
11
+ const apiKey = process.env.THORDATA_API_KEY || publicKey;
12
+ if (!scraperToken) {
13
+ console.error("❌ THORDATA_SCRAPER_TOKEN required");
14
+ process.exit(1);
15
+ }
16
+ const client = new ThordataClient({
17
+ scraperToken,
18
+ publicToken,
19
+ publicKey,
20
+ sign, // Public API NEW
21
+ apiKey, // Public API NEW
22
+ });
23
+ console.log("========================================");
24
+ console.log("Thordata SDK - New Features Verification");
25
+ console.log("========================================");
26
+ const tests = {
27
+ video_task: async () => {
28
+ console.log("\n--- Testing: Video Task Creation ---");
29
+ try {
30
+ const taskId = await client.createVideoTask({
31
+ fileName: "test_{{VideoID}}",
32
+ spiderId: "youtube_video_by-url",
33
+ spiderName: "youtube.com",
34
+ parameters: { url: "https://www.youtube.com/watch?v=dQw4w9WgXcQ" },
35
+ commonSettings: { resolution: "720p", is_subtitles: "false" },
36
+ });
37
+ console.log(`✅ Video task created: ${taskId}`);
38
+ return true;
39
+ }
40
+ catch (e) {
41
+ console.log(`❌ Failed: ${e.message}`);
42
+ return false;
43
+ }
44
+ },
45
+ usage_stats: async () => {
46
+ console.log("\n--- Testing: Usage Statistics ---");
47
+ try {
48
+ const now = new Date();
49
+ const weekAgo = new Date(now.getTime() - 7 * 24 * 3600 * 1000);
50
+ const fmt = (d) => d.toISOString().split("T")[0];
51
+ const stats = await client.getUsageStatistics(fmt(weekAgo), fmt(now));
52
+ console.log(`✅ Stats Retrieved:`);
53
+ console.log(` Balance: ${(stats.traffic_balance / 1024 ** 3).toFixed(2)} GB`);
54
+ return true;
55
+ }
56
+ catch (e) {
57
+ console.log(`❌ Failed: ${e.message}`);
58
+ return false;
59
+ }
60
+ },
61
+ proxy_users: async () => {
62
+ console.log("\n--- Testing: Proxy Users ---");
63
+ try {
64
+ const users = await client.listProxyUsers("residential");
65
+ console.log(`✅ Users Retrieved: ${users.user_count}`);
66
+ if (users.list.length > 0) {
67
+ console.log(` User 1: ${users.list[0].username}`);
68
+ }
69
+ return true;
70
+ }
71
+ catch (e) {
72
+ console.log(`❌ Failed: ${e.message}`);
73
+ return false;
74
+ }
75
+ },
76
+ proxy_servers: async () => {
77
+ console.log("\n--- Testing: Proxy Servers (ISP) ---");
78
+ try {
79
+ const servers = await client.listProxyServers(1); // 1 = ISP
80
+ console.log(`✅ ISP Servers: ${servers.length}`);
81
+ if (servers.length > 0) {
82
+ console.log(` Server 1: ${servers[0].ip}:${servers[0].port}`);
83
+ }
84
+ return true;
85
+ }
86
+ catch (e) {
87
+ console.log(`❌ Failed: ${e.message}`);
88
+ return false;
89
+ }
90
+ },
91
+ api_new_balance: async () => {
92
+ console.log("\n--- Testing: API NEW - Balance ---");
93
+ try {
94
+ const res = await client.getResidentialBalance();
95
+ console.log(`✅ Balance: ${(res.balance / 1024 ** 3).toFixed(2)} GB`);
96
+ return true;
97
+ }
98
+ catch (e) {
99
+ console.log(`❌ Failed: ${e.message}`);
100
+ return false;
101
+ }
102
+ },
103
+ api_new_isp: async () => {
104
+ console.log("\n--- Testing: API NEW - ISP Regions ---");
105
+ try {
106
+ const regions = await client.getIspRegions();
107
+ console.log(`✅ Regions: ${regions.length}`);
108
+ if (regions.length > 0) {
109
+ const r = regions[0];
110
+ console.log(` ${r.country}/${r.city}: ${r.num} IPs`);
111
+ }
112
+ return true;
113
+ }
114
+ catch (e) {
115
+ console.log(`❌ Failed: ${e.message}`);
116
+ return false;
117
+ }
118
+ },
119
+ };
120
+ let passed = 0;
121
+ let total = 0;
122
+ for (const [name, fn] of Object.entries(tests)) {
123
+ if (testName === "all" || testName === name) {
124
+ total++;
125
+ if (await fn())
126
+ passed++;
127
+ }
128
+ }
129
+ console.log("\n========================================");
130
+ console.log(`Summary: ${passed}/${total} passed`);
131
+ console.log("========================================");
132
+ process.exit(passed === total ? 0 : 1);
133
+ }
134
+ main().catch(console.error);
135
+ //# sourceMappingURL=verify_new_features.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify_new_features.js","sourceRoot":"","sources":["../../examples/verify_new_features.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ export type Headers = Record<string, string>;
2
+ export interface Credentials {
3
+ scraperToken: string;
4
+ publicToken?: string;
5
+ publicKey?: string;
6
+ }
7
+ /**
8
+ * Build headers for SERP/Universal scraping APIs.
9
+ * Docs require a `token` header (Account Settings token).
10
+ * Some docs/examples also use `Authorization: Bearer ...`, so we send both for compatibility.
11
+ */
12
+ export declare function buildScraperHeaders(creds: Credentials): Headers;
13
+ /**
14
+ * Build headers for Public APIs (Web Scraper task status/download/list, etc.).
15
+ * These APIs require `token` + `key` from Dashboard -> My Account.
16
+ */
17
+ export declare function buildPublicHeaders(creds: Credentials): Headers;
18
+ /**
19
+ * Build headers for Web Scraper builder endpoint.
20
+ * Interface docs require `token` + `key` (My Account) AND `Authorization: Bearer ...` (scraper token).
21
+ */
22
+ export declare function buildBuilderHeaders(creds: Credentials): Headers;
@@ -0,0 +1,39 @@
1
+ // src/auth.ts
2
+ /**
3
+ * Build headers for SERP/Universal scraping APIs.
4
+ * Docs require a `token` header (Account Settings token).
5
+ * Some docs/examples also use `Authorization: Bearer ...`, so we send both for compatibility.
6
+ */
7
+ export function buildScraperHeaders(creds) {
8
+ if (!creds.scraperToken) {
9
+ throw new Error("scraperToken is required");
10
+ }
11
+ return {
12
+ token: creds.scraperToken,
13
+ Authorization: `Bearer ${creds.scraperToken}`,
14
+ };
15
+ }
16
+ /**
17
+ * Build headers for Public APIs (Web Scraper task status/download/list, etc.).
18
+ * These APIs require `token` + `key` from Dashboard -> My Account.
19
+ */
20
+ export function buildPublicHeaders(creds) {
21
+ if (!creds.publicToken || !creds.publicKey) {
22
+ throw new Error("publicToken and publicKey are required");
23
+ }
24
+ return {
25
+ token: creds.publicToken,
26
+ key: creds.publicKey,
27
+ };
28
+ }
29
+ /**
30
+ * Build headers for Web Scraper builder endpoint.
31
+ * Interface docs require `token` + `key` (My Account) AND `Authorization: Bearer ...` (scraper token).
32
+ */
33
+ export function buildBuilderHeaders(creds) {
34
+ return {
35
+ ...buildPublicHeaders(creds),
36
+ Authorization: `Bearer ${creds.scraperToken}`,
37
+ };
38
+ }
39
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/auth.ts"],"names":[],"mappings":"AAAA,cAAc;AAUd;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAkB;IACpD,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;IAC9C,CAAC;IAED,OAAO;QACL,KAAK,EAAE,KAAK,CAAC,YAAY;QACzB,aAAa,EAAE,UAAU,KAAK,CAAC,YAAY,EAAE;KAC9C,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAkB;IACnD,IAAI,CAAC,KAAK,CAAC,WAAW,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;QAC3C,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;IAC5D,CAAC;IAED,OAAO;QACL,KAAK,EAAE,KAAK,CAAC,WAAW;QACxB,GAAG,EAAE,KAAK,CAAC,SAAS;KACrB,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAkB;IACpD,OAAO;QACL,GAAG,kBAAkB,CAAC,KAAK,CAAC;QAC5B,aAAa,EAAE,UAAU,KAAK,CAAC,YAAY,EAAE;KAC9C,CAAC;AACJ,CAAC"}
@@ -1,19 +1,44 @@
1
- import { SerpOptions, UniversalOptions, ScraperTaskOptions, WaitForTaskOptions } from "./models.js";
1
+ import { SerpOptions, UniversalOptions, ScraperTaskOptions, WaitForTaskOptions, ProxyTypeParam, CountryInfo, StateInfo, CityInfo, AsnInfo, VideoTaskOptions, UsageStatistics, ProxyUserList, ProxyServer } from "./models.js";
2
2
  import { type ThordataBaseUrls } from "./endpoints.js";
3
3
  import { Proxy } from "./proxy.js";
4
+ /**
5
+ * Configuration options for ThordataClient.
6
+ */
4
7
  export interface ThordataClientConfig {
8
+ /** API token for SERP and Universal APIs */
5
9
  scraperToken: string;
10
+ /** Public token for Web Scraper API and Location API */
6
11
  publicToken?: string;
12
+ /** Public key for Web Scraper API and Location API */
7
13
  publicKey?: string;
14
+ /** Request timeout in milliseconds (default: 30000) */
15
+ sign?: string;
16
+ /** Sign for Public API NEW (optional, falls back to publicToken) */
17
+ apiKey?: string;
18
+ /** API Key for Public API NEW (optional, falls back to publicKey) */
8
19
  timeoutMs?: number;
20
+ /** Maximum number of retries on failure (default: 0) */
9
21
  maxRetries?: number;
22
+ /** Custom base URLs for API endpoints */
10
23
  baseUrls?: Partial<ThordataBaseUrls>;
24
+ /** Custom User-Agent string */
11
25
  userAgent?: string;
26
+ /**
27
+ * Whether to verify SSL certificates (default: true).
28
+ * Set to false only for testing with self-signed certificates.
29
+ */
30
+ verifySsl?: boolean;
12
31
  }
32
+ /**
33
+ * Main client for interacting with Thordata APIs.
34
+ */
13
35
  export declare class ThordataClient {
14
36
  private scraperToken;
15
37
  private publicToken?;
16
38
  private publicKey?;
39
+ private sign?;
40
+ private apiKey?;
41
+ private gatewayBaseUrl;
17
42
  private timeoutMs;
18
43
  private maxRetries;
19
44
  private http;
@@ -24,21 +49,134 @@ export declare class ThordataClient {
24
49
  private scraperBuilderUrl;
25
50
  private scraperStatusUrl;
26
51
  private scraperDownloadUrl;
52
+ private videoBuilderUrl;
53
+ private usageStatsUrl;
54
+ private proxyUsersUrl;
55
+ private whitelistUrl;
56
+ private proxyListUrl;
57
+ private proxyExpirationUrl;
58
+ private taskListUrl;
27
59
  constructor(config: ThordataClientConfig);
28
60
  /**
29
- * Internal helper to execute request with retry logic
61
+ * Execute request with retry logic.
30
62
  */
31
63
  private execute;
32
- serpSearch(options: SerpOptions): Promise<any>;
33
- universalScrape(options: UniversalOptions): Promise<string | Buffer>;
64
+ /**
65
+ * Perform a search using the SERP API.
66
+ *
67
+ * Supported engines: google, bing, yandex, duckduckgo
68
+ * Plus Google specialized engines: google_news, google_shopping, etc.
69
+ *
70
+ * @example
71
+ * ```typescript
72
+ * // Basic Google search
73
+ * const results = await client.serpSearch({
74
+ * query: "pizza",
75
+ * engine: Engine.GOOGLE,
76
+ * country: "us",
77
+ * });
78
+ *
79
+ * // Google News (recommended: use dedicated engine)
80
+ * const news = await client.serpSearch({
81
+ * query: "AI regulation",
82
+ * engine: Engine.GOOGLE_NEWS,
83
+ * });
84
+ * ```
85
+ */
86
+ serpSearch(options: SerpOptions): Promise<Record<string, unknown>>;
87
+ /**
88
+ * Scrape a URL using the Universal/Web Unlocker API.
89
+ *
90
+ * @example
91
+ * ```typescript
92
+ * // Basic HTML scraping
93
+ * const html = await client.universalScrape({
94
+ * url: "https://example.com",
95
+ * jsRender: false,
96
+ * });
97
+ *
98
+ * // With JS rendering and wait for element
99
+ * const html = await client.universalScrape({
100
+ * url: "https://example.com/spa",
101
+ * jsRender: true,
102
+ * waitFor: ".main-content",
103
+ * });
104
+ *
105
+ * // Screenshot
106
+ * const png = await client.universalScrape({
107
+ * url: "https://example.com",
108
+ * jsRender: true,
109
+ * outputFormat: "png",
110
+ * });
111
+ * ```
112
+ */
113
+ universalScrape(options: UniversalOptions): Promise<string | Buffer | Record<string, unknown>>;
114
+ /**
115
+ * Create a new Web Scraper task.
116
+ */
34
117
  createScraperTask(options: ScraperTaskOptions): Promise<string>;
118
+ /**
119
+ * Verify that public credentials are available.
120
+ */
35
121
  private requirePublicCreds;
122
+ /**
123
+ * Get the status of a Web Scraper task.
124
+ */
36
125
  getTaskStatus(taskId: string): Promise<string>;
126
+ /**
127
+ * Get the download URL for a completed task's results.
128
+ */
37
129
  getTaskResult(taskId: string, fileType?: "json" | "csv" | "xlsx"): Promise<string>;
130
+ /**
131
+ * Create a YouTube video/audio download task.
132
+ */
133
+ createVideoTask(options: VideoTaskOptions): Promise<string>;
134
+ /**
135
+ * Wait for a task to complete.
136
+ */
38
137
  waitForTask(taskId: string, options?: WaitForTaskOptions): Promise<string>;
138
+ /**
139
+ * Make an HTTP request through a proxy.
140
+ */
39
141
  request(url: string, config?: {
40
142
  proxy?: Proxy;
41
143
  timeout?: number;
42
- [key: string]: any;
43
- }): Promise<any>;
144
+ [key: string]: unknown;
145
+ }): Promise<unknown>;
146
+ listTasks(page?: number, size?: number): Promise<{
147
+ count: number;
148
+ list: any[];
149
+ }>;
150
+ getUsageStatistics(fromDate: string, toDate: string): Promise<UsageStatistics>;
151
+ listProxyUsers(proxyType?: ProxyTypeParam): Promise<ProxyUserList>;
152
+ createProxyUser(username: string, pass: string, trafficLimit?: number, status?: boolean, proxyType?: ProxyTypeParam): Promise<any>;
153
+ addWhitelistIp(ip: string, status?: boolean, proxyType?: ProxyTypeParam): Promise<any>;
154
+ listProxyServers(proxyType: 1 | 2): Promise<ProxyServer[]>;
155
+ private buildSignHeaders;
156
+ getResidentialBalance(): Promise<{
157
+ balance: number;
158
+ expire_time: number;
159
+ }>;
160
+ getIspRegions(): Promise<any[]>;
161
+ listIspProxies(): Promise<any[]>;
162
+ /**
163
+ * Internal method to call locations API.
164
+ */
165
+ private getLocations;
166
+ /**
167
+ * List all supported countries for a proxy type.
168
+ */
169
+ listCountries(proxyType?: ProxyTypeParam): Promise<CountryInfo[]>;
170
+ /**
171
+ * List states/regions for a country.
172
+ */
173
+ listStates(countryCode: string, proxyType?: ProxyTypeParam): Promise<StateInfo[]>;
174
+ /**
175
+ * List cities for a country (and optionally state).
176
+ */
177
+ listCities(countryCode: string, stateCode?: string, proxyType?: ProxyTypeParam): Promise<CityInfo[]>;
178
+ /**
179
+ * List ASNs for a country.
180
+ */
181
+ listAsns(countryCode: string, proxyType?: ProxyTypeParam): Promise<AsnInfo[]>;
44
182
  }